From aabe95dc9b26e6b900748bb9443d2d746d5dd22d Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:00:23 +0000 Subject: [PATCH 001/106] Setting up GitHub Classroom Feedback From ea4ca7a4c86cfb49d7dd6ff62715b8265a6e995f Mon Sep 17 00:00:00 2001 From: Soy17 Date: Mon, 11 Nov 2024 12:59:38 +0900 Subject: [PATCH 002/106] Create README.md --- README.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..cbec1bf --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# ๐Ÿ“‹ Project Overview + + +![project_image](https://github.com/user-attachments/assets/15a67fec-8077-492e-a517-f4a0cee5acbf) + +๋ผˆ๋Š” ์šฐ๋ฆฌ ๋ชธ์˜ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ์— ์ค‘์š”ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์—, ์ •ํ™•ํ•œ ๋ผˆ ๋ถ„ํ• ์€ ์˜๋ฃŒ ์ง„๋‹จ ๋ฐ ์น˜๋ฃŒ ๊ณ„ํš์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. + +Bone Segmentation์€ ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ์—์„œ ์ค‘์š”ํ•œ ์‘์šฉ ๋ถ„์•ผ ์ค‘ ํ•˜๋‚˜๋กœ, ํŠนํžˆ, ๋”ฅ๋Ÿฌ๋‹ ๊ธฐ์ˆ ์„ ์ด์šฉํ•œ ๋ผˆ Segmentation์€ ๋งŽ์€ ์—ฐ๊ตฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ชฉ์ ์œผ๋กœ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- ์งˆ๋ณ‘ ์ง„๋‹จ์˜ ๋ชฉ์ ์œผ๋กœ ๋ผˆ์˜ ํ˜•ํƒœ๋‚˜ ์œ„์น˜๊ฐ€ ๋ณ€ํ˜•๋˜๊ฑฐ๋‚˜ ๋ถ€๋Ÿฌ์ง€๊ฑฐ๋‚˜ ๊ณจ์ ˆ ๋“ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ, ๊ทธ ๋ถ€์œ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜์—ฌ ์ ์ ˆํ•œ ์น˜๋ฃŒ๋ฅผ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- ์ˆ˜์ˆ  ๊ณ„ํš์„ ์„ธ์šฐ๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜์‚ฌ๋“ค์€ ๋ผˆ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ˆ˜์ˆ ์ด ํ•„์š”ํ•œ์ง€, ์–ด๋–ค ์ข…๋ฅ˜์˜ ์žฌ๋ฃŒ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋“ฑ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- ์˜๋ฃŒ์žฅ๋น„ ์ œ์ž‘์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๊ณต ๊ด€์ ˆ์ด๋‚˜ ์น˜์•„ ์ž„ํ”Œ๋ž€ํŠธ๋ฅผ ์ œ์ž‘ํ•  ๋•Œ ๋ผˆ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ ์ ˆํ•œ ํฌ๊ธฐ์™€ ๋ชจ์–‘์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- ์˜๋ฃŒ ๊ต์œก์—์„œ๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์‚ฌ๋“ค์€ ๋ณ‘ํƒœ ๋ฐ ๋ถ€์ƒ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋†’์ด๊ณ  ์ˆ˜์ˆ  ๊ณ„ํš์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ์ˆ ์„ ์—ฐ์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +
+ +# ๐Ÿ—ƒ๏ธ Dataset + +์ถ”ํ›„์ˆ˜์ •์˜ˆ์ • +
+
+
+ +# ๐Ÿ˜„ Team Member + + + + + + + + + + + + + + + + + + + + + + + + + + +
๊น€๋ฏผ์˜๋ฐ•์ค€์ผ์˜ค์ข…๋ฏผ์ด์†Œ์˜์ •์›์ •ํ•œ์Šน์œค
T7173T7154T7207T7222T7272T7261
+ +
+ + + +## ๐Ÿ”— Reference + +### [๐Ÿ“Ž Segmentation Notion](https://www.notion.so/Hand-Bone-Image-Segmentation-13bcb8c4237680f0baeef241f0f6856b) + +
+ +## Commit Convention + +1. `Feature` : **์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€** +2. `Fix` : **๋ฒ„๊ทธ ์ˆ˜์ •** +3. `Docs` : **๋ฌธ์„œ ์ˆ˜์ •** +4. `Style` : **์ฝ”๋“œ ํฌ๋งทํŒ… โ†’ Code Convention** +5. `Refactor` : **์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง** +6. `Test` : **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ** +7. `Comment` : **์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •** + +์ปค๋ฐ‹ํ•  ๋•Œ ํ—ค๋”์— ์œ„ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๊ณ  ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + +### ์˜ˆ์‹œ + +- `git commit -m "[#issue] Feature : message content"` + +์ปค๋ฐ‹ํ•  ๋•Œ ์ƒ์„ธ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +### ์˜ˆ์‹œ + +> `git commit` +> ์–ด๋– ํ•œ ์—๋””ํ„ฐ๋กœ ์ง„์ž…ํ•˜๊ฒŒ ๋œ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +> `[header]: ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ` +> . **(ํ•œ ์ค„ ๋น„์›Œ์•ผ ํ•จ)** +> ์ƒ์„ธ ๋‚ด์šฉ + +
+ +## Branch Naming Convention + +๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค ๋•Œ, ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ํ•ญ์ƒ ์œ„ `Commit Convention`์˜ Header์™€ ํ•จ๊ป˜ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### ์˜ˆ์‹œ + +- `Feature/~~~` +- `Refactor/~~~` From 130e8b9b30e9fd044158ee4d53762e88e5cd895b Mon Sep 17 00:00:00 2001 From: Soy17 Date: Mon, 11 Nov 2024 17:26:48 +0900 Subject: [PATCH 003/106] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index cbec1bf..6a902e3 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,12 @@ Bone Segmentation์€ ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ์—์„œ ์ค‘์š”ํ•œ ์‘์šฉ ๋ถ„์•ผ ์ค‘ ํ•˜ - - - - - - + + + + + + From 4646554192d1f5c2748e1ab295f38427f7e416c0 Mon Sep 17 00:00:00 2001 From: Soy17 Date: Tue, 12 Nov 2024 11:54:02 +0900 Subject: [PATCH 004/106] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6a902e3..61841ab 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ Bone Segmentation์€ ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ์—์„œ ์ค‘์š”ํ•œ ์‘์šฉ ๋ถ„์•ผ ์ค‘ ํ•˜
๊น€๋ฏผ์˜
- - + + From 7f095f1091073e004f323b86d10c97b6281f9c73 Mon Sep 17 00:00:00 2001 From: Soy17 Date: Tue, 12 Nov 2024 14:36:21 +0000 Subject: [PATCH 005/106] [#2] pull request template update --- .github/pull_request_template.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..4760075 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,21 @@ +## ๐Ÿค” Motivation ๐Ÿค” +- + +
+ +## ๐Ÿ’กContent ๐Ÿ’ก +- + +
+ +## ๐Ÿ…พ๏ธ Metric โŽ +- + +
+ +## ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป How To Apply ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป +- + +--- + +- close \ No newline at end of file From 638a6eb3ccfac5e8503c55d426680884bff22fe7 Mon Sep 17 00:00:00 2001 From: Soy17 Date: Wed, 13 Nov 2024 10:49:23 +0900 Subject: [PATCH 006/106] Update Dataset info in README.md --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 61841ab..1571da5 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,31 @@ Bone Segmentation์€ ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ์—์„œ ์ค‘์š”ํ•œ ์‘์šฉ ๋ถ„์•ผ ์ค‘ ํ•˜ - ์˜๋ฃŒ์žฅ๋น„ ์ œ์ž‘์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๊ณต ๊ด€์ ˆ์ด๋‚˜ ์น˜์•„ ์ž„ํ”Œ๋ž€ํŠธ๋ฅผ ์ œ์ž‘ํ•  ๋•Œ ๋ผˆ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ ์ ˆํ•œ ํฌ๊ธฐ์™€ ๋ชจ์–‘์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์˜๋ฃŒ ๊ต์œก์—์„œ๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์‚ฌ๋“ค์€ ๋ณ‘ํƒœ ๋ฐ ๋ถ€์ƒ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋†’์ด๊ณ  ์ˆ˜์ˆ  ๊ณ„ํš์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ์ˆ ์„ ์—ฐ์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +
+ + +- Input : + +hand bone x-ray ๊ฐ์ฒด๊ฐ€ ๋‹ด๊ธด ์ด๋ฏธ์ง€๊ฐ€ ๋ชจ๋ธ์˜ ์ธํ’‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. segmentation annotation์€ json file๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. + +- Output : +๋ชจ๋ธ์€ ๊ฐ ํด๋ž˜์Šค(29๊ฐœ)์— ๋Œ€ํ•œ ํ™•๋ฅ  ๋งต์„ ๊ฐ–๋Š” ๋ฉ€ํ‹ฐ์ฑ„๋„ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ํ”ฝ์…€์„ ํ•ด๋‹น ํด๋ž˜์Šค์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. +์ตœ์ข…์ ์œผ๋กœ ์˜ˆ์ธก๋œ ๊ฒฐ๊ณผ๋ฅผ Run-Length Encoding(RLE) ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ csv ํŒŒ์ผ๋กœ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค. + +

# ๐Ÿ—ƒ๏ธ Dataset -์ถ”ํ›„์ˆ˜์ •์˜ˆ์ • +- ์ด๋ฏธ์ง€ ํฌ๊ธฐ : (2048 x 2048), 3 channel + +![image](https://github.com/user-attachments/assets/7a596f2c-e7e2-415f-872a-d812a7b47825) + +- image, target ์‹œ๊ฐํ™” ๋ฐ pixel ๋ณ„๋กœ ์˜ˆ์ธกํ•ด์•ผํ•  29๊ฐœ์˜ classes + +![image](https://github.com/user-attachments/assets/3474aac7-4542-4437-ad49-514a9dd72212) +


From 1ceed5f1f49218d39113b875b366fb1711732660 Mon Sep 17 00:00:00 2001 From: yoon0717 Date: Wed, 13 Nov 2024 05:01:07 +0000 Subject: [PATCH 007/106] [#5] add basecode --- baseline_code.ipynb | 1538 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1538 insertions(+) create mode 100644 baseline_code.ipynb diff --git a/baseline_code.ipynb b/baseline_code.ipynb new file mode 100644 index 0000000..aa12b9b --- /dev/null +++ b/baseline_code.ipynb @@ -0,0 +1,1538 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fe5f1ca7", + "metadata": {}, + "source": [ + "# Table of Contents\n", + "\n", + "1. [Imports & Global Constants](#Imports-&-Global-Constants)\n", + "
 - ํ•™์Šต์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ž„ํฌํŠธ ํ•˜๊ณ  ๋ฏธ์…˜ ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ํ•™์Šต ์ „๋ฐ˜์„ ์ปจํŠธ๋กค ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "2. [Check the Size of the Dataset](#Check-the-Size-of-the-Dataset)\n", + "
 - ํ•™์Šต์— ์‚ฌ์šฉ๋  ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ค€๋น„๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "3. [Define Dataset Class](#Define-Dataset-Class)\n", + "
 - ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•œ Dataset ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , validation์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์Šคํ”Œ๋ฆฟ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "4. [Check Data Sample](#Check-Data-Sample)\n", + "
 - ์ œ๊ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "5. [Setup Dataloader](#Setup-Dataloader)\n", + "
 - ํ•™์Šต์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์น˜๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•œ Dataloader๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "6. [Define Functions for Training](#Define-Functions-for-Training)\n", + "
 - ํ•™์Šต์„ ๋„์™€์ฃผ๋Š” ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "7. [Training](#Training)\n", + "
 - ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "8. [Inference](#Inference)\n", + "
 - ์ธํผ๋Ÿฐ์Šค์— ํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ•˜๊ณ , ์ธํผ๋Ÿฐ์Šค๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "9. [Result Visualization](#Result-Visualization)\n", + "
 - ์ธํผ๋Ÿฐ์Šค ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค.\n", + "
\n", + "\n", + "10. [To CSV](#To-CSV)\n", + "
 - ์ธํผ๋Ÿฐ์Šค ๊ฒฐ๊ณผ๋ฅผ ์ œ์ถœ์„ ์œ„ํ•œ ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค." + ] + }, + { + "cell_type": "markdown", + "id": "2c2d2121", + "metadata": {}, + "source": [ + "# Imports & Global Constants" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "a3907598-e3f4-4c30-b1fe-759870903ecf", + "metadata": {}, + "outputs": [], + "source": [ + "# ๋…ธํŠธ๋ถ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค\n", + "\n", + "# !pip install opencv-python-headless==4.10.0.84\n", + "# !pip install pandas==2.2.3\n", + "# !pip install -U scikit-learn==1.5.2\n", + "# !pip install albumentations==1.4.18\n", + "# !pip install matplotlib==3.9.2" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "c8295cb6", + "metadata": {}, + "outputs": [], + "source": [ + "# python native\n", + "import os\n", + "import json\n", + "import random\n", + "import datetime\n", + "from functools import partial\n", + "\n", + "# external library\n", + "import cv2\n", + "import numpy as np\n", + "import pandas as pd\n", + "from tqdm.auto import tqdm\n", + "from sklearn.model_selection import GroupKFold\n", + "import albumentations as A\n", + "\n", + "# torch\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torchvision import models\n", + "\n", + "# visualization\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "1d6746cc", + "metadata": {}, + "outputs": [], + "source": [ + "# ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”\n", + "\n", + "IMAGE_ROOT = \"/data/ephemeral/home/data/train/DCM\"\n", + "LABEL_ROOT = \"/data/ephemeral/home/data/train/outputs_json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "819e163c", + "metadata": {}, + "outputs": [], + "source": [ + "CLASSES = [\n", + " 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5',\n", + " 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10',\n", + " 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15',\n", + " 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium',\n", + " 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate',\n", + " 'Triquetrum', 'Pisiform', 'Radius', 'Ulna',\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "3192cd81", + "metadata": {}, + "outputs": [], + "source": [ + "CLASS2IND = {v: i for i, v in enumerate(CLASSES)}" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "1aef86f9", + "metadata": {}, + "outputs": [], + "source": [ + "IND2CLASS = {v: k for k, v in CLASS2IND.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb199e3d", + "metadata": {}, + "outputs": [], + "source": [ + "BATCH_SIZE = 8\n", + "LR = 1e-4\n", + "RANDOM_SEED = 21\n", + "\n", + "NUM_EPOCHS = 5\n", + "VAL_EVERY = 5\n", + "\n", + "SAVED_DIR = \"checkpoints\"\n", + "\n", + "if not os.path.exists(SAVED_DIR): \n", + " os.makedirs(SAVED_DIR)" + ] + }, + { + "cell_type": "markdown", + "id": "52cc2a79", + "metadata": {}, + "source": [ + "# Check the Size of the Dataset" + ] + }, + { + "cell_type": "markdown", + "id": "93533655", + "metadata": {}, + "source": [ + "`IMAGE_ROOT` ์•„๋ž˜์— ์žˆ๋Š” ๋ชจ๋“  ํด๋”๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ํ™•์žฅ์ž๊ฐ€ `.png`์ธ ํŒŒ์ผ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "a0782493", + "metadata": {}, + "outputs": [], + "source": [ + "pngs = {\n", + " os.path.relpath(os.path.join(root, fname), start=IMAGE_ROOT)\n", + " for root, _dirs, files in os.walk(IMAGE_ROOT)\n", + " for fname in files\n", + " if os.path.splitext(fname)[1].lower() == \".png\"\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "91a88b61", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "800" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(pngs)" + ] + }, + { + "cell_type": "markdown", + "id": "d2247d10", + "metadata": {}, + "source": [ + "๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `LABEL_ROOT` ์•„๋ž˜์— ์žˆ๋Š” ๋ชจ๋“  ํด๋”๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ํ™•์žฅ์ž๊ฐ€ `.json`์ธ ํŒŒ์ผ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "be21a515", + "metadata": {}, + "outputs": [], + "source": [ + "jsons = {\n", + " os.path.relpath(os.path.join(root, fname), start=LABEL_ROOT)\n", + " for root, _dirs, files in os.walk(LABEL_ROOT)\n", + " for fname in files\n", + " if os.path.splitext(fname)[1].lower() == \".json\"\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "eb99fd10", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "800" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(jsons)" + ] + }, + { + "cell_type": "markdown", + "id": "653c3526", + "metadata": {}, + "source": [ + "๋ชจ๋“  `.png` ํŒŒ์ผ์— ๋Œ€ํ•ด `.json` pair๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์—์„œ ํ™•์žฅ์ž๋ฅผ ์ œ๊ฑฐํ•œ set์„ ์ƒ์„ฑํ•˜๊ณ  ๋‘ ์ง‘ํ•ฉ์˜ ์ฐจ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "51eba0f1", + "metadata": {}, + "outputs": [], + "source": [ + "jsons_fn_prefix = {os.path.splitext(fname)[0] for fname in jsons}\n", + "pngs_fn_prefix = {os.path.splitext(fname)[0] for fname in pngs}\n", + "\n", + "assert len(jsons_fn_prefix - pngs_fn_prefix) == 0\n", + "assert len(pngs_fn_prefix - jsons_fn_prefix) == 0" + ] + }, + { + "cell_type": "markdown", + "id": "b13ee425", + "metadata": {}, + "source": [ + "๋ชจ๋“  `.png` ํŒŒ์ผ์— ๋Œ€ํ•ด label์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ ์ง์ด ๋งž๋„๋ก ํ•ฉ๋‹ˆ๋‹ค." + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "f589a513", + "metadata": {}, + "outputs": [], + "source": [ + "pngs = sorted(pngs)\n", + "jsons = sorted(jsons)" + ] + }, + { + "cell_type": "markdown", + "id": "662f69ee", + "metadata": {}, + "source": [ + "# Define Dataset Class" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "7b0d5bf7", + "metadata": {}, + "outputs": [], + "source": [ + "class XRayDataset(Dataset):\n", + " def __init__(self, is_train=True, transforms=None):\n", + " _filenames = np.array(pngs)\n", + " _labelnames = np.array(jsons)\n", + " \n", + " # split train-valid\n", + " # ํ•œ ํด๋” ์•ˆ์— ํ•œ ์ธ๋ฌผ์˜ ์–‘์†์— ๋Œ€ํ•œ `.dcm` ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—\n", + " # ํด๋” ์ด๋ฆ„์„ ๊ทธ๋ฃน์œผ๋กœ ํ•ด์„œ GroupKFold๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n", + " # ๋™์ผ ์ธ๋ฌผ์˜ ์†์ด train, valid์— ๋”ฐ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.\n", + " groups = [os.path.dirname(fname) for fname in _filenames]\n", + " \n", + " # dummy label\n", + " ys = [0 for fname in _filenames]\n", + " \n", + " # ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 20%๋ฅผ validation data๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด `n_splits`๋ฅผ\n", + " # 5์œผ๋กœ ์„ค์ •ํ•˜์—ฌ KFold๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n", + " gkf = GroupKFold(n_splits=5)\n", + " \n", + " filenames = []\n", + " labelnames = []\n", + " for i, (x, y) in enumerate(gkf.split(_filenames, ys, groups)):\n", + " if is_train:\n", + " # 0๋ฒˆ์„ validation dataset์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.\n", + " if i == 0:\n", + " continue\n", + " \n", + " filenames += list(_filenames[y])\n", + " labelnames += list(_labelnames[y])\n", + " \n", + " else:\n", + " filenames = list(_filenames[y])\n", + " labelnames = list(_labelnames[y])\n", + " \n", + " # skip i > 0\n", + " break\n", + " \n", + " self.filenames = filenames\n", + " self.labelnames = labelnames\n", + " self.is_train = is_train\n", + " self.transforms = transforms\n", + " \n", + " def __len__(self):\n", + " return len(self.filenames)\n", + " \n", + " def __getitem__(self, item):\n", + " image_name = self.filenames[item]\n", + " image_path = os.path.join(IMAGE_ROOT, image_name)\n", + " \n", + " image = cv2.imread(image_path)\n", + " image = image / 255.\n", + " \n", + " label_name = self.labelnames[item]\n", + " label_path = os.path.join(LABEL_ROOT, label_name)\n", + " \n", + " # (H, W, NC) ๋ชจ์–‘์˜ label์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n", + " label_shape = tuple(image.shape[:2]) + (len(CLASSES), )\n", + " label = np.zeros(label_shape, dtype=np.uint8)\n", + " \n", + " # label ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.\n", + " with open(label_path, \"r\") as f:\n", + " annotations = json.load(f)\n", + " annotations = annotations[\"annotations\"]\n", + " \n", + " # ํด๋ž˜์Šค ๋ณ„๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n", + " for ann in annotations:\n", + " c = ann[\"label\"]\n", + " class_ind = CLASS2IND[c]\n", + " points = np.array(ann[\"points\"])\n", + " \n", + " # polygon ํฌ๋งท์„ denseํ•œ mask ํฌ๋งท์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.\n", + " class_label = np.zeros(image.shape[:2], dtype=np.uint8)\n", + " cv2.fillPoly(class_label, [points], 1)\n", + " label[..., class_ind] = class_label\n", + " \n", + " if self.transforms is not None:\n", + " inputs = {\"image\": image, \"mask\": label} if self.is_train else {\"image\": image}\n", + " result = self.transforms(**inputs)\n", + " \n", + " image = result[\"image\"]\n", + " label = result[\"mask\"] if self.is_train else label\n", + "\n", + " # to tenser will be done later\n", + " image = image.transpose(2, 0, 1) # channel first ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.\n", + " label = label.transpose(2, 0, 1)\n", + " \n", + " image = torch.from_numpy(image).float()\n", + " label = torch.from_numpy(label).float()\n", + " \n", + " return image, label" + ] + }, + { + "cell_type": "markdown", + "id": "302e7742", + "metadata": {}, + "source": [ + "# Check Data Sample" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "89defc8c", + "metadata": {}, + "outputs": [], + "source": [ + "# ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ํŒ”๋ ˆํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.\n", + "PALETTE = [\n", + " (220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228),\n", + " (0, 60, 100), (0, 80, 100), (0, 0, 70), (0, 0, 192), (250, 170, 30),\n", + " (100, 170, 30), (220, 220, 0), (175, 116, 175), (250, 0, 30), (165, 42, 42),\n", + " (255, 77, 255), (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157),\n", + " (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), (255, 179, 240),\n", + " (0, 125, 92), (209, 0, 151), (188, 208, 182), (0, 220, 176),\n", + "]\n", + "\n", + "# ์‹œ๊ฐํ™” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ํ”ฝ์…€์„ ๊ณ ๋ คํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.\n", + "def label2rgb(label):\n", + " image_size = label.shape[1:] + (3, )\n", + " image = np.zeros(image_size, dtype=np.uint8)\n", + " \n", + " for i, class_label in enumerate(label):\n", + " image[class_label == 1] = PALETTE[i]\n", + " \n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "e1f1eb8a", + "metadata": {}, + "outputs": [], + "source": [ + "tf = A.Resize(512, 512)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "f17abc75", + "metadata": {}, + "outputs": [], + "source": [ + "train_dataset = XRayDataset(is_train=True, transforms=tf)\n", + "valid_dataset = XRayDataset(is_train=False, transforms=tf)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "c193e92b", + "metadata": {}, + "outputs": [], + "source": [ + "image, label = train_dataset[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "5dd474b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([3, 512, 512]) torch.Size([29, 512, 512])\n" + ] + } + ], + "source": [ + "print(image.shape, label.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "bc100cf6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "640" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(train_dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "f9845fe3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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T1D80i/9Er7t274Nz3nOc0BE+A//4T9055kZP/qjP4pnP/vZuO6663D77bfjU5/6VHfN7//+7+N1r3sdbrjhBtx00034ru/6LnzhC194HGvheCLhLW95C/7kn/yT+JIv+RI861nPwp//838en/zkJ7trLl++jDvuuANf+qVfiqc+9al4zWteg/vuu6+75p577sGrX/1qXH/99XjWs56FH/qhH8KyLI9nVRxPELz97W/HS17yEtxwww244YYbcNttt+FnfuZn6nkfj45rjbe+9a0gInzf931fPebj0vF44s1vfjOIqPt70YteVM/7eHQ8meG/7R2PF/y3veO8wX/bO84b/Le947zDf9s7rjUuwm/7C0f4/rt/9+/wAz/wA3jTm96EX//1X8dLX/pSvPKVr8T9999/rYvmeALi4Ycfxktf+lK87W1v2zz/Yz/2Y/iJn/gJ/LN/9s/wwQ9+EE95ylPwyle+EpcvX67XvO51r8PHP/5x3HnnnXjPe96DX/qlX8J3f/d3P15VcDzBcNddd+GOO+7ABz7wAdx5552Y5xmveMUr8PDDD9drvv/7vx//6T/9J7zrXe/CXXfdhd/5nd/Bd3zHd9TzKSW8+tWvxuFwwK/+6q/iX/2rf4V3vOMd+NEf/dFrUSXHBcdzn/tcvPWtb8Xdd9+NX/u1X8O3fuu34tu//dvx8Y9/HICPR8e1xYc+9CH883/+z/GSl7ykO+7j0vF442u+5mvwuc99rv798i//cj3n49HxZIX/tnc8nvDf9o7zBv9t7zhv8N/2jvMM/23vOC8497/t+YLhG7/xG/mOO+6o31NK/JznPIff8pa3XMNSOZ4MAMDvfve76/ecM99yyy38D//hP6zHHnjgAT45OeF/+2//LTMzf+ITn2AA/KEPfahe8zM/8zNMRPw//+f/fNzK7nji4v7772cAfNdddzFzGYO73Y7f9a531Wv+63/9rwyA3//+9zMz80//9E9zCIHvvffees3b3/52vuGGG/j09PTxrYDjCYmnPe1p/C/+xb/w8ei4pnjooYf4K7/yK/nOO+/kb/mWb+E3vvGNzOzzpOPxx5ve9CZ+6UtfunnOx6PjyQz/be+4VvDf9o7zCP9t7ziP8N/2jvMA/23vOC+4CL/tL5TC93A44O6778btt99ej4UQcPvtt+P973//NSyZ48mIz3zmM7j33nu78XjjjTfi1ltvrePx/e9/P2666SZ8wzd8Q73m9ttvRwgBH/zgBx/3MjueePj85z8PAHj6058OALj77rsxz3M3Ll/0ohfh+c9/fjcuv+7rvg4333xzveaVr3wlHnzwwbpz0+H4gyClhHe+8514+OGHcdttt/l4dFxT3HHHHXj1q1/djT/A50nHtcGnPvUpPOc5z8GXf/mX43Wvex3uueceAD4eHU9e+G97x3mC/7Z3nAf4b3vHeYL/tnecJ/hve8d5wnn/bT99UVJ5nPC7v/u7SCl1DQIAN998M/7bf/tv16hUjicr7r33XgDYHI967t5778WznvWs7vw0TXj6059er3E4/qDIOeP7vu/78Kf/9J/G137t1wIoY26/3+Omm27qrh3H5da41XMOx2PFRz/6Udx22224fPkynvrUp+Ld7343XvziF+MjH/mIj0fHNcE73/lO/Pqv/zo+9KEPrc75POl4vHHrrbfiHe94B776q78an/vc5/B3/+7fxTd/8zfjYx/7mI9Hx5MW/tvecZ7gv+0d1xr+295xXuC/7R3nDf7b3nGecBF+218owtfhcDgcDXfccQc+9rGPdbECHI5rga/+6q/GRz7yEXz+85/Hv//3/x6vf/3rcdddd13rYjmepPjsZz+LN77xjbjzzjtx6dKla10chwOvetWr6ueXvOQluPXWW/GCF7wAP/VTP4XrrrvuGpbM4XA4HA7HeYD/tnecF/hve8d5gv+2d5w3XITf9hfKpfMznvEMxBhx3333dcfvu+8+3HLLLdeoVI4nK3TMnTUeb7nlFtx///3d+WVZ8Pu///s+Zh1/KLzhDW/Ae97zHvzCL/wCnvvc59bjt9xyCw6HAx544IHu+nFcbo1bPedwPFbs93t8xVd8BV72spfhLW95C1760pfiH//jf+zj0XFNcPfdd+P+++/Hn/gTfwLTNGGaJtx11134iZ/4CUzThJtvvtnHpeOa4qabbsJXfdVX4dOf/rTPk44nLfy3veM8wX/bO64l/Le94zzBf9s7zhP8t73jvOM8/ra/UITvfr/Hy172Mrz3ve+tx3LOeO9734vbbrvtGpbM8WTEC1/4Qtxyyy3deHzwwQfxwQ9+sI7H2267DQ888ADuvvvues373vc+5Jxx6623Pu5ldlx8MDPe8IY34N3vfjfe97734YUvfGF3/mUvexl2u103Lj/5yU/innvu6cblRz/60c5gceedd+KGG27Ai1/84senIo4nNHLOOD099fHouCZ4+ctfjo9+9KP4yEc+Uv++4Ru+Aa973evqZx+XjmuJL3zhC/jN3/xNPPvZz/Z50vGkhf+2d5wn+G97x7WA/7Z3XAT4b3vHtYT/tnecd5zL3/Z8wfDOd76TT05O+B3veAd/4hOf4O/+7u/mm266ie+9995rXTTHExAPPfQQf/jDH+YPf/jDDID/0T/6R/zhD3+Y/8f/+B/MzPzWt76Vb7rpJv6P//E/8m/8xm/wt3/7t/MLX/hCfvTRR2saf+7P/Tn++q//ev7gBz/Iv/zLv8xf+ZVfya997WuvVZUcFxzf8z3fwzfeeCP/4i/+In/uc5+rf4888ki95q//9b/Oz3/+8/l973sf/9qv/RrfdtttfNttt9Xzy7Lw137t1/IrXvEK/shHPsI/+7M/y8985jP5R37kR65FlRwXHD/8wz/Md911F3/mM5/h3/iN3+Af/uEfZiLin/u5n2NmH4+O84Fv+ZZv4Te+8Y31u49Lx+OJH/zBH+Rf/MVf5M985jP8K7/yK3z77bfzM57xDL7//vuZ2cej48kL/23veDzhv+0d5w3+295x3uC/7R0XAf7b3nEtcRF+2184wpeZ+Z/8k3/Cz3/+83m/3/M3fuM38gc+8IFrXSTHExS/8Au/wABWf69//euZmTnnzH/n7/wdvvnmm/nk5IRf/vKX8yc/+ckujd/7vd/j1772tfzUpz6Vb7jhBv6rf/Wv8kMPPXQNauN4ImBrPALgn/zJn6zXPProo/w3/sbf4Kc97Wl8/fXX81/4C3+BP/e5z3Xp/NZv/Ra/6lWv4uuuu46f8Yxn8A/+4A/yPM+Pc20cTwT8tb/21/gFL3gB7/d7fuYzn8kvf/nL6w9CZh+PjvOB8Uehj0vH44nv/M7v5Gc/+9m83+/5y77sy/g7v/M7+dOf/nQ97+PR8WSG/7Z3PF7w3/aO8wb/be84b/Df9o6LAP9t77iWuAi/7YmZ+YujFXY4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA7H44kLFcPX4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA1O+DocDofD4XA4HA6Hw+FwOBwOh8PhcDgcDscFhRO+DofD4XA4HA6Hw+FwOBwOh8PhcDgcDofDcUHhhK/D4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XBcUDjh63A4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HBcUTvg6HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA7HBYUTvg6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw3FB4YSvw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwXFA44etwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwXFE74OhwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOxwWFE74Oh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8NxQfH/ARyCz9j4rf6aAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 2, figsize=(24, 12))\n", + "ax[0].imshow(image[0]) # color map ์ ์šฉ์„ ์œ„ํ•ด channel ์ฐจ์›์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.\n", + "ax[1].imshow(label2rgb(label))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "22480ad8", + "metadata": {}, + "source": [ + "# Setup Dataloader" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "d5b43501", + "metadata": {}, + "outputs": [], + "source": [ + "train_loader = DataLoader(\n", + " dataset=train_dataset, \n", + " batch_size=BATCH_SIZE,\n", + " shuffle=True,\n", + " num_workers=8,\n", + " drop_last=True,\n", + ")\n", + "\n", + "# ์ฃผ์˜: validation data๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— `num_wokers`๋Š” ์ปค์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n", + "valid_loader = DataLoader(\n", + " dataset=valid_dataset, \n", + " batch_size=8,\n", + " shuffle=False,\n", + " num_workers=0,\n", + " drop_last=False\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "75925001", + "metadata": {}, + "source": [ + "# Define Functions for Training" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "687f29a3", + "metadata": {}, + "outputs": [], + "source": [ + "def dice_coef(y_true, y_pred):\n", + " y_true_f = y_true.flatten(2)\n", + " y_pred_f = y_pred.flatten(2)\n", + " intersection = torch.sum(y_true_f * y_pred_f, -1)\n", + " \n", + " eps = 0.0001\n", + " return (2. * intersection + eps) / (torch.sum(y_true_f, -1) + torch.sum(y_pred_f, -1) + eps)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "19be0316", + "metadata": {}, + "outputs": [], + "source": [ + "def save_model(model, file_name='fcn_resnet50_best_model.pt'):\n", + " output_path = os.path.join(SAVED_DIR, file_name)\n", + " torch.save(model, output_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "dd22e901", + "metadata": {}, + "outputs": [], + "source": [ + "def set_seed():\n", + " torch.manual_seed(RANDOM_SEED)\n", + " torch.cuda.manual_seed(RANDOM_SEED)\n", + " torch.cuda.manual_seed_all(RANDOM_SEED) # if use multi-GPU\n", + " torch.backends.cudnn.deterministic = True\n", + " torch.backends.cudnn.benchmark = False\n", + " np.random.seed(RANDOM_SEED)\n", + " random.seed(RANDOM_SEED)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "40c3a306", + "metadata": {}, + "outputs": [], + "source": [ + "def validation(epoch, model, data_loader, criterion, thr=0.5):\n", + " print(f'Start validation #{epoch:2d}')\n", + " model.eval()\n", + "\n", + " dices = []\n", + " with torch.no_grad():\n", + " n_class = len(CLASSES)\n", + " total_loss = 0\n", + " cnt = 0\n", + "\n", + " for step, (images, masks) in tqdm(enumerate(data_loader), total=len(data_loader)):\n", + " images, masks = images.cuda(), masks.cuda() \n", + " model = model.cuda()\n", + " \n", + " outputs = model(images)['out']\n", + " \n", + " output_h, output_w = outputs.size(-2), outputs.size(-1)\n", + " mask_h, mask_w = masks.size(-2), masks.size(-1)\n", + " \n", + " # gt์™€ prediction์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ prediction์„ gt์— ๋งž์ถฐ interpolation ํ•ฉ๋‹ˆ๋‹ค.\n", + " if output_h != mask_h or output_w != mask_w:\n", + " outputs = F.interpolate(outputs, size=(mask_h, mask_w), mode=\"bilinear\")\n", + " \n", + " loss = criterion(outputs, masks)\n", + " total_loss += loss\n", + " cnt += 1\n", + " \n", + " outputs = torch.sigmoid(outputs)\n", + " outputs = (outputs > thr).detach().cpu()\n", + " masks = masks.detach().cpu()\n", + " \n", + " dice = dice_coef(outputs, masks)\n", + " dices.append(dice)\n", + " \n", + " dices = torch.cat(dices, 0)\n", + " dices_per_class = torch.mean(dices, 0)\n", + " dice_str = [\n", + " f\"{c:<12}: {d.item():.4f}\"\n", + " for c, d in zip(CLASSES, dices_per_class)\n", + " ]\n", + " dice_str = \"\\n\".join(dice_str)\n", + " print(dice_str)\n", + " \n", + " avg_dice = torch.mean(dices_per_class).item()\n", + " \n", + " return avg_dice" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "3acde59b", + "metadata": {}, + "outputs": [], + "source": [ + "def train(model, data_loader, val_loader, criterion, optimizer):\n", + " print(f'Start training..')\n", + " \n", + " n_class = len(CLASSES)\n", + " best_dice = 0.\n", + " \n", + " for epoch in range(NUM_EPOCHS):\n", + " model.train()\n", + "\n", + " for step, (images, masks) in enumerate(data_loader): \n", + " # gpu ์—ฐ์‚ฐ์„ ์œ„ํ•ด device ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.\n", + " images, masks = images.cuda(), masks.cuda()\n", + " model = model.cuda()\n", + " \n", + " outputs = model(images)['out']\n", + " \n", + " # loss๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n", + " loss = criterion(outputs, masks)\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " # step ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.\n", + " if (step + 1) % 25 == 0:\n", + " print(\n", + " f'{datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")} | '\n", + " f'Epoch [{epoch+1}/{NUM_EPOCHS}], '\n", + " f'Step [{step+1}/{len(train_loader)}], '\n", + " f'Loss: {round(loss.item(),4)}'\n", + " )\n", + " \n", + " # validation ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  best model์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.\n", + " if (epoch + 1) % VAL_EVERY == 0:\n", + " dice = validation(epoch + 1, model, val_loader, criterion)\n", + " \n", + " if best_dice < dice:\n", + " print(f\"Best performance at epoch: {epoch + 1}, {best_dice:.4f} -> {dice:.4f}\")\n", + " print(f\"Save model in {SAVED_DIR}\")\n", + " best_dice = dice\n", + " save_model(model)" + ] + }, + { + "cell_type": "markdown", + "id": "c10b856b", + "metadata": {}, + "source": [ + "# Training" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "73b106ab", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.10/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.10/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=FCN_ResNet50_Weights.COCO_WITH_VOC_LABELS_V1`. You can also use `weights=FCN_ResNet50_Weights.DEFAULT` to get the most up-to-date weights.\n", + " warnings.warn(msg)\n" + ] + } + ], + "source": [ + "model = models.segmentation.fcn_resnet50(pretrained=True)\n", + "\n", + "# output class ๊ฐœ์ˆ˜๋ฅผ dataset์— ๋งž๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.\n", + "model.classifier[4] = nn.Conv2d(512, len(CLASSES), kernel_size=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "801e9a3a", + "metadata": {}, + "outputs": [], + "source": [ + "# Loss function์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.\n", + "criterion = nn.BCEWithLogitsLoss()\n", + "\n", + "# Optimizer๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.\n", + "optimizer = optim.Adam(params=model.parameters(), lr=LR, weight_decay=1e-6)" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "a11d1b92", + "metadata": {}, + "outputs": [], + "source": [ + "# ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.\n", + "set_seed()" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "7564c751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start training..\n", + "2024-11-11 10:25:33 | Epoch [1/25], Step [25/80], Loss: 0.5416\n", + "2024-11-11 10:26:00 | Epoch [1/25], Step [50/80], Loss: 0.4473\n", + "2024-11-11 10:26:27 | Epoch [1/25], Step [75/80], Loss: 0.3589\n", + "2024-11-11 10:27:12 | Epoch [2/25], Step [25/80], Loss: 0.2706\n", + "2024-11-11 10:27:41 | Epoch [2/25], Step [50/80], Loss: 0.2141\n", + "2024-11-11 10:28:07 | Epoch [2/25], Step [75/80], Loss: 0.1718\n", + "2024-11-11 10:28:49 | Epoch [3/25], Step [25/80], Loss: 0.1351\n", + "2024-11-11 10:29:16 | Epoch [3/25], Step [50/80], Loss: 0.1124\n", + "2024-11-11 10:29:45 | Epoch [3/25], Step [75/80], Loss: 0.0954\n", + "2024-11-11 10:30:26 | Epoch [4/25], Step [25/80], Loss: 0.0794\n", + "2024-11-11 10:30:55 | Epoch [4/25], Step [50/80], Loss: 0.0699\n", + "2024-11-11 10:31:22 | Epoch [4/25], Step [75/80], Loss: 0.0611\n", + "2024-11-11 10:32:04 | Epoch [5/25], Step [25/80], Loss: 0.0525\n", + "2024-11-11 10:32:32 | Epoch [5/25], Step [50/80], Loss: 0.0474\n", + "2024-11-11 10:33:00 | Epoch [5/25], Step [75/80], Loss: 0.0431\n", + "Start validation # 5\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/20 [00:08 1\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrain_loader\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalid_loader\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimizer\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[0;32mIn[103], line 34\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(model, data_loader, val_loader, criterion, optimizer)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;66;03m# validation ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  best model์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.\u001b[39;00m\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (epoch \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m%\u001b[39m VAL_EVERY \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m---> 34\u001b[0m dice \u001b[38;5;241m=\u001b[39m \u001b[43mvalidation\u001b[49m\u001b[43m(\u001b[49m\u001b[43mepoch\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mval_loader\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m best_dice \u001b[38;5;241m<\u001b[39m dice:\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBest performance at epoch: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mepoch\u001b[38;5;250m \u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;250m \u001b[39m\u001b[38;5;241m1\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbest_dice\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.4f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m -> \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdice\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.4f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[0;32mIn[102], line 24\u001b[0m, in \u001b[0;36mvalidation\u001b[0;34m(epoch, model, data_loader, criterion, thr)\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m output_h \u001b[38;5;241m!=\u001b[39m mask_h \u001b[38;5;129;01mor\u001b[39;00m output_w \u001b[38;5;241m!=\u001b[39m mask_w:\n\u001b[1;32m 22\u001b[0m outputs \u001b[38;5;241m=\u001b[39m F\u001b[38;5;241m.\u001b[39minterpolate(outputs, size\u001b[38;5;241m=\u001b[39m(mask_h, mask_w), mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbilinear\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 24\u001b[0m loss \u001b[38;5;241m=\u001b[39m \u001b[43mcriterion\u001b[49m\u001b[43m(\u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmasks\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 25\u001b[0m total_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m loss\n\u001b[1;32m 26\u001b[0m cnt \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1518\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1516\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m 1517\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1518\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1527\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1522\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1523\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1524\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1525\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1526\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1527\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1529\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1530\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/modules/loss.py:725\u001b[0m, in \u001b[0;36mBCEWithLogitsLoss.forward\u001b[0;34m(self, input, target)\u001b[0m\n\u001b[1;32m 724\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor, target: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 725\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbinary_cross_entropy_with_logits\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtarget\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 726\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 727\u001b[0m \u001b[43m \u001b[49m\u001b[43mpos_weight\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpos_weight\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 728\u001b[0m \u001b[43m \u001b[49m\u001b[43mreduction\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreduction\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/functional.py:3195\u001b[0m, in \u001b[0;36mbinary_cross_entropy_with_logits\u001b[0;34m(input, target, weight, size_average, reduce, reduction, pos_weight)\u001b[0m\n\u001b[1;32m 3192\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (target\u001b[38;5;241m.\u001b[39msize() \u001b[38;5;241m==\u001b[39m \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msize()):\n\u001b[1;32m 3193\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTarget size (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtarget\u001b[38;5;241m.\u001b[39msize()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) must be the same as input size (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msize()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 3195\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbinary_cross_entropy_with_logits\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtarget\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpos_weight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreduction_enum\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mOutOfMemoryError\u001b[0m: CUDA out of memory. Tried to allocate 3.62 GiB. GPU 0 has a total capacty of 31.74 GiB of which 3.53 GiB is free. Process 3519779 has 28.20 GiB memory in use. Of the allocated memory 19.15 GiB is allocated by PyTorch, and 8.66 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF" + ] + } + ], + "source": [ + "train(model, train_loader, valid_loader, criterion, optimizer)" + ] + }, + { + "cell_type": "markdown", + "id": "85f36ce9", + "metadata": {}, + "source": [ + "# Inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b438c65", + "metadata": {}, + "outputs": [], + "source": [ + "model = torch.load(os.path.join(SAVED_DIR, \"fcn_resnet50_best_model.pt\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da6dd353", + "metadata": {}, + "outputs": [], + "source": [ + "# ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”\n", + "\n", + "IMAGE_ROOT = \"/data/ephemeral/home/data/test/DCM\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "463d5c19", + "metadata": {}, + "outputs": [], + "source": [ + "pngs = {\n", + " os.path.relpath(os.path.join(root, fname), start=IMAGE_ROOT)\n", + " for root, _dirs, files in os.walk(IMAGE_ROOT)\n", + " for fname in files\n", + " if os.path.splitext(fname)[1].lower() == \".png\"\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ecb5c065-b44b-4f82-ba6d-b41e3e7f6ad2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "288" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(pngs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b2794ea", + "metadata": {}, + "outputs": [], + "source": [ + "# mask map์œผ๋กœ ๋‚˜์˜ค๋Š” ์ธํผ๋Ÿฐ์Šค ๊ฒฐ๊ณผ๋ฅผ RLE๋กœ ์ธ์ฝ”๋”ฉ ํ•ฉ๋‹ˆ๋‹ค.\n", + "\n", + "def encode_mask_to_rle(mask):\n", + " '''\n", + " mask: numpy array binary mask \n", + " 1 - mask \n", + " 0 - background\n", + " Returns encoded run length \n", + " '''\n", + " pixels = mask.flatten()\n", + " pixels = np.concatenate([[0], pixels, [0]])\n", + " runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n", + " runs[1::2] -= runs[::2]\n", + " return ' '.join(str(x) for x in runs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1db55005", + "metadata": {}, + "outputs": [], + "source": [ + "# RLE๋กœ ์ธ์ฝ”๋”ฉ๋œ ๊ฒฐ๊ณผ๋ฅผ mask map์œผ๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.\n", + "\n", + "def decode_rle_to_mask(rle, height, width):\n", + " s = rle.split()\n", + " starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n", + " starts -= 1\n", + " ends = starts + lengths\n", + " img = np.zeros(height * width, dtype=np.uint8)\n", + " \n", + " for lo, hi in zip(starts, ends):\n", + " img[lo:hi] = 1\n", + " \n", + " return img.reshape(height, width)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e98506f", + "metadata": {}, + "outputs": [], + "source": [ + "class XRayInferenceDataset(Dataset):\n", + " def __init__(self, transforms=None):\n", + " _filenames = pngs\n", + " _filenames = np.array(sorted(_filenames))\n", + " \n", + " self.filenames = _filenames\n", + " self.transforms = transforms\n", + " \n", + " def __len__(self):\n", + " return len(self.filenames)\n", + " \n", + " def __getitem__(self, item):\n", + " image_name = self.filenames[item]\n", + " image_path = os.path.join(IMAGE_ROOT, image_name)\n", + " \n", + " image = cv2.imread(image_path)\n", + " image = image / 255.\n", + " \n", + " if self.transforms is not None:\n", + " inputs = {\"image\": image}\n", + " result = self.transforms(**inputs)\n", + " image = result[\"image\"]\n", + "\n", + " # to tenser will be done later\n", + " image = image.transpose(2, 0, 1) \n", + " \n", + " image = torch.from_numpy(image).float()\n", + " \n", + " return image, image_name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "112a73a3", + "metadata": {}, + "outputs": [], + "source": [ + "def test(model, data_loader, thr=0.5):\n", + " model = model.cuda()\n", + " model.eval()\n", + "\n", + " rles = []\n", + " filename_and_class = []\n", + " with torch.no_grad():\n", + " n_class = len(CLASSES)\n", + "\n", + " for step, (images, image_names) in tqdm(enumerate(data_loader), total=len(data_loader)):\n", + " images = images.cuda() \n", + " outputs = model(images)['out']\n", + " \n", + " outputs = F.interpolate(outputs, size=(2048, 2048), mode=\"bilinear\")\n", + " outputs = torch.sigmoid(outputs)\n", + " outputs = (outputs > thr).detach().cpu().numpy()\n", + " \n", + " for output, image_name in zip(outputs, image_names):\n", + " for c, segm in enumerate(output):\n", + " rle = encode_mask_to_rle(segm)\n", + " rles.append(rle)\n", + " filename_and_class.append(f\"{IND2CLASS[c]}_{image_name}\")\n", + " \n", + " return rles, filename_and_class" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8011f0cd", + "metadata": {}, + "outputs": [], + "source": [ + "tf = A.Resize(512, 512)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bcb091af", + "metadata": {}, + "outputs": [], + "source": [ + "test_dataset = XRayInferenceDataset(transforms=tf)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62aff8c2", + "metadata": {}, + "outputs": [], + "source": [ + "test_loader = DataLoader(\n", + " dataset=test_dataset, \n", + " batch_size=2,\n", + " shuffle=False,\n", + " num_workers=2,\n", + " drop_last=False\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa7c963b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 144/144 [03:00<00:00, 1.25s/it]\n" + ] + } + ], + "source": [ + "rles, filename_and_class = test(model, test_loader)" + ] + }, + { + "cell_type": "markdown", + "id": "28e9e8a2", + "metadata": {}, + "source": [ + "# Result Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eeedc485", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'finger-1_ID040/image1661319116107.png'" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filename_and_class[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "faa6b4a2", + "metadata": {}, + "outputs": [], + "source": [ + "image = cv2.imread(os.path.join(IMAGE_ROOT, filename_and_class[0].split(\"_\")[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5997f748", + "metadata": {}, + "outputs": [], + "source": [ + "preds = []\n", + "for rle in rles[:len(CLASSES)]:\n", + " pred = decode_rle_to_mask(rle, height=2048, width=2048)\n", + " preds.append(pred)\n", + "\n", + "preds = np.stack(preds, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "679f5401", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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CxcuHO9qCDGMn//853b88cePdzWEEEIIIYQQovSM9GzftAHh3t5emzlzpm3bts2mT58+3tURwJ49e+z444+31157zbq6usa7OgKQbsqN9FNepJvyIt2UF+mmvEg35WY09ZNSsr1799qCBQsO6q0PQow19Xrdenp67LTTTpNNKiGaL8qLdFNepJvyIt2UG+mnvEg35UW6KS+jrZuDfbZv2ldGe6OnT5+uzl5Surq6pJuSIt2UG+mnvEg35UW6KS/STXmRbsrNaOlHi2dFmWltbbXjjjvOzGSTyox0U16km/Ii3ZQX6abcSD/lRbopL9JNeRlN3RzMs72WgQshhBBCCCGEEEIIIYQQQgghRJOigLAQQgghhBBCCCGEEEIIIYQQQjQpTRsQ7uzstBtvvNE6OzvHuyqCkG7Ki3RTbqSf8iLdlBfpprxIN+VFuik30o+YbKjPlxfpprxIN+VFuikv0k25kX7Ki3RTXqSb8jJeumlJKaUxLVEIIYQQQgghhBBCCCGEEEIIIcSY0LQ7hIUQQgghhBBCCCGEEEIIIYQQYrKjgLAQQgghhBBCCCGEEEIIIYQQQjQpCggLIYQQQgghhBBCCCGEEEIIIUSTooCwEEIIIYQQQgghhBBCCCGEEEI0KU0bEF6zZo2dcMIJNmXKFFu2bJk9/fTT412lpuaWW26x3/iN37Cjjz7a5syZY7/3e79nPT09uTTnnnuutbS05H6uuuqqXJpt27bZhRdeaNOmTbM5c+bY9ddfb4ODg2PZlKbjpptuGib3U045JTvf399vq1atsmOOOcbe8Y532MUXX2w7d+7M5SG9HDlOOOGEYfppaWmxVatWmZnGzVjy2GOP2e/+7u/aggULrKWlxb773e/mzqeU7Atf+ILNnz/fpk6dasuXL7eXXnopl+aNN96wyy67zLq6umzGjBl25ZVX2ptvvplL89xzz9kHP/hBmzJlih1//PF22223HemmTXga6aZWq9nq1att6dKldtRRR9mCBQvsox/9qP3yl7/M5RGNtVtvvTWXRro5dEYaN1dcccUwuZ9//vm5NBo3R4aRdBPNPS0tLXb77bdnaTRujgwHc988Wvdn69evt7POOss6Ozvtne98p919991HunlCjCp6rh979GxfXvRsX170XF8e9FxfbvRsX170bF9e9GxfXibis31TBoT//d//3a677jq78cYb7dlnn7UzzzzTVq5cabt27RrvqjUtjz76qK1atcqefPJJW7t2rdVqNVuxYoXt27cvl+4Tn/iEbd++PftBwzI0NGQXXnihVatVe+KJJ+zrX/+63X333faFL3xhrJvTdLz73e/Oyf3xxx/Pzn3mM5+x//iP/7Bvf/vb9uijj9ovf/lL+/CHP5ydl16OLD/60Y9yulm7dq2Zmf3BH/xBlkbjZmzYt2+fnXnmmbZmzZrw/G233Wb/8A//YF/+8pftqaeesqOOOspWrlxp/f39WZrLLrvMnn/+eVu7dq3df//99thjj9knP/nJ7PyePXtsxYoVtnjxYtu4caPdfvvtdtNNN9k///M/H/H2TWQa6Wb//v327LPP2uc//3l79tln7Tvf+Y719PTYhz70oWFpb7755txY+tSnPpWdk24Oj5HGjZnZ+eefn5P7N7/5zdx5jZsjw0i6QZ1s377dvva1r1lLS4tdfPHFuXQaN6PPwdw3j8b92datW+3CCy+03/7t37bNmzfbtddeax//+MftBz/4wZi2V4jDRc/144Oe7cuNnu3LiZ7ry4Oe68uNnu3Li57ty4ue7cvLhHy2T03I+973vrRq1ars/6GhobRgwYJ0yy23jGOtJhe7du1KZpYeffTR7Nhv/dZvpU9/+tOF1zz44IOptbU17dixIzt25513pq6urjQwMHAkq9vU3HjjjenMM88Mz/X29qaOjo707W9/Ozv24osvJjNLGzZsSClJL2PNpz/96XTSSSeler2eUtK4GS/MLN17773Z//V6Pc2bNy/dfvvt2bHe3t7U2dmZvvnNb6aUUnrhhReSmaUf/ehHWZrvfe97qaWlJf3iF79IKaX0pS99Kc2cOTOnm9WrV6eTTz75CLeoeWDdRDz99NPJzNKrr76aHVu8eHG64447Cq+Rbt4+kW4uv/zydNFFFxVeo3EzNhzMuLnooovS7/zO7+SOadyMDXzfPFr3Z5/73OfSu9/97lxZl1xySVq5cuWRbpIQo4Ke68uBnu3Lg57tJw56ri8Heq4vN3q2Ly96ti8verYvNxPh2b7pdghXq1XbuHGjLV++PDvW2tpqy5cvtw0bNoxjzSYXu3fvNjOzWbNm5Y7/67/+q82ePdtOP/10u+GGG2z//v3ZuQ0bNtjSpUtt7ty52bGVK1fanj177Pnnnx+bijcpL730ki1YsMBOPPFEu+yyy2zbtm1mZrZx40ar1Wq58XLKKafYokWLsvEivYwd1WrVvvGNb9jHPvYxa2lpyY5r3Iw/W7dutR07duTGyvTp023ZsmW5sTJjxgz79V//9SzN8uXLrbW11Z566qkszTnnnGOVSiVLs3LlSuvp6bFf/epXY9Sa5mf37t3W0tJiM2bMyB2/9dZb7ZhjjrH3vve9dvvtt+devyLdHDnWr19vc+bMsZNPPtmuvvpqe/3117NzGjflYOfOnfbAAw/YlVdeOeycxs2Rh++bR+v+bMOGDbk8PI2eicREQM/15UHP9uVCz/blR8/15UXP9RMPPduXCz3blx89248vE+HZvv2Qryg5//u//2tDQ0M5AZqZzZ071/77v/97nGo1uajX63bttdfaBz7wATv99NOz43/8x39sixcvtgULFthzzz1nq1evtp6eHvvOd75jZmY7duwI9ebnxOGxbNkyu/vuu+3kk0+27du321//9V/bBz/4QduyZYvt2LHDKpXKsBuruXPnZjKXXsaO7373u9bb22tXXHFFdkzjphy4LCNZ41iZM2dO7nx7e7vNmjUrl2bJkiXD8vBzM2fOPCL1n0z09/fb6tWr7dJLL7Wurq7s+J//+Z/bWWedZbNmzbInnnjCbrjhBtu+fbt98YtfNDPp5khx/vnn24c//GFbsmSJvfLKK/aXf/mXdsEFF9iGDRusra1N46YkfP3rX7ejjz4699oiM42bsSC6bx6t+7OiNHv27LG+vj6bOnXqkWiSEKOCnuvLgZ7ty4We7ScGeq4vL3qun1jo2b5c6Nl+YqBn+/FjojzbN11AWIw/q1atsi1btuS+ZWNmuW8GLF261ObPn2/nnXeevfLKK3bSSSeNdTUnDRdccEH29xlnnGHLli2zxYsX27e+9S05AkvGV7/6VbvgggtswYIF2TGNGyEOnlqtZn/4h39oKSW78847c+euu+667O8zzjjDKpWK/emf/qndcsst1tnZOdZVnTT80R/9Ufb30qVL7YwzzrCTTjrJ1q9fb+edd9441kwgX/va1+yyyy6zKVOm5I5r3Bx5iu6bhRCiDOjZvlzo2X5ioOd6Id4+erYvH3q2nxjo2X78mCjP9k33yujZs2dbW1ub7dy5M3d8586dNm/evHGq1eThmmuusfvvv98eeeQRW7hwYcO0y5YtMzOzl19+2czM5s2bF+rNz4nRYcaMGfZrv/Zr9vLLL9u8efOsWq1ab29vLg2OF+llbHj11VftoYceso9//OMN02ncjA8uy0Zzy7x582zXrl2584ODg/bGG29oPI0B/sD46quv2tq1a3MriCOWLVtmg4OD9rOf/czMpJux4sQTT7TZs2fnbJjGzfjyX//1X9bT0zPi/GOmcTPaFN03j9b9WVGarq4uBQ5E6dFz/fijZ/vyo2f78qHn+nKj5/qJgZ7tJwZ6ti8ferYfPybSs33TBYQrlYqdffbZ9vDDD2fH6vW6Pfzww9bd3T2ONWtuUkp2zTXX2L333mvr1q0b9oqBiM2bN5uZ2fz5883MrLu7237yk5/kJg+f+E877bQjUu/JyJtvvmmvvPKKzZ8/384++2zr6OjIjZeenh7btm1bNl6kl7Hhrrvusjlz5tiFF17YMJ3GzfiwZMkSmzdvXm6s7Nmzx5566qncWOnt7bWNGzdmadatW2f1ej174O/u7rbHHnvMarValmbt2rV28skn6/UrbwN/YHzppZfsoYcesmOOOWbEazZv3mytra3ZK42km7Hh5z//ub3++us5G6ZxM7589atftbPPPtvOPPPMEdNq3IwOI903j9b9WXd3dy4PT6NnIjER0HP9+KFn+4mDnu3Lh57ry42e68uPnu0nDnq2Lx96th97JuSzfWpC7rnnntTZ2Znuvvvu9MILL6RPfvKTacaMGWnHjh3jXbWm5eqrr07Tp09P69evT9u3b89+9u/fn1JK6eWXX04333xzeuaZZ9LWrVvTfffdl0488cR0zjnnZHkMDg6m008/Pa1YsSJt3rw5ff/730/HHntsuuGGG8arWU3BZz/72bR+/fq0devW9MMf/jAtX748zZ49O+3atSullNJVV12VFi1alNatW5eeeeaZ1N3dnbq7u7PrpZcjz9DQUFq0aFFavXp17rjGzdiyd+/etGnTprRp06ZkZumLX/xi2rRpU3r11VdTSindeuutacaMGem+++5Lzz33XLrooovSkiVLUl9fX5bH+eefn9773vemp556Kj3++OPpXe96V7r00kuz8729vWnu3LnpIx/5SNqyZUu655570rRp09JXvvKVMW/vRKKRbqrVavrQhz6UFi5cmDZv3pybgwYGBlJKKT3xxBPpjjvuSJs3b06vvPJK+sY3vpGOPfbY9NGPfjQrQ7o5PBrpZu/evekv/uIv0oYNG9LWrVvTQw89lM4666z0rne9K/X392d5aNwcGUayaSmltHv37jRt2rR05513Drte4+bIMdJ9c0qjc3/205/+NE2bNi1df/316cUXX0xr1qxJbW1t6fvf//6YtleIw0XP9eODnu3Li57ty42e68uBnuvLjZ7ty4ue7cuLnu3Ly0R8tm/KgHBKKf3jP/5jWrRoUapUKul973tfevLJJ8e7Sk2NmYU/d911V0oppW3btqVzzjknzZo1K3V2dqZ3vvOd6frrr0+7d+/O5fOzn/0sXXDBBWnq1Klp9uzZ6bOf/Wyq1Wrj0KLm4ZJLLknz589PlUolHXfccemSSy5JL7/8cna+r68v/dmf/VmaOXNmmjZtWvr93//9tH379lwe0suR5Qc/+EEys9TT05M7rnEztjzyyCOhHbv88stTSinV6/X0+c9/Ps2dOzd1dnam8847b5jOXn/99XTppZemd7zjHamrqyv9yZ/8Sdq7d28uzY9//OP0m7/5m6mzszMdd9xx6dZbbx2rJk5YGulm69athXPQI488klJKaePGjWnZsmVp+vTpacqUKenUU09Nf/u3f5t7cElJujkcGulm//79acWKFenYY49NHR0dafHixekTn/jEMEe+xs2RYSSbllJKX/nKV9LUqVNTb2/vsOs1bo4cI903pzR692ePPPJIes973pMqlUo68cQTc2UIMRHQc/3Yo2f78qJn+3Kj5/pyoOf6cqNn+/KiZ/vyomf78jIRn+1b/n/FhRBCCCGEEEIIIYQQQgghhBBCNBlN9w1hIYQQQgghhBBCCCGEEEIIIYQQb6GAsBBCCCGEEEIIIYQQQgghhBBCNCkKCAshhBBCCCGEEEIIIYQQQgghRJOigLAQQgghhBBCCCGEEEIIIYQQQjQpCggLIYQQQgghhBBCCCGEEEIIIUSTooCwEEIIIYQQQgghhBBCCCGEEEI0KQoICyGEEEIIIYQQQgghhBBCCCFEk6KAsBBCCCGEEEIIIYQQQgghhBBCNCkKCAshhBBCCCGEEEIIIYQQQgghRJOigLAQQgghhBBCCCGEEEIIIYQQQjQpCggLIYQQQgghhBBCCCGEEEIIIUSTooCwEEIIIYQQQgghhBBCCCGEEEI0Kf8PGWPQvnouL68AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 2, figsize=(24, 12))\n", + "ax[0].imshow(image) # remove channel dimension\n", + "ax[1].imshow(label2rgb(preds))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "65f9b574", + "metadata": {}, + "source": [ + "# To CSV" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6c58f80", + "metadata": {}, + "outputs": [], + "source": [ + "classes, filename = zip(*[x.split(\"_\") for x in filename_and_class])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f489c54", + "metadata": {}, + "outputs": [], + "source": [ + "image_name = [os.path.basename(f) for f in filename]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a33cd628", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame({\n", + " \"image_name\": image_name,\n", + " \"class\": classes,\n", + " \"rle\": rles,\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b8ddbe2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_nameclassrle
0image1661319116107.pngfinger-11954318 1 1956365 3 1958412 5 1960459 7 196250...
1image1661319116107.pngfinger-22169391 5 2171439 5 2173486 7 2175534 8 217758...
2image1661319116107.pngfinger-32587244 6 2589288 12 2591331 19 2593376 23 259...
3image1661319116107.pngfinger-4
4image1661319116107.pngfinger-51141486 4 1143533 6 1145580 7 1147628 8 114967...
5image1661319116107.pngfinger-61450764 6 1452807 14 1454849 22 1456892 29 145...
6image1661319116107.pngfinger-72050885 12 2052919 27 2054959 37 2057005 39 20...
7image1661319116107.pngfinger-8
8image1661319116107.pngfinger-9979923 1 981971 2 984018 5 986066 7 988114 8 9...
9image1661319116107.pngfinger-101344463 32 1346509 35 1348556 37 1350604 37 13...
10image1661319116107.pngfinger-112032592 32 2034637 36 2036683 38 2038728 42 20...
11image1661319116107.pngfinger-12
12image1661319116107.pngfinger-131127599 4 1129646 6 1131693 8 1133741 8 113578...
13image1661319116107.pngfinger-141526924 4 1528963 15 1531003 25 1533044 33 153...
14image1661319116107.pngfinger-152143311 3 2145357 7 2147403 11 2149449 15 2151...
15image1661319116107.pngfinger-16
16image1661319116107.pngfinger-17
17image1661319116107.pngfinger-181852717 5 1854764 7 1856810 10 1858856 12 1860...
18image1661319116107.pngfinger-192286769 3 2288815 6 2290862 8 2292910 10 22949...
19image1661319116107.pngTrapezium3033906 1 3035951 6 3037998 8 3040045 11 30420...
20image1661319116107.pngTrapezoid3046254 2 3048301 4 3050349 5 3052397 4 3054446 2
21image1661319116107.pngCapitate2982860 6 2984902 14 2986947 18 2988993 20 299...
22image1661319116107.pngHamate2991150 2 2993196 6 2995242 9 2997287 13 29993...
23image1661319116107.pngScaphoid3203951 4 3205998 6 3208045 8 3210093 9 321214...
24image1661319116107.pngLunate3308496 15 3310542 29 3312588 36 3314635 38 33...
25image1661319116107.pngTriquetrum
26image1661319116107.pngPisiform
27image1661319116107.pngRadius3320627 1 3322674 3 3324721 6 3326769 8 332881...
28image1661319116107.pngUlna3523631 7 3525676 15 3527721 22 3529767 28 353...
29image1661319145363.pngfinger-11799602 1 1801649 2 1803695 5 1805743 5 180779...
\n", + "" + ], + "text/plain": [ + " image_name class \\\n", + "0 image1661319116107.png finger-1 \n", + "1 image1661319116107.png finger-2 \n", + "2 image1661319116107.png finger-3 \n", + "3 image1661319116107.png finger-4 \n", + "4 image1661319116107.png finger-5 \n", + "5 image1661319116107.png finger-6 \n", + "6 image1661319116107.png finger-7 \n", + "7 image1661319116107.png finger-8 \n", + "8 image1661319116107.png finger-9 \n", + "9 image1661319116107.png finger-10 \n", + "10 image1661319116107.png finger-11 \n", + "11 image1661319116107.png finger-12 \n", + "12 image1661319116107.png finger-13 \n", + "13 image1661319116107.png finger-14 \n", + "14 image1661319116107.png finger-15 \n", + "15 image1661319116107.png finger-16 \n", + "16 image1661319116107.png finger-17 \n", + "17 image1661319116107.png finger-18 \n", + "18 image1661319116107.png finger-19 \n", + "19 image1661319116107.png Trapezium \n", + "20 image1661319116107.png Trapezoid \n", + "21 image1661319116107.png Capitate \n", + "22 image1661319116107.png Hamate \n", + "23 image1661319116107.png Scaphoid \n", + "24 image1661319116107.png Lunate \n", + "25 image1661319116107.png Triquetrum \n", + "26 image1661319116107.png Pisiform \n", + "27 image1661319116107.png Radius \n", + "28 image1661319116107.png Ulna \n", + "29 image1661319145363.png finger-1 \n", + "\n", + " rle \n", + "0 1954318 1 1956365 3 1958412 5 1960459 7 196250... \n", + "1 2169391 5 2171439 5 2173486 7 2175534 8 217758... \n", + "2 2587244 6 2589288 12 2591331 19 2593376 23 259... \n", + "3 \n", + "4 1141486 4 1143533 6 1145580 7 1147628 8 114967... \n", + "5 1450764 6 1452807 14 1454849 22 1456892 29 145... \n", + "6 2050885 12 2052919 27 2054959 37 2057005 39 20... \n", + "7 \n", + "8 979923 1 981971 2 984018 5 986066 7 988114 8 9... \n", + "9 1344463 32 1346509 35 1348556 37 1350604 37 13... \n", + "10 2032592 32 2034637 36 2036683 38 2038728 42 20... \n", + "11 \n", + "12 1127599 4 1129646 6 1131693 8 1133741 8 113578... \n", + "13 1526924 4 1528963 15 1531003 25 1533044 33 153... \n", + "14 2143311 3 2145357 7 2147403 11 2149449 15 2151... \n", + "15 \n", + "16 \n", + "17 1852717 5 1854764 7 1856810 10 1858856 12 1860... \n", + "18 2286769 3 2288815 6 2290862 8 2292910 10 22949... \n", + "19 3033906 1 3035951 6 3037998 8 3040045 11 30420... \n", + "20 3046254 2 3048301 4 3050349 5 3052397 4 3054446 2 \n", + "21 2982860 6 2984902 14 2986947 18 2988993 20 299... \n", + "22 2991150 2 2993196 6 2995242 9 2997287 13 29993... \n", + "23 3203951 4 3205998 6 3208045 8 3210093 9 321214... \n", + "24 3308496 15 3310542 29 3312588 36 3314635 38 33... \n", + "25 \n", + "26 \n", + "27 3320627 1 3322674 3 3324721 6 3326769 8 332881... \n", + "28 3523631 7 3525676 15 3527721 22 3529767 28 353... \n", + "29 1799602 1 1801649 2 1803695 5 1805743 5 180779... " + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(30)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e3829b6", + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(\"output.csv\", index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 8d5eaa4909da315f9b8a88a80d906887551062bc Mon Sep 17 00:00:00 2001 From: wonjeongjeong Date: Wed, 13 Nov 2024 09:19:11 +0000 Subject: [PATCH 008/106] [#8] Issue Template/gitignore update --- .github/ISSUE_TEMPLATE/-title----body.md | 22 ++++++++++++++++++++++ .gitignore | 23 +++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/-title----body.md create mode 100644 .gitignore diff --git a/.github/ISSUE_TEMPLATE/-title----body.md b/.github/ISSUE_TEMPLATE/-title----body.md new file mode 100644 index 0000000..83791a1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/-title----body.md @@ -0,0 +1,22 @@ +--- +name: "title/ body" +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +### Issue ํƒ€์ž…(ํ•˜๋‚˜ ์ด์ƒ์˜ Issue ํƒ€์ž…์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”) +- [ ] Feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ +- [ ] Remove : ํŒŒ์ผ ๋ฐ ๊ธฐ๋Šฅ ์‚ญ์ œ +- [ ] Test : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ +- [ ] Fix : ๋ฒ„๊ทธ ์ˆ˜์ • +- [ ] Docs : ๋ฌธ์„œ ์ˆ˜์ • +- [ ] Refactor : ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง +- [ ] Style : ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ, ์ฃผ์„ ์ถ”๊ฐ€ + +### ์ƒ์„ธ ๋‚ด์šฉ +- [ ] ex) Github ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. + +### ์ถ”๊ฐ€์‚ฌํ•ญ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..29e4376 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# ๋ชจ๋ธ checkpoint ์ œ์™ธ +*.pt +*.pkl +*.pth + + +# ๊ฒฐ๊ณผ ํŒŒ์ผ ์ œ์™ธ +*.csv + +# python cache ์ œ์™ธ +__pycache__ +*.pyc +*.pyd + +# dataset ์ œ์™ธ +*.jpg +*.png +*.json +*.tar.gz +*.xlsx + +#wandb +wandb/ \ No newline at end of file From f9277d3030e9041797504d5ff380789909d688e6 Mon Sep 17 00:00:00 2001 From: sejongmin Date: Wed, 13 Nov 2024 09:26:28 +0000 Subject: [PATCH 009/106] =?UTF-8?q?[Feature]=20:=20streamlit=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- streamlit/load.py | 24 ++++++++++ streamlit/main.py | 58 ++++++++++++++++++++++++ streamlit/visualize_v1.py | 87 +++++++++++++++++++++++++++++++++++ streamlit/visualize_v2.py | 95 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 264 insertions(+) create mode 100644 streamlit/load.py create mode 100644 streamlit/main.py create mode 100644 streamlit/visualize_v1.py create mode 100644 streamlit/visualize_v2.py diff --git a/streamlit/load.py b/streamlit/load.py new file mode 100644 index 0000000..a29bbc8 --- /dev/null +++ b/streamlit/load.py @@ -0,0 +1,24 @@ +import os +import numpy as np + +def load(info): + images = { + os.path.relpath(os.path.join(root, fname), start=info['image_root']) + for root, _dirs, files in os.walk(info['image_root']) + for fname in files + if os.path.splitext(fname)[1].lower() == ".png" + } + + labels = { + os.path.relpath(os.path.join(root, fname), start=info['label_root']) + for root, _dirs, files in os.walk(info['label_root']) + for fname in files + if os.path.splitext(fname)[1].lower() == ".json" + } + + images = sorted(images) + labels = sorted(labels) + images = np.array(images) + labels = np.array(labels) + + return images, labels \ No newline at end of file diff --git a/streamlit/main.py b/streamlit/main.py new file mode 100644 index 0000000..200201d --- /dev/null +++ b/streamlit/main.py @@ -0,0 +1,58 @@ +import streamlit as st +import load, visualize_v1, visualize_v2 + +info = { + 'image_root': "../../data/train/DCM", + 'label_root': "../../data/train/outputs_json", + 'classes': [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', + ], + 'palette': [ + (220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228), + (0, 60, 100), (0, 80, 100), (0, 0, 70), (0, 0, 192), (250, 170, 30), + (100, 170, 30), (220, 220, 0), (175, 116, 175), (250, 0, 30), (165, 42, 42), + (255, 77, 255), (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157), + (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), (255, 179, 240), + (0, 125, 92), (209, 0, 151), (188, 208, 182), (0, 220, 176), + ] +} + +COLOR = { + 'finger': (120,203,228), + 'Trapezoid': (145,42,177), + 'Pisiform': (145,42,177), + 'Radius': (210,71,77), + 'Ulna': (210,71,77), + 'wrist': (193,223,159) +} + +st.sidebar.success("CV19 ์˜์›ํ•œ์ข…์ด๋ฐ•") +st.markdown("

Segmentation

", unsafe_allow_html=True) + +if "images" not in st.session_state: + st.session_state.images = [] +if "labels" not in st.session_state: + st.session_state.labels = [] + +option = st.sidebar.radio("option", ["train", "validation", "test"]) +if option == "train": + st.session_state.images, st.session_state.labels = load.load(info) + with st.sidebar.form(key="form"): + st.session_state.text = st.selectbox("select text", ["None", "Text"]) + st.session_state.anno = st.selectbox("select annotation", ['All'] + info['classes']) + submit_button = st.form_submit_button("OK") + image_index = st.sidebar.slider('Select image index', 0, len(st.session_state.images)-2, 0) + image_index_input = st.sidebar.number_input('Enter image index', min_value=0, max_value=len(st.session_state.images)-2, value=image_index, step=2) + if image_index != image_index_input: + image_index = image_index_input + visualize_v2.show(info, st.session_state.images, st.session_state.labels, image_index, st.session_state.text, st.session_state.anno) + +if option == "validation": + st.write("๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค...") +if option == "test": + st.write("๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค...") \ No newline at end of file diff --git a/streamlit/visualize_v1.py b/streamlit/visualize_v1.py new file mode 100644 index 0000000..30cd9ac --- /dev/null +++ b/streamlit/visualize_v1.py @@ -0,0 +1,87 @@ +import os +import cv2 +import json +import torch +import numpy as np +import matplotlib.pyplot as plt +import streamlit as st + +def label2rgb(label, palette): + image_size = label.shape[1:] + (3, ) + image = np.zeros(image_size, dtype=np.uint8) + + for i, class_label in enumerate(label): + image[class_label == 1] = palette[i] + + return image + +def show(info, images, labels, id): + try: + cols = st.columns(2) + CLASS2IND = {v: i for i, v in enumerate(info['classes'])} + IND2CLASS = {v: k for k, v in CLASS2IND.items()} + + image_path = os.path.join(info['image_root'], images[id]) + image_left = cv2.imread(image_path) + image_left = cv2.cvtColor(image_left, cv2.COLOR_BGR2RGB) + image_left = image_left / 255. + + image_path = os.path.join(info['image_root'], images[id + 1]) + image_right = cv2.imread(image_path) + image_right = cv2.cvtColor(image_right, cv2.COLOR_BGR2RGB) + image_right = image_right / 255. + + label_path_left = os.path.join(info['label_root'], labels[id]) + label_shape = tuple(image_left.shape[:2]) + (len(info['classes']), ) + label_left = np.zeros(label_shape, dtype=np.uint8) + + label_path_right = os.path.join(info['label_root'], labels[id + 1]) + label_shape = tuple(image_right.shape[:2]) + (len(info['classes']), ) + label_right = np.zeros(label_shape, dtype=np.uint8) + + with open(label_path_left, "r") as f: + annotations_left = json.load(f) + annotations_left = annotations_left["annotations"] + + with open(label_path_right, "r") as f: + annotations_right = json.load(f) + annotations_right = annotations_right["annotations"] + + for ann in annotations_left: + c = ann["label"] + class_ind = CLASS2IND[c] + points = np.array(ann["points"]) + + class_label_left = np.zeros(image_left.shape[:2], dtype=np.uint8) + cv2.fillPoly(class_label_left, [points], 1) + label_left[..., class_ind] = class_label_left + + for ann in annotations_right: + c = ann["label"] + class_ind = CLASS2IND[c] + points = np.array(ann["points"]) + + class_label_right = np.zeros(image_right.shape[:2], dtype=np.uint8) + cv2.fillPoly(class_label_right, [points], 1) + label_right[..., class_ind] = class_label_right + + label_left = label_left.transpose(2, 0, 1) + label_right = label_right.transpose(2, 0, 1) + + label_left = torch.from_numpy(label_left).float() + label_right = torch.from_numpy(label_right).float() + + fig_left, ax_left = plt.subplots() + ax_left.imshow(label2rgb(label_left, info['palette'])) + ax_left.set_axis_off() + + fig_right, ax_right = plt.subplots() + ax_right.imshow(label2rgb(label_right, info['palette'])) + ax_right.set_axis_off() + + with cols[0]: + st.pyplot(fig_left) + with cols[1]: + st.pyplot(fig_right) + except Exception as e: + st.write(e) diff --git a/streamlit/visualize_v2.py b/streamlit/visualize_v2.py new file mode 100644 index 0000000..fcc8be5 --- /dev/null +++ b/streamlit/visualize_v2.py @@ -0,0 +1,95 @@ +import os +import json +import streamlit as st +from PIL import Image +import matplotlib.pyplot as plt +import matplotlib.patches as patches + +COLOR = { + 'finger': (120,203,228), + 'Trapezoid': (145,42,177), + 'Pisiform': (145,42,177), + 'Radius': (210,71,77), + 'Ulna': (210,71,77), + 'wrist': (193,223,159) +} + +def get_poly(points, label): + if label.startswith('finger'): + label = 'finger' + elif label not in COLOR: + label = 'wrist' + + poly = patches.Polygon( + points, + closed=True, + facecolor=[ck/255 for ck in COLOR[label]], + edgecolor='black', + alpha=0.7 + ) + return poly + +def show(info, images, labels, id, text='None', anno='All'): + cols = st.columns(2) + + image_path_right = os.path.join(info['image_root'], images[id]) + label_path_right = os.path.join(info['label_root'], labels[id]) + + image_path_left = os.path.join(info['image_root'], images[id + 1]) + label_path_left = os.path.join(info['label_root'], labels[id + 1]) + + image_right = Image.open(image_path_right).convert("RGB") + label_right = json.load(open(label_path_right)) + + image_left = Image.open(image_path_left).convert("RGB") + label_left = json.load(open(label_path_left)) + + fig_left, ax_left = plt.subplots() + + ax_left.imshow(image_left) + ax_left.set_title(images[id + 1]) + ax_left.axis('off') + for annot in label_left['annotations']: + points = [tuple(pts) for pts in annot['points']] + orin_label = annot['label'] + label = orin_label + if anno == 'All': + poly = get_poly(points, label) + ax_left.add_patch(poly) + cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) + if text == 'Text': + ax_left.text(cx, cy, orin_label, fontsize=5, color='white') + else: + if label == anno: + poly = get_poly(points, label) + ax_left.add_patch(poly) + cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) + if text == 'Text': + ax_left.text(cx, cy, orin_label, fontsize=5, color='white') + with cols[0]: + st.pyplot(fig_left) + + fig_right, ax_right = plt.subplots() + + ax_right.imshow(image_right) + ax_right.set_title(images[id]) + ax_right.axis('off') + for annot in label_right['annotations']: + points = [tuple(pts) for pts in annot['points']] + orin_label = annot['label'] + label = orin_label + if anno == 'All': + poly = get_poly(points, label) + ax_right.add_patch(poly) + cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) + if text == 'Text': + ax_right.text(cx, cy, orin_label, fontsize=5, color='white') + else: + if label == anno: + poly = get_poly(points, label) + ax_right.add_patch(poly) + cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) + if text == 'Text': + ax_right.text(cx, cy, orin_label, fontsize=5, color='white') + with cols[1]: + st.pyplot(fig_right) \ No newline at end of file From c72f06a48195b83ee643779e05ecce2c28bc97ae Mon Sep 17 00:00:00 2001 From: sejongmin Date: Wed, 13 Nov 2024 09:54:39 +0000 Subject: [PATCH 010/106] =?UTF-8?q?[Refactor]=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- streamlit/main.py | 19 +++++++++---------- streamlit/visualize_v2.py | 23 +++++++---------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/streamlit/main.py b/streamlit/main.py index 200201d..89beb52 100644 --- a/streamlit/main.py +++ b/streamlit/main.py @@ -19,16 +19,15 @@ (255, 77, 255), (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157), (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), (255, 179, 240), (0, 125, 92), (209, 0, 151), (188, 208, 182), (0, 220, 176), - ] -} - -COLOR = { - 'finger': (120,203,228), - 'Trapezoid': (145,42,177), - 'Pisiform': (145,42,177), - 'Radius': (210,71,77), - 'Ulna': (210,71,77), - 'wrist': (193,223,159) + ], + 'color': { + 'finger': (120,203,228), + 'Trapezoid': (145,42,177), + 'Pisiform': (145,42,177), + 'Radius': (210,71,77), + 'Ulna': (210,71,77), + 'wrist': (193,223,159) + } } st.sidebar.success("CV19 ์˜์›ํ•œ์ข…์ด๋ฐ•") diff --git a/streamlit/visualize_v2.py b/streamlit/visualize_v2.py index fcc8be5..19f1197 100644 --- a/streamlit/visualize_v2.py +++ b/streamlit/visualize_v2.py @@ -5,25 +5,16 @@ import matplotlib.pyplot as plt import matplotlib.patches as patches -COLOR = { - 'finger': (120,203,228), - 'Trapezoid': (145,42,177), - 'Pisiform': (145,42,177), - 'Radius': (210,71,77), - 'Ulna': (210,71,77), - 'wrist': (193,223,159) -} - -def get_poly(points, label): +def get_poly(points, label, color): if label.startswith('finger'): label = 'finger' - elif label not in COLOR: + elif label not in color: label = 'wrist' poly = patches.Polygon( points, closed=True, - facecolor=[ck/255 for ck in COLOR[label]], + facecolor=[ck/255 for ck in color[label]], edgecolor='black', alpha=0.7 ) @@ -54,14 +45,14 @@ def show(info, images, labels, id, text='None', anno='All'): orin_label = annot['label'] label = orin_label if anno == 'All': - poly = get_poly(points, label) + poly = get_poly(points, label, info['color']) ax_left.add_patch(poly) cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) if text == 'Text': ax_left.text(cx, cy, orin_label, fontsize=5, color='white') else: if label == anno: - poly = get_poly(points, label) + poly = get_poly(points, label, info['color']) ax_left.add_patch(poly) cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) if text == 'Text': @@ -79,14 +70,14 @@ def show(info, images, labels, id, text='None', anno='All'): orin_label = annot['label'] label = orin_label if anno == 'All': - poly = get_poly(points, label) + poly = get_poly(points, label, info['color']) ax_right.add_patch(poly) cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) if text == 'Text': ax_right.text(cx, cy, orin_label, fontsize=5, color='white') else: if label == anno: - poly = get_poly(points, label) + poly = get_poly(points, label, info['color']) ax_right.add_patch(poly) cx, cy = sum([p[0] for p in points]) / len(points), sum([p[1] for p in points]) / len(points) if text == 'Text': From 8baf87586170a26f4b1f3a89e32febd74062d622 Mon Sep 17 00:00:00 2001 From: yoon0717 Date: Wed, 13 Nov 2024 18:59:16 +0900 Subject: [PATCH 011/106] [Feature]:add module base --- module_base/dataset.py | 136 +++++++++++++++++++++++++ module_base/train.py | 221 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 357 insertions(+) create mode 100644 module_base/dataset.py create mode 100644 module_base/train.py diff --git a/module_base/dataset.py b/module_base/dataset.py new file mode 100644 index 0000000..ffcfba4 --- /dev/null +++ b/module_base/dataset.py @@ -0,0 +1,136 @@ +# python native +import os +import json +import cv2 +import numpy as np +import torch +from torch.utils.data import Dataset +from sklearn.model_selection import GroupKFold + +class XRayDataset(Dataset): + def __init__(self, pngs, jsons, class2ind, classes, image_root, label_root, is_train=True, transforms=None): + self.pngs = pngs + self.jsons = jsons + _filenames = np.array(self.pngs) + _labelnames = np.array(self.jsons) + + # split train-valid + # ํ•œ ํด๋” ์•ˆ์— ํ•œ ์ธ๋ฌผ์˜ ์–‘์†์— ๋Œ€ํ•œ `.dcm` ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— + # ํด๋” ์ด๋ฆ„์„ ๊ทธ๋ฃน์œผ๋กœ ํ•ด์„œ GroupKFold๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + # ๋™์ผ ์ธ๋ฌผ์˜ ์†์ด train, valid์— ๋”ฐ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. + groups = [os.path.dirname(fname) for fname in _filenames] + + # dummy label + ys = [0 for fname in _filenames] + + # ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 20%๋ฅผ validation data๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด `n_splits`๋ฅผ + # 5์œผ๋กœ ์„ค์ •ํ•˜์—ฌ KFold๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + gkf = GroupKFold(n_splits=5) + + filenames = [] + labelnames = [] + for i, (x, y) in enumerate(gkf.split(_filenames, ys, groups)): + if is_train: + # 0๋ฒˆ์„ validation dataset์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + if i == 0: + continue + + filenames += list(_filenames[y]) + labelnames += list(_labelnames[y]) + + else: + filenames = list(_filenames[y]) + labelnames = list(_labelnames[y]) + + # skip i > 0 + break + + self.filenames = filenames + self.labelnames = labelnames + self.is_train = is_train + self.transforms = transforms + self.class2ind = class2ind + self.classes = classes + self.image_root = image_root + self.label_root = label_root + + def __len__(self): + return len(self.filenames) + + def __getitem__(self, item): + image_name = self.filenames[item] + image_path = os.path.join(self.image_root, image_name) + + image = cv2.imread(image_path) + image = image / 255. + + label_name = self.labelnames[item] + label_path = os.path.join(self.label_root, label_name) + + # (H, W, NC) ๋ชจ์–‘์˜ label์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + label_shape = tuple(image.shape[:2]) + (len(self.classes), ) + label = np.zeros(label_shape, dtype=np.uint8) + + # label ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค. + with open(label_path, "r") as f: + annotations = json.load(f) + annotations = annotations["annotations"] + + # ํด๋ž˜์Šค ๋ณ„๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + for ann in annotations: + c = ann["label"] + class_ind = self.class2ind[c] + points = np.array(ann["points"]) + + # polygon ํฌ๋งท์„ denseํ•œ mask ํฌ๋งท์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. + class_label = np.zeros(image.shape[:2], dtype=np.uint8) + cv2.fillPoly(class_label, [points], 1) + label[..., class_ind] = class_label + + if self.transforms is not None: + inputs = {"image": image, "mask": label} if self.is_train else {"image": image} + result = self.transforms(**inputs) + + image = result["image"] + label = result["mask"] if self.is_train else label + + # to tenser will be done later + image = image.transpose(2, 0, 1) # channel first ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. + label = label.transpose(2, 0, 1) + + image = torch.from_numpy(image).float() + label = torch.from_numpy(label).float() + + return image, label + +class XRayInferenceDataset(Dataset): + def __init__(self, pngs, image_root, transforms=None): + self.pngs = pngs + self.image_root = image_root + _filenames = self.pngs + _filenames = np.array(sorted(_filenames)) + + self.filenames = _filenames + self.transforms = transforms + + def __len__(self): + return len(self.filenames) + + def __getitem__(self, item): + image_name = self.filenames[item] + image_path = os.path.join(self.image_root, image_name) + + image = cv2.imread(image_path) + image = image / 255. + + if self.transforms is not None: + inputs = {"image": image} + result = self.transforms(**inputs) + image = result["image"] + + # to tenser will be done later + image = image.transpose(2, 0, 1) # make channel first + + image = torch.from_numpy(image).float() + + return image, image_name \ No newline at end of file diff --git a/module_base/train.py b/module_base/train.py new file mode 100644 index 0000000..9b654dd --- /dev/null +++ b/module_base/train.py @@ -0,0 +1,221 @@ +# python native +import os +import random +import datetime +import numpy as np +from tqdm.auto import tqdm +import albumentations as A +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader +from torchvision import models +from dataset import XRayDataset + +from argparse import ArgumentParser + +def parse_args(): + parser = ArgumentParser() + + # Conventional args + parser.add_argument('--image_root', type=str, default='/data/ephemeral/home/data/train/DCM', + help='Path to the root directory containing images') + parser.add_argument('--label_root', type=str, default='/data/ephemeral/home/data/train/outputs_json', + help='Path to the root directory containing labels') + parser.add_argument('--save_dir', type=str, default="/data/ephemeral/home/data/result", + help='Path to the root directory containing save direction') + parser.add_argument('--batch_size', type=int, default=8) + parser.add_argument('--learning_rate', type=float, default=1e-4) + parser.add_argument('--max_epoch', type=int, default=30) + parser.add_argument('--val_every', type=int, default=5) + parser.add_argument('--random_seed', type=int, default=21) + args = parser.parse_args() + + return args + + +CLASSES = [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', +] + +CLASS2IND = {v: i for i, v in enumerate(CLASSES)} +IND2CLASS = {v: k for k, v in CLASS2IND.items()} + +def dice_coef(y_true, y_pred): + y_true_f = y_true.flatten(2) + y_pred_f = y_pred.flatten(2) + intersection = torch.sum(y_true_f * y_pred_f, -1) + eps = 0.0001 + return (2. * intersection + eps) / (torch.sum(y_true_f, -1) + torch.sum(y_pred_f, -1) + eps) + +def set_seed(random_seed): + torch.manual_seed(random_seed) + torch.cuda.manual_seed(random_seed) + torch.cuda.manual_seed_all(random_seed) # if use multi-GPU + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + np.random.seed(random_seed) + random.seed(random_seed) + +def save_model(model, save_dir, file_name='fcn_resnet50_best_model.pt'): + output_path = os.path.join(save_dir, file_name) + torch.save(model, output_path) + +def validation(epoch, model, data_loader, criterion, thr=0.5): + print(f'Start validation #{epoch:2d}') + model.eval() + + dices = [] + with torch.no_grad(): + n_class = len(CLASSES) + total_loss = 0 + cnt = 0 + + for step, (images, masks) in tqdm(enumerate(data_loader), total=len(data_loader)): + images, masks = images.cuda(), masks.cuda() + model = model.cuda() + + outputs = model(images)['out'] + + output_h, output_w = outputs.size(-2), outputs.size(-1) + mask_h, mask_w = masks.size(-2), masks.size(-1) + + # gt์™€ prediction์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ prediction์„ gt์— ๋งž์ถฐ interpolation ํ•ฉ๋‹ˆ๋‹ค. + if output_h != mask_h or output_w != mask_w: + outputs = F.interpolate(outputs, size=(mask_h, mask_w), mode="bilinear") + + loss = criterion(outputs, masks) + total_loss += loss + cnt += 1 + + outputs = torch.sigmoid(outputs) + outputs = (outputs > thr).detach().cpu() + masks = masks.detach().cpu() + + dice = dice_coef(outputs, masks) + dices.append(dice) + + dices = torch.cat(dices, 0) + dices_per_class = torch.mean(dices, 0) + dice_str = [ + f"{c:<12}: {d.item():.4f}" + for c, d in zip(CLASSES, dices_per_class) + ] + dice_str = "\n".join(dice_str) + print(dice_str) + + avg_dice = torch.mean(dices_per_class).item() + + return avg_dice + +def train(model, train_loader, valid_loader, criterion, optimizer, save_dir, random_seed, max_epoch, val_every): + print(f'Start training..') + + n_class = len(CLASSES) + best_dice = 0. + + for epoch in range(max_epoch): + model.train() + + for step, (images, masks) in enumerate(train_loader): + # gpu ์—ฐ์‚ฐ์„ ์œ„ํ•ด device ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. + images, masks = images.cuda(), masks.cuda() + model = model.cuda() + + outputs = model(images)['out'] + + # loss๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. + loss = criterion(outputs, masks) + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # step ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. + if (step + 1) % 25 == 0: + print( + f'{datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | ' + f'Epoch [{epoch+1}/{max_epoch}], ' + f'Step [{step+1}/{len(train_loader)}], ' + f'Loss: {round(loss.item(),4)}' + ) + + # validation ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  best model์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. + if (epoch + 1) % val_every == 0: + dice = validation(epoch + 1, model, valid_loader, criterion) + + if best_dice < dice: + print(f"Best performance at epoch: {epoch + 1}, {best_dice:.4f} -> {dice:.4f}") + print(f"Save model in {save_dir}") + best_dice = dice + save_model(model, save_dir) + +def do_training(image_root, label_root, save_dir, batch_size, learning_rate, max_epoch, val_every, random_seed): + pngs = { + os.path.relpath(os.path.join(root, fname), start=image_root) + for root, _dirs, files in os.walk(image_root) + for fname in files + if os.path.splitext(fname)[1].lower() == ".png" + } + + jsons = { + os.path.relpath(os.path.join(root, fname), start=label_root) + for root, _dirs, files in os.walk(label_root) + for fname in files + if os.path.splitext(fname)[1].lower() == ".json" + } + + pngs = sorted(pngs) + jsons = sorted(jsons) + + if not os.path.exists(save_dir): + os.makedirs(save_dir) + + tf = A.Resize(512, 512) + + train_dataset = XRayDataset(pngs, jsons, CLASS2IND, CLASSES, image_root, label_root, is_train=True, transforms=tf) + valid_dataset = XRayDataset(pngs, jsons, CLASS2IND, CLASSES, image_root, label_root, is_train=False, transforms=tf) + + train_loader = DataLoader( + dataset=train_dataset, + batch_size=batch_size, + shuffle=True, + num_workers=8, + drop_last=True, + ) + + valid_loader = DataLoader( + dataset=valid_dataset, + batch_size=8, + shuffle=False, + num_workers=0, + drop_last=False + ) + + model = models.segmentation.fcn_resnet50(pretrained=True) + + # output class ๊ฐœ์ˆ˜๋ฅผ dataset์— ๋งž๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. + model.classifier[4] = nn.Conv2d(512, len(CLASSES), kernel_size=1) + + # Loss function์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + criterion = nn.BCEWithLogitsLoss() + + # Optimizer๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + optimizer = optim.Adam(params=model.parameters(), lr=learning_rate, weight_decay=1e-6) + + # ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. + set_seed(random_seed) + + train(model, train_loader, valid_loader, criterion, optimizer, save_dir, random_seed, max_epoch, val_every) + +def main(args): + do_training(**args.__dict__) + +if __name__ == '__main__': + args = parse_args() + main(args) \ No newline at end of file From a95a7271ae3e40be99b9b585d4a3e6ca2e6afab9 Mon Sep 17 00:00:00 2001 From: yoon0717 Date: Wed, 13 Nov 2024 22:29:57 +0900 Subject: [PATCH 012/106] [Feature]:add module base2 --- module_base/dataset.py | 2 +- module_base/inference.py | 136 +++++++++++++++++++++++++++++++++++++++ module_base/train.py | 1 - 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 module_base/inference.py diff --git a/module_base/dataset.py b/module_base/dataset.py index ffcfba4..ce0a90c 100644 --- a/module_base/dataset.py +++ b/module_base/dataset.py @@ -100,7 +100,7 @@ def __getitem__(self, item): image = torch.from_numpy(image).float() label = torch.from_numpy(label).float() - + return image, label class XRayInferenceDataset(Dataset): diff --git a/module_base/inference.py b/module_base/inference.py new file mode 100644 index 0000000..77b6191 --- /dev/null +++ b/module_base/inference.py @@ -0,0 +1,136 @@ +import os +import random +import numpy as np +import pandas as pd +import albumentations as A +import torch +from tqdm.auto import tqdm +import torch.nn.functional as F +from torch.utils.data import DataLoader +from argparse import ArgumentParser +from dataset import XRayInferenceDataset + +def parse_args(): + parser = ArgumentParser() + + parser.add_argument('--image_root', type=str, default='//data/ephemeral/home/data/test/DCM', + help='Path to the root directory containing images') + parser.add_argument('--save_dir', type=str, default="/data/ephemeral/home/data/train/result", + help='Path to the root directory containing save direction') + parser.add_argument('--random_seed', type=int, default=21) + args = parser.parse_args() + + return args + +CLASSES = [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', +] + +CLASS2IND = {v: i for i, v in enumerate(CLASSES)} +IND2CLASS = {v: k for k, v in CLASS2IND.items()} + +def set_seed(random_seed): + torch.manual_seed(random_seed) + torch.cuda.manual_seed(random_seed) + torch.cuda.manual_seed_all(random_seed) # if use multi-GPU + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + np.random.seed(random_seed) + random.seed(random_seed) + +def encode_mask_to_rle(mask): + ''' + mask: numpy array binary mask + 1 - mask + 0 - background + Returns encoded run length + ''' + pixels = mask.flatten() + pixels = np.concatenate([[0], pixels, [0]]) + runs = np.where(pixels[1:] != pixels[:-1])[0] + 1 + runs[1::2] -= runs[::2] + return ' '.join(str(x) for x in runs) + +def decode_rle_to_mask(rle, height, width): + s = rle.split() + starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])] + starts -= 1 + ends = starts + lengths + img = np.zeros(height * width, dtype=np.uint8) + + for lo, hi in zip(starts, ends): + img[lo:hi] = 1 + + return img.reshape(height, width) + +def test(model, data_loader, thr=0.5): + model = model.cuda() + model.eval() + + rles = [] + filename_and_class = [] + with torch.no_grad(): + n_class = len(CLASSES) + + for step, (images, image_names) in tqdm(enumerate(data_loader), total=len(data_loader)): + images = images.cuda() + outputs = model(images)['out'] + + outputs = F.interpolate(outputs, size=(2048, 2048), mode="bilinear") + outputs = torch.sigmoid(outputs) + outputs = (outputs > thr).detach().cpu().numpy() + + for output, image_name in zip(outputs, image_names): + for c, segm in enumerate(output): + rle = encode_mask_to_rle(segm) + rles.append(rle) + filename_and_class.append(f"{IND2CLASS[c]}_{image_name}") + + return rles, filename_and_class + +def do_inference(image_root, save_dir, random_seed): + set_seed(random_seed) + pngs = { + os.path.relpath(os.path.join(root, fname), start=image_root) + for root, _dirs, files in os.walk(image_root) + for fname in files + if os.path.splitext(fname)[1].lower() == ".png" + } + model = torch.load(os.path.join(save_dir, "best_model.pt")) + + tf = A.Resize(512, 512) + test_dataset = XRayInferenceDataset(pngs, image_root,transforms=tf) + + test_loader = DataLoader( + dataset=test_dataset, + batch_size=2, + shuffle=False, + num_workers=2, + drop_last=False + ) + + rles, filename_and_class = test(model, test_loader) + + classes, filename = zip(*[x.split("_") for x in filename_and_class]) + + image_name = [os.path.basename(f) for f in filename] + + df = pd.DataFrame({ + "image_name": image_name, + "class": classes, + "rle": rles, + }) + + df.to_csv("output.csv", index=False) + +def main(args): + do_inference(**args.__dict__) + +if __name__ == '__main__': + args = parse_args() + main(args) \ No newline at end of file diff --git a/module_base/train.py b/module_base/train.py index 9b654dd..8d6434b 100644 --- a/module_base/train.py +++ b/module_base/train.py @@ -12,7 +12,6 @@ from torch.utils.data import DataLoader from torchvision import models from dataset import XRayDataset - from argparse import ArgumentParser def parse_args(): From 5676b6c2388381149f8214c44410f56b38ee754c Mon Sep 17 00:00:00 2001 From: yoon0717 Date: Thu, 14 Nov 2024 18:23:31 +0900 Subject: [PATCH 013/106] [Feature] : modularize base code3 --- baseline_code.ipynb | 545 +++++++++---------------------------------- module_base/train.py | 25 +- 2 files changed, 130 insertions(+), 440 deletions(-) diff --git a/baseline_code.ipynb b/baseline_code.ipynb index aa12b9b..4378ae4 100644 --- a/baseline_code.ipynb +++ b/baseline_code.ipynb @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "id": "a3907598-e3f4-4c30-b1fe-759870903ecf", "metadata": {}, "outputs": [], @@ -73,10 +73,21 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 1, "id": "c8295cb6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "/opt/conda/lib/python3.10/site-packages/albumentations/__init__.py:13: UserWarning: A new version of Albumentations is available: 1.4.21 (you have 1.4.18). Upgrade using: pip install -U albumentations. To disable automatic update checks, set the environment variable NO_ALBUMENTATIONS_UPDATE to 1.\n", + " check_for_updates()\n" + ] + } + ], "source": [ "# python native\n", "import os\n", @@ -107,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 2, "id": "1d6746cc", "metadata": {}, "outputs": [], @@ -120,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 3, "id": "819e163c", "metadata": {}, "outputs": [], @@ -137,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 4, "id": "3192cd81", "metadata": {}, "outputs": [], @@ -147,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 5, "id": "1aef86f9", "metadata": {}, "outputs": [], @@ -157,19 +168,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "cb199e3d", "metadata": {}, "outputs": [], "source": [ "BATCH_SIZE = 8\n", "LR = 1e-4\n", - "RANDOM_SEED = 21\n", + "RANDOM_SEED = 2024\n", "\n", - "NUM_EPOCHS = 5\n", - "VAL_EVERY = 5\n", + "NUM_EPOCHS = 24\n", + "VAL_EVERY = 3\n", "\n", - "SAVED_DIR = \"checkpoints\"\n", + "SAVED_DIR = \"/data/ephemeral/home/data/result\"\n", "\n", "if not os.path.exists(SAVED_DIR): \n", " os.makedirs(SAVED_DIR)" @@ -193,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 7, "id": "a0782493", "metadata": {}, "outputs": [], @@ -208,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 8, "id": "91a88b61", "metadata": {}, "outputs": [ @@ -218,7 +229,7 @@ "800" ] }, - "execution_count": 85, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -237,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 9, "id": "be21a515", "metadata": {}, "outputs": [], @@ -252,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 10, "id": "eb99fd10", "metadata": {}, "outputs": [ @@ -262,7 +273,7 @@ "800" ] }, - "execution_count": 87, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -281,7 +292,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 11, "id": "51eba0f1", "metadata": {}, "outputs": [], @@ -303,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 12, "id": "f589a513", "metadata": {}, "outputs": [], @@ -322,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 13, "id": "7b0d5bf7", "metadata": {}, "outputs": [], @@ -428,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 14, "id": "89defc8c", "metadata": {}, "outputs": [], @@ -456,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 15, "id": "e1f1eb8a", "metadata": {}, "outputs": [], @@ -466,7 +477,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 16, "id": "f17abc75", "metadata": {}, "outputs": [], @@ -477,17 +488,17 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 17, "id": "c193e92b", "metadata": {}, "outputs": [], "source": [ - "image, label = train_dataset[0]" + "image, label = train_dataset[146]" ] }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 18, "id": "5dd474b2", "metadata": {}, "outputs": [ @@ -505,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 19, "id": "bc100cf6", "metadata": {}, "outputs": [ @@ -515,7 +526,7 @@ "640" ] }, - "execution_count": 96, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -526,13 +537,13 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 20, "id": "f9845fe3", "metadata": {}, "outputs": [ { "data": { - "image/png": "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T1D80i/9Er7t274Nz3nOc0BE+A//4T9055kZP/qjP4pnP/vZuO6663D77bfjU5/6VHfN7//+7+N1r3sdbrjhBtx00034ru/6LnzhC194HGvheCLhLW95C/7kn/yT+JIv+RI861nPwp//838en/zkJ7trLl++jDvuuANf+qVfiqc+9al4zWteg/vuu6+75p577sGrX/1qXH/99XjWs56FH/qhH8KyLI9nVRxPELz97W/HS17yEtxwww244YYbcNttt+FnfuZn6nkfj45rjbe+9a0gInzf931fPebj0vF44s1vfjOIqPt70YteVM/7eHQ8meG/7R2PF/y3veO8wX/bO84b/Le947zDf9s7rjUuwm/7C0f4/rt/9+/wAz/wA3jTm96EX//1X8dLX/pSvPKVr8T9999/rYvmeALi4Ycfxktf+lK87W1v2zz/Yz/2Y/iJn/gJ/LN/9s/wwQ9+EE95ylPwyle+EpcvX67XvO51r8PHP/5x3HnnnXjPe96DX/qlX8J3f/d3P15VcDzBcNddd+GOO+7ABz7wAdx5552Y5xmveMUr8PDDD9drvv/7vx//6T/9J7zrXe/CXXfdhd/5nd/Bd3zHd9TzKSW8+tWvxuFwwK/+6q/iX/2rf4V3vOMd+NEf/dFrUSXHBcdzn/tcvPWtb8Xdd9+NX/u1X8O3fuu34tu//dvx8Y9/HICPR8e1xYc+9CH883/+z/GSl7ykO+7j0vF442u+5mvwuc99rv798i//cj3n49HxZIX/tnc8nvDf9o7zBv9t7zhv8N/2jvMM/23vOC8497/t+YLhG7/xG/mOO+6o31NK/JznPIff8pa3XMNSOZ4MAMDvfve76/ecM99yyy38D//hP6zHHnjgAT45OeF/+2//LTMzf+ITn2AA/KEPfahe8zM/8zNMRPw//+f/fNzK7nji4v7772cAfNdddzFzGYO73Y7f9a531Wv+63/9rwyA3//+9zMz80//9E9zCIHvvffees3b3/52vuGGG/j09PTxrYDjCYmnPe1p/C/+xb/w8ei4pnjooYf4K7/yK/nOO+/kb/mWb+E3vvGNzOzzpOPxx5ve9CZ+6UtfunnOx6PjyQz/be+4VvDf9o7zCP9t7ziP8N/2jvMA/23vOC+4CL/tL5TC93A44O6778btt99ej4UQcPvtt+P973//NSyZ48mIz3zmM7j33nu78XjjjTfi1ltvrePx/e9/P2666SZ8wzd8Q73m9ttvRwgBH/zgBx/3MjueePj85z8PAHj6058OALj77rsxz3M3Ll/0ohfh+c9/fjcuv+7rvg4333xzveaVr3wlHnzwwbpz0+H4gyClhHe+8514+OGHcdttt/l4dFxT3HHHHXj1q1/djT/A50nHtcGnPvUpPOc5z8GXf/mX43Wvex3uueceAD4eHU9e+G97x3mC/7Z3nAf4b3vHeYL/tnecJ/hve8d5wnn/bT99UVJ5nPC7v/u7SCl1DQIAN998M/7bf/tv16hUjicr7r33XgDYHI967t5778WznvWs7vw0TXj6059er3E4/qDIOeP7vu/78Kf/9J/G137t1wIoY26/3+Omm27qrh3H5da41XMOx2PFRz/6Udx22224fPkynvrUp+Ld7343XvziF+MjH/mIj0fHNcE73/lO/Pqv/zo+9KEPrc75POl4vHHrrbfiHe94B776q78an/vc5/B3/+7fxTd/8zfjYx/7mI9Hx5MW/tvecZ7gv+0d1xr+295xXuC/7R3nDf7b3nGecBF+218owtfhcDgcDXfccQc+9rGPdbECHI5rga/+6q/GRz7yEXz+85/Hv//3/x6vf/3rcdddd13rYjmepPjsZz+LN77xjbjzzjtx6dKla10chwOvetWr6ueXvOQluPXWW/GCF7wAP/VTP4XrrrvuGpbM4XA4HA7HeYD/tnecF/hve8d5gv+2d5w3XITf9hfKpfMznvEMxBhx3333dcfvu+8+3HLLLdeoVI4nK3TMnTUeb7nlFtx///3d+WVZ8Pu///s+Zh1/KLzhDW/Ae97zHvzCL/wCnvvc59bjt9xyCw6HAx544IHu+nFcbo1bPedwPFbs93t8xVd8BV72spfhLW95C1760pfiH//jf+zj0XFNcPfdd+P+++/Hn/gTfwLTNGGaJtx11134iZ/4CUzThJtvvtnHpeOa4qabbsJXfdVX4dOf/rTPk44nLfy3veM8wX/bO64l/Le94zzBf9s7zhP8t73jvOM8/ra/UITvfr/Hy172Mrz3ve+tx3LOeO9734vbbrvtGpbM8WTEC1/4Qtxyyy3deHzwwQfxwQ9+sI7H2267DQ888ADuvvvues373vc+5Jxx6623Pu5ldlx8MDPe8IY34N3vfjfe97734YUvfGF3/mUvexl2u103Lj/5yU/innvu6cblRz/60c5gceedd+KGG27Ai1/84senIo4nNHLOOD099fHouCZ4+ctfjo9+9KP4yEc+Uv++4Ru+Aa973evqZx+XjmuJL3zhC/jN3/xNPPvZz/Z50vGkhf+2d5wn+G97x7WA/7Z3XAT4b3vHtYT/tnecd5zL3/Z8wfDOd76TT05O+B3veAd/4hOf4O/+7u/mm266ie+9995rXTTHExAPPfQQf/jDH+YPf/jDDID/0T/6R/zhD3+Y/8f/+B/MzPzWt76Vb7rpJv6P//E/8m/8xm/wt3/7t/MLX/hCfvTRR2saf+7P/Tn++q//ev7gBz/Iv/zLv8xf+ZVfya997WuvVZUcFxzf8z3fwzfeeCP/4i/+In/uc5+rf4888ki95q//9b/Oz3/+8/l973sf/9qv/RrfdtttfNttt9Xzy7Lw137t1/IrXvEK/shHPsI/+7M/y8985jP5R37kR65FlRwXHD/8wz/Md911F3/mM5/h3/iN3+Af/uEfZiLin/u5n2NmH4+O84Fv+ZZv4Te+8Y31u49Lx+OJH/zBH+Rf/MVf5M985jP8K7/yK3z77bfzM57xDL7//vuZ2cej48kL/23veDzhv+0d5w3+295x3uC/7R0XAf7b3nEtcRF+2184wpeZ+Z/8k3/Cz3/+83m/3/M3fuM38gc+8IFrXSTHExS/8Au/wABWf69//euZmTnnzH/n7/wdvvnmm/nk5IRf/vKX8yc/+ckujd/7vd/j1772tfzUpz6Vb7jhBv6rf/Wv8kMPPXQNauN4ImBrPALgn/zJn6zXPProo/w3/sbf4Kc97Wl8/fXX81/4C3+BP/e5z3Xp/NZv/Ra/6lWv4uuuu46f8Yxn8A/+4A/yPM+Pc20cTwT8tb/21/gFL3gB7/d7fuYzn8kvf/nL6w9CZh+PjvOB8Uehj0vH44nv/M7v5Gc/+9m83+/5y77sy/g7v/M7+dOf/nQ97+PR8WSG/7Z3PF7w3/aO8wb/be84b/Df9o6LAP9t77iWuAi/7YmZ+YujFXY4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA7H44kLFcPX4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA1O+DocDofD4XA4HA6Hw+FwOBwOh8PhcDgcDscFhRO+DofD4XA4HA6Hw+FwOBwOh8PhcDgcDofDcUHhhK/D4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XBcUDjh63A4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HBcUTvg6HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA7HBYUTvg6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw3FB4YSvw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwXFA44etwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwXFE74OhwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOxwWFE74Oh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8NxQfH/ARyCz9j4rf6aAAAAAElFTkSuQmCC", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB3wAAAN9CAYAAAB4kQgFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9Pa8uy5IeBkZk1dr7dLeakkGgCUENyBYGkASRbGs8AnTp0RiDoDOWZExboiNBllwZ0o/QP5BDawwBAkhvAPkECX5hALLZ3ffs9VbGGJkR+URkVK21b/focp8bz8W5632r8iMyMivr3fnkE8kiIlQoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFHw7tN21AoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFH49FOFbKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKPyiK8C0UCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoUfFEX4FgqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFwg+KInwLhUKhUCgUCoVCoVAoFAqFQqFQKBQKhULhB0URvoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCofCDogjfQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQ+EFRhG+hUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCj8oCjCt1AoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFH5QFOFbKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKPyh+o4Tv//K//C/0n/6n/yn99NNP9Ed/9Ef0f/wf/8dv0pxCoVAoFAqFQqFQKBQK34H6d32hUCgUCoVCoVAo/ObxGyN8/9f/9X+lP/7jP6b//r//7+kf/+N/TP/5f/6f09/+23+b/uW//Je/KZMKhUKhUCgUCoVCoVAofBL17/pCoVAoFAqFQqFQ+PcDLCLym6j4j/7oj+hv/I2/Qf/z//w/ExFR753+8A//kP6b/+a/of/2v/1vH/P23umf/bN/Rr//+79PzPx/hbmFQqFQKBQKhUKh8ENBROhP/uRP6D/+j/9jaq1O8yn85eMv8u96TV//ti8UCoVCoVAoFAqFHN/z7/rz/yKbHL59+0b/6B/9I/oH/+Af2LXWGv2tv/W36H//3//3Lf3PP/9MP//8s33/p//0n9J/9p/9Z/+X2FooFAqFQqFQKBQKPzL+yT/5J/Sf/Cf/yW/ajMIvDN/773qi+rd9oVAoFAqFQqFQKPw6+My/638jhO+//tf/mq7roj/4gz9w1//gD/6A/s//8//c0v+P/+P/SP/D//A/bNf/7/+3/xedb1/Hl04jQDUTCTMxEVEmXhZI25g0hRyNWISojyuWn0caxrJ057Heb0zUhRiqILgmbdwRZl+Opm/sy4Q83GcdTMSYVYRIiPjqZv+ybxjRrm62yNFI1ECtqw2biIj41Yll1MtXJ3516l/P4ac+7YD29i9t1C9C/Jo2H0x8zXTH3mZpTMJM0mZbpo3WpFm2nNN3XTsCHUsk5/CHMI/7TMSX9iO44Vr2cRdiEbrelp/UBpljoTfe6mOh4Tf9T5YdowwxI+UAm6Zvri+jvuNXffi78Uqn+YWI+7BDDl7lM1mfcR9ppQ3/9YOpXbJ8Msvm7seP9rP6Y9St45vcc4Ptcn6gka6fTP0katPX/VhjUu3vp/p92qT901f5LP672hTrHG2a/cOzTTrm+sij/rLnKrRBx5+mJxr2C4O/oV9ZhPq8pmOKaLTL7Jt5sQ3WV/q3+faPuqBtpz6/+tzP8kJZK4P6QcBetjG87MLBCWVo2TBNqD0S+zrUbWNQkrRwQ59XaWL5cd7qBxHBPW3XuMm+bQrt+yPp30NGPjcvah5Zf2c5rL7Ra8L2imAm4tat/dzWfN47kwhTOzo1lt0RLKtsIpKrETeh41xz23F0EmHqnUddLMTTDhGmxjLK1iJZ6DxWfit71sssdLaLDhZ6v0ZHfj1f1IWpz/KIiI7W7fPJqzye9dmrgIW+tBedrdPvtm+W7lf9jToxndzpV9dJv7re6Fevk67e6Nt1UGOht+OiL+0iZqGjCf10vNOXdtHZLjqp09fjRT9fJ32Tkxp3aiR0cqeXtFE2dTrbRV/bNfxAnb71NzrbRb/Tvq22TPtH/osO7vTGu48uYnrvB73mAO/EdEmjY9Y92tvpDR7wN+7UuNNXfrdrjYXeZZTzld/pjS96l4Pe+KI3fo081OlnOWc9jb7yy+pUnHTZ/d/ln+krv9OLZp9BfT/LG13SqFOjSxpdxJbugvH2++1neuOXlUtE9IWH7w7q9Cs56ZJGX6B9P/HLfN+JqcuyVe2PaOAvbdPvznb/m/6FujRLZ3lI6KdZbyMZ41Ma/UoOu/5nclIjsb47SOh3+KIXMb3PdisOEmok9GWm/dXs00ZCvzuf1xc8/xcxHTSe3Z+Y6GCmS4Teieia6Q4meqNxb5Qp00dM30ToXYj+o9aImeklnf5MhP6sN/rd1m36fBeiFzF9nWPzZxn1Rhtgara6f2KmN9LnmOmNDvomL3p3E9maqtW7b8T0TkKNiL7yQT/LRX8mQj8xUyOiA/ym6rhv0ukSoYuIfo8bXST0LkJvzHRyo5fszw/NspiZRIQuEvuZcBDTNe38ygddJJZG82j+l3TLq/jCzeyKbT15vZzwPvpK8ZJOfd5D+4iI3md78dqXmfeabVcbs7apH7FNMRDSFfoq9+Ko77C+EDpojDttk/a5jlEiot8HP7yTWP99mfnUZiwPfaW2xfb9yb/r9F/+jX9Fv//7v39jbaHw6+N7/11PdP9v+0KhUCgUCoVCoVAo3OMz/67/jRC+34t/8A/+Af3xH/+xff+3//bf0h/+4R/Sl1ej80VESnYaITm+G9HIvIhLEaLXRXS0kU7XVr4REa10mP8WvY/6zraITlbyL2FGmNeq4xmk1xKXBmkSvQyEnax0StYRsEht5SMioov9tY1UhvbTYStkfPEgUq6Z5myTYAZ/vPP8zkS6QLXWrole0K52OOLHEcN0LLtIyTJt9yR+lYif1/mbMkgyiO6ZbhBDayy0V599zkS9D8LzrZEcbOTh8jWQ7AL9wew/z3qXz5kiSW9lEJH8PMt8DSJbGhtBPvLTjjn++tt+k2c7++HrUr+ZbS0Zf6RE4tpAwK9OcjaSRtS+jYr7F/UhLfK6i/kNCXwGXwgz9Tem9i5GdiOhTTRIYxZZBL0S1fis0iS3J3nOfXy+vrD1zebr8Kyq/6+3kYevladdWpcmHiS6trOfWi/4rSlJrGw5OXIdie1ByNNGEF9f2Ehi5ViwDhsXTL7tDTZJEJCoQBAjSdy+zTHyFp4rWkQ8cSCxlTjGsrT4uJrNnsgVaOeq0Kc1ArittuPmCfUb+n0Q+oNAdm3vPNshq+7ZP+2dx/VjXtv8s3zMF6+NFoGIRnK+qZ3NePZVDpQ/6hDiPvru1WT5QR9l8/EkpKHsVV4oG0l8JXyPtYNBJlneJsGMpDC2qUE57eiTdCZqrRshzTxIui5jo9N1NSOq+9XouvzcwLMtx9Gt/NbGZ+ZBeh2t09UHdfh2XM5GIqKjCR2t09nGBqUuTAcLna1PYnsQj8xCX46LTr42slG/d2L6dh3DZhrk90gnVsZPx8vyKtGuZHgnpkaefEcCvU2S+WwXvfokbY+XEbJqx9f2GoQ8dUfm6/d3OeigQTr/qr/Rqzf6ub+t/mElM0cd5yR03/iir+1FB3e6pNFP7d2I63c5BiHdrklKX1bOT/xu9UbfvcNgx3TWP9Pmg7qR7r+atup1IqKf2voB8MYvR4C+y2npLmrW9iMh7N8mEf0up5Xzzcj7Rm3a8Xv8zcpXohzrxbHRQj1faPjmIKFrEuC/AoL8X81yuzT6RsOv3yY5f1Eb1+Wgn9o7HdTpfU5qo8xR7htfRl7/xNe8Nkl0nQ9J6M9FfywxfZNGBwu9BaKUaPy8ajPjz9SpE9NP83uf/73ZT76R/5I26iWiiwY5eBBbmjdiIw2/iUwSVaFk5XyG5lXdzPA2bfomw65j1j/q7fS7kFdJ2N9jJTrXhKfkZ4Pfge/z8XvjRu+T3PW/htoj4XsACd5mmwfZrZsM2OpDovw9EtGTkO80yevk3wRKDKut2BZNj23rIvTGjRo1eqfLlam2RnsuEvqJD3rjg97lsra8caM30mejb0S01td4bU6oULmFf19w92/7QqFQKBQKhUKhUCjc4zP/rv+NEL5/9a/+VTqOg/7Fv/gX7vq/+Bf/gv7aX/trW/qvX7/S169f94LeX2Ph/2iLmGMmbg2IURnflSDqQvz+IulDwWFk8etapCgu6ijRqbGx4R5ffSpij0H+AuHLSLASrfpV0dqB6NQ6kKybBCe3tkiwCySHV1gO1LqVKJ1t3eqH66xtd4QrE/du5XNjkjdgPyIZLmLEMV/iCGol2OWcvu59+eYapKAR49pGtUOJ5lefpOEk85EsvoToWIS7MC9ymoj422vZq216ncQzT2wTHdD3oIhkJQgPXpsGlKDUckwpy4vU1+/qp6ORHI3a++VJZFRwQ1v5dZiv1xiYC4pH8wRb6EcHJGi129oqb9jF1H6+BhH4OhwBy+jr+R0JSW27NHbK4/YuS6mtpqh6Gx+xgzeievTn+M6vsUB+fVUGb22oUEI5rnNq+ce5yvPjMrjoICOmlfB18qxJcCGJqoSvKoLHtcHDYbrhb6LrC5nqvJ9BtS9IRK8bg+wG+2SRrUqEK6GsOOaGiOuLr1/r0fRI+JpamYHYnv61/pOVPlMFmzpdiOJmGyXUhw9XeZtCGQjfsbGB5nw4r7Xhw6F4ZiNaJ/dG7X2k78cikLWs5VuahC8Rv6Y9+uxg+xIl77oHY4RDXQki4W4EszLIqBCGtESzn+A7EQ3F8yS+mZQcxwTajzI2vAjR64T7x3Q+E1EbZLF0aICqn3XzT59z37X8h/VdZ1/tb0s5HBXp7W2S0lMNbmrn1uk4ZKqpiY5DTAWt5PExVc/ncdFrqpqZZZC7MkhkETbFM77GkYD++vZa12cdb60byc1wL0IV0yd3+gaEr+J9Xvu9t29DiTxVy7G8V29GBH+7DvrWT7Nb1deNxdKZYrr1RU4L0+8c73S2QYC/pNHP10m/d36jt3YZSYyk8899/eRTAhbJ3d85lMA8jCw/W7cytF4lbVF9rcrwdznoa3t3ZCpCiVb9S7RUsaq8HkrlN0eQo92qsj5Y6BI2VbQSsFegB0c5iwD+qb1To05f+DIyWcnng4R+NdXWav8FZPK7HHRRo0t41idmP9EgrL9M+67Z9t9rP9MbX/RFJnku6ht2eb9Ro0MGMaz39DOOofdJ5EY0FnqbZLCmG2NAX5yDfFYi+piK4TcS+lkmOT+v4f3lRzJd+UVDlarkbJvXBuGrROiAKqzfp/2XIzlpu4a/bt+n+vWNPA5mqG/8ZvK2LrIXr100FMmDpGZqpJtFPGGq+Z7IXkSj4esuSyWsf7Ced77s80G8pelzW4Mqd9XWNv/3xkRNhDoJvdFh6Q466JKXK0dtONwPmkLhLx/f++96ood/2xcKhUKhUCgUCoVC4S+E3wjh++XLF/qv/qv/iv7hP/yH9Hf+zt8hIqLeO/3Df/gP6b/+r//rT5fDrxcRN+Jv74NM/BKXhDThXFnufZGd7zRWhE+NazoJV5FBAncher0G0YvEMJKofS6rIRkMpK8jXy2PMlHNE3SooA3EHWOaHurofeUBVSwR+bqVyL76ShcUv0SLUDQbsX5olxzNwjwz+lXLejutbEb/a96rr3tEVp6Gt2a0GYl08IWSlTz7iLEtzMQ/f1vEuJLARyNqbW0SgDq0vFTVq3XPdKbkbtDX2Cf6HUNt96SP44YC6LOG4wgIdrs2fUhvpxHCKzN8xnC+QMIT0SKnIQ9GkmVQsY/xB2l1YwXY5FXjRHEsa51u80LcTBHrO0c48vNP1b+ylNxzHXMjxYE43kK7o029b20SJLYbjFdCIpRszDs1/8wbCeNRzno2+1szkpxfQk0J7kn+m6lg+iDXB1ne3xr1k6m9d7OBO41Q7FMZbmVGG/VjD/eAwOwnqLdDW4ZfwYWTINcQ39zJ8l6oMkbfkZK74tocOVatr59khLySxBoKPKqudRz0t3H/eF8Etyms26pPifH2PstsUA+JqbX5mr45eIaIX21HFXM/px9eQATzsl9DuvNFiwwHUiK2vwc1uPmIaSfeIZ9uFMBNBUNhLSu0e6fNfr7UTzwI9Onr2CdyyLKjHW78OPIbeWj1xyFGAvdzkMKvJjZ3XK+p1D4nYU2B0IayeZLRRp7jIII8ckzyOVNnK+GOpPfZTcEcfdsOof5iI+s5lHkcfYQF100CED6ciKj3ZjaKjudZN8/NAFo3k1dkY1167Whr0lYSexDH4977VGqrsroL0+98eSdmGerref2YqmqRpY7+6XxZnulyc90J9f50vpMI07d+WIjvn68xeDWdqqwtzHhbYaOVpPzSXpM4Y3r1Y4SSPr9ZOGpVYL/NswUu4S20t6YbdYzQ520SyqMtbYYRf9HP/aRXP0y1/XM/6a1dlv7Pry/059cbfQW7FF+PlxH7qqrWvKq+btxNOU1EppT+k+t3iGgpmsfn0aZjhgsfbdEQ3+vFqqpzLQvTEg2l9hoPqjge9XwBwldDnf8efzOl9K/kjY5pM6ql+yTAMRR6VG2Pa2Lpow3/367t3JXd2DZHSPMas6MssVDfii8s1OABO0joG4k9/hj2eBHLnX4mokteEBx9/Rx4I6FLVLG87mtYbg3//cZEX5iogVoXlb5K/r5raHcReuf12cBEF11G4g56dxHunTr9u/6yMr/ySZ06dSPXhxr5K590cKM/69+oU6eDmH4lF/27jq0sFP5y8Zf17/pCoVAoFAqFQqFQKPzF8RsL6fzHf/zH9Pf+3t+jv/7X/zr9zb/5N+l/+p/+J/rTP/1T+vt//+9/vpDX5RZ0N9UrIip3icb317U+K3k6P0uf6tLjWOmIVroIVflqfa3NWHt9kVpYd/ys6RIi1tWLxJiqZrF8/fzq/hqqkLWeWIdTEfPKh+mZieVYhOMFPtS2Iykd2slapoKZuA+SnYlyMnoqnq38eY+jb7E976/Vj5pntolPZDDIyFh+cU6aoz1AmvM7pMM0SNZGchfa7Qht9FdGlEK5etYyiYz2xXw3pLX57bUr1p09WCfRUBtnxGnIz+4saSSxlOyT5UNtz9E2v5KqjHsnOY4RNTzzbwbcIPDqW0h3JMc5jEM52KnzhXms8KJqm8hU30SRTGUrZxHCU40N/pK3tlTS84xpDDFtfjdyj9052u1bJzmZ+L27PLhpwvUNnKlt/aDf4/BQ1bAOJRwOeg1V242ImidtVaF9HODLtvIawYjskdqBRLltCIF6J8HfT/bpmBZJLUNlLY2pvcSfe03kQqKfvyIjY01lrMW0ZesifAkIX9qgauPMb+YHXj7cCG7wvRHMqmSHdKjuNqV0yOvElUJEbfrl4fFpr5W+vcgR5COBtmOVI2fwWxg7W/thY4sS9qpSljbqFR7nnZtP5kcnw0W1ftfnBSpDG4PiG+3t53reFB3fEdiQJtSHnNG+u/HMRO+ooFabwQl4drf7qx8bUdf8TL4s7Lsmg3A2kngnxVmDXmgTph1/dn4lRgJzhvR2dtAgr0e+WR5MLRrGe/yk6EYqtzbI8utqRj5rt7RJ/jItxSrWe4Da/ZrnZ399exlRrPZ+neHBVQWtpLcLaU6ebFZ0Yjp4hBF/9WZK3C5MV28uvwjTqzcLMe5tGCTwT8e7qahVAf61vejr8aJTzzQGwpeIthDe8f7X+SCqKhtJ1ZVPJqkciOgZ9tvSkdBbezkyFknVrxCOe4QbF0dEo7obw3hnIblHyG1xtirRfpDAWdx7XiWs15nbg9DGsN4Hd3qjyymyiVYYcaxL1dN6fnQ8H3qEG/fnRkdiG0OgHyQWmtvyCNEbdavj4KF6bmSv3d1HOu/Atavr+dKXhaReti41M4nMcNX7Gclv1AexLEQ/K+lM45zqX+1TQ6Hwl4q/lH/XFwqFQqFQKBQKhULhL4zfGOH7d//u36V/9a/+Ff13/91/R//8n/9z+i/+i/+C/rf/7X+jP/iDP/h8Ia8pRWKepOxcoFJCk8jISBEN7RyIzteLRJWzugj9uohElXMH8XWRKJkMZKCRhlCHD8vc3X3iZoSYIDmN54bNNIJEJ0KAKCMaq0SNSc5z1CNCdJ7WtltijJv/bnH1rpDmIuoXUTuGXdPH/PXr+IzpRYjaMcp6f9/rkX2Bzwjk81xtJiKMRy5KKqv/jEzfCW0lwK0/uxC9fyM5jmGbqhzUR128vxXQZ9QmCXgcRNdF8noRz/zYj0Z2HnuIb2ura7pQjLv+4bVjhv2EtvPPkPgAxTrRsOM8hy+UUFWCNZLaHfIQ7WNHydg4JrU+LJvIKXc5I+W1nunXseI5n1FV1fZOfBxOee1U6KLnODfiuSnDne97DbJfzmPcnwp+RrX1tF2O5n3fGmE48Y24V/I0kuuNx7yhpOoJc45eS/oRfWOEssyQ6RBuXPNSG4S28ykp2cokXw8juVcbV0h0+bJU+BZiXcO3907ydpAwjxDkHENQi/cH+hFChxORheZW1TRf6zxoT/jOOi4hVUUTkPUYkpumSj2GG9f289Xp+ukc5OGlSu2hptbzpd3GEQECEM6r3pTyTFNNLaRhpXkq0X3IZbLzrDGfneNMtJTE+DzNdhvRnMEU0ZOEmbxRe9EMZc3unOqhWCdTF19fFnGO5wgradx0/w4TtdfyjbVNCdq2yrm+kifwl3nz2AVaYb2nf7LzugdJv8h1VTjrteEvMtKTr+nrY5HTjjSHvzuRPtqqYdyNENb+AVW5I7xD2/X8aBwAuBHAyHjB7/CMyCpHv1vYb51CmRypv/p22tZk5ll1AF83YvHO/tGhc01ldSSjYxjubmrs2dYmPrS3krZQhl7b1N6RxNY8GuKcZamsgSznSaDzIUMJLURtkvT94qGmbuL49cYzj06dMIGNIz3EbBBh6rNN3ITkmmpoGd8ZNhYqYU3CdL5d1JrQl/PlCOJjXvtyjDDcGq7b3KChjXuj997o63HZWdd6X8nkP38hMTxJZVrq8S+B+B4hwF9bSPKfjncLga3K6ZM76bnUkdTFc4+PZCOBhgwn8uHBlRBWwhrtGKG0R1hsPcPZyPagOiYiU0grOWvl8MvCf6vNGuZbz5J+l/UQ/kfHn9IlbZwlDe2KYbsxPDiGDD94EOC/1362fD/xu4UEV0W02qPhyJGA1jb/xBe9zzb7c64Pa5ue9XywEswznYACmYfC2MKhExFpiOtJZDcS+jLJ6Z9DaPVC4S8bfyn/ri8UCoVCoVAoFAqFwl8YLBvT9e8//u2//bf0H/6H/yH9rb/2/6SzfdnI3Uy5aoTvujD+IJFL5MmseO6tEpaTBHRp9Z6SMS70M9h1HIOAUsKtXystqiOjXcyLPFXSF21CaLoYTjq24+3L+KwhcLsMHzaoK/oCbb26T4+2Zmpr6Z5YR1u1vKwuotyuo/m+kA6kP/gq69PMR2hb7G9Nq9ez8o9jHxd2RnSwC9F4I5i39kf7kbxWRHI5I/vvyke7Xy+vWIa8tmEBCWMi8wmfh1OdS+9G1htxrvm1zYdfDB9NwTHCu0IeEYl/fP6vy5473dzh7DqOtRFE67qCX1XlH1XYeB9tRbRRtyOhMST1zG/KXCJPaBN5srsLyTk2FFg5zEZ2b/kyaDl6HwntLHT9OdXdECrb2so8lPQiw4c6brAN85pMH1uYcOZFeM/veGa2I7u1T2NsTbSFaJ2zfV1Eev5582mIyM79xvDrjgxv7FWok6zG746QgvYqwb9U+OSUppv92N1Kbov4c8YJiFGiRQxPIteuMZndMdy12RevCbmzsB0Pp8Sx+sJFGVDSc57FPknCtM5JREeVspajKvbrbVzHc6ONiJXVbp5ngw8lMJTTBnnL1hZ/zrWqhzW92mPnWQOhuvwM5C4votX5E/1PjvtdbTbCF8aR+ZXIs5WLnzTiWsldKDeqlof63Nf/Ufhv7O9Nkc3+symjlfM84BqQ9BLPpJ6+xfa49mr/+MfKpyNvp4X47uxV1tawmUdVyJ3t/O+0zB4rYCP75ZBF7GvbtJ2NRqQZPJd73uepwKa+Qnozg9OTcOH20cjp4RSeZLlTU9MitlFtrXlRWY3lYghv/avXLhnHY2h4b0WDcokGsc2grFYcLKaq5vk5nkH86s2+n0DAdhqhxJXsPrnTSxp1YVNRo2L7d4536sT03g/62l4ztPYqT9XRb+0aZG5CevbkwVDCW0OBK/7K+eemptaQ4m2qljHUNZ5TvepphOdWEw1V8kbM8zfnS02n+ZQYxvDkGu5bz69GklrDe//Zn1z0//gv/z/0b/7Nv6G/8lf+ytbmQuE3Df23faFQKBQKhUKhUCgU7vGZf9f/xhS+/3+FiCk2o1pS748/n+S6I7E6iSsxuVK3Mo3M1eupeQ9kLRJVRER05MQtlh+JOyVHKSGf8bvaLZ30EDO5hl6ADiifm89DNMNZ9kGgdb2gq+B524xcB9KGNcssb/gF2tuhry6Zi5WgeG0z/fSp1hFDW8oMD8yEFdJel/Bo77Rl9OUMCX0RjKt9DPF1hTS64txBCTzLQoJV2Nt90b2SVu8RjX5Gla7ajYjXInmdQF6vZWMoayw+L387NCF5X8+CGEm3yGzBeo3w7Yso1H7cNjpM1X22EcGR8NdQbF/dt/t12eYKs+G6iN4mIYSkcwxR3mWppGmfU3DTiCO0Ne3c5IEr7xbSVcvHMR3Dnb/YbYjgPjdp9E6sZ2VHwpeZ7BjHuKlhts2rmXkQtiuyp9khX95G+tfl2mCqaCR853WngjZ1+iR8rz5IO+b0zPClcu6DbFYiuosn47E+NUnJ6WkrEy3CWm1mJlZieYaEF2biGbrbSMK7PQadFgmt9k6VLxHNM6fZkdfbGdhEKWHtykKiGwHktjR/jrMjoifpvPy17EeCltGuUNcKbT3scIQgr2uOM4l2zPxRRLrCQTcj6443sGuqn7ENShxzl6H4fQEBdYwQ0JHwHfbyRviifRYeXMn+SWoqucvXstmUtEYook9m0fFxjH2oftz3uqR+GqQjpAdS0b7PdKgg13sbCc9kfY6kuJ2BPduShSInHu0b5Ociak0Z3siPu1kObkyI7Vz5aJ3R3cgR367dRCuUvtCcZ6BMJCaBVG/vbKpw829Qdg+fz7neCN9xprRFHmhgChP1N1n+l2XnKFsG2Wx9QeQIX1DZu2cG28urPzsLXYcOjHFKBbEM0jn+VNR70eFKCCehwJFgdq9bFle8TPtb61Y2t0E8NyCB736CG+l8LGJZQ4KrYnoEJllhvY82SFhVIX89X9SF6f066Os5zlNGAvq9H9RlKJmVTEbgdyVeVUF9tG6KacV/cP6uEb56/Wt7UYSeG33ytZ1ljPXpuc9Yh6mWaZ1DjWc7/2qGdDh4nX/9DuGuiRYJ3bjT77ZBIP/5a7ezUCgUCoVCoVAoFAqFwi8PPzbhe7ShdHTSCdrJDGZiDbNLeHmGcbRQtnMRTFWMuECiK1+gqlxqx0U6GdFzNBIlMc9zq2ORqZwv/FvYViAC4plnx1q1NJJO83BbZTXyakq19/Ua6TSkbpfhp8aeLAMVayQ8HcGt4Z4zlWO4Hsl29HVyLJxH72tt9NrLot79NVWItkaCZN4kce07pnWhrXkt7k7iWFRJqqTTtAkJEyFayl7EHA+iIbi1XplbCBhXd1VFDSuvPAiPrS1YvynNoX4tJ9i9QQkAaf5+9JGZM+vWvgiKW2b2bZ39E8NUuzDdeOa0taXb+FwEOW/EtLzTuI+K/9A+u65pVH2K43mSgRxUv0KjnZyoYSUQ7+LOnm5LlY7Pl5LTOsdM5fEsYFw/z5UHQ2DfbQaJsD4KylsN1R5twHJ/9bOVYeQ2bAbZtg3g867j+uoWAl/e35eyGjdMRCU3nk19HG786KYeR6Rn55IzL8JX5/do6zXrUWK5Nac8HkbnmyMMSG7H9xEzydtpc4ded6pgJcNfl4Uo13L56kvljcCNI/bcBx90WddUWX02slDfNMmtMzzrybRgocHDnDU2RByrrJm2fzlNsax5pbVxDd8FjtBtg2x6ddIw4Ir26pOAbYtY7Z6sHH5dfdVRJW2KaCT/ac2n87OcK9w4ixC/ZFyLJLbaIGTk+7o5Qpc79WxXEnOR9P1gs+v4NjZCXD/N/kE7MSDAMW3ri5x2BLB2/ZuGUCcLod3eZZHmquqeZfaEfFa7U/WyjM/XDMPdrtlugT6dBLoRoTTSs24UA+K7T8JeyXWSobyWk6Y/Fqk8+pa8qlfIbWowMhqI77c/G/3y+knHqedBTVGsBLq+irU5zNTfyNTWak/XDRRMnqC2Tpt/sB/1ET+WL/Uvd5rh2clIaZnqbSWNIwne30aDsL3ceamQVfktvFTP4H85gj87fLb2w++zRkRN6IJNBv2cZfbZLobw37TKMDU0ushsYvpTVW+jI2d9fMj6yWMhuYksFLgqsCchTkTEZx9Edtd+glDfkK+dnVRFrQS3hv5mJjrPy02vIkzHMdTRvbMpqvXc6hgKW6+rOvrt6EZiR6Wvkspd2FTXs1upT2L8bOMc6vfehqL3uOh3znf6AuG0VRH9/qffiOj/TYVCoVAoFAqFQqFQKBR+2fixCV8ivwiOKr1MFRVJLk1jZ7SuBXpHNDnMhW0RT1g0JupThZaFLNaFeVNn0p7GES5a7kGoIDayKBAbrERSBOaLwGvcvKo3Qkmc7r/jNa+8nX+7uHZv5GyiSs3OsfW2NJd21JMQk4hIJGo6IGW2tFhetGeSgZ+uF4uLCtLsc0bEQr1GoKod0Q9GxvSNRHN2Z4pJTRNDG6MPgUx1rY4+uK6l9FXFqBJN2s+oas/8iWTrVFFrn0hrSzEe8975MIOWh/VOkmy7pln0Q+/+vpLcZv9cyLYFXSBNVUWuZLb6BzdAsBCqxHmSv+78aFAWZxsrsrPDB8F6kci5SGdEmDOcOvtunlAcB2xekNnOmef1IpoqX1/fwzOPCmaYD62OG5upMfH0pfpmO7MdVPIW3vtuvkjaOcroi3DG52aGAmdU41s7YP5W8vbqS9GtabqSJgmZnV3DspEQVxuVAJ9jnpmJ3nl7fqK61s69tnfeslHnNHyeG56njuMw2C04PykZfIknhqcKmTFNNicTObL6wDJ4nSNtzVQVdQwVjvWKnhO+3uES62ZaZ1cDkeqSoJJ2nr3dEvK6vcacpudEk5Lc6i89u1qV2lg2wEhdIlCsBgJWZt7GpnKOKm61VVXqkSQ9GuQDwteRh0j4KZke1dvnIE7NLjtLWxMQnE29zlyWWPZsJxLMat/xbRC+5694I2dNtU74Pf5d/sOzpruGtsafVErUjml2kceWgFyf2bichK+FQQcb7LcW2oRQ22xMrTKc8lsVuUrmT0I5Dfsd6rE8x7jpwn9P5TGesx2J4+EHse+b4jtrFxHp+dFyQDfha1nWd2crDVuVSLc+gGfAfHCu98p2DjULfTvgmqxy0JbVVginzeOMaZeXdRoTI5XNEfBZldD6+6HLGrhtlqtE8zEJ5PO47PV2zJDarz9doaILhUKhUCgUCoVCoVAo/HLxYxO+SNaJrEVy5v0MWSTtgNhivGYquBkO1BS0vAiYAwmDVRcfbdyLCroQbtmIGbTNiIdmaQTvKX+gZEYWuhdtXfIDuA8EAjei1se1jfxIytY6G5MZcxxAlEwiSle6upiNRkBZeGTyZMosW0M1K55CcsewuZBpL1+J/kkm8nFMkjCoYyMpuirzJIdTwXVQYsrerjtkJOtdfZjGCA0gfTuEWcSyrsvGKcd7QAI7H6pdIcRw9DMDcZsS81r2deVlYBhqtAnScSSbAVu90/dpiPaEoOTz9DbdtHcQq7PsqaZlJPimje48Y31+cVwQkZHToIIXEaL3FUPZrA9jSa/bRoFIgM/y7RqqzrX+2WZHvM/yTS0exzCSXnM+XCR2CO+8beR4eeIbCe2n8Y9FzDDOdyR2miduOCEaKmuiRUIT+YgIZsucd5E0xpDhCpwvT3iFaj5U9WsocDyj+wGmGofQ2hLHJkai0PkC+sqe+6PNedpvSHDvNVQII0ksQnRdfrxD2dTYnqORJfhShOjn95UXCVoNHx7neBFHIo9nxhOVRjrrPS1nEtREtNKpKRAunrV9andr4z3oNhQgizShocVjWySolmdIcHpdREdbZ0Vr0Uq8BiJ2+GWW8aeyVNGvcTyDzicsskjqaCOW14j4WqHJLbS45gX7+f0aZC74cvmXid/Hs97fDuKrL8K3AYGuz8QkWjW8eEYSIymu9pii+1xkOk/SX8I4cP0aIOfK216d6BJ6/d5p13j6VcdTP9gRoRZO+kQik+3++EBml/Zjn6pwVANzH9f7MYjmQQx7m80W9n1pxDyLqWadIropSbsI8eObWDhtp9Z25O9U4V7kznoWJpLTc41EqjKGMYv33jioef14tvKV8FUiV9Ppz8VTfbHa5XwEpO0YU6scfpGRtZb+WuVloc8xNLnC/HnONuIrhsnIcON5Q97RQZAPHTnbrYpnu4/VaH4i0jOpqRHRS59nuK/HQbCMn+tNVjjvtv7ygZ3FdP3Zr6hQKBQKhUKhUCgUCoXCLx8/NuHbYMH6jnwwIhM/KzkTlFya90zccp62QM4YLpaI+OuX9RkWWcyiTGmoC7huIRzsx8XMoDQeJMokEbitfNpeJShEhkKYBjkgcxF/KJmnIphpraiZDUHZjCSykc48lVCN9GxUq1+z97bO6OW2/KFKZhcCkwdhDAvH7nzcB+KXiIj0LNOQz9JFki8r7zwHUarjAsMRKyKRRwTEdSSQAiGTEVW4ySCWgwRcrEs3Kxzs86HtRKtvAyHqLAUCSUTJLVCbzjSsoWahrEjMjzOdl80pOQcbIUTE2XJL5pPvbyVgjVzLFJtElG1ekLgZBG1FQuHb+7JXFeoZEY31dZnKLyBlk80LPRLgqOLH63A+sPmsv1ZblXTGSAKJmlQyP838rk0h7LHbhHF3BmAguzGf4LyQ+e6B2O/foA0PhK8bF/qhtfWsKjmtz5OS+EhqExG94D2iz1S0T+/r2bHvgdjG+ohgfCbKdXwHoP0wjk2VTAnxi4Qt5tOyXm2d/YznsSsBqt8tA4xBPBc7Dek/SchMpR3nWCSkI7jZuctyE6Jc35GMYb2vaxuj1vegHGWdB93mp0SV/RlbifY5Jm4+seeyD5L4HCTpINBn6HBUTWNZFvpdx6qsc6/hPcJKgIbfPEqGC6iore1KoiphHZTrVpL6gnmFAp9ndDse7lQfZr+1ZI0x3MBkxGnzhHcj0hDM2H6+ArmNeR0xDZYdM++rW77jz9+9X4koCzOOBPnqoDUu5A3aHJ+1NvvkYKcw17OyVb29zp8Wq2eR5lBgI+pHAzXqDEcewoQTEfW3kej41i20uCOniSZpyXbN/A+hy42ElZHezrWe+VejZr3Jz+TtrGUmR2ajildV0Zh+qZGHPf2kRRwDIawEM8N53Ha+dd/tkJMWkZvsubn07HBiTxIzuY0KVj8SzEJOcb7q5bn5gYygdpBVDp69jX7DduiZ1kqgL+JbnNrdfHXAtU50/Ol3RDwpFAqFQqFQKBQKhUKh8MPixyZ8dUExLuDgNVWtoLIiLCwS0VoYJ9oXnWHhdS2GHv5MVKL7xeJExcaYNt6fZ1dmyjY8F3MjTWkuxDcaSl3yC+jMvIgh105Q6xIQA0gSkBLIupCLK17sfWrlqx1JfZGg1/raLLt1vwCWEAFusdkIr76IYwSEpBZUkuE5rS49XAMSddXtNwowLjwjWYx5UWk3MvmNBlBePAfX5UH7MyDRDAv7jpSy4vz5kE5d/oBNcXissj9SYGZnLjvbI8kdFtjd2dtRRb9VGAgtBIRQd3ZhuqjIfKoLi46Ebgvt1s0asz7pM6wjkiYY4j2S2D3YpWljOsyv7brLq5+JSMNI3pLnqV9BAbypYhsJJf2VPdcxP8+8N3ZYuQC36UCV5gLnXquqG852d/OtksIZuQybHqxcOwc9jGVQcJs9Sprq91Hwqhc3gRB5xTaGs9d82SaWNuZslnk+s81fGNUCCZ3mFeuzPjDazXmi9gHZbWGpkcCMZGbS9yJTSY/PBJLe+s7BENEd+xHfU2rXeI/o2cjuvOvkHGoLeY6EdiTYKZn3gh/dxpfrIr5OIyfdOfVxAwPMca4MDDEOG3u2s8utTZoHfifg7xf1A95DIFGrNtomCWivKqJx7EVyF8c0Xkv8tf0eICJ+XYNYRjU4nps+yWu7puVMcl0Ja/dbCyFC9LqI3+Zmvvep+ofw2TnhS/tvztYGYXrwCg/eyPuBlHyT/JkNdrazGSFLSprauc60iNqjjbDRr76IZ/T9RP8y7G9XNyXunXpX1chBkOo3Hk0y3hOTM5S2hT5fJK4/G5nXWdLud9y4ZwrsQPgOm2kqyMlCfBORnaNsinqYG/vJjjQebV7VXm9gnzYlkLGO8NX2MI0zspmI8Dpp/5BTSW9gMrKWL4K+BlJZCEJ8ow+0rvAbbirBlWhW+/uf39hQKBQKhUKhUCgUCoVC4ReFH5rwlfMkaYs85Pe5oAoLloILmHPhkV9DgSVHW+fw2iL7UoakC6IzLx1tLaK6Bat9oc0t6iGJaATT/HtO4pV5KJiUWJ6L7UY2EK2zDLUsxSSLh/r22Ozgr19I3t9n+afZIzRVXMcBpHLzC9s8w3iqXa/XIBNQgRwXwVEhp37WcNBGNM0Vqnne5bD5GCJTJDSwDgn1WsjqWe8BtrgQslNJrARzPPu4zRCPQDhoP7hF/7f90VmhIZstyDPxqkPDLGOemU7gu0tzHD6UbkwHoYVdCGvzVSAKotFmKxDDeA8bl5V/XYOwTA7duw0JrQvjkdyOZO9GRqx6edokcxPCUGJPMiOGXp4QHQY2NuEz4tiVXNYWJZqJdqIJCWSsHzabuOdpphdsZxKC2mzOyFcNnd6FiC7iSOJB2lXPSCddRvpIPEOUAP0usS9iXUQ+bHH0jdrhjuIVYg1tGXyC4Bbt1+u86um+D4TEhVaW6CuZ4d2n3Vq2zHIl6WOG51RtFJrkUnZGLxCL5lciG1/ybT9TUSbpiTa4PtI2oY9xvCoa+DWqEbdaaSPoXd3BrjjeZaq3hYj4PDfSVD9vbc3u3UVL0Hth0wyGjY/lWtlImMa6lOwPc4+EvxamHuuHZ5yn2lmCKjvaY6Gxgx3MPAhh3DgU/aD1YRQP3fQV+57ZH2uBY0XT4jEPWpeOq7j5De8hshDl/SKNLPKhrTMNY5tl+FCua/zeOM817rPoK4iwMWFDNq6+vY/rP39bYwTfqZZ1+jVTtQf7iWhtNsB68bfm/G3DV59nRIN/VImteSScqT03qvDrItFw40bi9/H7JJLwSEoH+4VH6G7ufRHbeK71mWx207wa0pzIhS8nGuQtnc1CgFto8fndnamN0TXmmdmoDsZw7qt82vtUld8H1AdqZSO5MdQ6EN/9YKcsl4NmCGwxElw/29nIVic5kl6Q7LUfeYOAXucsj1Dj7VqkuxzjTO1FXq/2vn5qZCroqebmi4y0V3K6n7SUx0R0fQvPXaFQKBQKhUKhUCgUCoVfJH5owndbaEP1Ey5UErlFM8RINxd7KCw2M4+VE5FFvCIBaYvTgbidpW3AUIdKHDdYmGWmFd4w2IKL1druSCr37u8TpYufphqCchlV0JrfSOcZQlrJaDwDN1NeEhBkuMCsi36aTkkabj6KtLVTbe5+oU9DUit0QVPzWv+obUf4rsWGBeHG4xra0tZCtTtXFpVoRnJPwlQJ47gYrmRyAlQusW4mgLGanTc6zuTbx/9GGmeEigJVelFtjHmR7MVQoMcRCH9o4HxmkifBITsL2EhhBJLXoFq2PAeM6djevhR+quq0czHRXw3CEid8gabRzRHLNiFUCjryKFM8w/hhOsjU7VDWCLG7E6BZWUqKOmheJaEbEI8M4dazcuazoN8jAWmEaEYCZTYnobU3wljLC+XsZLPehucD2w/1O+LSiPGVn1m28t13sCeSoC5M9QVpQ1uNTEYyPdx3vpBOomepBzI+tle6EE8W3ZWDBHim6KZ4KfGx2hG+c/N2YfmDtAQyXK9TmJNBzevuvb/cM0jkieGohqUue9mw6ciOMVBFN84zOJ+Dujk9l3xTP8/Q9UoEh3DnzpthQ0u6eQfbCfOKS4lh/+N7Hb6nG220rUdfc+fctKQh7n3I/Gt7V3B4Jzlgf4gQH5efG5KNB3hfkmgltkHq6kvRDePLIRnT2/OYzVVZOiL/ewLThQ1AluaIkykRR3F/Nq6IBnGrpK3W7Tb3JL8D2muNaQlpu6yNi/Fdns6583nrffw+fh37b6pvSb75m+xpXDDRCv8Nv+HwrOnhg5BRrytpfQPB3whYRpvtes3x9QbPlP68vBnKGhbbSFtVIcu4p2dQD1KaPDF+sNvMgcpeDZu9helWN78E8kFdYDPRPA+aBsmrSmDugwAe5ykP4lnPbJY2ft+/3u+PTygUCoVCoVAoFAqFQqHwy8GPT/jeLK5s6gaiTSFgiomZThoTtcNd5xkOU0ANo2fy6TVGVTCSroFspkY74RYXDkcGINomIY0LpkjMOfXQvIYqGCR2KdxXFYkuWMawxeq/8yS+LpKO8jysdxHZHBYZubV9ZS0uRDYm5nOdrRrP+NXw1KPAfWGfQJF0HrQRxHPxz/JrHQf0j9oV15J78/5UtRJuKJjnBhrxgeRTJPEOel50bn0pnfHszaichrDX0jD8tBIqYVMC0VroB3IZFyc9Sa9p/Vm+Tu2chMOW69o3RCBMBRp8r9fu1G1Z3qyOWK4+20rk6NmuHAh89AGc35oR0aYqVt9oCFmw5/as36lA1s9rk8ThytbxItdFfBBsksjJSKfcy9TBRHN8XvYMWX0YSncL+Q5qfFpk5y1ZKzdjPwPUpWT0RzDFqYsQkJOmml76TurGdJ+pNyvjjoTd6rgJLY5ksEPXc4eB/BVZysksr/ShYgfifihzvW+cejmqO4N9vh1CJBdRO30brqUYH20NhOZxGGGtmxt0XOsYJyJimWWg8h5V2UFtHMG0nkfWzTtoo4QjDRSoQiVaavCb++bDJ9Wq85snHP2YYerhu1NlJ6rtlDzV/LhxB0KVb9Eu9LcQrbnqtgVaH7wXrGkzqkIMdb7eYbtSdhq6No7FKBSqlr70vb6HRde2Ljvmeyeei63lqG80XUYiPmyS28okCvNv23+b6DPsCrl5xl4w/8dIDmpv9tsHN6Lhu1Q3IATimuGaOyIEI8kcO0G7KZNxzNs54bJU42pjW+NiO5N6OZY2qN3Wdh5K5nCf8Sxp/T2M5eHvmOg7tBUV7fhvB7RPhORs615rg3DWx1v9GslsokVG678BXqq4n21jss2o7t8xOG/Pcs8/mz58dbLddNOm9t7p+t2TrrdGx8/z+T8HYX18y5+jQqFQKBQKhUKhUCgUCr8s/NiEb+9EDReZQghjIkIlrKkBQKFoizuaTmSkiwoHXTC7gPyFRaEVEg5Jh0Bm6cJVY2J0/RnUIUe2OErr3LxUUUxLhfmgiEgX8HCBE/O7Bb5GfMhKf46zCTnm18+6OIw2ggqGiTZydZ2jyGshUpXHfIxwmjGs69HGPV0UnuTxKEfthQVyDDurpJcSq4FQGelgYfY8d1INVcimNkFyJxC1wxEzL1y7wG+aD0mLg/wiq5KMx+GJLlUhHquNt0TgDBc9VHpzsdzULN35jYMclKV7+40IXOPaFtphPGPv2fV3IFmfwnGiSh3J1od0WqYqkRep2tx45fistubDMuMmBr2mhPd8FpAMcSo9JY7foDxQJmE9Rpxw8F1rQ1F48CDcMl9piOu+xrbzq9YJCkpm9ip8uO/DuQdFcBzPqPg1v4sjuCwcMBJo5qeDmK5A3B45QaK2SFJeoizOyE4+DkcE3xG69nyo/aTkcp/cORCTamcIA010OJLykdg24j27DmXrHPJAWAsoxYcyN4SJpmNTpvoCZNSpKnF9deB8om1C0kmUrB7vGMF9Qq9FOpgf0d7wGTcCGMmatVvcKc/TnnhO9tzwYGXM+T5OIdJpu5iEbbcw6rKPL2ej5U3Oc34hkdaszM0mCibh2CP15SS0Z59m4cFdGfKwyQLD0zeebpPd77NMIXJjy8a7PptxnN0810RE0mbaG2LfhSvX7/p5KsTdRkD4HbeF1I82xT4DRW/HTU9PG/dWxf5+dj490SLK4bPLbwRic+9SO0sX2smReM5CzRP4RDezZZtS4DdBuqHByNG2FNi4sU773IW2Br9G8h2jXiTRRhxJjL+TVgJsYO7H2AcxzHssg3mEx56/AfR3qRxtixYUyWYL0x3tQGSRevA3etLfG1EtQvLlbWS/Lmp/1uic4aw1pDaJEL1+tddfKBQKhUKhUCgUCoVC4ReHH5vwjeRmW7vtt3R3C0PZ52xhZl6XsJjo8t1dxyJaSBsVCbBQ/ohoo5LCnTwZY8qCnRRM/YJKUcwrvNsJSodlw1TtPC1wEqWknJbnzvPDxU5Z4TtN8Yiqze4X9lhDQmahJDFsqBGrS620yGIgGZlneGsBNS8shqahdz+xqIyKYZeWN1Lc0gnvYSRtDMha9MUyMOwsltcbUes+vV7bFJ9Y/k3fAgnOqBwkIkb1nxIKSI5CWOpHmB9wQbTv44rIxiGSnLE+y6/pk/wjg+RpOOkPuwXPPD4vWGckEZ4Ib3gm4n3ufYR4zMrr3Ye9hrDY6EZ/piq769m5q06VHPNBWGhU37mQ7lZBCBccyvFtZbs2QuLKnq+Ha0j+zrqQYI6kryNzgRxK1c3QhjRWqFMzB8Lq5lpaRkZq35KRIR8dObEdntEnbPld2OkH2xEY2vWuLLt0Q87F8rL8SFhjGZLU+RTOV8u5sTMleV09Sb2RWCIiI/kTEnS7TkR34baNmJ12m0I8QDJSObF71eMO4KaNTJY9vSm6t3F9JWPxMnJ52Hdtz5K7rwQznANu5HTiN7chINm0AAVbvTw3lQgtsls4kHS05sMtfL9tMGl7WHDIq0Q0H23bqGZz7XWRXG0fO3h8QD/IhfVWUvXm3Sjx91l8102SMzuWwOw6Dgu/Pd47WvfYFKWhw33muRHlWu9lVPW784/j80i0bJznXluZ+BsFx/wFv28yW6z96zeCtUc3f8LvWoYNoil49tsZVPGqRDbfzXKuvohcJIHTeWKSzo2JX5ezg0GpzKqovg6iqxNfpfAtFAqFQqFQKBQKhULhtwE/NuF7HiRv51C+oXIDF3ZeoDzIFLFEazHnOMYCzTssIukyoRKSqAjQBbyjAVk6FoXcghUuHAucI6wLNRl5hIs7+hmVxZpfQ8gebSz+YDhoIgsZZ+XoWaa2aJmQzeYfIKqQwG1tLVR12hevmJetHXycLXjjgpp+N9VJyDMVmkYcaZrexwKcuhHDQ5IWNRfE3t5WeUhenY2owb3Xa10Pi28MJKqoP7tfNDQlSGe/6MtMJI220I1xA0A80/A1z+w7z1H+25tXJmseXcVH9Y2FuAYS2IjLY7TFheI9yFRmtiB50VBcMtkzEc+wJV+OqY0gHLpTJmpaXRDmeZZ0FhIX60AS0p6JtaCe4ssXcqrlDn1vz0NfqqmoLILQ1pYH0vrNA+IXyFFlGzdCoA9RUZydxZkp6fG5Pg6it7dw1nSYK1zfw3MSF5ivaxDxjvxteRhsteUtIbz1UphbWO+5M5/nWeGWBUjrmRZ9rZs/LBQ8kX9m4iaX7ZzQYzvHmA/ax1kkjhVOvQyKyAPGuG0uAQJCryGBpuMPiLRVDfhNxyEolbE9W3ol1VSlS0SOuJsRDVIiGKMdZArAbLPSbMudYtqUwiHktvPBExzpoQQ4kiK78tcUx5jfpclIWrQ5+e2ARHJ/mHfuyszQMzufiOjuy5ZrNCWSRHKtvox5PoO7PFqf2mTE+/KHZCS7Pr+obp73zf6krJGMNz/IBflt/rie2+l+k0U1N1ufjvpeLg8fRPI+nmd7HtW+mw0bFrYcIgZoerGGr6pG4jbfwSuPU1nDc2bzxQXkdhI+3Lczed7iPHddiygP82IWelzinNvW+yk7H1t0DoF35O052jjXafr3d/8d0yHJbf9G6PnGLBxT8Btf4m8DnNsVd2r1SDDbHI+E7yDLjZAmmr/JIPrMHbD8X/287Kf5fuUZHv1oRK+L+P3P78sqFAqFQqFQKBQKhUKh8IvBj034Immoi3RxkSU598vlzxZUMAx0DLecLXDr53ZD9CKpybxCRtPYhY9nAeOZwkYM6+JTPDMYy9e/MRw0tjsSPbjIpPeNQBJflqp8kQRiHoSy+lD/xgVnDn0S0xDli3CZuiFTPsbrRr6Bqk4X/CLpFZUvoHp09WZ1gWrUlL+Q19Qz20LrIKJNVenUi4sk8nUehOGlV5jKSehiukjgzjotpC8Sw0rkxLC+SnJCKNdZcSCTNb2OAawztAOIchcGGBeGifY8WiYqinW8YNhPzadtcUTObOfbJGpzMe5S+MRzs5XMc6Rdd01fC7bsIoHbuEDSGFXNUfEVngUXhtrsbH7s6mYIohGiOcuPiGEtI5kcQ11OAlriczvr3srBsrW+rDwM9QobNAyoTtOw1lbGbguS5HiuKIbQ3qvwzy2mtTCpKZp/f2z2HOFeDN0fn7mWhmJ3pLQSwnfjN4SwNtU0IAtTTccBBPReuKo2HTlLqPKEuRYU03s5K7+G+PZhnYGESsJzI6l8m8YMSfo8u/aZ+3FDzkf5P0M2PtUZy4nv0Kfy8Z1r7/6EeP0IH7X1zuaPbHQkdVLHR217wveS2R+VkSgtUUEteETER5sViEheH6Rx9o/nyx1bgISh9PUat+gdIS0WHfclxE0oRD7//LqFDgdFdby/hSKHUOCOIEa7uK3fohamOttgkFzDzZM6X+o50uTfB5h2O3Ma4M7Bjs/cdfl3WrTPyn1Zumwz2CK03/f3D82Q7JAnRdvPknYpj7YI8auTyLe8nEKhUCgUCoVCoVAoFAq/KPzQhK+SD3o2Lyt3oAudCUHBn1kQxHDGqspUpbAL4QuLskb2NL8wlS3cYhvaumZkry5ENfLnhNlC094GRxy/EsVRsEkaL/IEF4bNPsnvRTKOaPkklhFDvN6tdcbF6XjvCajIiGVEQlxD8mFaJLai0lhkhBxEhepTPSEvhmS0RUUloHiqgEVcOF3qzZTAgmMOCaPNr0thwlMdPVRPSzHo0hMN8h4IVm6NBDuoT6LX+vtYi82gQFGIKEF683xBmOdli16SvU3qR26j2SI+JHU7fNvQD6pQBr9YGkc6Q/3OxtVkZw9ehPNRvc2gSFVSzeaSYTN3X6aSy6KLyTeLvJviF1TAqDwysloRCGgicqGs+Wjjac8UxLhofRxjo0JUP0M9FMhlszmUaepvJXRpJ7qJaBHC2SYO/ZCE4mYkrXHxPpuHkXQOC/2sfXLzzEd/xHYTAfk8yze1H0MobTufEYj7jGfGUPLu+s0Y1mtxnAZi1Z3ljOPPNkBMxSOoCfVc4FEE73Ul9jjyOSVtF4GmhLAj1bamBSIuhL02W+/Og83C69/YPvBA2OEmGGTXNoIXypWl/HwMX415oqI4e3fevaue8tylfbqn1/W9gPY/lZfZqp+zOrP7mO8zRHtW71Pez9ifKZHv2vKRfdlvnUyxfleO2vBpv+M4ulFiiwwT2nr/m4paf2OH0OI71vnegr8jFG2Gmn8XyjaJYDFZ9AKe736dJxxBnoXPl0mUZhvDiNKQ3RF8HIssxud2zt8S/YjvED2vmWgoeNtQ4lqOO8Iavq/2JcR0vGd+qTN8C4VCoVAoFAqFQqFQ+G3AD034LsJoErlIzOl/x+EIHukaNlZDtGkeyKuL3ndqUoQu7KDq1ilrwqJiJE2JFlmaEJO26B8W8TR0nhLCTlmsYZ6RVLqSsIxZ6DutK5KcRKAQjQvYSqIBUcA80jtS9fL5mffQtLeAPK9QTixT7VZ1NqrwBHyt40C/o3r5OHzaqHzMSB4IEa7nmnJmo0LJNLwGqhH+8rbsQxxhQRFJWc17NCLyKk1THFuI2kmMdCGhpVZOzz0eDSQ6FoHtbNBF1pZIDxuv+04VrPdpXwRG6HXtHwyNqORUDMOr488qwHaEth0wZmIaVfWc555HhIgOL4jEdiL5S7SIKFUZo71HIM30WVGSGEaJ08FGdbMqp5VwtvvweZaH4SItbPWXtzF+v717ZZKi8U4oKzSUNYakduQhkMddiFonp6bCuoAA9aHDV9kC48KdWWlnenu1Jx/Hsg/t0b7NlFtZ5ABEa7sq2fkEz6ic9YFtFjY7m0+wzRP6PvBEeyPiEO56Kw/mBnuveJU5MxO9HdOHq9+MDCZaIa8bEx83BERUzSnZGjanZBikv1dGs37HsZQQs0Ym89tWPp/r2grDHcgqq38B0455ZyeQ4pzHjYna6fNSJMslzZtGZsByiRbhFoljnBtjGcmGG9scFFT2UKG36W7DRMRHRCxee7qP0SuQwP4Mfh0C+CmvK6fvfrhN+3DtKc1nSdu7cp7aD+Tto314rd+QySLk/BER+6snv936CkV+e660K3OMcQ0JPvJcvk/m5y3EOdF65vuLLFHYdMKSnFWudRONUNdKFuNzMudGCSTw+Jj9ZuSxN+39lZLdHUP3S98UvfrbVjcluhDQaLN0kk85t1AoFAqFQqFQKBQKhcKPjh+b8CWidZbqWAxkJOkUfab7jMIUyC5h3hXBcdEG61HS+S4EmxIg36O6iXUQELlICAdgmqwMTcN9LaTad2xPtC1bcHXkQ3L9ozzx2id8cF//JAWeyo9kSUbwzDTuHNGIRAlpVfU+CFYt5956Dz3T7c4+LT/JKnEROuRfoYF3gtjlp0Xk5MQylOWMailRPEIBJ8rEEM52W0hn6Au7Hgi4aN/jOLlRIuFZoI6saJNI+cTGjyegqjKQp9YOtE/Dp+vnSJJliu0MzlfhswARCeGpLUlG9rqF8eu+L1F5HMtD4DnKyfU0NDYQyVG1rHVrmaYqjs8wKoGZTVnlQmcHsvhD3KXJytI6MF/Mj+MwKpfDNf2O9ziZM7y5OXnt7h2rfixb6PLpQn5MP87ohHGPzwJ+V0RlMbzjvCLaK3m9wv+GWN6I4T3cNabTtKYc1nshbHZ6TmoWSjvcc2evJnV/Bo4ExvDagcRCVfY2j0SS9y40MRKwSHLpO64FkiwjjLGOGyJ6qzML5X1rY/RneEfEDViZqvfpPtEzEfsXIZozG743z1+k3l8XT3Xe/Wb8TDnxt7UBfidkv3liOdGGVDXt5wl3VrJLO+e1yJ1ayPTu74msZwLP6J7jGInhFZY7K3c9W9mcpRFW5Lr2TSW20XJvTqFQKBQKhUKhUCgUCoVfHn5swncu5FtI52sqzETWuqQpcEPe1hZZzEx0NqJXX4Qx5iUCJSEoeVUFe0fwajjoj1QxjYlQNZelj6S01TGVqKgCO/aFXNE6iIi7WAjoETZ65Vm+zBbC2Z8jrNdQbYz2TWJj3U/IDVVGH6Gtmh/V1lHt2jKftaW+xLQnKMdiSG6055yKO23fed6TMkRefaj3z4PodRG/Xp7YiUpVG6tA4mDbVekdr3dQ8/HyDWs9d2H+GBTHGO5PyV1VvbeEzE3gwtaqyvI4hmKs+7NPt3NQmYkYVMJKqmiRjlw+R7rrMiLD1Gnv7yutKjWz8OKzTCP1Lhp9fJ5TgUx7eiUaznXmqSvXVKht3TNVL16bxEajVQ6ep2zooPg9Vj2mQE7Goc1vQEzbucwJeXT1pUQ6QDmpz4aO+xhe2fKE9PoMqrnSvcoIz228myfNhufrpmzuspdroYfZlMamWgZwmLNxnPvNDQlZnG0MiZszaD0Xkj2/uAHj7bRFeiTJJcznplZWohieeTA++K2tvIjeh83HMdKg/R36PqqoR8OWnfbczrkIoyOg8lqEhK5NySx0bYQxbkZh8BuDjZ6MDiQ+7gA4gAjdzg4FRbgkYxPniQ7nJWukAiSwu4z7kVjWZySOeS37opVvpmf8kXKEdxVA7XHnIevZz0STTF4hsWfieQ8IYZtLQRHNjYiOFRYXw34fx5qDtP4tZDeT0AGK6GELMXkiCkNuzzpzBfb8vCmvF6ntiOZN3QzvlAzuXlB6ItFMtL9T8DcGEHkujLimwzzxOcHvMSy22XljBxL0uGnqadNcJOC/hyT+dQjlX4c0jxs3cc65K+/Jx1m9t2X2PG0sQ/sqhljf0qMKeNp2d6Y2huXGs3nx3Gi3uWNehzkyFfIqiV0oFAqFQqFQKBQKhULhF48fm/Cd4AsWbZTsBSGaMHvlqa6luWtzsZGnqpeZ5OBRti7SHOxJFFvYbgkRSYukjUTttgCdAMIDu3M9tbysrs8oT4hyVbDeVz+ggi4uvIU8HBeS1BZOVMNax3GMe3K4spaRM4+GZUayV/ugzQXOfrOIp58b598jMRjVlx3s0O/6mZr3i9osQvQiT85ktmG957nIJaJd5RvTt0YWPtrsneRNS8YnpiHKySSaZMrBdk0gnSNsZztEZNjR2iJluobpJU9UmUn7AqtT7gGQEOLpJz0zz8qJoZaJ5gYBIH/Ds4Yhar0fxC/OYnnZ+clnomA7OORfyp9UvdevtXCcEbSJki6Fa4+SBslz0ZiIwWe4qQLnyWxxuM2F6jt15lRWMstONDYmYtmJDEQMP61z3qPikAjPfSXpS/2bEMLRJiaY0yOJfBxmgyl/tWolDOPzk4Sw3vLoBRjHaV4MXx3rbrzOXY5hp/E73LdysC3uXdJcfkf2Yn/i5pt5rnNoqNuwwOe5EThZ5IRUvTzr2DbGRAXzk6I5KNH5aMsnmhfUzHE+dH2UhHYf94+Vxkz34y4NmY+q/7g5AefFHvIQeSI6nC3OujEjCTvLmv5OHU1E3M45Fg///MEZyVZ/DJ+NRDMBWauk8xHKvFEj6+cYdnsrFxTT2RzrQ+XTJKEzIn2VF8983tTLRDmRrAQ31hdJZcsfCnC/FdpKC+T4aCPdv0+2Rj38LnyMbJEouZ/wtKkx/k7K7LirAzdMZUzmXbl3ZO0dyfvop6Sf5Oa3wl2ffuS/DOlZ3qs8p9bP/B9J7F/HhkKhUCgUCoVCoVAoFAo/HH4RhK8nU2mqiubiqpIYutBNRNSSBajLL/7IJFaFaSl9JwlsZwarWklDWNrufb/QKzy1aUquiFC+WgjQ/Kjqa7SrUzVtpw8W1T6oD9JwF5KGyt1pSuMtrcPTwt7dItsdQQkEszQm/vl9kVK2CDj/I/DJ0yIqojXazpOLadWvkQi2voBrRESvvoiHzJasDiV6JFxH0lfbPIlytxlAEX1/F/o1syeqGQMxbErJu9C0yaYGpySO5DWRERiaLlX7YV2zLL6uQYJofrQX67E+9eS/ktRMtMJME5ArF6XkoJE18Ayuc/NoLaZuiso5zrLFdPUDz4XjLOy1ptG8RJQu3OK5jFrXBYphXBCeauyhxO2zAQlBG+uGsJVbO7XsRmMs4yYLK5MoVT1mqjx9zuih7VoHhsIE0ndLl55vCoQbIckzQ1afJ9HVx7jbxvYglo2MNaLrLuSx9kUzZex6ThNiMCGYsS3MQoLpdTMIEouYv7F7z2E463nhMb/ay8exwmVHJTAS0JGg1fkCz0J3/oFrbgNVMod9dN5yuOds3M6rP9Zzg+Vq5AScyxL7OLZ1zjUMZxnbHBrnwqTfEXsY/pUH25SlS+e0ZLOGpcMQ66CYFnw3ZUponf8yAlLVy8wkLxjrPTyLoO51al4lqLPnP1EXu3tI7DpVtg+3LXF+bUwsoSwiU2RbKO47AhlV0aB0HrcSEhnalKmg7bqS7EAqb4Q4EsV2DchMJOwxbyRTMXQ5txCmOCGis3d8xA2B7sKNWx2fI3f5OO7DL2Mefij77vdf/J5tfHTjMXnP6Odsc6DmeSLLnT3Yhn6jLE7ecYVCoVAoFAqFQqFQKBR+q/BjE764+MJM/H6RKClri7pj4XaodWktOitsERguWai2TtT8wrumFYqLgoGMhPIZ6wmkmbRG/P4a91XNKsE+bGdTAya5dsFCs6ZHchXzIsEAhKkwpDsOkjbK0LDNcuxli4ardteBhM0UV4EE5WsthGnIaQsLrW0SGSrrN1CJbYQCD8LrbuEu+kXzBiVSusCHaLz3xdUXidIaKJIjqXWjOBEZRHFG4ioRocrd1tYZ0dE2W6QPNupnDeWKBAcR0eu15599wue58sR8RCuENJLG2AYca5BHpjqG+XR5pXdTLtuiP5appFsX4uln0VDWrS3yAzd3gMp4UxerAq4L0THJZwzhDWnvzjJe3w9PwEwbpBE5tfG4ufKeYRH3OIhbI3ldnlh14/Rh8brDPIKcLBIm1+WIPv7pJwjDHJ5bVSxLJzdJYrkMKm71YWbrNcfaeQJ5LJ6EQt9zG5tz8ExSVYsSLZJblbg2x4Xy3HOv94C8RkVe3GijIbAx4sHbufryoH3rjioYt8gGMvr3oKUqzlTdsz18Xa4MEYGoxYuARiLTkdGqXtbw1RCu285BpsMRuVsI7alCxjpsjAMxZ/VqmGoZxJ0jtXVzx8y3ha7GvkfSD0NN6zz29raI6evy4w/CWeNZxrGfzD6iGS5e1sYXnesiMY2bjcImim3u1vpj2O/r8vNbDL/9/r7SMnu7g88sVDaWCe96m9N0ftbfRjPPcv0gfa0fURkO/SBz04bf0LPew/HIACUC7SznWddQRmtdi7DDMTjKGuPNheDWMNpRjR8xw3Hz0fb5G854duStktOZ2lpktj2+ezHs97k/9zPN+NPdPMMHuXD8aivD5pONTA3qaiSJTb1tt3WMwvMKv1uNJNd3VEZOQzjwcT9TOy/yN16T1zsZ+Y1ZQPltpK0S0aqYR2V1VDpbelBVz7Zu7QN/2HEQGAY8U5hvmwb2tCO//kZScjeoo4nW/WBjbIvZE/OvBqzPWfhvV07Y0FgoFAqFQqFQKBQKhULhtwI/NuFLNEkVXbCfJJwjDXRR8D6/3W/h2hM+UtTG8s2+5heN8d6doiANnZrUNUlTej0s9GS+uTMdVXqoXo7l3akX7uqdZXOX71uMygjdWNdT3935IxKBrp7Pqi/YE0xKJtqiNKSN6sk7ez5SnHwmj15TdVmmlkOyN8unuPMtEvQYmlqvKeY9JhoL6kjOxPRxrM3vFnb6CZHYtyJu8n2gXM/OM97CTc+8j5ZlYYWTUK1r/CR9tRuS16EL/x+d2+fCuj49Ox/YcrdZAi8nCjybs+/qtvsNNmhMglmVU7FObUs218W6nPLvzoZAEqPNIVywLzcouTOlcVRtbfYu29z4BXVxvL4hRGpw6VClnOWl/bkR9HNsW5JXcDMI1n8Ffydz06ZCJlqENea7ec63zVpEnmRdmXYb4HzzFJgn2dxi98L8YWevZ2VFG7I6ccMT/qbActA2eyeFfsgiOcTNVEAeW5po45yr4jm7xIsAdurjoJwWfb61LK0HNzxZkSvMtT/PeY1LVy7mQ+JYn19O6qV9zGMZG9INQAm0vhb8wsmzl6h78/cHpMuCLrTkh+JGWIa5KJLTSdkbefsQRWEfF5Cm8QysMNTGMZz3InTFXbNoDPaevDabMmzl0yK20/wQsWF9D/ndmbotZM+v3aXZP+fEurt/9z5h9tc+8c+aQqFQKBQKhUKhUCgUCj8+fmzCV2QsGjcaipF2GLGmyh5pjVhkqKVQvaKLrp0sZLP0udinCgfmdQ8IA77EK2BE7L4u5QizUxcRs4XcRLCIqbywPs2TnhlsZ262Re4q2cg8VHGYXj/HhWYkI/UzksUZIY3kaEb+9j6Uu7awOtW7GZGm5LzIfs4v1sFQRrDBVMKoeFb1caaqvVvA17ym8FMF383iu94/YTFTywbFk1OaZ7A+A/IESWMCu5GUw/YpedL7sCf20xlI26hEy8iH2L6rr7Csb2/g72sni2PIVK0XyFw+jzHWkEzIQqZGAuKA9qH6FwmEjAQkIn57G3nf30ea61pqHwmEGiIQWilhk7R3CwGMaVTVTH2Vx0tNOUJVE9k5yqrcicRsdnavVjPPhpYOatOgyhSRofxsc3y9dJ6IRDz7djCPci3sOKiTpgp7ANRPSGKiaosh3Z1PdRyqjV2GYrixD5V7QDqzq/vPBw9VvQsdTeQEzNoe9/y3vZxtwwkq+I59PDOPZwn9a2PrIAtB7uauRvSmcwv4+5jvqiOZg769r3eE2pWRSm2MO9Y0ROs86+taZWifSV/EMYbPdu3phFsfXNhrIlMqK6m3FMOQ5prPBaqQiZYCFM/xntc3InrWHaG2eNWnEls636x3eoos9DXzUi/PedGpRVE9nG10ucJGrez9TUT85W3Y93qtOjRfOF8Z2+adEDZEaPt1PkRVKYamju+LqeSmM9StdUzSliPhb+rOOfZw6tJQ4cdBcl0buc/a1tkGSxeU1JZuXmfYZMTv73b+8iKOwQgtK25YItrfBeaKZL7H9xeeEz2vxXOiNb9TW+u8g4T99Kv0l9mUqcazUMsbcd3HmcVONT0q8QS/haF/2CQUFMZaznaWtDMokMqNh8IZ7mso63XJ/45lOuwdtaJVBOB9DLv9xv79EcNsZ+rxeN+IfKFIviphnamf19ecXHft1nkY3gFL6Z3NVUHpza1I30KhUCgUCoVCoVAoFH4L8GMTvkiUXeKIVwEylojWIltcRG2T6EVeldYilwSCjK9Zx3G4PHyNdFu9mS1EM8Q0lP1EuqmteM1IIl5kpfrDFpZgQS6q2ET8fVwkMzK8++/oP1wwDgpZyQjXSeo68peZ+OruvGCisEgfidrQH3IEhRvaG32FtqYk3AORF9Nm9iHhEMvB8YeEcDzT+Wj+u17LoNeNNG6zP9cmAhf++ckPuHirCnJH3FEg05hIIISokdSZwsQTBETkxxss/qdkBxIZ+n3WZSXH8051UfSG/B0JgYAOC9vumT+SNsV00Ua1w9UH31ExB9fjWaMsshRwumCNZEDiLwv1q+G6IzTErzYLF6LPc1+cNyWT7Av8G3GpGwSu1Z9OiUVAoIMCGUnmoP4abZvX+pxbGtEKQ8prDKn9/aKUXLCNHInqDDdl3DxyBs3vQqKTbxPW50igZF6O96L6MAsHnp3V+NS+OxV3IBGGraE+dxZqqLfLfs3ZevlnyEI+z/diJJApkmZs4aXNX8dBLH0RwzGPhpOVl91LzzS+6weiRYJqXj1DPcNdpIJ4DeYMxnFLBJvK/Fzmz3pui+xGwlnzZurliOzdlG2WURzHfeSCrKyojNa5Mc6dmD/Oo9puPcpAw1wrYvu13Ij4TiJaPlLCNf42xGvoT33f3KikXVmaLmtz6KNss9EtaYztItrDVetGRyS5N3W9b4c0IqZjPI8ZwQ2fN4L6g2fIny3tNyepv4QuV0YWUlvzDFtkzWdgE4Yg395VgSBGW27re1IMo2oX7HBqdatgkspqO5adzeubDce26WxLk5HwSGrr5qAbLrxQKBQKhUKhUCgUCoXCLwc/NuFLNMgaIByZ5sLpWmsetzioZ3FxD9d6jKTgde5vzEPkw8pmi6SIwCU4BKWNMGijmAMxpuTQTX0iQ+l5AoFmSjddeKR90T+QqCMdkH5xQTSScYhAYO2k7yC7XZYu7pxgT/4CSRzt1AVfUNqxY+EfFuyyPouEaMyfXbMNBkDgRzJe022E4+zLOxL/KW9sY+Oh8sD6ifL+1r7Vz2mZN/7J/uL9rI04lrIFfga7TWGd+3mrA8/ONOJ7pkV1UyAgmGg9TzcEiS3E46I5plViNVmw35AQwpldmf+YyJG8RhLHxXkgklTBfBsKNDVRxzL5KJZGOuGzHBTHzdsmRDm5GOrbQqvaTVAudqE0VD8SxPP7KtOXZekwP9Ecd21PyzN99syj/aacDs+cAu9rfUSBxA3z5R0xi2reRLnnEAkF/R7LdnNUIDHwGXT93Zwvx5mjnxhjGBr7wjqvtVFJm5Wp4ZBUnkQIZ6TOU/hxJNuUvI7jL5LOGkGhtUGK3YxrdnPPngbDU7uyrd6waWXezxTS415CBEZbupjaeN5YifRapmZFZMT3Z8NOK2IenQuf5kRV+vJNWPCs3gzqr0jYP9l4857f8sXrWTolwVtbiuWEhN0QNzhlth7HUjY7gnamR+U12gy/61jPZn6K1BHefxZBB39jErxD4J14f5TCqG8L093argjX9L2TkBgxvAHy27sl2PAUrns8o3FjyPLfRnRnduAzHdMc7DapWF3bhjvf3y76QVZXJJ2JxlyanUtfKBQKhUKhUCgUCoVC4ReNH5rwNUWMEi+ojJkLrgIL8UJjoYtffSmCz2SB9hhl8s99hopu1L69VnmdVijpvha/SGaZB1M/zrEQ18lUwabqBfvSEM/WwLmYFslDDDsMROlGHNypAjBUsNUDi8eqQo0EqBkJ17NF0saeqFbFDhKZek39dvVB+rZG/LqM5LXFq2wBMCNBIZ28jeHNGjoY7JeppGUNVQy2ytGIVRyJBGq2YUBJNjRP26iEvYad1XvYJ0fzBD0u8ra2+gLRYBEy3tPx8Lp8f2iZ2LeZupBolcnsx1ckOpT8cG1q/r7mi+MH1c1I2HbvV4fzzDcn4LjvU8WiftQ8qLbKQuBquUAKMIarfiDaWFVoHPoZQ04TrTRKxmL92p8Mi8NRLRxtBVscOU1zER+ff110ZiYLG6z1HwfR6zUWolUxf55rcVsX5QnDZrO1XWiQZrooLb1bSGoSCL07SUNLh2MqhBJdH1e4zOET8UTzMGKSs93sopYeaEnGBLvNFKic6z49wzUkjnsz4sHK2zZEBOY84jw9qWzhrWlMKG5jQyOiRqz9YmH9GdovvmwFqq2JBvl8BT+4cLZzznr7ssp1G59AgU0HhJKFvtRxjmNQSWNuxGdb6XCOwbKwz5Hs7uLnIpxfgzpdQxSTzDDTR9vHT4QqkANJlJ5dTGQksBHf3Ih5pXXhremYBOzstxvifoUHPjxBTkCqXdfw/du524wk3BGep9CGXN2YEJCTfHaq5GyeBoL4No3+zkDSt+3ROkRkRSrAUNg4N86IIlEJjX7a8mfIyE7biASk6fekm/O0Pres1/G3KvojwOV5e/N+U7y9jb941jHalhHwClXu3inX8f2EZR0Hybdv7p3jsqFP9kb5z6ogx/SZvUrmEvn3bGiLJT8OIu75+NM6kvHCGi5bVdI25/ZFrre2R67WdoMtLhqHhjfX/MxWF/VO9Ia/S/o2B0kyV1uYcnxXY7r+0P5CoVAoFAqFQqFQKBQKv0j80ITvE9z5e7qQJALKRrIzew1RRTaxnauLe+wbpTvn2RYAZdXDTMK0nQus3/G61anqto8Q25vdiwQLs7cfVV2RYFYS7Un58hkg6Qt2oqpXIhGJ2bts97drT4uMmf1KrGLddwTvXR0ZERnJ3WhDZku2SBrVH3c+x3KzsmOfZm2I9d7ZYfUleT5QdhLRTlQ/jau7hWO9lyGqsHDB+qlfszx3aZ8Wp/H6kxpT23a3oeF7ny8lUNpUL5qp4fnIfBCfK06+w1yCCi5pi3TmMI6NLHtSXt4AQ1hHNZkBQ1q6a0nfKjnqSNmAeNYknlUbicZMNcVh7O2NWvU8AedtNS17frNynkKAav4uvg6zVfa68bzjj/rRSOjLSOEn9ZrVk9msc8xjyFNoL6qEXTktENVwPRI3SmyiYhjPJUbFMYai7eTtvPG/nfkZrwNB+hzid/qwwUaIBmGvn5DN6Tdq5O9Blt4T0EEljArfef+2ToiwsKIQhPzWnmQeEH8NyfsYQn9LoyQjs9tQGNt9e94zzLUYOng7RxfTQ1sYCEmXRjcPRZvQ33HOz+zKys3eRfGdMdtg75q7PAjY1JTibq7cfn9DebhxKo4JJIgRT0pxaEs6HjN1992mhyzMN/Yd5k3U1RzGN6qq3ZEOmYJby4Yx9J2/JAqFQqFQKBQKhUKhUCj8oPjhCV8LgYyLLri+omfukvgwccym5LU8rfmzdaEcUwpPEpc62cKKnLooxZMYpfF/tojTXV7RdFb4IgI1HLX0QPriuayQdqXpSzGp6SIJqqpAnkTF27kTgXgurKpE21TGdbiPKtFXUCvehgyFxc9rKFXsvF8kgjOiTRe1RHY1LdFaQJ9lSTx3VWTY/HYOUncu5koWmjvai9cZxkG0EdNEZIuWySKqW/hzi71zsU9Vy5eOL9nVRe5ZCPbaOAzKpGhjJIQzWzVddlZ0LE8/n8foh9drqjehHqwTFYhoK/pPxzPaqAvQIntfmPp5ln1d3hfJGYlpKGf9no1TVF9p+/DsRhw/MtWv2UJ6fC7RTljkFl3MPc9N/cXnSXRdJFf3IehjeVFZfAfI41JOhZbAebaizypsptCxYUQHkmUznQtFPedcJZB58xsqOQeRIi8YDxhm2tW75kdH/pgNvOfRMycPJrloqAqPY4V0bmz94hTMFJSno6J5LWEmMQ2GJlc7ojJ8VLSPl365d9T6q8/SwyYEU9wCoanKWFpNcuMWw4dHMrPBeffaZumroKuvdnese46BSFIeMKa0GddFdLytNsaQ1tj2SNozw3wzx9Qb1MlM46Use3lHkicjrvXacSzCVvpS6eq9LuOsTQV+NlVj3wneL2/TJ5ev7w7hfnqm8c3ZrJGotLyggBfY0HNLXr+dli4qGbVMZn2uX84uZjZls51pDOXIdZk/0/YBmZYTe8O/2tKMhHcbUAKpHBq8NsPEkOA6Z4f3ss1LqJ7NbG5M8u3d3zsOmOt25bQL8Q026DjUd0r2jnDvN1UWE+3v0EjGRpeojTEKBvjMytl+0ySkK5K9eC0iIYS3s4rDBgCzU/tDP+tGAJyf0a4b5bzLg6G549jdzmGf77PgCwwV737zaH+ZH25U3IVCoVAoFAqFQqFQKBR+UfixCd+DxkKyritNAkd0dbnRIvQ6efJECdO42x/TKVmhaa5JvM6y3UKdooXFPKJJOtMiiiOAwGIRcipbCIvrQlbPtKYSnqT2RuYpQts9aQZGxRClmXJW7SJaSqNIXEVyTomvaZ9w9/chP199V/mGcIrSQhvmPdHwyEjW6qLXDNdsvp7ttmvQDmk8zofk4A8gk1kJ9ki2oJ8RMQ36LC7SSSh72mbhqbtMEgbqcAu1ZIvhTiGOi9TBd4YjGT9IymbA8M0t+KNNwgTT8tueF0NJG2ET6rC2KhGVL4q69sW+MMLhzbcxLhCjWjYi+h0XujF9XAhGcp7Izz9R5ROhcxEq3uJC+x2BjTYHMuC2LguTe0N6I2I4zQc1nCFutmANHQ2kdwYlgVMioW3kzyheXJrtWVQbCMgWIkeMGTml+aN/p79cXTbfDiLZk42HJ3X73IAQz12+Cy1N5Ihm9Y3LRzMfEgGqTG4zDSqeY/nufPtkPNn8MW3OQml3IH4maT5CXWhbZVdoM8xBcdxivymp16CN6LuMeH1CShZ/QJ4SLYIaVcEIdIuNqWNX3alaHccFUU4e2VzbxgaaUA6eFbrZdaf+D6Tyhkg0Z+2dIa03RX5CzG729UCszk0Hm8JZ2682xd9Vqn7mRnxdcyMJEMntdPZsfoAQ2TGUtyOpkzNi9XdaSiQj0X4hGXeTnmiRtsfh266flRyc6fxct+YkVFs7cvFBJb3I/H0u5aMNX/S+6knIWEdAPymy8T0T1N8u9De+4zB/fO/Fc4cnCeuIZiVmlTiNG70QT0Ty03s7tFHw2myLH98379mMVCfdeAC+0XtRTf1rRNgoFAqFQqFQKBQKhUKh8OPhxyZ8A/gSks9sYp9kb3oLiDZT0HZ/P82bEQhERiCP9Xr2u/OJxtm+cec+1q/fiTxxd83reqZwKNOVh2UYgbgTrTPB+ohpntqLIZ+zdBFKAOoCPS5Q6gLq/BuJ39vQzUiYJjYbQXxH9CT3RBeSM7JcSeFr2cnX3h6119pzNCOaH2HkKdhBtNTUkYxFgliBiqasD78XWM/dfQwHi6RAC/1z3DwvSCApYXB3nvTTImssDzcoaF4dtxmppIvKkUDKQviiKuhm/G3IFo+fCNVYZlwUR7Vy9Asu2E/l1RZu9S7MZUpaBALRFthlkbhhcZrj8wm27FV+ol+JvNoKyovhUlMCNlGOZSo+ByNc8/O4dyWxEJ3N6mKiqRDWBftFXNs5o5Hsnens7OJw3am7EJ9Z3Lc+aZ7MRVIJSWNtc/QRbvIA9arNF0hOmV1hvCUk3m5jUK/a+KWdML5DRmK65yqQjVr3nfI1Eshq253KV8HRHw82ZmcOGyE5ScB3IH8jMX9DyqZ9bmTkbpbfaNCfx1gkYe/Os27JGMRrOldZ5JEwHmM5SMCq37Ta3mdUEyC9k3DWRPucIfhegrGL5Kel75SPM7DPbMzaMNNtYZ9vyrQzpKM6WPPobw+BkPuxDHx2M5twntPmI7E/02CfG/k7r3/qLNl2Ez47IXjvQqBLfJ858njaEt6fthGgQxmx/t43321E9s17dAtlrnVm5x9r2hsV+tbPTxvT0La/hJ+AhUKhUCgUCoVCoVAoFP79x49N+CqXdTARwSJRo6UueHlCQEMmU6ehrsMFvwbEH4370hrRG49yeid6iYUa3Yi2O7JHSd2DR34iI5N57sIXZpJTF43IbLRd+mdL1cFKOA6lwiDJIqk8ypwLwufh7WQei6BRPYWL9bi4quGliRaRFxeyI6kaybAe6iAiVbBaZMSMwAx5+HUNQhUX0YDgNLVv73amMoZ6NqXuS5XhIx+eCbwpgkUsvWsT0apP0/ZOLN4f45xHNgKaX5dTmxi5exy2ssqZAjsq0aOvFefxTKyiOjtThiNxodcxnDeq4NA+TK8L4G5MybBNy9OxqfctnHh4rmLY8kxt1sN4w2t6fSq+HHTsxjCbXbwiSBdZdbH2OFbY3Yw8ztR5WGf0l9pA5IncoHJ3i7w4/2BIaZ1jsL7jGNEQMK0iLlwjwQ/krMxNLNvGD13Evm42JhCR6MJ5PH8R6tVQ144oFll5Na3IskWVfBouV/3uwg0HH6H9fc0/66xQ8I2q2NSGJC+q/oaSVrxdqWqyEU+1uSOLZ6jgET6aVxnDCLKQx6bSTcjiLqDUhrKN9AJ7kVjM1MQaZluh/deSa5aH1/v4jiA8z5VXk6BS2IjAg6hfq+1N0/XlByKyPUuqbNa8d2cm35GRFsK6uX5211SRqzDVZVvzVbzXxT8zei3OG9hPOHbegWTUUNtvRPFdzV8gisJ1rTGivokhurF9SMDGsWLkf/aDZNokTMRhfp2h31f47pvnQcuZSnRHHBsZfPrfJzHiQyCzmdiHJddqcEMPEKNoM8n8nTht4nP9bObMRww23W1kiJ+xzV2I6HKh8qP62OzSOpBsbbzebfN+qsomItbOh3mAcXPUkyJe57U4v6iyGn1zTF8FVbYja1XBzOHcXcxHkEc301HwDZFTNjvgedzQTlWAr3KWatnKadjHa7MSg93bMwFjwJHeU+nL84gOp9aXvkjp2GaE9itzej8qzXmPJ1AoFAqFQqFQKBQKhULhF4gfm/AlCoTDvNaJXGhlJQt08Rmvx3SBgGGRddxhcn/DZ5WUjXbFb1/3MptSxW5GimLeaM+TfUhKILmmZd22hdeCdabky+rJ7kciOmtLJKbj/ez7Uwg+JYJhEdQ+xwV4LBNsdOGlY/14Paa56YstnHRm9524KiNtszIyX935Fq89LQBHPzy1Hb9nika3ESPxAy6mR1I4IRk/VDtjX2HfZWmVoMQ6kZDNxuZdvdl9rNv56aFvn8ZKzB/vZYoo/JvMeRayGYja9IlP7HoM14xpkrIY+yRR6Q51GH1e8Zn40p07HGxyBII8jFHdMBLSmH2IeEal5u9+wZ+IVsjqy183Moqh3uxZDXZyayTUPd+pdWNY3+hPIyMfSFQkarP7WJZduyERs7Ns7XmNajzO2x7TYZnZu8cR1X0RvBG3pGXyeyN7nz7N1VnZx5Hfa0xEB/gT2hRJucxnikj64vtQn60tvHfyvMUycSw537f190k5rErrSJr2me+u/g+UyGafVhPP2Z1K1pjuQ2D9mX2ZXXGDHQEpDSTjVkf4vM1VMe1ngL65eQc/qpSfkITCtjZ+YE+qoM6U05FUzgh2okEA26s7nzO3kOF43TbEJWM6bCRxYaWTtrkNGze+RYW1needDS/ILyJ52wqFQqFQKBQKhUKhUCj84vBjE75ONUguTCxn6r243svszppUQtipZvtcDJrKJonq3pnOwihjfU9ka9NFZMirat+O5OOyb6nyZLVdy00IEgsJ3Tuoc6BtpnDo6x7zOks1Lk7jQnr83BgIa7DtLnzxZxafEh9u4ZADqYhkiip15e0c/YhnxFrfilPxpuQW+iYSi3pNw8mCOhgJNjmalbOdAZy0Z7SDnWLZiMUH38k8X5Sz0M9PRPr0x21IRyI/RrSP27x+3CzUPizMxjanRO0TtF7oT2cjkT+PGJ+BbPMGXo/3NGxi1k49izESp1qO5nllKsIb4icLzayK6J+/rTGHyBaRwzmRrnwMBamkI5LWGdms91XlZuOhjXNEIxGs4zWeM6vti0rj6MO5UM1HiEyAZzmG84vHPCozqRKTN+1XqBKuNa/YBrLDqW8P3zeOaE3IMz4Pn1bAvkhYG6E9y1QFPNFQ/fVOAmpdDCfr5l1VcYZnzhHurY1NTVAft0bEY6OTtQvjgU7F9CCf9ZkKZAcQ1nweJGFuMeI6qonj+cTgQ7r6UmkGcsv8JJ2cZDXbcDAjCcg7RmqA3WKmfIW8FwH5OyGgUN8qwd1neK2v3yGmts3iJ9OaY03le8GcB2pQp2ZdkSEcUEX90Wagg1fUBQJyXc+S5k70SvpbcfMede26JhGnv5gsPxDWgXR1iMQ8hU0FukEB31FYTwiPPYqUod49z3UmMtpFRJtyN+KDZ8Epq7d3q1fAWto3+JmufsvU1XqeNZCA5uOnzQ5ZGxqv8g7yYy2eA50pW53qGq7H341an5aD+bO5QNsZos74IwrgmTY1LxihfWEq/Eb0NvN8e18maJlToUxE86x18W3S9uO40LLh0bbQ5Oc5o8X0vc3YljsCXDdFqJK+y+qLu4gCRLRF8ygUCoVCoVAoFAqFQqHwi8SPTfgiCdbILSziObumjO3+uzDPcNBk9/kC0kMJhUbpYomcbaR/db++q8ogEVIl7wYld0+2sNMWgk3E7OJXX4Ryg0ruVHJAJiiB7BZGOy0CKiOlcZFJCdKjjc8ayhfTYjokAjPyDhWMSCBpPiwn5tVQrxnhlhGZIv7c3tb8uWzmlxtSHkj9QeBGX7Nv1wy9K8fKw27xrZHwCPW8Ec83i+OO7EVfxL/6HIg8nw8c68HvSMhgOFKsQ/2AdvfuiZFIHOMiaBw7EsrH8aULw1n4aP1OtIiJsAFj8yf2xXns1zA9jjF155lMlZk/49jFcY1pJPTtHXDMqr2ZLWiPloljIXumIomLc8zd4nB2HxW3+j2GGXcEjc4v1yACzSxeIazBVp5pN9t1Xsps1HCbSmDRWHDXcMyihI7lAbIX3x3ZfHNAP9scOa4xs7UJ677r5+y84ajMckjOPF7EBBtB7si6JJSr+R3Cf2eq6vQM0SxcakLCuvD8kH8Lh72M2spSH4qenY31KFFnZzskpEcMYdzAR1tj56YHJH21PCV1nI17ONwNlk/WK8TeadCXOB9uJLTaj+OpL6UsbkzAMNZmA+8bGLJNNvhdiXPtJ/WL4ilMPZaTEKt0tBXeWZ83nMeRoEV1bHwHxHoimdqFtvd7h/ZZmPf5ewlDVcc+1e88ycEexhzWjWPOfA2ELhKoiDsl8OXHyUbgqg0aul7H3HEQt8RW3FhxwHUkVXWjiBG3ob+z+QXbjmXfnbd8951okc0RGYGuPok2hCgJBvPXTAM+4i9vO2kP+dz8rERw5r9rv2ahwC/ohzvo7/A7JbyWE+e8m40IfDTi4wvRn95XWSgUCoVCoVAoFAqFQuGXgYcVhx8ERt6uS0bwtvGfzEVLlpvzbXGRNbmP5HEkFvUs3nHeblIuIuNQHAmW3H+wQ2L5kYC6dKE5WQTK2oREnpJVUblD9Lzwqrg7/y0jECJivR/Z/VGfZt8fyuZtITbJG75z9AfRIIqDbab+jcRyUuZaaM9tlcZ7HTFPtvh/dy8CCXO09cnmz5Yd7VXlbSRts3KeCIto09041HLukLVrCwn58Axh/WjnR367Qwt1fTb/w/j5fN3JxNR7TgrjdSQYkRTWTQGBFPLkYlv1chKeFHAX/nn7jPVkqlckrOOGlWzs39WXQENqZu3gSRRn7YihSB9Dc+q9LLxpRmB0McVa6kMcc0Cymq0xwgO0BetGe9N6tnZ0K8dCWXMguZI8j9/xlvroe8LzEk0CJry/LJoD59dHhb6MeI0oeb988qfZ3ViIbUvG/KfgiMWH92w2532m7LvxgD6MCuKPxgLihrhbZC/8zoENAWZDavfN75OM+ItJsk1Jd4ibDpRwVjvR7ru8d7ZG/2Z5w9m5Lm/2/Y6gxTZk1+/w9H7O7iGRjc9llvZ2gwb4NEYc+AhP6eMYRoTrj3Mk9vtnoWrt7D1eKBQKhUKhUCgUCoVC4ReHH1vhqwuNr3F+pLy1Gc1QhrpVmORsRE1IqFlIZHlbYQr51WmoL4bCVsKiCPc+ytLQpEqgihC/q+qUQQk48ls4ZWYiVlKLVkhoUGXKbAdf4lXHWiYS1ZOYsPOIr0kEn41G2GLKVTvZtddU052HqR4tvHRGGrawaIXqOr2nqhr1k4UClKHs6bLIHgw3i2VpelX/qg1xcVnVk9g+EUfY4tm8Lp0qrKOCr7XZn92+Z/7TkMkYqpmv7usjgrHyMpLW2iCyQjCD6pevvtoe1ZG+8FWH/lWSRRXGH5GzOK503GEIWfCL4ck3utHA8rHvQ72WATca2EJ1A8VxX4ShEhjs/bnKDoQUUaKoYrKxqmMTxtGWflskvlEuxVDdRyPrq3gP24tjWftcx0Enbxu2OfMhfs8ITPyrcDaDous8hm3Zmb7aJ+aD+VkVtLMcRgL3uuyzlcRsil8L3zzbr6rcMUbBLgi/udkf29C7C6us87QjrYO6WIlBPudieSS4RXyZFG/LandUFGv5RKttNPxh19VHOleAuiyeA7ydFezU1kxES8GbEd4CijS1B23B9BuBC/Zp+OntDNGoxs0UjhpKO9aLqtaRkEw9zVNRfdHqb1ODoxq4rfJMqRzUvxqyWFWJKqy05y2oejPEuaYxkcBziucaW5SCqb5F5b6qDFHpiESc8we0BcMuq93q1xCG3M39kYhUX0oftppKefpUxzO+mzRdVNUejfg817iLamWF+lgvS1+b4Owdcg1/6pnKClWc4tzUiCxEtJGb853ilN/aZpw3g1K4XyuUNtGo/2B/RKuOm96WPagy5kZ8wnOJkTTMV6CaxbGr00w2vu7UtkTrXY5psnQ4zvDZPI7wDg/P7RyDcs05WtuEdajPUBmN4YjvkL1/W1/taEz0Lp70tv6Kv3cHeW1hlY/D+zJuKNCw5uafRsQnMX1b5el7CsPac4PrQkuF39cc1JjofT4/Gq5b+wdfJx2et8wvqCp/Y39f7dP2oBq4UCgUCoVCoVAoFAqFwi8aPzbhq0RGtnH9MyqsSbYquclKvlIgPO8IkkhkwWfG61lZuvai67RoQ+c9PZQhWIbIXKPuI7w0kjvZ2bQx/G5QnLoWYt3ZAn1WDmKS3EbwxrMmkQy+IzVj+x2JEL5rtZPsdGRuRnrdKZYCsb+RvRDqOCp79bsRu+Ttzo5X9MbfkHPxM9adtIkz32TlZuRhXPyMdlmbA0mg6e7CbhPlY5KILNx4VEBniIvkT2k/UsI0HvXqBorProlGlfujyummTZ+ZV+7yfs81LBPIVod4Fi4inj0s4suINmaEc6wrQ2tb4HS7lrVLbc4IaGwPks3u3N7Q2fH5Yn8meEqQJW3+rLKVs/5n3n0Q8KR23mz1FY73BbYLSYib9AZQ8RIhedvG+eWz3JQwDmX4elr+2ZoyiW4gpYxY3kujTeX3keI0nhWqJI1dS0j9SBLh9ex77P8n22LY7jaJxYywsTEUyOAnm7Yy5sR3N58weSL2rrxM4ZqpQWNUcv19oXVpWfhsaXjbJ8VlfA9hndtvvyRUrhHpQqRhvWNf3IUn7uLJ2uij2N8dfrdmv63uVLnx880zargdf+H+R2MkHRvLF4zvda3vrqs+oxCOamAkMBF4Lart8Rmd4ZvT84yxviP4GMtwGyx0Q8TdsxDsj3bZPbWv533qNirc1OcI+kbpmdbR/kKhUCgUCoVCoVAoFAq/WPzYhC/RIGjORsKTfwLSlogWASZwRu4FaRqR9En6ylTSGqG61GsCi/M8CUxR9RouCkYiIK6xGCE3FaZ9Ec5K8Lgzhs9GdC27xNQHYjaTCPFrXyCS1sxWbZMwL3txkS4hMJa/rlU2+M0IVyzHFti0/fPMWhGSN/LpWiO6XiNNX2pXR7hmJDDaekOiycG0hWjFvlXyo/vzdkXP85vKHCWNNZ2ZMJUs/BoEmhzN2jkryH2L7WK2esx8XKDNyF48lzmMm803+JfZE3qRyL0h6cw3mg4XK68+lS8+r6mW30HVqP79eg4/XX2oLN2zRnt/Z+QzqmSZ/eJ5zJsR1hTKjEozvd7ItzcuVEcSO+ZPCd2wAH+jCLeyz0lyITmZEcIfQRXM0Xa0tTVv87RDXq91vm1Wb7Z5QIEKx8+Mu+Pw7cdrse54j4gspLSqz9E+fAZ0DhdZath4rji5kbLIS53DGUIOa/lANBuhG0lpRCSi4/c70jgZl0g035LCsV1HEi47I+41eyTTY7nHsd/bTJh2zueLj7b8OJ8lccpEqJs1bPU1OMpAxkbSWV6XJwpRafdIHi6ShpmHPRL6pM2fT4ni0ZUTCe0t/HQg3WCMO6V0fGbBTvNhjPCB5KWrM4xJJX2x/EAkmh/6FVSpk0R7vXJylcgrv9G2GIUBid5NedmI2vO4NqB9J6goX6/92WECUj30ZXZGPNaJv4dUtR0jDzifBFKz8dxQcHm7M1KUealOUQ0ul8/n5l9fzDoDV8gU1FERquWgKh59omVctMaVvgP1N8FxLBU4zvkW4aQNu/E+2mq/UY+ldD3PvU8Ozp8LQd9+gMarPgn2Yd8rka/lvl5TOR/qQLVv7A8JvnZng+O14BtEctb5mpvCO7ZQKBQKhUKhUCgUCoXCbx1+bMKX2ZQhLATEhQy1KxHJXNq2UMq01kCJ4G8kWphJ3g4rx5GyIiPfQev8XlNrNJ+GCEJSAvH6thaJzB5Y3OE+w1TrOtQkb1lGeGoiGuStkRVgW1xg6rroy4vQxkWhGMJ3LljxkSwYxcVpIr8AZw1YJIuoTzBMoIZJVCIb/OEIAyPIZRAEsX2tjQXGV0K6K/GCoZax/a0ZwWvjY5LPn0JrJPoEIUmiRPLBLuSzmQcE4VZXtkjHbParQlga74pu6FerF4kjJMGgDdu4QcIhhsy+WdDHNBwJLt0UwOxJ8Yx0xHuoumH25DKSafo99IFrC7OFLU/JQ83XwCcvWHS9U0AS5UQqzicv8JsqipF83ogPXt8h1LezJSq3MvIXbbGQvW35IyPttBzsz7e3PR0qhTeCidY9rReJ3JQID+XE7xg6OjzfFrJWJFeBaXrbuILPX0K0gg9k2owRH5B4NQLUSIEbpaS2ty3VoFxzjkWyHcowZave12LATkdYg30S+pbxmVBbiHy47Ej0ig8hbaGllcgxxdpqs967JaejTZNwjqGhGeZIJbAZ8skZf7qMMSBERNzM3lFOWyGrR6MpJXT1s5JgTX8vqF8CWYahoyNcOHEdr9cik3CTmBFe2kL4bWDPf1vEpNYPZK5LR/g5wd15x9l8iMlsDjngRSTLLy6CR1TNDqJdSPw4QxPVN2o//m6S6TtH4D1sLNjGB8HzP8tB27Q74u9AJCjVHXdKaxfO+QbpBiYMJZ+Ql1F1qnliufGdG8tRP+JvTSNNkzlZN2DhJgUkFNOzf+e4vK7VV+kGh0QN7uagtq5pNel5zLIT1tj2OFfd+QjDH6ufMJ36Cf3feG36ICLiE8rU37hCLix5O8Z/sf80DHRsp/1+mX3A7Md27AN8PuwfD5KnLRQKhUKhUCgUCoVCofCLxA+9AuCWkeNitV77ZBSzTBVs1z+7U57ZzuMlImIRT7DiIlu81mhf/AxEw1Yu2Ij1YlrXnowQfoIqMRFZuEK9HttEtFRauBgcw/YqiXUXFjpbvMTvsc4k76dJXLBrO483g/ZJFqYvlnNn512532NHzHtHqn1U/x0JF9sXx5cj52SNG12QfWp79uzGe3j/aaw/lZ+l/+jZfvLlR/UgkPRvvPsrIgttHZ+rO3uexosRiJ/oD0VUcUeoqjbm56QN+v2jNFhupm6+y/MRYjjpGO5ZcnXsp8IoZzbeQMtTQnmRPwlh3ID8SAjgj8156rtA0H9HGWm5Hdp1A6dAdmO6+esPdjOzJ97v0m5zhVfcWr5ICMUNUIjGQGgm7eS22fchYljpDJ99D0RV8VNdCjfPNP8fkd+Qou2/q+OufFMyYlr8LfQBWYrAPvhU/RlJ+8EzhHbFfJ8JLR3H3V393/Pb5GmcR2ThxVFFHvOnv62CGv5pTD+FDI6/Iz6aT59+D37v7yFTxGq/ZH0R2n8XClvTZb9pOGxIiyGcMbRzJHc5PFN8036rp+3lPf3We3rfFwqFQqFQKBQKhUKhUPhF4YdW+LLICh1MZGFh5WhDqalk31RCWohimSGdVcGgxHBYNFF1r15TUnWQuEC6gnoYwzsL5GMkOWzxi1z4ZjvPt3dTvPJrtUMOJiImfg1SgLuQvJ3LF30StG/nKk8SVaQZKPsCGvMKk/e6PEmckbYEPoukT6xP1UlIfmnIWlQyap8gqa2kk6p5RXYlZoT6/0yUrQmxwtMGp8C9OsnRhu8xPfSlKngFVKwSF9hwXIXQnRhSWtOOa0mbZpv56n68av/rRoGozI3EpV6PZxQSjTGl7dKy1f93hJsqODuoxe+IvuhHDQOJ7T+P0YZI9ukYx3Zp+G7tUww1jQrnGC7TvoNPVHlOtBTB0c+IBnWr4hr9fMCi/rd3r7DVsYvl43PQeBgX7b2S5+w8lv1RFYx2a71o69Hm5g5QwOq1aKM9t+cqF5VVqJjNiEuRVGl7i5gmI8BfL08c4bOAwDF6s/FF1Icz3Di/XiNfa6MeCcpboqU+trPKQWV1XeRUuBjuGZV7U6E8VL+zbmyjth39O9OkKl1EKMPUsnOMiYgpnVFJu5WB9oVyMSRzPLvY1MGQjmbEBia491oh4LVNm6/R/1AHMRPrmMzI6WCX2qDplz/aet9iO2afyEuVfUymxHWhhx9CyM6Qv0NRrNd4+SluroL7zt6pUOYTlL1xjpDwftNww9NW5nO1USOAuPR8q2D2KmjwAaaL4a+xHFQeol1P5WjfXte4bz4/djsFnu9IWGrdqqrF6ACIaNdnsRF48+t5EEkjeYdwzxo2ucE7Ed+DkSRFYi/O59nYjkpmbFscH3HuUPv1XYiEvIbFxrGJ7wVUTuN7V9uQ1UdE6VnSqPi2MO+H7+ODaahrk+dnKvwdOarj5TzX+z5GqYnKbgnvjLnhgI+25i07wxrGTn/B7yFtB/grjlMi4vMcz/X1mr9jmm9bbCeG1tb2WbnQR58Jb10oFAqFQqFQKBQKhULhh8cPTfiSkC2oUaNxNi8xsa6ltEZ2Rm/IOshiIjngO9H9grmE830/g0kkObI3i0pnxIGvj5gnyTvv4X1t8ySvhdktjGv7XHlI3j5BF+kiSchMFM+g03ZiPWhjJA0jlPzFkK2ZfbE8LTO2L8v/RII4f8giaiPhCQutt4rbzO5QtzsTV7PhOcKhf7a6IlmatfVpQfip75U4ycIuZ4Qn1mML1nCGJy7IZtA8iT/dWcZp+qTdWXloty7Cok9YF/U/WNi/O5e0C9mEk/k2Kpoy4l3J3WjbJT5to338b4u67DfBYN3x85a3rXY++R8RF+6fSNyY7qN5KJYV+yA7/zazMZ7pC2GVXZsnkShaLZYFocONHIx1xGcOyV1sS0Y4TyIzD/majD3YqOGUpNAfm8I0XJe4QSfLo1CfZSRPwJOy1Z1J+wEisetshHYKPvu0ZoYt/10dWP7Nc251ZCRgRsrOOW+cWQvzUpcZ1ljrOcipjCM5lpFlxpdm72KdR4CoimnUBhfCehJrShxdQMrab5Ck3z5Szmb+j4TjR6SqG9/4HIm/loW6jzbGMMMXEJp3GwJu7UJbAjEaIL2v+R3RmCycspYZFalxs5krOMznVm5m5yQ1sXwLuc+7bVnfahvwnZ79tsB3U3xvmY9wzrwZM67vAnF6ly79HTbHNr6Pcaw4f/Ge7wbbXLaFWMb3Pd6LYa67pRlzTVTCN58uXtPrveX5iD78iVMoFAqFQqFQKBQKhULhl4Efm/BVzMUnYZpKXTGyVRoTs5iwY1PacnLulwLJszuiJJJptthPRGcbRCwsIlv9uugOi0tG3sJimhzHyN9kKHvnfc5ErcyLVLUFarABCcVMLZKVp4iKVSQtr7AIqOoPTaP/oW1a/rw3lLQHKJVubMkIz5l/+Yx92d0TuRvRhUQukp6zDu40FsWzfp8L5qkaF0njO//CgudtObGPov+Sem/JtOyehmF9mwr4FyieTCkECkatm72fx9hs64zRmS47x9gtzkdFMD4jzLvKF/vBCMruVUd3BPcd+fx6kQvvi0ACHBW7eF/DlmcqPSQa9Rk1/xKETAZSwBFP7ElK9EV8pmKdd7ZgXm1XHKuRiFIfRaI6REIw+3ETx5NdGdEWCdL53alZI1nN7H1k5whfUxnI/qxGJJ1lKUc5+l/L1LzYrruNANjWONdg/fOzvL8TdX927XauMOR36lOnfgxzehz/s155vUb62SZU0qbn/+q8mDYzkMXaNjzbF9I4EhRh6tN1pm4KrAeJGz1zF98FFOaYacMd6Yxtt3R4xquOgdfL3onMJwnaQYFsjsQtkoOuWf78YPOTkqPtHNeyUMCq+uW1YWHU3zbbkGy2dAeTCNiJ40vH3EeMkeVZ5JVTVjtSuhHJ5YiuDZbOq+KtPUrGxXESy8K+PkBhvSmBcaNTIPqwD8MZ0NsmnEiQSyd66W+kpbI0v8Zzx3sjd96zqUUvIPmSH4BPhCKGSMY2i6rqb957MfwwN5gHtQ8yQpOW7dflNwUSjXFxTTttPEObtb7sObUIHomim2g/PxsVx9p+bA8370+0h4i2SU/HH/el1kW7tV4ir7B2G0NuFLl6DnRIP/yV9On2vO5k+HoGb+bTQqFQKBQKhUKhUCgUCr8o/NiEL5NXPygpR+uvEXeNLBSy3W9tkbGBgDVi9krKzhb5NX0fNslbW2ftzuvc+wgvzG3Yos3QRXFVGrCSKEIs11q7MyLscPW6c34TxYfd13Pv7sggzaN2mA/6tCEQX/EcQywXw8Bm5KOSXO9jwVHDcJMAmYRlaohWKG+ETqZBYEyFrJG2RyN6fxnRqKQtz1CibkEbQkLrvRhm2fJF3BBYo7693U65CmFnzYbZlkUkz9CnFyxq3hG9qGJ8In1wIwOR9YWFidZyREZoWyKvhMK+Cf3LGhq4i4UZZh0Llkj7MRC8GdCe2Ian8ojWgjXRIoOZ13UMg6ykWRZSU0lNIxqCLW+nTx9JdUeEAUmlJLE+YzheNJz0NUlgutZzGQlWbV/mx/gcKZAYjcQpUSA1xY8lJPkvuKfh2bEsJRXdeJt+v65VBxK80WZIY5Zi+vP0bbf+D0RtNqdAWRiO3/oQSV5Urmt5qBDGsYqhnKOa2UKAX5bHQjyjrRkRrvUDKZidn8zxGXXqbVX1LXVpDMPs/KW+BPIW02QqXGeTEtlIJjeISCFL3YwkqSOg4fnA2QxJQA2bLbQIQiSa3bnJtIiQJyUwMxOd505a6vtPQ2Jr/wVYvrbaRe1M08TzhI3gUbWuvoMyNWlCfH6opI7vNPfsrt8YRr43GCsdnmUl1ZKQsTnZm7yjCJ4tDBOtbVM7osIRyfg7ghbruS4SI6LZbxK6KCcvlbDVd8S3PrjyjeCEd43mu7tHtAh0JJC1b1sgLa0d3d9Hwtw22fXdr73tbZO+5mb1ZdwcoHOgltuv8RttCzMsIwRxDKtuIbqhf5FAvsZmRpcHy9Wwy3jtYD/ee1uTgvTwbmve1miL6ByMv6mDj9EXml+7/jh8f2+bDaDebCOHbgRw7xp4ZubvADcXIDSsOfZ7IJ/teU2O7ygUCoVCoVAoFAqFQqHwy0NGYf1YsIWl788nSFwQObXtVmZG4ERkNijZe0e+zXpd3ZPEZRHia3226m9Ixjvy8ZHgfbBpb8cH5RDtape7exFK4GTk8UcEtSbLQmvepYl+md+RkL0jbPW/DQ++dvVGu7LxBLakdYWx667fjc/P+DQjUrPvWT8RLaXtXZnRVqJ8XEQCM5JKH41rp6h7qF9JWFRA3dmpdWf3nghpRQyHiwu7+D0ZlynR/OsgawuWm/ngaV75qG+f7j2N3ae2xrnipk4l8za74/ew6eepzFt7sNwYFvum/pSQQx9EgnlL+rG/0joElMx3bc7m/7tyQRm/CM7P/7TIbHwKxZz263fkh0Tj7yfea57UDqQ15W24s3E7f/guffYs3tka0/ZPvq/vyo1z4veEN34q272XExLy9rcVzFXZuztDFh49gT0L3wMksu/C7LpK2u4jDMWLn7P8WDbR/bvq1t5ADFs5x33f6QbBj3CXBtv0Uf/elLP1C/rxe8a35r1rU3z/zw0oLgS2swHKiX1xF/Zekt9GWCbN9n62b/EZz9rlVN3f+w+kQqFQKBQKhUKhUCgUCj8qfmyFr1BYaJ8XYRO/P5tsKbpW2N+1WJ+e43swSWsWblnLZiQKpqqXTiYNY8nv11LrNlrnCM8d+HI2I4NNGYTkcLKgiaH/tvOEkQCMZKBbZJI9tJ/zqZKMsDil4V6RfOsyO4A8YYIkJi7OmvKAIXwslBfD4Wb5FL0P5auqhLP7Vyc52kiD4UVBVaakqqgS9f21++OG+B0+8uf5bmQxw3mg8zNfAmMgKLWnCoNltmsqgEdI5FXuFh4Z2r2FmhVZypE4PtT3eu+OpGGez8xclHx/jf5DdaqqZbM+1M/oe1A3p2dgZgR5Nl4xTUru8f4ZQ2TGUOVEqw0Y9hyfAVyU1X7qN2MVfZ6dO2zKRfYkd9w4wUz07X3a1XI/oH9j3ZFEjGFENY9FNAiKWx0fcW7qfZUV+z7Wo/lVLZs8a9RCO1GFq88wjnPnX/CVRm/AeRrtwKZPe7azcIlG6N5Z3kYMx7JFlqK596XmvlFT83kupa8CVc+zTFVY4lnAHMNLz7ZualG0K2sfpnehULufO7B8VEXG9BHMK0y1eGVwHEsbgT1tYtmjKxjRir75gEw3la/N00iW6LyEZVyeIIvkXoBc3doqMIdEUjja5u7rJh8tpxFsDBnjhN/efB2hHBfueDMS8nyWzDUF7AopzHO+dzagwhTPAo7qU1WWM4+IwqztnaFnMcRtJNUaKD415PP1IjqPFbpW36PnOY7V0KjFED5Y3t9trImMPuK3tzEXvF7kFKPDub7/NeqCtR0Ut/E9JTLKQz/i+xdUonzO0L2v11ART19Zu0zVfJF/3kDpnNWvz6xcRLTCDLt+VPUq/h7FEMOqNFelPYYyZ175UC2stiGcKl2W7zCEd1R1Y5s0DDJR3uY53iw0vNky26Kq2NeLqB0rXLIqnrXMh80V3N7WucxGrB4uTVSor+6A67zS6/NrYdtV+RzDhis0BPYFdagimsIcmW04KBQKhUKhUCgUCoVCofCLxI9N+ComSSoHj7WlTku7HAmKeY0vItH1mTsSSdelgBCW7s/kJZp1GVFDLi21odK1s3kdWTDTwfnCqvZ1Kt65GG2kM5qpaWEBUdiTyy7sdaZ8RZuyRXuiuegUvqMD0kXOQDDggnS0Ibt2R/ARDUL1hmDYyoj9Be2UxvcKP+0zzBfsulX6BnKPw+I8po3EcWwLErzujN9ADNnHxsQYGjux274HEk8ar/DR0RwMLaljKms/EqVZvYnNBjyTNubp65lcdYH9LiTpJFGZycIgY/47FQ5e03nk7pm4y3uXLpLZSBzrwnEcJugDJB3teb6xI2xs2K7HPEgIR7+H+cU9U5E4jkAbsvEX67nk3qfz7FlWO9GmeX8jtrM5KZwJzfBZSc00rHEkuu/aMW25jcQQywhk5bY5xW2ISMhrDNEcwnam4Zb18/Z8ddqIbRhvW3hiLSe2A69FwhryIXnM2ZhU8u8B7sxjnS9pJ1VXkrUJR2JdW+KlunMhVY3wwn4Z5JgdBYqkVSwb5gFH0CPZnJ1hDPVlfeHquSN3UIG6RWIAohZJ/Yy4evydcKNyBbJUcONZtB1tjWQ7koW4IS15f4rI/B0EfZepNdGeHp4Ld04sbASy+zimk7Lx2s2Gge1Maw31P/O4zQ54Dq0S4ln74nm+sPEMEc/r9nm7b7/e6/pb4aZN8ezdWIZ0EtE5OwldjWmtDPZjE8uO5whPktr5zYXA9iH+t3DJSsBjyGhElxE2XtuuhOuTMhefC/2O7e5ihPkihMNvg2CDOx84lqlzkZLRH2xWKRQKhUKhUCgUCoVCofDLwS+C8F2EJ9t30cXaV7LIoYusF7mFbzu/NyMIY11IKjMTXTLyoYJLZCwGaR1A0OF5wqgs5tY8qRvIACO2g+2mFGxtKYpVRcNAUqvq+CPExWDmcZ5rJH+0TFUoRiDx9EQA4hm9qhyFs3W9giMhB7A+IiNQt7N3ZYVKVhWuOx9X8xxQl/k4IR8y0kxJ3Iwsjub2SY7gwierkjfUowSt9qtTF5Nrt7MnszNZ6N3CXauKN/rbzilNSC8dgwl5TkT3JBemU/sy0hJDe6ptesZnLCN7ji7IxzzGmJaV+UrHRlOVGi1CG5XAsU0crjmlqs4H01dqAzFtpK89Y0wkfg5JCVOtA21E/6Gq/Ar5te74rKrqFAmn3seZqR8R+eb3dV5tinCe7nYNfCs4PufGD2ZedShpm9WF/RPV8Fp2FyLe5+xIEMZwvFv4UVX6Rn9CG0xZq3PLPPdYrj7Ud0R7uVn7IKyyU/MiUQswRazOl6pwDkR6SghFhPnctW0UbgTMpmaVTsz3P0PUrugDI0rnXCQiS/V8XYRn9oaGL/FmIKI3EjUSLUGdam1HPwi8IzQrbvRA4hI+p6QeKveAMNrOW2YmsTPgwd47ZWCsB88hxXumhkyy3hG+d/Vm5WP7sogGrm9U9RvKuFMuPm1uwHuqFtXfdER+zjX7o2qVPAmJRKwrO7a5+/GlmwCnz5z600jmpH9mmqFOhfr6VOlG2+9UtvE3DfoSz+51c5iWBZFDVmV+bmYG5TUQ0vhsqQ1IYnd8jkJ/aHok/yN0/CJJHyOjYN9hSGUiFxlIZiQQpxh2/Sqj3dhP4Tk0Uh83i4T5NX2HJLbheeeu74l20lyf4Th2C4VCoVAoFAqFQqFQKPxi8WMTvrg2Yovzneg1iZ2wDqShmW3hQz/PhaZtaRPPZkTCKi4MXmPhTs4TyDJa9XfIq2cdHkzU2YeRnovweN7vpvYlGmGB9XO2IN+VbE6UVUZArQU5q58oX7BCX8Xw0Nou9Zfla863G3GH/tPP+v39RRuURECyFu1WKNmhi2OobsZr0R4kipmJX1dCqkK/2HUIsbwt/gOhcrQ9FLMSu9SWAlhDtiKxGdtpn3mlVQLkWkSpC/8cyTb9DEQav8LC69kW6Y7Eb4dFVGiLsy+oKJ0ytXvfpGMN61Gg+pdC/2P9ODYw9C+2AfMS+XGN5K/Wc0dQY15skz7rjYmoeTs0XSdyC/FYDhK0fT7LkcR25CUs+CqxrWnPQBj04DN89jNlrBKuGnZdyV5tZywL5wMbS2ewN1mkt3oS1bCOUQ2DTJSSsrpRAMMf25yANqiSFQlOCB9s6kAgqp3qF8q2hXp7H1wrnf6NczgSkrMMIrJNQ065Om1zmwfiWNS23NRHXYi/vPn0MM4Y33UKSUIwY7sgvRIXGRnKJ/zMmH072ilE1DzxGsY3XsM6rEz13XWZRtKFRlWCPSN3w7txkO/+vv8MZK+OH/VLY7Jww0Q7UTwab+UYLlrEjBkSlK13cO9vUGMCeM55RiwhwWfhumH8q39UHaj12NyUkNGKrO2ZQhTrjnmJ3Bhw6kumQQQ28KOF5g8/ZXkSqCTjudc6jqAo1TDJWrYSjtH/St7G+clCC/epND4CWTl+k1rIaoLfNnNDh7yuRch1WjbEOjTcsIhtEDMCkohc6GUkVDFUckRCeqZpOHxXxHFPNNLyKg83d7gxF0l+LFMVwJly9iOb8b47UoD3cRLaY+NN+ppjJum+RQTQcfh6je+vF9F5rmeo0WiHjkN4zse9uWmHV7QD3RQzNoD4Z8TqR4W1NgHr1DGNfjsOWiGNCoVCoVAoFAqFQqFQKPyScbPC8wNBIMwxqDQYFRuYXBds4056zZ8RSHhfy7xTymLZnXz6hzZsdeqidUr03eSfnx2pHUlGvZblj2l1UQ7/u6s/s21TKyT14n9P5WW+fioXs0ZC7qmsUA739d+GrH3fU8dHbc7I8bsxEPIpIY2E9ab+RTLns/bG/op58fMTWaHlZfYgPlsGLm5/NO7i9bu2P7XtLn0GDauY1R/J1+9B7EMsN/pFkW1OwDzZBoOY7tfB97QvbiyI9+5Uwhl69wv1keSN9yZZvCmtPqN0jcjmNiLrt62OmObuc6aCjvVGfI9S825u+Ewf/jrjODfs3r4IfYae3lEJokJ7U87epLt7Blg3XmybrHYV6mPf36W5e5bNuH7b/kXct9SeFOjXXwcfhLlNn7MMel5vmNvN34jEVqsnplXl40q4rmPddv8TauLs/WPJ8H33yTnso99CaF8kdD/63ab2fo89sfxYjtl4F8khjFc8I/kz5WbAcjCPbji5eZYfy6MwJ8Qw0oin3zyf8QN+77vNLk3Ml/kHVcRY9md8WSgUCoVCoVAoFAqFQuGHx4+t8BVa5+MyE397DTXLVPKmIZaJlmo2I4ZUmasqOVSDzrDNEkOZNprhUWWoIrW+6xq79r+ea+FcF/BUhftEnhH5BX21X1WgcM0tcpmiYt7TMLYRWWhe9APaF23T8qKabAtfCX6OarFsMbPxUkQntgqtPlVVrJ07S+SVv1CPhTxm8fmnEtPUsDOvzPZxDFscFWzMRBTaoOCpFIZ8cjQLIc0x3K6Wab4cbZW3c6lvNU1ruwoY+mJTE8e2ROBZuLgpIoY61jDP9pm9Eh7abuf8vi4fRlmv21nBYVxgXXj9pWpL9oqzYypo9blFqFr8PPyzgW3anjkdw7RUr2dQhpF4RSUSCl0WKZepmLCd17XUm5afdpuYvXIWy7wjBY7k+UYb7ghVtUs/H9N3395H3fod02PZmgchkten/sc2vV7zliqg2KvcgLCVHhTHCFDODj9cM723xdRRWo7WEey0c1VF3PvDVJ+hD7LQuw5GMDVitTXzq6pJRYi+fhlqXQxlHMI5q+LYnQ8770W4s3O1H7TvMdR00j6970KRoq3ggxV6+GXf7V54l0SSV8MV83n458b8w0vd2Hj3O9EeThrLh+9OCYxRMHTe6Nf4/YAFYPjaWZ7gMxcJGLTtPMkUkDOtho4VubzqVmTdl2mLlu9CPy/yyBSD4su3tk7/mw16DIGW85nwuURkakvceKNtPJhE5jMMCmFBm9FXfY1lJVnNZvUHKMVl9tVQN66xG/vbheTFMNaoPg59NfIGBXbMB30wQveGdEQ27pcSmFf7zK+gWDXF73zfqmr3SdHaL0p3OWawEL9ZNAVQpN/e0zY2P+YwXQzXraGaO9E6U1fWZw0Hfb2szWusiy87tqPLMPduY4W+ZxEu7HUyFlSVnOY51rOoY6mP8b2p49FX4dp6Hy3luiOZ3W8K/9miMhxJ+Pq2X/sU2V0oFAqFQqFQKBQKhULhh8ePTfh2GuF5dY1H5vm3jdYZW05VkYdI9kRFWNi+hKjBwh2GZtW/qOLVRftGg7ic63hEUI6SvdOmSATYWcJIWurCH5EPA52RSIz1AqweIIkiYayhYBvTFroaYQtwst8jWiTT0yJTRrhfkpNwkzDCs3Fv1auYJ9YTyTHmVA1ryTOinAgUv0k/6gJzJHTRDoZzepXQimPhhkiyvEaYJm2On7FMvI++ztLH607BJJ7Iu8ufkYLYVtwA4IguJR1gLGX93OeifFYnbgD4SKUdw3jihgVccI22csiXLSRH+7VNSvZielnP+rp+Q5Y+9RmOj0js4biCUPPuXFuc66IqNnuus7GK9iieFLpIpKodiEBA/mUoJZWwTEljtB3IoP2cWnhHaHlIVsT3CiKGQ47jC33wulxfbKG1ob3rPMrDk+axXdGWSMA/pb1D7J+kn7K+M6I0EIZ3NtyeT7zZKhZGFfO6fpr1bucFx/D03NJ6LV2iULw9gzjOU9gmDIkb83Z5nneGQUS9jU1SWf5YH5EnqhUZMauIpBjOk5u9QGZmZWzKyRWG2M4qlT5IX9zMoWVqyOVZppH8GAIXCcJQB57NamS0Pd9B6Uu0NkRw0nd3wHcM+jXZjEE69iOZH31lZxmzJ92JfLmuvmczH8M7ox3als/C/b6ZP1KjyvpYPpf3CwjhG3uYCENI40YxH91BVshjIt8XMeS4sxHQk2cRbUf/3Chq0/PF42+AzD48U7sLWSjoj8rObC0UCoVCoVAoFAqFQqHwi8UPTfiyEqsTSgSOxZO5uKFn+U6ydyRMSK5OY6f8VFs5UvYli+hVIcYl40ismU5ieUBoWTm4yKbKUrUZ63ONBHLNGuoXsVZYvoT0DZDWluo0LlYhWltqGbfwBKRPtBNVverjo7kFuA/rxTaG0KUcy471Z2VYu2dfbCH3AsEq4ZxgVK/q53iGJpDGow5adj71KbOdw8Z2Nl/b2ohnB9vfO5I2I3wj6eLIPtnHSbIJYbM9qzNTHGMoTl1oz86GJFrqp0h8KTLyXdPhmbVKmHKoN447rD+qzNQexBNhrLbGs5Ebr/N3kSx/2kSxbRCQRcBifdf1TJ6+XisPqoe1jZ08aYc2oYoX02R2POFpPN6lU5UoXp+qW3ldQ+mJaRCgMN0WuIGATBe/I3maLKYbdBF+nvPoVK4PSMMGZ3Np4jcRMfUzdRl+0H5K5iRrUxwj8fzZaEdQwhlhF9WP0f/My3eqFEZbKBASSixrOkHycCk0KdSX+hmf5Xg/zk/4PsMIHk9lWlj2cO6t4ntJL9vwsQjnx7GJ8yaSeOqveFYpkT8fOG5myRSYROTPn/UE4hbaOiIp084ZRQVwJBuVhL17fESA8aWhKkeiVj+LbOSg4Jjq8C5HWx3pq/dB5a7PurV55GXmZQcSrU/hkZFAflJLazlAHo5xMv0Q352zPD783Oz8pPkU+O6P/tD7iT2m2n71vR0x+sYdgWrjMfQjltEvH20gI+lRcatAVTqSufGs7OSZdWr36Ku7Z17nht4sWoEQlPHkj+iXu80PmgzGgEjywGS/swqFQqFQKBQKhUKhUCj8VuGHJnzl5LV4jWvPbZE78jYXgpSojSSGrgXNdHa/0VwsE6LOK1SzCFETEpoLxcqL9FX+UBnLOi9Yyw2khil5L38vJX6R7NLQonr9iVgMxAH3vkjYSLZpngYL9yJEBESu3r/CAqn6EgnhSMxiCNyM/ImEK4RvJmYS7QO9BoSChXQ+oJ90Af3cfeQIWiD25Ggj7PLrIu5jwdqUtNx9u5DI2EIayk5garpphxHv2KZZtoWUVl/o95mH0Q5TxZFXZWq90e8aRpAoXxREX0VCSNukQCJVCX4sJ36OIbdtwwOQMo1cv3tyWn0J5SGJOTLt9WM6TIvjBdukyIhhLUfDPGuo6fiMKvR503Q45iMRQzTnNFltxP5DWzMyD/vrgLCZNkba+s5shOVGckfyN9aB4fKVhLwjMJWMzDbF4PdIIIbwzWrnFsYZy0b1KxBoFlIYSENd2LeQwqgaxBC7sx5HcDYm5tPKxpDN5jm77v2R2eIIWg2TDD7aiGILl/7a72HfXdci6fWd+Hp5NXOcpzM4dWGoA0MBa3kYQhUISolzQlQ2aqheDuXR6jO5+iK2kChtPv1WH4B5bLYR92wkhKuqLyEc6wpTHMZPqBPH3xa2GfJoesH3ejYv3G0IwdC3WG/a8gQuVOzhCScgyQSbmYU11u/YpZHcRdIOyToN9/wST9qqghNtzUgxVYsiKX7N6xhyl+h+rMe6tBwsQ9uooXuxLdmGAmcfQM+dDSTrIBzDszX/Ov/HUNuzTLXJiMtMTa35onAWSW8l+zUtlGMq8IyUjIrvJFy2pcNNFJhP+60dy45Ibk+4TRLX5W3PQk3rJkZt5wyjrM7AMPP2zL5e4z2Jvxn5XklrmO8O6Vfuv1mPziVrzmvbfOE2bYTfQ24jBv62KxQKhUKhUCgUCoVCofBbiQcpwg+Au4W7RPj1iDb+cySaI2WSem/qNqVvXAf9XluzOowUeFicTxbKRz1zASksbn8KmbIhU1HdLYA93UvSSGN/Fu9d+uzzU55fBx+U5ezE/4gWOcm8h4uOPtH+fiCm3UJlcrbzh6TN3aaALF9G2Md7qCz/LO7qy/yToYe63cLxJ5CNlTuy9+na7fMs+fPyZMMd3FgKmx3w80dtT8aVI/Q/shH77GasZWraFJl69y4d4i58sJJpsT3R7i1bqDsSmKEOb4u4Mm4X/sFXRvrdlWll60Yk3x4llaPK8pF0QN8kZxI/YpLqWrdD/B7mQGcX1BvP88365q6NT22V4KM8Ubf/bhXCdwDl4W35H82Bgbi97bf+OaV4BG5UcL5Cou2OgMQ5KxKEUSGK5SCZd6tWzebOLFLDJ36K3vURKGtvVfNWzwPZq++Rj+r5XmRkL36GfokhiB2y91BGuGs5HxF/McT20++0p/7JxsxT+s/apZ/12f2sTTHc9fcgbrBI8qdncWt1T/MqKphhnH34Hpl5bsPj/xrzRaFQKBQKhUKhUCgUCoVfLn5oha8uZPM1F0xMRbnUZzxDwkkkEHTBWXkUVdmKLLXvKyHVEhv4gpDOqiSeNgiosUa46FWPU/IGolZgcQfTSWuDnL7Eq9+6LDUp0biHClM8t5fm4iYSehh21+wJJArzUvYdbYTRRWC4V7QDfRgJaSSj9LuGKRWZ6lsZxKcu7KPaOJTr1LpRKTqvcZeVLpBZPJU0crSR7nVNda3azV7Nq37CM0/fX0P9GUOjTh/ze1BEsp7nK0MF2mafq7KwQdvwXFZUDx+NbsNPR3/rmHwCh/Ghfd8ISNa2NkO8ICyrU6vysgX7W9OqrVpHXFRXRS22RZjo7STi6S9V26PqPCOlsN5LlvJWZPTXtUgu82lUMDulUSA/UdWbEQ/YP3rvNcfNFj4yGZ/Zgi+GUde0sQ3Mw09xPKhKzEIZk+8rxdFG21DJq8rgOR8wPrd6HduNwNDJer7s6zU+34Vqnu0zZWprJGoPERCbshFzG4GGCkGd92a5fF0jHCekFRLfP6hi1HNWG+XviEiotxtlGM7xMuyT17CRv7yBPeP5d2pQbFd8rud8hldRGS3T7z5cdTfi1p0HfDDh7ickILbza1UZO9vjyFj1N4aV1nZHJGFrHcFs0SBkD2eLvtfxBc8ThzpvQyo3UHDfEXLaBthQFdXiTjU4wxLzeXg7MhVkrOs8c5WrXuurf4lHf8v7+2wk+A8VkXrP5jTvgi0cLvTFUqyz738imDOaey6tvWpDO8gUttEHWf3sx6GEKUbTmM+JKD0LNo6ppAyzc1MUA2JfWZhqTgjf8N5w4aIPT6Tr/axOHUsH3NO2qN9xrKDC2cJrX7TNW2iXUx7L/jxa3sTGGBmCaA+37Oq96Qc97oIhXQZUYWtd6GsdXxYOOgnPbudea762ovuAmj89O1e76+prvLI4he4Wpv7lJfA6jzEz0dlWFIjzXL/3Vc3eL6K2jhSwNk+7eb7LRS7/7BQKhUKhUCgUCoVCoVD4RePHJnwn8BxcIgqEyAyd3OmeYMVr2fVOZORni9cH0axlS1gpZRF3/JzWY+Q0kLscFwKJBnFMtAgPorUApmklEhK4yAXXkRwkWn+RdMUykKTDcu+AxOnV1xm4scyYPpKLGAJUF/GVHGAmoT7DLbM/bzeao2EQ40I91h2uxbN+BUJvYl36mZGARSIWIFnfYLtFxrm/RE4VbGQa8l9KgKJvbaG5+77aFpZvxn/sl2jfXRq8FjcPEHmV4lM5GoZQZLUtksYYVlzzWH4higFMY4jiK/RR9El8nqw9+zO57H94LrJwkjGtI9nCsxbJ4WhrRkhHotsIAc7tR+IVwyNHYDtwEV8J5Kw/HUkO5EckdIHsw406lvfmXF15vShTVikx4VS/SsbczV8idlbk7dmkGmaU4K/0fawT5aRFCAeKNsc2EJH3cwx7TOSIB/ODhhkWAWJ8J9mcdbz6Pbsfzya2UNPe8K2dkWR36l7197hwT/TO0MdGNAHRkxGk1vZYZuO1QYEmyZL0UXp257TlltCP+UPkAWY28sgRZrpRIBA+LnSvEnJRpZuMh1juyH+sfHgWrSNOeY01Dekc8aDWNF9HMnAjwxeRpoSWO8vZbPbPicwNRqxnZcMmD/MhPudhwwOGz91CVSPi85uRrHdqUS0XyUwl5WK60TB/PUtLtAha7RMlDlcCcu89PAeWw7wU64jj4Naumdw2U/UwDybzv5kXntEtckJCbEebtL5sA8IofKvP5owraRP68O4djfcCcZ+F/N+uRZhSePYj/q6KvmkQ3hn9is+8tuFIIg7E9/O8xszE/WZTQ6FQKBQKhUKhUCgUCoVfFH78bd+dFjGArVFi4BzXjUyFRRRJiE4lh61cGnn1P7tHg4xlgUVGIzXAhklkWFqt4xjpRNMnPWEhpnExNSPM4qJPXLiOC0wM/7W21M9bOLsbcuwJYDPrwmNmX7QdbOKrj/+y/Er6Nv83lmF9FxaeU4L4jvBE+4LdtyQu2hGL6rKf9Yv5JbRXCTUlzO760IjyQD47guGG9I2kI4b9xnIieYZ5UFkb6+vBt1ey0N6TOjI7sa81Hz7DkajBeynRHL63pN+0zBjq84mM/QhIeN4R79EWNxckkQc+U//dhhaE64ee2/qJMlxYWfx8RxB/ZHNb5I5cffV9HL8EZKOSY9LnmZ5Xuii/EcRK5G5zxFRb4SYQnovuEDJ4m0d7ULgGe9UGvcY8lMyaR65u/zmfYFv1OpbLeRhQufpGmBoZqfOjhM/4V+2J/Qw+iXUirA/HlzTN1iYE2HkX6trSKY7DE0sbgaLzUPdtUOj4CfXHOtN+viO81Jb4H5Y/x50r086Uj8p5fzbwbQhqJC5VCYi23qldTRnJe91GjsEmCInvkXn/o/kjG7+qzn6aywXGdXwmlbh7CvF7Fzr4CRYOGcbzNnd0f5/Ik6aZP+OGhSzyxW1eJUmbrzuGWv4oFDP241NY5Q/GGDO7Z8vdj33ifAXvig/Cabs5GG079kgrqa04RiLs90mH78nvmGS8xxDd+D1upombV1xamG81bRa+HOcfTf8UQr9QKBQKhUKhUCgUCoXCLw8/tsL3orFp/hKiJrviFhYG5WAjcZV45d6X8u8gIgnqJV04SRedaZDJRLCIxysMNOZRFY+G9BUhErwfyC2iEYo64jVUaHQmSgFTTsGi09UXUWb+YFgwnnVhGzR7RvaKkIVsRhWJ+WQqBY+2k+lIth7NXTdE4pOIGBRQQ+3TTVWr6lsr74Y8YA1ni23itpRUM5TlIJp9uzmSn0RDcZuQ1jL7xUJOG/FNu4JSxFSFadv1v7jAnd3T62/wONvYALJYyVrMiyTR0XYbsLwexjbWrX0QiJN0kRGJqxbGEhKdOk7judOaz8oDP6AdJM9KWU2/2TSvvYOaTJ8lGOOOlInkrKbHZ9QWa9u6jqFmkXiJJDj6UkMnv669Xkyn5DCWcV2gDG/rmdZ8SMyqnaqqwzGMbcH6McSz3u/dz6vHMULawnyLYYZTQttcsFR/RiQjcTpDHaOychEfYqoowflXySJNq+FGHXkQnoWpslokLJDApjDzYWDVVtGQD1N1KRLSaUhQJCoaW4jO9PlEgJoZ1WIW4tNcDWpYUKSu+WEq7kC1qypWC+E9+0pMpd9JjgPCiYrljXDqy0hOntBW7QsNPT3tuyOaBfNMVR2GpNZ6HUms7u/Nl2GFw6aotoh41w7pJHgWLEFfErn+XH5Pdnr1+Vz3ZupOZ4+qlTOVMob67rKegUxNKUIkF8n79O0xw6TH+cwUwPM5eomzS30rwmuThZJtWcjg+Nzqe4pohUrXcLiznfJNQ1IzvGdec6zjfJfM9fjey9TK6hv1ndskdkMCZiGMiWicLgCq5zju1Yao1kUynRK/9fmu0GfxeJtj9tjHV4c+1mM9ok+cPYF01N+j+BvUjZswP6N/7X3e8mcAz7HVDTjnMZ+p081FY7zphh2wo7F9x/l+U3yr3xBuXj9WPRjuGpXG3Ii+QH/gnI52zbQWeaHBs3AcxAwRBuK55pnyPsyHLmS5hsrHENZ34dKJxpxERNKTf1MUCoVCoVAoFAqFQqFQ+MXhh1b4muqWiDBaHacLdOHeEwmE1zrkefBWSgqnCe9teyItt8XdSAQ+oYcFPvRBJBIx3d33jITK6oukJFEaetnhrh8SoFpW1bN4TRrbf1t7AtEcSdo0Xdb+eC/aHX391Gef6ctIwD+V83T/M/bcAdNnyiO09VYt9sk60ca7kIl3Y1NgIRqvPfVjthiO6Z+e81jP0xyTjbNs3H1U5mfwPeNKkYV4/miO04Xs1tZ/T+nu7s12Sg+qJkvzQXtQSZUQPBuZp+mU5MzUbE4ZN0muD0I3b3V+D1KlXeKLef12jryb84ju/Rieb45zp+UPqkVUG8quZsvrAtXcTIdq64/8dqcyRigB51TNLQkp/BTeFdWO3ZeThYC+xdwQk57Z+4QYHvem3A9hm2YShe5T3TFiCODDkLYx/dX33ySJSvW2Xznx+50/n95BurnjLswzlnuHZL7YbH4IiU1Egfim3Y+ZovSjsp7gfte13b6nzSSaB9Nm/o2RDhCYHsjobV5+ejZcGOgwTu6ehc8quMN4QDLZ/b3rV93wlCh23bOCdn40RhRKpidnID8S3YVCoVAoFAqFQqFQKBR+a/BjK3yJhnpMz+ltNBSaUYnYaah5kRxu876GY75kqFRas7SMykFmy6fXRRVwRERNxvm9WrXA2bzxrFwiUxxzVODZwmWiCMU0GL5XFZYKVE26xfu20qGPzsOnc+Ek52fNp2rZqDSNNidtUgVsuogaz/ZkJjmaV9gi1Lcdzjyc5XInd/YuEZE0cmfh8lRg2nm8kdiysTLUTzLJDL76UklquszWjOyNi6jHsfuiC42BAYvr0M9ytGGvC0mqqtbu8+ACqi6QPykXtR5Vp6ISO9rYIO/BSx01n0PqtMYV2nG0kVbVzVn3anqzB1Sp6BdN26CcrC/VHg1RfJ4jzetFRKcfx5jXnpUwD+g1rCPahf1jyqu+1LzaVxiqVNW+50GkkQKiGhjLQx9MJZE9R6rQRRI22puRylimzk1H8txmpG02L4gsO9SG6ZtIRt4Suxh2+IL5h+ZZoG2VZWd8ggrRlYf9oufyGpk3x7FAPxE5EpOok8gKIyx4hiYq2jAftgUx1WJ8htdwsiHBwiDrGY+Q3Kl4mXc/ajpVw7VG8v4+32E7qYLEi5G9oNTeQmBr+xoTz2cebUDC1fzWCFSMnYibUwJKDMPKbY0XAdvAXqeCm0pJU46rGrctezQPq/1GPu9KOzuf9zXtpUabAq+H/jZSEs7IRdXlVASaYn05bI0dnLOnwtnGnD7zRH5Oz85BDWrxAe9jFzIcMRXHzOdSFaKvVB2PQGI5hjOWy7dR/aBK3ddrzbl4DrH5p413jv1O6eF3CPsztzVtv0jHmj73m9K6i/+hYHU+bJzQecnmEpifo5pXSceL9vJUxRuhykx9HztbwFad29Rv3FYX92vNh3omrobf7uE5xjOdFTGdI32DHTbGyStlw+YOG8/6ewB/Q6jhbSqYRdw53KsuGeNJYDxpSOtNrT3nNYvqcS1le/SnjiGZP/q1X1Vh3dpQ6uI4I7K52eY/VLnP8TDGelBPJ/2g513jNbMNvzt35H3E50H8C/jnXqFQKBQKhUKhUCgUCoWP8UOvAAizWxjmd11IHP/pebyMRAQREcOimRIXM4SkhVLW9att8XPUS7Nu7n3UqzbpWZO8QkebLUQrhKmSyZGc0r+RtCZaoZyJPMlF5EM5x8Vj/KsL1+1YoaaVQNbPkRAS8XXdqT96QlRGEkjT0SRrCdpp5HmbPtLFf6+uizBVb7Q5pkl87fJGm3WBkDuxBJ8gRHZi+lEhw/l9JFmjDQ3szRaccdG40SIKGdKqjXERMS6ox9DOzr44LsIiJF7rYYFX7xN5Qk3bfEE6HUvMnuBEUjrajZsgNH22YUCfHSRBMvIzKq8ckd6XjzMomX+3oSOCmejtbbXDbEj8cFcWzhm4mSCmQwId26VlYMjnSOxGAjk7k1fnLyW40WcP2MjKTOEFPsBwmALk0UiX9GOcRyI5z42oyRamcwthel2rPgxVuinzgNjCtgRCLpKjSphuITqJ/HmrQKyKyCIhRkGrHFVbb2TAahcfMJbt2YLxNvt5C/+swHPstR0JMMTzRuqibxyZ1zY/mN1IIFvTmoWYlrijJBLDGvY4CzkbbLZNVNw8KX40b4MRu7T3PZGRvVZ2bGu2UWCOL7fBAMfcnUJQ+xHnaawPy7otp29t3lSx2RwTEccEnNUqF3zX90xsRyQmMdyyzpFus5r+voHfJE4ZGsh2fCdhm+Z8avMThltuh/lnHZeAPpnjIL5Lo1/0d1n0VTa3EvlNJRiO2MoL/ZKRxDh+1F8cyOmZbm3SoFVf3FBDtPrdjhGBYwdwLsXx7M6GDmQmjgm8lrULEUl1TYu/ofu15nILW38O375ey9ev1xo3Nv5hzOhYzJ5Rbaua2SbBHeYZ28ih5ejGl/QxmnbdPPJWLsxP2781CoVCoVAoFAqFQqFQKPxi8bRk8O8/Go2FQV2rVBIVCVZUSel1R+qse1ZGWCPGslx4Z1SWzv9cmpDffTYSJBBURlQrmREWNB9IR/cf0X3IyTvCMSsjXn+6hte1HqwvCQlpYZiRHMcQpjdhJK2uG2CI55QkTcpwaresbUpuZbboWZbZou1mXLKY+0QQJ7Y+XkcSO5KSpsIN1+8+P9Xdb8aApsfQnTGdkfs3YxF9HccrPjsYFvG6dlIx2haJzpgGSd3M7klcihKaTwQutiU7lza265gLzxdsXOkJqYHlxvqQIH4C2oRkbyRmUTGM/gjlS+IjVy7mxTwPC9FK5sXvdt2NLbQ5kJFEO5GG+XC+jMgILZFBFvRwzqaq9x4UWFZPFgZ4pl9n/QbVc5vPbQyX/VE4XqJ9PED4ZXfeMsApapHsXQm259MrzJ7HIbfmCWxr4/zv9vxUZ6S3NcLeo339FxGvtVBmFnoVyzRTErIwCw2ORHfsOxw/23mpN/Z/gNWPOB/3/dnDMYn9EMkutJEInnOci7vfuHL7LmyLtLS5peXPq6a3vkyINfTR9hsqktTBH0oIbyGO9QdmMq/ofTs2IptjwI67NuGz8tG7+C+CzG9xQ8tnxhmqvLPjRjQN+j+Or1i3IoTP97bHTV0wVmzeuHl/h/O17X6HiBORcCZaUR/ABoxWEO+NsRzmm1jv/O7ecXdzU3i3fQRXJv6+KsK3UCgUCoVCoVAoFAqF3wr80ApfInKqwP7TbE6nESpZITKu6XddT7LFHSJuc7GdJ4HcaRKOM3zgtRaQeIZyYwy7avX0WTRDeiE6mql/Xd2oMNF1RVV7dIHwj+wVk7p4g2GSo5INF3iURGqHT6vlxUVGDb0L7eIuprbFUMqobpVsgUnzqq2TRHIKBWifqm5N2euUK6vtch6jboGy1R4gvmQqHIz4dddopW0HCbZHxwLaGMlsJNhkhgE3Zyy7tjOCsRxUUkZiiciHRkblVLaQF/0vkitR7Z4SZ7gYKKucCxYs3cI1jBEld/VaIyJaPkkJKREfXjymOYK6ENvMSRtReXoe/llQ+0yVGkipxl7tnpWNqlfmMZec5/IfLjCrHyYxzCFv6guiXaGMfsC+15DUROsaqtPceGhrjOp39am2LQstrkDi9rp8HXCPp4JUiXA+Z6js18sThUCmWThPIgtdiSpfwXlFQIUb0WLkAyEXMhOfNSMfQihcEaJv74sE4vlMYHhQLSOWGdWR2zwMajORve6LvILQyJQ9JLV8eycNy6wElKlYwc92TZ9bDBU7yQo6fKhlp84joqioxTxWXxzP1zUiXzCPsT+fVdbyNPTtjBSAil+aeQyqntNnDJ5bUyRHUpzI1L3eeOyLGUr7aHn4bS0HCcuMaLkgXdxkgOMCFYA4FjCUK6g0TU0ZQzM/nTWbPRezLtF+wvx3zztuVoiqZ1SsqwLSqRehXv0cVdzZu6AxUTs9iY6+0XC/ROuZCgr17Rk8eClx8XlTwj1TOU9buDWSFxGqMonIwqCPeubN14ssYgoSkvEdheGIjZhWX8T3G4xNJaK1HAUqZ7V9/Vo+xKgYWzQCXuk19DPaENtI5J8TuUabZx1jDqLla551oepfVcJaoEUW2UMej/fxa7UtjskOvx0s3RhDVgezV99q+zPV7yzbKXPPc+XTvsO+JdrnQQyFvT072HdjbncRLbqEZ2VXT1ukhuvyc2mYm2xODf8O+O5z5AuFQqFQKBQKhUKhUCj8kPixFb7fI3bJWpqRa5qu0bbQZurg71FjKKFEtNS/jizgfDEZ0WFRaFMEyd6OeA1tUxIZF+uflIpgp5G5zOnZj84GbB/RSK/1JAuKfPUVXlnTx/IeoMTvlnZes7LBP0gAL8L2A19sFQdyEPNmii/EkzIvacN35cE678bIR+V95AcljOPitiI+J59RKzk1Xcj7RJbqYihzWFx9+Gwkevcq1mh/CKO76vv4GbhTTz7lSa9/z5h0/ZtsJEB7bueJsJkF72Vtmc9RpoBjnONuxpsSjxjK2BeSKXQTJZpb4BdHgqZ53Zh4eKHg/LFdQ7IElF184+NM9UkfLMjHDTparoDSjGjzM56fq98jYXGrjtVyPpoj5n9IXmCoaT8nrOcmS+/qxHpT9bWv0+W/QzhvM15L6/no/YztiUpgoudxhfeRnPtMvpj2Ln0sV6/Fe5nfRe7LFhj/MTw0J8/7Xb+gCjte1/Jina4tiR8y5XR81rM2xWggjmyM7yV4B7j2h/Hifgck9Sa/HUQSf7Qk5PQ2r/Py/2ZHUE4zP48bzRPbF7A941sZCUFK5PsXbY3kKG4WykKkax6dR3RMZ+MnsSvfRMTLVw3SRZ/2Vd/jPKplAraNUE9zbV+bqT489kDtgnqK7C0UCoVCoVAoFAqFQuG3Bz++wheA6kpV0zIuMhmZ23ISLEDeDqJXJ351dzbvE3G1hagkMjLRyCVUYerfcAbiIJpoKYuVlCKaql5Vv4DyBQnVWL6qHpHcPY6hxntdQ/GKeVrzxHBsN6o/4HzZde4uKBO1L95flheVwHz1obCc7UKyd6l9l22o5jVcF3EHcg76mN9fy34je73qUUzB2r2qGvsk61tVUGK/BiKbiDYl8MgbxkHsN1WqocoH/R8XTvEc3Wxsax5T12A7woIrkuExFKGGTr9k+AnV4I6kmXWqyjYuaEa70U9R3a3tiAuk1zUUOLcL4bi4Lat8vT/VRSnReB6rD1ARu4XUDcqp64JzYfNnxtmqZcQzc10fJwqsqfYxXEGlHMcrji8kAeP4RmUy2tTCM6HpTRk6n3MkmVUFRjTOQozIFqx5KkId1wzqV83zbT5zeoZmPNsxqt30OpEP0xlViFp+46GyNNJB0wHRddGyQYF+TtrmCAYlFKYP+Tz3MyAjARJIS74j77MyDh7tzfqCAumMilpUo2Ha+DwmeV0/Hgm5LX34GYerO5d075+N6LUyePOR2Wdlg9L2ONK2YbtMiQ5jCdWKdmbwa73fnIoU2zkav8g2U/suMmsLna3+iAQVjk+zH9SxeIZwRiThWJT5DkM1o9l90w79bM9cUn6/iGT6I5LCMT/mA5Xv6J/2PL6jrdnhp9e11LD6vm7H1h7RyC23RCH4X9jblRH22dxk7Qx9fcy2v7DM4T9THlMP4bLDO+MIxKhu/tBnD8+Qxecs2iey+lRk+LSBitUU2eFZznylY93snuN5PoNL6avvmmOVLTCGVBWsaubs/aHP3uu1onBQUN8m/jFk4fZtHgjXZUazINrnEHUBnB1v5yDju5oO4vMg0VDQSWQHVZKLzi3azlgXnuOuNuGG0UKhUCgUCoVCoVAoFAq/ePzQhC8H4k6YB3mhoSRdYljQMuUX3L5kkIrMg+BlJmIZISxxYWXmYxF3Nq8jlp+UnUe7v5eRdJheV8Q1pN3ZiN5h4T4S2ZgXFSotLFgiOaRKRy32ri1IBLsFT17kKQ3CUwlcOcICKi4wQqjoFIlfXdo7BSWQ1dJ4W5O2ZKgqPQNBhIRKJL4z8jY7WxXTRwI2+M/XTWOc3oWUJcoXPXUx9K7/onrOkUZh4Vc/R/WzEXBQL4Y4ztRHmYIK06N/NdRpJLSUzCMaC7pKzr8SkjUjE/QvEpLZYq0R7rL61MI2dnINxzqVKI2KpkC4WjmRWNX77vk49vKQvH4ac2YvuefE5sgYqtm1P1GjxfIyG2LdGVl4A3ntZI20ae+REL9KqNzBxnrWxzLm+a3CSSDGa0iguXCd4gmERp4Ac888EH80F/hV5YtETqZwnTbpor6GTnbICItpu1ydmF6JD5NyMiTkiI2jYxIikUiBeu4I5XkT7PdkhoU5ztoVr2VEXSSHsjGTvXv6DPWqaXUDUqOEVD72tlNIp5t3kARE4hUJKRxrGLZc72P74zN/p2pHhWdUd8b3c1au4jwXEUW0jzmrY4brxY0pSuJp+ZFstE1sRNTb3u9mu7YxIWjdO0A3yp3rubbjBK69PzR/DL8dy3wl83kWduauj3C8x/7iMFa7rDDtis3nwT6cRkVIsjkyEt6xvO0ZgbDvtuEgzNfWrvluPRqJ8BgDGGZYx/5HRCSHZ8pIYV7PNaaxjTxtv0a0xsmVbAogWhslXNsPP3dB3m2zmPplfk6jEFjaMWfY3KvPdbYhrx3Tl/u8utTMa0xFJTDfbWAoFAqFQqFQKBQKhUKh8IvCj70CkJFKSuQ+EWmB7LVrmk5kEUDMQ917t/BJtMI0AyEjD+ldfXdQBQUSYLrINvM6tTESls64xA7Mx6CofSLK8Hr0K+SzssAn3Cc5C+Qr0SJZMVT0IzICTfZynR1ZGzPSVv/DvgaiOA1hHUm57DraiLbflRPBHIiKjFD4wG8KHVNPC8VPiG3Ra1m4S0wf8yhssTJRP1nZ3Zej19H2p7ET82btVVJ/I2M/yPvUb1k9ER+FUn8q604J/FngRpnQDolj92nMoro5ksWQ9ongdSGJiTwRBZ/TMp42pDh7ZzmoIsvqQxV6Gn71hhz5TBjZzC6tM6vjKdzqpgCVjcBY58jrMzT9eCW2/kWB76gnqH+T+rdQpfO/D0OlfhYbqQZq48/2+RZm14/7bSxrms+EhcYw458NA/0RdFzejlucu1tuZwwFTPSX0ycfjcHoBySHs2c9hsaOIdWR6M7Cw6Nd22+NMAbie8/Z/NF7wfvS3vF3vnd2fbbfZbclu4Z12O+etvvno/6O72BU/sdyY4huHPe35Td6nA8zxfhWz0P5mV/we4yysGUPZWf9qfbjedOfCMnsykw2MjCvuaNCNxcKhUKhUCgUCoVCoVD4oRW+RlhMJaSFdD6SRRQl8ywvEFEiRMKTBF5ECL86yQGqUFzzQ3KRZ5pAbo0wxEMxbAuEd+QmLsrFdHERZ4bI5ffXXDDie5Xk61pt31QIkD5VMHo/29cuO7FLNEItS/Cr+gIXxvGakapB4UjkFLwWGhn9EYlUqJtlt9n5WpWVUJ6cx6gn9M92rm8kub5n8Tum1bLfzlW2hV8Ni8J3xF52DfsnXsPrGm4Zw3driGZb7KQZJjKUqWljn2Db9Fpm/xUWTtE3VxiPaHcsJ9bNbKGaXbhnVayep88b+xYV8DqnoMpYx89U3crrNcLqzhDpG+KzFYlSVMtG8vu61jjFcrAsTWvPPISWvVO+w3xgm1smCZyOZtkJRVc/kSOOGdoimDcscvNUQqNKSnRxH8PYzvwS20w0ynslJCISpyHcsMhr+Xr2m7xexMc8J1Obis/3Nfzm5hLtB7VZ1WFdiK4XhCFddds2K1VJYjsRSFig/+Ca6BhXVRmkE1UdcyNiWuowp5QbyrX1jltEDaa3fDOsMYZBFp0/0O9qFxG5cNyYJpJKXfaQz6qwnTY5PxJZOFXLE/2p/XNde31EoFCF5ymQ18znCumstquCrwsJKBztY7+WIg/zYvtH4Wu8GBFEq35HRKsfDv98oBqRG6gwMVIFPFOKdpBXoQdFa7/8uPvyZu0WVPaG3xXcGsn7ezjmABS0KfEO9p9BbRvf3RHt8O1C33EbzyHJUAzb76vZzw3Cm5/nsEMuIgoRFfSdgxumcDzqs6yhsYlmeOYwV6mfEXaERPP3rz7syaLC4AY2PNYjjqEsNLe2QYSc0jraieMqa4c+UzjOsB/meBIkf6Mq3T2TMAY0JPl1zWc42RSmkW6i3+LzgXlElm8cITztxn7UPr/6GC+ic2l43vC9qGXOEMw2NtXWmA59o2N+qn5dKPnpb8FnAe3XMNYVtrlQKBQKhUKhUCgUCoXfevzYhO8Ei4zFIVwQ+uxO9ySdIBGi6zq6uP1Jcs9syupw6oobsgxsYVwk1QVUR1IB2Ynl4Lpi9M0VbLizD6/JCqM8SN+QJtqFpGkkiW/q03RGqmS2INGakZDZIh/mRSIsEtRZu2NZuGAabfqIAM7Iqk6+PY0S8ipZ9M7Uur8OMqWSIvPhXbrPPnNZ+mwTxGfLjmGlRRZ5mtn/VBaOizQs6kNerZcoJ37v8jpSPiH5Yhoca0gCGxkQlG1IYqNdkQy+89mT/x2RMeeGO/IyU2chsdcgL5JAWXqELnRnJKKWjb4iug/n+VFYY5nRG+yMeFj4V1uSI8btHuLOhu8Bsy8X2x/mBiNRMTx0FhY0CycK5X9K3Ykbom7HfV8ESsx79/zFIu7eD9u1QLDEuh7y/kVUc5/K+zBuN8JN00dkCsg4NokCcUl72gwutDRsfojvukmES0bOIVLlo7YPxoSScDHUMlGYm6btSADG8L9bm3jdjyGVUfGKv6nuxo4+gxupn8yf37M5LJaDwN8gLfTB3fnInKRXIDl/Nx7Vltjn2fiKNhHRFiIf72Xt+yyiDVkIbX0+nn5jaL0u1Pr8PabkNI6Vbd4KxDOW3ZL0iBihB39f47swtlXT/bpzZaFQKBQKhUKhUCgUCoVfHH5owtdCGr9ggeXgQZLqtfNhkYWI9DxeB1VmXLSp3+jgoSQWITlbnn8jXuNCuxARLNjFNJEYRbJCeJwxq4tIqu4AosbOzUVCx+xvw19IThHtBOgdPlrIVWXtDUnEoCpW1a9dm/luyV7G0MqeTDbzzmOFitZzgfFsV637aF65KzLSxXZNJac0XirjJ0TiEtWlqhbRvjMlqRoPi6lO+KLtC6TlZmty//GcP9lVuETrGqbFBcm42cAWRHlX7WI5cezE607RBmmVFFe1K9oa/YDKbVM+3ozphKy0MmJbzTeqnlukALew4J21Fcu9U92qavhoRD9/G+etnkE1jM8pEob4GVWNod0C55vL6zU+q6oVEQliZpd3jdNmaTjOJ70PhZKqRU39CDaFaAxuUTpTmMVNDiKDGJJkQXzmN7JXFbFdSKa/WBWwWlx2zm88/1HDDLdGQkpSJ+Rtokh1G3aQZMnanEHbh+dEZvhgI4idh/x6jXKgH1SR61TXGVF0RxDrudgczlvOziqdimFXXvys6fryvZ2ri26PfkE/Nl7PgyoSVUWI82T0qVMkNtoINb2OdhLtBBLah9dV3anl3pF0CB03qKzUdqPq19SWUTl5rWcmO7t2O5sYiEDczaBpXTjka1R3p7aP5WvdOH+9ffFtx80cX05QHcNca2lOX26GOH/MZ8F8qOpfJdqiDbgphWddTjkNfawE9DVVxGp/JJBFyMhuhUbf+GhjV/YujH7l5qN0IDSdKlgb77bYnHWtCBk2ZijMkWHM2m+s8Psq++0b7cew3He2x7K/va/3KCKbZ7Reun9nItlrZ4njXIT//jCVLpvCnwjO3dX61V+mzL1cPRaiH99lWn5EzK9mY0SHUv4WCoVCoVAoFAqFQqHwW4MfmvAdpBiTvE1iTxfxRfKwzr0v0ZiuowDByUQktBar5OC1VqqEluafn7l3WIBtfvHNCJBAIMXzZHtQmcDCFp4lbAtRWh+mhdC3ToWsdWBeLE9JYCU/M7XTvG7n8BLtal0l+7SMSTDL20nUO/HVFzGrxHQk4jRva7N89qGcZx6nAEZbRSwkswshre3U8kV8yOeMnENfiBB38sRbXHxMFzgDMQn+oy5Er/cxRrJQywjsH1vETMikO1JTfRjDahuZGhZTs3CRSCBnfNRH4ZvDWEqBfarELpLSqGKN5WoblIC0/Anhmtn1tJiMn5HUjLZAmGeXxoWVTepBu7W950l8yK441bDU0WYkaHWRPyGxjZRtbcxdalcMnQ151DZUdoreiySwLeLDmCOiVF3UmNKF8LtxrHNnVNPFcy4nCyhGrKyzDfnLF+KjEf/005z7DqK3c2wOwXYAwc/X9Pm3d5LXRfKrXxG9v5NcF3Hv64z3NtWvUWWpJGKMzmD3kNAJeWP7ns59dL5Z/WlhkmEzhlePjf7ZwinDZ9f3cVOHe269bUbOxvlaiQ4Mt63jAd+RTuU6/BVt32xB8i1V6U8yC98/Sq448jKQLfg5Eu4pUXtDzriylNhif40ICC9Iw238dokhnTO43yJzPFi499imMO6U2MTQ8cw7CaWkeSTkItmGiOM6I4GxDY2IaG5KyfoT06BPlIjMNlQ5e6Bt+p4+2PepkcHTJ9e1wvbewX4jwVz4EfGWhWDGdup1Cyt97GMvI9djRBIsk3kcKfFEmuPvzKycu2txbrj7faPpdQMP5rmDI4jhWX5L/lkjfYT9V+BmBQ3D38K4sagAc4NEh9/WMG+6OjS/Xso2wGUKagspHzaxxOgLmkZt2DaYjFDyNpfqfNiOIn0LhUKhUCgUCoVCoVD4LcGPTfh2mkpJ/Q6LP9nCnq6NiJB0JsrWJJEQZh5qj05peUbGihBNolg01CetxaGUEHEFJddxISteI8oXbyzcouzXOz2TbR/d04+RaI6kpvMJTZUKO4WsHG0ne5O6UuKQ6FEBHPvepcWysE/wzL3MDsVH4UCf8iJ04ddU2R/U+xmo7+M4deMoWTxEe1zoVvb39HPajgfC+SObP5suPkNILCNs4RNIYrN3qVEtjZ3B+rCwrGmjMjeSsd/TfhyHUYkPBKKr526O0M9P9Rthv6twXb1ox9Nchar6Nue4mR6VoQ64eJ2FEY7KNxx7qk6LBLGefWjNBJIcVIOsqtOvX4jf3kj+g9+1zRby9W2et042psZmn7GBhN+vEdXh/UX87Z1I+lD2vr+PtsI4kNbG5pC7MKtoe3YPiT0kOqMPP0J8ZjnY86QOfoARHE9hX7dMD2mjava+4vtnNCOHY92RGHHELhB8T21Am2O9+jc7tiD6Hst4wlN7L7Bb695Cybb92t1cHtM+hV9Pd/z8/9j7m5jdlm09DHpGzfm+37fW2j/nHF/7XvzvG0txrlGMLSxFSj8gW0DDjUiA3DX0LKKINg2UViQkJGQhpYEQSBFEidKiR4NmJIQxIIKIMTh2cq/t+3PO2Xuv9b1z1qBRNaqeGnPM9/3W2fv8rH3qkb69vm/OmvVfNeceTz1jBHikVme8RsEa1aeRmmf7VRoJxDP4Z08OqDx8T9xDVkBy3+PO1v5Z+YbgOyfMw9f7LM9G+N/pg7vvlmCM+bvqHvxeFyHy6vAoT8Dtoe69oorxYAWOhzE8Qc/eTBj+m/JsP4qU8z59q4+8bo/gvKO1/tr1NzExMTExMTExMTExMTEx8b3BJ034yr5DycUyk0GNeGVSphpHm4rX7D0pdcOpN3LlShBHRh6R8uxzKi6kVVvaoV7eCOdd9PJ9c/d8aKyMRq9Medt9VMOeEYmmctypHG6fqTU2ZxBlIk21qWrNRfKBiHUGLyZziyvQVMoyl8mpxPmTXAnkmp9s3Z1eixFseVubvOGyKcLSSAZCej3MbaYnCFm9A5T6+XTWn5bO97vByjjpQ4gU9+JNqYjRZSMb5pY0ttPcQPv82aAakX9aSKreh0yuGdFX/7a6+L5p7cZo/BzunTy3OBWdT2Mk40qkLBs9vSHV/+3Bfebj2Noz69qvMRnMytnI5bJd8+5Eed4ZSeqJYFP2Rq6TrWyuj2pX4i1LJ2a9oT+lXp+aXlUh63pu4Pd1Y1I55+62uZahqs1zQiNyRZoaFCJF9apnKuETggmFJFYjY5iA5Hluvw4q9VE9bGWoalXeZkBz6YfLBfL2DeT5Cfr2Gfn5Cr0k5GslgBXQtebDB2WqdwfZc1EEZ4W+u0IUwB/7HOmbG/Byg/zBH0FfbtCXl9JP+w5dlq56XJbSZwv6WGU3/7zBn93LsttfjkN7RiKbe1KbP1j6PlqfkXUtrpyH907qxH3gQla3zRGdzj1q27/InXMdh0aoRAdG6JkDmkcIp0BtlTJiH71uRvAZYdIOQYHuu31zIdKpquvbAQRWsZpnjar2G4glSWV/965aIzWer7+vq1cOe7zczvui7f3efa7Vi/LeM4DaXo5bCoz75tn+bf3g0zERHcG7p+WyDuPj0h7aTcSdb6/NP3H7ydlBGVPLJhyVqVzey62/Mw3ePbu915u6mOaqYVC5t4Q9Pbd9p2dsjUIB3ep8JaVvqCrVcV3zXsNzQ139GdY+3outHtHBksGTTZ3f20Zl13WT6Z0avfPvEe1+ntp7lt0cA6WP2F2znwNtv6R28jq0fYLdQp95D2DX6lbHrGN4Gacsbi721dXF9yXtryXruk9ZH1Z1b8OyFK8eqpCPIZAnJiYmJiYmJiYmJiYmJiY+WXzShO/BCESuTsO4ukZkONJDVAsJzPkS2Wtp7pZNpE9xY5li4xXXh589I84iQxfHnuX0Rgza30kKicFt57wftclIW1Yt3VOKnKqaHOkXKSMDA7Nkun+mfInaBRxdPnP6MzLR8vJtZGOicQ8+3ZlCKeqriDD29fL3IkQuIm0u7SdjARyfMcP0a13+NSL6Qfoz95uWRyNRc6/3vTl0ry6W3g463Kt7dFiB3S2fkaK+/hHBuQdqMs7XCOJHBmyDr4tv39l6PMvncPhkVPY2Za65cUYlUvmeL8e7t+XyI1Vv/VsTjqTlI3jFFdDi8aLWVZYEpBXy7h3keoG+fYZeL8jPK/K1knmV0LWYvSoCrGP7JGnZx0WgVhYA2QG9rhAA8tk7yMsN+n6FvrzEMSCBc8LKt6k0YpxH7BrW97N3cW1uZ2Xs6zF77SRqi+GaMbhLPiiEWf19Z91bP50N671n/YGmVmEmBvNI3kaI2t7WvVdVMnmVikePMwX0wSW3W0teNdzqw2R0HtPy2J6R0gzN8bvmbH/k+379Ru7RfV68X9oajvZlJns1V+LwTCWc3d/uXlTXlsaR9a95Z0YKSu9FwHkKODwbvesf9flQn5O5Gu2dPn1EkPO73wh+X2fgnLj2bZA77Qzr7PovUrcHB0f6N9SDd9bHfgfw/ezaZHU5OzjCGL51g/KjfYnLlgfzCDhd38p1fw3adykdcuE62j4mH5HnxMTExMTExMTExMTExMTEJ49PmvDVNRXjkQkEthpPcSVDoKlcM7pB32wtCT2uV2BgkhyQQM4wJkBxD23YdrRYjpav/b47Q6cRP00pwgY8Vx+vLtWuvB3yBMbrbNBjJSuX4QlhD6numGu6Q5nWX+ay2bsG1jH+L8fZbSpcJsPOCGnfnzV/XRLkRoo1zg+IFSKcTyO5gvvN+HlHJUTtHJ4/M1wzYd/KLgRUUWuYWiwgZn17mKAZ5pKrm2+7R6QY94cjfPza7NqRUl9vPi9WaPv6WAzZjGP5UX2HNUWG7uvlMcnMeTfDdInxKnbPDjpoVbSy8rfGbxzSU/u1qnMGcrSSp7rtJTyi9ZPHawkE33Y+JBEcaAHQYu6Kn6ecD+dt9QZGxRH1TXsk1X1YtRmtjfArKt6Tdp0eyjAS0pEVeSRCzX2zblvv76zAdYW8fQv88Avk5wvy22v3UBDxLrmQu5kUWLJXTw2XskfJrn1/W1OZ3iKQy1JcPn/9Hvijn0C/+abE9hXp6l5v7E9OIXdwxZkAVs0NcTorYXkWy7cZ+UtbZEldacv3a13KfZQxXmrZA8FaFWNMmrEiz9rU6m7xo907wLu4br/TWr7nZrqRIXVOLCft82RuU+7uR4W9KXdR52mq9TYCzRMoIp00iuYmt+U1rpst3mfeHcGee3vZq4Z/Z7T3ZB7Xkn8HMDE6jFmuCk8d0/nfW5na+8ArihlZC8lk70mOhZqtb9272Y9va4In6GsdLOYp8vhdFa0Ja/NC5exunuY0vkv9sxFZyATdvqOsFWuz9Pz4d1bn8zvcH7BgsrT1D3+DLAD2qjzn/dvtC5wfx8q1cbm91L458T7h+yHCQPpSG4FSZ1Z7m/oWe19nhkiBzAdO/L7DGMjS/ThPlfZNryy3cvg7XTPNMSoDbl0Pa9598/gyrA7kvUGWBFUdY/3yHsLx332f2PfJIt0nkHkmIPJZ93L99D08MTExMTExMTExMTExMTHxvcInTfgiY/QGGRE7G6tuKulhpAWkkMbVs+GYMUo8Rm8oZSIwMo5eqstYcw9s7ljZIJwEzQKo7roRd96olXUknlShEhOKaif6vatmroMjTQ9wfVli8HYiWap7ZvWqzBPY85b3gRROqbmMFr2TZ6D2MCLmQOTde37P3QgbEYpmvPQkp+XRYp8Ghnbv3tGejVQrnrxd155P5A43a8mfVbHsIlHpd1YARX2QqC/aHGSjstS1kbv779Y/5gZyGfs9InYj4pvXUErxmPk+A8Y1YOVbuS+3ft3PcSao+bqPVeuJzKhsmx8BsdqwLMe8qR7NdbLVFRivGWz/4HyYgOU8BgN2Gup7GkfcxvzMDTUfXqG6CYxwVSg6mdyIM6DcGwz6gbLS9w3f47oaqVHnu2olbWq9i7J3wfKDLwFz3/x0gV5SIXtTJV2sSxapbz8pHFPlswAcvTkAQMLgtUEXgSCVqooAeC6K36cr8k9+Wg4FGPmPpR8eSETO2T49uPMN1qqRveYq14gDS5sDwr7m14gEI0yYfM1ENDS3vkyekftSJqcjorepWKnuTHqy6qy5Sb5DVDWlKL2vfNgFzdDNHToZniFyh92lC5VRr2nkRpXdtzJpaWVx25hEsrLzDuzb6I57qL9TZUZkrH+Gf4/edUyQhfFLEYxf7bPovcXp7FtLXZ9bH/k6NJfGtJ4TAhJLEZKULW8i3+3wQ96P6b3S1MPGZnFlBd8Uh78PLrJdOp4r7lDCgCQAiFzd6TBCEgxupRlWb94j66GSAd7VcOQFxMZF97LuuU2BJ4Z6k9LZHkHtMKI3LYDkQkS3A4ZbrWcQugGUzsZCEtpJDK5rU5jbt7M/cIb+/cyHNtiLwbBnSSd37TtCpLu2bt9H3DfWB7aXLuP7ChjXnu2hfGCHDtU0VW/kop/bufF3S3+fhIddzubEx6iHJyYmJiYmJiYmJiYmJiYmPlnckZ/86kNUB6JWWUkRwYhdMxLZs8kZ+Q8EMGISNqzUg3Rm1PJGyUekaXSfiTX/Ez0TEWjfBlqUu/bz6npH+FnVJZ54933g6qG+/x/10XfVX5HRLQV1jep1pmjxv3vj+5nhO7p3cGPMdTpZVN498YGsPOljX2/++zXrjAlnX0cjnF8DJneNdPWkadD2lsb/y3m9og5DPjY/H4y7qn6cUuds33jwjFqdmMB3eYifb+2WI0bCOnzEq8etHVP2mjIbuZC9sq7Am2fomyfkNxfo0wJdUl/zhoTC89rBE7o1vAek/i30brF5kkqcdqRUFL/XFXq9AM9PkMs6GN2bEtkI8ta/pPQ96ePWh9yfj9DUdVTGkO1ICh9+B0ay4WNgauB7e4/V7QTD/PGukVkZCbzuvRkdOAFGwuhefmd9EM3hw3vnlf1nxBS7f2YV4bcha169Hzrl9SGfdLwX1c33y6N3meGeq+qoPq8lscIDHG6Otn6Xx3O4fT+evdcejLlb14f9/NRV+cnhs4+FV4S/Jv1r5nHkvhno43SWxz2vHPy8r9OjOoRuo19Zh1d966fzfdPfPxvTqF947d+pa3uHDP/vou3g1eHw2Mfu5RMTExMTExMTExMTExMTE58kPmmFr0qN1ZszLN6uQooyd9+7sMQUcilVI383psjW7zXlb1WAyFbIjiF9QADJqUE5MAzWOgCAiHNHyM8Z0eLLM/VCM6aR4pHa2ZUX1ehU3TizGlaZaPAuqzkt0F2iAp3cpTa3vJz6SKL25VzUcam3pSiAnaLLE4CePGL3wXdI3qbM2HeIlr7Ry9rL8+kBYDXFTkAKcNtNLdRUJToqZ1NQdyalWVll2PZxjNmobnmspKy1PmYluY/hmygtH5Tw7rlt/ngXpawY9uOTqA48DltXYDaw+sT6llXCBlZtcd+xUo/nvkhXK6kWhWXOhQS0slrM4L0/59aX8H2R85is3Ge8Ts09dOvH4nKYjbSCvo9ozuX3ZYFEyl0XE3gw4lK5gyvp2n734FhfkeLm2epqaervzRWz6lDXlp1XgmMkLpqrSVaGsjpSUnfvqbQPGhlhSq4hxiqtA3OfXZ9PP/wB9N0b5DfXQsAu9YentwjyU5mvxWVzzVfLHi6qfW+GoonapO5vWn6XvbwjdAEk5XL9smCpe7Z8+QXw/gPwk5+W522eV6V8c/PcVKPa9xvdYmKt9mfpJy1iuZqXsoq19TURCU6BplVxV541JR2NJ+cjbs0whniq1JZDbEuXjlW4aTmMrQ6hDTIga6xUBDC4XfWqOq73uo5qO8tfZKwTH5bhNjdl8nLsV8vLt9F+Z3WwtTlSCnMdzshGXsesyF1921yfJ/+eC97L1V196y/fFm5nRMDx/st1PcPgsrqWM6hYfVk6tuNQf+cpYkmAqfLtuu0z7N5YFYPamuvuVc9n5Du/r7gfvLJ9SWMdEkrMcXtWaK22fkzH/dPqZupU7ifvPQVGDNJcSy4PdrFtzy1L8ZoBjC6fh03Vyqzr2NJbOQIg7aWMLfd8bKzafpWo32i+Resgs/qXvxncGmh1pPXOfZSWso9ye3i8/ft4dcrZg/KW6sbeEax8a9++j3uCpVvQx4b33zq+dpBMt51cktMcqflppBY2ZfnExMTExMTExMTExMTExMT3Hp804etdb2qNwdgI2GQG5DQY83s8NcuIiEuR8LqwEdIrr9g4p87oZgSguZpjt62eSGJCzYx4Z4buCJHyyZF/ym4G02gMlayF7NajYpfjApfYuwju098R0euI25YH/+4JLQ/f/56wbQZ0Ge+bcdDauutxzM4I47N+PcOZYiVS1tnfr1WYnNVxyCu4zu4Io7zZFXJU1h4Yoq38e8IRVt5GYPKb+8HHu45+T6m79WUCsh2okLhcmyfePTQ/70lTI8vaMzTPojaaS+RW19625t6X4Qk1aueBSB0MzLldN+VopFY+qG79dV8fkS589SQww9rl5vSolJZKKB7VSKG6aXHPUZqm7rU6XS+Q5yfomyfo9VLjulfVrdR2pbqvC4oX5b2QuaKlDn1vL0SvSiV3gXaIyAjh1h9Dv5X8GpGxLJDLBXj7Bvrh5RB3uO//RApmN/5nhB+/V7IWcvSMlPVufZlc5DQe9943lqePlRv9HiG6z+UNRGV9D2oublU9WWzp76nhFkcIcxxPdpFtuKdMPos9zO+YKL97BPjZNesTe183V7J6XKv34MlM9x4cyuJDCGf14v2fSc5Blfign/xhHpF4nhoS7s9Jq5cRjK9VMt4j133/cLd4Qs7SRM8OeebmqTi8BxApy33r5w/lf7Z+vXp/iP/r93qXh7XX8rFnPQE/HBajtvnrQ4xvHTwlHMqP4uuewR9W8x8iD/fQYJ6ELs1tLHYc4vpa2f496t0sA53o5QM1HwE7LDbW9xX/n8DrbWJiYmJiYmJiYmJiYmJi4nuPT5rwHQi9hBaPV9gNqZaT84P9yIjOpMPp/qbusriQlt8ZycckmIcnxgZFhXaSyAgzUruWmH9sJNXHBjAj+rie2hW2g5qXicc9FxKayebar03RW+PFMuk7gElUCeL61t+HGL1cT/u9Gdbc+NW6yK7dqM6E3QmZdUp6ekOvxcNdqH9Y5enVkZ6MrKRST8vzxZG8UX5NZaTH+4aDC2ZnhGb4udDUTVZXMgAOLlOdkdjqliv5mZzh15PqB0N9isejrVlnhE6VFLTyzsAKdsvPSF9rXxSXljEY9PMYo9iSEJna05Z5cyBsTS3LxGu9JRZzG24+Wt4na7uRpkQuaAKE4gNbmhY/9+wQSXJ5+nYBY5+xYtkOqQxkT0lbZnuZI7Kksc5AV68tUnknI2udYT/aV3gtGSrB39r9/AT86AfQN1foZQFSQl7TcLBFk3TCNxs5W7IWpbjku9bYvETu5kIC98y0H24RgQogkOGdo0sqRPSSgG2D3m5jnxoa+UZkiSm9Wvupjyy2q61JUIxKTgeAJl8hKtq+Sf3i54p34+xjZTY1bt3HbbyZlI+IZR9rc9gHPIFre3wlEBcpSjvuF4blMbhAZsUiKXKBkbQx1SPXKSKi7tYfMdnH+7i9L9JJOUObZSQ4mURtylDp6ex5od8ZTEx64qe9//Y+rp5E4/ckk1p8eMh+b/mnsc/8PsaH2XydeZ42YtUdvInauMhYPisnuSzfNlOXRmmAPnc4jbV5D9IBaBM1u3YBQKK5aXXwqnKb9837gavb4DHGEX3NQwIrtKO403tMAHKfSB7HNyK52XOI1cfKUnfNnrHx4jZY3du3Sq2zj0cbtaP1iY5lRcQtb8HDfkl5RoeQrL/E7Y38DRR+h+ae555L2ON0gfoDPvdA79YhZi/q+1Vk8L4xrB0g/i6YmJiYmJiYmJiYmJiYmJj43uLTJnylum+uBpdBtenJQCYsNlKMSXcL3UgNI35NGavaDVrs1m1d+j0z1nojpyMuD0YoVtx6N4PAUVnp87d/t72XRcZzlfpMJbRk2zsZEil/mfyle2JqnGpZHpTCSorgOg6eLG6/34Mn3Krr1UZcR4Qhk6XWT4ZGbONIbC5yHIuBrAgMy5HqlPPw7RM5Gmd5Lt1Tk3lY/3O/Z1eHs/71pGvG2E77l/vX0vh+OCPpIxVX1uN4WH6mgDWSds99Dg9Ed6RgonY2d5ZEOG3kspmfsYMclZgd1pR3kYhOiA7krRleiQzxngZEBLrnpnhvPXBQJDk4g3Fz4Yhu9D9VLVO/eXUtE7vsinkwEquOrumJUGb3zg21v1S1k7oB1Pr2zODMSicfE7ESfZ1ELmOo1e1m+sGXkDfP0Et5jcluRCyaW/7mjhlA5KKZNVNC7mJzbVNCBsd6N/q3qINtztWy1+KuP+Vc02hx43nJ0JeXTgpXhZdq92zQ5iQTHLyeEwpxY/OWyT677t0b23jaftfycvuSpWcwaWDKSWB4rq2BQcUXzc00XveEsL9nh3J0R+h6PkLkXhqIib/B3bIE9bujGG59SmRTVD9+P3jClO9HsIMO3o0vH1AaDhARSTW4nDYCzJFmnqS7BJ+BZwcxPEkmCdi3OgcCAhdwRO/SSU0/D5PQO3Lr9fREHecJ1PZr2S/au5BJYiL/sY8k66C2DFyZt3bTtZ3Kbd9S1AYEv5+509UaAmAlt+X+wJy1l5XFBlO+M9nNB0ZsXBLVO3KLba6m2SW4J5qtzREOKlINnqV5zXxnGwv+VnCEKv9u39tDeRi/n/lffnZQs9M1donu0/E6b3XBuO6iPaGlH9+zmnNfl82F+nKy1upBL/9tZ+962wsaUa+HtdLfwQ++vycmJiYmJiYmJiYmJiYmJr4XuGPZ/ETAShNPWJ3YNwb3nAnd1XOEyHh0luYRPEF3ZsS2dK9xweaJq1C1EJcj+ei6+fDsa8oGjsrfSF3xGjzqy0gVBIxG3NfgUX143H2/vhZJ4mf9tUf1zg/K/xji+BGIGD3WMx/TAq8jMiLi1vKwcs7iJUe4NyZnbpxPs+pjrNH6qWk0GrPsrt+B3Mvv0XOSMLiC/1nmoyGIXWx1OvwdqNRYMeTb5K+1ufuaOe7/9mSvJ9afn6CXtcRYt32Il8LJsuD9nsn6dj2q6sm8GCskg5cAXRJkXQuZY22p427t4j4/zAcd1VyHsoAjYfYaPCJ774Hr9DO4Jb2LwdW0a9+9Pvd7tNXxzH20pT3rr9e26ewdF3lOYJI7Is0iN/+SjvlwOyw/4BUE8h18V+9mDda6n2v3yvLfPY/ee74cOnT2EBq8uyLyOSrzbH6cec44y+9jvldei6ic03eye28bYfhdwfeDujnr4et51o4oTvXZWPGz98buzL0z58MHFO7tzTx/ozls13kNexW0d5N/Vl40Zmfu4ScmJiYmJiYmJiYmJiYmJn4t8GkrfFW7Chc4qgNrGnPLrKQUab+LFEWEpqIKSwnYclMNt3ybAoDy36pyzcqN1IwAcNv6cymdG/4sDzYsLWT0jRSpdj9S0XEbmDAxQiIyBIp0dVzNw0hh9a6mjeCJjNLRc3ZNSQG87eNz5DZYNlKBWt2SdLWxKebMFbDlY3VjVbapfE0B4eIXlz5SQNyz9rw4Q6oZLa2OQKycMyypGx0jsiYyhD86iHCo04mRmtvCaSJjJMfy5fLZ5XEwVoe67TrOlXvulSP3zTxv/TVui6UxFYu/79VBQHexXFX9B5eHPOfMbfG2lSqQsdqUrerKiNwmsyLYX2/lV7WOrCuw740gFBHIuhzbT/m0ck11zAdBgEHNa6Pa+mGYHyMR2d32mhF6GftqWUrfsPKzqU9pz2lqPVJFMQFwkb6PAV0Ba/1k/bHvJUbu9Qp9+9zGSVNxg2p7jWxd2WZeHCRrU+7K3j1CSE2XqyeDdg/oe43SO6MuZYjQHlfqL9YNpjZ7fir5//Sr0ibspf/dGjrE9TXl3hnMVSuvd69qFJyTFF7BG6kHDV4965WnppIE4viUrHob3h/sNt+11fIRt/5FilIzu/cGKyO5H7z74KzDOuz94tdWcI3Vi8h9Ttt3BLvPjfrG+tirAKN1kRZglaJa9UhurYiQK2Ac6727uvI1UPqIpPTXrY72PmhzcDn5/nJqaqCo3m1PaQpZOkTgr9l1dk292DzU0uZ7SlRzUZy3sU5DP7g5zAS99cW+0zyjdTqUK4CpWG9a8hret379JchCdfT5cPlA7ZvU54W13/dP1vK8x8HlcXlOX6qHGztowGlYuWpKbZEaDqTOgUE5m3p/lUr3+q1rz9/cJLPbbG4nf4fxPmaK7lYe1dHGxw7fGNTN4ZzqN30ufbBnQLeeP4DuMcENsvXtsD7cOMApdvmAyfBeDNx/W/qsBzf84UEFRrRm6zy7+z6ZmJiYmJiYmJiYmJiYmJj43uDTJnyBkbQL3b8GfzM5uyu5hC7EiBiBZMSoHN22AjiSYk2B4NI2d3lkjGIjq7UhysvqS/UJy4jqMpCutS0JY5/58u5Asg5kMLtxPqZ1zxk3mKSEhotIbE8mexJOtRM5vs2+X0RG98ds7I4M04Z7bqd9/95TMvnn2EAZGdaznhvxuGyLs2rzIVJGWv18ne06k7F2YMDPP0vrxyeaNxGxy2tRdSBQS7lLnNYjqsPQ3mC8BtXWfbWeV6WeKko90RuQu+15Jj/5Phlj1bm8FJEWC7eRvTWtGa49aczPtjwStYVJXm5fNNYneY4Xg3Ha93jum5HZk3ohuQZn+D/pP8v6zTPk+RmaUt+PGul2zHpowp11ajHKdZEe61eL22XZcyV1g/0PlVTmWOt1Peu6QHCFXFao9ZVkHOJQHyqTRuN9I1QsAfVVqG6rB1GMRPJuas2tKsfjPFOGGZkiRHT5d5iByVYf+/YMqqU9TORYfcJ9KeOwJ9j4qyPJ/J59L8bnoU6U7swN//DOd+SUJ583eodHxGhESvHeas+yS2Ff12htMQFoRJp3M83vJyAmxhPNp+zSWx5+fXnC0pcV1dfXhQ+GnKUxRO/vU0Vpju95Qq9dQydwo/b7uqbjfjYcAIhw6hI6yF/zSD6LGxvg2MYc9L0kiNi36QNS0A7FcTJua1SHQxvcQaAc1Y/S3/Nc4A/KnB1iaMrn5TivbU3AH854RZzd4bsyAUnH9kR1ZUQHbB4d9PGHXYyEt/etd5fOB34mJiYmJiYmJiYmJiYmJia+9/h+EL5mxxAyMpHoM3wGQFFojSpdyXlQhjZVl54YLKN8gTGur5GPHGfXymCSzAzBnuSNyN32LBnUTaFRlcct7m1E5KETFk0167spMtIOdah1Dw1ZVC8d4/oOKl1ncNZU1XlnhuBt74rbs3JbXzgVryfMIwLdk5BnxDCrY89IjUjNG7nu5PqcgQ3090h/u7bvMZFq883c+qZqQDRSlsmKe4ccPMngVLMtRm+rPxG+7FLYzx/flyGBQYTrtsGrWTmvVp+gbwdlLz9vc3HbiprUq/JFgHWFvryMxmMmeLw7VhSiWDlOohFuy1i3iEQWI/dZCZZkvA901a4nmy6XoW0DnOr40B+UJqxnED/VyOceC5rmoqkRW0ajW0om4dV7LpAEeX4G3r6Brn0eQKQdaul1xsFdf/MIUYVyyN1gL6rISZAvRembNoVo6XfRul9K3aMqJzTkbX9zfavLablegBdA81bGK+c2Jjx+bT4diDY39uC+X4a+7/2pY+jQUNl/Qjh4EsnaFR7Qyf0ZU0ympasQ7eAN58vP77kStlYlRVPVZUcucR2iGJqwvIK91NJEMTnPDi0wrK8P74w28EeSMNHv1k/+IJLlxXtHAjoJfvIhc0aEeXWfCLryOCjb9xvPX86LyS1PJt2DP+TG+R1ik+ZR6WllROSr1d2r2IHHxGp7H9OYJrQDN0Whit7/WTvZy7GAo2+xqD5Nebpi8DYS4d6BNN/+CC1ecqnmsD6B/m5iMvgeqWplsivlM1LzHviAwtlBFc7f9sG2lvV4n9XC0bpseyGN3XAasU3o8g836+yb7dAmt6fxwcKo/QAGTwDtGu3J7RCLO7CTJN6y+X0b4eyg1cTExMTExMTE9xYPvm/DOE4TExMTExPfD3z6hK9IOVUPFOXioAyo/2b6WwRqVnDV4grU7uVi9G8GNy3qXyVV18Ho7VUth5P12q9Rvo34WhfAvDay++ZGKhNpaeUmKW1Vhdy2Qsxauv2E4IxgxAopPo2ULeQ31cW1WbZCKOplLcSyT+fJUHvG4Ek6rou129IBo/tKJiNTKrEy98CgZSpNNi5yO7K5JOS+dUTvYJAnFYndZ+O9nwd8rbnz1OM9rk8j/fPoWtLwchtJXauzT2ft8O5NK1nZsDlCzZO9UZ9aeaY2pjKESWaul//XE8aW99LXZqsvH4qwPGuZ4kjt5ga5pjuQmA7i6jMQppWEUesXoI89u1o1xS4Z1M0FM7tsHlwnN4P8DlVXL3NbbEZcoBDX1Z1nU/oySWrdQGXI5dLbwv3sf6c2NDfVtlZPlL8DKbs4t5T73l1fpwWDK2EmiS2NJAB7M+BLVTi3mLfkSlUuK/B0hT5fy95djeK6puGAiiigu0Kg5X/1FvPU0E4HIa8J+ZLw8sWC/QLki0Cl9GXaUbbuXZFuQNoUT3+4Ib1kpA9bdR1d0oh299CtH2z+pDqHn56KgvjlBSJrfBiD+7vOgfa7xX71ewe7ymUis7k1JcaXSahE1z256+NHtk6VkWAbFHC0N1p9FtdGJp7autbYE4Ptk01956AK7NtYZnbvCI+spZ6tj+l373mB5z0raqP9hJtpfSSV/LaxMyWjV7XywaOBsCfS1+puhCyHB2CXttwW7gfed9i9c+t/V3cjfz3hNbwT3Tr2hKx/t/F3UnsGR/j52uafWws+bRtTejZyDe1dInMenNfwzZAKMdyIzr3scXuGaBrJ1KxohwOZ4DMFrK+LanH9PBzG2DvBDIwHBXju8PuR+4z/DdW9VIdWbjCGmmtbaP9mt8S871veFzmWzeO4oxO5nnTmdvG30rBe8phvZpfnOrahrTla5+b2GRgPw9h8MHfjQJ8/PO8Xtxby3t9xket6xrbRenV7UPStzt/7pj72B+mA8v5r36Y8Jnt/B+Q07vkTExMTExMTE99rvAPwl3FO+u4A/gGAD7+wGk1MTExMTPwi8ekTvkA3ej0SHWQUcjgihStxrFn6Z4EnWl9zQp4Vt1E9Dy4PA0PPo3IGhdb9ZwaV7msQqTdfUze6rkk6AcJE35l7XSakuD+ifj9TUJ3la32V0Y2HkaL0kPed+lndPlYx4UkFX9fX4LXpfpb6vRZG+trvfB04J7MMTPAyHj33bfBgHQ8qSwOrLn3aQwZ84IBUl1G6oYzUDdtufoQxtu+BDehE+pztAGcxvMu+Fxjic3fNfgpWgQHHPM6u+edbmZzfUuIbLwuRvbRfKNr/0zGHLtoerxcE2/OCfEnYn6SQvatgvwK6lP0r5+LKWW+CvABpA9bnUu/0gfN25BZXn+aTpPRxezETcWe4p/BcUp9bjOYmmf4GxmuvxZlq8x6G2L4ndTtDdFhmIEdfkZ5xphqN+tWTnsCxrVlrXNCfAffa/Zp94NHcurvm7L17ksarMT3BuOD8fROppLMWEu61KtGsZRE/cnf8sYhcRH9bMEn8CLx33Etvfez3mp+1bh8D/411pjiPPBIYXuNK2JPsrTyaV9E76cyd9eCRw93ziPawR/PBp/Hxu8/ABzfu5m8Hpl6Z7t779tvMmYmJiYmJiYmJTwZP9QcAPgPwBc6NhTuALwH8FMDXP/+qTUxMTExM/ILx/SB8gXPilIwyciun+PVpPZB+suXuvtnsNjWN+HierOQCOgEWGZC9gqgZjqX/bsoNVn80ssncu5HawE75pwSVoF72Z5JjOzO5Vq4qxMGdczVkiavLoJ5j5S/3sfVXpLblPrH2evL1YECnfJblMJ6oMTPvlnePtBfp7qGt/62dtW+w7WguthlJANCYsjItV2XMupQ6Hp7DWIa6ecQq3NbHAdHMSl11bbWflVxbcjmeVLf7A4FG49oOVaTi6thcJQ9tSz1vkaJo4TzsvhsH3bairF3Xct+7eeZ5QM83lWlzTV3rpDqS0lZOVXQ3FSuTvNsGTUuLz1ti6qIrZZw6ZlDrmiFaUFU8aPFzB7fRbPgelH96NHYP7l27Unlw1eyVdVUJ1BTFHMPX/uX6UB3EE1WsfNs2Ugrp0A4tlcIBZ4dYTCXFdSBV2kBC1zGUnAuXuyyQt2+6FwI7wLMX18sixR3zQLRqLbtyRlgE+9OCn/yZC/IF0EXw/PsZ6/sy97c3QL4CKoK0Acv74s5Zk+DDlwvWp4Tlm63kl2tMcWuX1d32BpG6f9S5uCxFjaXVpXNTcKXjgYMkwG07jq+Nvan7JAG3l3HMWIU3HGhh9SS5TLZnPKFyFnPZ1PXr2l2UM/GgWsiPSMV2FiNdtbfX5nV04MK8ZlhZfN0rdweSklSS7HY67041SqrzKAYxe3mw39v7LFCyW9qh/nT9HlEaEcqg8WISWk5+5/Kjw2YJtA/Q/Z3mR5LyTcTr337nOoRkG/XbYbycSjSqp4+F61WjNlfIC0C/Fsy18BqtKV8XrjPviZIgKyvu3ZzlfZrrdVYurw9J42EPVvpzv5gaeOgrAYRUqtyX9r3Ac5gP+Ow1vZW3LKXMm5tzUcxd33e2zrhu/hmus+VviGIPR2Qmfyf5+Xc2p9qYBt4D+BuI+5CVxmdk7aCaD9ajJ6EPhyGO+Q/vfXaZb3u/7VGJ9n6bJ+vav1+A7hFhYmJiYmJiYuJ7iT8J4F+iv0++2QCU/wn6VwH8cwD/l59jnSYmJiYmJn45+P4QvsCoGByM54BCIOaa2YgCkUoWVOIQ6O6bzwhCU6oOBM2oqBuIN0vXVLk1j0ZakDGT4YlOT9J5oxSXHeVjfwaKgeFazmPs30Z66xjrNyLYubyIyI1c10XtsHwikp0Rqa7u1QPoRvPBFXPu42NKYHvW3GwPBKSeG+sYuzNwH8CGbBkNypHh0fBIHbLv3TXhrsf0Prax5clz3vc9Ea4tJq4RuPfm3BmhQWU1wtbabPkyacvrqv4tIoXUtPXRireYtw+USFF9uP7NgOyItHCtOmVtTaNw/TiUk3ucSFQyNmE0qFcF46CsHVQ9saLQxshIbh8neMiH24xqXK5zXER6HNxTNZqNQbAuhmR17fk095TvVh+grI+naz1cg96mpPEcWwppLzdtLp5vn1+wv0lNyasJ2K8CyUBeAdmB5RvF/lSupU2hiyCvhRyGArcvrli/2iC3IE619Pl5OHhBhKtqfe8AwzzX3R2kYPejnvBKAJARuqUthYwkSORy1A/lPTWeI3KVD3TYXnZv3z07YM3jey89z5N7ijZOd1Ab8trexz61+yIj2RvNVyNLOU8fp5rb4uHdxXJd5c69qE1Ar4tXEEYqattz2oGzYP4Yobug9zWvf0+geZfA7R7V2brkbL5GhB3Px6jdQUzze/tiA68j+53HzKeL6sfX7inNI7I3glJ7OQbx2ZpsaungWySac/e+k7iuRrZG7WUM/fVg7fr41VbHs7Hy8X59PQ6H2PR4z7fL13X4TuG1+0CR7N/j/jlfT16PQnN0p7xYIUzv91A0PHw/p9GW6edwPQTW3OhPTExMTExMTHzvcAXwZwD8EOf/w+kh9eczAH8RwO8B+PHPpXYTExMTExO/DLz2jfirjWbcRHElbIpMry408lJ7Gtn3mBgCOtFB+eiaDtcOsQr5PtDJRK++tHtMsFqTvJHLSC1HxJ72BeVjP6d15HKtLoFxMMwjKPNA+AE9zrAjrXUprk6V+9DK94Z6b2iLSPmz+nE/+vpxm325/GxEMLNxOrv+jEhTX44n0D2xGbUlGv82n1xbdorR2whVepbvcz2NcDXw37ae7IfL5zrYfUt/1h4/Lzgtk2FKCtCa90FlzG09FCWH9EOe7voQtzByTWr/+vnCRl37yZHlFt3IXw2yYuMzzFciXM5IVaoD9xErhA7tpHLsvu75aDC3+LFnfXEW29STJa0vTggJ4DierFJeSszwrsJ0ayE43MJeDkSB7V3Cy7tUBPMCqAD5gubOWXZgfQ+kvbxLJAOaAF1Lmu1ZcPssIV/rnKx52O/cD2pjKVJinfv3hHvvaF13bSx4zDzpY/3I7wPeS/xz1udeXRftJ2d7j39+p7Hk/WZs1FgHP388kcmk3Rlx88ilbCub8ojcunq1rd/fo/08Uq9GOKu7/fj68KEo6xPf35Fq2X72qlRmhXFIjhLRZr9H5LB911hdI8KSxzUiS8+wJHfgivaGKH9r+2uQ3dhxvn7e+TJqf7Q1N8TgvVP+vUMS1nfWl2dz14+3f08/QuTq+JErZS7T6vnIRbBfP/6H70X1j+ZSlKfB5lV0WJCf8XHHW/3rMxZLrTsdXgABAABJREFUPdrv/AEbW09RHXm/M9i4Rnsf/87vxT2PxHLUPtXy3ZD3eA7Xv9t7pXlX0Nqs8j0h5t5/Er4TExMTExMT3zsIgGcAfx7Aj36G598C+G3cd/88MTExMTHx6eHTVviaEYXVfay8AdDUvJY+KwBz/UrkUjWUsEmkuXJuBqgM2dCNoWZA8e5dgaLoipQCZgSq7qXPiLtGgDa3kcuRvAOa62Vd0tFY5H4v5IWM7ppru3Vdhr8H4sKeyaQmq6RCi9Vrz5JBzZTDko8uolt/m/GM3RlbPqxKZFd2vn0n7cWlqlxvG+CV1U1hoiNB4snhbe/GWqAaZ6ncPVBO7PvYFru2LN3VoT8A4NWjzuXrSBTnft3aZG1h9RQrZ/m5jNi4OBxiuOPit/UfzU2uK4+RVwCzW2d7Tt0cqs80l832bNbmclm3rVZVxrK5PE9yErEkIkVZbGmq4m1Ibyordvk6qHf28dpAHgQKv6YcJwMtGYF1INidEZuNyc3lPKmwTDFkeSVA9h0H982LjHm7djEpaQSwLAlN9VvLG661Pc/caxIZPuTvXEJnpyLjuV8q0MqQ67XkTwcIVCxfKWpbq7eguo0GRLX9nZeED58nbG9qW3fFeiskLwDkFVhvwPKhPKOpELzbO8H+BCzvAUCxPQuuguLOWaSRvs19dK27sLvqOk9bvzk0ontZ+rx3RITqFpDG2t93Ztj3bj0ZNmYJGNwunx4wSWgbnv9/YHNlzCTNQu8RvubJaHMLfHhfu3yA497I7mNZjfiI4GIXtp4MPRC0Nb9c18y2lTStXtq/AVjZ1/qXSF0uw9qybURIL6NCl10VR4cjzog0ryz0a5zdIwO9nJ3Wq1c/ivS+CDwYHNwPA6PL+QhcHrsL9nWI+i+Kgc4Y3tNE0qXc3VJzXnYPKN8LWSFRrFjKU19uZW0urp7sFtmTy3uwl1sa3tvbNUofuNK3upd48kQk+7jIzbvM+H4Y8kFwncpodbC6mgtqpTnO5bR2BvnW9/aoGt9LXpbv2cFCft9EBzhO3mklHe3FBzJbneJ+KVPQu/pmcLnWJp5bPpSH1L4KDzZoL0sVXekbrXP3DZEVqnv/lkxLI371dhu/5V6jMp+YmJiYmJiY+KTwOwB+gG9P1v42gP8KgL8P4OVb5jUxMTExMfHLx/fDAsCGkQPZe5L+7LT7meH7zF2hksGSXQGfqTC9OuAsv0f14SRMhPp/z/KK8hVX/3vlneVJfzdlsW/XYEyuODPy+fq9RqVwULLJ+Ps9hSzDk6CW72tVXsO8/A4UFo/GNLqfXB28cvdMeXuv7KaAy8drj3Cipo/uN0VuCgy4jKg+D6DRWvMqnsiYbL+H6+dOX0bKPA8ulxVKj3BCdEVq3YFsPIuraOnqNeU9LsrH+vJMZXm63x3r3RWtNBZGDlaCUF2f6KDyRfeqvGtxaY6yZ+WLYDjRo4BkdNu8AHlBcfdcf/KlEL+mCG6o6mH1Tb63r7Ii3pSEdc5GJLCVc8wv3R27ptiL4JWD0TpgDITQK+biWRqvTo3cFntChq/fez88InrP6mPP+rXtcS/usAcToRFe8557hEd53Lt/b4+K5pSR8x7+mieCLc09QvFj8KjNr917PxbenfUjROkeEfY+bvYQD/sVa+E1BwLOno3qcIZXHahwc+hj++0s/aO8zoj/dtgteFZPvl9e853JY+MPdEX18OXdw8fMdX6/2lr17bV36M+yT05MTExMTExM/ErjLYB3wN14va/B83eUz8TExMTExK8GPm2Fr7l6rW6W5cPer+c8kr0Wy3QR6HUlQ1C53V7tp4b3VIiFRSAvW1GNMnlY78s9MtHK3JwRnRRtIbFmRnpNYz5Ad5XMKk9WlnL5wBCDVxOxGNaXpCBr7p3R23iAtdcTB+z+15M4A0FTr7HCwsaPVb3mGnVdIC+mzJGxDG4/UMaIXWRq7uUkU8JRnU0NG8W95fax3SwydDflGuV/WUc3fod+C8jhRhQJmptyU2zws4ORvZJIjVjCkXjeSRGyVvVQRJZyXxpRzNdY5euVsUxyRfkCXQltsDnG6ma7viwQjmdtWdkcUW2KSBGn1PUwIjNvR1VqTuPfQ70zsBEha89uG3C5Qq4X6MsNTbk7qP3q36xuM8WcSP9bx3kv61raYmOWdVRyGrnHqiW7fnupqqmlG4lN6RspAve965KYdKjxOXuMYS1tjpTt9iwbnq1upuAaQj+aojB3ApQJfM3QfUdaV8jlUjwRrAm6lHjiCkCvCdhK/6Ytl1i7uXolSIK8JuRLwv4mYXkpee/XSvYCgBi5K9AF2N4I9jeF5E23QiAvH4ASMgBY3yvyItjfXZA+7IU4tr0yo4+5xfS16zaetw267xCVPodut9L3l8tB2duGhMe9zac6nqzaBfqY8zg0154Yr3vPCbZvslIuIkDOiFCrm98bTQELjOpgm6+sfBzWTVXnsYKO8257fOp575Xg2PfeFlPe3SNmbloUn8P8r894BSLnx/UHRlUzl2HplgVVRhjUg7xoeKUg18crbr3C0tKdKe2jPuA23HS8x+/bNqZObcn7GNd5UBlb/y91fThS2PK2sYsQEnzL0RtDDvrI6uRR61+8GlBdrI31vkRKesPBE0Y+3s9ujvGeGH1PnLnLTlLUvdYum59CebTTLwmq1SsGq3RvNrdpPboyDu1gJbNVPK2Ufhnv+fz44Nyy9Lyj9cN9de/gAc8Ha4vvt/ZuDL5JWJWbXHreazkvbpNvH6+VVleNn4m8LNh+zvdSoIA+jBnN73SteZF6eGJiYmJiYmJiYmJiYmJi4nuPT5vwzRlICtnYUNL+Q3+jxO1l8qoRalruGe4ofwXdnt4MZkAjzA5PGlHHeUekrhGNfI0JQaC7AT7LK1LSVoLmLPbucD3vo3I3MkIZoUak8ahyTsfnOR23z66ze2JvkPJEA5N9kcqYCewIh7wiA5yM90ViI2hTagf3eUzsbyNAeD5ESudBrWG/y3E+qMt76Ic0EriN1HT97slYe2Zdj0QuE/geXN5ZntHcsGv7fnfdDYZWrW4sjdRNneQdDjYMWZyQMdHYegNypLCy+0q/5x36AgyuI4FRaRSWtdD4HQ3kasQVz/HInaXVg12aene+98CG8HtqICN1Uidqh73CyOvWJurPM+USuw5t5dRYtnZ9XYF1gVayl106S9a6RGjdLTUuuKC4c14F21PCfi2kbroVwlcU2N4AuhS1rmQgbYpdBaIlnUGyVrfNJf1+TUgf9v7+2LWEAcgZQIJeZHw32WENI3gG0sDGNENdbGqb772vUiEDPNlv43dXCe/W9UFtKCOZGO2ZVm0mH868PnC6YV3QfbvuybKBhHH19O5WB7IxWn80n7nvPZEUpfdle9KlXeOxcPX27ed9xF9redLzfJgiBWuzlTOccuvPNFINx3Ijd8BROY1A1jGdh3eJbPuJ37cisu5ATrv631Uou72R28wHYXi/4f20pm+ELteB27vvoxtrI1vtgAG7P+Y22DWGrbGIJOcyW/p8nEf+4A702MfWLgYfXBjcegewOjSP5m59cHmNDHdp/TvAyFzfRsDF7nX5+fJ5LXsMbpZxPBRhz52tU64rpzdSOboPxN/PnPbsEA3gDrPQdXbLzeUsUVnLmIb/nZiYmJiYmJj45PFDAH8CwJtfdkUmJiYmJiZ+JXHHevYJwFSPu0K23A3v3p5zUJ/iSLxWqCcvhpvVoC9FEaGstDT1ZnZlHQykMv5YGo7By4Sv/R0ZjqI0nLbeV2+0jNJribMbkcNnhPGQl68P1/Hec+x2tilWA3Ix9zoe8s567Ff/4/vA95XlZ25Xmaz1beS/fd2BoxrKI7k8vMKOSdacu7rTp/NtsfKiOTGUHyz7qJ4t5i8bd8047uLjcj5N3UrkklcQkwpYg7k4tLFe02wqUK1FSfs5rcfZfTMkM7l5ts60Emtnqh4ATfW67/cJU3s2u/ljvx/mHSkxfdlBOUNblwWnhAyV157x5IT/3bchShP14T0XpfXv7jaa8rK+RCUrUoLW9akC6FK9Ltg0Oey15VpeEvJFinvmBUW5u9mPIl+kKH61krp7JYMzkHZtP0b2AjWfGicYlQiW+i7qfZTGdcX7gu9D7j+/Vmzec58xceTJHSM1QiIz2PP8gZzhXjrOAY5NbG26lw/X235Y5WfXLC+e3wPR6d4HTHa1NUzvk8i9bKSEPTtAYfeW4HCD4Ww8G8nl1hbXk9scjZm913zdbEy4DC7njPDnfvDl+GtMhHJ5ftw5D/7dvmnseQbPAfubSS7uBx53PwcicD9H412vt/VEeTYX+Gd7ZjS+0YGHep/fVQflbtQWPw+jtefT+r+jvcF+AnfRau9x2muHPPmZ4buGrp0dWgj6JJ7jLn9/QOTemEfPcr/77z8atzbetq6Hdy6T727tmTLZr82ofdzO6P0+tCX4Zhzm8Mn3SVun9Hxaxvv35tLExMTExMTExCeHLwD8ORRXzBMTExMTExMen7bCN/V/tRmyjEjpyYYYj4YMIHeSeIgL6VWNXr1kStdIZQl0Na4ncAdlKLqRiUlDu85kmREHTIhZ3mZUvW2NmNV1OeRXyAkd1bkMqr80o+tIuA0wMnlJPU4vK6etX5OUWJq+TMvP6rrtx34GYnLSExZe4WD9FblCHJQ93hho7XCko7nMtucjYsBcakd1VS3zrbmRdn27BQpXI58BNDe3uyMcrH1ewWu/m6KwqWWKEldzhtgzL7dejlfYWdmW37oO4yuWLxNU3OdrdZ2+bT0dq3pbU6W31663NdOvNWJydcrIfYePyWtpm2E/VA+CSF+3lvdaZ2/Y/xiYIofJElMqcX0478Flq9tX7Dqvz2FNZegWGJu9O9d9B/LeCL2mIra0SSCy9r7bd2CnPVbSSMS1ctw6pPxK/UclnbWJY9mOBz4SmkvSda17yV7cSi/VrbPWPJZUCdcMUSm8bDvwghpvV7B+U/LbL/YsihcEBdavO9l7+YlCV2B7lkb0FnIYePks4enHGYkOGekiwCalOy5rIaZR3iuSEoC9E3isMlzcul+WwwEF8a6MvVrRXwO6Yo8Pidg8ZFf5rc+1v09NAb9nINEcuOcSlQ/iRIchIoI1InJC5ayiLpqWj81N4byZzIpUgV7Fl2ht7yf1sfv8feHVox6+fQNxtbi/Mebnx5HrHpF8puiMFLD2zJJQPpIUut/qfkvpeC9yhwZ0z5CV1r3d88pJD3YLngSQlcIZpJFAZeWnV42zqlEz9CUfD/D4cfb9y+paSdWTNBPA5X5TwEZqZADIW8/X6rw4Ym3pfTgoav0a4Hbxfgpe6/7gh54fGjlTpHuinvMCvVM9eR+thTP31V6VbW1bltIcfyDFP2v/RmuVy428bkRjZXWwQ1jRAaYF/fsFOHdP72Hzhb8RW11pbfP+a/+2+ecOSNl63LaSv31nrcvYVt8G7rt2T473bT+/dwhtYmJiYmJiYmJiYmJiYmLie4Pvx5FvNgAejIE4tFJU28/hehSTNCJH+b4nD++pXL2C8Z4iip+J0kfqH04XkLSD2pdI2VCdG4EJXSOQ77ThrjrYE1bfBmeK14+FJ3vPYttGz937O3r+bF6c9clZm3x7mSx9DTg+L5dDat675Z/V51F7ojwHlUp6/bw86++IoPcE6728zlQxXrFz755XNPlrXtFm6XzfDMpeHdMzHtX5HkztFiqdTwzGEdl0pqz3j752TrH6PspXMB7aKZmXPUrLPlT2qppOgFwJ3bShu3jOhfxdboBsKEpea5YNXSr5pdvYH2IHOyLiGzhXAbp0TXXnnmuKwUiJB5yP7Wv62KvqDNG116hIz549K8+rwD2BZSRORVP2n60jT3Ldq++9e76vfX0f5en7nsfv0Xr8NgSNVygaQf6KNfkqPBpbS8N18PWK6vpafBdt+EgMquBIqeoRuZf298KC7vQHKzW/jWLztf13plhltANIP8M4elfWds3+/VnaePgevlOvqB/OFMteIf2o3PZcUEb0jXp2qONRH7zq/yHy69JNTExMTExMTExMTExMTEx88vi0Fb5GAniyK2NUTlVyV88M8SKFFN60qy0jElTJkB0aa+zHnfxvLm6JCGPF7qUOg3cHamVW4lG2okjQdell3bZeBirBcduo7pXUNVXBskCxH4hYI4IPCmDVQcVr+YiVy/3iFc3ASJhG/X9QSXCfpthY1uoe5AOMCorDM8HfXmHN9U0PyBRWbTejNs0bP4cGA6L0unqFiQZzwV8fYgWSCpyVtJy+xsoVU5D4cWhKGhny62o6pzC+Q8SqKmSjuclq5Sht1FarlymTTQWu3Q2xbhsZ1Ls6ciDHpMREbUpWr+o9Q5tHtMcwYeuVZEApw9qZEiR3ooBjzJa4rDoq5S6kFGJQ+1qfeOy51LcqRFVJUdQqR6rgtBSVL4raW7XMY6n7qW531vdQN46NXJV2+36MH3yP2OL5ar+3gzd1vNalxPC9LMiXYF+oJC6kxOIFOsmra0J6UazvFbd3CXktRO7trWB/A7z5PUW6GZFbydytEMP5AiwvqC6bUd08A+lFkT5018ayG7lc/wWgO3o4gfZuCNYl9y2tDwXGObTv0GWBZPR3jB/fSF1q5IQp7veqlk3AuD/RPPMqU0+CeAW6pbe4pZlUi+Za/IzsYwWmrY269orCdO0KuWDNDfVC3U9EAAQxVL37YIupLNRWcvsrIrQuMZbPivWD2/KipNc9jzFhm4L/ATlm6lpxxLdI95gQjYmV0a51BSuAUVnpvQx48hy0Z/EzXAeeI8tC+9lW+o+Um8WFbi6KdXajDBQVsd9TA3WqmNeKJY114HYxcXZwz8t9ExBsZ0hS1p1XwoYSbxznJ6tzWX3ePCAsva4296za1rYFfQ7Ye4bVm9yW5tWjXr/QerZnonjAdl+zi3uP415jnjVyhmCJ22xp/TWrVxLgRnW41G+TJnhO5XvKz8+Dkt2+f/PY15zG1yfyaML5t/KWcc8AupeE4dre9xP/vvP/H+FjkJuy1/IByru1eWKh8rib+ZvG2qnde0er37c5BDkxMTExMTExMTExMTExMfFJ4dMmfL3yMCIk9qORQ1MaDfFAV2atzgjk82ZC1Bu+GznryCGc1DPK06G5aU50P1Jcct5nimRvdDJyRdKYpyP1Wtxc9/uhPvcI3ej3rACoD326be+kmxm7tr2TIiuRZYbmWpkNx9UYyMQSu1a2a54E5TYNhl5XR58+yodJn3RiqLfnTXHL9bI4vkykRQY8JlRNtWttWBa0mMDNiLwQmVmfDeL0NsO/kctnqPekuo4Gqn3S2jOQea7+PlYw/x2NC681oBjKkyMpqtFzUGdt7JozmLNM4kdGayuruZ9OGBTShn0vs7C2Q63PjcBOqbmVVDuoYfAuU73b09YHZryua3jbnHt6IrjtmXZ9JF3KZUvnCSrbq04IDoak4ABDZPSX8AAAciG7rH8lFdfxWmP3lk7VztEJGskLMRfM2jwXyJaRboK01fYKkGv3yt6fXYh42J8K2Stme18A2QrZe/kqY/mQa9x41HjC0lyNy83IFkBzrcNiRHtEVBL5Ruu1uXKuZJOyu2dWVT9S1vkDDhHRodpJzGF89KTOWghjT2xExJvl48k1qzepfZt7bz+HbdoxERi039Z5P6Riz53MP+9Kdlna300NywcnmATybWGCRWjfvKfA5v516Q4KZuvzqMwUlHOm4mwk6n4cE/93IqKpuVbW3u+eSCMSU9y0lCWNh7EkQczlL8+FCP4Ag5UD9KHwe1XkyriRzXtPYxgU4a4+wzfdfiQUvZrcuxQfXFXX+lteQZpyaKf+7g9FAONYe9e+w35txC6tkzPXyZF7aAbnX9NLRo2rzuU9yMfXi+e/fbv5uh4U+269KTXKE67sVpnHkUnnMESB+06zAw/++97vk37PjL7TooMG3mW2yHH+ethhAQ9VwOLaSDp+d05MTExMTExMTExMTExMTHxv8WlbAJh449+9DZNPt6fyw6SI/R7G+gWOBhs29nmDjJGI0U+rkCP4IkLWlcuK3OZG+eS+Jue6me9zPfJJHp489kTtWVt8/p6Q888yQc59zyTcnjt51Eg4R15xXSNl8Vn9LF3UnmgeNMKW6mfkrCcpfFlG2Bqxkqhf3Tic1Tty/zoQw0G7GtFJadT3YTTvKzHcXKfyPKX8R6I0haR27B641O3Upa/VPyJSD3mdGO2H/HjeOdXX2XONXNgbIWXX21iYWmff+zzw1fNjZ2lyHvpAuU/MwM1ECCnAKPPjmt6DsQGK4Tck+1z/RSQfE+D+x/ch19Xy933HefI6qv1Qntl7nVNq+3rZz3H0RoBKvgranqJJqtK3k7cQkEcD6p69/71fgLwCyTj4VJ4TBdb3GemWxz23znnltShSVM8JGLwVnBFFLTPqR0o7HGS4RwSwu+SoLH53HQg+RzL6wyhRHXislxPC5B5BxqB9a5gnj4gPxPvMkEdYXjCPuc4tI0d2+fuWxh8QOSMw+SDKGUHLBNU90vhMqXrHHWzrl9ccFmA86ifLM9prvDtifyDAlxf14T0S+w6G+WQkPB+i8WkezTd/f1gn55/VquN8Uy0Hh4Z54PMDxvnn32WuXmqEfNSX/LylOSM5I/D+bcR++2aiOXr24/Jqc6UpnV2bXuMquqrhff3DbwtP+r62X6O/uW7+IArgvkfvrLez/0/gck73kZP/ZzmkO98LJiYmJiYmJiYmJiYmJiYmvl/4tBW+KxvRFbIV0k0XGZW9lTgUABxj0ZS+5u65xfSNjG+DclJHws7cQAMYCMfIra5d49P87M6UyU7tLpQBFJfOIsWlc86QPTf3zprQriGZapOeZ2OSFMWccL4BjCwJ669EqGg63m8uBQWn7nyZHIhcP1s5QBm3JKVt69LJYKpLGxNLBzjSzCk2gO6iMsJCBszd1Y9JU8uDlaFGBNo9U+ba3LL7RgRVd8stvSlvqYxRuSpFzakuFrVTrIpXdqQ+7m2+cTmesGKwytdfs/pSXlLzaqQtkbenRC8rHXNds0yUNWN1GXO5Xprr1OYmdNu6cTNyA2kqHa+YM3WRPTeQk6Q4MgN964IyXnJZ+/hJqq5cpbS/GZn3Xt+cgdutto33sgS9bWWsbA6yUlBNGQXap+q8N1enO0bC5VGcV+tf7ou8H68v4/qXdS39bSQtUNZeHvuRy2b12qA6J/fpml3/Wh8kcQrm8h9BnyNa3wGSFbIp0vsNekllrwQAAfKl/Nvj9hZ1+H4tyt58KUkvXylubwX5Cqw7kDatxHDfF0UB2Teg5ZOARaBrKtdyJwaGtlSSQ1WL0tu5sC8ufeU417yqktV/ns9vpO/S90TNfe7kk7VM4zV0ts0xVg2z2jIgXg7KNY9gj5Z1LUTObWskeifnuyoeyPAQv29xOeh7j+U3/O3DMVhbPPF0dtDBEzNMaPrDG6DxLH/0cWnKXTo0Ea1hr5I0l9pWDisT7b6Vy+rGKD5pK2fp69grcm1+mRvgVq9KRO1ohJyYW2Bqh7mOD8eMxqu5xfZz/9AfRBpKKlXftlEZv+VRqVkhi+vfrL1dZ4RbtJ82zw9yqNtD1XOEdQX2HPcVk4x1LAQyku71fSWLU9PywY9Wz+P8aa65fRs82Wm/u7qxB4mwj6trad16qIYW5sSvG86bPAfI6uYG3NqK9iCuN3smoH4bDijwc9n1H/dHu+b2hcG1OpPxOraTvxV7Y2jdUOgNq5u69vnvhUn2TkxMTExMTExMTExMTEz82uDTJnyBA5EJ4GgD9kZVoCqyUA2SNYboqdpQR2OTdxnHBrglHYlIR+IOz0Sn+jlfT/JFaAZrR05xVmY8ZbuPV++6PL1xksu6e90rg60fPhbNPXOAwTjuDG+RcfY15UdtEwFwUgcgJpEBsIpziK/L5Tjy/PC7pcn5NF3YKu8OubXDtdHX606c3UPefmw9MXpWj3tQ139uPEQEWt09qrq2nynuH8GnjxQ4XBcjs0Ug12t3EbquheBuhH0n75qHgayd3NyrgvW2oSmu/fwzQj5ldJ/F+NmMt+wC18O7rjzDYESupBsfhGhzwZHsPlYkOmkxKNBprkiSYqe2uKB1TyleGGpx/Zd+rRJNJd4ukfoZSDftS9nI3h3IV0BXKe6dFxR3z1rvb4UD1KWWoUC61fZkAIn3c2tL0G+1buLXob1bTtxthgcjhndPcLABGMk+IyeiNBGGvSo4MGHX/cGoqB5RnX359xR8rl9OD4q4NH5+DcS584pg9wZiy+p8T5UceQmI3LpG42XPn7l+vdsnryQfH+2FUT6hAjGPv7/m8Ainv6Oc9Aca7rbb5vIZ/HeZne84OzD0SDlqZZ6tsSg5zb3TOe8PC5yM5+nBBV+vmk+L+3u2rvj7yPfl2Zx6VA8gJJ352jDGrc5HAvbgwYDJ6Ud97w9VPEp7ry3R76/Bd0Gqtrmm43gB58StVxXb94acpJmYmJiYmJiYmHD4MYCfIjpMPDExMTEx8Sni0yZ8G5FS/1ykK6rM4LsINAskpU7yZnSjvKnv2BDXTuRHpC6l2YyQ6ZYVNQUlE10WXzPT9XUpquM99/i8KZGxRg5ksXoliFBMXeqPpgS2cqk+A4lrJEpzb6pHApoVogFhLdymrF254AntwajriEvfx3sGlgS9rKUtrJA81A297FYOqS+SYLB8cTpfR4ulaWPqDZ1GQLOy1/cLtaMZfyP1rP1tz65r+XfbYtVxmzdrryurqQMl76Ff2RjIZdiz9b5ue1UeLUcC17cx5zKPbSfxeTO8UrFdpljBTR2lx+dsXGr8Q02U3vqhPXOH4IyIGzMqn5EY1f0yskIuK+R6gXz5BfSyFjWSdGUpgHFs6++y5Ur4FrJM9kr+fv0e+PAB+cOHphYe2p0VyNvRRWqobIv2LL7uD6M4spfVQ/4QAqvibC5tL3289wywQlqqem0HDgb+pryq6etcU7W9uKo6l1SI9XXpfSsCFZAL+l7HfF1KzN4tl1i6GdBLgmTF8o25YS75pBfF+h54/6Merzft5d/LT7W4c1a0mL95LaTu8vWG9LKVONVIZQ8SKeTvjq5S3YvnCHP37NX2ut0gywKxxeMPegCjSg2dYG/rU6TsGY045n3LSIMaJzRy/TsQlBjrEcUEtXGP1okpOWudh7piJGvLvjjmMZBlD9biPTf25Z2Wxr23qZaNqM49TRJg17BOrY9uSvt57VO+39aFtXUr78YFztuFUB8SkeXcCzcCr72LAiLK1tjhW4XeC+3akYgbwPU4I4dSMDYRuZi1loc2Hw7KTspTUOvv8/TtAopa1+a+xcENCLxG3vt+a2rSrffta4hr25PcAQjVqroNDqcN890eo2/Ldn/XY/+YarpkNJCnPd0+1t/mNGjt2Xcaka5eKR8qdD15ykpu1BAHAeFcvHIsXQle85SMvrcDGA4wcd5WrubRc4Cfl/4+MCqZa/8PBPi9fAxWh30/Km09Sc7KXlZM17q08rwCeEfJ2+oiUlz/q5vHli/vzfvW9xBTIdfv5d6+fXzG2pDdO3hiYmJiYmJiYqLiHwP4J7/sSkxMTExMTHxn+LQJX8PChpJO5qnIcEhLtBjkh+spobtxxEhoMJnYsu8E80CK1DQieSB52s+eIdveFGimAlZzTwzK0+oFoKn8mHyxWJdk3G/EL6mzJAf58u9GEO8unVej8t9RHvb7mnr9IsLPE6yMrN1Ft9Xr5dbvsxtnr6JqBjMt7rVzVUSeKVPO6ja4EwbaXGLizZOtZ/lXd+F3VbOOPG+/+zHgPPgaE7Z2n9N6gpaJOys/cHUo69KeVXbPHCnHLbaqbwvVU8wwyXOlpjFSw8hU5QXrCU2vEspaFL8G76bT3JVafTyR5Y3JpoK3MTZiSBVyvSKtK+T5CbhegGVBfvtc5p0RvdxHB7LVxrSTv7oqsFXS6emK9P5S3HS//0CKKCILPREzKKs8sUHjrRndxflOc8wRR1aePxBhadlwbfUz0pHX85LKYRgzprt6q2onep0SXnJ1AWrPLEs5/LFYnckubocOEtphlXQrdVOpatpUiHW9LCWdFkJ3eV/IgLwCy3sg3QBdy7/pVu5pQvOIUNz91mHkvbbuO3LbG7lrLtZVpLpzHsfSoxATeVzT9e9GWgAH4lesf+xeGyMif1ViUtCrT0OvCHV+MQHH7kN576juemXpz4oozjCQmUR+MQnWqkEHaEo9jupcutDXiytvSAN0giyPaZiwLvf2IZ9Q8ej6T/hw1tDX5CYW6H3Me1Idt9DDRgR/YC0ioFr5VsYdQl2SI4uJQL6nLh4OWeHclTcrN+1vobrX/KyvmUxtfW/udq0dvv/9YRZXH3+Q4i48KUjlDfFrU348ZtTnA0mcx/kvoHcXn2Nyc3RAO+RABDK5VR7mLc/JgTymd0I0P5iY57zqfG0xzHnf4LGzNrESGPuQbph/C+L3XusQev/Z4YFap3LgYhnTRSrZwRsCvdd294x3g6009zwZzHOb82zPKsCHr/hbtnRWJ5wtDTC6grZvKn7X27PJtZX/H2JiYmJiYmJiYmJiYmJiYuJ7jTus1ScCJl9RSV02qqmOsXl1vNeejQhRbyA5Iz0ZuzNAWn08yckGnHuGGA2e5Trfq7c3clNaZWMh5a9JBiI5xIHMOrnORqiscZ1dvsoGtZ0McOL685EqJ+pv34eP2vXaPM7GgFzRljY5w+Wj+vg87RCBL9OTSGflBfdbfF3+8W6qs57Pw5SO5efcf6z9Lj6pkVlWnwOJMpCLzvjMqjL+4XuRq1Sr/5khm+uvCqVYvXK9QJ6foJ+/g757g/zZM/R5RX5aC5l4WZAvCbqUH5vLuqbWdl1T+VlKel0W4LJCrxfo8xXy/AysayO/hwMGER4p8bjtZ+QGG8Jf6+J0KGsZ73ky58xF9oO10GL4sptsXktGAgpob0DtM1Ry1uZ5yV8qFyq5ELvmqnm5KZaXGpt3U6RbzQvlPlAJX3t+z0BGdS/t1po1m+czNzUFcx3ohwyCfuquiB/M29Jxfb2YCu/efn425uLG8ZG7UiYsrUz7eYCBjOW9g/qD+yeO92r9fyR77+6zdqDjZM88ENH8e9Q+63+OVetV9OGacISnx6O1eWizG4+zPO8pqR/hjFDm8lv9mNxN499Runtl8vuf3Uuzatbla14kDvej8l5LBFtaTk+/S/Ree1RW7uOm9A566NodwbqISP9Ha5LeA0OZkZI7KOuuO2u7HhHGrOz9GPhDDj7WblPVB+N87wCVHZTa9163YL7r2fdE1M/RvnT2vNVnOBwi43U/J6I5EvXLxMTExMTExMQnjx3AB2C6YJ6YmJiYmAjxSSt8ZcuQlAtxApB70GLcGIhecnsmO6ncvPrK7CL2DBtuRKDXS1FjWX58Oh9o7lqx62jgESnuXxt5xwoL+lDhOlMdZc+DS2excih/ANAlFTfIVmY19jc3z+sC2atr0xYjtBuPBvVaBFOQsbto71pYpPcd9/Ejo+W+Q0zNkqR8v1k/3bZeLx4zVrQxqdzy0OLy1AjH1u8YCcymNnP1s5jMnJbJSxsndnt9uxV1xkoqEVN/euWtPb9t47XocACrL1v/5RpH1qmynCpYVSGmGLE6mPtxrp/rY7leWh4hnIpLPSmz761uB2KHnhGRUVnc+oMIRSJLSlvSGEPWzaWDcsYMupd1UOgc6kV/p7dvIZ+9g372BvliRG0a1uLQM6zoSRZzVpvySNfUVKCyK3DbgcvSiHa5rFguF+hXX0NfXqAvL218D+qxgdglVd/B3WpdA7znZQW0uoleqT/YAJ1Ac26P9wTNfY43l5w7GaWJiGcS19ZCIzM7yaD73sd5SZDLBTkVle/g9VJLvyq6u3tdpZKyRSsuWSBbxvL1DcuPP+DDD77EfpUSq3cV6Apcf1xVtFpIXyOFSxqgqHqLm+enH2ekn7wvRP2akM1t9XBYhQZKBFhQ3Etb223/cEZ45cNJgUI1PBSRaNzTUsZ538v1lsbch9oeygq6pddl2/p4mcJyoXE0F7qsbIugGbhpV7TVskLV7S3Ys3g93m79/V7z4vWmvq+qatd+t/21qYRt7nGauoeKFFfQpqpmN7uhOjJwndwOiCzUh+a+1cYkcps8KLDr+onUjUB3R7ws/f72gCiO3Dz79nB6vu4P0/j61m8k3XP7BrN50xTfvh62927ObXWSJvhscy8JBhVoU5r3PcOHCBBIL/N6Kevqth1Up21MgLLvRPusq/Ohr1ghG+Awd0zN69wul/u9LBtj9jgh6zq0YVDuklq+uDLOQE79G9N7wGC4fgnJ3uhwCVDWuqXjPoi8B3i1q423m/9tTCNX416l68eS54j9fqZeTvkYTpgV3V7pz/VfluI2nF1RDyreWo599+9uYlmaFvogY/iW1c29I6zO7v8tDOG1un627fzg2MTExMTExMTEJ4d/CuCfAfgrAH7wy63KxMTExMTEryA+acJ3UFgBQAI0C0Kz211VQzegHNxwOvJDmHCLyKZIiWv/RqpX+9uTei4vvVd/n8YrLrnMe+SrT8vX7ikFo7ySHO9x3txOxtn1R3X1SmC7FilW+fmz+Lpt/PFx9Yl+9/WKnouIHl+3qL5G1jvXuB6Dgu1MNfpobnyEcq67puzt8O5XD65aDTnH98w4fKZ48qRCy0/L+tWA7KAyAVC8zVTI3rdvoG+eoNdC8OllqTFZ3fwmxWnxUqktnSIV0akZ+HldC+1XS4LqAnl+KmmWBfqTn7R6MfF1UFJFbiUj4pfhSaBojT9SEZ3uI3fILeBwIKFkFeRVXToffFGEe477PddYv+3QzI60KdKu2FH2cnVxEyUDaatjlKURwACQ9krSN7JaysEZy9/ySmgHR9r4+ndV6yMflzlev6f9Y/nkhCEmZ+sHR9rFGfcKn+Xvfw/fA0yA9Wu+3geCa3eHCfy76hGCg09nSt3DvkcHXY77EK1T28/skJGtN2Agq0KFY+RGlst4jaI0a5sqQ5zjs3z83x+rnDT49etI3ohADOsX5Vvn64GgZNjcvqNCHgjP5iqe90U9Ph8ogE/hx++k3T+rUnpwb77r2B6gtOleCAlX/rC+2hw9UVSfqW1P8r57nedc5KqZcce18uFwyx11bkvLhx9eU/czZTnnUed+qNJm5Syr9v26s/70TWCFus3RM0Rj4r/T27ebO5zH3wSP1OYTExMTExMTE58MMorC958DuAH4DSC2Ak9MTExMTPxa4pMmfFHVcqPyUostZC8kmpIasxEtewaWMd7iYGjf9oCAq+UMJG8eVXOMFBhZmPSt9RsUoiLdIO3JUYMWta+VayQvx+ttcYFV23Wtilx+djCsM9kn0pXCnoz0cSZNlQDEhmtT+pqCwVSDLT8Q8e2Us0A3oJnaSrVzEz5eKiuKWTnNbT2NsYrxb1NEsvL1NUZXHjeeK5bXvve5ZnVl1RWTsZYXzS9Tww55VDVsUTbhSBo5srelc/3QSA0jYCz2LsP6Q4u6yMbcjKJSCegek7eMn9R2CJdlz3D+Vl6wpkQEKpVNsxiOQMtfTS0oqPdyn19RTEqKu2gqKmuTiEB++CX0zRPy81rWTxLk1fWrorgGTmUuy2b8WWm3rlIqlMs/4l1aLlIEsXYw4VI9AawL5OkKfP117ce9E4dAiz3KMU/LGJDSzNZOTsdrvFZ4nnKMQFtHTBh7JVPt/5a3J/0utXxnjG+EfsuD4vcy0lL6I6XmJrntde6wT8tQgJwSUs51267zbtuRXorLZovJm7a6rhJqLODi4rnE7lWkTVpayeW9Ilsl3zMgW1+rmtD3t0T7cRZgEUh2ey4AzYq0Smt3qQOt36pO7crRqmQ+HDba0eTPRtKxu1vdR6KS1eDe/W91XyqZxvHMBa6OYzaQVaZwY0LXFLSsuuX8yCWz+vjbw956Fh82IJBtT7V/l+XwjNJBj/aYKT6XVN7XOZe6pnQk5hqxY3XPQxuH8bDfKxleyE4aY8hx/Pg5I7fOSF5PwgHj/OH7Xr35gDgb6ggM9R+Uun4fSEE/LAvw8lIum7LWhobyUVMn2lgAZYybStQrJ7vKu8zh/n5s40axXQ9kL/dhRO5X+MNL9g6Ry9qfDfowesbqM8QEtnSLe/7kkECbr3wgqaYVCPW7HRKr+wa309fNw5TcOUNAKl1SLZf+pXqdHfjwZL77lvDlDkpiq7P9vaQWL344QBAh2MPae2+j+ZkExT0DrxcmdmvanQ7amDqY3SjzNd5rzSuDJ2nbd3Hq9VrcdzHnAVTvDLQ/Msm8b49Dx0xMTExMTExMfJL4hwA+A/AjHA5Svwp3Dt1NTExMTEx8wvi0CV/VYshgRa4Z0o0oM7u5EaxANyx5UteIMCY9so5GFipjUE1kd4+N1P5ZuifZyAV69kzhZASutXFJ9XnphG5WIAfGcCJ/gUJQNUUa19NIFXbtLC4d12tJhSD3xHfrG4xpuW88djKqcr9799iGgfCJDGInz3gCOzvjNN/jthgit8wHdVjuefv4tfycI6A154HYGwhhU7P4etuYcRlMGnN+TEJYeZVAFh5noLtF9oS5J58GRUm9Vw9fHNoLK6L3r7lvFspr+L0RQGQsdeo6hV87RvBoN9wyudX6yamFkyB99g7y/Ax9vvYYvMkOiFBz3P8gqO03CsCI4V3HZ6Q4IS7xZG2tAIpUduNdIbdy2EAvK9IXXwAfPiB/876wFyeHDg6KKHWG6Ux71UAqlMMvh31LUiEJPYHklUxpifebMzegQCc4TLHt1wYbwJMc28yHOqSQT2rKvurSObGSsxEDCboK8grsV/PWUHhSycD1p4q0FRI4r1UdvKPF/k03LQRxqob4RaAXI47cfmVVtjABfj1yc/3BieZ+/jjWB0J8ID3IZasnNZYFI7njiAmOn9kIj6gPj+WfxikNvS5UYhsYSG0AbZ9Tu2bvuROX0ADtPTYfiQge0i8DA9XHg69Z/VR7HYzkdRj32k6q3iU/B5fAxzYdXBv3ZFROX5NcXqRYFfTrzU3xmVKT17kkqG7djS2l8e6OB0XzI/Vo66ett9WIWSZy0zgfRKS4xa15tPdCoKqUE2JreJe4edLaQu54Q0W3a0foseIe2RvA3IgfyuV+8KQ5AHP5LUCbV0JzvBGvPK62dtn9Nx9QsKNX9ZlQrZ6DteOfYYIcNLYMJtIjjwQDgazd7fOgtKY6a80vp+ZOPTzYcKbU5n21zas0/s3P+33wUDdqB6/nnLrL/VxPGEUHq3ye9o7ldx/28v8dPN99GJqztk9MTExMTExMTAD4CQpp/ONfdkUmJiYmJia+U3zaFgDVpvoaXO96e5T/+x55+IgwZLBhJVK3RnDEdHjv3nP2OxuKs4715x/gVe6gB1I3qsuBlLlTVzb0D0QU/c4ESZLjtSjdWb0fGZqjZ4bnHXkLjNesHZ64eG1MNB/TM7pORt9DWu6DaBwsLqhHqNBJcXpP7PLzVoYHE8dRWS4/1SBebs7NOHvXrSZwJGv9vXvr9eReU1iZ2+llgTw/A0+F7C0xdyuZK+2hoW/buYlg7xBFNz6f1c+IYh7vOi/l+Qm4XtAUgOy6OwIZ2wcyrJF5rg5G+D06UMHpI7yS4LA6mQK815uM655EOek3I2zL774+nM7KkKrkLf3dCHwpadIN9WAQYMrtnkmxzdsBG1SipswN0IGIY/muA6xh1N7c2+r7AydrK0J4ACYfDP6vzy8dx5uVjxERFeHMMwLvobwOSY3b5kndH0qM59z3Eq6H/b7vY/qzd+3dd1g+3n+NhwerR3vmSBSewvfjIyJ9SBuMVZB364uAJPYI++6MTOJ6+Doe3s99XAcV9D2czUXfF0yuRWVHWb+mfJpjUViCqKzXrrO7BxmiOpy1yY0x5zGslaxx3wVj5udAOB/497O6tfdMGufInTWhtAcUjyCsvHV5nxG8YcbB5swHXs4Q1ZX3V95zGW3/Derk34NWzr2x8emiA5RTzTsxMTExMTHxa4ErgCd0Q83H4gOA3wPw/jur0cTExMTExK8CPm2FL5OUSYGMHmPX7m3ld1P8NlLmzODLJ/0TqrGmkoJqTIBTPuQMrKZYq/fXpeQ1qAeJWKl11DX1U/tMBrB6k65rAkRTIx2M8ZDb1tLpZQW0uG9u6Sz/6oa6KIOOpObgIjpyLRwRwqzcRe0zK8tcSLOy0Pq5kZVyVFVbvtyHSteBoi5UHcds23rcT1Z1L5XkZDfVZtRfll63fS+qVyNFvbrVIyKLB3e3afxdqG9MpWvjnRLkSqo3T44y2O2yT8tlWd5MFFqbUxo/jXn+RQcfan3Z7XG5Xdw8agIkJWgt4yxGr/J4nrhzZLJSLfbuQipdVRQ3tbV+7D6R1TDNrSGpF1ndVV1sqyrkeoW8fVPI3qdLide7VNL3UlwKN0IQnRDUOt9lK/UV7ap7XQTpA7umRVPjl/3KCOMyTpLQ3S9Kda2eBGnP0G++qUqs0heHWIemCDJl3OJIEs2jusvmqT/sAWBQ7Vp9DbK6/uZ7ThVlqk0mq7WQcgq0a8Vta7Afr2vZz4DqdaCqrZcETTRfK4GbV0Gq6754QwClqWrCrECW4b4mQJeaTlBUvhDoM5AvQF5LmrwIcFmLsndN7bBNixWclNY4UAaZ+jV452jW7rbVu/bnZ2gdDip9rUrPnUgLFjDuvH6qAs6TJ+x2OyI+Lmtfe6xobXVy70S7ZgSsP1jjSN2mbDYy8LZxB5V/bpT3lo9Ex+AyucZUrgSgeREAMLrM5jyG7wm6Hx3MCSBL6u5uba/K25F8YmUhu2du2AEsfe9ipbApAfl5r8I3sEePOoeGPSGKzUttKb/QvKDfm4L0UN4+En9MXtl+E7nj5vcAu7u2bwdWbnvF6HD4IDdSdlBP2zNZD3UfSPCaxretrTEA5jLaFL6spD0jeaPrw9oh1fABdL+7pQ7KqSEKWhxjoHkEOLwnSEE73Ody7JuEDtUV19A1Lbn/bvPe9glGnReq2sfBq9S5btxftmeLm1M+rjiro3l+uAMXqtWbSH/x9jVlbdr3MkdWWgNA8RJo78JbfYa/9bhe1gfsznmxNiy9PF4LHHqB7/lDjYn2hlxd9a9V7m2KYXsXSKLv81ceUJyYmJiYmJiY+GTwlwH8AD874TsxMTExMfH9xKdN+KIab70xLTjxPqjvvAEdGOP5trSBoT4yrnrF6Nnpep+/VKLT5/cKZYhkhS5BOcpkhw7pD3UMCT4ZY2T6ukSuMBvBoTgYt3ksgn4veWrcr9mlj+rs+9QTsI1YVcBkd0xgcn9UF5MtnipfB7qBMFLHRmMWEeRczzMiIbreFMAfoSr2zwzuq0dCqRmuozGP6sVtQWCEB5EMIsPv/v5dNU6SbjC1v3NCG8thXZOx9YGyLjTAryvk+Ql6WUuM1oEABSQF+biq2x4idb5J7vuK4lgnlU4cF9fKCRz/FSlBLyvk6Qr98AGo6kY5G6PI/aS/znVId8YbGOfD4HYy6P+zcqgt7YBD9Ozpc/ZvIWNV3LOquPs/ebY+bRxI4Vti5hbid78IllshIPIq0AWk4EX3lJApPyJtFCgko11PetzrgneDGPmRglYE7zIfh/ZVCkWr9xlsnZ2tHUcwsYrQu/ltz50p24J3dsmHFL3BPJaLuUqmeb0sY365xHzVrIVIZ9fVVlYCsO9jXlEf3unXcP+wKp+Rwq/1AgKgxTflvw1MDlq6kxjZVu4wRkYEucM2ZV+5s37ZTW9AVnJeA3HIdQUG18PhQYGoDREekNzHDBPGkxAfByYhz+o2HFiiWMJ876NBbXpNHofDICExf45XewBgt9NA/866M6a+Do/qFrlOj8IynOXvcUqoAwiVwh6P+obd499T3bd9ldauVwo3l9Lu23rYG6W/H30oBJ7qZ9+oExMTExMTExOfNFYAl192JSYmJiYmJn7l8GkTvlXt0OL0RkaNwWBEhJ9II3lVpJAtGeeGEVMILqmU5wlUM8isPQ5cy2tZOvnIz4hAlwWSuzo3NPCfECQyxB3r9ebrjRgmgkKrglBYRbWdx0kc6mPxei/rsT2aAVOAqDOcses5U04MpCT1u5HgppwWIYUm9QU/4wlfU5a18nNl14iEaEoVp/aq6teSnyPzPWq/6rZ1wtTqYcQxUJTHBq8uC5RvuudCovp4wQYjOvh+SqMqxCupTpSGRTW0A5dLy2M01DtyjQkC6y9LV4mUU6MxqxT3vZBclj5TPOuWXKBVpdfm5iJQY1r3vRtVdzcfgdFI7I2vVd3b2nm9QN8+F7J3IbJf65raQcp69Bi+CUAWqFG6uRy4aMZ/m3LofcfK0DaHLB5szhhcEl9W4M0z8NXXRfmYtbBL1veGw8GREwL80Ac6Gr0NpIob871jFDfVllNyNZAyjvcPqeTrQHKVG6VIqQStUxs3lfWuJekqw3Wxd8Sude9CVeqisKsCpLo08wWQLFheMrY3qSp+rc319ySl3rsCax9DrapGBZBe+hpsHhN4fwr3kUrcLXzN7WmAOwxCY3bPJakn/rOixaD0qjLgQATyc9G61n2P96jd1f/MQwKrwPcdelCblgMl8uZNjZ289L12re+hfS8q3j1Dv/66Kvhyjw++9k8dvSkk1XfvsUb3iZHQDX9VObIa0r/7gHgNuljk1g/FA8e5Ane4nvJYBhNupphN2eWz0yGfSoTWeMVjGxyp1+bS3v+28imdX99l+dTJzarm5ma8vj95blp7iKjluMWHuLxAV6ye7V1GfrPCVPqz4fg5yLr2cdtrHhYvua7FIrTU9n4+KOGZ6GMEim9bX2GbuB37UV19UMb6tkR7EYU36AlTXC8t9Trk48bstCzXhrDsSA3r28SHGs7Gzj8Tvfc4brR9MwyHLWifM4I4Imo9iQvQNyt9i5ji1x9uBMo3CCt1DTvl3Q7p5Z4/q/Ot3ImJiYmJiYmJiYmJiYmJiV8bfNqEr8HEZoG6Vu64YxRzb6wK3dENI0zaNldvRtwFJFpzXZk78cXEMRMbZtRN5bq83Mq/WaFW7kE1pz12pJVptxqhcGy71UUcWSqeGBM5umW2372iVsj45hWhlkd1+Vt+qC/Z+GhkVSNZicixfrys1bilY9lcv3uKFzLyh0S+PXvbRgJ4UDVSn3Bf+HkWKYu5HFM38r1BhZWG/GVdumvkqJ3W//a7rxcp8GweN+WyV/9y+2xNwMGIaDbeGunMdWlNlk5ar2sxRquWNll+1l3mInpdehm2TlANpDsK8euhir4BWL+mPje868fWJ/13EYF8+QXkei11uSxNmaVS3a7XskSJ6G1jUa7DDo9cEvZLqirRMiayZSwfMtJtL26hdwUSqa9qGqhWIqq4q27q4HWBvH0DEUH++mvoXuac2th7sokN2Qv1zYEYWgpJaoZldgPZ5kW99hqFohnerZxlARIRINz/fj06Zaes62mZg+C0zmtdpMXZLdePz+VFkFcACZANWF4Uy4eSX17Kvnx7m9rvTPpuT4L9iQjbXO/boQCbt0Z0LtLrWfcANdfykoDqqry4dDbXvGbMT8c9hJu874VAc+5uD0huDQAjqbTgSCC1znKkZZJCbBFR9io1oHdPTWsPwKH+sixIn70DlgS5XGoMa+q7JRVSuHpkaPlW9/8p/wCy7Y38xW1D/vChumotB0Q0KwR7yyckoxZ6H9fxGw4r2D7q4y3v9cADE4oPSMSh/RFJFz1v187ybfU/EovDoYzmAn6BVlfrjZw9lEvEq+2vbp4MB4GovJ7Ffvh9mEs3uq+pkPcBiW7PdDfH9F20uzaTG2RWpR/cPtf+9POa6ze4B/cHi5jk9HMGIKX1eKiq/U5909rAh9jsnsvvWI+eLlTg0/zyxLlg6f1q14MDH23P4neMzceU4zn7SI3rXEgf5jeR6gc1cbRmIkSke0TQ2vXwwAyRvGfKY9++qFwmkLMCyT1n72j+rvP/H2D5iRSS2NJ5rytpwcTExMTExMTExMTExMTExPcfnzbhm1E8eJidJbl7AQbXzQRhEq4ZV6rSzk7Se9KwEYOBYek1hvCa310XypGiilWC9K8n+07zsHb4GL6vaQMbmVN9rpE76fiMtckrHZKMZOrH1D8yGkb1P8uP8xUiWZbAIObJUGBU6T1S4UXlM4EbuYd2xtvm6vUeuX0CETkSlJEaz5Op0Vw8Zt4IWvG/s9GWcaYexDKo/U4RxJM8T3skrMrvjmxMCXK99oMeIiguf1E63romU59Id33e3f6WdusiyNeE/ZqQL2W/SbfUSOGEXOP9AoPb32itS3djK+sKvV6Ar60+OR5L317v3pHRFH6uL42Q9J4MHs4JUvwdijoqew/E5qFeIMN2v91cYasOxG6Jz0v5uPqbq+aStpC+Uol1kXIvJ8AUvcXlM5B2IK9AXvv7QdStrFyI/+Y1Agj761WuXblPbJw96VvJnIcKunv4GeM6npZ1b07W++rXZcu0qhiXBfL8VOI3P13KwZ+UmicONbf7wBDWQChmu+5F8ShJgA8vSAD05aU2Wdu/kjKQU9kj7b364L1R9tSxvWfxygEc9sHQzW6U/ozgvfdMlP6MoPL1Odkn/Pw6Hb877XjoZhiO9L0Drs9AxJ49S3MySuvdXw9kscVjTtIPcgRz/LVukMe+K/n0ePXZeWxwhO9Jfvfmku/TKDbxAfXQzkO37U19bZl3VW+bc0niZ+/U9+eKe94uhoqcfF+czffX7KOvOfBh9fNph1jaASkdpTs8/7j4iYmJiYmJCYYA+JN47DI4A/gn+DahQyYmJiYmJiYmvkt82oQvMBr3jZDw1wxKsS+NnDEC2Ig2c+XKxNtOBAYrNZu7XlI4MgEYkJ/sstbi7JqL5UE1W4lI2Yo7P3VGKqlqJnFuMzVVpaCDrkspz6lBG3lMxnImtQ5IiQiwPLadlb2NBKY8uI+sr00VFxG/5nJapLt55nQtn9Td3NlYeuNpVAf7l1Vi1DdQLa6YzWWxjb2pWi2tjwMZEqqUzhtyo7i6qRBnXik1kNPcFiIxByMwuy31SrtWNTm4Um51dnNiMNzfbjVfhUkZmSyR6m5VP7yMMX6TdEW0KYm2ratVD2rS5aD+PBg/VUfjc0BqNIN97YumJF5QiKXI3a6iPGdkh6CQTiJdKb8mbM8L9ueE/VpUnbID2xvBfhVcvsrIq+D2bkG6rVg+ZDz98/eQPUN2rSpRVhHTHrYmqFbS9+nax1JzUfkCbV5qSiMBmFHJ17HvWx83d9jOYAyMLsht/rErSa9ssjHzisR9VAQOBIStUVP6q0Jvx8MJaurOSsQb86u5jI/to8JeGqi9knMh8C8rXj4X3D4XpFvZ80q8XhQPCQC2Z8H+DFx/UohkFcH6dSVWV2C/jqS3tPlRDPUKFJaY3ykBJEn1gJ8gy0IusE/InZO9ZVBqArGajAlEzT32pil9LZ2LE6v73l2rOlezA1HEpD2/H/3+q6TeZ+WcJMhlLQr2N2+Aywp9vhaV/Zqga3n/mRt0ANjXcgpGl1RJ/urJIhW337a28HwtxO8375Dev0Dff0D+gz+o7mgVigXS1InpOA6+XUtRPw4HP4gIbarTnfZ0d5/Hi8lFux5dYwItdNVsfc37JKvsWTnaSPE8XJOMcvAFGOaCJ+H8fDuoTU3dbO6Vxe0Xrq84T7GQEMCgpLVnD4RgVZ3rnjs56+73tTOSjy3ObruQDnsU59euO28K7LqZ66hUTlMPU7ktb+ubpvJ3CuOmJI8Jf9+HHgfyVu7ks9f3dvXKMPRjHsesPJR73Tl/Is7NBXbz+DFULrV8hvJO6lfSvNKY6j1dHLxcxAeT2jiwq+UzBTC3IyRqBTAvJQt9xwwunam+7fCbfVPv/V8OncHPWD5ZAd2O309NET2N0BMTExMTEx+HJwD/SwB/8UG6PwDw3wHwuz/3Gk1MTExMTExMvAafNuGb6k+oPij/KATIGF07A80YPxDAAVkQqmyUjCmPlB2eyBQyaMpICsieO7Fxh3QdFL1ELLf4onaNiYk8lsXXPZl8WvcIZ0pO4GjMYoLXyw0G45xr/4mB8lCWTxP14dl4H4g+119m1OX0/nmft59znszhZwLX491NIymKjHgwA6Ddj1Q84vrT9QcTw49UbWG9iYQIVYbtYIQzEmeFIpMBnYgnasNd1VQ4tgHxWMsLn81aiKZrVRHWdml101rWonsGKEZx9DV3e7siX6WpP3MCUNWgKsD2ppBSUmMA5zVh+XDF8n5H+vp2crACw76m9WCDrAvk6amQIeY+leeOudkeXIwH6l3+1xO1Ub+xoTpaixaD1l+m+a18MMIOWvD8d/nKYm580cchl75RkWEMGgm/dffaQgdidFmgzwn5UvhYaDuj0P5ONyBtCt0EqYhBsV8B2YC0Abd3gnxR6POlj5mPQ27ta42oa21Ndd4E/YaluzWPQhDcU73lPLruZILD8s/8uyNrOJ21oalBaX54t8uP1mc9sFTyPklXy5fLCnl6gjw9FbLX4rYnygtlnAdX3m4P5vXKoQ4UC/B0LUTdZUXScghFv/mmpDUlMCNSnUdtxEh+DzFh+TAR/N54QmB6MNELYFBR3nsG6PGgNZ+ShV4hO9TG7wmvUSg+qhOVy/+G6SxWc4CBuLyn2AzeAwdV7D1Funv2dN7zO7uRdejzyM+VwSPIybvqEH7hQf9H94O+eagwp9AHB1fRTv3b3kGPFK5Zx39b/fq+E8Vk5vRxvOE743vwIoJxHURzx95zfs/06bybZ34vejfQlr69H+7MtzuH1mrjxn3P95ORyva9bfV5zXfdxMTExMTEBIA/AeBvovyPyAXAnwLw+YNnEoD/LoAf17//jwD+4c+rghPfKd4A+LMA/gWAr37JdZmYmJiYmPju8IkTvqb6UgzugdlQfGZ4PjN47bm7dk1pPBV/iO/1wODdlC9EqppSw2BErMVrzVoJCB0UTcLGHyIitcY9la2rg03hxOqiMG6sU+a0OjOhx+2OiNhEeXJ/RGoTy/NOXOVWniXhuMCWhz1jimg2ftlzPqauYd9HJaevs40HE7bRYQEmW4GSn5Ei10uLJ9kfqcZ0UzMavHthT9b6OjJZa7EwOUa0jUtAiHrXy3bNnrtH4LAit2dYyCqL1wtgVAr7/PI4DmrkrFfT+GfuuYZegv7i+gXEiuaiNoJmyLpCnp+R63hKzoU8rD8AjvFiFcVtbxLoJeH2OcWqFECXEu+1PAzc3gGyC64/VWzXoqpP+4p1FTy9L4Rvc1EMkBtnmosJwFrUhfLmGTDCKqfW52LjykQdr2FvaOZ1ndCN3E0Rh2485j49M1i3eMJULivhW7mkAiWldVFddsWpXK9oMVJpHxwOqBAZ2Pqt7p2Di9+nBdu7SyHhE2qs39LnWgVQaVOkWxmI9X3Zh7e3hexdXhQfflAU2/n50hWkGSUTVvAJilJRtZ8NWhJkVeDlZJ4CJU41Kwp9Okcemkq1X3TEbxs7iitan43WVVPkgci4mkbrvnlQa/K71dSRPj545ObZVGeaC9n7/AQ8XaGXtcxz3p/tnZSkuGHW3jnlIFOZ+3nth6UEdZxFioJ/WaFPC5CfkJaE9M0H5JyhLzdAb9CcintnRO+jvvc1NSfPZ5vjrC4lYuxwGCYit05csTZVI69fGzcm8IXW+Y5OwhkhV11lM3EfEmhufZd3hrXLueu9Q9JFbqAPJG9wuGRIV5WhobcGTtv2uKP63at+m6qXDlC9xo3woKS/7cWbAk4OOhnpxvscle3LjNS8rCaO2n54nttEaHV84Gr98P7PPU+7N8Q7lnEPUN8H5jmCvaEAQ8x5AI48LnXUun4bPKl5Ms/C75eBQK9ryCt7WR1vc5wOwLR46Ys7mBYRyow7btQPz4uM8XcPSuHgsCDfy1UNn5byu9Jext/OExMTExMTEw/wZwH8T/BxZtJ3AP5t+vt/gEn4/iLw+Bv+MT4D8JcA/N8xCd+JiYmJie8TPm3Ct7rqBNCJx70SYZVEAdlgByLME2L277qMrkvtXkAyHP4mIpaJQL0s/b5qcQFqaUUKWVuNez4+L4Cm3JWtGu7N/WHW/myucUFFRnLZ1bO4fO7lDfXiPmID1F77mQ1GRjAn6f01oBqFm2HV+hGFEWlurANXeXvvu+H3lrWO9WdDoMURZmLZKcGGfNj18+aUU6yw8WPOhLD97etDpPDwtOW1bbWfnRtKT86zwZaUNc2Ncr2ufBDACGYihQaDLY+9M8Rrzp04dm0+VQfZvHWuzFkJxOmASj7sCF0dju48SZGaXVxZNo7WfPTldlT4WF0yzbcdwJtn4Pmpp0mmxMxd9cf91kg9wfbZBftTwvZUY78uAKQYsZcXbQrfy1dlym/PNp7lJ18T3v/mW1x+fMPyvrY3A7LvaEpWM4xrcf0sQFFCbhtyrjFI90qOANS+NLqGzQCwO/XTchxj36cMHicbjwhkiB/y9+ul/t1citPykyRFdb0uyGvqMZL5HMcqjeyTXFXXNv2SFEJ2V8jLhv2Hb/D1b16gKxH4iqK6vpamiALrB0XepBHLKkXVCxGkrYzjhz/2jKd/8R7pmw/AZSkup+t+2VTFqsW1PpPnW1e8d2VtJbolQdLoHjiMGc4wV957Xa/cgeyForooldvWy97rOko0R9whHY7d2eKYtrJldJFOLl0bmNxxh2Z035HePEOuV8jTFbheyuElK2OR4sp5SYdyWwlt71IohGI6a3vXGfleDlSU+aNvSrzutCTo1++BDx+w//SrU5fywu+As/jsnoBz7uMBNPKsJPd7KymsCYNLZ0fcc96N1KxtCN32qqnI4do37tOqW8tD6CDT4cAAt8ONUcvTDtKctG9w++zaq9t27Cebd4PXC2kEofpvEYqRe3BN7eueidD3cZmZ1LR7Z4rbW393HV1Mp56X9Q3PndeojUEHMJY0zrVDOuoPF8v4LK5yeyZKy3s7t4nTJenzmWMnB+Q7u40fcr2nZnZ1sDJtzg3v/oOi1yl9bV3ZfhyQupLWfj/ynHCnnkOr+L1p83wzF8zo36nDt9Iy1r9kNP6/yeCKn/Yw5XwA5O/CKDoxMTExMTEx8auA3wTwZ1AI24mJiYmJiQmP11mXfpUxKA7H31tsXoYneP29gaB45Yn4VyhEhjryD98yl8yelH5NfvT74PKZf+7lEYGfOxiPg749I1Xv5euRg3wfwZOK9xApVVvZEXENp6YI6u5Vuv5vrzbmv8/IHA9PMHs3yfeei2DKyaiOH5MPwbuSjupnJMLgQvrMdeG9Mk0Z/DFuRv24oBDU2hT9GHdEnzU/K8B+TdiN7L3UnxUlJi8KkSJ7UY5arFgVNBItr4LtbRrjXA/1xXGHFimHUpalxoE1o+798WtKw0euar2i95BRjn8P8zpR8r9m3koqaiWeUwlN+SnDeqs/Qz3R3wEi2J8Sbu/qszuaMhQo49WU6QqkXavCu5Yj5b7sRV26P1ci0uZoeN7FtfFBV/U2j+rK18LGt49zMI73XN9yHYjw7C5o/Z53MpcsxnlwT2mty7IUBff1AqxrafdS2q9SVcJSvFWoSFf8os4BGzs7CCCg9+rYZl3KXqGCqsBfoJcF+mzK4qdCOknqKvOP2VcicB/4vfaQdiR57rkxfjgnzup9z40t6LDPgcyTj9s7fhaYyv9Q13rd1ddI19cgPpzUVasfs8aA3j/3nnuY74P5cG/87+UZuzw+n4Oxa+qfoewTvEY5fYaz8oa+tYNpvswzRTBf866Tq7eBAY9cMN97/1l+r3F17dP4v+/t24f3jFtH/Pe3GI+JiYmJiYnvPwTAnwfw576DvP4UgH8Jo/Jk4rvFM4AfobjdnpiYmJiYmPD4xBW+RTlSYm6ixWtsShxViDEmZjSunuYMLWYiE62eSDIVa1MvaFcX2TXLcyAo6u+3rcXQbTF62e1lSx+TkebmWUmB1WLyWj28AZHvtYfk6Bqa7g3X+NlBDVH/XukDtsWsq8ZZzotdG1ufJLrPSoVIzevrYNdavztD9G2j+0cV66GdpkgVqcRDvb+NrgeH5yy9uWcmt4WN1EhS1K7+eR9vtfUTuQUN5obmDOwZci15Sn2uuJpcSLGHSgZ2d5JMtDRCwVRnWpXAjgxVOzzAimGRrgyudTUlsPQH+31TLi5HUrOokVMlanInmgzr2tXJ9qipVwYlIs0hK+96ORhStfbxoGQyt5tSlJma5Ui+av2PLQsyvt7eJWzPUojeBdClrK+8FDXv9aeK9X3G7W1qpOLyoah/iyK4uAi+XhJSkuKGPQGaFqT3W1WC9TliB1iK29u1Km43HDDEhxyVVnKhLd/FZS1x/6J1XdNxchurfS9KXE6QFYNrX64Xu8N1yk9JAuUyTDWuWvhbG7c6XumlEHOyZ+RrlVfv5cBL2nJR2AK4/bF3+PDDFR++FKxfFwI+bZV4F2B/Lvv39cd1XNYypioo6TYg7eV3AHj5POH591MtW4FUx8bcDde2qfR9R27UMG/kV4Usx/3hQGyxQo/Hrrq2P7iutXxYSa95HPcDSddjgw8kINefXdVaHbPb5yldq2tW6O0Fcrkiffl5UarXeL26FhK27d1V1d2Ifd6/jHSDtLAHWhXdoloJYXPrbPt2nbJ1j1QswHN5h8hlRdo26IcPyF9/3cup8bCHONktjISby258/DV2ha2qzV2xV7i2slHT0v2DO21+19KzBlN+++cOZabqkj/nvj8QMdzmAY5o86x+e9lhlkYQ+z0GGPZgqd9DQxzktu8TcecVxCh19mrqiLiOiEeun+LSCGCx97pvH+dd1bXDuyRKR+SkjQMrUHkcIgXsgWAPDmg1dX/zDOPIUmsnz8H6XHQdqGMSKXkB4LJCblvvP3uvRCE8qG2+X9sz9p4HjmpoYJibw/sipdHrAL+76FusfZnY2tv3otiluNbsyYDV7e360usC2suaktl+5++XfT9eM2gu3h4sT0tv9WcPA22NYvx7OCinYz9YGYac+v+3TExMTExMTJzgAuB/DuC/im9P1P6PAfxtlFjAv/8t85qYmJiYmJiY+Hh82oRvAhoblHE0OKOTA6jEluZuMIY3jN3D4FoRh3LCfIgENoVYM2hbncwIyyRo/VvySDC1YvOxnUP5rEJtxvCjuvH0GU+QGlHOZZ7lZaTjUGEyNjVD2Z26ROV4oYTrr6ENj+popC3Xrf2c9KnqkYgNYO5puwvEkdgZ2hYoTkdXlUdXqMPfMpK3YqpDNrJL0NfRNdeGUl1tacX168Go7NAIXYwGfi5DoZ3sZTRjpzudkSphdaZqOVPiWHkpNdIXqAbmSsrrIuNcP1PDtPkCmPIzL8XQnjYdlKLmMhha7+9ocWNvbxMkF0IYSZCvC5avzAiMFo9WiMxoMWor8S7VWK65jHmofDsQUI484WuvUYAyyGg+5NW6ioicKI66ZTMYr63eAllX5IPBG2B1pySB2s3at0KHQPSy4P1vXLE9CdINTW1dlKHlZ/2qZJgvNQyAAuml3Msr2jhLLmO9PwO3tyuWt09IH27HNRodmgGRl2dEgPWFB5ONtj94kjURSZADt+vsZvUeeO3VWJcH8v5OPHj+nYleK1vWFXK9QC6XQvbygZj6UxS96M+6uulQbvmPKMo7DhhjYXJ3Zm0EMZKWebMswBOKW2nNkNu1keLhDumJJyDep+newR1uPlH+2Tp84M42BLuLvZc3AlIwx4TccU0+jnfr5+9pCIAg/0aw0Vw7POv2l3vwZOxxTdxX0w/XyDX0IxzScdgIu79r2x+V1vDdMoIDBXddLQNDWIkeW1jC5z3C/qX3ZyN7hQ4TuPFmRfTBhXQGkPKh3uG3An8TndX7wbwHHKns3ZJjnDPdC0nNd0fft5MrK+vrbMNG5kaHrSQgbhPdt+9mOqhBFa/fqHUsnFv6n8lzzsTExMTExK8drgCeHqZ6fT4f+f/WE6/ABcCfRFH3fpf4DZSPuX+C8ZT7xMTExMTEp4nX+cX7FYYRuuINrkxQ8WUzknuyjUnAyKh6kt9BZcPkobl15GfNdaUWZRpyPrpyruU1NTA6ydvIjMh4o3rMg/P2RKdrXyOXPXHKf5/1A9fhrP9avwRpzvp2IGPNWO/q4EjQsE4e/IyN074PMW+H+2yg83Wy9MvS1bW+HmT4bJdq/M0hzp4fH++Kkcu0e9YvFgvvbH4AB1LwYNS1fIxctGtUn6EN6lzJujYCOBqj26GHR/UkYixJVYPRwYvIZa0ZU1sMQTmSmaYouqxlLZorWYvFmlInnKKpzsUKoGs5nLF8QHUXXIlHI33rv8hA2ouh+/a2KEkvX5f1n5+Wso+1OV77ybvHtfFb167GM4KK9xzqR1l8PEqbY04tysZwdmsb9fWwHkYCq7lhbcZrIntd/UKyt9a7uK4+uvMtalpUchDj4Y+qupVda/zdhG9+lLA/AcuHquwdlMrA5SvF5WvFfkUj7NcPiuVDIQxV+nVdgNs7we2zhP2za93Ha7nWDLcPD2dIpMzpQRE37GUjyQSgKxkfuZxnEpnnvTP8j0QWzQtP+MudfcLqFxHBpuq1HwBq6rp17a6cbZ80opcJuBq7V6hfm2tn5jm0xm+2H0U/FKDoawq2DrWvoYSiJL4swNO1uHa+Frdgrf5EZB32NR7n6DBQ5EK3fX9oI1rHgxHH/ZTLj1wu23PR34f0lQi6F4f9DJ6wC4lN78oa49zid8RZOw9u/8nDyEiQBvM7gt8Ph7zTUOe7LpvvuirPxx8q2+otbk/nGMlhGWckXetj3teP5bZ9hvvaCH5HeB/aHvSrj5F8IHf3HVrfRRH5z/U/7P1uDBqi+VrH3R9cCA8EZDdfaC4N15McDz3U59t3mn0v3HPzbAeh+G872JakHFw7U/6yQtf2H/8etj1s+KFvztaeBS0sgvfsMDExMTExMfELwIrvgbn1VwxXFHfZf/w7zvc3Afw2PnU91MTExMTEhOHTfqOxuzVHuprxOCSCzwhC1eJW2JSSRq6a6qQRStUAs+9AdmQtE5sy3tMl9fwqoSvVJWkjeK0eIHK35tOUvSkmCywWqWw75fGgD6mOTU1o/bAuY3u82sqMhp6MNZwRv9a/jOhvq4+pU9iAZwSTJ+2ru8VhXK0NXj0bkZ1suGci164BwOVCfeKI4zNYHxMxK6pdjVbvq2pxwerrwvlweZ5IZXjjONDyP7h5RjfmyopDPzRjtSlJQWQdGTPPjLWq3T1pM+CaS2c/Z/Yd6pVqOXX1rBij48CKQmuzIz6Ksrga/p+ehrkhpvTV6gpyzyWGaHXVXEjb7jbWYvTKpjA1qDRit5CE+7Pg5V0hqdKtkLyaFNefFPIxXwR6FciT4PLjpR4uqIRm68NCRIu1b12Ka83nZ+Cb903lK0LzycZNClsZEUtNpWRjbflL6mowu+aN/2frnN3RMhnmVapEeGgqeeiQTycTi7ttQFLtl+q2Waur8Gwk8G77rEBlwYc//oyXzxZs7wTpRbF+g0YGpqa8ropf3lK1/7t+0DpmPU26AR++TMiXJ/zgj76BbBnppfYTvXtKYrQ6QRMkB+tES9sldSVgI4ZSGt1wAzDXr1oS9us8VtHeuyxAylVZV9dfJSck8ziSe3oqcxgbvhZ4JGj1q0RvuZggn38OebpCrxfaz+szuYdnSOZCWqSOZyV4BrIXda3UcTcF65Zr2t4PkuoYLEt5zwVEmqwr5PPPkFWh33zTx8SUff4Awz2S1/YUTyA5NfDgmruOc1Pgsvvas0NWvL/t5b1th2VsHQ5pU9+DfT7NPfBQ39H1cFMJ0xpv7wO/jxD0Rq7nT+LX2rtRN+emftdjOmp7K0O1uSOGzSUPp4IvZPSRmPdkc8l7afcbORl542AV6rI0IhTAeHjFf18AYxlOzTr0tT1QlZ+S6zWqz0EpS15qzojt4fqNDr/xN9BJvUQEamEeLMwE0FxgD+DDAFY/v8+5urZ0Z2shOvzAoQeM0M1bcFjBnqH90FzgN4JcaoiSPNSr9at34+xjgS+1HAvDMLhudvWRNCqGWcGfFWA3zgBaLIT2PVPLse/0ZakfdhMTExMTExO/GPwIwP8KwP8BwP/sl1uV7w3+ZZR+nbGRJyYmJiYmHuGTPnIm3lgVGYLOFBIfAyZJonuvLSOoX1PgunQtRm9UnURqXM4nSu/r54lQnzZ6/mNBhvZvBSaMoutn96N4kmfg+xHZy+miwwP+2TNEBHNQl9CYeaa4OWnj4H6Zrh1Iv4/BPcPrmdolUl55I2jNO0wXPacnhIXl4wkOOPIE6LF7TUEfrQmtbmKDvrJ9RrI2xa65EzZCygji5joY9X4qpG+JIavISyU8BYi8iXfVTvkxlaPW+IeD28noEMQjZD2Oo+/7V7p6bvPjjmttThu6Wr13gOEMlswIiCUhv1lxe7dgeyMlBu8GJCOEE2rM5UrAL7YPl7w0AftFijvnalsH+vikHcgX4PZGkN9ei0LUSGwmMHjdvrIt4veAe4dInJtTvfeeAo7jegcH1eI9eMW2uwbNkFRi5cr10g8S8U95mCsQXmvKeZTxMCKYIfVgxljHOvbDASb0f+2ATY2N3Yi3wK1x1O4zhHttQHa9Fg+feThWOv48AqU5U+Mf8Np1e7dcd5DqRFl7UAl7xSh7dAmef1yPIE2Q16s8Z5RCD/vzI9fUx4MGjjT+yG+tcI3+jLjbh5FC+CR92Af32vXa+fsaeOU4gFMX+HqiQj7D2TfQvXRnrqn9/fBApf8W/oj/P5mYmJiYmJj4DnEF8K8C+PO/5Hp8n/AOwOfAz81VttT83/yc8p+YmJiYmPjF4Xt35FsdgaPL0mL43iXxWNGx567m9Zx4c4cqsRHPiD0u06t+7ZlWx9Tr4sgnUwGPz8QfOU3ZuyzVJWaC3LYw3/av7xf7fWVFbe0jVubas4Nyx4hel5+1z/rVnt2p7z1HZEbawc3sA8OVSDHYm6LGnl3SWBYAbFtJmyQ24psBt9V17/dZKWxj+jHkLymgQtLLfud4eZzmHplt9aUYn+LGuyubekzYUm/K36mKparHoVWpmwRyuUCkzLmmPqplKJXj3UBCM3TLo3HSq8J4rdjfu5trNt/ICMsqNABFWUYGbtWeXtYVui5FpWVEapLBNa/sQMp7I3P1stQ1U1wE56WQt+kGLDfFy+dFQWwEo2Rgfa/lkIYAeS2E4qXGjd2vxa3z8j5XRb+1D1BIUzwCdS9Ldb1WlS8uF8ieodut9UFTYfv4jfy7V+6Z2uhmc4vIW1YX0Ri2a6YavFVl+oKukrI6pQTcbrVtqag52cju3ELb3tfdbKP2oUDIzbOKlDFQQKDQRbB9dsGHLxe8fF5I3M/+yx15AfJFCtG7AttzzVOA9WuUulbSXRR4+ZFAsuDyE20uubvCt6h+9yfg6z/5Btc/uuDpv/hJGatFyo8qcMtQWcqcYlWiSFfA1rYKK8Osz+y2jVvtu8O6J5fZ5pLcxy8FMCgly9jsg2rwAL8GrXzvctYRR7q7sQQg12tR1F/W5omivRduWtcyIEmhWYY4vLLl0ge07+Vr6Vddy96eTLWr1VPFIsMBjNJPCoEWhbil3XJ/P1qohbdvIEvC/uOfHvskUqrbmPi+MbfQ12tdW7Tv2xiZArTWrzSz96lca0xhO3BTlascN7V0SW1oW+fHdyUrTft3SKpurPdhfniFcbtu6lsfk5brcVmPrn9detun2/4sUsMx9++o4XDSg3i7TXFrfwdxlZsKmtKfKXNDd9VLfwfyurC+51iz/P5jpXdTdEeH1ICuGB7qV8fe3qt5rLfyt4jNx5xrf9Z7yzKOiSd7nXL3oHy2+8E4+P1DVYGXlzaGclmHuX04OLau5ZuA1Ol628rzSxrfI2d9OOyftM7qfI1U4Tw+Lb+qmC7l5OFZ3XOrq//OANAVwcO7Ufq7lBXAjbS1l4q0dd7ysTzsvsGU+rzWm8ed+hJLlPa2xa6qJyYmJiYmJiYmCCuA/xqA3wPwf/3lVmViYmJiYuJb4vtD+KoWb51GHvpD8myku0d0mkFoz504Y1TD9KBA8iQo58dl831fN37OG9ASuXMGRvUvt8ncK1uavMf18W3216yeg8rGEbncLd6VHudtLhZR89PaD94gLTLmz4oZT/z5fvTEMDASI9Zf6vLnOjfSM41GfE+gekTqNH7eGScHt4z3yF66N5AywZhprgZIbmMUr02PqkozJB+Mthxj8ED6dEK65ZkVmgo55QkARSdZQ9IwQpvXzXI5zjmOdVf/PhBXmcaN+1NobH2x3L0215L0mVnJXoYmQBdgrwcxRAHZuytgU4nq2u3vhWAGqUulrQGp801FgJWM+ZVrllshqHRdClmz743wHStm9Q9cluajoX5MdKJu4hjKByP00ZXl4LLW1UOkk84HJaVPnwuhy2ddtJKCklGIOwC3Ly64fbbgw5eC7U25n17q2msq6Up4KgCyx+eluIZW7fd1BbLUdHsd21xIXwB4eZcArFi+foP0fitut41UEulq00Zc3elzBOQZEBJvQx85l8I8rocYm68s++CmmGOD+ny4Xm7fUWv7stQDNrT26iGLQmhrIXvtPb7jeAgoJexPC/a3K9ItQ0Vw+2KpCu5KDGcgveyQXZG23N6bg0eMBGiW9r0wjIiUgywQgfz0q3Fe2h4n0g+PACVsBPeRIyl1r/7dmcwj4tYTjI04zJ08YuJzWLfRu9cIKyPNovcLX6+xQkNluZ9zy3JXGTqQqhjfM34uNuLyY+CJWqdyP31H3ysncFEcuivn/Oja4dAE16uiH2wpa+Ewhnpcx8OzdGivkcnsQl2kHfbwbbqnMo8Q7UFa2zW4nI6ec8psTam7KAeO7xxS0o590t8zQzgG+z2qB7+z0jgeVg+kvm5P19SJcvgQbxkYyVuGkbKZ+pnj+vo6m9v4ha4NbuRTJ5ObG+iT/59gNAJYjv9PNDExMTExMTHxSeALAH8CwNufczn1f/rxGUqc4N8FEBwAnvhOIQL8rb8F/Ok/fbz3u78L/Pv//t3//ZyYmJiYOMEnT/g29S4wkqVszzIbjScOI9LC7mmJraum/GFi0AhlU1BmHQ3KVidP8jJpR7+LkR4uhm+IiMA1o1wqHyniCU5vGGqG3mo8GhQiWton0lWxCxlTyRAHoCsLuM1JgC1T+3MnkImUHuDz8PBxKSNS+h6hzsZ4kZEg9gcBgKOB1/dnq9cDg3V0qIAQEqpnEOnkLs+lfS/qT1P8DMSNNrXcoCRrsV7LGmDXkBZTFZq7YtrVuSmOBtWQy3dx7dJ67dTlLI29V7Zkf4qj1G+IO2lzxKt4UooJ8Fpmicnb57itw2IgRvUa0Is9uHkWlPi9dj4hl5/9qSh4lw8lfa67bVMLJ7SYvoMSUbUoF6XELy3KRN6nUPrpsjYXtEAh16SJ0JQ8HfvxrwbwqlY6kEXWh691R2lxUq2cOibKawboa85iOrY1efIFn6Tv46pAlkL6VuK2x+OtxJ5IIXs/F7x8IciXms1ejN1CZL2pxoR+RwJUZbjfXT4XRTd2FHfcNZ/tLQBJWL+44LpnyG2HSCXk614nmw4kcOTyusWL5ZhEEYl1b6/w68D/3pLFhHAr6x6xfLZ3A+4dkyrRWcmcpShJ2+GGJR1DMNB8KWNVSayllJEvCdu7FS9frrj+UVHuffhiKa7VNyDdEtKuWN4nrN9sZR7a3NQx/q8p6Is7drefNpfTCcDex0ZOCD7rN+sn7kd7d+x78SjA7++cyxom9aOpfmXfWwzk3s3B+LauozXYXLP3OdDUivzei8hiyosxtJdVyXTPE6VNBcnKZVeOTzOks9i0PB/tHUEHEKR6LADQDipZHax+h4NO99r3mnvBQUDdc18jfAjNH5hYllHFaXV0xOM9JfMQ99cR0OM1GQhXvjeokB+Bv+3y+Fz4vHvXHOrdSMvg3Rwd3qK6F68XZZ4LP8t7noe98yDxHDXilpT0h/jbQItHPKyzR/CH3fz7zup9se9ydLK39cO4tw7w/w/jv/vbh8krvzMnJiYmJiYmvgMogBcAwaHsiY/EFwB++xdY3mf152sAX+H4fw4T3xVSKs6w/tbfAv76Xz/e/wf/APiP/+PuKO52e3zecWJiYmKi4JMmfLUSIrKjGaRElT261YQa/x2RvclOdqEbpJn8UO3qX1MpebuPJ5aZyGRCsZLFnnCU3QiDwEBDxr1B+WvPqXZD89DWdCSiIxd/XCYT3UvqLjgt/Z4LsWsGcku/E2mw7b08/kko/WwGKnPtGKl1gbGu3BfmltmMrWeEBbtjtGdz7q6fzfCnEhtomfDwRPOylD4w99kRqmHyNEavKadorg4E7ZpaHQ6q3Eb45Z7eQEZDoTzZ2C7VVaNumyOKYoNmU2UmtPkSuW8e3PWSqqkRystSyUVasN4ouulxLtN9WQLjZ+aYjmRodi6dqaLFwJtSIX6NPLiUvNOWm5oUQHEZmzNkU6RNkW6FXNyfgOU9kG7l+vac8PKl4PJTQDZgeUH7/wU1r7YvWn8y5GUb5qcmacpV3iP0aQG2XBSNlwtwJVfX+96NxXwAIHJHysbyfS/7ZnNlj9aPnuwp5MatkpikzorIHZ7X7Bad00iCpFxUnW0cE/0IsAjt91p/MrnfBnQRvLwTvHwpePmhAhlIm2B7AywfgPQBlbAvZVt85XRDcd39otifC0mfXmo71vJ+kb1cL66fi6tvANifSqzf/XLBl5vi+rK3PUKA3qYENO8GHqqAu3xQ9/pHTg4weFJQb1sjxLxr1Ja/I5aProYDwtkdZGn14XrZGr1cgcsVuF4q2ZX6u5rblFKZTkmh9A7Y312Q14T9mrA/J+QFTUW/vGiLyfzyWYLswJs/2HF7d4WmK9795++RXqpbV3vXtMNCdS1ve1lrRsobOXgpn0dFPX98Jx2ItnsHhqjfZVlaf9nhCFkSdK/7k7lNTukuGddUsh7ebXNwoMMrca097C63udet9fIHBQ4upiPQYRAm0tqzAI4fUGh94zGQ5lHaewew7GAU15XdIte1IEtqZp3B7W/gOpkPudwrvylSa5laXR5bGb0dR3fFh/WIE5KV29RcSOe+rgNV7OAyO3Lhzfs458fvlDseBloerHZPiebt3tMwee+Uvcf3umL40Of0fp/zxG5t6+DmeXHPAOH/HzQS2BH25eFOGDeX6wv6N00bWzrgsCx9a7H/z7hcyzcRf5suqbw/Ii867VkAqAe42BuH3c/0nTAxMTExMTHxc8a/APB3APx/f9kVmfiZ8RcB/EkU986TuP954G/+TeDv/B3gz/7Z+P5f/ItF4ataIsb8W/8W8I/+0S+0ihMTExOfLD5pwvfg8vERmOwAzlVshsiI+eiU/Bm5HP2uR2Uwu24+zbuSvWOer6grG6Tv1Zmf4/oZWcukaQQzrgHdqGwu5Xx/s+LJ1/Ms/zNjp8hocD1LF4xDzeBI5vr6vWb8jUxmhdcjEAk2xATUcY5GsTlf67b1kZJH+PCCV51Fz99bPw9c1w7p9JXz8p6Cx+XpVU0IyfDU5zRwiP8NI4G0EHwqVt+SR9oLsdsMzFIOYLR4sAlNHSoJAClDzX1wIRO1lYOMooL2yje/HsTi2aZy6CFANzzHhyhCpeJrkD9CGXZ4NlChAzA1ZQhVtP3NHuPklFfaUFWB5ZFc4/rmFYAK0lZdNhNR3FS//vf6p42puejOFylvTgH250Lmy45+KKCO1UHB2ip5JH5bDF9eU8GecBfe+0LrHnOfK4d79zCMMc8/3gt5v/R5qwJpgVxWyGpx5V3b+RASl60WjxjYLwn5mmDq+qbWXZxq16paDwbkFdBrgu6pk72VULYyhv3f79XL0kiaUIH9sajvhCE+arQ2Tw4tRfPgbhxVQxKKXRuMvy/vhMCNXOsecBb6gO8/Kt9d/5n2GiIvD66G76UHhj5qzz4qP1AWn7pS5sNkntQ/+e45xL11Ctu7B0QiAvde/fmaH5czl+4f42fNVL+I5214iMHh1EW0w+n9M2K+fXPxgY2E4p75dXNwKNMTr638OwckUvD3a/Z//yyXkzWux8TExMTExERFBvB/Q3mZ/g5C29pHYQPw/0Ihfic+TbwBmluxie8ST0/A7/wO8Ff+CvCX/tJ5ujdv+v2XF+Cv/bXy7H/6n/5i6jkxMTHxKePTJnyr/bXF4SNDe3Nve1mAXcvfTYVRDd9mAB7yZINv6sYtU6pe1m4YjgzF98hIEci2D88pGcDltg0EVOgqGujKXjNGytGNs+Vr7qKbQc4b7c31rjcoeQLWrtlPIyZcfqYCHohUjETGnsf+YiLZFH2gtC4u3NEIibH+kYE3ImxT6gpEy3Pfi+rKlKMRYevLVy3q3kYO5JFoUx2Ub5rJeFj7foiZa5AS37H1pSk+zOjqx7K6AsVCBvJM7BarP9GNpppzIT/qOmoqWFUAS49badVazIhOBIDNMzJwNuOpVxaZAiWbepOUvpEyZbE+yF3xQi4Yy5gcVTMCVNVyUXIP6t6Uiip7XaBrKgbopbtQHsZ2L0ygJMDcv2oSLN/sRbT5WVXfAFhuirQXclC0q0eh6PF8Yb9L4b92RfpQ4o7qIqU+S90b1tQUxb1P0OaOXi99jWtRycrVqdiA4/rneIz73pRVzUX2ZQVEIew2O8kwj22NNAVgDspj9SM/60kcVkvZvLd8tCg/BSVOaxkv2jNy2eckK97+sw26rHj5UrC91RI3+RtgewPoZ8D6XpBuQHpB3TPRXG03cr6OF6T0dboVIjmvQL4At3dAvgL7VZEvwPp1VXH7cQKANdWYwZVNpkM7A5oqu6wrhcakgLnDjsjXOpYNppCuSkpJ6+EwBM+B9u44I5jt/brvdY5cBs8FGnD2kgTy9NTUvabcbWSrvQtUO8lr474Ukvj2+Yp8Ebz9Lz5gvxVX0LoKchLsT0WBvdwUz39YY/huPdbuyxcXLJeEp3/+TSOQu3tvBbYdsu3Qte5z9i5JKPGxTY2pGZoTRPSwfw7eGyLvFDzPWX3LxCCrbVk5Gn1P8P5k8+16HfdDzkcSZC37Jcf1DV03U/2tXi2tvd88Od/2hnFuDy6DWRG7LBDNxa333t97h/pQP3QPEvshzeFgD68J74kDrk+ZeK/1VH/dtXVov61R9kQRkJ+W56DW3ff+7cHvdFMZ12+f8Ivysg5zJiaXpbgwNlfkLy/Hdp+1sX3nuX08IKxZEd3q4r7T2BsJ3x/IeNf/rDC3eehV6INbcN8fzTvLSMAOnlFszdj7p87Ng7rck7773hXDw55LBGv7193n7xt29+zr0sJMaCdy+TvHvqlF0D4s+Buod34NpTEJ34mJiYmJiXNsAP5tAP91AP97fOpm0omJX2X81m8B/96/B3z22eufuVyAf+ffAf6T/wT423/7486bTkxMTPw64nvxJePj+LKrSNlyNyyzMcZIRXZZXJ9HdalcMpAjKRldt2ftHrtQNgSuMSXXeJ1AqDow0leXHq9M9mM+w985Q7z70Oh3I7R93zAS9QMbUJtayhFkvgmeYGXS7SydrwP3PRuyIpI9IlRyPvaTXeffX6rxmV1XR4phrwAODP0thqonzlMZx6aktWtaXAEOypXoQMHgMlVdv/V6RergKO7fQO5Q+Y2EdeRGZJgf/iYjZXPdDBzJKzZmAuOcaKRvroS4sTS0Ri0Piq3ZDLJGTJjR19rFatmzL0RXX+P9zJisa2pp0m3H8kGQalxXTd29bEIhwGyc0was3ygghRvenwTQQk7JTmRXnQ9MKqiguN02rDWW89bnhywLtBHpOpL0HDc7WgekDG3POHK2jZ9zc+nJQfXrL1C+Ha6fxPC1PhDVTihwWdVrgKDskaLA+tMb3v4zAFjx0z8l2N5pIX6XQujuz2gxlmWTogje69/GxSmwv+nq0e2dAALs15JHvlQiGYXsffoD4Iv/34b1Jy91T6RG5NzPBPv3Abd13+uebRPGjZORvAeiOBhPS29JmuvVup6JHDkbr4M7Zzp48tDd9HBoaoE8XVv+gxtnnpNBO/Rpwe2zC/YnwX4RvHx5aaT8y2dLcaV9RYupnNcynstLHuIsazvIgU72nmF4Xy197QT1C9WJRsgHLvoP70L61++rR28KnSCLyfhORvHYaUqFXM3jOB/G17lmDgnEqP78zqkhHZjE04D00+3oWvbwfqHnh77xe0jOxfW2levr5dWngdviwzyOFKvcLzYf+LviQd/Y30M84uiQGq9VX5f6/SPRc1Gd2/58JNLvtffgjt+3xT3PbqOjeoReSZj4NURxiVtbqG+sDCaV2euE7W/Dt3fwHRLG/839Pdj2sX34Dhreh0H84UM5B88H7lCbXTP3zsOBs9yqMDzDB56itWqH+0om7t+JiYmJiYmJGPV/FiYmAAD/FMAfohwGmPiu8G/+m8Bf/atFvXsvGo+HmVw/5pmJiYmJX2d8LwhfsBHOG1hNTamVuuHT8CkBeR+NJ2cGdCaEz8B5mAtjqmNz1ywyxt+1JEvqcXiZRJY0kp58f0h3xwBEdTTVsBijobnX1RNDpADWJTXl9Cm8WzlWU1v9vEqN6nZaf0/QM9nLfcCGRz8f7Hqrax7q1ZS9TJRRHs0oTdk1YvcRmKwRGZ+JyA4mfoPrdOG03zyJIJW80L0SqS7/g5vo5Uj2DnjkIpbVKqbmPTTUHV4Y5jYbxyvpy2X7fHORGDYF0L313MqvJJaaq18Z4vUiSSF9bQ6I1Koo5LYjLamRhcXtswBJkYHB3axkYH2fy+GN1OPBpr0TU0iF4MhrKpPM9iqrg5F0i/S1a1gWINcYwFU9ramSfSJ9zQGHr2SeJ0Ncw4jkHQzVNc6gxdHO4/w5dR9qa2Hf2/irn0eR63eRcW+pW4LlqVAs39xKbNf3GS9fPEEXwf5WkVdFvmplz8seJTdBepE2fsv7Gq9XC5EIKeO2XyvBuxzH9PIV8Pz7GW/+8Y97VWl185i1wzXcz+2hqs5e0EidcN35/Z5Be1+PLbpXtXbt7zquofISpeyz+MDDfmpEaD7Gd7X2tLpfLsWdc5QfztdoXhO2zxbsl+Ke+faZrTXF9qbEzc6X4ho9L9LIYMBIfEcoJx3j9Pr52d5xtd8tbj2AEmda4j2Mm63Fm4is65FeueNGtjQ4IM3smTMy2LnxPrgHrqTkQXV55sLXE3GkoG0kHdVZzSMHH7q57WOeHoHKudXNKTU/Fo10fmAJOJCQ0V51+BY6HvQ6xMD1Y/OzHD33xPBr8olUxbY+3XVPqrMngJaXEe1Ru3Cn/yJvLM1zAZfnSFmR4x7yCvhnHubh3XXDvf+GIab3me/eup+qavcGU/Mv34SPvjucsrdUpH7r1/4elPw6Hm5rz+4xoUxxiZsaWU/29YmJiYmJiQnCDuArFHe+119yXSYKFIV0XYBfiHtlI/7/GYDf/QWU9+uBdS3umP/G3wD+9X/9Z89nWYC3b4H374HgHPHExMTERMUnTfiKFhef5Q8ii9gw3UgCacq5w2dCVgB5NJyYcd6f1N/3ZgCUvRA4BzeOZqwxozIr7DzIKNsUPHt35VwM3GwQEgwGck98ekVIQHg21bNhXXqdFzIgW5pKQksmQxQTQ944zQpkdo1szxuROqhipDznFazWt1vv92FsjUD2MEUIk7f2jOVhfcXx5CLlj92/XPp4WbptK2NmXxtsuGSjaq2nqkJqzFV9uRVjoSm3ybhvilSFdhfKhIgQUp6vpPAw97ARuSs8DmekAl8jBUtz4zoovI3gN0WOWxvsVroRMgkHxYzm45yEK4vVLwNB6daA9VdCIYVtnE3FkyshJ4K8prbe9FJUzgJt8UftntQtQ/aMy1d7ZZpSIQpTUYemG/D8L7SQhFrJqVye1dotRi6VuKNLPVyBvv7rvaIMrtf8oZYlIb19C/3mG+T3+xhv9IQ4aq4xq0vOMG4iu4c0I3JyCUmRdlAo5nE9H1V8Ohq8W5u6GrTlaHN0L+Nh+TQCWLWMiQiWb25YfvIBv/WH76GXBS8/eMLtXcLLZwkffiS4vQVefpSLQvSzXvZNgfRBIDfB/jaXcAFLmR+SBctPE64/EXz+jxXPv7/j8tMN608+QD7swMsNuF6KAtzaGRCKNpdjBWXfezW5e7znNAKT9i2XZxvbqn4cDkLsGMl/c/nMCjork8H7GRG9zaW7jaOt3bR0l6q17SqFoG2K1ctaVLFZi3vlJUGR+iGjJHj+g1LvDz9ISFtZV3kpP+vXiuVFsX5QvHyWkFfgqz+xQrS8O9/+3ob1m60csLqVd5quqRDCL2XPVg5DAFt7db+0w1aVkEdWSCprdVDQA+X9WPcVZVLTjaHfu7177VKHMi5tbKm8s73ZxoK9cjSvEc77A9q8oLli+wvd9++Yg2vlZG6ZYwUok4ut3r5P+BlTatIeflAjW39XAnpwv5uP7R3ISB3bPCjYW77pQJIPB1gCUrPVObrm3BsfUA8InLV1cAMNO1Tg8nDvPN228Xvw7PCTfT8F99hDhuUlPKdgXVffXf5AQaQYt2v8bgm+35iAtX60OSfLEoSJ6PUU1LViB5GA9r3Bh1M+Nv5vI3fJC4NAhncgUnEr76+NGdP3zm3rv7dvyJ4/ZK37LlmzWjgM+pufyal8dlm+/nDYxMTExMTExB38PwD8TQD/QwD/vV9yXSYKfhfAHwD4ywB++Aso7/cB/D8BfPgFlPXrg3/j3wD+7t8t7py/DX7nd4D/8D8E/t7fA/6D/+A7qdrExMTE9xKfNOHb4BRQQ0xfdz90KQkcT8nz9TTmfzCORcTqWTnAqO4VqW6bj+mGZ9lgd2a8ew18Xe/l8zFluDHoRlbXD/f62atlfH5n7X7k1+O1fj/uuXkEwvEJ1Xc17an7zQivTcdx27y65lSJOdbpcVXuqDN9OaeZpOPaOdRnNNQ3pZgnAM/q4uP4PoIR0ZLicQmvYWyDuXbMiqQKbBnpQ0Z6qm65V6kxW1FcPd+0srbAfinun6G23ostVq2MdFIHlLQhgWhG/XU9n+eP5v+j/uM+fjSmZ2W/Rul2b87R2m+ueqFArv22j2nltjX3uhcRpJcVy4cFaUu4vBGkLbU4vLoWvj5fFLLX2MsfjMQD1m8E6QNw/Qlw+Yni3T99wfWPXpC++lAM9rWd6mKhN3ITcCSXnvZHI+urcn2Yp544ekQkDV3yaIwf7A0n97rC79geWZYaGzr1Axao/RLu473/tPZnEWQTkS31bIWUeWA/tuZUgHwppHAyQjOVuNhSD3cU+b2O75yofY1gD/Ykhn9XWX4f8/5kl7UBzt4jR0JNDvfDcXWxfu+Vq/Qu+1bvj7M94IRIDJ/1B67snidlzyt3tz6vel/7sY3G7sF4HrO87yrdE8Hqv5EY/L3E1zyYDI6+lUXuOwH24/ARe9FjJe7r97aBtD/c6+uiHTxwB2UM7bDEvfdhCyvhvl0YZ+FR+Pno+r09xsf+9XWIyj+U+cr+nJiYmJiY+LXGBwD/EMWV78SvBrb68wfo/9P/BsC77yDvFwA/dtf+EMDX30HeE4zPPwd++7e/fT5v3gB/4S8AX3zx7fOamJiY+D7jkyd8m6oiocVgbBDpSqJFurI1irPVVAxCBuGqvN3JwLeSCoeMkOaKWe2+5ScC2fbqytUpBjxxZ8a8pasMQ8LX6uXJ54h4PjOsZe3KXu4Tjl9siNxxsoFwJTUDMPbhtpHhLlDZWvvZHwcrU8T1Ebum5T7hPKO/zbDJRtimWK59vSz973tqJFOleBKe+kZZOUN1ZBVXRJypN+Ka0jMwZpuL5vDvtfcRq4VbWj9v3LUDkWCuYNnlNQqXiUW6yooJwX0vxNWxkeV66+N6bdOuCty2TtBaHv7ghepI9NU0knHqirLFubU8jGhNJIRJ45iqVGVvqgrgXJ325gy5KdavNuzPC/BWiqtmBdafFuWhxRTdL4KXz0xJW1zUJgC6CPIlQW91n7KpYsu+Hg4ZPBlYW9ZUlHgA5O0zcHsp/2+iGZoTRLQpJQ97DO0lQ+zOqgwb4mLeuprvrqE+cg/MKjkrz+bKmXFdqY4ZkC0XVWVCac9W9qyi6MW4rxLZoU/XQvSp4vKTF1x/f8fbf5SBBOS3V2xvL9jeLnj5IuH2RvDhhwn5UgjF9ZuiHn33exlv//Ovsf7eH0H/6CelbpcrZF2AdYU+X4HLivx06fb0bO2vdeW6iaApYBkBEfAq8mnfh3jP7VlTwLH68cx7ga2V263W28XK1KLoNKWheSrwY9fWlu0nz0/A0xP0egHWpcfRBWps2eo1ou4Z2soF9GIEOrA9p3ZoQlONfw20AxO5HrJIW1E+6ipYXhSXrxX5ItC0YLF19LJBbvtAIpfDV50c7tdQ9pMk0FwIGanEi/eW0LxD1D7Wl5d+zdq1751wCoi7U1fapE48rDFrA9fHYqrWdEU1jbGc9r2TmhvkYSz33AkwH+8551GN7N8ftgdHh96sT3y97Zk7rucHcD8OB/doXnsisL7/m3cDB3ZnP6iEA7fIQ7tO1ulQBv9udeD67/tYBvVTFPO4wYhlpwhuZTMZTrHtbWzbvAgPPNTTFX7Oseq3ln8WGiKsL7kJb9940XMRaU4uok8V2EE9ml8f/i67rMNaKQnL6SHd9/FbDeium7XvWUAZn0FZD4wxdPlgWrLxqntl+9YglW4Ut5efWej/Mfz7k7+/WviT+szBbcTExMTExMTExKeE/zf9/ucA/MvfQZ4/BvB//g7ymZiYmJiY+NXCJ034WqxNMeKnGo8EOBJ2mX6vLm7L3zWdGT2N8GzqOWc84RiyZEg0N5ANnowF0Fw71x/JGOOFDm3rsQTbs/73M4KX236m9EgyXk/UT56INHfKgxteysf3Cacx4xQ/z/W7R7aetcv+DoisEDwO3n2hv2cGelOD5Dyq9Jxr3CjeYjPQLo78Z2MjjqRrI1GMdDBylQjmbnQ8MaqeEblMymqGao/jGZK7Bn9IIZpzHuyquZbX6xdcM2OnFTUcyFiOaw8o5FrWMS3HseR5ZO5Em8vZqlijQxmh0Z7ml1YCXYwbytrW8/LNDZKvyIsgbUYSU/NsvBXNFacmgS6K7UnwpIDcMrBlyCKlSBs7cy+dpMf63XIlqatbx8UUlLRHaAZQCFeJiCR3gKT1rM1xIdmsJ16ieKGUblADMunS3MC+gsjMRaWLhYhAAMhoe207FJPruNS4ynpZsL97wvvffMLtTcJ+NRKvEHmSgfWDwlTTT3+44+kPgM/+aS9GaAy2z6/Y3/0Gbp/9FvIqyBfBu3/yHuvvf1Xaa+PQ5lF/hwwqX9XmHv/oLrmsAaG+4X4M47z2hL2P7dJ+HLuBlIkUgodx7vfFSCVzqyrS+YPqmltSHsJEyrpC1mUksiyWsd+uReqaLj+6JECB5YNiey5xtdNW+adVsFQPWxa3V40wtG66FNfdl2+ApJXAdd4m5LZBl3SML8x7u8hwSMQU2LrjOI99fxn8wZ97LnatXM7PuUsXCrtwGl+dr4VKw2DtO5RDSxERmI7lsnLSk71BmbxXnD4TzfXTA2wU99YIwFJA/Iyf/1TGIS7vWTv6A3F7eRyjOvC3T7QW75Vtc8i5Zm/9wM8HYxyOLRPjVmfOw3/71HI98couqEP309FhE7sekP2H+NOtujIcVvLfMaN3hLqX8qE7ch/ew3AEc47yGE6Y5fO1N+RlMJXucOiskMG6Z8hqZLZ7j9szlt7nyWEzom83C3lxT0E8MTExMTExMfFJ4IcA/vsAfgTgy3rtnwH432JUArwB8OeBMObvf4nithkAfgvA/6j+/h7A/xrAT77TGk9MTExMTPwy8EkTvjBj+kBUaahIPbhDrc8fwAbCxRleoudVi0tmFwdwyNLI5ei+I44BVBfP0ozYlge7gW75sLH/rvpOO8nrymvPA12lxmn2vZKXZ4atoC4Mr34w4x0b8h6Rt61+kWLUEShO+coKEvGEuG9DUP+DAfFO2rHKdC+lHsM3qP/gGrW6c23k21LaI4/GzsoBGjGjqj02sCPch5iAQ18QWZrWkdwBYgIhgif4gUL4+Guc3pOTjQjyZMDRgBnGWPzYOqMTtCooyqB2oKMShq7uUhWwmiqha0NpXeqXgyoAqW6Eazm5qB0VCbISuaPlvi4J2HN1YatQVHe3KVUmWfqcGcjcHg+2KQ7Z4O7nkxzd7UaxDE/BJIbL9/BsHUMNxqYQBePhD1EUlbodksk8Z+u4bBl6vWD7/IKv/9iC22eC/U1NIoCoQDbg+feLAnv5AFx+vGN5v2H58YdCju+5qHafV7z88Bm3zxfc3iR8/VtFAZxXIG1PePf+VuL3Gg+SyhhIFDPRtfs1rnEP/UV/S0CAHMo7JRTlSPbwvIj2R7+H+vyi9bXQ4RnLgw9d2TV6P4rmFrNatMSzhyRoApYXRa73lpdC2O9PglxJ39YbinJNpBD7sHXr+ifnfljCrg1kliOB7FF2u83pgPP5r9qJPf++PENysdvPDjU5lf5DHAhlGvczctTSRb87sLJV772vI1Ivqk9EzPIe5tSsYXnAcQ+yOR+Rvd8Gvh+dsj7aX8N+srx6wvvlEuk7kKncfu4/rqe4OcxzLxoH3y57zmJ2A6MynJ/lPV2c0vnBvnb33fTIHbPV2R3ivHtYghARyYf9MPIexPGKD/WRflj1DKz+ZeT6/zqmIOb/DzqE/ciT8J2YmJiYmJj4xPEGwJ8A8Dfq74b/DwpJ+0LXMoAnxPbLF3SX3f8SgP9WTfdHAP53mITvxMTExMT3AZ804SsvWzUwpa6kImUVgJE08K5E807E1oLyYUCGFVa2ApS2Go3IXabsuRO7nBboxPBtO7h1trTiDFWyjcSX7L1toZGu/q1JxmeVDFCedGbDkKsrqgtbAMD1MqbnunoVMqtDPDZSnXmC2sbO1KxmsDQjvFessTHyRKlT6teNx+LL9C5OA6OzrGtX7JKxtBn/mDQ9tngcq9q3GtRFah7NsJcVmncg5eYKd+gnR/rfJTtbG+v4pbX/DRyNg6a2NdeJ9yP5xcZNoLs1XNeRoE1SWUxKay6dW4fQOvJG3KYITkDKpY570G6R7n62GlYlCUzd3Oe6Ahd7Bp2LyoVUMoIVlWzSqubUJUN2NILKJoBk4PKNQgXYL0WRmBdBvgBLBmQH1veKvALbW8H2LmH5cMH1m1v1VtDbW+KY1nLXVERd6PUr91eknCHPz0hv3iC//9ANvFUdJE0FTMSd7yugGfqlue3NzW30PQP5qXtNp+ZqdJ8n9gfFtyMctbq0TlK9f5d9LuJVAWB/e8E3v7Fif1P63FwB61KHdgW+/k2BZIHswNe/uUD2K9L2tmeSCxl/+1yainR7q4WI3IH3P0hY3r/Fm3/y0zpOfd1GCkDZUcY1ybhefD9m7Spfcsmp1W1qI+35AAy5hW2kwr34ocP+3cdHzAX37XZU2tU9Wfz+4tSvw8GBS3HlXNZKVdJZXReB2l63HfsjPy3Yrz2Or7lvBsq7MNcpmW7lRr4UElhyjZW9aYmhvSmWl4z1X3zT9+rah9rmdR76U25bdb+sBxJYFqn7zljn46EZepewS+eWkY0xrQ83jryOmBQ87HWDu13aOx6RxZ78O3Gh25STAVGsfp608R3rP6hYo7npCUH7FvDvdv6bvQdEJCETupGKlNOotnnBaGvCeYwY1qCvv7XBKb4tzINauewRJPpeGg5KLcd91ZUvy1LGw9yvA+ObO/ISczYv6l6jwHn/eqUu6py7uXAXtvdHB0WAui/eGSOqoymGB7fkFYJlOMwyEM08zvSeMtWtfeMJpH/j8jzVXO45jyLDGrVqmpLXlLtGyg5tBlgxzKrjYz9r+c6hb0PqEIDdJex7J5HZHTQA6Cf9v3sTExMTExMTv/b4uwD+GgqRy/jTAP4XGL98U5DOcEOJCYw7aSYmJiYmJj5tfG8sAKx+bOTvmWLHwAYjHQ05w7WMMZ9WqBlCjVzW7qLZ5S3VeFzii0ojZ0N8C5WJJ44HIu8ePMlyVrfAhe6xEq5MJj3VGavuqVaY1PUqE6/iHep4RyFsODEoHsquipzB0Hqv3AdKnXsqrKakPahZ80gU81z3dTFSbnEKHeA4puFcJ1L/nlrF4zUKWjZYSsJgqLw3R9n9ob8Wpj+fV9rKRq/LUp4R7f2hIuhKXWnq0qb6hdaDJZXnDapfiEKBbEV9mm5dpW/uaTWhksHj2tBKuDcyuZZx8FQgzFALZF0BfBjTJGewN+Lt7PCDRzS2r5oT52NUyIQ7+8eQD8oYkYcDYWK17q+yK7Am5GvC9lRIQLNxiwJyQ+tLrcR9Xss4SZZBnS07gATs13K/BFy2H8H2DLx8vpSzxX59Wcxjce6cW3vO57rcIYMP8GN2bww9PBESkXdnZd47VALUgxFF3avr0khfAP0wQ+rj14jYHW3tyqaQSx0bLd2+PSekvcTFLg/2cdSlEL1GuohWsvebjOWbvSi3rTxgfN9F70i3rj76nXyvj7zS8lDuEaHy9EydeofcjWKdno7pa+bTI6X5z4J73wRndX1Uj3vz1hPjH6P45e9HfxDvrEw6HDNcO2v3YT98vP5eM18aoXtS3sO2e0XxR6AcODohzF/b//fmSQRWgw+Vcaprjn3LeKgevvct2w9fDQffXvNsI6Dp99eAlcEiAL7jdToxMTExMTEx8QuDoLhx/uPBvQuKa+aJX0U8PQH/2r8G/Cv/yi+7JhMTExO/Xvi0Cd+UivKJ3dOZ4WbbR6Mukx63raddl54e6IaXyFBvf+dcLM1LQmMQIsNtLVdu23grazGEGwl4pk608pxRWpMUcoMNba8xSkdGRXODbVjkmIbrx/VJ6DEp7RlTum37qMDJrk2NJEldYWpj5lW83tUocIzFy+rbnLuqUaQqTHMnawMFXqn74i53FeSpGz+KaWnqLDOqN3UHiopHUlW7nhljUWaTOructafUUY7XAJq3TWYy1AMgEjgrpM573W9ATgPRLCkVdXHegVSURaa8PhDSrJYHgEQuHc3lKSsPTfVrserYFeHQaCKgrbyLdLLYFKgVQ/y+SIFFEKeyLApeFHJfq0o+oStrqzt1UTRlqZjiF9WVsKIThlKIxP0i0BVIN2B5Adb3GXkppH66dTfR+QLsz6ny32Vt6GUZ4/YCkG0f/i77QO6qy3UB3jxDvv4aumlRi9qU9ntF9YzQ7mEkg9jt6aAytN8hNI7j/sZ5hi5YDXUO+NivvYGVxE2lf5vCs/a37VsqUhTAu2J/c8H2JmF/Brbn0rfpBqzvgfVrRV7KvpVXYH8u/25XAKJN8St7JeTb4i+/r1/XObYC2zvgGyR8CUB2baSkiiBttO/ZXpdSaceOMucPrsspfu9BzTcSIOKVmIGKcoihzOo7HgtLB4z1YdfDXnVH66wfUElVcWf7zFIOHlzWQvpeSl0lZzqIJVDQvm6Hour4Lt/coKtA09L27A8/EFx+Crz5gx3ppayfDz8obrb3p0LCSwYuXynwUtbY9Q8+IL2/lXdLSuX9xHvnWlSR8nLr3blUJfp2VOSOa8oR/UDva1NZeiLsTC1JzzflIVAIckeGtbGt75u2nm0c3b53cHtb8+Q4wweXwky6sXcNf1AAOCX8ThXGnN7yvqf6DVwVi0hXedp6oDYdXESzgv0RYcplm7cR7477BEPs5iTtvdLqGo39K4nLoe5cDyqzxc/1anKeL6FrYTe2HgEh21Tn+z4+y3u+n0f8nWb1jea31f+MCPfvLh+X195T5mLa3B57MjzTQTqgfLPR79bOUpW+nw5KYEsTHEgr7bPyKMwGh4vx6t9ar3YvigVcMu9pmhcaysOe3VG+OycmJiYmJiYmJiZ+wfjRj4B/998Fvvzyl12TiYmJiV8vfNpWADN+A6PaS7UaY2o6IxSbS0FSGrIB7aD2TSM5acbaZjwbDYBqMXINRgyTmrcpcNnI7VWrDwyDoYqX8myErLV5zzXWl6sfuw71RLfFB+O+SYJGcHtj+D2jHOfh+9jKitRUbAg8M56bEZONwQBaXFPOx4yTrzT6HlxAc2xCp4gVUhyzQXH43QiP15QblDHkGSitRbqb1OImshJy5nLVGKwkhTAGRiNlIjKZMLj47Y2pfdIqHTfG0jX34WSEbOUuI/HLc8TcP2cdyWKV0cVi6xcyMgdEZYPU9bAUt7E2N01Zy/0BFBIIqZO/umvba1SKy9q8oip160O5kId5FWgqhKLWMyLpVhSIl68KMXx7l6CXenhlry6MF2tr3SeStHi3JZYv6t6Saixff5Ch7j+V0D/EfQ3Gebjn1GCoMcX7IYJjPMqWj3fxCtwnuiShsb6e2LC9ssYtbjFeiSA05ej+dsX+lJBXQdrQYyAnG4eS7fpNUVwv74HtLcocqKS95DI+atvdDkCB5UMhkG9vKqtv3bXtJY6zpkaCNGJzr3MEuZDXp80fjf3DoQ8+nHCmDnXj0NzEPvBkMBBRtkdzuoC0Gw4FmGKNSYllgVyv43NcP+khFwBA13rYYUF7n1sM+xZ/egee/kixvlekDxaPt6h9lw+lnvtTPUCxlnFPLxlyy2Ut8d5i76566GXYk2m+lcx07ANBbeuRNGtkPNw4jYmO/ct9bkrrPXAR7ddaVIYn6/399t5Ixz3RcOIe+RBr1ilYG9n46B3Hefh3dFQWt6P+rjyel0u7F6qc/Rrw33OeRGXS3O+r9kw0FsCBPGyI3k0Ree7Xds5D+3x5rb5AX1Pte43yOtuno/4K3qFWptD4NlLWvsNEju/as++s2uaW0s8Z65PajsNhpHvkNNwhB3OJTLHT26GK+v0dxVAO4wXbgQIjhlP3KlBuBOSsOyA3KJvtmXqIDcB5rF9uT3mwfh/YezMihhf65o1OVU1MTExMTEz8fPAlgP8pgP8TgP/NL7kunzr+KoD/JoC/8MuuyMS3wCvPuD7EP/yHwN/7e8Df//vfTX4TExMT31fcscB/IvCGIjZi+XiJphZkwxgrCJlIs+c9ljQaKVW7QjdSjubcXTd7A5KRvd7I/FqE5TnDsBmsozfsidFyeMaTxJbGjEhRPnYtIoKj8Yque5iR1f/AEVWc1uAPBXDZ99pgeQ2P+PrfIc08aqxZNlz6H0ZkcBzSRPOTiXsfF9XHXo7cG9o9HY3EYYxcnrcWUzdytRz1CR+WMCKYIW4MveG0xfClNX42zkNd8lgWzSUme814bhx5iUFqsWO5j23+oLlo1qWQToWUtL+luXg25W7agPRS7m/PAqylzaLmotj2BowEv+/XVOu3HOMkqo2lGbsfkHnhvQhVcaf+IMAZHrlQj8B7g5G+lWv1e5ypR/fnVNwwr5W8rcInpfEBCqG7vFesXxfSUDY0dS+rfKWO0fKh/m3jeVHkK9UzV2Ix5zIedjjH6v7aJtN4hfCHaKK9D+jvpkf/Z3WIpRyUS0SvV8dBczuEwAcscFn7uyP3uqoje1ud19S8FwCA1oMY9u5Mu+Lydcb6TUa69b1Ddq1xekuaEtqhlJe2clAFfu/iAwj+/faoLx6AlfGn+fj3vZ/njlgf8MD17aPxDtM59ezhfnP1Lef5e+L3Y8Fr3NbOvbKIuB3UknaPYLGv1fXvxyAk8D35Xctv64Tr8qhMUi4PbXmQflA/A3H7DqR/PvbTvW/QYc6N375D/o/m4NkBiNOyxrnY41QHB1eibyh7l/O3z0Ca/wz/+3MWg/01IQ7Ig8MhHX83RdfD+L25//9L9N0V/X/AxMTExMTExC8IbwD8twH89V92Rb4H+DMA/hsAfuPnXI6gEPXvfs7lTHwb/PN/DvxH/xHwn/1nv+yaTExMTPxq49NW+ALFpbMjJFsMX+BoTAW6AVjIeCOpXDdDlshISpnxZHOqBgMbj3MuZI1Ii9frMZDEZ2oRVtQCXdlrygcrj+vIMYRzrgYq5/7TnjXXlmaUT1a2M45ZOaxQW5bef0wQZ9dfjIg45nK8QZBdMUdqGHJhOuRrZLT4vkiHZ1QVYgoadiNoedW2m3KnGR3NaEdlHIzpi5BxrxBB0Er6mjqjkauVvKR51ckDqYTd3gx/zVW0Ebum4qxzYDDtVRexxzxPDJ6mDGnzTYs6RLntzmjp3TgDXVHCBwnsGhvpQ9Kprj12QSm1rZ6nNreMpj6KlNgwMq3XV5dUCKhUVb65KmtR+jFfUlfRtkwKydRixrb9pVYvAWkH1m8qcZgV23NRAckLekzZvTCXosB+FUCAfElIW0Z6qSzlMsaqzfXfxOvI5sqyQC4r8PzU3G8DKMpRNhYvcr7e9r3GAMaBlCvqRTOeO8UdK5N4/6x5+nxOcbanisAUoCoohB/Qx+yWIbcdelnw4YsFL58V9762daatjIloGRNoIeRlr662f4pKxqMpfO3Z5YWesZiyO5CvgC5a1dg7sC3QS92vbQ+tBCdEilvjfYdscfubcpvVvLx3WH9ESkBT5/JeWPe0A8kfqYMDBaURV0Kuv4UVlKXSnaCm63K9Qp6foZe1h0zI6LF6bW74dx/9nZ8W5EtRzaethDBYv9oriat4/+Va1PQA0laUv3lNZX1lG0dao9Wdsy7VGwO3PR/XE0SKStq7xjXw9Zxo/1MotJfx/2fv34N127K6QPA35lzft/c+59xz781M8kkiiaJAgRiC0hiEQpstj5KAKsMqKuhoOzTEUumQwA4iKBUD1LJbqSrEsovqaLosq6U7qg2C6tYStaFtopTKBpTWInhZAgkFmWTmzfs4j72/b805+o85x5xjjjXX+r5zX+eee+cv8ubZez3m+7H2+M3fGLq/entiXt/IuuEFKkkp/W5dc9v08z3r1phlPlqCuOfdpCisl6pYPh5LPUoeakza8qvM+tc3CU1Kh4y0WlnqaT0THDsu5XW5JP81heyKC2IAy71p7eBKbOdAV0kssPNa/dy0lB1Dup80vK9jXNfNKpctZL5ZF9myh1L6fqFpKm3Ix7kSzZ250bT1Vrvq9zqH6sr3jbm+aIec9sJteSZC2ahmi4tnIM3vfK0btkDSLN9fXGOEe1fJViD/Ww8/Napfe6CtuEg3hGzv4JtKe5EWqXUH6ntUCG75V+L/vpyDGAMDAwMDAwMDbxncAfBXAfwTAN/5mMsyMDAwMDDwyvDkK3wFYhRk5Wa1Ifw6Rq8V5e2aEXo1a3vi377TU/TIfzYvnUzk5r/uOzoPnYZSLmKrHYRk7KkWtEGLqCXpNInXq1dPLbKmILH39X9bRuG1tLRx3ao+emTXWrns9XPVNxpWfXMC2p3ywojZMQYuYsetpcvcqnTtOLDq3zW34WvvrN2T8mm3r4v5tqL8aQhnXlckl1eW46V1iyp9r+aEZB3FTWwqX43fqn4G1DxEIfMqkZUNvRGNpZoiStqi3i11zNfAQLicwDu3JAug3rVzrbNWrY4J13FtbcZ3UUl1DPRnx7/spL2qQOwpk+Rd/Z/r3ENt13KdAJ4I8SKRsnFCUvnG1D/IRCAIRYntbzi7eEYhFEuTiELYV1K4qIU9wFe7FI/9OIPm2B4CUCj91ltn1yAq6q11Y8tNtqSx9buOuSm/9/pYl6O3Pmh4n4jefKBC9135PR9+6ebFDH89wx1lnqEos5mQ1fKE6NPcciH1m6jsIcT9sVWCguuBjkU/6HmmyJLtAwrKy8AarGvzzmGN9CMv3uldK2ltzMOF0lGTY733ziGChJhTBN1q25yxz3XT3/rWOkXaWvTG/Znl6ilJG8XuVjue+kbo7qMrfXnGt2fz7Kly6fQ6B3oWsNc0+b6mIl47TNSDVijDtLtaY5bhGKhdt/TapDyB9Op0ljcKi1PrQFO0jgpe9mL5Bmo8jJh2kvjuel88Z8/YWo9tuJaBgYGBgYGBgYEOHIBnATz1uAvypsLDh8A/+Aev3AVzCMA//sfAP/2n47N2YGBg4Bw82QpfRbYASOpbISZ7cbAsgda9ptzTCaEip+bld224tcSuKB28a3Yi0sSoepYdFYKBJR6YfU4MYNmdNHun3L12drseiazVq9b4p1XBPYO0tClVYxocpfYOISlx9fOnVE1rO3RWmHCIKO4jCzHXcZ+4ZgzNypRSZ1GrxJji6IrBUAyYOhZd/rc8p42RNt6fUZKSer8QzUKybhntmGsfzDN4mopCjICkRPEe5F1pm6a8YuQMocTwbQyLhThVKl25p1TGRFnJE0MlagXel+dKmvOsyFM133oqbz2WrJFT1MaUy2iNl+KSOAQQfFY0dYzxevzJGPE+xR9WZDd5XxXqck2TvZ6qMtMReCKk+K6cY7LmjplcauZjKAQiBWTXssjXKKlLM8lImgzOZHJSlDKOdz0o7uCff1DrlscFBUVE5nlKgVPZnENiMqmMfXIzeGZwZJBHmU+rhx/0OqEVfHoNI1JFV2kVVZEhAeyc0e0fY+kT6xJYykbHOSkIldKXOD8XAThZi9r2jDvgeCeCQorj65+jQhr6Q1JpRZ+IYfbArV+PoAgc7uTp4YAwpX7yN4xwRYk83qX3kgvtFGf38OwF9nOE/9jzkGFh47uSrAXSDEIUGhQ1diYGOKCq0VjFqz/RvtJ+BTIXRKHZI8303qb7CXL7BMmrMU3g3ZRi85Y1PIIjpXUuH8aiYwDFiHiRvXSotdU/dz/th89OYA8ER9gRIe7T/Ay7tF/6Q8juuFN/RE9wSIcq/MNj685Zx+41dU1rEAypFZZ7Q2mcun6WuRDN3CqukF0lyWxsVK3Ozn3QeGNQCsaey/9Fj1hiM8/lot5U7zbxdm35evXYKEtTJ6mXvGMPsun3TX6V9DOEde/wVY9U7B2WWSMnjctgSb052GK/n3R59H2lMl2Q7fpbQ5enk4Yua1mDJW/pCzsWe6r9EFKZpvqJv6n2l/mvv5ty37Eu/1oZTPk16cm67KVZlnuRzqfUWQ4XqN9pN1VSV88tu2fp/U3F623GhWtjWZ+OP92Oz+a7Tx/K6xxkKnF/PbA4BFfaQX/noH53ORmPK0R69vICX7/nireVl+O6emBgYGBgYGBgYOBVwPPPA3/mzwD/7r8LfP7nv/x0jkfgr/5V4Gd/9lUr2sDAwMCbGk804SsqXhJjlDYobakBhYyNjGLmE0LTZyJzjfi0JJYYyjYUN6LoY++an+sDmdQRwnphXK6G8pJer0w90kUb5+JKWa3xu+Tp6vO2PUJOSxkUi9FNXAzq51U9VwlfMcBqsv6UotA5NK1l24Coumx2rh4QmOfNo2HFeBtj657TqKcaw6ZcV4S1KNOSy8Rk4CvlYc73VX2z++2Sb48g1XUFFMG65g4wY5qqMdAYLouraCLw1FkWenlopewaGdRV78Zq8ASSt0JbFwtHyQgq7/ees4cDFPHeEB72QIRVj4JQBhUz6Mh17gnhyMiGZoAnh7hL5LC/STFh3bGWz4VENoZ9clHLVK9RBNwxXTvccXBHj/1uKoQuHCeykiopnWIAE7hcyGsKETBl97CNqigR6sWNuLSRnifqsEr6dYO8gjLAMy9dlHbIgMZVZjHEU+ueW69DJUalEC6pLSqpvcgiPXZBCBeJnJ2OgDvkeewyYTsT3Jzj9t4wXMgutRmYHnLqox2yUje1OWsynwFcU4kH/MnftMed2x53n3uxtkEktS7nOs9CmKyMb47g6BI5r+dML3ZzeYfTXz7SXpoEa1wOx1YRp/u6d0gCuf9DKOtbWcvUoQ9WPwtomtLBFH2gIlbls6wtsj+L62Cm7GpZk00AQInEBYC4I8xXDjdPEaYbTuR9JnvTnpjL7lJfpYMYZq4DaX0mquuX7+x/kYHj3I7zBdFmCD7bR51507S5LVe53e+TxsXzGmw5Lels0BBv9nCHLeeasnftEIHOHyh9y3Zs6oNya/XqkJyVaF/5npFyyvpkvwnze6xdAve+N3okuOSRiVXEuCy7JfOB/jjS6Wry0YaYkLqdU07ZE9ZIZluuXrqWSJb1JYeIYDtXDbbI066bbTXelyEo8togJHTvcAHQrq/musyd3mEDq8rtHq5Q3yglxIe4di4vmm8TR2WNJFlz7HOO6hh1MX3nSKxgvcaKN4FyQMqQuq6zjslzAwMDAwMDA48JvwvA/xHAfwrgXzzmsgwMDAwMDAy8VfDmPfotLuFWjLQFYhhcI4MeAY37ZZvH4uFKChSX0GKkc8trC6JZ/pXrYoBcc7epjUv2mYbcMcbFHsHdu9+73ivzOdCqPm10tIbFhZE+Lg2bOr3Ou7RWxp6KRpOSWy4HRZHay6NXHj0me8SOJhbM/dbwqQyKXQVhJdB6rgd1eRdl7qH3jDYunlKW2LlnDaU6HTFonuM+VZetRwb0iqII3uZxRutOvVxnSFxS9j69TygxYLWrYSGjhDjkCUlhSun9FOs3EY/hwiHup1r2GFu3xbltUn52XOVrWQ1e6maJOT231oiojlJr8fvKwYeSR+/ntbRs/kBzKEbaW6+HhXxXiLlt4TJhm/nu4kZYpkcE/JExPYypLzwSERy4qLArwV7JeQoAzYmkpwjcPAvcPK3aMZpy6rrZubqFs9x4GnfPp9z+9g4TybNNUbn7cynXmopNDqeQmafSHsw1zEJE6g9vDlxIUobAZQfEiRD2wHwrpeGC2mvLgQyu8XtnVT69j27tY/KsHBIxeyn1+qWz367Gje0d5mpf7Pcdln1xrpvZHsHVVfr3X1ZF7R/kUL+0e7Z6piFUe4fBtupyqp4n7jeeN069a/ckRUCWevQIYP3uy4G8aw/hbIyHNZAdZ71vIvl9K91ee5U22GhLuy7ZskmZtvJ26jm046xHxq6Nza7qegvq+6iL2JnXnfub+Smyd+mu2mXvI2aN7bl+7pQbdq/femdgYGBgYGDgdcCnAvg3AbzrcRfkCYQD8A68/i6WLwB8Sv534I2Al14CPvKRetZ9YGBgYOA0nmiFbxPTEkgKAO+TukgUYA7ZFWrH+Au0Ri1x/1gMl+aeIYZJXJL6ZARMCiiVBmeDtBijrVtnVQZ2ALFLJIc2SocITL6qg5mTAlkTwtqg6bBKbjbPqDIWxZN9tuOOscArgkOgFVrWpbZO3yqfrKF0nisppd3yxVj6GEB11Qy0sW+zCqXUoadkMQqYYiTVzxElfsgoRlN5aruI+qNVS2X1hY2bSi65aF5DTKQuETV1knYmnxQqjWvnrJitCrBl2STWMhG1qmzj+rmoQO0BAW0sjEIc+1ZtIu3aGzLSdiUvQ6ZYMlfueQ+47MJZBFqiUNax9azbTKPmIu/BrMaSlFWTW4QyrilycadcyEVbpUxgxVu79GwEwl5Ix6QUZQ/4m+RaeLph8BEl/isYcHP+Ped/vCI8+LTbuPq1h/D3D+k5ZFeQ4vp9mlIzzmZ+OgfeTXAX+1T/6+t6L8+H4qbcqXXG/q7XlJyuGPmLa2yzxjSqPeaixto6RNDMlc66SCEm5ScRGFmdf4zgnW/msY6bG3eUiPdjXhc8MN/KZO0M0JwIdnGlLe0fPeBmwnTNuHgh4v67PcKOwI4RL1K/CsnrDwBAcEdgfopx8zQhPn0bdJNcCBNzHqu5v2QdQb62plDniLJxyZzTc7MsQ3VdbAgoTexYt/d6LbEeFOT3M8m9tM+5xIibAx6035X1pRCuc0jzyrnijYOYwc6XeVNcOsu6vEtp+ANnQp4Q9kpFf0zkOyj1eZwI/gj4I7C/F3Hx3A3oxfvAflcPT03p24DUHl0IaJ/Hp3gCCAF8c1PHtZDZ0lXidrW0Y123U1NWFWB5X+aV3oPsXAO6ByS457GEuagtJc8e4dpVbZ6Tn/RJTrPnErirsDWun8s8F9W3IlGrVwyVn3jAsGWXOufrZbSuEJPyfFelbeZMo5zu1Id7/aTTEaWv/kaQOts0zyEf7by2rsCzW/xuXWy5LPT812PR5rlyjec57YniKly+yfQYX1EKc6/+Up7jsc5/5ZWgmUMdZTe7dTfj0vck7svVN+OmUh6oB+2UW3gWV9mS3jFUjzR5DQA5kBz6O851vGuvPkIsR3nPKH7JKIf1Qc0eCVz27qjKkveP8tyb93zvwMDAwMDAwJsR7wDwXUhxdV9PfAGA/xOA/wjAj7zOeQ/08F/9V8D3fm8ifgcGBgYGzsMTTfgWiBHVJ1domgTmaBQoQDYsGuOQdZNs79n8xDAlbiGF2IhcDMyFoLUqmFyG3n3Khv2iXNJGIjEQe2O4WSOwddprBsutNMTltSYABWttskY26/QtGdGk2zFu6vesYqpnPFVGYf17McArcrBHbDBzy1mqdCyhWlz7CalPVN3pWuLVoRrt1hR8Ws275c71TOh0NAHRpK+JJYs1d9GL/neK9O0YJHU/sZAI6LfFguwK7bsCV0nQWg41Dh9FFdUUT9qd0fjpJOSDF6iKYAfMVx5hl+67ORtxkcnEgJKGvEeqWFXpmwhFILt+vphAIWZXwBLrN2byuSU5GziUdTBVhgHE0s5lDBh3sfVZNIb1VMgUX7GU277bIzPOUCg2Y4tXCK3ezzH/X4+UDAx/IEwPCP6aEimo7zMASq6fi2KXUVS7bk5t628AgHG8nd1w535yAYUwjkjvAcD81AUmZtD1sZCIsg/JwQCyc2BReAdLoBacUp6tobfu9/pL9XVPTbdYNziCHIFjW2baTRBXyaUdzO8Amp/hkAhyUQKXcYGinJd/3ZGxC7mfcruyy3G3Xeqb3b0A9/C4GM9Y9EFa55mo5q1VsPaAliLki9JX9kbXHmjQZCfpdpb+WPvWyH1Q22ZlHRPCqxNre0EErmDNdXSTb4901Pls5NGQwda1tF0/7Lqt691rozXS9Az38gvYQ2XnYu37Q+dp67pW7t7306l+1G6OJW2b91bZ1tAj8E+l0TvM0DvIsHmIsO+nf1PZvuZm3Nxvyt4Z0zXcgHpWfePUwy6debIo8IkDFvabRwheTfr23pG0u2Ey7Lcytc/34gUPDAwMDAwMvI74PQCuAPx9AEOmeB4ckrr36nXOdwfg6fzvwBsBDx8CL7zwuEsxMDAw8GThiSZ8ORvJ2LlMdEyJCBEFrDXwCqIyvgp5quP2ilKDqFX2yjUhEL1rrlF+liKqOlDykR+nbDCW/EKsZSjpLA1aFGKjtinQCg5Tvi5hUoy8nNxpynti1Ju0wiw/K+VZM+idMiJqFY+U37rfJapxdSU9Uc3oPHpqJENKlHc7z3Td/naLXNMsStuOiqsLIWecS7F4iYBpAoUAFvIyclHrNoZF70qs35zISj3s+IqJM+u59tPKNCH8bExba0g0JH8pq6QNLMkpIe5Ku1jDMVeLKrl032H7IIaMCzGSGhK8q+yR9LxfjxsJ1HkueTMnHlHiZWdyniKDJ5fIJd+SeewdjncnhAvKat50WCPuCO6QYsUmcjGlT0LehkQixokgpwv8DRcycr6d4vjuPvmw1kmmQo4HS4Gru2IN54yKO6nciJNhWZSiJUarJjq8r2RviZ+bnuXefOmRClptb1V+nbFDjsBsyJMY05q8m9L6LuuCc0VBy5MpDyfl5/QAQKSsxAVm9TeiDL/jHeT9IfWFmxm7+ynWLHFSiR7Y4frtQNwDPKX8KaZYv0B6V8bDzdt2cDcz/GGu/aFjU/vMWvbGeGqEWg1R8+/a+jXrW+4zZk4HAWRN1YSKJgW19wUNQ3Yxc1KsiapRDotozkqp5lJH5PI6Ai4uFLmXn4dv5zlR9cARU9uwTIPIlYihpNxNh6pS8003DH8dC8ELQnb3nP51R8b+uWvQw0NTN77cpXljvSb4HANevhkmDxxXCBUicOSG7NVx2htIe+s9r6jwOmTvqcNZvXdOHbqQ62ruNNc7rpebvtWqyDWsurbN6fdISD0uRakuatHegRHtvUF/32wRopa8tXOhl/a5ZG8uRylzL29dvh5h2iOX7XgQSDupMdCoXPU+BtOWvcMFPaJe31v7rtFlh/mm2vIaYdqm8RahD5jIeGuyM3Ga9Tiw943St1HY52c1qcydPFjqY9tJlLvyPWHSbr675HdHLYGc73P+G6HE7pVDowEoqlz1fErPHHSTe0XRKx8HG4eG1sjkgYGBgYGBgdcYBOAPA/gggH+MQfgODAwMDAwMvNZ4oglf4kSQUIxATKfvmQjYTcV1ZHWzZoztheDpGGALQWnIXv0ec1XzCgHoXSJy9XP5eoHNy6p1S+Vo+btWvmrjuTYia4PZlpLIZTLbUVsGaS/vav11fWwb6bQbAlER5Pleo7A1bdSUT4yoa8R2qYNS6p5QMzWx4yTvXBY+HKvxvqMmaVyZ5mvaxbJ9jrKhm7UxUwywlkglSoSHuAeXZ2DULmLEk2bIMW2TorhDxOk04rJOOfN+YxU3psrYKdDqlGja3BHgppZMlnSEmIzKpaJcj52+7biZbbBQnCsjp3av2SG6yPtExgNAYBCym2Dnsgvltk7schsz4I4xKW+zwpZ3Hg+fTQdO/DVnN/OJQGRHCBfIpCxhvqwklZtzPFNCijmbiV7Bw7d7uKc97jDgbmbQ9Vznk5BPU51bZJXOW+goEi0ZxAAwd9JcUwLmckCM6spIr12ew1Pj0py3jNDiXps5eWpwhjwK2aV/no8UGJcvRBxCamRRhfoD0tmCkIlBUYPOjOkhI+xzP+wIvrjNTMS9O1BWXlNRYB/vZHaSAXcEdvcZVx+9hntwLOUokDUh8DaZkg9cNO2xFtMaiXRtYoqukUX2cI0pV3lGyPQt0suuIyEsyAWaJvDkwVMlf0r/gSvxq9YtOtr1gsBXe4RLj7hDUs8D2AUUzxeJCEb9mdIBiuTOO68xV5fJNbTP6zFRWptntR7oAzRyqEoOY60o4grpK262u14K1AEKDb032uv2Z6uK7T2vXRuvqUO3FLzqPe3WuCEye8pLvYf0lL/yryV7dRJ2n+/Vkzm5+rXfPppc7OWt6ymku7iK7pHgG4e/Fvdze7I+kKa/k9YU2TodrWLufUv16qTulbbr9E0plyGJl1Wi5beA3i97+0NzYEKVy5ZDr0lm/KVDBJUsXowDW5f0UvfQglW2i3vnlB417pgXngtW1LpWzZs8YjCAUL/fbF6nPOCsQUJVyLeWELb5+w7I4Sya7y7zbcWxDaWi3WsDWQU+yN6BgYGBgYHz8JkA/gyA3/wapP0pAP5zAD8I4L98DdIfGBgYGBgYGEjYZsne6NBGthBBMcdP1GoioBo7unETjbHtlOFPk5SoBmj7fve6Nji55bUt41xz3ZRh8b69H1W6ulyaAG9cwKJfrrX8zr3eQ4zrRIgtw0q9C+mxpvTR99baTseD7ZWDljFILVZd1kq+wMk0urCHFBblc42yQ4ig1bwiwyqHuzjlAvBRXE3rGL09MiXyaaOkut+oRtewdt9VwzGZccXelbJyJqXYEN5C3rFziDuXFKAEuBnQLqC18jDFIU2/p/8yYSXPU3qOKf03XxKOtwjHOxPixVTV+D1ywB64EBeRrwRCXJxyjdojN7ZckL7csnRAdj4ww19zjvHK1U13RI6VmNbdKNwEIal0HVLM5UwGAyjEPAXAHbJyW8T5Exo33P4G8C/dJPWXtJst8zlrolE9nwXbpo+y9q6l1yWdevuNqadT67BJo3jakLMBdm2PbX/GvU9zy2dyndSeKnPFVfI+HcrI6ZZY1z6RvUT9fDsQLx2n1hZe+abQ69LmGqzR27u25sraXnfu+1D7kCHMCtb2GvvOWj5b77+cPVCjqERXxuoKFn1hydlXMnd63yprOHW/l17vfXt9iyw+B5r8tvO3l3bZb8yBxt539Ck30Vvo5WPTKuvLiscJRQ5vHeorcMtvqJPfG6cQ67qw+HbiWL+Rtr6DztnXKe//r3SeDQwMDAwMvCXxNID/OYBPfw3SvkJy7fyFAH4DgMvXII83E2YAvwbg+cdcjoGBgYGBgScPT7TCF0BLWmbFanJdmv9z6jmBdo2sCQ0yBhfvgOMMmkNxxazVOQtXjsyJMOLs3lnI3zkpTBKZJAboCICb9Cx50fxr1Sz6vq2LRlbVLdpM6hcZOM4tIRozaa6NilpdCKC4a5T8mauSBmgVmmIAFzezWvljjYVAcker814jlazaRBvCrTtFa6wTN4kxgqYNBZP5uag/FLO3cH0qqhKOYKb2XaKiCm7r0zHOhdAqP/QjKp5kGbOU+pMl7jLM86LIta6eC3GjVGlGaViUbFIu/b4ubxmPvnVZXVQ8WbESYlJspoYBdPqieinz0KeqKrfTlOtQFDzWLXEI1UCrCXMxhhYy0zfzj7hV7adxiC6Oz15ivu1T3N4c29WFNAbCngopJfFi/U1Sk7IH/IEzWZjcPAOAO3Ihs+KOEPfAS5+6w+XzHrc+Avj7B2COqa1cnh/OJSXr5EBzivnLuwm03zXztSEQVZzo1Xi+Wk2lXYpa15l6PRQX0UAxsBfVu3Z/qsYXZVeVHB0SI6uM8jeHlA8AmgCwxMFOHh0al/STBxPBHyKmG0K4IcRdJdndMfUPOwAuXT/ezoT+hLQUewf2nLz63nYIF7kqu/Sey8JkN1dy/vI5xtVzM+jeg6QmdS6NbaJCNjJRG8e1R8iXNSYmd7rqPu2mhRqTbJ8xL5Ts0g+b10SNrVWBki9Rs8615V2S2pT7AY6W+xql8Ars0z2KMamAAeBoDl44h/nOHvMth5hFmZRjYXNWyicSmBB2Oeb1Xkh4Bh3n5K48cvWuUfYbFMVvcz3/zJNP+/Xa4TDKc0kfsJmmRPSKxwwNp9YaTahtHawq3weq7YyCsigUmzmV+8TGsdXEZk6PnWmXNaXp2ndFzmPhFcPuu84BPu0FoKr0L++EAByPYG++ryRfTexqlaiMV7tu9dSpuu165KCk3+uLLZfNzFV9bL+P5F3bzjrvtXEgeeiy6u8s+7z9RuwpmPUzOe1SUju+dlPa89V+3u3j8noeT7q/NOS70K5Z1iW3dfct/SteXKQcuo87hH3ZZwIW34TNrDblJEreJ9j7xhWzjLW1wxvlvoTjUHuk/nuierjRa04ug/67I7d/VfV6IFavGF2Xzjv1p1yIAKvnyeXvp36M5IGBgYGBgYHXG1+N5N75DwP40cdcljcyPgHgmwB8FYBvfLxFGRgYGBgYeMLwyJKrH/mRH8FXf/VX473vfS+ICD/wAz/Q3GdmfNu3fRve85734OrqCh/84Afx8z//880zzz33HL7+678ed+/exTPPPIM/8kf+CO7du/fyaiBGETGCWGOmNtKoZwrkGbkWloZPtgTdCfULFfKPCnnEYgTPBi1REhUj3Rrxq8vWkFDcNXY16YRY/9MG9aj+03lZosu2zRpMXLWuAVWM3rrMNl1tNBXDnjUSagO1VZPZOG9rWKvPCQXHmqq0GPGssd/7hUqkl86mckSUHwLr2lUfeFD3TirLNOFELpHscq2TXjduL0cslLpCqCKTsdooaWFV8GV+KiOofV7yXFMEP6IKZ6H4yzF7e2lTPsgRJ4dwtUO4ctUNMwMUkZS8lH4WEnh6mJSn7gj4I2d3zpmM3FFR9bIHwo4wXxHCRf7vKhFcceeqC1zmRHgKby9dQ1Rd6doxt+IqeDH2eu3XUWeVuIlkxpyaq5sK87WyafRU+bLO+Ep+iBIbDvA3Ae7AhSBMDyAR6VP6T1xoxx0QrpQdnHM/OELYJ6LYHziT9sDxNjDfSjGBeUrtPl0z3E1s16E8lkuIAahxxozqrtNAzZ3aBlTau7S5Xud66+qivVfuyaEd3dYLpWlnXetBE3Nm/Ek7sGqfQvYCOYZvm0e4cpgv0xyQgy5ygKImnFXchCYWNmJcetiQT4Jg9rzeXh4765okVbwU5MMnNu45Nsb92l5q+0/3iYyf3P+sD7JImpKG/t3m28vzlFJ4TXUsRFvHpW4XMa3XawrL7v5uoce+JZXtfFjkrcrafO+Y74eXg1OeQ4D2m8a+J2W097e8nmyVt0fy2vc6+XEIdWxZbye9/rIumnWddH9ol8xraeoDEbr85ltxMe7t+JU62rbV40KVtavg7bVtj+xtXEcv50lvDei6f5bvGX2wQH/nlDTNt1jxdpDXoFPjovetNjCQ8Yb7u35gYGDgscAB+BoAvx/AK/g2PAt7AE9hEcJrwIABPABweNwFGRgYGBgYeOLwyITv/fv38fmf//n4G3/jb3Tv/5W/8lfw3d/93fie7/kefOhDH8Lt27fx5V/+5bi+vi7PfP3Xfz1+6qd+Cv/oH/0j/N2/+3fxIz/yI/iGb/iGRy+9NQCJ+0bfGpcXpK88Z8lOa1Qs5EJVn1BMpA/NoTUqSzE0kZuNTzwZFWFQBqiTxBwt/wOq0WdBAhujWqmPIXnXXCkLuR1U+XrGJO2SWhvsegZka2AsShDbN66SENaYLGVZMw5rElwTqtYwuWFQZkv2L+qhjKGOmjZYuFF2OV6karticA6hKFAbFapSwlJvfK6UBzHF0myMjFIWbRgs94yyxbtUVlGuRVWG0j7KYEjGoKyvl7kSUzrRGHxFGahVKpY0cYRubEJ1WEHabtXV5IYiJ+UjxmUsxgQFhpvVWNDNGhk8Ocx3djjecpgvcqxYoCgY2RPczHAz4I/A/iXG/h7DHzi5/71BJqkSkSixR8OOEC5TjNj5CgiXiWAMF5QIrZxHIrq4dWnMnNa9HIv49CGNDulrD5zYAxj2AIdtTxs7UK43BvjW2L1G9pJdc2Td0murFMGhqH39gxn+OsAFTn8jZiKeM8Er/wGJtJ2vUNwzi6or+tTm7An+GqlvbjGOdxmHu4z5DifSmIHpYYS/iXWN1/uOz+NL/kPeH9xSsdmFKLFDx1Cf27QQgbbPgD4h1/OEsEUWW6wRoTl2JHuXCF5NDuo2oEyEK28X7BwajxKOcLjjcbyV5oMQ9Ml9s4zR1GdC0ifX6XmOHOdmf2VLgtm90+6jMdb9r6kkdUle3cYNCaTHfU9Bb/duDe22GKjkmZRP5wWUe4tx1SPFVFmbPUuPg84+TrYde99LPfIvE9XlOfkZqDFHdVnt4QP5xtCx4XuqUIElz/W+21ao3Wds/jZN/b0j768RbdJWolSVuneeZVt+KbdND2mekajy8z7XzVvPa0tM6n6Te9K2mfhdHLRrkldjxpZdjwvdz8DyZ713CaTN1t5RquBmrnUI2YUHBFvW/K2hFeeUD+nJvGbmpE43B1+63xaRFyTy4kAqzIEH/V1eHtg60BbbbzH5e2YNeq0acXwHVvCG+rt+YGBg4LFhD+BPAvgGDCL2rQ5GMjSMb6dXC6fOJg4MDAwMvPp4ZJfOX/mVX4mv/Mqv7N5jZnzXd30X/uyf/bP4mq/5GgDA3/pbfwvvete78AM/8AP4uq/7Ovz0T/80fvAHfxA/9mM/hi/8wi8EAPz1v/7X8VVf9VX4zu/8Trz3ve89vzCkjB3a6DprFYjaqEs8v5iVU+o97Rq2GMFaQxYJ6ZB3rGp8VuSJd+m5EEBAdQ+r3+8ZuqQ+bJ4R457cl/8mU29NtIhR2xLdDUGrjF/auKdJT/28JjJs26y5LSzt7tvrpQztY1YpvDBEK0IXADDPq8ZWkuezkbeoi2JsyKTyOxLxWcqqjMONitZC0g3VAEedMVnc+kERnNkY2LhO1W6ZM8GwcIEpkPHnxAVjbVCWPhYlmnYZ2FMJdwgOFoJWylUTz9e0YVPcNrolKaTJQk1wL9RyOZ01ElBckOukey43Bc4l17EOICZo99ppDvmGEEoqW9f0G0nMXsnPpbi612/3ON6m5Hp5B1AA5pngD5loRHLj7EIio0BIrn1jJn0PABhwMzBfpTTCjhCugOMdgD2DIuHy48DFixEXH3+YCDxv1JG98e8d4F11o5z7kaMDedQxp8Zso7DS/bSWh8WjkIY9LOLBuuSmWeZS/pfm1J+FTEUi6GXNp4cHTHsPCuILGCUeL0iRhy71mZtR3D4n8p1AQeL5IimwPeAfUppmnpMLaKT3L547YnrxunX735Cu+ZJdQ2ybqt85cnJ1HV1ZT5bxwTukH7Bow4XrZ/W+jjWr+29xkEKp9FcJ+qm6ESc5sONcjd2ryidtQbNa7yNSaIHdhHi5T3NrAvw1MF0jxWSW/ZoqSe8PXFymuzkru4UMl/1equ+plilyCQFR9kZHQMhrZ48cTA1g2tGsRzIme0rTNXJO/7ymnIyx3Zvkd7P3LsjDHombrzX9vziYofZcKU+vTbTr4R7p1kOPYNbltkSdbrucp7h6B9LYY00GA607ZZ2vfka+D3rlseVw7b5QrvXa2hLVmsS0axzUHNb3tItuvTbMylWvLbPuX7uW27rZgwH6d+veXX//OdeOAz0G5PdTedgym4MMayDv0bh0Buq3kfEswXbc2HwBsA5lUspTD4EsFLm97yboQx7m+fwMxfbdbkgPoPlWJTmMsEXScgSO6u+EThm7dRsYMHhD/V0/MDAw8FjwBwF8HV6buL0DTx7+BYD/AsAvPuZyvDnw9rcDf+kvAZ/xGY+7JAMDAwNvLWwcDX90/MIv/AI+8pGP4IMf/GC59vTTT+OLvuiL8KM/muJT/OiP/iieeeaZ8kchAHzwgx+Ecw4f+tCHuune3NzgxRdfbP4DsE5EaBWPJVC1AW3NACJGYPWuVfOyIlApLu9LXoXklXcE9pjTVl30vxpr75wiFsS43Xu/EHLG4NtTIdk018qzVtdTJNFG+TbdIC9e2SBro1HH9aDb01UFhxDHC8WGybt1j6jUGWsu++y9l4M1dUjvOfvsox6/s2PUuqXV93plE2LZuq62rm/V76vK3lcCUVTS0sWsTjvuCfNFcr08X6K4/+VJkYvC+RNaZaItskvvz1eU3AVfAuGCU3oE7O4xpvsRdHPMZdxQ78ocLfNRqRE1eb+GU/Px5bTvKyGC9SET+a+3jqtDBDSH5IEhciUbXWrn6FFUoek0DoqqV9wFJ5IXxU12kNiwEaAZcIEgim+KgL+eQQdDwkiZ1tbsR5lf1r2qRc8V84qSsDy3ck+vVb08C9nbG0ei7j6nbnpPzi6WKe+VvJ8Qb+2KCttn99wU8+GLwvJR7RfhmqLuT6qHOSxk/wPqQRy1lzfxS9faQGL4niCAu7BuZgU9V7Tycyn6ifZdU+luqY3X0rDfAh2c5b66t5b2xvTKoYYmzVeKrTTst+LW83rtObUubqhlASwJbpvPGhm/BUXQrqa9Bev95dx37Tg7d6w9CjQBfma51sMLnM6/933XXFtxe9/9LuzFb9/MvLPGWC8D8twaBtE78ArwWv1dD2z8bT8wMDDwuuPTAHwxgDuvU36fBPCzSO6KB954eB7AT+Z/B14p9nvgC79wEL4DAwMDrzceWeG7hY985CMAgHe9613N9Xe9613l3kc+8hG8853vbAsxTXjb295WnrH4y3/5L+Pbv/3bF9dZCIAe4SiKRn1/zmoOUf5oEiErWynEpfMOYwAs5I28y1zURCSqOe9bF5PZtXNRrGVVREMUa0WPJVptXYClusQQk6V8EVlRidaQJ2WJrhrftSJFE6FiALdtbQ2eWwR1E6eso4DK7dZVpmh1CHNyQTxNjWGcmav3XaKk1IJSfCCpgRAj+HhUyrWqROF5TsRRbpvGXae5JkoMImpiS7bKSS7vNq5ZxUCX1bxJXSzKFG4Mel2XrqSUMbm+XUWIpFOebetb1LX2HRtPV5BVcOXePKc0dL85SnlI+5byK6OnRhmbhnz2DoDLc1NUwA5wuV9jTnFFzVPakmMlcIig1aQ0R8CnOK0El5g+IX7zaGJP0PFy2aXYooengTgx/DW1MWORyEGK6fmwS0rf3f2I4y2HcAGEy6TqnS+BcMWIO0a8qAlM9wi7e8CzP3Mf7sEBothnb+beLGMNQERSFs7ZvetuSnXXwy4EEHwbCzXm+tv1VPLQxI92UVoSPUHUrKobHchlt85bBJAqF+98UlwH1Ni7Me0FNCVFM4XkPtvNOYT5DoWA9/dTnxz2lcQF1b4SBbC/SQprcbnNLquB85ijmMnIh0fgOIN3ZisNKU4776Y8rwFiB2a/bvBfM+Lr+ZZdV7O4htbKT71/WIWeXJd/mRsVapfgNdckfi0HLPqLdhNot8t7XCZPxT194HKNyzqOQvTiEPIYJNx8yi3cvG2HOBH8DePiRS4K+RT7Oq21TMjjNM9jRlJsC4EcU59RjACnvYBCSANC+ioaFaisI/O8VFKW+pr18xxskV5aidpR1dq+0wpe1mmrAxDi1rn0n14fOwRXo9jUc26NNNTz2VFq6DXyuuOqmENIa81u19azfOuod+Q5/d0S8zeatJ3ek6y3Ebmm1bJWzarrvfZuCLW8qizSdqTXxR65eDwux0Hve0i+u47HVsGty6K/zeRd6+Ja3xPSWOB9VYlLnXT5rFJY8u0dLlmDHtd6TNnvOT2e9PjsjJ8yTmUu9Lx7MLeHPPRcYS75pG+26ha6pCW/nyCSG1WvfHf1yhMCWNxE76b6fSMHRqznFXLZO01ceKcpqt8SdgXATv62yZuTLQLH9H0/MPAy8Vr9XQ+s/20/MDAw8ObH3wPwbRixaQcGBgYGBgZeK7yqhO9rhW/91m/FN3/zN5ffX3zxRbz//e9Pv1hy1ELuW1JSkbVaCaxdMOt31hR6BT11kzGYUog1fSF7eyqWNWOTEGO6fJbklufkWX1d6i71FRe5Oh0xxHmXiCMpk7je0+nIv6eUN7Y+4kbRGimJ1t+R56Q88rtxT6nToN7PhQTZMOiZuIybCglRxWkXxVapqn8W45tR927m1yi2s6FQXCg733+uKaNqN+1Oukf2nkrLXpc6FYIwGx3X0rXurm3sOp2PjHV9X0hfq2hZc0e8hpiIaN5NzVgkRiIgHVXXs4wSp5cJmB4EXH2CMN9xKdbrBAQHxD0QrigTr4C4noVLZNTxtke4QHLffJXI4rhP6VIErj7iMD0Adi8xdg8Z08MA/+J1Jczl8AbV+omKtRx1EPXiltrSGoGFyBMSULelXo+0sbykpcjgLSJAH0gph3GE7F1RJ/XqIOSutIV9JSYS3N9kZagsUwSAUNpbx2UWAjHu6kX2lfzlKfVVYh2RXQknd8N0OCZ3znuHxVpMVNfgU+pXOYxxggyubn5NHM2mjfTa0iHebGxNmxWpgye2mGvrAqWxIUpZplo+npZ1X7h6dgS4CXHnED3grxNhL6630xxM7rXDnpq+BaO4XRciuOyzJX0AkTrjOZOkMj7lQMjG/sCRk2v07jqk6i1ETS8R3S8yd2yb6AMYmrA94Rqa9ZwEqnvgtUNW9cVl+YA+KZrL0T2MpNOW8isylPTvUnztfl6XR5OEqyrNTrvZ8qoyL1xE9w4MrbUh0KyPC+Vor2/W1khdTkvGy3jQLqd7dZKyrWGF5G9g13xdJp2O7outvGzb6TTNwb1F+dfK+6jfmbYfDPG98GRgnm/CaJQ0Wm8LyRU+Q1hW6wqf8gEXiQmM3l6nvxuLNw4ZZ3mMgdrnyrd33sedele/b9N7FGXxwMDrgM2/7QcGBgbe1JgBXJ98akDw8wC+D8CXAXjPYy7LwKPg9/0+4Lf+VuDi4nGXZGBgYOCth1eV8H33u98NAPjoRz+K97ynbsYf/ehH8dt+228rz/z6r/968948z3juuefK+xYXFxe46OwSxJxjLmJpKAQUAYq+Qa+4qFTkriY6mswMAaLeYa0YluSVCpi9S8rfEACXmpxmY9xcM1KWNDVBpgzSvlde9WyPPOwZ4sQopYkjqavENbVtIoZSre7s1SE/tzCWKeN7YyxbMxjqsgJ9RQWwrZiS35URrBjoLSkCNMbIrgpO1KfMgJsWxn5dVwJSbF4hSWOobIBSAq/mJ0ra6IAwpxi0jkDOtXEnF0pBmQ+aHJb6qUMC2jC4RsJJ+xcVsEfxowrUuJhQZXWGsE4Z9g2XJZ2Q2BtbFktSKyNzL8bfJtScTyre7II9G3KT+1+ucyDPpd1LR/ibiOu3XQAgHO5yUYGmOKPp3+LiOSZyinK8WHZAuB3BPpHa/r6DuyHc/cWIq18/4vJff6yodOEcsJvAF0mJlWISq/WmtE0iFznm8SAxfMmseWU5iaUPF8btHgGw1n7Wy0BPqbVFEtjYvSdAWcFVSF9JRq3LdAzw1wEUJmjVNfsU7xUA2CUCt6h6kdw3F3LR1+tx4uRiWAi8CLgbYPcwgg5HE8+cCnFoYy1zXgPW2yL1D9k127o2R4doynksyCW51lO/m3Sqai3HvuaNeWQPJvnc73JIwwFySoK9KqvdeqRNnAPvfCaHgek67wsOcEeGCwAoxbmeLwm7Bym2dorly3Cz2Xt7+7feX8p+h3pN7y299a/b5u3BiR6Z2WDrulVW6rIJ2aYJ1DUYslXUjKt5WzW4M3Hjtw7S6MNbGwRyKcPK/aIUtqpXuw7ZfGJsieLFAZHYXjNtS96DDwc03kFsGW39dPtbta0t49ZhDKsYturkEFK5LKGr26XXpup+N57t2tos/d7r016d9BrQi1F87rqulbZ2rVp5tjzXG9NyeKv5Hu+oeXtl0IpbhTIXlBKYS3ttH55pYm+X/MxoE5WwHDaxrp+dtH3+VirPxfUDdrou5LB0XTQwcBqv1d/1wPrf9gMDAwOvPwKAI5Jp9MTfv4+MiKULjhOH8QYMfhrAzwD4TLy2hK8c5Bv980ohn8Bf+7WJ9B0YGBgYeP3xqhK+H/jAB/Dud78bP/RDP1T+EHzxxRfxoQ99CH/8j/9xAMAXf/EX4/nnn8dP/MRP4Au+4AsAAD/8wz+MGCO+6Iu+6NEyjDG5ZAWyGiJWw7PgmF0zaqMfUfb1qdQTHcMZKUMOT759v0NOlni9lGMBwhiR83W2ykUNm64Yop3JU0hmq1h11FdRauPbpN3vIhnmrWJOK9Oyu+uGGFftVNz3SbtoQ6A2+loXf4owIts/6hnm7PpTvhyygZRDBE0emCbQ8QhmTq47RUliVRw6H2/6E+nzvhq5lfprjcSFEHouvZzdMzdqDnLZXXB+z7uFIZ2IgMmVuhboPkXOR9L12egXsh1PK7UbgrRDYui/OXpKtqjmRVHkMBbEqxgedR6KsC5upJs8gjqs4BLhLOWxLsl77RAZzHNpf00kaHencNk1IsXkgpYYEAJLzQeSMXNMYzjufOksZqR4sCLvzeVwxwD/4Ihnfp5wfGrC/Xc7zFet+184IIoEUZYonwhFdyTsX/Tw18DF84w7vzpj/9w1po+/BHYEvthjfu9tsHeYPvkwqQ9DLCQi7zxozmuftEPIriz1Mua9Ug8lA3JDJvbI3tx2pQEsUUBU3WPKsxuEUHHf6lwlRu3hAsTV99Ocb0kfMgQJ5/nDcCWN6d4BLuyRGFTU2LyO07I8Ae6YCcXsTasQ9jH9zBMQLjkR954Rd4kgdkdg/xLj8uPHdm0s5VTrZET63UPFFKYliVMaLIJj7idtxLdrgWCt/e1aa94hQ5Q040AfdlF9VWP4dtIUV6PFm4VyrRqR5nner0j2bWm3EBGeusT999/CfJnUudMN17jL+RBFuEjtv7vPcJnsDRcEMDA9YMxXlFTa2qsH1Ti+TJQO1ISY5olW1eZDHggBHOKSFJJDLjr++lpM8UyoL8jfnrqzd8268s1pdlXBFs1a7LcJUUsAqoNbCzfPeu+15J49ZGMPA0h6lihUdeBjJw5279BJ75tNp7ulTNbpaVe/Za8wBwIA8Jz3Gr23SDvowy36fqd+9sAFgORG2d4rDcaVhLTzTb5t1g43qfuFvN3t2vzsmpHnZpNTh3wnouLuvLgO1x4DdLvoftKKXnvN5mvv6+9tPf6sIlp9SzJzKmePFNeE/+KAgPrG098you7tkbe5jbfWdABqTVBErIkl3pYjtPf12k8OS+NxTi/k5+X7Yyh7B14BXve/6wcGBgYeC/5vAP4pgP8IwG98ldP+YQD/ibn28Vc5j4FXB/cB/IcAPvy4C/LE40u+BPhTfwr49E9/3CUZGBgYeOvikQnfe/fu4V/9q39Vfv+FX/gF/ORP/iTe9ra34dM+7dPwTd/0TfiLf/Ev4jM/8zPxgQ98AH/uz/05vPe978XXfu3XAgA++7M/G1/xFV+BP/pH/yi+53u+B8fjEd/4jd+Ir/u6r8N73/veR6/BQkHBLemxRqyeqz7Qz9u0NAHYI846pGfzbM/o1iubIoyba5ZcBVL9G0XVComiyWJJQ9exuLfk1pj5KOgREEDfWL2iWlqQURt9UMqt6i9GNu70RVclV8r7CKc714x2TTF5Nb/m3ilXyj0Vrh1PGkJU6HcXBeikKb+3Be2/vwZFcJUybrnS1jDKubPf20yzEvelpZiBSImUcsDiUK+jFNtaj4cjgDli/8IB/hgRpz3mS1fcNbMnxAmIu+SCVvjiEis2ALt7jOkBcPVcwP65a/iXrlP806s95mcucf22PeIE3GKGf3iEu3dT8z+nLTJR2rhf7mAzVuGawl7f21JjAe18NP1YCMTFuKP+WO5Ak3kpKQfiFFvXzaixlYmre22ZSpT+8wcABMy38jDgeq/Gi03vJnfdBH+I8A+O23OiN91Edfco60vH9fpiPVlbo3vuneXn7vO8vfatrCHixaD0Q+9gkP09Hwbh/Q7xasJ8VdulaffcD3FCidNbXKY7Sr9nBXD0lA40iUK+HILZWCOBqjQOcUlONRXNBKW4dc7tpftjdU5t7aFnjvecQf95vcedSm+tjJZo690HyuGPs/aErbzsM/YbZy09/e3T+57otbWdL2eWtbi6t9DkZi/cRe8bR66f8z31an27vhzoPHpkK9Cu570ynTMO9bub32OutPep+LoLqPe6Hg1Ovl8P4nUPSMm3qyVyzT7dza+33r5a3zsWa99/A295vOH+rh8YGBh43fERJBL2/4f0h+NvxNIo8Cj4JQDPAwAu8GHcNYe0HiLg3itIfeC1QkByH/2xx12QJx7PPgvkc2IDAwMDA48Jj0z4/viP/zi+7Mu+rPwu8Xf+0B/6Q/ibf/Nv4lu+5Vtw//59fMM3fAOef/55fMmXfAl+8Ad/EJeXl+Wdv/23/za+8Ru/Eb/39/5eOOfwB/7AH8B3f/d3P3rpLTEgp+fF0Ask469SEgEoarlG4QMsfm5cNWtVmaSnnhdDNQVeGsu0AVC/K2XQRG+P/LXErq53IX6rAb38q9OU56R9xLBt89JqXQ0xatr2FlWQpC3KaSlrR0m7IB5sO4kRl7mqgqVM4l46BICzepMPNQulBiwGvmnKMT9jddscOalqvQcfjwvFhTXO2ZiW3AizMtmRGR5yLv0scVKFFJDx53Jbyf0QqqKqp8YQlV3pR9e+X8o8VRfTkpYmo4VY04ZYE0sY8H31SewYtLEyfiRfXdZeHMgyRrLqTpdb+lnK7aqrQ4JxoyhzUyuOpNxSR1tvVQYSNRRnl87G2JoIXFfGqPSQu3cN98kZz/zrY314NyVvALsJcT+Bdw7znT14IsRJ2im5hU51Jzx8zxXmz7iNh29zCFfA8TYQLxiIwN2nrnD7IzvceukaCAxCTOpJT+CdB+ZYXNuX8mZSsVEKMgMcwKjzkYiXKt81RaKoFiWP7LqbLNkiyjm9NlrCRFRI5xigpW/EXTAAxNadcyWU8++HI+jhDXb3nsbxinC8S4hMENfiHAGaM/HrgOkhI07A8Z2AOxLcMal4UyOpovh6OGC6jvAvXdc9YcUFdomxrIeU9/24m+p9VrEhiyrbqt5zvUVxl5LQzxg3+vmaxlLdrea86p/NWMsu1Ye9qy63PVXvG5T7W44e6LGxm3D9qU9hviVq7VTQw22CC4CbOal+iRD2iZx3AXDHmBXZifxNh6goEcO39qDrObnbZgaFAInfW4jdyNUtPuVxLOvIBqGkFfKyzlB2Pc8utX+j7DXzodzrEWoaZk1rCP0tslffO+Wa17h+RozJxbFzSQ2qvXbo59eITF0WuSZrsXVXrMt1inzW7+t9pKf0tG6HFVFYXP5LOjbtTjlKf1nYgy/yHaSJXz3HdRllbV7Jszyj+1TWERlz01Tft0S2vibfbUe1R50aP83ammLQikK7rDVESZVtCffewb6tPlZlavonp6VdUi/uS34xNu1entFxl3N5tEq3eAQJAdjtIOpb1t5/Ompg+aZM+RPItX9GpX1SvvHU94T3+Zs1mry47MX12yl/S/U8O7Aac/aaNEMZX/W7aSh9B9bwhvq7fmBgYOCxYQbwTQC+EMB/jVfmCPGvAvh/AgB+A/4tfBl+oLn7U/i/4L/Dt72C9AcGBgYGBgYGtvHIXzJf+qVfunnCnojwHd/xHfiO7/iO1Wfe9ra34fu+7/seNeu1DNO/rE7KF+UHo7o1o/bZtbROGHwXhG2+1qh27X0hIB0lQrhXFvPswgCnY9H1jHwWKpZkSUdIuK36a2K1qDKXLh+bfIsRlSsB0oM2kq7FngPKvVb5mt9piGqHJoZtLy3z+0LtWwzSHSMolPGwo7gorgOFCCtjQBnptLJ1TcnRxFldqvlKXaHuaQImx3DjLXueVY1YIrZXxsbFsl8nfPSBAu0C2iGVOfbqQ8vxUwjpWA2Xtj2y2qartBFjeO+eeU4TnIUs5RQXdFE97eZRfnQAew/sJxzf9wzChUecsktZPUXIqnzTD+HKIXog7AnzLUK4IBzvJBWjxI8lBxxvE8JFMmpTjMltsQcAUiGOqSm3uDw+pe4tbrkbjwDK/WTH7a+Uv7i71KSMEJn5XWu8T4dJ0jhkO5/Yjk1X1yNxQczUxoPVcGgJPeakwj24pDolBtL/6vkYB4QdkmoUqPNHT+NYf2eq77oDg67zQRPtRl9+lzV/jcxb8wiR42yTo6QiXTHUa3ejZA86lHIsXTdbdeGWKrUZ947A4sK9KUh1ZUpRud/n2ga1zooAdw584REvJsQpEbVgwOVx7ITDZiRClxg8J6I/eqR5xoA/VtLXHdP74XLCNEfghuthG1F+x6hI7VR+9gQ6KlLqTG8Wi1jLEq4B6CtCTbul+q3MUH3dErNb+2gvjzW1a6/PLUHbQ8/Vri2zJlxteWw6vXu23GvtKW3QS9vUoXH5v0bkbn1X9frMfAcuytojwy3RrJ/vEfxbLoh77abL1SP6O9+mq4g5ZnzvgILu417b9Pre1kkfcum4p9axp9m2rzN70Naer/vdjg39vSldsTY+Fukuv+uIzLdWqUz9Bi3v2t9d3pNlndUksPXyYtKtBXDtz4UXPtHXA29ZvOH+rh8YGBh4bJiR1LnfCeCM7wAAH8BX4FPwuebqVwL4DADA2/E58Ng3d9+NL8DvwP8WP4v/Gi8O98EDbxJ8xVcAn/VZ6eff/Jsfb1kGBgYGBl7lGL6PFWLA1EZ/IMfrE7VDNppoY6U2Hm0YX1Ps3Zbg5ckoQ3S6WsWk4++Kgd27FCNYFLXMq+8nYjJWUkEUyqegSd9TLkR7ZHJRKBijas/lXE95IYSqNWxa46El/kpsN67f2toAmp8rat6ei0RNFhulEwFgZDd93Lr5Wxg9dD2VAtUa7TTZumk4seS0QPpHlI890ldiakpZmnyMoVCeiW7Z90SFMFqUdBGrN40HmiYwd4yOi373KGpg6b/e0BMCW8ZIIaDzfW38dUppKONAlEc9YsS62NSQ96XfvDLsRqAo5YFKboIyX2juTQ7h1g4vvf8ChzuEcEWJqOVMIs4ABU7kVUR1Q0sp37gjzFfIbqCBuE9uh4nrc/PtRG5RzDGrIUZwADsCYhrNzRwKdmzYpl92SI/4W6gSe0bw3ryXNGMsqkdJJ805dWBjMY5V0plILYQckOur8tbrKlFdL2KEO0T4gyLhMg/JQCKPHcB7KCN/fa5UJxB4x022QFKY4vqmENI8uerdwZZFyif9pNugA+mfHqFY9zKlIN3t2vVP95HE81yJd9lbO9NBAUt2OfRiRpL3bazLkOc8c1KgI80BRGSlba7DfkK4tcd8yyfX5zLu839uTvst5xi+qU+4uNmOU5oT7igEM+APibAJlx7+2lUVOFE61HCM7fdAHlvIBA1FXrSFRUPCN3GoUddboD1EcQr2AJdGZ18r+7ElMC2se2arwixeJdTeb/f6U4fL9FjTMWI3iL0uTrmSXuzLG99A9vuiR6zqMvVIZztn1gjpre/GDU8JwAr91lt/dZ9oNfLWmOmRtHbtPuVaWpO0vcMFW9e2DhauoUcq94hcVfeyp8ieL+PCjnVbzzXPFOo9vSfa/bG5J0kXzy05drJNQz9nyd5SDm6+d8oBANlPFt/dsUs69+MEY2BgYGBgYOAkPgKP//zspz8Dn47f0iV8v3L1nXfi8/Ep+Dz8Gv77Qfg+Eo4ADgB2GAfZ3jhwLjm/+fIvB776q1+bPKYJ2O/Tn5uP+ifGwMDAwFsVTzbhG2JrHBEjkFVtCsmrQZTcORZy8bT6gSKDERNRmxV35TlRLmUX0qQUTkn92+ZPxxmNItKSnltKjkkZgXqqmuJCThEqpTxcDVNWhaXTDB2DopBzQHVppw1n8u4a+aB/N4a8YlRTbd8QCTn/xuCmjIK9+GjWONeqfiOK9CGXuymDyqtxmZzbgEWymcnZFJczp63JRk0GBLTKRk36aBWsVfwyF+Xf8tCCU+Uj8GyM5pb0tfFSe+OtQ8QtXEUD7SGEMn5DJVi0C2upHwsZbFxfRsaqO0x1XVwVL9Sjehwu+rkFhwia5zRu5gjeUSGnmvYoB0jSdQIlN++ciVcixAuPh5/iMF8CPKG4CiYC4gQAlAhfaZ6s4BXXtSVOKQPuhgrpFfdJyTjfYoQdgIfXwHS7kolA4z5eFIwAqht7PUdUe3B0jXK0uGcmWh5+0DF4CzlvjcuKrMl9pd1qs8NiTlBetzkq4l+BKJPcUhbpn4iWyCvlYsBxIWCBRMr6Y26fTPSy50z2MiQ27M2zuT1nrjF/ORPBMb+7Y1CQ55KSlOcAmnL+Ee0aLntALmfq87ymeY/ugY7SRXndcmoOC2QekSKOtLtWoL/+OgcOoZL3a0QI2rkuZeip7wq8B6bk0rnUd7HuIzW2A+LlhPnuBeZbHmHvcLwt9axkOzuqSuqQ+twdqZC7x1sOvM/ut+dM9sqQu3Dp/chgYVk6bohZk2f6vzVwLGrmLsgt96ySnSHc9OGmU0pT/bt+D+irKOW5HpnXIzFl/vZIQe/bOW8PaOlyyMEDIeB65dZ11uXV32GNq9oVEtqkKa6GSbvr1eMdaA+f9drEllkTlzrUhdyXwxQKlhxMak/Vx96X8BLl+sqYajyI2HGi+6GneN2CrpO+ZmH3WNv+9tvVzqe1QwO6zMzLvd6OAdnvstcZ1mnIc1qZrseMRm/NM89YYnd5ALASw7JflmeOiuQt/6bvtSbdwPmwojqYtnYgs7fuyt4h31X6b6DI6bO2Objn+38DDQwMDAwMDCzwdnw2vgzfCYeNb36FOxixyl8fMID/FMAHAPw5AJfbjw+8bvidvxP4D/4D4H3ve+3y+Pf+PeD3/B7gT/9p4Jd+6bXLZ2BgYODNhCeb8D2lWl2DGGLWDCAdRQvbvE4pVnpkqVw/J99Fec94RufTa5tiIMz3T9VBcK6LZmv4W1G4rKZ3ojyLuKAbzy8MddbomI1ma2lsugQ+FQvNEq6999YUfl13zmt97pp+3izzWgzOnjqkB63olcdf7vx7pXCUCL5zIOQ1uUo2Z7fRFGJWe3YOgwCJJKOcH6M9SMqJCI0+qXqFvCVAKRLlWRQitywDrJLMTdqoHCOAiRH22U20NmQHAhEnpXg0ZdLrjCb2zkAzp7QL5uWDS7JG/u0SKmZNEkP1yhzoKZDX1k1iTi6tHYNhvDvESgKmh1EanDi5uyZOCmsAIC3j1WS8TGXhvKSPtspo9xBy6SUhjB517ph1oafEXqCnYGM++zz0oh96amxKsVFrvVDrrrtXhsjlhHC1w/H2hLin7M6Z8hyRtkvcMOcylKaLKMx9cbetuyx7swh7h7j34IsdMIdMvqsxqMsqBwjyf0KwvVI0sZN7ROorgT3g0kNvz1hzobymZLUEtT0Ip4m9XnlOfV+8VgTUlmp1q91OtSnQJy9Vnt3viV6aJ1T2m9j6hnw1cU4+55Zjrd009KGDLkm8nJuNm+6XiZf1DWjefzXWjAXO3SMWh/hiu1/It9+GV4mBgYGBgYGBhB2u8A58DtwTbiZ9c+JXUf6AG3jD4KmngM/+7PNNyy8H73wncPcucDl4/oGBgYGz8WR/yWhCg7l116hPtBO1MWnlPrglKgVWmaAVK8zJHbO4eFbPUuSk/kVLEIshuqQJgCdf4/72jLD6ek+JZMpbXEQDrSJPFEezyJ+yKiKiTUspWxekBOv0fE1HyiZqFfmdCJjnpcLFEsT5OYiysOceUNpcK2ekn6dpoVRZGNr18w2hpdSMysgvbp6t6zxt1NMqrnQtoih+dV/r96c61TjEpZGuZ9wrLjddcV/N4sdEVFdaGRzFdbU6kVoUwbHOD22gdHqsL4vQVZrZfDi2xmFLrhSDI7fpLNQzanz12kbHFBW1TxODOKr7HvBI92NSlDKnPFncIysChOY8b4nAuzT2yxyWsnJiaSlEUGCEWxN4cpiugZkAMDA9zIRvBGhmuACIO2d/ZIRdUnsCSQEcriiTTkC4RE4/qRZ5IsxPBxzvTOCrC9Ac0jze77Kyx6W5TgTMsZJa0maTXz8UoVVCFnkekp7rlgyx6jL1XmoycbWp+j8rzcVl8CKOrwHLoZyIKsZnLnFxpb4ltrG6BgDuGOCOnP4udJlEzKS6O2SXzl6U2ChKbHb1v+JmO8g86bSVc8Dk6pzKZdZlYedAIhf2rp2ja/XX7oOl3UJcf0HU2FapqGNWA02fNTHK9VjQngk2QLspjceOG+AyvyKS1w0iXL/zFuZbDoc7LsXrZZR9UOIqS9zrOCUynikpe/11PUhx8UKEmxnHW2rMxdSf8xXh+PQOxLcxffxe19Ur5z2OOCp1egRubhZrv14Dq/o61p89av/0iJ8zlIWl3RYN3Fl/tSq0Gx7A5Cfrlw1fYdfgcwhafSAEMDHgVX72vZ5b4jUX/JZcFpWxPJvdImvVa6O8di5tZR0PLE1dbZvY8lrYbxydjiiAleqXdFtoLwg2z15e+ZuTAPBxTq7xO99RC48ndl3Wqmudtm4HXT51nbxPyulevdfGsvSd7lP7Pa0h34dyX0I1zPNijPZilPcVsFQUtvU7R7W1mXv2m9HGCm5U4zLe9PdxVvBarwaNG+de+mz+XrHrb7N3mvsAcJxRYvz2SF/9c+R+KJGBgYGBgYGBgYGBgYGBgYE3HZ5owpe18UgMMNEYs3qGLu9qnEurWtHP2XfFqIZkmNbp0wp5sXpdG+57+dny9MgybYDKSqbFuza9NRVOz0hrVZRr6do0xeCv39Ex9zSBfc5RsFzfBUmZ3TjqtqEOKVXi1XJfvcXa9TCyUc5WSR0maJWQfknGNC73ksGuuMfV6oseqaINe8W1ckzi1DVCxhr79HWt7NXkbtwYK8V1M/XTts82RKOv10oMZkME9Eh1R4CblCFe5SvxdiWfc9W9UH2p7cJC8sRchggUP8wuz1lW64slwx2lGLwXHuGCsjG+Ek4AkmvnmKuuFIr+yCn8DAPsKbkGJgCZVGSfSC53JLBnUCTcPAO88Nvfhbs/8zzcC/cbNRljSWYUlWuIy/Fu62LWp0IsAJUc446aXgznmig4x6AcOcdCFiN/5x3vG5eexFyXyMkll5iZ+BVSlcvarAz8gZv1V1ShxTVzrCSjxF0uz65VhVCVv5IPADrMyeCv1w21vmkVaXrvjHUPQvomsrxZk9Q6QWpPKkSYlE3IDyHJNHmp56COP/uooORCWa8vFGOZp9oFd7h0ON52uHmWkovmkEgRdwSmm0wAI6m1KQCOkTsHCBc1y919AKDiNp0i4GYGZi5K7XDhMUlc8BJPPM0XAorgXx924uPcH5OnvDqI6/L8M4D1PtZ71JpL5s28DGFoD2Kthaewh7NEmS1kpd2P14hIe+8corpX7jWXu3rd7UEI3R7WCNweet8uHQJ0ERpiK01bDpNWU7aeK+lOuuWAWae97Fq9OKCoSeZePr3+LAflWpLdHhRpYrvrNCS/HrnbgzmMwjpN3Xa9Nvf+NIGu6947lKTu676W3HqEcCFz9cHOTv26ay6wXCN63hSsFwxZ8+33nDwv13prlYs1xMDAwMDAwMDAAgSP34o/jHfi80E48d0/MDCAy0vgD/9h4PM+73GXZGBgYGCghyea8E1EiiVtlVG9MV52jEX6OU0W91wcWqWAAoVk3Fq4fd5Cz3jVU6HI9bU6SXE0gew75egRunLdxoW1RsCeokWUwmvplrQ7xk6rrin1MeqLE64ORbHQGNr0Oz0DrRoH7PK7JZ6sb9S7jUJYx/xVcU27MRs1cQxGidUmBIsHRLW7UOzZmLul7DERF5owKv210kbWtV9j6DXkdPOeHG5QxDRvGF2BaowUgqW5rvLX120ZRPWY2MpK1DT5nKlS2XrOHOQohKKZ641CUx32kLqEvUPcSYzfTPgWcpcLoRgJ1dVzyPxVJojcjKT6dYA7MsIFEHeZ7DoSEIHjHcbzv9Hh9i9fwL1wP7mi3lJN5fJtkhJrrsZzuWzsycYVsDbwr5DCbYxlqmRizndL3WvVU6Dkmpl9UlGRzCWihvRt8qOkMCVzOIAiFZVochGMElO5EL6k+lLqQ/WeJf8BADmeL8PltYFrjOuy3pn262HLBbwmALRLerNOFtLCEB3UeWaRt1WWIfeVPgRi1njyro7HkgUv+wWprcMFcLyTSF53THF4AQZuyqsQt80upLZnB8RLKm0fp9Tv8i/7FMe3uH4GEPeu7jcx1vVF2mfZAuB5Pqk8L1Xv7fcdzxAvy/2ywLr+BZZqWMkHSGSZdbEupJgaKwvX3poEVul2iUKt1hXCuFduU7fuuNzCWkgI71eJwFOhHkoaonztrZM95aiOZd4r21Z9pMxb93ueZnR5BLa8ve8l+93T2wvtd20Iy3btxDxmm7def8y+uhjXth/tzx3CtlHOHo/tt6i+H2OdAzmN3lw46X65HGSSRSc275Y8Q0h7kW7avG6upd+9vuVZQR14q95y1PdfN/yH+XaUPOSdgYGBgYGBgS4IDp+Br8Kn4HPR/yvh1YfHBSZcYsb165LfwMCrif0e+JqvAT71U88/t/xKcXkJXFwkp1wDAwMDA9t4sglfOWFvyQUow0hv98kEbTJwKWJBiFVD7LR5xoXbZvZuYWQj7VJawyorgGoMDKGW23cMkcVls6vlLcYyVWdddqtk7pVFqwR7ZK9ct8ZG+44Yt+VZ6+ZT0tXGzx6RLbBGxMV9LuSOPMei+pX7MKSsMXqxzt+oNThEFPfFJs2Sj1YiGlfPlSguiWYXvMko15C9pd89ivK0EGWxbSdNygBLwle7b8ZKG4qxUMjuyNX9t1XmyvONm0Cu94kqqavbX7tEDhHggIUyWT8XQ+PGWu5JOxW31s24X1H1lGLy+mEPPX4jJYYJVIkMQXHTnUncOYKOIalDCYh7JKUhAe5QCSchDP0hkbnTdUScctzfPRWlaLhIBJY/MtgTwj6Rj/4hcPExD54Yx7uMB++9xC28DbuPvpDSJ8qEZh6T4s53zn2ujNRt3SM4E7CFtDIuaZm5uLIsaShiQhTvhQfN7woBKeTiQpWPPL4R1g8qCPSc5ByPlyKSe+a6trD3Kb+IpCptvCeU5qmkrsmWYiUVJT5vnCp5n5hHTspg1unqQza5PfPhAa1q5Q6ptHDB2qt+R+nfjdud50z34IsleReqeulbNS/DCiHfOZBEu6m61o8MoliVznMeS5MrJ+Xv/NIDuOMVHrxzgsTq3b/IRemewiQkJXwh5HPR9vcZYZ9cNocc/5ci0ny6SvOKIifX3EhE8PEdt+AfzHAvPMjrao1LzZ6SK/eQ9/SQ15/FesoLu0/jbjv3Szngg+VegBCW8yi3Yfegl92H1ZrHOi3JI4dGaPZrgZB5Ku+kwF4SelZt2ZTXHnqzv68dspE1wX4LaOhyaGVpjzSUMa9V642rXVe/73R6UKSzXNN9YcuvicSdr8S5cpGu17niVlqToD2S3ta5R36q+su3RhP2Ys2lsiFfm7FiyVmrfJV2leet0hZmjZHxow/Y9Q4KyL218WEPGai0GzfO9nsyBGCaIGrc4n5aH/IwbaS/HawL5gaRsXBJDaj9zKTnHFT0+OWhJSCF9eC48CjTfp/o+tZvvEV6cnBQvn9nWSciGk8N2kvK1rf0wMDAwMDAWxwRR/y/8L/Bu/AF+CD+Gug1N5MSfjf+QzyHn8EP4o8hDNJ34AnDvXvAH/2jwO/+3cCf//OvPem73wPf9V3AT/wE8C3fsv6nxcDAwMBAwpNN+GoUVaIYqLA8PW83hYY02yBoV8jSpAIz5HCMfbK3Z9S1+WrizEITBGtktlXqntp1yRicNKm7ZQxbM+oBS0OnvmaNyV3Fg2VjtkmRpjxSl46SoRvbt0fC2OeFYC11yW18ysUn0JKaGltk7ZnqsleEMvaUMVDDdcZOT+G3NjdW83X9n7vkUqvyOQt67MWVummIUhSVqNPxYpuYwcyJ5IucSEU1D0vMV48Ue9cJccXF3XNyBUw1HDbVa5QJQh1jVjBdA+GCEPeMwx2H6Zk9po9RWSs4dhSuAu8WByIeCb35rQ6YrPbL1te3VouegrSx9VhwajzkNZWdA095rhMAx4DE4qVlW6cHdT7md0Ucv04Hv09jZb0D0M6Dxb30Tk/x1pC9G31F3qd5rPca2zf2INTDI/Yv7nD5nC/q+HABRJHBA7md02EGF9K8AgP+YQSTA+0kbZQ+EZUviEr5GYT50gMhR3guY3dFbck5rvQZc6WQvc3rG32xhpcxL1fn3ZqaE+jPZbkusATdKSLX4oRHjibtc+t94rmz9wYAXeXuOXmeo0beev+V4FHS2mr7novnVyvPHjF/Ks2tMQy0bd47ZFh+fYV9pd+xh2OMkvgk7GEaIK8R6YAA9b717OEdycu6el79RvJtm0QGnPruPBWSY2BgYGBgYKDgJfwKbuNdr0teBMJTeB9mPGgOjQ0MPCmIEfjwh4GPfvT1yc854P3vB37t116f/AYGBgaedDzRhG8y8hJo7hhDRE0pSkdS1mFR3yh1VHlnQXRl45hSOjBz6ypUkbclNm+PDGuIXaWYyenzbkJRBxcFCle3oN5VEkTqJPWzJJdD+451HazbQVTAck2TxlI+XX6t4rVKS6vslXvOVfWnItpK04iSRozBJh1x46pdNjJSWxQXtCkhAB7kHBhGZQjUPLwHzXNWKvqGGCuqOXLpOSm/VvaouMDS5qLuapQZokrVLgfLO6ESymKUCzGpVrxLihU240wMeT3DtTake1efZTvGjRHQHBSg3a6qAXW5fGqPRsWr07XQxLCUx8b8PYcAVEZPq7BZQNRC5ZCBUSmjGrw5q/XZyRrhQa7Gi20Mvje5DSeXCNYIuMDF9S9PQJwYIRJIhF5MKC6DPYo753QvEYfsAXcEaAbmWzke8JxUwwCwewHFnfH1O4C4m3Drl3Z1fri0qtExQGIRk24j70Het8p3hdUYsYIVYoCMYhBA4zK4PEe0VLrr/rDjQRAC6DgndWxe39h3yGs7Hlxdo+LlhHDhIG6YWaZEbnvKBHshDeVMA9fryf02pbaV4eyTqhTeV28RsuYyA94nIj97nyCsEPNbB4zIFeKSsgv4gqL+5+Z3vRaVkavX4nluCIY196bkyJC+nb1MFJTe1f0px7ZunpEkKJky6OaA/Ucj3vnSAffffxvXzzrcfx8VNbU/pPHvD4C/AaaHwPFW6ofL5xneMeIRTboucHaHnlS+mqQ/3klhB3YfqQex2Ln0bRClHg64idWjQw/q8E6j7E0XartbZa+61osF2ygwrTcN+VkgLmktsaoJPO1qWfeD/taRvrN7i8pnE+Klo0fiZVUm6XzlnR4x2Pt+0GlvHQDruZq25TPtQjrmq1zX7qwtGarzUHuuVds2hKBV7OZ1GMA6mVpcCXfqZBXaa+gcxCPlgUTvAU3568X0r1Z+KwWr7auF++zewT6bvlZv27p7X5Tbxb00AByPKArqmOYp+dxW2s2z9xB3y2WulFAaWYXrXXumx36TqXpK2y3WSNUO2uX0mpv84jWj9w0O1MM3crvn/tutHGCT79R8L9XXgYiTvzuOSf3rCBgxfAcGBgYGBgYGBgYGBgYG3hJ4ognf4tK0kKD5hlUhRiyVsyG2RG5JlJfvA9WNM5AMx5KVEI49d8o99FwuasJ4S2GkVIUFhQSOLcmdY182ZK7kpYiBRRnEKKVVBlzLV+pgSduO28gmP2O4toZB6rmWtEZtg278XG1YVaSrGN85kzIkxO4iVq7JQxnLi4Fzcv0+WlMWq7xLHDZeGXs+EQms4/UKSatja2pS4JSKYzGetUHbp3e1oEYIOjsXABT3xueQVzZ23Ck1syVROC5UMNZA2xh1NUmS3X2utU06tJGNyzEtEInsZQBigFXl82YOAPAPZ0wPPYThFXfAAApx62bg4oWY3MzmpJnS9ZgFkuEi/eyvGW4CZiJMD1M64RKIE0DHRID5Gyh33Zm80NULerytrEEyBsj145DqNjpHxWvUg82hDDF2bymt7XgS43+HICoxe/OhG5b5qNPKxEm88Jgvpd/yfzEZ1otxXbIlgKd0H+o+zZn5dQwGgbPilCcH2u0qucYMOF/dBJf1J49fIYGlftPUn0e2aRwtxy+5vpps7feVPDRB3KTNsYwLjpkw78wh8r7tJ6IyFom59FXZo+W/4wz3ALj9YcbVRyfc+tgFjrccDncJN88QwiUw3wEoEGhO88odgMNTHmGX7pdY2QHgkNw7y/w63qbkktsDu/sEJ66lhai1a36IeZ88rYQju5b1VL4wpK493KTmx2J+9QhR5aKWgT5Rd45bZfNNYwpV398i7Hr5Lx6j9XI0e4mqmy6bPWh2Ks8eSbt2MGitrYRsXVNCb7WJJkOZl2Ngy220zt9CEdFdglby75HjHfK2d0ineUcfltLpCBFuSNrGhbUcKFgbI1tjR7u91vlZgj0/S1LWjgqYVVuwJtA7Hj+aAy9mLHQPwzhK+6vZ69bV8/mAog6V0XlmsV6H7HZefwPpMljI8/lwVxMiQ7/7eniPGRgYGBgYGBh4zfBvA/g3AOwfd0EGFH76p4Fv+7b08507wJ/4E8BTT712+X36pwPf/u3Af/vfAj/6o69dPgMDAwNPOp5owhdAS4KK8cQasoX01e/Ifz2isWcYNcSvRiFpG4KuQyQWgo66xrkmnZ6Bds1gQwTMAZj8Ml9bLpeN8rae0g7zvCRaThATNp5d54FqSO6lu2WwNoY8su+b59bcNRcUd58dQ1sPlNS55d2i7Avr/VJcbitDH6+oKIsKV70j8Tqljpmk0DEil+V0VZ3WqG4IJQ6wEIWLfsj3y5hQhJUuryaLrQLtlFHSzoFe+dcQ6xg4z7VibPu/R/pGroch9DzozHlEVFJRESLueoY77KoaNIp75pxtBGhm7B6kgxxh74o7YIoMBwJ7RvQEngj+ASc+fQ9MD5J6+PhUcnvrAuAOjOlGyA1XSM9Szd66dU576TbpxLjutfkqqfFqBFPJ62eJjd6MZxRSFjGCnEMkpZ6VNY4Ice8Q9m3ZCfldeZxRz7MIt4nU3oX4zUQiKLkNZodEMO6mpr4sZbWHbCKqm3AA7FdiK2soRWmJF9u5t2y6FcIQluAQQqxTDhVne6H21c9k7wesYwEDhZBviDurGJ4D/HM38DFi+uQlwtNXePCeKxxveYRLIFzWlc4fAOcJh9sEnpKL86oI5tQcMZHCIGC+pBRXewf4m3TwgSKn8aT2+1JOu08uG7WtN8dln0hbWrX1KZwTOkH/vhVGYW2vlL6w+7hdw+VdpTpuYtPa906Vdw09YrKTTnft6eUhMVl7Ze3lYdS6q7Bkqk57zf11B8zcfBst+semlR5Slzrp63dP1WVNXb122FG/J8SqVodbrziitAXS82vfi4YYX3y/6fyyqrepvzyvyV5zyKtbb1ufXvs0zZLXs6NSI2cClojbua1V5U1epv7kqkq3yZuh990y5sU1c+wcILDva2jPLvNcv3sG2TswMDAwMPCGBMHhAnfB4BHHdxME4IsB/I7HXZABg1/7VY//x/dfAgDe/nbgf/2/BPZ+xvXxBrduAbvdiQQeEW97G/BVXwX8zM8MwndgYGBgC0804UvHORndBZNSMGi1q6AYmzrEa6NSSq5ewdVIzMqIRZpIzukUckJdkzQao9SacdkayRqjEgOa6CvuPFn9jKXbZlFj6vw1GbGl+mFOagZg6YaPKO3cWR1Jck0b5STtnoFZlBzWiNkji3pKqE47dV2TiivNTHQ27jZDdSHNymCcysHFMKhdTXPMLp2PR0NgSJvm8TfPgHegaapumSVupCaDtWK3HFaInXsBYEojoDlU4Noy2PZhcfMrhlJFLheiPecjpK+UDbGNnSo/aze8miB0qt8FPRu4jFGtlJP6Ol+NlFIfIdeBqtrJPwNo26QHPT9K+QM4BPDNDWi+SmuIV2M3AnDcGKjLkqHTniPczHAzQAeAxCYek4LXHRjumMhBJkpqU1LPHBmXz0VQ8JgvgcPddNPNiewlRlIJ5393DxjTg+yGmhl0oEqOCukp5JqsVdMEuroC37u3nDelC7JbZyAfDjCwMXQVGmO0uMLsqKOamKeZMCt9bPtPCMoQwb4eYqHAaS44JL7bZcO/Q3GZTMcAHGcgBBye8rh52iHsc3zXPKxdoKrwBWqfhPp79PUaBYCOBJ4YcEDcA+GSwFcXoJcepI4q7vFtG28Qu3kstnX3zVxekK3ShhuqdwDVfaijQjb1FL3JJSnqWmPAMvc21leKOfaty3uyigHO+YAM3cxp/l5eIDx1get3XmC+TAdgLp+bMT0IuPOvX8TtX5kQ9x4P33WBh29zePBuwnyHES4Y9z0ld9o7hj9QJuQp9U9EcZnOlH7318CzP/0A0/MPMiGj1iiZM4WkD6eJM/G8ID9HV+eN6pdG3etWiJrenqrvyV5q91RNmslzsp/m+6S/abS7YptPBw1hSlmRrsk0q8hdJECta+QemanvSx20q+V8rymLVeM2+0yqJ+l2suWGIoQ773a/PWy9LdGnr6k8LZFL6p1C6Nk6rBGkkpc+UKPzFZfGkrauH9c9rLgOP6U01uWQsWXnhfaikg8ILNBzQa1V0CFUDwFyTyt7Rcm71h6SZy8fO0eAuh7ZeWcV7fKNIet4dgOdiNcZJGuGrCXedV01sx47RABC62p6cWBqndQlCaURQv3mKutNJoVDOgVF+kQhufq95nNciYGBgYGBgYE3FJ7Cp+Hfxn+Dn8Lfxj/DX3/cxRkYeGR83vs/D//+7/v3QSA4B3zih4B/8Asfwvf+8P8Zf+EvAL/7d7+6+f3UTwHf9E3AJz/56qY7MDAw8GbDE034AshGTvW7VSZuKQt7JGu+llRB6voaQUuUXUVuG1K7ZVjJu3lW6rF1Ql9Uu5v3uW+otdd6LqfX0tTEuTZgahJ5y4WhVouccBPZxUoZt9xp1vxX+qun1hXC6xxFsFK7NXn3VHknVbEdErd3X9K14+dUH8pcWeS1YvzeJK9OGK977Wrz0USvRlHOrYyRtXKJcTSrnMnFSqBxMoIjptierOpHnNz3VmN/Jz+X1LU0R/gDkBS+2abKKMpb9kDYAewI4QLFnXD0iaxKcWnRkIwOhHCR358AyPmIGXBHMVC3aw7ZNUoIIO/7rs91dQoRZpWDZ4z3V4pV4kgIL0VmA2jc9m+l5z3ijhB3KKpcAEWxSxEQ99r650KCOzTxlikAvAPYc+5TAu+n2u6RQRTbchUSTq1HijAgR2C2e3TVSmYAAQAASURBVFB/vewqSi1sPPPSJOvrgI3VfVY+AutW1YQIIGYgoDksFZ6+xPGpHY63HebLROASTwiXibinQzrQcPHcERSSX+bDM4SwB1xIc8TNydWzCyhu01PcX4bEXU5zheFfugFdH5b9AjSKeJ7DeoxNBe3qetFOSt276rK5m+jK2qn30d56vhUGQe7pZ7YUlj3oZ5yKzdsjPm09dN1O7UO90BorpG5TtkdEOZSyto/0FKG6LJbYtM/b752tvOT5c8aHLc+ayluXb/MQlGnLR8WjlvtUmR6lLD0Vbw9Sx943dx4HbNvQHqgoeRhVr1LyL8qyNt9eLop7ZtN2ep8QV9NbOMNd/cDAwMDAwMDrj4AbfAI/gwf46OMuysDAI8E7j899/+ficz/tc/HOu+8sf/eGB8D+8Bl43+XvBH8C+NjP3+B/+OX/Ae9+T8Bnf/bLzy8E4Md+DPjn/xz4lV95WX8ODgwMDLyl8GQTvt6BRdFi1W1i3xCjj1a6aiO8ED6kjKv5Gd4l1Yl248zeLWP2qrRpTuwM+44Rt2ck00RNo940ahWHWr9GWemW93W6lMngUl+dJi0NSWKgPRU/T8ca1uohrb5AVtX0DGuiuBBVoFWniVKqpxCGIiocgawaRNKew4Jo7bq7VL8zOKsIp0KEMCelU0Mkg2va5ABflV0sKr15rnVlBmDUuzEs+xlI1xsFomoH3fcSd3JS01j6c/JYxN60Cj9HKG6ge9B5aeJboA2ejdo4LMcVclksya3dXkONbVGmSGxoD1B+fxlbr6NaMipGeEI8hFpfZvBxTgruGFXsal+UoBQC2Hvwha9xSJFJO+eAeYabI6b72dVvViCmh5Dc/gqZOwHHO4TpQSKm4i4pK9k5zBcp5ihcIh2DB+arlFa4BOiY0vMHxnSdXYk7B975Gi9Wys9c1abOp3EwTVioScn0ne5nR228R5j5RmqsK3Kr54K1Kkjd2UZn8klVlVwFp7mFOcWEZe+X5LY0uSgSiQCf3DnHi0zCO1kXUZWgyN0jPIoQw3LmRarCAAUCTzE3SVJrz3f22H8cNR48UA8YCGG95rWgqBq57ZdzyRTVF62LUYlTntaaFONalU3/G7ldqwvxq1We0hjtOkGO0rgSl85N+ZNHDDrO6Vm57hzuvzfF6w2XSK7MPXB4iuBmB/8uj8vnGbt7Abd+4Xns/6eAOwCO77qL+c4ON8+kGL5xSn3mAmO6Zvhrhr8O2L14KHs13QTQ4VjKoN05y95c5g4z+PoafH3Tb2vpE1nrAdCOKlGulOuikC/Ee4/06R2O0s/19tsemav3BU329chSm5ZGj0Ds7P9nkddlj4nL3x+V/LRtp4jXhbvfc2DVriVr801gD6Kp9W0RU966arZEoFbWyreq3a90+TsH4BbeElb6oSG0u26K1bjp7pmxOzYXa3xvPOuDgnbd09+1uX5lf9Fxf9sCL9+3rsBPHfgTLy36/eZbKtbnbJ3UM6zHv3a9rL+rTf6s5zXyc+zqYR/5Yu0d+uuRydrjiXbTnJ87OTftPjMwMDAwMDDwhsB9/Br+If44Zjx83EUZGHgkXO2v8Ce//E/iHU+9Y/Et+jmf+jn4nE/9HOCjwL/8+Y/jm//WN+Pf/Jp7+Et/6eXndzwCf+EvAD/7s6+w4AMDAwNvETzZhC8SKdOQnJsPa1KtEqJJZdcxmGQVqzVoN2Qvc3I9alzakpAA2dBdytdT2PbKvqVMjcqAptNsiDyTvm4jW1ch1eRnISN6BHSMbZ49t4vKgFaM/daAJ/nYdsjlF7K3McYqA+Qm1Hs9sld+LkR0iGBwVUKSbmNXSRTdviU2rtSda3xeG0s3E8JNrGkA1n1rty3sNa9IUg/FSuV8JNasVv8W99DiBtGokqRMmjjmmIgvfeBArmtlcDFSiltR16ah89fP67JpssLG2BM3101T0FKdY1wzknfFUF3GkCMwfO2fmN1Vylz1uZ+YE6mY3QUnV8LaOB+Bubbb9BAIeyDuqjqSvSJxPRUlqZsZNKfnkwvhHPc3pq5kn8hhl93UQtSnE+BvIvyDuc4/e8hFz1PpU2lnC+aUrrhzLu6M83jH0jh8Simckm3nJs9z/dm6QV+DdUuKROYCeb1v6hhBMwpJjzmtK3z7CvMlEC6QXDEDWRVKaOL3op1CtbLperxgIALukEnffDAo7oH59oS9rEura1kmCzLZwHbN7mGxXqZ5xJFBenpEXsb0FhJY4v9yXddYz9tSVkPEq7jBpwj6xrWpeLnIdaMQyryn44x46xLx1g6HOy7F1/WU5sIBiEekQxF7ws3TwPFqArtnk7v0QyqDvw6488vHmneI9RAG5fkVIugY4F58UOcCkTo4ICS8aucSDiGcdyBBnjnFnYjaOrbxxBcqU03QnevtQsaG3kPXxp88Z++JC115t0e22nd6rpp75PMaoWihicned5Bxx6uvbRK95sBacxBFDoepOvRc0MtcIVXH5C75xBhRBFyTryFWu/c0capAnfWk265WXbr2nB5ndhwCi37UI6NLWJ9Tnh70OLbv9NbH3sHJ3sGfR1lbLex4lGtyWEQOz1jXzwZlr1TffM16KdAkr16bF99X8u07N+t5IZ21l46etxbtkWdgYGBgYGBgFc/jF/HD+Gb8JnwNPh2/93EXZ2DgDY9uSBJ17amrp/DHPvjH8L63HfHLPwT8wI//N/ilj/0SAOBLvgT42q9t3/2hHwL+/t9f5hMC8Gu/9mqWfGBgYODNjSee8O0qWnvQyjchSCyhuWUoyvcX8Xvzz2IHFOKXtAJWylVIGq7xhu19/bvOZ6teth2QDUA9Y1SPfO2l551SPSqjfkRL7FrFhDUEd+K7FWOnkMJGCdWLSdn7XT/bfWbNHZ6GcwAf87srpL8Y44TAbFwFd4x0HYVGEyuzudEhXCzxoBVkjRrTYaHiLerfXj3QkrK993rv6/i+PdIIuV4OWAbe66ATh3QBXbat/luUo77XjI21NDLZSzFTZ2pc8uTq+JZktQ2bElk73eQ55RKnzg4lZmz0yOpkQFwJu5CUu4kQkvoikYwu/xdRXAoDyIQWQIcZC5w6APEorpmLesgY64U0A7ZJHKCO/xzbdeH6di12r8CSOcy13SOQghrXfkkeHuT3COwmxItdcuk8ISteK9krbp2BTPp6ZQsn1S+ZgHchkb1JoE8AMeLOIe47hEbkeugCiqg2+wXkMMJ2Sy5hXcMbt+5lLS3EBKdDDNrla8+9fDevjf1UFMzld3XYQOLE+zpe+MIj3N4lZe9UDzm47JI57oB5B8yXBNoDIJ9cMh8cdvcipusAf/8AzDGRyXOuy+STJ479lInLCH54DZqmfG9qyN80Zzt7XoxYxEtetEeK21ubwLRNx2U/n9HMUoayL/bIz1MKvrXnNPnpXH/ObaV9DnmricseAXwu9PM6Jm3ziCJK19pJt2WvrKe+I+zBMPtd02mHBamv08zusOWaPLt5EECXt0O+L2Knn6tyjhEc4uLwDjNX7wg6Pq5t497hAJNOykeR5b32W/luK23d8zBj62m/PfV1i3PJ8N59WR9subYU+eK9QWLsqoM3a1gozXv35WCaRfdQ1xkHWAYGBgYGBgYaXOMT+Dl8P96GzxqE71sOBOBpAA8A3H/MZXlj42p/hbtXd+HOsClc7i7xJZ/1JQCAT/4c4yd+5J/hX/7y8wCAdz4LzL+vff4Xfg74f//D9tr14Ro384o3roGBgYGBLp5swjfE6n1SG3+8WxqqmNPzVokixhMbv69ReRrjVFEKJaLIGrDKtZ4hiCirNFX5xBB7ioxtSGMAUEZ1TYj0YhF6V9+TdIUQ1kZVMfJpwlrynWPfeKyNgaK0FEOlqH17xl+tHukQw235fXKxO8+NcasYKhVEuculrIb4k3iVQO67DjndI0W0CtoSYtq4Ni2nlVY6VjfGWa3ofUvGpIq1RLu+H11VvtoxY5XcrNWbVNPQ0CRwyUcfpFDtslBp+jqmddqOUCZnj0jxrj8mtLtC79Nz81yNpsaY3rqzbVVdC1CO46vipvI8Azc3oN0EHOfEn3uv6sM1Hq8luJhBhznFG316SqpKZsQJCBfUCGpYkeHJhbwD74DjHWB6ALjACPvcNDcAT6mbOZPFxJnTzGQezSHNR1FpdcmV1Ia03yd1s10WStzWGo+0ELQ9kjiTBQAaJVttkvyzb1XVhYzMw6EOp5V1waw7FJI7ZzgUBTYCl995mhIRyAyaA+LlBeZnLpLCWtoeQCQuneCym2wQcLgNsGO4G0LcM+IO2L2U48QeqJLAgbIrd8J8CdzcdbgDAPMMOhwTuSjrsazT2t09MvGr1kbyEbzmVr1jsC+K7N4fVzl+LERdC5R5A+0Jo6fCB0qM66LuXSV78/iQGL5CMNsxI8r5EDE/dYEH79zjeDu15/QQ5XDD5fMRYU/1sIMjHO9kNTQBFD0Qd/A3F7meKYZys/AzsHvAuHgx4u7z95RCzrXfA9qta1Yf43BEnGd03dsXctEcurHtmNt/y7Vq4+bVKgih5o/1fpFebvdpITW3yD6dn4VeMzokaHF7rEmulbW2SV+7BbZkZc8ltSDvO4s1vhxgyITpNLUkdqlqXm9yuqS9jHQIaZkTJGPYtKOoebv7iPZ+Is/r+mwRyuLWWVCUo6Gmo8tq69pxr13qYq+Z50p7qIMYpe5RTmC4GlKj49a6OShZK1fLJel61ffyvvSjVfHKd6BqowLtblkr0gWanC7ftarcduxqgrzUvX5H0W6qa6Ytg/Yu4Vz7DWK/cdV6yyGFYdCt1pC/kdN8835l3+XUHzGXRchkOYUWufHCv0r+PsrBuYGBgYGBgYGBtxzuAPgrAP4pgO98zGV5Y+MP/s/+IL70c74Ud2/dfeR3v+GD34BjSIKbqyvg5/9Oe/+3AfiP/1ftte///34//t4/+3svr7ADAwMDb1E82YQv0Ko4tTpmDVYNYtW+8owQsfJcQ4B1jF5iMFqLidsrx5YRTd7tPd9V8fDyvR6JrNuoo7Qo79nfxajVM0SfC6t86RmSF6+YZ70iEdeUi6bOi9i7gp5St6d+VekwMxYxT8sDYuCkvnGt1NOkfcoQZ+/bOJsnyt0YO9ee65HAXZK+U++tMveU0OeCs3JTX1KEQDeWb6PA4TbvcxQv2nhqm4SNIZgICIzp/ox44TBfUlEvpvuAxOUtLoIn1Ni+SOrGFONXjdGsOBWyt+avCMP8X1dBqvqOHTWk69lo3MNzJRMf9X2gJcnO6QN7gIHM2qeIglJ/oNZ55zFferiA5Iq5kOUoCuvyEiWylx3afgOU1wYpCzLJnEjhcFHHYYkrLOWVpOy+ouHc+hp2LqxHgJ7r9K21EjCkLyXCV6e7RmDpvcSuC/pAlCPMtz0Odwlxl1W9Ry5Ka85zpKrdGexTlMuSMwFxj0ICS6xscYUOAuYrwB+EJFwUuBJbruYjRM2mulfPnRWyvFziVlm6qjR9lLm0VixL5m25w+1hQ6G4GRNUr7P23bUynGoD7frcEnVrSkx5v3f/lBcCmDqe471Ak7Br93r1PJXm2u/iaYKX7p81obvpRq1HuG8hdg5uiPvvrW9Ae4AxFaJes/24cgCwELBbZd46TCnp6DR7ZbXpnvq7oXMooIusBD7l+bub/toaveJJZnWOdlz0DwwMDAwMDAwMnIID8DYATz3ugrzhcfvyNp698+wjv0dEeOqqbd/5QfvMBQEXd9prV7urR85rYGBg4K2ONwHhq4yDojwSQ7QmPNcMdTpOnBjRsoqNtUGbubhppjm0eQgs6UIpfqAoBFujsyqnvqbRU4wQJZehmniOnFSQYnCcxDiHqjwQlZN2a22NlNYopxWttgz6ulbysFJi9tzsSX6iehA1CRGsKmXh3lIrd2jDbaPFGnkp7aDbXcqyIroT18yFdCy+YV37fiGJuDXAhVAJY4nhK0pdW2ZBjyTrkcDep9iyUqdiEM//imrVUX1ummr+ti1L+fKz3lUiyAGNylmuy7PaNbB3ABSJJKpjSxKZfijtVeqsFFprinBL+pb57dbjkop7Wlk/gDTPs6KHnatqp9C6hKUQMH38JcSLZ+Bve4QLIAqR6IHoMzkl1bmkSuYGwF8z4j65HqZMfiViK7/D6T8m1PnuHXjyKfY4gEa1D6Ty2ip6Bw4qfnGuo/S5KHuLm1rtvhxo+sjGvFx1RSlpSJ+X5s6k4tohF+kPqW+o6xR7AjEBjpMrX2CxzvCFx/GOg79h7B4QbhhIbqBTm5OI2EVRKsVmSEPX5Lj+RoESGb8LCJce8xVVY7xej7Xa1RJj4u6Yk4vPR6H9SrsB/UMqdt5p6Djt2suBkAeu0z/k0FO9kqjM1FxJN3Lbyd6m1HfXz3g8/JTUfjhmhS+l9p0vZJ9MfcOUx2Me+6LEDvs892I+KMGAO6LEvQ6XSXldC1r3WCZSsVt922dra8k5e4t2qa0ORvRc9zZxZ2Mbx9XGmT0L9jlLlp5wr9yoYuX9tbT1fa3czN4pWCtMc9+XOvXcIa+pfXe7QjDyPCcCWKs8TXkWh1BOeQqxqt9O22iXx4s1TZdbH6zJ42hBIqsyLg4C5HrZb6CFslqQ22SxX1qy2n7TqTwB1HyZi9qYvGtJd/uOVmCjA30QyYwdPhxSnXouotfSsunaetq2YW4V8GteZdbyLm2eD3WZ9IkI6Kl/bRo5b87ltbGmK3HPzRq+CD8hh7TKM6HtC/GwYJW7+fc65tT37Ss9XDQwMDAwMDAwMDAwMDAwMPBE4MkmfMUtLFF19Qm0Lo078c+65KW5xmK0boiUTDYIkdtTFRtjFQWTl5RVoN0OlzioG+WU60KsiYJSjGmOlvXXz/eIPWuktIT5mkrCuujL75FOSxRUzMnV8hmqXsm7iSvXMSRSrpuNhcdSblVelvqnF5dZeoelLAwNIcyqXdlSNWL4D0gugaUsQoyKi9Tdvj67pnYU0msz1qkyaJZxL64MVX8KCaPLGaDmjDosIekI0avJnp6x0KmxL8/aNtbvWUWcuDwUI7eus/5ZDJjaHWfPIK7GcSXdhdyJmcgyisjjMZHe8u4cMjGUiF44rqpaZSAHkFWIDkCAuwnYvRRwuD2BHSHuM6E7A8enUNSlcYdE0BJAc3JDeyOEb1YrsgfiLqtOA+AgZBiD5koY1vi1ipSVeQak9VG7r9yAdukMYBE7M11T7S9toH827p6t69vittTR+tgHQJNPh1a0O97sBp9CrTvmTFYIOX+cgTmAvcPhjsPhKcJ8BfDEQCS4AxR7W4lCNxMktq+/AdyRqro3k5LIZCRFgJkQd4xwmdZdkrKmBqljqbdmO0qJiktnWonj26SjCIPeIQnrZaCnqNfkvUpTE72V/FWkfw/kypiSmPXNnhMBIB2Qik9d4f6nP4XrtzvEPTDdT2Tt8VYia5PaOvXr/iXO5Gwid93M8AdO7tEdMD1MpL2ofAGAImOeCOEyzbk4IcX31QejQsxzOrdpQ/auuO3VfbAV81ivU82BleS6d5G2Wj8aN7/91JflqS/X/Vfludgn7XPqkFchm8WdrA4t0IN1ZayIt0JsWQJVzwtDMpY0dNllPYuxto/+BtEqS3mmR3Lr33tksSlXc830Y65g+34nTVsWIcEt0d/0d/6GWcT9VfUs7aX298XhAHOAYPHNoNuzh1OHDHRZ1vYU/R2ixkFTpt63p/1+sSj7W+d76NShjMUhpI1vfyFqBYsDFVwPmjnXzu3euFsUxY6hzroj7p3hARehPbmQPpAGtOuODoUhz5+IGTwwMDAwMDAw8GTgCwH8fgC/8XEXZGBgYGBg4InBm88iEJVxSNzT6RPuWvmoDFDaFTNrIss81yOD2VH5r4ElHvP7zb+vFqwxCFDEizFy98olzxG17+rrvTKvkd2lDKcMiSvtYPPSBrVCTColS+S+AU2wpu7s5LlOAMT63+JdQ6x303dVuaGvkWvr23tO6mfTbtQdK/nKuCdl5JZ8izqvY7zV7lmLcVSpga0qxbpxPgcLV9JuQRSWW9oYDtTDDKWervm3GtvXy8LMNb6yORhBvfYMnP5jIadS2u4wY7oOhSiM2uWsAzgrTNkBPAkBzPCHnLVHISOF9C3/SXMwmvKVMi/U3h2jNin17hbW5shabMEVo/XWe5vuc4FKJgjZ24w/ZdCWPooxkXpZPcsTYb4ihAsgXKZ2JwZo1muVEOupj9ycyfU5/yzNQOlZ4swxSrM7IOwB1mSvxdraqPeQM9WcJ/uuRzr27musPFuU8BvrCXmzZsm6bPaXeDHhwTs8wmUmz4U0nwji7lzcOfsjwx8i/IHhAsPNjOk6wh0Zbgama4a/SSSwm8XjRpprcYcaJ9t6pABaQjqXr+z55+wNPfRI4DNc1/fji7/M7wFL/D0KOu8wbygY9WEw9fyiLOXXR6xTWX87B/a2DqnJc9al8jltol0kW/Vvp75tcdf7ekEG9spvSN7Ndu/dN2Rv6/ZXqWBte/babusbr5en1KGXXypsX4nbg93XX0voep47Z3oHN9S9BoYIPxkGwbre33rPHqQSUJtfQ/zr76mBgYGBgYGBs3HAi7iHjyDi+LiLMoD3AvhSJHfLA48TO7/D2++8HZe7y9MPvwqYw4xPvPQJPDw8fF3yGxgYGHgz4clW+FqCTRNNTEXBkxRirnGn2SWttLJVfs9xCIV0YUfKaBay4RiV7NXpGmVD495Zk5by884vCVlxZxhidcfMqr7ayCdGbU2CrhmctBpF3H3q+mu31TpNbZD1Pqkj57klxaXM6jkCWuOYqGD1M/MMDhFsg6cCjStDIRt4nguppxW34gqaTby74qKUKJfRGNgaIy216ei2XDOKOu1SkFOZNEHKsap9S1qpPsy6z7IKV1zDUiJHGlfgosZyKt+O+9VFecllEsu6RIyq7+c6l3Sd2Bh0XXYRrMsl9/Q13f5awZv/LW4HHRkXzqZPHSWyVaO4qY2tiq0Us82bXOuumw+ZcT3OoMmDZY71yLoI0OGYPQs48C4pgMEM99I19tcz/Hv2qVtmKoQtMUCB4G4AiVnqjolYnB5E0Jw8BxTCCumZODF8ILBjxF2+odwFl3iXDvVwC6hdP3Jd6PIipSvktq4bBzB8ifXbJRcjgzlUVaqoVaN2S6vclVtoVfsJIzjPqS+AXVtOyqprIAmfHNJ6GtHUOVx4HJ4Gbt4eES8SKUiZyHWhErxHD8x3GPvnCS67GRaVqDukvptvJdWvuIFOHhgYcZ8Uvny5S2NiTmo+Fk8TEWgCMMs6r9do7eL0HPQM98pleTe+9hrRq8h6S8DbObJ4/eIieyrglO9kXCQDqa8mj3g14fAMAQzs7qX2ZQdMD4CwI5BnXD3HYAIOtx0uXoxwMeLee3fwNzUtioqEByPsHeIOidi/BMJFmlM0AzwnxSprUjrGdn2S/0JYXzdrgzRtU9patz2g1h+nC7sgPtdi+vJxzmS6cmHcIzx12WWPtp429D6t74nLZE1wqnFIdu/WkHRUWRpPAFah2VE9ro72FdfHzbdGXneoV7aeG+KU2LJMek/qqZrlu2glZqsQalrRa901L+qh1zz1XbJIQ4fRMGNgkUdWZldXzZ2yilcFPQ90es6MXd0GQP1u02WxpG9vPbdtZw/sGBLVuj7Wz3RjLZcKnshbxnrvYERUa3G+V/Y2/T3R/RaIaezvpsbzi9SllNuMr9a9u6wl0RySkrIzENV+Xf7OUd9Q+gBi5P7a4iitSW/C870DAwMDAwOvFf4Fvhc/h+/HV+P/imeHsnRgAADwWe/7LPzp3/+ncbV/fWLqfvjjH8Zf/P6/iPs391+X/AYGBgbeTHiyCd8tWKJSk736ev69Uedag6l9vmNkoo6yR9IUN6QUl/n2DIFtIorcPaUWsHVzVMkQS2z30rLX1oxpQDVKbT2z9nvvmq5nKaY11i6NWdYguIhLCLTGNJsmt27zFmnrC+eQMwsiVefdN7gVw6dVmq0ptoG+im3NwLxaVjUG9XxxKi1L0Op0eWV+9FTHpeyKaLcHFiRuqFYrnlLMbaiCeiqZhbpUiBMhufWhil579q4JSXI4YnrIKdZoyKpDGVq2mJSIr3BB5T5nflNxRUn9mIlgJlSSNXIOOUuS3BJyYMERME0gP/eekoYBxxWy1z66eohEGaoXaSviXTdGby3tHZgJnMh1OSjCDI5pHSN9gGc3Ie4otf0EwAH+vsuELxVFKWLlY7n0RXon+hxjllGIRgpIxHEAaE6HJnhixMsd6OEEOl5L4XVFGoIAQDOmSWKgnoEUYzmqebgy7nuunO2zJ+bUaQU2KbWZEFYmNjRzIoKRiNhynuWiHd/yPDHgQj70wITpYVL16jaMExAnyv+hHJCQtEU9Xw9EMJgM0Wvy5RiTK/DtBmkPQsjBHQvjxl7H8D1L7WrmXiE39aGwnvrV/ryFtfe3SLE1VWfv/lZ+a+/0iD2LHomqsea6ubze+S6QdLP77U2suOJekLe2jGe6mF6U70R9dLlW4wzbsnTur+ah+2itLOd8Y6RCrFym5XPNoTvVL3aM9eb0qbGon9PQSum1cseYDhv15ohBsz9yOz66ce7NeyfXCkv86muLwqysVQMDAwMDAwObmPEQ1wAYJw6GDgy8hTC5CXev7p73t+2rgBADXnz4IsKpA9oDAwMDAws82YRv5FZFpSFqNyCRvVrho/9tjDMtqUNZ5apdOCdid4UsXZC4yiglKrhMKNGcFRyRK8l0nJMhafKtgbeoeIxaQeop6qquu2Nun4Ui0bYUDAKdprQX1fZoVBJGVajTLDF8bT5GgUVQxlOtJFoYyrgoKVipHpPqyYHBWTlrCMcN41dRd5S6cxurt6hJV0jPLQOoJWo0oSrfL7b9JJauvS6kalH/UiVLa+HbMWkJXElD4lNqklerekUR6jv1s+QusP67lJWy+k3Hey31z2VZI7Ws4hfGuLp2kMHCPMORwcdjVuxIvZDUmhGJaJSiaNVgngt8MYEeHkCHI/YvzGA34XDXI1wkRaO4BIZaktgBcUc43nI5HjgKeUVzekdIxXLsoBNXvIh24nJcsFLU0W5X4w+eg14sZR0HVhGXCwJYxzwVstfGQS33O2XKJCIrgz+FkBotK6qRD2MkhW+dU3yxQ7hwKQayT+XavUSV4M3krgsMirl/KRHz876ShzRL+lTUwYnsJdBNeidOQLi9g7+/A166X8su7aMxZ3Wkz3ONEwn/KK7POQDk5VduyXlt2Nf9JequZp0yijRHtY/OAWUlnE97FU+5n8rBpkzQXuwBALt7nNxne+SDSyju0mX7dgFVvU/A5Sdj6SuJbX285RD26ZCEy89Kf4HTXAt7Raowg0JchGAoBCozcDgi3tycT14plJjHu9oPa+55mbmoZ8vPQEvOybWiMsxxvEtMWFHk9sjmlT18SxGp93D7nBxi6ZG9NnbwGpmpiVwba1bS7pFvJr2FqteSqObdZh9fOdgm8XVLXdfiF68RomtulmNsD3Hk9m0I7TUCVb7jtNL3BE4S5Tb28Rq5vtamSoHcpKOf7ZGf+h0d+1m3ea1E+65uwzWX3vrZJrRHp5z6u9XmqT1WAK2K3aqERVHvXJ2DRlXLchBP9t+Iuu/u93md5vJud/3veWpQKMRwRFUJy0fUKe8aAwMDAwMDA4+M9Nf460NwDQwMKBDG3BsYGBh4mXiyCV9R5AnRIe6bV+JiNYo8Mfj2DF1iYNWGVVHrmPi+pMnkHqEJNGpYmkNr/JpcWxZnjFMrBstq4OL2fakHc/sfsFQZTlMth7yjDV42Tf2zPGeNlysKCAKK4YxDrDEgOyqoLjHcVN8Qf14Z7MRVcyZI0guZDHFUjV7WtbJJtzH+9pSLrIyZck8yFKLWvm/rpJ8TV8uSNjMKaWtdJlv0DNWWpGdVPiHTPQFzT7nTuaZJdU2e9MiHUqcp5dEY31Wb23JbclHcHQKJ/DB9RdYwnt1gajWNNciTIxT32R0Cm0JW+RCBtKrHpTkXd7tKbkUA4ETg5bmw//h9EN/C/fekcjGlbpVYvP46EYc8AeESuHFU3AgLMSwkFwUg7hlgAk1c154QEnsWOoRMLgsTVeVrOTSycthhU1mn+gNYHKxo1lqtyFZjKBGTvlX5rhmfyZU6kRjOjdKqHoBR60BM7XN491N4+KxDuMVATGQt5Zi8FFMbuwDEKZHs/oASs5dj6gf2QNwntel8K/fbIZG/jhJRHC4Z8YLx4F170DFi95GPgcI+zYdJWFk17ndTnYeU9y0bp3sLojDNz5Mz/WLbsLQXL69ZMj7/XHCK/PSu7h0hpmVrlrXPgZHiKdNxhn8w4/KTEdfPOPBFcp1NgZPL7CnNj3BBwAHwh5hj/DJ2DwPCpcfhKYf9SxHEjMMdlxTYO6TDGABAtf8OT6d7uNiXfZEn36xXFBmIoa6rmoBZtGM7LwrBm/cROqP/rKvaEmuVYt0/7V4vZKTXc8vVfVE/b9d5TYD1iDi9l2sCvPdM73fZ73tpW3KwU/9GtWndOBt30d00eu6mdXto98ixtnH5/pBXtNvsvA+drcRWZe8Sp+V7qy1nzx21XCPK6nb9/aby6Kk/qdPeC4JUxoRc877GPTf1acqk20+7BO+1v+S7Ro53XIGXsumy6oMEvcNlGnZPkPf1PV2n7P46hf9AnS8h1CN9RMnleX63+X4wxHDPjXMpg5ofhewtZVPfNEC79uiDS7a/9dofDLnL6ttM8pDrksej7DUDAwMDAwMDAICAG/x/8K14D34HvgjfAhrhEQYGXle895n34lu/9lvxwz/1w/gnP/tPHndxBgYGBp4oPNlfLVbpWggO9d85MKfiKbtMXSgCNNEqSp4NhVbPzfOChO0ZGCUfo3LtwhrCGrUDL++XwnXStz837dsx2J1QvyzyK2U+oTTYche9AiH4zjbYnhFLtC2TMq7Ju1sGYhWjtnnv3HyAtnyasOsZTvWzvXrZ+WCNfz0SoclDESN6fNpyrEHy10SLXN+CJRqBRl212ec5Jl8pv02zlFupgpj781bgO/XOh0zYO9CDG/iHMyhw43xA3AYDmdSlRCyGi/QvCM3ziaBMBC77RCpXNWNdQ8i2uRCkUkWtyN3CljG41wcn0JC7a2l3yk4mFnRTl14y5mDN4e6E+RYh7lL700yFPNekb3IdnO8HANHcz/3DE5dYzG5Ozxf1tWccniLMd3blwFE6ANSZi735cu5aBSHNXwbW1pyXq/aSQxZSH+ZluARBjKBjgL+OxY0zzclVsxMVO4DoKal/OZP8mQ9NhH/ej8vhHVS1vPwekIhkue59PQhW6mt+Vt8Kj6R8hxnbwPnfGadc9K6pLmXvlba3RLEu26n9/tyyCLH3Slz5Stltuo0757wfbJHTQP3eWst77fqaC+v8u3a7bfPawmo5ttpNv2cPAQAtwajI8CbkQyniy1wPeui0vS5H4x3nEdNp0lpDjyDfOnTwKJC5osuydsDhjHHdxELeIr9rhu13yBnotpfeQ7VLfWDjwMqT/efdwMDAwMDA4wYj4tfwIXwU//xxF+UtCg/g3QCeeczlGHhcuH15G7/9M3473vPMex53UQYGBgaeODzZCl8gGZtFLUqxMeZSVAof60JOq/kiqjrEu3StUQSpk/eTb9JfGLq1YSeEZKjuGfpDTASGVqzRBkGr39VKOqVUwDTV3+U5Vr+b+i+uaawR0tKOYiRfUftwdgVMYnBT6ht4n4xa3FH1Mqd3FVHVGkK5cXlXXC5bpaGOFav6nqapqqy02tTC+2UZwMqIllXgmsDUpGzPjV4hbFHvFRWgKFvaAwUAsotvQxhPauqGuSo4YkDjJpxcui8udWMiD6va16g0gVxvXl4X99OikC+qMk265bZPjaPSy9DxMptYoJU8SURu28+pSWp5CknjfeNGsSjIlMqNYgRvqUoBYJ7B3mc1bqsyrV6HGcRzcSPMu1pPzgogevE+3L0D9i/dQrgkhItcPQDR1zmX1gUADsllcATiHk3MX4rpX1BSLsYLQtxPcPOcFGr7VA7SinzU91P7pDUNh2Nubw9sxEBpVIy6X0q6XMcSUJW+GuRqvFkbh1m/a8vcyy8rlikEcCTwzlflskOaL3MAOwLvd3jwDo/jndRm7pAUpUBaWjVpmDoa5X5xpx2AKROSIuBGXir2zyfF78P3MNglYvL++wjuMOFqygre45zJRiHolDKOKI0TceUfThwCkT0oKz1T34TcTJ2DDOj03yJNpeq1sG62bf8QgaZdjj2sxlzMRLeoFLM77uIK1QH+yOAHlXh3MyPuqBx2SAQ6AXMi6udbHjwB7ljzn64Z/gjEh0DYA3BA9EIOA8eb1N/x1iXo5gA6zm1YBufAnkA3h9T2IeS9ZmU+5DVFXC1rt9cp3nUey9mDRBNCIO9TjftioCh3rdpTu3kuP2tyyan5pvpj0YWizLQQ5eKWutMSzCE05WrGQ0+pag+I9fIwPy/cU3PryaGoWGWc9fLI5SzPyz3jDrqnyNVxd7Vb34VnCJ0u0DoWE3LWHK7peZhIe3NaG8r97Lrb5lPy6JC/jUtwrSYNaf+nXf4WXBs7qo26bprtc+ZgTRd6HEm/AXm9M/dSZdvxqPvMurTuuXa25G3HDXbjtlvXVR+A0C6nZc1Cbk/lxYZ7dc/l5+zmOf0J0v7NUO53DrlVl+cEQp3/pezGgwmHkPpWpZPaa8p7SkDj3plc+hxztLnvDwwMDAwMDAy88fB2AH8Ng/AdGBgYGBh4dDz5hC+wJFyzIYkdNpUJXXVuVGRxUZa5/vMdtcZS5cTJbbPc0y7azqlTj3jVLn6ZEzOhDcTFeIXluz0llsaWurYpv1bpKCNazzC7ArLlasqRiKKly0RL7PbTTEqODpHps6HVASnmpVLk2efX4pSWuLedOtr4mUERq/rdWuBlGmtprsGSP5askziejds/6ccTaYpSLgALMq5L9ir0iKUekShktiZ2T80PpfJdu9clE7VC+1Ggiyuq4pivU2YPJZsY4W+UKpEAdlkpmolFIRwp1meAfOZD/pUlIKt8j1cO4c4eTua6no/KwCyqX6Yc8URURs6BvM+HXIzx14zLJkbsWvzdU9BxZe31HmTOeLdYa1mU1Z5Su0QCHUNdz5wD7zzm21TjJgfAHan0A2cVafoltXFRhiK1s8suoAsZH6gof4WcdAdKLrgJCBeMcAnQ7avlms1qXckHLUgIBeZ0kOOMWJ2rBK1ut9yuluhN/RhX+6zE712Lm62f9T4RdFZdqskTdYCJIoPF9Tnnce9Q4lfHKe2pcZcY+KTEJjjmcvDBzanv5XdRyjuJjJD7AZzdcx/yfnsw8wNYzvlHXQNSg5V2s23arEWLtbBt1614rg3Zey7WCDkd07RTju47Kr2GQH4UBWeHROy5JV6UU91v0jVpAFi4R34krLggtqTwoqxbeZ76HtHPyJocYzm0Zknlk+mvjKny3apJTKNyPfV91tyX90+NIft8KXe/rbuHD6DG3CkX5voAwpp6XR9W0OWwa0Pv5xVyt/ldw4SdWKTRW8eFDNbnAps1y7SPk0N71B6m0t+wvQNWW95+BgYGBgYGBjZxD7+Kf4n/Au/F78I78NmPuzhvITgAtwBcvM75vg/AvwXgxwD8yuuc98DAwMDAwKuDMy33b3Do+L2iaJt8+s8ShEKU9v7LEOUu5biE7F1S/dlnyi8rBinJs+TvNvNtDDKSlnaFq+9RVhs7Vd+iiEzqpUVZLNnbM5bp97UiQqe5ZuCVf3vpGsKact2ZU0xfHROtuGf2btlGCpRd5VEnn6Wh1ihkXIewVW6PyZS3KBuFLHQn3Ec7amMRa1i17prbW7kubd4YwENNx7VxKm05IASq6xAJPcNpM0dyH3jfzh9pF53PIs2OgpFcm1Z+L42BoPIQsqBfp9LvPQOsXG/ceW4QP6XYnTlZ3ldElz1IYq+FiOlhJXyFpJL/NLkrhKO4GC4kMFMlJ4kRJ+DwFOHw9A6U1d3idp6J0vpXXGbnMerzPVkrpgm0322qP1chhLx1Jykk7RZBb1Wla+3vsppSewWI6Xn2Hjwp5ZhXMYoBYPLgC4/DU0C4THF23RFwN6mNwUgEo8TozcpQf5OI4eIo4ADsHqTDPjG7cXZZlRr3mWw8JNKXAhB3jPmKEO/cAmdVXXJBLO6d1YES2adkLfIuzclTKOtO7M8p2x9akSr/qvfIUflPfi/5NPl2Dkzsdl2yVwh6Cu18pBjhJNayS+0fLoDjHUoKX5di+M6XwHxJiBNlch+ZxI2IO8J8ma6xS0SxuOlmR2Ve+evUn+VwgMyPlbnfKPFOQCunF/NHDpIoBSX11kiBy33UqHjr2kXTVMf/hvvmMtd7Ckr5Tx9+WSOFNbEW0zqsY4+yqG7Nmlqur2HDtXGTt3Np/dcH6Iwb3EVemVyz12zdFjGE9f21/Rn1G6S0vyFM9XeLDi3wSK6WS/rqPV0m1YerxLNW6ebfSatZe/W218xY6LZ7p9/X+j+1TeiOF/VLUfOyHZcy5rQiWR8esHVfq5vKk2S+2cOZZsx120SgD+t05lJvjizaxbbd2hqk99TIzTgranKvvvlD/h7M1xrFObBYnwYGBgYGBgbOxwv4Bfx3+PP4NXzocRdl4HXBbwLwpwD8lsddkIGBgYGBgZeNJ1vhy5wMw4t4Vlzvy0l+MQCLgUWToPpfQVFLtIY2svEKKcfuDHFplLVupLVhx+Yv16wBsxiF0BpmhVAQ6JP9F/v0ry6rJrK0kavklZ8VY7NW7cqzPbeMzMUQVdWsZMraGpqKG0cxShnydGEYtBAiA0slMc+hJQTlukMhbtlVgy6L6+ZC5Cq3mkTF/WZqT2nr9A5D950xEEYGo2PI066FpV8aF7lRqYC0wdMQQ/peURXbMR1Tmcs40e+YdhVXz5JOuR+bfmretWoSm7ZVQUs7h+U9koMatk6dPLgZ9+odayDO5MUC0pZK6cshpjkl84AouaUFUruI4fgYKskqJK8iJuFTvdzMcDODAiFO6V13TERVIX4ZVfELFHe37AFcAxQI81NIa1xkHJ5xeHjjcUfqGhxwnEGTB+93lQDVa5oDOObDB5MH7SbwQfwYoz4HrJBKsVX72v7miOrCW8bhxkEHm6eG98nluowF58qYJGZwJBTpc0SjYJ6fvsLN2y8w307p7l4k+OukGhWXwdLGQGrz6AFMidQFJUI3zuk/d0ydE3dCJDIO+0TCTw8I4ZIRmRCuGIe7wIuf/TSe+lf34D/+QiIsnCHbvGvXc6S9hMUV/BZxVpTpqp/0OtKM+2UfFjVqx51zUfieEdOXvANd7IHdVEMbGJQQCkA+JBThjrEcaggXSa3LDpjuM9wROD5F8AHwBwZ75QY9c9TXzziEizp/XMgunQHs7uW2ZMDNEbsHEe7Fh+mwVkcp3syNM2Pvriqs9Xi37suzJ4lm/5B27LhDTu+m68WVrJ6PzvXDKPTUvJoc6xB6a6SUuNItuebnFmrk/O5i71X17Kp0dT5yiChdMPuEIQk7RHrjAlm3TX6/yTffK2RZCC1xJocVMlHaVRH3PEoo182rKlYFq5pdxKB3rtmvGrfNQFPWRqXbcV+ty9rEnVW/s2qXWifX1KVxrWzbZu0gniWvdVomL2rqV785F27E1QGEBj1X1LovQkhfaZKv9+13KtD5Fmr7sZDF3pdQJXavrOPS1W9p0+7FxbWeG6p923GHZj3pzTXK4TGawyVxrsSzuH62nl8GBgYGBgYGBgYGBgYGBgbe1FiXODxp0AYRS3qskbo9MGfVEC2MOl1SeIUYXku7WwZ7fcX12+KdhoA1xLHFoxh7xIBp09HGtbW66DRsnwi04W/DDeI5WBiUsxJxU3l0Cj03zq8gnVIujV65T2FVmblRzg3CfPV3ff2VtEHPRfYa1lTO576/pqxRqm2tcOy+r4n4tXnalHnl0AaQSC5RjgrZGOV5eVYlrYsUURSMiIlkhEvKyPkKdX5qAlGpedt65X9lPdOqoFeKnnq7d/1M2JiFTX2YK6EdUdxWAwBFRriacLztqivgQ3XFnJ5B6Q8hDYFKHMnP7IE4UXlO3nOKI6cI0FxdRccd4+Zph3gpBnZNzK6sg82hoddmGy5q1Jw+m3nQXDsHQnr45d6QQiCYumaFs3jDYALilIh2domkFUKeKbV5Ulan/Zcp9UfYA2FflbxyXfpaYgLv7kfsXgqJCDln/nLcXuMfRa25NqfKntkSzFrltzictFYmQxiukbbNPR1LtKci3cpzQwH7StAL5bCpju2M0UdW0+Ll7eev+BsgY62sPbfVvd9XYwo3z5//3aOfO/nOI7YzgPWxYw5LNocD9TO9vewUtr5JO3t08/tJJTr153hzmGJ9fi2Lc5o4X3hQse76H3Vsvkb7zMDAwMDAwMDLh8Mez+I34QrveNxFeYPhU5BcKz/O75d3APjUx1yGtzYO8wG//IlfxosPX3zcRRkYGBh44vBkK3wjJ3GZGEyIUNiUfI1iUg2leKrZINRTxWiIS0yP9rQ+ZXeTAqXU6qrkekSzLqt2fyzXitFKDDz5lH/PSEWkYqzGNt3IVclcDGsAZmUMDqGSQDaWZFEuxvX2ysa6biy9njs+yU8Rx8XYJUpL5uSqWSW1cNuo45JBkTYSi5IjMDN4mqqSR4rshfyIbVrep2dDJv6yCpVh1EfMAIekEu25hLbxYZvxIO2e//VKGSbt5TvGz5iZEYmHKu51vR0TDiU2a0OwGzeG4t4ZSM9bokbe1e/pYq0qY3L9e2NJlxFo66wNkUUh52s9NVwi8kqfyhzS41QfhugYaYuKSs1Pnufsgje7cnec+4cAVjFEJ1cIRw65XezwP87YvXADf9insk4AGMU9sAtAyCuv3BcCq8SLzcWe7hPCJRBvRRxvM/wNga8uQIdjJXyLK1NUEXdRGFXVF3sHuroCXd+Ab24W7ZLeMdfIpRiw5RmjatSQWNGaULQK6y0jdXZPT5GzqpjzUpjXbscguLJGlljFjnD9jh0evMuBHac4vMpNMwhwN8D+IeP4VCISd/cY4Yow36rrh79JP8+3U7snF8KJTJyu5SAQgJgIYDcnhS/7pFINVxOmi131vKDHnl6fS9tSbl9a58jt87ntOYS+a+Gu4r4edGC9Rso75bltAoG8B11eVL8GWs0mmDwwhzSHQshzShKobe3mRKwzcYlpLS6egaSolljrxGnO+AMQd8kdtBDF8y1g9xJjeoFx68P34e49bPZrmkPdu7WHghAAmUOPCnuwQfYLfX+hRGwJyoV6U6sqZQ/XnjbkOXHXC7QqzxDqmihqVFFw2nioQjSrMlgVaEnHuhhGXXutu2S7l5e8Tf2KIlXUkrrpbJopkfI7h1jjSAty+dk0eVcVuTjEtiSOuy6Nsyq4p1xeUyEvVL9yiC7vT/JtsknmrhGRSm2t4wNrtfHJmMA2PalPrmvagxWJapXUK++rirS/27bQ9bDK815sc7m329VnZT7YA5DyvE3Hrle9sme31jJ/OIR2futy529aBuriJt/dko4ZBzzPXWVv7S9akr1KmdwjiLVqnkLIedoDLsOl88DAwMDAwBsNd/F+fC2+H/8C34sP4X/3uIvzBsKfAPC7AOwfYxn+CICvyWV5/jGW462LX/74L+Pb/u/fhptjx3Y1MDAwMLCJJ5vwBZIxZMNQXYy8a2pFTcAuCKylcYhCrEqmYngxKg2jTFslgdcUxGsn/rsEoxCCiiwOJh1Wz3UI280yaCOleoaZKzdk3eqtuX/Wv2si3aodTipOFGmoUfraAbQ0jJEmMK36NrpKoDYkiCJaUwGXeVvlnK7DghzgSrD24tTa9ieq5dKun+24Z0ZhVrT7ZY1zlcC994uhmtG4fnZYGhYFIWTyYz3btgyx5qvj+YpyKXQM9oJzjNpCdJV/VRtGbuJesxhdLalu1KXS5KT7zYzhfHwDNOfns2q0uBtGIrW0ypcJgMvEWCCAAd4xwp4Q3n4H/pMPQPceZGVlbhurnrI/rymqzoGMOzs3gHZ+LIjESkxynpeLQxEljzQnZM0uCl+iRMADai1DIju8B1/uU/zXXSZibwjTdbW/iyI07jOhLvnF1CfCJ/lQife4S9d396u6l2RpV31FR8qxZIHjUx67Z+/Af/zFvE/E5QGO3vilzhpb2lPNa9X2XZX6OW6ZNen7KBACyO5tQBvPPj/Lvj20E30idOWARHLPnA8YZCJY1LspDblGVdUrQzDkQxRI6UwPGfsXA9z1obg5bWD3WiHt5nm9zbbUhbKG9BTtZU1Xe2EphiJ2TioKV1SP6j29V/bUficVsGsK4bUyKpe0RZ3cI/FO5WVdLp9RrlK2sscvn2kI9U7de8TupsJ2BWttvbi+odhde0//butjCW1N7Ip7anaG4F+pk7zTJfprRU+WX5djgR5pq9PSB0bswcLe+NAHBy3sviblWfv+7t2TazHWcA6n8untp6o99CGM0k/5cGFzX0N5mEnzkAGE8h3UPbQgza/XIntobrh0HhgYGBgYeMOB4LDDFTx2j7sobzDsAFw85jLscxnGN9TjQuSIm+MNQhwHFwcGBgYeFS/D8v8GQ89lYk8VZYlOTajp/4RQ4KT0o1BdUooyiIRg1YpC+VeTLvKzzk/KaQmil1V3WhLZojbRZCqrPPWz3ldCV9fD/ixlXHMh3ZRpY0ipvmBj9LU/rxqEhQRU8fN6BjBLyJLuYwtmgKOJDauNhBGIlQwUg101xtl6uqSgJVVWcoow9Whi2OoPmBCWfeV9n1xQ9VuMgy3lWlEix1rOtffsmLHPSB27bsjzWJT/hEg+w7Vzia+oEUI/7qDt1844bYzn0h+K9GJRyIkKXTcBUSVqewoh/ax2dytMb/6ZsrpX3ARrJW+bSCUeaab8DiFOQLhk3Lz9AvHORT04EWNbrpw/5YMfDXHq3TYRJONC4r3qQwbAov84cuoTec9AE5PkfZ+oLGm7dCijzBtk8tDMXemHEIHJ4fjsJeZLIE6Az2SvxIcVQ3hyDUy5HxLRSFzVwG4G/DXDHRIJHHeJYNy9xCm2LNU+o5BIX0BU20kBfrjjcPP2y1xG0x+FuJb1gLrt2e+TlTVG98HLUaqeykNnN+3acgtJ03uvxF+WWMaJ7A37RPwCAM1c+0aRveyQyF4h6ScJr4AS99ofubjf9jeM/b2Ii09cgx7eAMe5f4AGipgWsuU492N898jC7B67aWe9ttv1pLdmdlw61/sbZKMmr7TaciMeb/PMxp6sXUuXNXfNNbAlsSODQ1T/hbNIU9lnZQ/tKXHP+R5oyt2r96lrp8qp2qNJYyWuqtRl7duFObeXud9th7isG+nvDl0vDem7Zr2sSmCbXlM2QzQ3/bk1xrzv94OM17V2zwrZ7hxUe1suVPsdau93UNyb6+9xm4c8o/PU39D6HedKH5S6o+2/0j+acNeHNHze4/La0b5T9wJpy+rJhEt9mrZ2Zh/RY9PXvinr1MDAwMDAwMAbFATCxmG5twwI2YXj4y5IhpRnfEe9nmBmhBgQX2aosIGBgYGBJ13h67LxhwiYxPjJ9ZrAkr7eJbLAGoKMOo+n5NKOMplWiF5JSwxj3iXXlVb9JAZDUkarybf3NcRQ56kt09RRa/SIOXm+iStmPk50/Fz9jjaOiZpLp23aijpxHIuhzCiPioEsX+cQi7GLlRtLbXBk9dwCVrGg8usZjwFUV83kWuMYZckZ0BJWCxd+7Qd4MbitubiNQR1AEGma9K1SRtqPmElNyTWip7wvhLAik71LY0xI5B65p9XBnnI5xN02lJGbleI2LsmpE0RUGUOWEG4IY1fvi4t2yPiqKlEAoGlaGpZdJTCL4di4L01F5UJiFtJRtz0rY6+k4V1S+sj8YwY4x8oVEjJfT68RaHZF1RmnRBx2/16hlg8G55/VcgEkN8NwhLjLhO8F8MJv2IHmK1z9SmwPMuh5SqmclqDmyQO7CbTbg4+HTsFapPaKhegiw1B3Cdw8RjVhTI4qMbwC0utnrgPmCHfk5EqbGTTHpt3D7T3uvW+PwzPJ9bW/BtxNJmbn1J5OD70JAJIaOE4AT+kdcCIlp2uGexE43KXkSnhGjimL4m47TpnoPaZ3wInInG8RDgeHq8s96OYImkMeK651va9IDCJK4/pwui96faP7oBnbui/SzZbA1+uWVbsvOwZ0eQHa7dKBBn1LDpqQWifK3pfSDTuXCHMZ8CLUu0hjmvPf0OLSXPpCCOC4T21Os6z3+Z8ZuHg+4uL5I9zz91PeavxolbHs0RQiMAfwnImmXp2b7wHXtG2zdmS3/2t7lKgtizpTyFSHSgqVPTEYws8oHjXZ2tnfG9fJUvYQmjxa4im5wl0c/ti1rqa7sUaNu3ytVtTuj2tznncYQdqk1MXL91dHEaye07GQN5WtqpxSPltO6xK5qMqFaJR6R07hHuR37YbatF2Tl6e2vLkuQuSR96m+Du19Ve8G6vsJu+ruu6uCVSEwttxYL8aUVZVDtXmPdNVjcK0snfbqjdMC3f/221Te1e+r74LyXWrbTlxD6zLpfOzciLH68pE1z7mT45t8Cv/BIVbvOyrNUlal7K1F6Bs7C0GsVb+G9IV88wLt3yEDAwMDAwMDbzh8Jr4G78Jvw4/gz+AT+OnHXZzHiN8B4A8BeP/jLkjGUwD+EoB/CuC/fMxleesgcsR/9g//M/z8R35+qHsHBgYGXiae/KNKWn1riUygXuuRsYogKYZrQ5qUZHrq4ZVnF2Ww5Vkx4izqtabaWlEwLdK2KoBeOUuaKwbSNSLAGn/t+z2D7xmGLHm3Gpe322HL2Nbc00TTgjA2ZO2iPEsVTfm318aW1Fojhc89sbaqpjYE7Brs4QKjJGpdkp5I75yx+0rQiy0KZeAEzlKRpbSW7baqMO0dwMgEOGfyVEjUojyV3+XZBWGJxg0nMYoyscmaAO3aGeo/YiQF6jG7bXSM411gvuVB09Qvdw/SfkSA86178zWocaFJxZejJmU7zjYfXllT7f39DuHS43gnE7mUiVhR7QaGmxlipS/t7EybB6QzH5T+9cf8XkRWmSZimEJ+FpX8pYii9g17wnzlwBc78G6qZdWu99U+VUIDuBPrT23E/s+n3tGxZl9OOpRVaVsuWhf56kMZVOYCU217cZ0t11j1i8wT9igK4Lir/4FS208PGe7hnFw567V4a+zkwx9nt6G8uhEf+RVhbT2zpO+57wHLNcESW/Zg2CtFz9PKa4kNd9Snrj0KbNzenrLypOvsjTQBFLJXfu6iR6yeco1tsfB88vLHbq9NFu2Q59pZZbRk67ljU9ehcyjgLGyRvI+CnurYrRwI0fdX0B1XjTvpE/WT2O2v9TfbwMDAwMDAwCvGbbwL78Jvxw53HndRHjOeAfBvALj7mMsh2AH4LQDe97gL8obAg8MD/I8f/R/x4oMXX9N8mBkf/viH8eGPf/g1zWdgYGDgzYwnW+ErmLMVfvL5hLsiYYBqABbD1E0OyqhJYlTSl6dW5VKeBeo9dQ1IxnuKqK5rgay2dDWfLRWVlNeSo3No62HdQet3NbRKJqpnNEEkRjbtMlKTSD1Dke+0Tc8wnfMi7SJX2l/IA6J0P6t5LQlF3hVlLtG0NBzm+LqsTn0xVtpXlGw6RmxWZ1V1sa8EqDzPDPj8zDzXtCyB1YljCU+1vUIorqB5jpUAcm3bNOlJe8xz/Vnq6nx9d55TfqLsZTUGdXtMU61TIdRDrYuoiy1hsnZ4YQ1FYZLLWgKeupq+jnss3Veu90/xFZfbZqwVZa9SEpWx0lEXFfKxQ4ro2NRC5lKO6cdEIG+I34ik2skkcGm7rFQEUNShADBfpd939xRZ6JJC1OV4svIvMxB2iWTcvUjAU4kAu3mGcf2Mw1NP3wG99CApSa2qygHEvIhFSABovwP2e+DmZtkGZa3K4z8GwO/Tux4oSlFpR6C6yDaEYiKJ/ZLs3RpDQkblNiZPYNTxyJMDHdOacnjnbTz8lB0OTyc1qDsA/mFy8+sPDDcnV8s3T0vFJf/0DB9TH04PGCDgeIeKG2E3A3FiXL+Niup0eshpSh+q+pTykuACMN8C4p7w8D23cfHJCdOvv1jKTTfHSvAKGTwHYJpA+x3oIa1zh511mPP61bjMti6HVV+sQvfb6iMEXFwslHsk85Go1k28Z+giUFa7i5o3AGAkF8/7pJRmB8xXBH/gQqqLG25x8zzfrkvJdA24mbF/4Qh//1D3SSLwfpfUvBLPlwg0ZzVviNnFfGf+N5WWvTj2iZWepwWgEoAq9rcmCXtEXyEAZa/Ie3JZi7LS1b4HoMZrVe6dtRtY5PTL8+Lhw7nl2riiHN6KD6xVvWux4228UtnnTyoZVTtI2qJMtird8oxSMa65zO7l1bjQtWrrDoqiVt5XbWnVw014AkfL68rzSNeriWoDfaeJ20vZg4LJp2kn1XbFrbav4RNKv0j9TSxae61pD/1d2FM4bymv7T35fcVluSihbfuQPZBiPXakwtT7evzn71Tyfqn83/retn8jdL6PS0qmfguVbvZqQmZeLlxt5zknzzWHI70HXFwevHD5pNPAwMDAwMDAwMDAy8TP/erP4Vu/71vxx/4Xfwwf/LwPPu7iDAwMDAxs4MknfHvEpFYLaFeaYhDW7wqKgbdjDHSU4z62hK2ofhPZq4xCYuy1imJ9zZZBKwV7dWJORkFPrUFdk7hiQGJaGoltfXu/6/rpn88x0onhWYxsYvhaM5zK81Yxo8tVDGKuMXoVUjfnkYydsaZzjsJIjPjZYNq9V8rKLZG8UPBmYqAH48qYwcuxmSrRpmdJNItMdpd3mRPRq++Ta/Mo6tlOnzTuqBWBqdtV3uvFOtbtXkhsRfQWRZ1282zqZ/utKHrb602cRD3u9DN5bLB+XxGRHDNb2yPa83xKhxEceFoZmzGRqsQMhFzdObuOLApFTqwuE2gGfEzP2filyISlkIsu5HsTQMfk2jlcEOIFI+4Yh6cdHr7/Lq7+9Qx6cF3bwcwjTV5TIU4csN/lfumQ68x1GSRq+kgTipvxeDvPn4QtuzZ8M5f2BgB2Dg/fscPN3eSe2R3Tf/7IIEZytYxEpLNHUUoXEn7K/TdzUowCcPKuqHp9cutcXTnLeMzThQGvPDHLcA9XDuHhBG8Oc1DkFI9YDiit7QkWa4dvYEj3HuxatuZ94ARIxpbaF7jnOSKTdBS5uOuPO5di8eZwTEy5f2R5UAcfmqI5Ak9YxPcFEkm/f4kxvZTj9ury2TIRgSefSN9zPCJs9Edxm73iiSA1QUuybt3ruu0txWjHjyUtU2zOdh9uXAV7lbadS714u1aZ2HPVa0mr/F6JE6rLDUu65me0y2TTRo1ra002C1GqXRj3oNwjS56NW2YDTbjrUBO957rohKTouXLW3xhtSIK0D1KOe832sJMm3nt8nYn5asu/cBMu18S1tN7fJb8cz57MeOuV6SxsuaS2z8VYxsCacnhRlp5r8jV1fG8tVc+yfEvHuP0N2/vW1WOhV1+VtyZpS6xhokTWlnfVd63A+3TAbw16ntu1bsRAGxgYGBgYGBgYeAV41zPvwpd+zpfiA+/8wGuWx0/9yk/hJ3/xJ/GJe594zfIYGBgYeCvgzUP46rikjpLqTu6JQUWMwk6UnCtEbH6HIlejtjaiaTfS6Ur7O7WGcQA1P4l92zMgkqmDXBM1UjHkijJXk0+xpk3LMp9UM2k1hY77p8lk/bzk2TGgWWNhF9novGpIzWVKKkW51DH8NXXMSmBwJTybF1aMjWKI1gqlxm12j+BdqZMu/4I4NsZciR8coortHE8TQCWvXEch7rKKOPUNJ25V8uiNdT3WtHJcE7PSjosDCNImvo4VSwBZEhlIzE4hZvIhhm6Mv34bFFVM4CVBoWP4asNqNm4jVMKmkL6W8CwqVc4KTCSy1vQ5MSeVr5ojBCS17ZTqr903SzxYcdMMVLJXXNq6YyU0aSY4Ao6XDHegFJv2MhHA8Qo43gHuv2eHy/9pD3p4k9cqdPopzU/Sc9k70G7Xbd+mHSR+qbSr7s8Tqke282eDtEzvqjVL+i5wUVKTxD4Uw/jkcP2sw+EuIe4Y0wOCf4ikuCUkEpdR+oDm/F/uN1GWUkyq3ETecnonq3w5Tx2K6V+eUppuZjAn5a+/yf2X49CCgeMVYbr01dhv1WJ5b9lsSwvbfnr+w45rM1aVO+7FIZKtfaH0h8vKMbN32f7Ue1WMZT7GPRXXzABKXF6WJSAT8eV8CFeCN06K6KX6zPQA2L8YQfceJqXx1JIz7CjFmy5rnAN7rvPgHJR1Uh+wcusku9pDzg41sLxZyrv27lr82VoOcxAIipDUysMOoVau9TKX7wT9e3N7ZX7b+O0e6nsj3/NVpdsjNqnnWcSS0oa0fNmupXVM3eZwkfk260F9QzTkO2r7aMVySc+oU8m2dUZX2XzGe4t2Q+pjDgeAXPe9RVzkmkn6Vw4VxjO/WSwJqw8PNMR0Phin21n6Wj+r58qp/E+5R7dl0ukbNfEqdNzgM101l72VRSnfIbl7h7mA7uHGxZxWMdwHBgYGBgYG3vjw2MFhh4jj4y7KY8AOxQb1hoNDKl826LxF8Z5n3oN/54v/nfW/+14F/PSv/DT+zn//d16z9AcGBgbeKnjyCV9t6NVuGq0qZsvYQ1RdUSqFUjLMJ+MxL07LVyKUIrf5aCMYZWOeR9/QrA3o5ZR/x5DpfHtNGx+LC924NMgLiTuprlYKmoYgFteQW9CGM2v8Erd4K8qKYkBUBrvGCKrqzjFmtWR1TVgNkMqgKvURJbBVRNg20td0uQNa4kUMZM4vrwkJUojSFUJL3CVL/1kVsKTndVq674TApH76zC1hKWQvUN3GapJZE5RSrmlK9Xe5rkL0icq3vKtVOoyiLrbP6bLpQwusjPv2nd1U21Hu6/EtbRMC2PukCCRK7oq1y0erprHuTdEhaZoii1o3gpwDX0xg3aZA+h2ZmHUAw4EQ2rYlQri9Q9wRmBg0J/Lw5tnkytlfA+7IiZicEvlY/m7I/+5f4kx4UVavMihSik17IIQrxr33Ee7+0i3sQwDde5jHSY+cV2N/N5V6kveNO/QGpwzFWuFoFcD2HXKZXdgwOtv41pTdZvvczwiJ9A0RfLlDuNohXCYFaGmXmbF7yAg7wjxl0ooy0Y5MAhcyOTVVuEwKYVHxhn3qj+khQEcAmXSM4u08AByTxwdREgtxTyGlcfO0w3TDuFJtz+KSPY8TIefpeKJdVttdkZGK9O2/skK+y2EQVU4Lmnagy4s0biZf90qgPTSlCAmalctk54pbZmKkddYBh7sosZaL2p2Q3ahnt86kiGFCImxDmg/7exH75w+ghzf5AEAl2LWr6YIQkovnwxF8PFb3/GciuUKuc6K0aeOhwDX7VSrC+s+p2RUp2D34Yg5dqGvwvih1ey51u25sdRodl87loFaP2Oq5x1frayFqFZmZ2k25Zc5pN7+rvBktSbrqqlnvlZInUBWyHXK2R45qN8ddFbGUi3npitq2c8ets/7dKnubZ9Q9q3C2aTUurjvjiI2r365SVuqcw0zo+vTUso37bfGeIWrsPA4b19B6LJU6u7bNOvt10zb2gImUUStv7fc+0BK0kq69ZqHrLHXSeUqZ7TU1XgCAhfQ1BDtR+tZq4kBDtWWnn+sYljQZcMvQJ5vQBx9fj9jaAwMDAwMDAy8bBI/fg/89PoZ/iR/Cn3qLkb5PA/jzeOPGyv0iAP+H/N8/f8xlGRgYGBgYOI0nn/AVWBWVwBo5rDp3ixxRKGpfUSae8c5ZaAjfTIQVAxynvDRJtRInr1E9bKnpVonDR6zDozxvjFy997vGT600LbeWioZXdL6sNz7OcfvZqFkVcbL1vHVhbPO19xYukvn88q3BGlABFIVwr2xrxN9aGdaIdXKAi60Bcg1r4/1RThKeUJif5WpYq06L2oeS2tMaiBu1mkPYuUQSZiIwqU0ZQHYTzJXIEtLLzUIO5mshkWJOBLacyE03M5iAcMW4eWYHd30Lu3sPsxtdtYYIaQoU4zvLgYyOi95OI222X+PadrUNzzNOL4j4TEqX2S3rLjPYe/DepRiwenmg/DshH9RBUZHK/UJKMRJh71DUwDRnF8LZpTOFTLQ7Kqps5CWZ8r+FjMwq1HwOoO4Vdp+Ra+WQDS3Uff0GekWr3MsGeQeapkRYn1TRcbtW5YM4EruXCXWtFjfnMnzS+Yd80ArFtXl1eZ7GvLjmnh5E+PvHRLJNU9uuW/uflLNHrgpOvd+DGucLBad+rKPKPCv5Rml6plqxFuiR8zsvWV7uUfbnR8XKu11CTLC2Jy5i4W7vnVtK51U3ybYfVlxCr8IcnltTbS/GjCZFlUtj+05xV732XXuirF0F8WZ9TNv04u+eSGPTXXdKpL3ei/3bu34uLLF77nqwMc8WfbE2h83hxC4JfOYYXjz7SublwMDAwMDAwGsOAuEZfAAA8B78DryAX8Q9/OpjLtXrBQ/gAwCefdwFWcFTAO4AuP24C/KmxfXxGr/467+Ij734scddlIGBgYE3BZ58wleUvQCKq1d9zxrchdyU60WdEYuytyp6k3qXslqJmMC7aRnTVxuEdNo6rx7JKkSRVbtoBYu46fVuSaZxIpCaetu8pY5KJdkoQUMwBISr+WqFkDVOaYXDmuK3FLMawFmXC6hqYK71LUbGFfVDUfFm8rCQONodsyhwm4JEYN4iw3O6AWk8OM1QAI2aUSu8xOWpVftmhWKBkL7ynm53UZwJUUQOCMf8+1THuMTu9UoRqdVqniqBW8pNtT17ri5FfevU7zJG5FovRrKOD7xGWDOpvsj56/jDHIEjt33nCFY5CkcgtOOhUfkC9V9xP2vjRFryeo2s9C6pGfVckvnlkFWnErc7xWVNbn+rqnG+4xEugbhnTPcIbs4q1CNAmbCNE2G+Anb3AX/D2N1jhAvC4S7BHRguJKUpOClJKQDuBqBjUqHGC8aLv8HjeOsKb/9VIZ1jKqQDeErELnsCXSvCOhA4E3kIoa92lPEJlPGoSVkOARzdgqgl6ecmKTU2tsgn76rHBnlWiN8pjTUXIuLVhMNTO8y3gTgxXEgug8OeEJ8m+CPDHYBwgdxPuoCJFA4XKERtuEokY1rPU3sf7qa+uvWRRMSzB6JPrrEp1LTEZTRPwPEqkfpXv573Ba/WNmlHR6l/lNGf9vvTsRlT427fL4/RUmm99q4uW6dvaL8Hpinti8J6S7J6vc/eHeCnupZ7D95PmK/SeOUpH3iIgL8muENVXwvJ62YUV9tC2sddYoMp35seAJcfeQD/65+se6Pei6VecuhBSPXIwB7A/QetYnatXfSeExmw8VWlXe0BFfUzoypDe/FGi8JUx67tEkFVabpoe7X/cohFYVnaRMhEqwK27pRDqIrD47xUahpXxzX/du0u8XABLNS9TZ3UXtKJhWvRKiMVwS6q4MbddG2rQoY6lOdYvjOOc6PKLukcZ9jwClKnRmGp49zKnpnzbfrU1i1yPjxUib+kIvb9NlZppLbrf3MtFL8m1rJ+p0usWhWufC9ogtmWRbezLpf39TCL6Ysu4anf7cWQ3u1QXMX33E+nDNIFiVGt54Gtr/4uqglBFPM1lIGql5TLfh/LvyHkMASqLvq7ROeTD6vo+Mtpne7E4bVu0bU78FIf9X3TqOfznhzPOFg0MDAwMDAw8NjxND4dX43vw4/jr+HH8Z887uIMDLwu+PUXfh3f/ne+HTfHm8ddlIGBgYE3BZ5swjdyJebkdyHaBNoALDCGKvucuHEuqjJtOF5TbGliV4hcaxCyZRBDqHfJ+GfLSlSJNyHf1pSJujw6ppo2MAKV0LVlscQrUAks+dkaGa3xWWK6aUMZsqHTKWMfFGlbsl0atHrGX3G9mDNEcf97rnphjXi3cNS/vkiv4y5Pk6dWcWGJry31iDYQlrjNmWBgrqSuNQpaUlor0tm0Vc81uHGtu3in1MGQtNEacDWxumJstAZOSc8+HqtL7y4pkInW8rNxQ3k25KBFnkPkGEwOpQ1FPesIOMZEhkTUOUQEnhyOV0nhy5TILVHxxl1aW/YvJGaRmJIddkeYPBdFatylvPw1FzKTIuACECYgKSSTEnW+JMRn7oAOcyYqGAvv4Z01iPZ7gHmF8F2Oy0YVrRWNHXfZqwrqHrFY1q6OijTm/xMiKh/GSXGSARdSfGMKqUn8Ia3fRXUrhCyhkoaJd4TEhGVP9flctOk6ZXt4uipUE3Gc1jJ3THkiq4hlKoCAcAWEi876IQcH/v/s/WuwLUl2Fgh+yz1i733OuY/Mm1mVVaoqSaUqqZB46cFDglYPDEKAwUjdjdEwQGvAwNQ0NmbzA2PoZh49tBCNjdkgm1djw4i2/jHDGMYAgw0tEwz0GAIxIKAFEhIllSRKz3pm5eM+ztk7wn3Nj+XLY7mHxz773Lw3b96s+NKO5Tnx8PDw8HCPuz7/vlXPO7EK0LfAjNlD1TYr/qwIgJa9to4bp+Ty9R7U+cnOuTV32P+PARhlEQGd7TCebzDuSNZ9RBLSN9kyZyJeqxylnaNyNrtE9qbn4gKhuwJ2X4hwVwe5xm7bJHJyCgZLMKU0AXxdftdZeYbkahEsrfnHjKeZeGwtiKrJtyU1oh3PamLMlCMW+LqILeTrt3PgNsjIKsdvUWdjxVzn2dU5vnX/S9cDMOV1rgnB2f2Xbdwkf69xdbD3UaOloEV0JfF63TdGRYy3ys9l2YVgtg+Y5zwjfVO7zyyDl66xUK/jaunYOM+olmui1pDVQNXH6zat61wvWlDCVMnbuh3tIo16cVe9gKP+ptX/238ftMY8Q5gfrXsrb7CWX7/Dx8hm2HeP0VxUcgr0XEsE19+kj/M9tGLFihUrVqzAXXw5vgZ/EO/Dr3lbrkcgEDpQM2/WuxHfAuBXApIQacUXGZgZ3/+vvh+f+NQncBgP4C/iHMkrVqxY8STxfBO+Ofhsgika8LRBdD2ulRPMBg41KEKi3mOj5MsBZOak7EPeJvaTSyRGFVyyZG5MAVYNplu1bw4uNgLJFnpsQeKZOswCmdo2JghoYYO+rQBRK5DJLErdVtsmxQq12sL+vhCAJ9uO9lnZgLElfW3b1WXWBEh+FqYNjuTInMEG1exxqmCtiVWrmlyCKn+0fFtvJf3rMjWYX1s/12RPwERks6k3AMkRPbbvt7V4oNXGdZCxVtRS9XxOhSmzCFYvBfhbZK8lYCyxbZXQ2maR0zufjicq3kLNNeq072tAV3M8Oicklz6WQX4AiDK3S8rGRO6yl1eWk6KcWEjISIzuUVKjOhlnWIlJCOHInZCL4ws7dG/sJU9pVkhh6i8O8rdtsk0Puk7pqH3P5uzNu2gi7DmWit+FHL9Hr9NYZCE5lZHbUjYaQi8C7oBM1CqJGH1qw5R/V62Bu0S8a1sS5Nlk6+BUhjsAIGC4LaQje8Ad5ITYsyhUByGQM6nsWAjfHohdo49bstS+U9c9g1Y5tozchEfeK/ten7KQRaHqWFW861xXkxhpTKExiFJ5HMFnW4SzTnJUp74eOyHc3Yhsk52tmhmionaM2BHCJj13Tvx8APwlY/d6AF0dhLi1xEueE6jcxsmlI0RZ3KAuA8ew1G+X5oJjpG/+XtAqUTmO1XOwHZ9bY9yR59e0BK4W0MyIQfO9VBO5dj/beUUX99QKf1s3N1+YU6tAaytiqwYm75rncz0PJcXudWiqbe2cVRPgC2R0MyezVea2yMEhLarxNCM3bbvU97FEzs76z3UpDCyJOoyzBXit421bzMrRsizstwvQrlNV14Io7vtJUdzqr5qWwNatoZo3FT/+vXXMGt0udlwqu6WyTvl28+IJc/3mArTWwhDTz2jpsTa+wTgtKKLs/pLakvTb88QFEStWrFixYsWKArfwAXwtvvNtJ2A9enQ4x4i0Evldi28A8JsBbJ91RVYcwabboO/6J14uM+MHP/6D+LFf+LEnXvaKFStWfDHj+SZ8vZtsMy2YJwtau6Lf7m+cw47yh1xW8xKJAsyep4EZax9tVTV6zZooqwPkqtq05baIz2QdWyBZTmMMyApDDTKpilfrwDzZhXbdVF8lfq0ywdZZj21Y6AEQ9ReQA158OMyJXxv0Mu1QWDJm5dKRAKQl8J1VRKBQoDCHxWB0qvQUtK5IXfJO+L8YynbQYmrSK/J0rLUtVrQIZrXUBhLJmiy1635sz4uhuFfpO8kCNrop+FeQHMHUqW5M0x/zu2DuzRLHdZ8FpvqHMCdAbAA9hIkwAoxNtpuOq4OQvelzFdGr7xanoCpq20Vzb6VqpkS2vG1BF2EwA30ndsjMWYFPQfbrog+5Lk9jTohA57C/J2pGdxBi0I3IylB2wNVLsn3zBmP/IiGeA5v7yASlGzCRmMnKeTwXAqx7iDQuAcNtxnhGuP/mFue9w+4wgq4OQEjve3Ag58QS2af2YQf0Hajv2+pei9p6XN+V1Eem9k/j5jHl5LHgeybHJjU4GztZCiHb6Hf399g5gIYzhB3j6j1JRR2Bhx9MZG+XxkyS37ljoIugRx40EigIy8gO2LzhxF54EHJ9PGMMd4DYMcJ5BDqWH2J51X3E4eCBwYEO+k4I4UuBsP2CR/+IQY+uwJvekKWcx8rcns7JOHuTRRA63pjnkdu+HqOWiMvrFp4Qgbpexig7TngnfZwZNIyi/O18Tolg55P9l9zBo1d6jDtIbmSHnJsaDCAmLiLlXda8ytGJ1XnskXMlU5TzNg8YZ7/wALiarJ5YF3npAowQp0UBukBLxwXnEEM8wdJ5YYFDjRbJu/S3EjPG5jlbKV9HwltLZ1t3OyabOXfJ/rgucwm2fpbAlO3lecxcEraKhvWslqdj86TONfNbHlvq66Z20HvUahwhO1u5bWcwxBk7FNbZSuReW0ZDmVuoqp153+Ug+X5izvbSZIlLQ4y2yNeSFExjpFr01ySxjqPZ2nv5udcuGnW/JOs6MiO2y2suKou9n807zJwXH5HNF67fmEDu9wXp33qPa2carYNcaDquemdmx1Rt2Lxnu8/cS9EGOi5Z4lyV0drHk420nJcs0WOcvvrtNzraZL22C4cIoumdzIu6rhvzV6xYsWLFihXvKHw1fj++DL8Ffxd/HK/hE8+6Ok8R3wvg+wD8WQB3n3FdVrSw7bb4U9/+p/Chlz/0rKuyYsWKFStOxPNN+LZQ5CK1REUj2NFQKE25Oav96W8yQcimgsCeUxOdLdR5Hm+qflzCUgD5uqBPHey6Tk1Zn1eThFqGve7jBJ5aRFJTjXrDlZeWEKnvWX8/pvI9hoLsnRMImXReao9M4t+wvZhL4nbpHSjKfsxgYN02teJXbXrra1uVrVo/t6ycLY6RIrbf2fy9T8ISxrwT2Ro5cKn81YUbjhA7J+rERHC5UQir2KFQlwLI1sDkMalM01oOuaYc7wdGiDQpfY3iF54xXBCG2x36Ozv4MYjSsnUPgNRbF5zcRO1ZqH2vyQdYvy+nvPO6aKFepKNEClFWdLl9QP8QYE8YzhOREUV9GzuA+zi1o2dQH0FdRGQCBwINBPYyV4wDwfVCGoczRtgAcReFJN5EkGfAMTgQOBJ49MDoQIHgBkrPbVoY0t9ndI+q8dIuDLhOebaEemytidzrFFz6rtbK9gbIe1DfpTyuR8aR+lnp/Og9htsewzllspcdw4005e1tVZGq9yARvkjvjT8A9PBKFgDp2GIXNrXKdDQtzmKeFjGcgopQp0a3P4lUvO4yDXKtwFLe1UZ/aqoza/LQjrXWDnqhbtM5tLyvdX5DPctVXWvb4uOk+byPL7X7sRy4i2rLGqfaRC/hiI13Mw8tLbTvQv2uXShwTflLx90Ep/TdXGajb+bzb9DWi9er635kUUPzuKV7v2E/KEjpI+SsLdu2o3y7FCccv5fKXeWtjEUrVqxYsWLFincGznAPG9yCf9crX18FcADwwwC+DMCHn211VsxARHjlhVfw8u2Xn3VVVqxYsWLFiXi+CV+1K6sViaro0Z+kyGNLrmqQWPPdmtX4Nv8fjaLA5M4qN1OgKil0SdVNALjzk6JoNOrNOlhuV+y3SFY9dymwVQdGbdBXyRznTB2MKrO+fq3IBQrF1CzAnxQ9ZI+DCcLZehhlBFulkLmvOsdvM29v/iOCSLotp7/F8rWyNTZWmgURYoko71PgLRFgibBDtCSwIbnq3/UeTT2kjU0A3anKJ+206pqlgGC9XVXBVsU7jpVC1k+qX0BUg5wUp77Rh4p8eOl5ZivABppEvlEZKntg2zrnnzYEU+SJ4M1KXzcpk2rCWC+F1Kcr+8NCSXRdEP/aPKmi/CMzNhBcIlXTts4BYwSFAO49OMp2StfnTY+49QhnohZzIeXhdUC4TegeSZ5ZIJHBAegfMuJBc8WS8ILpmkxi6+iuAL+VLqa5aaMH/EHyo+5fQLKSPsfdfYB7eJXHAPY0uUDp49V301cKzhaKBRDyDhxV8j4GiAjUdeBND+67qZ4xH5BUtB0oMNzlgLufHHH/Ax3272HEnkGR4K/kXiMReMNC9m4DyDGcY2A3CmnbOdAmousDxnOPMRAwODneM1wv8lMCEAMhjg7ujR7uitA/oGTjL7l+wwY43GWEM3lWdz85YPPaPt1HSVyr+tRuuxHpngm+BgFxzIZYSU4O05h0DN6DznZis6p9RK+fflTdy50TFbyqCNOzvLznsX+BEDvOltzdfSRHCr2f9APZxp30a2LkNla7Z78H+ocBePV1oOtAOiebulFSH7POf2k7eyeK5HE8re+SK50etLrjgKxwJ5dVobPT1eI3uRrMctw2YBWQua2BUh1p51PmmTq4SfZaS2aFmwi2Y/lza6cErcdMyVudP7NLbhC/VvU7nVgtJmkdU113lkpAHT8q62ipU9pm1KJNVDbcS/dgrZy1vKx4bqhP2T4vQ+LPvnmsw4WmDmk858JW2lhET3Uux4NjFtG5vHGEOp7U+xGC3LP9ZlbYvxu2zfU9a/5dyqlMTDtOJ8+/k1uoFcUKfZeGYfrWtWUr9NtzHMu+Ux9rx8GcOsEq0X3ujwVpq3Mtx6TATWNCCGVZAHQRHMFP7dH69sllUz4HYXq+05hRvR8rVqxYsWLFihXvONwH8GcAfCuA/+wZ12XFihUrVqx4/vF8E742d62xbRRiCAWBypb0ssGchjook05K0t1AkaUB51yP2QENcs8EVPN9aaBLbZ/t/SnCAlmgpDeiEIDMkz1zbWNXB8ls29T2o6b8HDSsg5p1ILBBxrXy8hZkb0Vm10rNQi2igcMWuZsLMPeUrYTLgDWD54ExS0jaso/lJeWy7kdVd3qfNemT29YSxxWZrtth7j0YgkIJHkezey0Ia0dCbOm2Ojev7cKZZCUUZLO1uK7vT+V5Cm+IYUuSOyXRGmrqmwQrr1Win6hU1+sSC/HqnLQFp7+9vk8AwyfL4Yjw4gWGWx2YhIylEXCjkEJ+L8VlFwES1S8YcAOL7TMzAIIbGWAg9kiW0JzyAAshHLZybX+FTIrFjjBcAPtXztG/2aH7/AMJPE/JQ6f2BmRxymYDt90iHoZpvGu1xU1IyVZbXzOG5pyHUch0RGlzdqbueiwBCIzdZ/bSRl2HsBNyZvMmUruqLTQwnvUIO0bc6voDRtwxOBJG1gIB9CKZ5pEQ729AA8FdETZXBH8Q+22/Bzb31Vo8lb8ldJdi0e33wPazj0D7lLTZOVEmH+uXSqKdMs9c9xxmyurGdU/I5Ujey5zhnSyACnFaRGQ7UZD87LQfZNHGOAK3LxDvnmM8I8QeYI9kyUxwe1nkAKRm1x+eyDWywzNB1L2B4K8Ybh9lnNv0EwmkZAmRELt5Lpj+X8zLp0DdFxK5a/N+N62dW4Rm+rte3CTb5WapIguLeptjW/2nSQCnOaUgB6s5embTWxNEet6MIG4QTtepCuu5pjrnKBqLdVp5fev6ZRK+IsOtitQSs3OCzE1zb6M+S/l6T1HPWgK9aa28kI93qWxdUKD1n+0/QubPyEo9xto21/00srzMSp46N30DLoxxi6pqfXfN4q3mONkiz48tLtRx1C7mrMneBVBn/klkLZnra1hU72CRd9e2cWMBAPlE6to+qKkw9JsImAhdu/AC5n4aCxhuov5esWLFihUrVrwzQfD4evxP8Vn8MP4V/q/gd3UuXwbw4wC+B8C3AfjIs61OgX8D4PsB/PSzrsiKFStWrFhxEp5vwpdMAFGJ0waZmEldS2C2VuxbVPspivK3sHyu66JBJsUxCzZLWtYEpM0NnIO+Znt9X636AznXIjOLAkuP17q2zlm6j1m+NqPKtHZ4NhC4RPaaOucga4vssNtaaiFAAvBEYFWQLpFUS0H6nJ85FjxGea8LComaqK37VF2f2flRyGRL+toyZ/k4qX1/DhO5qipdu1gh26w6OUbtPLMCOci9X0dk1KTGko1nfY8Wlpyv4cx9LxEomALzBfFvFDJHg9zASQo/nhE3mIKyToglN8ZMAAMAYkS4tcF4noLko5C1qlT0h1QWQcg94mzzDCDnNnVg0CjEV9iabhBkHxK5CwjBiCjEMHdA2BH2dz2YNug+n9pGSYF63EgKTdpsQON4Cg9oG3H63eb0rRde1O/I0TJ5qq8qoDxl0jQ1HeAkl3L3+iOcMYPdGfZ3HWIPbF+fxni18R0uHIZzYLgl9sKxIwx3WEjiSIBXYp+BkUCDQ/+Gg78kbO4D3SNGd8XYPIjwV4z+zQO4d2LdvXXotg7dnrB9PaC/P8K9/kDIx00v9XaYFiA9qSD8sUUnrXa9UdkkCt86p7udQ2zZYwCGMRH2DD7fYnhhh7CTfgk3vQtuAFx6LrEnWUtzrHo6nUfp626UOcO16pHqzr6c37LjhiVvjqEex8mBnKjaM9lrSUw7nhR5a90yIXisH1i13+PsV+gc3CCBWzlWl9TK0znX9N1j80GxMK8cOwCUc11dzk0I4uobweZLVtR5anXbUlkzQth+d7bcM67DCfdjFeGLJLwpp6USzse4hX3V9Vq/pw25L7dSJCwSi1UfJdtvdbFh3Q9b/bpelGivVyhjy++j7EJTnyM7599TrcWOzk3q4Op+531m+v6YtUmM0+Ile0widWf7IpIC+oQFg6YuWdFbH7dixYoVK1aseC7h4PFR/C7cwvvxr/C9z7o6bwN+Pv38Wijhu+kGnG0GPLzaYownOFVdg11/wLYfZtuZCfevduDS4gfAJYCfAvC33vK1n0dsug0uthfrYsIVK1aseM7wfBO+IZbBQ1WvjobssgGQwIm4NQSlJSNTYFisnymRBrFBJCclmp7Iyd6SJgvoIgCtJLHdPlNqGtLTBmjsORq4nOVJTT9jg/T0frJertEK7AFTYNz+besDlIoCGyBvBe9MoJ1rojkEsPdZNUPAFHROhPCM4PUaWJvULYUqpVKxzqwJHUGSRUbwkCxOVd1qLa85yHG10jfVI/m9QpVg4GTDqIdR9UzrQJySnzaPrg1Od12DfDAEjCVylfTVelv1sIUjwJnXPhrrSD0nk1RVcFnfNW0HtRKEOdYSIVbRYo/jaK5lAv6W5PVe+sYwlv3IufJj0/Y3Jaoqu+pcZq5H6rtO7Lxz34xJsZXUuuy9KBjTu6AqXyFoVY3KoCEAIYL7Dvc/uMX+BSdqXu1KTn7vHk3qn+FCiCnK44Fwjm4A6EoXl6Rb6IDxnKD2t+OF3Et3NZHE3SUQN8B4Djx6r8NwQeiu7qJ7cw93/woTcybPV/P4snfA2Q50OIg68xiWFO4cwQGgrhdizLa/8ycRk2Rtg4lEWepJnoESpkhEufeiGh0C3IMDbv30ARebDrH3GO70CDuH8UzaywXg1i8epgsxwB3hcMdjf9vhcEf6OlNq/z3g9/Kc2DPGc8Jwi3C4S7j/ofTOcy8WxQzc/nnG2asjbv/EGzL+RukH00KhKHXXPtb5PKaLyjsR76egICgsQTa3Hi6UvjWxcYz8IYLbbkGbHug66R9adojyPqR5hr0ha4ZB+g8zxhfP8OADG4w7SB5klvzI/gpp/gXCJuX2JUhOX30NCFk5zS5tTvmtuyuGG8QOFT7ZSTfSJejiLL0fzXedlYLX9ccZOZRUoTou1WNKK4+5qiDTOCbVM98aDbVfAUOGFWROwzK3gCV2Kxvn4vp2X1LCkneiGG2Ume9L/9bxu95Xt422Vz0X2GdQz626+GqW794VbZHJxxCmObqB1j2po0edP5ghJKH0MUOUWvLeWCdbhW0Lqhhm0wem75eSUC7qx0ZtbNW1gNTbe6CjiZCsyrFWwK3rMLMs0jiSF9jaUmtdSOdltXaur2fJ8esWJug+a2Fe25e3yji2iMiMdZQso687LqNeEKLP209jNmKcHOjr+28sOrPf0pO6W46TZyDtWFg2hwB2rhwjkrp39iwbduqyoVpI4T2e93/urVixYsWKFSu+OPEffOM/w//m9/51/JH/83fiBz/+sbdc3p/4tu/Dd/ymH5htf/3hBb79z/8JfPr1F8zWNwH8pwA+9Zav+7zi23/Nt+NbfuW34N6te8+6KitWrFix4gZ4/iMArcCNbgdSkAbTSnjNXVedk1W7p65cqo7TQHZrf1MRfF39jx2jAa/a5leDSZb8bCkbjuGUupxyfB2QXnxOrjy+Pq5uO5vHdinfbK7bFIifAnCGmNRgWB20nrX1kWvU7WHrZwOTrrGtJlarfJ8FYVzc15G/LbHcKveU/nbd/utywtVB5OueUw1VIOvpGkQ+RdV2rC6aW+86pRowtYF9ngbEEAWpXRzReYznhLCbjnEjwH4iFG2+UiVwi+1pHzEDLItFwICGmdlRVgXrj82JyiSqyrABxp2Hf+jKBQeqgCTKqlOy1snXtYcueHmSqMnJ3H8BckrBoFxIAYCdB40RNATQeAB1DuNFB7XKjlsn9sDUCf82clb9yt9C7k6Ka8mv7AdDPBoCMm5QjPEURYEdewIOZpWwc/N+o+96MO2YWU4+TbHZwuMoqa9D38/rbonD6v0hJSLIyTM46zCcIxO6YmuOZEk+tXW2dF6C7tP3JMCM342xEkfm2tbioZuC3M3PtwudlhR5S2iRukYRWSsJWzbFs9zBCyrcpdyu+ZzW38cUvU9CVViofOcq3WvPfcw6tJWycb6/usbRNrwGeY47thCgaI/TVN5LhP9UjtlmlOnXpkbQOiygthvP5S6dp9+uuS4Lalv9u2XRfOy5LY2PltSVis/Lqq2d8+VO6F/V+zq7j7S9sGduqpzbpH2tNm4Tv9csLlmxYsWKFStWNEFweD9+Pd6Hb3jWVcEWd/Hl+Ba8io/jTfzss67O24CPQ/8xeOfsx/Hh934Ov+lX/DheuHiYj2Am/JOf/Ep84cGtxVJ+2Qd+ER9532eKbd/wkZ/Bh1/5/OzY+5cP8Nu+9kfwr3/uDP/iZ3TB+AMAv5D+/8WJ22e38d67730qZX/m9c/gk5//JO5f3X8q5a9YsWLFFzOeb8K3Syv4W6pYDboPYwpYUz6WhqRkU0ItnaNqoaxgUgWRDRbpcQk2XyCpbaeFJWMtTgkMuqnO+R71d82nqJaN4PJaM3VznIJqdb5eDeiHMClzl4JvdaDdBsJUCREjOCuRGNT5SWnMXATKsvqWeQq61QEybYtUHlyqU213p+rRIrgu6sO2tbAo9ohIlDpjQ/GiBFdA2Q8Kkkrb0091tUph3ReDbO835f1QVTetv9pF2jZv5fWtbXStOoojQB1mNs8VAZFJVt3WtC0390kROISCmM31qo/XekSeK7FdpY6zxzsCuW4x2AmIyoZDpaq3VTZ9KvenRPafYu0M58CdCS5HAC5da4xJERyBziPuOhzuSB5dioA7SI7dcSe2jW7gaRhJqt+ZurETQswfZHvYynH+IHbNsRMy06n98yDjzrijnIqWOyBuCOO5w+YNV5J1qvB1DoSkDN30x8cjGwTPY0v1bHGErDjFftjLGGHHZMokXSJLszoZgCPETmy1XWDQ1R40EIALRE8Yd6LKDZtEDEfkHLsUJqI3k+2OET2J8tQruS5kPbGQllIngAZpfwrAeEYYzhygql4i6S8KJZiXyAE7d6lLwDG0FpO0tuliF9v2LTJjVr4DbXrJZWmJ1BCF6FUiR8cQMzeRd+A7t3C443G4S4gbBhjoHom6N5Prs2vKT64WoyCEMzk/MNyQ0gjo+69qXk55eomm+bleCDOO16vYC6I7LRbSRSLapnacNccBmJFys4VGmIhZ+3cBo+oknTePEXxmvtbxkEOUudW5fH5N/tVkUT4n/T59O+i8sUxElfWhaS62yE4Z6XqRQS7OyFw9thjva9Laqqqte4Tm2a2JbrM/z/fm3hfvS+2Qo7GGtuXMxKc8e75an/q43A7OEKSHg9x738kzM2NqYUGdvueWRm2bK1jvI9edZVFgoejmCMDPFhCUbRLLfbbf5YVt1TelVezaMmxfLtTPZR2sOnp2r62FMrrgsf7WtSRxficn5TQBqU1STl2rzPVOxiz9PrbXsguhGu9nPtduI5qeqzPvm9k/v9XJAlquzdO9OsrzTLaDtt9VOnYd9c5fsWLFihUrVtTw2OLfxXfjRXxluTjrGeAFfAS/Hd+Lf4I/hx/GX3ymdXl78H8zv98C0T38r3/P3yyOCNHht/6Z/+yo6vcP/g9+EH/y2//2SVe8tbvCX/pPvhd/858+wu/7C3NCeMWTxz/76X+Gv/z//cvPuhorVqxY8a7E8034WpJnlksvSsTY2sWlH7VfBiSQLb+Y4KJ3oMjTPkwBRw0qyzYTcK9JkRpWrXks+A8Imau/B2O5a4NLkQHEiQBU2KAT8zzvr1UrFOSbUSracmqSwATLpssYUiOVUwQnYywIjyLQbANwLSveHDSeyFTW/G8tNSsghKSz52IK1NdBa45gToG0rptI0enmJiLX2qiyCfbZ7bYu1iK5rodepiYEvA3ScXluvr+qTBvIU9JsHOVaXdcO1Gs5+bp+oS1NH1cLdSVNfM32Yvl8JOasuIdGvaz1Ms/7WI0cOK2Vyw0VzXSSIXtb5S6ohwjIuWSL/Y5weO8FLt+zQdik3SHdrtPfGcSQXLuORPXrgJFSrlkWYiv2hPEMU+5fCOkYdnI9l9SSiEI6Rk/yapASvbIPEQhbIb8o2U2LxWwa92ywWq06l9TfdltN9rZgFxsUNtBHyEytTz0+BgZBxnImpHvVsXtS7GrAPW4dxh1huCBpwxFZmRt7aSchD2V6YEMouoEnK2E/WQHHTtqWRmRyUjFcAN0lIdw9g7scQGOZq1HqzuBIU5vruOhdUnKfGIivn0ONWZ+N832nXKvrEgHvirrm83UxVRTCVZ5dBPot9h98Afs7JP3ctK2SuNFPfV/Jdl2oULetblOltd9H6Q/dZJlt0yVke2fbj5UITsROXhzymMjkk45fC7lmbZ5YqWdVUKWObZFihYWzbjepErLFcEWqWTviOoew2iDPybyJMJphKV/xEizZW48V9fnFwqSSwC3qYknn2g66UW7zPip1NVARo7YOljjmqW2W8um28gHXz3OWf3eWazUaUrxaLFDn4XVl2S3k5+2MnbCTQbR+/tTZNA/tMpv3lQnL9F40CN1C7WuvUeWtbVxQzk/pPprvgsLYbOc7O2bnnPZTjDInpm8ZtbG2ltUc0rXr93GJVLa/R7OwQolt+w6bfmMXFNQW0fNFIQSCn/eh3D48LYjM3zqr0nfFihUrVqw4FR/B78KH8a24wPueOdkL4B1Rh2eN+RrZiP/03/9/4zNv/IPFc77+Kz55ks7Glv8NH9nge//4Pfyl/88D/NAnDsdPWrFixYoVK96heP4JXxs4s8Fz/b/mTAyyj2JJ+LJuK6yCNdhvg/FVwJyobR9ZX1+Dz5Ry+YbGOcfQyqmnKOqHNglg62Lqc22OtaWyWsHATHDG4lpZAaO58TSglepApr21TicHlFvgKWAqKor6nqrAda1Ayrl9F4LFRZ5Bnv+uTWbJ4ILsJcA2t73fXBdDNmp/rsjF2f3A3EdNyNW53LTcvPjABJntNnsu0aSaUbW0JTuWnocrn2+hfLbnZ7WLIXsVMzvRhkKozhW9FEg2yrJZm9Ro9X9tN/1xyGzV4U6HRy+7rAi1yl0h9VIRifCKug7FAzRStmcOW8nD64yKVG2FKcgxmreXCeANcr+LHoi97BCisuxvqu6tSVX2blI3HVNA2r5V9ydM9ZiOd2jml70OVqnHLO+xIXrhUg5iDYpr3bxD7EWlG3ZA/xBwQZjGuEFWRwMTiTgRhvLMYifPRG24pX2kbcXBYdpHBMStqHzDWQcahZAsrKczm9lYYHDTdmlhST39mNchJxbfRQ52LcMuriKaxjnNW9932N/rMJ5Jfl5VUOviB9a2a005NVdNAIhzOwNIavYoRLR9DzkRMjqvm/GzmKNtnvDjjXBaY5kcsDU5Nx0jC6yU2FlS8y5hpgQ+xcr3iO1zE3E+Rh7LS5v313No1W4cGeSr42VHOpxKknWpXkrUqiL4WH2O2UzX5S6gpdAtyGJTfstSezpn4dlWjhUnWQM/jhX3AjKBmutpCNlakWuus1xg4/qtedr+bQjcY2RvcV7dlo0810Wd6gWFrXq3iGhdTOjNtutgvtOEaJfz2Ln581l6h/NCh3G6Zn2s7Qc36Odq9b5ixYoVK1asOA3vwa/CV+E/eNbV+KKGI+DFWw63du1vHkfAb/u6H3ni1/2y93T4jt90C//kJw/46U+N+MLD+FbWCz+38M7jYnuBTbd51lVZsWLFihWPgeeb8I0MOJ5UrN4hW50toM4/CO/BatFaB4hbsGScDeQoaaXEmCWelOBUe2lAiFxr2VwT1xUZWlzbqq3GOP1uVXqJAJkraoS8KxR+BaEXJoWjVdwqSezMtRU5IDsF1EntsYnAiFm1QJbcBWZ/p4IMIVipSI21YmFvCEwEE7yQCpZQXCIRaxURJRVkK2+htYv2riS0rOpXn2XXTQHx2la1artswzxTD1d1bKn4MvHqUr9io2yvyGB9xnmbUSVnC2lDjGub1PaZ9T3UgUgNvkslyuOttaclYTIpEJpqMtJ+CpT2wTa4HOO1tq3kPcCxKXgp7Bz1J0wWsujJrAER8hbOY3/X4+q9AKKQtd0l4A4MCkA4k3YJDqJKjcBwMSkd/QHJHlgJMYYbCGBg3Anx6w5pfwewZ8QNEDaMbIfrGBQJiAB3Ed0DJxa6IY0FkUEUpTvERELrGAEAmx602VxvedsieKixr2xUnKQu0naPEYADOpfzDXNSJ8feI+c/Ts8AnsC7HrzpEDZObJZvMdxI8FeE7RuMw+2UW5mlzcOWsnLXXxKIgUFF6OkY9pIL2ZKRFNP+Dhi3QNgxxjPC4U4Hd0j20oGFXPco+08iGHLKAIek8l1Qyh9DJjMaCzm0XXLbn/YvVOo60GYj41bnZWGU7huDzJ2WCI4RGEbwfg90HeLtMzx4v8dwWxYeuAFwA01KagLCmbSfG2RxAzugu5JtSqoTALiSK6cI+EcjaAiFGwEp2ax1TIsXmnO5KnzfIrK6FxVZZca9yRq5fT21W5bzJttlhZ0fZ8rRRk5TqyIs8vcyT/bMtQo2zZvk3emLreq8tWp3LX/Mj9dtsb0wgdN4LxbGXBLAVYoC8sWJqdz5d8giGsdq20gbtM8/hVC1iu6J/J8/TwDTwrcamnLEKrWBrNae3Ysrr9dUHy+Q07nO3rzL1b7inMb1gKkvtshrXaBQEMjaZ43tMi05heR7XSCPDbKK2I575v+SJxclcWzdbuzY6Zx85+Zv9TBfEKULS2zdXWNMCEHmgnoBTUIeH5inr6RE8rZtwKMoe4FigRyRed71e+wIBAI1V9qsWLFixYoVK1a8M/El9zz+2//Fe/H+Fx/j38pPAN/9+1/Af/ytt/A7vuuz+Pz9ExYAvsvwkVc+gj/5bX8St7bLOZJXrFixYsU7F8834Qu0V/DbbdayuaFuy9DAkKuUuzfxALFltwjbU8uw5JutH1FJCgNT0KpWkpISajwvx6I+V4NS1wXGzX0t5trLh9LsfpoqGqBQ0i4d01JtFvWaVWCBpAyY2kkKnsidBavOedlVsJsMG3Vd3tKl+p4CZhTKXmCuuFViopVLcbFMg8iGnD2FsOPjQfdWe5DD5G9dlWUPO9ZOVYD9WL7Eo1Dy2b7HOi5oQLuuBxHirkPogegZDoScfxTIykYAcFFsnRnI/Ywipty93WQpLNbPQjpGJ2TYeIsRexZr4o7BnkGjEMNIZC8FIZIpAP3DCHeo2lbJ3uoeyDnJ5Xt5g/HqJjg2DtYLHOw4NysHE9lriafeI247jDtC3Er7xeRiLbbCQqLn9u2QVb76vLgDkFTUWemr54eyCtEL4R69HBu2DmHnxT54H5BzDsO0t/0/8zRY1mPIqagXHS0tRjoR1HVi7aoK3po8Ueh7Zt+VO7cw3tkhbJFV1BRoUqXruhdKXd+Q6kr0umCeSSb0p3uhwO353N5DZFnABeTFXZTcPZj5tDY+ojqlel44Mk9cl8d1ZgG7gCVSr3XO8rE3fKdbxzeUwHRkvD+2Lx2APPbXSuwax5TAQHu8qBcSLZRxbG5p5TpeOv6YgnLxe6eo71yVfZ2C9xTV5lIu3pogPjrHNuywy/3L343XK8zr75gGMaqE7XVo/VtA62CvU4+bNenbqE+5KNEcW59nlMfFtla5re93JXsNebuUf1s2XPMduGLFihUrVqw4GTu8iA/gN+JFfPRZV+WLHt4B73vB44WLZ7No7cVbDkQd/r1ff44f+dnDF529c+c73Lu4B3edu9SKFStWrHhH4vkmfJ0SA1QqClXZahWr3mV+jEIsLZyZc27eWgGcj2sphtK5RW69IIpP7nxlCY0yQFTnYbVBmhin/Y5EpWeDw6EKXFmVAbNYWwJitZnLT+caBV8OomVL3UnZyzHO8rrNQmEztaorcgYW5Le2DSD1rQODMytME9Cv1aO2HEACXvp7dPPgr21ba8NZ5Brl/OwAXypaHEryvM4/m7c3cqrNFgAcIWA5HidWrZI4MrJ1bOSyvbQszfFm1VVEExllidCl4Lz2gXE0ZRhVcO7HPG2zqG2b63OBie81wc1JEUTtwKVV59QKIO3Hqc9RjDl3pd4DLwVDOSmS6oUhSWmKzijcmcHeY7zoc37Y2AnDGzeAGwFOJJYLomqES+Sulybz+4mcjMkGlwkYL4QZ9gdRmYYdI14E0Cag2wREJnAkxPs96ODQXSbCN0oZfk/YvrqHf3gwBGOZ01OeR+oPm/4o6ZTv2Z43s/6ulHl63Cmw1szGch8RgJPnwQxYm2xR48qGuOsx3OpwuEMYLoC4Y8SOcju7A9A/APZ3Ae4TjxiRLbNB8hwc5PjYp+fkAP8I8FeiSIWT1ylsGHHLQlhugcMtgt97gIFeCUZC2Y90DElOCESTuuvGaC0wsmPL45TZ98B2O78GJvK0yKVp3r3hfXfx6H2b3Eaq4tWc0xS4SOEtZUo7U3o3tI11wQIxYCcdN4TiXdf81LkuNbHuzFij9b5BuzQJy9TGOcdnbQ/v/VwFadWNxn7W5kKtSZyZIlKVuwvWu/l372WsTovGivkLmM+x6dzmGJtynVPtFmHnPm2DYg5ukLe1cre2fw4ht7eOzbn9s+tFLMeapTzB9bWTIjJbQpOb5p9jOVC1GC1ec7CatBGKIhewOa/1TOvnX5xbE6uRzboQQ9BWt7xEqi7mHLZuMBXR3CqLvBc1qjp+uIXjqKFIt320VtdWx2kO3Vn/t1iapwqbavkGyHl4033yMJYK60Su8qEK4Knzjl34osRsPc406qDv4nWOAuqEMxsT8jdmyHWHc3M1tHXOSX/bc4ttK1asWLFixYpr8QK+Ar8V/ye45zxMuuLJ4IULh//qO+/h//4DD/FDn3j1WVdnxYoVK1asOBnP/5eMBmAsMVTnvWUuyU8WW1VW4qtWBFa5R6kmWFMgiH2y4NO/HYndGnO27czn1GqAEFNg3KgDQpz+jpbdoIl4i1WwSYNXVvkUzXm1qqxoOiWVXdkGtcWktaZuKTnqwB9zCgRHIY7T8Tmolc4lIrGBrmEtovN1/HQOmTqQKwPNHCcCsZWzN7q5CpkcgDhv4xBKM2L7nPQiNtBG6dpqodlSyXGV05RZrm3z5c4Udal/M8v5OXeir44x7TewMCYa/Aekr+TAsjm2vpaFVV+2Avo1aoLWKqss8V7X35xPKIntIhiaSWLTx+sgqPb1EAqCRY5vEO4tRBPs1fcUEAv11F3ksTHcGOEPQrKGXQrQM8CeEHsGd0DwAJiyqpFGJGthZCWp5P1N+XeTenQ8A7hnxF2UMi878Ke36C8J/lJIMooTOckOiA8JmzcB/3Av9993QK99O877JCDvfNel9jlB3W/bM7f7goK7VvA2kJ9RQTK6YnECBcAdJlt8GqO08VmP4XaP4ZYT8ryXNhsv5Bn6fbqIEuJp7Gdd29FrXRMBqcreAHSP5PloXuWsBE5tzT2L7TRD8gdvHfr7SPXlvMioGH+9Bzym+WO8pr3bDWba+EgwvzWeLB3qXbYa5jzeGPI0j39B5sRhlH5zfo5H79vg6p7ksHYHwF9Jm9AI+CuWhQxualc3QLZ5RveIEjEsDC+FtAgiyEISVf/SIPbNxUIke59ab9smujDDWD8fbStDLrLN2a6HpByyMzLYjleuJPFqwlCh5FYLdcoDAPkZcLVoq/hd9y2RuWkuudb1IDlgNElvS7TmsRxl6oQj9s5q41yXVeRWN+OKJYNn19e/6zm//t1uq1TZ9fdAnad3qbym+teQic28qU3iXRbKzb5LGorxGUmc7IaLui8QfEWfbLhqtAjpmY24n77DChVrIx9vthQ/QowCmEhMY00OIC3UTNeTAst9Ws4R1QGHUJDahZW6ksCt8q4bU4uLlPOobJquuajiN3OxbSvSVCAhZMKY6mcMyHfS4o3H/C3G6d87p0mkV6xYsWLFii9uvIafwd/FH8fH8LvxYfy2Z12dL1r8iW+7jX/3a3a4WMjfu+LpwTuP/+ib/yN85JWPLC4qXbFixYoV73w834SvEjI24KJBajKB30IFZRQXMQXrbZGRZ4Rv87oLEEtoCMFcB59rZCKuQcDUAX1LpM2Udo3z6rY5dh8tQroO5i3Y7MnpRz4EFgKqM7vJo1bAVRAzE7hCJFxrl2iD0vp3jULtW6mUczsZstDWh4SYmNq6QWa2Ar2WyG2h1f9aBIHNk2iV4YngblpZzuqP+UIJYGp7W6c6J2+r/npNVSPX3G5MhHSNRlD9ZFwTgG5eqyY3lcQAjry3RQVBQ4QbEolLADwj9imQ25HkgQUSwYWsKIUzeXghZKQqT7PqdMOAT+/ZwcHtCbtXCd0DYHOf4YIoScfzlJM2kY+bN1kIMgDoO9kel2O+7N2Un/sYnvZHvy5YaVUlkb6c2g5RFmnE3iPsCGFDiF5IRPZCtMcNI2xpUplGklfcIefjjRv5fyZ0/fQc/F7I3tglkpInslgIzGl8Y0dgT5NtsfYTXeCT7iG7RrTsPJ8lvJ/ywAPtOQgQck3Jpk0P3m1xuO0wXMiNU0jK9S6Ru6P8nu3QGcktQ/4WJbCQEuTEFj12cly2d45C8KsTR66fJTxr1wwLNsrkm2BGXKaBrF5MZFGnZKhyx5Z5Xq+Z+1pYyN9qyb6jc+KpVq+FYtyStYkINm0zbW+3ceGocFPr8oXyqDf90ZZNjTlPUzi0UFs/6++oSNDChcUQ57otf580FsXpMddZUx+D7VfWMeUIWspxBs/u85RybBkZtXVxdQwRTXmSrxvn6vy6U2Hyni9cKx8jFa0rPlf+1vvrOpwCW5fWfbXqab8lb3ItYHGcqXM1c4gyrxWOODf4hlqxYsWKFSu+yLHHa/gZfB/ei6/Fh591ZQwCDrjEqzjg4bOuytuCb/rYFr/j68+edTW+KOHI4Vd/+a/Gl7/ny591VVasWLFixVvA8034qtLS2k0qLElakcCcbNTEhjltA4RQiFwqAEiC+KTq2zEAnReCRJVZRKJOiAD3nZAJLbLX/m7VlnWd7XGqTLJBnMDTsVpGi/RuwXu5NpEotIDJ9hoAj2O2o8tl6TFVYGsWwFPLQ+ZJxdv5koQGwFZ1WQWxmhaERkXLPFkKwnXTcYXiuA7qWbLXPLOjaqQG6afnZvWum/pYZ4LjqpS0cDydk+0/7THaztEQsSolNYR3rWat71fJsuI48yxb9pstRae9N1u2bf+CyIoTWZrU3LRJCWhdItGNdbPYJttArPbtyq4bpk94nwlksSo1ypmlwK72cRto9x6EUCjlMqwlrlqrRwCdE8LKk3kf5Tj/YI/Ngx36Bx77lxlxxzi8zElRSjmnKIXEBFrO3P4eKLGMQlqCGIgE/9Bh87rHxS8yNg8ZzihCxx2JdTEpuca4+zMHdPcPonjsPbg3CqqrdF95wQTlfsVbGbdO5mNUcd4KeOfFDyeoV5nBwyiK/hizJT0F8cNmD7kH59JYLHXn3iNuPMZzj3HrMG6pzBfrJ1vn4KSx/RXgPDDcAfwDYPsG48GHADDh7JcYw23CcC72z24E3MDALllDQx6JGyD5lnfCPkuO4HQfHohnHWiIIFWDj1Hmiij/577Lc0Zup8chI+u2RkNJfeqCCeflp/PTgidmeedces8r4oCHAfF9L+Hygxe4fC8hbFP3vQL6B5yJdHap3QKDUnv5g/ywI/hBiHwpNP2vQ1LHp0VZBNDlHjgMMkd1HmRXBdRzk1X0pt+vXTxi+3NtU54LnhTA2b45HzJZPPM4zsdQQ65NY9o1i5XSOGRzkFoVaVZaEontOaY5OB9jVaehGnMjTwraeh5J95tVho5mit/aGp9bpObSgMIMOJ/GHJ6OPUKIFha5xbdT4xy7EArmm8yQs+Td1CZHyPJim5KXlvTzRs1q6jgnjKd5N1s1t45tLQRIBLOQqMnpgyZFKVGyMNapM0ZwiKXiHAD1HVqW4C3yukXSzlS/QNEH9dq5far2Kh07KpJXj1FbZ7vorbZk1/OlUlP9aktoS6y2Fi/G2P6uqs8zqU+mBRZRrPDr+s2slytFsyFoZ/WybjiVq8pMVZ77X6ksRzBK4RiTw8djLjRYsWLFihUrVjxzvIp/g+/DH8Ie9591VVasWLFixYoVzwGeb8JXsaRYsaRGSy2pxA1Xts3HVLGJZKWWGhKYiGG93uMG4ItCaf53Cuo0lcz2nNY2axdtYQN4x/IdXnNP1yk56uDpjdDKAbsU+G1ZP9rj8vmu3GcDrsdIYYv6/Jo4uA7Wdhq+fOZNe0kq6wm0g8T1/qZCubpH28ZLqFWY1X0WfaC2UVYV/LH7M8Rufd1riRsbPNV2bZIZjTGhheI+laiBMFnpPdy8MeJ8Q3j0/qRO9EJugQEaXM4Xa61t4VjIYIIcq4rnAPgrBxoJXbJu7h/IucM5IWzVGpowniX1pAP8APhLiJJ1SIo8oqSIlb7IvQcNkMUL+d7tQpSUX/vYu3/MVQDASbbQs3LT8w4RrDl8q7GLSe6HjNW9qmpjyous9tgAgEgglhzImkvWDelSHQMgkLHR7h8xxvOJ3AWA2Ke/SUhIUacm8p5JnqGXZwDIvuidkJum7s02BMo8748zNzwJOA/qO1mcUztguGmOzNvT3Ee7HcKdDfZ3Xc4/7a+A7pLR7RmHjZTlBiDsgLDROQnpWaY/HfJ0RGmI0n1I7xCAiXSxi7iA3A+eKI7lhz3FFt7kOeVqrm2qLi1hZfvBKQsBLLlmq3CKctyRjD1H0LR1buGIjfNM3VgcwuW5ifRdzLN+7HrHMFsYdf19HXcOaVy/SdS6vPCIvCvVwlU5N/ouaqo+G4TmETTvr1X/Ks/vQmHzb0jM++G1jix1mXJSub2+z/w9FOf1q7+Fr2ujehFO/pZYUBg/zmIdVcRrW1zzzJo227robem9V3cVlxbi0WPUc8WKFStWrPgixefwI/gJ/HV8Ob4FW9x96td79fyz+OytX1zc/+bwcVy+9ioY7+75/Cte6fDvfPUWX/ryuyNM/bzhK977FfjI+z6CW7tbz7oqK1asWLHiLeL5nkkdTeqjJRJSA42dl6CbISwK0latNYnydrFnrghTS+Rqri8bzAxGQapQ1WZNvlKS9xUB3kTG6op93yCqcrmhrSTQHIc2cGWPq2xvbSCL6uCYxUKQLqsUrG2fLedImeSENNMg1iygqMF1ozjhMT1HlbI4yiqektxM1y5Iv7lKisHTdZREnVd0IrFqy84aVoXUUvvW7aL1cpDcuz5ti1VfyosXVAkypuB4et71ZTSQHiv1dt8h21Kq0hyY2tC79E6ZftOy5LQ5LpdIZxuUjjyV580+S644CVKy5gct3qMwqVrys51UQYsB2fo6CeT9TOXL9fvuHLh6xzK51DlR0nDA9jMPsHnV4c0Pvyi5eYlAI8GNBHcQgtAdhJCEA8YzllyzvlosEQhuIGxeI/QPgPPPRbG7DcCDD3gcbgP7lyLilsE9A9sgQ1Ag+Nc7bF5zQiDndxvJ0UDaIQJwMYKGkjATi2RViM3bpWyA42QwOQKzGRdPDe7HkN6d3oyPwNK/a9kRuHOIvaicYzeR3+BEsEcgbuV4vwf8Plk9J4LSBSEZKQCbNyOuXnCIvdSbveRYjr2UGXo5Xu27aSDwRUTsGTGRmRTEzpuiA12ZNnQERNOXK8L8RtblTxjkPdzZTuyZO1/OeTov1iQkEfj2OfYv9Li65xA3DBoJmzcYmwcMv2fsX3CgwOiuGMNth+EWjPoaULV77AjkeCLTjd1z5igYwDCWakziiexNOePlJNlG1gkDae64aeMsWTqnOjC4LN+hUIqKK0E1pzTmj1NSHNQpFIo+Y+cczaXbN+b8emERgMVFUhzFOjm7fcTS0tnW39G0xqMor1oYMiPfrDMHmXk4VsR6OQYvktD1oq4a1SKxog11rlyy49ZilbSFeW4Ni+UlYjQ/P+PmUatrsxUyx5yz+hg5W/SJQuFq1LVavzqvfatuaUxq9rVGTlpu2EsXbVOdS/U3qP095TQ2BTXbd5Zv9ybE6xLpa0lrLbvKXyyHNd69Y0pi841Sq+8pzp/tzOnGlqe/p4VzrISunmftnYnkWzdysy+vWLFixYoVK9r4afxt/Cz+Pt6D/xYb3AEtJka6OerFoADw8y/+FP7xh//u8klvfgZ47d0/l3/Tx7b43j/+0rOuxhctvvGrvhG/5xt/z7OuxooVK1aseAJ4vglfoAxi1PZuSsxaksgofovcsm4KdCuhkwPfdbDLEiWV0uhojjCiyQLX23MbRIAGiVsKXc3LZa+ltszGpnqyfnbl/hqWOK4DS1qXOlDbUKBmCz4ArEoLIrFqhQlikflkVrLDPMfStplA1OVjmMOchNQA9xKsXSQg6qFFYpeWyVyXLIVdagcOwJiC87Y9LEGox2VFbCyfMYBCDdmnVzIGU28lfl269hH7aoW2idmvgeOSvK1Iv2KbCaYqkVGTA4VSmqdtWmbx7hjy3RDRei7zKMFJRwC7KXhZ2xl6PwWYFwLGs326KMAQCbMgNbO8imzGCk725MlOGMwg0KRAdADDAwigMeI9P3zA/oUO9z/kwR3ABPQPhSD0g213pDHIC4EYEgnGQioCkpt3f5cQe4ewAcaLlPOXkzIVAPY9KADdQbaxB67u9WAi9K9dTWSvfRbOyQKYYBZnpEUztOmFEDhG+C5B3/3HObcaQ9n2OyX1NJCd7oc7l3Omu5SfN+yAuOWksAbcQJIjNgjJu79HAAHb14DukRC53SO51NU9j7iRc/yeUzBd8v8yCfGL9H/iRPgG6QvjmZDOotaGWJvyRBwr6cK9mXKJJDVA6teP9U94+1wfkzQm74DtthjDlhSzFBk4DMBui/2X3MHVCx7jGUBR2tnvpU3HHUHsnAmHW5IHOeyA/v7U1ykA7gCxzYYQv0quuwHwB0IInHNbZ5KDSBalOJf6RTUGxjjN3TFK37Zk8ckNo98TMmYskow6PrWeYCaDjFWwo6Iu5KdFK7X6M495hgTL9r2WjLMkcx7np+PztTIpbQi061woqvy902Zu/l6oemdlHemjzChWdzRyBLf+tvmEOfL0nK4jf2tiPc3bXM9ZNapnAWBSnrduK0xpR5bKzs+y+CYlAH62kKleFGfJ2ZlNsh5vlK/Ft4/27URi131L2qmt1C2JS5/vdVYH+03ZIoFr9bC1m9YyTNqR1rlNNOyeC4JYoa4Wut/W1X5L2Hzr+rs3z8d8J5P3mXxv/bsgP4u0sK3YduQdqdXASgazM99LQPnNFM2xK1asWLFixYqTEbDHD+BP4334tfj1+JNlOpm3gJ978RP41+//58W2N3dfeCJlP6948cLhe/7wi/iaD/XPuipN/KZfvsXf/FPvwZ//G2/gn37i8Kyrs2LFihUrVlyL55/wVRTBDpRBnmPkniEa2KWAdk3kahmqHKpjTAtKjmlfgyQFjtfJks2t8q2S9rpATi6zrTpgTvajNjDVuqZVWdh6ZfvjeUCQ7DENIjUHoWpLZAghSH7+YZ0DY+DyvKY1sCHxgCnwW+cMLFSmNH821v5ZSduWUopj2Q71s1l6VnXwWf+eBdIrsvs668eWxfOx67aOWSrL8qVL52j/v4ZUyCoWXwY/i/22Hryg5l1AtlY9hdyYjR0Qslf/BqZVvkSA46TeZOw+9QDdwx3G3ZmQjz2heyQKXZfIKzBEtZsu468YFBhhp++e2N+Gjdg3hx0w7gDuZNGA5DsVQs0NKSfqpRD27IDh3MEfPLoHbv7MHAmZ6tyUb1HbKDK46wD/+GTvbIHKTYLMGqTOimNTFCeSx44hpo8oKRh7ntSj6TwXprLCRv6/eVOeAZOQ8SBguBBSmBiSkzc9KwoQ4fkGsO63FNMxlPZp14rSZyhwYQ8t/XZef26McSfh2LxzEzgnTgvH5hmkuVHJmc7jcLdD2Ml9U0Am3pko219r20QdItNzykT9mPqzQ+6/olAHNAc2ii41n2dayPN0msffEtmhZO+p9v5ah8Y1j9nZtmxbj5V9nWVzKydrYRkclCA1i3Ra5dRjO0ewXaxTt8exutd1PjY/FvNoNX8fq18LC0phO29NeVkbc+J1qOpwCnmXjzPfZHSDOe0maPaXx+nHx6yH6/JrsvQEq+laVTwjnhtlzNTWeu3W/NNalPkW27ywVj41P7Ci9V1uyz2i/J0XJYvRViXvihUrVqxY8WTAiPgl/BMEDHgTP4czvIQNbt+ojIPb43LzsNj22Vu/hJ+995M3q4zzwO42MFwB4d1HOHYe+Mov6fAl9458Nz1D3Dl3+OoPdrh99mRI/3caOt/h3q17uNhePOuqrFixYsWKJ4Tnn/Blli8EIrFs1oBIsjGjYUwWn4Z0VZUu85RD0Sh/9Tj2bm7pDBQKYFHQTYElGhu5Kzvz4eKm8rOdblb9mqC7zQVslb3RHJ9J7lTWGJKiqUG+ZFtGnoJMtc1zSzEMgA+D5Hc0SoaCJG48E7JtnFSzamFISVGhAT3miohTUsfma7VqImMhXeTfXSQvGzbb1krSWjV3LtWpUtHW1sOIqZ5uUsgEs1+PVVWwZS1aAbnaEtmRKLUil2pfe3y2ZTaLBOr7t0FPS8w32rVZr5YqTq9xLJBZH68KKKfJTs3zJgfq0t8z28ZGMDcapa/t49o3G/aShXJO71OfY03w5nqltnLm73ohiDmOPYGGgP7Vh3jp9SuML55huNNhuPAIPRC2lIkxJbaiJ7itlHe4QxjPCOMFEtkFdFdCSHaPAJfUpGGLnMNXCUUKQOgZcQNc3SPEzsPvt/CPRvirUdSwumCl03EnPZMg4yZ3HtT3wCkK3RbBa7c/DjgCYwAxg0FCSI9m4Yv3Mn5kZX8EsUPsUk5jwkSwDoTYM8YzoHtE8HvAHRhhK/XzexaykaWdc7ttGbETpSoY2G9EbQoCDnfkut3DpPAmAEzgjrF/kXH2GQKNSZEahOQgpLa284KO86pge0okz0lwXpT/m97MZVH6qCWiiWQc2h+A7Qbx1hkuX3KIntA/lHZ3gxC4w7kofF1gRE8YzwndZVK663ohVbOPQHclz2XcAf1DWRwx3JbnJGXKe4NhkDmj63I/ozEIuazWyQYyfyd1onen5fnN878h4VqK0dx+jUU6+rs5xqoeVWVb2/CW1agWvFibXt1mlb3pWWlZhRVzXR9T71q1PFk2JwcEu7CrZf0sF8W1IILbbgHvJ/Vjysls61zOy41yOSkmW88HSNbeMgcUJL3WWZ0vGs8pWyybhVbZvtkeh8Y3Xl1NlvafKYGrObqwYF4gRIv5LLvQIM+B9Xjd6itFHYCsHp6Rq87Nzq9J1yaJXauAC3eNahGh/RY3+y3Zrd+Ftl71tZr1swtXtI8BQG/UIq3cvIr6W0AVuvU+qp5hKie35zhOiyktqavfKDm1xfwbqrDjjql8u1CjPtZ+BzWsyldl74oVK1asWPHW8Fn8S/w1/A78Bvwv8TX4Azc695Mv/SR+4CN/u9gW6PpvyRku7gFf++8BP/cvgF/6sZuf/w7H59+M+O3f9Vn83t94gf/qO+896+rM8P0/fIn/5C99AY/2787vqi99+Uvxn//u/xxnm7NnXZUVK1asWPGE8HwTvpbsykrRFKC09sxWDavH1FDSps61a49XYtIQxaLi0oBVgzhaIkAy8crlMTa4WASyFlbuX7ea/9g9t5QRQJuA0Ppa+7q6HtS4//ynDYaXdoMzGNKzUPMCR5VITbLTknUthVbRxkfqJDsyIVLXQ4JyrXY7gSSw/7cLArL1sdnXUq00+3PDzlCv4xrXe9ygYMMue1avlhq5bhc9b6mfo3wu16nb9JjZszxV/VIEuSHCsOqdLgikzuWFFhRkoYl/dACYMe4c4pnD4e5ETFIkeV2iEFpgsb1lTcesykcDdkr0AmodrNwDd/ITewZ3orAMWwcaxaqeYgo86+MiY6s+C5ifuHJ1iSh/XOjim0SUcqXmJGaxqWcWQpwDaOsBAkIvaujYR2nfQHAHgr+SoHn0AO/S8+FEpEdtD2n/7goIkeA6YNxNxIoQu2IxbAW6YIAGAqKQy7EX+21/GGXfGMF9Y0zSuSY9A4pNM+Dr8QTaXHM2F0SJnTNqW1TnEO+cY7y7FfI8CnkeNpIzN3rkNqIIkGNZCJH6M5v9UyUg7ZtIdpC+IwCldwOALIAZBiFhdJEXUvs5nlIyeFNnJVt0ccypqMf4JXVvRey2fm8Rtdfmd63m5pPVvLm6R74dmk4YydrX7jM572djwnV9z3mQoymNgHPyuy7asO81IKSlLvAKARwC+HA4qY8XNs5Lz7ggqI1Thm2bFgl87PvkOjQstYt8z3bhWjq+qVZtgMw7espcaM85qiRv1bl13UZ5NfJ1lOzM3wMV4bqw4OXU+2pceL7NLmjU/ZbMPQX222uJnC+edVpwUs+vuThKdt+uONe64uTyiG7UHkcdUlasWLFixYoVNwIj4ID7+Hn8QwDAR/FtuNqO+Nl7n7j23M/c/gUcuv1brwQ5oNsAd98vCyQ//zPA+O5R+jKA+5eMy8MzXAh9BIcRePPRu/d7ypPH+fYcnX++6YEVK1asWDHh3TGiqxq2hWPBayotmpUcVpVuoXBSss8GfTRAU6sgLWnbigtFBmBIag1eM8u9jKMERq2y1zn5uFsI0E1qxEoJoeVoYKlFGLZUGRY1KdiwgwUwKXhNILEOKpJVQ9ugZ1FQxJKdc5MQpCqIlp+vk2hyNKqehvpTVUHgkK/dKrtoA0IZIG6Ve12fBEry1e5XlbBVdhwL+M2U6I2gdFZCu6m+vp/667EclVwrwiuitz7ftuOSdWRBQhiCJT3jeQDUlJPqkoOmwEQWLqiTavtwclSkQzYnTeVpHZjBMW33Mlbk/LgMwLGMpiOBA8PFCPdgD3c5YP/yBrEHrl5mhA3APWeiV3KYUlb9UsCk6B0ZYTfVX/Obag5ZsQ2GEJ5Jmco9I/ZCgI5nTshn9vAPh9Ku3nZra4Vvc4Afw1MIIGuuSYxB2rL37TE3JvJ3iKBkyxy2iTDfpOc1ELqHlEnE2KPID9s/SsQGIT/DzevS3nEDjOeinlabZoryTKKfSHmwPD92QNyIJXfYUVKypvtwThYlVWrZbFsd5J6eSEC+NbZfd4p3gHeTuheoHCzMu5Dml/HFM+zv9VmR668AJk6W2iSLESILyeumNgRPltrOiBKjl8UP3aX04dhRyoM8qatBAPoOFILkh7eLvIBSKd155Dy+IYKjqlVPCCBYdwZgUolaS/+cozaW5wGFMnSGxvw6mxt1/h5GgCPY+0IdPOsnNUlZq1p1Ptb0B0ftZUtyl9w11s1HQH0H6jrQ2a4c1/U+u64g7THKtw0B4GEAHQbERPy2F6uZ+SJZTNtcvs0622erymhtmxY4yvtJ1Zh44uKBljtJTXYD5pvFEs1La25mDiaGyGz0r+J7qFLS1vbVR23CzXFHLcdtP7Vq5IpItvl5i23HbJ9b36f1vdv8v0vWzTWxXh93bJFk2k/JQSjXv1Y0axm6mEavb1TAZZHmO8Yq4FsW1mFyLSiu78r3vnRviSjU8ytWrFixYsWKG+On8bfx8/gH+AB+I75wfoV/+BXfByx8Oj01vPTlwAsfAN749LuK8F3x7EC42cLCFStWrFjxfOD5JnwtEdkidGtURG1NoJESsUY5pMdlFa+SwY5AKlXSYIsG3K2yVK9jA9Sz3KyVAqTryr/1GlrGEoldkyM2AGQtnW2QSxW7S1ACzQTo8j1pANFPgS89lsxxVAXQmooX58A5IOfmx8WkxrABaLVnRCPAbgPCqsqNrk1aWiWtA4RRSsFhGyQrLJElGExdJ8HZANOvGu1olbvZOtLLtVp9JYzzc5P6KQegW4oyu0jAlhe5JAJsf7DtcEwpZQKScm5F9uYcxm4i0S1UBc5xClqSuQ8TnJ+CttO7Yi1KiyBrpaqZEV/R1BPI9WRVlNYYR/mhnRyuhFz1Xqv1cCZ9lVDtCHGXmK3OIfQEMNDfJ7hdIr1UPMdC1sIBNABIOWS5IyDqOAS4kMhJBvyV/O2GlNvXoxTXk5CSwxnBDQ7uENFFFnWsNiFRIpNiadvtXeqXzwjMoBBF/WqUsDDEo5J9NCRLagL2LxIOLzAQaFKGJnJ8vECyWZa2CgQ8fK+XPMrapQ/A5gEjHIQ8PtwhIR97YATgElnMHTBcCDElpKU8WwqEsAGuXnTYvZqeh3dA50Thqv8en6mpYx4j3zLle1PSmAh0dibKy8jgpOakMUxzXm7rEXAOfL7D/sUehwuH/qHk6x0ukNuS4tRfpSxg8waju5Rj4kZeIJfag5jBDvADo38EDOeEsJH3iB0Qz9KiBoZYNOt8pX2jleP9MExzoXegUciUo7leF/6RK9bIKBf02Dzvdp6pyDO7rVZDttwKZtbOS0p7S+4eUafq3zN3DK13414FtbXAaUQvdYnk3W2BfjNLA5EXn6Xnwt1EhlFafAci0KYHziL8dgPeH8D7PeLlZeP7rV0PvY9C+ZsrqQup5HuAHcpFasXCKbt4bongpPkxlkw+9k7avtJywWigqapNfaZY3FSrhysUuZzr7a26VP1a741q5amSmgB0JaVaM9f30LJybqp/6/zi9pt1geTO5zQWeWblbV1u/R1hy7b7mMHDOG3z/nidqvtje39W3buQxxcA2CVr8WAJc/MsTDl2n1yDQPCQgWzFihUrVqxY8VYw4BH+Hv5nGPEygA/i7Wd8V6x4cnDk8Ed/yx/FV77vK+GfZQxoxYoVK1Y8cRxZTv8c4ZRA95FVSyfl9lPUpOex6+nPKXVqkKDFMdbmuVY3WTTtGhvk8nWruJYCXjW5fkpZLRiVjAboylxsjUDqYl1PuH6lwCrOs0raU6+T2mEWJL4OrevofV/XjrWqdmm/llX3nTqA22q3YiHCNddpWZ7WWFBcveVVhC2y16KlCq7rw7Hd5rGtuKSkLrXHqdKdNTDrJZcv9xPZlxeQBCF1/WGyuHVBiEkhHgC1sw0bRtyyWDXruoXEl7tRyF4aS6KXIoAoytTYYfp/5+b32VIKqpPATcbDped43di3AK7HKuamm8C0iEHUzLEHuGP4K7Fypoic0zecMcJGiEVtr+E2MF4QwtlEqpN5nqDpmWQrbZrKFJI3PcNBrKPZS55mdprjl3K/mJEL9b08C5Coe+0imJzTXqHjPTO47xDPtxi3DrFDyoGcFivEtFAhtZEUlsjfA+CGlDM5Ee/+wPDDRLiD5Zh8XmAheZ0h91IbTiRINcfahUX2Hq4j3q7DdYTnMWcELaJYgHLDuQY4vijrJvVKZC9HLghwtnOL/TkFRNBc0LTZANstaLsBNr08MyV6nRNVr3fT+2DJX++BzoP7Drzpgd0WtNuCtltQ1zfGsLKOfMrcBQDk0mKfePxZ3GQcPPW8lnNFXT1Lopr6PZE581j+2yNYOm7xvbILAs25Ndl7MhrXuTZPbWvRl8KOxzbHsC5OUEJ4qZ55Qce8TU8az4/kPK4V2e3Ll9doOZlkoj0e728rVqxYsWLFitPBCPgM/gVexY8/w1oQcHYH2N56hnVY8W4AEeGjr3wUH33fR9dvxRUrVqx4l+H5VvhGBlwiH636tVOLXhO4UQs2q5AlkiAj87V2Z4VtM7OQK5Y8tcGjWolS1xmQ+jADoKleWrfaSjqm+9D7Unvm1vWtvTVRqcrU9rAqVyJRFGvgygay0vW5cT9k8p/xsYBXg2AmZ5gX3TdTRfAUOHWWRTAwJGNtc9dUs0YW5SYgbZxtnrV+PFf5EuQcjqXyWnEYJtWvtfHW/Id1HyhUtFbNVZH8niblZa1YpZaKNQWwke7Llr2QWzKfV+/LdfTzYyy07ZQsVBJfu5dVq3k/bQeAnqQPGVUUM8vzIwci007eC0kxGNWzNkXXTWrfup82yN6s2ANMH1kg/NP7aEnb4tqcSAYiIQh7P9nhjqKcpaC5RQnjmShJaQDGHYGC5I1lIlH5MrLNc+wBUCJ2k80zEtHYXSLn8lVLYooEigw3CMEJEDZvAGFDGG45dA87uCGkeol1Mh0GuZHOKKdVRVn3r2No/ePgMQm2rPQDpneRxR6Yu6Q+HkchBAGEsw6P3utAAejfdNi+BoxnwHBHLIbZAcOdALd3gAM2r0nZV+/hRDwS+vtyucMth+EWYbyw9wH4AXB7IJwlwj0A7kBwIxB7LQdCPm+A8czDHTr4h4fUx0nqzix5fW1/Sn33WeVYpO0W2PTgPs0BmN4h0jElvQfhxXNcvrJD2GgfB/yIfA47aSO5P8AdOCt+2RNCet38gbF7PWI4E+JYUyrEDhgu5D3Z3Ocp1YIuXDjfgsYglr95EUWD2Etkk6RrMH3pGAmYx45pXiNHmRidKUXtopfG+EhGlV6rG9lN5AuHmP8m7/OYZXPen6ISLeq09PdRVW/ab1MJLC1Iq6twdiak7HYzqR3VrplMWX1XWIfrt1pW86dt7Cm5J0BsvM92cI7AV3vEhw/LOhGhXmwkz83l+9PnCARp4zRv5W2c1PWV9fTsd4sjbT0LljTSULQJykl1TN5P82cIaf7003MYxkI5bsvUvmctm4s0G12yRmculcB6rH5DVYv+jgWBWlbNi9D5JdVhVr4hOq3q3ZKj1xKeIaR20FzNqUyTM7fYXit0l5xv6jaw39XWfcAq2+2xtvy6TWpbaGCyea5TtQBgXSSZLfin41nLS8rgNYC3YsWKFStWvIvgPPCx/yHwxqeAH/87z7o2K1asWLFixYp3IJ5vwreh5AEwEai6jVlyxNnV9EqSqnrJWODmIHJNVrbUsZZkWgp21eczG1vfRAzGhWNB5XZgnoevRbCe8ru1tdMgVZ2LNrUR2fZqlQkTdDPH1cEmrp5ZEeSrr10HVVu59FrHASV5adVLrQCuBrlbOW+zfWeDhLfXqX/nOD3jVr20bnV+ZKB81o7K62l9yCEnoK0Vt8eUuS3rz9Z9R2Nb2kKLALHXtdeqywam9jSkvhI8M6toDfg2ctvN8ufl6xviBFWwum4f25aQoClp7sis6pUxg5BedbsAgSDjh09kJSeCFono2oiSdDxnUMr7WtjfpjylFChvV97NDRMh5kaphhsZsScEo/5Ve2h2wHgmJ7sg9Qo9EHsnBF5MeTJR5ci2765zszZZRE0MvRVoIL+lTkcUL2ZmCWZ3AI0BsXcYz1PVR0uUaw5ehn8o46VaNKsaVRWpsZfz3WEi0XU9Co2QvL1n6f9eHg17RkQi7xL5LoVAVNle31uaFjroIqEIWahk3+u3G86D+q6cb3QMsvNLeh7x4gxh1yH2QsZRFMtrYki/S/mO5b4Bigy/B1zgnGeaneRBpgiMW8oqdIqY3iFM74W8C9O4wJ2bFiTUaC0silzm8L0hagXsjPS1OW8b1rg1yVKmMmgQSieoeHPO2WMLd6pcvLUKlhwZEnTxQtO5S2Sv83C7reTp7Tr5qRes5Qvz9GO/w2IiLXVxDdGksvdOnp8jUQ4DoP2+zOvLDMDeX1sVWd9v8SxrwphoIkKL+23Mna39+ZaPfJe0ttu6Z2tjs9324SOLAazVcp2fmOpvuKOLwRqqUy2jul4Ldu4t7K2PkcgL+YhbeY+b5wGlRfR1WMoL3FrwZIncJVy3/1g9EoFr01lw2ldYeTeU08X1W7+vWLFixYoVK54MyAGvfBVw+73PsA4E+A7PNA3TiuceH3v/x/ArvvRX4MVbLz7rqqxYsWLFiqeA55/wbaGhOKXIUx7eKPaesyCk/qhK9gi5yY5ELVfvs4oJS1wAKYhkynY2p10jwFQQfVT+rsE5q+htKASaQZ+WIjffe5gFtrJSQoNgMc5VvVqvI8iKE0uktvZfE1jVgD8jHi1P7p8mVa+tZ23xXCtybWBan0/O67tEzprctqwEqC+Dh7kNuSRWFVlhjGVytibWc95co/rWdmwpgVtB3kJxyIBLdavJg6V6ZSXKciC9PCcY4jpdI6maapJ2pkwy9t+zYPNSsDWRmORiDvwvkh66IEPr6wEKLGrariLoSfKIciJ72QnJlYsiwrgV1WK4FeFGySma85wq4cuUyTMKiYyE5OvV3LE0CNnrBiQLY0AtoK0akncBIzwoSn3ChhB7Evvo6IRsdAwefM6HW4ASIcSNMekUvBW1qiqm63diDIls90KqwoEcIXZCpPsradOwlVPcQYhv9kD/gBB2jLATotyNQuQqsRg20sZ+T4XtMyUuiTsgpJmSHUubd8h2w+x4IvodEJPCdbYgJr1bpH7Tb7Wt3gLIiwVvvcCIqzFD1LkO4c4W45lH7NJ9MpDSF8utquLcI9s3d3tO/ZWlD3aE/iHLM9uRtCFJ/2cisGcUVtlhehfAQvhCrX+RCN0G2Ovihjjl4z7Ftp+uGbughGlMY1V9emkdPSN9jdoSAKxLR02ozca3mNwPrLNHC+q6MFV4MZctuZjvqbjn6xYOSSXhNj3o4kJy9XZdcs2ovnn0vtM4Q5HBZH83x3bybiMgfR9pPRjY9CDIHAAAbOf0oj1iujcq7820B6Ku0jDfakD69nHlsba99JlYErUqvyQ2uSzfiYqbrbNFPRenRTmFCjw5jyjRXxCoxxZumTra8vLCGu1TWCZtWzh2bHOBVfqWLOqs74G1Vq7eHUU+rmXLbNWy9r2yKR9aixWr6xVl2sWPdU5he679DqvLUNj6XUME5wVYQb/d0jepplmI1XiSnE8Kdbk6GRVVfTZzzIoVK1asWPGuhPPAB36VWCqvWPEc41d+6a/EH/jmP/Csq7FixYoVK54Snm/C1yhDZoHGSinGqqgCJjWvITusNSSr2jDZH7N3eX+R79cSlDQF9fJ11dKtle/Wqlw0IBPilN8uxIpMpImEAlDkEq0DXa0AU8u6rm5Hi0rdYS2cgUS61gG6RmCJ6ueiipWqHYsArpKHlsRVlUtkcMN+m5ItLQ/DVA+76lFJ3kK1q6Rsvilk0repcNLn2QisMiMrIusAYK2CdEnWpnbIROVCgSXFciZ4zbVughZRa8tU9N38OGBSboWqzaw62vvpvFnbNupQ59R1BEo252LNaIKcDQJCLFJNf7dWmDBBc9OnlOgormv/HEbAe9XWi70oUVJvTgHq2DnAPFZiTqpEyQXLvUfcOIQtco7ZuAHiCHQPRLHrRoAuUeQ9BUnMlxjoHzBiD4znJDa3ATjcFWLSXwF8JmRb7OV4f0UYLxhxF3F1r4O/YrGNToS0H0zbWLtIu/gFAG234Mur0/rZkwooMwMx5PeFe7XLBGh/SHXmSQUYGW6I6B92iTQXwpc4Ebo7adfYcWIlkZ9X94jgr4DukjGeS3vGDvB7aXPdBgIOO2C8iKIaJiBuOOdL9gdkFSqNcv7mfoC7Sqr0GGWs1vkgWfNzsvul4ck03U1Buy1otxOb3ZlylWW+UyeM7QaP3r9D2Ipa3Y1pNULqo6rGBSDK6/T3cCaLDPyBs6K3f8TwB0Z3xdjfceANssJ33Mlz1XYGS3u6QZ9TD3c1gt7kPM9lcteS1HbBVk2KLTZINT8Ac5IUQpQDSAsTynlslqfXGbUeaqJwWlDSIt0KMi/Z7Fp72wJ20ZNUXMpQZ4RMHgFAmKyM3fK4miox35bayd+9A3Sd2DjrAo0017Ojqf8AMm90XvL0arlkrPL12ybEeb5uIumjnRd75xiB+w/K7wU9zt67WdQzPc/5fXJkUFrhoWS+LHRpLHRqYYlkbe2PDIZaDScVcf38VeVefzOl85X8zKQxxzJlRaX8zf1GFzmmsklTLDRIyGb+erMAwdqR5/3mHjJBq3WkWJbjqfwmPnI9uX9Dwho750LJWy+srMu338jzi011sESxPd6SzjyNP83r23r1ffvfAem47GjhHDjEqm2nv5vEfmssIF0xUV0nWTuvWLFixYoVK1asWLFixYoVK979eL49v1pEr90HzBWMFjdR/NTXtLDK29aq/4pMKRRsGtid2Rcfuafr0KyjCcC21Ar6/+uuYdvMXMcGBJkb7bFYHE/B7YKIPNI1OZYko9arDrg/LloEuF6jPq5Vz6N15/kxpwTilvrcsfuM3C67brfryqnPyedWQfGa1CU3b4tWnsTrguqn4lQLQ0sKtPJahrAQTE0qXkLOnYtEBMuJ6UdjxiQLRGIvZBeIETtG2HBWLUr+3aRm5ERuPeJMoHV7hj8kFTAwWThjOl+2cybJRDYJDBdA3AhxWeYWbvSLauwi75uE11NFHWyvx4/Un7MqOUb4Q0R/H4VNNhhCzuszcqmpUnupItqN0q5ukN9FXSrqVGu5zY6zGhUOqT0hKmnS8ySPr98z/GWAO4zzd1YJMTtvnTqmP2GQd6DOT4reFiKDO4+46TCcO4w7yvbXsqgBsBwmpXag1K7cCYnOhKz+zaRTfkcmC9/YSXlC4CK3qz6P2CeS8AaWqbIQ6fTjbzSeH7NVbv1t63QdrhvXazypMVSxUEfyHm7Ti+J20wuZa/Pyts4nyu4qZWHVd5D9DqjnrkSKUd+LyvdxLexa7aTfE4qaXDMkamnLPalt9ZzFZ2vKkb/n82DLKrlZ3qKLxZGx5Ihd8yIa/axQp990flhym2n9HEHT3ePYO6Xl2UWW9hpL5x77t8UpZO8N0Lynm45zS3+v1s4rVqxYsWLFihUrEjbdBh9+74dx79a9Z10V3D2/i69471dg1++edVVWrFix4l2H51vh650E/lTRo4qkzs8DhobUpKSeZTcFbhhlcIUdSZ7OGEVJ4Fyy7bSkbVKE6vWJwJ2X8q0i1qp1spqXp4CnbrMKGEfIOR8L8prKQFyt0FTrZf1dVc3jCGvpN9UrLgeENFcYV3U3qgS5l0nZmkNfqjox7ZCDWvZyeq4qQ2vFiiKGGcFKzslzC5gUP6rwdJgCkvpos9VySKxPZe04y0GL1L/Gsl7pXhfhEqtkjy9yAqZ7UQvm4j4bSg7bl60y9pj40ubKteovJXhcKssSm6qitjl0bT2uUyFbi+r63uq8vLbdAWS1XFIFcQgS4LcWharaonY+wGb+OqMIsvU4mr8yBnAIcEGUMWBO+XlFUahEb3bl1f6d1KhQRXBSsY0XQDhjgAm8ZQQH8BcI5IDghRwjFoL27POMFz6xx2e/YYfhFrB9I4gN8eDw6BUH7oDd5xjjGWG8nZTDPhFkiZCkSwc44Or9AXA+56YFA7Qf5L0xhKOqlwECsZdxaNMDl88gUByT1WuycC5QkZM0BvRfuMQLP+Xw8H09hguCC8B4DhxupzaJqY0Sgcgu5TA9yLawIbiBgUMifQk5zy+AyTbbSb8VEpnz89exzF8BmzcZmwcR/ecfyLvSd5NlrVr2O5cXCHDvhYB/FqSvTza8S1alOlbfOsP4wlZU5SS33j+UBQlKfLNP7cTA9s0IvxfS/OGFgwPgD2LpjA4Yz8RSu7tCynUsZK6SwtYuGjAEPiBkr1XcEbVtnbX+pxBCdo5GFMvdNA9xTNbAdX5VYKbcLFS49XjuaXZOHpNcaXNblF8pNmulcB4HjVsFD5xVrcWCjdpJAZjnuz2BiKazM9D5WSJdJ+WluKKkeul8FTmp2V2elyWdxrSwRL+daAxynLX4jWZFgX7j9B1wtoMLAfHRo/KbBJj6zTVkJAdROJPa4uo515H71XPKz7FOz2BSNthc6ZnEDWGuxqXJqplDnPex6lj4ZLufMKnPY1bfzvI9qzW0FNa81dqafHbd9IysStjuZ2ZgGCeSu7ZcTnWctWF1/YIAt4pbIkntUKtmrWNFdY3iu90iq9B9eW79fZvyRqulOIDJNUSVv8NQ9l+g3GZzF3uxpudxnH9Hq2W99+XiOb1ndT2x32Ex2vVfExyBKH0TX/96r1ixYsWKFStWrHiX430vvA/f9Xu/6x1Bsv6Gj/0G/LqP/jr8F3/9v8CP/8KPP+vqrFixYsW7Cs834RuMMqOwZeMpuFIQbWirTZQE1j/tfkswaCCTEnug+03QOOf1TX9naHDG2uIqgaGkVq2wVdJXUZPG9p6P5faLUQJVqmxoBcSscqNl+WyhwddaBemmoJTa7TGzBKGqIHwOXi8pQGsFqyp6TPA95xGurDin+07BTptbt74Xm/OwJtft77HqE7mtY9nuRu0zu47FkrK2ZbvcCl5bMtn2izofoz1WlVNK9mr+N2vtSW4i31siKg1s19ew0GsokRjMsWqr2VLdmTzABFNn0yYnqeNMH54RJamv5Py9NfFs76GhNKUQM+mbySbN2esgY0DkdFw6JykUgUQceiEVVcXoRiHIcJsQtoT9vT7vD1tpN58Uk2Ej2zmVIbloCcOF9ieARiVwkSyIaR4Jdmlnvl9z34D0gbdb4bukGqvGWP0/d0KYbl7b4/JlyUcbPRATAakqXY56+0lpDYa/pEyS6/PxB2C4JfbZzlgtU2pTJYEpaBA+HcByfv8oYnM/5DlnItIx9RFA2trxpLR+uwlfSmNiS+lv29oRDi+d4epeh6jtOUoOXnI8Eb4kPwSIoj21saqmYy/5qd2ItA9wA4MCleRulbPXEYPH9O46lH1YF2ylsZjq9/VU1MRWS/Xf3Dafa/JCptYYXlR9TqgVuX3Ntmb5rb8BFHb1R/PvpjEvL3Q6ZUz1cGc70KaXdA7O5fQTk0qcp2+D6WZTfeM0XnpZVML9tMDN1oCuhnmd7HcYkRC/5LBkOW8X9LSsnPWY6+z96/mniWvcMZbmrFbO58XjZp+sy996BerxtFIU3+SaVQWmazkHqknfoq/OyV2qnyfKubr4u3amaZRRVX763X7r6jdy9Y3LzHMrcb0/uyiy1V5L/bROr7KE9G3GjXlAvqP1PnTBXFp8ygxC4z5zNewCBfm3BvENxsUVK1asWLFixYpngB/52QHf9dfewH/4G87xsQ/0z7o670oQCL3v4R/XMekJwjsPSv+teHfg5c3L+M4v/U780Os/hL/3+b/3rKuzYsUXNZ5vry8lMGvrNebyB5iOsT/1sS07OUtU2uNs2daWMOWim+rIUxmucX27T8vQ7S0sqZbcwn3ZYJlR/BaBqbpOGtC1qLapUiXncavLyO1RBWRb971kjalBac3t6t2kbNDjrGLUnqvnmxx5Qq64OVFpz9V2c748rkVExfS8W5bcdV30nu2H1Ywwr/a34Ew/cr4kbkIo2qu0TS7Jg1lgW+9VSXG16swKt6pdtS7272P3bq+zZKvZILnneS0b7ygw9U2jsGmRKravZBXYos1nNX445Py8QPo9GrIpmm0hCnEVOeXqNSRhUkXGTn53I+AOsm/cAZf3XCbGxm3K13uIQmZuEtHWCeHrkoUud0Kyi60uia3uQVi4sEnkoz4uVeWpuheQ/MOmbcm55YD600IaEyyR1xwH9Zn0HTAG+NcfwQVMbZt+5FjkPLMuTET5dM1pnz+wKLLP5dlM9sMEN9Jk8xymcwEp3wVG/yiif/NgxtzpnihO+Ukl1/O0KOZthSrzlhagVLi61+Eq9Ue1HI+dKKMna2tArbJjB8RObMzdKO0aekoLGyaC2B+SbXmc1h1oTmu12Ba7bamXWKlPqvrmfFPfT60SPAWVTf2S7XsxN1XINr9pvKkVnBn1vGHm2NmxrePt9nzx4590j2vTTt6Dzs9Bm00mbDWH8kzVWCmWdTwEAPYO3HeIuw7hrJefiw3GOzuEW1uE802ab+L0nQWUC7CSOp2O2ZGb5zNzc7AK3dYCqbQ976vaXZ9Ni6CfLI+pLFPz2dbtWvcH+//quNax5bZpkZP2PUv82XqrUrcuNyt4nZNnrvsbdTq2+Kpuo/ytmNpyUrg3vjWPwS5atOe1nD4aOXOLY6z7Rz0WG7LX5tktbKfrc+vr2m/rJWLdm3lW290skmBV9V6z2K3VH4t0KUC5SHDFihUrVqxYseIdiB9NhO9P/NJw/cFvA5gZ+4ExhuXvsOcJ3nl0/vnWfK14Z2FDG2zc9POB3Qfwp7/yT+O3v/e35209rYs3Vqx4Fnj+R3tVAGhABpiIAkt+2tX2DdKUu2uCIa38t3odG0hRFYFew1dByaJOgLBEDaK0ttO1quVWAGkMZTk2IF4TZZlsdc0g2Az1dqKsUM42lsyi/DEKPLl/o+Kp290GEi1BaQNUSoqGMKmA6qB2CBOJ5x2yzaHaIIYqMK9kXrKDzvC2/ibwbwPNSgAkArAApSCvlr8UkLbl2XsIZr83z7il9g0RWZa5REbrfWi5XVf2La2D1nOME4ndKrduw2xh6cXCEShVwWqznewIZ2XmeoTGtnRqHWyuiEhO2+TcSbG2pCQ6SSGsOCT74y4lH40EdFPfYls2IymICYAo/d0hwDvK+WXlIAI7FrKWgNABwy05Rq1uu0tG94gQN0KeuYCcWzaOhLADEIH+wUTAUZRysy1uFEVq3DBGEuVw7FOQ3IrV64UxTmyjabcVcucwAPGYd/gTRAjlYhk71qZFGzQEUQaSEI4UIugwoLuM8FeEcZfeSxZyVwhvFsJ2EGKco+SiJYa4uztpw8MtIRT9HtLGEII3epMf2QNxZwk2qUf0BH8Z4d+4FCtn7yfL5jC9UwTA2pyyc0DfSd98Ss1agBxouwX1fTE2F/MGkCx6pd+MZ2JLHnvA7UhsmBlwe+Q8x90jyekbNkDYAkwO3SUDBAznabGBDl1gXL3opZ8xiwI4JsLdybFukPKICcOF1h3gzgFnO5lvxjCfy6vFWTyO06KkE9tHiUIy47OSf0cJ00RytsaemdUzMBGi2uY6Ri6pSuux086djZzjbOcAu8glz0/6/I+/3+78XPrMdpOJXgWNQcbHtFCDIhLRxdPiDQjpy7sNuPcYXjwDe5KxbeCcs1nnbd720iY6p+j96rPuPAhbMx+b+i8tZLKInJ9jdnkApvIAUP05aBY98TjKe6QLyXQOtHXN29O803AfUbvl3E88TX210c9att71gihrC30dOITpWNt3674Uy2sgnTezkOYo3xgK208AwE99vHi3zPUW3x2gXCBTfY/b+6UiTUXju13hPYin9BH5eCWTlRSPcbJ11kWTLfXuscUn9nii1IcI5LpZPfNz9j7fV17sZp+39pU4jVUcQv69XiDA0bxPK1asWLFixYoVK67Fq/cj/uD//vP4qU89/99RRIQ/9i1/DL/sA79sJX1XPBF8cPdB/JWv/yu46C7ytjN3hjN/hj/4wT+I3/zybwYAfPz+x/GH/uUfwsDvjIUcK1Z8seD5HuktoalWbfb3U863gTFLxraObf1eIQc9lYRuHnRCaD8fYwivI0qBa9HKZ2b/VuL8ujoZBQvV6oWaFF5SNdTt3Aqip/K5vi6AWoVlz2nX2xDdbwXWOnlJudGyGD+GYwpGe83rlFnWmrp5nSnYKJbOM4/IkiS2x59yH8fI4RZMTsLHVZI2g9omYHwyuduoqyi8Uv7umqiJPOXl1GsuPUdmuCBEr1o+IxBAE7kVOwh3n9SOsRc1qRuEPFPVrqpVw1ZINlUFq0pVyGRkS1xVosaOEXpRXdbtlKHP2REAIX3hfcpp+vYQvmKt2XgWZEx+dHy3Cy6Y4a8iukuH/YuJZNGuDCF+ORH0krpb2l5tgpUYzorV9LjUclsUrLoRYssNISOFXBfi0oUoC282fVG3TKpr/d3ktEBWPfY2IOctVTKuNf+Zv1VtGztpM8kZnQhfj7QYQUhyXX/CRDmvLzshirmT5qMIOEcYwFl5HbtJ3RvTsxB1PJLNsyE5HIH7DjSM7TnN/v8aq93HQiv3+ALmeUgX5i2LIypPoBrXdJy+wX0ezV0+v1heIIBNX6p6mSeLZq1PWuzS6lPcOfCmyzbOkv9aX7BECBNNpH50oGP/HiTzfXACWEneKvXDjMCv3Swa+zjynBDW6zTmnIKMvG5eaqWmuCnctMCqudDA1OlGC6BqzL6f31q9i7YxBOzS9kWcYqVcXffIzuWFkLr/JtdfXNj5GG3XUjpbwjhf5imMgytWrFixYsWKZw/fA7dfAa7eBIbLZ12bJ4qf+MUR//1LB/yqL+vR+SPfak8ZYwD+9c8N+Owbz8CZ6yng/S++Hx986YPPuhor3gX46ltfjV9x+1fg6+5+HW51t2b7X9m+gle2rwAALvwFvuneN+FnHv4MfuHqF97uqq5Y8UWLtyfK/LRAJMqvWiFbrGwvV8UDmAKV5lgKsSBuKPKUy1cJZBPgylaGQLLri5gFnRVWRRfL62RFpVUnWUVSMBZyGnyyhGP9Y5WyqtYIIV+fk+opqy+t6lnvs2WFp/edfqeumwX8eAxTsClZSBcKS+dEBZyUC6x5jPOjSDaAyeZuFqjS/LIWjop8ozyOpX1iTSBlO2JTjtoMW2vn2nqYWZSONfmVbZX91IZ2XyaotOxgtpl+6v2kaNafup86Pw8wWitvb2yotR8k+8usvMkqKbMthFJNNbO8pnK71lWD45GlLO9LUkN/OE7nqFWqVfJoPbXM6plOttKTZWV+ztZmUeuqypyqr+Tgd4t4qduVI7Dfy1d+bn8kAk+Iuvyjebv91B5sclu6IRFX2wA47ZeJ3HAsNri9kF9hCzx6RVS9/hK4fA/h8j0OV/e0/wD7FxlhA3RXjLgRVaW/InSXhP5BsnMeZRslq+PDHcLhlk9tpX0HYE9Cxuh7bwLQtN3Ane3wzBBTHmT9R15qWxqjqNF1/HcO289e4uJTiSGKgN8T3EHakfuYSUe4RDZ1iQj2QrCHraqgE6GZyMacp9YBFIXghWcpx7GxHgZoiJK7WeeQIaDIwc7J2lbHe83h+3ZaO3ufCOl60U01j6bfzz434Ozz0n7D3Yir9404vBSwvxdweJFx9RLj6j2M/T0SpfoI+IHhD4z9C4T9C6JIH24BhxcZwx1g/wJw9VKyKt8D4xkhbOWy+V0InCy0Gf4gx1FkcO8Qb+9EVarqe0DaVOuv1rFp3M1KzGPIi5CmsaHMA0sTYQiUylCFq6x+o8xxeR6zc8rSAp7air+yjZ4ReA1b6cKOWK+r0PmHaDp3gfCirpe8vbcuQBfn4E1fOKGwo+kbyWIYp+8WAOg7xIsdxrtbjLd6dPf36B6NcEOE3wf4qxH+4QB3CAADcdsh7vqS3NNvrKkhGhU23xI619i2qxc01XO8TRGh52iaBExzVdMSvTq/sOptLdoyzzmnxzDfCdYSWfuQfhOJo4r08dk1clPMt3OIRX8svs3Mc5y+w3z+Hqv3AcjPhJlBfQfaTFZdxbebWhMv2VqnhUW1e4ctR/dreTlFSX2/5prNcbUmXImAvp+Pfdb9AJi+i/Vvb77FajLa1kGh9bXqYSrdABatwpGez4Ldu7WPn7kFmGNOGgdXrFixYsWKFc8Pbr0M/KrfCbz84WddkyeO/9X/43X8/u/5PB5crQvXVqx4J+LPf/Wfx1/5hr+CC39x7bFfdfFV+Pvf+Pfxhz70h55+xVasWJHxfCt8l1auWzKtDsqk3ykCAGfLwYmAnYI0SgxrUDMrd00+xvoaZHPaLtUzqywr4q9QyiQoqda6XlNdUJHLlpTW05dyn9m/a0JSSbRGEC0HmZwNNE7kXIaSwaraSMfnHGUqKrWBNXIQqZchY23bzCpzw6AWM2CLoUQw5XbX4DAwWUHDPI/aQtI8yyWrzFafVPL8WP05TosBlETV82qC2wautS66LQf7TRu7hrIosumnhiSt81qSKxcpzO7XoSZZi1yHWm+rVnMNZa0JeLLtZzYIm+s+X+hxtH5yUrmA4TAA20QsjxEEB+5EJWpz3yIpJWmE9BNjY+qGIPlKI8F3EePegwbKCl03Uia53AiAUeQujVvCSICqS52uLXGSR5WCXG7YcVL2Ulb4iqKSMpE87gjs/bTMR+9hjDmfb/FGdZ3kya2VXE8ZFGIioD0oJDtlfS/T2EYxgjGNE+7RHn3n4PdbaU8CuGNED1HiekY4Y8lvHISEB4uilAhQpS+bBmAHxI387sapXWUnQIHymOUGJPvmIDahUYnqcuzO801kkJL/b5O6F0iB/66bSAeFLigyxAc7Qv/aFSgybn9yi/HcIewcxjMG92KVLepoBiCKzMMdgj8gW5TTKHbPh7uEsBPrcovokXMjA4Af5BmErSHdUvMM5w408vyjReusc5Y341EMp1k6F98MaZw54qqwtK+w5K3Voi2bZjPvLVyoOPZo3vR0PLl53tpsYVx08OV3mrpObN23m3KejXHKWQ7zbWTsZevvBu494nmP6GUejZsOYddhvPAYLzwoAP3DEWEj/Wv7+iDqXk2xYJ4Ne5dzjR9TLtaE141gif5sW3zkOTWecVE3szDq6LNeOj/BkoOsFr6ZbKzeZT3OXs+qx0/J5Wy+4ZQsPEWtnNXDyfp5dv1G+VoenJM5yHxnWhvpTJg28uZSvc2Wo9/CrcWYIUx91thUF98V131P1At3bJk6z5J5tvWY31CWF0pd4/JTtznnf8/Y8hrlP+fre1esWLFixYoVFfQfse9CiCaG384QxLsezIzv/1ffj5/6zE/hd37d71xtnVe8JXjy6Oi0PkRE6KhrLmxdsWLF08O7e5SvibWKfASmQLPNNWePyUreIpij0elS9Vtcw167yJnqzP4jXzCWiE6c51G7QXttDXZaJbDmTtOgWVXvluqjrI/LpG9WT1T3WpypSpQ6iIUpeDhXZSwEIsmZoGko1bn2XKDdRrXqFqjIW0N2GkKSwfKsu3R9jSEXAV5bz6rumlt4Kbja2r+kHLKqrPp6+rybhK0hriMD8BNxVvTLRg5Cm//XIpeV6qt/XxdEjixE7tJ92ntrKYGOfSDEOFd/26Jv+q8FZvDhADoMkis0Rqmeev0ql5ffczkHTm2DkfO3ukHGma4PGLkHjYnwDUD3EDjcnRS+qhhVZW7YJJKAjVI4UiJO0t8plstaByUmda1ElGPDFtKXlUSxFvg6zihcIs66t2+KqK3emQikttrW2UBJX9OHaX+Ae+jghltwgRCQCNxO2oM9A45Bj3y2ISaGEL3JbljzH0uB8nfcpPJHsw/pGQTKimE3GvXuNX1xBqvSf9r/qnXyTFnnLgC6UCmrNx3JfEMEd/8RNvsBd848htsehwvC/kXCeAaEl6RNuWeMXpTjAwP9mw7dQ0J3KXl5d29EIeqY4PbpkjoMd2nO5akdAWDcUrIyR7beHncpLzAwIxWL8UT/Djy5JSyhtfgGC4RubefcQt5/5PnXCl6117cKvaVvg3qxzU1hc8wvHiOLAmjTg3a7sp9EnuZ+nfftIrN6ERMR2DnEjSyWAQDuHMLWYdw5WbTCDGIv27aEzRu64MCB9AOtHvv13V9qi/zt44p8vVMu5mrBUj7PLEyqCfrWt1crDcIN0VS12vm0ckEBEhEdJ+VvfX59HJDeoxvanBdWypk8VSJ0/kxKZa/kKaa+a+QFNmSvLqxM6+pg6qwK53w9s4iRmd9aiDMvlovz71tzDKU+fBLpWy/0tPPAdd/vRVE8zSMutYElr4GirmzU0ZmIv8H1VqxYsWLFihUrVrz78Y8+/o/w85//efyOr/0dz7oqK55TdNRh67bwSzmOVqxY8Y7Bu4PwtQQGkOzTVBYUyuOAFIQsA+wUebIo1MAmUQpwhqxc4b4rSeFU3oz0tX+rUsWeZ5XAhQWzBpWUZDTBJ7WXLXJ2KaFnAuEavFKlkwaO6oCRqT/V6kjbXslqmEMsbeFagUpA1GudT5wY50B2S5lg7yMHuxsKlfy7VSiFxrPlRgiwUN1apalphypgyyHKNkfp+Zvyum4Kmitpq8/YwrZpttCm6Tq63ypBbD/RPmqUjUWZreCjEnTjmFhHs7Cg76Ts0dg3t4jeFuxxIdVNLahb9qF1IJ6ccCAhmMUMRn2u7WID8ZFn6hU2AVq1MuRhnAdqbSDX5gF0BMBnsoAcCQnQIEGybXQuD6AhiOo0jQ9MSCRvRVZ6BxpHuCFg8yCgu3QYlGD0QNhN7gLEQvKCEvHoxOaWHbJdsBuEIAaA7gEQzoDL9zD6+5Tz1Wo+37BlIYSz3TCB9klBbO5F8tJWY4d9v70H9ZNN51OHkpHdZJfJqurWYLta9zqxotZ3htLY6PfAeC4Er83JS6M0bvdQrJ6VsNccspyIW2UQxPJZ2pFSG0LL6xgcGI6nHKJuxDRGGJt8irG07M9zVFJUF2P+2wAioPNCTpu0Bewd0PmkrIbkzY0EDCPo6oDzn3oVfLZBPN9gvOgRe4fYEYYLh+Hc4fIVwnCLcXjviMOGcXgJcFdC/MbOY7wAQi/rDeR6QEiNzaSWzVM1Yyd/E4nal5MKvttXymSg7L/2b0Du8RjhaxdF5fNiac6gpGE9pum8ltWt0/icSThPpcK4JhFtPtlCAVgdZ8/VurXG2jSPKaGpBOfJuXudh9v0oLt3RAnu3fQ+chqznC+dTOqxU79piBBePAcTwV2lnLKOwJ6SVTejfyjlDBceFBn9ZYRL1uikqSikUfLCBIwBPDQS/C68Q5zm6DzWN++b5gunWouYDInWJNWWHEiOLIaqU1vMjtdvDGD6HlKFcyJVl8qfqWzr+tewTitkjoWUk7/DYk3upjnZEtE6l6T5tyaIrTq5cIap1b26v1KtknEjqO8577c20PV3b/HvhcWkzMnWm0uite7vut2ONUTlvWg9KmKYnSsVuk4WhLGb+iGZBTrF4sy+k77RsHDWby5KC/I4jlixYsWKFStWrFixYsWKx8W3vfJt+LO/7M/iQ2cfetZVWbFixTV4dxC+NazyKxrb5hZmpG8qoqX4xbTP2hrOVvUfq1etAiis+KpzT1HzRvN3ZSG3ZIl7NLfZNcRDoSixiru6zo1gng081sHGmfWfMwSxtUK0ypu34NrYVAbVNsVSsXZwT39fUvAea0+O5TFH61n1l1Y+QBv4Z5r3x9a9ttTAtm6tY08hDTSgfEwNZ22bnwTqQGsdiH4LYCUZkgVv1hSl50IsZAq5NGZwcXIiKYRAi8Hl/UouRhtnNsQtJxJSc8mqShgAfEhqXQdwDyAIocmeJU9tIo7hGRykvu6QSGWbw1eJ36V79yn/KTks2pM/SVTvAzHPiPTSIcGcl4hTaw+ckYh2/Z1Y2t2lvwvbU5r+r2tHlFBnx5i5YlIi7ENSHBfvqql3Ywwhq4o8ZSx4q7CLgVr78rwxbVNFpyrdaT+C9lvJpbvx8IcO3d6BvYffE8K2Q9xGcM+I24iRHQ53JI9v7FlyMkMI32yRTULmxk5yAFNEJuMpSp5qNutzaJiIwDwPq/380iKkY1hq/5ZisyJZZ+WbuWvJkcCSZm8ZR+axgtwsSOHl67pND9pshOztTM7RtAhulgJDf68XuaX8ynlhHZBs4yFKXyJRxUdOiy9kYQ+NmCzc7TeWLsLTRVantt1bUUPne6lI3cdIJbFkf5xxzCHjOuXwNc4as75Yf3MuENPN+upc21rEd8pce+wbdAEtsncGXfBpFguWu3m+3aY8sb+39l+3vbaRbhHI9YK0pTqi+l62Su9Wv88LE498a65YsWLFihUrVjxnuDowfuDHr/CxD/T4ZR94GxehJ/zrnzvg47844PAuWzN3OVziR3/uR9F5sdj96Csfxfn2/FlXa8U7HFu3xa9/4dfjm+59E7769lc/6+qsWLHiBDzfhK9dWQ9MQUezGt8GHLP6TsncEI21ZSJnxgjepA8KG6DJSjMbRJ1+z7nshrGsmx5X2AIa0s6qOvV6lmSsA6sWdUBO713bYxynPK9KiFk1Q2onjlHy5trj7LVUMeEdmLkIIPJC4E5VK9R180CXtgNH2W/umZWgDJBAZ1SFpZCrVmHMGgi16pzcVoZwtCquTF6G8m/Nj5sD2pjI3AUFKIBS7av3sWSb6cp+COfLOuYbU8WYKoFNHTIxa8hmVRcPnGSd9j5N31PmShXJWk9VMys0CGwDza321f/X+Xb1GdlTrO1zUt0RxK6wCDIn5Zi1/baqXmurWKh/7Tuuxzon6l9TXr62o7KPqOK7fmYhiLVz38lb25X/2JgJytNQMh3AcEOEG4Bx8ECgRAAjk12aO7a7QrYZVtWpkr3dJWcijDvAbwhhD8ROyOb+AWE8JwxbFrIMSPlV5Zz+AWPzIIKuhqzkpDCRjcQsnK6+A0r0eA/yHnydDeyTQlalAxj1OU0kE/ceUHJV/+9TvwgpX/I4Ee/EAGIiw3shBdWqmQchGNUyOD+y1GYURRHIBKBjhI20NxKJzm4K2rtRx15D5gKZtKI07rMq41X9lRc/PH1inbyflGJ2rjSOGMRsnCTMOzWOoqp88Ah+fwbebsAvXcA/GuH3hO3nD4hbj/NP93j4JR5X72EMLwTEWwGPziKQyPIhJIbcMzA4kLZlx8Amgu538JeE/r4Sw0nBHmXRgj9EuDcfTTdlFdQRQvpaq/JYjU1LaMy32fXCuj9YYqVeJKPjSXQl6dtS69r2bUHHezs/RTPmcjVmwxC8Nclz6ntLBLo4F1V/evcL629M3z9cL7yo3Cl4twFvOhmvesJ4JvM8ExB2Dm5kuENE2DmAkJW+YCBuRO3rzPcQjYnkD3H6RshtsfDO5HnfqKiTyteqfhdTF1gsPasWEdxauOeNg0lqJ/2espjmu2l7Pi42jnUliZlVvxUf2SJv5VoBCOlb6piqPN9LnAhY/b11nXTPUzlzgjSrlKv6TUSnm4Zl+21qYbelOYtyX1wgO9USOoQp76+W1SJq9bujYfdc3Jv9xrbbtEz7ba3jk83FnPbbJ1U46uRxR8Y7JkpuK+m7uCZ9a9Wvr57BihUrVqxYsWLFOxifeSPiP/zffR7f+Vtv4f/4R++97df/3/6/3sRf/UePjiXhey7x2Tc+i+/+G98NAPDe48/9j/8cvvJ9X/mMa7XinY6XNy/jr/2av4b3bN7zrKuyYsWKE/F8E74VWdtEizDNAXgUJDAFE1ABShWvwq7MN0GswuKwPh6YCDQbEKthA9XOko1lXYv7qdW29vpquVvXuwpuzxS7tj7aHrVCIgWtZsHGOt+cBqdaz4emgCcBpfUlgGy/C+QAN6udsEWttq7y8RaJ3nJQUyttrmltmS3RPN3QtC+3WSMAWBPAsrEgPGf3oMfVbQAYIkllcdW9q1rMkrS2XvW1VAlcE5zZahrzxQizOi0Eye2ChmP1cG5eL5j+ZQPeZHLoyYap+IIot+SZvqNUHudIiOZcveOf8BwC6DAAZ6mtAkv7RMpqT1X5KnGq2/R99I9G9I968JUHHRzcSPB7ygRu7CVA7+5LAH/cIds4+4McM56lHL6RhS87CMk73GHETgji2CdSM8r1tXwAKTewjnVOvHVVKRmFNCX7jOy4uOnl3RvfhuWtzgTDVeWXbwLS/sBkh6yEXxQldrdn+D3DjSSkLiHl7wWyZTbJ75p/V8Em1i/HJJI9nRO3qX0BEBMoUlYlugOnnM2xrJ8jec3qYLudFyAkhZBRT7Q1C4hqs5NnOk5zHJsxhYlAnc/kGgDwpkd8z12EXYew8xhveYSeMCayTstRbL/A6B8Ah7sdxjPg8GJE3EXpkB1PDyE9G4rSRjg4wDHCGRDORBnvDoTuitBdAfd+YsD21StgGEV9qvOdo9wvirbV309p1IYaNy8MsWiNF3ZhTGUH3FIANy14laQ75rSQKxbNr08mBCE5ezegzQbYCOGb1bw6/zNPBLCOc3a+0rroMSS267Fz2VpdFPFyr3EjeXzZAR0x3CCLY0BIbgl2bkp/W5t9RyBeeGfyd4pZIBYZ5PQ9c3mbHFYSwxlqp9xyYllaCFAfB8xtm13b6ntJBayWyDOCNPWbmZo89b9jymJmzvUvyOeqbxZEtf5dkal2X13HWlW7mGO4+p4slLRL3/dFbuE4batgSeRCBVwfu/B9P7tmC3ovdb+tSeKaOG581+T62T5kv29qxHabl8/s3RauXLFixYoVK77I8eh14FM/Brzx6Wddk6cGDQs8s2s/m0s/dTAY34od/kfxAt/4Q/8Ad8//5eKxn/6qX41Xv/Srnko9fvTnfhQ/+BM/iE+99qmnUv6KJ4M/8qV/BN9875txu7u96GK2YsWKdx6eb8K3Jjhb+1vKHQ1kJ2vmrAJWEtOSwfb86osjq3qVcFSitnWu/tQBIcCovFLgW4kCJbO1vBZsoLFuC6PCLXKk5XOTEiGEebCsPs7Wu1b1WCK9QXi31Cl1UDEHswrFpQlEWnKxJkyvC+gb5UoOSNq+ofdi1UK5vvZZYCLInDmvtSggl6sBYS7VtraMU+qu1/LmerYsbQM9fjB9ygayVWlL1fXtMfl9MO1Rq2GtYreu5wnPQ4i0ipxunZf6N1HKl5oUPLMgtrV1rlV6Rkkk5dzg0z0yeByTrXMUssI+XkZ+B8j2c/Ou+EcHdFe7RPYi2zSTcl9efihAiJA+Eb4j4PeMsCGEMwAEuJFABwaNgL8ChjvpnA6IPhFoKbcshSm/r9rjKphoWgcR4+x9tDdJ3oO9L3M/Pw0YFwWuFzYoQaDKJq2jOiOk8dbvI9zgQCMywSS5dyfSmB3nnL15iCVzDCYiWHIppp+eRYmKdA5DlKchKXyt8sqhHLPsvGCVdJXC/ami74/mANd6M7lMCLN3QN9h//IZDnc89rcJ4wVJn7U8Z5QFCf19Rv+I4V9ndI8cDndFec7e5rkmqIIaDCAQnP5Oqa0vRvDgQNEBkeCvgLOffR10uZ+Pt63vgJuQG61vCJaHy9HNSV+gTQ7WpODReaqRO72qsxCUcXatRavm66x/j4C6DnS2E7LXl1bMxTeRHj9bZGW+BdKCGyYCd/LsNb+49gHJ5QuETSL+BwZGmHzk7XeCq8VnR59yM5+8h+Y4npHl1s1Dc+bqM0Cl/GQ5nxZSvzYqnpXfR1F8Cx6Z4+q+wixzXQhT/WuV7dJ1UtlUkbFNW3JDMDcJ3dY1TB2sApnU6cDmabf3s6Aebl2vOP6YCtfCbqsXQ9ptDaeffKz91tD+SA2ivRqzyCp7db8Zm2vCtoX6GoUTikWMUz7gFStWrFixYsVbRxjkx3XHY5FPG4dHwKf+zbO7/ornEg7ALRB+A7b4j/kC+MkfPXr81e0X8MZ7y3ytoe/B/vGphBgjLodLfOJTn8Df+Vd/57HLWfH24Le957fh93zJ73ns80ce8WB8gH3YP8FarVix4jo834TvGIA4JiLMlerIWiEbY/FBpgHN2vquSRLXylc9VK+n5K6SeFahli/Ic4s5q15jBsZUx86XJF4d0LZBIK1DK8hFBHSdEDtWBVGTujf4UOV0b6Rq5Lo+FkrSAPN2zoeka3svCsJoDrTWhMyA83MlSmQJbta30LLeBCaVYiuwxxFwKejmYIhI8zyVzCkURA0SP1+3ksFqMNbVfcOcX9sKqspIyeeWlWgd7G8RDd6noLP2BdPH9G9HAHXTeUUAOhG9Jn8loUEoz9qgUa+WYspsz9bOEe3gdwIRiT1nCCWpFs09ew8KAWpHbttNyZwc/K8IfA4BOByAYRBlWN8B5EGOgYOMPdw5ISpCeoeBnJ+ViUCXB/QPAvrXe8lVqmQZC1HrDlKH4QJZvUtJhM2JAIseQI9s8yzWtYAbCOwY4y0Wu+FkX6y+xKI0Ne2l6kh2iYjxyBaY9TvhIBc82wnRun/KH2jJfrdQEeo7pwrZMYA6L2SS2nfqeAlg89oBh1te1LepWLFeBkCMsGWQF3ISJIt9lHgHkNW/FCgT83HDov6N6Sc9O0qiVRqB7sEg8xGRqKch5NTiyKrta/v1WyDsrgURaLuRcVvnDOekrbtE6NvX2Ms4EG5vEc47PHylw3CLMF4gW5L7y1S0KvqIcLhDGC5kIVXs5e5v/RwJCR+cKNYBgIDuMsIPDApCKNLI4I4QO8JwoWMQcP6ZPfr7h4ns7Ty4kzGSghl7vXn/mcuFTEfaZbrpisBsjGuqEpXjjLqzRk3q6/HHxsd6sVNtO1+da5WqLYvnk0AEd3YGOj8D7XaTjXOuk7yDnBYakc4Z+j1lxw7zzRMuNgjnPcJGxkZ/FTHc8ogdobuKaWELob+UOneXMec695cj3H4s1cNDUvaGaQHSIhk2W/hm2lPbKpG+xTF5DpgT7ITK7pdcSfa2iFqrAE5zfuGIou+/TWFRqYDzsak/ZyIQZh7LVt92nufpPIuK0LYk6cxeuuvSNxkX8/Z1q7qzGrlQf5tvDph529ahKqO+5wzvy7nqmPXz7P4b78gSoVufr9/O9eKGtI/VvtnZb1RD0ns/Pb+cJsUX7iUFietIXDiqetn2qIl3ra0sAHAglNtWrFixYsWKFW8RYQB+/O8CL34A+Og3P+varFhxY3wUHf6feA9eOUl9AnzFP/vv8KU/8o+LbR//d34XPvXV3/DYdfjc/c/hz/3NP4cvPPjCY5ex4vnBx+9/HL/7n/9ufHb/2WddlRUrvqjwfBO+C0RshlXeLp1v/7S2zg2l6tF6AMh2pEv7W1a+ddlL99NS8lZBr6K8Vjl1sKu2lrspDDlmbfyopbhaQD5ecy3aIGmu9wKZ2gqOZnJUL9C4v0zOX1PPVoB+VtaR/dcpw9T6uUF4ZtTkbjztw2xWxk1UhKcEBmND/VOjld+3ebl5Wc2yGyoVPvZ+TwfN62V318R3uVNISCU7IoMcl7mrrRq2XhyQwq1+H7D7/AZXLzHCmRBbzIAq3wCAUzpoJRrFwjn98LRogr1ZqJKODVtOJDCjkL0l0pjY5DvOC1T0mMZ4otsp5eF+1vn/LBHPXBKpzNmtwT8a4A+78lxt52QjXCNbPLOExxlIym1gUqIKK0ycyBaangdFiBVtvQDGAYipDxTEAZdkr1X9Pk0kMqK5UMcuYgkshM3WIZx1GM+9kL1nQOiBzuSfpshZBZ1VnF7KUlW5O4ha3QWx2wakD7tRyHLiZN88MPz9ATRGbDeq/gO6168k9zRwnJCx82wI4JTv9WTbYzvmXEe+L+1XQksXJnGlDq3dEYp53ZXHXYOT7uuasZG8B236/I5z3Q9b4/DS/J4WZnDnwb2Qu1BHBU9wY3rO+4i4lWvpewsGaIxwhwi3H+GuxpKAD8l+vnLhmLVBsRDLbL7u/Wp9d5xy3rG8t3auXirH0UT2Xge7AA4ov09OGT8WCG2gJAMLy+XWokhbhZuqWq6xrq7Lbh53yrd4C6d+6+r8nceTxmLKuswWMdwsmtt/a17hQqncvpem8lqxKnlXrFixYsWKp4/DQ+Bw+axrsWLFjfFN2ODrsMFXoMNmeWl6gc3VI2yuHhXb7v3iv0Xot7NjY9fhCx/8CD53+SZ++jM/DQDYdlv88g/9cnS+AzPjJz/1k/jk5z6JT7/+aRzGw6yMFe8+7OMen3z0SRx4fd4rVrydeL4JX6vsjRXJaVUneqyxEyzsTR0V5Ge2arZ5eW05dZA58pS3zqpmcwDdBOVyMGduP4ukWpJrNJRAM9UQFWqt4n5rIqzOGaZ2zhpMVXu9cZz26bE82TKT3qdVNoylijXb9c2ua4hx2/5Z5aykiTknwATgUg5fS37WSlHmOaljiYCsHgxQe8eZVbElzC0hq9aE9pnZZ9vKQWz7wLGgbB1wLhTeFfHcCijb8xRZgaakayLDW8QCx3bwui6XjGKllfewtoaOTq6r/SE/O56UxvV9AUDfJYXe1P7kXSZfp3qZMmyf0/c5KXtn10nty60c1xWygjiVB2YQe3Cn7wCEaAWywheJ7IAH0Hn4Nw94+UcdPvt1W1yeM8Iu2TIfCCEpSCkIuUhBrJz7R0KwuZHh94Rxh2z5DAhR6cZEAHsGOgY7Bh1cVvWqZTQFIVRkjEr5Zo16j0Yu308A2W1g0wOHTbNtnjhauTtdsgOmpNqt1IQIMVvMujceoru8gCXZiNXGXdsYeYzIRLr+rcrgRLIj/e6S3axuYm/nA4AOY1ab0hBEteWTChkQhaLCku1aRq3uewogHddbJKlzOe8wDQNiv0W4tcFwx+Nwy2F/D1OO48vUFh6JBOdk2YycN5oiw19NCxZiB4wd5UUH0RPGnZBJFKWPu8Hj7r95CPfZ18D76R8DdH4mqt6+sk1jFlW1wjhucIwyx4YwzbXHG2dxF5tFRDqvkXeiYFSrXmCuyKwdJqwjRdpOPuW3DWaMtHN9aNS9UgLPbJ2tMwUw/2ZROJ+snM+AriscEsgq7a3Vrn4b1WVbsnfXI24c4sbJYgBPCD1h88YItw8gZhz8BuNWCF8XgO4S8PuI7s0ruPuX09jvJ7V8bi+OMn/fQNWsyuwpZ28s9uVtdT+o3TaA4vulUNwCxbascjWkf1NxS07mtrrOS/OWozLVRStXr1HizrabNAdKHubzU/nMDDIK3FaO3iIvbquf1u8Dpvenqe5V5a4hTMmSp+kcVtVvK/1Idb/UWuSYd6a+a7c1HHAywarjZ4vkVajTSCO9xLXkcP4ul+ecv020LXQuDFUe5NYzyeWz+TfJvLorVqxYsWLFihUrvjjgAHwXXsA3Y07U3hRf9i//Ib7sX/7D2fbD+W38w//J/xw/9vM/hu/5vu8BALx8+2X8he/4C7h9dhsA8Ff/8V/FD3/yh99yHVasWLFixXE834RvjBLw9VMANROtlni15G/az3VuM7O/IINtnt76+FrlVxOFCg3UhTiRus6V+4CSMKwDqswADCkQquBRoSpMf9sgsl6zIDKNBaBeY0EhoDZ9E2FtFG0t+0pDFOeAopvKaqpGoiuDUjlAjokQzSQiioDiREKaoDnH+XPIN9QIll8He469dxPglboY8lSPaykkNcBq7y0/bxN89g7Zc3ZWRlX/uo10m0dJ5NWKw5aauSYS8j1ReYwNkodg2nkKclOLvK6I3GuJjvodbOWZlguerubJdbf1qy0hq7K8m3LiLSiKmEiCzUHee3d1wOYzAf2DDfYDIWwZzqe8vyQEmhsJsWOM50D/gCar3NQmaj0cLQfBQmJODK/8ziC5NSfkZOwIsZ/IPvZCLNtbL/ufGctSoHmROHrSsMF8884SpzHUWj6nY9g7IVwzIY+sfo7aNomMtLliY2eIXSCpoZXMTEOPl+PYp9zCmm82YlIH23qbMZZCEELa5I0vlaRKmlBhyflUYdqOQgS7CIxR+gsR4p0zhPMOw60OhwuH4YIwnnFSMosy1x0YTnNOdyRtDUCdoZgIsRdFpx+A8YwQN0BM6wakHcyChEhwB0b/pXewvdii/+RnpI7ey+IPY6VKkY0ytCKv0zOgRGCf1h5uPo4BBUFYYImYbx3bIvLNuJqHGmsprBa/x+pr63fE9lm2tXuV2/Sg3TbZ3ruJ4AVm83Nu62MKxzGAvEfsPcLWI+ycKLwHRn8/kXUbh3HrMdzyCFuC34vqe/OFA/zDvZC9ep1OF+3E8puBWUiv+vkX99xW7Lag1tkcwpz0bdkzN4jM4tLpm4c5kbPUtYlehZvIVkv8zghbs4Ag20FrrmFLctK8fkX7VTnt83EnKMabSmB1ZwGKfL11/VtWxDn3MJCJUrVyzscau+MMa61cEbaz4+Tkqa/UCtwYp+9kO37r4o66EarFkPn3ul7TzZbn1/Wry7HkvSF7mVksnhtzI5IzUfG87WLQGE//JlqxYsWKFStWXI+HXwA+8QPAKx8D7r7vWddmxYqj+Bbs8Ptwjo+hBz2BVYBLJXSHK3zNf/c38MLDL+BrcA8A8PCqw1/5+9+Lg+/AYPzs53/2LV9/xduDX/fCr8Mf+7I/hl/7wq99rPMDB/yXn/gv8UOv/xBGHq8/YcWKFU8Uzzfhq8SOKn01XO5NEEUDJiFKkLkOEFnCtN5mCA8bAKXAE1kHLAeArfrTQgkUINUlTupURU3GZtWiIa/tsRocrxVctZrXKnLGcVL2qmWiJYjrAJElYlRtUQU3Z22YgpNLFnR1zrKZmkQDmxbHbLE9tcneGsfUdC3SvgWjQCqVrQuB/2YwPj37Pj0bckAY53V0fn5P1hp06b7qnMF6DTYKlFYbHyPCLUGiKqv0u1gfo1DRApjVswhQYwoMX5ezd4bWM7IK39m+sh45h+8xW836fQOknx3tX0gqUXl3aYigcIXu8kW4AzCeMyIh54rVnLBwQNxFhK2HG4WUzcrKRFTmdCss5CQtVENzAGebXZfuJZGOyttTTe4CMnaZgolEGcY6TjxtHHk/2TnAQVTJUrmp3lHIXlWWWhtnyg2i5SCRsuW1pM2ENBdimKd2T9OM2DyXxC276p9PEcl9YnpvVfFYwCrlnhbIzcuPibWOERQjGLIwJOw6jGcdxp1D2BLChiZFc7oHFwB3AMJW+pYbysUJgBDBjhgcgNgDYWf2W65iI2V6T7h60QPYov+lXurX+YKIlIsYe/L0dwHv0uIhd7qdM3AaSdiyaG7hVBt9e01LBGfVadU3q+2Z9D1GMC2h70XZq+1rvw8A02fNN4ddWFZ/O4UgNs29R+wlF7MsEmC4QwB3DrFzGC6E7I1dUvYeGP7+Hu7RFXB5JfWyz3wc020ZFWrVXvN2lXdW22fJmpmjIRzz38UB5e+WmD8yTxUkp3OZtJwRq/rNk5XASuZVi6hqy+hT+3WjHzZtkhvfsk174VPKyvUsvxWPwi4krK7VtDBe6uM671ui1263xKpROufS6nKPLIBkLccqf+t5tK7XUjmKRnvaPMuw/aqFhp10vsbbMW+vWLFixYoVXyw4PAQ++wng7vtXwnfFOx5fjR7fgVtP/Tp+HPAlP/HD+BIAvyZd7+eGEX/m4/8Ir9UiihXveHz4/MP4w1/6hx/r3EfhEd4Y3sDf+vTfwj9/458/4ZqtWLHiFDzfhK+SlUldkoORIU5Byc4DIU5BFUsSE022zZBgdFaKKVEDsVwkteS0hKqqdTXIUiuLNe6i6li9fmH9G6f9RT6/dF82WKbBttHcX20JF0IZdLJkcR14s/XVNhinlTdUB82scjJtI++Lc6ZmngftChWIWurWFsBAPs7aJOageJ2j155nzhXrYt3WsNfTv8lN+yFBwEkd0SCNreWzfaYcJnWxLT/bgmufsiQxpT5sAudK9trAMhjQFVFdNx1rlbtKrrbsQ61iTM+xz0LvZWx8hB2zmVYlsQmKk94TkPub2IDPg791MJmMUn+yUSyD20UgXQlIRWshRwq2c4hSfl+do/VaYk0VaumsiyoAcJ8UQIGn9k0qSTgH7sXS1zGDKYBixNkXQs6Jyh0jnAHuIMTI6BhwgLtyOc8vmVdLiUxW0hETqUsjCTHZMRBoIoODqDJjJyrfPP4kRZDmHFYL4pzDXBfHRAZ3yfp1swFf7VEooJ8gyHtRZgLTe9N3yXI6KZ/6buqzlMajYUz5lSP4cIDfB8l/HOR+KBKYkjrX8aTQTUS4zg6FrfZIWSXsmcABGLoo7Ts4ZGU1UjlkyN5EIHAaXylEIS2dm1IQME+LkCj18aelwEpkfV5oZOefmBSzrIStQzjzCLvScrl/UxS6YcsYbhFiT+geMuKGhPC9kuLGDUApX+/+RQIFwubNRL7pMJyU15wIdH8A3AB0l4zYA4fbukCJwZt+Gt/THFykXLDjs1Xdx4ijhGCNXI6QepZQBfxEHKdxeVKbVoRtPV4es8k/Yodfk441cT0jsu2CoOuIHeflXdtuQH0/fUsAJckrG5r9kr3LfTif13Xg3Rb7F7cYLhxiB5x9LsCNDO4dwsYh7BwevuLgAuD3wOZ+xOb+APfGAylja6zjQyi/6/R7iI+oFS0hfaS91Kbbkr2ZFG4R/2ZxU00SS5tWFsr2+0bnHiD3CbuwLX8rkZt+HxZWQLvSLcWmPMj3BtPvkuW4XThHfVfOgancFjIRbWzI6+OL+iRiU1W66u6SYZSwpMfp9+kw5LKvzQ2sbdf4nrDXLtKW6PV1/h7HqX520VO94LPV/1vH2T5RL8Co3YD0O1MVzm5S5OY2sfdkLKKnbTF/I+X26rvmAkmCrwaVFStWrFixYsWKFStWrHg6+G9+/r/Bd3/iu/G5/eeedVVWrPiixfNN+AJzEs8GboAcXC+UrS1Vb12GKZvikWBQ/fssWMSFzd2UZ9bsd5jfR12uc4Y8nAc0F2Hv16oMasVB3RZaL7O/UEJo2aaMOkjXVH84KgKcUy46yanLzO2Aa1GwqXcm7I4Ea+3+Y1CCa+nS19llLqhZ58dV/bBQRl937zxd4zpke+QjxzSf+1Iw/ZiiqrGvFURWIqVVlLmnTPaSg+YgPqomymW06mEWaVgF0YmWnxl1EDf3qRR81mBsUs8SCHAM7lxW0XYPA7avOyFhnZC1sUuq1KQ0VetmJcSsW/NkH4y8HCITwWY/MTIpDEhZnBcG8JR3FZK/l5jB0fRJqn73Tkhfd7gRj/ZEoUSqKsKVZCXZCiARIIaMtY/YHJbV0nYboVBBc6wesR7vGRgJxWCYiX59/mmnEthWQalF1vbOTwu6OCPnX28cEyLQe8k7mghsEBA7JDvrVFSc+iaril3TYKftjnna5pDVnHmhAiuxDoBE4avH+X0af3P70UTkJkUeFYS1WfCk42rLBeMYGh26VoXOFKJ28ct1qMfqU8edY2Ry69gTQd6DdltQ1+Xcvdn9pP7OKU488s0TGXy2BZ/1iNvSEUVsuynbeE/5soH+4Qj/5qFYhJfLDAvz7TEr5+LYCG7luQduNvbfdJ4ApsVQNzl+aVtN6N5EqVlbirvym+1oWXaebNVPv3OMgrnGktX0bJ6+brHLkmPHKbBzv8GMVG4qnxe+kev+r+TyW120s3T+gtI4u6I0tk9l3qC/rFixYsWKFStuhvufA7oN8MIHAf82h1b7HfDyVwAPPg9cvfn2XnvFc4FbIHwLdvha9M+sDucgfDvO8CMY8N/j8MzqseJ0bN0W3/qeb8U3vviNNz73jeEN/L3P/z384Bd+EL909UtPoXYrVqw4Fc834VuTaDXZywwaw2QJWStfK4iqxQQTbXC+87J/GKfAuSVPtQ6qLlZFhSX37E9xDw4zW92aqLUqhULlWZHCrfxk9r6tCsHaRetlnQM3cqMqKctJmQAgH5cDZykgn9teFQyZ7OBS6eukPhRCssebKxOg22OY6l/YyoqCpVaVFlAlr1R6vl/VUSECCClCbQikOm8yMJH4dv8pgdilY4uFCEZFq+eEdC1lb+u8uZTaYEYupHvnKnCZyD8+DJMqV5W1eqij64kGhb2untN1yKosze2rz4kMYaKKbqve1XvMgfOQ+3ah5CkCm0ZtZu/f9MUZcn5ctUZdCLgq4RwjAJ8IsemZsapOWcg+TkpOIgJrLsA9YfPqI7iww+sfO8NIQOwZvGFEx0mRSqBB+0j6nyF5p3oLCecOENJNyVpDUOpzFFJZlJhZcRojeLNJRDRPRJohLW37wDlg0wOXj0F+nArtH9q2+f3H9O55J+rkpIZODGPmYwEZx0VBypMVcSZ3qSDQ2UtRNq8vIOeCRR2dz9fu00XwQELoU3o+uc5usmyOEBcIdtM4YftgkTudsBTUf6sglxS+3ovtdE2kpXky+h3iplSBhR1hPBMLcjcCfp/ePS+EtQsMOiC3neTjFcWuG4DYA4O6R2kbR8APiZhnpPzSwHgObN4gdJeaozedZlwIaD/KHGznVJuDM+Wq5BDnY2ELs0Uc0zNYslU+0tDT7y2yTseahhJ0dv5CTl6bV3iyc66UztdVs+9A52fA2Q7ceemjY0hK9Ma9pu8M7qS/zhbAjTInxbvnGO5sMO6cLHiJbaLXjYA6evWvPoJ79c3yGSrGsfxmSdbGVgE5v7nqHePJ8SSrcls5j/PCsQXVtSFwaWFB1CwvrlHh1nNPkae2um9KfT0fa6vU+kZqWEznOsD87ae8uUV5db804wMlZwJWxay9B5hvu1zelB/4xjbQhjCtLbFn37laP/sutWBTo0AJ0vSN3PeTc8fSQkjnpm9Ou93agAfJXS1KZzf1ZbVgrr/Tze+Fy4m1nNb7tsfpAjh1crFtZb/LtW+Ze16xYsWKFStWPCV8+t8An/+3wNf9+28/4XtxD/jYbwZ+5v8HfOrH395rr3gu8D54/GW8hFtPIG/v4+JlePxfcA9/GQ/xx/GFZ1aPFafjTncHf/FX/UV8yfZLbnzuL179Ir7jh78Dj8Kjp1CzFStW3ATPN+HrjUVmDQ2G2CB7pV6jVkDYHJPtnZHIE+Yyt1wLvWlSqggpvXZ9fosE1OPqIKi9Pw0Q2eCQDY61FAytwFZL2aPtFsIUMKqDSrnYFJwrrHLLIGJxnDcRzGgCrjXZlhUkhJw3UW2Klx6BbS8lholMgFfvTy0wY3nPCt1fqK8roj4pH4ttRd2rMhcCoFLXRtBfy04BPXQ0HWfbSlW51E3qvSbxbWwZ0/n5WXBM1oB+Chy3yM+Y6rJkI22J9boKlrBuoO4rFBL5ni2ffbG/Orn8nblU9qqlef3OK9ls1UwNy2IeR9BhyAFcUcTaZwBhDtM+d1VZchKBtz1ojPCPRnSPEkGWlJTavdkx0APYKxGdthvCJP+NRAYQktKSwEl5yg6gUck5Rky5WKe8inF6X3NQfGFs07Gw69p99wmBQwSNo1m0QkJE6/PUMSXGTKwDSH3RFsRwI8MFEoMHF3PbqU0zMaB5lqfzpF25w6RATapU2Z/6Yh5f0/8iQIcxj8k0mP5jbYeZcn55ioVhvYw3S2P9W4TYcfdpzsP0bgC5rdmLSs8NUdomLRIIO8m9K/WX//l9Iu0S2U0E7F6ThjxcubTAIJG/I7B9kxF2QuqGLbLSF5BjwlauMZ4z+vsENwI0hjwHis04y/PWthxGgI31O1D2XR3bnzRsTnSsdp4cAAEAAElEQVRVcLbI3SNk8yyP62xBTqnsbeYh5lgOU60c7zWI4LZb0NlO7Nn1fU9kL9hYNFvFrT6HtHgu2zmPAdgfpN/2HfYvn2E8d4hK+us7BHnm45lD6MWmvn/E2L02gh7tJ3JKbc/tQh5ntinppYR+616XVJgwYzzClLtdldynLGzKY1/1nibb5Gb6Cv1+qZ4hEZXpLBSRS0vmxTpMx88VvIbUtXWy12603WyburFU3xL1tx9V+3P5FZHcvEZxL/H4fnPcsfLy9epUJ3afXQhZY5brPM73mcWVOT+ztoP9zm4tyDxSd5i6z9otpMlrqZ7A1M+O/RtlxYoVK1asWPHuwTrnrzgB9AwJ33fC9Vc8Hq5Ns7NixYp3NJ6iXOttQIs8tbsL1aEQvKSWpsdsAVtEKVeBlKVjbJC0Ps4SmK2AnpZRX8+WV+UpnakcT7kXoK2QcVMOuZkKSbdZRcKs+g3b3UJt3DhHg3ynEkk2MN5ox2JSskR/VoNVdWiR7PnvhdejRSTUOe5q1GTAieRAWbcFa8X6OHuN68q296jlU9Wu9f0eq0Nrn613q151wFov23perXfncT9EGio6WrDZ5aRSLsaUKD+ZeDTNRDHKT63YiRF0GOGvILl7g5CLiIn4pYnMtWmF8+9kfoBsrUtIJKVaDbtEZKdzohcCr1hcEvUejgSJ7T6z4OOpQHMt189cyZ1CudcgdvL7nogm22b5PGS76/y72QcYEr0GIzHC9TaAhkSaRZb6ah+vx3Nb/+vG7icFValV4OK9M0Rb5Ezaxg5gtRxXslz7bCKG2QF+z+guI/pHnJSdqdgR6B8y/J6nc1ASgbED4oYRzoWYdyOXqRgSqH7+rUUtFjexXX7a/5ipSb8lQnqpvq256KZ9hxxok/L2dr7x3izMk+a4/G6qkjpGwDvwboPhwmHciqJXbOan/s1ECL3kfnYj0D+K2Ly2Bw2jjPNp7tX8zMV3T56TzAKok5+rm36e0CKAWV5aRW6bt/BOax2PzN+t6y+Ny7TwvXbKOL50boYhk5eI2mvrZVCXsXTuSaRwpQo+ds5R4rWFenFZ9U0+q4f+HLN7bpHK9f76B2VfKJ7DU3KLWLFixYoVK1asWPF84CU4vAL/zKnWEYxPIeB1vPV/h614+nixfxHv374fvl7kfA2YGZ/bfw6f2X9mdRhaseIdgudb4RsisszFEqyOgEjGZpWTXWGy5BunQDHPCKrynKLsfIgGNaugil3Zv0ROKLIyowq617DKFmtbmeqRLe9swF6tEC303GtUZFQFs4gIDGMdlxRVtOmLe50pfkNSjJr9qiYtLP+SsoY6P9k6xwBhFtwU1K8D3hyBkUXZZEnCWu2t7ayEaUthmo8x6lT9vyp1AVEgMZdFjGMiNE1wVi23HVX202YbOal7DNP2GuM41c8n71lr36zw6ZhxnCxx6+fMk8olX0vvN/erikQxSiHy6XiP+TPJuXb13QmT6rg+zv6tMCpyyXs72bkWt5BVLgZql0wkpGzzXasWCeTtk43nzKbTqgkB8DCKnXmMidCLYn/uJyIXEeAujTFBxgIao9hzJmUl7QdgDNi+Lra14znAUVSMTAAFgtuLtTM4kWupGprrtLi1fuqfci4Qz8TKOG4Y/pImW2KgPcZ0PpPWpK4B1t5Z26Hzb0sgmZNzA/de1LJWjRVikYuWIWO9jjNAIgYt+R4ITCxDu5KWaoHNiZwkQ2Ka/LPRM9xIk4JaFdgO2bbWBRbF6Zj6n5JptVJR66/EVrEYKFxPYD4uvAecTyreidTLal8lT2OXt4ctYf+iqHLBQPeA4A8QC/G0yGD7OmO4BQy3CA/f69HtGf0jma9iR9i8rtbalBcxdFeA2wtBPJ7JcXEDhB0Dt0e4waF/EKexBMg2w2TffW3Pw4DspKHHxwiMI3isVPZLqJXBp1rY6zwRMI1/S5a7S2TgEgFZb0/1mtnO631fR2SS2HrT+ZlY2eq5aZ8sGjGOCJYQtlazuojl8kpOdQ7jKy/gcG+HsBFCN/SAH+TdiP3UlmEr/ens1Yjtq3v4X/icLCLZbIrnjdHY5+pYpPVI/7/22eb5HpP1deO5kvfHiffGQi7maf6TbxpXfP9YFXhtraxlsXX/qFW6zdspSb1M9Bnr50JZ21L+5vo3SGTvZf485kJyrG7pfeSWGrixuKvlEFOUmdJBcAiz/MAtl5lC1VsvZLCwxGut+pU/pvGwnuuK1C2mj/Z9+Y7Yb4fieyrmcsjLIoTcjxuEsFpFA8j/LxwNrJrbXl/tpe0723cgena521asWLFixYoVK1a8vfg/4EX8Fuxw/owp388g4Lfis/j0Eae/Fe8cfNfHvgu/7wO/Dy/0L9zoPAbjO3/kO/EPXv0HuIyXT6dyK1asuBGeb8J3CS0lqSUuGgEhVa4Uxy0cK2RwReiepDqoJtvIZZA42+QakleD8jXRZa2ZW2qESh1V1K/OPWwDTa220eCRDSIuqBVaAc58rm9YCWqgvNnmR5S0lPxYOQIwuWtb+W/LCjb+NueqGkhxraK2cawlAlrlHMsn3KqnDQzbAHQd0M15fqsAq55XE7B12XXdFojXjJYFN0xfbh23QKacbDO5VBX7DtZ5rM018rFmsUFRTu5HDWLG5uSLmBYCXFfHmEhIo6TbPIgYd04IXT+RjmWFhVhj8ztgSF/iTDxCiUwQmEQpKXluCdHzVLjaUBZWwzreAAw3C7CnxpvGmooMf+KoHRIKa27Zx0QFqWvVgFlxTZjY8mptjap87dsipPE0JBSq6rRvamwphKKqtBuLg4iShbNp56W5onYXeIIgIiEYWkruYpwRsn288GL/nQhtYsqKaWIgdKkLaEpU5eZICPGwSfl43wRcSIpdIsRO/gaQbaPZQxYndIDroxDoh5jbg227tCyL7Xyk/TIRrDX59MTRGsdbpK/iGJlc5Q6e5Q1upTzIJ1z/LlLXyyKtrpPFFHbBgV2cUPfBur9aArbvEe/ewnhrg7DTBSMMPxDcwHCH6d2LHaUFLcDm9RH+4QEcoxB7pi40mkU7NXmXiLaT5gRm6b9qK2xyHxfQeRM4/nxushDAzNH1Ap3m8RZFzuBlUvSolfGxay19zxxTnzZI2hujYe+saJa7RNYq1Oq/RmvuV9vl1mKlytq+CfteFIv3qu/nVn3seXo8KSFv2vzY9TG1UXHPsVL0HlUQs7x8K1asWLFixYonDw7A538GuHgJeOHmOS9XrHgauAOHezdUaT4NBACvIuIB3sK/JVY8dXxo9yH8lvf8Fnzt3a/FS5uXbnw+g/H68DpeG157CrVbsWLF4+DdQfjWAUmrCDMkrwblufPICt4cJNZzaLItbAXGrfJEiYikZs3blaSoA0FW2arXi2Y7jLqgM49G61crfIF5kKgVsK3rXd0P2+BZTbRosSGUKhV7n3Vg3fuSTMqnzIP1SvQVOediFdzWYLdVLthAqapeOU4KwBbqgHkO4MaJrPSp/hq4rRXkNTQwq8+MnKj1lFD0fn5uTRTWJMGSElbLs2qxrKplFKRAYc+sBRgl71L7ZPtlP51Sq8r0OnUAud5mj8v3FufkhfdH8wTmyybSqlC5AMvKXmC+uAFI+T9jIlamQH5Wzy0EoDkYdS+ntyECap88XROZFGaiguxVR4Hd5w4Imy0ejQ6xF8tcVlLXAexEAYxEBsees1KXvXmnHITYGCHHWpLSAbETUnLK7Wzaw5JkLm1zAI8A2dUKSr55J0oh709XT94EzqEmJFhzGR6GkgR0yItu2NbPuUzQanuquhfE6kIszygzu1U94kQIazmSJ7kiuh1AIeWYHcYpB6nWPSntyXHOOQtgWlykDhSAHPeUcvhKflQ/JwQsCQEATlTVVy96jGcAIuAGuX+XlOZq9YxOcu8CovqV/YzoCeM5YbgN9A8gQ+rAYOcQe0Oim/7OHcB9hO8CKADuIOo69qk/pjoSj9N8WxMglpi0uUevI6lmC4BOVLC3nAJsyoYl1IuKaiIxuVAo6VuQlNmW+Ob/WKbdFrTdiJq/odSn9E3CfTf9XSyiMd8RQfIr860zXH7oNoLm5mWABoBiRP9Q8kGHnUPoHcJW2sQNwPbT90GPruT1yu4bJGWPRumu30BK9IYIHsYnp4QnGVu4no/qb5B6rjCkbDFPVfMqhwBiMnMqymOrxWmUlNYAZIyNI/KCtkb5U111bqm24wSSVo+rnVESTsm/y8x5kdDSwi1A7qlFStYLCin1haKcJbI2zV9s1bqt72Orwq2J2tY32lS5cgFCbLx/qga24/cwJCVvUk5X39OSIqIsk3TBkpmjcxsMg9xDrepNxxER0Hfl95dZJMrM4nywYsWKFStWrHjyCAPwb/8p8PKHgbvvX/6uWLFixYp3KL7+7tfjv/7V//X1i4gbWC2cV6x4Z+L5JnxtIMaqY606VUleR5N9cx34IBN0NOVaC8z8uz1Hr9P56Tx7faucsX+7xMYAlYrXBKCAUpFVBeZnBPQSDKGQoQFTDdJZBZ1FHVjVYJODKHNSGTN7vsMA8hKsKgKJ1gq4DkjW5GEdJE3qVXaYqzNt4FRvk+Pxj+0ltRglJZyStkBSIFVkqiIfo33Akp6mX7TUNVaRZu+jtRLPlmdJ3qSczttbsXB7H8BE/tU5AvW+lEBfggbEYZ5nC3o/9X23yGJVE+fgd3oHbd8yfWmuFG8ocOyxIVSWl8bGmfU9IHA0JH8LlnQEprYkAjoCxmR5SgTuhbDCEIQsROIWQ0T32iU2tzr4vRBhUVXuJGpHGkm6cNSTJqLXjZTIMtM2HSalKhMYYuuMXpp63BHGHaaxigjsfUGcqi01Mctxmou20/GVgK4DbTZPh/DNN8PAGETtp+o/be8Q8/jHHpilgnFOxvo0PJFVYiP9rj/E+P+z9+/BtiTrXSD2+zJrrbUf55w+/bjd914JSQgBF3T1BEkXZBgQGsSMwmMeY0/MMIxfM4Gx5DAMMMx4HBhiHGgmmDCGiXCYIDDCD2CsMWYQjGVJxogBSQSIp5GQEEgIPfrevn27T/c5Z++1qio///Hll/llVtbae59Hnz7d+buxb69VqyorKysrs873y9/vAwNuiuQjGUISejwlopN0yNCEtkSYdyy2x0B8lvK4Q+OUr6delMRc5KRtqg+fBJwX4qy2mSaTL1Wrv/WYzgccblEmZyMfHqKjPLl46fERmWO/2r4rBPfFK3Lt23vA5qGQUO9+noebgN1bDB4Ibmawl/Z0phsxA/4A+Isx1l0IdG0nsVRnYAhCoAPlwigtJObbvlLhuzI/qCpU78lCccshk7w1WpbNhSsFrlYBV3XhxfxwA5DMabTdSO5eTf/gXUGcsyPADVWO8pCt3bVdtxvw2QnGj7+A6XTAfOrgRobfB8w7l54hJlnQwI4wbwmHW4TNA3E2oIeX8nxvNmWf1PHd3lNNe8EyHvE0Xf9Z4SDjufmerHEDA5iXBDxg3rvMgjeb8kGxNk+qmtXO1y1U52TkOZHnOc/5rcVgWgRROk4J1eKdy9hK5/eEqs4hrCqRjymJr3LkWJy3fletbKDJLpip963tjnVOt5bH182Ra79rPtxj9s31u7Z99weyRXpNNJNpb5N3Nz2DFYQ4X2nfY4uBQpCFUSGXUb5brbRpR0dHR0dHR0dHR8eHGuf+HH/0k38UX37nyx+5jL/06b+EP/7P/zj+4Tv/8AnWrKOj43HxfBO+NRzlVe0tm0JDClEdNLxiJUtz/xbpdJ1ta3nStK7XXVXTLPtIUKcOQF0D1kouBRe1rEpB1VR3XMcK8UgAN1tEV2U+Kdh7UdnlrcKquYt6XXHvj+XHu+41JVWvISavs6KKI/O1dn/SggklY69x31r1ry2ibaBc91GVbmIy16/9mGJo5YC2Gggtktghq7fsYoPGc9Uq76rnNKlmOTOJLAsK6HKP4eIM7rCBm0hy8RbHCaFrz8EOUFtdQvlMlM9H/IuWzuwBHlhsVQefxzKHSF4DalFNa9cdxyUahiXJ9gRR3O/kInCjAuSa9Bg294gpEbtps5KahKgGRqHuXTuFlCELUNgh95la1b22MEGvz/73BnkzrwWKJFBrbPPLc4WtR9hEstz0tXQFJMQvzZH8jt+DSQ0570TF6S8Z/sCYdpKnentP8vdOJxyPJSyU1ZDFBzSuELU+LjRJbR2A7aYcq2ti/WmilT7ALkZqjWtXqX+v+u2m10Siykd8bmuSP5VJ9oGooKQrEXi3BZ9usb+7QRgisTlLigvacL6lJCQy+zjkDYA/MIaHsyHrDYllF8XVc4htg3k+3k71wp8n8a5w1E67sQjMojUftvapr3XFfrlJBj7pceMpoXbmWMAqYOtFhC0ERvKTv25u+WpuT++3qcwG+XtFOWnOavxbo1n31jnM/kfbKJhzVu/xq8rqm75DdXR0dHR0dHR0dHR8YHHqTvHRk4+CQLgz3ME3feSb8Pmnn//I5f3kxU/iL3/mLz/BGnZ0dDwJPN+EbwiAY1GCAWJHaAkfIvDWWLnFACPtRUHEJlDGgygEKLB8RlRotVb3W0Q1WlJQqZ1xK9DvXLb2JFpXfca6LHIu2jJVYbfZLI9PqlmjYuWqrCofWqqftX4mKpUTzKLCABLZy9HOmohE/aeKoWlCtkVeUS7r50QEVjaXlpiwit9kbWmCsLXlsKNSoZzy6lVWtZ5yeXOI5Bwt70utCK7zLqvax5Gop1SxlALs1f51oHhh1YwyWGyvRdW1dn8te6FUMsdqn6ltl3VbJHt5nkWdVJO+9r7UbaNl6nW4UO6naqWoXCLyBQG8OEcjCG4Dl4XVZEOxlJRrySox9+2s8o1ltRZetBDz+NI0izRxcOAg5J4QiHLfOJBYXAZhUsPWC4k4BcAzCF4I3wcjTj+7w7wj0Alkf88IW1EQOlBSnyKSssRISl8yw4wLhrA8EDAAvMvXEQYgbAE+2wH7KdmySjlxv7kiK217qmXkbluq/p4wOJG89nmnnAuXGTTPsJI09pQVyJOMr0wE9gweGDST2DoDMSetHkig+FwykFl02x0HzkNnACgQOGi9IpG+ceCTLegwCplv2y8uLiqINg3uD14cKMZp+ew+CZATK986z7sXFTRI0hyIutNhvLPB/o6Hv2SELWHeAn4vhwQv/Sdshbx1IxA2ogSWxQSZCN69zdi9I/bMTA6IaRJoFtJX1J+iOp9PtW0tC49M6E5BnjOKy0OYpb2CGTu0n7jIvh/G67XPChlvFaTNXLo1GoQbz3M+1qQuWNQ55EUnrTLK8bfxvB1xNgAAd7ID3b4F2oqdMzZDmpvSe1NyF8guKKRKeid9mzce8/kO452NWDhvRdm7vTchbB140FzWDHcICDuxcQ6DEPtuBE4/c8DmzQd57AlO3AMSSRbHbXVqURXyPIPHETiMN3cWqOavpjp4jbivf6/J2xYRXLlW1L8RRcteTc9Q79sihluErrVx1s/quFHVP51Pr2+a0md9n7O2yrptkTpDy4sDJLUWDxhb5lrta98lCxtoVV1bW2ZzXKrXJrvKAEjvhqxjgvbd1sJGmz/XYDUPsB5j3x3Uuhko0lA0nQTsO7iey3sUVsxAfhZqslvP58V+Pdn9131zRSmMORPH+g701FIGdHR0dHR0dHR0dHQ8N/i6F78Of/5r/jwo/u/2cPtZV6mjo+Mp4PkmfNXas1Zc2pX2NhBq7J0pqMqXC+I3oV6tX6tvC1WM+V4RposyrYVzCkzFbQpL9tprsOdey8lo62uPWasTUAaNbG5PrcsxYqewXc6Br5SPTklfGHVKrSKqCdxWjrzaUvMYasvNIkfiEaKqpdxttZdVHernIo+jKW9N3V3Xy57/GOwxLSVUSy1UE+V1W1rLUWUO7e96jpvcA3veVh5Cd+T4KsBOZtc653MRsA3FjkK2XVMtX+bKPNJH5hmA5NLTXLLJRtvH4xzAiFa0M6JaMj+PTEjB7+39ADf6rJpMfQdR5QtYmWUif1Ndq+0c22smsCXQosounG3hZwaN00JJu6pY1j79tJSoLdSq1PScYTkG67aU6xUmDzvE+pqQmV6Wz9xoR0DbXPZT6+KyzXUukO3ESGRvqpepN6dFK9X1KDFcPCdPDuRISJk693uxWCK2m89t50ZpMxooktyA2wPjgKhElzZ3zGIf7oHpjEATywIFJ2SwI7FuZg9Z1BCESJa6RAI5KoYxE0JwcBNAU4jzjjxDRY55JQPXctczQxdm3Kyxln16QfauYeH+4Yrc4CkVgd23smle5OuN5VyJtTkdAA1D+ivSAMymfTgqruNclXL3QhYkYPDg3Qa88Qg7HxcJAG6UfecTJ88YCbmbaszI5ULWx7j9BLo8rF+HbZf6muZwtUV3cfGteduZj613vpUFTXZR1JEyr8SKsn5NzVv8DpTvQ48DU2erKLU5hBfnqeunLh1xPm6pSNeUpbqtULOuPK/N97+WQ02TFA/l5zXl7lp+4LIi5bZ5NsRzQ6luvx9T+15T8dyEuaaF8jvaPJflvQfzdkdHR0dHx4cZF+8Ar/8IcPfzgNMXnnVtOjo6OhJ+5Yu/El9x5ysAAJ+4/QncHe5eO1a6hnvjPXzHz34H/ts3/9snUcWOjo4njOeb8PVOVCsTcvC8FXABJFAZrQQ5KpwoyEp6CVpHVYOjnPfX5u2NZG86rgUNpqb6VWSrDV5NoSSQHSCBdM4KOlt/o1Aucv22iOc6/5gGyDRXrwZ+14JgqmxQFa8NzFX1KgJN1X7CmUTFyBqJtpbP0KpECkVUbMfAWT1bqFqjYmKNPCEXyRxDLieC0cvxVq1rrrWtyI4slJLbSjbb/dbyOtprJyrrYs9pr6W2Hpady4D+Iji7Qn6nc9nApV86rVpFk6lzYcts66RW03o9gRPZlvqSVTLZdrCW1Vq3VluqUqjVf+3ijDp/Xo21xQYNcGDwNAmR6xwKq2GvY4N+BzDFZ2zKCwTYORAxeLcBzYzdWyOGC4/xNoFmXXzCUQUZ82UreRIJxkRIpmtAIi8JkPMlhljPC4QNMJ1v4C5GEHPO3dsaQ+oFJ3P+/rgvhsdASjwTxbyEhqSMpK8S0xTrRsyxXfMzoLmPmQA4BrxZiMG5DYu8vZHLtNbF/hAtr01yX3IcFcPxNwb4ch+JNVfMOWmMsvmndcGRbnORZDpmI/8oIAdstvne6rxiCWhVUjsXCW7GsJffeIAMbRNj84Axn7pk30yB4cZ47R443AHcgbC5LyTveOqwuQgIAyFsGdOZEN/TWbzkSAyzk3Z2ExBGBzexqPXmAHJBum+AnMghL0CyfdA5mas15/S88qwv2ud6/bhU/FYLZOqxI41VZoELB1n40Rp7bXVapK/ue4zoWyGS6PRULK+twnuSOZ2mrPAvSF8lVZ0DthuE0w3C1oM3DmErfduNAE0M9oTxloebhPwNG1kE4Q4yloGRng83Mdx+AvaHXH7LWSG9s1A5hs/z1ere9O7RHsOPEvj2Xtr7uPJuku5r7VqyttgqXeLKfdR579h7Q/3+cex6Wu8pzXk0zjGxnQko1fN6uF0kYt4xLHnbOm+pbA8L1TA7lO4lqNooqlyLOcfO6626XQf2ndi+m7aI3sZCsnQtwDINwlpO4JqABrLq1yDZNa/WXfufeQcv3qFCrrfOi46AG+VG6Ojo6Ojo6LgxHrwJ/NPvB37xr+2Eb0dHx/sKv+ljvwm/5xf8nida5huHN/C7f/h3453pnSdabkdHx5PB8034mqBHAkWbyhjUpsBJvaKkbiJs2dg3a1mWIJ6rwHIIhdowBSSViGVDQh4L7OmxNWZDbtQqU2NpmqzlClWTCUzVSq56uyKWVVvvyU82yJ1JDI42kDT4RAYrQWot/jjZ4uU6FoEtQ/gJIWzKm8THluvArQZZnY+Kw4o4Xc1zGIr7Gi8qkrtTDi5zJEQ0R6ntDwtlbixzQcY2bPOsNS1g2DkqY3Aa2NdrscSClmOVYXrtLUJB92nZN69hzaqyZTdLDjRYstyQSvb89jdUZKEGy+N+JRmcg8DFggMntiPpbtjgam1TvlApKflWKcXIgaxIZ8b6AoXZlBtgSERRO+rnpNh3Lil/KQVipRw6TBjePcCNO1Ag0EwgH/XvxElBzIyCjExKYMP3a85V3U3VvewYGCLnvSVcvrzB5p1BbG9PtuU4AmSC1QaVK3IN3kugusrh/dgIQexHldC1+Ql1WyR40zYSC2oKIfU9Cgx/QL4HyjpFpTQF0zZe9kt5kSMJ6WKbB88lIayfI5GsClYahpIo8fG+T6aNtL6NuWZB9jwJOJJxevBCiE5xHtHnQJ+dWUjS4XJG2BLGMyF2wyCLBCjIQgaObRUGAKeE8Y589peiDGQvfTMM8sfOYTqVz05/n2NbTwBvI+EbCDQCfOElz/T5SVaCsskLO8X2srlfbf8NAZgm8H7/aNa/kfAj71EsOEFFFlqCtx4r6/FZ96ugxK4tt6lgfUSbb/IedHIC2m7Ewtu+owDyvbWIiwi8GTC/fAth4xE2LhK5lN+l4qILjtOkvwxwh4D5RdnH74PYPFNcGKCK4MNU2NQWC88sAZ0uQueUGXw4LMftGmlxnC44KuetRa52sx0wFtytRVsWdp6s0ThGSE9jz+2oXIS1piyuCdpGvYho6ZjSqmvtetI8R56Hcz3l/eEokVrZONsUCoX6t3YiMWgdAyC9A1oL6GI/q661TgARCyeQmsCNY2Cykx6G5T6WrPU+Ec5kt5n2Q22d3FiAma5Pz2uJ37hwjK2FtF6Peb+iYYC6nTQX3sVjOaZAYL7hmNjR0dHR0dHR0dHR0dHR0fFc4vlf8t0ifddgFbVVED5ts4pa+1+F7lMH7O1/689NK0AT4D92jtb2Vr1vamFplRlV/dK22ub2aHnt8xcEcl1mbdN3DEeCoaRk7Vo/sNuv6isaxJeCy3MXQX/TP+p7Uh93ExTEtVGPXRV81v1bn2tcxzrWtsPa+a7CmjrqGsSWBjIXCiKt3orSvP58bRS239X9t5jnkvRVBBR9oSAlq/3I9B06TNHGFknJm1hb2/yR7NXPCxJy7bYQkqUxe8Z0Ei2G57lN6FpVXW2r7MxvTzrfLIDFAoorxsHUxp7K7TOL6pCRG4rL+2AEu/KZKf7p9/hfe1gi9Km8H0C7r9RzTT2/PEmyvAEyQX8AWZVXj2Nx/qAxwI2xr5CQsUr6zltKanMpA5hOAFF0RiI3/unvYQuEDeW2JsDpfhybMy5UoADQKO0atr7oe6yqbzb9NV6bunUAENvfEMDj1FbKLhrohn24Ig+vxNo429h+rfKuC+fjogxXzkdk3EnW3lXiArbpfIPpzGM+cUL6DoSwkbGDnXwOPtrTRxU4BXP/4/NBLNvcQRYViDp0hUxtPQ86D9zU0vm6ONYHjhCUR4skaqtOW04dT1rVf11U83Ax3z7iddfIBOZjzBUr509l2/59HQvkm2xfO2eqm6vGV7f+23qhZT3quhgS/qjNdnHPWu9tN/z3QUdHR0dHR0fH+wRvPQj4xz894sFlf5+5CX4aM/4pRszHFod2fOBx6k7xiVufwMubl591VTo6Ot5jPN8KX465KCsFJVulaa2uTNvkO00aodTAN2fLS81lWwWZa/UgD17sJGvitUUCWKtC5lIR2VIVJpVLKOtQ7+MMSaXlTNMyGGbUvzzNWWFrVAoEpFxutZUebcXTk6dJApvOLfOfxvZUi1XWnMQ24Blt+ngOolCxylbbVnWQl4WQKGwB56zuy+rcxgthYZkc29NTDvqGGeCoNCqsnk0fYpb9FPbaB6NYDRzrbsgLvcaWVbTmf7XKXWstne4jlkHiSo1W1EvVuXWA2SrQWtBz6qXa+2AVw9pOVr00V/vZNmkp5fQyKjW9KmFsoDMpXCqVDhsVDqsiXRWMVukSz5NsKevFDscC8GFGuLiE2+2AcQfaDmAIGUXMWYEICFExxHMXSk6W9hm8qHwf7rG9zzjcJ8wnkLyrM4G9Em+UiOAwIBONlhyu4SBMi2MgENQGOmyA/QuEsPGigAwhqv/MeMlST3YONM/icrA/xLp7GeuY8zgwruTkfBQQleqoaLkv6mjTn/VzVNHyJro0zAE8jqCLEZsHDAquIGXJ5PJV3ShxHOuYRWmqQ5DPvG7iipMtefzuON8Db+6z7qREaoh9Ic5X6Vp1/K9ztj8JRNIPRMA4gUZIn6sU3altmeEvJ/DGwU0egCg43QSAkNS8bhSCFw6Yzxibe4TtPSH83AQMFyzk4ADsX5L8vpt3ci5gv5f2DFspI/jY7jMwPHRgYiF8vaiSeXBgr/fXqECdy/mHOdpjz7MofK/bJ1cWyMg4EV0rHBUqQqvM5TmqQltWzZYctrntjxBo5H0ef2q7/RvAnezk+RwG6ZfVwjBNYaHPFBPJ9viOEU62ePDRjeTdjdbMYSAcbhE2Dxn+wJhjLmaKC11oZmweBLADxlsDgi4QCIA/iHoczOIWYt6BksOKffex7yr2veA6CyQSuV3NifFeKpLal0Pebo9R14mkCq5Vm/peZubFqNJlnaNbxP44SX/S41XtaxSycu2ZeCXvYpkrRLmOibaf6XtQfJflesGLLphokegNIpG8ay66svVN1tCQPr+an9dlQnyRx7eylSY7J2hdbXnp/OVcby2T87VUhKoZCym+4yfnihWylg9jrn+9T8OyeWHlzAyMYxrTFmpgSB9ZlGty9aZFcJV1Pdf//tDxMr5HEd18LOno6Ojo6OjoeNb4f/7gQ/y//s4F/qvf+xF8w5edPOvqPDf4nfgcfhE2+Kt4DbeXSds6PiT4ihe+At/1dd+FM3/2rKvS0dHxHuP5JnwRydtaYVsrb4sDOAU22bvlPp7ax5njU9mq5pts0M8ELovV+zZYxu3AnQXZgCAfJ4Nb9bP7rikNNHAVA76WNF6UfCzYavO5xQBeU2VZBWHZKvrUblDtktXicBG4XQl4+uoai+Cttt8ViqtHUYZapPzBhpwCItGJcpuFq+5ty4LZKjFrS8hmeVUZNdl6HXVbXaealGrlvV1YX5v9lBzhaMcYUAW+cx2pCrBrf6oJ4CZW1Cx6bPP4R1FHcyRUgazk1aYIMaDuCRSJYPYUyRYkJRzNQciy0Z5DK2y+c1TnxVtrlZYACqt53VaQwSQ5N6dzSC5Okpyn7AIwXNEXapKQCLQZxGp1XD/skVCry6xNNlV9kFmU1XXdQoDfB4gHsW7XcbtsPwtxfJYf698X+0eJqhKZTSipddWj9rjjTqvIzRCticu2KWCfAyLQ5QQ/OIC31X5I6k03EtwM2EumwBguIjlI5XFJrR7h94wwAPMJJRVoau8pKoCTdbBL9zPV35CE6Rrs39NUTFpyEA3ytjVuVMfYYznwYoFJkce3Vt9fB0RC9m22yb5bc0br761+QHHhAW834J3HeE4YLgHskY71Y9nXKQB+jLnAnTxuafELKyHM0m/2K/bvx8bywEKw7fePru41Vt0c3FHCfXEMzD1ey6d7zAWjsRCLorK2aXPcglvZz75z6Xd9J7jKglmPmxsL1+r2qc9Tl9E4pnblsOkYiu8tVLbSRJRTmKQ6iZ1ynRuYVub9a2Pt3cCeU0lt+67ceidJ81VjAWgjBUVSvsfrWa9io3664M3UdVGOI3RxR0dHR0dHx3uEz/0UMO2BV38R4N+DcOvdjwMg4DP/BJif4GLs9wmmADy4ZMzPyhnnOcUewEV/AfzQw8Pj3J9jcM899dPR0XFDPP9PfUOxBCAHNlcCJKp+UgUwGeIgBUjr41tlqbLX5kZM52kEgdJxK6S0/e7KQBmmUBKzawHhmFuzUE80QDYAFUzZrVy/6ZpCeSybHG3TFJVlJqjcCgrOMErTxjXYIGoKuDosAupWuZoUyjVJ6YDpkNVuKQDMyzq22qomSovzE4oomlXkqiqozr1nlb5AVGA5IYstwV1c+zUWCNTtoeV4F/toqEh120Z6LwyB21IRu5DryJJvlbzLZdT3R7cfq7/9zTX6fijz9y4D7yGrxZvlm+elChSn/Icc2sreq4jlGGRm56Kq1vR7YoQhKrfGnFOStQ4eoEnq5w4sxIkSZIEAz+BIhOlfYtko/1c5TbJ8SCSICzggbBjjLWDexfaYo8J/NgrGSP6SvXZdTGGfj2EA/BPOCciNPnQMcxCHAbvNSy5wfxnzrUdCUZXR7Hi5wEIRlb3pczxGFNaU1YxOCC1NDSz3rJ4nqDkHsXfZDQKIfRpICvgnBPIe2Ayl8tjMd6rsZUdp0RTtDzKdhrPCMlz7pYv8OqI5guY+BoDNhbT3eEqpf9KM3Ed1mN5LWewRn5lMwLuJ4MYAN8ZnVhdkTSH3R91mSN6kVL1p/4ntkButfGaKnK55Y97WclYoyg5ZIWr2LXLJ6iIhzVVaq1mvo2o19Sfvge0GtNuKSrpyk+B6YZT+pmrzwSNsPKZzeQdyI0Asynd/YCH1Ie9Lbo7PGSPZPNOMaE/PoiplyD3dT9LvnSsWQBVEtM6L2qlCAMYDwsXlzdphDYb0rdW+AEAbM98W+XYb/SrOkRTbc5WUred0i1YqDbu9VhFftUirUs4W9W65fNhz2Do1iNmCaDySXqNVTlFWrcBdez/VZ1ovWRXD9ft+A0Ue4aKe5t127R16znP1os/VeXvNe3Lx/mGf3eJ93lx7rdgNIamRua53tV+qS6GwLusC13gfehppGDo6Ojo6OjqWeOOfAvd+Dnj55783hO/LXwS88HHgrZ/6QBK+HR0d7y8wMwICZn4KKZc6OjqeGJ5/wtfHAGIVAE6BzRjkETWbCTpxtIP2y8BPUuy2iGSFBvOJy8CO/tfaraWgO+XtNvBab9PrmQ3pPM8SZIqERrMu2gZ6zXqtKZiqNpEVwWkCUGrVDIpWzDBBOUOQJrIvBr4IADuTN5BNPrg6IOi9CWr6pMDJ19NQjFqrYw1k2nLs7/a4ujyr5lUiVI8ryP0YiLf3SdXH6d6aayPKVsZFQNKSqV7KmA1RxiznAvK1adBxGHKdrEpYofsp2d0KvKZ77dq2zMpwaXvquVr3g5zsHol08liSw/Z+z9V1AUIaIwcwk2WjXveaoipdDhfBTWw2eXtrsUIj6KtB22SJSA755iEvCmidPzAwTWLNu92AB8r3xY4DMwObyLvaZxPme7xWfzljuIjsF0GYNQjRErwWz0YRCajqUggZCAHpDJHCAO0deMOAl3qxZ8wnwHTqQOen5XXVQfQQhKi241hsYx48aLMBDk9Y3pv6ghkPdXy347T2jcGL5a+zZKxYzLtDlKHa21gPm9FKOAxCCIdttGOlSFba4SASnFk5z9JttNl0wYz3JSmpxIO9//az1mUYFhadj4Nk6VuTvZT/mKKyUyol9R883Cz9yl8C81ZIFzdC+s4Zw+/jPKnZEDSXK0QFOhMDg5CEwclxwUs9hofAvCPs70ZTbQb8gUCTHLt5d4J7sJd7q/O0WvvaBTraH+YARgBNATiMogi9Llpk71WkiC4O4ZDHv3oeMv8tSOOqbHIkpKiSvY+Zo5aGDdz5qSh87WI2tQ1H7K7xN333IU2JMM+gdx9i2G3g9qeSW5whVt4TsLkvC1XYkSxQidc83vIAAW4fn6NBzutmhhsZ7hDgHh6AaZZ6bDTtApcEmy6gsu8bgcHTNe+pIc6L9jbtrvfDWnOvqnjttrpfVBbMpEr+5sKh/I5RuEzYefHYYo/q2MU7lTm2cBOwi86OQef76hotyVsQyYYQXpDUmg5loRSuVKdxrk5jXm1pvaYGtgrgwGAIEVzvVyt+CxLYLm6UH9tEsO6ztqgy1oevuXgwXZ8pOymtrUq38Q5TEO76rp7ayi2vv55LQnxh6Ojo6Ojo6Ojo6OjoeEz8vh/+ffgrb/4VPJgePOuqdHR0rOD5XvJdB1lqrG1vBXCuKus6ZRdBGTJKz5VzXlV+rfIxwfor63JTtMqtf78KV6lQ1wKPmgv2uqjJuFa+w1otetP2b9WtUF4pWXyk7Me5L8eCz9dBi7A8dn/q9m+R5LaMKy3JGyphhQbbiwUV1whGNspbBIRtHr9VK/OGgqZSfa1C7/uxZ5JZ8txyZQ3cukQiUcodkMlEewzFzbViN5K8FKj4LX0MAM0EtdTlqHLlAQgbAm83AFHK3wqgJK7NtbQISmguzicJG2y3/y2syBuBdFs1VU5x3K4EOSCNE1WHiKrFpNCF2W8FZM9V71svpikOvGY7Pan2JAKGQfKlmnMXakr7X3uPZ8k5nKyqXSaRmAD2QNgi5velpKJmL4RX6n+MtEDBdt2wIYRtJNftwoUJ8BeAHwMwVgtigLwIKlR9sR5DHsXW1ZC9dhw4ms+7hqNMmq3NZTZPcMPO+XFB3kUr56zYJ9tuddspqryfdJiwuydW82EAgpeFJ6lfMMMdhMzNynnKn62TeoiE8tSwdI6EbkpZAeRnIBJh3Bp7jqFePPYoWJs7n+R4t2ahfNU+a4RySo1RLSShI/VuOWbc8BqP2jNbGKL2ypQMV6B5vJ33nxbq89a5eW96XXVO4Zp0bp3nGte42r7dBrGjo6Ojo6Oj40OFPRj/ACN+Bk/Yma3jucH9+T7+3jt/D5/ef/qJlvsj938Ef/fe38WMrvLt6Hi/4vkmfAEJDtvACVFpWzjPRsWUwT4q1UJWBHMd7LKBcCV1bBC9JkaAHNi0+RNtMCjZVEb1XCs3nM1Z6OI5hyEHHS3JNM9JIZD+C7QDQ7pNlcLeL9RnNUnQbIs1BFH+clRIp2CjBnWLulSErNpeFpbI8ltSErcClJZ8W7TjutoiqcS0XfUYIlEdp3tnVKDcuA4FuaxIBOTejlMmAZJ61kyIUYmVldZc7m/7B+v9Nf1ou8lqKSD3hVZuPj3fZlgGdbW9x0n+1KbZEBc8TWUg3NarZXcJxGdAyVcq7h/rM+I9ME7Sb8x9XMsPmFQ68c8qrOxfTcSyjhNAVrst1NvVNaz1GzkhWP9ceS7dz11OcJdjzkfqEPNbxjbwHnx2AncI2DyYEwFJc8z1G0lasbsF3Ezy2yRELzHAnsEDi7o37ksxF6obIyEMCBnjAB4Yh3PC9PKtfD2WvJ45EdMc7WHTmGevz91wkcZNkFwNQv7T8dISGNMMGuOfHTPjdbGTa0ZsG2aI5exMRQ5kbVchyaX9UptZcjjId7F0Bji2LTGDQxBHhBDKcSc6B1AkUgGAN0Mi3JWEu1Y+z5s04W4H7LZ5zI8qz2Qnbd0dtK7TDDqM8JdC7IUBmDdA2Eg7qaJ8OgWmE2BzX76zA6YTwnjmcLhFCJ7gJiDspAy/B3ZvE07fIDn2TPohzYC/FHXv8BA4/WyAv38Q9fwcQCFIflhL+uo1THOaaylIX+FxknHqpmAGeV8SvZpnPhKzSs4mktbOVYCQk4agS8fZ7bZsO24eIymvWoilu222oO1WlN3OlYr41h+R9MlpTmM+n5/KQoF3H+Llv/Gz2L4bcPGKw3gu93c6c2APuJGxffuA4eGMsCG4Uaydx3OH6dQlAphJLLppMWeb747k3D6P6frs84OH4MMNbOnqd5RGu9p7SdUc17wnrTQFcS7mqIrGPEu/m2f5Lc516f1HzxHfj1Sha1MVkHd5PlohcK9FlLpqHozqz2Ku0/PZfkVyfhqGfF7zx2zqjkz0FuOWo8V8rPtYZw57Xr1u3VardVvXTDGFQ25jM1e3bJyN/fGVKnr7b4k0duZ37FQffXdOlYrPqb7TmHMvrkVdeqy63S7S8E7snatrqe+jbTee53Rt9btQoSrv6Ojo6Ojo6Oj40OBfYMY34dP4Y3j3WVel4xnhH7zzD/D1f+Pr8Wd/5s8+66p0dHS8x3j+LZ01QGhhA9pXYEHyFkEwSvsk0rilIFKCokUAA6VSI302RFgw+9WWcHZbfeqYq7cINll7Oks4rykJKhLM1rup3qiCcdS0CW5AiczrKFeP5barSUdykZgJOYjWIqKuyre4Wm9lelDex2SFHNu/FRiGkTrZa9K2WCOr0/EGwUHtkIu6WeLVWj1aorW4FuRz1/VK5MWyjcj2xxbs9df22w2LZNI2U7tKlAsDmudrEf7p0nKu33aQeKkAeqwAaFTwpnsQn0Gxto25epnFatY+M0RZHBpzwbrDDH/hE6FYKHI9g2dK4lQAWVUZicd28uK6AaQsmgnTOWH/8g6b15GD8MzSPWwMuzWW6HilixucLxcxPCaS7WWtQq1V+lYF3LqP9SYGYGW5elmAXLPm+dXd1Q32iuGCXZ5DjqrdlAixNv2aOuBJB+Ipjut2LnFYzomWTLSEDIv6NmyAWrXpRkrkL81ISuAQ13Zw7Mbp93i87qskur+MtqQDAxPBTYyTt4S8XyyU0jmwIPNMOyr40VWzBQmYN6ZxdFX9r2MuOZBrjKlRNWzPccwyXq/j6PcaRKCTnSzOGPJipSJXtJKPkVhKNs/OIXzkLuazDebTQfL27mcMn3kHu8+NuD0QHnzUY7wFsHcYLhjDJcNf+mjlHa2MOT5CM+AvGYfblKy+i+uo1dlxG+lijvRsTODDQRbqXAetRXgtC+1W/2i9L9iFXhb18UcWvTTnl5g6obZDLqyYbf8o3hlX+mCVAsOWldIXVO+j7MwcbMuw73O1zbNZvMc2nUWjbjof2+u0/6VqPymjXKhZoPGumt8RQnHs2jhctHnjuKIu1W9aB9Lt9h3anq9YbBdK0teWaReumWtCyO8Lmu4ikeX67Cbyeqn87aRuR0dHR0dHR0eHxQF4JvpeBuO/wkP8TRxwca2AVccTw6/4NcCnfjUACYMdAEyf/Rrg7WdYp46Ojvcczz/h613MxdoIAF8HVXBIyF0pi70J5mjQeQ5ZpRuqIKUl3Gq7tzoIZRU4x+rUIjRaBHOLDDGqgSLwG1f7FzWqzsEs+TDhXJHXNyEG/zTwZxUaCyixSeZ7M69uJAlVpUUkRKeeT+uZgruGWJwsARRJg0bePczLa10nMfWeNn5zsW2nKZMpRf7ASLJYQtaezwUALpPYqmBucWepLGeOx4IAl7x1KBXSretcPU8MNNvcu0mtG6/BktWthQyLdlr5Tbe7kHNguqpMW+erYAKiCfViCN2GKwKjRf7ixphi7VFDAGYCYm5LVfeRJ2AMoph1ZR8qSF8w6DDBXzpQ2OXtkSgLA0Rxam4nBSHWmGAUvNx+jVZCWFWpDhjPgcsXPW4RZdUsi+KSB0sezHm8s+3hIO4IwwDyHnxs4cINoGMMBRbC2y6KcS7lGV707NmMbYAh4xttQQCIQcnaWcjKlB9Z93PmkMBYWGqnSlcVslbXqwuAYj9/zJyt7fqQqMN07PLIzwDlvK5FqoFGPdlJ30t2zvHxoQnAUBO+0r8DAWEgOGJRS8d92CO1tfRZwB3yORyJUnj35mVJ+OqzH8nrpJBuOXEAonC7zoKeFjmYFL1KyGTSrVSCznlbPY81csWu1+GaC5Cu+VzRdiN5te0COHtsfGfhQXJkU1RH8+Cxf/UMhzseh3NZPLV5EHDnnT2Gty5w6/4B9z/+AqYzyb2sOa6HS0OUad8Iov71+xn8gse0i+OheXdgvY8+bkvjfSwrvn9xCAj7/fHrr+8jOZn79We9b402buZWLpw+KqJTt+cCyt8s6jlM57qY/5k85D7Z518/JycQ1y77OrCq4HU+upwDHRX5dAu4Kr9uWixWtsFiwZVVyNq6rZDDsZBUVlIP+yP7H0NNzFaLNW2e3/p9YPF+bN1x1hYZAUkFnJTHqNqlJn1bdQXyuxcHme9TnUz7mHal2G9WFcyNPL8dHR0dHR0dHR0dTxPfgYf4C7h41tX48IAI2GyAX/WNwLf+h8VP818g7P8KYzMD7qpcZh0dHR8IPN+ErxKwQA5cE4nKJZLAqhxJtquqKAnLYFhhPcgsQVE9VgM8Q63a5Kw+84b41bq4WB+ugoB2P2sDrNdSBxltkGmekWyeNYg0TWVQSsuxgUQTUEoBKRPwUkUBQpApIJZNdW7NeHxSwaltXgzML8i0ROjFa5pRBf18vq5JSbocTCyCjTWRy0HKs/ff/mYD6zYWlgKMLgtxk4pszvW19yEFcE0fsPdznspt2idkY0nCAPl+W/vvRLpiQVKmsmuySFVolqyzixDqulosiOjYB9byJOvnaPOYgoje3ENjYVnX0aqUmRmYGZSsUT0QprRdLsPYRAYTmI2B0/S7sXe2qlRShUwVCM3HlUF+8gA4KsFWlKspUDzHOjhRx1Ior5kHJ7d944rzEOdrBwnh65yDm4RQU9thsWnmOAbF7YZ7JD0nhChxUSEcBiHchFQjBHLgbRBShYHpFuPyldg/pkmUpptB6lsvIiEqrHN58FHd68X+dTOAp7HZTjdG7HtsVIqm0UUc6glRnlY+7zpmxoU47mKEmwFMBAwkpKzT3LQxAO+RyFoKFKWpom51B21XQPP+ipoXQCDw7ITojz/TZmOs9UO0qfViT6xBfh2rzbUmlwbd9pgg70XNbpVqZlFSmveUAPb5nqudv9sH6Yv6qNa3IhLkYSvtRHNum7ABwkYOmHdCpodtXLgQFyqEDWM+ieecCJuHwMnbAf71txK5j/pZBvL91jkeiM9tKOfTq2DnkqONGVVzStKhQeRyEOJLybyFY0ibcEzHtup1A9AwiJXzZpPneMrPQSpanylj6z1+/CVMtzd4+JEB844wb2VMCd7hnV96F2ef3mPz2Yd45R9e4uLVLT77ZYTpjOAPYtntRqmvv2TQxAgbBx6Ay5c2YA/4A8NfzHDjXN4ve8m7jXyI7yI0zcD+ABzGq9tjsVChIvQCo7WyaUEE63+L94NyzC4XAZWK2lSGPaZxrWl+CQwOU7mvzuH2XSdZ/rr8HpS4QsrzWot8tuduEdAKv7wvFN9bmCkvbvL2/NUx8b2hVMiaycm8OxXW0uY60rGNd0y9zrSosHqXBYToLEhiR9nm3/xeELH1+zAgAZI5pghIbVP9G+MYvM/vznruup/OZlGL/aywNvFq07wZkCzBGyiI3lo13NW/HR0dHR0dHR0dHR98/IJPAP+7Pwl8/AsWP/2xX8P4i1/G+L99u8MXfe4Z1K2jo+M9x/NN+AJl0L8m/NbQ2Kcge62CNirOFscrWdQ6TnGdAH4dhLFkr5YxXxGoaagXmopf3e+qNrLqk6pN6xxt1w4iXRHcJKIsyDuWG/RYAP2q61q0daXmqu9f4Kwgt+eolV2679r5ClLqimPW1Lf62zGsqWlTe/lmEHpB+vqV7S3FVKF+i9+tCtiepz4vGuXfEDUB3FLxHD1Oz11B7D9vWJlWQNhFktYsIOBI+urvOATQPEeyV8ceLRMpP++Seau/yx8FiswNgWbk/kQsSsyN5GCFPn9rz7CORdx4LvR3zdPMa532EXCTcXxtv1rh22q6eGlk9uOYCDkpp8HF74vTxHJknJiXz3z8LIQ9L/t5dFB4YiCHnON62TZp4RPQnnv0I0cVNBD7YL7W4IWcYY+k+GTSsvN3tfkFAB4AhEwM8yBEMQD4C4a/ZGAcJe9wQVDz8bQLeh1PQy1dnKMx5tvfrjzcEIPFD49HwtAwSN5V31gkkXYy99UsMppub3C47TGeU7Imp1nGiOmEMJ0O8KcbDPcP2Jx5DBcbhI0Q+YdbFHOEx+L28V4xxUUZ8d7HcnlwcWFYo47Vc8zTo+dizuUdeYd4r3BM/Vt/Xtu/JpEjFjm/V+ZOea9Swto391lDInhb86Mhnxf1anxeoJUa5Tq/HUFWFrfb4kplcG233PrdWuVfBbvo5qp9inNcUf412kfuT6kwpr6Sv6Ojo6Oj471DmIH7bwCnL8jf0wYRcOsVgDxw8fbTP19HxxG8gRk/jglvLnISdjwdEPCJLwW+/JcDX/pVsoi1ws/eBT53MuMHHv59PHh3h19665d2B6COjg84nm/CtxW4DiGTP6pgsvuSRKIXQWQDdjmQ2VQaeQ/2kqOztpuT82ayGEDO1WgHVB/ldoBRVjaUI3XZNcFVKyz1PEmtatQi3i9VoxoU0oC5UelS1b6WnC0UpFQG3O3vPE3Hg5ZRodK0HoxKV7b1rUm1epKaQ6mwzScryRarirHkdt3uNdmb6qKKnqiGXQmMJvvlpAo2AUOTEy/1I2snmUjWakGDQ1Q1G8tEVchaO+ZWXTiA51AqbWr1bYvAUGLXkSjaPEBqRa11KALQhvS1qmZre+pNcNMosO2LR9HnzHPJtYpF6yA7m2teXksRLE9WrqU6j0O1kMQihILc42hPWpOHibQ6TJGvJfBGcl9iDjFHrpRPU8DwUNSQ0y3EPgNwHKtYufZI6sJwwELEMQBpH6mDkC48ADzFpiUAnjGfBYyTy2OjKvknpD6m+TlVvY9pBtuVCHG8ot0WdHFxc3K8AZ4DaJpAY1T5qs25tiUiaWrGAtbnYeJF7ml2cr3YMKylMDtDZiITj9maluTxZgCBEuGp+Wrh5PlnoqjkjcerVXNUU5IuCuLYP4DkGmHnhmT5+QReuMk70HYDbIY8Vmr5msfau6TaVlI1ERmpzkhW4mHgpP5MfSowwiD7gSi1oSWH/R5pXA9bYD4R9TR7SD7pieBG4PwzAdu3D8AwgGPd2TlRR3MeD1OKBTb3OgRgnMCX+3U702OoCXrTkZNN6hpZq0XE3wt1b8rRHh45r/BRRFKTTnbAbpcJfjtm6TuQi4vWOLbV6Q7h1ikuXhmwv0M43CX4PeD2cs/dDFBg7O96jLfOcf7TF9jeG/HSjzi88wUe+5cZ734RAAbcSNi97bG5z7j1sxP8Pj4bJy7axw/w3sF7B3f/EjRNxbuJjOelHT0/vEC43F99/Yt7x7ldNoMoJPW6Yy5lDhzHelVtNhaQ1epe3aZovjtWZKozalKiTGAvnFsyAS82vSEtDCrKDJI+Q+dttu4gqUni8XVeXp2z7XlrGIVyMeeuXK8lcwvL4vieKYrUEBcURRW8Kduqju17Jut7RH3OkHMTWxvmZioRtV0G8vyf7OCR8/BGAneRu1fLsN9TWxjSV++vqnTtgjPtn+OY23O7zXWsLbzTdYb8LBhnHT6MMs56v/hd340QuOhnC4J3LS1BR0dHR0dHx5PHtAd++HuAV38h8It+9dM/nxuAX/xrgc/9C+BHvufpn6+j4wj+P7jE/7jTve8dBg/8of8D8FVfi8KNssLlfIHf9nd/G77x3s/Df/N1/01fENrR8QHH8034AkvCr7GNovVySymk9obsXaHkXZC+SrYqOWKDJ7XKWINN+t9jRC6ZAODCLrIiNiuSdnXfBiHKIWSbungNhfXbMbs6Ja4qRW9LwZGCW/q5pbRpqH3LczUCsHqIKnHrY/WYluVmXb7dbnP6EmXidU0BmohjoCBvW7CWh3RkXw45GFfbUAezMEA2xrqaa7e2jJZEttdpPovla9XuVlncumeWhG4pf9fURhTZ6ToIbXMAJ8IaJYEMpD6X8hPXsEHWOkibrtvey1Aql6LdOLnyGCEHrlCTK9moQeea7A0hEbqJnGTJlVu8/cbtmweM6UzIXSaWAp2eI/KGiCRaPBkFikRcfM41KK51CQCNdqyKZXkA242oA6dZCHSiXE8iIfTt4oQi/7UEuGkY2v3lEdBcYRjMheQd80fmsl6qCq1vmy1a2yoS5fW8oIRwItcV8T4UZSXC3Vie2rzH9Xhf54XXc1oS83EQrbYz+aX9gvIYX5O9OmfFVAE0sa4fKP5CXISAIJw3hdw+dsGOkrpQkSYD81ZsnN2ozx5FwpeweWeCfxBtwROxP6d5OaGRWqBF1N4IdZ9b6ctpQUiDIGzm623V50msitBzeg86PQU225xyQWFzsToXrebjs+wd+PwEh5dPMJ0QeCDQJLbMmwfI70AMhAGYNw77F3egwPCHgNM3CX5PGO8Q5g0wnzIOt0ny+/oBfg8Ml5mcG295UAC2n4sWzd6nBRFKRsv5WAj+wxhJvyvI+9oFoJ5bGykP5CNlAl6J3da8V8+f13H0AApCN5GLBgtXFFNuiwxNx8T5avHOtXAMiERxKkNSbaTnsyac7TFVPS2KutXjZXw3JCJw63pqUlPPGd9TxKGfjitXTVus1dGc2BwXSVFbH6B4/7U2z4t+VSMRyMZRpLU/l+2/QP1vFKK2LbNpw0TsVo9G8W5EtDqP8iMqpzs6Ojo6OjoeFfU/Jp8iKP6DrSv2Ot4HYKybFnY8YXzqXwJ+3b8K/LwvAvwV9M52i/nf+1/iH//op/Ef/rX/CL/5o78Jn3rxU+9JNTs6Ot57PP+EL7BO+lYBbUIjmNsi4VKQ3ARA6+CiJYHtdqswBbLiS39XommN/EuBRvNfq6itVS1JaVsFczRgZEldQ1iv4hqkb73fwiovqlGWRRglSI2aVK1J3RSoXFHaKDm3pspMlTCEYx3EtMqeVm7NukyrFD2Wu+/YvseO0RyEllDV4KndVgdx1Va5hVZuwjXCrj7H4yjVUv1R1M3m503KpioYrbl7636mAVAGEpELQMjLlvVilbMvBZo9gadHCIYWxPY1/nHlUD7Dui1i8zDgcPASnXZ5/4Vzs8/HC5mDTEISoEpWQiSEi2dLcgOzZ4TtAB/Vu5Jn3C3HOUteVotC2JEQvo9gxb0Kq36140CR37w6Rp8tqxxkTopUJblFmYu8HZGoZLMt2mdr+6FsukgGmw1VvROxUM8D9fW1iJsnQQg6V7o4KKlmzxufg4LsNfOObEe0+c39jz3AA8PtSRYSJDU5yntiSHFdtxA2QDgNoMg8qVrajcDwYIK7POQ6EmVSulDuueUY1CDPb4Rq7CsIQWBVndvM13uN354ISJ47OjmRxTs14Zueg1gH5/LzM3jMZxsc7g4px7KbAH8JbO8HzBvp+OyAeUMIA3C44yUf72XA7u2A7X3gAXuMtwjTuZC+YQeEDWF4CJy8KX2LGBhPSYjki0O+n40FazQHWXhyuQePj2lxzkEW62jZ1tWDQ3FvEkl5LGe9fr/OwpZq0VV6DzrWH647t6YFYCvnhHnHQknMLtJnuOq4Rl7cxTmuA1cRjoEXeXuB5Ttg8d2U0VISyz7mvXZtm+1nSnzPoXTlqdNA2IWQ+vvaYspqoVlKS2IXVJr+nnMMHzmfgU1zksjeYlGCKSe9F7q8nyGQr7WIoqOjo6Ojo6Oj4wMFAnACwvbKPTueW3z11wG//Xdfb9/NFvg3/6f453/jr+AP/7nfhM+7+yX4ss3XAfsLeHbYud36otqOjo7nDs834ZsIu1AGh5WM1d2iqkrz13FN1Ki6RIP2asFsyQ0flTJ1EFqD6HNW0BTwJmBkA+uWwNDfD1MOEq2peY8NwJbkNYotOSwG0KYJyXK5YYGb1BrOJUUA1cpJEziEN4oVJTxSzjgU6o4m0dsKdrYUvFO8P96oV6IddGHT3AqsquWeDfRpOWwCgGrvnFS8FfkElKpdIN9ftcyuyZx6/4XtJiGpa4hykL62n9ZmbCl07Ofa5tm24TwDLhTL7cTeGSgUPpq3uG7f1LZX5AK0pDrMgoAq8J5sB1W5NHMWcldEsO6XTlETPc4ZFVJlw7gWXDY2kVqnguBZI+CYwdMsdrzOLSzHmWKdmQDHYF1pF/NjSn0BDtEymeTaTj43YX+nft4BlVuy40RA0mwcCCJBk8i3SPoqkVkQn5HUDCeM6YUd3MMT0L13QWEjPyuhmsgZKhShqU3HScZT78RmskVi3hA8xzZVFTblNi0Us+nZo/w7cj8AM3AYswJ1okSgk2kXzJB7lAhcxNy9DDfKd/a6Xf8IzASOts9KtvPJFnQYxXqznosAWZAQ8ufiv0Qg78BsbJgfBbEcIn1WzBhlydS4jYnkPk5z0X/DQAiR7JO+LMQgMUB7wnApFs5hMPw7I/VDkLRVytdLQhRjExB2ouylCRgeELbvAMNn3wVdHuKig0iIhJDcN+BcnrNdbHeX+yGPI8J+f3PCvHaI0NzySvqSA7l1S2Zr5VzvcyMb56sWKVVwZ2eg7VaINO+RbLqZc/oIJX7mABxG+b4ZEF44x3h7g+lExg+/ZwyXwHAhRL8fzTU4IHjCvCWEDTCeefgRoJlx/voMNzHcPiBsHOCA8dxj2hHGW4AbxSb6hZ+8xHBvD3pwYch5Oz7HBSnjBL68BF9cXP8+FgvDInE5bPI4ntS5MYdRw75/Nc9sSl9wg/sYiUrWed3WIRK1xUK4WsELFO8Ji/eu+v3Glj8DbJW0Jh2GKlitFXJd30JdWl9zspjOvxWErJ1HleSOC15kXDPH6Puoqo5b5TWwUEbP2Qpf6piJ2/S+UZPBzsn7RYtgrcnulktIrcCt9uHDYbnQ0vTRZLdsFz00SHbyPi1w0/dnZgbGBmHrXKkOdk7e6aihBu/o6Ojo6Ojo6PhQ4efB48/hFXz+cx7273jC+MqvBb7zB/Cf7j6GP75/G/jt/wN8w/SL8V988r941jXr6Oh4gvjgjPxW+Rc4WqISFjbOHCPTN1m5oqqnld+adamJYUv26nclVJRI1mB3bYF33cDNmlqgpSo7ElhrlnsEi2PUdq62SLyu6qlW0tQBYA2mtiydryIjqwBsAVW8te41UWmVWSuxr6uSvQo3JXxqC2h73lZdFqdrEMgt9WGrDHtPm2pGo5yyvy9sMudlQDdVhW+WW6Je/LG63xVtfIx0CEHUMvXzFAAMpj2T4jjaLruqXo4z+c4MfznDH1BY5S6qFck0iiSk2AnbHcx/ldyc44Fx6BNijjGdewxnO7jP3RNrZCAT0sYicoE4njAgx1FcWMBPSEHUUvjqc2GIyVXUKuq0vTpNJH0z6R//E2jZ/rG9Syvu+JMDeDvIs9SykK/7iY4xT9hik7yX+0DlM0lKyNg55+jCIfObfiQG1D48toOqo9lLH2MybQnIogYv6l7dzo4j8e7gR7ESpmmObZGt6RfzbXNeUvtuLh0ZrosV1eZazl4OHBfHPGFcZ7xSuJgf1ZK99QI2Z56Zqlze+JgTnNLCBzdmVTeQxxRO4xfS+BE8w4EkZ3YA/BjgJgYI8JcB885h2HvQzHATY3j7UtS9QK5X63rnWXLuao7fR8WalXZl65z39fkYu1+xwOD69amVqlhLC6Dluva8ByC9z/HaO4lcTK536x2rspZeVdY2XUka5T6Gcl2sh4+MearCreq4tsq8mXv3Ktj34yqX72J7PffUaVDKysR3Faw/y2vv5yGIK8l19z9CFufq5DZMSuG+Wr+jo6Ojo6Oj40OFLQi/GBvcbjldPgUcwPhb2OOHMV69c8fj4fQc+IpfBnzhF9/82PNbwC/8pXgdwOsP3gW+9BW8ON/FX/nFAP7JPwLeeB0A8Nr2NXzyzieLQ3/28mfxI+/+CN48vPn419DR0fFU8fwTvqr+UkJOValzKPIWkrWILCznjP1bJIiT1aUNBNn9kmWiCd67GCW1QSL9bBVyGqzRejtXWq21FALWBk4DVJXijkPIufyaSlq5FiLKyl1bjm3Pqgyecv1I29ra5to6UFSNWJu7GMQlv4lFrwQwW7nerKW2KrBqZTGQyVir3NXgrQZFVaVBbkm+Afk+GEtGgLO6sEUQ6L1fy9Ns1TGK1v2xirxkbWyCz0nNYyyd53lRRlLTbDdlXSzJao89Zi+t7RZEASSKIxMgB3IdW6Szj/K+OZT7aHnbbXF9VNzjeC0hxOfbwUqTC9VQqktYtq2q3K2qJqqfs8Uip3qTq3LpyUnK54HFEYC0vZlBk5ybPZUENZE4DLBYymd7XAc3BWAc5bmcZgxvPcT2wQ5udAjB9O/kLwyART2nnwmRx40ksSpR0+kDwDOBxqiY9bmPPXhtgNuf4OQnDgCfFgtDiDnn8vXaRpzGWh4caApy7s0Amgbw/jEJ32RHGYnKOUgdVL0YpN1Zx80WCazEOyJR5SEkNuXGSoS6kuY7JOtiscCOx0RCTAkwNxLcBgjE8hgAidScz7Zwb7syD69VHgNx/AmpzjzNy+fvUYlzivba2jZDOZaqawUnR4HGvKZ1jOSftb5Wwq+wcYa0cSCoW3ZS+Opn9sB0HvtdIGgeZJqB4QGwe2dlgUbcxibfK+awnFPj4osbKWpje8l56gUzPn1Ot6G5sKgB+1utFl5YBPPx760qD0PK0UzDAGzM65u24WCIKn1e/RbYi6Vy2IplvJs4qtkBPwJOTU0cEAbCtCNRt5PcQ8yAmzmqv4F56wAG9nc9NhcB/iLg9CffBj24QHjrbdCtc9AwiKPIZgPofAQUziIUFz7wNIMPY1ZBXhc1ganzO7C8b2YBUlJnt7JL1c+kIWcBpM/F/KHbOeR8q0B0IRDV5aLsqMJd5IWO9RZV55T3BVCntCDv83xl3Q8scR0YzDNaixua16ow5+JxEqLcXFuLqLb2zTYNg+7bnLfTwbl91ZK6mbPXuWT7bReY6O+2fmTfKdcIUvs+W8MqaF15bUmxXL8vaFk1MWtsl7WdWN1ncsGFWreVqqW2574SjkDw7UWOHR0dHR0dHR0dHU8IbyHg38KbeL1n8H36+PwvBP7UXwTOzh+vnLNbwB/9P+P7AfzLCMC//58BP/B/BQD8Gx//N/Bnf9mfLXb/rs98F/7dv//vNlM4dnR0vL/w/BO+IcrcaEmAURACRr5QInQLokCDQ95J3rnAMSgeLaA12FwToVbFuxZHqYlhhap6tf6KoQrgpguhIthUkMBVkGtxvAaeTACKbBl1+S3SrHVdtq2vCuKRA2CUG5aErFXAQBlYTeobBhCA4NqTS5M4aajtNOhmSTxL0iu03yhBY4+t65jq17iGGnXgeG2fut7g9m9Avk5HbTVsTfbWdWkFyC0cgdwg+88VSVUTx4EBF883y7lz3udQllcr6DhbOqfcvYmICiZ4zUv1i7UJXSiUy30XauJKiUXet0maVF4krNN3U8+ZM/sVxw2n+YE1zzCJ7bOqdeEceAAwTnBjJCwt2ZYaKBKQV8Rtbc7V5Io8RxvibRDiDcB4izDeHnCiZO5ctVMxPsRrAzLBrePjZitE7H5/vGJXIYRMLNsx15Coas+fK2mIFa2PzWvKyGQvkFS6boZRMur1GpIzyG9hwwXhiwDw7ABikOZCHoCw82kOSkR1C7owKOa2LAijls3/dUEO2GyECBxWZKjM8Zli5AaJY4tRqIWNk5y7g/QhdgAPDGKSdTMuttWc2y8MSyKYXWy/geM5pV3VjtxfMjb38/iqCyNk4YRbzrv1Z53DHiU/ZTGPm/51hDhONsDVgiKuSTbZCJArf3vMHM203YJ2u0z82vzaLdjnSRe0xe4HAJuHkdgPDL8P8JcB4624UGtLGB4w/Mg4nDuoTbfm5rWq+Mu7HvyiR9i+hJM3LuHv38/k22ZT1rEm90OQ3L0PH94sd29r/k7naCzMSscpEW/mRHtfNE/uYn5fbk9tYFXAlqy1WHPAaH2uj7NuJgsFr84tK+dL7xt+uY89rvFeUNgxM13r2lpE5KpzR1y4lzDP+XjtM/HdtVDz6jnN9aySoCv5fAEhW8k66rTeJ3ThU/Xeb+2pi/dqe2x9brt9bX4wpLZYfedFjpY0J/M+ynYh6aK43E49H1dHR0dHR0dHR8fTRuhU4HsDQulK9Mjl5JgLA8Bv+a3AV34NAOBv/8Q7+Nb/77cWu//Iuz/S73BHx3OC55vwZZbguirommRYDJKs2VgWZJ+SDW5BuBbK35ogrAlkS6baOlniKak2TSBJc6fWq/qN8i5dU03M2gBUi/BqXXdL2buGKtBog2vtQJshNq1adcUus1Cx1koEJUUcANRts6JaadoyuxyVYxMo9Y1rT7mCDeHcaiN7+mMB1RYW1saN7YVdp2sfY4nbOnBb1PWa97jos5YUntGyWE7bIhmbFaZHSBijHtYymruZgGWyv7SBU+/LwGqVZzpfxxWk76J6lBV+CzVeKBY8UFT2gigSoYjKVHM8M2hmUctZOCRChA4jaOZowazHUvpP6rqWJ7BVMzxeUuap8ncCaCDAMZgJIMZ0BkwnhlQNIZO8reu2/b9W/W+e/FTCrkF8HnMlsFa2lmRSkiuSuRQiWekz2QsgWTknu2wf//T4aLfNM4GGSPg6uachWnlzVEcfJWyVQCeT8zzMj0UIkqrh1ObXtkuNNJ7SchszeKB87U4IYv0vgXJ7FhWI7cT5u5C9KFS/xBRJX2DYM4YLs2DEPr/13Kr71AsC5nB8jL0plCw0Vrl01bipl1wQwnHuWCPybgoi0HYD2m2XC8PW7rMuVrLWtZ7SYgS/1wUAcj/cfobbufSuM+wDhocB00nOMetmIX2Dp3Rfx3PCfALw4EHzDmfeqLJVoa11tWCWcWSSxSILZ4UjbbFQwrccJopj3Pp3k7+d6jmwLq81N9ZY234dXDMVw2qd1MY9/aPdvKfV/zBvvScVZRmLZePOsap0rn8/Uj97jpR717ojVGra9J4WgxqL62kobbVeVxKdK2M1x8UkVDvPUK5Hs6yW8pmirXKldE6oFMFCKFNeZGWuJ8GRtJldzEnmHWmFBO7o6Ojo6Oj4AIOcuPuE6bEXm3Z0dHwI8au+Uf4A/Phf/C/x43/qf/2MK9TR0fGoeL4JX7MCHhTtHxUhJAKYUiDblwFkq5wEYqATouytFbRTg2AFkJRxQAygNQLQ3iHl9LQKY1V7qT3l4LP6t1YF1PWugzkr9m8FAWYDv0BWVKiysiozBQ0dCkUBQkjXXATd1Ga5un5RKmidNFhoyMua1FTyggg8htyGtR2xtW929t7HbbUCaC2X3nXUdDVB3lIj20UFtQq6slhc1L8OQBcqWqPkUrVoYZ3s26roOsid7KyVHA7gOYCIDcENrBLO8fko6h/z7+bgr7F8rhXEtmy1io4B2RTgtMcCZcA2ZGWLkgOqbkmBTg38JuWnT9eux7SsnAuSB5G0SfUun/1kGzrP8uwOLtk188ZnElGD76kbCOkLRGLBEcLJBjQG0DiDxknyXj4kTLejGi8xkNFiVcnbgCLXb9gYjkpPr/mAAfhL2RpukRCVW8Z4mzGeU3qmaJoRdlvAxfFOGjjfDzaMso4bIfadzRZPFakPmPFQx2ejYEyICjweGORZ1M0zJRtbVSyKRXYuP+Wh1WllokhyyX1kT8DohPz0DHhGGBjzqS/nH6BQ7BaLkcZpGaQfzfN8U3UvIDd/M8T5R8rmSKJqjtxUv6SMFYvsNIeFGaAtphPCvCOELad2cBPgJoI/kPRnq/TlTJwTMvFLHLsnCZluldRuJGzfnbH53MP2vdW+pakZdLv+Vz9P09GFG9duu9aY2crvq89+g2DkYLalazJj0aPW03m48zNgt5NnTUleJcnts6Cf63PFHMfj+YDpzGHeUqHUvnzRAy957N6aMVzIIrp56zCdOHEdIMK8BUK8lynfr5L5DGzfZQwPK4tabRt1TbGOGCGA9wdgPNzMypkZC9vzmqivyfrayrnhCEIe+ViFnRdr2HcRO1fWpHCdQ1jtfG0KB/2NGu9QR0jlpq0yUUmeokEwupI0XRwTGBzn9vT+ZhfkRQVws03q8x0jrG1u4WKxWq6LTeFBdtw0CuREkppzp/eKVI/GO7LsuHxevC8XP63td1W58X2E9bv+eyI+vxyvpyZqdeFcuib7Lml+T+dP7eRB8yzvSFxaal97QUVHR0dHR0fH84s7HwW+8jcCP/m3gDd/4lnXpqOjo6Ojo+MZ4YOzBLxlG6fBp5qIS4q7Msi+UAjbwLJ+byGSNwCWROBNr2FNpdwKNK3lJAOMktitqxFa5R0LSiuZAFTqsBUiVX9uqZ2BUjVSnCfnRn0iuEpl1Wqb2tL3KjV0Sy23to/tL2sIVZuttUdNyh6rV102ckDx2itA185Vk/Z2W6vs1j0JnP8aKIPIrv1ba9HDMbRIHXv+tXYx6uQkOncoFKMA1q199XdV98ZgL00MNwFWKanqSc2JmmyHuSR9df+6DsRC1tFM4FkDzsC8BeYtiWJQlbP2eppjjhLl1b14VEXbGux4bFWM9Zi8tgiHObWRii0RrYSTKjqSXUpgtnIgS7nyp8pfMm0IAHDAvKNlX1sbv44oxGjNieIYnM+LTayKXe+TXfiif4VSvvydfSRnbTsEKpXnsU3kOvM2SwBq3l+1yKaZpMxYlps4LyywbdOqO5DnH52nVH14bB48hpuOfYpGvtXmb08CJHlaaRjSIij721FUzwZ7h7ChQnENzmOKm5DSWrhJjmUnql5wzN87kFiYbyCfPSXr793bM4Z393FOcmV/g7mnWrfAQtgfxifQTutE/Y3yO99Ukd1KSVF/rvBYCxSOzI9NXGdctu8l1y3rEVT1aWFYdeya5XPxm9owN573VQXv2twfxxCqxsuqAuX+rW31O8dV74jVtaR5NITFdcruVRscu6Z0UFjcx8caIzs6Ojo6OjqeL/gBOL0DDJtnXZOOjo6Ojo6OZ4jnW+HLDJrmnO+vtoM0n7my7SWbm9USBdEmNhExLRJYTx/z/hZBTHBW3iCUAS57Hvs5KW5DVZZBXLWfymkFwxU2KLQW5E8/V8GhOWSFrdmHowpMVR3kRB4kwSRX7mtjUoVCMIjLrypS67a1wfKJJVCbcjlW5HCtoNVjrQ2vPW4NgaPtJABVGTlCygmpNtss/SLdN2eCl6o+DnORb7R5bqsSsaSyqoDs+awgY0ZWzLbKt21Z5yVs5Y/U795n8tLrdVmlWjzW5u6tVVPMouytFz14L+qWcQJththG+nwIM0lhGfCt+94CrsrvuxbMXFOsL9RHqly/BtGbCtM2ikHZRvCYiSL5xcmaUfarilISa5zgDjP8pSEdCWDP4E08PhA8Z9KXAhJ5o9bDFLsVKVkMgKaoZB0dmALIB8znM6ZbA+jWufS5OUhddLzQ8WjwSDl8VT2lCuyo9KInYR+pxPGcg9Yk9gKibrakb2o8M76HkjAV9WLMXTw5uL0rCHIle9Vmmx0SIZyUvgDCwAABfh9JTxX1ReaYPTCeuWxrrWOzsdhnR1HdjeWcY/tjUv1fX42lhCCslW5SYNtxIP9G6ioBIFmHeg94UX+CZJFA2Mo+bortFXK7UJB2IkYigNlLX1PlKMU2xRwVejPBTYA/oFxYUM9TqtI39zzVmTkpXfkwLqxcHxsNQndBGlrV5jE7Yefb268J8l6snE925aIMHW+0PfQ5cCS22XauZ5ZFHZshK3sD4A9y3OGccHIvYPfWCI7ztztEu3Ii+bwjTKfaBzJpzARMp/L59Mc/C7z7QN4RBl8saqA6VUWIRNfFBcLj5P6u5nhylC21qbpv5EBOrJuTfXOlCNb9inqq3fNmKBW4OpdZtxKbC56GqIytxkZVfKZzuKy4bShxC9h5u+UOAhRq2SKXbvFauCR5CyWvfufl5zzv53Mcs09mM543oeezil29jrTPykIu6/ain1u20ub3IgeuqmujAn71XaK1PZh7YdS5C2ibxHf4Qs27dkwklNnYSZP3+Z2qbpuo+sUYLah1TLfpLrhxno6Ojo6Ojo6Ojo6Ojo6Ojg8cnm/C1zkwVTniahWMwgTgaZoX+5ElW4Flvt4GEUuNbRL4AVI0W4lBa+Vsj7GEsdZJST/dFq+1OMdKe5SEogn22M8Ka32r16Q2fRpQjoEnIgIGQ2AsAnC0DLoBgLeWgA3bQxsoLaw1SXK21cF0qtphTd1h1VvWgjNU5MCaCjURDzVRas6p93YOgDPEfovMtscX5zHXXJO8+rtaR9oAdQ17zsI22ZVtt0b81tbU8xzLu4JMcSR5PbXu9hwayE1EWDBE+ZSJ3zn315QvrxEgTiSoKsBTHa4RyKz7PXJfbyquWjbUFnab7so5vzET4KJ6kXUBxTgj5W7lSEZ4Ag8i3aXBS+7MhwyatI8JER92DH/fifo3Ei0EieEyCRFTqC4JqNWYFAB34RAcy8jvosr3Iy/Avf0A9PAy24dTvDcBy7FISe64sIUHgOYBNAw5cP4oUDt8HSujKjEt5qmJ0plTPZPlfszpSojXTwANATwJ880x7s3xcsgDYUAkOCPRS7mvseOk3GYnZbq9w3xOQvgSEDwwninpbOYRM+bTqItJzEKgGrog4oYg79p5JmskC1axEk0EtJmDePCYN6rgZFglKIBSPR7bV8j4WHK0G0/5pKVr5+PiIgU3An4fgMNYEr2prnI9rPMKkG8KxfFpDkvy42ljbQHR2gKbx1H8Og86PQVtN6Vi1qrAq2cyp6Mo24TPThDOd4nMl3zi8kwMl2I1H3QsAlLfSK4CAdjdizbpJPbOurjE7+PnORTWtexd6aKiSMreg5CBj3r/ItmbSd4AwMt301FrW+fFtpZKu3rvSPmZtW3Nojjh0ZbWz2zHgcL5pbHAyO5vjzm2yKuFymGmtjde5o7N91n3U5vn1efKpt2AaRNTjpZl61J/LtrnCCyR3CSUmcXG2Jwjn7sihmNe4rSNZVEDWu8Trffneh/72datfgfX/dKiJi6PrS3+lxe5uM61+1PYQUdr546Ojo6Ojo5nhHc+DfzY9wEf/yRw6+VnXZuOjo6Ojo6ODwme7yXfSgYobBC0RfzWhIV3OT+ghapm4h87yt+t7azdVh9fq3rrz0D7OFfVvaVqWyvPHqfEgyoJrJKsbp+WIljhjOrC7reWY84SrUXVaKk64SuCvUp2avu3UG+vyXfmTDQu8vY1+sixa6ktZikSnaqQtWS1oyWZWiPlpmyQi5akrvepf2vVvSZ/13BdVaslhGs18Ro5mlTLywC3DUIugrjXCABbe/FFrj4Lq/q3Czx0QUN9/kotllRgdR0qy1ni8nusaAzk5vylC3KLYALB4hgw7LlQ+MIzeGC4GXAHSkpea6G7sHa21aD8we0JSHlsGWEDHF7Y5vyv9Thhn72158dFRZ/3VxMS14WSvdo2tl72v0oS65hr+oYodRnkInFpCXBkMgumDdXuOedHRGpvbUen1sZJ4cvZ0tne/1q1CmQC27QrM68/Q9eBzeF9FfR+1WOfWpwSgQckm15L8KZ+V5SHom1q22chyhlFot9I+LoxLBdfmTm3aKs0VsZ9A+e83I9Akj81LFS/VX+4djky9tBuK+pcPb5+P6hRj0G6+XSL+XSDMFB65wlengE/yngTNk7uuVk7IAskCMSM4YLh95z21z9/iKSvfU+o72lVR55m8GF8tLyix67/Ooe3npWrnh9djFG89+T5w77fJFxlv1ynAllJaWBz2N8YK2UVal2bnuDIsVJASfYm2HKC6QfVHHt0rj5S/zX18PXLMQrzWK+F1XHthmA/X3dR2bH9rqr/moo4We+L9fNRAtdaX18ndUhHR0dHR0fH08XlO8Bn/gmwv/+sa9LR8VTxLgLeRMANIxkdj4LbLwAvvPhY/yY+ihCAt94E7r/7dMrv6Oh4T/B8K3xbSlbmtsWjqsQq1a4qUFbVKICofTVo7xvBcmfIHquQTVbAlWIgHUcliZgs4gxxYAO4qgLQgOoaERJX9i8UsJb81f2AQiVlA4JktjEzcBhBgyiqC3WkBuWmSQJ6ziUrxSJ/b7xe5jkTgXqvLPmrNphhFoWhVbkky+G4v/NiBZhUiMjlpesz991uU2bCxf8ORolq75FV76QgaEV6OgJo5XGy9Q+mj6jVIRGguSwt8ePy/UnEqpKoqsIFSuV0i2S2tpX2u91P66iq4LoOeoxVHknl5D+boSS97bWESGi5HFhO+fx0V++MAhHNYDPPM9SCMSlXQli3drbPVEVCcBwnFsH0BtkmCrKqXJ7B4yj1nrdgYiAQeBMD2yH3NyYCPCFs43YlqjkqeUKQ+88Mdzlhdy/A7weMMwGDlEsTwY1ihztHRaUq74BM/AKAOwBJzaokHYuClZgwq3rYM6Yzxr0v3mJ7bwf36QNo3IH9FuFkEJUfM+gwISnZtQkagWS320kq3P1jWuwqOTCHaItdEaf6Vy9UccjPBGVinDzL9R8I7iCEbVAbZxLyEcjb5Pj4uwdoRGp7/Y5AUqUhgHeM8RYwn24wDPIcUCjzkPMmjw0cldw4jCWZ7p2o4TmA1V7+qnYil6w+80KaatGBmS80pzTpb3b+8B4YvOR5jWQgHINJFL+eAUTutlhQoNwmALhMmrPjWAZAIyUVuhsJ23cZ/uEBuNwDpyfSn4iyQjXWm4dKuawYsqUzT4+YA7YmTnQBTxy3kqpT7X+BkqC089UxW+dHUNi53Q50sgPtdrmfp/nAzBv2HHZum+fkwkFEOLx8hv2LYjEcPBAGgqra/VuMeUugDcHvA9gR9i9Lu1OIxD9TyvOLiWM5hLABtvcYw6XcN3IO2AwpJcaijwUGX16C9wfwxQUWjhtXNoyxyG7YbdfW28WCnaP52M1Y4s18b/PRp7Elzzc8h0V9imPS4sCQSeN0LbQsW4+31xTH3WR5fB0i2V7bDLC+M9jLZs6Lsey2aj9L1jLk3IU7sM7v5vyk79um3EJhbJTINQld2EPbVCxKZs5zOXdrG8WykttB4/y5znZhGufxcZ7zmhZjyb9wyNF3cfPvCtY6XUEOs9qb1+O0tXuWhqgWWZakdboekyKltHqO7anvx0/a+r6jo6Ojo6Ojo6Mj4vfjbfw/8BBvdsr36YII+M/+OPCpXwXsdk/nHG+/BfzbvwH4Fz/5dMrv6Oh4T/B8E741jgVWrxN0XVPTrqhmVn+v1QGK2p4vrBzTVJLylYGkVE5N6K5BreqIFsKt9v4aoHRlwOoqFcFVypQULKxeDtJ1H2kzDmW6y5adcmGBWRGXWuaatfOxcou6VzimmGm125pVs/6WiFlDoh47X12vq2xGj6mebCBb264+55NQ2R1rg2Oo8+CtWZg3FjVcZXe4yN1ZnNfcz7hAIu1NWdWbFk4wStI5ErEAon259Hd3CPlR0ASpIRJoPh+biDeOxMwAsI/766Ew51DMBAQhfMKWcbjjELZe7B4SoVC22QKJKA+ZmNvtQPMMftScnM70c8pKxObYav/b6o81ImFl1aipSF1zMpRtqnbNw57gRiTCkoK0HwexdQ6eEbbIeeKnSRYvLMaq2E9UiRz7KQFlkP+6Kmkle5vPbrkYSNuyUKKbduUQQLstwsk2qXuTTTOjVO6WzRrLz22XHmEmEDgtOKBAyX58uGTQOIPnkFMjtAhrXRhi6+ooLUZ4LMvkxcUY0rT+aa1vpTo/GaIXgJCamq+zro8ubFic37SR+UybDfhki/G2x3jmpJ/GhRBujARuqq/5qOMLRXIY8R7Psj1ZoxOwuQjYvhOV1qronEP5LmIdEZSQflQCql7AZLe3PtfHrR1j8ajKyLXjWuex7x3HHDvs4rnKsrlY7LUGqt4Z6kVe9ecKBVm6ZjXdOCYh7tsie1ernM7nkrKVgLYKtlXW2n5pf2PtfB20bJuBYsx4LAWyJb1NvcoczOa9JoRM1l/n/fsm19rR0dHR0dHx/OPWR4BxD7z90zdfYNkBAPi6X7jDg0vG9/yDC+wfcX3xhwlvIeD1TvY+XXzRlwBf9tXAL/olwCuvPb3zhBl443Xg3ltP7xwdHR1PHc834Ru4IErsSn2EICorDXSvkatAGYTXTVEZUuTEK5QTVQCzpfxVpW4rWKwBURejr4FzAMcGb1tBpFYgOV075fxgqj6whJhz5Ur/Ku+vVenCEGJq91koQgxRXAQFbf1UnbpQ6MIoPzW/HJXHyE5lIL4VWA9qC7oWvNV2tQrXeUniWpVxK9AOE6islTo2uJ3qxcDGBFST9TOVbTKbemk97H5WLaXnTjnpqDzGtvNC3e2W+9nzap7g1EZZ7Zb3t7kK5/L8NbSu5reFlbMjIX3qJQdN4v4IEWbU+0UOPNsnk4I+qt+tHayejxxUtZxInrV/JFlCMgAgTspeNsqkRE7NjHAygH0kH3XciXlweTMAzBgezkW6Uo5kWdhALIoZhmlDyok6E4TQcSgsninuA8RbP0FUvp7Bu4D9S4TpfMCgJ5tn0BjzHKdxBTKu2OcjBFHhng7A4EG3zqStHjxYv09HkMYdJXu9z+OXJRzIKKtsI9XPbhxaOZC004yUh9c6DJPtupzbjkkIcfcOYRMvKSgRFoB5iv3RM+ZTTvlPeRzlOgafx1e9Rkt8GbtqmqYWn3q8vRyVOdf1vxTtkJmF1DBKc2IGprmcD+cZOIzgl+9ivrPFfALJaxzbA0zwB+mDaRGBfVwJshgBgNMn2bajYzjOCl8/Att3ZtA+so3xOeCNA6bGszaX9U0q+RCytfqjoDVfAWa88o1treN1IQ2vl3ldOA93egI62WXHibXz2s8FoZodO/jsBNNHbuPyrsd4mzCdyFjhD4ztuwwX1bouAG5i6GIHN2dSNwyE4IE5HluQvh7Yvj1h9/qD8jlVq3VtC2ZRrUd15mPl+gZK8taSbi3yq1bgmjIK1eyKsrUgWm2xabw5QrrWi1EKV5eQCFuK9vWsub41HzHlnLqFI4bWzbWJxlTnlkLZqpmvsnxWstnl39lVx9XX2CJ0jcNLfb5megcz1+drCeU+9pjoFqPOHTUK1a91yGmhXkAmJ2kvJLPl6XuFPaaB5vsJYO5PJHPtAihrk53qUP1m6pMsxq3q93EI6Y6Ojo6Ojo7nCx/9BPDKzwf+7p8HDg+fdW2eS3zLv3IL//qvOMMv/w9+Dp+514nMjvcBfs03AX/wf9/f6zs6Oq6F55vwXVPeaoC7itmknICRDE7B90gwSICaYwBayQENzpuAeg1L9tqgp+7vSUi9EDL5OM8552UqXwkyLss4FkRakFgN0lLJLmtra7eZcmrSNgXTlFBrWVpG4rcghy2Bdg0FQgoiWpLRoqWAS0SvCbzPK/u21K323tRIhKepe0vdkuwVG0HOyi4x2RrX12fJ2Tm09yuUUkZlq/WMgT0Kpp41hWRz9dl2sW0SWM6t+ygJbIPEx2yjtW3UlrJlkWxVmfo9MAoC2VpaNpS5mguwuEIbxK0DttrXQ7Y2LILXjYC+WDlzfl5qzHN8rhnwEAXOFS9fFO8vxXNa62cZPwC3n4RUCSSnZSEs5x2DNoC/FHth2QdJiSeNkwlffwDCBmJVrGlAZ8DtCXx/QHhhBIaA+cRhvOVxeue22LbTHBddVNdSf3cOHP/gILbew7DeXlfBe2AYhPhONvh1A1aEGhF4cKBoiZ0WnlBUWEe7dpoI7kBZzatkMEkbKQmcVKoDAIfimKSmngAaHcLo4TYz4BhhG9XXNo9xMTZxHnMb25t50q/TXkkJWhHLSpw6l3Mh23YLIY97USkbznc43N5IblfPRX5otxfSX7dJ+xmiRjms2K4EIcvDIPcgDLHvHQB/AWzf3oMOozy/3mcL4BZ0sU2x2IDFsvhxFL4tIsQQiWnBx5NUER8BDYP8nZ7kPqTvCXbRT5xXmovZVA1JBH75LsZXzvDw1S2mMxkH3AQMF4ztfR17UKja2VPM8wsET8k23k2Af5fTb8NDhj/I4pTdGw/h7j+s3jeq95iQ+1q4uLy5urd4H6oJ3Dy3c3Bp3E7qd5s2ogKvpPFo/rZY/GTqM2P5rrNGfC4urWqja8ASsgUZW6to6/MWbiEVaRtYyGVb35YNdNy+sFQ2x5TKVBS/Ncurvi/Uty7P7ck6OV4DOyzfP2vE8opUDpY8retgz9FwCWnm+3UOGEd5/rbbxbmbsO/f+p6t5zH/ltB0FuU1ca5vda0MSJ+M5C87h8U/iDo6Ojo6Ojo+uOiE0GPjsdxbOjqeFnq/7OjouCY+UBEAagTTmmoYhQ1IqqrMBC1TeWsr5Ati8RoE7VUBvWODd00Crx07z8ugUV1XizqXWK3w0GuzhMEayV4HoBwtg6PHUAdkrxtoX7NLbJWj9Vcy2AZA6+u6rrWqPUdYufZWOxSq86ouNrhck71r9Wv1LyV0Ldl7U7SCx1bNc1W5tTJJCeEnDQ0IX0E2Jitnq4S5qq+1nj37LDhcezSlwKA5ji9Wje9EgekOUeFbKU9hY7aMrExl899I/hZ20VGJp8e6KRJ4+tuWMZ0Qwq0TGT+mORM2FrVqnCiqWPNnIa0212uIolHifdBczpYEt9A2Xxt7Fd7lvMYMIESSXEldbSMgKRmtKlrtat1k2hFI9sZuBDBGVwICeBAyrLkwaM1lIhEvwWy+5pgZFzxktdrKuK7t0yJUK7J53nnMJ4bYjfl7VfEpKvZM9to+VdYtFh+JY0TinT2DZoIbGe7+Ial507x71Thi+6MlFR8XVqnZOtd7Be+BzUaeIW9ydFZzPztqk/i6WI0IGAZMd05wuL3B/o4rc/YexFIbkHtpLc71nhZ/OlSoujcAm4cB23sTdp+5gHvnoeRiBo4/r3Gu4GnEI1vLcfU+09zlMe+dndNa1tEttW9rjqzfCY4gz0kNQnTt3aFS1DbnPevAobmprxkkuHaQK/XDsNxWlad/V6GZbuGq9+O1epkyAZSq1zW0lLHWTtme44ZjxdFzry34se/yrbJqJx+7wAg9YNnR0dHR0dHR0dHx3MJ74CMfBW6/8PTPde8t4I1Pt0VRHR0dzxWee4UvTXMKfrJRHNXBUHZG9WQCLqosomlOpC8pCaPKkLVgiapq66Bmbf2s5/U+D5xq19iysLR1nLNSqwjsKmwdW8peVTHUweFUn1lsnNVeNJZDkTDgYHIsWkRr6JRbjeioPeIqAQvkQHuy3TMBeKuyLVSpti0aqmb9jU37qJWzrcdaUHFBPpsAqypolaBiBkZeqnIL8tcDmJdK2bmxr5Izqh5dKHArwlQVwezKAK9tQ0UreJyIZrUU1LoYJXFDkcVzyKrbaAWe1cVGwa7t4kgYsxhEV/tKsrnoSEnbXB6FGACeJsD7rGRq2SvqdxsctfdYc/fValxDthMbVU3Mk9pUpEV7UsnXCtAUIlEGUS1GIoumSeqgNs/B1N1TSWBOM2icxEJ3IvBMUvZM2LxDoKkkJ1XhSwFRiRedCgiYzpAIOn+Zj2FHaaykIYBPgIevbrH9wjs4//Tn5HmvrYKB7FJgCSgW8poJYml8dgL/8ouY33wLPB6WbdYCEWjYgLZb8HaT7e69E0KZXXYuGKd879JzwsAc7aUDA9sBfHYiKl1i8OxSDlolyZmExKRZ2olmYHhHSUrgcCpE5eZdIYrZiPWHC2B+SGDvwSczyLEQvlsHOjkBH8ZyfApyjeyd8M+R0CYgjnkb0DgB05SeqaMUAhHcbpf7PenCBZf7UoN4s+M4D/IcYZTnjIcB89mAw7nDfMJiMe4AN4rCOZGCOhwTQVXRYCAMYjXuTH4jUVhrnZEI9OEScG+9Iyo6HxXigDxLse683STCgqa5nGOJJE/yZBPQPgKcz8Rja26xqJ0iLOzc86hEMRHc6UlWyGsfH0yah3rxFRD7zVws3OIX72C+fYL7X3CKwy3CeJuSunr7LsOP8Xn1lAjdRO56sW9WdS87YN4CIGAEYXePsX0r4PwfvwG62MuY7FxWIae6m3ac5D2BLy/Bh8Ojt1HVXonENHNhcmXgAJ7jWH7s3hkFMNHQIFg9moRtod71IOKkbL2W1TOQ3gV4zvMseQ/GLFPx4l3SzKPBnG+awCOn4xfnjHVMxHBS9ofShUTrsFgUWNWjsnnOqSDsOeb1/eM5jhKf2r52zpzz+0myslY18UIR3Cacpa8i1bFW+lJU2bIz7yW1unbNPQSQ9xM9pnpWF+8pup8tBwA2m/R9QTqb932u32v0XaxhPX0lwd3R0dHR0dHR0dHR8f7Exz4f+LPfDbzy6tM/1x/+/cB3/t+Bt996+ufq6Oh4qni+CV8g2RomrARdF+qqFaKP7EoWo/5tBiltMMbmrAtcqv2OBYLX6pKUg1fIBmvFnV3xr8e3LOmAwtp28bvmQT5+9kVdCGirvoAcqKxJyDU4yoSoErvWLrU6t/zXyX7ObFtTXB+DVQEn0tne30ZQtWXVbJVCRFKvmtBOv1ekfDOPbYOQjkFv8sDR4LbWHVgnp+vzJKXxsrykMHWUlar22LoehfUoNwKnvDxP/dwWdSwVS2nPOvjbesZMkDblSbRk+pq1uAErCbn2bDMW5Ftak5LajjO5o30sBFi1bnoIA0p7YXuqGJumOe8TNvlYa/8cAkCBgIMDbxjwjPEcuHjJ45ZzYpU7zcDgwTou2rYE8jXH8ZKcA1MkaE9PhMibrkeA0bCBe+ku+PxUbKHXyPqVZ5fqezB4hLNtGoeYUY5jnJW7xLHtHMR2OA4zeoBaZyOYNo7tR3PMrhllw2HjgO0G2O+XxHgKxpftx2pV6gi0EUtfcAAuL1caqzHOcAAzpYU35W8VGTmHvPAJyHkvmRE2mica2Zp5RlJGy7VW9eHcjohq5+Swq+pQewtj/+RI1mqueGnXI3OkvRZEAuNxrZZ1TL6OkvA653pUUsV5kNqhq0V3CzpGtBZ+MUdLdI/5hVOMd7YYzwnzTkhdef4ZLo7TYYiE/ZxvKXvCvIn/3ZmiB1l0Mlwydm/P2H32MpG9iTBbfceIi0TmGRjH5sKhK7E2Z6tiVUnexm9XopE6oNh+XYeSNdvm1rvCEbDNK986fmXBFjXm5/WTmMVgrZ/rfmzfQ/T8VUqGRdu13l3MtSTr/WPnPFYvS/quoeV4Us37+XxlW6yWWy8y08+td+irxoPWMWvnq4+56t8FdQ7kjo6Ojo6Ojg8fnAde+WLg/meBd15/1rXpeI/x63CCr8IGm5tFdDveb/j6bwA++VXAax8HTk6ffPmHPfC9fwl48EC+/6O/B7z15pM/T0dHx3uO557wTSpboAwM14FuVQ45ynkzFaR5IOccEEoEDHKZtjwAKceWVc9SI/DnJGC6CNDW5beCTINft64kysFhq3hUMoE5K3dbdnAhKjRtgLm2qwMyKYAqEFYHy+M1EJGQRnU7ACXpaxFzFaa8qkVFlYzDknAw581kcCR9Gzn+lsdQaVeRDonn8yRKHJs3116PHlu0IS8Do3o+54H5kI9RxW9NjHKIBEAkvdWS2apOFHpqq5BeUeVIVRgEKsnmVmC6VhHrvml7zrlb9guj2FO0CGMybRRMDmJTzwJGrVIGa7WN3eIZOEbwF7kAix9yJWjN7hvIREa+oOK/bgplP9NyjNqSA4E3cVxyMgaJojEW5TmpK5WwZSXYtLoUychIZLoxNsUW2cZ5huSeZcBt4tB16cEc4G6NONxlXIwkfe7iQvKrDj4rkGcUxL6Qc3mcgWPwdgC2g6iNtlvgMKJQ1K+ATnbgj72SyGV3mPKYHar72CI0C6UTgU+2GO/swIMG3g2xQNKOfo+kxg5bYYTnE4LfG5UqiypSldEhCq+UFKaZ8njkgHkj58Y70RkhxLy+adyAtI0qVgEZDwYPdpuouHTwzMDb91Yay2XlGYCUi5dcIo7LOUjJHTLE21TmhI3b5p0TS+dIYDNJW7gDlQsMqGhSaY+ZcvumeyH9QttS7bD9yNI3ttKgtMiVauaVNGeb34A8xj0O6mcTwGIxUj1nPAW4kx3o9ETI/kjapr5fLXjgaPFP9rdIuJFz4PNT7F/a4fJFj8MLlMcORnIB0Py8w2WQcSEw5g0hbIQgDhtgPI8W6JMofP0lcPJWwOlPvwv6mc+AnQd5J2pE25fiooKEeQZPs6jX49+NsPYO1iIrTQ7fsoEb5GPcPzlKBE4q3QLH+lgjd+9iIYLmsj8GDkiTeFJw2n4YVbvBqjiRz6fq2kWZSNuLfPUGTdI1Ols01cXmPcHmuCWrRq3qQENUTrfaIbrMLOZhk69XvpvnPlllu6wArtF6j9X81q3f1hYHMhfH2BzxaV87Htv38Pq9W/9tYRX6lixvqZT1+n2+j/Z9yaL+nspWtXGP9XV0dHR0dHy44DfAF38K+Ow/64TvhxC/E7fxTXgKBGHHewgC/r3fCXzDv/p0imcGLh4C/9v/APjpf/50ztHR0fHM8HwTvnX+LCVTAiclFc1BLEyHTAwnlZUlg+N2gi+2JaRAc1gSOCkoY4J7lkCzpEV97sClha+WmSzcVpQbNQFS209rYMoG/LXs+J1ax7fURbovclBJA2Bk26I4hBZBvjpYWQTvbADXBhzJSaAqmEBxHeytT8+RBHFV8E4uIN8bbdsWkZvuyWxIXdPfasWLvd8cJBi5KDcSILV1tV6TkjUOcry1XiRXxnRbimKtgzOMDFfXSGIrm4Lgtmy7L7l2kNWWWdRdSGOxpG0EznW/SC6nwKkhxtW6Oe1e9yu1IGcug6R2hYAGWe391kUNdb7qFqqgNNfXbn+bJiGrAoutL4u9Oc8AUST7YCzi84UhnMhCDpoDaBLb9KRUnWb4PcMfCBMQWVrNf4pEnmWVcLxMVQBHYm24QJF/UwhHIMTcqsMDwjw78CmBTwMOdxz41qlYUF/uJScvkRCRZBbKkHy3C2ngCDTOgCfwxsO9cAd+u0F4+54E7VsLXAD4F18EnZ9hViUxs5wr7xgvoHqWnJCjpAST5jCcZ4STLS5e3YgVbVz7ARLCdlBr68hrclTusmfMO0pEehhkn/EciQRmL9tmj2RfPM0E8gx4xuE2YXzlFjafebMcH3SecgBmFktn5kTucwig3RYMAu88+M45ho99FPMbn80EWSS5aDMsF+kUbZpJGMDMdbqYCciEoqpC4zgzbwnTCXLuYyApfZON+CztQADYyTyrj5+Siqk6kVCHF8trngn+EvAHmfNoGCLZHfuWncNoyNcU+2Ch5H4U8lDRIneauWEfU0F8jXq401PQbpetnAG5V2pnrnVK8xllsjcSqWAGDQPCS7dx8fm38PCVAdMpkPJ5O4BmhhsBv2fp20Dq6zRLczMB0yklZ4B5B2AHbO8xTt4KuP2jb4Hu3ZcxUR007PuM1lWfRUDI3vGAcHHZtsW/YXslVA4MFElPDizkbb3YicXuPS2WsMerO4buq7/H34pz5hOWc6S+sxT1dct5sF78BmBB1qbjjJ10bcdsy2gRqXbRFbmS7E2uHYaktu8vdb11gV61jcFx3q7IXrWaTukZqjE8gplB1WLCgnSuL8l7aSo9n3EJaS7e0ncBJXqpkT/4WFoIPS+16532GcdS5Vsrfm197DmApv2yEsMy95Z9Qwjca5D2gNwHxMWXzqF2Beno6Ojo6Ojo6OjoeJ/iV30j8D/6FuDLf9nTO8f/5Y8D3/udwGc/8/TO0dHR8cxwTd+75wCG7F2QwIpanfqk0AriWbKzrkPr3C21b62gbWGhZjGKBUtS1/s0glKr1m9rAawWVlQetQXggkSs61D/1iIQm/kUDalng6X1thbsOTSgu1aftF8mLJto2RrWfaB1bMu6ua5fInePEBOt623YMjYJZHv8VUqn65x3rR4N+8xl8JZW+kAmGFJA95jFqMG11L1rOT213ot80lVxK/2CHaVcrpgZpGrg+Kf5ZdP+kaBUa2ZEtZ7mUM2Vjv+JhKRaEtOsY2Pe1e8J/kDgyYEHxnzCCOc7YLfNZHbMbb6AN2OIIWsRCVvebUAnJ6La916UrDbfZlS708lOVLEuHm9zhq+Nm6n/ovwOCDE2OBzOKSt8Q7V/bM+U01dPo+skSPZNhGVFgCaCM0CUrYFAPmA6I4x3lKhsqFZb35njooGQ2247gG+fCyGa9hdlb7N/W6R8maZ/xfOk+XFlHgweMe8xCgVvUW3bXqlT6v1CWoxAiWxkWFtyv2e4gxJPlK9D58tj87fdxmE5rz0ubqLgfQLvEuQ9aLsBhiE7cdh6aJ835af3G7t4hQh8doL51g77FzymMyBsKSl6ddxwM+AmTtsttN+HbXQGiPl72QGbB4zdvRl4823wfp/H4kUedPO+waJyR5jBc8zX/iQU0te1ai4urvEusaIQTn83rEOxMKjKKwyszGfXKbsmdK9Tv+vAkr0rvwFozs1FXWqlaf1OcYWd9eo7Z0vBv/be1FLs3uRcWkZNXCeiOj+bTdJYj7fP7VVg8xy3fjuG0Bj7bFtcI59xR0dHR0dHR8fzgtsnhC96dcDp9gnGbzueGB4g4Ccw4X5fXfhk4D3weV8AfNlXA//yfxd45bUnf47LC+CnfgL4238D+Kv/b/ne0dHxgcPzrfANynw0yFGjgKVZ9qmVvbUSuFCsAWDvcl7BljowBXaq80Yll6hwGqpdoFSXWtVGTXbUyhkAhbL5ENUFam0dwlL9ZYNLdT1sMKsOFlnyuM7pa5STfBjztcTfUlAsEpOF4ldJssCibAKQVLF6TDrPSiCNg6ibyGU1rm03a23qYxuzUeHUFsZRQVdaK8/Jaho0VNbP8dg55HPZ3K9OCK1Cmaz1tsyTj8HhMK2rhFJ9GuSxLZdcqYwhB2wdcBhFleJj/daEVtE2MgWV5+ocrTx+lVqX/CB1qBdBVO1OyMcCmYAg7xbn4jkIKaqXZZVARlVTKIVsO4RQfF8oYgplt899VNsQ5hk24HkGj5NRHooSURSwiCpYlMem6+VE/hObsSdek5ItHIR9s8RuUluadmMHhB0QBsb2HQI076qPRB4RXGDQJMphIFq2zoTpdACfzJhvBbz7xbdwvvUYfvgecBilLTfxGTXPGTtRhZMqDQODN3LtFAKw3YABuLOzbAk/jqm9ycuYxeenwG4rTTwF0GieF6MeZh2jmOVe6xg9OIB8zCE8gqcJYXAYbxN4CEJA7h3cGPc3ZK4b5W/zrswNw0P5TkH2czNw8llRagePZJXN0YmdPeDvDZjPAjZ397h8hfHu5YAz52XsYBb7ZOfAJxsQl3MUb4b8fZqFF2VGOBmArYd/Q9TWtu8me9E4JhOREIY+PvuqFLXkYfGssOynZN1hhOQA5kT0Whtgi2RlTfG/QLShloUFdhGC2IyzqFJZ+hmNhJO3GNu3D+nesq/GO3vvlQzXa9DP8ww+jI+u8K3HjiJPO/JYdV0750cgMmkYxPZ8tyvJ3mqhlj57xbwbbbx5fwCdn4LPT/HOJ+5iPHOYToF5RwABu88x2Isl8+Yhwx+kz1IQlbVYOwNhcJi3wLQjjGcAR+tyfwFs7gN3f+wB/JvvSnsrOT0M5Ryb3jGq+WKcRAEZHlHde4xEC7IYhUPZh8hRdoMwal+qnTVaxKYUkD8XhKWxR64WkFHtirG4DGkbnuej9SDvyvekuj7196Zi2CLOZ/bdwiy0SufTou21mX0Xji1WgWwdWSrL56Kd7PPUcChgfZey5zX7pee9cM+pSFr7vZrzC2cQAzLjZbJ7tqldbJ1bz7pNs+F9eldeoE43sfa7fq5dSXTMj+fTaylSYdj3e+2b6d49ZceCjo6Ojo6Ojo6ngN/8K87wh/+dF3F+0gnf9yO+D3v8D/FZPOyE75PBR14D/svvBT7y0ad3jr/zN4Hf/q8DDx8+vXN0dHQ8czzfhC9QBhyBSOBmYle/kw2MsVUCVy8OLTWNKT/tY89b5Dpb2U9/qwlX3c9ubwWEbBBfg1EK/X5MLXAs2FOf79j3plVdpUIBMgnojZIkVOVofsvaRhHAIvddspFEuY8zbXfdwHsdGE3tbgNyjWCrtUGuLZsdkPKVaiDc5v3V/axq2J7LKqFrYreyr1zd7wiaqpQatZrX0dXniVbMTVtsLWNFldXMC71Sp1XbwrRf7jtcK+VijsFl3V3TOlJOWJH/Uol2H0tkB0CzkCzEssggEVrU6KeO5LU4EAhOyLGFak7viSGB4x85JBUwaRdSUi4q+sKQSUqOpHFSqbIQdZt3CaN34G3Ag9cchoc7+DmIbeU8Z4LR1L2w1033ALFQ017RXpwCwJuNlBUJx2yvKnbW1FqQkpqhDOoLdekjoSikM0U1Mm+F+NJ6uAMlq2uFU6U0MpHrZpQ2tzEfcohjWdhEsnfI+/iLTFrOO2A602cm9gsXF6QEbQ+3bDdDitB+zu0XSUG+3C/zkrZgc/i25hJ7z+oFCEQInsS2WlW5nNuD47qHmgS2+1DsTwtltE7HAdjen+EvRqzCkoit3wLSXMc3GP+Oon7Or0P0PgLJm0AE2u2yPXeN1j0MAUn9HJ8ROjvB/ModjC/scHnXiTp3Q1HZz3ATxwUjeZwIg5YJBE/p3gRPou5WBCF7T98McG8/AB5exKpHMtVXY+yieWSe5Gla2hA/Qnsd206OUl+gah5K3+tFZC3S1BKiR/rWghCt3lN00VJBdrpc1wXM70XZrXnzmMK5Rf7W1wZDADpqz6WNclPWhMqFQ8YF8y5UXV+5OKtqc7sQ0By7ltfW1nuxH/I7Z0odwlw8X9d6Byquu3rPro/Xuq0RwVKJ9ff9Gnqu+E5S9gXKC3zSpnz9xQK4lqL3OuksOjo6Ojo6Ojreh9gNhLvn3bHk/YoRjHud7H1yIAfcfgE4PXt655gn4J17/d8HHR0fcDz/hK9BUuzaYGkMsNs0nwvbZ1U+tchZq1wxwWhWosvur/tYwqyl6q0CXKkOmiN2NmqjIrjoTH1iMEqJ3nleHmOUQqtElVUNO5dUFEVwTMuuSeb43xT4ayEqbeR8mUQlS4QRC1caZhP8bAXhfVmODTqvkdJFW5uceBp0C5xI6WL/Or/vgqSJpK8GjwuV6EqQUDfb/hFYiGKrWqmDtYEBd4SAtnWqYRckrOUjTPWMQfoqUJpUtrorqvJUhMOhJFDr4LaeMz0n8ft2C7WHbF3bWqBW+p1ZBNFQ9mSVdyMoG4PDRX5Dc262wfKr7MMVIYBYyqTBCelLkRSrFnawEqIhsrTsQEEIwqSydCypOHXoGJCIGb21FISsjEm5o3WrqPhU7SeErxJmyGToCGzfJsynhHkHPPw8xuaBx9k8i60zEXB2IudzMf9zJFgX9yMSuQxLasszxzyJRbGqSb2XgP80yz10Lis4k9W1WTBhCft4biIhkwGIMnicAO8xnXhMt1gUpiyEr1OOMd4LzWlMLIpn1iFHqz0DbiS4SchPdtLuYQDCVvMpE2jKBPB8whjPSdTGgNTfO/DG5+Fs8FJ/vc45SJ75QW6I249CWhOJ3e+0Ax0OOKYelDaNRIcuckpjS+5vSS2r99DasW4GubYNcg7fAFAkDDk+42rVbAnh9AjEdg3bODQ6josYOB27uTfCvXuZFwPAzMfMcRUDtcd0lRazKtYeMyfssYVMa//4ucnCorXjyYFOT+R5aOVirsheyW8sjhY6DtNuCz4/xcPPO8Plix77Fwlw8jicvsEYLlju1SzKXkB+CxtKuZbDRsYgN0te31lt0oLcx5O3Am791AXw1j2E/UH6o76n6LuIXQxi+1esMx8Oj567d0GUuUjumnk3/dSYa2qltqNybqgXmlk3kjpo0XLf0DIdrbtmLEjY+A5yzK0j7Wt+03q1yPPkNqKrfzIxWFyHaZP0uy1Pid3F+0mQ64s5xO07o0w5lcoWhmytF1U1FoY1CVq1pjf1p80g52ss3rIKXorK2HR+otLVQOtj3x0aZUq+XDPXODM22f3NwrLVVBI1CVu/k5trL1pSx29D9i4WytmFUq68vx0dHR0dHR0dqAUuHR0d7z/o+/ujpDC6LiyX0NHR8YHH8034WtUZc1bT2WCxUZFlsjYSKBpMBUcCl8vji1XzKIOwY8NOUglbVSLZ89ZEIrNEYPUY+5slbjVQVZynChIr6VvvZwNRts1soLYC2X3rQK21i04qq1AECBdKTGvDZ6wMbXAvBe+JhHy1ihC12hwaXbUVsNdjtN0rki2Rri3SvSDKTeBa97MEYDrOLwPHTOVxRRvy8jO5TOi20FLJJqVxg9BN20Npy+xMELwOhpu2VGJOLi/aWGoAlhk8x2CqN8eb32nNppUcgDldT1Z4lkHndL2uIoHXEMq6FosfFA1iVusLIN/fltq80UbpewiJtCTnwM5HIld+p2jzzCHa0wKZgGMGRiH8SC3gI/mluVLJsxBnAPwBcIdIPkbiMgwylm3eBVwkJOdd/BsJ8zaeMqqP3QSEUSyKKURieM/Yv0KYAYx3Z1y+NMC99hHgci/PdyQu0zUrWbmyiIS0zzGDBg/mAGIT+Pde+tgwiGVtbcmuC14cgb0HHCTHsf7eCmbHoDednWI+dZhPGBhCvA8QgvYgn1UhLblKKeY4VptbUbnSJNuZkHLbpvy+LL9J2wFhR9gfPHgXMN4m4PRESN1xBMJJvrTYL2gyfYlMrt24QIgHJwTwbiuq53ffzaSLGX/VFhua21fJCY40iVr92/tm+l8aC+PxomCW+5dUutp3tPntrUoLPZDmuzDE9rLqXibQgeAvCMPbl6AHF2AznrGLCvdB6szq2mD7hHk2ME3XGxeugp2Xr0viPuYqWNpu4Xa7dN+KuXnwuT/EdxO6POT5erMBnQ04fPwupvMBhxcGHM4JYQsMD2WMVuV62MiiE79nDHvGxSsO7ICzN0K0co79HgzN3TudI1k+DxfAyZsTNv/iTRnTtxuxoFbLcH1/0IU0ZrENTzOw30d17/zobZbmcNNXkkWzL7Y127peJGUIUXNweVAoFweu9rM1O2irmr1JH20ohRf1OrZyvnZY0cUylrSN7y1rCmWKRD4re9143ynIe0OGtmyu2SGnd6hVuab9ilQM1XuZtZLmea7eGctyrP3zKvF6RV+076VN0pS53K+1CNKOK7qPcbbI76qmfO/ztdvrMKRusbgNyN+tu0/8d0BTud1J4I6Ojo6Ojg8n7nwU+OS/AvyLvwfc+7lnXZuOjo4av/LXAN/6H8nn3Q64defpnGd/CfzH3wr88N9/7LhGR0fH+x8fDMK3EWix+XmPwhKDqIjegkwz/7UkJ7BU8uq2Y+ds5dpdg5K5NYlZnO+KlUC2/pYItoGieltd5ytItFVVQZ1LLKpj2VXrDVMgdoX8THniVhSX9Tn9NQNcrft9ExwL1taqbwCFoujKuoX83zpQrcQ5GoSwPfd1UVtq2+/xGhY5/vQ8NdZUsRZrdbOK5pXzlApklxQ9i7rZwGtDhfS4YLs4pC6Pci5fAiOpa2vo4hNL+uYi4omUtI2fW1WPBO4Uc3AmVWYo91G7Z80LnMqdCdgETGfA9JE7GD5zD3hwYcid6nz2HqwF1ZV0nANUBkdRJUg+5uIlypbNxX0yY1YdRF8Bn+4wbx3ChpFUqHO+5rRfJCQ1/2yRI5nyMUpaJhJIqzAblfAM8OgAxwg7Bm+GnBuT5b4Tc7rWfC+W15P2cQ48+KwCLVRyZtEGZWVvVl0aErPVVtWzQETAZhPz8XJktln/k65Zc/y2kPqjM2SxqnsDpfai/UFcJIy6l+s5Vsu012E+P4nn9ko8rpJ3pUzyHthuZGFVdb085AesVD0TcLIDn2zBuw0Od7cYzx0Ot+ICggAMIxfEPJDvFQXONu7pBPm/qvydt0gLEoaHjM39CXz/AVI+erVyNm3DjmQxRvHeJO4APE5P9x+S1RxjrZ1bsPl8F+XIDkhuHfWcvTZX33ThQct22X5XcrZVrxbqhWj1uew51ubbG6aHSGVHrLq7VLBE6tFn+BHew+Q9qFWWea+9QR0fC/X8V9enfvarfQpSe+19vMax/dK/H56iWqCjo6Ojo6Pj/YvtKbD9POD1H33WNXnuMHjgF35sA+8m/Nxbj+ku1dFh8erHgDsvyOdPfjXw3/l1T/+c8wz8nR8E/mkfCzo6Pgx4vglfoAxqx6AjmdyZVonLUT1K1o60RWJqAL0V9NXfXePYurwUqDaqhbkiRtQGURVe1oZTla2JODDBIqvUVSs5u18NVeKoykDLiaQzj6MQeltpN1ZLPKL8WY/nrNClYSiUe5hn+U0t6DjbBBa53KJiLbVGU02RVSmL/LL2GHLI9p5hec+0revj7XkUIUoCLQlRqU4WloxJSRMDasMgKrR5Lkl9PX7U8ow61pZdWzSmS5gW6lmyCihri+x9/t5aWGAVvPX1zHNZH0DOERW9ydK5kXc41c/WpSZva0JXr9n0H/uc1PbSRL5QFwEANoOomuq+X1ufm+djoUpas820SvMW2a3PbAUmyDjkCAxX5BGnUZ7DsInbA4DDKGMTR7LSITFpBSFplJd+L5+ns0hcTkj5Ov1lHBai4pK9MHjuwKAgis6wAQ4bAs0M/8AhvDxj/8qM17/+Nj721wF3713QOImt9OCT9XBS3OabVAW6I8OkRPxglLzMMm5sNnIvJkSbWAL8kMfEwGJpzbHugUAhiEUykEhiJrFRxnaD8fPu4vJFAu/i4DI5bO5TUkyntoS03fCQY7sAPFAiK/1B2jLfTCEsAwBsGcMFYfOAsX8h2nc/9OCzGeE0INw+gd8fgPsP5H7qXORcSvOdFg5ZVVd0OGD920r7uN0OrBbbuh8gfZIpj+NGJWzV7jV5yN5ltTkA7LYIt88x7yB24ZrD195e1v5syF3O/ZLiAgK1vp53DGyCKNQnBzeJwprGSYi3k52UES3Q9ZqU/C3U8LFd4JzYdltS7HFg++vTVr8RwZ2diZXzyYlED+o6xDmcLvZ5HNttMb9wjovPO8d0Sggbk2sZwO4ew+8D3MSYdw6HcxlPKEh/dbM8Oydvyzw8nlIkeSkveiBgOgWmWww3AsMDwos/tsfw6XvS585O48ID8+6hlzWH/LwyR0eAWaycp4YLyg3bTNooE54Fqcs5F7Q8Fw4U56iWHT9Zp4w0x1bnTI4VZp41ziXJ5tceRy6/pwBm3jMEbr1/i9BcI27t/F7P5StW0IXTiovXY+boQiEb68gzFmP4wvrZpp1Qm+tKwQu/Tuja+VYVxRTEElpVya13nIKrjMfYBX3ceu81Slcq3uN0Aq22tRYV2XdsWye9D5VKd4F6jK9AVtlrr0WPje8u8l6i7wYyFpJ3y3eeluJYz9UVvh0dHR0dHR0dN8JLtx3+8n/8Efy5v/EQ/7P/4+eedXU6Pkj43f8b4L/3b8rn6wrBOjo6Om6A55/wtdDglAYmgWjfrAHCKsBbk7P6VweErlKWrQWOW+SiBrNmE1Cy+7eUglqu1qu2hrP1P1a3IxDFkSHDWooIG+jVz0rQARKEQw6uNa0N14L1NshZq0PXjjmmOr6uQsTaQ7ZsmI+pWWsb4LTPnH9vHdtS9qydw5xnQe7Wx11lDa3H1eeqtxXXv6K0vVH7XrGtRXCbIGsRtA0MYC63aZ0UrSCsJXsra0QgE9XNQPWapfNiv/J3IcNY+Io1Bax+tItMvKjfGQDPSnQK2RY25lAXVZMsFs6JNxNe11gQ5++So1XaJ6g78AjJRzsCvHcgB1y+zDi8sMXp2ankmfXRUFQXgejMUV9b3R6qvvaR7CyssqtxYZGHU+4XIVocOyHGdZzR+0xKwniPBx/dYX+XgIGB0YEOlJS6HO2voerdpIhU9a05tZke1PpaSfiZKZPHAXAHYHjgMJ4GYAg4vHSC3eUEuv8gF1j0ybg4R/OxzkEIPGYh0omgeW9BBGyGUpmoi2kSeeVSv8ntGcwcV84NiQCeQ2q3+fYukYiq7FU1uUVB9raG8XqbEsJjXJwwBxkfmaVB7TzcXPSTK8AuKsEfN3fvMaypoh8DqtKmk518rsvXvm/J+d0WvBkwv3CK6dYW02nMzcxIhK4/yDPMp05snOPCjuFSfh/P4pxuh0a9H2DMToi0eQeEaFnu9oThAbD9zH2xk/ba16r3JUuI2f8GBh/Go0rb441VLRyp0Cy3VsJq6gC7rUZrjq27VTUeFQvWWqjHsJu0Qf1u0HrPaO2/Us4xMedijtPFatX1lkpT865Tp5Cw9fGZ+D2q4m1YOtcpQeq6XFfZn+yWW3l2yx2BSDZTvc8xla5UaO3kx3+3+xX/VrimireVg9rCvt/U+Xwf8ZHs6Ojo6Ojo+IDgpS8Ahh3wmR97uv+e+gDBEeFsR9gNfeFcxxPCF/4C4Df8RuCTXwWcnb935/2Bvwr87e8H3u4LFzo6Pix4vgnfFsnZCE4yZsmTqTEVzRNIlJREpCoVZEIkEcUa5Kot1mrCAljaCNsAUOCs7AFi8Fvt1qpr0cCOVfS2rlmDO1bh0CC00u+W9GqUw9MkZK8qglXda2HqYtWQjFIVXOSOW0NtU8wsCtngym2KhRoWQsQkxTNnlZsSx/YYq7pRVVyqQ52z2Oyn31N71fc5FKq6xbXV59X9bH5BLbNFsq5ZUS7IYpfJ4BkorA6tDbR3RfsstlWq4TrnMoVGnZxpcyCrjFPdLPOwPE8roJuULRX5m/L0bobqvrilIkfz5+VCywUJqa68zFtd978a1pq2WNgg/0dwmSXTIHQAUo7farEIexfTngrrFiYHmgkIQtYWazyckHIUAGy1jEhWIp7DgoCwpZyP1eTxpSkSvxcePDAOr8w43B1wcucc9M6DPHaQ5JgV9hggCtI8wfCl+hzqNad7EokFji4Atq2ZsbC8LoLgZpzTMceqJOcA3gx48FGHw10GDQG49HB7Bzcj5ZZ1yjMGJT5jGxLH3L6RzKVMmtAMuEhQsrmd6bcRGO4TxpcB2gVcvLzF8OAEw89xagtVJcNB1N7aRpYwC5B/fHtzcudS3lQil1WT3ptxjuSzUbHTHORakp028nip95IZmCawd5hub+SUetsYstDAdn3OvwOG3I0LC1i3xfaTY2TBgj8Q/J5z/t05K58X8+3afKOY50cnFK+DaxJL1wUNA2i7BW02ci/NgjSY+dM6j/DpDvPtHS5fOcF8QphOHPyB4UdGGESRP1wyLu/6nKc73h9/YLiRsX9B3nOSNTmQiHpiYN7IGDCdEngjBfg9YXufgU9/Vm61VZS78n7Fs+Z6ByHz+XBoz2E3bji3Xo6xPSbvU25Z2ugikOXcVOeDlcMtiV3N1y1cReqmxYWm3vX7z03sirXehsMmIoR5yorlFklcvye16rhSp0IdXCl+iwVua+WvnIvNvKDqXov6vFT1u+Qe09qnqmv92xqhWqhp9Vz1e7RdhKC/6fvC4nqrY49B30GsCljPpSretbFQc/qaebkFUrcHszCzo6Ojo6Oj40OKV78EeOFjwJs/8dwQvt7d7NW5Q/7Z54HasKvj/QDngE98GfC/+k+f+CLzK/G9fxn4E3/kvT1nR0fHM8XzTfiqrVsdzLGr+5kNcZuVYRRiTL1xLDUDYlUAxwa91HLyGGxA3pKSg7kFtVpGz1uTvNX1JVJFyeGatLJlWVvogkgN5fmt9bP9Xc+l59EgoA2oarDNE9gGXpXgVBthDsuAbl3/phql2mZJuUSaRhaK43lmNBQpsT7uikBYshy25LQhHu15jx1vbZ81cOr1WLMQQAPdVklT2yeTKUfhaBFoVotLAOBZCPmW7XKhGKzrbuEok732PsZ6MWcbT1I+Lp63aKN0jzPRrfbgKXcdkD4v8v9VJPzC0tH2Z6B8flUdbIiChf2oqsTIydvymso3RBJriARcCEkdz6A8/pAo9OS5iKRJS9GaFmREQpYA9oywBfgiDhkPxcJ5PmWcfA4YLoDtO4iEJUCTlOv3LKrggRIRDABuYrgJCBshg/wlY9gKa0csBNB8d8LbXzJgPHsFr3zfJTBOYjULSB9OSl8H2s+iurWBZ+1jiZCMJCczeKLkAkCBZaFI4GjD3xjvALHA1vYefB4D5yCEUxyvDi9C8vfe38BdEvwBGB4wxluEsGO4qbR3BgHzVglHpNy94Q6ADXD5MmF4KG3pD8Jkznsg7IDDQPD7SLQRgEBwnnH/5zkM+x1u/8MJmGZg8EJuOwcmBwzShzXdANsxK6l859ReqgplTKBEBCvZ6zLBTiG1Nbcsg6dJnpvtJlnzAwDvtti/4KP6O/a7ETlHcSxaVMiIixWQ5lCO/H/KBe2EXE//hokq6M3D+Fz7SGI7JwsczPxcEHVK7sdroXECj+PScv1RYefAp0GGOA/aDKDT00TaC8k+Z9LXkvbTDN5tEF65g4uPnmH/QlToMTDsGW6S5yV4gh8lx+50QgBkjHKjkMAUbZxpBvzIGPYB8yYqhJ0sfkgkPSGp9d1IOP85xvnrY05HYHL3clSmJxVyuk4piKdZ1L2PYuVcK4aJon3zkvSlOF8q6c/znMnPxrsbzzOISZ49LUPnD30HmeP8g5KYTGVomgf7/mFTTljo/NzaV3/XbXJB5hp1YUgmU7khzaSNeW+sF5itqYR1W6xLYe1s9lu4Z9jrqr9X89ji2awspvVaOC6wtPN6KkPHJbMopqX8rbc199GUJfO8XHDXOq5F2NbvFrqtPp++l9Tv6i3Y7XX+XUvq6qbNkNNc1As6vV/UWxfKsXOgJ7H4oqOjo6Ojo6PjPcZH7zr8if/5y/iSjz7fIev3Gt+MU/we3MEvwebqnTveO5zfAv7zPwn8ol/6rGvS0dHxIcEHZvakEHPFalBVg1ZWNVTZrRXEbiGdq4I5j7usrAgoKalTlV3XpSaYtU72txbR/ZigOvBal2sVxTXJekW5DAAcQDRI4M8GOqt7U+AqC+G1YP11gvgcMglrA7StIK6nXOcrrCdXVc0twtpu19x4N7FNtnW8Dqzy+ZpYELayEbDBaEdljuq1OoVSXVurhcvcuqVat6VSadswt4+vty3y+K5h7b5zkBzX9bmvCvS2bMMtOUwAYv7alLtX+X/OJKOSbH5khEjuupHltxmFSpUoEnGMbNfLEIVvVAr7CwI7xhyAwx0GTQS+dQZ6eCntNs3Cfw+RsApIxGQTtr/ruHtM/VSPAyvjEevCHA3GDwN4u8F8ItfuLkjI3Skv4FHL4qRapdgEyjOr2nnWxjXkmFYrMNxM0o4O8BeIdqBCtIeZcLjDGM9yvWkOmYDVazk2Ztm/oi1cHldqksIow9S9YtFuxQIf83lwmE6dtI92LnZZPa7ViP0lHRlJw/qz9l1N/EtMcFFBnq7D1lHr1piji3rPccy6jv3pswYRyHshEYcBNPhlbh47p6eFEh7jnR0Otx3GW5L32I8MmuOfUaYDgJsBN8t3f5B8vuwl168S9TQDNMS+nohe6fzEMiZojurdvRnbt/bmGlxRv4Ls1frrNs1b/8Tb0hC1dp5wJp/v45T9KIRYTUJbwrLlnXvM5cSiXjx30zIK6/eVd41r4qkoQht1WlUUPy3ou9UN37GSatjOX5astXPWda/D5Oltjmv2GYMWb/rGylxqF80Vi/o6Ojo6Ojo6PtxwDjh7Ebh8B9g/uHr/Z4jdhvC1X7LDi7eu+R79FPHiLYcv/8INfvKNCe88fA/eVx8Dr8HhV2L31M8zgfFjmPCTeITFvh8WnN8GvvCL5fOt28Av+xXARz/+3tbh4QPgJ38cePON9/a8HR0dzxzPN+FLYifIjgqVVJ2zl9U+jl35uyknKY3qlfZrCtvBLYPpreCaBkxV2aPHa5C+Jsj0dw3OTFMOCKVcpyu2cbU93DAs1Qk2969e22zqZctcUyGEANZrMcFJnrMqtVB6VDnfit/IiaWMKorMfu1cvySKLw6ZACjO0SA6VIma2qRRN6C8f6pGHgY5j6qEbW5NJUGTzWGltLEKHltPbW+1I66tGNVCGVQGeYMyfVi2T63mUTWLqQ8NVX+pLZhrxdGxgKgqW7WuUR1FQz5W73OTLAZyf4rtYNXBuY5G6WtULEV+wZatoSFQsmrW5TJt/l5VRWIGj0deWNfIgXRvnSzkcCyEqK1LbAMOLETMZO9d/igqPI+wjWTj3sNdOgwX2Yo5xFy0wwMCE6fvQvQlng08APOOEDbA6WeljofblIi8eSckjx8ZFO17d28ypkvCvBsw3QmYzglvf/JFnP/sHtsf/zl51kMA0VZyjgKluiiplOPYuxmiAteMS9tNahclQouck1HBy0SZTE5jnoyddW/iO+cYXznDdB7g9oTd51xql7CRtpAFQbGYWZSSPAgRzAMwnQCbB8DwQPKjAoC/BGiSezZvo1o6IKq0ERcaSRv7hw4zbXB4ZcblS4P063kGRgJOtkKyzSxqaNseOh8oVBFv9wGk79n8v44giZF9nl+2xn0hHRfb0NqWR5tzngPCyYDLFwnzjkXt6aQPuZEiwRjbSInvyIfPW+Tfddj1ADuO+xI4COnuL4Dtu7OoP4MuaInW8Kp+Hrz0FUt4O9MOzBDL4PHRSDpt62MLMp4QaLuF2+2A3Q50dlKqmXU8MmQvOwINHuH2Cd75QsnZG7aAJxbCfA5wEwMBGC6l7x3uyJjr94zhYYCbGW4MuPjIFtMJoRBLO0pqfzeLWhgA2BPmU4YbCcMF4daPvQV85k2AnIzpJzt5Ru28WpNZIYCnCeHdd5Njwo1xlSqyVsDqrvbdolg0NICnScbbOM+RcehoqniPKcdrorKel72Zj7S+Ie+zyBFvXTqA0rGiVvXac+tvVqVbK3tb9W7U3ebOvQrZsaVM7aC/Fe1Z2WcDhgSPiuBjJG9BTHpqb0/XF99tgCVh6ly27lb3kNlcb0GOu7KPGyccdQKheQZtxT899fOWHbN+1rJaCzhrNxIXrcnt+0zIamS2jgza7jadhVlMwrb+gIy59WKTjo6Ojo6Ojg8nhhPgS38D8Jl/Avz4X3/WtXlu8E1feYJv+ORH8W/9kc/iL/3QxbOuzvsC7yDgt+AN/FQnfNfxVV8L/J/+Qvy3AQHb7VVHPHn88D8Afus3Afv9e3/ujo6OZ4rnm/AFqnxyeZsq5QAsAojpd6OwWdgUWrTURscUWpbgChohN78BRUBpca5E2HEO1DALOUwkQf+CNDXBJSd5HovgWK0Iru3qKjJ39biWtZ3FESvBo8FUMsQmMwoGzO5jf1cyQInNYAK+i4C0CcLW1siWaG5B651IUA2umn1qm+Wi3ob8VeJ3rZ1swBRUBoHJSazbWkO2rJ7TooA5E7oWTRLdlb9fRaYcVVtnEn6R89eekkhy0FXbjuVHrPcvAsU3Ub7H31vWlVRdW6EgW8vnGyKBFgKw8e3xAkIcqnpX1JKi2uMiwO3Bm0Hycg6isFWLZhfthil2eTchKX1DzF3JZMg3kmPSdl3z4oUn1LKmE8K8k5yeIIAmYPMuYXSEMAD3P8+BeIfNZ24JyRsYwbZZDHSzjqWRmGuqdVXZaUk9u8BF24xjrkbnoi1l45l2kXydA8ZXznDx6hYgsW0eHgLjOQAnpDeCXBOZ9pB6xjy1M8SeWe1wo7KV5tjuQdqYnZDB7OWPGMDEGC4I84nYxs4vjXLu114B3n2YAvikeRd10cqEsg1sf7FttxlK0hshEyHJ0jkkwp3mEO2xTfmBS8VXCGK17h3CxmM+lbZSpXKyZ073RPrGkmmXtrHb2QO84fS7m4DhkjE8jERv/ZyretTOEfZ+p/scFwZdlVf7OnhapG8kiNxuB2w3ouy1p02W+JGMiSQwzTJ+sCNM5/I8hkEWHADAvCEET1ll7bSf5rE1bAjT2SDP/SR5fJWsl3MQaACCp7RgYd7J78PbwOkbDLrYC7m02WYbavv81urFKZL4+72MlTe9L3W/P3ZPlKjU+UXntwap2VLZrqpHLWFqLI/jyfK8XS2gSnCVGtembohlFKktWjbPx2D313cCHcfsM7PmTnJkTr1yUZe1a64Ix2J769xr9anKqwnktX3TPG3mb7pC7W/TjMC5YvhaKHbr99s4pqbjbR1bdbVjSq3YrVOi1NC5IVd8ud/iPeZIH2+cn2m9fTs6Ojo6Ojo+JCACyAO3PgL8vK8CPvvPgIt7z7pW73t4R3AbXjNX+dDiAMZ49W4fXjgHbHerrjzvCTgAhz2el7zdHR0dTw4f2ClLVb8FIVwHaVjyRnJUjTVX5zcLXyEq7DE1gaHltxQya+cAcr5Ke15LbNXB2FYZui8zWImp+ndVEcdzpP2CWNZyCMugZjpNO8eaVIvKYKmFo7y9zo9bEBWGuGwFlQtSbu2emWs2KpwiYKpkZx3wtedRwqFWzVjVSGsRgqqEASRr1ppc1fbQ31OAPSzLLQgTE7COx7YUTLXytigr5VxdGRL0egNL0NnabKb+GdptYqtgVEXkXe4fen3p2l3MIVkSi/rHjb7btCO3+wDSn5lL9VF8PkXF5PP567ZrgAMD4yRkXFocUAdmIYs15nztduEH2THDO/DpJqpSA2gkIW1ZylEi0k2AO8hnJiGHgkdJyBFAs+SeVYKSI9HDDqnceSdqTY45XGkGNvcBtxeC6eI1xoPXHKaXzsschQ7LGSQSUYv7oH3MLnKpFay6T4jkZnIRMG2axhPOZTHj8qUtHn4kqr1GYHjISXkaohJ1c78kMSkgqSZpltzIQvgibUt/QdqYnSgq0wIGJTQvWHL9XgI0BExnjMNrt8C7jRBi5lp5cNJG3uHo+B2382bIOaKd6aPV85HIuFa+SWY5X1QIc8jjXNg6If4S4Rv/tBiSz6ocL6oXcvso8csO4CHeV1X47hn+YfznoB3btN5AOQcrLIkX4vj1ODa+tvzHJY0bSDbOpyegzUZI00iwJ2vx+Pyzvf9xPGLvJD/3DghRCM9O8kxPp4TxTBZhhIEwb5BV1wDmrcP+tgdI7J03DwL8QZTsNMOoeuMzv5PFEOyAzX3G7Z/eA5ey8lcsqF1eOFD3T+1r0wQcRlFdP84/Ilf6f6HgtTD5c4v5x/7Z43Vu0kUDwPE5287N8b9c972Vub75m6ZpMOWzvhddpbBtLcKK7w+cFkBU+1TvJzpvNtWtdm6vFzjVMG2YCdjleVqqXfJ+Se7W7iaty288pzp/8yzvcDqnp7m9OneC91kVrKRqzIHL81wcz62xNDojrOXcBVAGdOx7f/x9YQstJ1ueS+ta/+l7+cr1pnPUi4meByv8jo6Ojo6OjvcGt14GvuCrgdMXnnVNmhgcsBnoaZsy3RiDl/X9HR3vezAD4wGYRrQyDnV0dHzw8XwrfG3AmJdWzVwTK9bqOQZdihy/6cAjRK+SOi312uCyamtUK+ZIYumxuv92syQqUyDSBIOUKFBLNw2MKjmlx05TKpvsPvq7BrnWgj66bwx+kbnGVJ5zqY5q8Se7NYJOGiRNiUeNEkcDicGV7WiJIKAkIi0xrOTpmjK3FTi0hLEpj5RgqmEVt+ncPn+v1T5HrBPTeWxZllS0ymFrp2zJX8DczyAKH/3N2mg6OUYtlhdtrurhZAUIY+l9ZP2HDby3cgyvqYL1fNoOSaRoSF5tN7sAwBI9awFN+3u0PySiUjErO2QFpKp8QhBysy5nDWt2zjHoTtMk9vJhI8xYoETk8hAXlcRrpTn3efY+WvwyaJwwn5/g4qOnCDth1/yeQCMAFuKSh0hOPgB27wRMp2LVunnAmE6EFBoeSj7zwwsEvxfyRyHqVEqkEkVl63AJhEnO4wKDHgK7zxHCfVEbHu4An/7ac7z6dxy2P/MWaH+Q9tQFKQ0yiGoXAueyu4IGr7UZN4PZ1dwTIiHMrbJK/9T+d/B4+KrDw48x6EBiRcyccsZKTlkhuvxBSXAkO+vpRM63fZcxnUQb7K38vnnAGPZRie29kMQHaTMQcPkKJbJYLJ4JfPCYzxhvfPkJPnb/Fvz9h9K35hAtoKNy0loVaxspieuc9KOo/ASREIgKfWZtn9U29i63fT2+6hwSSXO6cwvTqUfYcFKeu4lAs322pS3m2IZKgnuTB1rywsrzzQMD2wA4hiqANw8Z/q0HeUzThUXeASDUaRhyeyhBhWjJOr9/V6cSwZ2dibJXiaR0L+PiMyeke1LDVu8R/mLE2c9xXIRBGG8TRiCq1lkWeUD68e5efr445u4+/dwk52EheGdPmLeEYc8AiW25HMu4fFHOOdwnnH9mwu6ffFoWA0V1MoiKZ5i9K5WKAHiawRcXCI9iEbX2zuWMja2mI4h2+Ilw1fF4hlgaRwJVCV4ODFrkTK4I0fpzGqOrsV7r4H2e+3Wu1OcwnouI8oKqRPqalBJp3vQg5Otb1Kl2AVH7Zls2PMheoj1HtY1ddZ2t89TEs0lFUVgyQ+9PKMvQbWrpXL9ORJKyZdksKlp5D6rn5eVcz/I+tfHZWrlyauH4zlyrgqW+MvfwPMvca4lYs0/zXbm2LK8V7/Y9XsfzlMJjY66hJvBXSNkWiVwTyoC4YFBe/MC12lh2Wl5PR0dHR0dHR8f7EH/o376Lb/zyE9w6eX8xvn/ot97Fv/Mv3cJv+2OfxbsXnUXreB9jPAD//v8E+P/93fdv/KSjo+Op4kYRgG/7tm/D13zN1+D27dt49dVX8Rt/42/Ej/7ojxb7XF5e4lu+5Vvw8ssv49atW/gtv+W34NOf/nSxz0/91E/hm7/5m3F2doZXX30Vv/f3/l5M02N6/5vAy8LmeYXIsXl/CyJ1TW1Vn0+PtWTE2n4WSkQ7Ko9vVrLxe0tFfOz41r5GwXslajIHR8ixm6ivbpKH8VgbtSySj1kT10rUFm5yHdfIgbdarlURtXIL221N5eqRc7fKANrEbq3CPnb912mbK9rkaP8J68qVq3DlMdddJnrDvslrz6kummCURLRVM3K2puSdx+G2S2pLRGUlgGTXzA5CaE6RzKS8D0iUu26Wz3IuZAVmVAirNSxivWgWUo8HSurf4RIYLqKSmIDxNnC4u8H84nm+PqNgEotkrYcoGPUvEV5AXohj/1QtHBXC+idtx8vFFNqGAHi7wXSiJK1cS/CxHaLttb1eQIhLbR+KpKQbJVdvylerjw8hukUg5QHWtgxGFe1G+aODAxNweAGYzwZgGIQ4WxvrG3NJ6is2/QCQVcGq/rKLcewCJy3PwpLl8aWfz05E5emRO5Hpc6nfWB5WP/PKdkIie1Ux7A8BdHlY1KlYpHW0vkfm2PcDooIR+mfvDdHynURREJ0ETAG7d2Zs7zM2Dzgp0udttF4/geSejmMADxCr8ch1uVEWJ+gzk2zctYvFccXNnJ717bvA5p0Z/OCh9De1cm7V0W6bAzBN0b3iMe/LNcblVbv9Y2P1MRVujdYYs6zE+rG4xvxj9j26wKq5CO2K1/W1+X6tvCeBeM41hxdFK33CKgriu7xmqubQ8vvxa8zOHvm9t+UUcjTf7jG0VLuPgvo4615y9LDjffBabd/xocT7+t/2HR0dHR1PF6d3gfOXgUXenmeLL35twCe/YIvBv3/qRUT44tc2+NIv2MDfJP7X8eHFO28Df+dvAm98+spdnzgCAz/+j4F/9mPv/bk7OjreF7gR4ft93/d9+JZv+Rb84A/+IL7ne74H4zji1//6X48HDx6kfX7X7/pd+M7v/E58x3d8B77v+74PP/uzP4vf/Jt/c/p9nmd88zd/Mw6HA77/+78ff/pP/2l8+7d/O37/7//9N6+9JWqBQkXDdaC8QVq2vrMzVos2t5eeazNEa9KKGK4tXTUAr6itiDVgaoPaw1DmzbPqAW+snVXt68zvmw3UkpltmSvtxiGAx1FsMm2dgrmGmoiw+85zstNr2wE2iM1W/kV7nbYNXXX+YNoLQLIFtXbPqZ1jnayCVv/i/szZDrBFDosNa1TgtCx+621al/p8tSLI1pertrOqXiUOrOJXr8kobwAsrV2tSrYOgtp6tF5UazLcnk/tHK0yV8vSuupnq66yx9sAsa2faZemHeRKsNLmrOPaajFuXzzLtT05kPtxbINl7t7rLYyg6hmnKYDGGTTOcOOcibS4jTgqfucAHjzGWxs8+JgQhnRwBYmWiF8vJM8ciZ4wEKYdCdl7EAtnzd9JMyfiU/4Y/pIxPGAMF6L2A4SUc5MoecdzAlhskTfvMHb3hPhlB7z9Cwa8+RV3ZBwMAbQfs6W1uXbeDeDTrSgFvQdrLtNIViar2GgdCyWjA4rAO6mSt2pnEIGmGdgMmF6+hekMCBvG9h7Bj8B0RqBJ6q32zEpchw1h/wLhcIdwuCX7+T3DjygsoJmA8bbsu39B2xqYTqUvulGJYuDk7YDdPcb2HWD3hoffEw4vBuzvbsB3zkVtptehimWdZ3T8Y1F5YzY237YfJjVhVFYPPs8ZVkVaq86IsjOC3qdxAgJjfPkch1uusPxO5DikzdzBENuWNFeSnpBtnW33nx1odBguCP4igC/3eZwMmXhJ87Sdz0O87/sDcBijg4W7FjH4LEDbLdyt86zujfeH41+RhmGcki2s5u5NKu7DiLOfeYjzn9vj/NMTzl8P2N5TxT5w8Spl9e+Zw+ULHpcvOoTBLHrS+6POAqbJdAEEO8LhtvT1F39sxO7T96WPbjZSdzvnO7NoY4hj+zSD9weE+w/A0xPK3JSeBTPe1uOusWqu7Z4tIZw+t1StrXJ1m52v67QO9jd77to9xJ57jUSuHS70OFsHSww7iveieqesraKr9yHypq62Xeu6OWrPs1rHqq6FPbSey2wr5tfG9TftiK1CVxcSWCSLYyqsnPNv+d2idS1r2+Q6KxeV6l23UNquEcJa/3ohpe4/jkuFsBLh3suCEZN7t7bBXtTLHhdttrku35DFj7KAruPDgffdv+07Ojo6Ot4bEAFf9MuBT/w6wG+u3r+jo+Nm+Pt/G/jv/1rgu//rZ12Tjo6ODyFuZOn8Xd/1XcX3b//2b8err76KH/qhH8Kv/tW/Gvfu3cOf/JN/En/mz/wZfMM3fAMA4E/9qT+FX/JLfgl+8Ad/EJ/61Kfw3d/93fjhH/5hfO/3fi9ee+01fOVXfiX+k//kP8Hv+32/D3/gD/wBbLfbm11BTfoqKks5qoNHKxDLTUM0xrJWCeNafWRz0YYYHdegGyuxafZXq9m1QHZlMyflhkyQNvZPR9gglVXjxcAX2/1a6gRVJ5mcv5SUS9ZirkUcmqCn2gDaYJQlNJSk0BV8RV7dKkhl97fnry2QNXaogdPKxrBJIBakrgnyWjtqu19hR4zS3rG2PbaBVq1by0axvs7UDiGTv/V+xq65mXvYwpLPa/vVwXKOVoy+Jr7nvG8daKyDvGqHqeW3guCcA51FXVYCxgoNNDOwJHzrXHtGaVQEnO01kxOrzOuqfGNu0aKvegLDRxYs2kzbhSUbL0RkCKKwjXapPEg+VWLAHYR4pVmsma3SkgkYz5HsW0Hyxx6JCJ63sQxES2IizDsSi+cpk5rpWCdWxTQLoeRmIY9oYjgiDF4IosNtwuG1Wxje2YtNr1n0QgDYBsXHcX0cjcekMdOV9yih7gMuVvjACKcbXL62kybfE1y0pWYP0D4S3hMl+2bNWarW4qrYZYecA5mj9XOQ7Y7Ltlfyk50Q5cTA4VZUWbK0H1h+f/gRD79/AWc/cpH7HjMYJDacOh/oGF0vsuFI6uiYqGkBaltWJcGjqlNI00jw6r6OgJmFTGGxv92/vMV4TuC0miCSt3EBAAhRRRpv4VQRu0oARxWpqkmVt1N1uYtq0DT2+mq+0UUZrYVKabHGuPztWYMIbrcDbbfAZputnL0vyXe993Gc4JjPmqN1MhMBgwNvPMbbWxzuDphOCMOFLOAYLh0uXyZMp2I5LjfApf46njqEgRG2FBd7yPncxGI/HuH30v/mbf5+8voD0MPLVJfFQitdq2HzUI8jMB5iDtn39p6QznO17XLDhrmA9+V8Wc+FrWNav2sKhtb8vKYybcypKY2D3d6qg7E6LspqYY3grq+hPsbFvLv63pEWzrlmWYsFU41FWvXcukY4WvVvfmfPtt7pfaBIXXH1wg9rH72wkoaQpU31rlpP20Vruu0qta+OY2sLz1r7Q64zjXMmz7C9livPW3zN70Ns/93Q0dHA+/Lf9h0dHR0fFNx6BXjl5wNnd591TdogB2xOgC/8auDezwFv/vNnXaOOR8RdEL4Vt/Ep7J51VT7U+Nqv/WZ86Zf+qnLjR78Oh08T/utXGPffixzQ3/fdwF/7HuDTP/senKyjo+P9isfK4Xvv3j0AwEsvvQQA+KEf+iGM44hv/MZvTPt84hOfwBd8wRfgB37gB/CpT30KP/ADP4Av+7Ivw2uvvZb2+aZv+ib8jt/xO/CP/tE/wld91VctzrPf77E3OeLeeeed9JkCS7C6ZUEYg61UkzFx3zrnrx5LNi6iAZlaMaznWSm7CFzrtpR/9khQ0JLHlforlVMHlDRQ3qqDBv7j9xTIsmpEq96NeXqLgJcSWoCQMs4BLpjgqS8DfEBFPGpu1QZhqUFFb0nkBqlpoYQzB3OtVTCQSAiG4jjXJpT0N+/SPW0Swi3yUa9nNvUcpH7Mk/SlluV0fW5bVn1OvbRafVsHrHV/ABhNsLUOAl/XulkVRzYYbdqoQEHIrZHIJuBet2WDlF9D0ddi7l6QAxGvBzfrhRPRDrIINtfkb2p3Xu83iMFkVa7b595F8jMgEWJZpSv11d+UJWOfFaZKXooC1RwfCd75VNSpavvKDmBPCEO0eh2QAug6ps07gALBBzk3GbKXCYkc4gEIJGSyH+NJiTCeA+EMuPjIFqcA3L2HyzEvALwhKb9Q5TfuqfalDfJ4N+lYZO+d7V95vAu7AQ9f9hB1s7QFR5KSgqibwyzEL00An8j1pjFer58I7IUUp5DbIQy5/ZQADhs9Jt4jiKI42UdHtSuIsX/JwU0Dzv5xazyJN01JXNsHbV+zbajEgFMP30z2KnTRkthOxw5mF8lENRhoi/0LHtMZzLEAzZT6X7IEjrl73ZTbLqVnZyCYhQNC3DMQHChIWTQJ0UzbzeIepq7gXVI4F7D96/0GcqDTU7HtVsLU2JgDEGW3HUP08+ARTjdiez7IMWHrMN72uHzBYT4Bdm/PcBNj+/aEebtFGEThy9HdQxcmzDuI6n9L2N4PomaPttr+wEkBLJ91QQfg9oB74+2s7l1xJSFVZAOy7TCCDyMeOR/QsQVXxxba6IIuOy/a35qK4KySlFy21X71XFMvLqnmOskPXJ+GQa4xH7fKb6mX7SIyWw+7bzD7LBbAtMF2rq4X6dny7dwcz9O6zqML1Fb2SXOrneOr/fX+6L7pfs2hzPNrymxeawv2nda+Qys5u3Y95tpT/b05Xn4or1PfzW25tYq4rlsImcyuc9vb95xFHUNWNutErzbXuu26aVs6OgzeD/+27+jo6PjA4OxF4PO/4lnX4jiGLfDxTwJuAN76mfh+/2z+3eUdsNvQ+9oymQg42xIe7oHD+yhzwR04fCtu4yW8F4xih8V2ewKK/9b66q/+Jvxr/9r/YrHP/TcZf+0FxqjhWooxlKeBv/XXgT/xR55S4R0dHc8LHpnwDSHgd/7O34mv//qvxyc/+UkAwOuvv47tdou7d+8W+7722mt4/fXX0z72H4T6u/7Wwrd927fhD/7BP9j8LVmDqmqGua3mrQlhKu0vKQbd2btEBKfPIRiCwARt6/KtMliD+IBYU7YIWWAZBHK04DsL4rc+ToP3rWsdhkzmxv3TmS2BbBHLIkMUi6rXqCFrG8HAYFTKEA0utmx67XkH0wVrIpLnZSBUrZ3rRqptncFmm2kftXBOzaAE/7weaOawDC5XxWpZgJJcYRmUtEo7IDJ4Kwqj2hayPtbWzQbKU+CwCqyuvTTHe5baobLJzMrk2G5My/6m5dRK6ESGzygU37q/raO9vsDJzrGwI5znFOBMOnYNJqsFd9yW6xWDnrb/mfx9TbtD07fJRaUu/v/s/Xu0dct1F4j9ZtVaa+/z+N73qbdkWbIlgx1jbClyGxpoGbADJM6AHgwIBHDSDBuaYTrQBAIJDZ3RHgMIAWO60w1JCIyQJjE2tjsNtrsB2zQ2wQbZ2JaxZcuSpXule7/nOWfvvVbVzB+zZq25atfe53zf/Z7SmmN8956zHvVatWrVmb/5+03Iy1MCHMzgfjCAXEwtS7v/CGHuRQKZOTsCEMLyZGJwt0R/6DAsOQO7rif4DeDPJOdm9MBwlADhDZJc8xikovl3MQAHnxlzgKoktAKZoSXERapjI4AeHODOOAOWYSkgUt8JmOlXjOGAEFvg3ssOw2KBI38di8+egc42eewIARjSM2ib+noJJ39G6roZASAB52lclfmqjGEqgmi4a9FfarG+QRgOBOQOXRqTDRBTjtIRgE3/WPqiIK4fZLyjF1az21AGdNkLozK2wvqNXsBkvwZcDwxLKb85ZZFEdoTmBAATYusQWmFExytHoFUP6ockb536rP0x37E8B1UGO8lnI5h3L51n76b5gVV+F5C537Xb3x7vQV0LWi6xuk7oLwGxk367QcbOr8d5wV6mvU/HQ4cpaI4EDvsxcMDmjxYgPgEPFpy23zRmUG8kq20glfa5Jtn+BI0WC8l3a2VzS4as/l+ZsW0jMuRXDxA7h+HAI3aE6GXOxYbQH1B+917/ohbdXcblj21w/KkBy5sON9/jEVvABUpS5Cx5fJ0EKKyuuMSq5gTSp9zUJOfDQkDjSx+PWNwK4PVa5oT9FhPJvLPt133NMIDPziTtwYNaLQikAEDJ0VRaHxiD0LakcWO+b0t1Qlnv9tiEvVkEG1mz3zKVjrZtsHLS+8Be294MWIfxdzVT5l71DVuWvbc8pmb3CeX3ece9pN/aMphPrQLyWuWMfTljyTsDZsr+kdK6RWmNkuZU2LIwey0b6GIBXBvASJTZvLlduifeFThpAmR0npM3YGwJFusY1eSfsyJPqAev6PfN9GWSb7i0VA7p+5kCFHMO3xAAdpNxfBJM/NmeTXta/rafbbbZZpvtCdiNdwKXXgT+7T8F7r76RJrwm778AH/ud17FW288vaDly1c9/ts//QL+7g+d4M/9vTlY6fPdmqbDH/tjfwdvect7AQBXr75Yve4wAn/64w4hbfn/5osR//zy42rlbLPN9vloDwz4ftM3fRN+4id+Aj/4gz/4MNtTtT/xJ/4EvuVbviX/fufOHbz1rW+dXmQBzB1gZmbplveZ/1PpX7HnS2cNkbCZLFBWs1oZ6uwu27mPcallWAZBjXm4C8y9X9NylBGpx6xVnYtskGWc36cHatt9OP5L6UU9tqddE4dlLTdfWe6utt2HI7l6jZWC3lXeeWOxC8Q156mcw8U1I9vbAFI1wLZy/wiq7zErJQlss2T2XavXA5X3qeY0Hxm+VbPgwf3Ms612Vn63XSrWnnjQIHRmTWFkKWHiaZytgpXK0lc2LydA0wWG60kYp3F6nwKfKkdMzCAmeW3j9r/YpmnK02PDAbC50qC94+E3bgxsCQrW2gYXATd6bBfrt2Iqi52VCRoPbkgAyNpUSf20gDgqfdRYhAkbWrFJi5Umf31MY4wo4PIItlMG3F0hiTxcWqABQJskS2znxr5x0CAkuxajuFdNpeXTNyGzfO2YZkZ1Bz5YJGYoA46FjZvarfNOGb6ZBW5+pzCOT/QJILfdSGPtem2bm8gdU+RK+9NY5HewApA8DUYEahoBXSiBKzboa8c9aBvEwy4BvQ7DgRNWvh8DFLI0eH7PCOtrDdp7Ee1JRHPmE3AL+BVATJP5rWWwIxnOmNYOGucoe0J3d0B7e5OaRuM8LOdiZu5zyhOa8qfWAn8eeDzNWlv5HgqDVudCLE9OfzffhcxS3fWtf5C9SW3vUKZ5uEj5tdQK9htd+7lm++qYsHgvUH/F3mju1y3lDK1eQcrqnuZide4Elp07X375IsEjFWC5ev8ucLYMNlO7CEP5Iu2LI7g+SdNSmtPNwWyz7ben7m/72WabbbbZHp+1C2H7Xn4RAAN3Pws8ZqbvlUPC+97ydOcTbhvCe9/c4uVrTy8oPdvjsZdeeife/Ob34J3v/JV4+eUv2HutA+HNm/H3o6BOpYdo9+4A//pfAr/0iw+33Nlmm+2ZtAcCfL/5m78Z3/3d341/8k/+Cd7ylrfk4y+99BI2mw1u3bo1iQR+5ZVX8NJLL+VrfuRHfmRS3iuvvJLP1WyxWGCx2JGLwDpJlKlrHOUTBi8wOsFZ8lrmMipOmXweqDqeOTGwstTzLharMpZ2mQUWL+L0saCvAnE1h5MeK9mNFjSoMZX32MQp5QjknOT43ZL4TegIOfk58lQOWPPBctwet+wArGyiSmZMkhzOjI+mycfy9cZxmpmjTQM4YW7ne2GeA0agcnI+suSV03yAefx3AIjKmtr024CxAhyls1VzAV4EnDYOv5wn1wKwlsm0z1Fd5jyG6beyvVKbOJi+TvoSp9LWWp9KD+qYEk3rSHNSx39SbypDJMGFmcPOjc/Fznnb1xoYoddqjrzE+LFjuZflvcPIyuVKw+WfTo0JqKVtTZfGCNoMABH6Sy2GA5EWBtMUI3UCqsEJyON6pFydAAjojygHWVDknGeVgoC/Y0FyPRPQ3ZXjoUvTgMfzsUn3csp7m8p2PTIAHZaE0+cdFrc6UB/hEuBLNs+sBfG0Q6rAQCTyt86JVCZzYkKnpjZOpJiVke0c0DjRTmJGXHYYlg5hwUKWTwAs4thHYhkvkIyfG3h8HgqqLYCYmMDKCPYbToAxSRtCAuIg7Eg1t05ldyTyzwS4lbBl/akA7rEFTt68xOErDovbJ8AQhGi8aAXLyc+mWP91nJyDyPMyspSzjp+9N0aAmslxTuNKkYF+ECZ8vwFdu4pw9QixE0Aaqd+upxHwJSB2MhdU2toCkl6B8QjEZTpOMCgwgQbJQ0uRE0DaCnPZezDCGICV+57aPgxQNrLKsT415jzccgE6WCaGb1pPlImtpuOu+5G2Qbi0QH+5Q3/sEVrJqa1/520uS9/9WqSasRHmblgCN9/rce1ngMNPb3DlY4Sz6x733i6TvDljdHc4D3t/QPlZMMtziQ1l5jV7eRe6mxs0n70rfWgaeU+tVK3uHcz+hvte5JyHN5BPuaK2snVJJfiIoxPZ5J3lTkHRzA5WwNQRsiyy3UNYFq79Xa2UH05zdyINXX5n7X0lYLsvKMCmEyhSC0xYsUVQkvaV8n7Cj3uVEmi15WQzks41eenSduxHbLl78/qaY1KXy+864hhMUNtTlUzYfH+6LzN9d8guyz4pKXOk5zn2K47XlW0o982WyavHiIC23Wb6SkHjdeVexe7L9edSqUSvy6zdON3TALkvmSFs+j3p52yzVeyp+tt+ttlmm222J2fv+Erg7Bbw498JxKdIs3i22Z4y+w2/4ffi3//3/9ReZaPHaj//s8D/4uuAzfr8a2ebbbbPedtDG9g2ZsY3f/M34zu+4zvwAz/wA3jnO985Of+rftWvQtu2+P7v//587Gd+5mfw8Y9/HB/84AcBAB/84AfxkY98BK++OsqE/KN/9I9w+fJlvO9977v/HqTFVUCO5HBR+WIrdWlZZQVInI/XWGilYyyMgBgNYZSPZpZz5nyWrSXz/7I91rGqDqPGOg/dtvNHj1sHkjqJaqzIC3yAuByTEiQuHEg279qWOb8NgJX5WZkFCNYyreNfZYxVOlr/7eiLZTiUALBcELcBO2Uq1ZzWFSaKBSknjjMtewvkTG0Yhu1cwnqPlS+ORb+tbLaVxbZjYdvqqO6gPY+hqm2xY2SkHC3oascDQLUdXJFTJ++zA5L81KG+y6Fr5QrHOqbze+KIVelE/ZfbuCNgIt1X7Uu+7gIMGyRgofb+TN4XCFjpzDVxbAs7h9WNRnLBbgh+Dfi1gEEqKyztRM4Vy0kGFgy0p4z2hNGcqjyxgMChwyhnCgibd2C4XnN5Clipks9hSRiWJECgQ2b1sgf6Y0qMULlvOACGI8K9N3c4ffuRAF5EOb+oBXvZOXDrwa2XYI/Gyz8iAb37IMAqc8qnS9P1TcdJjxNh8/wBNscOmW0axr4K0J2+C4KfAw5wG6BZMVyPPE4inQ00q9TXBNwyJYAzsSJVNlekjRl+zeN3J5XhNkhMZGSWLCCyzsOhWRdTIASFYq40fnu91zG1x4dC3jjJN+cgJ/vPewlOMkBUuHqM1fNLhCWDHYMS0OsGAKbdKu/sN3KMnWEvp7mRc/sGCPjeMshJVAAhnRviuK4loCKDoXpMx0XXZT2nz37Xev04zXm4rgUtFlsAY153kjQshSggOwBuPOLxAnHhET3luRUSU74/SuB6myTEG5l/zSnDn8k4n91wuPu2RZZxZlKWPeHsBYfVdSeBH0jzPMmzx8SCjx3yPG1PWJ4JkHKgm/VS9yEFa5mHAdj0iOv1g4O9+yzl56X8LQmT45OfzTGODBvUpes2eS/f6lLKuDT9ptZYtMU3GDEBhfZ4mU6i/EZvzRPebktZjgZ97WqXXqNSyo6mwK4FgIuyudxz6c8X+d5pm3btN2D2S8XvJRg8ASU1j+0O+eYJi7UI0rKg76hEErf/6T4hgcvk0/ffXrPLdqmN1EzXgaRmMPnbwva3zN2b37fKft+WaY+V47QjOKYEgGebzdpT+bf9bLPNNttsT8Z0P9IdAu/8KuD62590i2Z7Cu3v4gR/Erdwc0vS7vPDnn/+rfjGb/yL+Iqv+I1wRWqWi9qvu0X4PZ8mHD5E0SwAF/ZhzjbbbJ/7dl8M32/6pm/C3/k7fwff+Z3fiUuXLuW8PFeuXMHBwQGuXLmC3//7fz++5Vu+BdevX8fly5fxh/7QH8IHP/hBfOADHwAAfPjDH8b73vc+/O7f/bvxrd/6rfj0pz+NP/Wn/hS+6Zu+6cEifUsAFxjzGuolNebsPpZJCfbqeQvK6nHm7OCdgMeW1bbL0VKyBPQ+5yA5ZXlkB9s6ax+UXXWUOc1q46AOdeaRXadMTGUWTG6h7TYUOVi3nJcE+fhMQOqiLfb3DKKGKUtXy6sBrWUZu5g6MQqecT9OvIuybLX5BqQAMALGthzvpX/KWk331/LT2XLL43s3GJFH9m7JLLbHbD8zEyqM11U2DtV2GgbK5Nlofk5lYE/qrLCfyAGuYBPv6WtVztCCGIbVu1cuupC5LHNIVk3noQV6IwTcZYbK7HLCZ4kTk1WvAwBPWF8WQNVtSADJOIKOsRUQR2WIlanHCQB2m2mTYiPMQAoA94IKK0tX2b+xEQA1NmO5sUvXBJIsuwn8Yy/gVAaPtX4PrK4TQutx9Ate2LhWVYB0XQO4STcPLo9JBp1CHNc+X6zF+X0B4FyWdl5f8RgOkcFVimaMDfs0tzeBtS6I3HFUZmu6zm8SmznJE+s9qofLaVq7jYBmvkfOWyvgZwLbm+kcZQKGQ8JwMHXkZ7A3xKR4oM5+HscDgMohMzAGMYUg4LCyR0tAOFeiwMx0bQqXO6yv+hwQQANAg5EGTuYGgDUVaiP9zTmRdS4FhhsSSNkAcAnwBVKAgnznlJFPCoay6b+21YL76ee8dtaUJB6zkffC4OsKqTGzF8hy1foupOCGcNAipqAP9jKfhEFNYGVR62uTgHS/krKHI0J/mRCWhIPPDvkZxA6IJLm1/QpovDB+VVY8emEJx9RcvwaolzWoDJDL/QC251GaczwMAni+Edu1h6leW7Bj78fs+7NHLnrrHvt9LI+X5RS5a3Ob1fbVV2nTFqBp2cnWyv1QrVw9V1MWeVCrsZVrwWB236jM3V1F5nf8DQZ0FPun6SmaXJPbWAFNd+6nStC2xtw1ZW+D03H8f43NW+7Vpw0br9mT03gS/GktVoIeZ5st2VP5t/1ss8022+eC+RYTdaZnyZoF8PIXA6EHXv/FR14dAThaEg66B9z3PwHrGsKlA8LpmlHhPDxWOwDhGA4X/AvrDdt/jxX+K5w8ptqePrty5QV8/dd/E9q2e+AyvvyE8K4V8H3XGAMBm2dn6s8222zPiN0X4Pvt3/7tAIBf+2t/7eT43/ybfxO/9/f+XgDAX/pLfwnOOXzDN3wD1us1vvZrvxZ/7a/9tXyt9x7f/d3fjT/4B/8gPvjBD+Lo6Ai/5/f8HvzZP/tn31BHuJRVtee8AxQE5jiyoIAsP8qOJnLQcmMFHLXsW+uUJxKnvVpkA/hkWt9YtndTyU6tT1nCWvcQ6v0qAdxdAHaMdQdrwSAjdbZbgNoC0oDINw8BjMTULMqZOLgy09U4+mpgr5YTLNthCh5ziJKHL2AEe4EpuyN3PTFBfOnwMuBkIW2XnXzksnwolc8ybtcDIMsQ576HivOzbIeVkAS2pPZI5a51PDgCbSM1qbM9yx/uAG8t2KrlKGsWfr/zTx3bFmgPBnhPspq1vLy5Ly6Ncy6rcFB70/80diKx6NKxbSB6kme4ePZbTt5SmjSEzOzhYRjH5BxmLzk6H/RlngYfAAnU8RhzfDMAkQfGEEefuQMYHtw1mUGrYA9FAB5ZmlktNgIAxxZoViTLyLHU4wIQ1wIyUhDGblgiA87R4FTK4HW95ANlJ4AQOyAeAIoQu4AJWGzvz6BVJyAWZQbVuD6w18CRND7NGCCT8/JaVm9mQWFcVy0zyhO4cdhcconFzIlFyvCRcl5d33PKScsin9sRmOQ5xDa9t4ws2RySLDO7kVGtAHcGRSOylLZlTtu8ywoA+7UwMJUt3R85hOvHcCdrYbE2MibkK9+cicoDRoaXfjMakVinIeTUAvka/U4xi3x0H/PPGoBy+kKHe292iF2E2xDae4TYMrgR4FxAbUbsaNpPjP1zg/6emOQJDEYgxMEBTPAbwvL1AbTq5Ru8XIzPOAcO6TrHmdFL9v31vh7Q8TiNRBLVHR0ATSMyyKVkqzXtX+PBh0vEZQNuHcLSoT/yOH3OISwh7ybLPER6z7OkNmRM3QAsP8NYXyP0R8DN93RoTxjPfSTg5hd6rK8BsYvoL6WmRsANhINXHPyK0SSGsMxrYQ1394RVL/uTAgRT1qPZg/AwgM9W4M1m+k1/UMsA1pgSQRrvpszedG7C1NUi9Pth22+DwYIpo8zHvguIrQVA2eM1WdzI4F2zUwHSGuBcy1WcA1/kuy25i6MEYNlAmJrlthqQNwQAPu170h6lsmcQmecd+xVbdgkgF0zfvC8y+0Yehm12rgWAyY1rTFkfpvuoHEhXfu/tPtUAv5Of9RrdC1QA1AlDGKgHQ0gl415xByuXLXvX3q/BZ/qz1tf302P2Xk17QaKWUbYvj5FKswNTtRXnQLUUKbPNhqf7b/vZZptttmfW2iXwvg8Di0tPuiXPhD132eE7/vjzeMcLD5Rx8InY//SrDvGhL1rgG7/9dfzQTz9ZCd1vxVX8Rhzg8v0JeM72hO1SAP7cLzj8s8uM/+LlJxvYPttss33u2X19US8Sfb9cLvFt3/Zt+LZv+7ad17z97W/H937v995P1futZNEqgBt59zW7zIKj1jGtv+s15T21OtQhVjqK7M81VlbJCigdyjui/LfaWObvLc+XYPF5TEp1DhuwjWw/99k+Rk8JEud7hGW6j8GanYg1UK7iPNxy4DoCQmLoWjm8Snl1Rmt9Tl1I1mMfa1gBV1uPBcJ33bOLNV1jO+1qgwHU4YvfXXHvLouKYoidNx7ZkbmvvJpN2MEFQ2ZXDr03YvvWkS2Wv/yfOIIjCc5OBEp5VTO7t3GInUdsMeZBzWWmfwQBh5Vxmn7mhJnFhIeElGdWwR2byzb789MxJByCghxT+WYAozwymfswPtJ8LjF/XUfIEtUK5FkQFxBGM9IYpP7TrrXUntPyEqjKjUPsmiwvrX3SfzouoSU4x4gDJQAe4JDq1mWQBLAkDwxgAYU9hKmaxkNZvArEA5pnOY0HTdug4F1+boq9tMBw3KHdDFPVCVWI0P4nFvPW2FjLzF3Uv0u1cVWArGkk9/Ey3R4EnJbGj89Wx2drPtL0PDkzdyJAOmESgOlXSao1s72FBTt2Zcc7ZUF++249AaOmlUAcCzyWygS2X7r2EIFbj9g1GA49Nsce/SEhHGBk1g8pqMKNYyj3puGOgB+Enc5+DPZgguTujYTN1STPfhARHSMGwuaKh1fAntP7xAoIy3hSKL4ZZaCNMpWV3fuwGNa1tdiCs8AYbFOoLlyY8Vvedz92kT3N/bZhl5V9sozZCpg6sfOeh00Hseu+83IK24C388YkjduuvxXyfu2iOY2NlfsvLoIVtnLW7tvP6r66to8uj+n6tC/AY2zEtAx732TfWCnrvhRniuAHy0w2wY2qqnBfZc/2eWdP7d/2s80222zPspETsLc7eNIteTALPXDnFcnl+xjMO+AdLzR44cqzE6B2+dDh+IBw0D2EvxneoL0Ej7ffn2t/tgcywhd/8Qfxnvd8xcX8veeYB+HFHviCM+BX32X82yVwsz3/vtlmm222i9jnxldBHeaW4UTi6KQQR/ZvzSGeGQnp58gQr/UOMNber8yzIYySnNYxlh1lPDIhthxtBWPClq+O7hCm7bHsXXV+xTiyorSvhg1BetyAYsomyQwFywa2zjAicHL6UtMIUyTlpc0tDgDbPHrKMnHN2C82ji+X+ptzIKsDjKbOQF8wgABzfmSIaj+zXDMXzIfCtqT7YhRGRmJf2NxyE9aHcyPbdF95NavJMrqYAfTMPuYkZZxYkiJrzNJdHR8zz7Ls8S7Hqd5j8wLbcVYQ1zh2s3PVsq4z27pwHtrnbu8tgWX7fytvnf6vDspdjloOQVgqRkbT1jfWVXHkFqBYvlfn4WTs0vM2DDKVtZW+VgIpiuASLt9V7UPrwHBwqz4BMIyw7DAcNQLkNKl9XkHSVHxiniojV9m1mQmcWL8K9LIHhqOxTW5DiZ2KLM0LyL2RE6swSUMTM3AKhAPKwBIwglKcQGBugNAxsEBihQ4yLo3PQC83LoO3XIwFFc5wGngEiQFZV7UsZTLFiHDQob/Uor9EiAtdu9M4aXsZiIcKPoqsrfY5A7kJuAzLBFweUh4bZfT6NTITU1nTfoMM7HW3kcFddklSemCgSZLRpr7YAqvnWjQnrUhZRwgQTU7Ylmk95sTGw0aZjuk9CeZ3m+O4DCICsKUrxSxrtvego0MMh8BwKBLUfgO0d9O88uNck+/mONd0PuZgAX3tIfeCAVrou8lAINAANPc28h1umvG9aZucyzd/R807xJZ1B1kDOYT7B+4ehhGBlgtQ106Bdjf9TnErrF8KEdj0klO5bRCXDYajBmc3GmwuEzaXZC64QeaPX0tO6TzHzDuvLGqKjO4O0JxKLu1hSTh9weHyLwxoTwe89sVLrJ4jrA4BdBHsGatFBK0cmhOH5WcIzZk8J5HYxphXue/Hb37+/qc5xyzPYhjA6weMXN8H7gKTZ0rFNyznoE2sXQ5B1D5srl9lwRaAca386vyx8sx2rxIq5/bJPVuGrTlHROBhx7zV9tSAbMsM1vZYBQ0N3toj2yzM3aLd9l5lz1cAny2ZajIyxWV6Cpv6Ibrpsciynmrgj+7NafoesaqIaPvd9n6g1r69qS9KoDMxc3N92N5jTC7XdBBJbjrn/E1KFnlfLZVOgVz9/ltmL5ADKCZm27kvl3Cl/3pP+QSpUEaYc/jONttss80222wXtvUJ8FPfB8Q3mMplttk+h8x7j2/8xr+A9773qx5quV9yCnzJLzr8p2+N+KErD7Xo2Wab7fPYPjcAX+sgMUwmNUrSwip9OWH+lmaloUtmroKoJfPM/rPOa+u8yo5EddCc0yfrrLLtUTk6YAJskXUYFYzjrZy7CdjNwJ1lAZTsSAOQsffbzttdzlXrMOU9z8c6aTO4WAzOBCQ3UoFWsq+UzzPX5PyxzgnQY4FwLW6Xw82yjxXhqEhJX8hKMLVgwDIzYOQPt5gaSOCWza0LbAOw1qwjNneJRYq6xghO9xCofq7sz8TRu2dcsiN62Omc5jS3J07cglE+eWbY4cS0z6/iDC4B5S3QNznDBUhQUG0EHWpMQ2YGDQMAyVVGMYKhdNxURGSR8C2YruGgQX88lfDN4GRi30oBCVvUJiUg0W8YfiNAUH8kAB71QHebcg5gkIA9i1uSpzZ08ntmo6by3MAZ5NNctZZ5OBwC3EJknJMEMKKCggSQF8nm1D+R0xfwMOfrZUEN9Xoy6w8TZYA4g59EeayoD4gLj/7Yoz8C4kIaHxvI14xYwG3GyJwkgALDrwh+I9cHn4BEAtxaxic2AuiCBZCDT0BtI0C8X8sDiOZR9ccjQKeSz+wog6TyjyVXcksIbeo3yzzQrOk2h3dWYioZpGwCPWxwk13vdaoMZo0NQcDzYQAdH2HzluvYXCbENsoY9QQ3MGKk8VnzOCZwMi4qlW0liJVt6kpfQALdKQLudJOer3zTeCtgxHxb8yEDwpjjD41helFzHm65kECnJD88AZhsMFkIMu6JpQ3vga7F5uoC/bGTQIz0HroAeW8SYxcYwV591xwjM/41z3TO4Q153zZXPLghXPlYj8PPeKxecVjd8BgOGZurEXDAcCli0zvEltCcMtrTiOWrp6DVRuaTSsyWQKY+E5VyflBTEHmXGUZv9fYQ8jlqTMiz3lcjAkzUMfYAwDuYtWPZTgLjQth9rT1W9iGBnVv7IG1HCXxnUFDf6eJ8WW8tv6+twgZ+VO7dAnDNdROZ6rKeGthr21sLYoR5ly0IXAM49/XJrhMGjJ10LQfPmfUS2NoflqDzpFbdE6f3mWw5ljVr67ZSzRWFHW0Xl/ftYeGWoO3OQLfCdD81BnM+gWCZ2WabbbbZZpvt2bTuEPiCDwE3Pw589mOPtKo/8BuO8Wvev8Clgz1/LzylRgD+yNdfwte8b4E///++jXX/pFs02+Owh8HunZQHAoPxda87fNEp42+/wFjdD9k9BOCv/WfAj//odmDpbLPN9nlrnxuALzMo8ijjzDx1Kqvj0hvKlR63Vi7c1lGpZVgHmjLRTE7gsQwLuhpmawki7zML1DoS1pAFZyeO54rzydZp5W4LgIBjnDq+Cgdczou7xfzdx6TRdlScTDvkAaeg5vRY7s4uZq0Fpssx0OcY4zT/GTCVES5Zzjssy+TpPXuu23LOVereYhpb8GeX7XAu369tMWRK5m+sOCy3CtkBHJs2TZ5J4C2Qelcu5vPafl9yhRm8n84BcajW2z8BfW0ZpdWczpV5SDFKLltPguhEICw8hmUZSJGA1jD9PUvqAhlQU+bucAAB52ICO3uAGwEoFZRrTyRfLYUEfiqwp6BsHOsS2VcBnbTMuEisXy8O+9gyXG/WPscjQ1cBX0rnIm/L7CefPHECd52AsyPTEOP/A4AQETqH4YAQFgxuRNKWvQDVMRDQSJscI0lTy3fB9Zzlq625IfVZ84QjYUQk46dxHqQ5axPITQoMJ/MAMAgYnlWNPY/AbwNhGk/e93Sjg8h+2+mijDgdi8TWo2DXEBrHygKnVkY0AVYcIrDosHphIWzSBnArGlniPM6pPOcS27npkfMkT2S9YXL8Vl4NCpDvlqoQ2H+TCyu/2/fnSTF7vRdmrzeAl22/YcZSiDLW6XlwI1LO/ZFDf+gQWsoM/VJSnL3tawLXAzA0yOB5fj4DoAzrzRGByeHKvz1De8ehu92gOW2xuSzvXlgywkFM6gHyTjenAf7mScEYdyO4pfucBGLzZoO4eXTei2oOXh2KnILAo8pkBbaZubtklKspI/aYYcRyX7CI78dq4O2OduX9Air9q92/L71DaeX9k+9aYuaWx3bdq+f3lbnPUn1lfnCgCPYIccoGBrb3j24MFsz7PwU6Q5h8m6n47lcqN31x28ftPrrce5jfc4qKmsMlB++UgY3be5nqvryWR7pMZ2H2vLOc82yzzTbbbLM9ZvMt0CzO9/U9zdZ0wItfCPRnjxzw/Zr3LfA7PnT0SOt4VEZE+PCXHeAdLzT41r9/B+v+8QYndwAuwaErHRyzPXNGIHzZCfCWNfDfXGe8vllhdXYPOL4MdN3+m2MEvu+7gR/7kcfT2Nlmm+2ZsGcb8LXMn8S0UfZUlolDTCAGZUe5ynFmpowCxcDUmWvBP8tAyqzGAhC2pkzfEKfX1IDCYMpRwE2ZQoYRrDKX+XNeStalHLRUgr8WDCiuB5FcX2FGj+PA4oB0NEr81iQZrbRvOS42d+wOp6I667JzzjsZG2NsGM7KvlF56YlZZ5p1kKVnKtKQfvta7beVvq6Vr/cap3lte6fHtK4MOFfAXpvHdi97o+ZUtbLQKABTBYdVQjqMjJ6J09P2Sa9vaXpMGWGRwTyAKEksJ7mfXWzjCWO37As5kX/2buxH+nnCcja35fEpHa5lQEQtwMKyhQsmcXZikxMHPwDNJZ3LqDwb8h7UNNJGInDXJKew9lPbGpO88bg+rK55nLzkEDsWIPZ0ZKZurgkoLGAbZZCRgsi7AsgSvGA51twDXGABk4Lkpw0L+be65uAGAT/747QODgnYJGEHj4Ms/xsOCK4HmsAic7wR4DcsGPE4wL3eJNDUOOq9y2AvxQSGMQvYn9ip7Nz4c6Pvm3k+NUd147G63uDseQduowCSSCD2QGjvCmhNLGMSOoAaCLt3zUnuOjFwExjuEpbFlMbZMJvZA80ZQCcEtwFAUqYF3dX8Wr4psUPKkwqEJYEdYzhkgAk0kMy1EMGtH9fmtM4RMzAUgUWp39wkRh4Fsw4bALXxwHojLFNlRjsCbTivYeHKAW6/w4vcNwNt6pcGFzjtEyVpcF3SNQCB0jMiAa/Bac4koNivAKTqOZIAlydn5jsgrGLOgH56z4mAzgEbyFpjzw+6tqR1Jz6GqFUiuIODMWcvmfXae5GkTtdNpJwdyeAQgZctwnGH1VWHsJT5p0zpTXr3/Jpz0EZYyLylALie4QIQm3E+A3Ld0asB/YHD6jphfYOwep5w782XsLjFOPp0wLWP3IK7t0I8XmK4doCz5zphqPcRl37mFuh0BazWgALZqR/Z0hrKwwBsegF7H2TMt0B7sx8xYCGbdZecUVbwHkQ8yukD030EsA046u/KyHWUrydqRiC1ZNICBSuYx30P0tzbF3RQsl9Lq+2btMmkKhNu+t3X+gqJ6El5SeZ5BDpp+57yXqOskQHXXUzhdLyaZqHrtgKdtgLcivQL+XytvkLG2fbHMoO1XCuvTE0jOaZ13aTElk5rCAHbe2+776uxjHM6EZ7OXWOsaU6KcvKesdxLlkFqNUfwJO1K2Do+2R9biyZMoAYKzzbbbLPNNttsj8fe8auBG+8Q0He22R6h/WYc4C/iGm6gsvef7Zm0awPwn33M4b/7x9+Fv/E3/hjwF/8G8KFf96SbNdtssz2D9mwDviWrNjkYKTKYRhB1BHiNYyqOThxSwHUHmGNz5W5JPp/HEi6dbLscPQbYnXyva+DgLpDZXmOve4D8YDnvr+2DtQmrRttxjkPU5kEtnafW8VoyJSxQvuse0+4qc6KwEQw152q5XyttelCrgpTAZHxrDOa9Zpi+VaawLc8+A713UlkFkC+vKVlSNmdf7oQB/ndJP07abxhdpWN3UvcO5nMp4Vxju9t3+yLvgB0rlXK+qJVzUFmqqR1s2+IdhiUJO7fSNSCBQMr+TMAaJQYgJ2auM9GkxAIiSc5dYZj6jYAKsQMAggOPErODgJgiHyv15PyhPOYEBpTdiyTnzAAx/FpAUSszzI0zaxyPYK+umcra5cqam9ctIMs867gyIzaEsJA2gAAKAjxC2c4DtiWGkcY3/ROARaaes8xdxgTEtcxXN0geYueR8//a/MGuT+BdoHzvKL+LLH/M9huilgKVONI2Mzx/QzCOlUoj63fLFeOYwF65Txrhjg7RH7Uiyw3A9ZRlr0fNUOR8w7Ed+5DnXBkbwzDruh1nzuXxIMEiVK57lYAtSoFSPAzT10GvfRxM38TshffSHrtu2bQGtW+4fbedQ2ydvIc95zFmGvcixOafYoIsz0Tlx3MO7WEcUzcw2hOgJ3kXhkPADYT+KI3xpoe7OaAdIqiPiAsv7OyztQST7fqWxZjAzih5ezebhzfmW+N1DmNWx2gfa7T2/anWncDUN9oXZRvvspryRqp/Yo7q7S4ZyPv2SeZYjSmb69l1X+06awaUreb4zQBmBZjVOsugsqLdu4DyyT5gl5S0tV37dnt83/6uNA2C3HfeKuPoMbUHYfTU3smL7DnLVBrl3nm22WabbbbZZnu81ixEEnm22R6xHYLwlmfcpT/b1DwINwbg3Ucv4Ku/4IMArmH1ygl+7Me+DyHsUN0KAbj5+mNt52yzzfb027P/dSjld3MEvQE7M2MM29epQ8kZ57maSrKFKOypEkANYXSO2hx4yuzVe2o5RZukZarAs438r4EgwBi1X2MM+0r7auOyi/G4de2YY8066nkyZgaIsOWQ22YEKTMKmDBMxip3SPimfLLKbt5iS2i52re+H59lOUZ2XNo2PduwzYaoAYOlM6+Uxj7HMbeXBQNsO3cN81VZK0R2zHeAQmoBI+jrE0MtPRvyGMtUJq2WaSWdgSnr2+brNf2YtFsBXHJmvvL4rmTWjAF5Q1EezHzwfpt5nqSHdwYClAER+nySvON4WSU4Q53wkUfm2QWcpiK1O7aT+jAFK/U6IpAnYXQ6gLsG/TFhuMQTyeCYyxEgJ7MwWViUCsANhxAAqAfgkPPLUgDaUxap5gQmhgVhczmJDwyEsARikpIdjhi8YGzWI9hKg4CXboCAo4dp3Emuj5380t4hLF+PoEFYq7H14Fb6TkMU4E6ZvWYcAGmbsHNjlnTmSBkkZy/PjvogYzYExCaB0J2AaNQTKFIGuf1KpKsFXEWWmI6NrVcYucq6FECWRpzSMJ5jI+CnuwswsVynU8aApc1KgLjhgGBz2FIEwpITk1r7RCm4R79NyUmPRO1WYMOl3OkQIF+Zv7xMsj52rmveXpsnNwPsDnzjKlbXW/THKSAgMZldn8DcEZMEeyAsgfYOcq5nYYYjM58BnYci462gNnvOmC9FCEO3a7fWZQU9MwBu/ym7kse1g0N4LDl8qWlBbZPy9o6AOimLumCyVxmAIYIbh3Dg0N2LCC2hP6Qs7+3So1JmPgHw/RhI4NeM9iSgjYy4cNhc8mhPI1zP2Fz2cAPj6NMRq+sem0uE/pjRHxHOnnM4urxEe7YB3T0BvX4b7e170m41R4DNhasW4yj/3ffg1RrxbHWh9W/3YJr1zwYC2UscgQ34ScV3psri3QXc1gBSGtf0yXG9vjw/2duYPcqWvH8s1EO29zVaHiU59kkuYAuSmjz2k7zxtZy42ubUVw4BxMV3O4+Dn95f/lwGY9nyy+uK58GWer0PdE/g6IS5a8vVd8u5KaM198NP7pswW6sgqW33WG/Oq637BvuzLS+/w6ktNhewKszY515j/1pwudz/2/J29UPVfMyej0Oc7mUV6K2kaZFmmTp07s0222yzzTbbbLPNNttsT7192Zf9enzpl/46gIBP/aufwx/+I/9LnJ7eedLNmm222Z4he7YBX2XTFM4ONk5ZGsKEUaW5fjMIVILA9v9q3okjtGRmWdaudbCbtkyus+BvKdmp5WgZer8CXvZYmWtW79vDoFJnT3Z+1djMBky1TjU2zqdRfrAAjjPTA8gajBPHp3U+GSZpkbvO9o9Vru88dqZ1eO3KZaxVa663BBIz88ioU4dY6aCrMaon8pTqyC0BROPEVodlCFMQsJSGzn1KwGmsAOHngR6RR7nq3N44YffuZX9kKck99aj0csS2gzwyoMDVrvIN+DsBStO84yyPOnVcap15HrfNhOEyAdNLyUZ9V/axxe2cVCCCcD7wawMQysARadB0zjSE2HkMl7rMtM1go97OI2jmwggCx1ZATb8RcJE9MBxKfc1qvGZ1VYBH9gL0hiVjc4UTgEsIR0nDlwF0EdRG4DKDmYBIkg83EhBEitidjYxxJsCtHegUWNxiLG4XIM7AuUNMBGocsEljGBOwGUXWmTNLNd3cVJzf+p7GCN+nvMGeoYoIbiOyzS7JKocujQUD/ZGAlX4DtCcR7Air6zI2sZX8tMRSBkXJURuW0p7QJRCzEWlrAbsFLHYV+WuRSWaETgB1pvTPy3dHcyVPGN8K9rIZL/NtEglwAYpJgZVacEw5P5lB/SDyouRw791XcPq8zOf2HmUJaoyPSooOozy1gsE+McjZj+Pg12M+Xx2n2KVABtsOy9xL3+b8XQZECpkk5y23DdB40DAUrLV0raNHR/IlErC3a2X9zEC0G7+ZCRCaPEMFr+37DwjguxAGf2zSsQSW+xUAAvojYedzDzRrAco1xQQFxnDoERaE0BEAB+pY8n1zklTPeXkJzRnQ3WX41QDqBwlqqrHJ7VqU+p2PhQAeAni9Ab8RKeetYy4DmRyngG0JpObfFdS0oKyR3AfHFAAQxust6FkLjipB5xpIartszlMZsGbv3fWt3MdOrtjWd1u/R1YSWsdFZcZVIcOO0wWY07uA7Z1y17r21GSjE2ibJZXt8wzjfrDKRE7BHaR1cswyyZzkqgFs74Py/dNAuXydyes7CdLMDTN7RgvO7tpH22v2XWf3+XbfXgZW2roNkGtTe0h9XL2eK38HyDNIfy/o/opoK/Bsttlmm2222Wabba+tT4Bf/BfAyWtPuiWzzfZU2Ac+8Fvxa3/t78Sb3vTux1bnzr9/ZpttttkuYM824JssM4V83blJURytVHPK1cA8+3suLwFZmiN4AlCOzvud5eh1ESP4NGG/FKBmydgtQd+alX0pgK2dAN8uJ5SWVeRWk3yqhiGTy+Ddjs/cCMMQBrJDc1J2Abxv5T2zfSz7avOz1VgT2Vlrcs/tApG1vIt8aPWZaZvU6VeT0zbP0QKYpZXyqVLG9LoJ6GrP16QPJ07uIBuI8pp9rOtdcpWFZfC11v6SxQxMHexlW5xxstbyG5v8ujYfr7zzFXD3PjdNE5ACF2D71sovmsBe1gFuHIYDn6SUi2soHWKCyhUrWYtduj6BwUggkhsEoGMicDvmYGUH9JcYYcng40HSxTLBLYfUN4JrGM5F+CYK7jN4MJPgQJHAGyfdCLrWMSgS/JrQrBhuY9cBJIAWGdQTELtYHzkFiKQ+jH2n8fhkUARYU1aqsGMlRy4FN0o58xQ0Uza0gL4icU0x5fF1JNLQQJa0ZoawgdNzCQsWwPcwAb4pH28GShOLNzbSUZE+5sTkTX2j8R8n9jLM/8nmKleWM3So2VzrxvVjV1CLTWGQcsFT43B2w6O/JPe5DeDPkCS+t40GwGeJ4RFYZyfArsgKm/44TJi/O63xlXXJfNe0f96DUk56AbgCyjzeD91I1BBUzlnB3pHla2S0a1Z8n9kJ0Bs6CcrQ3Mc6NzWPNEcac9VzCjpIzPHYEkIrgQJoJR83O5l+sZVFQiSiJQChPY2gzbCtSqKme48dewlOUs7o+2225cO0Xbl3lbUaGbRrLpVS0FZm+SIAa5na4Lzv0Hn17zpWs9o1JbCqxwqmc3VMLBBbCaSr1nVOW3cGgxUBehm8LYPSdqVu2CWHvac9F3Vy7NzbFvuvidJKsT8b9y079o5Fffm6HPBYuW+7ofv3IGkfqc/gwpLMOeiTsrrLJBjUXjPbbLPNNttss812noUe+OzHgFjLk/Rw7dZJxKdvBTx/2cHfZ7Dk56s5AM/D4eqcu/ex2dve9j58zdf89ifdjNlmm222C9uzDfhyAiKd+T1ZBoGTdDKp9DIg8ndlOSVjExidz8DI4LVR9ZbVG8wxdbZZFq9lFZfArJajZdh6VYrROon0mpKVkKWlHbbAABplSDm1l7p2ej9gmCTbmy1qGmGLlc5En5z4ruLMsu2oSSpqe1R+2Dr+S6sAqFs5X219/bDTAbyV8yyNZU16OQPPIYxsEXvOArllO7VcW3nJ4jHXTSSr7fkd+WsnMs8J/JTnO0oi8zBsX2vvScCKyjtvORmtA9nIeZNFKe3xWNxLzrTBA5yY1fqOGnYum3eGmYE+TOemsn28l/ObkWbJOn6Btxy0ZWBA2ccsuVkzciAXEzPtHFTAOwH6AgN+xHGZCPApty0AtxpAQ0RzFuCGJoE7Akq6DYmssxsBzNgiy8CGFhgOBDhq76WAAY88yVY3CHEBDEtG7Bjcyj+0EYtLazRNhHMRzIQQHDbrFrF3CMGjH3RemD5FAhyDD1X3l4CNQ2QBoDaXCH7TYPlKk+WTc17bTQLjWcfAA515d0jKFiQxCijWQo57AcXZEchHOCKgH7B8rUdsW9x7L9KaI6AsQInpK3LWw1LKcb3I5VIAzp5zwpZ0AoiHBXDv7Yy4YPBSWMdgwB3KfI29B/kI8ozTlxxADNcw+t6BBwJ6B9o4NCeUQGVCdzt1pxFWdVgwqKdRPlmnps7lMH5/FPjNoDem4G++r/xeRRambDaW93q1ArUt+PIxTt5EiJ2wQUWmmRHTs+CN1O1Y8jT7DcOtgbAQZnE4MNWn/NGuF9nnYTl+g1WWHExwa4LbmHUjr3Emv/COfvHBAtQPoE0PjqM6xaMyakTCmbpOVAOcrFNwBGrbNE/1ecl32rKVsxyyN8BjAsVCB3CTmLwk46zsb3/GcJqP28k13d0ICozYuTyuzuTrXt6MGJaE1TWH4UjKHy7Jcz349Bp0tsljCGDchzADkca9kP2GDSm9wXoN3vSIq9WDD6admwbIUzluYWlPn+VEyni8Id+nLFbOksgB5H0CQCuyyobpmYPT9Dtm6y5ByFquXVtucW4aoFYLHHMXawPZb5yb1qtM3nLbUOYvLmWYa+Xpdar4UTKnnZFObhsZ7x0pOOwxLhRrtti+CZiePBN9n6gx+1e5blcO31L62eYRnkg9l2bzDWsflFVc248BewFSVYiZBPrV7t2VM1jfvVoQ4GazP9CwDJCJcdwb6f60bLtzlQk022yzzTbbbLPN9uTtT/6dW/jP/+E9/MM/8wKevzzvVy5iN+Dw3+KFOX/vbLPNNttsO+3Z/0KUQGhp57BaxfGcnLa1Mq3coR63DvdSGhFIUfZx22FTSinu68++8i3IWJoFG0uG4wTMrjB/cjOlnVQ6nazzT03BXts+2+4aK7TG6k1tYL1XHVdl3uESsLO5+IBtlo51au4wttJ/F7EKoHth9kSNVVXOi13P1l5vi1SGr3E4T8BdLTMD80X5CtJa9s6ueVLL/2d/35pXRX1l/t+ivVW2s45HyVip2XksmzSnShbT1nyylqVD91suU7ur4FUhHZ/leRnwqyBjr6+2A7gFWHO7Eol/ngD0yDljlc2rkrwxsQDZA8Mxi8TuIgrQ6+UfeUYMDmebBhwIvPFAILiVsGMpCNhJkDKVSZwliTsGNzpOyHK+AmRyBmfhaFTzJifgLzMIhp0qA5akrCVHNyn4Ow7oRDpXpY6bs4DurhdwtpE2ccPggJTLN+WoHaTtLgDRA9ETNpcJYSH9ip2MUzgOQBfhu3Getp0gl33KRwsAtEhBC44BEgZv9Ax2jBA9KCAp4JKU3zKGAwa3Ef7Uwa8J3R0WEJzH5ytsZso5ji3YKwM8zidlh+e3x6wdFkSlMKoZ8I2r2LxwJOA/Ac3GAPAaM+TH+/0mMUwxPn/7swK++RwhPWMZf8W2iNMciQw0up7XvpduCgDrHPEeaOQ7xIP5TjxMS6AkNY3UZ9vhvXwDldVr9gzy3vH4Lbasa6I8d4XFK+8mhTTmBIRGxqY502c3bVbs5P5BAfdW3nVioD8khAUhdhL4EReSH7o5Y7Q3z0TOeTKO6b2LSM8gjOeBMW9vjOB+APePPpK/ZnaN3QJ/xxP7z59nVo64BGjtXsZaeczk/N2SKL4Iy9e2xQC6O6+xeX9L25VHuNaemrR1zfQ7bgI0dgXr7bJdDOFyX7FbpnlPHTv2R7UcwTZv/ISVXLHt1Blmb7crFYRUPF6nv58H9J533O5/S6sBzLo28ci21nF4lIEys80222yzzTbbbG/U7p4xXrsbznWTzjaaA3ADHpcfM8P3kxjwA1jhZ/Fk/l78fDNmxo//+Pfj537uX2IYNuffMNtss81m7HMD8LWgbDrGSXo5yzjXgFNAnCfMSEgTMnsWGFkwlABcl5y9oSizlmMrg5aGqbErN6xto0tsjCTFucUStuVYYFStZCsX7Zrk8N3JgmRxCnedMEu9gLMc4ugkTWwQIgKr1MsEkDZAbNzeiGwzLIWJOgFflflb7v4qUpOcJQMLM5K/4yGatknZLd48j/zcCoehsl8meeOU3rbHCV08k52yicrUsM6+HezeKfA8OlInzNua7QHh1SbtM+C8LYND2G7bDkftCIaa8+XzMlLTk7FJ87zMb5hz3e1zxJp5JIDOeP00328ROJCbyOP82Jc8VIMjIoMcGzCNx1U2sACazfh8/b0BiIciSxxTPt6lsP4QIYAmBFhrTwh+SugWzQABAABJREFUxfAsICYlSd3YAP1xYqwuGf3VADQK8sYEUEpThnUD3G7R3iM094Tp2ayQAFxGbAXMooGF3ZmkjWNDiREr4GpsE/DHkrO2vTsgdl5ArjYBeAy4EKXfTGCSPLw0xAz2cgKjKAIMN8oHeyAqgEw04sCNh7+7woIg1MY2AsuA2Kc8w8MIimuOWXaSd7Y/IqyvM8KBAcIbRrMc4HwEEaNpIryLaHwAM8G5BiE4xODQtMo0JTBHMBx8MyC0DtEzMDggAsMleS5wDFpEUXK+69GcAEevBPizXtb1rsmsbxqkPHgDHtigH13yWy+ExBBGZrDmjy3vSfP/7K2XcfctDWIHuDWhOZXxYS9gPYAsD0wRaE6R5YazFDUr8D8CwiqJndm9EVmKWAYeU7a/+eZQlAAB6DsMbL3H7B3QLCRAo/fge376PXwIluWb23Y7CKVtBSz1fgSkdc1onACrzElJwk0VP4jATZJjbgVQd0FlxIHhUMaqvQs53wq7V8oGhoVDbFO+ZCfBCs1Kzq9uyLnQiVR77BgHrzgsbgfgl18Fd620fQhA48GtT3sWiSzhGEG92UMksBfDAF6vH46Uc94LmO+n9wC5c8vP+Xjt/btYrtb2SRnnZqXnB56s6Zk5iiKozebONSzYLFFc5vu1OWSxG/jc3cBxXzK2tXafz99g8sX32oDAVQayzdFbftMMm5cxsmaZzThoWfabaGSIJ+Xoz5WUE9N9w/gc2E2vs+Nh1UBqthPcTPt8MnWZm7aDxGqpIPRvBf29tveopQIp1XPK+2zuXT2vx7R9Zp+fn0mI0/J3me4pH1ny89lmm2222Wab7XPKnhDyKn++8s593tNqOcjuMdb5pEboJ9Dj9+P1J1T756f9/b//l/CjP/q9T7oZs8022zNozzbgawHGiYzgyLQZgd/kQNZb1Ulecz5aRqFaAh6EOZXYU7k845yqga01BmwFpJ4wiGuyzKWzu4z05wTMZebOtjwz2XpKJq1e4xWwSc5gK82nw5VZumG7L7ZuZZ7WALMk46w/lyxjilFA4F25aIu+575OwMIKOMyEKhXYJqCMTpzCBcAtVYzONw4h99Uez2CsjoM6C1MuZrZsMOuwK1nSRLs3vTZvG5AcwDHXLfeF+rW5jm22rz6rCetXpcorYHHJKtnV3i2HrWEUa1vyeZWX3gPo7nTuWlZ4yb6pBRBMGjnO0zzvLsLaKpno3oyBNt9hZDym49QHNGcMf0YIh9pmmaMUAb8SEDgkNmr0wuzT/LFMCSA6EungeBCBJgKe4RcBsXeIqwbdqw38iuBXgF8LI9cNnGSITVMbzqxNZ/LKMiHlQQcoJpnkDaNZRXR3BrhNFPAvgbQ5B3GErMNgmdqMlK+UZagbB9YQBU9gciMQnHKdAsJsJThwdKDNgObeBocfP8TqeQf30grDyoMbxrCUxkvuXgEPNlcI/RHQHzPCcQS3UYDilId3OG2AwcHfcxKrqnl4eQQwHQPBI4+NgOAilU2B0KxJWNAeiIcCuFMTwcEBPaE5FXbv8tU1KDC4bcCtlyboO+4BS0FT+W/qVRbbrLHKMAWQc8NnmdMR7KWjQ5y+0OD0JUJ7G/AbwK8YsSGZjxo0kHNAM5a3A4alw+aStFkAXAkoGJaU2OByvTyf9O47IBwIiE5pHsu/yvfUANKTb3D5bQKAthG5/+Mj4N4JuH9I0a1OAMit9cp5UOOnOXDLa2z79Dpd051DPF5iOPQYDlIubYLMLRofMQWgWTFiIMRG8ks7wwKOXpi8FBjtCSdgGHAbTrmnAZBIwF/5uYjDT62BphGwtxlBPRrM+Ns5k2SceRiATQ/ebOR79kacPGTAWmALsN0JOnEcwffie5/ZvBZoNWWSd+m7Z87p93tSp99imCK6DG5uBdfp+bEh6dh2GyZdKQObambB6dqYBIB1f7fr++MIpMBv2Vdl9zsDHNfkqivBeGNHomyfHG0/l7z39Pn93ftdrQC4taA/Vd+A3waPLTt3C1jW8dwBuBNX2q7rjtkTlOxYsu/1eazdEjjObTxnv2qD0bRdqnZT2R9rT8o9l02NMqm3BJ5nm2222WabbbbZdhkz8PF/Cdx5BVkV6DHYzZOI3/9tr+HDX7bEH/66y4+t3jdqzIz/5L++jR/66TVWm3P2/w/J/kNcwr+HJa7M+Xtnm2222WbbY8824AuMjuNznJRWGtSCQWSdWCVYaK0EcMvrSiBtX2Ra7Zx1INvrdkoyO2w50K1ZNm+tbgtGVu4vHV87zbZ7n5OTY9XpV3WGqYMPvAX2ivP3/nJ7TMpQh2ilX2ykE3POwJx3MDGVXQHQTpygxfOyjkStIwHZF3K+met2PYct52YJmu8DjLX9exhHe6MslXFykShMy04v+kR2/mj7K/n4clvcNNfvJH91CbxOC9jdPptHsbBazsl9xjaoAuJs5pIdrYAocwLhBPDNx5EAx4RLEgvIyB4YDjifj10C2lIOWlqGfANHAvcOtHbobhGaE2HjujCCeBk4dqndnA47AaREGpkze9NvGK5n+FWAX0f4sx6xFSlcbqTxTJDfI4veUAJ99ZzTKNhKblr2lAEv7bfIS8v80UAB6gMOPsMIS4f4pgi4BLZ28rdpTJK50QP9UZK5Po7gRq4FAAQCBpL8ummMBNBGynGL0bvOQM6pm8DP2CaQPgJ+LQxoboBIEHavZ/CGQL2DXwu45097mYeNG/uayiTQdJ5MwEbznbPHzZyeqFmECLQN4tEBNseE4ZCxfE0AfzcA7CSDpQsJ/NW5EAT0pU6KEjavXBMblTI2/8xcBWR+7g05rnxjcy7vrWAUHgNinEv5ddd7Cr8Po6QYoOu5gi7kJNjEGxC3bFOtT3YddoS4bDEsHWJLmRnNKUBD+ozMRmeX1mkzhgpuCduR4EJE7NIzCPKSciNBDTQAB5/p0dxZpba76f6gtrcAxmCuYZDAqmF4Y2DvLrsPmWNKwSFbtusbNZECfwAGo0om5wbUQNESJObp+fJYDcgtmbEX+Z7U6qlZDXze8z2b2L4UDbVrzX4hg4zaH1tWOW738f1U21L6OGevkuvxZo92n2z1i8ofj3uRN+Bo0z1L2c/z9lN6365xre0vnUPttZptttlmm2222R6B9StgfQ/oDu9rH/xIzGH6dxtHYHO6Z8/PwO1fFsD3Mdq6B/7hv1rh+SvPFojJAP6Hj27w3/3EQ/ob9QL25ejwYRw8tvqsHYDwDnh8FhH35s3lI7Wzs7u4ffuzWK/PnnRTZptttmfUnm3A1wBcFHkrDyApgERUZ/da57N1opt7qOZQ0Zx4F5GXtE54yzpUJ7G2KzIwDCOzt+bU12uVkWcBPidOagLGMSECmkbK6PsRYFNnUNMAzOLorVgGC30F/N0loayWJTBHR2eWa7aArWWHhDBK6GZg24McgZoGtFwAi4XkWyQCWvm/Pnf7vCdOsxCEwTSE0bm9StKVti5mKCOYM0hVOFEDppKUKuOY2CmZ3VPmqEvPagQ34/isLUhsn70yURwBfZjO1QronCWOdxgnprt1FOZjek2IAOIIegyDXAPKfeIg/SDvtphbhIqDXMfJGyzISk/b63Voa31SUEZ/BozMoR+fi332liG8L6jBPmcD+rNKV1fun5Sl7DQdI09ZcpfbkSnIhvnLrUNEh8WdiNg6DJdUzlIARApAWAJgwG1I8sE2Au4K8EYIlyT/rOsC2jag6wasVy2GdQP3iQW6U0JzBixeZ/geI6s3MPpDh9gIazMcCHtQgV6/EtDTDYz2FOhuD1h+6l5mK/NyfPe4c4gqM+kwmV/ROxAJaMgNJeaaBTIx/hyjME7bkU3PrRMG7BAB78A+AssWCIznf+QmmrOreOUtHdAy4nHAZkMpnzElFi6wuRoRlwKIIwHgzT2H9i6hvafANqNZjaznsJC8q2FB8L3kSM1gcAZAgdUNqUeYv4TILIhv7xAHB3/bozlxWH6W0d2L0neXmL2W7dYIaEJMQEjqBhoY0TgQhymrt3Eyb5mEATxZwxi8WoGvP4/Xvvwa+kuA35AwuwcB+/0GAHQeqZS3lLG65hGbxNIOck1YSH9VQpzcCO4qMxhMiWlMCL2Tz6Qf3yeb6oC71rwHzbgOprWbNr18s0lZ4w7u8hFoGIBbt3e+hxcx+X6kdbtppmupd/JdbKZBRTQUwFFi82kbs/JHklFeP79Ef+REFluGWmTQBxl7yeU8LXJYJPnmjuA2mMi2by6NgRDra8Lyjy3Q3SR0t4HFx18HrTZ5/LbA80ln0ruVmL1xvZa8vW80il/3Kqr6kcdKwMcxeMrM+6wgoXLPBctWc+3aPLZFXtrM/LTHLRBrmLmlHC55NzJpSynnDP7T5J5cVxnEFnkneEw+va8B2wBtLQcvR9jc8QQ//W6HMEpf19pvFEm2WM06ljWw2lrZLkcjmxqYsoor6RYm+8Yc8DW2pQwUm+yrjLJIfr52T2D2WbkcJ3sMZcNOgtXsHsu2VfcP6ZoJkGv3aHqt7q0b86eTZfJqoIXdq+naVko16/nc52JPQzQdk4Lty7mIkd2b6w2h/kxmm2222WabbbZHb7/wo8Cnfgr4lV8PtMsn1w4CcBniO7yXjvUr4CPfK//fZbF/9G2b7Zm0D2KBf46X8UdxE/8PnDzp5nxO2w//8Hfgr//1/xCr1b3zL55tttlmq9izDfgC2aEyYfDGOIK69lJ12FlQUNlmKh9aY/8WzvR8r8M260AdURa4K50/+jNQsDgK1q69t7zW3qN9qt1n6puUrOBZkaO2ZlP2gcvOyK068g2GXVIBhS0TtZTmI+9BvhXwWkE078TB1jQi76kSmonJxF6ABgamuXWts69rs1OeQgRvNuIUCzExnZK0Zfp5BOhTOwOqEZo5p2ApFZzmRXYgVpnMUwff1jmdQ3tYHOcxUqzTkypzbnSWUmZQjs5Uy1Y2ILbKLQfJe3pePuCtsuzxso3eT/vkKEkAI/eXKkWda9YpOzm8f/wmtk8BQM8D2FLXUZBLHeAJuEFi9TUnAUsHnN7zCXQVUE7ai5HlmgBM7tTVzqDDAU0b0C0GhOCwXrXo73RwZx7dnVHC2W8AYpacogeQ/KKLERSNKVcvO5nTsUmAUyDEjrC+1GJz+Qq6u1HYvafyhyB7N7JUa7EGBtikwJnFODFHiK2HGyTYYGIRKQdxWm+dA7cEOIZbbdDdi2hfbXPe4tgxQgQoEmLL0rdOxpPOPNo7Dm4jgFp7D2jviYwuRc4yziKznMa7TeB9egZgZchKv1wvawM3CedygFu5zORs7zk0J0B3j+FXLOuUR8pdLH0f88Ma+d3z5lg5DzVAaZA1jY4O0V85wNlzAiK6FHScZYRbmj4vllzOrufMLKeQ6tN8vGyeYQJ+NVdy6GicMwOBBweVJd5qe639wPT7Z/up3+jWg7oW1Hbgod//Lu4aOwOQ2e+dAFR+yuytsa2tsaaKMG1NgUib4yTn3GkQROriAAF602MObdp7pLlFDPCArfeESfJpx2Z8z2iQOby4Hcd8wt5vj3NM9ZdzJ0gQFvdD9Tv9QPZGQKUaK3WPdHK2XYBl5Xi53u9c/019514zkZx2u/c892OaVkGVEjgiK4zs6u+ufLz7WLwXZd5q/b7yfAsAvirbXGEr7x2T2jUVALuWBzg3yzBnJz+HsL1vTmAs9JwNqrOM2dperdwX2GBSCxanfSDrz2VKlsKmfd8fyHcR+eb7noOzzTbbbLPNNtuDWRyAsLn/v1UehjkASakJlH5vACju3HjgzW8HggF1hx745Y/V/VWzPTX2Dnh8GAd49xN04bcgXANh8cRa8Pjt+Pg6PvSh/xne+96vfKz19v0GJye3Hmuds8022+eWPduAbwmQJidLZnrqMQv8KTO38eDGjyAwMHXQ6PWm3AzmegMW15xpWwCoAX8zWFwBfO01yiIe4sRZtNW2xNKd1GnB7BoAalkAKIDenDeOcr7Z8XZlILqRDWQdfEkekUMENYa5XI6FPocYR4Zv5AT2OtClS6CuBbpWwF3nENsmO63ZuexAZy8sK9JnA0wZ3BVnHAUZV0qALw0B1A/gszPw6Rmw2Yys58m9FQap5tBT8N86rUvQF9j6WZ8DWeffeU7pDATHKYMVyOVUnXs21686P610spXNLSyzfIE0RwKwGZIMsMmD6b2MQVlXGB2vO/tGDnBxZAknBhMR53FjTuWlMZgcq41f5Z05l+lSAz9yAMM5LLi81lSKdQRDy0mgmUN3c43mxGPx0mECiWgEXxX84QQytgzuIuBFMvjgaI1FO+Dyco1X7xyjv9ehe7VBc0pY3OTE0gV8L3M0HAHrq4ThiBGbBO4N0/GIjeQLVvle9toGh6NPeCxvelz+mLzDEyahZXGpcx5ILDuC62MKusC4hpIwSdE5waUS4MjpHoosj9MTGITY6nOAAL53Blz6mMedd3sMVwbERWITOiAuWPLqtgx35tDcIxy+QvBrGQu/AtozTnWK7HZsKYG8QGwIYakALcYcxmF8jt2dNGYMRA+QE+lsnQPdbaC9y1jcCmhOZE0RVqisU5HGPlFkuBWPuXoVqKvOr5jryGPvG6AfgBgRb1zF6vkOqxdY5LyTEhAFoD2Nid1N+dkSA+1JRLMS5jcRw+k6Ranfg8F/ExPVrxh+DWwuAbEDXE+gTWLlek6M5gTMmG8xDWEM0kpsWbRNYq+N6zgjZtCfGwfuWrijA4Q74fx3sRw3cukbU6gE6Pg5EvWLzNJ36XsRsc2aNaxeZ74x3oG7BusrhP5ImLiaGp4GeRebVQKKHTAcjDmRfa/9TgCvymOnakNi9YLS9YGwuMU4eC2MaiM277AFnlB8ByOPMs4PKz9XKVtcWs6N7qrHMvPX5OGVX3kMrLJ5fGvyy/ssKXSU9+XvsT1sgpEAbEsDl2CvbUM053T/o//fBVxXZaLTuqDBUhyBxPQlNmO1Lw9vWbZtQ3m87MsuCeXyGVTuy/uhfeUnRReVVp+AslYxBZjumfZIO+9NQaFtS/L4JSBs/7+V8kStFnBTA53bdtzfZqUWt31sl2N1XzDgOceraS9mm2222WabbbYnY9YP+DjMAzgCJkwPB+BYf1kAV79qes/pXeCVTwDx8ckS7zQGInOKjX/wcXtYUPu+FogP6iFVdIF2fBk6/BVcA+1t1WwP227ceBP+g//gL2OxOHws9cnfJ/pvttlmm+3B7dkGfGOivyWQVx20AEYpthIQtqweI9Oo8qvZ+azlW7CVCGj9hCEDYDvfaLk5qbF2o/l5i/Vr2LMWCFTnrZWuLe+3UnTWwbSLGVa20VzLNTZkKZtbceyRH+UObd5VDDxx4iFKjl5qG/jjJejSJfCyk9yTCuqWjC9rxunFREBD4NaBBnHSK/OQwghAUmAwJdA+yBxhBYEPl3CXjoEhgFdrkTNerxFX66lT3IwhD704PQOmDuvCEbqVrzYPO+123pXgjn2GpWSfsuBqjF69xDDcqSYDadqac6Uqm9c6WjVQoGkqYHThZHSS95PL9pFD1m9OrBdh3pTvyljeJIfvVquNncMkrI6RN8xmJJDhPvJDMrPIzeb3loTxCci7nliSyuzlYlq7TcC1j24QFg6bY4ez5xzCQcoVSwCcAo8MWgY03YDlssfqrMPprQOsPnYD7T3g8B4n6d6IZs2IHmBPOH3BISwTo7AdwQ0mCHisU6ORujLjEACT5BYGE05fZqyvOQBLLG5FLF5bi2wtpXfLF8AYMxzrewd5vq3LQRkqhZzXQyKEhR/BXnveAeySxDMz4tEC/mzAtZ8F1teXiJ1HPAyILgoLWF+bDcH1BBdEppm8AG+xA1ZLwnDoEFtgWI79FtBXJLT1Wfm1gPa84BGEW1JmBfs10JwCxz/LaM4YzWmA30RZj4YooPLCCwjqCRwMqJ3GLXYN3GYQKd9FAnz6FBSjagaAAD7MskYGyLdIVRMOFnjtS69gfZXQnAoLtDmVHMe+Z7gNg49lbinLWwBtAjtGfySAttOlPgpIHBaE3hHCMgX+sPS5O4lYX/PgRtirfmPyOdcA6xQEk8FUTox1lUQuAgmEveoF8F10cNevwa3WiKs9QGVeY9K6XGH1om3HY02TJNnduE8o5OBlfo9zNweQJFY1hgHhzc9hc30pY5R2V9FLrt1mBfiVBGFofmq/4jTuEjAAAkJLOUe0MqnDEilfN8OtCX4DNCfA4WcGLD5zavqc5kfUKJG0nqGRfUoKcELfgzcbYfc+LKutkRaYtRLHCqobsFLki8MW8DtZh2vAqLUayKjHvK+CxVvKHLYvNTC1ZLSWpvdqJgD9lpyXw63M71sAv1JmRTK6dt3kuOnTrjbskne2v3OcxljUyioDgIqySPNLxwj2HqVCSAZ2tZ9F0JxKRe9iq1b3V4AAoTFO16N0DMDI7LX7/RJ0tcGDJVCbUqoghLSfDNvny33cZGwqwZxFHydBdUB9DEKQcYUB0HN5MwA822yzzTbbbI/N+hXw098PXH8b8JZf+WjrWmJk9Z6z3aza4gD4yl8PfOoXgZ//yYfYsPu37//ICl/35z6DP/3br+CD731wHukrAP4eqjH4F7avBfDePef/mx9b4a98z1382Mc2e65643YMwrfhOt6P9vyLZ3vm7fbtz+Cv/tU/iF/6pZ960k2ZbbbZnnF7tgHfZGWe3SzPvHUhTUHg8ueLhmiVrFE161zMLIgSEDPgbOk88gZMLkHgsv6yPKAOHJb5YWttmRySiLoRbKywKUrGsoXfytx2uR0VpyqEyUFdBzo4AB8fgLtG8lnuA8ktEJwLUsCC5DxPHY9ZRhcQxhgraJGApxag4IUhNQRxTPYD4EiK64ftnL95DLeZS+QK5s1FZAyB6fNSUFbHu2DzTvu/Y07mZtYdlbsYMZPjVlYZmM7xcIF3pgB9p80ewdtJjmGtR4F6qjt5H0SmcNJfE9whbXnASLrac3EAx8r7K41I/4eMT2B0N9cICw/XtwgdoU9MUvYCBrle7gtnHv3gEHoPvtOhve1w+WMR7SmjOTMAOQF85DC0hP5IQCNuOJ/LsrFkXheHLGnsAHm1zcXhQGST15cd/AZY3NT1E5N6czdRrA/AuDaauUNRWbaQ9z8dk3mP/O7reywStw4UGM2tNbrbCwwHDhuv85zgNpIH2fWAXyXAbZPmWALWYgv0R0DsGMMBJrLOFrDUnMlAOqbdVrloBrAWtmZ7GtHeDWhvrUSimSWPM3sn+Zy9rEfKWiRmMNL6pAC3tRzEVJzTdz59Z2gI4LYBHy2xvkYYDgC3BtyG4TeJgTwBbBJjND0/dhhZv2H62NwgeYtdGB/bRFo9PWY3QJjAA+UxnARaZflq2vnN1W93Bn1jlNxT3MjYLdpRunhnAJOweRXk2pJ+dW66vnkv7F5lndt2mmdQ3VcYC0ct+mM/kV5G+s64gVK+aD2GxOZNv+s3rBGwVwHjLOXuOLOt3QZoTxjNyQB3upm21fZT227mCULM6QseWt5erecCkfhUA2q3L6oDlBeReNbrdl1THr+orPF5dZwHqGmu230gcc0KMHYrGMle96B9MeVf2C7yHFF8u400sgKwNfWTvW3Re23g3XnM3qItO6818zkH6Y2VpLZtM4/LOmxb99pF9/l7TJR3ir2hzXd8oVJmm2222WabbbaHahyBO58GmgVwekuOkQOWl87/xscArO6Ovy+PAZf+MOjPgGEDHB4DLv0x2WAEfB/EfAM8/yZgfQa8+gng7AQIDzEo9D7s07ciPn1rhd/6lQd48YrD219o4C+457yHMVXxJwH8NN4Y4Ps+AFfSz/1pxOnN6d9N//LnNvj+j+zJhfyQrAXhQ1jgbZ8brvtnyp5//q148cV3gM772/MhWt+v8ZGP/Pe4e/f1x1bnbLPN9rlpz/ZXI4FgnBi+UwB3CsyRBaaU/atl7DK9zjo0lQFLJODgVjkJpLJARc2x7Wg8V2PxWsZtaSrjrGbBPG1zykk7cT4Z5/XEYWWYCSrHt5XfUKuyLBlANq5uGwyc5E5L0tCTXIHkQN7BPf8c+HCJcPlgLKIZP6icpF9dH0ZAN42RX4csxZmBXr0HLst1s3f5PKcxz6AOkhOfAQoRlBjcdNAllsdl0HoDNwTgbAVerRDu3NvB+B37pmylDDjAsnENKOf9JO/w5Lmo4zEEyWFcmrI3rFMxxhFA1WMJ3GCbuy4ZebfttA7mGZr3pvwdwchTp7IJNJZXOLEnc9HMa5u3V+vYm2/Y9LUKgtv3R/NUF3n7MpuXp9KOAmIjM7LIJVbTecCyZQYSgYaY5GzHNinTnAngztkHBCY57zYB3esB3S2Z02HZIBw4bI49NpckD7BfN1jcjjh4dYA7vQfqA2jTT5rDhwucvuUYJy96nL4s8s3CkGVQEADerSlLH6MEgFsGR2GvugCkMBDEQ0YkYfm6QGhPWjSnAa6PiJ0bQT5dMgmIrQN5hufxPUMQgFeZiO5sALcJEAVGiXZKDVLgdYgpIGQEBAkOz/3rMww/63H7XZ2wVYmwuBPRnDEOXlnDrwPorEf//CE2Vxrcfmcj+VW9tNWtCd167L8bUts7AddcjzR+QNyM4Cyp8nsC8GIL3Hx3g/aex9GrDQ5/+Qz+7hrcIq9TrAEo0nXJi2tBzvztiBKckueSQ0zj4wDQZhD2b0yszfUGm3c8h5OXO8Qkye038s/1jMWdCHaEzRUv51bA+qqwdNt7jOGAMByQALZRnkH0gAOBNgw3KHucEb3IXfdHhM1lyVcLBrqbco4bICwZsQXo4CCt0276PmufG8OsdU6I8EMYGbWJhUptI/MCAC0XcMyIZ2fjpCeXc55qegBA9gcWHJow5dJ4U9dNwWj7LnkTgKDff2X06bfdO6BZ4OSlBVbXRco5egP6cpJujshALwAZq3Rd9JIHuT9Oe4MI9El+za8BrOV97G4z2hPG8mZAc/MMdO8sSzlzMwYJ0TppcGtuZ4SsXsGnZyOL8mFZDmLZ/oM456Ldd3upqGBVMrb2HBVwcwebOFsI29+mizBWSznmXeBs7Tw5Cewo7ylTP9TqtsF2pg3kty8FdC9nlCpsf4E62GzHoSaRXZOiLhm5zm3NJdlvpP2XQ35+mVFuZKHZ7H8n32Etx+wNtvYAle//TkDX6Xuc2mVTmmgbNMVIWUYloIvKfNml6ooUNL1f9yAh5H0INY3sgUwKFUqKA7zZ5LryGNsyrHKBXqOKKSXQviW3MNtss80222yzPXK7+XHg1ifl5+Ux8Ct/C9Ccg86e3QY+8j3ib3IO+JKvA45vyLlf/kng0z8N/DtfD1y6+nDb+qZ3Ai++Ffjn/wj47Kcebtn3af+b//tNfPuLDf7xf/ISrh5dDPD9YQDfm35mvDGwFwC+C8B3p59//sfO8E//+hSA6y9CfJjtmTUihz/0h/4L/Ipf8TVo28+nrMWzzTbb54o924AvkMEdya/IU58G1R24+dj9sAMzABunUik1plLkbTmVEsi9qFmHljrFa2CvAls2n6vtv2WJlo7eCQs4AkiObHXIG0nkiTEDHLZk/+zv09yqCfxsG9BiITl6D5fgZVsFeYVtmIAm+MnvxAkYrg0nQSRFk2Mss7UYIMcApqwHzuOTAImIJN3tBOB0nfzfO9Cig18sgPUavOlF7lmDC0rg1/abDRCa2zn9fQL2WllxHWsr9T3eVJcXtPdaSyBprisCcOdvhyegP1eerwWSz2MrWanvStvsdZN69Hwo+nxef5nrTBvNLQqcz7o6Z73Iz0wZ485NgkyYCESM6F1iPJtzGrTgKQcfKDPShQheAx0DvndJOljkgqkPAoA5TIJPhquH2FztcOcdDdZXhB0ofUSSApbyY6Oo7Aj2crrOr3TtsOMlgDESEDocEtZXPFzP8DEISzdIf8gOlTrsSVDl2DghOKpMPgA0bnuN0V8jRiljP77P+f85ACTi8LMxE5Kb0wi/DvAnPbh1CNcOcPpCh80xCdib2MzK+FXQlgKyvK6OleZT5bKJEZnxyx4IXgeRcBodwAfojlq0t9djgEHU5zuOazaf5oFz6XkpYACAeCJPjwiR6A1RQMnjQ6yvt1hdlwLdIGC1gouhc4heckRrHt7mLDGA1wrsCPNZWdQutTm2hNDJPzcwXGDEIHMajnI9AhRjXAIJJjdvHL9DRNMUDMD021hh2ebcxiFKRLv3kzVUAUMLHO4Eiey3MStr0LQNqT6VnS7bRkl+GiGCD5eIVw4xLCUPNDtkCXZEZGY1u8Sqtu+cPs5O3tWYcCRiwPfye2ylDArC7F3cFjl1Wht2b62fzCKTTYlpPgzy7XqYUs7n7Wk4TvP2Avm5aX5atsCirruan9bR/m/KrnP3yyTeJWtclql9KXLVX6guayVbeR8DWM/XykhjtKV2cREm83kSz+eYBFtuM0vZjWVQ2p+fm2tYm1SAvPa41GHTgsSte3K7MoN/e3+wxdAtxq66ZhT1wZZvgy3lgvFeW7ZNr+LcdPuq5bCmGQn5GOseJuduj1vvXbkXexD1k9lmm2222Wab7SEbM8Bp3705E8DW7YjeU9ucCosXDEQCXv1ZYHUTeMsXAC+8ACwZ6Lq6H+yNmHMAtcCb3wUcXgJ+6d/u34M/Qlv3wKdvRvy1/+9dHHQ7OkrAuz54iKMb4uz4KICHKa5s/1pavtziXf+eROJuziL+7T85eSwk6N+AJb4SHS49kFb3bG/Uum75WHP3/vN//g/w0Y/+KDabR88cn2222T737dkGfEsQlaOALBXnp3UuZ7Bll6OyBsxawKcG6Orx2s96b4zCzrXONOtwqjmLLPin/5+Ay2kTpvkHrfPtHJk4KhnMtu1+HFO5pgJY2nx4uzaD6uRXR5l3oIMl6PAQfLBAvLSU3Ix+bBc3Luc1VLCCvcl7mlhSaFwCUBQhk+P5XmVTNk5yaKb7uBgXcql/ISEVlOpiwJEwChkAusQwi0dwd05Bq7U444ZBHOm5A/sdbVmSsSLzXM3pG3kcCDsXStaIFDD+rIwWqjiDleXi3FSadZcZANZKMGpZZJktJaC7z3msTuGIDMJv5R62YHfhMJ20p8b2LVkxwH5HaDGPWdlXHPeDvobBSEEkwjFwChhIzwAO6CDBCGF817mhMZAh8oTFSpHh+wi/CuhuA2CG6wXUZO+Eycke3Mach/zspSVOn3e48+6YQCJh9CIBcsKAxbj62y45gAagOSUMh5L3lRT0TGAvPCMuGP0hYXXVobvj4DYxg1iSB3c6Tpn5m+SMI0YWLTAN3pB3TMZGUh9zeicpSx9rbt8MBEcB5g5eWQtTvw8ip5yYxP3lQ5y+0OHemyWX8ci8HP/PXvpODIQOArAOlIHhyR/VxZRmB3CT1BFCYrguCLH16I4drt5NTC0GOLBMJc1zawqLXtjQ3Dhh7zKP65UygXXq6NodI9C0iFcOcXbdYXVDgFwahNmrAPOwpAwealuaU4bfMJoVZxA4dGNQgEhtp7yynbB63QkyMO4IiMRoTiWvcs79zGZc2kaASQVOE+tUOlwGy+hztQFA5tqUq5gaD3Qt6Mx+K+sBNACm6RLsGmvlniNLoE+aT8q617zCADKTNlWQc/fyQYfVC0sMBzK+I+ALUJJyBiCS2Y5l7ufnmB7vgnIO7ZyieQ1gAWyOGH5NQAC6uxGL1zdoPnVzGhRT7iu8k7aHIEFbMYA3KXfv0J/7ndprdgyo2BvsAiYTA3tyLv9cyU3LcQQ07bkUqJOZoxducwV0NgBu/k4mlYct0/EtcubmtqjFArQmN9Ztn5eVZrbfHUfb7NyacUxsdoxs4F05jG35VqVFv9s2z295zPajkk+5Shy1qiQ2f66VGi5A4HMlmfeltLCmY1Eon+SulPN+R7ljUFycBokA4xjZ/VgII2u468Z60xqd90Q2J7ApI7N0E6uX9Vrbj31trai9zDbbbLPNNttsT5ENa+Dj/7/7vIkFJF69ALznXcDx2wC87VG0TowIeOcXA8+9DHzy5+VvnSdkN08i/vd/93b9JAlu/pvf3eGlG4/epf3cuzo89y7Z3937zIBf/JEzhME4sB6BeQD/cxzi9+H40VUyW9WICN778/8+eUjGHBFjxPd93/8VP/zD3/FY6pxtttk+9+3ZBnxjBBoawSvvtsBe6gc57pI0pDooC3CVvRuZPJb9U15byS9aNXtuR36t7Oi2jp8ag1NNQUXL1rXXxQhOuUirgHUqI7Mnam1KjixmHsHesk8qn63OUq6UA0CldLPjbLEQsPfyJfDBAtx6kSh1lIEgkUllsCPE1sH1MQOSExABco8LDPQxycQCvPACPAQgKhg0RHOvgBkuxCytSsP4PDK44ABECaqkyNKvhU8MSAbcMag/AF06ErnnfgCfnILXa8TTU5QmjsDkRU6Sz5QbNTrI2SGDlJRA/Pwka84864i0rBcLcOq8MQwZKqUHYZyGpr59DNgtadR0nZbDWXpwW6KZyncp9TfLr/ah7ugsQV7mbQeufWdtP4v+TXPtGSe+mc8XkSKdlKFyvVqEg0hWegH/VF5c83hmmXIggY6E2DUZCHU6N5sRHHVhBAFdiKCB4TZAf7lFf9zg9S/y6C8JMJjBpjSUfk0pJ3AacwbI5Blmxxngdb30XRnCFCihhBHDkVBbfU84u+ERFoSDVxOoSXFk6TNnOfUAYT0T59drMnYK4uZxs0xNw/KMKSBEMRnpQ+ovs9wcOefMPXnzEpsjwnBEY85aSB8neWwBcAsMHXKu4wlQ7pABTWFjclogkEE6KU9AVgdCf0n6ERcNXB9knfJuiymc+0jjnJB1jMex1Hmdjss4yfsfrh7is/+jY/THJDmL1wL2ukHmkMgJMzwAXgHDgYxFaKUhfoOcrtkN0keKnBm7MakY0TDeI+A24AdgcxmJoZ6ODwS3kvPDc8doPnMXtN4IGzk9760ApyEhyKDRuWC/j2WgFtFE6j5/ZzTlQYzT97+QP4WXtALwfgrk6vTQNjSqnjGurzIv0u9ti+HyEicvNuiPRc5ZWN/jOwYgyWPL2Oa5BJlCIOQXIiyQcygPhymQoAGa14HFTcbBKyv422fg1VqCtpwDqEnvQDTfMAf4FMmw3khg0mo9kY59w2aC7XbKKSvQm4xD2AJ+t75HJfu1OF9K8FfliMufa3LG5l62Dq1Swji6+p4v8jTvewZMK0CqlukIgB+//2V9+vt5+8tYyEVHW34qhkxeegvkpjZMrBa0Z7+LCrTnd7MC7KuZNA05324cn1kGP/32d3yXY4VDyIApFWAmF/tUIkIJ8mq5E+ZvjJNy0wXyP7tfKILreBhkzlrVFaJxHlvpd013UQZJ6M+mfwCA1nyQbL1xuibm/dIuxZ59AX+zzTbbbLPNNtuzYUTAl301cPW5bf/e57G964OHeP9vvIRrb2vPv/gh28FVjw//x8/jY//DKT7yD+6ef8MD2K9Gh2/FVXwBHn//ZgM+9KFvwG/7bX8Eb3/7lzyW+n78x78ff/tv/x/wS7/004+lvtlmm+3zw55twNcyI5ODfwL47nJynOf8KBm+Jei7D2DaZSUIu+v688o6p54q2AtMpeHUKg7M7BxSUHeXZRYF1dkwlXZR14HaFrxowa2XfJ02pyUJ6EHKJNy3p1V2bATI0yS6bovBOzmXik2stylrjzIwltsRExOFaLzWCUORGgdqHDAIC4wAoGngYhSnKMcRbJ2MZYUVXeb0AwRlqkkR15i9F7FzmCz1e3YDvheqq5AXPC9KrnRO1pyVVSno+7F9wRo2iEGf0f1IGaU5lNmXgMwpnT/6yJzMsZzLVZcsSv90fvvxuL7XUXNmR8mzCycM2f64wenzHv1lRlgyco7YiCxzrAltHGh6DGMb8n2pC5SO5csI4JYRO8awJAwHgBvGd0dZxLWxYQ8ggZgUx7VKWbwTJNhNgV41HSNl+E+SVkdIw70Ddw7D0mN9mRCWhLBIfbTXQ0BuHQsFbbPUc5yOj5WAnjxPe17L9UkKeQGEhbTVbQLgtM2U79M+choDy3Ad+63vIiZAA7cNwmGL1XUD9CQVX5tLOTOwYc6RgI+Wxax9yGzt1Macz9kSLmMxHlTUT0B/qUVzq9hqlAoYNbMBUQbslmCjxJo0zF2y62KF2S9Vkcnda/YL+/YMel6L0mt0/I8PMBw1Sc4ZmaUr/ZyOBRMEkNI86Xn8KTOCY5OqjEBcpLk5iJTz8naEv7sGrTYSiKJri1lvqBxbogRuJgZivMAHe5+dt4bbIJkKm1dlnPcChg9iNYbr/VjZnto3Yt+3wwYK1UC2XeXXlGFsX/Z9q4Bx/7VvPA2TXQHg+wICLyLxXLY3BxHSyCiutK9sw7ltUiB1x3d/V/qJid3v3gkGNN4RWJfbdpH2P6gVa8+518GMwcz4nW222WabbbZnyxYHwMERcP0F4NK1x1u388Dl68DZPWC1TWZ40nZ4zePFL3oyeVV9S3jhCxd47RcepoD01K7B4X+MBeih63bPdhG7fv1NeN/7PvTI6wmhxyc+8TP42Z/9F/g3/+aHHnl9s8022+eXPduAr3GusJs6PS1zF8A0b23FiWzzbeZ7i1yb2SzTaMIShDCTSB1c07bAu1HWsmyDvc46cCd5TXc4qcrzu6R+E1uUh5Cdb0QkMtMl68cp8mTAb70mM50qY5OdkOm5hAhqG8B70JVL4LYBe5/YvS7L2Vo2X2il3W4TEyCMqaM1jm1gBwTnQMpCjAxuJI+isKQSuBKTcGpyRmcpWFYGnTCC3cBJmpQT2MPg1o1zIUodsfMCiDgCDqT97tJS2MT9dbjTFfjeKeLNm1O5Z2ibAtgybFiodOQMYy3ElK/SjH9+nGbe1RyQfT+yf40cibJuJ6yQHUxa0nms46bMHj3vXWb0WlnoCfM39yXVp1KHHHN5JduXiCTvZ/q9ZtvO9OL3GgPaJxaf9sP7kYGe5teEEZUkM6vlW8v5RNOcCixs/AToUhB52BGQRA5yYCcMTAqM2DmZU4OwatkRQudGsDODdzQCd6kvw6UWd97e4M4XxMwetM/E9QCYRiBW8WwCkADPEdCSf+wEUHJrQfsENEzIXxMRjgScas4cXAD64wZuHeHXUVjKTsEueW/YGXAtA3KpPwF5LfBDGIe8ock6rOxXVhAh5eN2QP4djQzAyUsL9EeE4XDst+t1zcAIdjMBLjGZ07i5AaBAaM6EARxbAeN0TDLrV3FCx1kq258KOBg6TmAy4ez5FsubDovP9PmbZANT9Bkr2E86VhglvolZwB1mkXvWZ3/jGKsbLYZjUTYQVrfmU045ewPge85gOYU0FonpHT1EbtiLnHWzAmhjwEiVXk95ZC34TcwC3rPkl9bgnRiB0AL3Xm7Q3VqgeY3HOZC+bZNALWDK7GWRsJbcypzvoyg/k3eyniiQadl1wHQtswC6F7A4H7NMvnJdJUrqH7pGIH/bue9BywXuftF1rK6OUuHsgdixMK1XMocoIEtmsxNGNZDmlJd1oD/Sucbgxfg+ujWwfJ1w5WMbLH/xFujOPRmHrh2ZyZt+7HPZDyuJ/UbB3pqVUtqq2KCgupUeVmZpKTNcAQNF8jgdtxLHFwlCKvcL9j6gyobN7UrHM5tVA9u0zcoKVullIMkkj+3PAV9GvSL3E34su2AyZ0lg+HHcNJ1GRZXD3rvdn/SdtKkjtA/RTSWxa9LWZhyVzWrL22Ixl6Bw6hvnXBxjQJu+e8w8jqF5vmXaiEmbnAP6Pj8bomn7JsFlefyLvXOpFlLbOxcAad7XUFIWCGG657J7BL2278fnVu7zrQqL5uu1fbXsYbs+6bfC7it1f+9T+hHLTNa18wFA7tlmm2222Wab7Qna298DvPfLn8w3/PAY+OqvA37uJ4B/86OPv/7ZZvs8sLt3b+LP/Jmvx2uvffJJN2W22Wb7HLRnG/AFRudJdg6PvwOYHMtSqgUjZisqfxcbN7OLtp3Ck3tt2fZ+W4+Vby7ZRRb4tY6o0imlVp5TZ1Utop/V2eZGB1pq7xb7l5ygStYZy+c4jI2kr9ZFTQO0Dbjx8v/WJye39hPT/1eA3Sz5CmQZwMykI2RZ5gxMDDxh9up14jtV1q6eSNUrGJdOkGMwXAZmBKzAmG+YGer0ZAJi64Xx23m4xoG6Fn65kJyJd++l3Ik212/l+dTy5lWMmbfj/UrgtmC67GPXTlgxtXti4XistKcsZ3JuIj8ep/KZtvydv8cMzHDtPSjrLeXOAQMEjc9vIjWZwaU4za+o5RvQacvMmsGWETgJCEmAlUosO4yIob5eBCjrXViVjJKRCiDl+pUD4cDj1he0WF+D3KPszZhiQu3QFO8aRQE2YwswpTyh+h4kxqHr0zvhGdQTmLwphzPDtz90aCPg11Hy53oyrFnK76PNQwvNZ2tzeLvpmGTAm1L/GGm917IxMvdpBCiFfVzk19RH3aVyYgJxAbiNDgojtvL+x0aOuSHhIYpTpTqdAnlMiC3nNuZ2JQCwPyK0pwmIZc65iEeWMeXnYanUTJW43gzcyIWbqx02xy5LKWfGbVkeS1syE9XTZH4py9clOWG7fkoAQhr/lOc4+jR/IsGvOI8Te7lOx25zhRCWDZqmkfdSAd5B5pzkqdR1puiqylmn8ZB33nwnc2CSecjVgKcKwKdBGinlw6QO844rwAwHkZ3Wb9vRIeKlA2wuOZlnjcwrbjjlT6Ykpa3vGUSa3SEHF+RvC8m9sU1rkDZ3AyxuEa78/IDFq6eg09U0wEvX+caAlXb/EVnSOPTD9pr7MKz4PtEO0C//HF39fJkDWMuqyUSXLNtdQKhVISlNAdw9oHEJelbNqnKUMtIquVxpVw4qOmf8tnIen8dgLs+XTGGryKJtLsah+m2mbVnmat26jhGBa3uX2n0VIL+WFzgDs/n9NmVpYAdQBLNN65vuaeJ4rMbWPc9qLGP93eb4tX8jVMDeCTjr3LZEc2k18LayL8s5gXU/PjN8Z5ttttlmm+3Zsn0Bf4+8bpoEtD8ttjh2+KJff4yX3v9k2L2zif1mHOAKHP5L3MOdR5nI+DHb8fE1/Kbf9L/Cl3zJ1zzyuv7ZP/v7+Kmf+mHcvfsaQhjOv2G22Wab7T7t2QZ8d21AClBmAvp6l8ECxFgvwzJOS/BWy8/O5+K4g7BbJ0wBdZKZa10CVmwbSvC40pdsJUBdk+rVfL4oADnNZaiO7YLlmFkgOedbxRFWgpXKwFPGhjrQ2hZoG1DXCbu3ccKYTU7/Un45g7IsY6TM62gcd5kwEthI3ab6vYIqCQPI4NHocGOw5H7GWI7m/8x5hNPPrKAIRlAmy78ywSlCERNARk7ysC4a0FEnrN/VIPjLvZNp/sTyGbKhDE7GeZdDu3BSGubc5I+D0gm5y7lZkcTcK8VMDtl7vEO+OTsby3zAiZE3mZ+1wAX92Z4vWTWpnGnAQurzPudpzQEaeZKzV+RJXQLf6+tNdsrb880YKGDZm7nNIeF9ab5l+N6R5J7Wx8MY8a0EdAIyZ12IgAOGQ4e77wRiE6EMVcTEcIcBQzGdXsoCVtYrSNiEQJrLTkA9z8jgJfUEwIG7mNsVDhh9JAxLB79JwF9gmc4NpffctD9ylrzWXMaxNWwnfTcrQHduf1QgzoCCDvLsvNQXlikfKo/3aY7ZuEjvfGLBUpS8t5lx6QV0iK2MT87lm4Babjjfp6BqlrImGVxOzeKG0R8Twh0n8u9xGoyieYkBwG2ikfulySuW5040PwPYXPHoj2WASftEOuDpObOcC15AcM0z21iFLnm00s8M1CcwskFmADdnLM1oEzgcZOw0l7KANYTQJbD7EjAceCzaJjNSmQikFPTGMOB0GgQ2wKaZtPlB0gh2kgPR+O1iXWuSKkFWECiDLwzYm5VAiOS7GOI0r6+urSGM7M3jJfprB+iPZK7FRgBbOMmVTQNGwJflnYiO8ljqvFF2fex4BNbTXG1OCYvXGcc/9Rro7kliFS8zaK7fUdIbQpwCvyGAhyD5e4ce92XlelcGseV9SwJovUeWwTfM3nxLZABhms83MzAr9U++YcUeqAAXpUna7wqIXDO71ymvr+XerV1jy4iJYZmD+mi7vAnj2Y/XlRLYhnE7CYC7YHqBHLA0yUnvJ20AACJRYpgwqPV6PzKxc5yfjkfZdy3XAt8lAI7tZ2UVNfZJTDPzmK+7uCaXJYVMzm3NjX1WBorU9kjlHr3cf2lb7TH9G2IfUKvnLSNXz2tgh/m9VEXhslwTREPkJdBw+Nxxxs0222yzzTbb57yVvoUn2g534T3oI22KFynnL/uGy2iX9xmo9wxZi6ffSf8/wSE+hAX+a5zizkXy+z0D5n2Da9dewu/4Hf9bHB5efuT1/dAP/X/wAz/wtx55PbPNNtvnrz3t35L9FiPgRkcKO87OFSsBCsBIMxsWcA0sS+VS1urkbSePHgcSOyJMWUrq2CmZiNZZreBwCfABIxisdVvAS60W7VeAXOScyDcDo4RedoCfA/h5wxhSGUjbbgsCW1CtZE14D+o6YLlAXHYC9rbGwa+gb8JsBeg1xTXjcxAwg0UKWoeSAcaYg5MGzqw1YbpxAtCmstETRksCNhBHZCy6kZFoWViZaRzEqRd9kloljA6/xM6Ec4hEQOvh2ufhNtfg1xvg5m3w2Qrx1KAtCgqqo5aE6UEVEFYlFjkEoB8mxyYORDVtV+U55dzOwAgsGXBWHaUTOcVch5mPxglJSMCLDboowYGmyfKL+ZyZk2TloGsypUVbJnnq7M9VJk3qE9iwnoxctgL71umfG1M8ixRAQd4Jg91cR/YeTrLxaZ4wQYA1SutRYo8CyEEL+ec0n0VCl+DXIV97521LrK8RYhMT2MigQFmyl2KSf+6RgMpUByHJ/4q8LDsggiZAn2XAKzAc21S1lwspJhngBWM4BJrV9BnZ5S0spFDXJ1CYSHLaAhm4ZUdwfUwMZpEyVklnDcAY2bO6to91uQgMS4f1FZdBNbeBAGoe8BsZH7AAdLxg+A3luS8gN48AL8uYMaT/gPwedTr79HtibLo10JwkcFRlnj2wep7R3pPnTJGBEIVR7BKwO1jwGsAAUTJgB5aJMrJ9HQvgl4KFguYJ7hjUy/wVpqk2EiAmNKcjoOjPWPLx6iVO88/KgbAEcExwaR4OS8pzIrZSJjcEDCJdTCzr7HAo97ue4QZCJCAsGWHpwIdLcMq7TMP4TolEOU/lnCcSplPwg5edfFtsYIuuky4CfZJ3psSwzLl6ZS2gxo9gcQJ7SRnTGoDVNknKOcrasOnBMYH1XQssOtx752WcXffoLyUQt0tzMcg75fr0DibGtA06EAa0zJ3QIef+zUEEQUDjG/9mwPKVNXD7rqyxy+UEICdNIaF7FAtSa5vX6+2UDRex8nrnz3X2jN+YKbCrVmWwAlNgtcxlD4x7KwtM5jrjFGS0exMLTE76Uly/q185SKoAcY0qRLUt5bdDJaABbDF/a6zdmiR12cZSVtocI49tgNiOnUpI1xRHyvEvgWCgAHULYF4ZzFVmdSor7VuYRyn2CYMYyPtUyTvN4E0PK/dsJbfzHqIM8NL3fBi29xkxTupJv4zz3gZi6vXK2K0p7qQ9P9l7rGkw5D4rg9za1rSR0rqf9gYVxr5NkzGeLwL+Zpttttlmm222p9uOLgNf/mtEVvlJ21veJTmEf/wHgTuvP9GmfOD3XMPL71ug6Z4CIPwR2SEI/zfcwPvQPummfN7ZH/gDfwFf+qX/LpbLoyfdlNlmm222h2LPNuC7j4FirykYlbTLZ1leW8qw2XrOi7gj61Dcc98uBu8uu4Ds3BYrkxONzlohW1mvq+IovUj7ylyzLoFhCrwqOMsYSXzpmLTNOAut002lYJlhhU61LGXpykEBVlhBLNvGDFrzhP2XpVhNm7R8lPdjLFSAmJEdnFnHDuBWwIxIDdA4UOvh1j3gPFyMiXk1dbpydJK70BzbYivFivMVuBgrxV57jkTz2OXx/pJNUmXmOMp5nKegK++/T+vaN/dqLJmyL2VOTgtcm7IzsK19K6WcLxDNSoXcUZbsHTs0HnduS7J4vG57zjEMIJYbKcBc7DyGQwHndP5zKoRSGZmBqoVVlgINtNBr2Qv4REHws/F+YS2S1zmecsL6lDdbZdpt+Xbe2Smosuq2GcX7t0t9wV5vx0rfS24EXOYEoquEtBMq9diWBMhO5IsJY55jjAAcivOsS4CS5hKIJ50w1xIy2Bw6ysEuFBhoeDooxa/ICgNUjCON/5BA+Eb7hAzMZgnmAKgCgUpiZ0Bb1910PReYQLRzNc2fnKPXj69iVmrQZrLUSx4SFOAgfVeGcgmqWLPHtpQ6zPn8fwdwGME7Db6y4F9N0tmUOwZXcU4ZkC1EAU4VMOtahGtH2Fxy6I8T2NumQIGQZJwHZKB3rGgcmzwv0r1hOcrYEgvY25wAy89s0Lx+InW3KWevTQehY2SDjWyfUn5jvt/v+C7L36H6uiiKCFwFeydl1NbVPSkMdl5ngdcJiHux/k5ytl/E9sk7W/ar/l6zEsjdVZYFUksw1pa9azxVvtneo8otZd0XYW7seDb7mLlVqwWMVSwHDU7uTcoKtXXDXFue3wX2To5dpM2l3Q/zRvcpuuevKa1UjpVpNfaO9YNIU88222yzzTbbbE+PXboKXH0OuPacBFs+aVseAt0SaJ48AHnl5QbX39Y96WZkO7ji8fy7O9z65R796cP5W8sDeD9avHsGfB+7velNX4h3vONXPPJ67t59HZ/85Edx585nH3lds8022+e3PduAr7JoE9sns12AKZtTzcqrlcfs7xYkciPDDMySw08BQ3uP/dlhBLu0nczTf9ZM1L7IupXgWUXSpXQYJabhhB2l4JZxHJJ34rwGsvNy4hwrx80VKEySs6xa24D6Ydt9atjOXHPmE4TZpl0JIqvLjWF82uEcBN2ygE/OC0ojIEEDCxBrpJjHXKkEp/d4A/pZJk923OZmiuPcgtM0ns8S0gpMMOXcpOQd4oJBsYH3V0B9AF29BLp5G/HW7RH0ZQY4JIy+cPgalpCVjVQ2LIcgsocKulfHWtvjbdfqjkcjl2xt4oAsnevWKanyg2l+1xi/5f9LmzCANR+dts/2reyv3lth+ApAW2FLcSxyJobzHeGaW0ff8SHI+5xAOiaS+ZXea25pIl8sUrsCEMdWrqOQFApiyredwVjpe2wIq+danD7vMkDnNjLnM2aYwEhlGYalHPNrYRRyK+9FxqDUH74B4gEwHDIWrxOaswQoOvnX3iOEHuivR5Evj1FAwSg5TNljZL1jCiAqAJZz7+owJEUGUrBU36dmBK90jCz7mH1alw1TNbaE0LlJ7l7N1et6xnBACAcCVgp4qIzoBJ42jNgJIkcExJbRnBD8WqSJY8vC5AzSj7Bg+BWhuwP0lwihY8QusWVbICyjLL8RGA49+itLNPc20iZPiN5N2kmB8/OPjcuy3IqvsZexJj1AhP6IMKTnywmQ1jy77ID2LsNvWBjWjMQql9ublRlvL2xtRIyBArrGhsTa7ROY7oXRGqIsgH4zzp+wlOfgN+M4AUA4aAW8tGtR+b1RaeUQJqoceZ4MYVwDqkEsJAxc87uth8o1UcsatqX2KSQWcQiZIUuNQ3juMm695whnNxyGQ2A44CyBvrgl75jbjO9MZqCrOgSQgwDYAeGQMRxGuLXL7N7lZ4GjVwLaX3gVvF5nZq8ETo3feQqyTrNl9qa1m4cBvN4gnq2QVTreiNVYuPZnZVDbd14DlyZSxuaePWurqpIA+j3hcT22+YB3AcVatpVGLgHizNgs2nNeeaVaiGlXBrxLYLWUQaai/eW3VAPnVEpP+2D7lPtVGZdd/SjLSXtA5j1AuXl/9gKOlffM5kJmK/lWy3+sY5D6zjouxToxTd8wZRRT08j8D2EEjO0+ucayLYDSvJfSc6lO0jJsSgkt3wZ96V6l70dmbdonCPs2TO+x7N9C0aSqXqLlAWN5Wk6Mo6y93h/jw1kDZpttttlmm222R2dEwJd+CLj+4v0Flc32ROztX3GAt375Af7h//Ez+ORHVk+6ObM9I/aTP/mD+PN//hsQ5735bLPN9ojt2QZ8C8ev5uEj67RS4EFB212MopIFaZy/pIwkvWYrNxmN5QDJoadOmkq7LYNRGU+23pqsHNE2y6AE6dRRbY+XrCUSkIeZc765iSRizfYxmi1AGsLEuQdPQMrbyG0z6Uvi3o55TgNncNTpcyqcpZqLUtmT+rs1zesJYCwvRERyMqyGQifneYJnZ2aS6VfJAMqAHAQ4ZofMJM550hJObh384CTLumhA3sEl+T+/WCDeuQvebMDrtRl3yZ2X5Y2tM9e204KX6jgsHZ1p3PWaicO0Ku9dONuxA5Td4SC2uaJrZoHcqvRz5fdtFrEbHdAVxjrtc+7WyssVFQyki7CXbO69mN5pSr8TZTlwBTfZCWtXpYoJLOCewwjCegOAMoMGAerW1xqR2AXyeZEOlvNuY/nvyEAgXJI3J8AFkvytPDKEaZDfXZJ5VmarXyl4KcfcQODeGZRYAOTNFUJ7j8Z3kJCkitNz1tdf3x0FwiHvEQUeAwYMKxoEROcEALaMUgMOZ0Z0I4zLnEuXgegJbuApxu8Y7Bnw0rdxkAAaKI9HcybHwiL1JyLnOZa8rCKfnZm+GXRlyefKJPLvQUDSzZUGfh1A60ECUmgMbOH0H9JvgiMwJblhxylnuZO20/iMw4HkUeaWQacEt0ngbGL2ukHHXX5uTwT4ji2wOZbn5YI8K5/y/1L67rFDrouC3B9bztLT7BPInnIl+xUn+e80x9N4xYYQDhs0t0jyGGeWG8Z4JDfOB6R1leIIZtJGNbUr32G1XQxMDZ4gAmwu0KGyPmjQF/PI7gWApkF483NYvbDE+opDWEKCHBIb3q9JZL+jzimZM5nJrl3T7QEBw5Hmgh5l2JtTwtErAce/cCKBQN6PzF67D7BMbxNUNganDQ8P6MnfjnNYuGnNzLl5d0k4V+uYljv57kwCsdz2fbV0DRYcBrAl3RydAJD2G1aCsOU5c3+WzS1A4gx475JqLkDuDIKXfbLfoZrMtf6eAdEKc3esZPse8/tkj2NBadMvQMFD8yyA6vd7EqhVlmt/r5jsS4t9WHlNDuzE5Doye+dJ/UaOudzPcAhpjhUM4V0qJ7X9QBF8aQPeJvvnBMZWOjTdh9VUVDS4Ne8zpHzZyyeA2ex3JnmSncP2JJttttlmm2222Z4au/Ei8OLbRM55VuuY2PPv7vCOrzzAlZefLtYrOYKj0fc427NpX/iFX4EPfegb8Ja3vOeR1rNen+G7vuv/jI9+9EcQwnD+DbPNNttsb9A+NwBfYOqkNc6rMpdv+TPVHEqW6VM6eaxTeh8oa/MLWqsxde3PFUdTydwBkHIU0rStajXZOntOHVwZ/A0F08OAtmXbcptcBnhtfuAtqTyXWEmNdWZBGIEYN0gqJZtQWRB4zKtJyJK1QAHyavcd5XsI4vCOnZdrE7DigFGOVYE4rTPVo8CyNQWmMuvStCXn9XUE2sSRjehGdm8ug6X82GnOVwfXONBBJ/LOZw5hAvimuWslMivO3wlgX4CZZGUEDRu+nIf2ue8CWXc5dneaAaWnjJzURmWhmDkzHrMOft5dTwKV4P1UGrvyDmz1ZTK/K+/KRYDeHbYl6+ymwQ35lAG8iJGVATIYyiOYqUDx5pJDbJGZq/LuSH5WNAweaGSGjg0SIFL/TopAcyrvw/pwzDmqcr9uM+aw9mt59wcnwBYFQH6RfjAJcNpfYgzLJGGext8NLOfdWF4O7iCaBFtMpJWRnPmR0vsk73heuxUYzRdLG6NKSyepZqlwLB9IgKyDANWewQ0jMuVvgQKjrheG87AcATwKJLlvnZTreik3M5mZMsjHnkGRpA+DAJibY4fl6wSsJP8qNTSuR8zSppgWPKIEuo45nfN7a5bTYSlMY24EbPUbbb/kLM7S0iy/d3cDYtsgdAIWUyRwP4K1MZUjP0MAZiRAchiBcZmnMoWHAyTQGDnfc1joWAoDdjj0WOz4/jGlb4++I/bbpuzVfhBAMyjgWzhDavK+pTmXGPgswLN+wxoTkGTbpsApEahtsXrxEGc3GmF7d8h5d10vgRHKrI66s2LI+50A3iybnuZIWMrzUSa03xC6u8Dhp9Zwv/ApGYu2HRm8BeA7ysOTrAXKVFbw57ycoedZLcinBH0zMJm+CQYslPQENL2nBhrXQOS8dyuO7wONKwodI/hcrPElG9aWH4p2anllO8vvhg3EOg8cP096upRitsfKSy0AWpZ5gbQEe9tq5aV3tdcypiv7zjF1wvh8dgZ8aR7cGCdAdC3gLO9brFKNDXarpXnQPnga9wF+bEvO6burHC1rlxyzgr3WCtA3NX5aRnFPPVXGjj51HYijyaE9bSMRTQNBZ5ttttmeQiMAiyLvTARjcz+pF2ab7Vm1ay8A7/nSJ92Kp9JuvLPDl/62K0+6GTvNtwTfAqF/0i2Z7f6M0HULvOc9vxq//bf/x4+8tr5f4Xu+59vx6qu/+Mjrmm222WYDnnXAtwReDbslO8gVxDJOanWiy/3qgCpYscaEjZcc0OocmoCfFthJQAh7cSwTiQxyrd3lz20DZRWNDOHCsWSBXpWFUzMyvGPxNGH3TgAwlbhtmuz4YozO2gmgre1SJklyLGWWi2VQWKeTU2CHMissM5oTiKpOftcnJJUEAGACXOAsdRpbh2HpERcC7PQHBQsiMtozhl9F+FWECzGx6xgUAkBA7LwAR40w/+BJmHYsdSmAm3MCh5ikOEcQwbKIKWICXIusrgB1bmAZysJPGRsCGoILCShuPdjfgFv3aA4OEO/cRTw5MTeE0WfrPIAwmc81R+2Wc9QyTixTBNhinXACOKxzkbyfPNeMpXkvYKaR8qa2QWYoWeaN3ls6HqsM4+QMV7C3ZPCmucyp/eW838n43WU1R/4+Rk++LUnIKmCUHLsZsHXSFoIwVHMeUt5uiw0eUOlidgQEhu9ZwMyFEzCJBYgdlpTYvQks7Skzc5kECIwtsHidEjtYwQ8FUAFOIDF7YH0kc7o5A9xGytxcTWxLffwE0NqB2wg0DBocwEA4iBiOPdbXWixu9kBghKU3fZI+h4XLqglxkaTF/Qj+umEcb2VBI8k3u43kC2ZHGUSLDcnawYz+0AsbFzIGCjjKu5/YsMrW3RDcStYCgOFO0thCZJopSUU3p1Jcf1nbh8wiVlCTExDuVUp5Q/BnDrFLz7tlxAWhPwZC6+BNLmdhE8fc5smccAR4J2XaOW3kQGPHiMsILCLYeXn2TkHHsQ6/YYCB/lBkpF0Alp+VQAErU00JmHQBSc5bFztkhjhFoLmHnD/Y9XJ+c1Xkr10v0uHEApz3hwCTwxGQgO2R+UYpAIVbL+v1BNBEBjCVMZzXshAFxKAk258l+Efwirp2+h7HOLJ6rSKFlUTW+lbr8Tt36Rjh6jHuvqUR6e4DCIMbyJLfzdn4/HKO5PLTn86HpcwdZQfTQPBrQncLeO5fnaF59Y5c37aA9oE5Szjn8fEOW+vUpgdveoQ79y4G9tWstlbuYJ1mBQr93RmA0N5b/EzegRVY3Qd+VlIG5Pt1H1QG1xmWbwZ6J98HU2aZD7cEdjlOc+EaZqvK/k6CjSzDuDQrv6zfRl+AqTW2cmkWoA1Bpp2tT8vQvNPlvSpLvQtItqlA0nd4y2pM4ThUmb9bwKV+B7WNqQ3s0u+V+jSwrQxO09+3AtZiHAFdIzWdpcKdA8WYgn/SnLQBm8W+ROcaEUk+7XI99n48Vu5VtJ+F4ko1cM4wd7faUVNugZl/FlTWNCo5cPAB14LZZptttsdkb3NL/OXLX4TO/OH8s+EUf/TuR1FJGDXbbLPN9lTYB3/fNdz8+DG+/y99FmEzr1XPil279iL+5J/8e3jxxXc86abMNttssz0Se7YBX2AC9mbbx8DdVcYeMGjCAnZF2bvq3leXXHB+/fsknNWxVDqE9oFaZT3WYbeVV872yQmioeVbtvOWxGAczxmmJjEjKkMp9wfTnL65nUgsXWHrAQAayX0aF4QhgV7DAUa2LUNkMVmABRAQB5FydesgoO8Q4YjADSE4YR7lbkbOANI+1k2uTx8zSzu37picN/1MoF4e4sYBiOCFFxXXowPQEOCYEVdrbMlxnscaOs9qzJR911rbwd7ZfX99HK3DtnQET/ID6/lanTqXK8DuRYxoW6p7LNs4wS8CmOwK4Nh1ORtcT183osQC1ovknwKeFAUclTy/6R4g5wkd2z7+o5DAxEiw0rJ6LAPFQeoVNicEqLK5VxMYqKzN2Jg+aHuZAMcIHbC+7NHeDfBDKAIixrbncVCQW8FtILNlWfEIc03upktAqzJC9TPgzXjoGCYAHACiF6COtSmcgjlqj8221UwDZcsqs3oEInVskfPnsgPgWZZqL8zmuHAICz+ymeM4Ich+s7Qfqe/kMF1/c4PSLY5znTl3LI3nxzlg8hvH8V8+T2PfYyPXNmec55MbAA4qkU2IaVkXVvMINnOaSzq3QmfW/+K7PZHwnjyDPUCgYRQS7Htgk8hW6jQ/1wNjFBhOIIrziFeO0F9fYjgkhA6IjU4oeS/cIO9IHj8e52Sem258FOwBbtJzT98tvwLae4z2tRPQpgd7L2Cv5ghP4FQJIgMYg8RYcvei32x/Ox6H7VovK9+tMg/rlp3DgN2rLvEgti9vb2mGJTq59376sedbngPp9tl5e4F97OH7sfPAeJtjV8HhfSzs+2mfzR28p6vn5ha+aJv27HGm6jcPCJ7uApL3MYg1IK9k9pZ/D9hgvl11zzbbbLM9ZfaS6/B2fwAAeKtb4D3+EJ35tjUgfFV7ZQL43o0D/k042SprttmeSfMNcPU5kXJ+Wo0AXL0hf1vc+uyTbs1TZUSES883CD2/IRfds2gNCB/AApfR4yfx7NGbvW/wlrd8ES5fvvHI6/rEJ34Gn/zkz6Dv51zPs8022+OzZxrwpRBAbFiHjTc5vWJyYtPI5i0YPBO2TA3AVed6CeiqU7g87opzVobTRvmXZVuJN7XSOWPazn1vDpt7lCmidST55q2cZbmNienRJGCLE/BByVNf1u/Mz02TmMsBk/xiqc6xHyGDclnmNgG9wrQVZ+IWEyqBIMOlBmFBCC1lWdfYisM8LI3MKMR3vl4Q3ECg4OCCsNoWtxyaez1cz6D1AA7CrmOOo1w0RvA2F4YRhMoAF2Nbrtc49+19sSH4dcx5SDNz2TpHvSA5zAAvCfBHoOUCtLkM94lPbYO+zADiKJVpHc1WttzKJJa55GrzrXzWtj4FY4jyHFMnJfP2sxNHbsj5J4XJFXMZF3XUb12XmVAVFo09XspY67mybJur0MhnsnVEl+9Cre05xzInp6tI8DISs7f1Bsgd2btAmg+kgKxdn9KYB075ZxlhObLaY8pVG1sBMXN+XK0mSv5ZlWDeXErgbkw5XocxYMKvEuOwZfgzgu+F3as5WodDRnNC6O4wTt9EGI7iiFx5A5ZGoD9m3H07YXHbw20i3CaAG5nfQfw5SQY5vbNWLSG938FTBv4iFEhLaxdhEiSi11Fi5+s6IWOUwMxB1gG/YZy8ySMcMriLwGDWtHS9jl1YIMsic5MwdH1uHnlcYzOqAai5PsksHwUZHwcgELiVOtZXPGJDWLy2yfVloDMD1+ZdbgmOOQPkkitcWYsOridQ78AcRLmgg7Cg0zzW/MXDUuSoXS8Sy6FNyGQCLYXNm/owyGsxHMolR58WFm70IhmtNiylKbEled02aU4qY5hlzGKX1u/WgzaUvs9pDjTm/bHvdRHQQcGsW5lNH9OtSYq1lGO1VmWtmjUiKVXwMMg3rB+AtgEtOtx7xzHuveTRXwJCJ6zoZkWgHmhW0ldlVmuQAetc0dTDJpBhOGBwO84j6oGDVxlHnx6AV18DFgvQcgFeLgDvROo+MR+5pRGUtszfNFZ87wTx7A3+MVnugUijL+w1aeytbDMwpiDYWlPD9jerzJdOLitJON9u5WidgI8FYDgBBc25LOmMxHYtma3p2JgP/pzvU2q3la6eBAfVmLa7rCaPHZ3sC1IdVEsNYq+3dWmbNB2G5ge242b7a/Mcm+O5eH33lE1tn4NhD08km7VsfV9rY1D79trrtB0G1FSZd1YGMMcxHzeQ2daTb3QIua68f9E9gqqXFMo3ud/K7teACyBLTWe2bm2PQTSet8+uEhhaVS9J5yUoLd3X97sDO0vw16buSCkyWPcms80222xPmX24u4E/dfSu/Hv5xXinP8DfvPz+ybF/MdzB77r9kdJTMdtsz6YdHAEf+DDQPF35aadGwK/4IHD7NeCffNccRDYbAOASCH8LN/CdOMPvwBwIsM++8zv/Mr73e/9z8IOqb80222yzPYA904DvBDwDJk4TlXaWn5MD3YC7pA5TlT1zNN5jWbolIJzBCRpxICM/m9kOtbVcgVL7OzAFjPR4ecz2rXRc78rVWxhngNmC2zHljHTbf2Xl8g3gaFknRopRnWkqLVcyNVXWGQBoEBBEWL/JkcaKqAp4EzuH4cCjP3IILeUcmkCSwkwSsCL3DGR51wUhpLK5BwBCWBLYtQhLD78KSRo2jnl2FYilMY8nMAWWJn2RYqfXq0QhpXybLP0gFkCFNA9mZLg+TtmKpMC3sOUcAHiCe/4G6HSFePOmODl3AaW6cYhukiNv+hx2bC4siFqTWtZ8u6UcoZ4HtpyJW/KE3o3tUDaklglUHdqTMmqOylzeDnCnZMjUxs467CtGbgTNdo69dVYTgdtmGhih9yZQN1uar/Uyp0EHgKxPw8IhLFKQQ2LAD0dAOGDwIgpTN0CAxVS4AiDNmfysEsSapzY2SeKYAbcZ2+h6RlhQBk0BATelUAL7KO+wjwD7xHCldJ2AmgCw/OxGnPRMcDafLNGkfxnk5hH8ZBNkkgFtxcIVIE/Xs5dvQewEfGQnwKTKUMdG3vVwyIhLllzHhATGAgClfL4yTm7D4CDlKxDqemQWa348lN5rCMiZ8/oaUF8Z1zr+/SGBokNn8prnwJI49j3nA09AJvv0nSGRP9Zxak8k+KVfCoVUAwE0OEaDDMJS2yQsVXaAGwy4YwMH0hzpLwlYfK/3icXKMq4J0OT0OfNrTv0juAFAn4DnNA4uge4yuST4hPUjqd+FYL5PbK5NssX6/ZoobhTgVAZk9N0v2b32uKZHsMFUCvYyC7v22hWs3noNp895kXLuZA77DXLghHZDAirG8YNl9Cq23gGhRQ5aAiCBSSvC8S9vsHj1rNouCsGweCv7EwAIEbxaSx8eqpSzObYvD2++ZLuMrWMKZrqi7JQ+g7OUf7Hunsf4rZzf+r7UcvHuun9XqL6VitZrdkknA9ugZymPXdyXBVXK/Me1tm2BvgYk1a6X4DTMN9Z8w0q55KplifcRuJ+wb8vfy3utRHR6NjVpYwkm2zGPk+T0JLBN9yi1HMIq43zBnNYX2mPvU0BJYPAYRPAGnTs6h20dCuh6Pwa8mOuzikrI6P8ba8Nss80220Oy37l8Ce/2hwCAL2qO4PaoIxHR1p9Lb3dL/O+O3gUGsOGI/8vZJ/EaP3vsstlmy2b3/U+j5bY9xW18wnZwxeOrftdVfOJfr/CLP3L2pJvzWIySD+RZDCn88Id/H97//q/Gcnn4SOv5pV/6KXzP93w7fuIn/ukM9s4222yP3Z5pwHfC9LmIZQA4OZTVIZKlIQ2oVoK+mdlgynPmGoeps7CWh82ZzVyYOrtt+wCIk1uvs6xF23dzz4ThtM9qIFdkbDFcMvPDANnAfqdR6t9ORyGl9vL4Y1bfVKAnyonYEPojh2GZmIxJRlYAmKm8X85ZmthV7CHy0amu0DnEhkFLyR3q+gi3HhKzmcCNA4FHACnlFSZwziUMJHDZzhntk3bBCyPDZ6DXzoEp6EvAKFet5REA54TV6Ai4cgTnPejkBNhsxjxtyhgun8fk2fgtJ2rJrqVy7u1zSto5WDJHzrMyN2EpEWkZz/meCgBdscyCGQ+M78JOacP9wPkWOGElzXe0IVvjZO5Y0NK2TcHO+zC9JyagSEFMx4zYkQC2XqB+YkJsGY4TaAgkSV5kqd0xP7V0LXYMvybQMAWhAo0gFjHy2qesTRCDtN70DgIAe0Z/BLjBYflZ5LlPgcd5nvqVAbK0HE/GLf0FwSoFzUiLRgoe8WktGRL46NLaoKBtzwK+Iq0JXtiZ3EWgEXYkw4nkNaRP0QPcMmiQOlWaOXaAX0tfuB0xt8y4JYhUtAMabXsJ+FIC/JaEYUDKDS9rRVTA1/a9MgdkWWZQ4wSQjkBzymgOCMMVN/a1xZiCUxURFgJoi3R3elgxdSCNHzCCuSAZC9UO9yvJM8unmIKuGMHwsJTnITnXx3GgMD4LqWT8VuX3JcYp2GsZu4Dk2R0CJvm1gWlgigU+iMa1xapt2Psmg8wi46yM0MMlwtUj3HtLh/VVwnAoz54GCY5wQ+qrCUJwGnzE43tmg3uiTwEaKiseAdcTmhWwfOUU7ubdsd82aCqNj+QA13XU5XZLwFoE1mtwP1x8T/QAJoEwLv9cuWD8ucaANezYiVKFG1mNZBmgu8o+rz5gG2jdlSe3/B7t+z7p+WreW0zvze03+XDzdRXAduu+c8zmBK6134zjBGCvSDHvy3FfS70wSYmwS7IawFY+Z9tOmO+nqsOYMdq1v8h7GxOAKHLnceu+zBS+X9B1hzqItS2gVY/p/Y7GtWds0P73M8YpMzi1f2RR72vz2BaKGIM8n2Yn8myzzfZ5Yw0IS3L4cHcDX91de+ByXvQL/O6DNwEATjngH6w/g3Vaq9cc0c/5fmeb7dEYEdB0wLB548FsF6oPaBeEpnv69zGLI4cv/vAlDBv+vAF8n0XzvsVicYAPfOC34AMf+K2PvL5XX/04vuu7/irO2cHPNttssz0Se7YB3x1GIY6R/Mog6IfsRM05F5PjRRzcBgS2rEdrCgyXThR14NjzIRqQ1FxbMnaZxZENjDKdbNCVmjXNFkBHNUk3y9TwXo6RsO3yfYUjKMsiWulpb9qudVumRMXRyZmVFEAhgocozFZPI4hqpFsBCPMXwHDgMRx6DMvERPOS/zGzeQFoDk1iTkBPakrPGfRRhl9/kKRMB6C/7OF6B9eL5CwNMYMrbhPBDSF6lyWlKfDUV2Z9uQmEEdZfcl7y+DMTsrRizo1qHLNe2XUOiF4Y1gwCOQK1DuxFDtg1L4Neu4l4+84I+sYw+lNJHOalXCY7eZ72GZOyxzLrg0dwoXRChjCd4zrHlNlr5oCyTLaAWmXNeT8ye3VeeuMEN8e3ylNTp6f3ue6JQ7gsF8j3XxSc5pqzfie7NznMvZd/jQeGCPISRJCvSdexSr4zT2WAE6hJQ8zXZZnxlCtVgZ7YyCPWnLr9ESNcUnQWAq4NBAoEOGDoRDrWJXDQhQSOdqleAvya4NdS3nAg7VJwOKY8v2CgOWHQNZkPbuUSzkBgx0m+nBJzmNAfyT2HS58DKCZDl/oUOjdh9wOGSWwA4TG/r/TTDTwyKvN7IG1mkr5on1xgWUsWhHgQ4A7kHYo8BSJoILi0PrKX8tp7sp4MDWewnAaC66XuJqaAlAUyWN6cpfUoAhRcWkeEma1gbFgA/SUPv4poVgHwwuCNqpgQpc8KdlMgAAz2TvCTPiQgg3Hwmoz/6mUk4JbRH41S08MRI3bpHfMCNlbNcQLZ0/OIBLQyuBvvBRgPJLLfG2BxU+YURcA5mdN+LW2Jab2ODhiOADAlKWlZ3zCYtWOibEHj97MEKfphDNZScDjdR1ayXqVWicaAqRAEHOIIWiym32NmoBcJel6tZf1YLHD2xS/j9MUW995MGA4FLPdnlOdWVpbI45ewaH0PE8gdFpSf+3DIGI44vwOuJxx8mnH5lwYBe9cbYLmYrBsAgDCqkhDrPsbM3X4Ar9cI907whnL35u9BASJWLIOHNaapFpfX06mcszBPdwCBWndicQIYwd9dEsD2Xsi3iQq266SN0Y2Ao9d7doCm5TchYHcbttIBVI5PlGA4g90AJjLJW22pMX0zOOrroKsBzSfgfCm7XPYfANsgp1r+5RJYLq1g7+b71PQbrtdVWbQWIN9TV9k2bXYFjLW2BQbbny0QXexDsirBJEhT9lYkFQExgstys3x8SnVi91e2HOdG5ZQkIb2lOGMVVmJM8s8VkHoGe2ebbbanxD7c3cAfPXo7XnDdQytzCYdvv/zFGeT9P51+HP9g/ZmHVv5ss81m7PgK8Gt+C/BzPwn8/E8+8uoOr3l8+I8/j6Mbe9KbzDbbfdhXfMVvwjd+41/AtWsvPemmzDbbbLM9cnv2Ad99YEz5+z7Hxz4wiGhk3JYAUwmUleWUjr6aqVPrftjKtm3W7P32nAWH74PJsVWu/j+3ueIY3srjG0HqkIosvkMmuc00RdlysXOJrYEEfMh1yuKTi0fwV6RIjQPOgmkkoJWMhYARIgUuF2TfIZtyjRc/5+tVfEBBGGOa31dBuoynuyQT7RIDCzwCwJOxpC3fNyfwg1sPPujgDg/hIiPcvoPMvK5Z4RS2DJQskVhjtllG7C5mbQXM3ftOVeZznl+GxVKbc/nYecwcPVcbj11tsw5km8MwV25/3v8+qsOYvZsw7nLfyzG6iPOVDYvPy7zNAHB6JygFMHDDAsoNBEDmtYuUWZrEAIK8A9m3rN1jOe82EOaqkzLBku8146H6yLoR1KQo5fLgJJjBMZDqBad3siGEzgmjPggKlnNh2+6S5H/VHL4qly7nAMqdR14Xdlrqs4JxIoksQPCwBNAwnGPEIOAlDQS3IVCfAkoUH9H1RoYfLiQ535BYnEhj14/9xRI5+CSvU+n+zJJO4xy9ysmP82HMJT7eO64lSOuJWWecA8WI9iSgvUfwJ07Kb5DZd5LOgGVe9CkQYEPI6gOORzZvyjfMTRoIbR4lRmpSLQgNIa4JLgH8pIB2TOurT/1PwKf2afLc9P0o341aAMqu72tevGm6flWUC7bka23ZMQrYlcBhOjoEXz7G6rkW6ytOpLBTf1yPJG2t8yv9H2npjfq8pXydQ8Iuh7DDvTDIaSA0p4TF7YjFZ1YjCG4C0+w4yDfEbY0HRQY2vbCT34hUlF2zzsmMNwEPd9V5XltKJi3Sur/vvhrDtybjbIOfdlnaw1w0p3w1R+9Fbde9pcTxvrLtudp1+6Sft75vb8BxZoHXyjPcapZlwZaAuGlX9TkYFrDNDzw5r4x8osn/p22Oo3pNWcZWncUeZ5/t2GPX6s//LwLn9tZfW9P23Tvn1JttttmeYjsij7f7g4dapiPCm/wy//7lzSXcjD3+RX8HqznL72xPu117Hrhy49kJzvIeOLoMdIvHUp3zwKXnGyyOH2Dv/YzaAOAfY42biPgKdNgWtX96bAPGD2GNf4nNk27KudY0Hb7kS/4dvP/9X403vendj7y+EAb85E/+ID760R/Btvdrttlmm+3x2LMN+KqDR52rjRvBEpdYA4kpxI3f67whZTeUUmrJuPFj3l8tx8oy6zEFhq0jrGT36nWZQRLFvzph6aZ7lPVbc0KVTp/SqWTrtYxdLcY6h2q566KR19vFMHEE9LztrFOGqSNg0wtr6kg2hxQYTDwyIXxi1ZLmmhS2a7MSNlNoJTdnWIjT3G8Sg2/DiS1HE6YfRYYLiXlLAoAEL8xBCgA1Amg1iZXYnAZpkzKOGVne2Uoxs6ecC9Rt4oR5SWF0guo8zBK2LACPsG2Tc5IZKl+dnfZQgCqBXY1DJAWor8AdH8BtNuD1emT65vlgnLj6nPS90EcWWZymiX2+Jek8ef4F8yXP+TCyxfMccFVnLflpjr3yGi5YxmQB4MQuJu/BaZ5PWLoFi136Z94Vy84xdU1yFHpttxcGzTk5fbc76GQs2gZoG3nuVr4xasCAgNtsGe0RI8CJdJ1zE4BPc9jKeiZzhAZhq/sNw28Y3AH+YEA4bSATjeCGUZ7Z9QQ6QwbhXBiZr7GVW/xGGKGhS/lgO2B9gzOg53phzK+uk8gCk4BebkMIKyf5cFspW4C/1EUPDEcOzSngTkMCezn/4WLzrwujmCa5uQEFmCmDvexGZmMey8R4ZgXfIuB6TlK7MobDAWFzleEOBjRtwGq1AK0d/IlDe48EKPXpmSVGMyDyyxQAf5ZyHUPWH2mLAQAj0B8DYRnRX/IYDgQF5Ebec1q5tGYJ+EwLZHAUUKCQRzY0ISsFyFg6OMS8ZrB30r8BAhbGJdbXW6yvjwxSGUAkoJLgTwnNGaG9m/Lpsqy1Y85fGYPhkBEXjHAgigzUMKgTajgz4LqIGAirrhXQPKT2qQy2rsXpOfkecGm+UkiAbuMzwGqBbxrMO63g44DdgEdW7DDf5gkLeCyPUi7gck1jZqDfZIZjePNzOH3zIe6+zWE4EClsyUFMaM5kruVAJAjbXC0HZAwSIBE6eXdiK/mQY8eAB9xKnsXyM4xLH1/B/+wnhNnbtlWwF4CsMcAIDOt3IwTEeyfgzeZ8gKpmORLEIUvXW6avXlYwK3kH0CfvT5IQ9uabZP9/ETnknD/d3GOvK8+PDQU1jQkuMgCllT+2bF1H9f2NHnOUr83fjRC2GcS2L1p37Ztimau2D95v31OroywrSzbHyTiN3zs/vY5Snt19gG0NPK5dv4/lnPrGxRjnMTynb2TVduz3ohb4UZFgruVlroK99l7vZd+he6xS8aeUXK7tRUz7WXOCq1nlFGtlfmFVLUhtqOU53jKrcqA2g8CzzTbb55H9ruXL+C2L5/Fbbv04PhnXT7o5s8223774K4Dn3/SkWzHbU2RnYPxBvI4PY4l/gOefdHP22j1E/AG8hl9COP/iJ2zHx9fwH/1Hf+uxMXs3mzP8lb/yv8YnP/nRx1LfbLPNNlvNnm3AFxCwCcaBy5xBXgBT0DM5UKmQrstOldIJY4BTUmnIkkGbHZB6D49sXQO0bVmRR3jSDuYRTNZ2ME+dTPbcrj4YNmVmWVgn9y6JPGWQah+sbKDtIwD0g4CHcYcjKjJ4CKBNL3K3jRMHv2GrcWABM/IzQu5LfyhSrIAwEd0ggJTmwpwYJRAl5fDEQoBYNyADRqEjOM0nmUCVsHCS73MzblY4SSxnAJYSkJzSI6qctF4joMcYgMCpbCtnq/k6lSXsrIMvMMYcqQYUhJTDrUNEB//8DfC9E4TXb2Ei3cmcHfC0y3ldPheHbcavcyOgW2PP1mQOYxzBWlPWucwpzQMcwlSeEJiyfzUvXw2A3sHmmYC+uelTJ3iWsJzkN0z15gCHSrCGNn+5AC0X4LaRtpEAs/ker5K8BtTVuTTRBk//U6AzKggm5/Ixl9iTERIE4QnsA5yLiF0E9w6IKaiBgbBk0AnBDxLwwF786wrIKptXGif/Qif3tncpM+tdCtqkPO/H6+EANLKWRO/RbNJ72o/s111BjfKOpLKVHQldP+W8rDO8BbIBGCV1OQHBBiBV4FFkoyX/6uZ6QNsEeZQbYcNmBmpUxrSMVXuPMigeFsi5kzWQJHYJuB1kDBQMdhtZvygANJDIJydgmIZxbYs+Sc33Di2knfl5p9zhk2AbYFQLgAQOyBwRIMWvIw4/HUHBoV8lYN7LGEqADKE5BfwKaE84A+LB+MJ0fDdXUmBL40TS2wHhkOXnhhGOo+RPPhApcY6EYS3BM/4MUJlnfQZ+xVjeYnR3kiypSzLejlCSL3I+X/t+F0Exk+tV6tuyX4d+sk5MGIZsgpMUiImyFrjjI4Q33cCdLzjG2XNOcvYS0J4kCW+TsxdIQQVaTXofdJ7aYOzYAnEBhAO5mHoJyGjuAdd/Zo3m5inQtUnK1YC95dpW7luIpA+bHrxaTyT278vyd7ey3pWKEbtA3gqjNn+HdtkFJXqrMsbl+V1Sz7X26nVluSYdwr5jNRDxvPZliWlgHBMLdpb17JHJ3jKVbJ6kMuA6e5lcktMu2mmA7QwS7+rjrvHdKfFsgyiL73xNrnlSftzqQ02yeZJOwuwTKCml2HtzwFdmHRd7IGZ5lyYBkXFrHUmFmEATU076eQvs1XtKYFZB5DKAzTzTCzHRzd4t78nOv2u22Wab7ZHaFWrwhw/fhvc3R4+8LiLCATz++NE7cJKC2P5fq1fwY8PdR173bLM9kD0r7N7ZZntG7Wu/9g/gS7/038XR0ZX9Kj8Pyf7xP/5/4kd/9Htx8+anH3lds80222z77NkGfImEKVsCp0B2qGQGXQK48rnzTB1exKNTR610atXA3cnHxIC71mF0XqQ+kJ1Je+V4gakzqmQ6FNdkZ56yLVQuzzpNI4ujjBIKAQhrOoaR7RJTu5CcdGG7P8wMGgbAi/woMwnbw5iCvsLIQ5ZRZifs3bBIrMQIQAFfL4BLCVgByOy72AAOBNpwzsnJHuCk06qAU2wdgAi/NuOuZSWATh9jzu0bzXWcQFp1LBZjJwCGcTpSkne2w8WMLLNaGo05YfnoQIDju/fAm4JVYp5fZvtMmCjGIZvaWQV9bZuKdkysIrc8YeGeIxFdzteJI9al/II1dsoFgOTJdbsYLjVnuuaYdBF8Dn5CTQNq2/8/e/8edNuW3YVhvzHnWvvxPc4599mtVj/0QC30RALEy0KCgAV+gGVSFsYkEMdUKi5SEHDKqMoULhxsEmPKSSpxOYK4TFJBkMJVKSfEGINANsiWhGRZEpK6Uatb3a2+ffs+zuv7vr33WmvOkT/GHHOONffa+/vOuefec87tNapOnb3XXmuu+VpzzW/8xu83kpyzHqTi0DWMXQHwUEjYBzabnDDjcqC0Q0ElDV6IDQDP8J4Rm4gQdP7JydwI8qRBEkCa7x7i9O8MCI3yOw0CDIZVeoaCubfWCWVKKwipfeCG9E/zD7O51rTTPrNW+hhkZNSr+47qq88dkNmptt8oypoSWyCsGe68l76KlPMcs7mv5OUVlFLkj1N/NUBsOcv1guR7bIG40HUqzd2US1lljjVfruspM4GFWZeA5EbGawTkJqUDGcsi5619JJ8VkKdUfsTqbkgqBoThpOSNbTaA2wHNhuE7+d8FLsB0ZMlx3gnoTOyzOgJxAqdvUQq0IXQA4oqBs0Gk8YMEzQCA35aB1j5tL4HFw4D2oTLmCBz0OcdhO/SutM/OaO6mwCwDfBYpZxqDvZETwzhKH3sHPjvB1YdPsXnFYfcCEBYig+130n8yfpxZ426QsdN3i7aZovSZjmFspCxesIC9QfJmt5eMxefugnZ9CVCxgWrHFBj0nBDBQwAP/c32NYfM7k2OHQNG75ma9bt/KhcwuJYVtoxdoOxJrB0rf6SickOwt34HTjGLp+6v8v/2XLuPORRglXPzpr6YUlI+xJq196ytZh5PlVOziKf6+kD5eU841RZbhq3LgTJHe4Ipm2Dg6vn2eS2KHNP1nbSK6VqXfUj+2d6bJkDnbIeey0O/V7/l+uhe6kCQWg7mmNpLKeBMCay/Lg3GbLPNNtt7bCty+O7FC080d+8xW5DDP7sszLgf7e/PgO9sz6YNPdDvgGYxA7/vE/MtYXnm0G2u9yUdsw6MtxCzK+Q2HPwzJO98gYi3EZ9p4fymabFen+PX/tp/Gr/1t37fe3bfT3zix/BDP/T/eM/uN9tss812yJ5vwDfGiqWQQN7Gj45RYtPmHIIKMDkCGXnEPSdrYtqwI5CCa1ZmLZeHcp0yYoOR3PXKJqscQbVko57rnDBnDduRTL2nnDmU6sUxFnwkRjnuPSg5jMbMisQAyNLUyYEYXYU65QLtDQEXE0CT0e5x30UGb3egNYGHAe7hBrxeIi6EySBAUAHkC3jBCK2we7kBNC+ngi1+VwAeBbB8hwy0IAENUrDINwMwcs1Af0rCfBv0nsIGbjYB1Af4bciswRFDNxqGuAEsmIQ5DJVxToxdMuPL1fm8cLnLYusEeOlCYXhptyYZVPYOcd2C/Cm8/wrE199AvLw04yON51om8ZgE4xToe13euHRudi6iAmsnrhnlESYSiWNlvximS3FwJrBX2b81szgz0HjvXvBJojmEEeuJa4ZcJZ8p7DVdDybYzbWtVyLDWrF+lMU4muMatMFp7JXF6oscuAanxDaBhiEBc8lx7wKDO8LikjEshbVKy4DVoodzEZveicRuAvL8FaG9ANoHAlzFRpipSMAlJSbxcCLnNwMy0BfWCbTywLCQ891QwE+/JbiegK1DTPleY5Mk1hcEvxWmr9/KWMXWjSScBbQuzxbbaZOAXDJdnwM2MksOI5A4tiL9rizLZiPHw4Jw8TGge3nA2dkOXddg6Dz8lUssXAG3XUBm7DaXrkjzRqC9kAr356Y+CXQPKwYlGW2kZK4xsWvdVqToQUBzmYJWOhYwtgH6M0J7pe2Xukfn9sBxazpvAGQZaJWQX765xfLttFb1IhsaFz6/w4YTj9g6DCdOpIadVDm2DsMq1S+xpn2X1AxSO7OMtQfaCzm/v+XSMU6yxcKmdiTr7/JtRnvJOHm9g98OoF0QsNd7eb8EFCn8wJm1zMoABjKomeeAgr/2d/PsAQCaJkm0G5ZfWjdK7ABnsBfeY/vrvgZXH2jx4KschjMZv/Y+JYAc8DvO7F5WOVxCWuOB6CmxvIWNLnLeMv79LZHHBkMk2XeE278YcfrFHrj3QOrbtiLZ7CgzffN+xCp8+LI3oH4A7zrw1dU7A3ttH+Z11u6hdN2sjlXA3ojFqkVPqJIUNQWMQcP6N2s1A1QlnQ9IRB9SG9nLO3sToHe/AftgtVU/seeld/GoH2r2rpGZzu23DqIaWK7bNMVMrnMDAyJpjtQ3uv+r2xd5DPROSWjbumhag2wplYp539egba5DGg97rFbhsPU4xOwd7TkqcJZq8Jb28/dK0KLeZ3qPTT6to0nmmSbOMQWWcibAX5vqYtzG6UDNkZkguj2wuFZq0fIPBW7MNttss71H9kbs8Afv/wx+7/IV/KnTr37a1ZlttmfHfuofALdeAH7T75K/B2Z77u1XfdcpPvLta/zQf/gm3vjU4+e2/W+xw2+AMETvwOH/g1fwlc+Q6/7fw338VVzh9WdYzvlbv/V/hD/+x38A5+cvPe2qzDbbbLM9FXt23hqPaweYvZO/TZmVV6uvnwAj7fGD97JsV6J9Rxww/r0u19pU7t5JB61xaOtnK1mXb1E50q5heozqbK+xZp2Q5t7sII53TizXEIB+kDyNKl05KkcA2QzccgFulc1rQaCYZq9K01JVLVLszidHfSQBJxJYFBYCgilzL7YOvA2CdYeY0A4CWlekRqM6/VN9A2QMNO9n3SS9Lh8o51jwRiosZWmu04LsJLaNJ3BCXXi1AJ2dwjEjXl2N+xDGQX9MehKowN84DmhI9z5kU071Q0yYg4DwdXYoT3VtNWBt5KZHQQ41A2qysjeLVaSmSSze48+wTCPa+02nl5WclB/2HbSkMuRJLYA95UCGyCSnJ8xRTXOqxlaeFXYCaLpeng1uSH5rU2xBBIYVoAxiuXECNUP6QuW4AFhAocli9MxqoEZ+LqfaZRn1PK7/+ETk/L05cMecH1sSoDwaoDw9p8MJAwu5KAYHDg7sGRQILhDggEgYyUvnPMEpeMQNAtSWNsoHGqxDP7U5ENgxuGEQa53S0NkUACRAYVw4AT4ZQALcARSJ6sDptpRl5JG6nRylICMBsigwMES4nQwC9R7hbImwdOjPPMIyBdL40kZOYGVYIst2I6YAAwMuq0y337Lcj1I5njCsEmhC5dxmw2gvo4C9KRc9O0rz4cBA14+eglNZ3lqPaXCHK1LHFRM4S7cz54AnACXwo12Azk8Rz9e4+mCL7QsOYc15DvskT06DgL0uBUQQdCzTGGgAhd46r+8lQCLPtx2huSSs3+yxeGujFS3vw/R5pBSg5zDntmruXvTdOJ/7u2V2f3CIFToK6Di8nzjGCs6/HduPqB3KBzx1nj3nuneiPe+m95gCk49dU7OdoZeY9h9RoLjWpvLo8kS/X8ckPnT+NXYj+eE6OGCSbct7511r5poRo99RAUePXm8CRYBxwFl1zsgOKJnUNt5/H69LBrSn6l2nUolxxO7lG9Znttlmm+3dtgjg9djhXnwP9iuzzfY8WbcFtlc4/AfwbM+bLdYOzYLg2ncWbLcD8PkEpt5FxN/EBi9jP5BW7evWa7xww6CBNgKvXobH4gu/joB/iB1+Ej2+8IyCvU3T4tu+7XfgW77lt+Pllz/ynsg4A8D9+2/iZ3/2h/GFL/yT9+R+s80222zX2fMN+CYnqDIu2VFi81bSaKwgSWJbZKcpsmOVXZKDrJ0q6kT2rnzXsi1jUHP8KrtYHbfAYQeZnqPl6PmD5hasovZrtmNiSmancB3hT5TzFGbAbcRQTn0VItC48TGVJdb7qFknqOaWNP2Q2ZsAKATEmJztwQG7DkQEt+0RVy00j6/egwLLv8Ss8z0DVyJHu3uBcp5NAElGFWi2wsBSiVgLVPlemFjDkoRNBpGIFpau5ACOHmivBBmKC5I2M4P6BFo3TnLzOiQWmswBghlbA5yU/k9zSuVpgZLDNwFnMYEfNjelyqiqdDQ7AjfaODN0EXC3z+EWC8TNZgzSKnskhCIhmdnbPHKI7m2AdM5pzrrEbMm/6dyy35V9Zq+vy6uMLThTsXvzZ2XC6H0UtFHWW21V/SQ/8PjZIu/kGMc9BrBU7IbCNERA44uagLKdle2vagMEYWBmJusEIKx107nFZj6zzlcBz8JS8qsOa6C/BSASur6BczH/rcgJl6RBwNz+XAA9CsDiIdBeMPyOcfFhl4A+hid5vroXYgZVXS/HhrMI6gmN4hgKbAKggWT58gB7hhsc2svE1LSktsD52RJ8OK3VCZRWKWlSNrtL63laD2JrjkXOz5LasBIA3HecAW3NpRpPA1wb0fceofPg3iGuOOdS1fy7ljUsILe03+8Y7RWju50A5yAyxSKbjSIh30rfiwIBIZqcrbpuxZQjOTP7G6A/91jcE1CULSPdBoQw0rNbAki4KZLhcEDwDVwfQZ6KBCgRdi8usH3B4+pVyvlk81zxCTVnQkz5hjmVx06OU5Ccxov7wOpuFHZ3J/LQat0tCZ7hFknGmbG8F9BeDHCbXp4NLyoFCCkwScHbJAfOSIC1Aps6vo0vwK49ltclWSNIf69BUkBAUQW1+k5UL87PcPXxV3DxFQ0uPyx5j2MjbfU7YWVrvnef8vUOTZqvVJ5RQM5jzdGcmqSS2twISE8Dob0grN9gnPyTN8H3H4AWC4not5LONjhEmZBpzRNWfnqH7zrEzRa8M4mYb2p1oJses1avheQkTcBeWRMM1DoX7CHgNO+R3P6xqfOAfUBV32uGUZvPt2CqWfv3GboojFN9bxwAZfP3WkkDKIFuFXO5nKB5XeM069e2V8s/JH9d/zaxz9Q2c2RQHRGX7pMZtrUCRl0fbZ9N/3Es56/d/yYwvGbx1nYUKA5B5qAvfXXMgTPK7ztxD0r5bsnsJyZTo5hncXS/I4o75ma2QqYdCcR1Tr7bvcsEA3nyfuQApGvr4FNbJ83r+05UAGabbbbZZpttttlmeyp2Ccb/CnePnvMnXvowfv356kbl3d5F/I5Pb+AfY2v4U+jwL+PNR7/wPbTV6gx/9I/+x3j11Y++Z2AvAHzucz+PP//nfz9ifDaB8Nlmm+3Lz55vwBcQ0IU5g2YCnhSHKYU4dqBam3J4Hnop2LygtaykAY5HTq9cVvU2jeb6aM7bc5hVUf1aBwV+gWlArXZAKTBeA7eAOI2afcflyLlYs5eVOapYV2LxKsOAjKOdvAf3AzgEuHYBGgJo08EB4EUjkqO5nvJfc9GDBg+gQWzkoAtA9MJAzEBOywhRnOzNBgmoQXa6az5Np8AEC1Nv3E5gWEt+yrDwGFYO7WWL5d0OFKIATr0wkgsQV3Lquj4KU7JxGaR1Q0RkB25LuywYbNmDVDsjGyfsbx2eyKBtlOt9AsgdgRoHXku+F3/nDnizQdxu94aRowL9CZWzDlqMHZy1s3P0JFgpZQv0Tj0zOicn5mVurTo2db5ofSuGnpWNzvefkkHU4Ib6+JSzNznTJ/MpHmJWWXMe1DbiSG28PD8sObZZAXJW0NOBgoCoOmdGTPDaueuo9FGab8L64jx3hTno0J8xQJKT1jmAg4PrKAOy3AIhMeObjQCVYSnMdqCwZd1AmYm7fMuJLPMJw+8E7IuNK+zFCBAI1KMAtUxCuuyosOqdPK8KWIk0sHWWA7FJQRGJ2R9bAhZmLqS5rg+DShjLbwJeup4Te1Tzzpbzd3cI3S0CrQLIMcLgwYGAQHDb9DxrHnAF8XzK980AESM2hO4OoT+jLCUfkkwzO2A4TXUbZO3hhtGznMNNFIBW30UMyeVpffoOGJYOraOC7XoaB48AoIHhQkRsXM4BnoNH9JzEyOXG4eprbyMsCd0pYfeiBAiEFSMnAooaYJDayoDvCJrXV+argJQ69sMpsGkc/Jbht8Ctzw5Sr4HRn3nERljWvmO4jtFeDDL3F40J7Elj6tLaF8z7K40f6XNRAy/2uJUq1fd/fqea51eBQOaSZuHVlxFePMXDj51g+4KMLRhoLgnNFonNyxJIlIB8MIncdQZ4BY9jkveHnC+gsEiiE4YVMmOYemH2nrzGeOEXtyLL3DTAot1fPy3wloFLaSunoAn0A+Ll1XjNu6nZgLG93wzIWB879LuaBXVraeC6HD0/usKMBcYBSVPKKPrZMj+PMWrNem7X/tF1VX0kx7bZ53AcS01P3cdeO9oD7reZtOxD5QD7ks4ck5qI6S9l5upvmqLAFpcD/ex+bsx4zu9cbadKik/0EU9VeQrsPWQ6LyqJ5oPmyvo5Coap9gl2jSBzDhHJHhShrMMJANWgmEmJZxtUdhOm7JSEcymwnGP3TiEkmXZ/4FkcA+Os12Rg16iX1H/HTEipH/zbZrbZZpvtfW5/cPUV+LXNLfwHV5/Bg3eSVHO22Wab7Rmwf/qFF/Dxk5PRsa9er2+817tqHX7sQ0txCzDwTW90OOuP78s3YPwZ3MN/j8eXqX4v7Hu+51/Dr//1/wxu3375PQV7Z5ttttmeRXv+Ad/sGK6dixZgM07xPScfj8swYKUtK7PwwoGX4SE276EXTQ3kTjFutH5ajnV01xK2U9LP5v75hWcZN1MMGXLpeOU01/NqEDvlmxPmx4Q5AeK4ZyAGYBhAvQfaBnARaFPON+Ysaek6yfUYdxEUXJYIVYlMDIDmT9Q8vgpcWDCVvYAXwhosx+VDaUZsATQCQAmQ7OC7Bn4T4MOQgVxhNZr8q8rgdOqIR5F9dknOVW+jQEs6V/Ksjp3mCuRIXlfksZagBVdkgRVAbhywauFO1jJ2E4DvtXLdqIBeNTtfyoky16aciTc1O8cfR3LwwPN5qLw9CXM1dfwnJ/fBuk5VwXtQ04C9AztXQCrD6iVO88KlsUxrSF5/dC6kc8d1Q1nOLM7Rx/SjMEvjMoGfkRCjEyBzSMglgNiYeX8hbNW4kGeIvTxTKstMUZ6VZiegcFzqs4Mi0azVSSBxBkeh5YwBX9i2WTY/St9IHllhdopauemjiT6wsrmMqv8sqEjAcEIYTgHfyHMWAwEDST17SuuF5ODNYK9KX0e5v0jySrGL+3JM1xz2LCAqA54InKR7w0I+w3Meiwyspv5TwDivaYQREGeBcGk3S37wdmK+6O8OYHKIDWH7gkN/SuhuAf0557migTCkn2PpZwpSN98LWM+J4QxIe2OT6soE1zP8JsJvBrjtgPaBEzDaBA+5XiZDrAKKmEiUJkzdp5jv+r7JOdTtb/mdhPJOnDIFeyMD3oGaBv3LZ9i+ssTFVzp5HtJ7wneS71pv5DvJJR/XBBokFYDODZG9Rn4HYTDPScorz00KDoA8G80lYX03oP3CfWEWNs1YocO+45Ha5fbXWgoRGAbwdleY3De1PMduENhiL7tOVrfOO3tTKWRgDN7aY7acIxJmR+s0KsdPH091FFA3pmCgdMwhAcTKmD/AUNa2T71LbgJMT1gO1nqUptu9HIASlXcEqLd1MzZi89oy7OcpVu9NwN8pML9SHqnz21IdyHhI7tkCq7V6iA1G64fR9XXw2+i6Y3bdPqbes9gUK0l6z0ox17YHQOdyxv2z9/k66erZZptttvfYtoj4Uuxwmxosb5pK4AnYt7e38DG/xg9uvwjE7Qz6zjbbc2CLU4f1LX/jrCPvZyMA597DpX3pN52e4jtu3Xrs8npP+PxtcXAQMz56f4AfKRsBD8Mw+tPuAhH/Oa7w6WdWxnmB8/MX8S3f8t34zu/8H7+n92ZmPHjwJh4+fOtmAa2zzTbbbO+RPd+Ab4zitAFE5rACRBU42AN5geJUT/LJGbA5ACbtyUXu1YVLnfQ6m1uQEitDy1HQjAgYhvEx74ChOs+WqxJtVhrOgL4qzUdJ+nHPkWXZK06c76zSE9kB5seOQ+/kvkkiWgoTZkktOcdabyJh/6YS+fIKWK9BqyXQ9aAQ4Vpf8kQCCXhxGRBqNxG+IywfMLZ3hK2mBTaXIpXqduKcBwO4UBA2AVYxSeTqDQAICxcZZBrWCqABuyVhx4TtiwssHjDOvtCjuegFhNZ540nkO1NdaWD4GAoQ7AWksMEBo88JBxKpaKmU6xIo1UjuTJGJlnI07yVFAcUl76uC9Q7xhVtwbQPXD4ibrQDrdt6pJUnEKUlGaVrlFNX5pswSHWML1ui8snkkK3ZMLjfN5ZFMs3PjjZFxUu49aaYs7kx0obbzQF490jy+U4wu70Ee4H4ox64xWi3hzk5FzjkxFYWVqcELyM8IewJHl/LlOtAQMwsQKPMTSPMhBRJk2V4FRVHmSH/aICwFrOTgMPRAGATwzQAoFWAXxBhOKQO7GeQNwlT0HRLjMwUbRGHrKiDphpST1hVw2HXCyOUFZzDTZbCX8jHtgwI0peu8yKnrs0m2P3TZTMAtk8hYU2S4nnPwjeu5PFd6v/Tsh1bAzu5OhCfG0HnwVQO3daAhSSyTgLmuS/Xg1A8A3E7uEVYJSAUQ1iggaaqf69J8dOkzE1wPDB6gNoIHl4FzfX5Jgz9SGbFJwSKRERYJoDBBKtJXBMcus3IpCruXHAMR4IYQlh6blz26c8KwFga0jL/On1JXBS3ZAS6S9IGSC5epH6K5NsmDhyUjrIDdi8DVVyyx/tICJ29EnP7yBfzDHkigrwK/nN57nFi9CJxkiVPgS9QbyCQgjvIcN348bwCgRwk60veoSkDb8xZt+V2fe0cYPv5hXHx0jcsPCNDLHvAbYNEJY1nX5bCUPm+2IvEcVsKQFyazg98x3EbGMkLkqykUIJ4hZYclI5wFuK1Dc0k4/+WIk89fAW+8BazXwvAFcqqJvEdQJrsyoDXwR1nM2x14uwX3jxlhzQxw2jso8JtB5+pc62WxYF7tfbFrqwmioXYaXM1l6LGDaS8m7pMYrvldULNqLYBo73noHlqWad8o9ysS4J33YvZ9lT57s1+yAVHKWD70XjlUV0cgBOnHOjivrsMxT1jd9xXQPwJWVbJb93W2nCkJbLW6zXpMweYpJretWwa2x+1QaW1Zr8y+IO83zZ42gbd7aSGqPQGbvczU/TT4Mv89UJsGaNhy6+A4G5BpwV69xvaVS/LhZi+fxySEXFeuf7NWp9BIx6hOiTHbbLPN9pTtb+/ewo909/Afnn89fsviznt67zvU4K/c/mb8rd2b+DOXn3pP7z3bbLM9uv3m/9kdfOTb12jXNwi+e5/b2jn8mx/9KF5s2/z9SRkD+NEPr+DM/rJnxv/+lz+LX+l2o/Pu4tndU37DN/wWfP/3/yBOTm6/5/fu+x3+/J//PvzSL/0P4EcIqJ5tttlme7ft+QZ8azOOUQUMrU0Cv/ZaAHtM2mNROkT7DjhXOUiBQpaN1T3sOcCYPakg7hSjsbbaoZOlB8u1R6ONjMNvfPwIo8AcOyTJC80XnByJHCLQdaBdB8JCgK0+lNyOyYhZQNRdRGwlso9JACXXG0YcFCCWHJ7EwqxShh8n0NSOe1jQCGQr7UhlewBOmFn9KeHq1QbtmYffRZEo7aOAv9l5KWPEilqle4/kVhWEYxQJ5z3HOjKTTZx7ab46AFGYNoXJWM0JT+C2AZ2dgoYB3MW9OZMlKa3z2DplzdhlR+ko37MBga3z9boNp5X5HlWoAmmzrGvFdKnAnFFwQX3egfvvmZ3Xh3ItHnleyDsBlRL4rcCUAkZMBQgX9mK6Ls07OzfsPMyS4bkOCoAaR7J+JKS5AZkfhAR4cpKgTb/ryQnAE2Z5KluByJDAK0+ZAayyvprTloKwd9krEI0EdqffuYAvYVlAZ6R5V3JsG4d8vrb8b3t9ismaJYlRnqUsf5z7q4CZ7BgxOgFeE7vXBQGxo+f0nKX+Mm9D9lIZZ+IYtM+1Xxja5xgFreS8rQCoI7he+pUMYzaXZ/+hmgO2/Qb4LwXIzcPSIS4chhMn7GJXxiIuhXUMKu1UNjfpZ5Y1NPcbdKxKvbS+qpzAHghe8hpTdGgv1mguevjLBEJGzrmr81ytLabz6lzxtTypBXjsuzP3gfk/3VuDVKhtgfUK/Qfv4OpDK2zvUG6r6yQ/s+uRAwC4SfMusgQFtWke6eu6l+e5P6XcN5oywOZyDkspCyRAe3NFOH2tg7/YFRlXV7WzBtT2+kPaxV0H7no8ltXr2qE/SqdAxKm18gDYSFPA5ME6xYPl7N27YmQePLeWgK7LeRw7du0UEH4dKFuDvfVxSmkHpt5X19XvWH8a8HavD6eY35P5havrDrFtj9lN2cDGcuBWlZripnaja6YC0A6kiBgdG61VN2Rxh3gzQHaiPJ7am6lNKbE8QefgbLPNNtvj2A4RO47onwJo4IjwIrX4huYU37t8BQCw4Yi/172NblqjbLbZZnuK9uanezQrh4/+2jV8e/357ze70zT45tNTAMDSObzctjhv3gXXPRF6D9g/+gdmfOzWKcLG4WcuL5/8PZ+Qfd3X/Tp85CPfCAD4qq/6Zty584H3XMb5U5/6KfziL/4EXnvtU7i4uPue3nu22Wab7Tp7vgHfyvGbGTDy4/h3IDEFyjnW+S7yiS4Dj6SOGD3flqVsYocCCquzS0GyVJ44qKMwdYah5Ouy8sjO7efiUyaldTBZB8+e45az44cqx451co0cXhMOulrSbuxQt2jFFJuShHFVl+kdmElYlB0QHzyEu3Uu99r1QOvBrU+SxZC8kHGA6wOG9Qq8IAF5I9BcAd1tcapTQGbzau5eZ7qRKDnyhwImDWcKvFgAVYbIbxhhJcy42ADdLWD3ooPrAb/1uPXLDov7g4AazglYpICfd3t/LmrgQZaDjomRmKZA9MXhGVthOeX8q2SAagP66lhwwRsEdF0vQHQOt9kihlAYt5m26MZ5CI3VbCbNsafM2L2Nk52r9bNh57Q6Mg3oy1PzOZ1zEPSduq+eN2Xp+hs5g3UeTzltD1nTgJcLmbOJzUghPX9enOm5hMAp97LIwsq8SyBo5SSnIQpDUsn/LGCsslgVLFawjp2ggxyQAbWcYxYAHANRAE6/Q86D7ZTpiwLyhZVcFxfIYHAG/BJA6AbJTRobkQhmAmgAECWigQngVhTX/U5CCVxgIRC2SMx97XcDQOb1OM2lOjaAsA92299VBjRKHV3Kwaqy77F3WcrZBYB6wO0ALAjB81iGOoF7cSn91Tyg3Ecq09ufceobljzhlPo6dQUvWADfSGi2Dn4jOXRdL2xqBdwFPE7saQXDmUU2PgeJsGlnmRfWhjPJPd6dpbzMIdULwHCSmNlpTBW4zwBzEPA2tpKz2Q0poMYlwFIf4Tb1b0+I4AxsdrcZw5qA2GJ1z+PslwpCrhL9eW6SSNZLgRNArZ4ztUboOpMUFqi373HzvgVE7ngIQAzAC7cxvHoLr3/HKeJS2tZeCHCred/JzKvMfg5J0nlBI+C7uQKGE2D7EsFv5ZzFQ2ECD0sB9sOSENYskupRlChWbzNWn3hN1oj1WnJ/W0C3XstI3ilj5iwDISJeXBZFgse1ek2vvuf1afQ5TPymC0nF3J0CM2uWKnKRxabYrEBhZVJiRVvFBsscze+IMdi1xwa2YKPmlVWrgcj8jphoa13vRwA98/vwAOieZaWPSWVbNrWjfLxca4KzQshM5dE+71HZ1cC4jyyDWsciTvSRnqPX1+VMVcEomRyVLzcAds7RawPYUhlZdYaN8k0dyFaBvByiPP5Wfv0YeGrBVruvULPrW9/vlTfKy2skqbXOozzAep6ts/n7IKdacQ4znjHbbLPNJvLO397eAgC8Fnb40f4+On6He6rZZnsSVvtUvsztH///HuKXf/wKH/qmFXz75dcvH10u8b/80IfecwATABoifN+rr+LnLy/xs5eXz+wW8rf9tn8F/+K/+Cefah3+4T/8z/DX/tqfe6p1mG222WY7ZM834GsYuCU3psmVyXEC9CXA+Wm2b4wiHWflbD3tb8AsoDu63niPrROmBsSyc7KShVOA+Cbt1vPtPSwLQb8n59bR4qxT0J6ruXy1D4zTfcQEsaDVyJE40f8hALsI3i4EmPYCBNIugBqXpT4V/PVbkcCNrYARwwDEhgSgWhXQiH2q6iWyY2s4FQCLibKEc3OV6uEhuYcTE1BzlVKSU44eIqWaGI9xATz4Kg/XefjtAqv7Ec1VxOpLG1AfRaq3L2Ob87cmwCOz7oxsL5DABU75IfeALso5gfMYWwDIO8lBmoAtRMDdvgW3aBHeensfrJ/K43cg52BmqFpJ8RqEtQySY/NWAdhc8Qkn6CGz59RMlpp9Ux1XScjrjOPN/8DKeTcT8MTWYe2Kw19ZgkAaa4/EACRk9MipVDGkT5IMLg2cwb7oSdRujTx9s2O4TgBMnATAMfiqkedgyUAnwFzzwEleWpdAvcS+xQ6FKQ+AlhKU4HoDJlqWbGLNK3PYDYSwSEzaFDyR7+EZvlcWrbSFW8qBDwJWl/MVbI3mDzkFOymwyD/nZ4oRQZkRLLlgBVB2A6PZAawqt5QKimkwmArQmgBdCkB7QWmNAPwuPZsqXx2ogMzKBE7rhN9IvuSwAmIjbUR6hsOS8z3dDvAptbYoFDBiY+WyGYsLFhl382xnENIRuKEUBGMY4o7yWrk79whLARoznprAe/YszOaYANwUUZL7sJH/fTfuHyTwPIOdTueCZaynLm4ZuxfkfbN+cwEaEohkwF5pE6f3MySwoRVJdMvapZiCo7zLYLTKjSvgmcHeOihp18k6EyPwygsYXjjBw4+uMKwJfsdorxKQu+McFBBbCSaKnnKe4sUFw3ciC67PSFhI3zZbyflMXIILwsLk7SYpR4F2t3U4fY1x9oUBvNul9cO8p5nLd6DsOULc3x/0Q5JyHpBl+5+w2YAgBXZHgCKwHzik75UpoFaPczTvHT/NiK2/14zVap/BNnhAf6tZjZqftwaIp+6vx2uw91j+2wxsG9DTnluD38YOvptSe/b2baPcWqleKsM8VafRZw9SdD0EsNZrUgr7GJg5AfpeB3abPpbgPx6zdI/cLoO2MRYg141/26/jOIUDgwU4Nvl7KSbFGZWN1/38nlqO219n0j32JJt1f9y2JfDAqgVN7TEsMGyCNkf3AQpoa/+f2v8YsLfun6fhMJxtttlme5btBdfgL55/HD3LjuL/svkcfna4eNrVmu3LzTaXwI//EPChrwY+9vGnXZvZZsv24eUSf+IjH8Hfv3sXP3nx7KyNH/3oN+IP/aE/h6/+6m952lWZbbbZZnum7bkGfEfMsGSZVVQz94DicCFlQlXOnQk20SSDUZ1JlmoVq2vtMZWsdJXzzzqtp8BeW/ca1KrPP8Q4IMlHNsXUfBxJvEnJvymbYGhmB/IwCAN1twO1jbA/m8T+o8KyFhCKQRwTsEQAOww7AE7AFslni8Jiiwm05QKqWsag7zjnzTQ8zASkQBiL2kwvoA0nsKs/AWgN0JmAG21LaB80wqjjxMQMCRDRezMnBuREV/KR7/WwJEDXnpPv41Nuz4bBq4XUxXsB10dzGnvO+z27KUPp0Hw7Fp1aP4tTZVwnb6gO0XcrL92x54EItJBABQkcKU7zGqzfvxYj6VrSaygBnInVCWDM7KQE+uU1BfBdhBscKJgZHPXc9Jwzcp5dNFzyRjcyx0mZnOl+ri+AprIeNb1qZr46+S2zU1EAWwm6SGBAAgwFQCztKH1cfdY+qJ8HXcJd9VnvSch5bJXdW6SjJ4YgGkDUM/yQZKoTw9Z1qe6OsjCDVYHQPL9uIPhO+peTBFJ0uo5LeQCAXuScXV+A1ZwXVzGyAfC7iJzI2Dw7WULaAOPW2EleaFUkyHnLWUDl2LIQHQfkXLkiN14GV2WaS1BJaasLcpjT2gNv6sKmj0kCCYYVIbQOPka4EPeWMO0fxAL6TipVjICV8p7P70wN6BhJnRewhFZL9HfW2Ly6xOZlYcy3l5Knt9lxeqdwbgM5Ega6jkkQMHhYJiDXzLcicV7uHxIrHkCWu44LAdp9R1jdjVjc7Y6vLbru2kCyei0dBqDrb/b+PWaH1ucJ5qpl815r9bvjuutqMHUqpcQhEPlRrM5jq5+Baj/j98+7xnKAG8w9jlld9jF57Jv2+8SebHJfZ8/TvLq2Hw7JMtd1rkHfm8QeHALrMQYi95RoDPhNQAFrH3Xfmusep/cdU8oe6Viu36FrramSyU3r84T2MpN7+Tl372yzzfaM2puxxxfDDq+6BdxTDEZZkcd3L14EIO+fv9O9hbtxnDLjjdjNks+zvbsWBuD1zwHnd552Ta63GIDtFdB3158722MZQeScb78b8s2PaOdNg193fo6fewZknU9P7+D09DYA4GMf+2b8pt/0e+Gcv+aqd8/6foe3334Nl5f3nlodZpttttmus6f/JnkHxikXHiMIgOLFgUyhMEtHOSM1HyaXKPgRMGcAXmXiUYhjJ7Rlioyk10zFVA5ayx5MtH+uPI+vZxZWgEvoinXW2DraY7Uc3YQU3J4RSf04Am2b/NcTjj4rxajAuCNxOgPJYZhk8SzxpJacUyc8FNsJcunFBXDp4JlBq1XVJuljChGuDwARYuPACwe/8ohNgz4mgGHNGFYCvjgmhCXQXALtFSAyswTfcQaVXIfMVJN7FgAj+gIa+54Ro6JQJJK4PSMuCMMJsHmZsHmFcPmhE/gNsHjIWL81wO9iAvPGzBViwHXCBEZi/ypDNHoanVc+SzlokGVLRWpcALy48OCGEthGQCTQohVG853b4KsN4tWVGdOAzM62puNs2FEaIMBZStPMqfqZ0c/2N8M+2XOAGklJAEWqkXnM0KplCkf5sW/okG8bYfyM2HLi6OYQIAwpGstmHiqraeFefAF8sgIvmsLwtc+OLg0tgVuXwVpOTEYFdXXcaEhsTS3CAaEhuC4BjEnml126JjBWb3TYvODhOsJw5YGGgWUUEC8QXCeMdm4SAEXyTGTpcyQAEmmudxLQEFsBfvVZURZqzutqgVcC0AChSTliPRBXnAHD5dvCqgSQ5H9tTnXTXw0XMDv1n36LLWVAUmWtpc8555IFgEhOGLKBMawSS7oG6VKdfZ/Yrp7BDRAMkJ1lrpXtr6C1slvT0iSKA4ktnb7TQAgrRlzIWNDGY/GWQ3MlZXGUc4NlUwdh9y7v9bIOLNwYqCYkKfA0r4xkPkXGcOrRnbtcX/ayDrmB8fCrgHAawUvR8eYItPddGb/E2va7ND5JxcAOTwZAYwJ/W+kvv03v1lMu7U995VXtYIhA61O/U17L2Gv7y/PImdlu3pm1A7BSGBi9l0MU1uKLtzHcWePe160RljJ/mk2ZK25g+C7m9bI/oZy/N9ySNrRXwtgNC0qscYZ7UwKFKAL9idSrvRD2/bAGunN5hppLoD8Xdi9SPy3vEs4+dQH/xj1gtZJ2RZYgMOfAy7a0VfPyVmsqpfbFyyvEy6vjwPF1Vu9B9JgyYQ3IeCgoqJZ7zu8PywxNUsO5jOuAW12TIxdViQkwdrSOWxnnYMo5dB/97ZA0sGX91mxaa4bROk5RYMBTa+k9U5uVWJ7MiXuo/uZ+NRgvbN+J8oDUJ9VvNQAeJu4zlcN36vfIhcGrbXA0OlanE7H9V4BVI7Ft7rUn6Zzup+VY6WYyTGBrsl81+1nnJDhuGMr64j0m06wA+yCq3QNNpZKwZdj9UxXMOQJsQ5A9kvcjAFzrP9pfE8n3tpF1bupvgBn4nW222Z4x+7MXn8JX+zX+6p1vxSmensO+tj9z9rUYzPocwfjXH/w8/tHw4CnWarbZniF7eB/4kf9iBnzfRVs6h3/jIx/BVyyXT7sqz5T9nt/zR/H7ft+/AQDwvgHdMDj33bLPfvbn8Kf/9O/G1dX8fphtttmeXXuuAV8ABqCVz1SBsSJLWsDfPSnnKTavsjXVpqL/H9diVa61R3HQ1PJyWp5lCE3l+gWK4495UvZtL6/clERgdIATueU9yUIF6KaAZ7IyeBG8Eb1Tapuc17DIH7sMdLohIgr2ifZK/jjszxQ4TYBuIzkXJVcnZ7lkSmBFbBR4EDCAHLIcrebOlTyXSJLMCeRJjGE3AACjAWVGnUrddueCgPmeBWBmuXe/FhDHJdaY6xnNZYAbOOdslRtPDPGI7UcgDzC7DIgDEAAogSlElP+n1UqAkM1mcg5M5vOt8uvt5cCTL6mAI89DDf7WlnLc7TFS1HlZl/UYDksrBbn/Y3HMj/rgGnYvHMkc9Q7s3B5QCaD0XQLrMthrQV1bFWXEEhKdsgCPAAq70dYzMpoto33oENYEbhhuGRB3HtSJzLcAo1qGyJsr61fuqzeYaCuj5HzVQIjE/lUgVXP8CuMzMbacOcb6/CEHUSiaq3LtABAzIISsJpyrYbvXmWPp36jqqZv8jnOfuc6BhhJsIO+CVAcvF1FdUAK6YeStbW7X0QzJ5ZT1AwTQxsNfOjRXlNYMU3+kdST1rwLV3Lgk9UypPB79n5vpy7ssNkkSnGV9wY5FTrglhJMIXkYJRGIZIz3PdZKHNibWMewYpf85gf4+zRc9V4IQUmUM+M8eEhDQRVCIOVBBB8o+K5QDV9L7KSkk5HdG24jcs7Y5RhDSulcxgLltgLMF4qpB99Ia/anPOaxdL9LMSMul7xl+K3nac67eyJLXOVKWe44Nsly2zhttJ0Xpi7CgMv4aHJFAc2HRk+TufZPhrnbgvhc556TIIAWmih36e9WutbtO8n2+G1LOU4zTlPP98PlH6pHKGK+tFUu0zvOavu/JE08pilRr4VHJ5QN1u9am7lvfp2bEWunqKZD0poxdPV+tznu7B/JWdbB2U7byTZVbrE20ZwToqqRyzdqduv0NGF5TTODJPcoj7hcykGzz39oyvD8cJCCVKHuXOohT7VC6lkOs4RjBhv3Lh1jJ+fwjey7NRfyk/oaZbbbZZnuHdoWIC04pp65f/t8TIyIBn0dLK+N7li/h65qTo9dGZvyX3Vu4N+cCnu39bsxAv5uDyd4l+/h6ja9Zr/FS22J1Q3LD+9WIHH7zb/5e3LnzKgDgG7/xn8LZ2QtPuVbFYgy4vLyLYeivP3m22Wab7SnZ8w34qvM3AbbU9QIYeidgWvqNRMey5FWN1fVAccios0edeXrcOl/3GA41cIvkHb7hXzG2DiOm70TZusFSR5E6olJ+s6l77oG66T7Tsn8T4LY9puX7hAggZGfhiK1hAb3kCNN8bVZuOF5dgUKAaxqpFyDyzo1DbBz8LuTrXcdAH7F0BNc36E/T2IIwnAnYUdAdQnPFSXpTHPNxiZxDNywSSMIlT6M3IExYmDybvZ4L+AQKAPJbfyY5QPs1MJwSKBDaS04MPmDzCmXmpAsADcD55wntZUC7HQQzaVwGRTL4DIzAH3Yk8BQlcGSQuTtiVzcO5MVxzuslaBhATQse+iOgb9z7bFlAIwaNXmjnXF3uhKzgyFmZwN7Rd8uSqcuwf1DccOM7ytfoKyezI3AvYDd5X5zc1zhDyXsBbFIOQHgFaimz0YmBsPRyTwNqsi9rQR5bIAOEOs4uJF5TwskYgMp4K4BMkHu1VxHLtx12LwrjdbEcsO08qEu5SBlwPl+I7jbD9YT2QQKmkgw66r/XGJmx6SKg+awBfTakSNcnyWAHIOWIjQvO4JeyQkUpAClwI4Fk6XnTgIocZKNNnxgKNix46S/OmFPObxyA9mLI5/sd4LqUuVLBysb0fWpwkUIGQgvEliWfb76frB/5WbPOoCSXTUM52DxwaC4J7QUyQB1b5PFn7d+0Rkg5ifGvfcPCMK1RcJsLXHPOaj5a3wHdGaE/J/BpgFsE8OBAsQDPrgfahwJ6WvlmzU1c6iN19hvp3+6OTmbKbXEDSf7iJGEcPcFvenDrERuX22rzM1OaCzTEFODAcF2qXIwpr69DXDXyXEUGgiCtpGxeNefAqyX6l0+wfbnF5iUBzSkw/C4BvF0aAxCaTURzOWA4Wcg+IMg5lPJNux5oLyOGtbSxX1NWe9Bx1LzWYY387OTAiEbyN3PLoJ6wvA+c/0oPutoKg9A5oPHgxoOGUPYaWcvd7DGqPQdfbaSMd2p2rdU1acSirM+vAMP0eS9YqAZDc+53mQT5/RJd2T/VZVgQ2IKbNVCsVufkrdm9UwFNFtg8lns4nTvJwp0CUGtAV/utDpyr+5dUAYPH1x0zR/kdPGJQ1+3NDODUBsuiqvtA+/4QuG4Bzzhxr/yb7I9zbl7zHdgHdqdSjdR9OVIXyftfLv/rPl3Ztarc4V1mhLOTcvbuZXPxjiuWf8t72XovYhVI7O+6R5jKsVsHY6Z+ZXvcKv7UddXnt2IFaz9O1jVfOztnZ5tttmfLGAKWAvon1TOC/iZzRPifr7/y2vN2HPEz9y5wP6S/Qd7tis32/jTrl3zGnoWnaYyxz/JZWydqeycBdr/x1i387pdeeoK1eX7N+wb/0r/0p/D1X/8bnnZVRibje8CPPttss832jNnzDfiqVcAviMCNOLcs45cGw4TV/1UqzRn5ZqA4tCpG0cgpO5KJNcdryef6d7uZmwK6LKPAgmpE+9/t/zWwNsF+4BjlO9G4/ub3PcfmSN6wvndxmlKF1GRJYANeE3PGMDgyEAO46xDfvgfX9aDVEuTuAEsv0pGUAGrTnubBDv6yh+uX6M89ducOV1+RJFWXDGJCYGDxQJzxYZXGdwCytLOyfpOMMycwKDggMGXw2O8EDCCWnI6aK5SSrLLvOckyi+wnAAxrypKibGSiowfQAA8/4uF3Dqu3PRYPAtqLAbF1OBTlbMHDjIrB/J+OCWDsJGcrGuBkDQ8gvHUXrNI7zOLVTzKekzl9J5g7pAyWPcY2jZ2dUyBwjGU+12yTOofdFENmKvihZuXYMoHCtE3y5ZnRrOrRyRF+U3MnJ6CTNeKZyDnHZZPrx54A52U4lBUYWCSYyQC2PoHDCuICGSAFCjhIGvGeQF4ZMwEEiWWdWr7VwXWM3Usttq2HeyGCnMgrNxci8ytyzlJHv5P5z408E00PkUJPQB9QQD7NZc0JFFbJ57BMU4NQmLIEcJJ15laOxTQXAUjgRksIizJvslR5Xgg4MUJRchvn/qiY0Xp/T1IXnS6JQUyR4boItxtw8rrI5e4+GtC3DtF7+C3gAo2eIQfO+X2VkRybNBYq6ZzGSeSpS/2IpZ/CUgbUbQl+I2X1p9rggukxALRS3+XDCL+VuesGRiTK8vKaY7Y2fYeFlReQWNezKGDl5qUG3W1pROw8aONBfWqbgrmLtBYR0GxSmzQPrbYzzYXuNkBs8kuneUUxyUF7Acn9VuSR7fstJklzHR9hfTOoj3BdAIYo0quNACTsJaDCBjeI2kZI+dEL4BHunCGetLj4yCpJMEOk8Qk5IECBcKR1OraE3YttlnJev9ljOPEYVoTFhdxrWFOei+2VXNOdUQ7YcQOj2SQwPvV9bMr6rHNk+Tbh5PWA9S++CcQIaltZG/NzkcC36t0mfcWFnT8EYLtDvLral7R9FKvf1+adbtUeVE6ZzR7gEFN3LP9cA0xc9lDkQL76rSprVL4NCJpixk59r3PRpnL2WKW1rLGRZx4ByDVLeQLMzYCibYfdu5k+zpK8pr25r+t0A1NtBMbS0FO5j2smcN3vU9fruGeAthqPHDjl98tXq8fISjLb79V1NQB71HFipJJJ1Taq33M7qN5j0Oi79jsZgHjSeah7lalAiyn1mnr/XR+zoG69p9E5Y0HbKTP35WEwgRVVYN2UzY6p2Wab7Rmy12OHf/3hz8OL1g6+//Sr8aub02uvexatBeHPnn0tLlPU3F/bfhF/q3vrKddqtufOvvAZ4OFd4Jt/E3Drhaddm2fCNvci/u5/8CbIE4iAX/8HbuOVr322pY4/86Mb/Px/9RB3P3tz2euPLJf4Vz7wAXxolnEGAHz3d//L+J7v+dfw4Q9//dOuyp7FGPADP/An8clP/ihCmFUdZptttmfb3h+Ar5qRA95jqmbgxADDQPmuNhVZV59zw7rc2MHyKOdau2m9bPmaPxAYO+pqB+N1LJPr6qtlTzih1ClHLoJZ6sZ9B94k9tCuA9yisEsN3glmUB9AfcDiPoFCC4oN+nNJVhpbRvQMalXmuwABQAKGDACTi6XERIsFkHJDYu8p+OIqDIaBZsvZye87AavCUhiescUYxCUBSIa1gAQ0OPie0WxN/eputeCXdF4CA3k89PrZC2LDDkDjQUvpR55SG6lYPpMyz7VNSS4/immlD0kZqtU59K6Z5wcdpAeAjVHbb8J8aRtguRCwt/VpTpa1Rh3cmq/0sWxvTiYAC0WKXIFUvxMQzG9auB0hxkQNzwEGlEHZLFWe2Ik0ILMSLfCpv7NiIk35zYKBtYlkNQDiwqSKAlyJzHOVz9rk11UwvLTZHFOwd+JZzeeaOuRnJzJoO2BxEdFdegxNxNBGsJdgEGVN5/IymokMoOa2GgIm7PEEDDMTmBixZbhB212A4LrOKonMBPgtj3LZKrA/NX+0vjpGIv9sftNlfJFyyELqTp0BkRXwbSmD2K4X+W8F+sGmDyDAL6e5oW1W6fF8rmdQEBn90Tg5W0dl66b/o4C9+g4TxvIEczDq/bisPUQItxbobrXYvmBzQ2sdOed9psQwB8l7gJ0FhCPYC3DebkSGeliWstzAKejBAY5zHmY3SIBAbAA4CRgQtrVMSIoSbLS8H8APHooygAF7tQ15zKEgbz3RGRgCeBieDLv3utys111XrZM2l++k2d8eVdL4OrN1OZST/knYdWU/iXvdhNWblShMYNVeepJYAG+1GrBWQL1m0NrzD43TdWNo2zHVploC+4ZWs4CvjaifSEFyTE4asby35HvEHqP4mB3av99kH6ABH9V+aIoJvRccl+pHPgWbaRnVOcIgn2222WZ7tmyLiP+uvw9Atte/MFxikXb1d1yLF137FGv3aOaI8O3trfz9Hw+X+PnhEl+IO/TzCjzbTW1zAWwvRTJ5NgBA6Bmv/Vzpj6/5LSdYnXucveyv91k9Jbt4c8AXfubRxvDUe3zz6SncM8Ze3sWIt/sel+8k6PiG9vLLH8ZyKfL5X/d134Fv//bf+a7f83GMmfHJT/4YPvGJH3vaVZltttlmu9aee8CXQhRHMVWgwpCk0jRfHiV4RkFSI9lWS+OWQsxLN8QiHadyjMo0ULZsDTCbe2dGcA026zUWvD3EbMygrbmXZQh4v8d4rB1HtGhHbAgFf7nv0+8LYflaNsgRR5n8btmdiSGszFHraEt9zswJzE1Ao8o7b7dA18M7gjs7BXAKXrYCBsAlQILB3oOY4S46LK86LN90aC5P0N1ucP9rHPpTRndLQAi/A5pLlnyXLbC4z1mKubkCaGABaBuguyVsRzcQmkupc1gmEC8CoU05oAkABEhptjKGKscsIArgfWJ4AplBpzKurgNAwOZVAnuPsHBYvt0LYJIAaSAB1SggdZGuBLhxheCb8vhK3RITFELT4xiFNc0M3h3YfHIU0q+yRQzLair/HjUJBQqhYt248TzO5VfA/5TkoEoUprkwYvAaFstoLh4CjEd5slMQgWGgCVBRgRj1Mzaqmwet1+CTFcKqyedaFlMGEJW9asE+ZaoHHp0HSjlYFUDLFyCDPzaXODcO0THisoHrAvzlDqu3TxBbh82rrTB8z3uE7QKuS8AuF4ASSIx2BXXTb2GZQMoA+MRE11ykIGQ5YOpT0ymBW4nlDhKGLxYR2HlQABYPGe3DgJjWQM0FDAARBXhTprzrOclME1wnwQyhRQ6myP2szwKr1C6VXNqeEJYelEDU1dsdhtUSbiXzfrv1CF0DR5xZviL3nkZyQYgLFnZrn57jHghegE/06dG0AKgBj9kJspjz+gYDXptHC6m+7eUAGjRQAPKOipzlml3PGViVjuMk7+4SE1VYp81WggG2dzy2LzPCS70UODi4HeUctc1WxmA4AUKS32426fOa4LfyHuzOhdGqzG4F4VVm3BmmMKegFt8J41fZ2tyUcc+gq34PErQja5UHL5o0tuWJcsrqHWIKtHFwIQoztm3w9q9eYfsi5fnpugSgJ2nmZsvwveRMZ0fozl1WZmgvZX5sXl6gP3GILbC8x4hLoD+R81xguB2AHWP5IJb6R2Qp7bBCzpU9rIHhVJ4Df0V45ac3aL/4EBgGeV8ZQCfnjU/56XOgmjL38oRi8GaT89y/Y+MCsKvVzhINipl0okwAxiMG6SGzEr/AmDWamY0K9vvChrXM15pha+qaWbt6ngbxKFO6ln62wT4KflbSwzwVCFQHSA3DPhieg1nc6H65LRYIzWCsZYEagNKyh7U+NwGGq3N1n8eZREqjfhkBoRaUNc4dTYMwlZs4S1Lb30ZpG0z5uq90NN471OfV89Iq55jfJ+Wek5GmOQFkf2FYwlkWOcaisJHuoYGGllWcy9T5MQzje08pndRAsHWWGUZvVgpJTGObu/eotKPWxe6vbB9YENk53OxhnW222WZ7740B/FsXv5j/dPojJx/GHzv56NOs0juyf3X9Ify+1av4A/d+Gp+JT2gPN9tss+FH/m93cecrG/zz/84H0K6eLXD0/Wif2W7xFz77WXTvcs5mIoc/9sd+AN/0Td8JAGiaxbt6v9lmm222Lxd7vgFf5lF+zJElR0pmzii4ah2eNYv3EFgF7LMG7HtPgV9lItUOrCkfnQV767pMycUB+zJxU3m6VHrXls1cwF/z28jhVgNeNiec3qZmaGTHoN7nBpuBmrmp90KqVwzi4CaCcw7ROXDtqHIARwI1LjvZFnd38LuI2Cxw9YrD7iUWsNYD4OJsDksF0lKVHcHvGDwYcJUTC47Esd8wZxAA0DKRATNl/sUE8BIzaJBykeShR6rYvlw3rAm7ACzfRpYfZxKGcMlbqmhdcmAzZRCF7DxKjEjKzEgSOezlEi4yggV8jzoSXRlrrZN11lv50SnmzE0ZrrYOKkloAzHUJuZ5LcV4lMGjbbLSzsfqYy9rGgmCWC8FmJoChhXntkBtLLLFOUgggwkQdrAWlZtKYylfEkBJx1nOI3ArUtw0OCwfRAwrj6vLBrwK8MuA2Eqwg85xDWZhJwDdHknbmzoQSn5fV34HCtDHBKBBYpqmNSRSBgS1nNH/2j/aJiDLJ+c+oPLMjcbAgtbX/G3HHtI/rQd1Ee0m4mJoQMSgVZAcsYGAPvWvtpsVnExYiT5ySX7Zb5Gl37NKgAGj3VDkle1vZZ1J94AJ+tDO8vL+sH0zAnptm3O9KDNWowfCgrB9mRDWEa6JiJsG1FMZM8dZ6YCCjhcLoGvWM9sPFCTXeWaFQ44VaeuibiCBMhKMI4FRpd4qz8xIMs0A4GSMBNyu3jO1RWQ2MK8X6F4+ybnTmysBmmWtNX3vJQBA66tBC3kvkNZI38vaPpy6vH7bflYJ/9ika0n6kZvSX8M6yZ03gOsI7SWhfeNScvdqbnrvJQBsar1NAWdMXN79IYCGgLjrwN2UPMMjmlU2McCcXQ8Pro1TQOMx4HGCCTq5Ntf5edM75+g6bvL87uFXU+zTKVbpIVUHI6Wdz5u67pg6hD1nKidu3V5gXF4CRMt6fIOgpkP1S3UYtekYG6KSZbb3JjcxByqp5HxPu3/Yu+c+6DiSXq5y847e6xVbecTIrepxNL/blNxy1aa6nEngV68/FoRmQd9DTGAikR+36U8U9NV2TEi/H1VIMb/POcZmm22258F2ZhP4j/r7+E82vwIAeIla/PPLV+CfMebbMVuQwyn8M8fWm222591Czxj0b77Z3nWLzNjG+J5092Kxxnp9/h7c6fHtE5/4Mfzsz/4w3n77taddldlmm222G9lzDfiSdWJaq50z2Yk0ETWvTpjaKVKDwTUg66nkwM11qM7LyIphAahZ0POY4+ZY/Zomy8FlQDeEUR5eC9SxEx/8HtvEUwHErNMsAXCcrp+sl7Wj8o4xXzNiXqi0c3RQCkq8ugL1A1yIoNUCpHKfQLmnA9h5yQMZAvzdS/i7QHtvBf+rzsGNx/YVzvl7BZAQdhuFlH/SAfDCckPK+RiTFHRskXOaukHGlga5b0zO/gxEkYI1qUkJJCiMZAFyok9AhGEuhrUBwIYUnJDAEivxqezQ2FAGGlyMUHlaBZvIKerGMq5tA1qvpO8fPpx2ONp+tWZZ3nZ8JyQDzZd95u9UXt+pe4eQ81TS1O8KDCvbh6MwsQwza4/BZT6r/OieDOmRulHTgE7W4PUCcd2Ozs/97ig9V5wllyX/aFqjAqBy3hn0dWV8yzgzEAuLfMSC1fzTDghLL+PeByzvDmBHuLjvMTiGW/cIDSM2EnSgEsMAAJfYnKygdOoy9cErAEow4KUAXCV3tRyPy3ROK3UWgED+6bXCbFZAOM3tBChnyecE0uX8qwRwK3PYJSniWn5d+758KR+Fye/ASw+3HdBctdhtW/gmol0N6NsWrqciX92kcYoCDgq70dRrIeuD6wTU036LDdJzna4fICC4gpxeAFHXJ+DdAOC+S8oAaUyUAZ7niILKGQwXoJEAyeG7cBiWhtncEPpTwuYDjHga4D2D+sTu7UXmnhNLWcfRDbLuKKCrfZrnSkwMY0qM5aHUKQO+iwT4E+f1FU3J22uUskvOZugYe8SFFwDePN+kz7bWw5OwgYO858LZEhcfWqA/A+KC0bwlzORmyxhWqU8aIKaAB80d7HpOY2YkoFnGwfWMzcs+Pwc5ECEB9BQYvHCIDbKUc0y5sEGM4YQy+N1cEdoHAF57Q55dzd3rnYDcZk1nR4XBb9cg70D9IHLOm82TkXNONsrRm5my+/uPvdzuNtctsAdWckzvdcv4nAL/rrPI43vZ78CIKfxIMr/22hpoNu2Qtdr8Vue2JydMzBswoPN5dXlTfZfyBmtueVJg1J5/CGCuv+dyElCrbZqq85Qs9ATjeAqozWDsVBmAlGPfzfaUmlUMSOoJV76P0o9Y0zKdjEUdnDYOShz3z0ipJP1OMTGwHRWVE3vthBrJKPDL/u73+2l0nZGxt8cnZZcriWfWuni/16dj0H36WTgKgs8222yzPUP2I/19/EiSe/4mf4rftXwJxO65A1A19nHGpmZ7JKuC+Wd7PoyZJ122s71/7Kd+6u/gr/yVf+tpV2O22Wab7cb2XAO+rBLGtbMjyUpm53UGCcfAq4IpI6uBXr1OPzOP5ZsjAMfj34Ek5zzBANDyF20pxzqPMguHijMpRpHmda44m3RHYaP+bVkusTvzfRPYxTxy4pE5XxJ3jvuStczGatRWUovqdPTyG4e4z4yoc4tZdkRM0pCaEzAG8NAjPnwIB8CfrBFefWGfKc2cgV8KQl2kTYfzX3yIk9cWePsb1tjdIWxfZtBSHPTNFclwuQI6WeBEgRy/TcyuATm/L68ABXpVbnVYO/gdo72KIg/alNy9TECTlJxiI2y62ArIkpugQ+FU1lOAX3KcckLKP26ojAWrtGsCh5NUKYVonJ4AwwGegUUroMfZGXi7A/fduA/roAkrI3nM1OGKBCQYNspIPvG6na+VGG2a8TW1M3Ukw1jkOJkNOD0CJgrrKTPZHiEPCZ2eAC/cFmlxC8Brk0iYlkQJKEwWvcu5WBVkYo8MCLMBWXOZmYmbANkAuCEWT0ECBaMnuIYQFw2ayx6LhtA+XCAuPPpFC7SMSBG+80BAyq8KYADaQdiJcQmRrIV8pr4ArJndmp5JzV2dmbeUgGNA8gcvGdxylnu2fSSsT84/6LEsY6sgrwU6tX+ZMxs1LFIRyr5lkVjXMVBjTs/YukGzC/C7gP7eEsPpgHY5gBeMEBjNw3RvO8U59TkkQERlqEOStx7W+uyXBvodZXB4WLNMyTaB3k7HMIHFToDXZgMsHkYBEn0CqFNfFJAX4IUB5inNo9ZlcLzZJXbqkhCXwHB7ABwjbBvQQGguHc5+mbF9iRDWyGxlSrLHPJR56HqRuecU0MIroGsIzSYB3juRMA7LMkfCStZA16V850HBDzdSKFDZ6klLjPYM9Ko1Tt55wYyvc9i9uMCDryHEhuE6fY8nuf2gYLYEKQxrygoPOm+VRU2BsbiSvL1hSVhcREQv678Lpc+jF1UIigzfCZPa9UB7ydi84jCsS/BQWDFOPg2cfSGkNbQxcvQyNyhU4FEdfKbv9q4HX1490lqV7YhziFMQD7ki8Tv63eZ21fXOyhbX4HCSRNb3tzSJx9cB+4zPGti1pveI++VYgHH07B4NNkvnI9XBUQm4i+adkW9ixshKNOePBsS1fVPlFR4xkGvJZ2MWZJTgNxawuM7Ta9jNk2ZAzz2gmWO+Nx9qq77zDag/Ka+tl6b+zBLIAJhNHfxhhukIeLXnGdC2Vu2wdWGHovChoPAUOHxMgm6CGTwJ3qY9x945uoe1IG/e//t9Rq59lu151moAWfdnbVMmvDItJnL+cgVSlz4LskeabbbZZnvO7NNhgz98/2fx+1cfxO9bfeBpV+fGtoTDXzj7OH58eIB/7/LTT7s6sz0vxgz89H8L3HkZ+LZ/CnM6hufHLt8K+G/+47fx4ItPQJlpttlmm2222Z6APdeAL4CjUXDCoLEOrTG75h3ft5Z3dSQ5B9Vxq/6YwTCBbV0OSbxN3QvYZwJPObMss9Ker8CcdbRZoE2PGyfsnqNuQqpxyibLPWZabmb7Sjt4GBCvruBCgLt9JnlrvR879jKAlvLWhgF0uUVztcPJKwtQ9OjPhYGl8qWc2H3C0CQBYiw2ruw6Tkw4BUGUmWj2cQoW21yetQSrMMyS3LJjUCQDOGs5CVhL8qeISIAQxvPGOryTBC45iSicnNE6z7yX/M19D673oSpxOiXpOcHS2ssNncCMPbnB7FSP0/KH1f0PWZ6vU85fywh6wkZNA2pbxPViXzp+j/UP1CHcGdxVoIkMyEjjc+SLKetAmflUJ4Ca2wb4XZQcqh0h9g5IrFUGBICEgGNZsphRGKXpX447SKBvFivgBAo6UxVTfwqUUFAGJXYvqAC2o/7UOpn26fcsf0wV6IsELOQborDaJwB4ZRbH1kk9A8NfeIQ2wq0ZaGIaS5R/qQBiGldZAWgyfWCfWUp1ZlN/V/oWpo8tC991Jfc3UNi9uS1a/sTf+GWdSPULEhgSFgAtIzgQ0FPOZes7TixfOxBp7bHtZCAkTMENCeReMNwDgtshBUZRWTcdwD6xyDUfMlf34FL+qC8cjed9NYblgHkAHIHbBsPaYTgRRvFI9jpdrwxmIOVt9yVPtFr0AupbVrnv2TCCta+RgzUKE3c810YS2WAsHjAWd1NADRkmIFCeh+vehyGC+x7cdcfPO2aHZIsBCAP0BgE9j3rLWn73XVqXs02Vb/YSB6+Z2vvVzOXarKz1VNmVmsSNzTKZ8yEqDOxHHaNDoPCx+XDE9t71N66DfeDMnDhmtg+uu6eO4yEWbjpW73UPtue6ulX3YeZRXu7D9Zw4Z2LfP8otbPcWj8vsua5es80222zPiV0h4ieGh/iG4QzfMJwBAE7I4aNu9UwrF3gifEt7jvs8zCzf2R7NHrx91Afw5W6hZ7z9uR5nL3ucvvjsuLKHjvH6J3cYtvPAPYrduvUyXn75w1ivz552VQ5a123wK7/yi7h794tPuyqzzTbbbI9kz85b8jGNhpDYUQQaBGDak/9VNpleE01u33zQgMHejWWgk9zb+MYG7LW/uwnGip7rXZGBtlazfBwV9q+VcKuZCMwi6wxI/q98OyrnmDxeOVevgobeOJXS73tblJja5wFA0dIjAB25zPTN34chyQPTuN+iYQIrcFfLIu52CF0H9zmGu30L8eXbiKmPyQDp7BWNbcURFyLOfvYNnJ4scfLGLbz99Q2uPhwxMOB3lHN1CqBFmTXYbASVCitK0s+M7lzyRVIEaCcgiuaJ5CCsL2F0ytzKzLYorDowodkx0MtxZdq5HpmVFhtCaF2SmpXzXEjSMB5jp6kjRCsNGkiGsGKsk3G+s3eg9RroB2C7nR67BASovKQcYgCGbWRB38x0obFzNbF96Tp5Q50LmrtuKgDCsIXZBC3kNmaZzmk2k2Uqcwhl/l5nzsPduQ2+dYZwtsxrDJiTxHJEXHhhZLMwcWlgkVvOYC4Kc5tkPBT0ld8tYMmFEYzETCQgLFwCsbhIIAMp36iH3wW4PmJ5jxEWhLDywMs7YYT7BmHNQMOg6HMeU0DmXlwAiMJQzAEOFZBW5/e1uX31mWEv93CeER1nEMwlifKcpzUBfzlXqgKmKPeKlJ4VC+4nIC96eQ79joU1avsvcJZpFtlzUUOgwFh/iXC59Fi90mO3aMG9SIeyHScDbseFAJluEKZ/bAFuAL8x84OkH3JO2yT3i55LP7GwPiUHMAGRQA5orwLaiyGNJ4+kwbOEdzAgt0yKwghuEls8scb7W4T+nNGue3QPlqCth7+S9Wt3R4BvAX8lcCUs5bsLEClqHQuW9px8kdHdIuwcoX0o4Or25ST/7IHQMrit5gEpGC0HKTJcF/PYCIsZ8swQwQ+xvKeBxNSvgrNMMBd7j3DnBP26PD+U+kQlqgXIZvgdy5wGoz+Rtd3v9B0L9KfC/u3OPBYPGe1GWPS+i1g8iAgrh7Bw2N1y+R75uUls7e2LDq6Tfgxr7V/C2ec2WHzmDTA5YS42Ewy+EEs+3zpoLEbQtgNvtoib7c3WqtqY5cV0jSM0s0BrlicwDTZOMUMrBuwk6JvLN2xnvUbXalsP+96oJfptubYe2XzZf4VQpKbVRnu+Awzkuh/qa+tUB7lOpg3KUA37zN/JdlpFCkCkmPX+eq89tm81NybAag4B1DYg78H9MA367o2rqVcIJi972dtaAJWHYTw26f+9eWD6zQZqMarzUABQKxu9d54GmuU+Me957Y+s6mH2KulcTgzhUYqRqqxsFas3g71GiYeZi9KJZfdq8KUtQz/bY3rPvi9la5v6StZdyzD1nGRDj1SKZhB4ttlme37tB7ev4f+1FWf7r2tv4T+99c0TyQZmm22297tdvBnwN//s6/jmf+Ycv+F/8sLTrs5s79C+67u+D3/kj/xFNM3i+pOfkr322i/hT/2p78LV1cXTrspss8022yPZ8w34RktTgnGW77N6a+nmPbDXsG/y9QpsWkbplDzzFKOhlpej6pwa5NVjzID1PalTkLkwJvVY7dCt2Q61PJy9b3LIjRxD1olqATQ/wQaaZGpOODZtnescyiPH10S/mjHh7Q7sLyR/z4vn4IWZugYsAyCydo0DbaLkOX1rh9MvikNtd4dFjjYS/C6BXVBwDojQOYQMsCnjNzYCkGSQR4EiJGYkkEEQLU99lN0ZIS4IYYks6ex3CSjYMdzAcKGao0Qll6qC0mrWQU1IIHOiYSZJbabkmFTHYeOB5RK0XAp7jKv5SJRBX2sj1u8UWyfN9+KcnXCe1jKIes9Rgyfm1AGWzp7dhKF1UyMSJ/n5mbB7HY2fNSJwUwBrkbKt7wdA84XmOUHltwQAW/JqKd80KxSQd79NyMEFy/uM/ozQ7wjDTkBnbhnwDHaM2MqNXI+cu1qZvVQvEZpnOgGXFvAVbef0DKQy9BgzFaA4sSMFmC1lKNtV66+s38zu1QLS/M2KBRFwYETDfKoZpZY5Lfl3ZZ1cv8Ho7jgERXgdI5xU/arFxlIXBXJzu/V/8y/nE40Q4Lsay7yuNKXsnAvXO0Tviqw7Q6TigcQsTWVXSpwUUrAIM6IHhlUar8EDOXctQXMQyzpg1itKY8cYrzlMSZpYznEdsipCNqcAeJrznC+dzLWc65xo5WQVOexvwPgZ23sPEvpbrUgu9xAZ6U5AbF2bfcdwAYgtQYF0HTOXmNCxESBfc6KzB/q1w7IvnaxAugsSsBAbks9E6E8F9F2/GdGdixw0exmT5pLgNz14u5VALLuvsG1zE8c1mGQIosIwDEB8BxKsNAHmAiMgU9b5Kh+tPb8Gfa8BhvfW5SlA8hiTUuu7J/88AczWTF6e2EegenfZfdoUc/bYb6pyMfX7VJsi3xxfu44J/TjM4XRdbn+cKMP2rVVZsaD9AWbwiCl7jE2tZd+g/qMcy7VVfZxlpKekls01o4DCUd1KsOH4GlNuvZ+u05IAo70sSSP2y6xNgx8nQNtRHWD2PHUZjwL2zjbbbLO9DywA0BCkXw5b/Eebz+G3tnfwbe2tp1ux2WZ7N2y7AT75U8ArHwJe/oqnXZtnzmL/zv5Mmu3ZMecaLBarp12No8Yc0XU7xDhcf/Jss8022zNkz3XIN9UODctsrR3Lli2kLAXL8rXn6+c6Qt+Cs2oWDLLXHJCSLqCuLZvGDi09hyjlAkYGvrgGfjPofACQte1O1xPR2Cmk9amdvek7NQ3Iu5vJ7I36xYnjGsUJNQVCjxxTyjqq5DC57xAeXCB86Q3QtheZbK27AS2IBXzk1gvAGSKaty5x9isdbn1GckJyAwwnnFl4WaLTC3AQG5HwVLlWlV6OLbIUswW2lH1nvXIqA62gQ39O6G4B3W3GcMKZ5es7RrMFXB8n8knDMEQNS10lSnMuQ80RS/maUd8lsJcbkXV269W08zXPmQlwND8n0Zxu5nFiqKizWBi5EUedjik/9aQso/4GjO9xxCg9Sxw5/3ssIwdaLBDP14jLpgRvmPWDVTIYEKb5BIiluWkFuKcMPum8ssEE4HKeBS41wGCvinnOSiWW9wa0FwzXAdg5oCdwK2AvSOY8N8I2FQCyTHw7n6VMAf3iEpnJKc8GIzNBFbRs0oUxySEn0FeA4rTGJPBWmKlUgabCXHYhgaGW8UtlbuszqGxLATGV9VyYxNKgVN+FAzeEky8NaC4IITgQMdAwwkpA8BFIDB0TyoBvfubZAKbadZz61aOAk/Z3BVcp9RPJeLogASrKes3vI+bSPl+uz2bO810BhocTRlwyYu8SM5lyP2pwyQjENv8omDmW6jysCdELmBqWwoYdAbstCxAeDehe1xUT3xlFXplo7/2d1zFHElRQBfH0Zx6xFbDXJ7BX8ynHFjn37rAkxFYkmzXIgjQXewKMmx2j2SbA/GRcVwWGtU9kDsicGE6lL9ZvyHstLIGYxCWaK8BddUDXgxrJN763D9B/sewxOCkwZKbgrnu83L32Pvmzm/4MjN7xtU2tnaN19QDIOfqn96jPsfudOm+sPU/tEEhcl1O36VAe+nqfc6jsm9ix844ByPacA/uucqjqi/qe9pheb/sg8v4eywLqE22gQ3NI61zPjwPlHPz9gMyzvsPVaiAz713TfsPuMXTPsdeGtC+x+95Sr6pt9ne7B7GKJPpdf89geqnX6Lvd8+rnVKeDTOJje207lrYONYhd5fGdbbbZZnu/2BfiDv/Hq8/ix/sH6PmavzVnm+15tN0G+MR/D7zxhaddk9muMWZGDIw4jH2Bs80222yzzfa07flm+AJGxta8YaccHEYikgLnc0YgW5ZVVKekccaopJpX5yRNOCULICdOnUpsyKn3vwKU1UeV5JtHcpYq7exckSZMIOqI9WsdUgf+8FFJZ47CoqFGaF7M6sD1Y0ecldfLDlwDVANVyICRU1RHpspRax1rU2aEdpX2QWYgGTAtBnAXwV94He5kDbz8QpKL9Sn3LTLzkgKPWMDt3S2ahx1cf4rNyw73vp7R3QaGU+DkiyTyszzOp6nAVlgJi04BkbBAZuqFleQHDgs3AgaUJdyfCXgCIDGKhWVJg8hHt1eM9krAXragLpBkajnnyAQExLJyiQpEEZCALgd2LLmCPQEDgfogCp9tI+zfuIbrB3DXg/sqT2SeO4m5pTLPxOkzg9r95ytLDk6xag6wcEbM3WN/rGdZxjDtaAaSUztJPleMNY4sYaA3dHz6l14EnZ1gWLUyn0KRUxbAkpMMKWXAMlcnxDKGRGZ9gkxlX/I3AwnY00eKecQCzgBnAj4VxIsNISp2xCI/768GtJcN2guHcOIQ1hG8DEAkIBLCUsp2O6mH62TekkuAVQadU10MKC2sSXlWODPBSZjDC871zf9nQNQCdpSfHwVQ63yo7JFzrkp/lHLZPJPyIQVm5D7iwjIl6fvYOrguYvn2DouHLS52LXwb5PcHTXpeGNRJOXEhEsxhASzuJSZoNd2iB9BKvfyu5MYVAFzWHdcRuAGiL7ljYwu4HbB4CPhNBHURfOrSejUGfW1/CtBdZJ8lsEQf+ARiLqUdfOVFrj5gBOBSLGOY5Y/TMdensV3LuoQk6R0XAmYq0O635TN7uZ/rCG5H8Fvph7BIY86QIBwjZ84uqRUwpYCDtI5RmgeJ2ceNZZSiBG95AZ7ZCbNXngOgP9O+B/qTdI8GaK4IbRfBQwKCmcHOIXoSsJxEip9TgM/u3CfGdJNZz8Na1xbkwJ7VmzIWVx9oQQFoL4HNK8DigTDJMYSyd3DOpHHgkvpBA7kS+EMkwQq0k7y98eHDxwd8R2vpAWZoxRjNudvJFdl8CyCa6/MeZArMnJI8PsakrW2KzWvrUAOKto8Ogbu2XukzUZOBQZF8nrhG9y/pvlmeWeuTz6vu6f10++zxijUr/T8BPOd7mz2ZttkC3NF8ttdOtUfrPCWTrfXRoMC2Ke/cetw5go9N0fp+alOg8BToC7PvnAwuiHnfqsCp7IFiYR8f2G/WjN0RWzmEAhxEU75UqJxr6jgCVPP4pGNHlG0O7niM1PdIkjm1exJ4VtBb02PYfsqFHQhumG222WZ7Tu2vbL+Av9u9jb94/nF8pX+2GWKzzTbb+9f+u//0Ll77uR2GbkZ8Z5ttttlme3bsuQZ8OTtejr9cC6MXxemiwIU1dZYawOYoEAUkpxCmwdbaWXUd4zDn7aICAl93/ycd1XpTZov2n233NUyRLBVYM57lR+MQU8dv2P+NGbzZADHCnZ4AyzYBa07AuFiYY6yOLwdQH+CuBqzeaMBuifaBR1hzBjZcT8J0S459AFmOVUEk1wlYQhFZihYQEC+sBYBQMItSXt2YmHqk10VIPtYA+F6Yen4n+V/hEiAy6ufUBVNs9sQiHV3hICDf1DNBJCzfpgEtFnL90N9sDo2c3DwKCBiZypk7N3bIv5umgQkKFFrn9aOwfJMMKp2swCcrYd1ZGWZ7KqPkFLTXp3MV4CoVsechg3HWbH7fcbnyT+WQy/ymFOjAJZdpD9BAoGCCF4hF2tmj5Jq1QGuKq8hSv4Qxq5jl9yJlzqVetU+9rr8upVGee4Zco823eXRtf9VAawZ8owGnEzuX7LVE+eIcfLELcB0jdB7tOsI5LlPX3l/bHsu/egwAjNm8o3sZsJZRgjAACcKIlOXbKa2XljWcgV8q5WtwQBn7VLZdGjVvcu9k3TF1j974/w0ob2WN8/lUxt6FcZwGlAlt+zqVoyzbAsqz5KE+FmBB488Mmce5HxIgSijRES6xowHKkvrDiazbrk+gNwmIK8EylPsuNpTrn3Mm61gHxrCWzoxepP5dmuuaY1373Q2M2Io0v50LNADtVQJemqaAvXvqH67sF2xglzL/hiHlGn8H7/V3wOijpJAwsrTW53VVgcdHAXNvaofeK1q23WMckBs+aBPg4ahNN6n7ofspODwKIByD5XuS0hPvq0m7rs1PGshLctQHa3Xd/W7CbLbnHmg/Ee2/Y7UKh56P6/YdxySgn5Rp0OIxqwMnj5V1jbLJXrmPes1ss80223NqX4wd7sUB/8PwEFuO+Bq/fmZUDQIzPhku8amwmUl/s832Prf7rw24+7n+aVdjttlmm2222Ub2XAO+ajzlWK0BWJVKhYK/tVPTjSPw1SwIHCuWTmIljUBflWrUPF0R5drayWPrSCQSxHV9rGNLmb2GvTBiGFTls0q8Jfbr6BxXQNTMXuEI0tyDABixtC9fQ6V93guLmRPrwMpXKmjrjNPTspGBscPNOcldaNjElFjH4oA2LAZ1ir/xFtzZKXDrDHy2TKyq5AwMDDQmP2aUf+3dDfymx+L+Cm982xKXH4m4+iDQXhLWrzMoMdyExYacn9FvgfYC8FtGu2Fhh3nJv9ufEPpzFA9pAlHAco3rWYC4BFZFL4BCs2U0VwHN5ZDzRpPnBALJ/LKyuKPxMyblJqZpCmqgyKBBchgjSciyc6DGg1cLAZwWLVyM0p9DlZOCU5/r1+TwJ0cy3upTrR2bIUBRwDqX3OR350b3pgkn7Cin4CHpT5OvcBLk1Xl6xKhp4U7XiLdPEU8WBZDT+zLvAZEgArdFslmATSAsXZEYBgqoZ78DI+CXG5S5oz8nmW7Jo5qAFwVePYEbAjPBJeUC3wmTnL3kFwVBwN7Uf2FFeZ5IOYy4RAaB7XwPywSqusQGfUDobnNmirI3wC8B5BIimQHMVAeIdHlspR+jATmV+ZtBVhbgGkAG9Wz/FTnptGYqmGdNq0Dy3FCMaDYA7rfgVQ/fhBITEeU5hgOCZzQbkxtW66AEOpJ+aB8C3S1h/lvmcUz5fl3KK0sBGNYCtLte+mx5n8epBBLIq7mOw8rlNuTcuSSAorQ9wncR7UbYrjEU4Fvz2rqO8joTThgu5fXV/M1xAbgtZ6as64HlLmLzikNsgNVdRtxKOTLPRPY4tkBsEts4kgDYW8LiQRkbkJFRTox1JjJjpwCn1juxWyMDAXBDTPO0Se82hu8JNEScvrZDaFeIH0zgrgP62ykQZ5ekrFO7h7V8X74tQTXDygmT3eRfpwg0lzKHH3xM5LV9D8SlgMjNFWfp58xQ9shy/Uz6DgDaC8b6DelQWknACEKQnLyO5H2UgShXZOJVJWAI4K4XJZF3Avbm56ICBg/IHJOjMXuTnDBejwGbsWLTWmbvTa1mzapVrErZD0ywfh2lPK5pH5T2L3tM1BrIjTwGEY0CCVvKqvZTetfxsXzI+jkrYMi2mntGzpFs28CGXeyqsbpO/lmVWBRwr+tVXc8hCCvb1kHLsP2U6pWDpjgF5yhTd4pFbPo2v6O1XpYZO6rPxLw6AvoeKmfvmAE5828xjvYabPatdk+R2cDKFFbGrL6IvR/tlaUhXFjFuXG8DyLXz0TNKG7bcf2sRLRtW3quyfvj7H+zH6OaKTznupttttneh7ZFxJ94+Al8Z/sC/vKtb3za1cm2Q8SffPhJfCpcPe2qzDbbbLPNNttss832ZWjvC8AXwL6TdOL7pHzzFMOUq/N4wnlYnxMhvkdl5xonEaz/Ziry1LJ8arPR+jW4FiNIpSMn2MjZkWkcSKM8ZlZq2TpWraQdgCyHq78TCYtJCp/oD+MgPObAtGyMWDkSgSw9KKyjREO0TN/tDuxF6tp5B140kruXCNB8oVqlNjnZhwgKjMW9HW5/WiRwH3wtMKwY3e0ktxwSiBBY2GMLIc0OJwKkESsYJkCF5EfVMcFYClbBMD1uwB4mILYOw2kjEtReck+WSqMAJUNMzOEJ4NOCiQpKRjOvoU5c6+h2IG6A9RrY7eTSGvTN9VAHdQUUAJOsq1Ge6Qmr88wVZycXIMTe/hgAos+kcbhP1f0mRqsl6PYtxCQRDihAlfoucgouweRzrKAvE5UxsMPpKef0hYKlvH+90seVdQkgMzr1WgWbcs5TSPBBc5mkdhdAGFJ5oDwP2RfmI9IjRcE8JwnQ4qYAiSrzC5T6KBhJA4GXEbQIY+e31jtKe7Q/rWQ6AzkIAtpsQmGzRlOfxGTOMuFJfj2f58p1uS0NIbIDOwffMZZ3HbqXPPxyQFxHUCfPOxOAKBLOyngeVqluKfet5mnVOmnbNN9vTACkElIzUEwAnKD6rgfaywDq43jcHWTeE0yAAfKzzy6NefrMBLhO1AnYUWZZa93iUu5HDJFbbgA+TYEAZOqfwFHitK6lsehuUV57SiXT/DH3cl2Zo7EBQouSR1znKpVrlSmu82NP9rtx5asJruBW3qVuM2D5IGD1RoPdS4Sw4pxnGZDABQAld3oU2WbXE9pLzjL83FOeN/1aGMHNFhnc1vrFBTCkcdN5GFrKzF9Oct7tBbB8ENHc30ngjnflfaZgkn1HTwWlhQjebsFdJbH/uFYDiBPv4dEaPnWtWs3YnJJYrtZgsoFe9hr9HN1B9uYeKHvIjCTvqB6OzB5iopyKoZyvP8QYPtSHNYOX3EiaeZK5q8CrCVCaLFvLj26875xiz9p61xLcqm5j2bLHWLU5EEVyzMrzbgDSUN27Bn2tBPbUfvQaJvXeuz6aNV/LOGTXMHZFOt2PypgEjpkFKJ8KpJxizlYg8Oi7lY9O/5Pd09ds3EPM3FTO5F5IZZ1TXuD6nD1Z6Nlmm22295kFAJ8KV/gLV7+M71m8iG9rbz3tKgEAgoTOzzbb49sbX5D9xFd/A7A+fdq1eabsi7+ww4//1Xv41b/zDOevvn9c2s+SvbpY4Pe/+ip+8uFDfHKzedrVec+NOeJv/a2/jE984kcRwszgnm222Z4/e77fjkdYj5M2dd6xY+qgDbGwb2/iM3EkJ5rcWiP549F5KE7wg1KGsTiStIwhMYE052/dF8oAHoYx22WvroUVwW7CocSxMJhhnInqND10/gFFuymH1NQ5QAIXatDXsHC47xA3JFVbLaTs1guwZuVxGQIAE8FREHnnBxuc/RJj9dYSF1+1RFgw+nMBSFxfwAzfp2ZGoD+VOtFAkjfTJRacR87XSUxwGZxT4EeAYYrCXgwL/U2kQblx0Pyww5KKfGhgAVZ6hoMTsDoBLBbYVEYwTTjJNbfxCGDQ+eIcaLko59bjuceUt4xfd1iK0uYZPMjcKc76Padr7Zi0uXsPOtG59MkIXKj65JDDmAi0XIDPToAqjyiFaIJFhOEv4J4brQfEBuBlAVYV4GRnwF4CWJUGRrnH0x2c5JS2ddDf2adrDfAaE0ro+oh244TpOMg8zde1DHZsgOwEjBGy7K2Wx16CGJAATmckoHOVVEY4ANRG+HbapUGR8/OY+4Jo3FcoYG8GFtO1sGC1ooSunIcMGlK5juS82KQDntDsIhb3HXaDA5YArQIYHpzBbs7grYLdFAG/GYOcI+YtJ+DPA2jS/04aQhYgJcixAWiuQgna0PYh3TMHDACgNAc41SXNodgkIHcXEVs/lsJmFKA5Mlwv8sRhJbmJcweZecWNmV5pvLtzYTj7DXLfl3Ev17pOmMMSuAKTw7x6xqj6HzDgp96DJJgCMp4WDI6NE+b3psfi/oCTpUN/7iRncKqTgN8yL9mXe4UT6YfYEpotJIc1iqR+WDkMa2DxkBE9YThB7pCwlDrGRtbm6OU+WVJbAd+HjMXDCLrY5LapYoNtF+leIpp3qqqChCABTMM7/GPSBn65w7KydZ7zG9kEWGfVQSygK++HOAaBfSojmHseAjoP/aamewznhBV9zGz7bNAcRwB+/G7R/LbaHrvfOcQa1mOAXK+A6hTInoDXEbvXljEFvtfs2ql+OQZW17LV2m57zN7XXJPfzSk4bzSOpt4lb24VBFD1TwaRJ97no9y51gxAPblfOGKjc5WRm8DT0W81SGuCzzJLuj7PlAstVz+HMN7f2N8sKHxTU1C3lqTW/bvWz3tQykNc+rMClWebbbbZ3of2+bjDD2w+jw+4BX51c4oFHNyjrrVP2DwIzeEECdmGWfR5tkP29uvAvTeAD33VDPhW9uanOrz16Q4f+fbVcw/4MoCOGS0A/5TXLWsvtS1+z8sv494wvGuAbwgDdrsrtO0S7sjfrk/DmBl//+//VfzMz/zw067KbLPNNttj2XP+dkxSiI03DmQuspHA2LFiGbyWeXMI9NXjKhnNvO/EUkYvIM5cbxwrVqLZ1gkQh1Dt+LEAWy13bNlB9jeVjm6aDMAypxyR3icGcCmfQxQpxNyeMfs3My2V1avtzPWq2L7W/ATNLrctyS1yBPqw74A6BAInJ2yWsXNe6qCXdR1iZPjzXnL2cpsY1lTyQAbpVyYgLjzIC0hMfUD79hU+8GMtLj7ocf8bA5gcGojjPw6E0EKkcrcCzsYW2L0EUPIxh0VimKVpxMTozoFmQ2gSWMReATbKwAgI2LWUpXRjAi8y+EYozEsCmg0SS3EQADhwBs+4ESdycA5e54B3AKL8mRlQUCEiwDtw22Q2EqV+dgC4H8C9YZlNjQtVYG92Ipff89jp74AwjFSiUZlZlsHjFDxgkRZPjssRWzhU9zDymFP1Y6Q5N8XeV3MezQdeAZ+dIJ4sRizF3A3qsGYgJhAntlIHvx1KeteFT7lyaXStslRzFU09hHmYJI9RHp/cL3Tg2ozUEcKqATHQXkRQlACCDDgXvd0MQsYWWbEyLBh+l8A7BjgSIhcmsDJWkZiNDgKAsRNg2C8CVusOfe8xeA/2jOhdCo7gPPfkGsANXNjJlNpj8e0E5CoAOwK8VYqex0x6Bci1zLAg+E7Wwdh6+E3EyesRD7YeOAVWZzts4grYOpGmTkBEbEVS3fWAC5T7yQXkHN2xAeISiE3qNwZcT+CGwZHy2En+bgaiPL/tFcNtgzBZVYGAyvzIrOgEduZ1wPRNbB0oMJo+Si7gxEIWlQEWsD8g/y/gsNRvWMuYuk7WIiwZ3R1Ccwms34rYtgDaxH4N0qfdmQCdcm9GWAsY6waCNznNdXyyRDEoqxlwQymnroD/FCDvHQV/LKs/Iq/VOX95Ytlz49BcdDi/6LC4v0J/7nH/q/wYkPaE/owRVoy4VCY8IzaMYScS1O2FBPXELgU9RAF8KTLCw7RGNwL4ckPoVK6fZRyV8a2A/OKS0WwGUD8A3st+pPEF3NU9SVp7BfSMIvNMJKkMdt3j5e6tAahaaUOPOX84QOeYXLFdw2t2qWXiGhYseYyBRng5pmVUazeAcU7g+t7WzLuGFeitwVkFCO17owZJJ0BT7od9EHbKtK7el/rU76Va4ULZxJo6o76PljECzTldOgHkHgJWtd+PyVjX7bNgtfk+kl9O72pKe96RHLcBY0f3q+bO6NjE2Ob957HfcnU4H7dmzxnLgqcQq5pNq6CsAUe1DgrWWqav7kOtXHIO7DTSy/Ksp/23Pa59aeuQ61j1tzRiry9GALMyfxO7N++Zaotxb08z22yzzfZ+tP/r5vP4/+7ewP/5/FfjA3751OrRgPC9y1fwFh8P5NtyxP97+yVczVzg2Wb7srXPbDb4tz/9afyel17Cd96587Sr857af/1f/3X83M/9A/zxP/6X8fGPf8fTrs5ss8022/vKnm/AV62WMHNUWFTWLPulPj5RzrF7jCzLyo5ZD5N2qA72HhUr4aDZsmpHVw0kez/tUDKOqJGjaIr98LhWO5OPtGmSvaGsIFsfU38eeqDvQY2XfLUA4AzDwXZFYl9zYo0hMFZvdAiLJS4uHCT/qrDCmCHo1oAEWJg8jgm0jS1nEM3vBLwNywJiKiswJgYgewFbFOChCCBilL81/5YAH3apnY7QtgLkOvv3ozq4dQ4SxnOMUp5S6/MjkQLOORyDAPIEJOAhHnhWkoNSnb/H8hra8bOM5Mx6OfAc2OCII/KPWo9Dxw8CHJWR98B6BV4uCjs8gW7EPKq/lSQegZF6XysnigTI61xgBb5T+QnIJZRcp1TPWQN26ufM0kWpE3tKrM4oMuSBkoNe76egK8uQRcpMWSsdPZIRT591Po6ZpJzZwETqfIfk8XXlmpG0uX40w6vMXQuAF3b+/tjSsXUYyOuZMl8F8JP3QbNhYedHwnI5SF3zPdPzKcuDtEH7pRpzy6rN/8tjOV4qEwsaDGFbxwRAe8pM2AzkpzJzf+k0sPhdAtxzH0VhqVIQGXV2eVplsFevUblm/RcbuakC2MOKEBYCdjIlUHshctCxQZa7hmNgkHvTgATQokhrE5Azxuv6RbDDL/2b2e/jnL8qMy4HyjrPRAKepLzky7d38LsW/YkrQTdIzwETXJckn1USvGUEBpgYFAiuARpOzwCJioL2l8r2Z7nqhTyvFAAXYpLYRnrOBPilIYFaLRXAZ+pdpsdDWV9zDvVHkJ+/1h7jnf0oa+bxe9+QTXjoXQFcu+4DmO6vqfrb+0yxR29iNz3P3vOdjGeShz70fhvZBMB7YzumnPEu2TGVl73fjuX3rWwP7E1gK5l3cHWzo3UYsZsP2XXsWSvtLpU80oJ3Znvs56lcwLPNNtts73P7UuxwEQf8+PAAH+cTfJ0/eSRliMcxZsab3KM3a3wA49w1cHz83lsO+LBfYZMUzN6MPTYz+DvbbF9WtmPG53c7XBxJifZ+tYcP38LFxdv4uZ/7EWy3lwCAV1/9KD74wa95yjWbbbbZZnv+7fkGfJ0DOw8aEqtRmb5EWRI0M/NS/k2KJpLeAKwCElcSzHqOlV9MrNERwHuAlQBlQGRWj55Hh3Oc6vHGDI1lG5u2AyhtyTK6JNcyA8NQGCXqVF+0mXEwYmgkxxo5BxCD+QAgp82MobBbVFZa+0WP1czP9Jm8M6xP0wZlMhsWxYhRMcolO2ZtxocXoGGAWy+TRHLK1ZZBhXSqyvQ1TsacgfbNC5z3AexOcPfrHbqXA/zOZ+aaG6SirgOoker258IgC7cC0BP8pcfyLQEANh9AllZtL4SFN5wk5phKjyaAyQ3CJvQ7ZGA4d7We54BhLQxj3zn4juC3DL8NwvRlmVtMEGZpBNzOSIqmHJg0RAH/AoMQCuuMSMDyRQsEB980iLsdOOX2HQ2/ozwmHDBmupADeVfmlTKUEtvTssQsq3fELNcxtjLOhwAEld6sz0lg9Y387c6DVkuEF07BrUdsHFwXioSzAoaKP7cu502lUJhB7F3JwUxUpH4VLGQBlZhIAFLGKABAJY5jzqGYrlFpZ/soZrCxBA6EpYPfRvjtgOaqRVwQ3IpEyjkFE4AAXkVEOFUeBgUC9Ynp6Mp5FNXZLUzWzLjVflhzYsYyYnToew/nGOQY0YsMbmwJfos9sDiDzBDZZQJM3luaBtIJmW2s3zmlSaeY1ntGYYMCibFLCCt5lhf3B7htixCStGcaByQgMy4AJFYzKyORS5BHxjFjAkATYBg9g9u0Pgwi6R7T+JY8ychS7yAZ89hIIAYxZ4nv6JP8uwLu2tbEGG/6mN5rQLMNcH2E6xcCSjqAG0YEoe11XkiOWddJ2YDUYzhJw9sDYQ08fEEY2wDgOsLQAv05ZIwBZBnzBF67XvLeRi8qBxQSGO2LSHls3d6664b0fDcF6JV1mAvw7yDvSh2izCBMUuXMoPtXWNyNeOkLDsMr59h8YCn9SYyTLyEzrLcvOvRnwPZVRlxGxBMgrITpC9b+lz5RZnj00k7fMcKCMKwT4xupjcxAS1hcMHzP8BsBofcsMXtLnm3K77iRvHPXgzebxwODLHMQSOt5tRYSFcWDzBqlIm98jAlbK5o8KvBpy7hOktgyRyflltP7YSqXrhZjg9duAjybfMR0jVM27/G0u6aULWwf2T2Qnuc9RhLNU/mBHcnepx+mcyGb3L62vzhIlAd5PwbOK0YutY2ce0g5Y2qMbZuAMRPX3AMw73ab2kGLr53u9l5+4jeb77liEtuy8v5B66F7SQP67hkzssxzroMf94vus3X/fAw0mFKtiRFoUzSKLdcwiouSkMmVrL8pQ9heM3Vfw/TdA3anjs0222yzvY/tChF/4uEn8DsXL+I/Ov+Gd/1+AcB/0929ls07ZUs4/AvLV/L3/3z3Bj4Rrp5g7WabbbbZnm1jZvylv/QnoM6W7/u+78cf/sP/7tOt1GyzzTbb+8Ceb8AXgObI0xypyoZUWWey/rjsPFSHm2EEmJx72TmirFj141jnqkqLTrFpTd2y6b0rx9me1JuVgJsyrZsFSfW7dRRpFbwDM4HV6WXPq/Kw2fprrrkReGvNJZ1irtqvefCIkuMexeGX8vuOmAgWLN5zBo6Bw5GRwyifbwIn3bYD2iZ1jUNsnGFYlvaxd4kFDNCyBfUBZ5/d4uqVE4SlEwBsEOdlWFEC7IDgJSemyrjigRcApEMGtlySeY2tyIJSFOBFmWi+K8CV5FoV8FCZjRbYkroiS6eGtrAX3eCAUMBJywbcY7jrPDWME/aJ5ayBEklmVZmtRIS425X5YiQNc91GYzMdxMB2vtXPgT6zN2FeTclGm7ml4PNeQMAR8y/eAZ2dImguvGAk4XU+WnavMWIubMQMVpbgAsR0juZpVYd1OlfYlQrwqbwxJsDOxNC24xtR1jskIIoAeJHa9buCZyKxGjmxbzPz0kMYjwMBnlPeWq0jF2A535vLvTuSvLWt+rVp/PgSCqCXgOnMJNb7O5KAhXS+SAkLA1aBdJ3Tqkit/QUFrIFSz3RPYmG+arCEAsEURPJ46N2ongpCZwa1Q5ZsL20xzyzDgJqcgHPkCRKWEDnhRvImU0xj0jGoD6Cll3nWMBAT8EtIQKD8HxvkHN6WgW2lxamP8AOnsWfEVYTbeNCAnGsWKEEkmic5+gQ+xwR0RlN/SueTzA3XybGwZnBSMxDwmkbPgwa4MCV1DVYpfYye+5jWnBJQIazZkdWiAYElj3aIAgx7ApoFlB1MIWL1RofudgtuUFjQ6TmTZ8GJ1POaEReM4ICOAb+RsdnecTnowPcyX0JLcMRorsYMQZGpRhojCKueUVI/ADnYi22Kh1rKNUTwdgvuur119cY2CWQZYNXm0K2D0qbYk1OA6jE7ls8WGLMrNT+uPecQw/QQ8FznvAX2XjuH2KOTbbMy0MfOq+txKJpoqi9s+otafrm2LKdswNJDwHAlqU1V2qu8h0P9Djbz4yb5kvN1fBTw32Pm3mQeTeXwHd3zcBl7jFab5/dxAU4LAqtksveHz7dgqk3RUoGsRLIHH6VnKT9mcDhLMwMiD59TmRwAbW1eYJvjN5WTpaKdAyZpzrPNNtts709jAL8wXOHPXf4S/oXlq/jW9vxduc9nwwafC1tc8uPt44iyLs7h/ctss832ZWE//vAh7g4D/rmXXsKt5vl30z+Kyfona+BP/uTfxm63wfd+7x/Hq69+7OlWbLbZZpvtObb3x5sky3bG4kiupY4NmwjJSZyPK4PWAjyZaTcGQveOKUirZlmz1qlZb+KnnD6H6l1fa3+b+t06hoiys4mZUblVzWk0uuag1UwVqo4D476rHZTqgEpONHEIH2EgTDgYydGe1CEPg9xr10mVvAO3MTEtfQFDlSzREKCyp62XfL6vP8Dy3hr9OQkw0BbJU2LA7SCAyEIQHwpA00keXhqQQTSXwCJhOQLgBPYuBSDyHRX2sMqtJlZhlm1VkEcBOkg5AsYICMNXArBkwCQiM+nk/Ok5lGWKoSgcgMaDYiPPks4T70DDMM4tWQPzleObA47nQZwCCG7IGrNjnvMPT8yF9ANuAvrS2SnirRMBryKLTLICuR4CXKF6NurnIwFPk/5U3bumuZEPaw5bh/QjTB203PJPc9daUN8NMkf1XFYQtZfgBJUTB0lXEAp7SKRrU9sMMMrgck9zf7mhlCPBDyQfNW9tSrrKXOozkkF2hbkqstnI4KHKRmfZYWfAXovDpHo6LoDwlMS2sk25Kb8pyEgDwINLQDgE2GYk9nJCnXNhyH2jfZjHFAU8JUBk31Nfh1byMQsDOnVdJwxvGuKonFx2ChQojFBkSWmbr3s0HwJnqXkAoFUAd1Kg5qbVe8Q29XVaz9CXIBJigDrkoJP+FjJD2mvQy4Lz/FUZ+pFVc0XHjnQKap/puhtL3yCD/vvvHU6AsChzpPXNe8RVW5j2XYS/6uBOPCI0+AsAMxaO4Pu03iZGb1wxoo/oE6DkBkJ3rqxlFonmUPARioywKnNW2MOU12sXJvYBtVKIPZYYvwSAt7sk5/zknXz12jhi96qN1lTdgxiA0X6eehfbwLADa/6ItVixPetgn0nQz967BpMrJu+ks7RWGTn0bjomw3yI3XzsPXfs2gPS1SO1C2uH6n0ADD6YGuOm9T9U70P1mOqbibGrx6fOsztS/ABSwKL8Njq3boZl+4aYGcFHGblWjtmArvD+kVixua653fv9c60Tv74/gL1UJlMMYlTPlzWX1Cqub8Jss8022/vSPhe3+Cvb1/Cr/Am+tjnBGg7u2HvhESwyYwDjtbjDz4XLJ1ImADREaEHo59V7NjUGMPTyzzeTfy/N9nQsDIzQ8c1SsNzAfuHqCp/ZbvHbX3gBt55Iic+RGTW1f/Lpf4Rf+uxP4Tf+pt+DW7dexnL57kvz19b3HXa7K4QwXH/ybLPNNtszas834FuBpAoqZKaiMZVsFtZRkVjMMs7WQausHC2njuKPUYBddWgNoXyecqqpDLSVjLbs4PoFdiwn2KhRXGTiambwAQcThyiSyhpRqu0LYV8WDxg799QZqvdVCUMFBBUoHwHisZzHJACTlXTOTnBXOf8mnG1GMlHy21Vt6zuE178E98IL0oaFILUjtmsCV2wfMkHkBNcL3P7UBidvtviV72oQveTydSlXZVwCoU2sPgdQICzfLsDQcCK/DacMtxPZ0JCYl90tznkhE64qn5Xg7ArwFluALIE6Mc+4FZBGsAtCd+bRtITFPTaMyASMkAB8dm6zJxAcGFHkKy1zXZm+LoG8jVTSnZ2KA3W7k1zJ9bOi45LnRkwM2yTFXbN0akbRIUf6KFiigLulmP1reEoy8YBRu4Bbr8CLNj9vFFlANBbgKy68gJtDzGArRwXf0jXOSLY6Ag0R5BJr01GWbC4AqpEIRgHcMphLRVKWWOaHIEMsrExGlheOjT5nSKxDB+aI5YMAwGPzCoFaOYEXBqWs+40KMGffCArGggQ8HdbC+MzgnQOQZJxBDOcinGcEEmb7sCQsoAWXfpDC03GDr+a8qVW98r1gngVXgiZARclBJLU51TvNLQZoSOzaQEACSH0TMZwE0JVPARacx0n7OJh51HSU2iH/uEms1yB9MqScsW5IYK9jIBJoIDRbqSMvGgEtHaWAEpVKLmA+aX11bhiwVxjOgIssa1Zk+C1AA2Fx0mN30Qrr1KgI+E7GUkFgqZ88ls2lArqA7yiD6qN1xwO8YPgrh+bSpWcCBdyNZXzAAupGMsoKIY0BM9wQU3CEmYee0qLGGfhwnbxTmQjD+QJh6dDd8gitgNndHUJYyOWulzYqyzgsgWYDNFeM1d0Iv2OsBoYbHNqHhO62x3DK6F4O6F4J6F8knH3KA720e1BFhyH1FQPYMaIHurP0TLfSZ24A/GYAdYOweevAKUeyP6iCu7KKgHPHQbeb2sRanNdICwQaaWdlhI7Yv8fy6gJ7a3WW77fruf09A3cefEABYmS2/Cn2rwWHbVXzZsDvlzMFXqvV75/rmL3HzqlsBN7W4Kdl8N4UWJ1i41rZaDv2mrM9hCJVbeWYa6luW7f6u0pI2/rq7zYAcKqMa2wS3LbmfUp3EMtcmgoM4SRlfYAplT/3g+x/gekADad7dSt3HcbsXalEBmhzfawE84jtbP52sNfrffOzWwHaViZ+KlfwJLu/lMf9ML7vLOs822yzfZna/+Hqs/gbuy/hB259A16ixRMp8x4P+LvdWzn37pMwIsJva1/Ar2nO8Z9tv4TdnMt3NkD2Wj/x94EXXgV+/W+fAd9nyD7zo1f4ib9+H5dvf/nl3n3i9u0AXixfAw/4i3/pD+HjH/gOfP/3/3U0TfueVueHf/gH8YM/+L/FW2/9ynt639lmm222J2nPN+BrwScgAbnYz8VWb4w4Od9rFu9197JMySl5xKnjh2yK+TMqb4J9AEwzD6YcSTWr8xALoAZXbZ60PZZKcige6q9KFnrcHp7so4OsDW2ndYYq+wMsjscJdjMPA7DbgTYtsJQ/6qiR/mFb7wwWiVOe4YAI+O0gsri7RoCORk51KScrNyhsRGUIJ4AoLITZF5cRFIT9HJckOU0XApY5ld6lAvZZ1qZlyuV8vgkcIxbAx4FzfUJLiAsnsqIhZjAr54yuHIqiwE257yR/ph3nMi6cWdgRaFPeXgV9R51eMcJuahNyoiPw4YAj+CCjN5o81tcYeQc6WUvuXXO+SkESEgBs5J0nJZ1h5pWVfk5zgj1lYFbykSJLclPdjZMMLORry4nj3wrrM82PjtHsRL44RKQ5wWWyahlUvuafq/KIMWZzWp83F2ABSN1OAnQKKKrtLrlMpZ37zbT9Jp8LixfYB4JLHUzHJABZgfUCossxp4ByIDATnI+gRQR2XoY4jc+kDEJCnzMzWbEOLn2HxJqOiWELnwDfCNAgTNA8N0xblQmb2zbRpiwrjTRPiDPbutkK47ptB2xVmtsWkR53zVOrQSciRZ3WB7LBBWVsRbpYQG3NNZ7BYLNWKat8emBtXWjvWBnL9MyQQ2hdZs0Ppx5hQejXlGXy+1MkpQWpV2zL+MUWGEiePYouAcLC3G02yEA79QReRHDLCEvJ86xS13bO61rvUv1U3j/3bR9KP+aL6GZ7gRgfbc18DDuogjARSJNN37uPKu98yGx6BrvHuO662q5hHB89fp1pmx9V1rquHwBEk7d+6nf7/YhsMYD9d+tUH1iWr81pPAXkT4G91mp565vUbeon3duZ/Ls3Np0nZn+6B/Q6d1QK/ZGZADUwa/faNeB6KCixtqngTd2TpUDL0b2OlVvn9J2617FrZ5ttttm+TO0t7oFwKPHQ41kA4wEPTxySPXMNHBO+2q/wZuzx5mPkBZ7tfWibS2D15Jjksz0Z664iHnzxyTJAIzN+4fISVyHgq1er95zZ+q7aGpikLhOA2wDOzLEIvInPY7Fd4yc+/7fgfIEtzpcv4Otf+Y3vat9cXt7Da6996l0rf7bZZpvtvbDnHvClIYA1BymQQF8H6hM1x7L3FCDsB5GwhRvl2Musm+oemb0K46CcklI+ZJZFrGBbzolmwVY3dvjECDRNuY+20UbsT0XvT+X11fpyBHOSkwzGgej9nryeMoFz/t/GiXwrAAxKezWgtDob9Z5VvrvM0LjuryPNnYzktPNJZji33zqj4944hItL0GYL3zbAegksfBqzdIICUN5lgEEAGwLtAvzVgPWXCN05MJwwnCNpFiWQwUnuR5ekmQWEYIRVYlIuImLnwAT0dwRQYMdwnYfbKWpTWHgqf6qsQkDuFZYo56Zcm7wCsCW0l1FkRR3Q3fJoLgmLbQA3Im8e2cEhitR0ZoJK3TnNM4ID2gZMQcBi+8zEKLf2XuaGd8CuAzrK+ZLHwRb6/w2d16gcwsY4Mghh73yQcfDeNPfgoWqsluDb5+DWyCdWuXvdps+fw7otctkJjKQh5YldpLykAzCsPZCA19gK2BsbQBmDykK0crupUGF7R4ikLJffJbctxiAsEvCnXZeYxuQJ7cUgc3TnRFq4SXNJLaYc066wigXUElSUmwT+pa7xndSFggE9ExBMgfKaQInlG5cBYdUKAzOd55JELnukHL0o0rso/aLs3QyiavN6LqAnJUA4ln7S/90gF0WvubIZYeEEkNsFkboeCCE4eB/h1j22vQM6Bw4JpPEM7ChJQ5e62AAMGgA/CCA6mr4ExJMoctkNgzspo9mytMEpq5cyqJ3l4Ilyn4/mqrKPWdnAQGZ99wGLe4zuFuF02eHhMiAuXM5lrAAoe6C9LNdmOeIeiGBgSZL3NwHDERL70Z8z2Ese2+aS4DemYq6AvotLRnuZ2PFIYH16dmStJcTMgmf4XSjAfX43MWLjEZYO2xd9Xt8y67pJzPE1ZK1tIO+pSOAwHoawBIY1sH0ZcDvC6WsCVrcbBcQJ4cSJfPUqor+VJPw9oblk+GCeNX12KfVLekajsvR3QVi81lTVYxJoNcdCeHwZsJsEtmR5/SonLDAt8ZyLruSWLZuzzqN7pP4aaMaDcYbE6not39FIwleBTZuLdjInseYqVrWRWpVkKv/tEeOkILJ3P++n2a3m3mUsE7NWlSC0H2owVXPvWhC8BmTjuO32+lwve27NAL6J1SzkGui1v03IUx8Fd6cY2kckre25HId87qRTZ8S8LvvMkcSzDRzyx+cAp726soXhfZm7IYzrcEiJpwpCHad8CcK6XiyqoDoq69cUIKx74hjHx2y7Isve7rr6zTbbbLPN9kzbGg6/d/kKfma4wH/RvfW0qzPbbLO9h9Yx4y+99hq+9fQU/+ZHP/q0q/Nk7QMQJu9NjAB8K/AF/BP82b/ze0c/ffMHvwv/u3/2h0B0w79zZpttttm+TO35BnyBAthOsH2LdLMBcy3jUY/nwqoypgDdKRZr7fSsgKM6p+7oHHtsisVbn1Nbfd6h+yE5lZIzcMzgTVJ/KlNt5JYLRmqBb1vnCXanOvAtKxjGYVexdvfkna1lwL5I+un5wlxyCfywQHMAcwTfuw/areG8By890Pr9sU9M75zzLbGBzz8/4OKDHttXWNhcCZClADQXBNdL3l4KAJYCMMSTKDSwzmXJ07gOQCvH4oIR1oDfUmaTRY8MHEhuSAFaKDF45QcBGsgBbiuHwkIBbAGO3MAZBKIAAckDwTGP+1XHhkSaVKSdxclObSNzZwhj0JfFiUxNAyJCjCzAazQgh3UQ25yKkWFjqq2TfhRwUP9uyi3AxPQ99llTxwEUd3oKWq1yoAgxg7bD6FljDczQ2wWBwLhxmQWtUuDCGJTjYeEyUJQBKwVovQF4E4jIWg6QJZuBNCcTmCbDVSR/FXAVdrjW2VxLgkw1l2menLAAszqffMq16wAmYZ8DBPKcgWiyQ5tAt9Gc1K4JADmG9yx1pHJNDmBw++2mJLU8YhnbclHaA0rt0K8JhAMV7DPHncRyDjsggkBN6U83ANQRYiQ4JwB1ZjT7dGEs9VdQVAF37f9Mltb2BMoANie0lCPJ8QEZ8JUgE+l7lQ6HU3ZtyeOrbFwF+Tn9pizf2JBIIQNYPojYXnmsmgF+EWU8SfrC78zc0D5ZlLqHVck9nfsuMYCHUxkj6gXsBcu1zVUqq5F/WofmKo5Z6nneGwA/JlBY2XuQvgrLBn1i8qpyga03pbnGXqTz3UDAAETP+T5Z8jyNDTvkeX71AYLfAs1WGPAUAH9FiN4hhpSrveXM/gVY7tMD7RVnOXLNtd4vgMVDxuIygjIA4yS4CzBt0wfAvO81ACyEBDA9Bj/EBlgB02CmkdefBHUPyTi7iTyytTS/mgEK9/KxAvss1/pe1b4prxPmfvk9YY6Tq/YdNairx/b2Jm68/5iQkB71lb1fDVLmALcU+EZVvYzZNhRZbXdYzcJKJ9fHTXvIUWnrITnsehyn2n+dtLUN3qvrZsdNz9U5VLftENP3EOv7WDBEjKPyagnnUS5gMzdpal9e18/k0iULmk9dM1nOGOS1RiNp7QRS5x8NQGzz+YZQ9iN6LF3Pzo3ln6cCQp19Cc8222yzzemEiYMAAQAASURBVPYs2/uK0Tfb+8tOToFf853Aa58BvvjZp12b2d5le223w9986y38k83m+pNrewHAV1XHzjH29RyzI+f9yv1P4v/0D/4XICK0boU/8O1/Gi+cfPDR6zjbbLPN9j635xvwrUGZ7JTiAvZa6dphnw26z4Dl8lnNsh+mjpFBW2wdjlkNLtd1OXRsqtwE6lF9ztQfDBNyykDlVJ2ymvVRs02sKfMWEFAiIOVBO+DAdFHkh6dynR0zdbAC4IDxuDEjXm7gIoPOTgC3kOAAd8ApmhhNnPJirt7osDtfgxeM4BPA4xl+4+AT+28Eoiwj0Ap4RFsHxCQvvgpwDSN0Lud+9BskRiUDTWEJWjZbBqEUaHPlfgBGbOAIjGWDIUyPPLwTgRA5z5tzKe8vpRy/KMiPBX3Bwjb3kuMXjsC7itWW71OBEGaeZCf3IdnMyZzRMV970G7KticCrVfAcjECdakPGXzLpp8zC5sz+EbMAqo7kpyliVkd2lRe5DJ+FoBSgNlWl6r76Fyk8nNm86oDGzBe4lRuZsFJOc1GmJ9y8wSMueSc9/JZgDuWLh50/cBk/fIqV+kFSzeqY50LSOlGpyFfqiCegqba/jxfsSfVLEz8dH2WUpc2s/aP9nuuN4G1vXr/QcBCZgJRLDLUZCuU+imWwRvlqTVtye3R8ai+U5C1otnGwgi3y6D2lS+S4RSRWbHKaIbtJ4w/t5cRfuvRuAjnA0LLuRzXm3rrWtUiA/uxrfu9rDexZdAgMvS+Q5aupyDAdkhMbQbQbCL8Nhp2dsmFreNGOgcBebaUrO8IYeHQnbssNZ2VDZKyQn69eiAuGf4qBc2g5HK2a7K+niIB3AD9GYv6QQMs7sk5vgPiLq2DKt/fIAcoxJZyYII+v1JfIC4kyMZvogC4CtRoIJfuD/KaQgUMBvL7/5gk7Y2N+fAfxXVu22Pg8nUg201AuGN2LEjHShTrfSbYwyO2b118/Vud1zYyqH0MJ2oNdh+TfB6Bg1VdRpUte5fR7wZMzYDlxG97upS2ThP9xiGMgcu9epn5MZWPOe3/bO7nUZqQek7YcayCEvbSi9TttZ8rQPcgc5dMkEK1z6T8bO7P/am8wHv7aDm4d+3R49Zq9R2iMRhb7dcn+0HPn2pLreRT39uVfp9tttlm+3K1CMb9OOCUPE7fASuMmdGD0b3L6Thmm+2ZtMUK+NjHgc3FDPh+Gdi9YcDfv3fvwF9e19gZgK9+whVKdnfzRfztT/4nAIBVc4rf8XX/UyybE6zb83e8340x4PLyPrbbWUJ9ttlme/7t+QZ8YwRxYRUVpz8gTEcuDGB1lCSgRi7gsaNEXxD6WX+z56vT1r5MVM6RSFg+tdXOGEcCcNZyzI0vDmMLeurvKjNnmAFaLtk2qgPIsoxHOcIqpxjRmKVjJZQr8JsamTI8DJOAntw3AK5yMDsq8tT9UI4B4vwkI0dXO8FTuyjGwkIG9hkp1R9f3HeIHOHevAv3wm3AOYEik5wqkECIEBM4E2W+NAR31aO9WsJfOMQVZ7CXosiJNpdy/fZlxnAeQXc68M4DvYPfOHDDGM4ZzSLA+YjQeKAXJMPvgGYD+C2yTKzrUp19AZE4MYtdj8ysdEMCgwyIBWD0DFjpYQGw00neAL2eBA3J7D4zp1SONDHRstOZnMg7n6ylr5oG3PX7eX0z6G5YKXusXyAzz6bGzs6B2rluHfk3BXq1KO+BO7fAbZMYrrpmJNlyJjCxYRQSeOkTGCyMQABgEMLaISwc+hOVKEbJ0etcYXz6dJ+Mp8ozlbDRDCTFajXOuKoCccqKBaA5V7lNztwoOXuJGTEdO319wHDSor8FxCTXDC8FsAPQcKKOl/tYAFblxjW3a5G4TeAzWIIYgjBmPTGcY1CSheaGBBwcGL4XCVxWzIL276Xtyg0njFinGfQc1QVJ7pxHoCjr9TouBHDry/e0NC7bHlduCWaS59ZB+ikm4FIl7LXcRp5/15egD/bAsGDERvqDVzGD6RQA1xP8NsJ1MqflvaSyzuP2RWUj6/OtwHYUpYGwpLQmpLFjRnu/w+Jhg4tuAe8Z/TKg2TSgAQirMrbNhgFQXmOYRPYY0HVFcK1wIhL1gKxLrhe5cc3TK2uMqBq0l4z2AqDBvCMSsJvXoQqAkjWX8/q0eWWRZc8pEa79jnNOat8Lw/bio4SwFul8CoDbicS0zoPYmPkUZF5QlHXUKbBLQFhTHhu/k8HtzyOCBhVEgl8IIxgA+hPKbG8BgaV+q7sDFnd3sl5SkegGs7zLzRqazbB8M7v3EdewohKS1ldnHJccp4G9ughX8vpmv+ch2eapPLQK3nmX2zE6y4J7DjKx7Hu7BhWnJIVtO2oGaCX1D2A6aG1UV3OfLOE/BlMFYKt+sxa5SD5bBrGVNbby1Xty0iHfK4PIU2AtR1FjyZLc5f4ASt/Yek6prSQgl7TNQJG9tnWIE/1qj0/1Aybmy6jPEpPVym8DY/at6TdrU2ovZFJ9AGNgVL/nvXpdVtpP1Pciuz8GxnETyr7VvbBz+3t2YDxP6705s/xeg7SmTnv1NfMnf/a+7Om1vjb/rzKAa0lnlYGe5Z1nm222L3O7zwP+8IOfxe9avIR/++xrH7scBvD3urfxRuyeeP7e2WabbbbZHs22wxX+nf/qe/FtH/od+N/8tv87cDAK+mb2xhufxZ/5M/8c3n77tSdTwdlmm222p2jPN+CbTACwanHPQI5BTY45VqcYt/Xvptxsx9gwtbSzAVZH5dSM3roeFqwFpiXkDkUzTV1TO9mmnGs1yyE5B0eOuAy8TfTBnhOzOm8k/SkgrgAxFUhd129vnCuwsAKoOQTwZgNaLUFtA2pW4piuHYMEketN11OM8DtG+5DQtQxuAfaCkhCQGYfDeQSvA7xn8M7DbQh+SxjOGHwS4JtUt8GBBio5ewkirZrKydWwQ6sASAKDVO5Vj2XmXmILCyswXZqYdZmly1y6xY69038CDLMjkXkGkkSptjcFI6iz3qU8d4lNuAf61mN0wEb5EuXAwXNHvz9GZDU1DWixKI5bIpB9rvKJJSAAzmWwlxtCWLq8j5ScnzDAXAExFZDcU1E0gK29q4DEVJitNcZiwE5LsM3YqC03neN2wiqlUIBaBhLIn8BjHWtz/QgATuePWKmMfK3kbNVuK7LO0TOip1FZuW9tn9D4/5oJzOZ6MvemeqrVy19VjjK0JS8vEKMDc9g/N47bqmk42TyDuZ41g1nBaq9rLgFRcwErUEPjNYzMvAHy+rDHAgaVcoHMLGfv4PoACkCIkpfYL6KAuhWYHxsC0rzMEtVU1hgFNTmxXAVMp9GaJLnOkQFp1yHJGpu6Gba5KBRwOW7XZk+Ii8TqdUhAsJzjBgF52QHDCaXcvTIJ/JZkLbXzoJq35SbS1ixVnv4HC9jLDRJrmYTV7WVdzn0SCdSmoAeHEfDt+gjqEiCjTN76PazBXfpee1Isu6n3cP46BtgO2dFzpoKqdE+jDwSZ/cAxxY/HtcdlEgPj+tSM3Cn55GTj9AdufO6U5LOxm/TF5LWmPyeZslM2kmKW68u7dIJlPPUOVrD40Pt5op/yu9rOhbotwKj9ozZPSICrTab0mLCa6Vsfs59HMuMT5+U6HlCXOVinqVy5xxRqapbv1L5jCkw2ijV7a4cFeK9bV2IE7700Z5ttttm+fCwC+FLscDf277isDUds3gO497Zr8HF/gl+JO1zyE1CEme35tm4rUsq3XgTO7zzt2jwTxgy89nM7hB74im9ewt3g75/ZrrfIjH98eYlffBwpZwfgVYik83tijLubL+L+9o0nUloIA9588/PYbB4+kfJmm2222Z6mPd+ArwElKbDk5FSpxMS6oSHkYyOHaw3g1tHzarVknbIfgbFE45QzRtk7zmEPqLSmrGCT22/EGiCS74NxLtf1JJLrTK6vkUMrnUNV22oZPGXQknPgGli2rJgQp9nMpuzC9I3y8s+MBNp3DKozlQhom1KXEPZYHbltE9KFWU7aOMridgs8eCgszmUDLJoRMCoglIAPrhOQDMxoLwecvuYxnBPCaURcJh/bQAgrRmyB5uUtKMlEu3sO7QNh8A5nwNmLV2hcxLZr4ZIUtE9Ms9gCw4pGIAtFZMYlOxigDhnwcpo32DTbd4DvGNQnxqxzCSAixMbB99KHBJcASiqsXyfgbf7HIsNKOhcTs4SIwLtO5mDTyLi2AHkPWrSIl9jP66vzgMw4T8h6Tko1Hzr/UODFDYzWa9BqlQFdbhzcVVckWX067lMfEtJcRQJ7Pfpzn1m8TvFCbXIGe6nkj2UBvEj7QZuizaoAK2VzlhOR87YqY5IZAvwnEDMHBjDnPNOIDL+L8J3M17KOJeDQMdC7zGQtnWTAxrRcxiY9mxFQdm8GZKFA7/j/2Mocz7L6qf6xEeBRclgzYpZv5cyCtuBhzeat6wqtkpO+8z0b6eF0WpRgCBqiSDr3hCEQYnSIMakL5ATJMOgrwJrv2N43okhFa9+HApRSG8GBgF5yecszKwVE71Ju55KTl03wiRs4B4SM1Gkdcl8RpA/DwoGGBs3DHdzAGJiwaAbwChhWayH0G+Z0WJV+pAEZQKco38NCwM7YaNsoBZOM5wa3Zf62G5G/54ZKkAnJtSqPrwFZ8syU5zcsHWLKec1EcIFFgj8wfJeuaYDNK4T+jBHOI5oHDqs3CWGhHYOx2gGXNo/WUAB+y3CdAMgUgMUF52fVd0D0JHnWl1KfaJjQ0maRuG6uALoCqI+gPuT1JAd05T6nsq+w+w9HIo1v9xKPYlOM4fzMJrarBSdrWWOjrDEud8J5qe9YZb86lHeu5q7V34IppwaEr5ODTmWRd8IcnZIVnroGGO+V1AwwPWLkHgGluR9Kf9l77OXT9fvtqBUpbH5fe9wGTqk5EjUJK7s8lZ/Z1kFZuno85WrObbdWBfjl4C3bN5YxXJvdZ1kmNMy84LJ/kz2lK9991V+RS8BdAj8nc0bruVp/cx67fcA4lxeCALuqiAOA0jHA7IvN/XIec1PUJNhrpZXT/Yr09sTeZOK49F11HiDrAfSdqvvx9PeL5vOtgGbS9cSOr56vgW0KLg/vHOSYbbbZZpvtvbOPuhU+ulzhb+y+hF8KjwG8zPb+sssHwI//EPCN3zEDvmoM/MRfv48XP9bi9/67H4RbXH/JbNfbwIz/5+uv43O73aNf3AL4tQCWT7pWs80222yzPao934Avc3KWqwPTABv5d5flarlJ8nbRRMurQ0YBzORYyuXpeRbctIxdNVfVwUo/M4sT2FEBdUf3N+UQCaCmpo7EQ86nfP8JKTfLpmIuss/aN5UzVh261+Y+IAc0xqF57HwF6WoZx9qx6D1q8HeybVBg0YJCwjzR/LAcHVBFwsbNFi4E0K0zqW/rE8imc0bysDqjxug3A05f97j4SIv+NsDLCG4IvXfgkwBaBLSO0V0u4O41OLkn128+wAi3AhwxHl6uEDYN2g2JDOwgQFjOxZvYcpl55uT3mHJKIgoY4ToBjpggBB4FamICiSIbhggyCM1ec/O6AizlcU9gU/J2EiDzpreSlOkaC9bn3HwEzcVJq6U4VUMA9wNG4OwIBDaMotoBP5nnMEmP8sRz84hGywVotRSHKjMwVEwaE/ARG5cYiD6xEAV8yrl1D0x5K8dLLGNTWL+U85/KudL/GbzVMiwTUkE2bYMCWsnhruAgeySpaAALgAZCbAU4ax8ShjUhOMiKTzI/ckyETznO072U6WrZwqliY8YrIIBbFElnNusYN5wlndEkuXZmUJTcp6m4ca5enYop53CRyC4doHlhLSCqzw+BxxLJqai4IIQg4ChFFjZnBqgTEO8SsM00ktIu41rqmJnbZOaCgs6ex6l2E2BKo+AgVMiCvU8CSat71wxr1zNcz/ndlqWvk6x2aBjoCK5DZrHGtoztKCdyWndcANAVhqvfmbYCY8nkAVi9xWivYq4TEngteZY5gb0JGPWGNQ8AzAhrh37tRsddYqSHpcP2BcLVVwgIywT4h06A6aXUHwwg5SiOC6mTromZoatFR2TGMAW5j+sZy/tAewlQSGx9FJlt35V1WdouwTzLe4zTL/bwm147PbGeXQqoirmNo31A3hswMISx9O87tRpYzIcrBQV7Tgb8qICUahPg22i/cCyf+gjsTHsuAwpOWgIcr2V51mkcjv2eT6MC2ubghf1r96SwbZ9aNqwFXjMwaRbFQ6CyAuQH6pxz26vVIOwUGGul0o9IedvAPiuznefGBEg8dY9Reak9NgigVrTYA3L1uKbmsED51D3N3CuqMxPzKgSRwLbnVbLLxBM5s2u1GyPjrJblnC2jVvciMcq7zf7NYM3+TZKumZzjzLJv0q8K5moZCbwd502OKXVEqe+kZHXbpLFvge3+rWebbbbZvpzsJ4eH+F8/+AX8q+uvxK9pzx/p2l8OG/xiuMIDfoL7tyN27d5pttlmm+1Zsq8B8AoE9L3Gnfyk7dNv/zT+/b/3B/G7vv6P4Nu+8nc88vXMjL/xN/59/ON//A/QdXOAzWyzzfb+sOcb8FWzTo5aNpESMjA6rs4pGrPJ9PwpwFfNbrxr1kod2V9fF/X/OJZvs4yBGtCyUnR6TZ0PTMsZ1c1lMGUkZze6hifl9UbOtTrfr217QHF8TbFigH3Gp7IRLFPIlmfqgHgNmFxZYedMyB7FgLiLaLoeaDxo3WZGWmHBjecN9QHtgwGua2UKtTGBJ4z2rEPTBgy9B7YOi3tOJEI90N8OcKsBDCBsG9DWw/WU82QqMxBIn10BXzLrzwGxFXCKhwLsFmln7agCyBX5WxNEkJyFbKWnbCAAJQewJ2ConJ81Y80RRsgTJWCdnORHNM+LgL4H5KdqGcmbyji/E3Ne8k8n9jiisD3HAAJlVjQ3wj4MC4e4pMTKNAAfKhCOzNjZZSbhiXqcUMYZQJF+nmq2lkPVsQSuEYozOUvac2KkegFc3QA0V5xlbVkLsHVXhqQdWq2z08k1rkM+daLiRCVfb15fTZ/kZ6BeWrWPCAJeVxKUFgS33/M6zuP7WLY1e5FAzix6U9dUWJJBZiDQdHudOWDA5dx3rupXkjVfcsnyCNi0wEgN7taBS+U+cnzEGtf3SjJZXsfAd36VKCMZBXfSdSQmIQYiZHa0G7SQcn1M06fphSHrdqkOMiFH71SRXJb6chD2d+5DosRSVpl7znODmNGvHfozQn8ryvEgOXUpUgaes1QzCVjvY1mrFGi36rYaXON6vQ8EsGYgLFJADCdmuk+Ab5BnR8er2QLL+wGLNzYT7N6ynkqncun8Kdbf4zrx6sC2R7nU5lJVkC6yrN9TgViHrNoT7CluKOh7aP8wUQaAAqxqGTewSYdoLTl8ncRbvZerA5FGiiR+//PRClZgcK1uckSOOzNpbV1u0o6pV68CzhN5bqfKGPXrobmhZeZgvSP9bcuw4PdN5PcsK/i689qS67eWf67bJHl/fd6XTzrWD+W/NcDrtc+jlXueSsliy3uEPa9cVv1NURs5wMWSqmO22Wab7cvYvhB3+EK3w+9evoxfg5sBvpEZW0R8KXYz03a22WZDDIztw4ju6v0XkLEJAQ9DQHicvzVfBPCVT7xKN7K7my/ih3/pr+Frb387PnbyTbh162V4fzOoY7e7wsXFPfzET/yX+Omf/nvvck1nm2222d47e74BX5Usm3KgqnzaMEIRR59pqDzlwH6kfu2cCXHsmBkxHrn8PgylDHXEqFSzZWKo7Jy9pgaAnRuzc7XMqVxfNWBdvawzswLIEnJ7Fhkc+uKITPWmpgF3RhZO5ZOBsfPSSvg5PwZ9Y0LBauuH4riybVQzzAxKwNxIDrCWk5wyZsTX3wCdncL5V8BLD249YuOE4dZFcd4nwA9Ekh8zFXdyawufGDH94NF1Deiza6w2hGYLbF8CwprR3OlAxLi6WgJbB9oV1iA7ZBaxSjmzZ4QlwQUIqMFyzuCEESwMNM7XZNCmBdAIoCT5X0vP0hBFojhJEVNwcNsBOc9kI3PAX+4EEPbSpwwH8h6MIKxE7wXIciKPztr/QJJ09Am8F+1U8l6ubxrwblckCc0YyP/X5CIiAjjKaVMbzkdg+lLTgNZroG2F5Z+Y9rTt0ncHXjbgZYuwajCcNogtoT9xJferGb/MskU5pmCXzYkKoDARGSJnS8IWVPCPGJLrNn0GG2BT66/sbyplarlOwUlKrMWhMGCjJ/gdY3kPuPxKOY86lRMWgEoc3QRuWPARC3ZGAdi4USCT8++UcBkKlGWdvWM4F4U97DkHM0gbksOehGlpQUTtG5tDl6BzmkfAbvSJicoY5W2fypXM0LHg3Ie+E+Zq7B1CK5LO9ppa4lqk1hnElHFNECeZbOTAjLhgcMvAQtqPKP3iO4LfyruGWw9Oz53NwT3KQc/IMs/C3EfJr2swcG6oyGWn+RMiYdnK4tKnfOFxUe6T1QsSaAsIKBobOc/v5LewYPidrD05R7XpouYS8BvG+o1O6tsoA95JvRiZpcwkUvnlfhKIMJx6hIWwat3A8D3QbCKGFWE487j7TUBso9S9ETUKCk6Yzd3/n71//bFlyfLDsN+KyNy7qs4599W3+3bPTM9whiApjzygKFIPPyAZoEEQsgEbhgzYov4BfxQsA4a/2tBHA4YBA5ZgW/CLNgRZBGWDsAlbMomhTHLIIWaGmgdnhmQ/prvv+7yqau/MiOUPa62IFZG5d9W599x77rmdCzinduXOjFjxyMyo9Yvfb9Vc6HYvhkQC5M7aDrVwkDk4X1aVhLyH5N8OwKPvJ1x8cIPh5hLTw4ibdwjjtfTLcCP303DL2D2ZEG5mhKPK4yeWd0e5j1Uy3NQnyrogVEDIAPuSquBzBAlsk5V77/byzctrzmyy4SzvUH9OD4L6lA6+zJPSw5WhypxwEsDt2bOp+84zQVfK4HSivdYuJ2G8sFNM1jVfyyY2V5YHtO+SyHZAbwPsOsZ0w8bOXGSTZU2W6jV+jeX7fy1nr/fX3qnn2mnu21rRs4KT20Xh5Z0NTLRxSqjrXA9gW7qOaV6fX7257woYG+MSxPXHVlKAeECX+nV5z+a17xZr/1S+o2EQhr5JLXf1LNKtxNixmUNbpp3nTDZRuI2hSddfqgDE/jtjOcfY/k713uEt/+Nmm2222WeyJzzjrx0/xO3L2IC82WabvfZ2/WnCX/ufvo/rT75+a6u//skn+GsffYRnvSrOa2J/+S//z/D/fPy/xb/z7/x1fPOb373XNX/rb/1H+Pf+vf8hnj375Av2brPNNtvsy7XXG/D1IC9Rkc3ktcDRuTJ6WwOTPNMhnQlQebOAzF2MnHM7+30Zn9EWTA0AvfTb+QKcvNx9WEBNDlJjNnTsjlOBRgu0nWIrnPHRAqnyu0cpqj/5OCEcjqDbAxD2ErxTNWkix5qz4PyUMD4HxicRt2+NBStJz0bQTcSDj0mAMQbmK0Z6lLCLGZwJnAjkJGK9hKpJpYYjAFTmYWH3ujtTmGmkgJUUZvklSYGvAghlQ7pQQD0eFJgvDEVen09EEsvNsolCADOumxCCY5nziTG2hnLQwGxQ0PceLJj7mL9X7lseBdBuXOTK5hiA3QgeAtKDHfIuSl7RgQrQxaggG1DHryleQbp6oP7MCsT7XL0Loo1NKg/22jmMllHbXee/YwOd9ToDgSWPb9A8s6ygJqniADXlyaRqQU/fHu9rwwimekoILPMuQuWp7XxqqvMM2R70ru1z7XHXkbu+l2A2ELCw5gPVHL12fiaRoj7HetJuYMNWGgo+FPBlZRADiAyKBr5IfcKU1XEJCrZHYbdS16amLUBlvgKNXDaAwjYXxrl0CHMFXvKOkSdCcGzqeNBrFs8W+ZdUfoncJgLr0zwoszgTxqeM/RMGTUIJlpzX7TiRH0Nl/3rgPu0FBA4Tao5jBg5vBRzeIqTLpBtJ5B8lwviMyrPTgPA8SjXhoBLUMxAmAZXziCp1natP1h95JGHv7weMz2fdVDMU2fV4yJpPOCNez6DjLMC9tbmMk4Fp9qxEfT6tbnbhKon7ee2ELP4iV6/Lq1svXZn7a+9mO9a/99ek+e+z9rpDLnhhp+SGz13bg7L3Lfuz2LkyfB81h1+gD/p8zHdd48HzU2N2l3kZaQ+2rm0IWLMecO43VN6XcX2HnZIyXtgaq9avIU5tNGx8ckzsz7KWeZE17Zk1cM9aLtars1jfxLjceLfZZpttttmdxsz4YT7gw3zENSe8hFXbZpt9fnv8EfCDPwDe+y4wbklrX4VxBm4eZ0w3X5+11dN5xm88f45/dH2NJy8K9l4CeBfAgy/Csxezm4un+PDwA/zq/+8/xBsP3gUA/PIv/5fx7W//UjmHmfFbv/U38MEH3wcA/MZv/Kf49NOfvBJ/N9tss82+SHutAV/KWdmHDoS6D/OvB40ytzl6/Xkm12gsEs0DDM8qSRkN29e+Cl3QbY2x6o+t5WDrgctTcnA+wDwMsB3+fX9QkZ9cZwhXJgeWQbeU6vd9XtUi4Zja/jSWiElr++C0MVv0WGEce4D6RG60hTx1KWtqg419UD0n8O0B9PhZYYZgDAVIQKpsTkoC+F5+mJGHgKcP9gJSHAlXHwUM18DV+xnzJeH4JiG9OWP35gEhMOYUwFk89FK1JkUqXwDDDRAPXBhnHIG0UyCDAAT5nXVqjM8FsMgXhHAQuVGRz1XAbM6Sq07zUTMEnOAQEY5JJWutsZD2mztDZcsTACQCozKrBAy3+Z9Kfy7uH5N43u2UDReQjxPuZPW2A/z5vndGMYB2u3Kv0TQXsDc92CHvBxzfGgvQa+OzkHuHfmfjafMkr4O4JmsMOBAytNdKW+z7CvYa0BmyyPPmSMIQ5rY+VvIkZQCBkMHCgNVywsSgmRGOEeGiPpqQAeiGBA5cgDrxV0FhLQMwYBE6Nxwg3MkuB2LEmIUxPFbmapgZ82XtD9sTUC9E2fRg0uXzvnZqSC1AzH4MPMio/RNmLvLInmns+zwzIeXKPm3M4zERoMgKPFZ2LwjgEcLsHRg0ZoRRBseKDJMCrWPNBZ32tEwnYO3R/MY2H4yZTM7NKjEtDxUeJI9msvZANp8gA7sjFUB3PCqwa6xdktvZvs+X3EgecwRo0vMuILm6Z+DhjxN2n87KTG47S3yW+WRs5rrRh0CcwZEwXYnc+HiTZY6q7PXznyHcfnsGosxBAoEmQrwlXL7PSBeE6YH4CADTQ+nf4UYYuZRkrhwfSa5fmrUv5wr+2lzOI3B8GBCmEZc/fI7hk4z9+7HOFQPc3XvSlB8K4JtRlEJENjzU61Jevr/sHZ3SeWZqb+cALWP3AjVHKYWFPPAin6/PR9uxQBsGqR3z4OUinUU9VhQgbG1ltiYV7H1Z+3wCFG+kjs+Ap0Wu2so9B7KvlFNYtY1qiVu3rJVXcu9WxrO1maf5bib2KfP93jBDHbM6JWnzaPOtY1/7Y/64Py91bGzf7mY968bZn3cmt/LqmOnvZV5kPq0+c6JcxDqn/PyjlbXuGmBarvXrITuvZ/3a2tqOeaatHTtnfu7fdc3aej9n6cWeRWx5f2OE5TVGCJLGghkbUrHZZptt1tq5TUP23T+Yn+JH+bD4frPNXpn98A+BH38P+Ff/Wxvgu9lLs/enCf/rH/5wNSvMnfYWgD8H4Myfq1+a/THgcHyOf/ff/7cAVeD/t//t/z3ee+8Xm9P+6l/9X+JXf/U//PL922yzzTb7Eu21BnwBCRKX/KQlkGJgBYGHKMxf5gqoeMDXSWLWQqkNyhiY21/bl5e4fvbgrQeBz9mKJPVCBi4EJ29Iy2BT72Mpzgd+JRDdBLMWbQ7NdU1QzwcHCWjZQ8okXTCPXDDwHPPmVA7ewp4KOpY1mE5EJXhuATv2wccOaOR5Qn7yBHE3IoSAfOFug0iCW48RQfvk4fdvcfFhxNX7IygJy3b35IBwSIg3Ez755Tfw7LsZw8MJu90MZkJK5ALkKBK3xjikLCDEfAnMV1QYawZQBJMmZQFj4lG69vhmHccc5brhVnKm1ryFMl9ZgcMCwEQZn1KCyuVydPNI+5kHmWsE1CBnCMAulI0EMvTUBohZAX4IuxcswcmwAzjFl8v2vYdJ3t6xboLIGXy5R96PyFcjjm+MyDsH4CiQB6BK4JoZkxMyRpZLFKgArYFJDZhp+KgCayX1rgG9dmsN1FwDKD5kDM6wvMbLPXfYq14nGxjiAUgHAq70/EzATpjomEl8M01wTdRKqXsusvnPBX2VHNNBcllfVp8RJCduHhWU7FjDITEwo2FK9nLWlp9VPnOdby0WLX4RAYFlzEjr5Xq/5UH+hZkRprZdZIAwqd/a1wIck4D8CoByBFJkN2YsEt2RQUF8zBngJMh+vBWp4rIhIzHChLK5oyFYM+S+UqDX8g/LWFrH2sn1Y95F2azQ7zqgunGEMtRP+bkAyl2fUyKRmd8xopbJEYi3hN1TIN5khCmDYyjS0qzPG8/ObnLEa33zwxHpwuSopa/DzLh9K+LZzwUc39JNXIkQrwPGp0GeiQklt26ZGwru2/1weEfGfPdY+m+4FtC3yIrfAHFikG5mkI0TJHm6dxHEEXkM5Z1IU5L2lF0blaFuUu+IAI+xWQM0ILGlnGjGhcqz6N62WkYFYXkFbOtB4IYhCrQg28l68+IaAEswGIBJ/fq0EY31oN9KeWVDmR3rAUmTN/Zl6DwrILBbd1CMLUjpwdF+/WHvMS9B7PvMt8nJMPt+4Myg/kFsfcK5AvCOheuBzlWw1DN2fb9Yff7dH2MFuE+VZ/3gy2s2G1Yp7mYNl7uxgJPKLv3s13ehgsSlDF6fd2XzCBZzZwEor4DFQLfG1f40Geo1gJcMEO2u9etKAHW93QO1a7LM/fd+Xe3rsM2Yzd8J3VreS8GvrfOtDAdoG0gt94KeP83L+jfbbLPNfsrt3735Af7G8RP8Tx78Ih7SMhz2/XyL35mf45M8rVy92WabbbbZ62J/5a/8L/Crv/p/a4797u/+nVfkzWabbbbZl2evNeDLJrt7Km5q4JWxqZykYgN02jFvxuqNHRDan3cqWNrLqwUos5LWr3kBidpVSTcPBPeB5LVyLaemXesCRnLsRMC2Z6X4nHt9/r1T1gchT4G8J69vg1yLsowxHEgC4X3fMkt+2cMBtN/JhoAQNUBm5SjIEgLiswPiMyDe7kXi82YCXR8EPLzaCyP3rRmXFxOGkDElxxIhGSseIMAUAxiFiTYkKiBMmATUiDNQ5H1drl8Dr5JKmCJD7l42gEZANdK21hyxXIE0ggDBQN38oP3JUe8R2wSgYCGSdgRzyRkqzHpIcJlZ88a15QGQc7LmBPaMbCbJf/dlWIzCFgq1XXk/Il9Krt50KaxLA8V7kFE+dICuHYutRHE9d8UPwzv1ew9Wlu+D+92+9gw9BX49M7SwFrvqZC7Uo+EIlQ9HmV+ICrJwEJYvIDl7NW+kMW7lHCsXhTFrOXctX22Dnxhw2m+mgZuT2WFpK8+o8j2115pEcC87rZBw8dFy/Zbvo4C31D1qiASstfaRnl/qyNovkRfjxFHaauUAEOBV+zhMjHjkcn8CWj9ZO5Yy1+VXm0seZPSW5YHCYxA2+Qrg2+TftdzP6t6iPJvuxkQPaADnMAHDc0aYtN4hFKD3nDK2lU0sucoth7O1NQ+E+Ypw+82MfJFljs+EcCQMz+1aFDZy46uC8QCKDH7e6QaahLrJwvrDfhawWDe9DEE2V4ye2Whgrd37vjPlGQ7bMJPluVhSAvjUAqfev59n00sBkez3FSZnf4lnuwLLNcQpu4+EspmtEQzsax1YuaDbGOfL8cf75YEHojm35Zh5UHOFmXq2DWvH7psqpB+Lu/IH29rtjnQZfmPbYt117ry7xm3t+vvMzVPl9pv6eqD8VBl39bEHkq2spuwVUNQuPdUeA2a7a/0au3xek1l+gXX7qqrOmqrPqbVt/53lD7bjzkp7md2a/p6s6c0222yznwL7jfkZfpQO+Dcvv4M3eQXwTbf4p/n2FXi22WabbfblGTPj8Tzj0y8rNvcK7Pd//+/h93//771qNzbbbLPNvnR7rQFf08hlk3+zn57Nu6bXaawbDwBbeR4ADlTyfTZSzoGkrtkxbYcoP32gJnOVe7b6eom4XpbNzvNBGrvGsVoLO8AHm4qUoGMX5bwASAkQsNf8UCZBkYFzzBPpChco9cG2zJVF4vMFEtAwcqweA8/7wJ4xTHqJxHO5fD3rwdoEVKavMnMoAjyvB8/45haggPDwApwy8k5uB/LtHQJyjBLsjwJspasRkRnpwQ7f/wsPcPudCd987zFSJswp4nA7Is0BfFT21cCYHzBoIoSZkC7EnzwGjM8Iw1MgXWiVE8CDdHPeowBH0yMBPC5/wsgDYVLJUo4iBx0Pysqdc527AGjKAgiFgACAE2uOSpm7VZqUkYegzZa5RjMLey1GYcNkN4dtDGIE5QxObgd0HwANBBoGCZyOkDkWY5GfRP5M4jF3GxHC5YWwe48T8jceID/c4fD2HnkneURFopc1/7GwDb2ZzHNSye08koBrHjgxABWoEzG3IGkxbjA4ObQyxY25mKP6lSqI7zcAWC5nmAtEStAVgD4CwMzYPZHfD++SsBJRwXyOrs2zgJurkjyZBCRugF3AI4dEjCHmwoZOF6EFqO1yqixc6SObUzoGDAFhVR45D3JuSFyASGPz2tgRV5ZYkb0OUh7N8tP+NX2tFFFj9cKNJ2v/IzsA2rVB5O0J4YaQ9wEhJhAp/5BFgn18mpAuhIWbdxXgLfm6owOnCQryc/l93lOZD2HWXLpJ+oISY74akEcgZ0LKhBhYFAWiSpSrnDFlfbZobltGnZuUADLWtgLckr9bOiJMwO5T4NH3ZxAz8j5ivoiNFDkxlPmrOYpTfdaLygYwXwQBZq0tGbj+VsTNN0USHxOBbgPCIWB4Ttg9Ydy+Ixtm4o3NN2lDSCLlbH15+YGM4eEtKv7sPhXfpofS73kgzJfS3uGasXuacfHBQeWpBZQvMuSD9lEklcqHtEPnK+kOnjK/PYDq1w7uvU+ZgTmB57nKL78E65UtvJRz2fgEVIlioG4QWJPi9b75z/79b+UrM4btvePB3ruAaPM3BpE8Tnl5jWeqlrVDbP32rN9T+WPNnyJ537WlZ+z6a4D2OpcrWQ5R/XkqB3JfXmE8p0U/SH2pkeUufUOhpKOgWMuxMuUZ5cBR+9xLTVvfGCCt67gWLNbrPTDp5awpyBrA3k1YGR/nm19X1jqWa3Qvs1nKNtUZL/fsgVoDa3WNTrtR+rBbj5BffxffcnOM5EQUNZkV/0orPGO/B2A9kz/GdVawzwFu5ak8c8m9q2smYcC37fcAfQPW2waj+wL4m2222WY/ZfYhT/hLj39TUtV09ivDA/xXd2+/Aq8222yzzb48SwD+Vz/8If7g9vazyTlvttlmm232lbXXHvDtWTeABqDXZNT6zz4Ya2xeA1Yb+Uy3i7+XdvblembPXWwQHxDqfQMWAaiT168xDFzAcCENfYLVUwJCa4wD2KUub15vfdCuBDg7RsOp89fqspxk3r/2pGW5a1KLJjXdlcHHCQi3oIPsaAshFADUgvisAIyBARQBMJAvR8xXg+TKHBmHacA0R8xzwHyIwDGApgCa1X8D1bwLBOSxlc7lIABNzArMsPwufgjoZ5LPeVTAaATSBeH45oiLKQkDL3Md6tyhjNT1nbHkA9djgPS/5clWmd+m34cITG7enGIy6bhQ1nG0IK7KLPOEet3LDkzGCLq8RH7zIdKbF0gXsYyxAE4KLlp3BBTmrgGqkgO5Hm+YgqjgH9CBv735R5Uvh9vrPFBcP1epU2OoGkPSqivgm2do6/HxOivArV1shds/JrlVg8miSm5fahrpsF1jqJojTKpcX0/kyJguCeMNEA8CmDEDCEDWPm1YuFqPZ3EuGK6MAn6WXL72yFIm+inmqi/DfGYWYJli92SjgrcqcMxlnBoZZmOElz0QXH6hLHmXw5TBA6lfFdiWZzeqQkX3aLayi4T3qUevylU3TR5Y5KZHIGRqGbKEZm6JnLeba1GeNcTybAED8UCIB0Y8OMBT51qOVPqrYb0bUEUOILW+cu4e3iR5jjIQjgHhKFLYIuNMGG5RGMbpQpi89r1JPec9MBvzG3JumFHyCEfLX7wH8o4RDiTnTAyac2ErN775zS32uwFzzbOwPjelne7a1TKyvI8/L+DryuU73qerZoDfGuh2hinc2+LdfOfapwOav2hr1CccANozRtdy295h1Ld1DexdXnTSv16+eFG+P+9U/91nLO/LVvZlnmlrL8+8KuXsjPs128o5dt6qHHMnc7yqeuPqWMg9A1Xq+Q7m68kcj3dtSDQf+nNsE6Z9Blrmrp7fA7cL8+cZ2O0B8P7Zs9lmm222WWMM4GmX9mkHwp8aHuAb4auTG/WX4iX2CPjd9HxLx77ZZpu9dLvJGbcvkmrILAD4WQDfeNkefQ77EMAnAL6+hOXNNttss3vbaw/4erausW8WIGoBsGgRAKE5VeDXLDlwMIYKCAetb05t0MbqaMBX911QMMUDzJ5lvBYYNvOsgdLsgi7U+lzwyQcNaRBWgYCba3tY0QayB2ENswHgvk6i84HC1bx0LpjqwXDPKmnaWwOL3tsiXdsECkPLeracs5SbgCgF6tP4SlnTETxPGG7fkt9jBCiAYxAGLBEQ5XcuoIYgI+lqxPRoKGzdm5sd5sMAngLoGEAHQjxSAa3SpQOqLC8mQeSgB8ZwrccGybdKiXF4W4FHBSEM3KIsbLc8yJzOO8b8gHD7TsTu04CQM8KcW2DKmGtUwUuTJBU2qlvkJRY280igI7dzk03aWe4Lu38oBAH5jE3dB4gpACFL2TZ2MSruRYW99NKlnocB/PAStz/7EHkXkEfNkZqAcBQmqpnlejU2r/hdwUmfm9eAvwKUWVP9/gYPqjlwFyzjLHUK6MnZ4a8Z6KVrLecrgLqAVZDNg4KU63ll/FmYjHkk2VyQAAx6b0QGxYw8SUJZjgyTa2YmzUsuhRFDc+gacMce60IMGchBgNLA4IFxfCMgTsD4JIMuAigQcqAiL8zZPSldW8vvJKB7nADKLABxEkZ21nGqOT9R5ZpbnLqy9g1gVYJaSgExZuQUyq7WHoxH0B+zPm4dxlfkj4cqC12+TyYhnRGOBA4RhnnaY0A2dHCbQ5oVXLbnl24IaYBs/7q6CMg7AZuLjPfAyDtGmkk2jGR7XqCWpW3hIHmI7XmV9lzOyaPkvI2PJVd4vJ2RLoeSezePJGC2+ip5xXkBjPfmpdEP7zDSJQOJEG5FrWBUKef5Eth/yghH8T+P8ryjTALWJiDtCfMFgAt9Nh4kf+9ww7h9VyraPWZMD4Xdm3YAzcBwYIRjBmVGDiTPvBXQqM2Z7dYKpr6h56FsEjJW4gpgo2w9nj4Dw9fXRYRV1ugdQGUBEH2uX9vItfY+9ube20TDEnQ8J9d7X+s3bPVgYM/WBepmI3/sFMi55tOpTUre+g1NfW5hO7ZSh7B0u+v8eWt5ck+ZAda26SdzYXc347eWd9jM5bxdgPV9/zS+rYC+p65bO1elt5t545Vk+qYbA3rtuFub+ny9pGtUk2BelTOe5tIu1jVILduBuJ6dq/UY27eswX1wzNb0HRgNv3HRGLs2ZtO0ztztfDm78dE2kHgz3zcZ580222yzF7Irivjzu3ewf4GNb1+kERH+7PgGfilO+IObaxxP7ire7KfS7tocttlmZ4xN4fGzWgTwzwK4elkevQT7PoB//Kqd2GyzzTb7atjrDfjmXCOxIbicvi4o68BcUnllk2ws5wlaUc8PPuIPZf/q9ybjvAjOCFCCIbZ12/V9AObcwqxn7XrGrn3fsIpzBT8NfANq3+TcyuBBA0enXvBEcr4H+c6dX66rwUguQSycDvz2QcmE9YBidosRH2BLbiwM+C2BthqcLeynE2xofvwEND9AGCI4B3AI4L3KOAcqYC9lA0eBkDLiMWN8MmBOhGkS9I+SyLsGBVryCICAeFtBXg/chASEqQJXJrcak7DYLF+q5PglHN+Qa+ItBBRKym67AG7fJjy4GhCfR9BhAoVQZJ7Z8ti6zQ9MApoAOocMXQ4oYy9tV5SZNH+vbazIdl+MpS8JENDWj7sLyNu84pQWQD0zgXQOfV7gN1xdgR48wPxL30G6kly9llPVSwznQdnbEQXsbSLA/jYkFDZkk6tXgWAOkjfXj68Be0AFZGUTgIF4HThAKHK1PRu8MHsDSe5RA4YN6CUoaGWdIDmiaSaEKSPMsUqGR5HJZXbNJYics/c/qM/E7a1jYGEEkAg8rwEsQNoR8lCB0ApCowHHS3lU+8aDqjlq0Lvrr5JHmOv5pb8zFvndm7y0TMiZMAwZIWakaNLeVPq0uGbXUXuc3fEGBM8CXBpA4JmvrHOo5gKm8jkkruxlZZxyqMXC5J71eUQp4/gwCJCZgtxDIQOZECZhsRJrnUPX/wZk5grYWp9yBJLm+6UZuPiIsXtu7F59Ltj4JK59QpD72421tEcY4ZQYerc3+XwpAeEmYLghyTWdoUxw+YcROLwtKgEXH4rUM2VhB7M+H+NBQHlSqe/5gRtHEnbw9KYwn+kZ4eKThDgJu7dXC7F7ST7LM1EksVWinFnk82Ui6boB+n7g+oz06wQ9XqR5X/QP7HPnm9ytz/ltcsAUUBBCD1Sek0IG7mRenjTP8ExSLsVQ222Szw70XC3PgM1eotm32TaX2fvmVIB2bV1xAqA9yfTtgeFTG9a6OnzeZN/v96rrFGO4jPcKWN23ydZCBjJq2o5G02Cl30w2upF+9jLadsxSNHjz567V4efpChO3yEp7X/ogdwPoOqlondP9mrcwgaMsqqwOTqmC5v060nw6lR/Y1p79ut7LNOcsYK6xbv1mUZNiT6l9Vrh6FmCvKff488exvc6+3+ScN9tss8022+zrZykB/+BvAt/4NvDL/8Kr9maz19T+sydP8P/99FP86Hh81a5sttlmm232BdjrDfh6hqyZBv9KoH8F4Fv9bk0euJFyDu13PoBoeXozA5oHFWklENf7fs569u6a1HLHQLh3eXf55QFlszWGjQX8mr5ABRXvI/Xog8pebtE+N4HLe7Z1zbzEdA+y3R5EXni+EvBrADINAvY2bePmc5gYuyfy/RSDAD5ZWZR2qgOfDDCsYJnmZVWABcQlz2QgAWs4KgA4C2iTLoBMAHV3Lg+MdEmYLwOGiwHDkxkMq1QAQl7Mdy7goUg2r/UbAYHBCCBOUl7UeyHb91TnF0ed+44969lugALPYRGcpJw1cB/W78f7WoigBw9Ajx5gemMUZm8Ued0yJixj0YO9JmFbmm97SjzI64FLdCBli5c29dm1qz3twOP1E/Rr86UDg0vdnV9WHmVovuIgKZPZHOK2YMaiAVybpgdcuwt+1DlNEAnyWM9ZtMMAR+87dfVxBSwNBPXg5EIS+UzfLRplTVdmLEcueWxLP3D9tWl/M16s8tfOsmz4aPI4+xMsiH/OX1r2ncl4Sx1SftrLM4KZyj9k8SGk2pm88gqpBbv2aD08KBN+BnbPGOHQPj/YdY6NSSPp7LuSxNc4seBPRMLW1Q0xZP2V0IDHAlQTMikL+SDMXUpynV0fZpFtNvA57ahK4jM0f7Kwl23TRbzJyhYnWG5gPyb+nl6MQbltyiSStYWtSQrTbwU05fzZJJhfwPryCxB8CuC8D5OlBxHPfa+/CwP1RFk+z+9KbmCfv/Yz2x1tO7kp7bMwhV+W6fx44bafaqeVtwY838f83FGwuC1eyj6ZK3alrnvnlS35ptt1ZiN93R939Z1k4srJblNaV+/a+f6zB3lPsWh9+/o0MZ1qyl226KtO6aaypFdA4wI+f47182abbbbZZptt9hUyBj5+Hwjn/rjb7HU0AvDuOOId28z3Bdr7xyN+6/nzz14AA3gOcfoC94/DbLbZZptt9qXY6w34AgBRkXJm29FP5CQyu8Bn7kDSXoLNBWt5iFq2MiSVwSgsAK6s3+gYG/ad38Xfy8p5Vq7P3RWDSqiyAJClvAzMc1ueMSB9QKvP32VmdVg7LXeZ60M2ul0vGwk0bNnCuFkJIFMMYMuXa/5ZP5ECosZs6gPhKQHjACDKZ6tPyyciIJocYBe48nLWhfVLEkTm3LGe1D/XP/n2FgFAuLgAX+5BGEEpS1ssr6MzHgjhZkY8JHzr1xhP/tgOn/7JUNifhfU3oDI6XRyOZgKPjPzGDB6jMMwg51FSydEM7J6Ij2knIBcbc24Apje4gGDhIPlWj28ynn0nIu0u8MZvH5TJmkSSmgjhmCRXZVR2DxF4P4DmjFC0cNUV0vspSFCUkIHJ9TURMCj2ldycCSojzjYeGYIwogH0aRhggD4bYyVGUErKrDPWcK4yiPcwGncIb72J/Avv4fCNC8xXUfoosbBaR22XglQGUAnTV9s9ys+QFAcz4K8DfT0wRexy2tp8UbCJJlTATa8PMxdAr+TiVSYnpXqsbk4RpiNDwX+iFkxl1lzTCu6q/LGxMUPKiAfGcC3zq1gmcDInFLhMBJrcvNdNCuz8Mea5lAHUx4f0QoiMFKx9AnyRkpjSDmWu27zO9jeN4WcZBaBnqr7U9ulnG55o9x4puA0gSh+j9BchzMIG9RaIMQwZh71QielgvlAFpLky8fMFl3EUJiiAXUYYsuB+mUBHwvhU2syBkMdQNlfkEIS1anOWUcBbA1LJPTPixKVtIXHpNwQgjwHTA0K6YoxDQmJCmqMAqDpvy/wiV5/OU5F5Zv3s5mRk8MiIh4B4Q7j6yUGlpwPyKB1vj4xSXmaEzPqMQblnOJD0SWbsP5mQ9hHHN6Lcc1TnQjgK6zxFYHhewdrjI4CYsP+US3umRyTs31GAXlM8YFJg90Lm2XAj983xXWB6wMDAoFsSmfGnR+QhKBM+uBzdBjLlMh9DzqCUK7uXWdn0ofxOSd/L/bszBnmm9SknPq+dYIcWsJczOCvD1L7XdzmnBBrcS6kv17NQ++NeQnnte5+ywfxIWDArGxlaDwraO8IDwmsSyoCoifg+6Ou2a7xUsu+rVH280xyIuGCb3sXILQzS0B6z3xup57DO3PXlGPDqN8n5+suxKO/VCKcQ0zGJ/XrOu+4AUYpBfvflF/Z2bNi1xUqZXg47tmBvrkzcRlaul53OLWO3P680n6iunXXdW9phbHCTdHYMcV/uIt/vNEvdXsI9OiUfqbisrU9KKftNl/3fBm59bmtdQNaz7P5GqazrXJm+QAP0LhjB0dbUX+wmk80222yzzTbbbLPNPp/tQ8C/9d3v4ju7r04e8ZM2A/hbAL4DYCOab7bZZpt95ez1B3xfwAoz7C6264rcMp1j7HoGY2HCrgR8ehC2MIi6YFlfv5eN86zI3jwQagEon+PWndMEts6xB4AKnjZ18SLYVoKnFIDkJHnZEI0zjBILZK61K1Ar8ef7wX53VgJe4GVA9ITxPIOfXxcAiS6U4ZsBrA3lIAHx4XrC/vGAiw8jDu8weNf1nUn3KiNN0DB1SWVwOXKV5g2EvGckJsyXVMEdtXjUOGuUfKsCdFUAanpICHMAX47AJMFHuT4rsGRjQQUMpNwymYmpBlwN4LB+YM1nnCHS4cGFvm1DBLOT2zaEU8+Z7Oy0zvgGiuwiMztJz26ThvWtkzINV1fA5QXwzpuY3txjeiigUpFSRgXX2jFqf5oEbBPTtzi3c7lnMgq7zxXbAcXrjW39YP3ZSOR6H/3pDmS2DS4N29WVnZWBHg46F60f7FFIGhDPJOxUBdaMqUuZ2tzC5ruChQhANnapNT6wME9jLav0ixURqJU3VqDdf7fWTw2oDmlL6SLDu4ydrvfK4lrtYMbK64CscKp1U3Xe7j3xk0EDIzg6L2UBlwF9Vijgn904NX1p4DEDVAbFj38FcMnuR91MkjUPuLzWRKa6yFzbIx5oNg+U+aX9YrmfbQOCXRcOhOEWoCmXtlDm4k/ZOGISvXDtWpm7NDMCZcRDwHSJkpO8TBtl+ZqcM0fLaS65egWwZ6RBvguOEeznVy/nLZtjap/Waar3EOuzLrZgnkinc50gzbPHvT+z/uzXFos8pgIgfSnWyzf7r2Ksvvm9PvdhfvZgb9m8FRbfe9CWueuLU3LJ5+o/J7Hs6+7f+3e1y84/BSy7Nt1bIvdUnWtrEvt9DZj25fj29d+VMjr/+mt6X86ZZ9j2ctquDWt90gCPtob0EuKu/DstdIzgNcWZ3rwsci/v3IPctk7r1p8CvvqX/srY2z3vU4ystsGt47t6/bEedPYbUpucxC4lxiJXcLPp5B6bGTbbbLPNNgMAHDjj709P8DNxj1+Il6/anWJ7CvjnxzfwR+mA7+XbV+3OZpv9VBoz43t/7wYf/P4Rabrn3wOfwfYhYHdqPflVs4T2b8nNNttss82+MvZaA74mn1jAqrWg04KlssZMueOFTbQMmvTBokCVwUPU5gS2YLB9538Gqt+vsYJLecoo6INFniGgDAky5rDPG9azFprmL8FfZq7x+lOyh/fJQ0euH+ACkiYDDP0c4noAd8XEnwBMUwuc63cNkxpoWTUnjFNCfvoUIZDgOpc7KcckfgkVBMsQligx4tNbXHw8IO0J06OAvHegn4FlSfJpCoMS4AGVRZmVqal5TjkzUg4C4jIhHoXtJoAKJL8lKzCzQ8u0BDA9AkCE+eGI+BwItxk067xSkJqUhWdADQf9zobT3Lc5mfVzUL9I28IAsWdVCVvT8pYaAMxAYZg0+fr6IQmh5u41tgwJ24mbDQd1YwGNQxlzevtN8MMrTO9e4fD2gOODoJLMXAA4SsrEc6BPYzq+hu01MsP2zwO5fg4RIeQl6LsmaWwdHXIFoLx0dGHUAi3oa48RBZcNOMwF/OIGvAf0+11Q8Iwlv3R20r8BoGjoYRTALStYqmAuQ+ZxkYhOnV/ESFpm6ZrIyHthkQKuncrqBYxh6toNyG5RSJsK8DjVthiQ6/uxENQNNC3sbckhHOaaV7YB7b0Mso2r+mrdXeLmxhhm9XvMoFlODLsECiINDYg/UZnCHOt9lgdhukqeXGrqK753fzQJM7g95kHINAJ5xwghI+eAlELJQ8xBJrExx8vctHoHABkIMyGPbrzVl3gLxBtGmHNhwdIKQi6g/nnwhhQ0ClNGvEmgN0VtAJnlNUFc8g6nvY51lGdemIXpO9xKv2YFfKPm+23SOCjDO/g54TvQzzVIW8p9k500t82HpDej9bkHe8t46HMW0PdyljVA/y5KCXw83vtdd9L69cSKUSCwKig0cr5rjM4OnCwbboB1wLBT6FhdI6wBkYHq7768U9LJdl3PRD2XH9auzV39pwDYDrCWfMPdOX68rNyOVX1SgtlLQJsPHaO3yjifmBd2XZfyopFqXmP7+noLy/jEevcciOrZwf1GAd++JuWH9icgTNuAVZaxzbNe5tnWpKfy+hafHShd1n+Wr5eoMmaLss46uFt87tf6/lrnM8XYrqstF/DahlIv/+yZ7X1uYAVu+zX6qgR2nx9cU7+sbkjwG5c222yzzTY7aTfI+BvTp/jn+RG+Gy5kyXjH+vbLsCuK+Fd3b+PvTU/w/ePt9kjfbLNXZL/3nzzHP/27N6/ajc9lzLyWxetzFqo/X/3jcrPNNttsM7XXGvBlAzXLAV4GWiyAEgNotmCTAzc1eFskmxMX4JYM6E25AriNZJ2rt2fn+mNrwdkCilENIPtAUBdMWrTpnBnbwOTgrC0OcPN/vJALYLP1kWNUVDDYBQ29FRYmavAvEIAu+NXL8DUBZdf2HjT2Mtw+GGa+NLLYXXDOB4uLs1gG5ZgLyxfTDLpQGZWLobDA8k7ZbYUJRuDdgPh8wsPvZdy+fYXDFDA/qMipAbLzFRfQIUyar/I6FMZpmAl5AOY3MnhgZCa9hhBvqICO6aKCG2GS3JbpooJ/eQfMV4RP/sQeD3804OofT0UmOY9LZkkw5l4MoDlLW4na3JRgYM4y34PIQ5P1WQh6bgYSVya8m89FhhAAhQjkpNKHy2UmmVyhXRcA5AAaXeA2BJGEVqlw2o3AbsT0M29jejjg8NaAtJP2xYmLxLGxpcPMktNzJJkCDgRrwDZ3+xlD2xNYs81jA+pYyrWy4sSFrVjYu3a+A46tGgOGC0is3VpkoB1gV9ivzp8iIW1SyBHIUEDyKDmnLz5lHN52zgQWsNfcHlgZ6Nwio4RFDliRTiakUc6dU0QMGUPIAlwERtoJE7aVEa7y2Sbbi9n1dwFtuzFgBs0ClGbPulJfDOitx+pnk0TuwT4irqzYWfuFan+WDQAZAqKSSGXnBGF+BelDY/cyE3iWzRzxwMWHvJPxihPX9htImVFTKBMqqF3ajfKs4qB12IYZYuQdwCMrcF3ba8AtQYHcbPctCps3RyXuW93R5pAwui8+Zlx8rGDvGGR++/eSvXOZtB6RZWYixIM9W6jIWtMkigPD9YwwjwDLM40YiDNhuJFNCXlHiDfA8JEA9yBg91R8nh7K75RR8yS7uULMCEfZ4GEbCsKRgCvJ0xzmgDABNCUwRSA6OWdApMT1fi5jA8g70e2uMdCdplQ3bdl7v7z/c90IljP4s7LtTq0FnMIBgCLnTIGwvlkG8HK8fTn2s4BrdzEwPQM0nXiH+8+ZW+CxB399jlhbR3jwdg1Q9n6eysV7zjowtqwvvG8evO5AV/lIrT++fr/h7BxovdauU9956edGSju0650GqK7gaAVttb/9WPTzpa/7PvmLM4MhqUMaoLZvm5d0TgLGLiSJV2Wi67VeslmOu/X7CjvCl1/O6dV3vPWsWmPSlvt9DYhWJq9fL3t1Hr9R08pO7S6DsrERaNNalPun+sLq5yLlifkaCMQZuF66utlmm2222dJ+L13jg9sj/vzuHbwX96/anWJ/Ml7hmxc7/L+PH+P9fHzV7my22Wavob0/Tfjf/OhH+MnxJT1DPgLwNwH8MwDeezlFbrbZZptt9vntTGTp9bUFq9dbDwg7sHOVDXwfhrCXfPTH7mP9dR60PsU8PsNIbsDbU77ex06xeX095ZeVaWR+UDgdrP4sfvn6e8D/LisAnQW3l37xPIOPR9DNQQL5rg8lh253DQljL95M2D1hjE+BeKACRFSAhcEDROJWAa2g7DRhTFJh4BmzjQcFLIYK0Bgb0vKUFqnoUL/PO8bxDcLhjYB8NQpAm7gwCxv31+Zu177mKbFgmSg45Vlvxni3sdEcf0SkufCiArcWfHbjaKCusXb1GooRGEdh9O5G0H4HGkcBe/c78NUF5gcD0mVA2lPJhxtmAXgpofw8Z33/NGaAqj/HgUz9zsaeTepBvf765jMvv/Ns44ZxjO4a++zKKEAnG8O3Ox8CfFJQsDey5KXtOsO3x+YwjBmb9Vc9waaDzzNM3q+uvQbYNj715y9danyTfvFgZHfSWr/BHrkkrGburj2Fs3lAmKpjrH0iGzKwnG8ekHV+LStwx23jTX9tAGSzEjdlsOVjpu78vnxl1XJzTPI4AwApADvcsNTj2WynHunU/XTHfX7cMOXSfzzUOssmCM21XFjSASovX+eTHZe+YZ3rKBtWqAC3bftKjuc5n5xPlLgBccsGmPtK0PaguEnrv+B7br1sB0Cufn1PH3vJ4zXzQKCT7b5rffDSbJU5SvcfB+A8gGr2AoxrXmvrfeo4ZcY4XQONT+UGXjq1fnwFYD37/SnzQPMLXLtkpd5v7FbXrj0z90XmgN6DbCo5p9aNp8Db4sNnHGdT2uk3f66u0XWjTLch8az1qgN3nb/ZZpttttlZe8YJ388H/Dgf8VGe1t9Lr8AehQE/F/a4+HqG8DZ7UZtn4PHHwGGT+d7s/nbIGb93fY0Pp+nlFHiEgL6Hl1PcZpttttlmL8dea4YvgMLaZQOYLLiqC2EelFmYcg2CNEwU2W1P01yDJh6IYhZGpzEIfC4wA8vWQGQARbbYMxzWzve/n5KEWyvffAQkSDQMKPLTOa+X4Rk5vkgrt8jz5sL04IW+4SkwWXVeSRiYy7xvPViqFLfCSHbH/TkhgxALe4GMLWoyd31bDTQ86iLGsSxM5vJUbl+eZ/n3/oeIKSE8ukB6MCJHQpgV1BlDC5SqNPIb//gGV+8P+PSP73B4m3B8JyMclFU3KrAxMBIR4k3A/mPC7bcY89sz8uMossNHkXjO+wzKIhF9fENz+XIFecNkwLAgbxwEpMuQe+H4lrQxjw/x9u88R3x8g3B9BO8G8MWgIAZgaUoLkGhIjYLDeQiS05dIAPDEIJsPjlnNIQimmEjuPWZ9ujiGizLOKQZgiMIm5wyiUFm/KvHKKcm4xVjZvPa5C7rmqwukR3vMlwFpFNAuJGFiDtd5Afyly6DsRqrgrOWZ1c8mW2zswQK0GxOVatMoV2CJfD4Xgsh3OzK/gPIk/Qi5xYID+sMsMrV5cOCklp3VRwMRPat3ASByX6+A/uPTGfE2CjucAWQCpwCKCSEw+CKBpwCeAOJQ86sqWCZS0ySKyoSS35czYZ4jOGYEEmljGjLSBSOPQerPMiZhgrJ0q48G1jX9zqgsVZ2bXPrc2i79nbU8AAiJCsvZy29zFFZ3HrTzPFCbhZVLmaq8NjsWdQAQqyS7AY0cGRgyYmSkRMKmJAEVhxvdbJAZ4ci1bvXfGMwewKxtr8zWAkrqWMvcVjbtjpBHAGNWtnIAZyrMY44qZZ7bZ6/MQ83NrHOFA0TWeWCE24B4SxifZ4zPZiBIX4e53h8NyFDmgz2jOmlxB7xSZtBhgrC9tQ9Vdnq+Angg7B/ruO7kWB6A4Uaeg/FWWMF5AOYH8vtwDSSVuDfmOWW5t1KUTTB5kD4JCibTNIP3siPBJMDzGIQJZ/NsZgWnT7zjAfBu0DUCqXw+o33Xpbs31ryAlXcYgMJKLfL3vs8d+7QtQN7zKZXrwVkkae8D6NkaoZda9hLK53LyGqs0UH3nWzkxtoxboJbbAX5lq4Jfs6wpkHizMhdriKDtr+ueBcjZsacb/335HVu6Me+rnkNE4BPs4IVUtGfmWh197l71rUohA0twP8Ly05Z12lrfnQPyfb+4sSk5e/s29+X1bF73u9kihy4gG8EUvK05bZfXSturykj52TOAiWoqCbi1sCkAmWpMUzCjUZVBfRcVpm1K51Xteqav9X9KLfPX1VG+dxviEAjk1lncrY+EHRzAn1dGfrPNNtvsp9D+X8eP8M2ww1+6+DbGTat0s6+affoB8Df+KvAr/xLwi7/8qr3ZbLPNNttss82+QvZ6A76F1WOBp9zKeLo8upIHUc/zcmzsgrNrO/CJCgjVyMYB+rkNBp4FcxXoWQKfdwC8vXmQ17MPvO8qtcvc+uVzgTXBNuralb304HrgE31w2Ri9Tg76pK2ygk9IIgIC9lkdd5lnY60wWkTmUkFfrAPjnBL4cER8fkTeRVCILqCHIk1qeUIFqGIMtwmXH4nUXt5XwCgeCUkBMh4YeS+ypWCAjgHxRsGmAZgvFbxVqdygAAtnICYFZnZyjLLIleYR4B0L0KNgUboADm8Tbt67wH4IGD94Jqy2KamMac8mQsmzCXQgYulTlDFgZe2WfKoswVEOCsz7eW3nWGC1Ya90EpmBQHFXx3AYJC91Yf6SbKIgAu9H8MWAvNegawaGg7D7goF+BmbrOBXQ1T4bQIr6GRBAaZUBSApCskp9D6TSvIweXAbQShqzAF6e6VvAQyJw4AoKOrCyqGxy/c7nQC7sz9ACveZv3hHCEaCDsZ4Bmk3GVoFc1rGMDCT5zH1wQ4G5BcNTr2cmBJ+HMnLD8jV/zGdjYpPe2gb6cj2ttKWMjyuG4eTHsT5epXyTuvZyyQTkHJQVu3Khq9A2BXAwsFjOEdxTPGYmQHN2jzep5IYtDH2Xt7fMAWvsiUemyVcbY90DqnlUhm8QSefC1OauvP61ZGoBCjqnPRc5b9t4MlyrLPWcJef3ikm7qM5hBfYL4K7tlH5XsHeWfLd5UIl6fc550DgPtV/ire69suegFZvqeOeRChDPDFBEUT/IY72XeQoQiW73Lid9DrMb8kAIx1TWE7bGoOTeQdbGYM9dKnL3RRa/bIhRMDgnka59UfDXvaMbhuk5cNGfswb2dDlhF/lj78Mu9RLFfr1w7lp/jflwn/WAjtlibeGBzn5t4vvH12Pj6m6Mk8xoLy2NE4Dyiszz4rP31V+6NhdOgfX3tczStjPAa/NMXlsr2XHv95r0s6vj5Lqvb0eucsqcetS82lou2yblg1dg8e8BD/CeKZsUaF3Nkduvyz0I28tF272u37UKOO7vC/tp15tUc39+f6z3YaUtp4xO5fXdbLPNNtvsTssAnuYZf3t6jO/GC/xCvHzVLoEA/PLwAG/nAb85P8O2neen3PJ6mqwv1L7xbeBP/Gnge78HHF7vfLabbbbZZptt9nW11xrwNRnHIslsgVQFeBcSZxYwDdQyfoEaZDnJ5HEBL7Mh1nMKU3UFDPVlnQrm+ADSKZk3L3sL1IBR42f7eRHIsoC0+dAA0qGAJxxqsMwCh00+NmMA94ygPjdcz4JZSBby8lrfx/Z5VNTLgtJ5JV9Z30/AkkWidVGUNnAOwAqDGTmBDweEJ88RHuzAlv9WwQJjfeX9UKRKw5RAh4TLDybkccR8FYSdFhnhIOAaDwTeZ2TKmC8FaAg3Aq5IDl4SptqeNS8nwEfo3EEFRAywYWVMEiHvswAPEABmvpR8odffjOC4x/jBM8nnO2l5cEAOS/7dwi60ALcHovwmCKCAHGUoIwAapA4icEEeFTbMJAHWEvjUz2u5GodBxs6A3hgq494Y4cMA7HfI+wF5J9eFxMAsjEoD5A3sFUCISv5bz7j1kslkeFl0TTdGqZsilAEEzdubtF8yGgCygItsuYR1Gg2uJAPDbWxHiCS4ns9R/nmAy4BjK99yL+dIiLmWZ2bMZ8lhLJsEKJGAfMTCCgUjREbmLP0VyzQp4Bu5z+aHWc6kmDyXaZKNFRuqJHDtE5lDDCwA7JLPlpa/GxBeMFprroGc/nHHta/IbwBw8zZnagBfk95egKQRsmEjuMuVSUs6gZil7DApuzyz5sYlzWWLwtAueZptPNdwH9I6INM+TLUtkoc6CIs81D4nm8C+EF8+1XYY6M47LtLKNBPiERifAfGYBVwe4MYPen/LPC5z2fqMIX3tzzfnLAf6nJAHQtoDGLNsMDBXg5RrYzfciOPHN4XFzREIR30VqKhE3gkDvoDLASDLU2yM7AzQRAjJvYObNYKNszSENCe5jJ8MAk1Z7lcDdJklr29AzW1eyuP2XZayqBycAbjOGrv521mfw7c/3oCPTr2jee8itqxdDxL365mOKQt064Uz7GAPhpVz11isTV7WEyBvV24+TtrmuLzW+dSwmU/JKJeGheJLs5bItZ2+vJ6Vy5llvdGXaUzoHiA/x8Q8Jye9lru3V03x79h+A2Nfhl1KtKryYudWlvRKea4MUwR5YfDRgfj9ZsXWxzXA2rVF616AwMyFNayFoVEvSam9xti45zZq+rW636BZNsCd2UTh/fK2trkT0M2oda21uCdjlDXZhvluttlmm30mu0bGr06P8S8BXw3Alwh/enyEn817/M78HMdm+9pmm30J9s2fAb7xHvDBDzfA9zUyZkYGkLaNgJttttlmPxX2WgO+wmQMJfjBxrgdVILNM34NHCQCggZrXGCEYxAQuA+q2D+71hiGwMnd9nJ+9zuRBHw9YGVMAbMiIZ1aCTcNSK3W6dkDvQycZzl0TN/Sf9Z3xhbug2tO3pkDKhOk8S9jAdj2jJYCqKfWZ/scqZW+NotRyp+q5F4BB1PtlxLwWwG7fZCwsFpM6i/Q6fSFtwfw+x8gvPkQeT/Ap8sx4KmyZVHm4vjkgAcAxusBT34+Yr4izA+UUWPSqgPj+M0EmkVKNl1IeXlUX48VAEkX0PyP1o8tOEQzIYJBHJF3XFiDHIS5d/0eYXoUQfkd7D+aMH74TMCPAHCMDWvXxoXYpK8VqBtVfzcxwnFWcCMoOKJyzwZ2BgFAMPFy3g2DzDPbEAAFqYcBNI6uUQY4d4FWBU2wG8H7HdKjPXgQCd9wdIhsAHIMLeNfQarCzA7CnjSZ4Ca/KzmAlZVxGLrbRwFxy9cMhgBjqPmYAQGoTB6Y+gV2gATlFSRrpIwDAJ32BSRUHxdsUYcC5VhZrwYaS/5maXe8BcanwPSG1qUTRhii9oxEeYaZzLFIBKsMsDLNTaYcg4DGcgv6ySl9l/YmiS6+Zeu7rIDd6PpLgVAveczaluAeAz5vsjFWK2hMysCWMcmJEIyJ6sBqma56QxEk1zaphLqdZHNQ7z8esptnAvYyE0LMYCZ5DDNAM8sGD2OHZkaYHQjK1iaRey4sZtT5ZL+HZPOj9m3eBUwPAvIuIw6MQIwpBaTZqMiyiWQBYDNacNymUUBh+MZbwu5JC+LYpgIDe6HgdXRAeh6kETyQGxsqsufy7IaCH/J9vExIiQCOCBOqXL2WaZsMwlHnho511s/o2rh7CsyX8i/vpN7xKSFdoqgqiI/1/StKDShgun9uyGd7t1rn5/Lsg7HHcy4gMAHumRfru98zJF/UynvTgTvlJpVnJ4UK1nJmBR9dfQ3w1wNK9/CtP8c/XwOWZZYvcwFOG2apfefloD1o2W8qK++N5fUW7uTMILgNZyvWgL3nlEy8PLWtgXy7+37kmnLCwNUC9q4Byb7NawxpoJW57q/11/epMHrrx86fU+7z2J5n/bo2b/ScJnXHifHngDaVil5HuZ1LttFwsUkPqP3qN/W5MquEdS5zoTzqFeilGOEZwmUN3q2LyxrFn1f8zIu2AKjSz+eAWs8mtjX3Wk7h8s5xa3r/N0AIkhojM/oNnb5/mBmkqTQ222yzzTb7etmbNOC/d/Ft/Ob8DH9/fvqq3dlss82+4sYA/nc/+hH+0c0N5m1tuNlmm232tbfXG/AFlsEVZ6fy5tGpoOR96urZAWvyxmdk5D5TnaWuO4Kx5t9d58EBpN7WmLVrdoJ105S5Fjj2DJBe3q60YckwOWV9UFAA3RYYN5+8xN+d0n3F3wQ+ZoTjhHAYkS+H1ncyFho7QA9AYsSbGTsCxqeCMOWdSK9ygrApIwP7BEYElGnJCtJKGWiBSEjwMg8CCjLXvL7C4lE51wgFcPXaAKRLQThu3o6gGYg3e9DtrCy8XHz3gLaAFgrCKzvTyzdXuXAFZe27hMo6XQP2g/5HBCLLLcc1T68fE/vZs+9DAO9G8G5EHoJjuVaQyOSbPYDb/G7NVLamZz8WFzwohuX3i/Owcl53vGfkNmW4zw2D9IQVgLPzz28sIAt82+1GAjDGW9s4UFmpVhARgwuChgZ4tDKKvwHKeJQ5af9KpSSSzmkngC/pvUIsuIb3i3x/nXiENv229ojy49yXpfNiIUdtpxPXOZ6pAq++GF/mypwiEkA8JHnPMByb3Nz2cxLuWMUiHbhn9fKCAZxHQtopgEoC+DLTarf4gw1DWb8SuWq5gSgJsD7ecM3hDO276PIaAy2b3SDyAB3jFU/cs1M2LTAMbK+bE1CBeULJPx1mHfsgGwRkI8VKG/U5at/7PMV2v7CCOIu5kFllpx24bs95/dy0w15za5u8yvqjXsNrgNB97EXXFGQ7SbDMA+tN87m2131Ge1lycv3a4bOWe5cc8l1tNTZsD3CXNUzXd2t19zl771P3Wr2lPr32BdZJL2JEVAHevv6+P8/IVC9s7Zw18B/AKgsXaNe13Rq3ueaUPLW77mQdtcDT3zn2753m1z4vet/fo55VlZv7sIc322yzzTZ7YXvOM36UDvhGGLH7At7BL2ojBXw77vFhnvDtcMBHecK0cX032+y1tW+MI741jhhfZiy5sx8dj/jB4fCFlb/ZZpttttlXx15vwJdEmpljKJ8BrIONQGWl9iCqsQnvCvKUa3gZyMmQMjxoZf5YDmAvI3kuoGVM3/64HXMshVKmHTsRYGIF7gAIuAYA8yxBLwXUGhYGszChu7x1BTAtUtLma4ZoaGpw07e9+N0BelZOz8TxcpEptYziQLVuaw+c1LSZk8cm14eFjaJli9xiFDarSQx7YwY+eYJhTpi+8xbAIudcABzzYUqAySMPAWFKCJ/OePOfANOjiKc/O+D4BgGPIKy/HUAjRFp1zMhDLICl5BslzLus+TQBmgEwSu5egDE8J9Ak+JQETqkAfqwgkOSwFLD52S8QpkcDjo8e4o0/eI74/Cj5OYlAkWA5KDGEArBSFhCXbE4SgUcd56TsxgjwEET6NecKUhrTfoYA8awSqSOV/qcs41NYkHMqddt9Ysx9YhZm7xCR3roSP6JIyvIQCmhtLEMZP2Hw5rEyLb2Us50Xj4wcqWGaegltuVB/aE7WMHMFj/Rc6h89BAXmBTzLUQG6WcBYztSCXAoek/qZdw6oKozbCogZ+BpmAbiyEZYU7GItrwLIhOHA2D1jkEnbJqoMzzUzcG+WHMNr35Njus7KlCMAiIx0wZgeEsYbmcchAZkEhLK+DckBi11/e6BT2Mt1HOR7lutZgUB9pA1z7Ssvp92wuP1jWOWnyxhkApKOT6p9TpmQhwwMDBqyMIQBZfcGkQ2egDBl5F0obHKOIkns8y0DQDblAZ0/9mwJCfpcdkCqAsiUGGkfcHxUUeTcJDg2pJhQ2NLQOTJymTuAsGDzlQwAzcLuHZ8yLj6aEA/Ssaz154GU2YrK2mVlzpIcK/1sWK6++8rnDCAEzJeE+UFGngNoCpJXWtm6bK5bvzAwXEPLYRze0jmWhEHOQ51D00NRRcg7xv4T6a/pEZd7sdzXROAYKgOZ5BkTbhPClIqsfQ5UJPwLI1hz/BY2nWcrMrdqHkBlBd4XKPJG1IJ7WVUyQmyBXC/ZDFRG5Jo1UtMnWLNrDFnPArXf1za9napr7dg5ZqoHOQOBaKjrDzvXGLCeXQsUZibnuZa1lvO4Y+jyxAuWbsP0TXq9ST1zlnFYZcx2tsaUNf97ZZeVYLJIdps6yQqzty97MY7GktX1jmM1N4CpP3fNOIMGNxa9xRNzpPcTqBv3+qHn9npbwzYS0v58YwdHUSOR8/U5YVLS/bisMWj7ptq93aQKadm2AOr4GVBrYGwvK+2BXGMF92PvfVs7Zn+39P6g9qf5XiTk82eUkt9ss8022wwA8A/n5/id+Rr//Ytv42fi/lW7U+yXhwf4U8MV/vLtj/GjfHzV7my22Waf0f7iO+/gL7zzzrkV+GabbbbZZpvd215vwBdowM0SuPXmQdZT1xtY7FmnvmwioN8xaSBxX58Bj+fq7P1ak4DzwR8fIOqkd/ufdzEXyDOAnYRePcECRy641gfa7DwLggbxlWcHAp9bqXj2iLWzyMgGlbvuAsnn8vt27eOU2j5dMCBsXEORuxRp5yDt7saDnz8HOCO881BAABs7l5cUTl6XIxUJ3ngzAwxcXgQAATwQ0pVKTWcCMoGYkC5Y5FGPhHAgAfBCEHCiMN9IZJKtrdbdChKFGQ1AaUCTHcuRMT0QVDROV9g92WP//rWCEQyRp3US12tz2BiWREW6l5IDNmKdzxy1fZHLPGcrN4hTJchrQV9UgGhhIYAvduDdgLwTsNdAmZ6pV0DYwTNC3XxS0MdAqRwNsHKBZ5smDoAS4JULY7Dk/VXwy3IGe2awz4vdMI6Ls91P88u5zA5PMHDWpZ0tX3hGJhkYHRXUJQOqGOPzDEqhYSWS961hiVfEmLILzq8+FgXAlymiGw4GYL6QsaKepur7oPRl2w/G2FTCcCu9zdI5lr+VnORzOc/jObYZIuh46fwsfhmzWR8F9iubSnLQ/nAx/DJ8Om3DZJLe/bvI+V98d8et2W4DABu7VO8fySsrGzHSCMwPAIwZISbEkJEzCYCaqY5V1HejyXA7Zqzlh0ZkYFLA94Yw3DDibdJNFKHkILY+ND/9mBmwLn1F0kUGClN9PpICIRxlbiATMFORc6akjNQk4xkP8mycrnQOZALNjMAihZ92uhHGAGYFjuOB3P1ZhyFMulljCM08CjmDJpFlZvfOobm+e/Mgee4pqfS3B3Oa96h7r9tGl8/K7rUNVSv1WM7eItvc5+o9x0C5j7T0GnB5Jlfrqvm8sXb9mi99/lkPZtqmhxWgr1iXVqKAkVb2mjTyKev7rk9ZsVZ3b+eAdG+NhLIDasv3FaRu5LnvY2ug/X3Ytv6cE8B1sxY08+1b6y9/LLv3oh1zdTXrzQ4cLuk5zm02CHWt68s5y+xtrnfrbqD9bPd9LwntGbd9PT34a9afd4rZu8JqbnxxxxvZ6FP1bLbZZptt9kLGABIYvz4/wY/zHv/c8AjhK/BsDfq3wp8Z3sB38gG/Pj/deL6bbfYaWgAwfAWeKZttttlmm3097LUGfIs8aq4sKDlANfpu57o8io2tya35wFMvE8fcMlUD1VissTT63LznzHLRrvndl7FS5irA69tiZVqgy7fXJAmDgKxNjlvENpjtrZdyjhr8m+fCCm6ZOK5dfVC8fFaEJUAILJmBcEfAGi7otcKkWPSRtlOqtoBhDZCfAn3z9TVomkG335RcttGBvYpuGeuuSM5GiDTqYRZ2GAFpt8N8pfPFx/AZ4H0GZgKOwuiNR2UrFmBNAJOguX0NcLTrKUu/BUUBWUGqPLLklVWgZ37AyHsC5YjpMmB8MiDczqCUVI4ZICgLJXZjVJjs+isFYTbb/A1omNXyWZCgcq/6wbP7qNlYoYCaz79t1ccA3g1IVyN4DA1jdwE+GjhnY6R9pt1VwLvCfHQgVp/ntTcPHpG21UC6FOt1vaStlyL20s69FclkvT1Le6h8bEFPPWjXNIBeABiEYDlqgzBPw0ygJMAgF7BVwSMCKBg4775jCDjHKIBzAWRZziGVFiZDZyH+pAsHdK61tTlYfS8gr/8u2NiiMJ9t/OIk/hoAXMA+BxT78c1MFbs1/4jLPY3cXseRmzFZNkjue5/DeQHu21xLtX3I7jyW91Qe7LlSfSCVikaWvL/pAqAxI0ZjWAOsrGR7vog0vOblDrrJR+vOAwvYS9X3eCsgazjMSBcDeCDk0e82qH56lrzlis6D5jTP0nhhz+oroADXWfpzzPJcU3A3zALu5lH7ZmZEVZ06vknFx+FW8tNOD4WVny64+q85pg38lz6s916YtU9jfR8aiB6OSdQCBmMGcmH/mqIDZ4BY3lWcVXmANBd4dsPt33v2LvwsDF9g+e7svzbZ5lNywHKS+nUPELiR9PV5R7t3P6kEsJc3XgP4zsnselOgv7/e52e1/MS0sqmsYYsaoKjnLkBCa++9pJ3rOovRXe/NlVfyJ58qf03u+RQI3+cZXrOVtpS1WX/emtm6tx8nvx5eA/sbxmxoQNWmbr9pcA3QPlF+ZR47Vi3c3OtB3G7t58tt8vF6dq+/tmPy0kp55K9VgLZhApvizn3klbtzSmoSWzt3bSrXuPL7VCWb1PNmm2222RdjDOC35uf4IEz4Z4eHGBiIXwGAhojwK+NDfCuN+Ifzs7KUmjfo96fDOANJ43Bfgfn4dbScGHnme+2X/SpaYsbEjPxZNh9vttlmm232WtprDfhKoFU/J5E4q8DvcrFTmINrwSELZjKLFK0d88EmYmHw9qwCH6AyxqqXXEsrL1aTyO2liK2Mng20tuvf5Ov873BBKcc8KDLOKdXvx7H46uXuvMxz7SfHACmBu/NBXCICl3xzHjg8EYxek9yzIKaXkHb9RJzVtzZIJ9dqO309RUaxDbbyHcFonieEH72PcHkJfnSF/PACvAsKOonMswVLg2d46Ljtf/QU8eYSlx/twHHE4S3C/M0MjBk8AsgEJsb8EALEsTL0FEgDyaaGYCBGRJWfhQAm4VaYbiZtTEkAYh4EqEp7Ba0GxvW3gcPbhPnyAR68n3D541vEpwcBfjMJMxYRlrO3BDYLasoyrxXcrv2b64aHnBUwowKE54sdKCVhzRXZb6plun6r0r4CHudHF8j7AWkflaVJVeK3gJBUwTkDyWxoFdhswFIDurSMkOQkA4TXpJpN4jddVMCr5gv1YICNFZXvCkDmwdJQh7lWol2jylw9MNrMaQ9wovrq221yvLQjhIN8FyZhSsq4ockpjMBAEACR5tCWBwU0jS2qTHW4/L056+aJwMgjI+2ptDlHlOd0MAV5B8Iac7SMgYJ0zXhl2Q/i+0baWNsudTDCxO27Qjubgst7yyRtTtoOYsG83Pwy4Jkjl/vCygjKguYskshhYpVwJpUYp1q3gsh5EDC02feibU87mTPB2L4ElRJnYJJ3X9rJBo4QGSFkxMDS53NYsqS1n/x8kPzeusmGBRSlibD/lDHeZJ2r6ncWyXMevLPiB0OeMVZJmBmYrc9qvxd/tMw8AhgVlBsY85V8FyZg95TLppX5EsLA53rvTQ8EYCWuzznrX8py34RJ5kPJha7Pk/EJY3xen2OVtW/AroGGVLtQ1QQKq17f6ZW9H4BIoNu5fY6NA+CVLz4r6CK7MOrvpq6xBiYWQPSMzEYPrPaKG52SBvcBQwNTwYtjDZC5BlCeY8pmbtvUs0DVTuUkXqR2AEo/NID1KfCbggDJKz7yPDfnrZoDyouPfV2cqyz02vVAC7za+Wv1+rWUz6mrc4BTqnLTa23uJLNPWQPUZtcOu65bE/sUIo27aekv6cavBpyNtLimPL5WQGQPuq6Bu4zUgr1aTt1IoBsBh/onkY03uRQqq+xgt4mwWf/XzqtrIs8MtvM64LlRqCnKKc6H3a6pt/RDru1Y1COdsNlmm2222Uuyj/KE/+PNj/Bnxzfwz42PXrU7xd4JI/7S5XcACMDzHx8+wMc833HVZq+9/aPfAH74h8C/8OeBq4ev2puvpf3gH9zi7/6fP8WzD1/P++k/e/wY//FHH+H94yb7vtlmm23202KvNeBrOfgM7D1nJ2ViFyd6sJGXx+5z/al61srp2bjA3cyAcywhV/9d8s6rPryoOQYOd3UtmCVFBnqlzb68Prj5WbbSOTbvmvW+Cbv3TD8wg59fy7lDBC52wBha/+36xAKi+O/mhHg9YUeE/ccDmAjpUQTvMmjMkj+UBUzK16ECiAwIsqJuKFjYy/na72QMXN9lSU6gsYIveZS6jm8R4iEi3u6xU4YbHSZhqinSJCDqPedI0x/3u0QawC0A4PNehwAMEXkXW8AJ1S0vuyzlAQuwd7Ve/WGgYWEbu1NcOV4i27OHm2vW6urP45XjHit2Ra8ymPvru/nRg8cclEQaCSHI7lRhi+pk8oWTgJB9StimPO8oWDYsKHCamYqkMylox0Mtj/yjmLs+QAv+lr7QarjvL6rlFYlhuHOp7zjXnwCYCVS0hvWEDJBVFDTPsi/AdQZR+zsbuzTrl11bioSz98r5bJLPq8xnoDLSSYDkPObazwZcK2hNvj7bUWBtJ1RpatvUkQkhAcONgOQipa/vWcfkrXNt5d3SzBm7adq2l9y5JiXtri1Me7ehoOTxTdYOlA0dlCDsTWN5s24i6O6VkOrjaLgFhoMqMTAAVrA383LOM1BA4I6VT35jD1w5p96nnM+/u1+GFYnntbE5wfw9B14C66Difcoom73uAXL7c84Bwp/HTpV3z3QRL2ynQNZz570MMzn0c2saa7MHnl92f5+zXvbZbI1d7Gyxpvwsdg687deFfsPnXYxZD7KurT3vu9ljsW6myvo99fwwCfPyez2vtGEDfDfbbLPNXprNYHzIE/4oH/CNNOK9sMPuPuudL9hGCvgmycagxIyfixcY8hHvb7l9v952uBGG7xf9d8ZPsR2eZ3zy/elVu/GZ7WlK+MHh8Krd2GyzzTbb7Eu01xrwNSCoiWOUYCwvji3km73EMSA5/ex7Y98SSVBqdgGcIbbAbg9UrTF3rZweeCaqwaFhEAZuzkt+ssnEMYPnWeSWfQAoVlaylz8sOXpNHi5GkLJ8eS23reX17Y+bWV66IQhokXJlY1iOvJTWY0sll58DfUuw0cnXGWuEaJ0B7QPR1veWq81L3DlWRMmt1gcYG4aKZxG769Ty7S1wnBBubhH2OyCS5JIFwEMAzSJDXFhvpPMwA3wxgo4zhpsj3vnPgcO7O3wYBtx+i0DvzNhfTsISBHB9GxFvA8IkgAQVAFylS80UnSg5ewcUOVkm+T0bcJyA4RmBRyCPLEzgyDi8LUzDw1sjHv0wYPck4eL7j0HTDEzqNwBOFeiwXJ7Uz2Nv7OStgwBhAEBTEqBkTvU+ysr2LXKIARyjAM4pg/dDzdsLaB8DSMKYzYOx72p/BShzU4EzSk4i1wOENraOzZtVArsH3JiUaRil7cSsMtgVDGMSANHnYC3XG4AWKqCVgwGEXABMpspezUM9RrkCgpRQcjaXqWCfjbGZK0DKIxXZ6TxWUJJmneos+XVDkItyMMSxv19qHUWOeCbFzUhyyDIhBMnRisDAwEh7lsA1Z6nXZJMN4DPAjoSlLpVU0C0PKMBdAY4dahonmWtpjwYItnysrOinB5OZRRKUyKRXtR8SQXJrazvBZf6CIGxmZUCTsXu1PGQqEtIy1lTZ5jp3K7uZi//2zKXMJW+vMb9L+EjnMTGQ9xHpEkgPMnZRJkvKhJwIJfcwQ1i7CpSmHWvOXq65fEedaEmYtfGWcPHJjHibkcdY5nYeqOSuzZr7lqDlBSrv2+w2ZMQjl3lImUGz3jMB4Msd8giEXQLPobRP5Ja5YcPLM03A6hxFwtnmf2E/RyAPIlsdjtJ3JiNOCRieQxQOInDxScL4LEnZKo9dZJsdszAc5cFb8hdTbScCQEd5j/EQ5B2bgUYphOy9ojbPnw+wss1SyvY1UHcB6t0HqLVrKLQMS3u/e1ne1JVl5iV6gVb22QOKfRv8hq41humKJHTDMO1Zpe685vqe6dy3Ya2c7pwilW3nW12u/xbt63P/9rZWb19/7vpmzXzqDKBbh+q70l5igdBIbp/yH6gy0B1rt6ypvNrK2sYC50ebJgTNvJLfg7BSe2DXr/vcNY1UdOYydxsQN8pc4aTr6BAWTF5pZ1x+NpawleXTs5jyjnzpnNV70rOH05JRvPS/W2Oab14Wujdd//s2NwCz/3tiHCvrmDPoKwBEbLbZZpt93ew352f47fk5/s2L7+C9uLv7gi/RAoC/uPsGfpAP+Mu3P972/Wy22WabbbbZZpv9FNnrDfgCAhQxnwd4nbFKny3ONYllM6IuV68Dg7NG09eCdr5uL8vGhgB03/cB4BBKkGphFvTqc5D5esuvXbkGfvoctgYOE1XwN9SAVAnMpSRAMalEsztnYQXUNUdc0LIJMmrwunzfjVVmh3T4hnUBVcuvF+M6o9n6qmNcLAKRQMOK4lPkYM7g4xHh2TUCM/DoQoKWJv0KtPkf5wpus4L0w9MDKDG+EQifHiKu8x7H9xi73YxxSKA3jzgMI8aPo4IaVEBfk2JFgAAoGQBIJFRnFPlSSgBNCiwqYMgBEmxXKVSG9MF8KSDT8/ciDm8EzJdvY//REcOnt5KjlwiwvJZukwFHEiDGd4/NUf2+bKrIWcC3SGAE0KD9RARAwHLMqQL9rr94P0oOURservU0jLwyv4oHFZw2sFT70MpZyAh7sNTl4/WAXdPeoNKyuYJ1AnJzPd8Bk0wOEES9zmR2ARSwr/hhYKCBeAaEuv6wKkp3mJuuTYUZqVLHwy2Qd4SZNUDO0BzWWpmByJFrXlidSyb3LCi4AItCxmaMMWGC3o+BkSMrIKfAYWIFD7DMRQw0Gxx8P0GrK/eZXUsAzdKPYabFeQb8FhDe5TgmiM+FGWsHlXEPAjB3LGBrNwMhZr0eyFnKCEcBIxsGrIHM/hnjnz/svrc+tq/IjbnOxfkyFvlqq/s4D+A5CGCtcyfM7pnh+poHBg86xhnC7tX84eEoG1dYN1LkQWXh2b07T0SNyiYPoALBLGBvmDLokGSjw9VO7hsCaJeQ4yCy9JPk7BUJZRTpa0AA5KDv3bSXzSwyp2QTSzyQ5uZVX2bIc5LlWJgAOgDDTUY4qmQ1Q4BrzX/bs/Y5kgLcbtyIQEGfh/b8MzloA5ey24xk71ifDuKzWtm0luu96q0HeU+lT6BQ3qOrgKE/7ssz69YAHpAr83pNPrln/fbyzScYn/27+iQb94wscVOfSWL3fdj1WcOU9mBsb3cxdHswu8/du+ZjP36+3xQ45zUQ75RUtvej99uVU8BWq89Leps8tC/3TJ/bmszPsfKes/vEyr1jHE0mmmIE5bycE72VPs/FF7OStkS+aBmx0W3o9Go7Pcjrj62VYXLNfs0ELNnCVpdnEzd9o2vutdQwZZOGu7b/20HXvosNnpttttlmm70US2D87ekxrnQD458YrvAL8fIVe1XXZm/TgD+/ewe/N1/je/n2FXu12WabbfYF2FMAfwjgo1ftyGabbbbZV8def8A3Z5F07o6tAaYWbPeMJP+d5PLzzAIH0JYgJuqxEvxmLABLC9D4oJEHeNfk5Oz4Oek3+z7ntl4nL8kWbOaMwurQ63ieV0FRYm6Dcz6Pmv0+OEaHC54tAsOnJBlXc8hZ/8ZlANTYRmuBz7WuKWyPlcCYtp98UM4xoRu/eCUY5/zleQY/fw7KGXQxCsBANShYmL2Jm3FBlJ90fcBwfcCjJ7eYL95Gugy4eStiDhn7ccbF1RHTmJCur8BH0hzBVAErBa1CcYsLyGNgR5ggYIaCHnZNJiiAzOW4yTuDCNNDQtpHUN4h3s6g66PONQmQ5iEgHD1IzxXsUDavdKGCIsq4odldExiMUAASu4b6+ygACKFIOVsu4EZa1gHEvYwrKbjdfKfjU/KPGlDhwEADZPOIArCW6eBBTys61GuKXC5RYWOinT6Nj3Dfc9D25VpOAz73ZREaAK6Avg4Qtfnic7oKACy5fMOxXm+yzAtqs6HNRTfcjYEhkAX4YQwxI+UADlwkjzlKDlioz1UuF41kteVgtX4tbXOAb/HXt0fdCrOBd76fWcvg5vzSPBKmbiH1B2GKcmgBUQTrc/0OQFTAV3IWkwCnk7B3e3avtalsPHDgom2cYN8f1s4CMhv4Rch70ueOHmPCPCtoze7aDL3P/ZhB7otBO1z1vsNEiAfpQ2JGjkHA3uhyZWt9nt1P/fPfqo/SoKAbsihl0JTA+4h0OSBr/cOQcIisPghIbSx7AKXfy/zX+yGNQLrksgEmPJfnHUdUBnu5t4B4YMRbIB4kh7hszGEFhFfAXpK+Lht42M2RqO8T27hUABeAQSoJzlh9R7+onVoruPfpqZy297ZzIKHW0dZ7Oj+wB/gahmwHNANwTOBUwMWFWX1nUy6cAWPLKVzz86ZysPUHaNcb7rMxqelMauSmzLUNgYHOpppY2F1pLdZYy+d8us+Gg1NrLbu+H7NT5s7tQV8P6JZ12EpRzVrVAPq48t256+4yx7otQPApWeY1ILj45+51v07vz/UArS93bSPnOVMfOaWa1xfadlPr+TyKApttttlmm93LGMBvp+fl9yuK+HbYYwd6sffRF2QPw4A/G97Ac074cRZJ1wyRpd5ss89lcZB/6fXMa/vTYJkZh5wxfd3XhNcA/uBVO7HZZptt9tWy1xvwNVlVC9gMIrlGiQq4a1KN3hqw1wCfZIxTrlJqOaMwFMt3DmCanYyafR9cNLAwhDVY6QM581x34/sgkt/V34ONKuXGxoSEC2y5gBKZn3DMpLkuxBq2hQaliVSe0YHnhb0zjqW/V82zRzxzhUKVeW7Od4G0EgxfC4K5IJmXt1sEUXMJzBb/cy4yfU3QawVMJzvH+U6DtFkkAPOi7enJM4TjhHB5Ab7cI8exlqcyziJfKqAnj0HAh5xB4wDMCfTkOd74/R12Ty/x44sdprcGPHkzYhgThiFjfveI+TYiPpF2BB1CMjBTnY83knuTMhAOgEmjGoBZ2KkzMEzAcA2AhbV3eIuRRyDvGHkWgOP2G4T5asDTn3uEN/9wwvh0QnxyAE1JZGitaguEx1g3B0iH63Gdo3NWmUUUlorJXlPOZRMFh1DLIVIp1aDAGSHvhAkcHDiWR6os22QAJ9U8mw2gKteEZOxAquegAkQ5Qm4dx8S1vjbwNCQDTg2Rs7qkXaUrHDhdGJ8eGA4AElUw0kB0sx6wdv4ugEtetteuZX0cVOYnY/eMkXcEzKT9LkzVkrE2cGG6CsfVwF0BTBrQFgAnAYxjyILLZZGJxsDIozyHDVQrUtPGPPXNdH572V4vX00QNqjJDZvUtpeIFmlgKGtWOiUPbnyDSDmX3LcFdLbxJLmPs71fPAAsgxpU1rl0QgZ2TxnDLVc2NRFy7OYNUO8lbseUWO5VAT1JZZ1ZNmqwtPf2rYj5ioFdVjIYYT5GnUsVQOEByINJL4ub8n7MMr5zAGZCOASMz4DxmfZpDEj7UGWVPQakoGZwk7LcS2uEUgdeU85I+z2e/Pwe80MWRQP1KR6k7LSTzRYG/ptk8/SG9CMP+iy7BcJM0k9jnfdlvkc5L8ySl3j/OGP3NIEmURvAnCtYrRucOIbCSuao70+CzC8QhjnpUBNoCIKjzbnMbUqaLNhAl8QC8BT51hcEfc+9EwEBUx0ouABY7Zq+3jWg0x87Bwx64NDeAWv5ajkv/PNgaAMCernkwkh075qiymzy68s2le+cnx6cpRgr0LgAsFu/6/XhtKT1mq30KWcG2YPcyXAvpKJ7f9bKXpPKPidx7VVVDARMqY7LKcnp3o8mjUZwbai/N/X5tvr1pXtm9GBkMx9Q17bNHAmEIrt8Cjg24Fblp339Dbu2WxeWkow1q8dX1XjsuAeGezaw+WDn94o8OZ+UbS5laLmlZqrgAStwTEP7ZxynBMxcVX2s/s0222yzzb4U+7XpCX5nfo7/zsW38BaNd1/wJdmfG9/ArwwPAQA/TAf8P44fvmKPNnutjQLwZ/9rwCcfAL/2/zkdJ9zsldpH04T/+fe/j0/mDZTfbLPNNvtps9ce8F0mu0Ujm+mDJwXo9QsSL8l2rh77t7ZT0wK7/XdWX1QW431jvbzip/+uB3ubOnPLVGgu7YHSM7tO+1xrZ847GRy+gwm06K/C9u2ClYtr7rGgfIEA12lpagnKrso7cwZPMzDNwBBBY6z5Hw3sXWOBmPxzJiAGhOsJ+48CLj54AOSA4z4iBckLOowJcybkfSiSuY2Mr7HYstXZuUgV5AQqQGfXMEvOToCRLc9pFHBlZrmPbt8ZkHcBeyKEw1yZutJxDUN3YYWV6QHYO8bO2MIqIc0xVPZdaZchft387v3w4GcnH2zgqOGX/nPTx9wWJ/WjgINgAfEqFmrAF7fSwzp2JQ+yBW31Nl20T63kYHRj3/RgB5YWf/s2VMyzzIt4ZIQjlblg7SlFEJQZSmDiCgRrBwqTsbaPM7lHlz2jWIDFUAFHz85tGaxdR3ft7GWOPYhO/bXU/SvtptX5yv56f5/5c0ymu7C4HOCpDN8iv+78KPOya4Nv26JevU8Lm5rRvIOmK0IeGRS5MIyzyTm7jQocpe99X5T5GwCYZPxMiLcCjPr+XfQB0cpzpj2RCqNa74NkG7OkDXkXcXyTkC8SYsyYpigbCIw97zc5GOgbTIkALt8xEI9yTTJZdVZA3/pQcwKPzxnDdUa8nss6gBQ0YnuW+GawHCuyz6fe3aZSsGg/l/cXpVxST7ywnVpzvEw7k8+1sbV3vQGvayDlObZpDkvp58Xlrt3Wl2trFvXhJIDq7Q4J4qZMtGuDO1nU5+rtZKwbYPrzWs+gPmX3Yff2+YnvALobAH7NJ+3v1XQb7vveXgojarHeXembHhDtN1n25/Zl3MXG7aWaewWhU3Zibd+YK28Bjm+22WabbfbK7AYZMzNeQM/jS7ErirjSnXBHzvjFeIkP8xFPT+ax2myzM0YEXD0Ebq9ftSevvT0IAb90eYl3x5e/QWRmxvvThNsvMrXHHsBbAC6+uCpOWgbwMYBPXkHdm2222WZfcXu9AV8NznCR8s0tqOsC5J6540HeCg5TlYZeY/bOykCNYT0gtBag8cDtgpUazgdyk2MP2/n6O/mgVCcZaXLOHFAYrk2gyMvsDUO9xtgKa2Axc2VUmA2h+OFZG1J2rGxZL4tXgoIrzKPCcubKjI6uneY3BRQt415yzxg9PePYGbscxsWsnBir7ws5yy5gz8KU4duDBIKHCIyxGQuaM3gnbaGUK9gbgjDS6ALh+hbh8TO8ezng2c/u8OGjQf5AvCSMuxmgCTOAxANwExrQNhxJGJAG6nEFSzij5E0tjMIZFfRRtufFx4zpIWF+IIAWKziXIcDYkz8WMNwGXH4Q8OCPJuw+fA5KKoU8KNhLJBseAuocUgYdIoHHCCQBfhr5Zz/u1tVzBoeA/HBAHgPyrrLJSOdAVmlsAxrlvqYqZz0r4MTCXmaiwgQGKuhGSfKUeuCRB7TgmwFOdksoYMZR2adJgqwFTARKvtgefCU9r89NyzqtaUWOuJtyS9DesWGNZBr8Lad+FKVmHXuOhOEmY7gh3TgggGWegzJfGRSzBOuTNboCvDxwZd5ah04BOYUC9gIoZfGgTHLL4etvy36zggP+rL/yUNtt/Zl2CsbpHKhsUFImL6mCOFemreZ7Lf4RxF82YE8B04gCchvoXQFTLuxnGRdCmiMwB9BMdexN0jnUsYFJcxOKxLWB7z2oaIz+koMZMrfnK8LhbSA9yIhDxjAkAU2PAXSkAuIDApJ64yDjgDGDhgxWsDXMwP4x4+LTVPpUZMIdY119lfnCNV8uVUBU8iizMqPlnrffxSFGuoi4/hlGeDRhP864eb5HOASEiZFH6ZN4W0HjMEv/z0Mde2kMEI4KBg8QGXsAvK9TMhwEFL76yRHhkBCOc1kvmPqHzJngmMjS2XlXz6NjbqXdy72s2yDYtRGoAC8zMM3gw1HeF/cB3XrQyd7xKt3MTolC8vimehyo7NEOhGuOe2lhz7i1NZAH7NaARC/Vm7C8Zm3TloGoKQlI2LNU7XzP9l0DmM10fUMxynu9z1Pr3+u+HeZfr0ayVodPK9H3iT9/Taba2YINeypNhS9rzbcz1jKcVd3E2LzOyrrwLjnoQNXf0vYly7iRyta+7dVimjzAp/xfAYWb+dj3q9uU2AOdzCx5fssmwtB8B7SPkrJG9mtmu8Y270H7s2f2Fn9C+7nP4evy69bUKWsbJagtpze9h4l17c5c/VbloFK+9+MlYOibbbbZZpt9PexbYYf/7v5b+OvHj/Hr89NX7c5mm/1U23cvLvA/+vmfP8mh+MrbOwD+5VdUdwbw9wE8e0X1b7bZZpt9he31BnyBKrsIVABXA6YF4O3NAbqL/L+lYHetyUJ7ENgbKUjjg5MeeM4u6NQHci2YG0INsHlp5xKcW6nTynTnE5Fjzqy0zYJkDYuQ1s83NqJvgwWaZ7QBONYArg+MrgU1T8kIOv/aPuuiVDktA67Or+aaRbCYarCzAMwngtlrdfSWE/KTJwicgXEAhgC2PMHZ1eH7281JDkGuC4TdT57jIQM339zj5psj5rcC8AYjEGPYz5h2ETkxhmtCIzMbhNEWsvwrzD4bAmMAAxXI1M+UBSQZbuxcKpKqnkmXB+D27YC022H81ogHP7hFvJkQro8CXkcSWWdA56LWEYX9xoFkHlMW4NeCsbbpwd1TvBvAY0Qe9ToXnKeZy9DlQT40bH5ScHeAyOWmClTlko8ahW2aIzWsUya0oI2BoyemqzEJ2ZVteUtlI0QFW823wnA+Uabk0q5tKgxD7vIBU+dXqPVkA5StXq5zIA/K6M2MOMm/MBNy5qbsEMWPAuYQiryzsMt9UJpLH2YmTCkgkGweyFkB38AixxsklypHWvhY6tG+LCB2dOe5c3xeXzaGumK3BQju+o2VwU6aX1jUOwk5SwcyaR5zZdYyiZRy9ZUFS4kCiMeQkVlkl5GhUsMZ8aDP44QiNQ5XTBnr8u5y46rV2PwyANlvIMh7AdFNkjqnAJpDqaBnPHuWOY8a/C85hwnxQOL3bVbAXIBXk2oOM9e5rf0tnYzC6DVjEgFw77PkIc9lDs4PMsYxgYjBR9nIMl+SAN/aZ+X+szF142omzxIq55e2ah9efpixf5IRb2d9loTyXc+ebY6VulieWXp/cKSmTfJd3bREs7J5S6H6fDOA9T7SwGdYegUwPgXm3mWngE10oJl/3/t3evd98ww69c62YyUHblwca0Dlc/l4m3dzBTVX1179+sP/3pd9n1y455RM/Pnd2qEZl55B25tfu5xizdq1pS2uX9eO9eWuleF9X/ncyy03Zffn64bD5vipudmrdBgYW9a3tKh/qVTj5Ji7NaxdV4BaX5cHb+3atby9BvYyt23213lgtl9Hr62vY1SJ6/5UVQwwIHeN1QuU3L2lfOd3004rh2j974HNNttss82+EEtg/M3jJ/jZuMefG954OcoVL9HMn18eHuCdMOJvHT/Fzb2l6Db7SlpKwG//GvDOe8Av/XLzN85mX30j4Cv3nHhh+7Ld/wGAHwO4/ZLr3WyzzTZ7Tey13UhUrH8xOuZgAX/JyTkDLZjbf/ZmTE9/vGe/euulpBeBqZVrS64wqqCvB3Pv2u1vx62u+ywU1gJQvb9rwd8e4O2ZsJ9XTs6Dor4O74cFU1eYQ821xSXzPdT+7PtI2SPNIuueOfv4cAAfjqDDhCLlXHLMarDSza9mHgYIMzhGhMfPsPvwOa5+nLF7TIjPA/IxIjMhDhnYZbAyEw3g8IxNyzlruXx9HlQDUDwIZPkxKQFhYpFzvWYMN0Cc0DApOQLzA+D2XcLz7wRMb4xIlyPKxgrLhZlR+wBA2QihbW3kn09sYChgb6QF0CosTm7lkh0YKCdBr63XGyNXxsIBhNEBSqF+37BN7TsPJloTguUZdj54cMpdW3PXkv5ry6qFdv982xgL4M/76P+h+93niC3HdPxphqLENhQm02n5ae1arv70/hUfJR9uIEYIubCiEbiMqUge81Lemyq414yd7yc3Fg3I6NtugKf+I52TNg9kvGpHcg7t7e7nnW+b/R4ZNGSEQTZkVCdE0jkeWfILwwBJB4j69piPaIpo5g77+8WNYR6lTyWOT8g+r3IpDDB55ybvc2EmA5REzjkc5TkQZgF863sUddNB8vd22y/NxhL73rc7K3gRlG2/F2ZyIMjGDEZh11ve5gJQB2r6rdRj95XrOz/+lICLTxN2nxxBU5J73+caN7NNRv04+OZkbjeHebDXlAuYW+lmD/YCysz9nO/Iu8xYtPaePAU8Au37vH+XSyHL83pr3v9109nqMSsnnPh81zv3VJqJc6xpn2+4uHRi7XDq+nrhok9X7RR4fA+m7slAzykp676+Pl+yXtsAqL7PbQPeGkP5TFuJCBTDOvMWODkmZwNZNgc7oNlA2dVrvRSz/x117Xen3LG7llNePY/7e/pUO04BtC9gDQjt1+UFYO7+XglBQO1T7duA3s0222yzL90ygN9N1/jD+eZVu3LWfi5e4FeGh3gUBoybFMTrbZyBH/4h8P4PXrUnX6qNl4TdZdjw7c6YGTcp4Tqvr21fa8sAjgA+APA9AFt64s0222yzVXu9Gb4sQVgOtGDzFplnD+Ya4BcjKruTFmWWgE50wRoL5M6pDVbad8Y0tuDKEOs1Vk9aAbmGoZZhQXEro/9poKUxChyz2X9P09QcbwJffWBsJRi0yAHsWRanWB3GWDB2rjFZ+qAkZyyC3ipXKUwZkr5jh1oyLxkqxhpdY+J62eqe1WFVmgykNy/T15dtss7mj6/u+TX4eERkBnajzL0h1r5iBt3OIlGt/cohyO+ztvliB7o+4J2/8z5C+hYeI+BmPyBdEHAFxIsZPCZMvEO4DRiuSYA6FrYfQAgDCtNteoACdsWjgWyuy1WWNe8E3KAEpL2AlznK72FWJm0C4qECTR/9F0fE2xEXH13gwY8mjJ/cCqACGTKOUQDoJGBwuJ0lH28I+h0DLDl6QQSarM8JeQjlfuZIyGMobEkv7wyggNY2sDQLWBmmCjSZRKyxLHOA5gTWPrEh6kBRkAKhOmQGxDVs0REF9DLJZKubWAE7ImEbk8pHe7BWQanGHJhZ2L5kQBUru7uCgXZ9jlRkdq0/TMLb5yk2uWs24C0A8UBIF6wSySrtnJU1FVn+ZRJwUME5AeIYTW5yJnAG5hwwxgRiwgSAVP64SDpnRkgEnuu8Mj/JAbkcUR8BBJX3rWBcaZ+B146FmcubjQSU84B3xTIRIwMxIVGQZgR9/pm0M9D9FAeDSinPOSAl2zWgPh5FyjjtQpNj2HI8Bz+Hcyf/rWPJOzdWlp82S/+lkZAuGRiEcT1PEXkKtZ9I72EDaQvjHuDIoIsEzlQkqOMBGJ+igNQFdHcbVogZeSCV5EZh9drGCiJpSzgao5rLnA1JgGRKjNvvvonrbwaEyyP244whJoClzHgQxYHmniCAB3nu+FzZGIA0AGmP0r/me9ozLt8nXL2fcfH+Leg4I+9FSYGJ5FUDgAc7Bvh0Dyar7vP3chDp5jBn2bAxCCtZXlny3qY5tykf3LtW0h98BuBlLXpxIl+uSfoupJ1P2RrAu8YA9tLPff39+X19PheuY4ACWMoNUwBFlYRfk03ODPZ55u4jjw10wLamfViTUDYzoNPas1aPfsfTrL+uj0lT1jmf1/rJ230UR06Ni2fcnpDoln7XelfGu4yJK28NgKXo2tF/1zBPV9ZoYwQ0KFXWoKcAXD3eM3f7/mNIPRRjWesu/E6plm1r/j7fbq0ARZHH2LO2FrefXjnAvi/tlmua9lk5XTvh259SWfeXtCTDsLym9EGWNW4vM73ZZpttttlmne1A+Nf338I/Tjf4a8ePXrU7m212byMC/pX/wTfw3p/aI7zeUe0vxP79H/8Yv/X8OQ5fN8D3UwB/BwL6brbZZpttdtJe+1djAXvvdTK3nz24278I1xizPQN17fzy3cr1p8rupCXvbWsv756NvNYuD0z3MnkaiGPWzI1dMO1OtoTZWdbNHUHsBUNmpR12PEBRPHfNPaQteY2BnfOqdGGtr0RNu7mUwdMMvrkBpQS6vBBp58BtFQYoeOYrgJL7NiXQzQH7T2ZcPhhxfDtgDow8BoSBQZGR91litocATi6nahTww/JYemCssFeVgRsSFqzDhq1nQKrdHgZIKW6WRwAXwOHNAMojdlcRu6cT6JgRb6bKevNsX6BI2AoQRHVThgUiAxTIrzl+Q6pMUAZVtpyBUgEN48/a60HR6gDKtdZO5vZ4L4XbX+s/U2aVr61WmLzNMb3Gx+PXYvcOZCtldQDx2jXl57lpbyCyZ0cqyE0zqmxxab90BpWybe521XT9xSxgMQcLrrNKFEEB39ZPAQ5JFFYdMN2P1aI5XM+vrFiq8sJcwU8AFRB2faa4JGLMSM1z3lWUxQkBMSWjrSoZIwR7dpLKZhtAaGzirrOcz60ssWvn2jgakDzLsyDtCDxmUMwIgTFPEZwCQqZ637q2lLKV+U2RwUlQT0pAOBKGG2EiF1WM0PrBXf9oduPiv+Wt1g7RDQ866RLLxhZmHN4acHyDEJRlnHLQjQTa1/6eJlRZa02l6ucFKxhcZLOHOqeHW8b+cZJ6ezOwqeTcrmPjzeZSyfXrcsqbhDjZDgUi8KCSztoHtfNe8h/Zp6SK9f10L2nnUyAmsNxc1QOia1LAzpq1RF+fK9v7WfLArvmzZmvfnQE8Tzu7BD/b8nqn7vDrPt+fszWJ6/vYnekn7jkH18a8Zzkb+B66a9CuC/u11Kl1VVlXnmOi9t+dO/cUSO/r6j7fJaF38nu/NnXS7gtfe7DVUlp017Av69xz4y7w9lQ+4c0222yzzb5Ue46E30vXeC/s8FYYX7U7q0ZEeEQDvsk7/Ml41Xz3lGf8KG+oymZfUSPg8s2Aq7dX1uub4ck849P5C6S/EoBvQXL4fhnGEFbvxwCuv6Q6N9tss81eY3vtAV8AC5CzBK29WWDGg6uexdrLG/vvTI7QS6n1oG1y31l5yiAqQE+gkt+P5xm0xtj1fq8EiQCAs0ro9mC0zzXm2AOkxzz71gfjFsEsZYFwjG0M/ESQb/Gd5SsE1oPDnglkjBMvl+nZNX4MmNvr2QWRDfRtcqzlpZ/W30VKO9QcjEDTJxwgMqldTmLOSmv07HFOSB9/grDfI+y/pQG7AC+VW0xlRQs4YGxyHdPL7z3G7pML3Lz3CEDEHBl8NSMOjPDoiCmMyNdBGI4KNPHAmEZha4ZZGHscJR9v1r8vQwLireZQdUAYBxQWIQBQNBCwAsh2btA1I0fg8DZw+24AccDVH0VcfpLx4PsZ4fkBOE4CIA0RvHN/4Cq4nYfQAizKviu5e0nB3imXPL1hysJ+jJWF5wEijg5wjRUItPKkEfpDQZ4GbHPtZEIDyvscolaOSQUX+V2XE9jYt5RQ8tWGxIX1S4mLr6WOLh+xAHJcjpvPVeZX2KALMLqb8g24mKRvDGD1DHBS4NISvpJKMksOXgIHLiC5gJttYJ0SgRMhpYDZPbtI5ZPTHpgvqAUPtTqTxS79bG3RYzbXs5unRcY5okj5lDnM7nsS0C4ecx1L/ZAzyWM62L1sdTJIUUUvDy07HghEjBj9MwuywcFklQMh76iCuwbCGruxAVMhjFI3H3w7RKpdclhPjyKmBwTeZYy7hHFMOF7vgGOQezZV0BdAZUkTkHeS9zcGlldSpsLw3T/hMp9E6rz+BCBsYrfZgqDzOHNhna9tSBBWeS4s/mc/G3D7LmMYE1IOAvhOhJCU1e82p3AE8o6anL45Wl/J2M5XjHhLGGbZ8MIEhImwe5px8ePnlY1bwOzOQQN1UwbHUCWfM0CQPqcpIe+isnq5fM8xgFSxgocAjgEBs0g9p1TfDymDvdTzKesVO/xnYwjfRx74LiaufbfCYKVRloTGIuSUlrlaAwGI6wzhvMKKbVQy3Lu1KUPyGxcmabdGAbAEI9fy0vbtc7+fZDyfA1fXyrb2reR7LcD1Wh/0/d2Pj66bjKEtsvongFfzA6gsY83huwqe9/X5dgA6P9txWvzu23fKUiptWYzdGrOYSGSU7eGxMu6Wo9lYyP061qvVlGvX5o/64dewhams60IPAjcs3xBU9UXvY//3QrM2pfY6+86DvnbMz59+E2bvi7cVsLeq6wizF0H6tXwXArCSnnizzTbbbLMv1j7IE/7K4QP8hd07+DNfUcDX7Nthh//2/pvNsd9J1/irhw9ekUebbbbZV9oGAH8GwCWWf2N/EZYB/AaAJ19CXZttttlmXwP7egC+PlBqlL2e6bp2PmpAm3IXbG0CrdwG7zwr2MDg1AfTVoJzrl4vx7bI19UHhoqzKwCtfR9jkaajM3LNFJcBt4WfXooZAIUAzhYQjPU8s57J4wN7Bsb2tpBTdv1jQd/MClas+NjXe4ohvHauSTd3gb2lLN6JAP2aLLVcBJ5n4PYggIhKeTIRMIQa+FsgjBKQowHg/QhMM+LjGzz63gPcXAc8DxEJAF8kxDGDBkZ6lBFSQEySfxMOLMoRmB4KSBYPFaQ1sPD4iBTkY8QjKmAZ9JpbRjwAUSVecyTMVyjM5JBkvWWYOxNw+03C4Z2IJz//CMP1Qwy3wMUnCePTGePH12VuE2QuBShAqoBMYY8yFzCULDemgsElN+fMAkYxtXseZgDRwEkFRrXcRa7U4IE/yLT2gKr/zr5HPS594eYLkXSKZyQqIFxykDLcZ6rlWTEFhHbXBMda1fM9kB1mHaORahkOcG7y3JIwbC19rQB2wPCcQW9Z/Qr2Wn7bfpo34DJXUFwBTyTCPEWM44xIjEQMCsJO5wGSp1WraWSDcwUSPcvVAFR2EsWNsY57d53vT5kPJGBmgMgaB2ljCNyeb2WqpLOX8C5WYvlcp0kmAVAzdP7q8SD158HaWSWcyxwknStgAfA7/70PhzcJxzcBGsWJlAJ4psKObXIrWzEKKOd9BoYsRWUUgDocgfG55rgdPEhW6zVGK4BGPhkqewxil1dcmNAl3/achbU/BEwPgPQgYx8zUg6Y54BwJIQDMNzW/kgXQB6obkSx+aWS82GS8/KRigx02jHCRHj0TxgXH07yrFWwkocqr81jLP6TdhpH3YCie3nADFKVBN7FskmnypeLTDXmLAAvRLL6pN1XzvkuUPiEnPPZc9YAzV5iuLwnc/PuKwCprQtKGotO9netzDX/1jaNca71dLLBq2WV9sX179bAWwqnZZfNzo2R/24F6C11mEuLdBDu+Ckf+j43833uwVgF1wsgr2utpp1n2K7NeK6l3zDf3Bwg3+cO3G3AeM4CLppfzdrrDEjf+cZ6SxJR3STnAN1yjtvoaOdIXW4zn8k5u/Vvo/5xHwZxD+Ka+b8HDMhdU6XxgG6v7uPTiejvZRa4TaEexG7YwO5cZlaFFe2XFdnozTbbbLPNvlz7jfkZfpKP+Fd2b+Pq7M6pV2drm4x+Juzx39y/CwC45Yy/cfwEx1XJqc02+3ra4XnGr/3lT/HRP3n5TPcI4F//1rfwixcXXwpe+oXZl+H8DwD8EYCvdlr0zTbbbLOvlL3WgK+xXCXoc37xyUEBpJ4Vuyh0BWTtAVYLGmV3zZokHTNwKobYB3zs8znfeh97lrGZz/t1BuxusBvPhrhvkPAu63Md++ByQtv2flyC+l+SrHaBaW/smLyn/obSNpV2rvTvKiNkhSV0zjgz+HAUQH/HpY1MCtwVQIja7yKBEUAxgo4TMCdcvT+DacThHULeBXAUhh7FjLxPyEOQtM1OqcXAyjwoiORzeALIO/knWJ0iRIwiWwplfA63jOEgbU2jMO1yZJFVzoqLWBcSMF8CPEie1nAA4i1hvoi43BPCYY9wnAuAS4Cw1BEUwAl1PEqMXM/NXPdwkAO/MhegzKSQiRlI1ARyG2zdAWgLxq4/n+pnWhnuAhzZXOzP6UC6Ktfb34vL6xbleRDPHStsUG59bNrmvi+sTLsPHHA13BLCTBUg9XV5lM9tKlhILRMURBTWrDSX9dEoAGseeClz7NruZZpLsQr2GWO7AKwefPTgqXfJP8YDZOOAB/OB4h9rDl7vD/wxwsLvZmplQsgoG4dK3VQ3H9gxzxgma0v5bm3CVZB4upL8vRTlQM4EJKobltacI0i+ZcvHzATLyRxmAU/jbRZ2vc2txXyrP8n6x93/Swl0e0cBSAwOAXk/IF0yeJcRQ8ZxGjBPA0KSTSSUIOzdIBsYTM65kREnNDLutqnBWOJ0BK7enzA81+dNYDCFhj3NAxVQt/GVaDVFBJsaQbk/ufws45V0QD2YWZ4P9wyMnTqvX3/0a4cXyQ18hs168v238h6/Mz/wqbqBdgPYOd/vkjdeBRL9RrMT73LP9l05r3x3Qrq6+R4d8O3VTfzxtoD7HfOMaObmPMvX7DfgeVWS4ov9vAtgPdVfa+DzOdZzaU7dNHSyPqCCt85aZrBjxrocvP3mvOXGxdD87HP9Wjknr3d+UH+/nTL/t4MHY/2GzpOXUl0TruUPXpNwXlMl8sft2Ab2brbZZpu9cvtxPuLjPOFPD48QArBHWFdx+IrZm2HAm+EhAOBZnvHr9BS3LriVmXFzMti12SuxnIDDDTDugPhah3q/EpaOjH/yt69x8/jlz/NAhD/z8CG+e3HxUss95IzrlDB9ndZ/jyGg72abbbbZZve2r9cqwC+cLdADFKZRCcjMqTBKyRI9+mBNjBVQ7b8b4jJ4UsBIF5QJBBwn+S6avuzKNb3/vfzb2vk+IGRMYc3PQEQiF21+a7k9K7jJs+ekkE1izxgkHND2S0oiczwMjbTewoyBYn3hfxqbhLrzC9PFBVE9IGz1sWs7szJdTHqPUIKgU5uzogngjYMErpmByRLftvLOxipZMp6UIWa+NAHKhPTpp4gpCUbwSHLhkA8CzyKzbaxfsvGOAGOQDQUp4/K3f4zdx28h7R7hGUccA5AHBg0Zw9WMeQ7I+4DdJ6HInhowFHQTYrpAYd7ZOWECpgdQoIQQJhbG3CSMmemhglYZSDtCHuUnZUZIgvTwIN0QJiknTNL3aQTmh4zj2xnHt4Enc0D401d4+3cZlx/M2L9ft+UZw7fmISaEY1KAjwpbsDLnBLThQRmTDAHPFUQ0Zq+whAEk8dszKaVdVmEFjAvB34BLAHA5Qc3kfG5A1yJDy0CYuTChm2uaiej+rd06XnqW6+9sjOECbqOAcGHiAnw1IDBVMKw8zpSJykGAxPF5RjxEhAMhRQEy8pARiQR4D3qPDwwcFQyMXMovprsA8hQKg9lA30CMdMGYLwxQq20ktue0fE4jar9yPV7Zpnp5T5Z3oCnNqKxarmMguXyBNEVQSPI6mCNyCirhXMta5HbN2sZdRhwEtJxzqI/HA2HQfDIm7511DoVZ5kweqOa71bEKs5tDGVX2255XukmE5oz5SjZXeKM5gAyw74FvBXt5AMKlPA/zFAQkngi7x4TdU0Y4JOkv3RhlsunmV0iVdW4sdJptflEFXiMKM7qA8lPC4Wce4ubdAfMVg/YZuyHh+nqPdD1g91yun6/qGDa5e/XRyfs67mlf59x8JUArJSDeAPuPD6DjLOoBxiBnAZ150GdO4MoMB3QzgP4bpe+5zAPd6EJQkFd+ciBgjMAQQFMCHd1A+nei35z1ohbcDibO7n3Yvj+XaQe4Mj8513emByD9+9gzb3v/7RwrC1jKPAOFPXlWHaO0w5ihHav0hKxwKdvnofLgJxMW4OraumSNnWt1RpGY9lLKRdI6RrcGqL42oLcyW4sk80ofnZXZNh+AZnNc058lT3Ou7bGcuuA69uNK2329awota8xevz7s1ooL5RZlG3NKoDX9YPXTzi2HHfDqy7JjDYPXX+/K4JRbENkA3lBB83KuPVd17Uy25j5h3oe2vR2Q69fY1kdeBroHhG2Nbqxc52vDyk2plFM2K4ZQ5pdJORcGcA8Yl7JONnGzzTbbbLMvwY5g/Ae3P8EfHy7xr+3efdXuvLBdUcS/cfntZkn7mGf8X29/vLF+v0r20Y+B/+Q/An7lXwZ+7o+/am82ewX2d588wf/pJz/B9Zn17WabbbbZZl9/+1oBvtwHWdeM6HQwdk0izY6v7cLsA4r+vORA27XA0GcJAPc7+Nfa0NsJFnAJgEVy4IwDZi2Y1wO6XuqZWjZlc60PMvfA72rb1oKf3bHC/O3a5q9fA6Adu7dYdqC3l9BeCZZRziov2TJ+KBA4YTmezODjEbi5AS52yogLLfjgWSMKJHEIIOQiBQ0A4fqIhz+aMT0akXcB014RyMAizzoS8sDC1lXwyJi9Uhlqrl8WFCZmAaLULQVyGOEogE1S4KaApUF+pwTQDMTE4CTAoZeCZsMXDlTBnwCkS8bt2wHAgDBfIN4mhNtJxiq2YyUSxvrZTzvmms/WbjMNmHJQANqDdY7BSpmWQBhQGKWlbvvcA2Z+2nh/7Tuqdff5aQEBmAsIzHUsyrkO3C2/+8+uD9pyHai2cvv3LNi+PGNKhlnHtqDeALM+F1iYWtwnO7a+YwEUQQAlez71zxpBTyUnLNDnfLV8rE0f+NtJ+5nsuAK+DQObuz5gV4dngxnbNsgFVSyBytgYu9f2Ai1YxwSEkBEDN0r+pGzZNVt0n/ffz3cPqGqbRP5ZWP7C0Gd5ZDEhJ4LJMy/Gx7c5yjXyWDZ2L2G4ZsRjdx+aH747y7NL+wNUclKTqgTYeaS/yEaSDMoZ81XA4U0CjxkIjJTV90Rlo4rPZbyYz1THrjk8Q1QCBmD3mDA+ZwVeWTbUDMGB105poesuxGVu6Xb8uOlTaSAps9dOcu8Bew8Zw+4uhuUpOyfHDOAUy5YC1Ws9U7XZWNX51Ev8AkuWaJOqgdEDtGfB3jXJYP/dGijt88eeVN9w4OKp9nX9VBm6Xd2nfL6PuXJOsp/7utYA4HP9d1/Z6XPS0fa9Z+X6dZv3o6zheFlGX1egunY6Bb7n7v54EVsBi3vz4PFJoNZsZb2/Kgetv/fnniyvP4+7Z8QZa9aoXuZ5zRd3Da8xgPu/F14DJtlmm2222dfdbpDxQZ7wn6fn+Nmwx1tf8by+3gIRrhDbvxEY+C8MDwqT8J/mGzx/EeWZzV6+5SwM3zTffe5mX0s7MuPJqRQ0L8veBvAWTqsrbrbZZptt9srt9Qd8LXhrwVV3fCHNaHKNnjU6p+aaYkQCOPZg6lrwxs7xu/htV34MdZf/nBY+FjbvKRDYQMiUlkEnB06W3L0hVDZpzwq2awvYK7Q/8mVC1/GxMksWcs+NeysykCbZXNppZa+sCPqgI1AZlhbg7AF3O+7H18DhecYaueRk7jjfH9KgymQu1yroCxfw9sFpY165fsi3t8DhgOHiQsDlcdAgswbnAsr5xIysgKCwMyAIyMUOdHPAg9/8EearnwWHiPlhEEVjlWflUaRYQQL60lFAJy/zHG8FPMqjMPXCLECJMGUBk1GNRwHu5guRU+UrZQqTXBtvITLPBu4EYQrnUVjCBsYOGYiRkHcQVucD4OY9xvQoIA87XH6UcPlHk4A6KYOVxUbMyLsIYkY4ZgXAqLBlacolIEpZgJx0EZBHqv7bMBrLKhuqVuV8CzPXAbyNDLQDFAuDMUu7ufu73OdgZbip5IGxWQD6PCi45ca9AZk84Gz3gILElKoMM0c7BgG6qdZndRew0gBmBdQsJ6rlCabMAszpRgHvB7OAAKQAqewX0I0T/lzrOwMes4DFRSpZ+4VHYZrGYxY29yjscdtQALuV2AGivm2nMDMDRnP7OxI3xzlITlhWlnwIGUSMNEcBH1l8N5at9LVHY9UPzf07xIQ5BfWRECbJRVtO5+W/Ra5iaHu1jTnKfCmsX70ujwSOhPmSwfuMEBM4BwV8qd3k4aZCYf0OCtxDQdZZct/uP2WM17nKqtv9AQM5qQDyXj77JHRgYHFmxENCOAj4engj4uabBN5lhMA4zgPyMYIOoW44YCDpvRxSvbfsX9a5Lve6zrVkfZOxe0y4/IhBtxP4YkTeRfAYddwJ/v4AICC34Vmau9juc7+5wucT74FoJpQ1BRtI5DdZ+fXAZ7W7AmcUwFp+YaeatPAaYHwO3OxllDODYli8/xfywZz1ecH12rV3O1CBxT7P6xr72IovfboEPQt4Gwg8KUPXb87y7fJttXr7czygvsbSPQcCW67gtdzAntXs2rAqj31CxnrBHl4ZS9mIlpay1HaNzwVs19h49ozr3hYgsQc5HUvcS1vHWNi2jFTniOYgZr9rZmWdxgHNZsTVNWfjo66XU5JbnUKTu7f6m5eyzX7zX+ljt/706+gV8LfIQ3sA1q/XY5T7KeW69rdnhptri9Qj9nltPrprfB+UMqZpARJvttlmm2326uwn+Yj/++FD/Dd2775WgO+aPaCIv6g5fpkZ/5fbn+A5375irzbbbLMv3P4YgF/8Eur5jHumN9tss802e80BXw+WkAabVnP5WlBn9mwKAz1DPcckhI2RsyIxdzI3H3XHSnDNgYELhgpVsNfs1G78fue/P9e3U4NYJunMlvesyStHzfkm8dxI62mgtwC/XdsXTJ4+qFnq6lgldm4f3FVZyQX7xYKBnoFmssq9RN6iTicN3QUwS6BPJQjLZ9eHANYZIn0w9BTzhhn89BkwXwBvPBR5zhWWhbHOGDofgoBtNESVus148IMbxNsLTA8HTG8S0pBBkYGQwHEAFMTNowAjYQcgo+TGJAbmKwF52Ek4B5WczZEwXQkgtXvKmC+BdCH9SxnYfSpgR9oR4oELaBgPwvQzxnA4KkgcgKOxgicF0SJw866gjrsnO8TrGaRSjJJnU1ligRTERvld5oBjew2EHKlI5CJTBUIzRJ7WricIgO3BW0Kdy6hAHIAiMVzYlmjlbD27lBhYTV3kgUor1/ZhRCqLVw80F/akNZ1rWRypMKiRpU+KrK2WY2AV1Ld6rfM72L96Upiy+JYBYnJBcAFPOCsC7gDI2nGu/eW2E7A3EBBDBiCAEe+y5qL2z0oFkLJ+9DiNawOAAgCXsaLqQs3jKnNNwAfhmobggQjtn/JPBlHAUKm0UYoo4H9u8uTmTEg5IDEhGVN1lg0VeQwNG7XJ3euemWGuc7PKjaORsDaZ8OlBwPEhIV8wsMsYhox58pPLjbsHzQOQdxnYZeRM4Cwgp0i7E3bPkmyuUNDdZLBbZrm/N+ovfgOFsXopCxM/zAyaZMLnix2ODwnTGxm0Twih5h4Osz4zJla2uWPx+7FX/ygB8VCfc+lKxo1mwuVHGRcfTeD9IEBvDAXsFeUAe4+5sQ0oOYuNxWu51r0su3wmYOYKvuQs/R0COGcE/4536wpjG34ms7p6lq59nUOR920AvnQCSHTSxGftHLMWqCDdGpNzDds+Bbg2hXZlnloveJYxgLKRrJexXqujB6JPAOILYHWN/XwfVnC/nlGwt+bgRTtGPejcrDe7srq6fG5hLzvdM3ZF7rtr8jwv+7gHdL1/vW+eudv1QwEiC/Ap6zevMgPonLIyAy0AzLUNka1SDTfH2c2T1Ty9MYJSknqLD60UdPG7X6d7JRgHDJczitJPquebBPM01/KTbgJ18swFqPVrz7V1o24CJX0WMbC+QaH4t/xqs80222yzzTbb7HPZwzeBf/G/DnzvHwE/+iev2pvNvm72HMBvAXjyqh3ZbLPNNnv97PXe9t3LFJdA3GnQ96RZQMfLGr8s387KHK6Ax6f8M1ZBH/w5dW3oAqfogrcO7F181/u3Fvgz2eYSiO7YEsCyH/ugdeZlAPVUn5zro9z1seV4M2nLxfk+eHq63M8cqLdqDgfg5hY0JzT6r9nV6xmSMKCGmjkZH9/g8ic32D0B4jUBkwZTA4MHLgy8CtwAPNjvCo7qcZMlpiwgsYFtaS/SyHHiBjAChNm7ljOVcvWbWHL8xokRjgqeZKpAZ5A8nfMVMD0YBPjrwT0r2ufUVICVB5J/BbCs5/dyx3ZtYw7QbYBLa8upofYxbO7OZQfQ9WagZAHzuP7u//mqDJR135X2G4howGhoyzDmci9B7JnDFfCt1wt7sesXwx2oKwNo5Z1ZQGLq9bIhYGoMlUmLyBW07s0eAbQ8tia73ecobtrqQMI7Jbutjf0xN54cuAC/jctF9lpBVAVSy/17l4SmA/0bQNV/ryBkGgnzJYFHYyfbM9vfBGjH0Y4FgIYMSfEp/tJMujkjC8jqZY9V+vikxHF/75Q+49J3lKvCRr4akS6AfMEIyjROKQCZKjs5YzH3rC6OqHLg0D6OQN5JXmiOAp6PzzLi9Vyfm4GWKxwrW4Hels3swF6g2cjRMvHbflmZ+u07LHfgzWe1O+SFDaTkzOXzqq2lPDi33unfrWvl3We95NcKd5lbE6y2xTGNz643TlzXlH0fn/pzVq4p/X5f2eW17+z7NZC3q6vYWptVyruct3aOXxd6v/143mNsF0DqPawBJlWZxvu1AHvvU+YptZkT566Wa6k+7H59kfu27iLqfOjA41Pln2ANr5YD3P03A860c7PNNttss1duN0h4kmfkzxlr2GyzV2q7PfCdXwAevvGqPXmt7CoEvDuOiFvKjfM2AfgRgGev2pHNNttss9fPXmuGbwXMhFFFKs/MMZRgM3spN5N59rKLyjBsAFWgBm6yskxN8nKw8xiFfWNBJR/knf0u/rwMznhguZG0czv/nd+N9NyKVHM5nqvsLYhE5pm41Eee9bsSCCrMHZVoJKCV8Cv1UpUmPCMzV4FhVoarYyplY+CSMo9CPdeuPcemNlaK98sYTCYR2eW1Y8+4ABrZPJ6rDrIPlNVraBH4ruwcZQr3wOPhgJwSwm4EXV4Kg2MQpm+Td03ZIZxzlaAlAo2DzOfDhHiY8M5v7/H050Z8ehmFSLVP4LcmcBwwXMeSrzcPOuwJyDv11UCVAExvCEi1e8LF5ekRkCbNgzkDwy03jNAwMeJBfs8jIY0owGOYUMAUk2MdbjQfsIHQo4DGh7cJj+OIdw4ZY6qMSkpcZI7zQMr8VfYfc0ukZa5gsgKZBgSlfQWKw1zHgzJA4MKs5MhFQlb6u5YFdMBZQUCBkK2PqYBsDRirZZVxHDtQzuqy8xyAvGAMd+ByaSvX9hKLnPUix6kDj0MDYEIZ2cqGDUtJYM4kLEwEhJAFHFPfSPOuIpBIHlvZWZ8vDrGLQRmOMSPsEvJQXzkePC9XEEo+ZssLXaSNSZiddi3N7hpaAeHtUa6M7zyQgLf66JY2BmUyM/LAhY3u5X8pE5hYgV8B7UNgZS+jgL7xKPeMMXkpCeMuG5NU5yS5zR5NDmgFim184lE3XkRgvgSObwI8CtjLDMxTBN/EVr5Z/1m/5R0Du4wwut0aGRifEnaPgeE2aQ7sUHJ2S6eptLJt/rAxQJU3t+dJaJiHbv4xI13t8OQXL3B4m8EXMsFSCsi3AeEmyPMkyvOEAsu9G929E0QgwaTL804+z5ciD84DY3hO2H9M2D2dEK+P4CFUEDZJnmZils+ZwaMwf7OywRuQPbl3ZVbw16H/PFDdpBKolCmy2UGY3iwAOiXIu32eP6ekc/9QgDmwYPCyq4ccaFgYqyVB+gqz1bM1T31/6juzUwBjnwKhmFs7nMjx69vIKTVgYSMHDHTrptzWtyLt7PvI+1EYsP21WqYBpDSM1a81ID2v95Nn2Hr5ZRm/JBtoKCzWVk0dnUpK2XTjxqfkci7y2RHU5zxe9MOZ9dwKgMrJAdUrjGjWNbYwUe1FV1VUsLK+KuMaaKGy4kHd1Q15DZO4Az2JgHmWddg0LdpE47AsJ8YlaOvmGc/zaWC1P+aZwVa2lenXpHruGpju73Fj9i7Wqr7szTbbbLPNvpL2N4+f4tfpKf6Ni2/jIb3eIbnNNtvsxewvvPMO/rVvfAOX28a8zTbbbLPNviB7vVeXvVRcYb+u7JTiyjhqduB7QNhA03NyyqsBJq7HY1A5SCcBd+76vHIMcOzcGhxaA2iLreXtXQEgxR1lQnQSeIAHjOJqsKkBYc8d6wPC92Ul27n32e16jvF0MgfdiaCczR0XbKvudDmMcx+07nwHGv85JfDNbc3fFkLNHxna6yxXpOR0U5CNIhATKGXsPz5gfhBx/WnE7QhwYNCYwSMjXTJwU0HQlv2JCqTkCtAaMFRAzyA5fAE5J+3r9waEWc5cdlK0AFR+FiVH6XAtKFYeCUmBMgFkgekhRLZZ286CLVaWKgwMEySPQQV3MXCPwcWnAmaDEIiRe/VscniXtdnyerrvCmhmIJxd7gCo2l6V4UYPDjcYUfXbAcsNqFjaigro5upG8Ytcedy3e3ke9+cbEOrBXxLGNyVGOOicZJK+Y9RNH7Tyz+orDYWwfwHU3L1c/9nmgc6/xrj6W/qa2zavPd6tfv+5AfK0nTLfay5WUh3t0sagr4CuT4kVLAYQIhfgjJlKF1BCyZ1d8sZCyspOkp54hS1PUMYpirS3Z4PngQS8Daz7kJQhqxdwcG3wZUYBswOxSE9nAiUBp+MtF19FGh11PFVuu5/X/jlgmyz8/SIbB7iApXkMOLxFSBcCioaQhd07Bcl5POt7hyDPu4AGvCd9RnJkUNJzI8CDbCBBIsRrwv4TBs367rZNWMzL533PXCbos8WtDbj2iwy4b7/IV9Ps55b6NQQQJwHX7L0uOws+t1JEsy45895bgI53HC92l8zzKaBx7VoDR9fq7N+ba/WeyTlMHpT2IOWZPlmVtl6zu9YTypo1P9iBufcq/2S1HmxFleYGluonaz6tpjFxQLX9fm6M11JvvCzzaUDMvZOqNMvxLXLMK5sJ/Br1XveYl0xeKaPJt7uWh1fL8HYvhnP/t0r5e8GBsms5gf2GTrO19eqK1VQsL8BS3myzzTbb7EuzCYznnPAP5+f4dtzhF+Llq3bpc9sfHy5xmQJ+L11vmQQ22+yM7ULAg5e8Oe82Jfzdp0/xu9fXL7Xcxi4BvAfg0RdXBQCJL/wIwCdfcD2bbbbZZl9je/0BXyJh9jK3TFxuAzTkQVkfJFLAV+RWqQZ5LFhLVPPHNsxaqqSbDjyVgJQLFkVFEcwHH1RaY67a5z4o5XKFlesB2eW/mmuW67UWJNI2eaavr5Pc5yU4ze3PU3KDLPl/a8BJ/SwMoa7NPihpTGDkVo7T/ElpyVxYYx35oKWdHyp71vws5pkXOS/6uslvrHkK2XIGlrx4mocts/hv5TMjP3+OYIyNnbCCiFkkVn07cxbQF0DeRa07A5rPN77/KS6HgKtvXCFdEKYhArsMjBnzgwAwEI7USjIrIJMHAaRCYoRbqS7tBUxiexIEYHpIGK4Zwy0XtmwepMAARtop6BJIwR0doiysxLQT4Gr/hEFJGLd5VMyRgLxnTD5fqI0vsJBqhl5DqO2w8bWPFVAV9iEngIbqIxM1gFthP0YH7ClgFZLgaA3g2392P4ldzlfGAtxtQTS0MsOMRZ7ShmFsoKCeVwDc1JXBvMw/rOUVFq3NewPozAjgQXI7D7cAzSIbDGIBbTODBh2e4EEn87ECdjzmZuyYqQCjBAH75ggB3db+vtEYdph1fEa0cr9WrQMF2Y+Na1PtG+sLKnlfEbVtxIgxY54dY1ABVU7aqFw71tjLIeQ6DQ10ZfE7Hqujeaj+V1lvFBZ+uecYIqls88C1rTRlANJOfAeAlAicBLxdlQe3PokAxSzS7ykAs8g5xxtgvBY2veSHljZ4lrcx7qX5VDZg+GcK+ecsAzRnhDmDpgzKkrP59l1GvsqgmBFiFlb1MSBMAE3W7/p8UDZ08cP1STAp58hIewYGRrgh7J4CD348i4LD4DZamVsGvEeAk9xMPehb5PQjgWbZENDmAbfnkzyuyVQ+rPwsBdGcZdySSvjnXHOTfhbrNxApq9fLN1OgChr6d+kagGnv4D4PbskrSw2wKf3mmId9zlary9dtdqLNDQBrfvbqGcoI9YojoAAaBvEjJSyYqJ5R27W/5K3t1ywdS3YBKto+Oru+tF/z5K613aSZT7B7yznehx7s9Wzq3pQJ3IDM3Xmlj32b+hzA5nOvkuJz/XrwGahgae7WeL2tbQrsf7cxtrWxXkf2jPHtuad88RqQy8wLlrCdW4DUfoPlyhqwbZ9jDPtzVjb8nQR77Zj/m8Ob85m7DYiIsbJ519K8AIAxmIElS3mzzTbbbLOvhB3B+E+nT/DP5Cv8fLgAUN9fr5sREf7F8U18GI/4g5sbzBvk++ptJfa52dfXnqaE/8OPf4znX+RmvzcA/Bks4nUv3RjA72IDfDfbbLPNPoe93oBvD7QOCpDNTiq4P7db8JAFFE2+uT/nFKPXf2fXUBe0tO+9P6ELSBuQaUFMH/zp/VmThVQmQilxxX9mlgA00Aa5oH9UrAWpuMpIn8zh5pmuXUCPufPVB5i5q88kB60/evNM6Sb3m+tvz4hhkRBcBL8poFSkMrbWH+zZYGv9AUg/6wKKTfbxvjkJAfDNDfI0Iex3YB6BQVnUTGVsm7ySOh94CAAGYXjPCcOn1/jGbzLy8ADXOeBwGQRgusjA81jkeUOqQB9DGLslxygBCEC6qEBPvEWRyuUoTN94K1ebzGzeEeYHck28FXnkBsQKKCDwfCEgGxkInYWVZ0B0HglpH4XZ54DECmwKWhlmAWlyFCA7mDQrkQytjlM24CoYU7CCaFZ2HQw0LFsDmHKsPpA7t+S7zcYQ9qxAVOaqnw6KP/RsXgAVjEULBooT3XE4MMwXX65fop51Dil4peNAyYGQoY5DPALDcy7gKmcCRWHlGkNXQEXNw5sUlQz6GSjgLwiYpogYMvbjjBgYgICOGBjzVZXclZyphGDtpTo/7ffCePVjx1iMbZVLrufYJoTpijDvVYI6AGHIIBJ54abcTLVtBlYnKVyuZcQhI4aM7AHtRAhHRrzNurmIah9THVvZIFB9tnp9zmYZH5n3xMDxQcD0AEgPMii6xicSANeNq9+YwJHBg6DNKQUZ0zkg3hD2jxn7x0mYw6MyfHWulHsroDLYk76qVBKbmJfsXusy9SM93OP4RsT0iMG7jBAZ8zQg3UbEW0I4kjw3XD8EUbQt91QerP+o3mcq642ZEG8IuyeM/Ue3Kj1NBfS1Z1yZZ4DIPau0toHcBXyyjWGR9H5z70nm8swwyeYwsUg6M8nPlEBz+86mzOCcW6nVFzG/trBD/bvW5JpNvtfedWtgpAc0fW5eUgDTv6d7eV0PztrvJ/3u6nbXEVL9PSUUcLSTBS71euDWwMGe2WpriB54tX7p/V2Tj15sTFvJH+xB2IU8tZZna5R+zF2dfoPYqmqIX9fcR0q784ViXK6PvN8FUEfbd27jAPlUBP1cOOWDfXRgvaiaYHWzHpeUKlSuW9iZzRJ+PduDwvbdam5fLZcD2nzCZm4zJqfUbpq0730wzYOpIdSxPwUcrwHNXt4ZaPsq6QM4dCB7vyZe8b+2d2P6brbZZpt9Ve37+YD/4PAT/JfGt/DdePGq3dns62C//1vAT34A/On/CrDf5tRmm2222Wab/bTZ673l+xRz90XkE4vs4so1L1IO1aDVnWWvST3b+Z5hcM7n3nqwcnGJA3BXgMyTbc01aLZq52QQGwcyFuDsqTKbwGx3zr3k80INXt4jOO2DhidzsZmZ1N9nkHDkeUY+TsBxkk0Jfu76vNKA3JkZzdzmIYCHCDpMGN5/gotPGONTAiYFLiIvGKRQAMYAIQM6eBDg0gBOA1soVVDK8qWaPzwo6Gt5VdHVg/Z4AUatXJU6NVnhPEDyaXasUW/EFWxZ7XPX1gI4nRoa7n66zw3T176iesxLEZ/y9aTc8KlpvnbcgOj71rFyDq/cI8V/RjteCuxRZtkQkDUXZK5llOIK6Fs/c6jAqAF9BhjnTtY5BJa8yZorVnBLuz/v0UZ/vHtcrfZl+RIKgFbfg4HY0Ee0neea483Pjxg7Np3eY2EGKHHji2xu0H4oFd1hOgeCYgZppwz5UeSZCZC+tbnSgdzmJwcURrCwlQEkIB4J8cCIhyzPgkAN4FwbjbrRYfX9aEUv32PEjPnBgOmSwDsGFGDPMwFTAM0EmtEwigFti+GLASVHdVEsiJJrGZD+Hq4Jww0jHOYK0JT2tPLNq/cFQTcHoTlvwQC2j91ag/T9TjkL2LvG5n2RdcRdZuzRFZnjU0Dwve3Uu1zr4x5gvY/ddd6JvL0vZFrGor22DjjFdP6y7UX6rBvjZgMbHIh9yl6kfZaTuLv+7LoPHcDagb1nqyuM189wX4SlT35t24C/ZXPDyviv1d2vuXO+P0i6dt49rj3ZV72k9Dnrz/V/C3SbRTbbbLPNNvtq2nNO+MfpFs/7DfObbfZZ7eknwId/BORtTn2VbCTCe7sdHm7KK5ttttlmm33B9nozfAEBwGa0gFkITmZVg8AxFPlJAaFcMMcDxcrwAdAGhSzXr8kamgS0tz5vHVP1qWfw+nJVwrfZqT/o0EwTFqxd/9l2/g+qu+qDcMoyWMjmmcSlHT+q9Fsv6+fMy/gBaJge5dg8O/aIk14sPimT55T0ogU4CwjKwtoOBMyzY0UYEyLVsQjUjqNdzyKpKUBurm1JNUDYgOG+X6yv/bg0oCw1zJx7BdhzAj+/lrk3DjVYHaOAvH3eOGYBEjRwx1d74DiDnt3g4fduEA8XuP3mgPmNhPBgQroUX+Ot9EU4AsON+HV8g5B3wEwC+jRMyQFVXpUUYBpE8rmXpx2fCwMw7wRBDATMO2gOU6oA2yBAYrwRgC+TAoqa63S+CDi+OWD36VzAMFaQPkdCSAzMjGyy647pm69iyT0abzPiMTtmKCmrVnPsMhcmocnlZlCVUCYg79CwEwko0sE1nyohk7S9+AooE5mW8sJcplz5HRFVnlbL9WxVk7Q1PwWAd9cbyMcoTMzynX4sbEZlORIqA9uDeF4OWuSIUQE3j+0wQCEjDISseWBhZRB0c4LkWG1ARmcxMIYhAWPG8UHEeA0MBy6gnh+Lkr/VYZVe9tqA0MXGBus/yPhWOWLJ6ZwuSHIMZ1K5aQFvp+MOeQrC5DWgO9Sya35rFoZvyAUsTimItLLN64mRLoLINfv+BoTJnB3oawAtA3HishkjJEaYGJQYORKObxDSlYCmBjanYyy+lnvOjHSzxY4RrySpNjOARAiHgOFa6qPMSJcRTIQ4Vb8Ku9e/Dhr5dbi5Q/X+COI/ZXlmPfuZEdfvkbB7B+kzvh1AhyA5hI9APDgwV+cCAHmnW99lqSLtJU95epARbgPiNeGd303Yf+zekfoekBzCGTxI+xiEkHJh5DJJn+RBnjVE+vxiFHntdv5pO01RQOvjskEoi5KHXyc0P18A0HyBjWsmuUv2ijKgUKWfT9ad4BiF7t1nMr3GUGzy1mrZPm7kWaFrLOY1dnEvo4zYrp3OvUdPfef7oPdrjeXq21fWHbbZbgVYXWPzAkt56lP1memaofRlz/pdbBrs+ruv36Sde2C7MHKr9HOR/9YxbtZwo/tTQNdU3LwEOna31dEzuY01S7VPLDVA+R5urDvp6/KdsdaNHYwVcHRFAhxwQHQZ/1yvL2BoXQuuMnidFQZwvxnw1CZLx8ZtyjP5Zlun++u6lCtLdnhXtzjflnsqcHiiXZttttlmm2222Wabfbn2c/s9/se/8Au42DbkbbbZZptt9gXb6w34nmJ/skM/7Ksmd2wfVOtAvAIs0vo5/rtVpoCrqw/qrJ1r5/V19EGh3joJ5sIQtgCPl24GRKqyBMblHIndd0C1tc+ChgYWa/CO+v5Z8x0KnPo+8LLL/bkxVHlB70MtzNXRSRtajmQP9ELLciB1aQuwDA4CAhD4IN7aeOh5VQaaSkB2wbQ60S/5cEAIBJqvBHgYh5rPl7j40BOT2NgaMYKGiOHxLS4B7D96AHBEupyBkZETEG/ElzwKq44yY7jR30c0eXENdLJjlBkhGSAiIEzaaZNYGIcG/lKSfJJ5IJHsJb1GWXMmG8yxgnlhFvnoMHNh+BlwZKAtZS45RNMugCNhvgwC0AwoLFHJ9xlACdg/lfzHYRZ/OFDN35lRGJ55JU9wAVEdwFf73X0O1IJd5QsUCV/rJ/+dHHTArgPJmnPsVA9iUluejZP3xc8RD3Q2flj9Dji2fhcJYSAkQnLsXsldq3iXA3I5cgO0moSw9WtKQXLj7iYwkz4Spa50SRgOXCSE+ztkwaT2j23rM3Z94vq0yAyjnmPzII86B0KFMkhzFXMKym7unLEcxcH6jRp/g875Ivdbnj11DP286K2OZfXZy1EDQLp0THyg+NuwtfX+hfkZGKxM5pQl3y+S5mp+DmUit/N3jT3d5IB2fS++9+9YIEwqaU2Ew1uE6RHLBgDSKmbN3etAag/2GvCfUT9Dv0t7IGt+aZoI8ZawezwjHBN4NxS2spXZsHCLk/WcZozss42l64eQ6rz28tXyJeozPob193Wv3nCXrUm/FmnnFRDxvizak/VVMK9udLrHrvNT7/NTPvZlpoRVQPhlWZ+7dq2f1jacmZ0Aef35BaDtN7HZeX3Za6C3l+TWOlfB396fHuReyYfsyyjrkxPyxgvz5Z2Rfj45/3yfdMdLnt7+e9+fna99OhJ/XpOv18sl59wes5QcTu659kE+/fmcCk51EAtG7dp1bl3Pbk2pDVlu+jtlzUbVXOuDrr17cPrUS2izzTbbbLOvjP1BusGBM355eIDxvipqr739IoDvnvn+IwD/8EvyZbPNvlgjABchYHiJgC8z49efPcMf3txgepnKUt4Icpu+88UU39jHkNv+9kuoa7PNNtvsa2yvP+BbwEQSFm9SVmRmBZ1W2Lz+n55fmDl2vH9ZegZKE9AB0MdkjCET4zIA7EFZfx5Qj9tnYH13fh/I6pm0xjCwc0sbtK1dHmFygWqeUxeQq2CvMaBXAWILRq9I7sn3Lkg4z5WlC8jxGLUdXXlAG4w0Bja78YxRyuwCvIXZOwzF9zJYPr+dt76vO0C4bbKBCwGAD16nwgrhhuGsRR4OyJkRHz0qeadNBrUE6aKhIJ2PgxzjcQB9+hTjs2s8/OElOARcvxuAMSMjgD6BACejkJnDUXJd5h0wX1IBfYMjkhibLmQoaxVIbwjAmvdcwFsEgCaRUw0TwEnqAcucma8EoKFZzv3/s/fvMbck210g+FsRmXvv7zyrTtV11X3avr5+XT9w2w3tkmE0NmADHpoR7hGtmcGebqQZeQyjAQkhj/iDh3iIfwCNjKWRLMSoZWihEa0eHm0eY0/zsDEwGIwvGGODfV9V9966VXUe37f3zoxY88eKFbEiMnN/3zl1qs45dXNJ3zl7Z0ZGrHhkZuz4xe+3ojdgDgSU685ZWIaj1ptKDF6k8hXI6gTsvbjjEHaEsEnM4wQ+ZXngTzv054zNvSBs3CRZreBZpAT+NexFZdK2Es459i4ZcMsAkCXW6RRUznFIgRKD2LAkM6PVowCTOrwMCKXl5Zi21ofk95JVMV21Xgk8ZgMo6jhwI8MNDm5kcZ+44FzEcC4WspljIFKKb5vy7jiBg4Q4OIzpHheypUNMGxqG60B/nwTwjwyKRlLYYpBUt4EcoyTzyzK+gHytgnYqA543MqQxGHsI+OiQG9MTC2s5zIC9FdCZ/IxSF/gAl2SqcxzfxGylWJ5t0sb6LsIEvFf/yxgqID2lWKVhB3BfQEcGgEHa3m4MmMiRO8gmjBECaI8EfyBs7gmDuDIzvnKfV+Czlk9Fmto+5lMad4xZ1vrwPDDcjiCvCggEGghulNi9lfy6A7gzmAQhS8ezB2LHiLsoY4yEHdxdAP0X94AnxI151zKXuOCmmkyyKcUCvjn9RIa59AGNMcUFtue5/kwkKg1AYQCnv1mA7Sq2BPACUAavjd+bP1tFigYAtO/trG4RGeTT9yvGaM12Kq6snl84Lv6GCuisypljlQKngeFT8XWtqbJGCKC+iWdr6pSBVwtetrFx1RSkHLQfyrGsBDIXV/myNmzST+P/zrTH0nGgzGVtmlOgrSlXXImFIa7xlG1dogN8M4fUOuj80Hu5TyhO1FVyVu19mTYkkPeVeg2QfLGsWDPH1fJ07p3HuKeSLl07BxhLm9WA6mL8XrtJU+fmdq5u5/g21m+qA6lKgWanZc1sFiXvS2zwtu5tWiLQUmyJ1VZbbbXVnhr7N+N9/Cpd4Ku7a+gvT/4Mm30nfSOA7zyR9hPp7x0CslZb7T1gP/Xmm/gX9+69cwV4AF8L4OY7V0S2z2Pd47Haaqut9hjs2QZ8m4VVGpVqWRbP2TJw0jU0jOV6XWxUAFYBWV0kUpCUWZCzzpf87CKqsnrJSRrvyjHN07JrTzEGWsC5ZZ1aiboZcJU5ATW6wJTyygtoCgib4zXTwcj52QVLi2ybhTjOQRcjZDaAsqhmFwN1Ucr5euFTfdLFQxu/po074qhuf4dybfZB8iXiOn2SM8wgtrbhDJDPljWRGVzS9xwaQNcRyJlbaYxgy1yZ2UDAISB+8Q24WzdBZztwJ4AFMU/Zd674xgRZqNz1eWw9/2/uwo23cHihQ7gRwV1EOBPJ0/4CAnp54PAcQeWC/UVqwg3y7yeX2JHsBJzkBJIJ+GlRN/0ODDcErBqvcZZEVuAmJpBKwVMKQH9fgJPYF4BX60oMkAJRBIStQ9wQ9s97hC0wXqPE8ks+jEC3Lyzk/YuE44EQNhKj1I3yx54Q+gS4pmpkuVZVa4zI4LSyKTPAmgBE+VgYtCLnKuVrOqePFgWVHRJzG9UfxdSaxpcqdm86bqWO9Ryn/QUu+cwV0lf+MovY5M0OGSSOSVHcskkl1jIBUVikERGBHMgxui5i8Ok5mKnKyL/ZKbNhGYiEGAm9DwA8YhT5ZL+JGK9zjg+tstOV/9oGFq9L4D5ZACCVraA5WMaGSCuLfLJLjG92sklAYw67JMscuLBfq7IZCdBObQbKDGbvYnrkCwueg0N3KAA2p9jVllDF6bXh7PgxLPgMzpvqha3DuJN7K54FdLuEkkYZXBQS4D7Tdtwz4AsYrf3jjsDmfpT7a+fymIgdZbCZgXIv66snbWZQ5iyhjhcurF0GhYjj7Q2GWx3GGxG8jXCewYHAo0O3Fx+K/LoBllOM7wr4t+O+F+fo6HD2GuHa5yIoRgFa7fPRMHsz49dJ/TjfEAB3ZexxJzK3lORnM5BOcs6ON8k8bU4hB3esN/UwGWhlLqbvwxrJM7MoSBS55tlYri14Z8tXVq1h8+Z8W7B3KQ7sZSAhUDaxWenkdE2RFk7zgAzq+hngPc6zRPVcA2hXzNg55u7cMZ0n6nkDzGYwGijlWCnjORlorbv1/SqMZ5Mut431OTFtK1axtbkNckvAdyvH3ILsNl3OqmlXM5aWQoCAYwGGU36yQasGeXUs5jE4N/ZyH48FsFYzgCezxNSWfLReZt7sbf1imY/DLD+3oK8zGwSMQk6V1s4Z7aYL58p83B5TBRzjCzsnz9qW+aufzW+IKuxIU082/ikwzHHEaqutttpqqz15cwD+KwDvS99fuCT9lwP4PwP4BwD+3Tvo12qrrbbaaqutttp7x94bgK/9PpGZnFlstQsleshRYhVyAegqycvm+5JEdCXrdoWF3jmZ51aibY4lvAD2zuYFs4DUHJ/kmcHrZuFvSZ5vsdwZwPdU8lPMIsuunr14oZ2t7LZdrHRXXIS30thzZViWtFm0rOq8uOAawMcBfDyCuq4wzKP8o2B+K5ua/XIsMYCHEe6Ne9i+cQ393Q3iGYM3XJimCgoqUGjd54RgtMPLE7grwCfmhjIxuCOEDYN7YDxL4EFIAJxn8MbU+yhOuBS30x85STrXAJ4yCWMnYO945jBck9jDCj6zSwBTBEhDOxMQEmt5uI4cJ1gBrIphibo+rcyyMnqr5VgL9rRmwanQHLfg1VXMgmBz5XLz2YLBKHVr499W4KPmr6CbSlwzw8bwZdbDBEcxsVlPPNV0+IPAUf4AwJEAj/oXN2lsAYmJS7k8Zeqyyc/2B8W6PAHWEwAJ1IoLBvyWMcXCeiWYBj5dl6osYsBxro8jfbbKeJOwAdZnlL5LfVKBnIS8MYCasigKCBs2aeNEx8KsS+XlOMsW27HV9uJrlWeQTR3+EIuEuvZ9AkpZtw8094e2czlW7g+JmZ2knCNjvO6xf84hbqL4TUAMDhgcXEDeGGDzz463GxwAsOMsxY1AoJHQ3xMmv30Pcp1tYfjmvqjv6aoMSuM21T8z4e017SuzfUaYsZdB38ckqzUnzbtks3LAdQJ5l+u7/mElA+11czLID2Nt+qVQGXOgbWtLAHTrp6PMwn0omwG6Z9v6FHP2Ydps7vip9m3b7irMYXvtqbFwKp+luVQrYz25rrRDNX8yGweX8z1xHmW+SzbEyZLFWADaS+7XWfWaU/kvzR1P2CzY29plMXktOHzVa1ZbbbXVVnsqLDDj9ThgJMYt92wv1U3tBoDnIDLOL13xmusAvgrAvwfwBoT+t77TnjrbXQNuPg88uDslbLwDtr3pcP2OR7d9yN8eqz29FgDcxyrlvNpqq632mOw9MYtk79Jic9lxbyUyS8L0uZVgA7IUNABh5ei52Fxj2KI4jkaejWTuGYoPVXntws8M6CxlB2EoKOugBZ1VHs5e2+SVpYbnJIg7V6e3gLCtm87TLFjaykEGYcIQyTDimUVB8g48jgAzqBdaH4dYFj4XJR8ZohXc+Bo5xUpMNEc1BUyZhO2RmLfZKklLDyhLpCqSM+O3YlkAlWQgdV3xMcsjOiAxxy3Dh/MiakS78MfDEfzgXBhlfScs37xYzFn+UNkaBIB7JwDMxsPFCAoOvD9g99o5nv/FDp+76RB2oQC8LsXfJWH1cpJXHm5JW1GSHi5ApzAhLQNW475m4McB6IHhRgRvGdxF+JsDOEn5dtsA3wUwE2JwCIMDnXt0DwjXP83Y3ovYvDnC70fJd+MEkAIDgcGdw3Dd43jDYbgBDDeLHxQTYHxABvwyyzCxMfcvitS0PwrDr2LqAlW81Az2pnoVieV0X3jKLGAF4pTlSyzxXy0rMWwkjRsL4DfHYLWxfrMPrXYXC6ANkn6UC9IxAwiTyVPYqMgAHzogegV0IQA7ST0pILOIc3zloExvkb8lz3BewF7vooBuKa8MRivL1IKog4zbIUjjeccIEXA+YrgREXsPRJHmBTNiT1W/VHVKTGqOCWDT87kNa2Azs36TS1mWudcDnEhR8hx1XUQMBO5JAEUhJUM3NQAoEsme0XchsXxZ5J1HB3dMMsUhlr4x/e6PaTyZGLMaD1fHreLQbmT4Q8ThVofhJiGeBZBncHRyTw0O7ugyU3uCXROAnkG9AsRSL39B8BcAjQzeUIqHnUD5sW7DdqNA7Km0u+1/AC4w/CGAhghi4PxFj3sfBXgXQZ0wqXF08A8c3IHyuLOgt94nytZXZjUTMJ4BcSvgMUaCOxCuf27E7tVzxF1XgOikFkAh3feO4MYoEK5LWwK4PA/svSeMXpG6VuZvxeRPvpZjgAsCcnMvSiA0BHOfpozDIyx42Pc6q9QsZdCtjRW/yPa18WB9A5BpPFagZiNaazd+zUlDq1TxUj7tnEDjzlrp5FPyw0ZaOddRr5thtOY2aMFOO98ITRva2LQmbZHINv408XUn5bVyz838RiV4cz2aNqpkk9u2a0HkNp5uqziTyiOf5hVZYUXHic/zF/IejFD3g813jm2s19u2tj6rCsowZh/y3HTmvsgS0JiZawETiWcFiS0Ia2P56v8T0HdpkyWQ59c2L5M50PeSTwjzmzHb3wlLFmMt16z5tPG+LXu3LUOVelQaupWL1njF47hc79VWW2211Z46O0fEf79/Fd/U3cD3bF980u48Zvt2AL8Vj7YE+d0AXgHwFwDcfYw+rfZY7Cs/Dnz4Y8A//JvAvTff8eK+6jdew2/43z0P/55YzV4NAPAAwP8MYBWlWW211VZ7LPZsvyJbENWwfTLQa9mwLSPYWpZeNgBnAhoWzZkFR5WYC6ZczUP/967EDG790vwSsLcE9gIQMPhUO2SpRgF3M4A8V+cqG7NYtrAIXBbsDMvF5qNy0LpQy+kzmbRzIK9lI9gFb2c+T50px6txkFi8czKFukBpGb8sjN+8wBe5lnQGpuwIC47Pnc+uaHvNnpbFuIsL0I3rklffAUgMZOdqhi9RYsAm0MI5oPMCpF8ccf3Te/Rfew3hupNYlxBGrcbQDTtkaeWKKRkV8EjYYhDgJcfuVRcUlNkwuBMmMTYC6khlAIwO48FjjEB3z6M7J1x7C9i+wegvGLvXB7hDgD8kIMNTPRySzLMFAN2YbhmX/G7qoIRBy6iMnYBUEqvUtJv6qUCTM3lQAT6BApQq0JyBNQdEKjFfc6xYffyor4wyYSXjnwJmKG2e2w91nuVA+ZgZoTS9pjB2OdfBSgZP8m3ydwMykKgs3SpOMXHeADApOAOB2gh1ERrzVuOwtu1ngd6cLRLIpj655J8Cj5C6VcAdSltn6WDdqJBOyu2tsTudDICMuFIZVAbnsNVRdi9RcZodRBo4bTJoGacKGFr2toKeld/JhmuE8Ux9EuA9jGnnQ0yJGwA2b1rwDHKyIUElq7sHhO5CmPXRbi7Iz1DTxlzGjLaxTUPMZkxxkvkGYu8QtoSwTTdMkvamUeL32vtI75dqQwXDxHEXdnPcRnnWDAR/4dDfJbiDxAqOGwLadjZ7f2LaCJRjggMZxM/9kJ6nlDpC2cBcDUZkmWu9pkj8ii/yHE1jwaO8509JHz+MpffYHODYgr/WZsHFKvSBYVfOxPrN3y3geJnax1JcWaCJNzr11zhe10GPNXF2q/QnYgbPF9HkO1em1tfKPDf+TerSgtLaXzixAaCVkb5qPOKW0WsA2lmmd9s3kQvY286V1JbAZz03uxkgjcm5uWQLTi/IU0+UaYzSzGK8XZR5an1tSjM3V7sMDF2IowtgflPHqfRtua1ENIBq7t8et1LSNtzL0sYNDU3zUFIjq6222mqrPUkLwKkZw1Nnnw0H/Mcg8aLOOSBOfmzeBPDrAXw18MjRiT1k6XJ9nz2V5hzwLjLSnSN0m3d2LPynnz3H537piOGwsH78EEYA/hfPPYeP7nYnl5efSvsyiPL65h0uR9cB3n5zr7baaquthmcd8E2m4C7r4q6VW05AInsn7KvqwgYo1eucr66dk4peZOguySwrC1R9aHf2m9hcmT2g6WyZ7eLQjJxcYaoaALmNqQfUi7wNe3fxfAbOLRjaLN5p3DYtT2MGWuZ0BncL4IoUE9FkXNe9qqQuTMYEohuGjbJPrG963rJc2oXN5P8kfu9Sn8Yoi5mGFVK1wwRwnmH5jiN4HOGGAeQd4jVKQApnZqO0E9XjlVIMSXagvgPtD9h88oDN3WsYbjuJK0vCLIw9IZIw5fyxsGNF5hYZPM1s2fQ5bhhhx1WcTQCZ1UtnAb6LGYiKowMGQn9X2LzXXmWcvR5w/T/eh3/zvjCgN70wmTuPeNbLODFdzk6ZhwXgdQPASSo6g0yjgCvC6Eu+mVi6nORw/THJRhMhksTzLf2Eit1aSctC2kLbJINfCh5q+EnTLtRcJ4xPzixKy6KugNf2+nSsyo/K53yJAQor4M8BDN0UUI5TbCSRZ0xisRZAkSMhOirqwAqKMokUsxpxKR8AcR2fUPB2iZ0Lp6Ax15crcNtkyygs2NhRJQOe5Z/tLar9pHnlPkvvCZa6xSgNxKMAvEwCpLG2fYTEyCWe/d1BEJaw1lvKcDmGdU7UmgVR58YDACbCeB0YbjDgAOcZPgO+pb20yXMEAZJ6ko/lcREFbN3cBfpzTrF6NfG0ZpyeX6Q+orxj1bd8TP1I5+PWi2T3xrT16ECDsO7bTQysgC+X51DuLwdwDwF7+wjae/hzwvYNkaXOmuNkWbtc+cid1MWZMcMarzM9F7SvGEhxeRVEqjuPAbgxVq8lEIFGAZHIbiiLKWbwo0g6t5vBqo1fBvS1cV6X5Hsty9fGPbWArXMSC3nJ1znQcIadOpk3tOzg1q90TbUJrAU6bVmaj4KvcyEbLOO4aZNJfF9bjqqazIWi4FgxUisQdU6Cui0/MWgRY1FBsXUyn23eFdu3+t7ORefzqupxWQgLy+K1+bT91+ajKiR2c16bRwNEMnNhHi/5csosSNyAqsyGzU5UFHNsGhMnuAKGG3bvhOmr4T0m/pq5uMmHVCr61DPAgrZz6ezvDI37m+ewrvjmfbPxUp+PRiWmjemx2mqrrbbaU20MkXd2AGY3Mj1BY+Yqssyn4wH/cHjTpNAfoIBMsG4B+G14jyw9Plumm91WpY+Htl/56XP8yj8+fyx5OQC/+fnn8VVnZ48lP7XILMs2j/Kb86r2MoCPvXPZ54fJO1iF1VZbbbUvRXu2Z10si9dsFpoy2LsUO6uVe24nPy0ofGoRxi7URBiw0ZguTEUGYijXel8Wj3QBR4/lHfmogEeVXSZbtl67UF+OMS3ej6W8Rgqa/HTRLPsOVHXiy4BQXZBtF0BHLkC689P0rklvyzAMYUEX0mLtaPQ+rMxyzjshhKNZgFWZwXEUdt5cn+XrW1bLDFp2aqHc1gXAEugLAPHNt0BnZ6DOS7neCaAZDegLpHGm6B5kPG960HEAjgNufFr0aO99dUDYMYYbBH/B8HskmVNguFHAFTdA4vUmcDV2wHhdAD03EkKaeVEgjDcCsI1wm1B+wo0O4eiBex36Bw7b1wndOdBdMG796hH9Wwf4N+6Br+0Q79zAxfuvJwYgZQatjX3qj8KAdAOjAxCiIFnRSxxfYaAywpbACRj2BwFXlfyocrCxTyxdlLVOinI8A4IK7imoq2nJHGNzvXZdOxQsWKx4h0snLPioAFkGCJHA63o9lgzLMaeLJe8sy6zAJDMiifw0HeU7O8pAmksMR8v21TwESAUcCDRqGyfgk8pieWSSW179ZIics713PYqTgbAfOvQ+oPcRF8cezATaBYzXegw3fc4nemSg1AKgVXxlBtwo8VxjZmnWAF9EWhgZUr0SY1z+GPAMlzYpMBPGkQSQDOm8AR3LM0f/JHYvM8FTkrgGgFHGvBtL26g8tpqVSBZ5cpqMKWKGH0r5ww1gvBlBmwDnxN9w4UEHDwpUQGIq+cSUv+sSuA4I+DgSdm9E9OcRYeul/RJYSjGxfvV+5Nrn3L76OUneu7SZwg0MGiPGGxt88eu22L+PwdsI2kQB0s89ugPBDZSBatlYIJ91DHJn2skDccsImzKW6EDY3CXceFXeo3HbIW58fe+ZMYEk6wxHCDMznejl2cpZOQFZutqOKfGZZTOQK+2AAycQL4EqqT2zDyEAF/sM1D2UWdB3KYmRBy4glwVy9VpfmKUzkr0ZQGqZlvputgxGZa227zWOFZA22XRlN5pFzpLF+ZpWftma/W7lkkuGBcC2gLA9D0wB8rYd5uLxzl07V676Zq+3YHNo5JIXGLzZB44TJjG1qiX6f9teSwDwHPjejM3cN43/i3GBVdHFyjVz00exPg9gCvZGludhO28MALwvAGwzJ833gN53dqNEc06uc+VxYebxbT4V2GvCeeTNmArk8sxviLSBIqf3vmzkzA1QA82TzZ8pHz23tNCf/a42WDbzfC3jXYint9pqq6222uOzXx7P8d/FI37z5g4+5HdP2p2J/eTxDXwqSrDN80rK7A6A/y1kmTEC+OvvvnOriQ1H4J/+PeClDwEf//Unf1es9mzav75/H/+vz38erx6PT9qVt2f/CsDrmK6xrbbaaqut9sj2bAO+S9bI4IJ5wu6tJJ/ba+Zkgue+ZyanMgBmWA56vL1+bsI1YRzH+XPKQJ3ZqbcEPi7G/V2yU4vUts5XueZRWU6RAY1reyr/dgFzjk10ShLRsIzb9qvkLls29eR7u1g+t+FgmemL4xHuMIB3M3opugAJSCxT2e4rAJ9LDHYibN8YMZ453AsCnsQe8HsBVvxeZJ3DtmB0CvYpy469XKMSpcq0i8RAJ3FBSZmSIcnFjg7duUP3gNDfY/QPgP4iwu8D2BHCCzcx3N4hnDlcvOgReyBsEhgZGW7UMalgEgujM4FPFAR4VKRF47dm8CytxStYZCWCc/MZ8G4ufq5l2aos8lysT01r3CmHFUxFOZelfam51viV2Zlz1pQ7+1mTpvVnmjy3SvrcRjNFMQF+YLhA+RpmAqVKsW2QE78XmRgUpeLj6NG5FMcV0o/Oi6TwuCUB+OPUIW4Pnfp9ykDFJzagOiDgsALJGchPj1NWedBMFT5VDpU20EMMIBL8caHd7biz4OlMHRTQBgR4jBsG9yKDnW10gDKwta52/DgBtbPUdJJ/pkDo9lFi1HrkzR+lalR8tLLTer5KW+pFZrzFjcPxOSDsig+RCTS4HLc3+6zfqc5XZdbzfd1pJxLckdBdAP3dMW3WUp8TUJ02jrR1ySzetn/bbqCZ41yPRaYSRzpLfzvOmy5y38YIhMQMfTuSznOM0MvSPqw9CiC9JKd8yod8LmvGP7rPV7GHzHtW/rjN77J+mAOkH6J9aQEwnny3vlwlFvJldplc9VWzmVOFseoA7TPylL9te8+lNeVkkHZuvrkQcmOSd182W7ZA8WTu10o5vxPsmZWNs9pqq632JWsXiLiIR3w2HrCBw4uuh3sKALtzDngzjvhsvIVX43MzKe4A+DBEujmmz49r05ED8AHIEubrjynP97AxA3e/CNy4/aQ9We0dsvsh4Ff2+yftxtu3e1hDc6+22mqrPWZ7tgFf55JUGWdmL3snO+KHMS/2VgApUQ3+jmkC2pkd+2PaJe8SMmDB1hDLubzoTHIN6+pwMxm3bF0r1excLUvn0kK++t2wIMiyeg2DAZBr8oKXKYOsZKXWzzCKlRHBly2IVe1OZd7OjEmAWmXl2u+ThT69xtSxvaZitnJC9RjV1i9HwuS17AXLxsgLoTUjumU1A5DF+ZkFtpw2soy3ZuFP2Ry5/ZWh7Sk3TSvL2LYJJ7Yy37sHcrfAna/kh2lMAELfgVLcWx3rcA7oOzARdr/2Jvr71/HG118HRSD0AG5KLN/d64z9HcJwQ0BWdgL+hl0CaWxb6JjZMLiPwC40MsTJt8GBDg79fUJ/F9i9yTj73IDufEDsPe5/9Dre/GonTD2XgJ4gDMH+HuAGKnF+CAg7QZMECEZmARIbZq4vYCw7IGwEtEYCdYRByMIiTKw8vaZiVSpZfA4kTmA5pWGXAURuQF0qQBWboawgEbGwVzNb2AB/1TGPEjvXgsX6aDBkdgWWs5Q1EhAVGN7EDFZ57rwAThCJ28D5/iVOeSd8sL8v7GlK8XvBADkBHSkxXMkx2HHBMw34WCl4MXA89PA+4mwzoPPCF3c+IFxjHG8Srn0+SQzbmLldaYM2njIIwioNjTy1AtRe6uMGzgzb8YwQtgC6AlQrUzdGArzUhAaprzC8xSeJKVtAUw6SQWBCDB7j6EEDoTtn0NiAuTou0pjNEsjgKh2TMLDdKFLF45nDcM2JLHJXKsmMLI1MWmeSe0TLiz2Dd0EAXybE6EBHB78HugdyDw/XfQZ9kZjg0aMGeZmzzLv8KTvXyFvnsU+IG4/xzOHwQkS4FgW0jQSMDn5PhbHOpk8Tozt2Jr8OYM8pBneKE04MGh22bxB2r0dsP38O7n3eHJKfB870XwKB3CDXh41LUtYomznyGEtS76l+1s/CzKbU5qkPg0ruE2jgPHcgO4cYx/n4nkvWvie5jNfZ2LLVtYllqwxRjeUKYJHxqZsdQpheo2UoUzeqDK85NzGfqmHCN1hrJXQnUs3tLoOGndqmqeY/sfbfslmbLphII7fX2BjBLZPYmvpk87D5pGuy/HZTN+0r8g48NukeMhaxHDcs7wVpavG1YR4Dpf9tfSyQrMeW8obMf3gYpQ6W8ZueGBVD15jOryop8Nxevj63cG3t88z4TPM2Oy6p7zAb09ewgAEUVq9l4Q5DPVe0Ms6aFkAl2XzKVIJZr2mOc5uXc1L3tCGRrdJPYzqvpXcxrt5qq6222mqPz37y+Aaep/v4/rP3Y3tyB+y7Y788XuB/On4BEf8NgK+fSUEoizgE4H+TPj+OTUxnAP5bCB3wv3sM+a222mqrrbbaaqu9N+3ZXgGIsrBsY/ZSZGFrzcmaAQXUVSDXgrpEwAwQmK+xTN0U/09A35n09n9dyG0XfjQftRALIKsSxbrYtMAIZsNGyIupzUIUwYCRRGBfFmYriyyLj2wW+9LxbBMGyIkFSLtgaotyihSwWTw0CbxPi3eJHWXBZWBGdntmIbY17WfrW3NdXmx1dfxRrf9Jpi9QZPyyuzOLm44m+HhOHwLixR5+t0uLpq4GkBylOMdpIdU7AXk2HWgIch+EALcfsXmTEHYiz0z3hBF8vCmgzfZNygBl2CRgxRlQMQFHGTzqIpwCT0xwLiJGBw4edHDwDxw2bwKbe4z+fsT9D24wXttg3BHGaykOqWZNEIYwAzQSvAf8BWVwTKSmC1jHKcawG4Dtm4zQk0hQ9yU9UFjK7ogkKQ10e1Oubs5QwGlm/VilnJkknT8aIDeDvVwYhJP7Xq/H9DyX8/l7FHLgJD2Z9EAV31YBuJxHrh/AoAImajkuHTdAVlv3zGhOIB/yn4C+HEUaVwHftg5tG1BGu4E4CqhKALxjMEd4zzhuGcMNB34d0tfqUwJIWyNmsFKTG3CeXXKJCkjHDgmIA+LOFTCe2DwGHHi0gAhy4RQp103ARHmvyGuiNKCyb+0mAE7yvtFiPCzHK/A9AfcuyHh3gUFBmM/7O4S4Se83B8ToEIJLmyUo51mXC7Cy8B0XxdEDobtIsY8zK1avI22WKeCQAdHSPZl1n+rjQoQ7Rgy3e+yfc4jbKEoAPoIPHnR0ZZOHsnpNv7EvvhsabQZ94VnknAfC5i1Gt5dNN7GXDTGxc/Ms/RQT3oK/lZHpD7232VTUmvpLxX+Ng2wZzmylXNMGLA4GyLnM5gCfuWSnpIcdle/6PlOAby4u61xewOw7fy7dRGoXzXMvq6Bcssi3BPYuxQC2507JG58o+1Q7Xsns3GSO/ZulmBuQO82Lsqw1c/me0gj4O+PTHOO7lfGeq/NCvSpG75KSylx8Yms2pIoviix1TFle3CjAzHn+KrLObj79ZQxsKyO+YHl+C8yrs7QbROcdrq9PAC/p9TaN5lU5MVMP/U1iPufYu1qWxvBV8Lqtw1J+KR23sg2rrbbaaqs9EyY/t57cM5yZ8W/DA3whegC/EZ+LQMQ5JLDnZUuJl7+bH84GAP8IwK8+xjxXW+2dta+/dg3ffOMG7nTP2NL7NQBfASHtr7baaqut9szZM/bWqY10V3wrw9sCgjYW3kSWObELHAlQoek137nF2nZhdkniOARZzOr7+fLbvBNzl5UpBIATYDtZfJqTkV4CuW06Cwy3i0KTes4sYGo+eXHQlUVMXWy0TFzLbFFmDRFYpY1DrMFYPZ9Oz7f/PMNk0SILkE8uyW+6KfOHHGBj5EHY0VonNouARAYQVvDXAvo2rq9e37KKpKKT8cCHA3i/B3UdsO0LW1vTk7BVbV9zXwBnGkbgOGL7BmP/AmG4xcB9ac/xusg6b96S2L7BQWRjHQCnMrxIMVIB3kX4ncQPRQNycQR4JHQXwu7dvsXoH4iM84MPdLh4KSKeJfZQINCRQEkqmAEIm1f+94cC/igzk0YIsNtJt7gR6B8wjjeA0VOKgyqgbOxR4n8y0J0z+guGP0SRjgZqkDCxaidGyLFhAfEl9hInOLNLFdRtmKyZEWjxQ93rMAOwKmhGIwBf6q9+IJY02Wd73vrApQwGwcbY1fioygLNwK8Cp01+bkxgVtR6ESJTCdOrDN+2Mo3p4jKPDjE6uBTzlnXDwDZivOaEZZrYutqnJZP6M0FYubntYmkD4x4yIzMxakNv+oJSHUjqwConPuk80/aOE+grn12Ka+woxcmlAryyvS+dAdrVyKYxZSWwlyJj3BEOzwPcS1sTMWIgxKOHD0jPRSkzs3AVMPUM30c4x8JeZmHR+30Bbm0bq9Rx62eub9u1VNoVlMDqIeBwe4vjbRI1gE4AZxwd3CEBvQrq2/xc7Xv2hSFSzh0L4DuKnPPuTUZ3EYHOgTuH2MufhGww70yjWa4qCa2MemsK9lr59rl0JW0COe0cQd9Z2pbRMO8e1pbebeldq2Dl7HtFs7DhCDRPfXdaBq++w1vANL//fa2SYfKfl7Y17z77PwwIeJUYtKfA3iW7gryxbbcMrDrK9bBxdCs/ZotL7e/r7/nYZQxhYMowtpbmKW05kzzaa9R0PlY7bdroxBzqKhLWC6DsLMt7jjVcXWvGUoqPbAHaSYzg1t3LZC51Yx5QGLlpDLeb9eauS4XPFTxN16jvVGnbDYOtxTRvdlTeK3NxfJdiArc+tvfcaqutttpqz5wxgBGMjhn+XZR1jkyI8PjFccC/Dwzg1wG48a6VX1sAcA7gf8aq/fqUGgFw/vK5zts030sxz4p9zbVr+C9ffPGx5snMGJgxXnVj8aPYGYCvxfy62eMyJRqs+xJXW2211R67PdOALysLEgbktTLO9rtaC/7qYlKWcXbzizpAWqSiwsTNjiwsAlGSgbQs3XZhxjIJzM7+zLyyO/xt3vpx00/bZRjytRxjDQrPST9baWFtR2XZar0jA1GYx5OFtwTuEnWyaG/Xf2cWHHk0C6k2PmVKt8SAzaYgsvaz+uyoZmi3fcShWoyvyiUn+Q5jWQhsTTcH5EVJLmDv3KQ2BAFuVZrZyDvy3EJssnj/Aeg4gHYb8UnrlOpLo4wTZ9vAAdx7gLZgIjz/SwfcPW4x3ijypds3hTU3XBeJ29gVZiwTMNwURiF7BjYRbiNgLzMhhtKuw9EDB4furse1zxDOXo/YvR7w4OUOn/1NPbgLYMfC7osC9riRasliknLClnC8CXR7AWrdMbXBBgJWjQnQ9QBFQrcXMJfYIWyB8UxAL38Azj4nDMD+QYRKP4cNJSZgAXAyY9EBoSfk+J+QMjk9FSOk7Ww8WE6swZrFhnwttWzV1LZkzhG0/gaoIwM2KVCrMs8pbWYwmjIUmM1l2DimypgOEClnlOsYgD9yxWIVeWeR+6ZRAHoeqZrjd4npHXufgNaYNwogFvA3bx4gQgiEIToZRwwwE7CNGG7HCnCkIMAyT0ANpFjIKc8EEnptzxbPsG3rgOEmIewSQ9cJWEsEkWc+utJ/zjROYulSypCYM9itDN+gMX0jSexdsu1sWOpVXydJ5sDluaANTCK3PNwkHJ+LwCYKUxZAPHrQ3iOzxON0XMQOwq51ETHKPRtHh909wvZNkS2OefzquBdfFUCX/LmwpLVpAudruySZ7S8CaJD3y/0POexfYKBnYfAT4PYEf6ASo1uHh/ahM+PeQUDexO4VWWgGAsFdOHT3Cdc/uweNjLD1CFsBfeUeKcB6xW4HJu9+ldfO919KrGB7YfGK1HXunwQGU1LloPwOM+/0wOAusf00dm98BMBX31XW/6yU4bISxWVgMtv3YgO2zTFz64vNTTWZB8h8glWNZO7aFsxsgb42Bq21So45gAfDxDWxghUMnJzXck8AthPpZCtXbOSRBfytQWkLsrcxd9u0k/qdkls2ICy55EdI+fqZdtLrtC5Z1rcBVFvgPIQyBhzK/NCOkdbfJZAW5nr9DIDnVm1a/y0rHGbjBADqusKQV8Zw+pxDZthjc9LJSwuNqoqTGfDNHHzu+rl5eAsEhzCdm5q8OQTxc26jpf3NktPHMr8EprHfiTKjmodx2U/vxbdH3Xyy2mqrrbbaE7d7POKvXbyKj3fX8crmuXet3P8UPoKfOn4H7vIImRCfvWtlT+3vAvjXAO4/QR9WO2nOA7/+u4DXXwX+5T98R4q48T6P7/q/vogbLz7Ty9hv2+6HgL/4qU/htePxSbvy9uxTAP49gAdP2pHVVltttfeePdtvSsuumVtIMd8L40vi/E6YV6fYrq28XN7RT/MLpnbH/yk5txYonvPdMkjbNPb7FeXzrmTNtcJoPdE+E5+cLFgry3f2mpa5emoBeKHNtJw5u2y329zi6Zx0dXahYUu1NtvXrpxjTmyaEjOPA+qFPnUtBOB4hDsM4C2mIHYGurmAVA3DsLt3RHexgTumxcM5th4KAKOgIXsG+gjqYr1uzUgxXQUkcxcOm7cIm3sCsu7veOxfJPDzB/DBAyNlsJcU7E1gVZZFDZRj88bB+ANIzFagklnNsWsj4I4iXUwbiBzuAPTnDH9kuFFidkaPAtAaUI31f2eOWdalgmqm7rDXVIDSTHoFbcmUizpN7g8bwjqBSpW87dwt1/bjwm1pJWjn2Mast10C+zSma8Vu1SK0eUji+UJl86v68bTdmMDRYQy+kkImzxKj1kgKW+ngaV3MeEh1nkhqa5kobcgkmweUpa2y1KzAc/YTVV/mUOwkzml+QvovXsZYxjnavsvA5nwH2Y0E2u9hJ1LsnGSZgXTfBZJHB1PpnyozyLPA4I/Mcp07At2FqYMZm9lV/Uyo0lVFpMe5MMATC5xS/N5rQDiTCnEg8OjQ540Dpo3bvmJkMJy1rX2pCyLgjgR/BOgYRdq7TyCH3reUVAoaSq6MJxljc2xdC6CoZkOu88K7jtMmrkkb2vezk/Y5+b54u3YZW+8qkr5zMX4f1tp3pv0+l/+E8e6maWbul0p+eYlxexXFj1NplPE6J33bhn+Y82UJkJ2xSrLZplXG7WXs2lPnNR/bjnNtagH/JeBfy7rqfHKOsd3mdcosQ1rnnZeVF51snrESy3paNzeekmie+DB3r5zoixYkvmo5V/Gj3bRon0uPq5zVVltttdWeeosAvsAD7l+6K/7xWGCH1+L78Jn4Mj7Pj5eZ+PD2AMCrAD4J4LUn7MtqJ40IuHEbuHjn0DvfEZ7/UI/+7Et7HhQAfOZwwFvv1Ia+5wDcfmeyruyIlbC/2mqrrfYO2TMN+FKMoDGAfZIGrWJVlgVYtswGzCzQqrUSznOLYHrMJ8auSzm2aTVObcsCUJnglnUMSNxeZmAcy8KRYdMqOyB/1j9lFygoogDhzIJzXuRzBUy2C396rV2sZlYA2de+ALDsj1rGeNp0pb4N2GuPs1nkiixt0jKSlDWVYwEbZgUgjN/QHFPzCeFq50YcSxtYVpUjAKFZ2E7gbssq0f5RJkfvBbw1EzFyVOovwSZLH2ZfGDyO4Hv3QOOZMNm9iefLLMALogBqRLKgaeJBu3t7bO6foXvgEHYCeIWt3B/+IFLF5CR+btwyAhEoga64JgzZGCgNQQazAw8OGBzc3mHzpsPtX4noLiLYEV77TRHu+gHeM8aLDi6ze0mYjspIdACNSWb2KN033mDEUdi4NEodwi4BQY6w+yKDxgTaJSSquxCGqhuEBewGCLOXgdhRYi8XsNcFVDFV2RVQGRHIsWMJhu1nJBW98T8oQJq6UT+bPCrmbiLfxJRHGQwJMNLYpraNGpDbgsqVlLG9xRPA2sYUJ2Zh36Y0CtaxNxicgr9KUDIAvfMxg7WVSAGjsHsh9Zc6cZHHZxlH+6HDrh9THgzXR4RtROw6sGX5U+MDlbbNDOpUzdjLMRcK1qcgamk/QthAWNtO2KfkGOOYKu8AOqaO8FzaTlmuEZWcMxHDG4ZvDC6N5QRGOmXUy2aGkMagC6brSfxyowE3ooyP8y9zGG6y+AIBezk4kTUezL00A/jGDpmBzEyCBw0Om3uM7Vvp/ZDGG7oERkdk8DTLIOvGisBljLJ8d2mzhRsZLkSEM4/xmsNwncHbdLNcePgLB39OEhdc9wfE4qvWGQSETQGjRcY99UMEEAj9A0J/D1nFgxLLlFxh7EbnMhjtRmEsY5SYy7GDyN7rKz8W9m6Wco4MDSEgm0Smctx5E4BP5XYpTx5NIpGXfmRGXcvotaCeUcBQdinPzVEukTRGVIC8Zp5m+dwliWFbHwUm23J0nlCxgi1zFidlqLM7RhJ4KV0+r+9560vLorXfT7WNI5DrzHxIrrWAM7XzCtOOUjezqaspR+P0LklG8zggs7gtc1cVSLQPvC99sNRflrlr/dDQHKleuU6t3He6vpp72TEzN7+aMQ6hnvdUcuJc5pytBDRQx9xNjGeuwpjMXGukmjGMct1czDQL4towHFr2zMZNm0ZB5Dzf815eyMNQ5oWmjahl/5aC5tnJ9n6zbW2UgJgZGMKU2Wt/38zNVVdbbbXVVlvthB2wxf9w+B24x09KvtnarwL4MUx//Ky22mrviDkA34p3B/BdbbXVVlvtHbNnGvBljcmVFnt4DuhkLuy1lrVzmbQaYBaWmuPRgAMhlnw0TeB60cXKH0cAVsJO/dDFmtYn55KkaFOGSsY17ANu/TQShdXCX4ox3DKC544txk9T6ec2bt8Mc/Wk2cVPtoCuMDhE8m8BRW4Xw6wf7edT1sgSgiMwKDhOGVAVKURX2t7KATbS27ndQpz3/wRTJ17sBUPbbcGbXsqNM3XxyR8HUAgCODiCv4g4+wLj4n2E2ANhCwHiOAFgCjaOBOdYJJ03EV0vMrIavxVJthZBGHvb1x02dwE3Mu5+pMPhDoD+iDg6xL0Awu5IldwwbwH2jNgzaBSwV9s77BixB4abQH+vSD/7owC5oSeQZ7kmgWUUGQiJ+RcgkrOdSO9GE+OYEs5l2bwFcFJAiwQs0nOMLIkcPQqQCwOEogZmM8gLZIBr0tXc/FRl6f7MptX1ZRuaT8HMBpCbMCa1joTc7tmdJN878SeiAvqsNLT0n/Aey+OGRCpYx6CCuy6NKSdALzEVEJcADg7HowC+3glD2LmI4BnDdQGNXcLMJvFlcztwfV7HQeDSdyjAogColDY6yLiTvpV7iCf0a+S+1z+KKe40QZ4JgZIsNRWWbwKGC5s9wgVCVP+0z1nbq5SjfiqAHzaE4YbcD+gY1MkGBk59UZkZL/rVIt0cCXHUexFwx4jYu0ry2LKq2+GRQW7z3WV2L0Ajg44Rw50NHrzkhK2t+5OCgNOVvHnKIwP2DllOPvenT+Bvr4450EjYvAXs3ojyfneEuClyzgpOMwguSVNrWdxRiulMk3uFWDaLFN8oxaY294ptFAVygcJyHsz7Wjd/KStvDLMA1qWWFRzSRqr8Di3MSQUeLQhZMWCBGpyzuHP7jpMMU9ENMLjE1lxiaS5tkGuATQU9qzKaPPM8QwFaG9v1KuVfxrytCtPzy0Buxeht5Y/NO7wFp1vp6Ek/2Vi6bd1s2ymTtZXKvszmJLUti3ZO+rm5vmLZ2vnKKR/s3FGlJB5CdaYCVnUOpXPNOcC+ybuSGyeXv7dKLe28djaUh5nTzcmp52s0dMvcJs+SeJq392mDQ8hlsJ1TtpbnlDpPXrof6k2jiwo9q6222mqrrWbsE+PX4NfCB7HnHWZ/QL7r1v7oXW21Z8Oe6zr89jt38DXXrj1pVx7e7BrRO2EHAL8E4IvvYBmrrbbaal/i9kwDvhmhSYuss4s1ecFkBvDV83ZBZE4iuaW12TyTTPSEKdzKyxEV1umclHMLFgI1mGh26BObOLxLLKKlxU8gL47NLUifWgyz+bIz550pr2JfUNO+C4uwS3LVNu0SeEyJCtaC1DSzgNpeZ1i9AFLfxGpRXNgpXS6HlKEdbJvE5UW3LMk9w15ZYmhptQ8HASKOA9AJupFHoTdtldneXC3u+/2I3Zseh9udMF413DMpW9YAVQHANqDbBvguCKjHhBgdYkhAcyTQQNi+AfQPBOi6eJkxfOgggPDgQIcE9o4o8sQOiBsGdwzeRPCYFoB1yGwZ7CPgGLH3cEdCf09AWL9njNcEaPNHzvkJKzbFm9W4tU6An9gZUEvZfBZwQ6l7ZpMmpp8FxJRZGj0q6euJLHLOEIXFaNNY4JLN+XR7aJ6ZzWv3DETxwcpSE4wfmg9K/SoftC6EKQhdMNCSX2I1u8H4obFqAcTYbDogJNnc8pkiZbYvIOBjGD0iA71jOI2F20WMZyI5vD22aDiApq/atswManNpAVE5jXNKMaDrzJlJ2p5sI6W/SDnmcm7LpCZQkSJhHm3MCezlkk/BhOWZTVRY4cZfjY8be8J4nRG3hYmc5ZxNn1b9SM3n/OiiJOdM8ANLGRuUeyABzmAGZUHjUoYAsFTSaF0y6MtwQ8B4RjjcIXAfoPLyFEQtQNnW1T1nnglsGOW6YYHTcyLfvyOhzwxlAXFj79L9UN4/VRxnlnR639tNAnJaNoZkBi9JXgr65myMjDi17W7UQLLygittyqrS8ShmQd/GTrFiJ2DijM2GJrAs0GrjVazfofZdOgcczzs1U1YzD5gDOvWcgmFtnpYtuhSKQecqLaP4BPM557G0Oesym5vjVHUO82nz91D8tAzctl9PxCeenG+ZuxZAn8tjEu6kKWuujnF6bnasXRZupGEXWyPz/Gz9snP/2djUNrZwu7nR5C8+NGxZk272N4amCVEeMVdh0rabQO3/0Lq60yoBcxtWGzZylrL2vnl5rrbaaquttlptkQkDOvzy+JX4RPjaJ+3Oaqs983bTe3z3nTvYPEsqKw6CELzTez2OAH4FwHhZwtVWW2211R7VnmnAl0IAXAfuVNLP5YVYjdebv7fg5tyu91bS2Tth74LrOKoZoNUFwpmXeHuMCNj0BSC2AK/3xY+ZxaZ8XI91HWgcBbA1bMZcByAvamXpZ73eARxjzVCZYfLCm8W6EIz0a2GJKPODvKvTazrg8skCuYQ6xdTWCXAlqsqyb0bZAAEAAElEQVSqYvValocFg9uFRNuuoVlY1s9JsrE6pnkRV4uviBHsXA0utOYKKFv8coUJbQHlJM0J6gtbI9YLfPE4AHfvwSVAgnf9dOyOuqALYcE4Bh0Z7jBi+4bD5o60w3ADWTKVPWRYHwmxZ4QNgKPLc64YREpWgF4Ao8Pmix6bNwjXXwvYP+fw6ncQ4iYAF10GpDjFZiVvgB3PmSGMkJijCgIThBkaCRgJ4UZEHAn+6BFHIB5rEFTjfYYNZfDKH5Uhypk5mLvAT+N3VlLBDBA4s2BbaVtEwI8osXst6U7bqke+tgDIJq8MoEHkrEMBZlXuuYqdmvoSkGbLvuZKzfuR89F6GdAxs5QZRs7WXDcqUCl94Y+KhbIwWhkgYmw2I2J0GAcvYETeICNAX3Zj0OcIwAMhKLuPGN5FdF1A6B2Ot+W6sy9GUC8VsMzj3CZ6zFY1SffGDgXoDcI89wNnSW/xT8A/5wO8Z4R9g6AzRNrZtiOVJNp2ao4EuN5sRpz3nIBlJ5sWOpJxp2CmgqvgCrQQNrJIrA/POQzXCGEbwV0Be3lMmygG1PFwdRyw3NPcMdgzvGd4HxFGDwRCdyHvKgWU2acNESj5UOS84UAA/ymQoBssRJKdQcwIZz0OtwmHFyLQJUBllHvRjel+Qj0Oc7xesyEgd4+XOsBz3jziD4TtvYj+rSGlowJYB86MYTmZfNA+p+mY0XMMAYTdkOYKeZykvDnJ3keIjKwrMs/StwbY0veyvhcyeHoJGLpk+u6zmZKbskfte7ti+k6ZpxPpWwNC5jEZuQbzLOgLZPAVaEA1Zbd23TzYlq7Ndlms2yxljDLPaJQwskyw9r/6rfLHBrSlvqvB7Fx/rsuzm9ZOmZFDrtjKZm6RwfckQ5zZzQ3jV32ugF0Lmto+b4Hxlv3c+tGWYwFtuyHOgqyNPPVlGwgmrGG7Wa4FZ207GDDYhgKZm3/m87aMJB0+J7ss8sppnAYzBiDjxuaTpZ8tS/fUBr7E4iUNv2I2dlIb3kOcL/6FgMkGU6f3ZenDWeZu2ixK3lfg8+SziftbSY8PA8BG0mC11VZbbbXVGvtk/CB+4vCdeMDPIBtxtdVWezz20fR39qQdWW211VZb7e3aM7TdaMHs4smS/NkpKbP2vAGJTx6z5VWyeE1+p8pu5d/ac0AN/LY+XJI/tb6cKu+UzTF7jLFhHJ80u3g8zWSe+TG3+GpB2DmzDGN77GFkBRcYIlWst8vaMgMBZpG9lWRsZDonxhF8PALjCBqbhd0J8mg+k8jd0jHmWLcAED0nxiMya5S9AEYq3RxT3FBOAC0S6NTfI2zfZBxuOhxvE+L1AI21SUxZApcJKW6myLNyxwIIeYZK/6LjIumqVU/MUXaMmM6HLWVZ5VbRSeN3ggXkm2M7toBPPnfKuPyR+avKt8fNd+vbRBp26RaxaU16bo8vXWfT8MJne1njdwbTE+AHFoYvBcp9UhXXUoUZJWZvPqaIKcy4cmAmEHFa644it7wVgM1euuR3a4ttlIDguAE0/q4VeWD1DeX63NcRk/7M8uTGOW2HSma69cXkZ8tqLWxL3Gq4BPgGygAqBZq/1IDi8JzblgEgEtwBWS679VXrnL8vvAeVoax1cQlEOdzpMVyXGOBwch6jq+M6p7bL8tEz4zVvDNHdxMSy72cE/D6BsqFsyrB+ToYioWwYap4Xs6bPiZlHue23iQJ4Bp0wP4u6TEb4HTJq342XvLuvkGH19dS7fnEOoDFj21iyJ8pZTHPZ+/KyfObkiJcYrSfyqJQ5Zsq8FChdsqu0g7WrSjsvXXPCz5Nyz5YtfJnNjMGJaswl9WiZtWTCZUgesYzNpXmunYc9TP+4wiDOoKo5t2hzqj2tzf0+WVQXqtst+2LnpHO/D7Lvp11ZbbXVVlvt6be7POJXxgtc8AkFiIe0wIxfC3t8MjDe4OdwxPax5f32LAD4ZQCfetKOrPawttkCX/Yh4Oz6Y832xY9u8NLXb0H+8rSrPaJtANzAJNLNaqutttpqz5490wxfdi6z1TKLl1TKUQE1yvF7aRir4/kckKUYa4nfmUWh2fhhLq1mcwGCx1AWW3TxPHB9TP2wizWWXWBZvYkhwMzC7p3IMjYMhzZv810kErkGH+cW4qo6u8w+zdcDsjg62gVEX9g12h6Z+aLpmkWwit3TUBcrDdUZQELbUxm8ymqYi+esQIAn+Q2R2SiG1asMkLl+NuyMvACo51qWjcrqZeYul4XGNk4iIAvIs8wnFmnn/V4WObc94FyRdGYW5gfX40/i0kb4iwHdxQ5hwzjeJsBJjFA3AgohsRNwVkGbePSZjQsAdHDYvEW4/mnGtc8N+NR39hhvj6A+goMXgIcgMXX3hHAWJT9fQFhWJtTBAZ7BfQSOThrQMVRGF0GAmrAFQMKy80cAhwIcccqWPTBuBBjqzyNCn+7zmOo0kcFEVvBtgSeK0mZEmo4Tqw8VI5NRQMEIyaMCejU2ckSWWdZB4kYUgAvpfzOZzszxGeBQ65TLUf+1Tub/Ss7aSFRni4ALnJnAyjhGB4Qk+91dMNwRwCjOEAGdDyLxnYHcVE7qswr4crZRJJ/DIK+bzkd4F9H3wMXNiHHviywukNmf2t8VeBjKeavEnMs2AN5wnXC8SYibWDYdWJ+qBk4NF6kGaA3wS0nWPJ9KUteVj3n8SX4qLZ2LtZ8TwB474HiLMNyC3BedxDkeLzphue6pZoun+trYzrEDaBvhfASRsIPd3mH3OqM7xFIHRmGpOgh7lZDiX5f66ucsUU1I0u8MdwgIZx3e+ooOhxcYvI35/qeDy3LuyrqGGdew95KpS+wYcRflmQEZU35P2LwJ+H0EhYi47RGVsa/9HUoe2rjCAGa4KM8Ahjwrsj/5HuH8nJBnBRf2P1FmkIOlvUDmET0nOWsBpRAvB3tOmSo92PtiJv5rFUvUMjcrxxrATQG2uXf+nKSuFjEXDxZAjj879w5LyhYTP+d8syxd+72VaW7Bx6SaUViOXKdTRm4I8wxbZZ+2NldOW4c5meNWbnpuo1uTnlwDIreAffZ/wbc27VKc3qYeOY2d06W+rdrTzFsoza1m5ZWVdeubsdX6a5nYeWz4OsyIZfyqeo8Wl+axGiKFQyj5WGZrDl8yjbmbAeIU27dc46r7TvMkAJzm3lTdM27xXq/SWr9aX2MsZWroF6DEDNbr2g2gCeydyFFXG1KVVf3s7+9dbbXVVvtSt/8QLvDL4QK/Z/cSvtw/HgreAMbfPnwBb/ELjyW/x2dHAH8Va5DPZ9Bu3QFe+R7g538a+JVPPLZs//P/+jY++Ot2jy2/1VZbbbXVVnsv2zMN+AIoiyTMYO9yfMFsLOygaqe8AVirtEQGOEjpHdX45CQ9zS/22LLsZwv06v92QSjt2J8wB1I+spY9A8omKbdq8SdfyiJ/bcqkzuf0xWUjyzwXa801C2lZGq9ZRNXF1hZoyuWXhcmTgC6ac3bxMfto83flPLP4RUAlk2wXFJdYvE2MN21P6rp8bGLad0C1YKiLfQwDlrfymY5ACODoSp2bMuLFHi4y6GwH3vZA8gW2b+2YMl3V7SPCNjFwR4I/CCDFjjFeA0AMdyBEOJFX5jTmWYCX7pxw/VPAcAP44p0Nwg2J18n7tBipQJpjjD0Ko7JjqBw0IqQvEhDs+iBxe5nABzlPowAtcIxwPYA7B9cJiBo9wV8IOElBAJzoE5DDAtQ4J/UiZ0A5BQdR/q/kgoEsF0wJSea0EYRP7GysANkEduY4uQqcweCAXMqpThhTUM7mw64cr0BIC6IBFVgXU51jTzUQjHJNjoFKQASb8uSYlZoGdG25RZy1YgnwtY9BbfcoQCkTcDzKmO27A7yLiEzgTUTYuhyH1Y3S32yLoaa+2vYNyK0AtqQjhC0hbE0ePua6aEzqKgiz5tc+txQEHQhxJAG8AXgnwLXtL5FHlkyytHYCGnXzgI5hZd2HjcQZDhu5Z9RPDJSlsSugUutq24MYrhewNyYpaH8gbO6z3Fc+yTl7zEp6VzL1ujGI5b7L3YwUC7hzGK957F9kjNe4sHsjJUauSE9XEuWpHXNfZb9Nn5l8AMBfEM6+EOEPqd90w4y5Jt+HEfU9SVQ2XEAUAHQDR1VnzcfcMxK7mTM4XtQYqGwY8Q5ujGV+oefHCAwj+HiUOL6PahPWn4CsGfQ1TFeOPA9kWpuLX9uCTm2aRoUiv/NnNopVEsHWDyNVPIlX30oPXyVW8NxGrPTeZw61r2ptPebKtz7P+XQVa0FaW+4V8l4EwlWaWvupbesZ/2fzysdMeIkEvMqzKklRe/E9z1NsXdDMf2aYuTpnslLNs2mtzLMCzJNpb7rGbsSz5+w9NqPgUjFzG/8m8Xh13qYbK+18Si6sr2l/T8yEccmp7fw7h/iITSxlnbeWfCqZZpHFKPPM9J3s74WYNj1aCWmbfrXVVltttdWM/cJ4H/8pBFzwbwPwgSftzmrvlL35BeDn/hHwFV8HPP++d768d2rOQZjO355CIwC/44UX8LGzM/h3wN+ffOMN/Nvzc5y/nc3FrV0D8DUA7jy+LGeNIcT91zG/4Xa11VZbbbXHZg+15ftHf/RH8c3f/M24desWbt26hVdeeQV/5+/8nXx+v9/jh37oh/DCCy/gxo0b+L7v+z689tprVR6/9mu/hu/93u/FtWvX8GVf9mX4w3/4D2N8HAujlrF7mRyzHp/73kqsKagLoIrL55rjbdy+q7zc2zS6oLNkLfPAUZGvu0RWmZkldu9k1z/N/p8ZO1q/VN7cJIu8E9bH3OLonPxyy46RgtVR67Q53ywkq83JAc4AtyXPOP2z55bMUVpIKwuIVtrZtkuOC6f91bat5mfHkMZozIvete98PCJe7GURbwzVOKNQj28BLMtYcYeIbi+MTX8A3AHCyiQg7mKKyylgMA0OdBCgyQ0EdyB0Dwi7NyLGa4Tz9zN4I4y+Eqc1IWKegV0EemHqkY8Z9IMCbF3Mx30f4XoFuJEkoeUzOgZvJB6wyN0ywhnl+LwSB9TGaE0gTduFpGnL5+o0l/9rpuY0bWlfVGBVBmotwGcA2Ikc9IxNQFl7GywBkApYtWktKKjDy/gJKsBu/qzXK3DdAMoAELmAnZNHTZZwpsz4ZkEJ08VAHBzGUZ87SX64j1nWm7gwSmsgl2z2dZu19TZtF3uAewiQmGSSxfc0Fpu2ozifObH4TwGZ9a7mndLONR0bMJIqILg4K9/dKDGsY48ib55Y8YxyT5ZrtF1Rxp/W3QHOxYQZEDiIFHR3IZuaole2OuVxW9V9YWwqSJ1Z7oERNx7jmcN407B7WeTc3bEw2eWC4uekDGr+LOCb4kjv3gxwQ8zp9b5vrco7tYewmKk8g7gpD5DNIgmkZyKjnIA8yMs9zHUZgKh26GarpKpAIQoT8FHkdicVOzUfuGSOcYk0MUcWH5fkjeeYqa0c7qmQC00e5Oi01PEpf+cAU1teK7M8Y7Nlt8AoLcxjpplhDpTlU3OPubKvwL5dLNMef5j0VXFcx7W11sRonhy/oh+FfTptE04g7snFu8hTBRU9bv9O5XOZpLhaBk7r+d1smrlzOt9TMDbFDraxdatrW8au5pH9XrjOzi+beWY7H11ttcvsqfxtv9pqqy0aAzgyY8/x5NrPVezTgfFvRsIR3wLg61D98FvtvWPn94Bf/UXgwd0n7cmXhBGAb715E7/h1q13BPD9xIMH+MdvvYXhccbr2AL4CgDPPb4sF+01AJ/GybWx1VZbbbXV3r49FMP3Qx/6EP7sn/2z+Oqv/mowM/7KX/kr+F2/63fhX/7Lf4lv+IZvwB/8g38Qf+tv/S389b/+13H79m38/t//+/G7f/fvxj/+x/8YABBCwPd+7/fi5Zdfxj/5J/8En/3sZ/H93//96Psef/pP/+lHq4FdMFHQN7FXWyNld06YpKjZonPgY5hZ9FL54bz7nuYXlKxks/V16SVt5ZvTInIl2ayLTJY9bNgEOvlXyTsCwIeDLMh5EuB3aUeY+tWyeHSxTBfEVZLP+yL7N8c6adjW1bWOys6u3IaGVtkyhoiE2doyR+b6E6jZH5ouS+hxWcjUcixDJBRGbgta28U0Tn1hY6ixZVakfrOMlzoe3MKiamvM4HEAn+8FPOo82Hvpzz5J4joBZMjKAwLYvHlAf/eI3esd9nc2uLjjcP4BwnAd4FtCjVWsiyIEDE6fd68T/B443HI43GGML4wJPCFh9nr5o94in+l6L/cGdwz0CYw6OnCSxY0prioI4F3EuIugvQONhO71LoNow62IcA1gL9LSm7uc45KGDTBuCd2WBCzMfY0akE0AKMGAV4wMgrE3adOfAlcURVo6yzc3VY29aTt1QbFOO/x9uUZjEmeZWUDizTIK6K31MOAnINcyDDDLJk+TXqWaa+lNk69da9Z+cManlE8MhOhcwcuIQZ5LjOfUmLqJgBNwR6DMGKcgrNPgPUIabJ2LcJuAsIs43nBwQ5IaT7K6FIGgdcrgJlUyw1oXvc5KbcYOiH0ZY0iPNo4uS4fDMTBSDfZq+xADIY0NA57vjz3cVgBr72R8x96B95Jd7KlIAOuYIcoMZhc4j8mwFdnp8QYjnEVQFwEGwsHDqcx59okFeE6u53Mdgz1jsx0RUwxupHja/hAL6JmuYUo+RCQZdOMnA27gyTGJAx5BgfHmV21xeIEQt6Pc110E7m3gLwjdBeUxRonVHxdmGeyB2DHCxvQTC8jd3yf0dxmbLx4lbe9rADeNcwVoGcLi1S9MADm5b5kJ3UWUZ1ygis0rGxS4khTPgLGyhHvdiMJwx5jl3mPn5vd1JZnYh47jS4TZjU1N3FoBFQMQcBpEtXnFJl+yYJR5DzXvPwAiJewIWa4XKPK/7Ttfy5oD/ywDtpVYtvVUyeBxLAzQfL2v0gIADzOgwhwLeMnXOf9mwNzylUEuMa51npAleGfKnyvXpMl52HlGywpeYifPzV2uutEgSUlbnxbln68C1Gt7ulopJjOvZ1jHVQw2ZaXOqcvM+aDz0ssAY0DGejPn5RBznnmerUAtzJxOQVeVT1YWrZ5T0zAeOm/XuaDOOy0L14ZtyU6aOiTQlu1xe71JVx3r++xDm99soPLVVsNT+tt+tdVWO2n/0+ELeJ/b4Pt2X4b+bYG0vxkC9N58TJ6tttpqq6222mqrrfY02EMBvr/zd/7O6vuf+lN/Cj/6oz+Kn/mZn8GHPvQh/NiP/Rh+/Md/HN/1Xd8FAPjLf/kv4+u//uvxMz/zM/j2b/92/N2/+3fxiU98An//7/99vPTSS/iWb/kW/Mk/+SfxR/7IH8Ef+2N/DJvN5vHVbM7mgFz9Pgce2rQT+TeannsYhu9Sugy4Uj19n8tvqT5zRg0wOXGnLFJNzICSzGlxbWmBcSb2XFlAnWH52rossXg1HrCme1y2JI245KM93iyqThbnLFvbgL6zthC7d+4Y7/dS/rgBOQeuKJjZmQxgEDMQhMHmz0dsvAPQIfYi+Xq+0wV0UxeWvCgC3YV8PrxAGM+EuVvQ4ZQ4yclqVeLRCeDUGfaupk3MSjLAi8btBAAakyRsVB8U3QIk1qeAZG5QZh4hboDhusP2bhAwvIkxOyfRWx1LwGtxwlybvitQpgrArNfZz801VZEGQNO8ShtianqsrQPVrrXn7DXK1gUwAaozKDfDWlQpW4puUpgjRmQCEddM0wzIzvitfREJHAkxOjgX4R3DESP0jOEGob8H+IEzUJitfVxrHzQYXT7vgeBN/Y1PMTozPigfn91hOtefTAiJ6cy5cYHo6zawcuF2bLUs19gBYYfE7k0g5ehEBv3EY93mWcmW54yRY+4uyZPbzQBLY1f8Z4lnm/IabhGGG1y1qxsaZi/KmIMpp20jdkgbR8y1DPg9wR8YbgiIvS9tauvZ9G0BqA3YoZhNAuC1TuxNekJm+ILV1+ZGIy5tFPU+VpDUtrvMAdjOBR7GHhYkXrK3G6/TXJ9BQczMH95uOdX84EQatTaOcOUKzV+zJB19WXlXqNtJxnLrh/XHgKQqd13FaJ7zf2lDodplQO+J861U+ENZC043MX+vkmcGUk+VMWcN2NvG5M2b7IApo3ZWAYabrylkhroxN4ezoTzsZ5tn/o3Q1LEFZefStODtnBnFnokMtOb5uJ4tq73n7Jn/bb/aal+Cdo6IL/KAXwrn8GZyvCOHj7jdpRuhHvAZPh3ejzf5/Xh3KH2rrfalYS/1Pb58t8NNP/Pj+2m1F/HOSzmvttpqq632rtsjr9aFEPDX/tpfw4MHD/DKK6/gX/yLf4FhGPBbfstvyWm+7uu+Dh/5yEfw0z/90wCAn/7pn8Y3fdM34aWXXsppvud7vgd3797FL/zCLyyWdTgccPfu3eoPQA2uKVipCzwpli+NARSisHicSTfbGkYmzaYjEjavd/NSztVCI1d+VGUps9bK0y1JS3ed7NZXdsAl4C7PLZbpwk+MwppxVDFX7R8AcIjCetA65XoG+UuMVObCqqgkoBfls2O9sOt9fW1rweSl5Srzo2pPLseYpyxs7cfY9IVlMxmZZlhpw+Qnui61f3OrmD7PctjeV3/QPyvxbBcCZxZEyTVjurF4/z74/gPQMFbtTTGCYiyypA6ZpWatf2OPG7/8Fl74Nxe484kRZ686dA8oAybK/HSjgC6btwQsvv/REfFmGrcOWSYXyc3t7oh+M4I8g/Ye7p4XJm8k0Oik6bVqQVh87uhARwX5AUSCP4gsbAZHA+COKZZpFBbscEPSuxGgERhuEC7el4DkUe59l+JwtpK0Gdw1oCsxwx0ToNUCjYRa5tUlsMgnMCxomeYaAw4Dpnwy5aO0R/QC/FGK7UpcysiuWFDPgrh6PjPLyvGo8ZTRAI8K6DJDGcUKQivAp3FmqZEwdiluLTkIg7uTWNDSLgZRZvXFgKsR4EAYgjjb+QDfRWAXcP6SSHe7geGPnOM0K/jMZhMDe0LsqGJ82j4OPeF4ozBz2YlfKnUcR1OntKlgIgVuAWFt9iCs2RBcBntjGiPKAJ8A5AFZujmzUqnIK4c0nmPPKf40ZLPEsQC+Vcxpqn0BIzPtZX0/vf8GB38Eun3IjFQLskav7VfGh3yQ9ot5fEsMYI2jGzcO+zuM45000Bjg0cEdSe7TNL5dQAadvco8I/WTh8Rp9nJ/xm2UsZPGCgVCfx/oL1gkkwHkcA3aN9p9HU3AZI2py07j8QLhzAnb1z4HFLTVIpgzS7j4qB0JUz6LWkjkCYCf30OPAq7MvDtPMXgzQHdZbFr73b7L0vuT2nkNUL7bMuZkcefSXVrPxCa1cYeb2KzMnFmUWXraXM9GoaNqozkZ6rnQDSfaLZc1A/xOQFl9x8+Vl/zMvlo/LEiq4Rz0+FUBaft/YkzrH4Bpf54KZ2Hzttdp/Vr55MvkkefGiB6380ujHpPnnsaywsqcjDsRSOdnzpXNCCHIXLade6f66PiimXlo1X7Grzw31vi7TZzdzKh1Tsb13MZRVX5pLV1Ddo6v/s79fliQms7XG0Zy/q2h5a+22iX2VPy2X2211a5k9zjg/334Av6Hw+fz308e38DM231in48v4m8cvhf/MXzkHfdztdW+lOxbb97E/+VDH8IHnpXNTgTgGwF8A94GMrDaaqutttrTaA/F8AWAn//5n8crr7yC/X6PGzdu4G/8jb+Bj3/84/i5n/s5bDYbPPfcc1X6l156Ca+++ioA4NVXX61+EOp5Pbdkf+bP/Bn88T/+x6cnKhnGAtBSMIsiZsGExji9rmWO2uvswp83i6S6+GSljlufDFM3f/Z+eiyE6YLhnGQbc/msMnEqgQez2NNIO1NbX3POXkcJhJiL2ws3P0yqBTVyCdBoGRRpsdAuJCYgrmo3P5POgu7aRrYuCsSRE2D4MsaG5tcyZdoFUo0Zx1T7pWauXQKt2S7atVYxQbRMM8MiU167QYFZ4kPefyDS3rsNeNNlSWdkZmwUuWkFxVz6v3Og4ECBsbk34Ln/QBh38rd/IcXIJcDvgW4PjGcCqGIbRAZ3TAAeAegkTi85xsWDbQbJuBPg2X9+IxhOx8BeWHrwDCYBoPo3PdwIhH0n48GxSLv2kg8FAY78vgA1sWdhcO4kdrE/JsBsAwzXHLoDo9uLTCxFAf2igqcWgCUBcFwGh1JzG+BL2wIQ4Er/b2Oo5v8T0KWgWhuX18b2nbBHCTXoqGCzZWDq40jBfBhWpeZncYRofHLlWmHQUgbVOQIuCMgbOyQJ5pgBX8GhhJkLH4Tdq9iU9dklP5IUMRMSiKV1IiASxtGh9w6A5OX6KJLGW1fX1zJ92/9RyhZgj3MbcSdjNpyl8aTS4aat9XoaBYiGLY+QmeVZDhxA7GTsHg89wnYAEaP3EfAy3hQQVBa3G1mYvyZ+LntkUHHcEcKOELYM7gW0jSPJfWYBegMWZ9BYQfYMdjK8jxhHjxgc/LmDP2izUx6PFBgIyDF9lU0dejM+qYChmeHLjOOtHhd3HMJZkmkn6Wuk2NsKrtrxz5D+yPdSC1wDOW4xIiR2+IGwe53RP4jg3oE3DrFz5gIBegHAH+tnLDsAnavaS+opzlBEFc+bML3vKN8/ZuyqEaAKCqQnnUPZoBSXgZ1TtvQeSe8aZYHm5C0TdE4yeA44nAHpuN0oBcyzSe0xy5Rt349zZTuSd1w7P4gmjzkfreywlrtURqsQ0p6fYfcWuWqbDdXXmLyyBHEjy5zbpglDMQvWtxLRraRzm1x9tO03056T660/kXFKJrqSVrZ9nCSa37a1Y2lJtrlJX6kQz8k357mbq8JmzOeZNgjMsW1tyJQ5WWc9buWYzRxvoo6jfumcv2RSzduR8qy8btjJE7O/FxTc1c0R9veMjfFr/V5ttRl7qn7br7baao9sb8URf+vwBRHQIsJ39M/htlnHGZnxj4Y38Gq4lY48hnf8O2Y9gN8F4FcA/H+fsC+rPZJ9+KuBW3eAf/vPgcP+kbP5wDdu8TXfeQN3PvJsgKiXMeyfOrPrI++kfR7AfwLw1rtQ1mqrrbbaag+/j+drv/Zr8XM/93P4p//0n+IHf/AH8QM/8AP4xCc+8U74lu2Hf/iH8dZbb+W/T37yk3UC81IlywJV0JabPwVcFyV2mzyAGtg9xWxYyrdlI7smXXuN7uY/lcb6asu1EtPm2izFvOD/0uSkZQLnvOfYPpahchkDZGlhdq4N22NaziQ2nOnb3IcLC9qTijYLxq2fl9UpGTcA7awkn2v8NiyWReaWWgjgiz0wjMBoWLcJ9CUzfgVkcvLnEquv98JmOwScvXbE9c8MuPHpEbsvMjZ3ge4c2Nxj9PcYYUcYzyCSzQrwWJ1gxR32Xv6OLrOLu/sO3YXER6WjE5auXkOAP5LE/XxA6C4AdxAQKvYJJE7Vd0OSeWbJN3YC8HJHmQkadozhGiH0Av65IIxdSrFKc3ckAIirRf3UTknStfQJygSYStoWyK2OxwL4WauAXjZpZvKpzDB78zUz4GcTPllMQUMu9VagqzA9UViMqX0zOKhAKAu0pcBvljLOGdX+TOSjbd1SjNmQ8nGO4RwjnkVhJNOJ643vUo5ZjDfXsJPxERVo1DbMa+EJROM0NlMdJ08E22co+cRICXtgeKeAr4KqBVhUeWBhoVIlsQ2W+NMyjnW8MzgBqPk+M/1Ntp3zOC7nfUoQWVjybqjbTcvV+yFvSoC5H5bGIwPDGeFwhxA3XED0FCvYBZrcZ7lsX/ytzuvQyf2T8hqBzf0o8Ye9gL2xd/UPUb0ndYw27WI3d8wZE6V2MfXm0n95A8DcParFpZtC6iLvnGr+8XYsz1em7y4L7FXs1yVWcctuXWJ3zuWxxAK9ql0GBM+ln2PDNnZSStmmn5NIbo7xFd7p+bqHYeJeRcp4DiyfOX8lH+2cqM7kUp8yy7st+5Q9KhD8dgDkDLC7zOqdgLIzdWzTzfvlMthbfdd8Uz4WKM6hUIBy/DLgOdcllvtcN4nMsZIbm2Xyqm9L6RX8XW21BXsqf9uvttpqD217RPzb8ACfCA/wifE+3uABD2LAgxgwcEQE8B9Gwq/GZ+Gd0AH4JgAfe9KOrPao9vz7gA9+FOj6t5XNrff3+Nhvuo5rzz9DMsnvgA0x4s1xxPA4fmsCElJph3cH7AWA+wA+CeDRsf/VVltttdUewh6a4bvZbPCxj8nE69u+7dvwz/7ZP8Nf/It/Eb/n9/weHI9HvPnmm9VO4Ndeew0vv/wyAODll1/Gz/7sz1b5vfbaa/nckm23W2y32+mJGFPsv7SA38bQbVm2anPyyC0wp4xJXTxqWTCWodDu4Lc2B/Yxp8XkdJ1lA7SmDGAiYBzT5Ym5awHhthwiUCfsAp6LH2sYFERUs3wcCXs0LZLlcyphmNJMYvcGGLBX5eN8WXCsWDxGPtmxpIuG9WDqIf83DKYsZ5ja0vm6XAt6R5ZxQg5gI9enoLvWyS6+2kXhiu08A6arW+3ky8ZkyxsH6nGUFxJT3+bjDaOrKmccweMI2mwk7p13SX66tBH3jaygMsQdEKlIYMZervHHiLMvCKhLgdHfC3DHgF/9X51huDOi7wI4iCQuIgEjgYYOSFUjQACbBJJQFPZpBMEdkORbCYhdlmqOvSCRm7tA2BDCDhlwZEqAWMdwxwRAjgR2DO6A/QsMf0E4+wKLnGwPPPgw4XiP8NwvJ9ZNAjwVBMwgJgFILOMMCM2sgytjEREZFNXrEz4lTM4BBYDr5HiWxAUyaJdloFmaUME2ZQ9XzGH7SImpvdLT2h3NOQPIgUo9pL2QAfLcDjMgsbZPrh+mAKAjRuclhnewsW8jimxzYsy61E8ZUEtINQVhFccoksjCkA2IG0K45hA3ncRazSBk8jFIYZzUCyhJ6UZPwkIdhZHuRikzekLYokhMpz5TkK8AqhAZ5ZEKYKxV1rbUNtL6Vo8CRu8iut2I/YsbXPs8SazbKPkCaYMFSWxieVQR/FHGx+F5wvEWI1yLQB/lOXh0qQ1LGzAAp2PJsJAzwOlZ2MEsYHocHTZ7iXMdkzIFmTaNSQZb2bhg8a9sWuBS7yibJmJHON4inL8/grcCclMXgfs9/D0Hd0D2mZDGtAGrs5ljsQfCtn7GuSOhOyfsPn8ERUbceYSNPLcySGvi/XJHNVCrxTiR/a4Yxaz3q3a2nI8dpRAQpX1FUt08z4KEiHBH8yzPAE2qUBDgpn2WX8naOcTce0+TzrBs55iqNn3Fkl1iwlrG7Sn5V8MULcogMwxj+z3AvGfNhjD7Pk3A5mws2bnNWNOKTq9rAdVmnnJpDN6KTdnkZctK7ZXbWjeiNSxcDiFf5za9zLGGccIqrtjcVoZ7DrC1/ad+mnxI5ZyVBTrwpN5XHrO2jZfGyIk5Uj5u08z1gTneMnfZKvjoPDYcS6gQ73I6AbIbhutczF0pSMKohFAdb+fONq7vknxzPq5lNKA0WxDWqveYPLLPbfm2r7wXWWt7Xq+3c0sLZK+22ow9Vb/tV1tttcdiAcD/uP88XHoffEd/G9/Q3QHw3wJ44Um6ttpqqz2C/cKDB/h/fOYzOF9SEXxY+woAXwvg2SBOr7baaqut9pD2tlcAYow4HA74tm/7NvR9j3/wD/5BPveLv/iL+LVf+zW88sorAIBXXnkFP//zP4/Pfe5zOc3f+3t/D7du3cLHP/7xhy6bWoANqBdLl6zdSb/0+dQ1ly0UVgt4PM3XxuGakYirYr7a43P5nPI5fyyxd6u/pfpchRGR0zaTDgVST/UDGR9a9jOZ9nhUy+1r6jkHPC+VMccSOsV4se2n7OwrTMZK/LcFdg4tMzP4cADv98AYBPidqUvFksybIQQoYQVEEsDqDxH+ImJzd4QLEXHjMZ4xaBvA0Qn7UIG9KHF1adRYokmC+ZDYuKPKQzPcCLhRYnx2FwR/TvB7KkCnYSrKZ67YrLFHYn9yrhN3APdA7AWUcUdC2Egc2OGaK2BgRAFzDDhaAaUGyFMAzLI0iY0/MPkkf/N1S+2ezud4woTan3wRarCXZ9LYdK5pOwNqZZCZSju2jFBbBlOJ8TpXD04s32gZvmTyMH5NQOWsnSvH4ugQozJ8I7ouwHUx9V1a5M+ghWlLBWG1+Ny/KakXmeS4kTE0qav1FcgAtQUF2aax46LJJkTCGJ2waX1EuMY51rOON9vH0ScZYMOuDbvE8FX2fJK8RtpUkTcshNKOOd6wHa8OIMe5nxAJboAA/jom9FFEhWls+0nGJGcwPW8GiHLN4U6P4QaJ9LSO+VFY+25s+qhtML2fEggs45EzUJ3TpE0ibkAOy9DGIFerYlLng+VvidmrbT89JnLbWZbbPJuyzHf1/Ejv3bSRAjHKscfF8G39m3v3pNivCt7NprkCu3P2vXjZeZvXKSB0yXTT1qlYsJexkW15D8G4vTKjFyj+napjK6t8yg/TZ8wzdZ+r65LyyJKvJu2szHNrCyxsWpr3XNYnc/LNc+UAl86jL5Vpzgln2jz7HwszN8bl/Br27kmbm+OdmosDBYA9uZnCAME231P56cbMy+bsj2txcLUvCXuSv+1XW221x2cXiHjAAQ844FPhgH83nuOAMwDXMP2R9LTabQDfihWkXu1ptp1z+C9u3cJX7HbvWBkDM94K4fExfDsIw3fdE7jaaqut9p60h2L4/vAP/zB++2//7fjIRz6Ce/fu4cd//MfxUz/1U/iJn/gJ3L59G7/v9/0+/KE/9Idw584d3Lp1C3/gD/wBvPLKK/j2b/92AMB3f/d34+Mf/zh+7+/9vfhzf+7P4dVXX8Uf/aN/FD/0Qz/06Lt8293vriy6L6abA3jnWL/2mB7vDOPDsmJt/q1c86kFG03nnLA256SZQ6hYumT8qiTlGoB3jklBdpf/hJG6sDho48yaOGrsULM8EquFnKsBkjZ2n62/xsiNobB0NS+2sRANGymDub4cn1uU1n7outKHOXaam9bPUWITWh+UrWMWp11ZaKMsz+2KL1Xd1W+atHdezIycWSmAVLuO/+dlkbC5Pl5cgEKAv3lD4vX2lo0EAJzY04Xlx1G+Rl+AcJUk9YcId4zo7u4xPH+Gw/Md+FpAvwkYBw+MDggC8FIguD2BO06SrQwKDt05pbipQNyygMDHEkPU71FAsD4BX1sk+V1G3IhEqqYjQEBnFpBZ68YkDOHhugDHfg8MN0Xa+XCbsHsD8AeGT0xL6gt4o0xX3TCirEb2AvoIs5fzs6SSeraPjjmylTIwZ4aCAq4K4k3YimSALO16BftQ/M7ArTJQGTXAqO3bFfBXmccggAbk+KoVOOyF6Zjln1N9lTwZo4PE76X5PQjpOgUfta+QJX0TKHnwGDYeYevQ+whHwLELGK8zDs8T+s9wzRBl5Di03AGO5V5SBrbKekcSFup4ltrVQUDF3AEWTRew1x8khi46FvZ6W6UgZRaGqIyFEB2G4BGY4H3E/mbMTFRhkMo1Mco7KfaSlz9ylnkebjDC9QjaRtlMEXQDRQP06gaLBJoykfirg8IzyIu8NDPAgeD3gD+WcU7JD9u3E9nxNIbsuHZDRNg63Puww+H5FLvXy4CgvYfbSxuqfLUyh7X+Oo5d6s/YpfHr0+dOB6vU3V8QunNz/1WbBxoAmMtxpOdaPj/ZdIASk5eQNzjkzRAEMGRc+2NMTN8UA7wj+GDGDTNojAnsTQoagQuT72EAxaoD5uYgM8msrHA2817j8k7M4KYyTtO7xaatGMA2Tws06nvQXusaMC6/K6m0QQsMN35VzGOt2xx4tyQNrXORhvE5qYemG+t8JozilvV8CoAFpvF3Z4BwWwb1pm1OAH8ToFbzaWMIN+cnvtjYwvb8qfo5gjy00WyOM0zlyPN1tjGDNa+Z+8GyZhdBysiAXwCdUx5sJBdaJm4b65fNmMkqOcrAbWSaJ9efsgQUl/mg2bCoCj25TlGO2Xl467c38+cl1ZhT+dlrdY79KHHFV/uSsafyt/1qq6322O0T4QE+EQbUix3Pgn0IwP8ewF8F8PoT9mW11ebtua7D//H978duTrHxS93WKehqq6222hOxhwJ8P/e5z+H7v//78dnPfha3b9/GN3/zN+MnfuIn8Ft/628FAPz5P//n4ZzD933f9+FwOOB7vud78Jf+0l/K13vv8Tf/5t/ED/7gD+KVV17B9evX8QM/8AP4E3/iTzx6DRrwVhe2s9nFlxaEtcfywk9aHc6LWVT+gALytgxeawq26YKeSq61QHMLAM7JuqUFG9JFm8ayJLCVbfZeGJ9kdvy7Jl2zSFoBjnNMAV00VFnAUC/85jSRwYjV4u6EfWOBVU3XdWVB0rtaYlrbQgo2C+MzrNa5BUabpp2EKRDbMngsyN3KPCcAOAMbkQUQBmqGdmsxlsW3XDwtstEmTKQWNE5ykHyxl8XLzgvLkCgvlFJguDFmaVlJWIBedipnm4C+dP3h+R4PXvKgXuh7RAwmuS/oKNeHM5FV9nsIWzjCAMBIcUQlnmhMoJlKHbuADGwpOAcG/IW0RziL6M4dugfC3OWOEXYQNrGy6iAMSf2uMUsPzwto1D9AZjG6sYBNCkpltqXeytyAVVXbw7RfOnQC1I2+TkdRADgAWdpZy5y7HkATR3feLyuh3ca9rViXes78FSCZwapTrX7oUM+xZEUu2Pt2TNb1yACza86nvDghbGH02A8dbuwO8C6i7wMOtwL2o8e11xJAaNtDwbmx5GtBaSSgcjwD4jaBtJDxItczXK+yq8Y3Mu0CJNa0PmsoxxXObT0Q4nmH467DuJEB5xyDtwHjzmHc+dwfrUS3Cww3Mo43HYYbhLCL4C5KTGGq/bEAPlm2b1LnDN48C5K/h6FDDB4IhG7P8EdOct0ibxw9VfUtGx+QgV5pKwINDHdkxN5hvOawfx9jvB4F7A0CTrtzl9i4zdhKbZvvebPxQL9rn+T+Y+mrzVvA7ouxijme4/HqhqcAM94KiCsbRFiAdx0jtu/MeKS0YSDnWYZpkngWH6VunMaixGIGK7g0w0BOcvsPbXNhDE6YvBuCzAuA/L98KWBeBRwusoQjZkHWNr8ZieLJcY7zaZo8FOidBSnba05ZTEz+OYCxYsS66Xu2BWBb6Wf14URcYw29UEknt2V4TI/nrBQUdgWItSBxm4/53vpjgVwBogMIM4tObRu3zOV2I1x7XTuurMzzqUUuc64NIQKg3qBo07VqNEDZ/OhdnqtWoL+Rg7ZlV0BzCOW7kXu+DOitQN3W9LjNownpwcwyP08KPi34zYN5frS/TxKAnOf9es776vysXPW62Lbagj2Vv+1XW221d8B+PSQm7u0n7cgj2m8E8FUA/kcA50/Yl9WubL4Dvvk7gNdfBf79zz3UpbtbDv/F9z+POx9+ezGAH9W+6Xtv4oPftMM//X++geP5e2gidQbgG/HuPQqOAH4ewFvvUnmrrbbaaqsBeEjA98d+7MdOnt/tdviRH/kR/MiP/Mhimi//8i/H3/7bf/thij1plokHAFVMPaACyQr7F2UBZmlxp118suwbsouEXIA864NNr/kYllC1GLMEDi6xAOxiThuXzC4QmQWtajHsBGtiwpRZspYJU/neLKDaBUG7sGsXTi1bQ9PZNdKlRcg5OwXGW1vqe5VRbq9t62oXlyNPJPMmcoTtIlz6fiUmydzCMyDHDocEmEcQXAJcG/8ji/tMdbUcKhYpICBI2BKGmwD5WDdTROmXnkEsEs5smaEWLFSgKgG77NuyDCjDIgkdO0a4VsqjCJEUdgCYQaDMVA4bLoBYEPRqvMaIGyD2lPMVqVpZ9GSggFOUsaIa8EWpR9XcDeBr498Cpv72WgWjEhO1Ao5z4dNyGQ0YiZm0gAFu589bYmslTZ3PmwK1/BYI1bSsz5Pa1wkDum27mPJM9zkHwjjqIjzDEYPORow3SNjqgQ2jufiXAWUikFLA9S8xgGPPAtoygJiRQJDnJEtOpf81TWoUHcPCspZ40TqOhVbOoNEhBEKIDt5FOBdBfUTYEuLGgUae9JkFcccdYbwG8CYWSWM06TPgSxWYSjZrO45YGNgxgbE0CsAMIEs4T2S/UdpT36MZAGaJ3Rt2DsOZw3gtJjlnBoYUZ3gQqfaWZR598UvZvPZ+QwVwMyyo3V0wNvdi3nxSSYzPPSbteFsae5qUqGIJU2TM3avCLGZTrzI29HkJpM/VOyoBVKckWx+ncdpVcBVg9JRVYOwjLma06hhXLJPcDAu59eGyY9VmrQXAUYFooACz5KbzjiVfG3Zrzif9bzdnTUDsJX9OlWcbcy42sal/Lk/noEt9cWrOZo/PlfeoZuZtk7lom0bduKRP5pi8s3kqk7dVxmltbv7dztXmyjYKPCetAXttmYt1mQOV535rtD4ntq+04cT5036u9iVrT+Nv+9VWW+2dsJchKM+zah8G8DyAv/OkHVntYcw54KUPnZ77Lli3JXzkW8+wvfGY5qUPae/72BbXX+jwz//qmzi1c+6W93i+666uDvOkrQfwASz+bHrsFgB8FsDwLpW32mqrrbYagIcEfJ9KSwvT2ZS96tJCbVo8YZX31UWTLHmcrrO78JXtakFh74Tdm1m3zrB9XTk2Juk0ZlmY0Rd/CxAvMQRsuSEIkKdybDmvmjEgLhqAOYRaKphI1sNbhrFZkGRbpjZlYiZXbN5TUo1qRoo4nzdSfyJZV1/DIQIxJIZwGpbOm8nhHDBi+ke/K1BPVLOx7aIwOekry+xVFnIG55WtlPqxZQ61AKxLSJHpW7Z91AK/elzTzrG3bf8sxjlkhDffgo8M2vTg3QYgL5sLPCHu/CQ9jRHkvABkXMAgKY8TkCqg1GY3ousChkMHuvDwD5zgIwxgL/E7QQK2EuQzJ9bVeMZwvbSNxvOlUWRSgxOGMBPQPRCAikny80Rwo8QP3n9ZRHchLGFlB8bE+FWZYLd3cAdCtydEl2Sdn3dgcrj2hdSHVKRygwUIUxO7UfKKoAKUWTAoJmwoFlBXwWEKqJi5gIJ1DbjaAkskYJgbUJjOjCL3nM4jtfciwGz9MmVXMrtmeFlALoORWcYaNcgGgLwUHCNlSWcONLklVXKbTf4UtGwqMtQe4IPHAcD9botNN+JsM+B4rcM+EsJmAxekXdhLesvoZBKUniEAnhuF2Ru2iQ1u60cM9BHUJUbh6MCDgzs6+KPKESdwANrGlBm6cSP505CIi6nNwuhxcexxthngidHvRhzuAPcPHtdfC8Ji13vDy1h1o+R/vA0cn2dgF+SVFKnIpY+UwFQCpR9F3MMA3dIm3HE15pgJIRD44OH2rmKvK6M+2D1JZmwXtrmA7N0Fww0R/hjx5ldtcHheyoOTPzoS3MGJj2lcuREF/OwKw51CeTTaeNcMFLA1CkDlBsLujYjdF/aInYOVX9cYu6UCqKTPdUxU9xgDTkExI8+e/fAlsTB3RSHEWelnL45qbGPYdnXO3OCJtTeONUPvYWxuE1pMihZNXFWysrtz76PLbGmjVvvu1uNz17absJo8RYK4ef+0eXkvDHcbkqGNHRt5Kp0cTHm23m2ICcBcGyfXMDd1tvMBrUcIAEepCxV2ct0kNAV6L2MrZ/avAe3TPIO8mfu0Utq2beb6PIRFsDkzww2buDIdVxq+4pSk9RwQPycB3arC5HJQl2HHSjsGbB3aTYltWsvu1blWmhNbcLgam7GMByKqwNnJGLbmXL5vc4vbzZhWHUjzsozeOTWAGb9ShTKTlzV/Pa5pE1BdtVpIz5BTvzlWW2211VZbbbXVVnsk+2/e/3584/Xr2DwrgO9qq6222mpfEvZMA76siymnWJy6GGMAkbxA4mdeym4mPwVwk5xjFfM1zlyX4wg2C1FLvi6xdY3/i2avMeULdGdA5qo6sqg1G0fNLAJWMWpPMX+WFiPteU6r5VQk+CZGlKR9Z5gocwuYc5OqyxjACwuv2WYWpCuzrOWmTJFnvoQtMld3auIQWp8mEpHzY4iPR+D8Aug8bAxlsuClowLwMUvWyiC0ADkRwkaA094AfBSpxixVdpeMBC9B4sUqk7cBKONGwBQXCnuPUyjmCrQcEwg7IoMvsYOAThFwe0rHEpDTMcK2AFlhC4zXCfQ5zuxfkaUGyFMBQvUW0TXswBMgE0CWdY36zEg+VTK22ibtEOT6WMWuNNLFs5LM1pdYjufDbP5vwWU2aQmz9QIS3oD6fAv6AgIq6l9Fy07fq3zasjixK7UtIoEHhxAconOgLqDrAvwmYrgleffnjBhImLmTmJbSJ8qcjT0hbJFB/CL3TAIoKhidfFMgOgPS6ldav6eAvBko+tR8aWxxx3BOZM5DJASWsRXOGON1wnjm4AaRVI6JIUxp00HYEOIWEjc4JrZ9INDoZCzEZnxYn7kAp0sy8KVt5H+ee8fZcWs+K/ubgvrqMF4HxhtcNkYNAvQ6224Qf8jmP/OZWNjX0adNG4bdTEHi97rAeYMGk8hQVwx0QmbqSvfODdRSNqO9tvFZ655A3mqDRhpbAJKcdv0slvGu+bM8PxM4+Nhspn4TuV85aK5p3h1zwONl7/QZed1ZMM9uAmtdX5L9XcrzxLGTbNlL4tESL/hhWL+adj57Akc39b9VKTnVJ9bPRzEtawYEzuUujbsZCeqT6S87/zgZwMWxkv1VY822cuWtHDSzAWE5M37LNafvU7JAKrCo0DKZvy/F072KLUlBzz3nWiB37vfDaqutttpqq72nrAfwrQA+BeCXnrAvz6B9/jMyt/jAV4jU8mqXWrclfOw3XccX/uMRn/2Fw2yanXO49qzE7n0ZQpRfsenVVltttfe8PdtbvonAicGq3wFAmDpcgNomXi57B42fVcXobXbja16VWfavsno7w2RVP2w+44gMGGd2cQHXcn7qk/flDyh+qrmmzrroY+WcjXxeZiooeJuOT+o8w96tQF/7B5TPFhAHysJk/uN6EdGUQ96wasklVm/KLxq2jvPyR6Y8Mn1RgaWNf/q5lZXOeWs9jM/qj/b3EtvF5uUox0JWQD0D63Ox3RqbyMBYn+uEk0PxOCC++RboOJS2CAwaAhCj3A+RU8xLzmCGAJxpfMQEbBIh7AjjzSBAVnAi46rYnroRix80ooC0XsBZGgTI0bwBYfXGrUgxZ997zuy92MsfBcAdBAQCUp7XojBiR0J/z6G/69CdC8sw9sB4PQpr2AHjdcbxVspnYPiB4YbE1rTATvpfgVwai6/2fAaJEntU20I+c87TjSx5WCA3XV+BdNr+QwLwOhRmrgXhLAAYa99s/FUrG1yZPWYw2lwWDOil7UKoZJQzoMtAjBLLt5J01vwSoF75qtdbozQuEuAb0vneB2y2A/YvMI63SfosjSlqnsOU2JiyUYBlg8IWSTa8gImUAFW2mxVYylew16XPbhCmeWY8J0AzbhjheuoIAtBFeB/hiHEcO4TgZL/EjnG8CRxvCrBLY9psEAX8BTPGM8J4jcG7AIwEHB1oL8x5f+GkXRrQsfpTljSZ8wCIWB4LycfS51Qxa2HA8BwX2Ixdd2S4wCmOtsNwAxhvRGATpd0ODu4ojHtlzBMn5n2KzVvha1pe8j9sgLhjxLMomzfS+HEDoXsg9yoAkXPu0p9HjqcL1PcRpzjBZEBCK8Fc2Phc2srcU/ke07rkd5Mek2emGyL8MGVDZkBdlTXGcVat4UqW38eu/OkpfW/nmK+XAEjVO3X6jqreNe17Xd91c2XY92N73Oan8xebfu5ajqW92nT2r2mPKv3sZrBmXmGvb2P1WnbxnK/kTgPObblLYGgLyi+1ZUrLymxulD7Y+HlyHMwB1HN1sT5r3kt+VWD5DDDczqE0T8u+1c0GCtImBRWy81B7HmU+lc+rO83GxfZ7ZcrANhvs7PxYz+VjWX2l1KVKn2Lm5mPtnF4uqOemQJnna1o7l29BWwWUGylosGG9G8lq8ibv1VZbbbXVVqvsvYDwbAH8TgCvPGlHnk371V8EfuFngfEZ0tZ9wsN2c03iCH/Nd954so48DiMAXwPg6/HuoQBX3PO42mqrrbba47dnfmsXhVgtqGTp5mhkkHVBpGKoNG+fDDKaBRoFOq2csi7+MNdgoC5kBbPwM9l5z2kR1KQBpvF/G7nmbHYhJy0yUZKEy8CsAX3J9C7P7PpnjR87t0DmfV5IqhbEdBEsyS9LWQbwVklAXcQlByAKm9ouQOqC5RjL4uwSqGqvmWVIs1ncNQvwbRqgBuzzwrYuviU/LNu1Zd0uxcFr/G7lAxdNZfiquMzNwvtM/hOmbwzgYwSf70XZtHNg78GdAQ0U87DypzGxYNrqJBf25xsBPzZRgD5P8OfCIA5bziDxeF1AG7+HMPU84I4CwIkEs5TdPaAMCCPhPVAJY5/8SOAod4zYp3MkrF52Um7sFBgqAGbcCarEDHBHiB3h4o7H5kFEdxExnrmK0GVZfxkQSn7UsXoTw5QEfKyAUkIGfYShTHUeBuhVmWDbxkSJHW3ArBxD1vgnzNLit2UeZpnZuYm7DhFlEBsmttahAtIU/AsMCsLkDCmhTyBqNaTT7c4ai1Xzy4AkFSncSDJsAxC3DHSMMHocibHrRxAxui7g4kUJdsyfogmblb0AoiL/zYADhmvC7g070TSgQHAH3SjAoF0A+SjM5MEJmxZA3Mj52Ke+CJIfOxbA0SXp8HQsblI7BtI9Ezjse2ler3FngdATOi+bjlwQmXAAON5wePBBQrgWJHbvUQBe3TyQGbYKQGo7KqtX+y21tcaUVcnoGJy0scVfnLRZ7AqrPcc/1vGhlTHPhMPtDucvO4zXo7RBBGgU6XQBQqmMf9Kx34x1h1oGOfUHE0ADgfs03gbZ2LF9Q8qJG5/8pSovBWEds/S9GcjsqR7/VNJLPGJk4NgFTnLgmMSztveWKA9QeTZEiBx+KykLPRfkPXtVNt8pa94zltXLcXqs1LuZa+jnDGpOwymUOph5jJV0tu+jVga4fR+ekOJtr5mNdduyRxfffybNHMDOscg+n5IlXvDrUtZsc272mlR2Vc+5drEgaluVhkHd9reVfp6052VM3Mti+bZ1AdI8bQGsNnLQHIxstB0TM7LLNet2Zt6mzNzIk+PZ5b5DFSM3pzvRf6n8LIPclqEPgux/LGCy2VTZbkaqfo+EUCSh8/3YbnpIvweSXLMFdWdlm9N3Oz+vwfL0DGo3wq622mqrrfYlai9BQNKXn7Qjq612ZfvP/qtb+MA37tBv13nMY7H3A/gogFvvYpkM4N8B+DyAR4x4tNpqq6222qPbs78V/GGk0lrG7wIDuLJZlsuJBap83Cz8tiDkUjytDDrHsrBzqn5xylBYZBNEnl1MYwt0P6pZdpCajYl7kvVyCaiZ051euMvpryo12MpTXiZvmMsw+dt6z5Q7WXxcYvm2GwSsX225p+rHDBwOwOFYgImWbVL9bwCPzIoTaV43MtzBIV50iAcPjoJIWRlWyzQUGWcBnnL80uw7cvxWjVGaWXYWO0gAafWdBGwDcWYLwzO4lz84A1yRnEMn5+KOMdwkDGdOyrH15fJXAT+2awh13s112c85VqMBVCc7U8kc0zpf4faz+ea8W59t/uavsJEXMk9AYCms+FQeW1welYbqzcp8zddR+Wz+1/7OLFYCYiDE4ASMBeCJQddGhJ0BD9v2MW3GBMSeZPy5ck4ZmwDgNkFkoRkQeefSntEDsUvj2vQjezYhANL/CfjNFyP5XzGeOQGLZGIjp7pugOFGApEnrGeux4IZk9rvczLb1Tg037np+3YzQAaXeTom2BPGHeF4OwHzBAl8HaTvbIzofI0rf7OS5qYdBdQu44eCMIY3DwQgh5eNJbP1BYqUNCewJQHtbQxftmMy3wONRHTOdMbntt04KSRMQhYU5YQry9E+qs3EyZ3YZe/KJRam/f+KPpxkmJ7w41KG8kNep8xX+9f68DBlLrbrQp0yuGntFCt4huk8l+eVmcULeUzOt2zpy1RLluwqdV2K9bzk3ol7JwOaDymXXs2PH6Yt58pWs/O0U2zaGAsA+6jWbshcKHuOrbzaaqutttpqYj2AFwDsnrQjj9G2AF5M/6/2TFjXA9dvyf9XsBe/coP3f3wH1z0dgO/mjHDr5Q6dAaDPnMPLmw22z4K6yjXI3o/Nu1zuWwC+gCutda222mqrrfZ47Zln+Fqmo43zyElmmcYwTTsnAazMWzLnLIvALhrF9H1MMbRU0tnm6Vwpx0o+W2k2C/C2phMHZa84J/lEBsYxAbURgM8sXU4LTARktoKwv6iW0bMWuTB+ZmKgSfMUJgEPSQJmNh5fkFV1y+oIYbq46H3NZGGpU2XaJ9puKu88B+o6Kixj9Y2SP3axsWXFWn9Me4BDOaZsXyv7KBWTOhiGTS7euwymt4uF7Jy0iQV5jV9VXGXvMzuLEnuGlWUVZ1hNAML9B3DHI9xuC/BWGJFU6k5DKEzU3qV4mNZ5gHuP669FuNHh/od6YegSwB0XFmhqPkogkDIlhxsMNwqYM15nuAD4vSBZ7AVA6h4Qdl8ghDNh+o7XGOwYBBIZaAWDDwIuDbcFkKOgPjC6u166WLuOGOgi4GXMU4o9fPejhN3nHTb3HfyB4Q8Mdi6BU4ToDUiVQCGKafiYhpG4pqlf9H5ILN4MmjW3VpZaRgEXM+iVQMAKS05t60YDPCpI28QGVlZoTCxJp+0W63IqIIvr+imYFTvkGMyat1PWtSvZEDFi8CLxHaiwdhOImsFAYtCgccQhQKlnAfr1WIqty4NDcIwxODgX0fmIfjti2PUIGycbD0Zg3KUxBkoyu+JU7AnjNSD2XNeZkBm6u+2AcfQYxk58HJO/VT+RtOEo9VFpcH3UU9qwAAegl44OwSEOHuSjvElJmOCxlz7QDQzELPFwzwjhegCNJI+Mjssmh05YbO6QYmWHlIeXMU9j8i/IuGXP8EeAB8Jw5sFboNum5y8DYQeMI8EfaDIWKBapaa0/JZYve+DwXIfD84TD8xG8k+eUu+fhdKNG8i/HCSa51wHAHxL4zWb8J8l18ZkQO0Y8S/0VRRmgPweuvXYEKXPXqHLEjjKoq4xdrUvsm+crUWbCa6xyEBA2hS0eewKFxBLWfBzV9yGhxArWxzvJO1Tqbd8j6R0+mvfNo1jeWYH6ndkwLjNjUGV/W3ZpK+OMkl/FvFyypTrMbEAi12zWCub8HMM4naPLwlwtsFYnrFEAiA7kGiatYddSJS3tq/znGMCWNXuKCVydNwoluT9afxbrNgWlJ6xnW9Yc29nG87XtrnnacdPm0eZnpxZt/Wf6smLwaj8lmWbJLwgr2NYpzQsrtrkdw8bXag7V9D2HmJR1QiXnnNm6SSpayyHvRQrZMoeHMcucM8o1Vl45z4WTX5m5G4J8bjZx8jDWdbLM3ao9pa602UzB2lbi2SUf21jC2p6A5JXaXqWoM4t6XWhbbbXVVvsStU8D+AsAfgeA3/RkXXls9jUA/hCAvwrg55+wL6tdye68BPwv/9fAv/4nwCf/w5P25qHtw//ZGd7/jTv85F/8Aj75/9sDAH7DrVv4vS+9hM2zAPiuttpqq632JWfPPuBrLEuvtouxJPKQFLmAa/Z/m5ZnFqBa03QZlD3BTAXKAmqbd1hYgbGLPFbKTRmOKhdsZJdr9xoAV4FHPyONZ/1ZsGohammhWNvWyjOfSp/8mpVgtvJ0EyYMo6KFavqlRVHX9K+aShMuWW6jxoe2nSwQ3MZKnLjONXt7Ugeu0+Zz1s8wm976w+MIHI5A50GhB3dNWpfAGsPqlTwBhsTN7M4jzgAcbnuEnYBYAQBvBCTJJGGX2kjX/T1EsiUBcuwEUEREBn/dgAz2UBCQCCmb4geyrLOAcyQysI7lqZX2S5QAtwDGArSjiwJQXosYbhL2zzmcvRHg9zyRVq6ajzDVPSBUm0ksc9UyJFXClhS0VYDQpMlMwyWj6bqs7qGY+Gl9sb7b/O1tkUAz3ddSoc2mPlkuOPlTPyIlHm5+FiVglSAgqgDKCTxTPC0Bw1CQO8lwI8hzmUeHw9DhbHvEphvhfcRxE7F/3mNzF+gvDPDOXDYEZNC3+J7ZrI7z+PE+Yhx98YGRx4/kU2SV0XFFXrXtwZ4Bz3C93IPj6NPjgRCjq1irgLDkBXQm7J8jjGfpRCBhOUcuQHlIHZjAce6osHTVz6avcvuytC8nsJdikW9W4FVlokuduOSjfRUA7oCL9zkMtwDexpy3O4q8t0pNV/GmrVtkbkk7xtJzgHXMeM6+ugPgDgANEdw5GRMOwvK1GBWRMPgT6F+XW8ZjNY4dVQxnygg+sjx4jgeteSV2sUugsBtSDHRuwN4c5oGBkJ67j2IVoDUP1D4U0xMo76Ml8PbUOQAn5YDt8SXJZPXh1LVzwKlloOaNTo9gc6AoNeD4XDrrw0KaeclnP5OmALtzAHflhwHQuZ07WX8soDxTPwCTdidH4Ojq69p+mwOTT7RBPt9KeJ/q81Njcel8ZAkH4tx0nt1cy64Bh21c4JzfJYzmufHmHOgES3c2ZrCRrK7Kbjb4TUDgU2zgGGuw1wLCdqMgc/XbIs87H5Idvdpqq6222nvFGMABwL+HTJS/FUL3e5bNp78VaHtmzDnAbU6vDQJ47oMdPvjrznDzpadrmfruayM+9XMXuP/5sjPSAzjzl+1ifXz20maD33bnDv7V/fv47PF4tYt6AB8G8L530rPVVltttdWeRnu63qSPYKzAmu7AVxDLzSwK67F2h/wkHmr67B0moJqydGOsGLeTeL0oPk3AzFNAchurS31lrmPVEclOflMP2f0/n3VmTBGBEa8ms7cEDCsQ2y7ktcybZqGyyleBZ68LkKYPdDHSMnS1L6KFY9Jx7+u20Vi/Fkxumb7kZPV/SQIvM6uni7JVOW1cOXvNZYvqOZ/k60zM5NnF0JNxBSV+Hl9cgLoOvNum+Mnqk8vpaERiJhZgRHA7h+7+gP4ecHHnDMN1ZVFqO2hZBdSkQf7P4ZANUBZ7YfbRAGzuKniGDNxZoC6zZhObN3YJpAkkjMZeWDixE/DFyu7SwQnQFxlwDOoZ7vqAcSTs3+exuU/o7gdQ9DLE5tpvBpBlouJXLGBXBokSgJgZuwzQCPBG/HNDSZ9BYB32c060YO4SSNzcCpmRax83qdxo2jdLK7ek+pYFpGU6YUwDEFAxCmDJTtoZTplRKLFdtX0SyEsJiBMgMpUzkmxCGQnHY4fdZkDvIrougM4C9l/WobsA3D2DLBoAU/oGiBtkFjT34q8yY9ExOhdxJAYHyv4JY1zYqDkvp38yICmBnUhS5egiqGP4Ti7QmLlgSN4ptq1KZ7sxSvxcEPYvEMYbnNou1eHgcr+qBHrsBewN5hnQbhzRPq2ks/WRrP4k0JSCMOOJAJfbkOtxp4/dwIgbh/OXGcOtCGwDcPCgo9x7FKgCezNInny0MtIKIJd25cy8ZQ9p08S07i4I/sCpfELs5Y+9MPDdiCLdnAeSqTuVcnL7BAFxx52NBcwVUz962YTCDYAszGqCP0rbuZFLnE4D9ua+i1Hi9x4Owh58VJtRr7DAXmZ/+vp8Vn2QROX90G5oUgB1bqHl1HtmLpyAVcfQmK5NWfkay7S151o7BSq27TrzXi0xjuffudpWJ2MfZ19b13jyPbc9IM9HE6+3uo51J4xpx7m5kSORTU/5kke9Ma3Nfy6MREwPQtMeyqjmdk4Tix/Ud3LeNvOp+YspOzNjFzYJkHcV4zaXPXUeJ8N/zMxV2xjAqqpSxdo1c2S74bFSrmnUWJi53sti81GpZkpMZDvn13m2VYhZUvHR85NQHuUZU4V2sd/Vp7nPNoavjQe8yj2vttpqq32J2y8A+CUAH4PIO+uk/Vk288NjtWfD5jbKGXvxqzZ45f/w/LvkzNXt8798xM/8lTefqA8f2e3we19+GXc/9amrA75bAN8AAX5XW2211Vb7krJnG/BlLqxeM2GtQd+0ABMi2At7iEIsAJtdCLGLUjZ2lpV4jmahE5C0XWcAWgVEuZ7QnFpssYze9pgu2rQxgdN5TteQqxfgcjqN69XKCyc/KUkn8zguA5ZWJlIXDZVpa5ki5OoFQpUenpVh9gXJyOcuYV9IhYsv2s4hmD5M/kUumz61rAoENmVpneyCrKsXrCftoabyj9ViZtOOQA3i9n3dn5Igf8yLmIuL2knaGXFyrX4Pd+/DkwNtewBboBP5ZrjUBgwALAvMXkCPyrzIzp69HtHtCeedwxgFrAnbKIzdY9lg0B+FgavgJjugvy9Aaew5gz+H51EAqiQ9TCMyWJmB4g5wB2H/hTM5jwi4PYGCk3wdAx7gLgIdC+uUAEu79V3EeGPEgw8S+nsOFDv09wLihjDuHLBJLMIkoYt2od8BBAHqKmlcNs8ZbU/bDQoAkzAbLcA2J/+cpX3TNS5oGcjMXW7Lt/gslXwIJX8LrlvmowXKKn/sI4uKX8zCYuUIATe1DFa2KuAGygBoZqBq7OdUBzjp2wrAHh3CWxucdwFnmwHbLmC8dsTFix7jF3rEuwSnjyfFjLyAeVnOOYHLNEp/8CaCtxG0Deh8zIBztkiJSZuAzDwmZZMBwHW7BCRGculEIhbgMgLx6OEI4I4RNirrXJ6H43VG2LEwiNMjozunDF7HDVKs6tQ2PhcDOpS4uXELRM/gHqBRQGsaRKIcuyDAqpPNGbGDgKY9IaaNNTYuMDEE1Ews1vOXexyecxhuprYjgPYO7iBOWaawjYVNkDaEZ7nXE/AcdMwmIJ0CRB7elY6gSOjOgW6v77b03g6pjV3abAGj0sGUmL4lPTs7xrkcYyT2H1WbS7Qt9H5RUFjzcSGBwwBilwDpyOBO+jTLiiubbhjB+0P9briqWcURfX+ld6aV+J2ySpHP5feiCQMwa5dJOWcZXpN2bpPXKdZmW8aChPMEeD3FFp7IOPP0vH70mOZjJY/ngGuVEU7y0Kf6sQVSl86X+i0A3VeJuWtAWfG7mauYPKq6nZJsBiZjhIexTtf2fXvc5CObmFI9Z8aDSgsvAshzajAmHdvNju31niYbHe1cS5m55EuCSTxzMy+uJaHrTZcZFHZp64yGZbHplqw9l2W34zxzV5wo3+2xdlMoIO3jnGzya8HpfM2zvqi/2mqrrbba27cBIoP8UQD/5RP25XHYdwP4dQD+ewD7J+zLaleyj30T8PJHgH/5D4Hj2merrbbaaqut9k7ZiRWKp9/oFIiaE51Y5Fg6tyTJ3J5vWaNqV5EhvIz5eYoRcMI0nu8cW9QyGWZl6C6zq7BVT5mjKWO2lYecixlnzS78umZh7GH9nANVWx+X/LqKzTKkXfn/RB+QylTPSlPOMK4mZQfw8QjaH0E2ZnBbjq4pJtZfAYQIcEB3HtBdcIkRm0Ax+ROAixXEclyAREKRfw0KMANhwwL6JCA4dgK6cYfMorVStH6AxA7Vde4I0ND2j7ZtqoDmQQznI9wmgK+PON4mHG45UGS4QeRaBUAq5bXAbP4em/MzXVexlS2YinKskmJWkHEOeF3oq5YR3MYPnvhn1nmV2YuZfAp7sj5miLWIkUxaLif0z7B7rX8tPbn6qm1/dBiHDvtB9iB5H0FnAeMOCL2MH6fs0mQSFxZFvhimjxyALsJ1zbh3XMkO5zegbY/UqGzbLip6L+B3TppAWihoDPEneghLNUkUx01i7zrOwG4ec4ktzQ4FMDftk4FWw6Jle043B1iwPsf/LYDohCnOENA4AX3HG4TjTYA3UdIGAo2oJZyb8Vb3o6CnUn+5x5E+Z8loc38jjUd/YPgUGt62ud1EIRsP7MDS+lB9b+k4Tn6ov7NMepu3pk9jIz8XAPOe0ediPZ5JQZs5ydmr2iVzmSXW6qJd9r5q8zsBoD5SufoetX+n7IrnT85b5uYWp0Bk4+9V23dRYnqG3TufbAbcVDPXnwT3gfn2sm1/GbCv/i7FBX4YW6p35NObD1pbGieazwlbGhc65y1luEea++Y8WilmE9+3Ov84zIK8c2CybladK7Nl/K622mqrrbYaAJncfhLAZ560I4/JXoaA1x8AcPsJ+/IM2Nl14MbtR5/nPw67+Rzwwktl89szYtvrDs9/uEd/RvAAPrDZ4Pn+KafNXgNwA7PrVu+4HQHchewxWW211VZb7YnYM8/wBZBZvlmWMcXkY0dg70r8vXZBtl0ISXFul5iXshh1ApBs2bh2h34b92/JnJO/EOTPprcTo1QGddKFPI7C8tVroSyFtOBmr1U/FQCeSP0tLP7afHJbG8atPa7MXmfYLcoaatOqBLPzck5jIdq4cNrsvmn/uXZ1TR2sNLSu4itbOTLQp9sgBIA68TGE2lfrj11ETuxeDgEEXxYtG5YvRST5PxImGFCPlVZyGajbuvGjLDxLGrYsZ63p4YD4xTfg+g5wuxIPMwMiaWNAYrORpwyWKHDS3x9BDHTnDn5PCDthI8IB8SzkCeRwC4ltCAGHA4BegNruvABQwtQ18Y2dsP5K1wjI1F0UIIYGCOO4L7E23V4kX7ljuL1ULJxF6Xsv7EvnIvo+wDnGkQkPvmLE4XmP3Zse/hDRnUfE3ud2URBN2bQZSIuAi5zkqQuYlKViLeiJ1HY+XTuaYwlQiq5m8GYgLgkP5O9O2pqCtKmVu85pFNAK03Jatq4wF9X3aqgkmV1kaWF2DYgWCWPwAAGuD4iHFLM214MK85NRpKuH5IbGz1XmrNpIuR3CeYe3cB3Xr+9BxOi3I463GRcHwtnnVVZXKhU9EHZA2PEkXi0nQNp1Ed7HxE6WynAvYCsdCVleWUUL0th0Q/KXGLEvYCcdCcwOYXBwHYGI4TcB4eiBCy9xbo8E7oCwIxxveRALEzlci+A+Dd60ASIDkpFzX3XnZkwhjYmAHD8XJIxTgOH3BD8A43WJq8xmDIYNMJ4Rjtddzi9mGXV5V1IEuouA8cxj/5zH+fsJx+cDsInA0cHfS3Uay73ATroxA81mTIqqLSVZauSx4RIDnBgIZ5zEIQg0EtxA2L3B6O8HeTb69Jf61Nk49y2uQeWekDFMchuadtX7TC/O454l79glyefYlJOeAwhIsthRJLq1rATkU2Tg/AiEAB6HRwd8FmL3WvWMU1LEPA4AsbyD1FpFiqXFHSuXbKV2M9t3Qaba5lsxbF0GwbJahb5PjR9z7Ni5utn3H4/jdA5hJayXZKFt7Fv72bZJCBVoa9s6p+Uo71pKTOC5Nk3+Ud4B0rBw1SwbO6WZLX9J5lvlnts6a1tr/smHzDwOoTDGDVA9GVvVHGaGOT7HAm6kvLPp/K+Z01hJ5vy5nT/Ze7OZB3GIko+G9ZhTWgEQwwjyPivhEFEZSynfmt3LQF8GaD6X7gWbdgIgt0o8c/dPVpUhVLLLwHQBNMbyW8D+xpj5bcCJ6St1avJdbbXVVltttfek3QDwfwLwzwH89Sfsy1NuX/+fAx/8yrI+t9qV7UPfssMHvvEl/H/+wut48K8G/N++/Mtxs3vKl9K/GcBLeDIUr9cA/AtgTsBxtdVWW221d8ee8rfUaWMrY7wA+tYXmF36VvYYqBdQ2t309qtdcFIA2UquWWvLUBA42s9xfoGmjSs8F6NLPyMtQC3FCpvEnpV0ZEDfkvfMgtmcZHO7yBddDXYuAdscUenmtsBwdW0DdKrvKhHNsbTTKUDdAvkWRLbSzVo/K6tp22RuodO0FSUwN1uzUJmB9TYYayvXbeqQFxVt982AzkvMIg4BOB6B/UFY3b3P0s2ZwUbSnpwA3skOQBbJ1819xuE5ygBl0UY1YK3JTwpBBiBjYvDKdwZ7AXtAQNhyTs4dIySmY75/NR9fPrsRwAjwmABYAB5OytlExCGBk7sB1AUQMfYRGAG89ZUddq873PjsAH+Udog9ijRkwt8sG7fEKmUw0fK+jZzONKFhoGreVZulYawxfjOTE8iMXBufNBfFBpS15y34nHyihJXGrhxrwV1lQmZGJAHsS/9ycMKibvKuJKIVdPWpal09NifsZy1nI4VyBEJ0IGJ0XcDFzYjj0eHsC6Utct298VsBSY3d2yeALxL2QyfxdnOD1X2l4HyWydb/QbkztE4KfoMinI8IwZU4wOpbAmbDVsDEcQeRHc+M0wQ+e7lXgvZdlHtDwxDkW0tBVtO+9t6iCGCk5BeExexUTl1i0boRJb4zp9i0gwCex1se5y85jDei9EMQMJYGE5eYS39VLGoq7ZjbMJh3l+1rbWsvByg6UICJ3+vAOaZ7eR7ps8rGzJa+p2ossenYltWr95Zld7Oj3B55HEXUyiFcpJ01jWwMSM+5yMAYBHh6O8BKGwIiO37JL/QWzLXvKQsG2vMzkssTM4xabjc4tbFoNX0CGrlth7l5hF5j38etL21dWjvF+pzJxwK85OL0XPr/JFO3lXFeAnOvwmxdDNlw4p2u4OwMmDyJgbvgQyv9vAQsz/k5C5Rf1g9z/Zw+s9mcl+c5TRoA88zfOYnomc121QY5Oz9OIGkL2JLOF6t8ZZ42lzaDvu0cvIkfnC6Y1qM9NzuHX5g3zpn+pmgloldbbbXVVlvtPWkECVD6IQC/GcC/AvCFJ+rRU2vOAf7pXP7ttoSv/a4beOnrtk/alVlznoqAEBF659A9rXOs2xDy+01MwpW9a5bWuFZbbbXVVnty9nS+8a9qRDXImwAbXaCdXYBlFqDWO1RArWGRcpcWguYWspbyVKnHFnjU4/aFd0qu+TLw8kTs1/a7jW1mGQk5pq/GHp6pExHJArqyb5vYt0SdWWDX4yaucUtqsIvDCpQ6AsbU7p7KAqUyU5xphwoQPbH4qwuI1p+8QA0gjuUaZa5koB/zi6QhmPhtCwuPc9KRFjjXOG2Bq8W4Koay1jXJDmocOcuCae3k4jQzeBzBFxeCu9zYAeQBvUdI+oFJFoFjZqwWkA8A3BCxuRfgD4o8wZxP16gUbdM8Ov5iz5lJS06AQGUzhl1Kq2CgB+BYGIAjCsvUTFj9sYDPAiYzMBKoA0ICKbQ3eh+w7YTpe+gD7n/0DNx53Pg0wx8iKBJGcg14lOqi4J9hBhK4gJxAZvpayVwakZnCetyqIFcSzAZsREzN6OT/vB+ByjW2bxSY1ji9DFRAV/ZZAa+uLkszaUHozJT1Ai4wJ0CRTbp8jel0A8yxA7hv6ucg93U011ABRJkJITh4H9H5CNwccOQeTC4rdmc39bZW9isndmnPoK08gEJwGAZf5KgZQKTcv0wQgJgBd9Q08rymBGgKEEhgHyV2LBNcAqTD6NPmhFIfZQyPW4nlG84I6CNU+jmPKQWngSSdTAkUTqiiBUktuJvHHXJsXDci15GdXBM72cjgD4AbuRqLbkgg69bheItw/jIj3Ejs3r2Xey8Udq62XWHMIgPudmNEln1PkvCtqRy8PGsBNxC6iwg3MMLWZ/lpK8usctZAeicn9Fs2Usi7oQLBWdvQ3I95TFJ69qEw5CMSO5gn945sJkj3uyNRQ9A0IQpTOkRwXGDBXmbtuw3JdzLAnNnYw5FlcxGQ2YZADTYWxuZD/Mq2bMsMKsq7SECsBdC3tWZDl763KuaqN+VNaNvALFDaHmsVRqw13ycM1jQ/qY7PAaBLdlmc5LkwDFdJuySvfJX2ABIYm+ZPM6zSCqzNc5OH2FDwsLLPCq7rvdqyzRPrN/cD07Qv03ywYt8uFXdinpSzU0YwUb6PROXEtNdSLF5zvGX6TsphzvGDF/ONOtdt+9vOdaf5l42ABtTVvJUJbOf1dsPpaqutttpqqwGQiW1A+mH2hH15XPZhCOj7WayA7zNg5KrfQf0Z4Vt+9y2c3V7Zx5eZI9Kf0vP2PIBvePf8WW211VZb7em0Zx7wzQu/+l3/t7vb2wWU3lR7hl1Jo2p8Nte1MV99Yrxmti2XObMFb8kleUieLrqoDLP6otfaxSEFpsexXsRZkoszi0R2uYgrP8sil13opSSZLKBw8sfKlagsM5DSOvCQgjOMIzL7NrefWZDVhdJomK4qK6zHIwsg70hYvxZwXgLbNR+tm/qdZZmRFhfjFLCNCY1SP8DTRUfvpR0bGefZWL82nQG2VWoz94Fz9Xc7XkIoy+AqQaix4ioWkchK5lh8bCTATVuFu/fhjgPcbgve9OBtB/ZeJJyhACbBBSrgpR36Y8TmzQH9/Q7dA0LcusyK5A1nFihFwB/SYqQHhp3E/u0eELqLxCLuBfyNGyCmuMACxAtw5Qdh58UOYMcIO4BGBaKLT5ntawHIBM65Y5K4HQj33DV0uwHP3bzAphvhiPHgjsMDbBH9Fs//UsD2jVEAtzMZu1nOOAFnoacMglOWRCaQbaSWPVixwJDllKNPw0TTWaxUAWInAKBjSd8a+wLYVuxh23UWhFPANQBegV9nfLQAfqp32GgbM8izMKkHkg3Ubfxep2CigHwKQmbGsq2fgrT6aIDEr0UCPjkQQkiNAKDrA4brhPOXt9jcBc5eZ4QeibFf2mQ8gwCyALiP6DdjbtwYCd5H+OsRQ9gAzAg3WeR6G+AZiYire13cITFllansGH4nmzOOhx7hwgNHJ/2VpI+5K4z28RphvA64bQCPDnx0Ul8P+AfybNL7R/uEkwPduYCt3AMhSVG7Udor9sjPxbBJ5R3SM6Vj+CPghsToNhsZRJ5YgFPuCHe/vMP+DjDeGqXig4PbO2HfA5XkNSDj0VkJbAOo6jiLPbLUsxqn+1lBbSaGOxL8HvXGKkKSmi9jkolEpj2kcw4Im7S5S5UKjJUNYMjjMm82YclD728BsJOkPaNsdkl+RJ92dEeq3t8CHEfQGIHjAAwjHtkmcs7pGRp1MQ5ZgpfN+20WmFSp4fQZQGE9LgF2Rs42zyeiEzDWhsFIQKKAzqU8Sc/z36Uis3LBl4G9NUhsQkMsSElX5Tf5Tdi3ekyBx8vATAt46hzIvO9bue16I1aY1n8OFF7ytzUDqlvQmtpwG5MqmDyzpLAr/ts2VlBY7331y/vSXnOgvwXDUx7czpuBstkOAMH4MpNmEezVcqLuhLHXod5YqPlYkFSZsMz5OIcyT8z3hM7FDTBMvmwUJJVR1ryX4gTn3wNUH1Ozx+1vgOY3yqQd0mbENlZx9dtgBXtXW2211Var7JMA/u8AvgvAr3vCvqz2JWfdBvgNvwX43KeAT/yzJ+3NM2e/+33vwyu3buEvfeYzeLAUeme11VZbbbUveXuvbOkTs+xYaw8rt6Es4Mjlz56zdjLumbnGsJCvVL7a0uLQo1yv/rmFBbTLTIHF9tqlOl2lrlftm4rVbFkxVP7yMTdNO+fvnHSgtSVA157Thd85po7ma6WfifLfpbbEBG+sSDIu5BkDWKWdhzGBG3KvUEyMNWXOKYjXljEEdAdGd4Ecq5QC5BrjZqVY7bhilboRcEdh9VVyzfq/NpuClFAQLIHKWlYU8MiCnRkMZgHxaARoIPDeYzx2OAwdHAGbLmCzGYGbA/bvizjcdBjPPNzI8APn2KYZwMr10oKMz5NGWmg/A7rq9+yzvb3bvBkTxmF13gK15pqqTQk1AzNwYYm2501eNpbzxBpGbyvpmyWk058C0AL4cj5eyU9b9rC6TwznI/wmYrzOGM9qCd/KHceFMZs2DGddX24amZMfetgwSKd1Su2g0tYEuASoMcRvlWjWOMYZOPdA2ALjGYMcZ8UCUvZuavuq3+3xtOk+es7tFzvOstzsgWg2XCCUMap9nMdtA/bGDWG47nC4DYw3WCSwAwlLPoH1+X5r8QX1bcb3apwbXWV2DJW0ljwTg3hEfh61+eZuS+Br3qigGweMpLOmK58pXVPA3Rx/V31OZbT3mEhFU66CHJx5h0cICDyOD/8uPWUnZJwnksMWeGz/B8p76mHZmQ+TvgVMWwlna3OArN1IVSWdf9Aq0/lKfp3I51K57KsauRNg79vP+7JjFXP5VD5zALnN77JYz49qbXtcNf/INdh7hXadm1fNzbfK5seFcR55muaye3xBLWdidtPfo0gBWnUY+VCfbwHnFexdbbXVVlttYgcI6PtrAD4FCXr0XrEXAbwfyz/YV3vi5hzw3AvA9VtP2pOHtpc2G3xku31iSsnqw1ecnU2ZWw4i53zt3fdptdVWW221p8+ebYZvTKhM3mk/XXBhrwxJAwaPQdi5urvfxuyyC0ttjLA58LQFmam5hlnKIyqMYKDefa8LSptegOYQSp5dV5WRF6FsrDD1xcgyUusvUcKj6kU0ZobG8gVQJO+cK+v8lh2kLJAQhCWaJImrRV7L/lAmsWXXzrIfIpQhWBbUDWN1Dki3jBaV1PS6mOgKO0nz6XxiF/NUXlDbNPvipgvXdsHU1kU3B7TMKpT+IlDDzm1RBgs+NzJ9ZoFvAiyYmIRs5RmbOMQ8jghffAPuudtA58EbufVpCODOAd6l+yfdC7rG6XVsOGzfDKAIxI1D2AqYVWKRAtwB4ybCn7sE7gpIc7wdsfu8gz9CWHoEsCeErVxDo7ACw5ZFaT0kUDiBQ+GMgUjoH5T2C5sEoCn7Nya0ldItHRL4duHAocfd0eG5F+7j5u4AjQ+73wS8dbiGw/Md3vevDmBy8D0jbAAo+zkCfmBh2mbgqIBoqXOR5WyTnHyWiVXwDXKtykUrs9nK9GbpaAN8UURmzVo2pYKBOW9q8kj+5esGFOajslhR8kGAiWFawEWRO04FK+iO5BNSvNko7e8GVGApAYURTUDYycVZOlkTRQKde/AugHYR3kv/bLpRQF/H2L+wAZPD5i7BH0tdc1tFkeqNNyLQRYTRCzCbQMcYPGJir9JA4J5zn7kD5TqrjLUCwgoic1fAS+9ZiFwRCJ7BQcYihSRBntpouE44vBgRbgb0Lgr42EXQRQcKQLgRkQHvQZ7P7kgC4vaMcJb6kNJmiYEQduIXjQL2xo30AUWADk4Y944nQKwbRb5cx8r5BzrsXyDsPxDA2wDaRNAXN3B7yvn7A5WND5YZbsdoAvH9hVwX0xjHCITraagMsqmEFTxOwLg/J/T3SoxcmDFufVeWOzkq9xgV6Wdhz3MBdBNDuA2XDsXZFbcNcl0VM9uMX3eM8McIdwxwQxQGYF//vKcYwecXsqHm7Vg1hziRzjJ4gRok1XAIALKscsvsbd9fKU1m25r3e07XzFkyE3TGN+tLZgIvsG7lY3peunkfJ7Fqbf0tk3Mu/6sAi5bFatiudbVocp6cYcECsDLWhJAZv21eVlY5ywI7yj5PZKYb/yr2tjKnW1a1I/Bg8plj/jbs71xHO3dL/rXsZavwsgjEzjG92+OXxQ4G6vmO2TSX1U7SnIdDzOo0NbO3zoOUxcsRrDF8VT3F1gmoQdM0B8t5hVAYw+a8+GnYvpbRq1LbyiwmAvWd3H9z7IylWL469/e+MJPb3wPa7zH9nliSqV5ttdVWW+1L3H4KwM8C+IMA7jxZVx6b/U4ArwP4CwD2T9aV1d5TRiD811/2ZXjhw90TBXwXbQvgOwBsnrQjq6222mqrPQ32bAO+QFlMMXJpKrcIoAZ6NZ1rrmnzc81nm4eN4zpZzKI6XWs2nzb+FpEBhr3II6uPVqLZ7uq3eRBnAFcuY8zu8m9YIGR9NgtqE5m4y2K4ab5By2pAU28WnOZi1Wn+rawdubQA3srTReS4gm3/tpaltiOyTLRKN7cANTeLyQBm49xlWeyZ9CaPzBy0C5zKHrkKg7dJUzFecptfTcqFhxG42IP6Hq7z4N5LHDjLAlR8wFY5yn3QXQRQYNzoOhxvEi7el7YQMCFs08WUuisBJ8QCHI3XhFXY30MG0oAELCUAyIJuBXyHyMACiAmkyyxIAERcsSQt8AmGyEEzAHjce7DDGB2ub4/YdgE4O+LeixvErsO91zfozyP68whilySlqdTDWXyXCwMWSOzE1C9tPN/0v4KpExDKgsa5vVEzJScdiSKFbdM0IFcGlRX8IyR5XgaDsix3ZqUCWVJagc8cE7UqP4G8if2q4LobS+HKwM7xZHsGbxLIuhdZY/aprnpNIPDRY0jyyTd2BzmeNhXELXC4Q9i+zuj2DH8QJiZ3Se43EmIkeYSmmM0ASmxbRorBmwBdLn2V29SnLo+JPdpSiZnTIzk9U5QpHCmB5KXNXATilkG7gBgd4uBE/jnIuHQXyICykmFjL+VlSeUo7VqxoYEE9hPcUTZLqJR51P5L7Q4HuADQKMDqeM1j/7zH4XnCcIPBvQxKvvDwexKQNwBukNi/3JXxq+OSnbYR8jjIzzlXxpRe5/dpc0dv21JAbH8E2JtxY1m7XMq1XQCT3pCIC5mbzHclvZpNFZWZ+0/KpZSOsz8iCZ1AuvRMcGOUGJ0hSvz1R5XTmpt/NEbNu2VR6hg4sVmtBvhmQTqVx7Xp5/K4zC5h1lrQczbOcK5LM2e4ivRym/YUezXFkJ1efgJxNz5zCDlUw1Ie+r/W2QKrS+XMgrjqL13SJmnOVYHNdu5h5ad1frbUphnYRZ0m+ZHBXnsu1NdOrAVt23NzG/uaY3MgsB4nOz+HmS+14TzmNuVRXSa75libpgVRrfSzzttsjF47l8vz9zQXtHN5m99cPrlOjZR0Skc5RErz+2JlOq222mqrrTYxhrB9fxLAlwP4Njzb7wuCbMK7AeC3AvgVAL/wRD1a7YTdeh74+m8DPv0fMezfwM/9jbt4+eu2+Mpvf3opqo4I3aMotLzT9mHIno0eeKIaniOAXwbwxSfow2qrrbbaagCe7Ovg8ZmNb+WolkqzMmstGKsLVsrQVGslgucWSSfApAHf5oBkBfjsOV0gUn/1Wu8wWfhtv+vufv3rurLQY8ts/LCAsQUPl6SG2wW0yi6T2LOLruaPfGKukDNtYRY5Lci8xArmtNDIbOLRnZh8KdhumTNaRlVhs2in+SlbZE6+e24R2sYz9H6yQWBW/tNKUy+xMZwzrI5pHicXqgGotDNfXID2R9AQBDxZkP9ju5jqCG4fsHnjgBufPuLa5yO6PTJApGCvJDbgS0yAzw4YbkbEXgCqmOLQuiDAkj8A7pjApJ7BOllVIC7KddzJn5VkZY8S+9QAPMLgE/DMnTuEez3OH2wBAJ0PuLYZcO3OOeJLB5y/n3C84eD3EX7P8EfO16vEbQaXEiCUpV8bsLRl5LaSx1bKeSJNDFvGib5UIKy9vikr+2bYkFWsUiCD7aWvgbjROrDJzyykqwSzgqUhgcAa89XKFvsE9vZRYvWa45lVHEjA+ZEQDh5hdOhdxKYL6H0APCPsIg7PsbDCI+AvkFnFudx0K3ZdgPexyC8n/9lzln3OY9a2mVpElvbOgKNpT7lNJb6xtiF7zuNb8+Q+ot+O4EASH/fgpK7pvnDH1E6JKa0gvBtK2X4PkNYz+aCAqwLD+ZpB2jHfEySVd4lFO545XLyPcLzNGK9zZm3T3sMfJKZudw70D4DunEvdtW/H4oeA0f9/9v421pYlPQ/Dnrequ9fae59z7j33Y75nyBkOh0OKpDwiKQqyGTCyaMCSTCcxFARxgji2fgSWnUBWnAAB8seIESQR8uXIMJDAiOUojuHYTgLKjqIvO5FkSbQsSiKpEWdEcobzPffrfOy91+ruqjc/3nqr3q5Va+19zj13zj2X/QD3nrV6dVdVV1d3136fep4X8FO5P4Dym44NN5Vxle2+YyKVR0bsCLEr99GBrXk05RMQOyoLO6Kc38FCivp6MsSuXfPw2nejuX9zzuz69e0I3LnyTDTvcp7mtkLvSZHnJY13yimytbXY6NSxtc3zTce39qvLN+Qj2/dfqyxb3imr4WcBU1/Lapk1TUVrHnCsTZZE1nMOoX3d7P7151OoLKIP2n7sd9OGRc5nS8zW5G3dLnudW/MePe5If97K0lpth0+c10F9ilaqFd3NLnSMXObHx+o4tvjBlLeYZ6e2L8q033X+Zklku2/1Pau8bwgc5nJsXXbRYEVaL5yA0rFHlfkrVqxYseK3OWYAfwXA30qfb7G47n2PcwD/ZQA/AtG3vA8Juu8pSEQP7zei8u7LwA99Abj7MuYd41f+o0f4yn9+9bxb9eLBAfgEgB8Anrv0eAbwZQDffM7tWLFixYoVL7bCl5hBcwB3aQITJQcnoyJWKwKX1b7WrpjP6gIG+tQtIRSi0NrF6X4usQU2YJQVNylQ5F1RgVpYAniakJW9ADBOpV0hGJtGE9DSAHN1jtR5sFEK1OqFrHRQojQRsCVfmZxXVmDod+8A8hLgNtbHHLAMGpITEvFYAJwjeLJ21ol8Oba/kuBW5ZEJ3kTcdp0hagHEsFS1KIhEOa3Bz0z8pvFDDohGWa31H0MdFFYLROasFsz7qfTF5KWD922lr46FSvnByUZwca0MjtlIWsT9HhgndMMgXFefzt1TsT+f0xhxWI4vR2BycPuAs29FDO94PPrUgN2rBAqiio0DI2wZYQshnlxSLSY2aH+fhSTaE2hKvGAPgIUAiwMjEhC2LIrDiSSG7VhIyHTL5Ty0SqxSIsVQLgl7wyEx4K49eHb4Lu5is51w/84VLrYjOh/x8HMO090ewICL78zoH0chgHpCGCiTfZb05a4QTeIkQIXkUtVvIq1lJ71QyPbONndsVuSqspawUN+2yjkAYUn8AtlWOfcJle1wQlC6ESmPMTBvgf3LhHARQJsoytRESEJVz4akVWvh2AMuqX1zzlYq9WF0oNGhuyRMLzF4E8HRS7mqmAWAncMUe7y1OcfZMGHoAqiP4EAI54z9y7Lj5gGDmDCflz7rH3rMgbDrBpydj/A+Ypq8EK6jk35xQoyKylhy4pKel16fvuSIdhMBewfuGRHAPHv0fSKUu4gQgc3bJAsSfCGhYw+gY2lD6IFkvZytvDWH7aWTnNg6Fij1H8q+qtYFyTH9I6lPLJ1l7Pi9sKmxK+PQj1JOGBwef8xjukvY32fM52IbTY+7bKEOIJ8De8CrGk/5uUSouwmJeEVe3KD7ZJI83R9ISnIlh3VhBkWx5vbWCZnkna5qaesEkK+L3hf6CPRIltac8/VGXwjixWIGopz/WNpa+hjAYjGHXCepiDsCpfzeZRGQA80TaJzA81Sek08Lff8AS2KOXLEQrsH2JVPhGJHWUuw2CNqFXW+LDKwcK6z6lEyT1GbXltW0ec6nZNSnOiczJPLCXrlWv9rzquyZydGhGlrLq0jaZn839qnP4aCNuj2E6pzcITFsUjMAWJx3brfpj5Yy+aBPW8Su3e+YsteSx1bxXRPaqT25jdaC+xh0jmTOsdl2C2PdnL8D7bmQdamxTgD+SPl2f923OjZbMLe+V1bP2TFH59uzyYlo3XR0/p3+BuCajM3zc523h0ySc73A0ZC+bNPBWMQI5mewKGXFihUrVnyA8esQG+R/HMCPPt+mPDP8OIBPAfj3IPmKf5vi9Y8BP/rTwPnF827JimeNjwD4HVjz9q5YsWLFigO8R7KK7yGeJNBaK3fr36yaYZFT74bVcMcUoMDNKti6DXXdwFKl/C6wsAFu1ZPr4xKgtd+XhaV/n7Jtx65FUxm9DOY9kSLIKmeBZnA718NxqTQ+ln/uGGzw8Ca17eK4Srmh2wy5cBJVuyS4fKR+5qz0xTiJyjfGRODFpIKLefGE7TsmZIUbBUZ3OWPzMGLzNmN4SOiuSIgjSmRPItS4K+RZtpt1hpg0BKUoNSkTO5JLlZGVgfpfKqt9jqYv9LuSPxMhXncYxw7j3MG7iLNhwvbuHtPLEdcfIox3PGJH8CPDzaoKXNZ/1HK5JmePkLLHcoxmZWhN3NbnvjjB8rmpdGzVmYitcj6qtpW+jhuk3MycyF7Kxx20IbU3DpJbOXYAJ6Vrzic8CzmcCTjGorELRXQqcJ6dcERGOsqOETaSH1cVmzmHbQRoTuMntZcgSlyrts5kalIhy3jkRRtKnlouYyeNzTg7EDG8i3CpbW6urhHKuTOn9uhCAUOGZwVrdaw2b9HHLmdaFaI4pp3sGElK3Kz+ZlHEzucO013CfIZsOw0WkljzZbPnJcFKKASuM/WWy7Foq6pusx141Q+q/NZFExTk/pIfqeTGrs794F6wTbT3l45hbrfRfi8kcGm3vWdtKgjbLkQu6vgQ24u5nhRH5ySHD7jFYp7W++imd9RNtsi3sUxWWGLwWHHcmDucaOONLhWLwhsk7A3taVTYLuOgquV2a9W8sNiuyd4nmf9pe1KbnuTYk/bQ7wbH+vgYavX4bXBMgX5km3WiyURta/6ti+XqBZC3VCCfRFVuU6F7bM5sy7jp80GRTzqe3uX1X7FixYoVv42wh8jyvgLgNyFSvRcdFwA+BuD7IRLI36bvxX4Q++R+87xb0sbdl4H7rwPkcP0g4pu/usPu0bpQ7Ri+Mezx5fMrzK+y2Di/BLFyXrFixYoVKwxeaIUvqyqmYV+WA7ENYpFCLPuqUlf3qxWXPhFxk5n06v5zKPvkRpmAjAaFrN3bQk0M8DyDWrZzixNl2Y+K8jZbvNU20YsTJYnrM2dlrygEUtBX22KVB9q2pP4t58LgGEogL3KyA3bI1j/HjgWwtHbGIbFOrihzs5q60b/AUn1hyz+WD9HmHz5l58dJTe1duz9VDdwKGKoKxWNxfZvWhxosDnEZsIwsOXXzfkXdC+dAMZaA34G9dCMf4rEFBADC2w/grndwnQc2A7Al0GhUqQAYDnEjDJCbYu732Dkh2uaIi69d4/zrhOuPbnH9isPlxwlTIo7ihpcEViT0V8jkUuwpWy+rqtCNBAqcvjPmsxTYZVGh6lmH9PeKU8WkPV1Vz3IZ5mAAM4lC8bFHiMADt8XrLz/G+TDCu4hH/Yyrl7cAznD+bcKdr42g4ACIlatVx6ry0ubRtbl8FwpbJcHMMdpGZiyJ74r0U+vrTAgSELyoLSkiE+f5s1EOU0RRVKohgKdEkmp9DAcq+VijEITjvZjsl6m0xw45J9cHKHXPLwXQRHA7h3AnCGE4im2xqLcBMCH2iaQdqbiGWWauZ6CLiEEGoiMG7x1odoADxpcjwhlh87a0zY0Q9XlSkzMB5Ep5wzBjnj0CsZxTJGBvCFPodUn5eQ0fDO0/ErKXJiBedcD5iPPNiOtdD1WiZqVtyqsbBrlm8+SBQGKDDb0mLIsjUl0xWV1TJGkHpT6GXOvQJQK9k5zZUlAaQ6qkdZA8yrMQsy5d8/1LBO7ExjkOEGVvAGhy6K4oq+djD5Bn9I8pk8Y+yBicLoBhAvyOMb5MC9JYSXO9jNED3CHndJ7PWJTf0dws6br5XSx9DSB6yZfL6bXiZlHY2mGYwZyJ9mwhD4ZLD4OcC5wI0UtZLpS65H6RL25igFD228e8AIJSGaK4N+0NaeHM0+IgTUFR6sH5A7eGpsoVOFzEpL9bJ4z6HXRKWanOHTUqRS1HBoJpT51jFgBPc1G3GmtlciQq1druWB08kor1mGp2UVdtYQzkdyE5WjikZMVyq63qeLJIL3GcfCPviyVvIz9s6zciHdtLlW/et2W7W+c0rvsyHbNQElf9Y/cjd3juzfrs95bltfb1Mavg1hhTJbPtBzteNQetFtGch7mkWC2pSOz+WW1bqW9rWBebg3y9LdLVzLkXit40Z1uM0NaC0axGjmWBXyNVCTPLdKDrigOMKnftXN3aQ1trZ/u3gemzY/mmV6xYsWLFiiX+AoC/AeBfgjBJHwT8PIDvQBTM72LuvuK9wQ99Afi+HwL+0n+Ir//tHb7xd3f4/f/D1/B9P7nKVlv4f7z6Bv7qvQfgTz/vlqxYsWLFivczXmjCtwQ/CE2CzgZI1B63/r0ma3W/bGeMQ/tkVTwtcoVpELYK4DSt2owipOsOA0LG0tcSveW00zkdsxuu2kNACWgRJbtGyoQnR1OOKiU0uOiWuX6bFpKpn4kIDCWfG8E+DQDeNpeYvXYtpQItg6aLY5wZExwOjzfE5iKQrdf8tuqaOhirZVhi/AgWgcpKKbaw7lM4J0FFS/zm3yjbPC7sJo8FrDlKPt9Hj0F8AXgHdg7kCdx1QnqFKESvcJ5LMtMJeaiXefP2BDd28KPH7lWH6RwYX4lCDHWclbrja4DbO7gdwYOFhIUhTyNAM6G7EsVotKQjaztQ8r8yFVJX+y6gRF8TkcpAtniNBNDOY+It3iBgu5lwd7vHtp/B53tcfnLAdMeBacBwyeiuhA2NHSH0xW62kEzIbBShkKBwDAbhgPxN/y7Usok0I1uWJR4NV6bWukq0yphIhKOSyli2baFARdmeldVJZRp6QtgAvJEdebaNRz5pdmKnjICchzayy/mO3d5lS2qKcq9p3l8h9gE3uUIcjiQLBPp0bQ1pG5lAmwhmIZOVYB1fFmJyeCSEJA/lXOIkKtzOB4xzB0eM0HG5FqYvLPFLIQ1DzTXMBD8S3ChEMw8MDBHeS3umqwHu2pV+TW1jJcQ5jQif1O6ecp+oCjbnMNYyVLWblOVqQ0wz4IgWCySiZyHVJxL1reabTjbe48uUFxoIYS0EfyaaveREFqJTjgtb267SR+yAsKGs3F6otdP4pLTWh3VMciJ+CUJyz+k5QmZ8J/t41vOMnC2iZTFDum76HnJmHOcyzHhXspdQHAmifI5KAqd6hdAt94FTC3VHoDGKut+O/3QLIEbQbgTv9+25x21Qv9fyuzImkq68U26l9lRi7piLxUE9T4jKYvmAhLXvnGxRbMjgm9CwKr4V+WrmAbk+bxZmHbN+PiAkjysJmkpZjicVtPY3tYnWFBi2/45d2wNiv0W82vOw3y3531oMpvs0+vQoyU5VObfNhWv7WW3Ka6WtdZPJ6VKq37KFeJn/WOK1tnfWOW9e5KjHa7+bxXOncuhKig4haZs5d1vksF3kWcOmfbFz/vRvSb8SDo85hXw+jTGyWjqvWLFixYonwg7AnwWgitCfBPDx59ecdwX9Q/ougD8I4O8D+NXn2qIVFYhEhfzDPwG8+S3w1/7BMmbxPsDdbzh8+O90uPj2U/4d9QzBKGnFVqxYsWLFimN4sQnfBM3fl1ErXlvf88E3vC2P5t+FCUCZ4JUlb1sKy7puu8+plf/Vyn6OohyV3LpHCG+gqA80eJRW/isJXOffa0Lt80w7uGknSciKViXEF2pX0yfxxDWog2A1WgSw3ab/6rXjKAEz59GWLqG06TZctD0nJddbwehjAdAcjK3Uv+n6L4KJel52W632NeVaVVEmflvnnBYTxIeP4ZwH+g409AuFMUXO+Xy5M2QvhLRRcpEY6B7u4a9n9Jcd/H7AeI8QzgnYMkLPgGOgY3RnM+brDogdXFAmVv5Tnosi4K4JTEIAWhvlqISmxqoN2ZQJ48TVWbJXFm4oKUrwEeDJYfQbhAuHu9s9Bh/gtxHzhz12FwOurjbAt4H+EcPvANfJuBeiTTui7lfzLwMERqwdBvRxxIUwqyftCyta7ed0vjmvryUtLZlryW6tIyIrkG3Zua8SwRfVinmI8kMkuXZ6TgT5TpT7V4lCGRBpl5FKrlU9P/3sJF+zm4DpjhzgJgCOEA7W5MjJ+CFgnoW8kPyxjOkOwV8Dm3cYYUtZLCxqbinIu6SIJQZ1ERzcot8AZCI653wNiZSEPOfdmM5nYGATQJ5BxIhMwE7y7+aq07VSQlYJcnIMJlGSuTFZKCcVK6GQpzlHNZdHihKhLhCi46LmVlW8kr0R8Hu5HtEDcZP6NzXMzUK+RnPy3CGT07QnuJkQNuV6u6nYZbNLizBSvmQdh0UtLoRpTOMk22yHNKYIYrmd2l78qSEKekeLcWwXOggpW97z8qwgGdN6vBn39rMq3tml4aP25LpP6nfipPTV8ud4YAmdBqW4EEwTeLdv7HADFu/yQ7IyP65b75TWAiqgTcAetPuG93xd/pEyDmylb2vfWxOrjXNZ5PBVWEcUe556PnVeXHJGQcqL7ZbMzJ/VleMmi+yKuDza5zXBmTcn0je36YiaV+u8Dbmbyl3WUYjNhZL2FmVJnSfmSDbP82Ih4JG2t/rJ5gYGlgsUcpuOT8TqxXEH5PBtxrlBk+ytlbN1Wz0d36cF53JOXqsMz3N+O39tkbu1Yte2sQFZfGlwaoHoihUrVqxYcYAJwF8z3z8O4DUAA8oE+kXDBYCfgfyh8WXIOb7PWMXfzuh64NM/LMTvN7+CeSZMu4huc3ph3vcK5991+ORfG55rGwIYE0WE598dK1asWLHiBcCLT/gqGRkZ7JXcjODOl99Z8pKqoufAdtmWpcEXSzrWBGP+PQUiFxZrZpu1cAOWRK61j1ZbZqKDoA7ZoI4JBBFzsTauiD9R8DI4EbtACZLl76qM8Ik9021qx6zWijODnV8GMQEoiUrOgWekwJ6eJwm5WiMTsWHZZ1ofExZ5WZO1JQBgnk25hsjNSmxznQ5sj1MZahkNtFW8lsDX8iMDfWeulwkgA0mJHUsbbKBxKEpxHkchar0E/o5aFdq2KImmfVHtm0lfo4ARxasQvTm4fIxQB8DTCL68lHHx0h0QenAvUlF2BDfO8jmIrXFRzykJTEkI2YMiw1/PuPNbAewId7/aYfdKh8uPdbj8eES8G9D18l+4GDG+tRXFJoQEUytciiTrBSLB7YG4EVInQuyAY8/wOydCuEQ+AVimGlLiTePPiSzlRFBmsuzSI44O36G72J6NePlsh5currEdJjz4PGP/2oDdaz3u/9qM7nEAGAgDyd+7+2QjnFSqmeBEqrujksMWpS2Z4LTksBJo6fdMXCfiLJ+DlqPHWILMmfKqcqR9tDg+E4ymjP3LhOkegzYihWYGMLnEtAOay1fyLDN4y4h7LxxwKP0Qu1RgKIShm6XucFbu/dgDcIzYEeJ5FKI5EHjnMQaC9xGdj+iHGTGSKHcDASERk0wY70nb3AiEs0Qy7hyurwfEaMY+ARgdaCIpwxXrcAoEtyv7hrMgj405KZ41n3EgWSiw7YTY3jkhWPtEfI/I1t+xA2iI6PoZ++uNGSCUiVIKS1LV2nfzOYE9IwyJRU9jGh3EujoRtU5zI2v/DsB0FwgbRjjjRK5zkrancjoUpfws+be7K2mHy4QasgVyOCv3k59SPRsZx24udU/niRROttEACvEN5Oc75RzEWBKvDpnkXWxTMCeCnjNpXpO9YVACP5HjKHVQVR+Ag/ppNtdBc5o7yTHM3oFiAOYIjBN4fpf5zSpCEMCBRe6pvLJKpJG+h1pkV4vYs9uOkZo1rPJTFbzeZdVqnvscU+TWKty6DaqYrRWt9Tv3CKydM8+lH+z2WlVLulhLz6HV9jwfOnIeNVoWxt5uEvV2M/dvQ82brZqtatm0r3msWmJbEtUS1d6XOZ75DRxBffqzwKq57ZCsFbKWSKznUOSWx9b22haGuF+QyQe5eamMidQnObu5WQSwUP3qfdIIGDbnYiGI+44StY1zV9WvbE9ze0vk6nb9bpW7NVlrj7W/mUWAXJO+NoewtfXWv0PyeE1zwNs666xYsWLFihUH+AUIAfzPAnjRbXZ/EsDnAPxpAF9/zm1ZcYAPfxL42f8K/vqf+ev44v/nO/i5f/l1DOcrwwkAv3p+if/zh7+Fd7oPQn7tFStWrFjxXuPFJnyZS7AWWJJ9+t18ppaq1NrAHSFQM5Gr+7VUqnpcbBz/LFCT1DURfazOnNOrCtI1cKAKeBIslB2G+H3icuh0/9k8h0+KY4pbq9ht/Vbjtqom20ZV7kZuXoNFcFLb2lJ1NFXjyyD/Imego2INeqTNPM3Abge33YgCtPfgzollr9YVJa8cU2oCAZgTqUkkVtCAEC2zLDTog4y92BFi5zBdE3bdgG4TMGwmTGcBMeWBZe+N8k5UmWIDnZqgBG7F36lyz+ZRhVo6638RhfhMbRSlbBprTJiuejATOhcxdAGbfsbZnT2uJofd3OP6vsfGE/w+5QGdpZ3Rk3R9qiuTtGgM0ar+fBIwxG0iTLMymco5W75Qi7EEcxNKnllSi0hoektqpXaHrRCG5DipkCmTvWTJ05S7k6HEYyL9LAFvCPCF6jJ9jx0XtXNSwALIjw9MDiE4hCjEr3OcFN6cbJcJNDCCJZVH5AvAgRDz2CcQcXm+pTy57LRzOCtpAYjqlBiUFhmIIpXy2IqRROGr41LXxLD0X9ww4ibC5hJWu3LK40/GYCbKVfWqRKgB6+9Or5uUQ7PkFc6kcb6OjDiw5PclKoMS6Z5hU3CuJJGdSiyne4fM9WTzeFcb5iwCT99BnNsi9t/Vtde66vtDx0vjvlkspjjoHPMerOtQriuVYVXn1jK9Vr1T4OI4wFWTmMUxI4RD2/1ngFoRWefytdsPyMVjpO/hwe33wU32wbd+97VVrk+EBvl61OK5pXZO53Cj8jkdY8/3gBCu7LXrMptq3xPX4dg1PTgvi4ay+mAMmN9sWQek7SlU7cp9kHGCtLXbLDH7hDbip+apB7DztxP1HFOHHM0ZfGqepn8v2PnZyXlr9Yy6jSoYyORvIa7NnLAq82D+uGLFihUrVjwzPIT8EfRrALZp2ycA3HluLXp6nEPO4QcgodCv4vCPjw8IyAGvfAh46ZXn3ZLbox+ArsfVQ4IL81P/GfFBwgzGl86u8PfPr/CtYVzGv1esWLFixYojeLEJ36S4EdUPHwZckrLX7g+gUhlEY/1ryrBBK7XUZV4qUMdJAjCdL6peVfxYNW/XlfIrEjrv2yL2MrEsSk61ZWZmUf56X47rOqhiOCttNSjlnOyvv5lz0+BVtob2HprrVwKSSblTW+xFl5QVMQcDiboSjLe5f53un3LpKilsrQDruHkOWKVjvFFe1znd9DcA2cJYFbcWLSvmfA2wbMPCLjIxBN5JfzIfWiS2Aq+GDKCuAziCQ1wGHmtFTIwLW+Xm2GhBg9I2dx9kXBYbyfYfMzyN4GkEeQeatlLnpgP3KOPQESgwKAfypd1h24F7IX3RE+JAcFOU+46BzZs7bL854+Uv9ZjuDfjWT22w+3AAPj7h3v0rOGLM0eHy4RaBB7HOjULEZetm7aJEEJLaBUOIrtgJISeqQoK3Stn0j+QOTd+VVGKk8wLorR5h4/H2VYeXX3+M882Iu2d7dD5id7fH2905Nm94vP53JrhRCKEZLt/TmU8zRDMldlbJWM0PKja0ckD0WBCASCrKbGeLsk3VigvbX0P4qnWzVYNmQhypjtRGRrqeEXCqfvZiARwuggxzpMqUHI/ynRIxmCtOCt1+J3bB7E19KZdsTIIytQlmAngQhSgnpS/NqR+DkMzEQJg9YnQYuhlT5zFH7Q9GuIhpwQHQXRFcAIZ3RJE7XwBTFJJ3Gju51J4Rndz3StLCA7GXjo2dWxDUuuAhnkXAM+jaCzF9JrLXGElI3egQp6IyHe9HxG0EnQUhqTWHcRAVrZLnfleu/XzBOTeum6WPlDjVa8O9ELg0E+gay7y9AfCj3ifAfDcK2aunk/L+AtLPjtM9lsYLd0j5dpEVy2GDbNdMKQd0XlyRyPIwSLn9o/Q82LC0ayxjN/aFMVXFelbpRi7KcwL8yPl8yyIFKutc0n3GabGBC3qtOG1DGdcBaV6gx8p1yDbo0eQ/siT8nHL3+vTsj0lJSJBn2z6AdiPiPJ8meY6hJpXyyVXEmLXoNzawmVxM85gFCQUlK0MhA2sC0Nog19D3Ua14XbxLi9I02+veRiVcE7XHiEmXiFrvlva95EB9J/1glK48NQjKFvld21G3jskofS2/22tTWVIfU0vXv7XqTMeUhQNh+RvQVm/XNtYNZe1B/bUyuUVyc1kZRd7nfmzm9bWLHbScxQIIn8vN/ReqvrNtscfq51qVWpPe+tGOlWpx41EbwIYl8iJVhqprbRvUWQW8LP+U3XKt9rWLGu1vp6ycp0nm5t4Xpa8qjInK+HHuPVmEsmLFihUrVgCXAP6U+f7PAfgdz6kt7xYE4J+EKHz/dziZzuJFRt8DP/GzwNnFMga54oXCzkX8Gx/7Bt7oJqxk74oVK1asuC1ebMLXYGHXzAxSZraljK0nPK7algPDpbxmLl8N0NgglBK9LQtoDRzrNruf92Wf+hjmTMJK82hJKCvRrNtTGZnE1XNPx+bcdon0VAvoXI+WWRG9RHSYPw04DHKmPslEUw4kVv3essvW7b7qP/ubLbelqrkNnDnPbLN9SJY2VdxaT8vGWY9v2RUGvXYpIBmiECquUvcqWkRvbd9NJLaNdR47+6/aO1vFbgPx8hoUIlzfAxDiV3P3MiUCipH7S8gbhpsiWBlCgnx2DjSzfO4cKDC6xxNe/VWPq+86XL31Eh5+fEJ/Z8Sdix3O7+4xbmZMb2/hrh26a1EuEgN8jqLeTUSgKn7nrZBgWR2ZSCl2qTmGMLO/15NlNwOAQ2TCO+4OHm1n3L93haEL6HzAOx/yuDrr8Wbosf0u4/yNAD8K4TQDmcBVBXTOuZt9k5Fzjdt9lxfzcJuSupRUyoC5XRjFItcQlfnYdO75X0sIM7IqliIwXRDmcyBcBMAzwmiC6VHIXjIJYzgRmG4CYi9jI2zLdXGzKE79NSGka0Q7uXaxW3a/5E6V/uegYxZFyctCbjAT4FN/prGgBPR8Lla/w0PTD3m4U+kgAtgz+FzvY+2LMq5ADHclDHrUfLaRZDGCB/gMiNFhmjzQyT5hZnSXlIhVFsmrY4TZ5YvEPWO6KxbLxIz5TiJH90p0p/YYhW9W9pJsp6Tkzc/ARNLqsWEj/+UO1kUCaWEBJxvrhWV4spV2o4yF+UyuUbnnzIIJHTsoquLoi32z13zGDpkUjl1p48JiHYm49ZTJaL1vYnrumNunXD/9TinPN6X7jznl9dVxzYuFE3n8a9cd3GssqRLSggBKDgU5VUSaX5BNxfAksETPbYIuFVl3oCBN6RcYy/fgSUXrKaVlfZzdt15k1cLBuzKRfLXK95iStjq2mXp+MhZmapfsjhCSth1pf3KH12xB6lbtO8g9e2Tb4vtt1azH6tHfLDFuCWxgSdbrgrlT6lZbvi3bzGGtGwg5KvOYut/qec8pwjulmVg6wGDZT6dIavu7bZM9bz0HY9u8WABh7o88d85lp8WUxkJ6QRA3rJmbNtOLc677oF4EwIe/1X8vHPyN4nL7Do41+y+sn2sr56M2ICtWrFixYsXT4K8A+AqA3w/JdfQiQd+z9wH8UwB+GcCvPr/mvJdoxT5fBHz6R7Dffxh/7U//Gj7+Ix0++zMXz7tFzxWcV+6vWLFixYoVt8OLT/jWaplMyPHhPlapaX/TIJAen/KXZnVwMGrUm4K2rUmVIW5zfWZ1/oK4rRWdNTlXB4iYi0q3aygEgFJ3Oo6QYj8hAPBSlp6rPwx8nbTXq9XCrd80167m4z1GymbbOnMeOcBpgmynbJ+5tGfRDvtdCX5rzUeJybDQHHdkAmumTE4EQ973mL2hzbGnSheOWc1LtjsaqpOjMAG/kznvtG7i430PgKdRAu2bAdR5cN+VvmlNMNM5EyfmUdVzBLBKUB2JupwZbj/jzm88Qv/oDN1uQNh2mADw+R53tnt05xHf2PWyPmDn4aIQijhD83qzExtetbqlKfWBErqJJAOQLYelL7AgglTZ5yDEX0CHMDqM53uxdu4C4r1rXA0Bl+EMFDw2DwluFgLcO0L0iUgjQ/xmglXa7gIQVK2rt2N6JC3afXCiy33t8VztsziecTCkibmUZ4jF+QyY7kBy6HoGZif/5nJoWYdDzsOqpFzsTWXJqthNQBzkd5dUwuS5tI1KW8Q5VPLWyjUt1YdkyYyegZEyQau2wXFYFsgOSWGtfWFIXwDYBDnHQMs+SgSimwEQIZ6VPlDrZSDdvuSAjsExEcMpB+6CbE5qZRCALgoBGjwoAuFOQNw7dHBZQUtB+kmU2ZSI4/Sb8j+RFmSlKnzB0tfhrNhjU6qbHQOx5JzOOaTTY89NpYwwoCjNHbJ1ulXbKzFNAJyx+lZbb9ax42BI3lSZORe1sub8jEz1ZicFLO6nnD9cq3Tlu4wF2clapC/JlOX1yZecze8GTAC8SySvmVuEePq9eAz14qLG87i2+z1G4GblJIADB47DQk+8dxsk5Q3WuAc5U58GR8796O/HiEWbr/5E2VVFB/sdEL9H9qvraKqGn9R/riZ4TZtoMR1Kbawu92IsNHIIL1S6J4bKQT7gVvuSm0heKGjJ51pp3CrrGAzBfGP/2d8jA72XnLrHkOZhMme7HVoK3hvv+VZuXjnQzDnjcr+mHb35O6G1jyV17f6OgMDLclasWLFixYr3BF8E8G0AvwfF5nmDG+ek7ytcQNp/CeA3AOxw8MfAiwrfAf3mebfi6UAEfPgTmK5expf+8t+D7wmf/Znn3ajngz1FXPrwQRmVK1asWLHie4gXn/BNgY+s7q1znNpV8PrROyFzs71xHeXlrO45CKgAQhgrSbogD8vxGdkStyJqa0Uv0FYM1YoE3c/UkVW7af8F+VcrQmGCVmrfzMnSuQKHpChZWNpVRGqtOHEk1s6hDpqeILErInXJgAJZ1Xtgh22ujW2P90IazzMOoOep1s96fKzasGg7lr+xXHdCClC6uAx6qgpJFSlAsSiMLH8HkVgFciLsW3nkqO+EWA7BKHEaQXKqyPYqAJ1tQY1im0NoBgN5nhHefAt+nuHGCfzyXcShAymhokFIEtZECUQ3TkKQ9U7IGy//MRGCfo+AmwKGByM2b1zj4lvnuH6tw7d/70tw90fcf+kSH/7wO5iDx1v3LjC/M6B/4OBHIHpCuCOKHlUTUhSVISYAoExiESMThqxkGcpvUYdzLGRPJqUY8DsCTw4Pv3kXdBawuRjxyt1LXGxGPBhmPL57hstP9Lj/yw6bRww/RlCXLH57sah1AQheSTO5tpHKM4jmFIDuUNSIXi1pzbVNpJrNZbzIfWpIu/zdwiW+MQt+CG7iZHeLpJIGprvA9FKUnQGgM6Rs6hc3C7HKXqyz48AIGyUPDenHqV4ksjepNsPAC2KNoqh/lZjXnLNu77I6M+w8LnmLizs7DMMMugvsHm6kcw1hrWRk7IC4EcVv10V4H9H1M2KQfMCYRHFGfZQnUhCVLoPBHYH2Dn5HQpp6XuSRDudRbh9ftpFjcBcRN5DFGwy4PSEkxTsZslXYUTmWIqF70Mn1ncsjT5SlgBuRFyVwlMMwE+YzsSvuH6ecvel+UKJ5fIkx3Q/INtyJeKdIiBvNt8yInBb+pEdC7OVaKbFLM+BnZLI1/2vul3BexgjlPM+QRRiUVN7pXLLT/4ysDKdY+lGUzCSPJH2sO7H6Xiw00PFoFcJKTKc+jl7yf1NXiOD8zNDymZf3UR6TSJbQnJ8P0j55hlEMwBzADx9V9rW3wOJ5W7/jKpLvJMkrv1mrWZ7mYvOc7ZYDFtbO6X3P9fuuVlpKRYe/J6JvIRS07hJ2PrBIh2Bg8rouVLktUrAm/Ww7OMr5UbHcvZWyuUEmtvLx5s8hLEnQBslrLaQzQduop1gmp7zCDWtra3/czNvszaK5dE1Rt1F/r84/E8K2roObAMvxYJXA8dB6Wuc4ec5p533HFN81rDJXf45lXJF34jaS5lVCNMs40t9g5ryU5sDZySYfY++Lqn3GUcaWYbdpG5vzcQv7d0Odc1e31WllWqre+u8I5mztDOcOlMpHy8spXj6gdpUrVqxYseI54gGA/wOQV1P+0wA+/Vxb9HT4vQB+HMC/CSGxPwD4/O8CPvEZYHP2vFvy9NieA//IHwJ+6FsAfv15t+a54D987bv4K/ce4J2uEddcsWLFihUrTuDFJ3xbpJUSuhYmCJPJYau+bCl4dfupYEwsJE6rrqNqYEv2auDG2MYtUH9vnPPCihlYBnWtnV2FVp6zTB6eUllYG77KanAREFaVLJfgftXw5XkdtQo8Fcw1/X1KkWNRK0S0rbV15ZGcfyVwWQXR6px67xbJCvooWgqOY2rj24IZvNvLOZ5v4QBEZx4VEYmB0u/l/qD0edH9nhC9EzF5ZCAGEDP6h5Lo8+IrA653G7wN4P5Ll/Au4ux8xFUgTNzDX7tcb1aUKsmjNrhHsIhnK2FkSEJELNW+ymUzwV85BAB76vGw26L3Ab0XAnj0EVcfOUPYEs6/KyRRt4+YkppZLGYTAaaEmW5jUx8v/8sk3MnrU31WEk5j/oY8rM+9XksRO2C6k8jAjqt2USFVMwmXCMtQyEKwUbbqvnr79JwUn9LfHE0b7MWxazkCRCHODMyE6CTAT8RwLibyUW3ukXPVar9yslMmx3DE8D4iBgcOlPPy5vMDhNwG5D7rWOLlXSFm1aKZu9TOyQmhSKlSR1kNTTER47MwpKwKYlW8KvGLQvRmq+zUH5wIWO44j3Md+5Z4ZQK4S+YUHghbyaGLPgKTy0WqxXEmMBOpzyi/5TFTXwe97c3YzOMspGvPKPbPIdWTiGUwJbv04+OazbvLksuay7o+bCHcrlXxnJ4xpj61WS+LIpYLD8px5rNdLGXLDwyaA+I4vqe5MlsWxcfyzy5wShmsbhY1DAn71GrdY205Zs9bt++mulu/3fZd/4TnVCusM7SNyV57Qczf0AY286WWfXWzrtvgtqRqAyfV1PW2lmV2WgDQdHep23GL82k6xOR5WFzup/c4syh7Dfl5TIW7WBh3xKL8aL7fJ4W26dgzQn+3c3s9h/qYY2069vfDMbyIdo4rVqxYseJ9jgjgHfP9S5CV2J/FYYDs/YwziC315wG8nrZ9C8Abz61F7xrDBji787xb8e7gHHB+58VVKj8DPPYBb/Ur2btixYoVK54cLzbhm4KylINptPzP7mf/zcpegxCL+lP3UytnJXzVMi2aYDCQCLD0W0iMkXeH+ykxybwM6tS2zo3zrAncnNM3W7ml4FEIZV9Dwh4oeKsAr1igmjKtlTGq34BybE1I1nnV9JxCWFo1ExWy2KqBknpW232ggrHXSdXVVq3rXbpuoVJRaN9V37UcbZNr/GZz4joCqCv9oERoNNfU+xQMPSSwmRlkzlmUl4cq34N2W1h7QABwDhQri1Gb09EwLYtA9okxF3c7YLeDH3rQ2RZE56lcqY8h6l1Kx8beCVESRI4odsGas1ZyAUvOXydq2MHDX0/YfPsSH/+L13jn83fx9n6Ltz/NuHuxw+t3H+NyM+LyzoCrN85BeyfKT70UiaTjyFldmEmnubA7mZhMxBAn9aKSkIseT4pJIG2fCDR7xL3D4+sOGCLuv/YIL11cw9+N+I5n7N7awO8dzt5i9I8CmEhUpj3AM4kjLSUCWIk7JYRT+4iVXBR1MDlDjhmCrVzPdNkImQAHyjllgi3lLVaCnAhJvZhO1wNhS9i/ypJnd0HiU/ovEZKMonYlSD5bArgXtXBNnLGX9oUti0qzY/BU8qtqblpLYhIDCEIQ6noYmoTs1fzTIbhEsiLZE3NWd+ZynVxv5xg+qdomADy5wusbO2fXB5ADwihELm8gds+pfng2pDDBXXpJH+xnuW5deWbRLArx6B1CICDlQnabSbonOFEOE6EbKRO5qoqF9plHtpCOPcONavMMkJP7P/ZCqrqZEAZg96EIPgugLoo1NsPkX5Z26fiZz6Xf3F5U8qK4NeMKqV2pv9yEYp+ebq/ukjLhKuOH4Gcd04TprryH3EyFyE1jshC7pU3WvjkT3VTaoGOdQlLDExB7AkUu+ajTK8Qer/Wp5bO1UdfP2eqcNUdv6QtN9yB1B2CaEff79rv6JtxAuiihVsjkE7Z45v1tj7OK3kO3h7g8XutQdaqmHDhFGqrrhNYbG/tWSlhytDymKl/abd71i6KMrbEhDvM5G+K1qYrtdT7RIKCNMnfZtrAkLe3CttSvC2vk2ywwa5C9terX/n5jXt+WghjAQU7jU/bMNRp9r2XmcaF9Pc2y3c7TGmMOOkZaFt2VHXRWCusNGhlcJ3OORk0ND5blQWVs2zlla+Fdmpfdlty1iyIXBHNNuNbzqSo/8GJfnROb1C7l3FHm9Ap9HthFoSEUUpnMGD88gcPyVqxYsWLFivcE/28AHwbwx/Di5fX1AH7efP8FAH/pObVlxYoVK1asWLHi3eHFJnwT2FGyRK0I2/xb+mItzrrEgKj9mdo010EbS/QCRtlqyFaFkn7OCbnZsoO2ls42r6+tUy3qGrbNRLSw91XbZtI6vJegtCfhQBsBL0r2lHUcLVtAN8jQhT10zmWYAnYtYtWqM7TNljzVwKIGCGtL5QNlUApqNaynM7mqfegT48ONtlTnVXXAYcBM2xLZBDPNtjo3sLZHv+t5hiBBxjxGS5s1kHgQHIxsFCmmPyzBr2Wbcg7OwRDrB7kOtbwj5AU/eAjs95JGdDOAN50haRLp6oXsBQFx8IlUjPl+pJnhEPNxTAR0hHA+gCLD7Sbc+caI/rrHG/tzPHhtg/mTDr0PON9MCPd3mKcO4XEHmhxoJLjRkNiJPMpqWpN71qp382dXSCTdT4nMTEKy7EcM0ERw0YEnwtt0B/12xmY74ex8j52LePtHz3H9HY/tGw4X3wnortNwjUCIYtssalXT5VmFSLk+yZfKsmDCESzZmwkxlPMhoJBkXsstpNqBM7pyBYxiAwxRhcYhFhtngii4ZwKFZI+bmDdRuyITukq6qtKTkmWvKHuFjKfARRnqRIlKQfbNqlkGEKscuEyS2zYCu10PAIiTE/UqQ0jktLZC7Y3nO6JaRgCIGJ2Xk/RdxNxHUdwCcF1EjFJR3MvJ0N6BzwP68wnTVS/1uET+JeKWYrkg5BhdH+QRHh3CGWOeTD7ZyYFm6bc4u/Jq6RnRRewHGcd+NOMwYrEgnmKyGHdAHORzXsSQCN35PBGu50HGfmoARYfumkT9e8boLqmMM+1ncw/oWNMFA7NxAMuEtLYTsqhBx5FL581pbMCh5BXuORPPC6I1n2NaAKFjJCm3SYejErl636pSPh1b1OfIquVcRzovzq+oxCAzL9T3bgQoJHt2fS6n/bQCigyagqQKeBqy9xbg+v1Yb6+21flYM8F3TD3bIvoiy7uhJjCPkb7OKOWr7TWxZwnHA0L3VO7gBrF7DM06bFmtvrM2yKmMw7zJvt0HjfmJks6ki73qNnoPjrxUBd8CSsIfKL5P5D8+qOOmHM22LLsI8BhpnG2S7QK+0wsEDvY5sv/BYsVWm9M4I48yP9X0KkBegHiQ6kJhVfO8PBcO4YAItvOzck6N9uncvzpW6nTtY7JFd1lEsfybIi7/FlmchzvYl1vks5LKT5pXesWKFStWrHgqPADw7yKvtsbPoahm3++w79ovAPgQgP8YwMPn05ynwb1XgB/8MeD+h593S941tpsRP/HjX8ar91+g/n9G+Opmh1945U18+ez6eTdlxYoVK1a8oPhAEL4AUsA4EVGVnXMmhFWFJbI7sX7WIMyx1f6WtKyDRzmYYwJIMaapYkOZY5XCQAkCWcWADeJU/5J+PhY80mO1rQ0VQ1NJepsA5DE7SY4ATG7ApiI2SRsP2lsFJQEs1CeLPGSc8sJ6YxFdtTu1pZTzjCw3W7aJiYyVnJd6nU4E1Y+Vl4OUjaB0bS0OlOsPtFUmiViuFdpWqUQulq45pfaBKH0pRLh+ADovbFrOgWsWWSg8geaYVHiGNJkBclzsWwmIg+RqdaND93CP7p09ru/fg5s9Ll/e4uxij7tne9w932M/z7iMW8TrDohOcvdyInIye0TLfxJJVPoAcoz5vEDrNlByNIg9b0SHKYri9O6da9w53+Pyo8C1PwN7j+3bhG5muImzJW22PLbNVF4uNSiTU6Ze3bcQWJzOmUrbmJPaOu1jSKyFklHrz0QhFkQzHIQsDMs+RCRk+247HI3al11qB5cAt1VXip0wZcvl2DNcJCmWpCxV6OqxmTSNADEJ0QuAZ4dsSexSh6XHi5J6OR8zJUtnJ1bQrmMEX190iJqXARoJfC7k8ESQBhClXLgQshulvxwxuk5upBgZ+22EG53kro1YqqMnUfZSFwHPYGKgA6JzIHZ5fzfJ8zPnbmbAjySkvGP4PQmJbMjXsGGEDYMGZYJN388E3rB0mSFCC2lM5RpROU7P06rJ7f2hxK62O1uhE5L62ijJO1EI6+HZYvoIFrbSvGwDabt0PNt7x5XPluwlANGJJXgpx9xYekwsuXtlu96b6bkVGZhm8PyU7xVLwtxCXXgrYlAJOvscvykdwbKSUsZtUgHU+Wxr4q52/KhIuluRTkdUuIvybqlQXexriUyO4NiwV261G1j2yyLf7uHxbAnRirhW0le/H7T5hHL3aDtPqH7fU9hzby0yUxwbJ/VxdiFhDXM9Frl+b4PI5p1w7HqnOXPal3RBJlBUtM2Fg6UhLXvpep9FXTWac9pb3MPWOrrxdwEzN6c2K1asWLFixXuDHYC/lT47AP8QgPP034v0RvoEhPD9RYhX1AtCvJ1dAJ/47K3+1ni/o+sCPvN938Jm+O1jacxgPPYBXxv2+Cv3HrxYt8wEYP+8G7FixYoVKxQvPuFLJAQvM7irbIRlhxTEjUulb4wSnLFEmqpYk4WjMEbpd1UQ9B0wzUkl7MtkKrWBOmPxq7ABH0vwWiQrZgKSJXDjeA3mzOrZWgWDrEJgkdeWwDYHWqgCw6cQ2ahrK7s+70HOgWOUMluBvRwk80W5QYRs/ZwbxWV7Pm8vdQNA3a/WElrPhcxwznbWpr22T0KyfCaSa3cK2k/WatpFIQ2seiX3p+mnrMgxfX2gFi/qKmu5WUh0t/wOlLHAvFBY50Bl1x2qfU1APytajvWPAU8jwhtvwMcAd+cC8aULsPMLspf0/phEycsdyUKLEOGmmCxYKeeQJBbCl4kw3R3gpgg3Bbz6dx8j/HqPt97a4NH3b/Dmp65x/6VLnA8T5jOP0QGhd5h7D5oJbl9sZTmpDWkW9SET4IIQQdEDfkxElzY7kYVqjaw5TrU8N5GoV01+UooOvCfEhx3e3nv02xkv37vCVR+wf7XHdy7OsH2T8OqvTHCT1DE8BqJPFryu1O8M4Zr/I0PmAdnWt7Bly3br80fPkx0WxGydt5g9AXPZgQLQXRGmHoXYjSS22ARR/c6iRO0uCRQJceCs7nT7lOM2tTEOjDiwkJKRJBcuQ1TSU2pzUvXGrpDB3BUVaOzTGJ1ku+bTdV2E28yYxw48OtC1l7qHCAxRFhQwxM44EoYuwLuIzsXkrk+43nlgcohB2kchtdEx4sszMBN2b5xlUpU7Bo1CsvI2An2A6yOcD/Ce4RyjcxGbfo/v3Bswxx4vfRGYzwmxE4UvMeB3ndgo35ug+YOVDI4dw+/EypqCjDvPQDgXZTTNwLCT/edz2T+clesaBwb3wm6Sj/JY9EAMhLB1mdyfz8Ve2Y2iFNanhhuB7goYXwK4k8+q3FW1uJshSuJzYD6Ta9o/pjzmwplcM7enRZ7fbKcO5PzGNMs56YINsX0v94XmAVeEXq6FWJ6jELp2fKd7ICMRuI6l/GheDVld74wddDDbwLIAJxPf5ZlFj6/E7v5pUbt+3JBvNStHG9a8VuFY3v1uQZwVy2BellG7bdTK0ZY1ry1bv9tj1J63pR61v9n3ZAiFOM2k8w2kbrafbhCmp8jC9FkUs67UaY5Z2FoDVeqNZd+RL22p62+2DVgokBd2161+TfufJHxb5LAufFssnjOksL32J4j4G3P82utUpeUQ9bkvc798TIvorMh8O0YajivMIe+T50R2sZ9VHtvzSYvlmrm3s2VyWiRZ2TGT91K8nbvT8t5bkMlGuXuwKO/YQj67rQ7SWkegekGoJXnrY4mWSuwVK1asWLHie4oI4P8KIU//CF680GMP4J8B8A8A/FvPtykrfltgTxF/4hO/hW8OLyBz+isAvo6V9F2xYsWK9wletFnXElVgo7lLZLRIrIPjbCDW7p/VuDggUU8eV6P+rQ7SoASkTqK2mj5WZx1UqglILANUB9Z3iyApHQZ7gWQFycvAcQunlBt1W58W9fWw9dbE9qkA6m3tFjWYqioem4/upvpqJU6LnEbjmgDL4GGMh4FC/Q0QW+UbhpMEm5NE8hSYwdc7CSAOPRCHYk9tgrOEQpC0rqu1clXFqdjVOrAndI9H+MsJd77ZgbsOj3GGB5+O2G4mdF0QG17yCIHA5BCTMrQs5kCxN4YhUjtGDJTy2KYfDcmUrZH1QC1OlY86xFN+Ug5AvPaYIuFqM4CIsdlOuHylx851ePipDv0l0O0ZfmQ4B8xIxFMibLUP1LpWbGo1I2HVT4xFzmS1tG3tp8SXtYO26w1ynttEivkdYb6bCE4lh5lybmQQF6te7auOQUwp53Ei7LzmOaXcX4gElWlmZTKQ1LJF9SvXIVlH63VMBDQFQhydrB0ZxEpZ7JxTJ7CoN51jOB8RgkOcHKbgMc4dhk4WyBAJsQtVBidCFz5ty40x1yYU4heoH78MZkJgwhQcOBJcAIbHnMhEyrlw1Yp55j4T2JK/1yibletnZAVrtt9WAjapi7MCOvWV/Mf5X04DO5OojMUtrpbcbirl6DW2tuZkuZFo2qLjROs3n9klq+362cOmjLS4IpPKKOenBHA+pi4Dy7IXfZF+yy4epN859+fiOG223oeUCF89L/09MjBH8H4EpgnvGrdYdX+MBDxA/X4xC5OEYDSuF+2K0iKmmwnovP9t9juGllKyQdpmUvcmMvIm3KSANdtvVW41n2nbQZ9oR2O/A6vmRv8ekP5H+oVvIswt7NzNksO1avy2qPuxda1t3U9S/ikFulp6m0Vxef50kyW4OcbOickSqvWiTV0Umuo5OXe/aU5/GwVO7URk3V2OzZ/rOeJtFP8rVqxYsWLFM8cVgO9CVL8fB/Cx59ucJwIBuAPJS/wTAL4KOZf3MXaXwNf+AfDKh4CLe8+7NU8Jxkc+9DZevf8Izj3hXPQFBxPwyM+49C/gea8K3xUrVqx4X+HFJnwBIaKqgI4oCw0RCyDn662hgZsGAbtYSZ/z2yYlY4QJ/B0hiVu/2e0aJKpzd52yfEMVYErtztuqYxc50VpB2lQOJYVx0254oc61KoXYdk1eKEldUf/mAJxVYp/od4sY2r/VQUkbjD3IZVidX2SgFYs71v8t4tYn9mWak2QThfitj7EqGHIShzf20DfhYB+9/q2xp6qTpAxZBD+tosconnIfH0G8ugKur+G9hzs/AzohaRGp3IORAe8WJIwl+uTcU9XpHo29Q/QE9iRK392EO198C5s37+DiWxt84/wM4TWHl+5ewW8YYZhxxYQ4sfB2O1eIORI1rwsAIsCdKCK5F1tbmgF/LftGkz82k26a/1ZJ0pRHVslHN1EmQPuHHmFwuHRbDOcTzrcj7n7oMcaXO7z98hYXv97jztcY27dF9UyBMG8JsSfETNJJOx0XEg6OFyScfEhEmJK+pm9tX0s+Ve1XSqplBneU68rkbTrv/jEw3pdcvYguK19zzlUn/Ri2hVxjAIgkKujkRc0dRHU9pvIJOR8xe87KXSFQhUR1+3Td0v5qBcwO4CGpaycCXXbgTURwDPIMNwTMk5M2JhtqchGbzYRx7DCOHuO+Q4wEfx7BifEmnyxVIwE+iiLWS/vj5KELATI5uRdLZO4SQxkJYXRwPoCIEYJDCA7T1AF7B78jbN+eEe2YZ2B4IGRifEDYvyIqaHaJ/FQ1dSJzEZCJc2Kg25VrFns5ztW3qo4lrTIpmOEYMVmr+2SDTgzMg5CyPuXC5g7gXsoPg+znk+IY6Z6iCPg9MlOqiyEYkJzaqQ3sy32nObCVUKVZ2q5q5pxqgQE3M+atK/cldIymd0lF6gKFoLXK9ugJLo3J2KfuCVJvyZ1d6iAWK2cKXBZUIM0jGABL7l63n8DX14jjExC+9l2yWC1QqSOfFpY0q993Rl2ZSa1s/dog8yw5ZxdLWfVwVteaOls2y1atWf8GyHOB3FH16oHt8qk67Pk2XmG19XLTilldNmpFrK3rBrL4KFplHdmHUyoG7d9m/xhCP+ciNupo8sgq1qzutOdVX3urrLYW1N6BZ6OmPjVOW/mD67FtSXEiMC/V3eTdiTkoipVzXLajtng+lrtXLZcPCF47Bz+GSvG7+HvBphs5Nh8Dljl+9Xjvb+cAZGF/szl6ze8ltYJD8++eFStWrFix4nuKtwH8OwD+MQAfTdueYPHec8dHAPzTAP59vO8J3wdvAX/zPwG+8DMvMOEL/Njnv4Lv+8Tz7+vbxOhWrFixYsWK9yNeaMKXQgCFGfBegrNzWJKmCku6tnJkZZtcDXKiEMR1wDaYFfMtondBrFX1aGCmDuZoUE6DPTaAYwM2ai9nVQhpP1ZSzwal9JwM+VmCZvacwsJKuAkNCGZ7YzN0WsrfrBKpA6u0DARqft9m/jLTJqdKWhMQdEeCoUqo2qBuLlvHgQbe2sFFmwc5K6RsXtwcQKVloNzWS1Tst/UYG6zM18XYjTdwUulrz82ORxNYXFxbR8vgrlUpwQSHTyjH4zsP4MYJ1HlgM4B7D3SlPynEwtc4Quy9kL5Krs4Rbo6gGMCzkMUcGNw5zGcebnDw3sHNEeff3OO1v3mG6w+d4+0fc9icTdgOE7ZnI8LgMA0eoe8Qx0T6BrEfjh7iasliI8uB8njR3MIL9SIjkU6Uc7Va1bDmjVXloBCwYpHLlx3GyWG67nHn5Stshhl0f4fLzzKuP9zhzld6DA8ZF9+e4QIhdoQwqPqwENVKrmYiLakdVfm7uAzG+jnbUCdSLXYalDYH0PJz9LI+gQLQPxbidZ5cvj0W1aW+UTWm2vRyzwjbso+qWN1MCJ2Q8X7EgZU1WIhzJRMZQgAqCRf7RC5eukyA80YI13jVic20YyF6U9vi6MGRcBVFaQsAITiQY2y7Gd5FELE4uAeHefKL0wMAn1hUZiFMOeVqJh/hHCPuOiGU2GECEGwZnHLrMuD2EX7konTmck5uAvqHYnmeLY1NXmF2jLhNp+bkeo53iwo49rI/x0III8oziIglz/ToAb0fALHFJhRyHgTupWmUHk9hQLFhdsB8Jv+5CUVZnMaajs1wLjmF/Zja65EXRhSVMi1y8DpVCCdb8bxQhCCLFxzyc0Lrs+r0PA7TWBGytrSR0zaFqpFlHy7lAkVtPJd2LHL42jqnkPL3zjcujFkey8t5QX5WHyo5s1KU48JyX0i/UCxyF3a8twhCmBymJ1W+5Jbkbjq2vXtF7AHFBvoEAbpUwsbDMkK9jyUzq7bUpOWRtpJ14dAyj5XRInBNnx3k382/N5nmJSFe19f4ngna1A4dE4v6TB8viNhW35/KdZztqANocZOlQ9mca2uBgr0maQ60yFtcz8Fs2SEWYjvttyB7K3eWBYmrtsumja12L5Bt3E0XVOTtQqVb2zAnoriF7HRi8+ha2+d6TlZ/bhGy9bb0HMnPBfs8sZbNOp9vOd6sWLFixYoVzx1/G8B3APxBAK8+57Y8DX4PgM+mz18D8BeeY1tWfC8wXjH++p96Gz/y4Bw/gu3NB6xYsWLFihXvE7zQhG8muJIq7KRCtEUo6vZjZde/W3voFpGp/97CajoHgmIsAZubVuPXwajbHHOsXnc8YLbcfamWOGkDnX9oqHa17mYlDm2psIGqd2xQMzYCj0ponsJCqdxQWOlY0b5aLB44rlpZnlMViNW2tepLpG8TB3adRtXbJNN58TlfI1MvkRgHn1QtKQnfAO/3YCK463Npj082ktbaWYkaR0IOGiUqMQEzROFLDBciIhwwR8RBrHspMtw+wF+OuPdVh24/4OpjA/avAF0X0HvJz+pcxB5AcB6899IlEwrBmUg3F4EIbcCSz8zqWCWTDDHZXHzMyIpFjoDbE2J04ECY73j0XcB2mODuR0x3PK6vL8CesH3H5eMLwcmZDI3J4pgTeWZz70oDTbtMWw4coBNRmFXA1TixtrXEgNsLsYfZjvPDc67bwo5F1ZuIR8lZTHl/AiSHrWOQp9LRkQrR1lfnkfoESISwz1y7lJ1JeErqZQIn5S0Hh8j6XJN6YnAgYvQuInbyjJmdh3PJ+jlSITvSRSUConMHXWBz7/Ikx9q2ky4K4DKWcl9pLtyQ+ikp0GOflNhKdnecbZVVYR03LH3BKaexFytpR5zVzflaR5JtEU0OKitwta+1W+11ALKamJiEK9N8y8Ecq8SsfdzbMapkr3Zk2p9iUSjncZ5IZFn8ICr2fKx9nXIZRqUeLEhgex65jPpZlp4xFJeqXluP7Ce/U2DQHI4qUk+ilS7hhL2v3a+Zw/WUKril0j2GY6kFWvtVbT3aD0dUtlL8E/Zd4xxbZRyzfa7LymrYqpyTNs6nVK1Nx5TTit+DHMFme25Lo79P1teso54bnFaRHxxTL067DWp76JqkbuFUvl7d5SbL4xO20ZkYPnyaH2kPHd6vp2Dn3+9GSduazzWUu81j7HYlnRd/t9ygGF6xYsWKFSu+Z/g2gDcA/BSAAWKXfMN7/n2Fj6f/AOAMwN9MnyOARzj8A3rFi444M978zRFv7Dq8eWfCXe8xvIfzKmLCy3OPKxfxyIcX6/ZYsWLFihXvK7zYhK9z4H6QoKySsUTgzoOmeUnceX9I4h4Qs/Ew6BRisWKrgyu6st8GnIKqUKt67Ep8a60IlM+q/rWr8xfWcY2Aklr3mZxiFqI+SCpgZrAp40D5aVHZ78n50tKeOW83yp7Ktpmn6TCQ1VICnSLGAVHKEgFdt6xf+zKrpNO1cF6UWPk8zDWyChUYdYS99t6UvVDtps+TkKnU1UG4mO0qswLZEtJ1QFivfW29qHB0oP7l2oLQjs+8Uxk71Kfb3Nh/L5vcIBSA5TisEHc7xG98C/71V+EuzgE6B3cOsfdws1wf7r0QK2OEiyjWzhEpT2ciyMYI1wFxcIn4IcxbD9c50LaD2wXc+eo1tm/1eOPHtnj02Q6bV68xDDO2wwTvI+bB43o6S+SUqHwzeZsIXpfyzQJCYIUNJwWjkocQcjIpE7ljWIUiiBEHZJIppkvmd8na2AO7eIHrLsKdz9icTbg4GzH+UMDVbsDjzwwY3vDoHwFnbzD8ntFfaV8D88bl9oaekuVvIQCz+hEkRNWs5B3BT5wVwXm8OMO/Gr41qyIZoAD4idFdOoRNh3A35PZAFZoqZk/KaAQC9kKy0UxwE+CCWF/HHggDo39o+l+TA2frXspkd9S6KBGKEfCTjIOw4fxHTvfQI3aMeBaL2jrIYgJ4BjqxZiZixNkBkwNPwNw5vHN1hu0w4byfsBt7hOgwdAHXwSFMHv1GZK5hFiaUAfhEDsfgMO06YJ/GciDQSFmZTbv0bE15gMOGMN31mDcypsKZnEO4Jnl1kIw9Tq8EiqKCpgDETlS17OVa+j1lIpP71F/bKM8VJkQ4WcgwsIzV4KRvOI3pdPH7hy7fD2plzolYjoOMM1Fhiyq5u5Z9KFJWAE9nnFWxfiTQBJy9Rams1AYv51EIYSHi3axjKQ2tAHRXDBeWz5XoRf0u9tGUVblK2up3F5As4JEVx2o5TVHartA8veyWGnmKDD8l+3Ai+DGY/Ni8eOaxI7Hs3+1vJhZzBQ3iaDHfOCT8yHsheIMhBmEIP3232M+1ghRYvhtusou2781j6k2FtYjWhtTpFOo8sKYdZBc16Xu0YaXbJDjDIdm+2O/owqXG/tVnhSWEswLWWiYfA8dmefqbkqnWphoIzfZkxa0t74RyOls3H2tjixA256Q21lJOUZXn+n1jfpSurS4cW1h859NmKdsed7RvuiPbCURdmXNPc+mDTrZTjMWxxqiBD7rBlzlwvY/N+UtmPHI9T7fHWQWv/ZugNWdquQolEpa8l763Cz/7tPrG2kN7n+6BSj0MlPlv7fpilcVkV8OsWLFixYoVzxMBwL8N4PsB/BG8uO+nzwD44+nzJYA/CSF9V3yQsL3r8Af+px/CV/+za/xP/s1fx3/vYx/DF+7efc/q2zDhj3/tk/i7F4/xr33s6+9ZPStWrFix4oOPF5rwZRPUkHx7rgQ6jlk76783qQYULcs0ojZBaoM8N6kEaqVmnZfrGGqyWs/3mBrTBLgObPBuUMLWgbOjit54IrjVavMppc8plTZw+4B7CxoUbNkG3kZ9pEHqdP0pwqhTTND5lB1mytl7tO9vUGjxTf1TN1mtyeuViMb6+mS+wFOIAXx1LWNrOwDs4RYW6KkNoah9Yi9knox/AEk9lxdtRCFduSNECJ/HPuUyfTTh4hsdmDo87raId0Z0Fzt4YlAXMN6ZEEef+EAn5JNLRFBIhI99NCQCjF1SMgJiA62chUMKzqb8tsqhJfLUBWQiCkindS0LTiITdkyIWw1CM3AxY4xA2DrEntDtCP3jpHbVMgLgZoabORO/qiQGJN+pmznXyw6Sw5RwoORF4lw4EYuiOuV8XVTJHKOQtn4PxHNVzCIT4Zrnml0hwCnlfrU1Sj+nS01SPnfI+XnlPFOZvtQvjSCxbtY+VnI7fY8di911SES8W14X8gzfiW0zSM4JewfMhEeXWxAxXj+/xH7TYY6iBJ6jQwzyHwCwqlkjIcxFjY2dh7t2ZQFABGgieXTPqT09A+cB4Yzw8JMDwhYIZxHhPAIOmKbUxzsq/RnLOVJSeYvNtdiK235glH6EEhyJ7XQTEOHAEwOTWEvTXOye9drrNWcvfUdgzOdcLRDgvDAj5+wFCuma/kVqD3shW9VOeZETXceAL8fQCMmjPck2tSZXAl3rkjbzsiwvfRPJjB0ufdiKFx3kOkbmwZNqGklNXO6LhbKY5flF4wQex8PCnhYNS2e77aTq9La4TW7g+l1UE7WnHC1OWRXbbafUyMfQyNlrSdEbSdinxILsrElq04a6bXZbbfts/+VbqGYP7KJP9FNrnJzMeXwLFfeBfTRwOF9hkxf91FymboNdYKDH1udnrJ41764shqQ8z9Ltpyydj1own7CDPrXfMlVKOqebFB6tlC920WXL7llxU27h2t3H7v8kf+OsWLFixYoV33PsILlw/zrKHzc/BlHNvijoUEKpHsBPALhO378M4M3n0aiCN78lc4OPfj/Q9TfuvqINcoTNHY+PvvSD+OlXfxSvnb8C3x+3do7xS+Dwd56+PhAuosdZ9DfvvGLFihUrVpzAC034AolMopQHtDMKWiBvz+pfzRFW52oFkPP11nEXZyLJMQVrfCKWVSGby46iPLDl2fYcW/XfsmrW7fY3q0TQbZY4vg28F7VspYjIyl1/OLnIQSmrUrU+njHlTq5ztkUu/cSmb2xuOz1W+0fbdSpgVZ+rbbMSsq3AZiZrsVTMtIKwbM41q12WiiW4iJxb2OrHjqmjYlIFt5ThgGnPKUK4EWhs2o/HouxQBclBgNCQ1UAhfhe5bU+Pq/j4MXi3hz/bAjyI+hjI91G2Zg0iVYznXix0I2dShzQfYWS4KSL2DmHr4BGTyNTDzYzuwR4vffkSd37L46v3zzAyMJ+N6H3AxkecDROuxh6PcY7oOds5UyC4EUJyFV4HbqKspszqRxJCSvPiisWyjoVyXsyJvNOuT1bA7joRWDuPeSbsRwfqGOQjuu0EbCdwdLh6pQftHbrHDv5a2tc/Brodwz0G/Mjp+QWo/ezMQoqq6rJY8tIh6cWACyw20UkprISdkqrcle9uArpLwnRX96dM0MaeM3knpLyQ1dGz5IL1QATDsZCPHCgrkvOxJIpVKMmeFKaZVOOiPLV3rubwjQMLWTwTsImgPoJjuUe6PqAfZjjHGMcOMwN41MGNhBA22A0zXt1cYnAzdqHH43EjXUiMq8st4pyu2yTqYGsX3T328DsgbCmThW4EMMqJccdwZzNeuneFoQv49vSKjAvPcBfSptn3oJ1DvHJF8ZruEyV6hWAlBGIg9avup+MUvpDdCjeKEjd4B3edyk/jwyq8hTRlxA6yDxHmOww3Evx1uhcAhE1qT8rvDAD7+0qEUs59PW+Rx0Um5zu975WkZoSB4NK4pceiRvdjBKfxHTvNZ53GQkBW/7I9B0cpLzcvbJ8Zpg0WBLhJdsg21nLRy+KHdK8o8btYNEEEihE0RWC3B19e3f4929ovu1JU7ybWBTdC9JJxe2jms22hWiTEkUH9cttiP8CQSb7UxbI6gFyXty2UmjWJaxYOnYSSdY3zPoAhK3NOYw1U1Wra6h22KPsmwrmu75gXdd1Wm/9W311df/x8FlVVZO7B76bN9poa1etB2+u2AWW+sZiHhOX4OtYuW86pOVKd7xlYKo4b/ZFJVGfKbI0p47yiSlvS92EUEpzrOZfZF+TEpeUUavcWPV7bmeYy1CJoNWfxMbvkREa3SGeZA6bzm6ZDd5bWHK9W71rUTkUtEjmE2z+7VqxYsWLFiu8J3gTw76XPA4BPAUh/XLxw2AL4efP938ZzJ3y/+iXgW18FXvvYC0n4MhYh3e995RU+d/f34L/+A//bGw+d9/8WpndB+L6QWKeYK1asWPG+xAtP+LIh4WgOBzMCClWgxCcCUoNBNjiiAVkNrtjgSTQzDi2zSzbRoSpDP2v5dpW+bs/BMkv4sZCXRELKGqs2jlFsm9N+nEjmzO+0gjkxkYtEcnw6txw4g1EtpCCbzdmbLZ9tQK5pnUhlPz1Vu68Ge1XpSSRE76IMhxvz+NbX4lgc184OvblekcsxRi1SjjNqppaqJpjzsUFJToHffIwJhNLyei8CgDagq2TriSChHOMOlSddJ5913NZjobYAVBwsfpD+IO9LoNgewo3ymcHzhPjGW3AX53CvvAQeOjC5rNBjkroIgN9HsW3tHbpdAEVG7Mu+YnEb4UJSOBIhbijlGN3ATREUGB/6zyOuPtTh7R+/B7o3Yns+ir0zMc7u7rDfDQijEyverORDUq4C2e44EogkL6pa4UpdhUzKCkmmRJzaawhRCEdKVrOcSUzJ7evBPYPJI7quTIg9g/uI+QJCiM2E+RzJGlmIU0r5Xv3I8HvKqsjYIZN5QtzxoklAOVckBSZRUqQHJW/L2CMkwncn5bEXIltINAbNJHV0EOVoLHVwFOI8q42VVFYurUt9H4HpItU1StspAHEQApKHWPpG+zomMpMJ4TxKP3cAAoHZAV0sRCNLHuXtsMfQzYhbh3euOwAe3SOHHV3gL48/gNfuP0LvIt54dIFx7BBHDw6FuF/YRUeCC0JGBl3Im8hn7lnIVwA0BAybGXN0mEeXbZ/dRAiTw9yVe0mJ65JbNo1HJeL71B+es9q35MNl0JXPLL3fJ8vlxPe7a5fHjRKvYo0NYCNjXK2Scx5rrdebMUTSJjcBu9coEfMMSirlMsiQVb6qlo09Mpkviui070TwI2H7JqPbF2I15/qmRPqrotn2jdaV/yt9EjvOOYF1IbQLZd/YHT5LXTCq5pjIZQIY0sesz3cl4qcA3o+I43RQ1q1wzPUiWw003kP28NuqWet3lv3eep/Zd53a++o7rXJ/uLFOs4hrYYOsxKslDHVftSrWbfb3up2tbcfOKxfTIEjr4w0xvFQQL5XNtWrXlmO3tfZTu+4D9a85p0N3jSALo07l+tX22/NRNPrlxr44goVl8w2q7kxktha9sVHkLtxVEoGu40bHSr2Iwc7d6nrNvFXGsitpXI7l1m0Q31qWJUvrORkRAX3j2IoYPrB/tsfXxzl32B5r82zbbHMG5/6UMrJFdL34T5+ZK1asWLFixfsSE4D/O4BPA/gDeDFJX4vfB+AnG9sfAfgPADxD16APKP7W3/0BfOW3PoTf+5NfRN/fECN8xrj/jZ/ED/yNf2Gxbfv4w7c61vX/KAb3maO/c/wNTLs/gZMLTV80vAXgiwAePO+GrFixYsUKixea8LWWj1nFC+BA2Zu2LQjcrLZ5iqVjNaF225Xzx2zbngbHSM9T6tAGbrK1Szs1VAWVOqPer5GLVhTSfNjmRV2Jparrvy2e8PyfKRYE7pE2tKzAnwCnbAqfqKRj9R4h9bMdZdPGkhEvr4RUPD8Ddw6AawedA4M8JQKHCmGXyBaKnAgnlpyePcl+HggbGThuDDj71g5u3uDqwx32PGBHgPcRnhhDFxD6Gcwd4t7nOpZtTu1hqVvIsLS9FnwlAheUVKaW7yYslK/ZljYKOeoYiEmZa4OuvEkEfyINJcZNiGmsuwlwM8HtlYBluFmfeYUsy21pDAsXgBjL/gtFcPou14CTuprEMpk4K5yZCoGm56s22JoXWK2cs6JUj03/qS0090mTFU39HkDH8l9MFXgkVRsV4jrXn0jESECfiJrUrTESHAHeRVAXQNsAnhz83gGPHOawxYNhRt8F7He9jI1JWWqU/5zev3JNuUtkqJ5Hx0AfQYlwdl2E92JxGoIDghD4bgJ4R5L3WdeGpD5d3MZ2PCWSvb6eQq4nO2+9/kEI+pgWbVty1BbLaRECewCz5Om1eZP1Wlt1uP4btkURvCBWFwQs8oVXC2fuOS+EIJa8v34HdHsW1a0dTxXknqKiwKXlfjkvr178ur90zYVLix3MfVLyASfiLIqlvCqGrYV57vsQkkvCM/rD/NT7FEtSL5N0t007kIt7ynfgiXQCqWBt5JL8ewp7Zc0B++QH3lCXIVYXCuVngDpf7VFL5RbI4YmDO6afcx7gZrmN41ptOWXXrajG2oGiurb1rrc5Wl7bYyrwA7Vz1Td2HmXmhQtyF9Wc6MjcqzXPrct5Iti/HRr1HMzTbKoZ67Sin1vkbrNaM89rtd2lCUlNCuvfPytWrFixYsX7Egzg1yET8TcA3MGLZe9c4+PpvxrvAHgdwN5sm9P2FQWEN9++h+vdgAePztH3c/7FOcad890zm9b46Qybxx9abLv33R/B67/5s6CnWHjg3CcA94mjv8fwIZD7FFSRwPFbkAUP6Xcw3uwmvN095ULj7yUYwBWE6P32c27LihUrVqw4wAtN+AIV0VuBHYGQVLc26JFtfw3521LcajDGKlN1/8hG8WmCNkOKvgez+r4z3TynCUsruNN1pa36uyqhTMCInJOgNHOxnVPVryNQ16VV/Rr0jCUApfvZfLYa+HNUfgOWgbykmuDZEH6OQNQdqjb0WN3maWkbHWKxR2YuZcdQBST5sExru90K7mlg0CqxLew1rG0mlewkV7XPMCFan1VtE8m10/Or+wCQOZ2qnmplbxXElfx01XerxF4ot6KxUXZFzVEOPlCeZOW3fq/bGw/z+mb7ymMB0hgQHl/ChQAXXwVfnCEOnVwrIsTeJwtEIVjczIi9qDdpZhCEyNN8vvBCdgjhJwxO7B24I+DcY3gwYfPGHp/8c3u89aPnePSpLR5/itBtZmw2MzbDjGGY8Xh24MkhOILbO1GrJhKykEY6fivlZVJPsk82twz4XeoPEjUuAMlTK5+k3CAEF/WM2CX1qxdlrpbvdvKFXVLIKrGpl2KWsseXheidzwnhkeRU7a/KfhSEnI3WvtJ89KMoGGNXiF7NV6rfwyA2uxxFVepAQATimRCxwRfyNVwEKf+RF/XjnP5L5yjnyYgbIPaMeBZFGToS4iZdR1XIduaEQ7ouFMEDxLp554QsBUQBHAHaefnsGC4RvhwIcXbgSHjweIu+D9gOE1566QqX/QbuaxcYHhD8Hnh0fRe7iwjuEvEZSNTWHQODkLhO28WSp5dnJypgMmMFQsBSIuznlPM3zF5UsEnx7GYh0eNGx5gQxtFRWWBgoPmmaZZxAQBhI22lWAj3vO9MQCKk2Uu/sxOb5tJQOba7TF9dUuI6sSUvuZaF4KZZ6gkpzuImQn+ZjuvkXmDHMv6jkMFKDMdNBA8s6udAwEzoHzlcfI1x9maUBRxenmHsKC8aUDWuCwwEGc/cEbgvpDRS99OMrCZ3s9xjYRAymixRFYXw1S0uAGoln+/xIIsd8uITlj6AgzyX9gG0GxHnEmh413B+qYDVy5QseJu2v8G8G837GoBZSKXHmbmFfb/Xx7byg0ZXHCyUpNM22jlLSGV5XxwnQoNkTPVyCKL+rN+5LYWqmZcoyXmQtze1vyZAW2SrVRyL+jGCPG53bKrXkq15W1Ltlv487E4AZT9geT7GuvskQb8gfc0zs76ONyiSZVtYtGfR/67MNdkBPM3LcVrnE7b5eO28KLplfnYL3dfUBS/zTmIqbey7Ul5q36EyVsYIV+cOpHmNVeQfs202WDinJAvp3B9m3sPMwDwfKnidK69eMv1Rb6uhls61QwtRaVN6/rAtp6Eg5pDm+qr01f3074oVK1asWLHifY2vAvhfA/gnAfye59yW9wIvAfij1bbvAPiTsKTfCsHV9Qa/8Od/akG73rt7hT/0+3/xmal+73/jJ/CFX/g3FnVQ7J6K7L0NyH0Wmzv/N/nCe+wv/xlw/PX8+95F/G8+8Vv45vACqMAnAH8VQvquWLFixYr3HV54whfAksTL/ypBy4e/1wEToJC6FnVu3JocWygddOV+ta1Vbx18qXNwHZyLKb9ul7GfzqW0co7Z8lsErX63wV49TzYkuQ0Ax5RXsrZl1MCgyf+2CAAucuGSBO10zmavQYtAtrDlGDu/xff6+IXVXZvYXuxXK5JbChtLTGtu33xsqtdXQfhW23AYhDxAq/7asrBl6ayWfzEeBmNPBJuPqopa4AgeJ/D1Trix7kJIMwKo4+LwPam6NQVUldD1DkRKYLpK1SeEjFq0ho2HmyLcFHD+XZEdPug3mO51wP09uj7Ap7y5sfcIoxMB7phsb0HCXxsCTSpK3491SWoUgYt9sx7HqoQ011Nv9aTO1HOitC2TyiTCUkVUu2BjlTufA3EjFrtuYiFz51RvKGWzk75SNWlpS7GpXv5VAyHuoiiLgwNCInvZcbIWZUTHuZHzvSAEbCTEx07INC7nItcVIM1zW69viQBmV0hfh6SCTr87Bg8mT6OqVDcxE7MAQI7hfUSMTtaSzD4RtZI3Niai2u8Y27cZ+5cdJnaY7gdwHyVlFJU28d4j7H0h33UsGBVpfYtyIEyxK+lZPbLqOTvdLvJiU7m26asqbPNnlH9L/VT28yy5n+fEvXkIqewAppQHWethufdooMx+qupXyU32YtlMEYiDfJdxhkI0Q66xELCSy1fba/P4KtzOoXtMOPs2o7/kYpecyslqcfPfQUoGRiZ7lRxW+2e1aadEFsk+VOzZ7StWuRRPOQVD3kYEF+JiwYUs3IigKQDXu0KePA1ail5gQfbmdt5E/NnPNXFqvy+UwUfYt2NK2WPP+yPbF3MMm2u2UqfWZTBXhHJ9Hua3g365wXL6WD9mp4rWeRhyV9tyo1K6spY+sHLW74Zwr8s8aT1ddkoPEkPcm3oX+x1tKrX3sedQL/qzZHZ9XN2PN40bSxo7Q67WbbzJYjqnt2iP7UzQ3mT9bL4fWDY3jnsiHJvfA3kuBiAt5DhSti7ObJWhsH8T6GE2ncxCUfzeBC5XrFixYsWKZ4cIUb/+/fT5d0Hy435QQDg8n/sA/mEAXwHwG8+2uhCAr/x94OXXgY98cvHTq3fP8P0feenoobtxxt/76pvZfez5gDDPy3D15dUWf+9Ln4R79F3gzW8BALZ3HT7ze8/h/JH5f/T46N//JzDs7h/8dufNz6Ib77xnBO9BW8gDuIMw/y3E8Etgfniwz85FjCnm8hMd8AkP/Ln9+5RXnfGBcqdesWLFig8SXmzC1666d5SDvotdVEkQkVS4LEThTRZnURkcOiQhbTA1bwcWq/SBUkfOocU5iEN2v6z04GW76vxjFRnMnHL4HjAQDSJXJ0DWTq4OImIZEMvqAlVXuERmWmtffcFrkFBJ2IX9ZZT96oAlM+CS2mSel6paS8Y2zh1JxVCCjKpConJ8HWQ+RnbXqmFgqcyoJzGtfHmab9nC2lN7V9plVUHal/X52rLRCIxS63paglyD5umcaxVKRRIf2BtWwXau+6s1+WcGTyP40WNRwFycgZO6G8EtrHpdZHDn5PcgeXxjn2xwkdR9hAVZIhatQnrRuYebCN0l4+wb1zj7FiEOF7h+vcNuExHPCH0fcOd8jxAd9n2HPQYhltgBgWVi73hJ+ioRlU5TZcCHtrCEOKTFAEqCBYiykrEkOPPvJHa4jvM2NwFhMPtrbDw9mf21jM3YM6Z7ckwYCP0lJRvmtL5AHzGG6GUHIfOcaXtM2wAQirLRBVFLuskhbBl8MQsZGAnsGPAM2kRRugLoziaQi3COsR+2oNEJYRggqlPI+fqJJC9tz+X8OO3DqWzzn5Cm6X7cBJBnELFs8wD6iG4IcD5iGjs4YmzPRuyuB4TowLPDHMRa2XcBcZaT7a+As+9O2L8kDO/0KoO2AV0fEKNDDAS+6iT37kj5HLhnxK3kWy7vg6IARiSx7DbkNfWJYN1Jm5mRrLLN+EnqXHYst5qD9AWV8ZdJ2UwCcyZnOfWnm5AJYN7EMn50f0CUtlFuQVHkkih6SZy0GaLcHS6lnfMFI3aieh7ecULsujReI8CzGUsdZF9K7TdjvrskbN4ivPQbE2Iv9uxqsWwXRci5k2m3KT8RunJPFDtTiihqXi7krZZh1dPEyFbUnB5D8rshfnQRilkYRFMA7UfER4/B07tU+C6elxEcXX6uKhFH9v3RUmDWhNtBDthQSL2Aktv9mB109a7J7wC7WItcUYt6HLbBltvISdvM/Vof20oPoe2LDvkF3LQE9ocK02P1HSOPa9i+tnMj43pxkOfXtj0fE8p73p7vbeq15dixoNtqO22Ti7hJNCssId/qI6skB5DtmVMddh6wINtj1a7GuGjaazcWxdlxeBMZ3nYqSQvbWnMm58oYsXMn/d5AVqcfc05plMGqED5SZplbN85tMU+t74nS/nx/233q7/a4o7LrFStWrFix4v2Gvw0hfT8HWZ0LoF5Z+oHBXQA/D+A/AfCbZvszIFrDDHzxvwA+9mlQRfh+7NU7+LkvfProoW8+vMaXvv42pjk8q9Y8E+z2A/7GL30O+PIe+OW/BwB45VM9vu93n0l6sUbuODdv8AO/+M/j7ps/9L1u7lHE+T/FvP8/ntyHAPzcAPzsAPyNCbg+vq4z43t2nUxsbMWKFStWvD/xQhO+7JwhdBl8oBxlkNr6Kunl0ueW6lZkUYcqVyJAA751AKcm6rgiw6xS1zmxQLR5tWx7c5lVAEn3t222qgSjBLBKBGbO9s+sZaoVnaeiqj0CDibQiGUQMBOVas9MBHQNFasz/WHn6JnUTY3wVb8eI3rtNg3ctfrSrvBz5piWRXTT+rlSTwGFYLaBV0sMm2B7Rq7PBNHVyhmJ7LZ9pcFbo7amiIPgpZymkiQOB1bOdTCzRvp9QRyHsFTj5NO3BIC5LkdWfMbra9A0w/c96PwM8d55UvDRMk4dy5h2IS4XbCTn4JzP07Hk+dUuHCjd7x3cxoMi4/6vjTj/TocH1wOuPtphd39K7ugRfR/g7+0wzx7jW9tk74ysThQilMUyGpDL1QmJq/lpAUg+V43F9nKMkoNgsd9VG2g3AW5P4PN0TERSzS5vhf5SSOJwxuUH2YT5XFS5FBK5l4jmCUKgTZOQ5MMDsabVfKyxQ7ZDlr5OTTSkIwNwkUGTHDNvCfM5I5xH+PNZlK5zYsi6CDcExEnYZAYQZ48521orKQdgYPidE1KTIdbHMZGSjuWtoySdnm8kYJZy6SyAHIMcw7lYbt3gECaHEBwiE7yPIMeYZ58UvgSeUsCdGNhIPePL8nyYzwZcv0YIW0b3TofYe8zJ2llJwWyd7KRtNBP8JUGff2qdrDGHOMS8KABBLU5lvzCUhQIUkNWqSu5zx8YCm6Vcly6OVkYM9CwW12orDYBGyrl4JZcvIapduWPAp0bEdG1YchFTJISO8+N8ulPGx3wujQ0XEW7v0F2KM0PYcFHLJpKeWBY3hIHFHrrnfF40CxF+9m3C8FCs28OGEHqS9zVzzq+ranQdk5bgpSgK9pjIaT8WgpfTsVET9iL9zuV+Jl68teAnTgsvUs7qOeUMZwBERWGcOEaaxM45XO/wxPl7jz0fk0tGJnlPkFktsqtJgJErRJp9bs9zm5BsqYPJLfPpGvKZNHeqd6fnDBVhuWjnMVVp/ZvdnonmBhEOLN+zuqDMoiqXuq7MabAksPUdx7FSDTdI1AWZekxRq0reuq/rczw4zJCxrT6z7c2bK+K+7vfK+vmA7LXktvdlvzTfKU4Dbkly18dbNFxTyMXDxZPHlOmNa2/nuPq5mYO3nvcY5TLpnCfNf2w5dMQZh3TRZoO8rdXB6YCyrT4u259XN9Ip9Yw93jj6HByvi0WtelgJ4CPE84oVK1asWPH+xQjg/wIgpUvD7wPww8+vOe85/iEAmvv1DQD/Pp6VdPKTr9/Dz/zsjyy2XWyHI3sL7p0P+MM/83kwMyIDf/6XfgNvPLh+Ju151nj47Rl/9l/9Ln72w/9t/KMf+ucOfqfocPbgk40j37/4YQ/8C+fApzxwQcC/cgcYT0wXAeCtCPzPL79HSuAvAfgGlumoV6xYsWLF+wovNOELoB1YPUFGLVDbJh8rv4aScdEeXxGUTcWnEnuGjKsDMcfa0ggq6f6LnLwt5BzDqWyvgSFzDjdA1cQLJWjLNvlUeRp8PAhkHglw3q5hRcFMbhmYP2qVl9qh9eJIwFJRByRbc+9W3x8LagPSZrqh7xt9ctRasDWmatK3DvydIoWPqY2Am68TM3ieEC+v4LwH5i2o95lOsPkyCYloiVgoThdNSbywWOCanLWOJK+vY7jA6B+OAANn33EIW4ed7zH1EdwHDMOMzosidexjIgdTXSmJKBMSKYZMlsGqBQkLtezi+iWySix1db9EUCcuXpXBqJdDxmUdWu/BIubE1goBJva4rgNoANxYyMrD61H9a5uf+lUIYiqkLJM8RpPy1nURzkXJuxqFxOVA4KSglQKRyU92Qi4iX7fEYHtIjlftL06/JRUqgKwiJte4P7T8SEAXRf1bOzukfuZIABNiz5jPIWTnloXInwEXCTzTwW0oOW659FEirNXVmaOMG6aKXNFbhNPvHpn0ppA+x/KMlP6Re0DIJyTlriVs0v6RQDHZFQOJ7GVET0VdvneIm2jGjpIA6XPigO11yjMAVrtozgp0NwpJzItHJJcudol47SR/r3YkzWJV3l0y/F5y7MYu2XoTRMGvnan9aMneerzqrtWiBblWVPblUk4NrUNyiKfz4eXvi2sIIXwxz09O9uYCqnlIft/YfRrvvad5D7YWG2lZx9Su9TP9lJXuwiKaD7dX7/1jRPaB3fOpc23l9z2F2k764BxcmS9UIFcWwNX5b2+d0qBu97HvJ347SvDf1Ac3qYNv29YWFu4eOre4/dxxcWw1T22pfpskrrbjiAPKqbQUddnH5lCnfpO6DonTW1k92+OO2buXAst+9fHVXI3rZwuQ6yGi5WMwxsP5xIoVK1asWPG+RoTk9FX8IIBXALyG7KD2gcLL6T9AVL8fhfjlMoA30+cnAzmH+x/+ED7y8Q/jk6/fe6IUFX3n8cnX7wEAIjM+/PIF5sB45/HuidvxXoPGDfqvfAZ3dr8Tr47v79zPzDtw/C1wfCtv28WI744jXj0HtmcRn+oYH++AL3Rlivejt4javxGBz3bA4zQJ/GYAnjlFPwO4BPBW+m/FihUrVrxv8WITvsb+mB1A82E+LPbOWD/Wkf1quyo+a4WurppfBGHMscxFJepdImwO1cZiW5ys4TrT9boKPwTZ7h0wG9u5Vpu03KQY5pgs5KpcZBzjkuwFluStK/seRUvNOs/SX1aZq4qNI/nTpI9i6WdfBTJbVs6VqhmRRUnsKAXjU51QxXEobem7MkZs2fl8YlLDucO67WerNs5jJh4GPKkq3+5nVUGqkrHkcau/jilnFBqYVhJe22YXG9gcb418b6WsmJXfQAomRqPMgQl85/NTBqbFsDDio0dACHBEiLgLt+2EoOlEnUshjZUu3TMRWckrSkoCe0pKvERyBoLaKIvCMpF6keGmDm4MePnXrrB9sMH1fY83vzBgvAjgc8p5fc9e3mF/3SNiAE0EN4laMnYM3iSdG3NWUToy3JCSZUjEFgt5mMlc5qSyLF3hR1FFxk4JRCHJEIQ8DVtV8Sbybk7bnNjisheVZRw4k9KAKILdKG0Y7wvp60bC2XcZbgT8DplQUyJark1qfyKa3QzsXiOML7GoOQMhvjmAtxE0SB5k70Vty9HJpRpVzgkgFLUpEkHKiQB0V4TuWghANxNip4pbIYVj8pf21y6RzQD28jkMjDBEkKpVHcN5FiUrE6gP6faWtqFzCMEGwaU97IGwFSVthl4jYoQBou72LLmCO2UYGeRZVMMzgSZXSFslGCMl9bUQy0ryAkLexkR8D2+7rBbvdil3c26kjGNVZYt6lYuN8tRlona6Jzm4KaR9nYyBbgK6x4TxZUK4SPL4ZMWdr7m6LVjCVy27XSHhaXTwe4LfAdNd6Sd/RZngVbUyIO/duGHwINfI7RzcjtDtCP11hJ+4qHt9Il4jiho4csnlbZwgJBevqOhVheuiqIJjX27I3EeBq8UY8vjSetT6GgAoyAIRm1M4X48Iufcjg6734HHEU+MY2cvF0jnvqhbBNaxdLzlQb95NC9tnX/YvhZbvrRzytV203b9+t0UGs7Eo1t8P3oHu0LZXmxPCsq23VP1mS90ax/av1KEcAshFseWuzrlpqV3ZFx8lr818yKY9qK/rYlvV5gWZXKmw82/arlrV21o8oKgJWU0NYe25zfxjQbyesMNe/J7J/sZ1qFXNtj+Zin2zJf9dY2xbS2wtqmE7fvC7nrMjUabX6uBpzuXeKmdvQ6W7uKeYZTyolfOpY7ObSixlVITtgU3zNMm+1vHH5v+1RK+2pW7DE/LzK1asWLFixfsLfw7AXwPwPwDw0nNuy3uNDwH4FyEv7wDgXwfw9ScuZXN+hj/8L//3ce+1V5+I7K1BAP7xn/wBfOedS/zpv/QrCE+66O89xkfPPov/2e/4/2Lr7jzvptwIDl/G/vKfBVCI89+8vsb/8qtfxR/9aeCf+hHgf0X8VOv0XiXgf3+3TPn+R4+AX3yXWYkO8CbkNnyK9ckrVqxYseJ7ixeb8FWkAO1Ri+T6u1q0pWPLNl56QFrlrhK/NTl4UG5ju/3dWr3ptprMDfHQus3st1AiZFVnQxlAJJbObGz5auJXCfNbqHWXedLq/m0ExHR7TQKfmnDWpHtrX47JwlFZi0Y7XDw81lXXaqEONmXVgdL6OLV2VuL2JpVMHZytg+rH8u3ZAG99LtV1zG0DDi0AnVsGCms18CnliGkXuSpAred+QlHP4wh++Ahu6BGxBbYdMMdM2Iqltjk2AASGIyEWc25PQrZ/bee9A+ZzDwoefh/gryPOGLjzmx329x3GjwLxnNB1Qvr6PmC+MyFed6CJ4K+FOOW5lE0MwDGCF0JPlcZKVqoFdSb5WIlMaW/s5TvNJPmCM0tVSENVPaoqFgxQh/wciuazCjZjIis15ytSPlQeAPaM/X2xefY7sbl1hrOqc6SKZS8wn6mlL4R4DrJdO1/cIXUclPYAqS3gnJdXSGtKyl5TdzpXv0+kpifQpRKJnIlONylLDXB0Ylme/HmDZyFiCQizRyTJ8RuCWDqTS/bZLApkBIKbU18rAegSed4JuUubAJcIbUWMrgzpPooFvmcpl0uf0yTsKWd7cJb6lMeIlPsz25F30odqFc4u5XFOSlpilMU4aUEBbxLp30n72SVr5fQGdxOh2wP9Y4KbPKIuEDgLheDNNx3yNl08AM9pDBMwSa7d+U4aDzZnr/lXrckpEDA6IJKQvVeE7hqpz1U5jKLktWOCKP/GjpZlR5TFWmmbvY2A1FdK5rD5LdXFjKLsTape2way72sn7aGZQXMEdnvwOOGpUD+Tjyk0a9JP960JttsqMev88Pa3WqV7W+VsaueirNbvVlXa+Eyac7eFEw4SC7LX9sWJPqlVvgeE+gm7ZO27g/ddo47aWvlGNXAzz/HhfInrOcgx6LU8cBDRlXzLsbOoq2ULfdsAXms8HcNNuZN1fOgz77Zj89h9YeZVxx1RqJCjNyl7gTKPailwqSKO6/mXzq8ycR8P99N5mCVx63rqbY36ck7fWkm8KnxXrFixYsULjwAxq/3/Afg+AD/2fJvznoJQrKwjgJ+GqJ3/Jp5kBReB4Psevnt3IV8iQucJ9843+OnPfwxf/c5DfO27D4Cvflma+skfPB3few/w2Tu/Gz/+8d8HALjffwRn/g489Tcc9fzx9jziL7zxdUTM8AT8wc8Bn/nQiP/Gy4wfel2mdZubi2mCqBzLDPxjG+CHrcYIwJ8dge88DVkbISmm38KzchpfsWLFihXvMT4YhK/CTDT4WHAp/UZ1rl0NWmlOWkVNAmtgpiZQ60BQ67uqe3V1vm5v5ejSQBRzOa5FrBnlQtnEB8EnSvUp4cM12blo06Gqoql+bQWzrVLDKkD4UH19GNi25WnQygSO9d+AQgzXaKlOFnWaOuqEhC2FCYCDILWSw7mfqt9bwU8bmG3ZLZ6yYDwSpG0hq5ps4K8mfYEy5gzhf6hMqcdAyW+4UPueIH15nhEePkR3fiYB384BXsjT2LtDEiiXK+2hyEWZakjfg3qIMN5xovTzQHcV0F3OuB+Ay496vH2nk7npGcG5CX0f0PcB1wCYPHgvpKCzqyAjSW7SnoGJMuHKqS3qUpzVoko4JQITRAgO6NSNyba7Is0YyDbC0g4CIhAHQxJbwrkTwjJ66TM3SrA89EkVOQPDQwI9ALprhpuVVCvtoAiEnjCdEeYzRjyLcLukRE2kqwwfIVzz0MzJaEmIz5TTlkaX+8Bp7mNAHY4l1yshWQUDkRl+EmX1dA+A2kmPBBcSYTvJYhXulExnYIhAx5JPWK2Boz7vRFHLEUBwifBN5+5Tf3ZChPpNQD/MON/uMXQBvYvYzR2m2eN63yOmXMHkZJUta6qj1C8cCXzZQfM95xy8rGOFC9mrfZHIXVGlIueyDVu5zt01lRWzenpR1MnhjMEb+35Aeo/JvecmQh9EFR7OCPMFY9pEUe+SjlGWvtKbTseDSwMrtZV7xrRh9I9cIuBLW/Sa5nEZkGycCX5P6C+B/rHUGT0QPS3IWiVmywKONKaTeljJeceypib/ro+syOU5YJ8dZljq/aYqdiWPs+V5fs5D3rGJ7GVH0l0hgq+uwbt3n5goP5PrBVQtwq12fqhRp5Ow21WxqqJBVTbWalx1rWi+6yqY3K/tdAy3IOY4KRkbqs+DMlrlP8H7zx6nimLb/818t63FWJkwD6lPfVZN2jLqfL7HlL7l9No5mE+hVW9VaC4771f17UG9tYX305D/0VwbXZg1mXrSGMsK7TxXONLfwMJ15sAmXNW59dyysW8LOr+x85xFipJjyClR0jjWOZX+tvg7Yjmvai6uq9O9OGfOzexrF3VmO/Lq/qiUvVk5DBymlDmWvmPFihUrVqx4YTAC+IsAfieAHwGaOZA+aHAA/hEAXwHwSzgtrTSL/IjgvHtXyt4ad84G/Jd+9FP4y7/8VXztW28Bv/4rMhf5+Gfac8nKffCZgAEPh99x92fw3/rUH362ZT8xIp6U/Xx73uE/eOM7CDxj0wF/6HXg868An3/GLSMC/lDFHAcGfnUW6+cnnhUGAF8G8PjZtG/FihUrVrz3eLEJ3xQAodsGAROWqp5K8qbWzERiCWztkNUKroUcgEIhI9Wytl5pb9W7dQApt8WoEyo1crZuNvZvrJa8gKh6df907LGglrV3RteB9fytaqRhKZjtpG0Qrg7mLWz3aBm8DQGIoQTvLEGu5LDzVeAyFitstTCuCVfbxhAPVcXZklkts812a4NnCVgb8LbH6Hm0YAP3kXEwGbSW0IsAaQqKHgtyWyVOClYXMr+yLqzb1Ar4JcXvYireOidD8NoANKsa5wYFWnjzbdDlFch9CBh6cJ8uiS9jgglw6ZplcscOuVkUjuyVKNJrW/ZlAsImBUFnB78LuPgm0F05PPiBAfvXAnYvE7phxmYzYzibEPqIOe0vik0tj6FOSpl4hZBbYgOd6jsTdasLgJvSeWRnAGRiqrsihIHBHZWcvQzEjRB6kos1KWPT369uVGtbVcBqIwB0klMXmk9XiT2Sds8XhOsPy2PN7xIhtwM2bzOGR5JfNQyE/StCqKoqN5/LlQMHQqRZbJUdEJKSEy4RhxPB7Z2QkknRDADTecx9hWRVrYQoeyUgC+lWkqwC4U6UfpgIcYhCKPPyInMAqDOqpaSO5kDA3sNdJaISwHwRc3+yF8L43iuXcGlwXe8HXO0IzkVMY4cwO8TJp7/hCGr9TB3nAdlvZ3RdwNXowE4sizMBmeyYuWf4y2T5HISMD+eM+YyNslb7Rdo/7TzcnPotEdyxB/g8wJ/PuHO+R+ckn/IUPObZY9z3GPce070OwwNRqyNC/n2jk0UMTJjvRFH9Dub5ksnfQjTzhuVzFJtpgOE4kcGGjA5bzjbNbpZr7Eagu2L0jyW/sL0/wUIAO2CxGKBYLZfv2qQ83s0QsPdm9MIYi+M35/2UYHaTvO9d4EwOU+RlzuAI0BxlMUfv4PYz3PWEuN+D5ydU+Nr3jC6mqd8rDdvlQtZFAF7erWkxx2JfoJBc6jRh3pHZljcaVw+L7I5xS4IvcqlH299Ca2FWOi/SeYKqN+1+J9rBQbzDaXHh3WFdizKWNst2bnCSaLXtjqX8JrmbDzHkplXRep/J9xpLa+qQz7OVLzjve2xhmF5Lew76e9WvTbLY7t9akFada7Nd1VSB+u5ggQF1vfSHteZuWYaDF8rbAyvnNDewFs23zd2r9wOZeXOexxjSl7w/mCctrLvruZHZl0OUR5laL+vv9rNdyFkHQHVhZ73N+zIns8cZsnfRHksWK5xD+4GwYsWKFStWvIj4EoB/DcAfAPC559yW7xU+AuCPnvh9D+DfAfAAAPB7fv4P4HM/9btwfu/us2/KV78E/OU/BzyWuvCX/0x7v8/+mJDBzxCvxVfwLz747+Ij4fVnWu7TYHP3/4k7r/0vnuiYi/gY//qnQ8629LF7703bWnAA/vgF8Gsz8K9eAk/pY7VixYoVK14QvNiEL3B7sre2TT6Gg6BgCvhHc9yBXeORoFOrHhtMqvN1NRWrbhlUuo39XN2GG/Z/ojKrwO8i8HbTArfbBueOoSYWW2Tx06B13EKdvAxiL1BbPtvvOTBXnfeB/SJLXLoVVL/JylPJ4aaq2J0gpGl53kcUugcKmOo638rGEgBPI8ARbp/8hTtVgyYL3ryIoSJclQTKBRFqJnvxO6V8uT2J8HZm+F3ANjB2rziw99gPjBlA10U4x0AXEDZeysnB/hRIZYj9ci4//Rur7yi8pf1OiWSkkAgzrrqdhdQrOU3NOeX/dFwgqzULuSu/sy+FZkIVDE5WyHEjZDZ3BD+K6tXNQOyAecvZTjj3LUtbOAA8E5gdyCeSN6RrYIYmO4AHzqQt+rTQhBzQyTGaI5f6mPcjYjATeHblPCMlhwYnZK8I7QRu2R+UyuEoxB9GBxpJchvbdmln9ww3BGz6GXNwQppOHswE5wkhJLJXbaX1PPU+SPXF4BAdF2V3ZhorEpMBp/1FSeU88NJK2bMQ6qmoODvQJISxEtTddsZmO+Glsx26pLKforR/1wVMQ4exD5h4kxZOSJ1+T3BjGmdeSP+Q+pGVcEe699VGO9mVy9hEst9Gzj+dx7BZlCG5hgl+FJLVBSBozt6qTxaKXUMG6xBf3ENEiRyB2Wj2N6eQFfcGKkbX8UyRE7Fly0v5fBPpTXMExgnJxxzvCre1Y7bQ3KNE4NvYtj2JOvNJymkRgi3YRVzV8ZnIPNaPRwjGw92UkHuCMlrE8G2uxU373KYcsg+tY7uUdydbIpxcm6B9Gpwi1utzeNJxegz1WDEW2YsFa0+CW+5fpyhpjrublK6NNBe3wrO6Zi282znuihUrVqxY8YHCFcTi+LcA3AHwYRxNG/KBwQZiZX0MewCfxObsHu5/xOFjn/00PvqZ73/q2jhM4AffaM6lzq++jg/xd6XrASB+t11I/C5ivIu3HwHBD8DFvRvjki3ci3fwengVAPB6eAWfmz6DDYYbjnrv4bvvYDj/6090zADgdzynVMNEwKe9EACf74BvBuCNdWq5YsWKFR9YvNCEr+TuOyQ0rZ0zxRSdnoOoCetJhrVWrklhzXfqXGI/UrBYA8F9b4Kd6feuVt00VtofCybZPKv2uJr0DRHkzbY6uKX/Rpb9YFQASS3AZh+4itTTnLtddxBAO+i7EIHB5MuIAZh5qcSlKsgXjYKXqr5Y5C+z5LgqULgd/LPEs/7ukxooBmCeZbu2NTSuQcvK2qqEWkpb1yGrl6MyeqbsrsNRZbgNfoZgiOIUnFXl7hG7ZVVjWztA8n7x24GtnxRYCNYajbG5UGclVRNHvhXRu6h2nhG+9R24l18CdR7cOSFYIGSUkFDLe5cii/+MJ4SNF/ImsNhBG7UrE7L9MxMQu0QaRsAFhh8jXv7yhPB1hzd+rMN0z+H6FUK/neG7iG47IXQe0XkhNSMBI2WySG1tNa+qWPOKUtDvS5vjUNoDx7JegAgUGD4pETPZlUjATNpugNCJPXPskZgql5S/5rZWm14gE1fcM2jv4PeE+V7IitFMsm0DeEMYN4T5zGH3GuHi6w7TBTC/PGdL3pyDOJF8IICu/IESNW/rIuLLE1wXsdnMYpXtAy6vNwizRwgEzEl9nMhNNxQihCPB+4i7L19ijg4hOEyTR4xOLJsnJwrhKRHGiVS2zuy+C5hHjzg7DN/tRB3MwP61IBbIjkGJVB22M/p+hncRDy+32D/cSJu6iH6ImCcv9Y1pQUvHoEny8LKSzQ6Y9w4zAXQWhFSfhGjWPgQjEc8ATen6dcB8N5TfZ0OEn0eQY2AbwDODe8Lw0h7DMGPbzxi6GYMPuDvsEZnwcL/Ftptxpx+BLdD7gDv9Hr/20ut4+Ogc44Me/spheMcJ6TkDZ98RxW7YeMRBVOvjq/rMsjd8+mcuYzh2DL8j+CjntKCPoqiKu2vg7LsMCkhWzoUk1jGleYtjJ3mCQbItc/hpaETz2Foo+RlwVm04c7aMzjmPoyxmIAYocCakKXD6LRG8RIXAJr1uDLragx5fLZW5t0VrgVWDbCuKTkPuLQhK2wGVwrNBmmWV6IGNq3kvAmUB0zGStCqbQwBpW2x+YH03RZbf1Rr5mL1wI8VCVsjatljVsmlfkwBN+4pyVNqe1cBWsdrCSZUwbj6OSnqDJuq8tUfSOGQCO28/ct2PbbPkc2OhWNPG2rsyPzhWr03NAZxWG9vjakU6uWTnHMFcXGtaYtOcU9fOzRZtqBYZWrTmsXbxnd5TzjiUmHuF7KJLnfenbdSYQ3EIh2lT7H0/TUVp28rZm5S4ZHPq6dx/cV4n5sfq3mN/r919nGvPAVesWLFixYoPBP5jAH8VwB9DYR9/u2IA8N/Bxz/n8V/7ly7gfGOy9QTgyzex+4t/ApgP09t8Lkb84D98i0LolzHufwX/7i8CD+98Avjpn3uqtvz07gv4I4/+m1IkAP+BJ/ffW3zCAX/yLvCndsD/6fp5t2bFihUrVrxXeKEJ3wwNfHReSKKazKvt4TQI0wrO2gDpEdXjgpjNSr+0/ykyUverLdps3q9a9VuBiCTv7nLj0pI3tZtdCo5ZwjDGpSpXyUYN8OXcdalPD9Sdqd3el1y6C2VqXLZvoUxoBTB5ud/iPEww0wZv62t5CjYY6qpAomKRE44Pf7f1a5CzstKE46XCqbY7PKX+OKYAbillFORE3bgop0EsmP5Z7G37vbIUX9h0p2tZW3IeKHvJJcKkEbS01U4z+Ooaru9BnQM2PaJLRKg2gQEaRQ2UFYJRyB04aZMo+w25ps3QIhJxGTckeViDEMJuZFx8jbF/xeGae0wvE+JZwLCZxIWdgLDzyHlZE3GrClyxrxWyzs2Ut+XKc/w89VOywSUG4iaRpSl3q1o4u1HKi0OxdXbC9YoFr0PJb6v8weSAvRC9+aQ7RmQ5Pl+C1P68U8fgDSMQsHuVEDYs1tBwYMdwe1HaRiXQSOvgomZlITaZhMDtzyQnsnOMzkV4xxiGGSOAELpM9MowYThixMTMk2M4L2SAEALAMAQAAXEgTGOHGAiRJFcuZhKiOV33GAkxEPCoh78W4pF7US1ni+XF40IUxe88Pse07+SCkxDPAOAcg4cgfa1kOrlkzQ4gEmiE3BeOwcnimua0SICV5Ey5g50sAggRYnnNyCptmmXRAjHAe1/qDKlvUlsfX29wvgV6F/Fo3CBEh8f7sqqZmdB3Aftth85HbM9GXE0OwQEjAW4vFuRxn4jX9NanAPhHXvJBD0YlnpTe3CUCNorFt+an1mP7h/psB4aHgB8ZbuacC5dduk7eHKc8k3lU1QpgqzIvO5Xv0VO2aF4QR9r3WlbkxXFCsssKE67zfSl3M0fQOIGvnvKv33eTp6oi8/K79yYFrLUebr3L7GebNsB+r/eDVr1859RY1HsbN4pjZdd21fXv1X4cK6tnJZWr97NaSt/UlvxubxHW9nez/6JsW94xovZZKbFxhMg1C7FOKYS5tditoc5ukfRNxbd+rs9PXWBM2UfJWqDML+q+MudykMO3sU/+3W7LVtIRB6lSLFrpVWpXnpZLjx7bgj1G609k8I35g0+VddP2Og/ws1Jwr1ixYsWKFe8bRIja9y8A+DSAH3++zXmukD+6iDr4zj917l5mRviNv4r45q8D0x45DZqBy/+7sTT0jvGF7wf2wztA/JsAgDkCf+c3gfHsfsr/e7qtDg79ByRs/X4AEdDjFpr4S0jqaA3jHnL/K1asWLHifYwX/82p5G1koO8kgD4vla+LfS0ii7WsolYHdK4dAFLS1h6jq+iCqbuxGj8rXy2xq7m7WspLSzpbRYFtU+t3oKhagXyeXBN7YNmv6yCTxETsae7ZU0SlErw2128dJFTla+QyMTRE4gL2PG4Kjtp9OFbEcoWs+PVLElmxsGDWwHWl6q2PSSppmUwn3+GaLD4WYGvlsWvZPGvQMtTj2KihkqpmYb2swep6vNvxZYl7lEBsCYZqP2iA1x23h+aYA9+siwWOBTJjAO/2iHgIujgD9x7sTO46BogZNEdRAJuFFy5ERDjAiUqPnSgFNZ8nO/M5KXznjap0Gd1OSOO7X5/R7Txi57DrOknTejbCuQDvI3YzgWMiwpJtL/flfCIcfCJyGUhKWPndRSFb2SWyV3PyEhC7RBYn8owSKUicFLAohCFFgIkQ70TwEOHOZiASOBLoqgONYs08X8TcNvZi4UyBxIbaybZMeBGAPkqbHWG8D1GwdgymKGrTlMyl2P0CGLIMUshIlHOnjrHdTtgmi2QiBhFj6GbESBgjAV2E3wQhZvOYIXAEfB9BxAiJ8AWAs2ECkRDD112PafbYMYEnB+x17DMQnJxaBPqHDt0lwe+BuQPCeVyQthYhOOyveimP0/NVCWcX4ToC9bP0UyDhx2ZR/RJD8ir3LKr0yYlKdKJCNAYhSP2eEHsWoheUFK8ETvbNuhiAozzLLOGqNuLMwLjr0HUB2Iy4HAfpj7FHCASOLtlRh0SYM843I6Yzj9BHhN4jXnvQSIiDPucgiwwioX8shPQMSO5eJ2MWSGMj5V+mSfbXRQA0A/1exzhj84DhkrKXOywU4rq4IROyqAheLLdRuZ2KElc/O/N+OoK8mMJee0ZyDJD7isDF/QOALtaiOQK7PeL17vgz7Glg8+y23qlUKQ/t8/+Uk8JNisvFO9Lldz5HBvWpXzUnal1PnbPe5mZt1GVJ0mOE4zEycqH2rc/FnAeHYEhZl+t7t5D6l2Tvwe+noiItMri1kMvOP+zvOp5PqXSructBm5LqmBfXJ5Sy6rlPRXBrHTancN2WpgtK6xwt7IJCZ/p0ZAABAABJREFUM0fKal+YcZX77rCc4mBj5me3xGIu1Mjhm1GlT9Hf8+dTVs832UDb35X0bal67T4WLt2/p0jfEA6Ok3sez/Z5tmLFihUrVrxvsAfwn0LYqR/GYqXpiicCxwDEgPk3/jPEb/+9Z1Jm54Hf+f0A8BDgXwIA7CbgS78BhPvfB3z8+9J0qCyIAyDxw8Xcb8WzhofowidUIRMleC8BfPF7364VK1asWPFs8OITvoBMDhxAcyiBlFa+3UyINQJuuo9RMWIOOCBTgULuWmjwOIQyWdH9oiF/tW4bmGFzrPfLupRwThbLYAaPk9jbeQ+e51KeT6v5DDFHnV8Elqx6Mwfauq4Qf2EZ2COipSLEKmhsG+22lsrTkqo+XYswL6+Bq2wFWwrser8alrS1CiAlDrW/WoreWlG1UHt3hczXHIugJXl7YM9oylJ1tN3P2jifINfFvpvLPg0lGBEtA5PpmIUddLo3yLsSNEz/LlRQMVmGw5Ugq1oY+kLMkZftbFVZ3qeFoMcDmTyN4HmCf+cMfjwDXrsH9gT2TggiIvAmWWEzst0zIkTVPKfL7KUNaumaWpByjxb75JyP1kHUwTNj+1bA9u2Adz7bY/fqgCvP8EPAZjuh28wInhFDL+TXnqAKVx4ieBMx94C/dql9hdzVM3ZTuZbaNoqJCHOAm4SMnTYQ9WQEuitC7Bhxo8cxeIiAY8TJg668qIqjnFfYcukXm2c4kiiCzzTYL/uTY1AXEZNldXxJrJh9FzHvO3CyQpZzcaIu7hjY6QkA6BjYBNC9EUMX0PdSx/XYY7/r4XxE10XMs8M8+0yAhp3PbZl2XlSuDoh7D+rEornvZ/Q+IESCd8DQzdiey/36oN9iN/bYPR7yOdK1g0v5etVWO2yB6W4E3R+FEGYATCAf4fuAEORchrMJvKWl43wkTNc9cO2BbbJY1iSwHmKLPTn4nU8kbSLaOxbSvZP70j3uROy7FYLfBVH3xg2DNwH+LEi7qJPx0HO+huxZrmWUHNObfgIzYehmzNFhmj32U4fdo03JpQwgJqvucRY77HsXO+xnj8fhTIjrgRC3okR2I0mfBJa8u9eE7jFhfImkjR1n8jp2gAPLQoNJ2uYmIXwpyMILN8mYjoncZS/HFdVsGoMVAav3hv4XO8CPMp6BQti6tOAldmVRSOjTWFWS0SyUUDU/kD6bHMDEieiNEHJXnxMAXIhw1xN4P0rO8aeBDqj6XVbvVpOKVqVr1a6td0ntrAAs3yN2gdPCfSORWNY1A4Zws+XYelqLnhpqzpOEaLb3NdvSO/FAhauW01qPtXnWbba/7HFaTmtx0imbY5tKQMlVc4xtX9PquyKqj5PahhhXMlavjSVwTV83VcY85X4oRHss+1tL6YUNuBlTpjzq0/yk1a+mjUeVvwo75pYnvyS1df5ZLRRothlYKn+1zXZuaghkXUy4WMTg6WAuU895gDT/tWWhzK8OFlr6NLeeprKtdlnJbjpmvtVSGNvfjs17YzxO9mp/eL8kkd+N48CKFStWrFjxQuFXAHwDwH8VwA8857a8mAi/9V9g+pVfAD8+kpP3GWHogH/ip4DgvwGE/xf+6heBrzzYAj/1+4BhK/OYX/4bwBvflAPuvwJ87D1t0m9L/MEN8FM98K9cAr9h/7yJAH4RwIPn1LAVK1asWPFM8MEgfCuwk2D2gWq2pfhtBVdqMvBYAOYmLFQ6ppybylsojW+pKDimhngXuLUVDJmA5MnfG21q1aFkr6qC6ZDkPFmfo0M7ZVUEOz4MZC9I5+ran6qzZTt47Li6rno/m+uP47JNtR31sXocpVTTfLwd9bE2dx1wcI2e1g7oRjBn21TanwFDV/JoJktY0ntGobwjc1LNFsLLtl8JnGwVq1U6Iek4kZpuH7F5W9jQ6V6P+U7Jy+gcI/ZidUx2LNl1DhoDV5LOtDGTVvl/8i/rv4lQY58eBzD7OBaVpFo4RwJmSrlkTd0k9WRDd3vpCCAfhZhUX+zMoDHgGd0mYJGH0p4blb4jo8zlbM0c4Rxn22Fmsc5GJITgEIOTulUpPKcClfhz5SIxAWF2OSX6PshCg5AIPkeMvgsITJg3HjESeHaGxDN96YA4MIbNjHkSO+jsRMXF6po8J0t0c26RJH9vbYld943WqXF1AtBH6OICUVWnL6qW9chq6lxv2o29KGnB6UpGuc4xqs01wztG7wPm6CTP8FQuEM2y0GCcPabJg6ND3KZLnQh+1j730j9AureZ4dJ9REBSn5MsbnC8VMnqycdC9ub8u3p51crZmf3Tf/X9mK9d/oJFHl65ZKLGrY9hh4Vbdx6vJARxU92r26J+52ztnMnjcSqLqJ4FnmJF+k2WvC0V7MLh4RSS+nN535vybnL1eB4wZK/NfXxy/4RWPz4LRfDRco5c75P57g3p+b5RMLQcVixRbPdpWYffptyb8iTbsVhbj8PMcSuC9jZgZlHrNgjUTO7elMO7dv+xqVmexqr5Nudw4u8BtotDtR3AM/lbYMWKFStWrHj/4zr99xWIYe0nsCp9nww8Pga/87X3vB7ngFfuAqItfQsfccDkNwB/G1e7Dd55DOCdN4CHb8kBZ1fveZueCLRDv/1b8MOXn3dL3hVeccA9An6sE1LgywHgS4iy90H6d8WKFStWvLB4oQlfrkmqFHAhq6i1QZhaOdsigG2wpkvBoGAIuBDFYleDK84VRTHzcoV/jEL8dL6QvnU9tWIAKCrhGMGa88sod7MFoyoPiEpbE5l81KZOz8UZRajaNwOLYO8i1y9wGAy21oFWkUuFjFmiCkZ1VmERTPSeTZBX+8SosjVQaLctbKCN0keRFSNe2IRgVURdqTf3W3XuqoxS1axPxGwwZZ/KY6hqXjKBRKskUtQ5Fm27TVCYdYzAkLKqPI4oKiS3tApl5qVCyd4D9T0CLK3LF4qUKghfKaKEuK5U7BXio0eg62v4YQCfb4G7W8ReVKHcpfslpGMDRJ2bSBo3M5gjYudBHgvLQiHjhOAJvbKCSXUIQhgcKDB8T7jzjREX3wS6qwFXH+5x/QmCf2lE1wXwGRA7J5bTKT8rAsGNDjRJzl3NrRtT96ni1k2Sm9cFyZPLhKKc5EQuErLymAnAwNkSN96ZQX0Erju4nZPctEqkqW3zlEhsx9KWlKtY7IZTjsuk5qVOCEkOJGRnP+PunWuE6HB1tcnEMDvOdVjymtL5cycnOcUBcx/R9QHDZs4WzGDKtkxEgDubEXcdaHTwl8LSxS2nMoFwR54J875DGGZQP+P6apMJqZgYws4HbPsZd1/Z49Fug3HssJ8JoXeIvYPfJZKQAN5G3LvY4fH1BvPkEUhsj+fRJ6IXiNEJGTw76U8CXB8TOS7lwLGon4MXInh24t7ep/4PJOOyY7ghIO49MLvS/5ODS+KvcCbKcD8EyTs8OXglhZOdN0Uhb2kSS+j9rhciPRK8i3hp2OHr+5cw7TrJ/+vlWH/pEUfC9WaTGdWHj87hfMRmM2EXCDyLrTN3DLoXEHYeFAhxkjYwKYlLGB4QYgfEjYxHuX9lDFBMuXpHwCdlLztR2YMg4zcR71l1myzN9T7MUCJYLc71WA/4fSFxxao9XZpE1uaCGImcBsJGxr+fOD++dXGIm1hygDPKuzrKwgp4AsYIGmfg4eOlYu9JUacasO8US9A2cr8ulI6qYuy6soDn1AKnUkibiDto5xFCryZ9b7ACXpR1SgHcUn7a89V60mKtQpBW9sK1IrVuT8uWulIG5/YoamKvdcyx/MNWdWqJW/NbrVzNKt56zsARHI9Yfptz18/kfZrH8cE4Oijj2PjJc6lGPbWVdn3udRl1W/Oc2XxvqNMXquY8BlJ90RVCV1W6RsVOvfkTJsaFo0lOT1JDle0OZk5dpWhRBXCMMmeuUpCIk4k4tpB3pwnb+m+R1u/13w26f/05BKDvzaGJ1J3n5fnr3yUxHi7qW7FixYoVKz7Q+DMAXgXwxwCcPee2rLgNfvcPAj+FPYA/jy9+HfjzvwQAJ/6Oec5w3bfxyqd+HuTffN5NedfwAP7H58CvBOCffwjMX8Fq47xixYoVHxC80IRvtmpsqkSXRJaofuMhKVvbq9Wr89Wauc73591ScWAJYHssUSEmW6iDOtU2suWZvL/5jG9o/0FuVoNM6Fr75tqeGSiBy1auvzqIxwxhcw6DhocNsAFiWn52kP696drWwW79XYPW9fXUILwNLtpzdjgMGutv5IQvPqXCqcnfVr6+xblUAeibFMINi8nmfoYMZs1ZVy2MkP0b52LHpFXIn7ATtCBHEvi+RYCRQ0B85wEcM6jv4IgQOweaYs69q4rQWJfHgJsihPEBsnIWifRlUfspaQSgKGuTmpiCkL9nbybmFR12kbA/n+E3SiiU+mhyQopukiozkiwidgAPqa1EiKlBHDgfT3Oj/XNpU+xFfRm3UfLpBi+5YbVpEMIr9si5gJUsFgJYiMLZ5Bsmn0jpqEHwVDEDITqERHzmv6nYnKzyapRIZMdAH0GJ4NQ951kaF6OD74KQjNeDkL6JAKeREM6iUY4m3WbKD8yTw+5qwDR2mPce5B3mzYzORTgXwUyyRoPlleUco7+YME8ejA7YeVHFplj4NPtsPc6ciN2JgLMgfQLAeQa6GWHXJadSSsQugUcn6zmS6reok9M1R+r7TZQ+8QxMDu7aicW3kreqyE77AZC2BJLr7CDlKckM6etZnatT3ub91OHBuMW864GxkL02R2686qAJcOeZQH2EO0/jzyerZp9Y2C6KGvdcxhomB0rW3WEoZL/fye5qWy5W5EIccyikrDgxIOftLYrfxIcpqauPsVOPhnTvLpTxVLaxN+OVhAB2TMmuuWy3NtK6MMIK3bmTnMwcGBQiaArgq+t3p/DV95/CkL2WKMuLcPRZaYuIDCU62XZU6z2qz7Vg3iP1u1u3A8uFXUdcIhb7aZ1KfNrvy0a3v+t+LVL1xPejpGdrPmHrPkU62223VdQ2bKBbhKf+vrieNdlbt98Q1mL17I4uBDhlQX2UjLa/GyvkpTX0oaXyojxt/5PkzD224OA26l/rdGKOWxC3rfvIzF2PKVozOdpa61Dn89X0KjY9TDW/z4Sybjvm3HNquxRkzjUefm79DZB+X5ypc4frLG85Z1uxYsWKFSs+OGAAjwH8RwA+C+B3Pt/mfI/ge+B3/4ENPvqZJ5izJfD+EtMX/yziG7/+HrTsZqjJG8D4yEvAz/wI8Cu/Bbz16Lk050YQAFBIrl0vNrTv3RWAvwvgjefcoBUrVqxY8czwQhO+ANrWr1a9a/OX6vaWujfEQjTacpTsikUxKQrZJGGyBGhN+hLJvvMJYvMmu7VjARurCjDKXmmGKVOJx+7IpdZg30J1bFUn6Xvnbm6v7WMbeaqJXVtGVhwfBjqbJGlt85fraJwzmXM+lXvOBiKtaqj+PddX5RSsy9BxdIMj4OLYnJ+yOsiqnOu+UaWKOXdL7FMaf8XmuVqQAJwMCC5sDw3pSzFKoDOaAHKuVIgBCXyrOurEmGEWpe/Qg8424I1PJJkJrDIfxuVJtrsZmcHhDoAGYfX2T3zwYm1G+j0SIQ6ixN28M4FE7odw7jChEzISWj5J/tIZiIOQcu5SiCf2kByvas2bbIojJIhOEdkCWIvLLsuqfnSSkzcOEdgEITAnIR9VBZz3TWQWBQCDBqPlO03l3AEIyUUMnkQGzY5BEIvfEF0mFA8W0TKV+9jJuaGPQiJ6xmYzIUaHEAhh9nophYj1ATvS54qcrJsJ80UQwjGQ5G90EOVxJHAgxF2H6IQ45SFinj26IcI7xjSLSlce9QTnGGdnI3auxzi6dAFK38x6bkrUzgSaHLANua2+C/CeEXZdVkIXy2ICaw5rHXs1YZmIU+ojHDHiJLmEY5cIXy3HMTBEuE7JI6mLh1iYT5Jrg0g5J7ADEFPO4Sl4XI4DeO9E3asW0pSIX4aQzR0nxarUE7czyDHIJ9LElfEGHzGcTwizR0jKZiYZ32rx7PfSJ+Gck3IdKd8uwY3lOa8W47y4z9L7yAMODJpt35U+XY670setRRw53+6C1ESxcTb3liroiTkRzyTPESWGXMkDTJGBOSBeXt1MAt6EmuCp0y2YdwfbZ2hjv2Ze3FZaAF2Upc+/BrkmpFhY1nObc7VKTftdcRORZwjRG6ELqypS8pnCKEhv066Tdswo17NW5zbz+IYg15RcIVq92V/f6y3FsMWxRXSn+qwm+evUF42yjpKkxwjzmxb3tZS+SirbBYf1GDdzsObCRH/D2LJz5Ra0nN4Xpaw0qvSB2ZbdRGqyVudK9VyrngNZEtl7OaeWhXTd7oNFb/W8cyV4V6xYsWLFCmAH4K9AJjqfR16d/QGG74Af/9ke9z98e8JX/s6dwNfvYP61vwhM1+9hC2+HV+4C9+8A33obeHgFzLeNp614d9gB+AdYrFtesWLFihUvNl54wpeymqIiUq2VLDNIZwtEwDQXMlb38y01iCFAM+Glgai4JALZlGWDPREHbckK4RAPA0P1qv5E5iphlwNM9nyrII/dhyFE5yKQZoNn3gHei6rJKpGt2mKeU/CR5LPtn1rl7PwyKNciBbuuEKbO9KuW7bwhBBoEcCZ0a/IyleXT9bCWz1qWVTWrJbM9Zy3fm/Ju+vugDk6PptCWYkWxGD9VuyIvbSetnbQdh8AiIFnKTuoPG6ltWQra4KAen+olOzZNMDKrxvM9Y5Tf5nqJWsnL2NHjj5C/8cFD0G4Pxx8CbzeId4aswo1egqgUuFyLuQ64OkQQ0DFCZ8hiDaqbADObvgs9IXpC7IXAeuk3R7h5wP4Vj4ef64FNhD8LCJdqD0lwIwF7QhKbgmaCuzZqzg6Y7wU59RmyfwD8jGLLnETJQp4JgRzvJLnvtUf30IsdsJLXLOpV9ox4FpNqOxHCJJbBwQPhDEL6ofC1oESsQsrhyQHBYd/1IBIyEMxgikI6pmMygeoZ5IRYdJ7hXIT3EUMnJ3x5PSAGD3KMafJ4MF6IxXNS5ro7E8I2AJPLKlhRtzLwoAd7hrs7IY5e9ukiwMDu8YBp6OC7gO1m0uZjnj2YgZfviSX1ODvEPj1XGUAkzLNHDMm2eUyE9CDOCBz1/OQZ5YYgRKOTx3XsOLWBcg5ePZ6ZgAHZ4hoE8Oww7T38KNuytXQi6d1EoMsO8WLG+fkO17MDI1Xmkzr4nV4sls/L/RMvO0QH+HOxzB58AG0DeA/QmEjfTlThNFNRkAfA7wgzA/1rAWH24NllQpgBYJIFDOPeQ3M6x7MAbIUtdZcewwOHOPBizMYuLVSwpC3S2MwLcdK5z8iELVtOPo1nHWexS8dQKpJRLKF1sQQMkcsQC2kkojcCLhQyWN57hQBGBPwYhdidq+dPFHWve7QDPb4qC7ueFk1L5/Q1CNmaF8PoPsmet0nutUiglkWufV9X4JgWfdjHvz2utoG2xKPd16qE67qOWScb2//l+YU20XpMKWzr5gieOJdLXScKZ45Np4wDUteSyoaoPUb+HiOEraoX1C8I2pJrePm9NQ/gYPpiocA+kmvZHjvxoq7F/svGHi54q9tWTrgc1nJ8UaRUEwcEbE3K2nQUuk+tdCZXxqfaJAOyMMiMgTq/Lpl5+6k81hzCgcuN/a51L0jX6t6j/z97fxpry5Klh2Hfisjce59zhzfV0NXs7uqZPZFNsjk1xaEl05xkirZhyPRAWBYI2DBhQTYE/ZBhUAIFE6ZtGYYBSWjLgyhLFj1QBqWmbZFsioNJszmom+yBTVZ3dXfNVW+40zln750Za/nHihW5MnbkPufe9169uq/yA+575+QQERkZmRlnffF9y8/jPWqCtbF/ZrU8c6jJ12nbcsoNtbCO098HS4S12VfncS8pzclk357bFpeuWLFixYoVHzr8JIBfBPCHAXzrB9qSr1UMf+/PIH3+p4Fh/0E3ZYbf8f3AD3wS+LG/80G3ZMWKFStWrHg58VITvic5fIHTFfBeUWo/V4TZbN+JmhNVwOSMkqBl51yXYT97690XXZG/EGjyecy0jlvUD89bfyvgC8yu9yTwtqT88GWWkxfUKbeVxzIpPcgYK8zHgC/P58pt1WUWzy3cZh3ZavO5/XVA9dy+hXJUzTqRPh507t7MD5z+X1sJVuNkFsRsqlMqQuKMUktSAg4HhCtdWUrbCMQAMWV5QFlxKEQgLw0UJXRVcE8zJaCRUMUeGo4Dl1xWfqzNdnbzTAnV7nHE+BCQPitTmVTNm0koJ86EqSZpdJcpE1lV7G4zieWdWsXsdmFlOzLfiKwZWQMgaP5RI/nCkHP8RgExQXIDiRghCKhLqsg9ROAYEA4BfDmCoqpyOaoUuvSqlCuD98ENgRGiXiCbLbNZJ6fJgjZ2UjopRgb1CQN1EAqQQkxmglScEtcj57oVBm6YQEEQIyNlEjZZP0VVxDKQFdZASgQKDKofYKH8CRCkFJBSKPWWx4IywW1cg1+QAX33GTFOUbKLb2Yr3WunKGpF75PkvghRwJzz5gatSyImN+By+6fCCFB7656RxlCIbYzToSS5Tx1DejxGtey2cplU7ezUzHryvI80R3Ees/myJUDzS9O0xkkHRX7O3LWfWjKTqs0ZMwWu/Tx7Hk6bM5UD90y5birW5gJY/u4pjy8mFa9T3+qw1u10OELeTe7euyDfYGk4TdymIr0TauvbFm77DudyZvDq4YrYezeYEaxLFtN3Kccvlrp75bNzrP8XVdW3fL+aBG2xaha3iU5+buX9vdslnPbXpBpuuIIs/Zzb2ry+WsnbIqxvIxJb97XKR3zrsTM3lelnP9f16UtabTqZF/sqzpDFM7RcUgz19vrYpQV3rQWbS3W8CO7iJLRixYoVK1Z8KLHHJF0UAJ/Eh13p+7yQ60eQq68tH18i4P5Op0fv7q+NFStWrFix4usXLzXhq/atBBqzksZWz5ulWj5mprAlgmx7zefL+Z+3My4BTczJw3HMgZk6GCqTZbNXAfs6j04V61fqO7JMREBngjyzQFVu6yyARTSpXLJaguw8IkiL1LUAsSegPYzEC6eqmdMGTooZjDKd41HISKf2LP3UUJratVobTDFl9tRejeVttf15Hp7ML8rdWBQmpliZtdGrqVpl1rl0OQChERz1OYOt2V039b0nTOt+sjqcPTP522n1FHKGVTHmbQcDlXvkz5VaXR7MFrShKPGBycoqfLISDdM1FKtLT/ouKOhEIOOI9PY7CDc3CH0H3m0gMT/TTFkFaMRaDvJGzd2JEUCkrKicVIkSqaRfDWk6x5NIABCPSlpJB2wej+ivAtKuw83HOuwDQBcj0DEYnZJ3SQks7UMg5by58UofPBoJdCSEgQohlbaCuNdtTNN7Ru4JpGfQPpY28Uafjf4ZIW0F44UgHFXFGQ6q1EwXjLAPCAOhfxqQNqJ20wFAD8hWCcl+M+L+xQE3xx7PntxH/yiif0q4fhARL0dstgOOhx4Mzu8KUqUtT2SM5C6PHaPvx2znHJCy1bIINIdsJ6Ce4XPabLYj7u8OuNn2GFPAfreBPOsRr0LJ6wu79kysK8PJkEOApAjJNs/hwZDHG/D0ZodxDAgXIxgdpNM8xgCQhoiLe0cQjXh20ykRyqRkc1SilW860E2A3E+gqEykqp8J6EQJyg4w5lD2WaIaBOgF1DG6PiGloMR0VII0HDMx2gm4z48nAyDBtks4dJOtdBn+2wREVeGWMXCZVGkMIAZGHxN2uwF7IfBNRDioSrgsFsiLCQBCutD2D492Ux29AAyEfdCczFEmktZI4Lw/7nWxQTjmhQSdPlNpB3AUVTM/xqTeNRBASa1PJVB5DikAAnKOHADnfL/llW3Eb/5nnHFR3xEwy9GbwZEg/UTsduPUF0b0EguQbZ/LQg0WbevIkKfPIFfXeNcw1t5yphIcWVZ9P2w7V99Zu0Sfq5RFSbyGHS75b799r/K+QkLWxKr/HtUE9AKxOXNxIDcXah3fsBYm9w3y1wVgIlmdlTEF38bTuceJKhaYO1HUCtZGXlzqO51/LaldrU0N++OTY/38wdpFFQnscyznPiqkcP5um4J5pgp2uYSb7fPluGv1pLq/xtn11nmap046KcO2C8tsYdLsfnPIlv1Vv9cq9HpxpVdlNxYMFlLW5mt2bKjmx5bLtiKG/f+LgtaluiglZEXubK5uStyUgJQmQj3XlwstL7NSjzU/xpO/Q8ocvi7HHFY8CZ3S9PeCPz5fY0nZUdvJz5yCsGLFihUrVnyd4scAfBzAvwhg+8E2ZcWKFStWrFix4quAl5vwrcm9mhRtHQPMbaA1meUUdPLq32L3TJikTq5Mw8nK/iwvsuOM2KtVkM7ieUl5MLWpUlESTfnErKxW8Dbvm6kgWjn4WoHOOr+gBTTJBfCW2lvq9soMT4DKpMg9Ce65azJbZh8L9wF0b1Xt4a+zWBUvqYIb5PQsaC6nat/WtbdUrmeP53awvKUyrwPlnuxfyCU8u+dprlxaVLMwz8le//z4cZjHQsnzu3QNtcppSfVum4YRQgeEZzeZjyek2GX1rN4DcWNGVYhKEIYk03qNXrexr844j1EyUUUl9yhHVcVyDIUs2r2T6xg77L8x51wFShS3WOgCKGpeI6wKuayKW1Ucan5X6SSTXS6vaiKEgzaYGOCtIO1EVccBRblq9Svxm+sImv9XKNexS8CG0V8esdsN2PUjdt2IJ1c7XP5Kh92bgv6acfOrNRdvFxncJ6Tg8vFGUfKVMNk5d4yuS+hjQugSrg89DkOP2HE+Zuob5gAiQczk5s2xRyBV6PabEemhgO8R8LTP/ai5axHsHxA61nYwQUYu1tIhqGp5HIPmuBXtP8pkLqLaVI+j5vHFcVLx0iFCgqhCt2PIZQ7Qp1CU03q+2jfLsXpuCXqPgubkHYeYFyOoSptFFyVIJ5CNAFdK8Hc3wPEi4jhGdF1SpW+QzDcEHLI6WqI9+1DyPE5jOpIF9/340jZJFKQdMutZkbsxPzek+ZsBIOyVqeWtlkmsZLnlHrbFEYV8DTrI7YmVTNia7TJIYNSFPVfG+c8Xp+TfGWrxnBdwkExlmzq3lJ3rC+yeM9ZzNNewPifWdggQD4Lg7JuLKwCL54pBQwIdBsjNHnx8QYXvuW/3bVh4D9dkIgUqZFr9rTurcLVv9tJirdsWcd1le4sorEjEGWnY2mbfzkJeNojBWZWurBYhXBOtS+ebNbAno1sq29vUx1X7ZyRnjNP+O/b3jIi1fTV5Xp0z237ud983rXtZOXNQxMk9pYi5FXV9DTWJuzg20e6TmbX1nERt3ZtZ7vCGfXMNEZmlJ6EGOezJVKrVunXqFT2wbD+p3+f3LW5CPCeOq7Kl5f7TqtdQH+/qENe2FStWrFix4usTTwD8R9A/FgnAjwD4yAfZoBUvKTi9jidf/DewvfcXcfHqv/9BN+c9wTc+AP6l3wb8lV8C/uZnP+jWrFixYsWK9wIvN+HrkdW+gCN0gdOAap3Pyo5NWXFbk4I1mexVwLY9+CCOnNbRxUwq14GqOwZg6kBR3baT45eDXSfWvlWwrZkPti57yQoZOCVKtbC8s01MzrbVKqBSz6mKotknvuyZNXMVQJ3lBjYFc3J9ms8JEeBxCrb7fvBl19dQ19EK7BUFtTu/Dl43AqUz5UdQddfsvjml7gnqfveBzJmC90ywvBpDRj4TkaOE3LU0rC2L7PHk3iXwEaCbG1AXQZsO2HU6dIzg8ac4m3UlhFUpT4xZrt5CxgoKiaq/UHEv5i6TYSkgjIL+GQMIoAQMrwSMlElQ0ERGWblMc5ta4/5znaW5UYk36aCko4l6PeGWAN4A6ATc04z4KmRzzg2r+U9Fh6bVs2GEXcLFbsDFZsBFP0CEMBw7PPii4OKthLhnUGRse80Py6LEELP2sZK9MtVnRCsJYhDEwAB6yBiATrenMN0cs0KOkfO6jQAEzaHbdYztZkQgwaOrXvPJSu6PTBpTULLTTKY5UuYiBF2nZOkwxKwuzhbEIymBmfMMc7ZsppEyaSmqZA2AZIto6hg8ZjUzk5KsHesxI2Y5fKe+z+OEZLJXNltuI0ejTOQtA+Gg9zdxUIttYmy7hMSEkQOGrkNK4ghWJZ2JpNzXUKyaMSlVXc5l6XlalNKz5ks+kKq+u2msQXTsEAPSUX4mCGFwY9qN5ZLD17qBc/1B82pbE0mmeyURRRFZynQwl3B79gSq1J/l9xX9lk/fddf+JKWNyH1hhC8JQEkQDwlpE6o6q4aMDDoM4OMRL5y/9zYL3rtaDd/FzlcyU25oLQ66jZw8Z018xrr3rpbLM3XuXbBkJ+zJ05YFsOUHtu/OkjK5Vqi6OsXUmk7trNtQzWEa/eIXYJX8zHMlbtMe2uclvku6hpYldD3Pqvuo6ouTPqjvzWxRnzumzHMac5+00LdL88+7WIBXqTJO5hRWTuOayxwo8Ynq18+Zys9eUdxcJ3k6V/LzrCap6/eds342+/hzxLSfg9Xq4CVr6Qbpeyer6hUrVqxYseJDjxsAP5F/JgA/AOA+VPH7LhZvfk3gCA2W3PugG/J1AeEHuHn0z4Ho8KEhfF+7AP7Q9wBfeLYSvitWrFjxYcFLTfiSiFoz+20sOCGxgImo9YScV/OCTglEs10GJiJ4dKSgnc8uSu3J3i7buA3jdHylHihttN9rC7dyYTQd5wI9klUKZAQftQM8rfxmkw3vFPwSSaeBP5HcPXPbaN03BULJrJaJNB+iBadCtqJ0iorpuoKbY5vVs1Pwllx0jqD3yl0L/FlZs7IdeQtoQL++/9G1qw56Zvs+mD2nsAsA+wC7UzOZGsZfX91uC/R6lU2fx1FRz7auJ5RzCFTuWwk8xghKCTBFh6l58rWJjcOl3LwhnCpWakWuH3/O3rkETD0RPlOkG+l7BxKAE9JbbyOOI8IwIoZXIduY84QShAjBgqt9AI1KJEofACFV9tkQCUpMcYcT5aDZY9sxpfoORaUYj4J7X2Zw3+H4sMP1J6cxbPazaqk7EW+FUMu5UykfK53otpSVnGJsFVThm2PAEoH+iUokhwcyWdCOSgyHPQEB4H5SCEvOY4sNo78Y1MZ5d8AmJnSB8al//Alc/kqH137uCgiE4X6Hy/sHvHHvGoexQyDgYARmJ6BN0kdOCMwBPBKG663GmoUwjlHVrSQoeXsvxuy2rQQyAQhmey2EZ0/VXvjy/kGvhwTdwyPGQwSedpNCOL+qIYTxqgMdg5K1G0Z8kLDbDNh0CVe0wfHYIQ0BdCDEI0E60seYAIGoEvgiqUq6Y1ULC4BBbbEpJB3iWdEsiSCHCFyOCJ0gbRgYaZKKM0ADQZ51GPYR2CbELePi8qBtSQHpyQaWH5c7gLb5vmfr63FUotr+z6zvbQqCeKOKXO4BuelUIb5NGFLEk8MOx0OnJPdlKm0KN6FYOXOHTD4DNBK6G8Jxq2ODxmwJfqQyXOMhL3iwx1J0jEkUjL0tUNCxG7KqnFIei2ZfSlCb9GAktP7fxnNZaOGOV9U6EFm0zcBJbl4JANNULueFFMG9b2xhxUzMWV7RhDCIzhNy2gexb7YIwmEE7Q+Qq+t3l0N34XtY7y9WuncgXIvzfT5vRoq2FK9+EZCVUzt0LLV7RhY3yNfmcXodS5bB9fWUa6gIzFvJ4dnCLPdtcbbPMnJ1igDwtrtJCVlgrqikAOq8atO136up86Klmfq36iMr9yRfb7ZnrvtFWEDOI7qtfua5RXc1poQFSJgI62b3Zevq1qIy4Wl+ZWOlJri9orxWC/fdVE7t5FKphM+6ysz2zdOHzBxp/OKGSrl+Mv5ZdC4b4+m5+fiSsqUBX1ZtFw2gWEZLSjrvrY+3RZoh5Pke57ld9XfJVKHur/8uyGVMJLVbzBfyu9tS04QAimHaZu0+pwpesWLFihUrvi4hAP4vAL4JwH8XL3lIFMCPA/gHUMvqVbW8YsWKFStWrHj5ZzcTjKxdSlRVcsG6n5dWvs8Cpxa0ciRhFVg6W19LkVvUmQvEmz92CUsKzCqPWAlWLdk2n5yf2+TzpNVtaVkNilqgktXf6tvb+t3aGe9wnL+ftfqkpfC266+JbH/OogLYCOBG+f7Yc4qmOoC8hLvco/rYOkiLKkgptwT8WtaBi3VWYzYT1CcBV4+7Kr08RCD7AxAjwv4SIj3SZQ+YCrCM6+nnmbI/5/NVu1nMbWXtkTb1oP2eeVsjcjkSQq5v81TJ78NVUEI4WzUXC2f7Z+s2CCdrha1csmMBVZxavf3UPCWEkS2rp/KzEFdzsPYykVvOili7T9WkA4AhRfSPIjaPgbAfMb66xfAgoo8JfUjgSNiP808BZbmyQDQ/7TGADgHjMZb9ki+Kk6pm9brmY2AcJ4JFko6DlAKoSxAhbLbKCqbrbrr4TslPrShfm5UhqhZO+V5zCpBDLISfWVGHIEimzjXeawyq6s39SCEvDDC5LIk+o2O+JhJV0HJQ0jlbepsNOACEnhG7lJXHSpKnTJpO7c8XlhW/zNqAhKCvSg4QzrmT86GUnLJN9BwBECIjcEAq6mGaFlvkhQyQqSyO2b7a5OeZbOWc9zcMSsybUF4igCATcYvpWpEXSYQRCAmZPJXpmbFjZT4MZs+CuOMq2C3w+8tiB7tFZbsRNzJZOUMvxOcJpqxYL+8McvUwQMMIORzOk7DvBWpl7ovgzHv0rIrvtvdvPTd4kfc1KqL3DmU08+WeQ+1GsnC+z1Fbcu8+zzV5cteT5oYlNfLCGJq157ZxdpdxKJVbRn1uvtZTR407Ymk+c9sccmlRgpvzUF44Kdlevey/S/nescOUtpZfXRr11e2/bby5hWxzF5Xl+dFt1tFW3tnf6+2NeZq0/mZYcslplT+bdKxYsWLFihUrgKcAvgTgZwB8AsDHPtjmvBCeAfglAJ8B8A6A9/nvma8yNuECv+G1H8EnL3/tB92UDz2eHICf+iLwmccfdEtWrFixYsV7hZea8JVM8pryD4DaTEojsEHumBhAY5ryw9aBoJI3NrigVFUWMK2iN/XvjHDK53qVZKDMBtCkPKhJ0Nr616skvd2uiKptw2n+XwpB948jpChkc/Ayzsm5mdIhk7WSWPugC7n8TpWQ4zi1LzklsOVKTGmJbp+ujXOkvZAUjYlpbbfdJFlluqc+D7C/npbVc9S+OblXzVzC+fpCrRJpKLoMZnk9a6spg5MxTVP5Fli2oHSLdPaBVK80tnsR9Pdi7Rxo6mthvZ/IwVaeLJinrpS5atf3pd/eIOy9YoqYdYy0FEmlS129HDAxpKcjh/d7YL9H1/fAg3vARa/ETxK1omWAEoM3qv6Nh6RMThcQkmhq1YSSmnVm8cxzooi7TGYly+9rRJ2es3snodsHDPcDDq8Jxlc4qzatQCUmw6AsmcS84AI0/e0V9DolQNWlY1brkhKVw8MEErX+lQSAVY0pMat5Care3Ahkl9BdjqqO9cSmENIYIEK4ihsASrBefIlw8RaDmLF/vcfTb4q4vxmwCfp+uaJNvj+S12tMjJtcR4RDQDwQhtjjuIu4eLjPynFAjkGHdc+zISwAjoeuDCXJStbhmFWqXcKDiwOuI+PpVa/XwYS4YYAEwoSwGyHbrLoNAKeIw1EwGnl8jOje0To4Atgy4oYRI4M5ateTAIcIOhJkx0XBTDknsPh8tYkQ9gEco6pa+wQZOnRXhBFB+79nYMOgnnFxeSxW1/q4COgYdJw6i2ezVdZ+0NzCJFKIXhmUaJagzCaNedB2XMhbArDdjKqyHoK2m6HtEQJGs2Um8E7LSpeSXQfs2ydIFwK5SAAB4Ut9IVklZnLdHhPR80iAMOYFFAmIexRbdAEVArU8CvZc+Ue6IoIlTPstj6/e0GwRHaf9YczjrEPJvW3tk2D1SSG8Kc0JZ8oLkCSG6bvDAkoJcr1HevKs+f5p4kxaBSX2lpW+TZJulqLgVJFb3pcty2av3K3L9u/eQCduC+V8K6Mm23z7fVkt4nIpj24LtcK5ZS18DvV3cOH82XepUs/6Y4tCeaE88Tl+a9R9zFO+25psrfMJGwlcq35P2lxft//d1N++ra30CVZmDPqtn80pG2PJX9Ps+mQ+TloK3oTTfvVtDvl7AExuMU7NXl+fb2chi30aCbsm167iXFNdSz1Pns2D6oVswJS3183Xi6NOjNO+WT1uvmREsfV3jChK3prU9e0wRbAvzxx/8u+S0ul7iDkvwpKpftsXyoRmxYoVK1asWFHwNoB/F8Dvzf9eNnwBwP8R+kfT7gNuy3uPV/uP4V/8rn8fHb/6QTflQ4/PPAb+lb8EjLf8KbZixYoVK14evNSELzAFf2fWzpbjCtDgR2VBW0I0MSixacEiU6bOLJurCn1gs5RrQTNHlNUq09Y2O3amGK4CPXYtnojLASHy+YZr+10iUNdNygALWLm6jDDWw107AgFdV/b5fGdFWUGhBNHEzi0Epru2VkDa52+tFdR1kNEreX05nnyslSLnUFmAz+yhZ6rmBvFq8KS8T/tYyuJ5ENysmJfy5tXtWVIQ+5/NdhIoJO78OlPZV1DdQ8NJ3mYfcKwtBn3Z80KmYOXJrmwF7uwqT66rfg4c+MlT0Dii2/Tgix687SB54YTEkPOIKgkstgCEJdu9UiGjQtLyC2GUiSqwWjcbJCoBRdk6ViIhbfT3+59lAAFpF1yO1kw+Z/ILOTcvgzQHrRF25lieyS8JAs5pgzQHqRLIxfIWk4qYCqmbNU1jwHjdqaq3k6K0LMRetgw+HjrwTYeLa92//4Z7ePrNEc8+yfhINyIQYxOAXTeChXA8duAUkXKOW1h+XLtVhBlpS33OM2t9N6r9M20YIQr6zQhOAcwBcatMXNcnhEyAHLOtMW2T5gNOpGpfkkxg539ZIGl1mRWykaFh1Hh2ymrglIKqfy03L/R8Uw/LEJSUiDIRqjyRonpfAT5EYCMYHzJkl29gIrWEHgIOPaPrE+JmyHF2ArpMmmelLNFU5n7fa58S0HUJzGqZrbmAqdw/GPGaCHSIGC8jusC43B4RA2MYIpgEEgLoJiIn0dXczyQlh6+2N4/NywQMhHAdlWAmIF1IIWeNUA2jjml7NkIC4jWpsneEksoyNRXIZDtQxq9ETLOL/KoiUyNLfhbtUrMFO0dCSFOdtujCCOVixe7O9cSyEb+UpBDAnnSmxDoWRBCOCXR9AIbnzN1bv6Pcd1eWyLNbc/y670ZdnRFnrW/ci6hWDX5hkifz6nN8u7h1TY3vTONais3y86h6b7O+PkcWeyLbL6xaKnvJqnmJLK7LqIbQCdlZTplI3iWyt3HSybmF7K3qmLZVRLXwZBPeuobWWLqNwD9DglPguZ1ysSrP7bKFaa3cwHdU59aLFu33ltp9Ruza3wF+4WOtiq2J26ocSWmybrZjPAHsU8nU5K63ez69qPmcy+ZafpGp1eXTvtQL8xbmYStWrFixYsWKDx++/7f/ML7j1/0aXD58+Nzndt/zX0T42Hdj+Pv/TyAd3/vGvQdY5zArVqxYsWLF8+PlX/JNlIO7jeCUJzc9sVeTjK1zjWysSNTFc87V78la236bhe7MklcgzKeBrFql2dhvEySiU4WDtk1OCENTTsyOAc4HmFsELDARkz7guhT09f1rP5vCqBUUt7rO5DZ8LtTqI1/Pgqqr2f6lcoC2UmshR16zffU1nrtmnt/TxfbMSPYwBTKB02vXwnL5p9do4+ykPls88AL3iK+vIc+uQNd70HFUMle0bWJq7iQ57y4VIpeSTGSQkUWMcj3eLjaY/TNQCFjJSiGOKETV7p2E/gkQb+YLEUxZOJ2vJKy3/y3EI7njOlEyMIiSmmKNnYjhyZLW5fPNpCMAUFRylbJ1r+RcsWkM4H0EXcdiDb1/o8P+DYG8ccQ2jggkCMSIQf/BqhxVQcqJTpTMgJYtDK03/4Nx9mMox4cwtSvEhK5TslcflSn/b+hY7aijKKGayd/yL9+oEHkafilM6ul8b21fSqT94AlfoLTF1MRKJuvPYn1fyMtcd1BFddgmUM9Kxo+qBE5DQDL7Zzst5nvq73MeP3yM+mogQYyMGAWhsJlusJYboYpvzormbUzYdLkfu0z2y0RWm9032ZgqlyJKuNvxRR0sqh6PcONwInuJ9Vq7vSp74yETtJzHgv3L47x0Q9Dxpvmw8+95W7HYzmPcSFtV4mLKte1VwjRtO/lXuk0XeYQkZRGIjY3yHCXWnN9DAu2PU17z9wp3seRt5WY/Z9fcWLQDYL7AqN52S71L7+c7w5OWC9ds7fbtv9P7v2VJfBuWcie/gFX3iRXyHYh1YSn/ynnP26d3bdMS/P31RLU/35HHCxXd/vM5VPWeIKXTBWp+DtIa39YEaSxsK8eGxYVstyK3Z1a+n9vYgktP/to1tBbGaeXz7UtK4Bq28M3+3SXVRqusatsaKF2xYsWKFSvO4QC1eH6ORaBfAwgx4vLhA3zL9343vu+3/RZsL55P5UtEiB//HsRv/qHiwrLi6wsiauf89NAOZ69YsWLFipcXL/2XndJEpha1L5+uqp9tm62MzxFrUzWKAJ0pE3iu3jX75kCYpcgwq2ZgCtjYOaUBOag18jyIMwt8uVX62bJtpmKY2IxJIeDI5EL6toJmrl2lrIBSx0zluRQMDFTsgWdw9sEIEehoKqOl1vAq3YaNJer8I9422lQ7hVEigDpgHKc21MHWlo2zb4uRhjFOQeKuw0z1a7aYIbMUd8mPZ8pxT+xavxdVOQND/jm57XW5wvNrsuNym8nYJSOFY4RZPZMf6wuEcW3zrMdPapjSF8BEbPtnrKX6taa3FDeBYMya2SSeAx8OkM9/EfFjH9XfLzcnzx2xTARU3hZGyaOJCqlUFkFIJmYJhSgueT+JssUtqc0zK+M0XgRcvMXYPgHe+Z6A8b6At6yvByHQwROUSqilkJWRR0LaKrFmil2vkgwjijqSBrXQTRcC3ghkx6Ct2vDKs07rGjOpKQSCXodaMhNkDBiuO9AhIAzA8SFh/xHC1beMoHsjthcDEgdcjxvcjD0e3+ywP/YYxwhJSn7KVQ8a1V7YCEIaCIII6VjtdLMFNBEQNklJxQ0jRLUvv3m0A20Y3WZEzCrXYYjYbBL6mLDrR+yHDte8RegZYZMgO70mHufjMfaMy90RN4ce49CBMzFMCeANwL2yhZwIPHZKiJIAx1DsjlMXlPQEQFEQe8a4j9rxHQMbBnYJISt/xSyzE4Gj5BsEJUUTwNcdUhQ83B0wbAYMKeJZxzjse/Cz3pj6QrLKIYAu1QIaUEVwGlX9zFHAx5D7PBPSQcD3EgKAd64vEIMqqh/e2+Nqv8GBenBO/iydIOwD4hgwZgmuBKD76B737+3x6NE9JbY3eawIIRwcGX4gEBPCEWXxAyXtt+56skBnyyktE5nLcSJqi/o25R/Jbc9dyHF63pKlbyYAIoW4JwbiMD0jIenzO9k4Z/LZnuVAmr95YH2G7TMigjByVs6Tkr77AfzOI83f+yJoWTHXPwOY5W9tQYxZn4hFf45XaBZEy6Pt8jyfg/+G5TzyauNP7UVENWqFbPkGu/31t4Ume2OKUa13be4wU6zy6flmVxzddbcspGubalfGTA27oJBVhxLXZldHfX59D8/lDy7nDO4e2r3tq2+4WVDX5VWKYm87fXJt7v4IT/bRnoz3120q25MxVtfrfjaFNgCQrYipnUz8ttOO0f/X1+l+L+NZuKlQbab4yGOZnGr3HMSPGbPANltoQK2a8+LKsvCNdKxpigYoueznRpWDkLdlnpXjj/HzqpZKt7jteAV0qObpjX6ydlV/Y0hKOtdZsWLFihUrVjTwNwD8FIA/Cs3n+3LgG7/j2/CH/oU/ju29iw+6KSteUiQB/vhfBn7uK1NYbcWKFStWfDjw0hO+AE5Xz3u0lirVqt1z5xTlgdvXCpDWZTYDOS6IUyl4l9pw15X53p5uhkKunikvW9c24YNr3vK4rsOsnOvibwsA3uXYFoHdsp+s8uSdoEV4lvMzG1EI6DYx2kTd7lZQs5C5jbLuqgQyIrcmf1t2k0vnoyJ3fZC8NeZ8YNPQVMSfHrc4Jmt4dfiStbMIZBghNzcIXdTc1H2Y8neb0jarBPUXIAxK/PBm2mZ2tOLJYZnIPMoKzGLVSjm3qtKqCEkQRmD7dkAYCIeP6H0VyoH4TAiWZ86KjlN9WndFUA9UhJ4SRS12e9FcsD2rahN5W0IheIkkx/udopUJNITcDuDwmtr90r0RoVeC+slxiz4rexMHjKNaIPMYNOftoMQjJSqENW9IhbFRx7TlvxXk9ORREDoGhMAlD7BecBq1T6bbTUis+YYpq1FZKOfDFcCRI5zzEh/HmC2iCXyMqlINQNrl3LpM06uVGBQB3ujzwkRAL6COgQ5KMEdWArher2D30Of3leln2bCSlhtG7BJiYIwcEEjQdQljF8Cxm8oykKqiuz5Nw04IMhIkKeFK/jEKUsY2C+GiS+hyzuB97DKhKhBkAjUgK3UBBAZ3jK3VNYTpepzq1a5rpurNNt5kFs5mR+4V6+dQv56dWldVuaKpAOxwew7qf9YuX5Z7vj2JXPL3VqkTigOILfQYEmgYwcdhTgC9B2gRgT5f6wn5W6sS76LQzYt9JtJ2QU167nvXOuZcioHnsY9u4Ox3QBgnee9vg7dq9tsyaoVrk/SdjZPq21V9X31e3FvJ3gpqHV+1/V2gtoKmqG08eVCA5tzAzq9zCJ+ct1DnLY3T/9/FrcRg7fHjuWVhfgZnbZyB2fykTkvSPD6XSS1SVQ8+nfN4cjaTtovz99plqFV+fTwzxNfh21WTz62y7qIWXrFixYoVK74ucQQwAvgZAE8AfDfu9gfPB4vYdbj/6r27z9NWrICqef/W53S6nRj4lcfA4xdcA71ixYoVK7528VITvpQJRvFBm9re2atevdrV9tXWtaYeDTTfZ0RdnSsYeXvMJK5XBdekrg/yWP5gH3CuFLvl2JalrpHGvkxPRvugpnCxTiV/7YCqbizgWgeIvdVwStrerrajJMxyIPrgrbCeYwHJlvrWX78IIGl+f3ziudl9I6dOsnsb58fW99Ora1ttqfsNrt1Ltpr+ui1h5zmCm2W6Zqf8adpd28/ZBnHa5hTVdh11YHfJZtMCh4AqRkCqdGJMStuuK2QtEU1BxtbYLG2dK2F0N81J30CqDqptJUve5NzuJdKXE/jRY9DNHmHTQy42kC5AIhXyyPJ32q2I1yNCH5AkgjtV7RKrFTR3NMXIRSaFIuemZDWhBFP7ZuJqBLo945VfAvavBAz3A3jHQA8lZxmq0DQSTrlipB0roZdISVsj8wojrGpVEmB8wJAta47cIKo4zW2N9wbwECDHCOrU4jgdQ7FBNjVuOFIhmo+/akDYJPR9ynbPEe88vcR2M+IbHjwFC4FT1Dy6h4juUSx/54YjEA+EuAe4042pB8xu2PLT0k0H2TFwn5FS0OvO1sbMQe2hSbDZ6ThLHHBzDIXkTUltpNEzQmDstqPdGtwMW/AQsOdNIbbpRtW3vBHIvRG0Ycg+ar9GQQiMrmOMgZHGCD5G9BcDYsfoujRZX1+MSigfAyCkj1XKquB9UMI431e9UAFdMKhjbLcjdpsBgVRryULYdgmpDxi3CaA4J3AJ2O4GbPsBN4cNhJWUl6Peu3Akp5TV8UGRi/316xfX2ISEferwdL/NNwjleeFNJjV6Rrcd8cqDGxzHiP2xB+1juQYaqZC9xUI5j33N2wzEIxBvVEVLCZBuuv+zhQp2rky/l3YhP09Jn00JpCp71gPFLdYAdHEFYVqAxFGV74UgzvVIHl7WfmJBGPUfjdnePRLCkAnflElSItB+AG72kOE58lTVi1Jm27IidcmZAVDlIDARh07N26zujoQZxQD0U871s8Sqd93w378WMVwUsDRfDGbziRZZ2FCG2nYZTo+nOH0LTiyZa0VvKz+vfQtTmnLDxjjtc32kLgjJ2S6nmWq2CV8OTcrZ5v2tSNhFnCGZb0XVv1LN1WbK27qd7jibnxV1dat8+73pwJJhzi5+IWCY5pnFLcaf6xcXwEjn6s+QmXq7Qba6es6S59GNN5szp1TmKjr+dD5U5sU8Pa8yjBBIeXbn9YdJYWtletTzWp9791y+4Gp76cdhmJ8bAqjvdP5+l/JCwPKqzhUrVqxYsWKF/hH05wF8K4DvBCxfzYoPBgKs/f/eQwT40hXwJ/4KcHy5HMxXrFixYsVz4qUmfCWEmY2zLAVJQ5gFlZuEkg+OzPLX8inJOyNTczmjs7v1//fnARPxa8f7ALK1tW6Xz+tlZbXyAs/O8wR3mFtC+3NqotQCnC3VTTwNGIknuGuykgNKHsk6uJnc9ZdrMkZrgeSut9UWx63tMwWTI8QtAJnSpJRojZ8YVP1Xq4dL3zrr52J57IKftXqq7u9zWApm1qRxncNxqS/M3jnGiRhgl7cuB0V9HruZouScjWELLVVNwDzg7OCJEJVunl6/pAQcDqBHTxCOF5B4H7zrIZE0N6dAyVtM40Ws3kxSCSlJFIdM6BLc85krIkx5fPN+ghTCS2IEJUF/I3jw6YDDaxHDQ8m2wr6uic9FhNoqZgKYhIBB+8NUvbyBKlVLnJ0y2QewU+wCAKKo/XJuvuaNFbX1RM4/fC8hXI7AIYL3Ecd9BHK+3zSoUvZqt8EwRCWRc15g3klpexgJ6UIwXgLjfVZL4E50IXQg/Zmmv8skEWKn6tl4yRiGiDRGbHaDqnT3HfrtiH6bClnKuwP2xx7HMWreX58TVwi7e0eEIKqkTQHjGDFEgRwzURvcvRMlvJkDxhEYjx1McW1K4sOhg6mQ003eLwCOmZDP18Q7VnL0JivoIiAXSUnYIDjuOzATnm0GHIYOIwcwBwzHDnIMOh6YsHkSMF4Ixo0qqjddws0B6PqEEBnHYauLAh6OoH3UHNGiY1iGAO4EnPP0MgiH1GHbj+DLA57cdMCYj9+qLfbDBzfootZ1OG5xvOkz8UoT6Stw+XN1gUAYNVdvGJRoDYOOV+nyWGYB91TGxtxCHdN3Vqaxb4RsUc7nW2QW62KG9EGfSTDAfS6S7Z2hlu2lTqsmAJQJ6XjgQvZClPjVYwjo9Rmj4wi63kP2z7mM2b7Tt1nGGpnoyUzdUX6siU9P3Hn739m5fnGS+85ImpSEzXQMjuCboSbg6nPyPimLqfy+CGrlODuz0Kl+18+uy372//fbPcHs62gpehv7bCHTWZJ66Vqq/pmRxfXxS/bMrq7bVMKtds2u3S3yKn1az9Wq41p9VgjyivSdqZFnJK5bZFa7mbA/zmFmr10pZcsQXuiH1n1eUrHbMfXPRvACp2kjjIQF2iQs81Sen4d4S2Zb5Oavqy4XmL8zLF1LrQaeXZO7H0vWzfXxdbtqMD//AoMVK1asWLHi6xJfBvCnAfxGAL/mA25LG7EDfuS/scM3fOu0QPtDBQG+ef8v49XhRxDl3gfdmg8NWIB/5+8CP/1lzTK4YsWKFSs+3HipCV8ASsS08srWBOFt1mrAPLjn1bszQswTuo5IrOtu/X6OZK6DNN4O+g6Wurda57bIXjglBjAPmp2c31DC3GJPOatrFvRq9NtdrH/rNi4pQevylgKFppwlmRTAd22HgQIKg1ICkxZozWPEFMIWszunTvH93ArQFcV2Jm99GS2756Vm5/surQDlOSwd8zx2gbVNaFMllfu1vh8ikHGEXN+ogni4APUR5NW6+bjpZ0xkIAC4Rzenvp1y6ba6zh5fUrKVO7V47ljVjxdvMySq0ni8D3AnQIAqTW1Ikf5OPmlvJuAoaTt4k+2bNzw1SJT0BQFm1ay+0gLqxDUchZAslx0FtGFsdwNu9lEVwAwlijslIkcCboYOaYzZDjqf21uwXgkzIYC3AtlyyYFbrjGreM0uWDK5GoJg0yWkFJAAxMjZlrmHbJTI7gOjjwl9SAgkCKFDzKRsYirOBJtuRAyCTUy4GToMUW2pE0UlQu3mu/sqTGBMJDYAcAoQYTBPal6k3K9BVIE9aH9LzMR2tjeG0DwPohB4iBgJOAwdhhRVpWx21kxKgAZBd03g/LUNJCWHL3K/lDG6ZSXxB79YRtvJrBbYdm4XGBebAc+2CRxU4R23CZvtgMvtEQRgZCXH5RARLA8zu3FuhGyaSN54gFo5j1KOTd00zsriiQbn51yvp+dMpnrsWbB9tkBDKI89a58rj/LxJPM6pooyoTwKQsqLJcza2RaaxJCtnBPkcIQcn0PdWxpTfcdKGyqVZJX79DZyz1s9n9j/1uW3wC4lw1JahBpLql770edTbVlGt5S459A4vnWtrf6qlax3skR2/XBWcdtsql9R0C5n6b42iWkrpyrPn9Osu0ag+TNXkeKzbf4cQ6Wu1f83iETfxprsT41rONfm2k7a5pvPaxHeaGvtHuLbYwvMZgshXsDusGXzXPZ50vcuqBdpaoG+svaCT2D6O6B6B905bYZfMLpixYoVK1asOINrAP8AwCc/6IY0sb0ELh8GfMev6/D6J+4oIngJ8crw2/DG8Ps/6GZ8aHA9AI/3auX8s1/5oFuzYsWKFSu+GnipCV8NuEzkIflM8zJtP8lh5YMqRhbHMFnAWXAk5ECnVERgUTrQ9M/Ury3yuRVs8TnAvD0zM4QZZPZv3oouH1PIvhiLcqEEfqqcZAILJJ+264TsteBubS9clLfxVMUKAF13PvBbVM8LQeKmjXScBxbNNjqG03K8SteX6QN8hUDP+1p1Jnfd9TZvSW11Wj1G6M4UJqxL504sHOP8PEN022e52SQrQhrBZR98jGFS2whDhvEkeEgxzNQyBMpkgVPrhjAdV/XpLLDYInjdIoL8Qxm7zaBk6eN8+h3IkVL906fAMCB0HSjdB3gD3sTCDpm1ezgmQIAYCMxq88o94JW+AqjdbKTJthmOjBKaE8EELScCIQm6PePeFwW7twmPvytgvFDy1khDEirEqFAmeQcq5KTaRYvaIQNKQPaZDWMChgDZE+jeCCIBP+2h9rSMuNPOSzcRCAAFs6FW4jj2aq9Mhwg6KnHJ2/wOGQgyEN5OD7ITuUAycyRRVA1qBF3IBCiTKntFCVLsEkxRCwbQCSgK0hCRhoj99QYUVFk7DDqe4jah6xJiVux2xOgC435/xK4bcdEN6PJNGEUtn7vAYCEMKaKPCYkD3hHCGAWp48kyegyFaDdFND3ryg1Nzzpt4yuqGA6dgHutq9+NGA8d+BBmjhByOQL3JROvBIwETh3MclmY8Oxqp9bbYbLeRtA+jjeEiy8LOBKGXQKRIHHA8dghHSJwiIhPo1p5E4CLBLwyoM8KvpQ0t/Jx3+PJcYv7myPu9UdwpwTwzf1e3bNJsNvoeW89u4QIIUZGetYjPIuIRx3faas5qC1PbxjUrjseM9E7SFb3AtxNBCv3gNiMIXP8lNcm2KIJz4eXvL00kcoUMFt7YZbppvZF3h+M2ArI4w1Ifc4rbEpfZKI6KTkd0qTwVQLYkYsxqAPAYYQ8fQo+vMtERUuE1S25T2vy0fZTjKf5hGsSr5WKwMrz32U7z4jamSNJPr+lBDaYstcTg6kqu9jwu7Z4MnYpF3CNyt6/9FdlWUwxzttYWz7nOiaCr7GYqF60dlfS+i7K3Lqeqlz7ttFmc6KU9fmBWxbKhRQvdtRo20sv/VwTvRS0zNDpuJGsIOVKNQyUMTQjao1g9sreSoUrbt5EPZV5jFRE8ckc9Ezfnqits/q8uIdkYpfyXFxSmtJKhGle4p8zym45J20IVKycSznuGS02z/WiTVP81gvpajLX5kim9o1x3r7KdaWQvfb3QkrZ2aPqQ3P/8WXXf/+sWLFixYoVK15a/Mbft8Vv/H0bbC+efyHbiq9f/H8+Bfzbfwe4eoE1zytWrFix4uXES034FtR5bD386vvbFJxLSlcjdU0FCpnKaq3ub9Xhj19abe9UCYvn2/5awVD9XJCDca19J0EuH8RtlHGrsmZGrvuAsV33ghLbWzhXeRFnwT4XDC7lttpbW1I3rKhPjq9/90Hssr1RT1ONlaYyzlhNzs+zceEUVXYdjSCzJ2+LgoXaZTfHU7VfbIGDQ1lYAJyOsSUlyryA+TnAPPjMbrw1Av/SUBDOih9HyLNnoL5DiKT5fH2zSLeBgJCyPTXRZBNbd4uowtMzUsRAkGwT6/kGUjJM75seF4+C/okSaceHU/kSlVWmIbNZ7h9Jbos4chUAjhZMl7JdhqDkW4DaMnfsuxmoXyvHgCSqSC7XxAQap+Mp54+VTqa6rD5SkkKtfIHuWUC6EM0/vGFtQxS9T97aOdHEEmayN0bNm6vDKWHbD9gauRsYmzAikCCyErx77nBIHRIHJCFEErCQWiYLITFpnmAAsWPIQBrrzmSv2jOH0g4STApkEHgfgV1Cv0mlX8ZjBEhAuwQ5ar5bGoPyG11mY7MCWHolJzWHsoA5IFDKr3Zb8ODuC+l91lzMStQK07x9WfFtCmm7PrtGCozD0KmCeEO46Abs+gM+9kCJ8P3YqT22EEIQjGPA/mYDswHnmMdilKLmjlnR292outcrbDnma7DLkTlZC2TCNuJ0B3JZ4q4/5svNiy1mVtD5eH+u3y8hk8Yy5dqerKKnhpXnI1Wvw8Rq57w/gFNDafciaKgq76Lm1VP9S+Zu5HFz2y1K3RkRt2TvbMfdpp5t5dGty1iCn2M05gEvnMu4qmP2/r+DxfJi31f7nqsdDZTzb51Dtb6j07ZbFcBWhydsW+XW97pegFaVOcvHW9fn0bi+kge65QhQO7G07JvP5Vn29/xM3942B/JtqPP5LqJlA21EcE3wLrkN2TEpQezcu7yb3Lys/D1wMvd3ZG9LPbxixYoVK1asOINfAfATAH4AwOUH3JYJ/ZZwcX/9pq84DxHgb30W+PKV/v73vgA8eZfrnVesWLFixcuFl5rwFcpKPvs9BrV3try3wCkh6wlXr4htKXOtnEjzcmLQc5NjWPz/l0jnEAr5KcMwI24L7hKUqZSXJ8EsIwKNT4uZ6EJWXsyUMC6I59U6rpwpWOyuyyuNamWS7fdWep4MpjApdltqJU6O+HVEM8ukvGspdG27KW6RlbHUzdtj5xhRZdcf47wuO07lj8qE1GV45MCkJ0oRs+o0ZVVMS61bguG5j0MmQ61fZzniXL9TvlZTts+CsQ1iIJPRIjLZplYLAuZqGZ6pf01l5S1X7Xw/4gs57BQulMsQz+Iu2VDaNmPBtNCTQ2QckR49RoxRSdltD+4m1ZEQlPAF1O41CBgMdDFfQ87J62PLPHGVJbcpA6mfSF8jrbhXm94YlOwNI3DxFcFxTxgvlfjjDllVDoQDKTnmCDRKxk5ism4OgnATQAlIl1y24ZCvbcOgXtW7zJkgzO1F/pkSIV4F8CYoOekINMrqTu6g934IkHxTC+HNUGK307zE3TVh84gwPATGC0K6NyJ0DIoCRn6vRb0GGSeyOpCSvZvNiIvNkO2b1cZ5G0dcdses8E3YcMKRI97a38N+7PD0Zqd20EkJTB1Cc9Y9REbfJ6SUGc1CHlJWNJOSnElz84KUMJRnHTgK+nsJB1NRHwLoMqG/GHA8RtAYEK4DeKNkdthrGTQC6VLAW86Eb369UNDxlds2Iyw7/RdiUuI6KflPQSA9QygiAEomdwQeA+Sgz33Yjeg3Iy62R9wcNjgMSoRv74243x/wDRdP8Wzc4JeevIGUSfGLzYBnKWC80ty90ilRb9biRuyGY0DcA/1TT0hkIndThub0PLjnwxY9SJfHlMyPD2n6XQKBS/5eyqp2rYtqchbzsnRBBBCOjuz1Sl8jlQPN1nBYzmHk9xrtj5BnV6dK2iW0SJTy+wIJZ/a/KZ1VlbYUmrNyzqkf6++HfctqG97ZdTby1NduHQ3CTFhAfdcmBO9iH91S1FbK1hMLZCNq6zzItcLTzvWLoxBnx83a3zrXt6t1fXXb3b4l++lFS27h+bi4DUvqZyszl1c2zaYJUrbNjmnN5er2V+0jopwrej5PpBgndawvs+63EEDME6EJzBcQmsrdiGE+XWi2ODc19bkr2+Yxpd1AUf1aPS2Ya04uZFLztghgtsVWMlf7+oWLVD2Hdlxtz2zK3Xpxqh1nqt6WhTTz9Mqtrou6rszj9LwPr+3jihUrVqxY8d7j7wP4OQDfAuACs4DBihVfw5C8Fvo//Gm1cF6xYsWKFV+feKkJXxBl+0ZoUHdMs30ATglZv89v79zq+pIXLEw/M58EqFrtKWjZRzvSk2a20mke4PHkaA6qzS2ll5UHJWhmP5sFtJVTCDrfHw1FUI3KhnBeaQ5qUxWQBE8EbYt4B6aAnUEk90fQGHWLeBU+VQV7ItbOLSoXV4Enly0AV9szAxP5y8YoOKVtIJTAsj8+K6ioZi/EHdciiSOctbiNQ1ef73cf+JQqmOnIBVqy2a4JW29h6OO0RJAQpsBrIX6nQKhaC8o8IBmjWrMC0/b8s4jr85YSqGXZeU7dY5fw5BnoOCD0Hehig3Rvq6RUpIkMB0ADI2bCUO2b87+oBBLCqQDOlIleram5a+GUkAT0QCBBdxCEJIgD4fAaYbgPjJIJtG4qE73obXWkGB0DEETJsE4g2XpaWWclVEEA9cq6jYcICjIxcJmIBgN0JHTPCLxRYjrdY0iUYstMDM29y0C4CUim/CQlBdFpORCALxlDzOpp4+EHVdqSqMJVoEphREHYJm0XAB4Dhn2HYd8h3Qvou4T7uwMu+yMe9nsEEhw54rNPXsVXntzH/ukW8Z1OrZCPQLwhdAOKEpq7TPaJ9h33wLgD0isMtvzC1mdDVHIwW2jHo/aF9YO6XxKoz0HznDdXBKBNgpCA7Z4zEPdKhksHJXsvR7WFzupl5jB9LhKAkRCO+g9QJVrfJ8RM9sUu3xMAfBEhI2m5YwAeB8Sj3lfeB9zsOxwuelzeO2R7a+DJYYeBI+51R+xTh5uhx5hUET0MHdIYgE4Xj9giBUO8CeiuCdt3kO3MMeXr7WkaS6L/5z6P4bzOhDgrggmon05vAY18n2ycE0PHi32WPfkLzWVLmOqZ8vxO5ZMAIclE+trrOyrJE4bpXSvIbb0ZgOsb8LOr+ffgHFrOIQ2yaEaS1USgtwP2hFcrx2tF2LZsZsvvre+IR60gbpVRE3A1yFn8+uus66vPrb9Xs5yx/rBGnUZeu+O13tPvAdXf70ZbyC9Ic7l4qfqGnrS1JqDPkb/1tZwhjovC28jEPG58P9doLShoHuPa0Lq+W1XG1o7q3vq5oie0JaXThQAUpvPt/lUWykuq3qLUDRNRa3bTnqS1RYuKOCtrdpwjostiNpunALO5CdV/L/htpfxpEZ4nlWfz8bocX4/vAz/Xt2Ns3t/6+6S2jl6Ce0+Vfrc59W2WKStWrFixYsWKCiOA/zuAbwPwB7CSviteBvytzwL/158Ffv6tD7olK1asWLHig8TLTfgCKBbLBhdokUBTXt86YNsKzNj2FknMjghmLJO+57BkAd1qx23ltLB0TbfhtkCgBfUkkykWpLutD4z0PYe7WGwDE9m7hLrtPnB8jqj3JPJiO2xfpZDwyqq7jodWXT4o7VXGBrOOvs1y08qvfz5j5zhTI58rdumYViCyXqDQwtK1OIVc1QDkBp+cIsMRkhK66z1ABNr1QIhT7F7c/0dVnapNL8A85fyUu/SDZHIzE2KETIQFJZEpCcIAbJ5k9WOgQlRaXt+isswKR1Vb5nzCnJX4Udxiifwv6vkURG2TE5066QpAmWjs9kBifZ+le1OZlNPuStD8wrP1CVZXyMSwECQwpGfwNoDG3EeJJmK41E0gUgvnQDn3sQCS1azjGFRlnRnBQIJRAp4NWzy62WH/eIv4uMP2zVByyPZXgnhAybGc+kwaspJ+qSeMF0rcDxLA99J0IZnYNktqI7BLc7MtNFl+5STaXg6lvyWT4pSU2STJbzS7j0Iqbo6crZxpZrFt5KiOD1U7A3Ze7i8SpM41LAFhIISc55lGQiKAKSLtsjoy9+HIAUOKGDjgOEYkDmAmpDET8nYN1uZEoGNAd0PoboC4z+8Bv6ghE7vI/SaEyd4ZhQOerpEdWePGkdC0fy69ne4Did7XJczIXvvUGxGcyd5i62xOEvkGCFE2NWDgOECGAXJ8wcRF594NwhDWvKhNEhMVafc8OPdNbpV5l2/EEtFaq4hZZt+TO11DM23D7Yt2lhaTnfTnbeU0i757bvhzZQC5D16gDbfiLn20eOoCeZ23UaBTQvp5bMSXcIsNdMs+/CTlSF2eP98WT0RURK3ur8njxTnKbffel/0CeW6bc6jWgk9rY6DZQrS8Y3p3vdu/Ee5qX71ixYoVK1asuAUC4BehAZ83AdyHqn0/CAwAHgN4HcD2vS06RND9j0Cu3wYOz959ebEHXby6uFtY8OTttzXNzgKGr+F1akkGvHn4LF4fvoJXPujGOIysFs7/8C3gb37mg27NihUrVqz4oPFSE77EDDJC0RG5RuBQK1eft1HzwRW/ut72D+P8d0D9W1lOLaBNXWzHx0ox7JW7S/m0apLL7Nt8XjARyDBMfdBUA2gw2AfDZBync7LFs1ibl6yaDd5y2FQULkgvPE77fRnAaQBR+FRhZeV33aTkNVg9MWr/NCeGVaDaSNwW0eutADkoqZaVuU37SH8tLVtNf2982wK1yVtfh13TIHPl61I7rI31BLjUYRbWC8FjbydtAX2zBLQyQ8jO1TLLKzcbZ3nsUgz53HQ+UJrHMDmbxNKGXLYktNsMzInrls0qAHDC+IUvIT68j0gfBV9uIVttu6oIqeT6pFHVO8KEGEgJ0KgE4lQnkALNCCdCtgMmFO6/tncO2dqWEnDxJuPyK8DxXsB4Cew/EjBeCtJWchkC2bJaNY+A5dTFoGRqUVYFgPqspBUCD7nyrNYtVs5MoJHQXQV0zwi7rwjGC8J4SRheh6o9gYlgIyUhU4ASvFamh0CVxwJwLwii5Ge8Dkj3GCEKeFR2L1yMSqIeog4nUVKaekbcJGy3I/qYEEhwPWxwM/Z46+oS+5sNhsdbxGcB8YYQUiYRoxKNFIHgSfZMpErQYzdPBeOl2jcfM0kZhomd9IpTy6cc9gFMwAFb9JdHSBCM+wg5RIxDgFljq0JW6+ZscSxRVdFy7JF6Qeo6MAd0XUKMjGGYFhvYLRzuE3ij9+84dhiGiPHxBugZYZeAbYJQQP9OB455cYAIaCT0z3T8pi5g/4V7qk6+NyL2jNglpDH6qvQ2RkZEJt47JaPTsw6btyMe/gKmZ4gcIU4oKt5C7rqfZ2R5AFIVaygu1rmcohjeAPGoB5iNs1fIU9VXRjRPpPC87qLwHZXsDaMUVS+xIBz1PSdE+qwfEuh6D94f7k6anAOFme3tpKRrk50n6s0WKVtcMirlrFec+u8Zy+SE0UKdb7ephg1tK95a3WrHeVcL39Za1VwrnU31WfUPxQhJaTqu8W1rKoo9Eej7z12DJzibhGgNCm0b7mI/7ec7p2NoZoO8YPdc5lV1Pa5dJ5bKtSraK4MrzK853588ByHveNJCy1HD9bn1TbHZtoVu1bjy1snl+2Xj1I+1Mv9ozD1tMQPnZ4d11UhJFWHjZqb0dWRyro9imJTCLdK3sVhNUprmOn4BW5nzxNm5M0tnb89c5+Ml0r5hgQzTXNz+FjhRPvv9Vk79d0Nyf3Pk/cXGuXmdKxG8YsWKFStWvBg+A+DfAPDPAPjhD6gNXwDwowD+IIDf856WTBevYPe7/2WMv/DXMPy9P/Ouywuvfyu2v+t/iGn1+hz7qyv8x//an8TTtx8tlvFN3wl84rV33ZT3Be8cv4D/6c/8CP7J7/wy/sef/KBbM+Gta+CP/Rjw9s0H3ZIVK1asWPG1gJea8JVM7noUotcTtXdZ8X5bILjk43Jl23lLOXtrEmyJrKr3+8BOrTYWWQ4OGRyRZpiRv602lzbcYhdnFn9LQetybBU0nKlP3P2ognaL6qSUTtt8mzL5HFrXaYHGu6hcWuSv/90H6O+i3FnKZ7uk2PIKL98PLMAZe8iT9jvbZl+nEm635HyzMswuvFyL226/52dmcewa6Z5RrC+bKuBl0lf2B4QnzxACgbGB9AGImbglKoRheW4lZBJX6wspK30rEmzKDWskkyNNAwohJcG3TRW/3UGyUhYIR0LaEQYBeJsJXwKkE1AiVf4iE5OEbOWsJKVvQ6k8ZcaOlcSM2cq52+vuMAq6PU3nmHLYyqPcx0zAkebE2phz4BoZLFTYU0oEOgSk0GkbyfWvEdHZijpkYlKHAiFxwHHsMKaA6+st0iEW5bB0wPGhlscRiK9YO6a+jgeAsgI4DEA8KBGvuYmhaunkyEq7ToKrx8gB0teRyZzt+n2u4ChAJ0VdKz2r4tf6MMrEiYqVh6KmNjtjIVU1H4aIlIKWm62ly+3cam5gbBlpyIrqEIo9ciFiU1Db76wUVt6IVK1MQILmzabASMcI2UfsPtdj8xSIR87fzkxiY2qft1K2nwUo9s1SkcKFjLV22Tof/7r3ymp/TzA/VxcgaBlhrM5z5djzpt96RxoJ5oYSBCAJaBgh1zezRU/PhULM5feY5Yo9816fkZg1Wu80b3tcKyOfR3VZt/mu59cE8dICqOdqgiNa6zY4InVJFd1sX2uOca5uO2fBTrpJBtdW0tUc5uy3yddf12v9Wm1vksMvoPZtqphbcxBP5J7rh1bZfn/DatpIWCWGZVKJ121rzZ/8999Sk+TFBrM5g1P6nuT6tbbUcyM7plpUWc99mirhMxbKzQWXPhWMR7aWXvyb5LZFc3aMVyTb3wq35SUPAac2DCtWrFixYsWKu4EBHAD8I+gqbUCVtt+H939BFQP4KQC/AuAGpyv/3z2IAtBfILz+bei++59C+uxPqtr3ORA+8h0Iryv7SQ8+DvSXzXnV05++wtNfHPHGsx8AjZ/Dm/h0s7yfePvH8HR4B7/9I38Yfdg9/0W9j2AIbtJTDLz/oJuCX34E/ETO0/vkADzaA8evYXX0ihUrVqz46uGlJnxnityyuj4BY4JseyWYzuTeg8gUnEms6l2PJRVu1+mxph6wIMxMBZlJFlvt74M0pgIwzHL70fz/PnDkVvQTcnAt0sm1ld8axJiqKZ2qpMobWAJxKU3tauTVw7hAcls5tj/SRNb6dpagowtc1SoTr8ZuWTZ3Xd7ulMqcCS145Uw8DTDW5YoqSAi0TLKWnMCObC3B4Crg2DrH94/f5n+O7vespintqq//pL6Ug5qiOXyt/nKPTwOKqvZ26huXa5jgcul5mLrF5/gt1ztdkylxZs+ACIgZy6SvJ5Gn3I0luF76uz2T5cMB8ubbiDEiECFt8x8ILJAuQGLO8Smaa5cEYMpqQMn5QDNpFhLAkSa7WwFCJnuJBdzRLIZKmbwyMo1I7aLjURAGQX8NHK4DxktlA8cLwWiEbsx9SCiqUgCgjb0zslWwYFL1ZqLXctR2V6oG7a6V6JWYibOUyWQhUOTpHhHUGnoE6EhzEhOOYNtoXTMSbwQiE2SISPdY1coIoI4RetZyAYQo6PqEvh/BHDByQEgBN4cNjscO6WmvOWuT9jOTaHk9I+4SBhsm/lF51iPsA7orQndN2DwxEjr3hWSSNU4EpSmYw0GPHY3oTGqrjAB9FXXTvbYbQhtVKI+jEtrhYgRfddrunkEdl3HKPNlaI2i/h2Hik2NgjGMEDwG0m3Ida+MEfC8hXI64uDxiv+/BY8C4jdrORNNCgET59aj5cCUFyDEoGR3V8puioIuA3HToHkW8+o85j2nk+0WqoBYURbVQ/m5RHgac+VnO/RhtjOf/W3e5RRGUMCnh7XdGsUMv5DvyNiPQCOrOIY7Akek4by9dbL3zd8aeX+S8nbaAg4YEOg5IT5+e2sQ/D/zCK8uPaUpfTAQfBT4hAqccvmgTbzOC0RNIDaIUmN6RtxG5d1241FqctZRD3at1XftmqtTnxPPYLft7eDY3cv2dbZGvlfL4NhXvrGz3bZrt82g5h5w7/pZcvr6NJ0RtXWadd7ixX+zeu9zGpcx6oV69gKDu39n8IaIs7qovszG3aub1DSG7BZzOFQqpbGRnRZR6lfGMEG7NIYGpjBBmqt6i9jXyulyvJ73DfLv9HeD/7sjvpTJ2nWK41GV/h3h1sDZc+7Lv9LprNxVTB+MMTJ28Wj2vWLFixYoV7xI/lf8BwPfmf/4rnP9Aes9gca4fB6CsnohAmMtc671E/Nh3IXz0O8FPvgS5fse14TYQ4jf9OvTf9wdO9uhit+n3d/6/T/D2X3mCb8dvwyV+Hm/il5p1/MUv/+/w9x//Bfym1//Q1xzh+7UA69af/Qrwb/zNO55kMY4VK1asWPF1gZeb8M2BFMqklMQq2DcjDFtBtykYA8CRhQ1YmWY7PAtQhTnpnEm3YsdsNtCAUydUBHANCw7ZcQ1VQAlsVdbUs+CWC8xNVnVVINKTvRYA9BbDxZbRVS4T+TwLDpYUmnn7zLLPX2euOzrC3WAkyIz8bhC2XrFViMIw3YNzVszWRy7wS11DieKDpF2XryG5/uWiQinntoiF2FCElb5255jtcoyTrWGsjrefS9nWh+4eWzk+UJvbXKwRbXyarXSNQNMY8yS3uKCokb42Tp1KvQRqLWDq+uVOf6A4a0xVgi0Ez2fnCGQcwO88Ah2OCN0bkE0H7rM1dVEdAdxHxENCODLGiynIKptMADMQRBBGQKJZCmeCh6EW0TTlbBVCsYU2G+kZWZyA7iCIg6C71n0SI/avE8b7guEVhmwYYZsgQgCr7TRGAg2hkJCmYKVE6J8S4jGrXk1NStreFAEalSgLB1K18yZpmUJqHZ0I4RAmNaUoqSgbAUwN2+eKc05cJM0vKyHn6b0Omq94w5AhIB0E3f0BXZ8QAmPbj9j2I956fA9pjLgaLyCj1o0owHZEfzEgBM1nOw5RVatA6QMZ3XMYBXzBGDaE8T7h+ND6UsA7Bg0BEdkaOtnaG4J0grRTIpwfjqCOEXsGUX4VZ+Wokav2N7bEgOQUwHwwJhnAMUCYwB2DMwlramaKUshUlckKLjcDxsuAw6HH8fF2EsPfHxECI+XrvLneaD1J771EgfSs5fSC3YNDztUb9X6SKPlsY60TgAQpBVx8psO9LwiCey1ZbmkJhLQFxh2QLjTfbxgINKgNczhiIvrrV6Pnz0zZ64hgCZjyQ9vYhWQlcj4uUHm1GymstuvuXHueQh7Lx5yzNz9zttDCFnIAACVWgfn1/sXVvX4RWf2+qsle4JQ4LGQoT/v998TIL7PN94t97PwlF4vbSNKWPbRr0+w4X5eRo9W1nsXSorFzatxbyMiyrbZWtlz2wPQ9aaqoG99JT+4W94kG2Q1HerYsr/1zVEhSrn6fE7GTFXNj0ZUnWGs77AV44vdWdXDTTtnI5ViOKW3z9+Lcvff94qc82ab7RIFriwgrsnha3MFlzljShFh7c7n+mfCK3ZmbjSOE/VznVoGr+xthRjK35nP1YtC8iI3qxZ/esac197ff/Xx/akQpp9hAezI5xum67bgzi1pkYZHcihUrVqxYseJF8MsA/i3M/0D6Dqjd8ntFxP4dAD8BzR+s+Kkf/6v4zM/9PH7vP/9H8MpHP/Ie1TPH5tf/1yDHawBA+uW/jfFT/9nisfTwE9j80H8T9PDjzf18FHz23/kihnd0LrP//LHsex3fjN+E//pi2a/go+iwWdz/9YwnB+BP/nVV+N4J3/MtwG/8LuA//bvAl+960ooVK1aseJnxUhO+qvpxZG4MOX/vbcHQOUF6orQ8F0w9IQTnAZfZyn7///pnoB348SRwZclMdbk+KNUijWf59xo4E8wrSuDlA9rbi61dZQfsFbW3Batbx4RGP54rq1adtGwFa7T2L6l9W2iQAucUXbfWc67eu/TjXcrJkGwV/iJ1nKh1l8aGV9F4lUtrMYZvs1Mw3wkikOMA4Bq0f5iLUEJeoEpAIQJCJkQhCJswKRIzgSYghNwONiIrKxCBTDQV69ZGM/I5nPMHC+NEmQgBuCOQENImgBlgcq/lrN4NByrqVUgmMkdCf6WkXHCEvXRKTksEgigDSAlK4NpFZnK3fldSJj5n9r7leDtIL54yIUojIcAUz5kYDowQGCFY3tqINEQlMQenwLpI6PqE+5f7MtSusEFKASmFbFdMmFksZ/WskpYEIBOiUYA+L/YIWQHL0LUlmRAGKaFtSuSuM9Kofnbd9TIyST4/TrKCVyjvt8NTnF7HMt1zAAgk6AJjyP2kFuF50QCJ5kRmUoW0XbeVlRfCUGT0/YjDoS8LAwDM1MJEWg7fdNg8BbaPeSJYSfPvpg1hvAB4A4wXgrTTPooBCHnBgxL8eSGB754zr5TZuPH9mftj1rf2sziylzGNc8GUG9j1p57jv3/T/4UIQQQYGTgcgcNhubG3YabWO6PWbOWxrfbPUL1XZ4RV62VSE3ZL8IrdF8G576nH85DALE1iskmO3tb2lqJ16ZxbcvY2j7NcvgvpDG4jYrWIBZK+Ov8kX++5trZIXOHb1dF3mff4Y2ucW8R2a07gOM0N2P2/ImOXz2+36dZzF1CfV893bA70ImWfRU0OL82PyoLMPD+qcwHfxX56xYoVK1asWPFVwjWAX6i2RQBfqrbtALx6h/KuADyttv3KSR2PvvwVPHv0GMPhiPcDRAR67VvK73L1Fugr/0h/SQPk2VeA7QPQ7gEAILz6TQgf/9UgF/tLe8bxzUHjHAfGs394g+Gt08W3G1ziDXzLyXbDJT/E45s3cR2fAiA82L6KPm7fmwt9ifHlK+CzT4Cf/ALwuPVn7m4DPLiYb/vGN4BPfgPwDa8Dwwi88+yr0tYVK1asWPHB4aUmfE/sihMrCdDFKVDrCVhmFzTFKRnrA7tawbStKHaDIzUbJF1K04p+Wgj8eStpHwzy9nG1wtf2uzJmJJ3bRwAQKZMBE8l6EnxrBSZNNVAIbJ7UwDPbYg1UUgwTMZxteMGpIlnj1Dch1xcrgjzQaSBsFjTHFASsiWNP7o7jaZCTBehJSWi7jnJ+nILkCdO5vj2Fb/RqqEZA0o8fOz/ldvv+4HkwfKb09RA+HTuBiyqGkIPF46kaRhJn8m6yRDT7ZrJ7AeiED1Xw0IL02UZVL236uah2vPrcLJsditVgucde3TZf7FDqz+NC8n2kvhqjWVk3U7I0ArQyHCHjgPjlNxHu3wdefQC5ALgPkxOAy/8ZbxK4D+BNUAtk1nIlqHqU8mOdvND0KBN/SspKceeIm0z4KslF4EzkkCDnQdVzto8Z28fA7isEiQHcRyXieiVtibX+uIfmrB0EYFUTc9RjeDOvt+RnJSVk4wGQDhgTAUHU9hcM6QC5AGgf1dZ5RCHPiPO5Qyzt5k4gWyUH44EQbwjUZVvhIEAnoJ4BoUzYCq6fbcFXasMcRy0z3WfIvRGf+NgjXPYDAgSPDztcHTZKeEp+jxnJGmROuOZ+pUQIR9IctwDkIhU7ad7ohYSDqnvlgoEbVUpLCmobHRnDsVNlLeVKCaqmJUz5k8egFs423HrW98KzqITwGNDtBsQo2L91oWX1ormGj3qvwkBIQhhSRMptpFHV0ulJD+47bB4eAAR9LWSradlxYTzDNiEEweHQI41RVcV79WWmrdlLq1JaHm/xyj+M2L1jDzHAERguCE8/CQyvJsiGlaAf7d9ETktU5S8xsHnqOFpGWVDgx4qNPcpi9JBfS9Ip506BCnFcq4NJlDS3FAyaw1f7Pm2UVI8HXShh/2iUaRw4m3J1f2CE6wP40WPwzXuUX6kioby60+xxhbPyt2WD7Mux11f+Zgpk/s1y6QgKCdUgiU+sapdsoOvvocG+2ba9RQ62Fgw1ypNhPCUwc7/UuXrNtWFWnieGveLVrgvALL9xy2K41Vbr45TcHILm3+MlBXIRETty2l1frdj1uXslpSahu0gauzYsEsG+P+pUDN4a3KfjyP1SVMZO1dt0DfG/1/mkG+1Ru+G50taPy9IPBpZJbVsT+IVgzptimOYvOU3FPJ9vHrMhq6jd/W8Rt34hY2mDtwm3ObWbn8wcUZby+ZoFtfu9zG9qu2i/3yybLf1FXUZtDT1dyPw6fTnmaOT/hjjX9hUrVqxYsWLFe4R/BOB/XW37IQD/7B3O/bsAfqza9sG7c8Rv/a2I3/KbAAD86DM4/MU/he47fgf6H/iDegCdzllvPr3HL/6pz+rURQBpOcndAdfDE/wnP/ujQE5u9nt+9X8H3/Tqd734xXxI8KN/B/gLv3gmV++v/mbg9/+m+bYQ9O/kf/q3AF96B/jT/6kujl6xYsWKFR9avNyEb4vs5JwTsKV+JVJCqQ6cGAnZUuXWlrY1adpqUx3caapvc5CmlQ/Mb8s/t1bzz4lZd41uv9i1uTL8thZKAGlWWQDgo/QabG+qIfzE70SpyZjZZrdUS6VMPt02s6WuAn91GyxIXlg5R/bW6uemLaWc5nWeXYtrRx105zBdZ8NWefZzbV15TjlzsnjAj5/5vW/9/G7UX/W9LoRuQ3kiIm17QT9efb48mY/RJdXTiYLurMpIwDd7BAAhBjDuIUgH3kwEZimX1S2ARga6oM+IAGaP7I8D0UTmEqFY1drzZaShnWZlZa9bAeb2kvmawpjj7yr3hBzgiE0lDYvSlpS8Q8jksX/dUK7TuI2QSccOqvKN9g6wBpo6Ng8vI6mBrKTNP5vyMlm9grR1lRKK+hZZYXq42gAHTyYTeCOQi4Td/SN23YhIjCQBnDtMX6ECRoO8Stp+T/6KtTe/woUE3E1koLdqLqmVsmqXOSuJjck3e+SQB0iy8YpicU0dJhtlQBW6ifJ6ndxJBFXc2uvqCL1+QBfimAw20qzPh0MHsvN7Lsphyn1rttecgpK9iUp9ItM9HQ4duqcB20eCMOj9vv5oxHgPOD4UjPdFCfpR1eU2xogJ3AEBqsw2FXPaoCh+Jf+9CMZcGE2Y1LfAiYUqOWLWFjvU8GpoIQJBiuKXWPNuh6Nkq3KBxJx72+eUFwElzd3L4/iu3nlT5y/D5xdv5j+tSdiaaDPU30oj8BacMZp5ST0aJGg9J6guZL4YqW5TCxWJ2yQPz6lR/TxhwV55tq3e7ttRE+1VG0tagBfEzLr7nCq30QZPeJ9YgS+cU+o5lwO4oeguCw6qlBpn+9+jtrFuWTx7YtUTrZFOx2uqzq3RGmO3qZ5PyjidB7XmzH7hxExV7+Y2M2tmALBcvi/antbvWlF7W31s7eozI9Xni0HLddRk8VIbVqxYsWLFihXvIQTAUG37LIC/lH/eAfjNUBXwz1fH/WLj3DY4JfzUX/6r+MR3fBu+94d/8/vq+kEhwpz7wr030H3v70P82HeDulOrZUmCt//qY1x/ag8+vBjJWyO5NB9NF6SvQwzcIHu/55uB1x/qz9/4BtAvhPm7qP/e01zTK1asWLHiaxEvN+FrqEhPasU1jGAimtvTGWmaRhQFrycVbT8ZQStTeb4MI0nLavocNFsiRC1Y463a8u8iAnLBpgKvCrBy8jZJXPKtnpBnVd2EM6RvHeir87/N+pSh7NFCUBBQta+h63JA2RO5C4HvmlwvKlhy/b0QEC4qmzTt40ziWH+yTIraOhDKMuXARRVYXeoP3xYWVeJ6xXAdaK7VScmd50nwVtuQ7631U00+121p/VwrbrzVIU9jyBQvM6vDolihGatTk8xNq+dasS5yEmydtW8hYF1sMW9Z+CqHAzglBBaEGMFhB/QNu04RUJJ8qzLhmi+P4/ROMYtZvWyabQMc2ev5iTg95iUVrAnYOBO3yIpIBpCA7ibf54Rib8tdPi/4NqDkY9VftD4AU87WoPlYJRBozIopsxSmPIaC5Fy9Qf9W5XwdEbo9D6twzDbQokQwXwjiIVtNRy2XSInJNEaER30hASlpO3nH6C8HvHr/Gtuof8Qdsn2znsv5ZyCRFK682BvnthXyO+d2RcqW0lFKm4lpEgWPlO+N3jAlfDU/sCSabiITEE3hN900U6wyIb+H8g2XTJySIIasxiWAIpf70h0EISuEVcFM2tVRCmELAeQmQjaMuE1KGAuBRwJF7dOQ28XW5jFM5LSQkrAC0LMOmyeE3aMR3BPGHeH6GwXDQ0Z44wi+7oBB8zdbn9Co9zFtMgPNAu6VpA1HzRVNCYXQLfbf+Z+N00L4ltzjKGptUweXBRE0HQ/jrtP0u4AQkiN9RyAeGSGxXmu2SyeffkAAGhKwP+h7/EUsWmfuH2cWl+Rvwq1Wzv47574HZwlYT9jlb+1iqoXGN2lJGTyDK1+Vp66ds7qra6v3AZP9rCk7Waa8xP78d0PAL90DYFmN6tpf1NjNwzwxfPpzUXanNO8nd66dc4JW3eeIbT9uzuGMxXhzbrVEpNb32OYk9b56jlHl7y2uMnDzgYZaeaYE9iiK3VuCUNVCQT9vmOp196dafFardcnUvDn/r3fPmc2jfR7eepuHtwSfKZKrY8N8zn5yzonrTXVt9ndE30/l277aInrFihUrVqxY8QHgs/kfALwO4AcBfBqnat67g1PC3/5//QV88vu+B9/7W3/T6XzhfQJdvIrND/5XmvuEBXxgfPnPv4PD594fu+mvd5jGpEwb/Xz51367KnvvAsrn+r/DV6xYsWLFhw4vPeErzmKZsu2yBJoCwLWdrLdTzsEdEOlKJ9tWB1uKGjcHV4wENhYn0IzDPFHdetQqXh94ymQ01ce1zrHyjQA2y2YfDI5TcI6om+oqVm8Lk0OeB8+moLEL6KZxsmVeChD7tgLtPHAxzo+xumZKUJqrca1f+40SynUQ1e6JkdEWm1MJ3kSsnrMsjHEinVskah3Ah7PGrGwem2RxHTz3ls6e9C2EcJqCoZmgpWJNXOUhrQPa9X0mHQOTfSGBKJZtAKay/VjIJJAP7J+oZPx4LcfN1TJaAU3j1zetpbq5Lehd/5FTPXcyjkjPrhADIdxcAOF1SBf0nwV1OTOJQojZJYD7AIzIeWIBEJA6mogpa17+DyXRnLkEpN7tz4sos5Ay15e7xu45TYQuu7cyGblZKspEL0EVkOXdl4k3R06XY6FEWX8N0Ocijg8F6b4dlFWcuXHhQFUd2i2mqNVrUXLQLJzHLQNREHajEpMkODzdAseA7pgJrSDgrYB3jIff8BQPdgc83O7xcLPHMUU8O24xpoBxjEXFmhKh2yRIr2OGOYCHrMYdCd3TqIT4CEgPpCDo+gSOghQy4QpgPKrtMljzIRMI6BNCtLGdyW9ASevobq692JmmPtkosQ1ArZ8DQLukr28OhUgXNlIXCIOABmA/6M2lwAi7ETwGzWnM0wChINhsRhwPPXgkyBAgCWASxGzdzSNNbc73BlmVizHg4acDNk8EaUt457si9h9l8Ku6ajxddaAhaG5enu51umR4Yl7MJjsAhzcY3TWhf5ZtnyWP09zsYAvSAyZi188ucj8w9PmwcU/52GLLzFOdlsOXcjvjYVL1JgpF9Vu+vaTf/fDsCHr0FOntd9Qa/kVQVmi0CdxCBNZk721WzpXqspC3wtP7MqXpvW/gU2JotsCrIiVPys7lzRbU5O+JfuMJhHT6LZ/1ycICq9vcGOrv49I5FNoE8awJjTzJS0rqFlFtdRghat//TMhO3+jRnULFshvAZJdcWzD7dheL5fmxviwqu5yNtV9o587z9uGza2opgMUTy5WdssxJ51Jvi8yvnUfuohBuje3WfTy3CMPNOVqLwdRZZIEo9scO46ma1xZI1irevL3Me7xC1qNli9yaq/vFcT4Pr0/1AuSFhX580vT/ygWllOHnVTannfVFPf/k6W+YFStWrFixYsUHiMcAfhSa//fDhbf+0iO8/Vee4PiVu6mUVzw/fvILwL/5tzV/Ly42wB/6J4CLbLf2xoO7F/TaA+C//buBn/wF4O/94/elrStWrFix4oPHS0/4tvJaEZ9um6HOh1XD2dOdPW6pbF/GUt2FLL5lNf5SgMkHgIC2orLUeYsaoWEXeWfcZvno0VItnOtDj1b7il3zQhtuJQpdULUOStZ2i57onKlvGmpRX+5SG+rcea36n9vWUCZ1zJJ6+0Xvs29Xo+yJnK1I3xeuJ5wuEGgFt+s+WupvTpD9QU+5OQK7HiCCZAJXML07BEowUdBAfBilkGJKwNJc0QtM6kbIRBDrr7O0s2Wz/8WXRfMDTSUpROW9NlcUz+8nVbfGjjUr5u4G4E3OFbxlvSZjopcel0woGjEnth4jQBWqGwZFLgQqcwCOQdWjjqTmHYMuRzzYHXDRD+gCFxtnjxgYISt9bW8gAQthTAHHQ480BEiMSuLmvpOISQHbqeJW65bcqaIkJGHax1X9nskHlPwdw0T4mmU1tL9ICEKaN1eH/vxmmxLbihWhYulMMROYjbHATGrZbERwfnY5W0zLOPXtdJ9IlcYDob9SVez+tYDjawJ+bUDoGDxEtabO9s02vigReJPHQ6JZeyQA3AO8AdI2i5/9QgRgvvihhu3LvB8AFMvx/NyQyETw+s+36HV4O3NNv0pAkpznV8p3lZKA9gfI8Qg5HFqteT6cca9oKjkbx52U5/e/W7vpJSy5PdzW5rtYOZ8je1tkYV1vy/b5ObCYA/e9Qi7fiNElRXDze/Ru4OcVtjCtUomXHNF3bE997Oxa/Pxlac6whOedm9TwY+J5626dc27x4sK+E9J3AbO8vifl87KC1s/RPZEL3E1167/t7viijj5/9rxe354VK1asWLFixQeEhEnt++5x2O/xxU//Mh5+5A3ce+Xhe1bu8yDtGYcvHHH1C3tc/+L+fa3r8c2buLd5iNcuPgZ6t3PRlxBPDsDPfAXAq/fUvvlXfQS43N563gn6Ts/98iPg828Bbz0Ghg8+X/SKFStWrHhv8XITviKgYQRihMQA6aOu0h/TPNDh7JaL+tereg1Ek2q1XhEfctTeWzV7crdlRVuTuy2iubXav+um4IyzkBPmEwVk+T3GHLwCxAV2Ziogb5Gc90nirJLNJ3R5SJA7LyuOKIaJ2ItnAtaLKhv3s7hgWN0PZ/uIpz42QjCGrMzOZaZcRmX7NzvG20/OlLp5W61W9vn7PGb24A1VVh3U9krdOleeHVdPYIcFlVp9fb5fY5yI6hNb5zRX7DqUhQNpWkhQzjtrDWrtp/nvdi9rZa9T95JXedt2dv3OpwSD2mqSniuslo1+LDUWP/B+DxwOiADC/fvg1x+AqFel7yYogZQEYWQlWDtCOLLmQCWofWwKqsSNSioWMpf1X8rEcE7XO9mnA4WwAqBvXoHa19JEygqhqHVNxWuQqIXGvWj9UcoxRcmb5mQycRaMZ+Vv3Au2idA9I1z/KoJsBEJZ4UsAb6UQeTSQltdpufFIOW+wgDeiBOGGEfoEioJ+M+Jw04Of9YhXYbJQ7iZl7/3dAV1gjBxwM/a4GjT/Tx8T+i6BhfDKxR7bbsQ2jtiEEV1g3OuO2IQR9+MBn756A2/e3Mfn+1cwXncITzvwTtvS9wkDABoDeN8BiVSN3FtbMyE8BPAISFlwk2/MmBWYTEW1zIcIOgTI1t4vlMlJAh2V+RZTJ5MAfSZOo0A6KfdNcwwL0qh5g4MjjtHpOQgCGQMOj3fTTcy5gNXiWcleuo5qW91zaQ+YEJ8FdNcEMHDzEcKz7z+gvxiwi4L9Wxd6TxgIg97k9CCB9gH9k4DjR5W8xz7oeB4AvpSiGk9bQdoIdilMil7BzKbZupIc1zgpePW5KeT8EROZm58T4mn82zMVRkEYRclfgZK61p+jZFKdEAYGHUfgnceQq3e5cn72PfLf08YCn9l5FWm6ZNdbjmkoK2fNyOSO/yRkEnqm7K2/Mw3F70mbstpY4Lbx/P2qzhPevYLmZXmUd3xDfZocUZu3S0rl/T3rI0dWF2Wr63efS3eWF7elsPZozVUqYlzz0SZQ1522zZezoLAVFlCfv1n16hsP950vVs/eetqdOxHcEcKCE+vtBgE/UysD5Ro9ASwcTsdLfZ3+Z5eioswT6vOkXW8T3rXlLrbj+bgy743TIsfZgscQQMzzZwbTXLakqBhHSIw5HzlPc12bS+cxNyN7G6SpWI5fr96tF6uJgLpuamOVVkZVy3pceS7qd01rMaj/vU73kstDjG13nRUrVqxYsWLFS40vfvqX8O/9q38S/4U/8ofxQ7/nn/pA2rD/7AGf+tc/Axmec/HeC+Bv/tJ/jFcvPor/8q/5Y+jjCxCdHxb8zl8L/MC3vXshxw9+O/D9nwT+9F8AvvD2e9O2FStWrFjxNYOXm/D1louO0JQYJkvnaoW7KfTKvha5WIIytZrQAj9cCLETlABsHQirtltZNalsx9TBG0/25n2z3GKpIrlREcJLCASEbmr3GaXFiXWk8Jz4PrfSzufyhVdN+eCzI0NrO21/X86Rw6WKiuQsBGsV4PSka+vazwWRT/Iyyu1qJg+z7qxUPCeoLSwDL+Sp5nZ99WRwKbhr9oeMEpicjaGWbWKpY0H9smS37PP5LozRZg5KTwBkBbVZqy5LVOf1880egQJCFwFcQra9npntrUsTR1HlZrEIV8ItjKrmNEbXK3pDAhiCMM7JYE/qklRNlQYxXDrB6kAhzThb7ZIAnPOvWI7Tcg7c75mUAzJpzUA8AJtHQUm8CyUm4etn5Hy4StjqPyp5XsvxJGXI7a83kH1UopgnooovGPHhEZfbI/psSRpIECAYOIKFwEJK+sZUyN77/QEB2SI6dRg44ib1GCUWFTBnMhk9gzrGptPFEeMYQT1rfmOE6dpgnw1B6AQhJozHbro5nYA6hhyiXlsUJWMtl68Rm6LjP9xEzSOd2XoGVEEbJxLT/4vBmE+oSnkMsNy7RTHL+XfO93abIIkgI5VnQfs/tydmgtqc3SPw9FuB8R6j3+X+GKLmNgZAiZA6XRyETiAbwXiZVxuMQdvaqaIanG3D8zVDSK2cZRpzJHNC0ghduDFbFjvkx93OlXz55dwwkcCU9FmLR8npGjCpe8e5OppYQIcE2g+Qq+sXt3IuDXHfNcOCvfN0jnv/1oSr/86YrfMS2eVI4Clvupx+B/y5rdQELbVuTeItoBCovu568dDpSWe/YyfK1NZ8obZZNvvlXH9dhilxjQSdkcp3QdO++A7Bk3qBVq2kxpyYbrXZ79NtYX5e3t/KXX/SBvv9jMWyK2R+n1pzmnPOJD61R90Wq6J2nFm6H0sLyVrbzx2XSd66Dc3jT1KR8NTmxXZW/eGtoVvz0dqmOYQpj3A9b8okb7Pddc7g4BZd+oWdRLp4yf4O8GRwK+/wihUrVqxYseLlhwCcEj71934SV48eAwBe/8Q34Pt/+2+9PQb4bqtmwVs//hjXv3CjZO/7z/dCwGD52lnE9nNfAX707wK//zuBb37l/atnPwJ/9meBn5ZXgB/5VuATb0zim3eDEICOgB/6blX6/uefWo6trlixYsWKlw4vN+GLTO6yBX8dmWREoV8lb4RlDGiShrZCv7antTKjWqFSKxhcl2WoiUsrL8blD6rIXKXrywEmpW9ua1EudN2kFjj3sfYBRCuHpK3YAOaBX68gtflW3R8ngXCZzqUwBdyW4FTLGMcc1PP1V0HWcyqSulxfzjnbzdgIapaAO+liAB/MJwLKBHRBBVarpFgJNQQChtN9k5IlVsrxgFmeX99Gq7ql/rVr82W1yOkIUEoahMwBxvqPhjpfbzP3bivAWCtN/DH++agsDFu5J8FhFiidB77dc1dBDgcwi/KVvT4zAR24C0qImr1zYlg+VvTKTFmeUUoARZS8uUroKZmqDsJq7WwEFowEs6Z63sX+bwSZ/e7UfRK1TgHAPanK0V/6XDA0L9hfe0Ah0jaPCGlHOAS9TDHFqSgpKL2oZXOnrJ1sAFx1qtaLmXAECrMs152SvVlFCuhxdDHi9VeusOtGBBLNc5sxckDKNse7TPT2MWETRlzEKQfQ02GLkSNGCWAhdIEzIcuQDYE6RugEmy6BOSAEBnrKeWMznH0zBSV7+z4TvoC+VnpG7BjjGJDTzSpRmtXUCALqMuHv8u66m1aIWq3Ixoe+e2LgaWha7l67V+LOF6gyuRNtT4qqPu7s/Ssl1zAZacqZYI9A+lVHdNsR292A/c0GaQxKgFMmwDdKkAP5sbvM7U2kCu6OtI+Oeo3SCYgp5+YVMBGid0z2Y84ewzCN83qhA3H13NgCk9ylgXXxRBxEF16wgPtJ+Uisil9E0v2JEY4j6HBE2r9HdmJ3Xczk0SCpZgtX6u9r/S1Gfg/4xUP2vTJF5B1Xc7femycqW0+i3mbV3LKJrtWcSwukGtbYVOe6N5yoRN131t5zjYVNi9bLbn+df3emZIYRqreouH15pqRdSjewYOFNgU72FXJ7quC0nNx+ya4fs3KwcL6Vcdt8pxCSC/fPn9L6rtaEfEux3so7DTf2y9y7Gu+NY+cF01kVbt12ors/R75dzbpb9fp5TQhOEZ1J4trVxLsA1Xl+a7SUvDDCmqb6fLuIML2kV6xYsWLFihUfJnz67/8MPv33fwYA8G2/9gfwq3/LD2k8g4DYde85+StJwEfGWz/+CDe/9B6k0HmeugEkHhFDh0B3m7O/X/j5t/TfD378/SN8RwaeHYE/8w8DvvxNrwK/9wfOzxOfF4GAX/+dwMdfA37602rtvJK+K1asWPGhwEtP+AKYFHYiU/5eC55YsMPUtAFz8jX54Ikdm8vrIkrwL39YacgE5Dlit/V/O8aCMC2LNRfEIa/2tfPyOVSpBwjQfJb1tsbHmojUxlm42DcL85wEDXPSeBak8+oOT4r6fLUnihHK+ZAXSOFi4wjMcteaWiGSs3LORLmRq3a/LYBmwdHEznbaE/jueENtP8jGTgCzQHVR5VT3rr6V3tqypbR1St1Sbk3qehWvD376cVMpuEQEVAfWC/HLU9DeLDo9aVy3Bzi1L3WKNGKolboFMYESaDScBHF1Y/vn1sTSqXZOFjHUKiorxp5Nr+JvlC/DEelxQjgeQRc70Mc/Auw68K4v75NCVrEAo5LzYch5Qlkw7iLQUUXkKjEYRlLLZfN2duUJAbxBsa81Ba/EShUMTERgPg+Z2NOFHYI4SFFUiql9s/sAd46ED1M9+orTe9jdAPFA4A0Vq2q1qxakLWVLYn1vShTIJt9rIz+jIN10wEgIN0GJ8EwW807w6jc/wsVmwCYmSFbAbuOods5pg5jH3JACHmwTHmz2uB43uBq2eHy8KOTwZX/EJiRcdkcEEowc8ODeBQ5Dj0PsS27bXTdiTBHMQXPgDgHhaZf7TpSL7ViJw9zZ/XYEd3o8CJqHN5PZ6RiBY9BrCtoPoWctG0B6OAKdoOtYFbtD0Ny4QSBMpa9CEtAIPNtvQSQIUdsCR7IjQNW8QwCGTDiPhPHRJqtxGWGnrD/vO5jNc+wZIoSUOvCDBCZBt0kIUVXQXZ9AJBgPeg5IVcwhCnjM19oxaB+BRJANg0boz/bq22guXSWVlWSNe5rGZRn/7nd7PUV9tZDkMS9SyG0KcGQvQRdK2KB1ixqIpvOQx7o90qTPIz16Cnn6DO8Ks/dTQ/lov3pFXovksuNZIJKmb5y9WxrvxsVFWuZM0VLsVirh8n33MFVmIBAc4UlB7Yd9ma3FQOcWgQGLVs6FEK1hfUPVgp1SdKPe5nzJkac1MdlQrs7tjKvvR4uY9eU3zinbjTS2bbcpq+cX297eWJCmhLU/1c136uNaC7mqdpwooVukdZ4LAn7s87x9eXySLV5D/c2fxsN0fPU9rsd+a8GdzXPgxqadP44nz9SSFXN78drUtkLGOpeTqT9cf8Woc3EjYEt6ADfnyPWKtaGaI82Or9ta2zUbkWvn+HeHORr4PmipklesWLFixYoVH2p87h9/Cv/eH/+fAQB2l5f4Q//Cf/89z+/71n/2GG/+hUc4fPH4npZ7Fzw7vIP/5Gd/FN/10R/CD37j7/yq1//Vxp/+SeAvfb7H23/wtwOvv0+sMgB89BXgn/u9wE/8Q+Anf+H9q2fFihUrVnzV8FITvmKkLjAne5cCp7V6t7Xdb2vBCKWWyjfQZPVcB33OBVs8CbwU/DmH+rrOrPo6q/x9geOqk86vOGtZZFpglRtByaatJk3E7V0VGq37e25/Q1XyvsOrhyHzbaYEXmrPXdparLLfRdDPq7xm9eegJ/OkKjk59w7juIU6Tx1w+/V6Vd455TcnyOEAiCBc7xGw0zzgCBNplUkme7dQziVarGo5E4d2jPK9OnTzfiUA6zae/psRZW4YkDSGrx3fegRkYbuvK6uJ1aI6705Q0jcgK08FMqpqSCJU8dvJpAROBEkEDJqvlxKKlTNvBXKR8MrFXtW4AG6GXm2YAyMJYUhTp0xDnXBIHRKHmfq3jwmBBJfE6EJCQMSmSxhTRIgMQVByM7DaPQcGIoGFizpX4rSQQ5jArHl3p1enI+eD3lfJRLIE0T6px12npLcAas88ViRNVMJTSBWrwxAhomQ9RdHy7V5b0flniTbOCEIMRNFXFZCVxozQMWKXwCkgRVU8U1CijUj7c+pkKVVRtpYu/FY9TkL+567XCG8RJfVbKUpn5K+/JitX9LtN0OdIvOraiJp8Xjnfrtk/cwQIqLh7UGJV7h/eu1XmM6Jv4b25SKzpie3zvK3si8C//2qi1ldfFpB5tSG1z2m9U5/j+1eTkVrtme+NEc7e3vi2c5bQOH6mvr2L+8dCOfPd87b67TPc1m9LaR7O2ijfUuddUauOW+T0mT4TkdN9LzJPerfzq8b8rzlnbc0dzuCcAubEarlaZLm0aK3ZjqXj7OeF4+80L2+dG0L1kl+xYsWKFStWfBhxvNnjy7/8GQDA9uICn/tHn8Llwwcnx10+fIjXP/Hx5yo77Rn7Xzng+hf22P/KV1fZa2BJePv6i7g+Pv5A6v9q4Slt8IvdK/i5C+AX7/XAx14H7l+8fxX2nap83886VqxYsWLFVxUvNeF7an0m89X2zvZ4livUn9OZ4kVO9/tzfKDFk7iFoM11marUbH8NnvQ1m956FX7X6baUToM2RUVTk8waHPLKHsqW1Uo8VeSoyxsrNcmJrFgQ0bK8WqNWLlnAjqvcwX7fuUCrHVdsob261EemXL1oqHI9UWrKX0/8l3sp8wB8izCurSRNWVWrf+wYH+Szfq3bV+dWrFW6Tgl2kqvW8tRa+b4MUsW32gOG3AU0KXf9uQZT9ianjnaqY1OJ1PbMxf6QdVzMVLxuvJuqhLJaeaY0s7FuQVIf4HSKlqLOceO/lFPURpgIVJ4Hp30uRLuuc+NQxlH/ff6LCK++gsivgC83kD5CXG4Us3cOQQkrtW9WNioeuZCi3FFJB4sEJVQzScZGtBImZW+ciNsZQZaPLS71+Xjtm9z2kNXFhZyGqo8FkwrXEWfCWh/i1H92rORj41H3hQTQFRVVJ2+B8YIwXoiqd/vMxB0CwlFz9podL6Kge2OP+/f2CI4VPKaIxISBA45jxJj0XxcT7m0GsBCeDjt85dk9EID7u+kPyaeHLXhDeH17pVbPcUAkQQyMGBl9nxADYxtHjH3A/Us9N3HAVTfZNw/HDikF8D4iHQlJOqDPHXrQPLfoGHGjijQZumJpTVcRwkqsan8TENTeOd10cyUwAUQCvlR7aAlKiB+vN4ibBAqMsEngMUCOIY9jaO7gkUADQe4lJYWZCpHLgw6KuEvYXRyx7QcwBwwpzsjdkNs1DBGcAkQIm90AEVKS1ayRYya/hZCO07tPso21qbbDIYB3DNkyZIx5rE3PEdtigryQwMaNqXpBupigjF0QwlEQRwFXVuf2r86RHQaecgZnnpxGRrgZEZ7dQJ5d6QKO9wpn3h21NfDsu+fPB06cMJQcnX8Xbk3DkL9/RbVIPCktgfKdqReWEBHQR1XS2vvevms18dsi4er0BudyzZ+zel66JsvT69thaPWlndci0918opk/d8nGWqbvi7/G1nG1SnhRXdzaf6YPZtdYK3bz3IKquYOSz+b6Qu3xOlPhyuxcXRTStUnc4pSSpry21XVRDCWdSMFiLul4siCg5GUu4yuXb88Ba25bm0/Uyna1LT6trlxj9TzZs9PMl9vHaf5hTjpmj9x101wrt1NEQClVc0yePvZaALwzz+wYP2euXX+i+5ukLocZ6Pv58dPFzMnicPqOWbFixYoVK1Z8/eBwc4P/6H/zbwKNleA/8Dt+GP/0f++ff67yjl864hf+5GfAx3UV2fuNn+nfwL/0+j8J/pG8YZ3HrVixYsWK58TLTfgCp0QsMCdpWyRvi8hlmVzrzilCQ2Y1artbO9/IqUJAymmAB1BiuLZeNCxY0Z202Syr888lAOePz7kDS0DZSL+TtudAf0sd0Aq8FgLVBzwTilq3FRBu5QWs71nLHtMC1P7a/fX57ScB6zP3cal9NflaB02LIlkc8S0TH10rlj1OgnSe+HSMX6B5ILrOhWgkrz/Gl9Oy0rS+8ZbSdq1mX+ktzdnl7m0E7UWyzau3KW1ZMerOxjNTje0QSkB1dqojR+pceqpGXVBMPQdkGCFPn4FYEF57CNn1au8cA0xNaHbKqv4EMGZST0iH7wg9VpT0o9wkySTxLM+pPcpGaNF8e2mX/e631+shBJjyppJTJ/s6MCOVSSblqS9rVnTIxFq+7riHEpodIW2ltCkcCGEEaATSDhjvCcZjxFXYYuSQVbeCx091xej9e3vEINj2I4ZRxwQL4TDq56iPqWyLmeEbWXP3jhxxzGSllRvC1OqZotW6lATMAYdDAB+jEp45Ty6EEDrWNRcEVdyOARxFrZd3IyQF3c55EU0iaBpxQeiNpICSsQygFyWCU4Bki2LLnSzXESkIQqdEK5EAG1Z1sDU45HzJGXGbSh3UMUIQXFwe0MeEGARXNz3SqNdFQRBIsNmM2eY5gDLLuulHtaFOAcwhr8HQczpi8DZCRjcwGZDOvqH5+2b5icNE4M7yUU9c8nQ9PI1PI4m5w7SAwcZkUrU5JUHI/0w1r+ORip26ZIUsJUHYH4EnzyZb0/cKZkMrfGpv7yxqT/bdAgo0I7UQ5mRvIbLsu6InabUiICOmPFlYEb+lmWUBmf9uoa0S9mjtr3PKum9XUdN61NbTJ9+EajFVi2xu4RyB2sohfG4u4u+jz82QiWhv1zy7biN/z7TlHOlsMNK2qdi1b/JMSTq1e0nl29xeuXNY288uMljIvzw7t55TtK7Bj8m6bWGaw/pvu+W8JnHzEXfuybyk2tfMMdwgcwvY9bVbeJZPPDlu9ntrEZvfb+d4Ircmiutzqnmxz8/r5/zN+uqf8zlSpyJZsWLFihUrVnzoISdiCsUXPvVp/Pj/+c8AAHb37+E3/YHfg36zOTnOynjzLz7C9af24EFaxX3V8YUnn8b/75d/DN/38R/Gw93rH3Rz3jMcEfAf3vte/Fz/BhLodO68YsWKFStW3BEvN+FrgRP/OzAPhNS2wEXxmo+rc4QFOi3Hl+F/LmSfBVsxb0+9Yt/D21Hf5TpnvzoiztpjSt/q+me5eGck2cJMzecyK6rNBIQqx2wziNoIcLYwI04duVrfJzvW//+EjM0/e/K8VhYtTZTK/ka7jL1dtLpMRbnSREuBdHK9lWrJyo4RpuAtbTBFccJEAAfBiQLZl3PSD07BnG1KRcYZaTsr50VsF5fOaeWnq8l7Z2cuKU1j3J4fr0w2wserfJy6a2a9SQH6cGY0rR8T+OYGdDwibnpABNRrvdIp6TstMFCyMLAqezMVo/+NQcmszGZRvtSSD1gmknXGTVIp4mT7iU2u3+3sbQspTPNjTUFsKt5SRjhTtkwkMZK2PxyUkCuWz3Z7DkAYgO5acHiVMN4D5BgxCGEcImKX0HWM4boHCDhuR1xsBuy6ESlb+gqUrFX7ZiMACCFbNB+TWiEzCAPHTLKrwpdcw60MOx/IhG8KEFPTyryTQzT7V0HKClswqVJ5kzAcSFW3oiQtEumzF0Sto3P9jF6Vzl2+J7mPPOEbbwLSLmiO30SgKIiRMUbRcnO9iNOA6foRnElayjl5H+4OSt5ywHDstKxgZI6gzzmT1T5a+2jbKwk8kmBISvZyCqDA6DrG2DOYdKAoN0DFDlvHkX0X3SICTGNqyWLcq8gpSVHs+rFGCYgDMqGLnAs67zPhpJkW2BgWIIwM2h/Bj58088E+N9w79MS+d8mKF5i/P29ztrDvgOHcd6pBiJ58v2unjFYOd59T90xuYiuvvFdrB44a7lty8u6vnTHqbUvtbilsl+ptIecGXrLbXipzVl9xRGlX0SQ4q1y17ZzBjf3CxZWieU7fnc657mJ7vXRMa3y0xnZLsV47vLRQ+u7M8+gXGTa+x2Xu6e9bNV8+WfTQOv9MvU33Hk8k95PyuKkWPq10/rdDXX9t1Wxz9/q4k0WQub8lzwltv/+7wpfr8wr7fS+SpmXFihUrVqxY8aHEm5/7PN783OcBAA/feB2/5nf+E5DL0/l+QARxwDt//QmuP7X/ajdzEW9efQ5vXX0e3/TKd+Gyv48Y+q+amwmBsIv3cOArjPLu8xgnEI4UIQCuqcOfu/xOfK47teE2bEZCYMK+5+bf3itWrFixYgXwshO+yITHzJo4QGLIFqyVgtAI4s4FSurgn7di7uJU9tiwVG4FvFoTjVZAaUynAZja+k1Eyd0QNLiTgz3UdbP9ENHynOVt05YZGqhSJaaRuRXBaTaLziJ6pjIQC5jFWTBZD3BBw1rpWSuG7JxiCVwFHHMbp77hKbjXUjrHMJH5dQCdGwEyj6XAvsGPEbv2ErTPVs4tC+WUnKrDKXFrAta3wwd8U8qqV5oWKZT2pqLcmmyXpzokMZCcHXOdL7moh0Lps3JsSlM7rL2BZtbKAECkY3Jm85zbU7qS5uOvaeWsB+j/c3/NFjRkO+gynn0fzcYwSjCalJ0rCr07BTtFIOOI9KUvg7ZbxPEjkMsd+HID7nNeX3sWRHL/oqgNASDuGSESuCe1d46EMGZCcFQSRc+Zqq1zmfqcvmT8clQCTGy3CPzqWk/cSodCovn9JACZCtnIXkcoCyZyreT5tXawDj/JdtBhzOdlobsQMNwjjPcE6R4DI0GS2mIzdxgAxAcDYmSkFJCYkDK5mzjg5tjj/vaIy/6IZ8dtIYAHDhg4YBMTiATPhi3u9wd0xNiEhBQDeDMUpfD1sMGQyRPL/7vZjlpnDMAWYA5IT3pgw4g7tVeGENK+U7I3WzWHKNhuBwgThkSY8jPnbwkThqteSVqmrH5WIpiigIKASZRY7QLiUbB9M+D6PoG2KDl5tbH5fMqVRIA6tXEehw4gVRxfXh6w7Uf0MeHLT+7j5tlWbaCjIF6MuLg84HIz6HgTQgyD2l4H7WcGlETPN0+VvtqIEBjoAtI+lLFFTCU/c7oU0C6BewZvArqrDvE4EbpG1BYCOI+V5Ma6RILljaYEgIGYhbkS1FK8PC8dgSIQBlFCeM+QSEi7CBoZ8cgIT24gz641d++7ITT8YqX6/V+pQU3hSN5Fwd7d5kbhbYfv8H3xBJW3wp9I5wTqu+q77Mpx37byzq0cRE4UqfX3yt79CZONL1CI9Kai1b97K6cFT3KW+UX9HWoh13FiAWxlL53r+nmmrq0XDDXaOG2WRevkWZln+rEmlGcELzkWnQKob5Cjdv02vloL7FqLvNy5AOZzDeE5ed0ieHOqj5N5U4s4ni0om1TjZRwnd43RqYHzeUpi88lcQWxOy/Ptniw9URZXz4+2JWQ3hjRrK8WA4rhjaSasTAAYR50jR0fOhjCp6s/l5G2pim3hmrXfn18rh2Nsz4+YgZjn5Askr6nAZ/MsuwdGLK9WgCtWrFixYsWKBp49eoz/4F//U6DGnO+b8GvwbfjNOL75HjspvQcQCP7qL/w/8Ma9b8Tv/u7/FiJ9dULbr/WfwL/2fT+Ov/bmf4A/89l/9V2X9/P96/gTr/wwmAgCwpfi5dnj/9hf/iR+7ece4H/0z/4cHl1+7d2XFStWrFjxtYGXm/AVmVY1La2Sb+1robXa337nqqxa4bsUTKlX9C+1r97mVv2fEF9+1b8peqETnudGFexU27isVyxWyS74/DwBdR9obAVHT1TUDfKv7lMfjPRotet51KkLKhEAp0qquo5z8LbMhirg26ynnL8QXG+RCA0srnI8p9ZaQksJf1s9wFyNflLfmefjDu2b25c7IsGRC6qoCoC4BRu3jGOzhpXrmyzsJRD1QBdm5O7JeWSkV85xqMwsiEhz4mYxqKkjyZ9nZA9opgImRlHmTtdqx7n3HzApemU6biLu3Lk0HV85IE95g2U6luy84IhiO9/qCgB3mKx6rYxMlAIouXYnN1tSElKAkQP22dLZ7Jv1WvT/sdN7MqQI7rRRRmRKVvtamUXZ6jpFyUyASDAOQMrXF2JS0tMsnskuTOsexwhmvWiJ/hkgvazkOpDturUDiKA5eKMowS9KaBb23crIXtsSoOreoIxpyLbSgJI/IQi6bHe9HzscDz1kH7XNQdBvRuz6EZuYMHBAJLV37rMK+iaTu5wJGlMnWx0hZpVzyDdZRPMRR2tjvu8dQxJN+adnAyj/rx6zbj+xlNy+xEBIMrM8l+nHrAaWcq7tj0lAI4Ou95q39z1Wr524BLQPmv/eInYXHQ/mpNrSt9XIw9vacmsO4LsoQlvHeWLb77tree8XluYVd/mOO7QUtS1l8aLS+BY3k5aatzm2zuXfPVfHi3zL6/OWCN3b+rR1TnTj/ZbzCnF7S1tL7lw0npO72NwtzRkX5h5n5yylzIZaty6/dU6rHUv7PKqFdLeiZft8Wx0rVqxYsWLFiq9LcEp454tfbu57iG/GAcNXuUV3x7PjI2y6ixeLhb4gutDjGy++C69uvuGFy/hMfIAvxHsAgE/1r+GXu1f07+EzeP2qx3d/6RLf+8V7+I6vXOA3f/oVPLk4JXy//OCIX/zozYs17LUHwLd+HPj8W8BxJZNXrFix4mXGy034Ag3iUFTdW++31fk14eODILWNcK3M9aTrTAG50DbLW2r5ek3xSTS3ZjNFzjgCMc6DTZZTbBxV6evhr0dc4NhdRznHXctMFemJZSLQptd2jOPUp0vEZFHpOjVvIXQ9setUpRPbk9vYKHeqYN7P1p/jeKribdln1wFLlklRbHWzZIWqzFW61OV+5fn5pc7o+tCUxy5Aa8H+YZzaVcZVtWDAX4e3MOy6+XV4mJIsMAiNc6keyzwFlVt2z3XZSzAliqmMK/hgqfgxaefm8TgjKCx4umQBme87JctlWgU/a/vNyoaSMik4K08LWrxMU/qGe/cQHj4A8Cpk1yFd5AURRCBlBdWmNuo7wf7YoJEREPTW9fqKCDZnJujxBN3RoVj+EgkYBGTilUZBYJpeY4SSO3VGwmWykVgQMmNWjhMgHAEEIG3zcfmxtHysZp0rMfNqmeCFrVkwDjCiELqm6JSgQ3F4KOCt3VPrB7UvRlC17LZLZfiNKeKQCVVmwjvXWzATtjtVAlvuXREldwVqYbztRgQS7OKAm7HHfuiw6Ub0cTpG1cM6IG4OG8TI2PZHjBw0r20mW0MQDFcdJitl0WsdA9II3BxiJnIJcsETiT2SdoQRtJGBQ49wJKSdWn0LCWLHGLcJaRNBDMT8t1cIrMpdIR2und6Ubqe2y5wIsUuIkdF1SUW/OWdxYsKTq0uMz3qEmwh+MKLfjfjIgyv0MaEjBsYeMTAuugFdJuxuhh5jCjiOEV1kRBJ0XcrtUWtpAEijDQJ7xVH5E1qOAeFihPQM3gjCUC+CQVGOx+z6xb2dnMfnCITBjaMEWA1CUNJolGmRQX7WzEI6JEE4JMTrI/ittyHHd2+ldc7y1/9O+RshKenPLg2AsEz5Vr3ysMGzlHck5PQbMFtM02XCK7s5BMzqhFf2WTt8zvnbrtl/W5bIN7MbjkFVw7X98ok7RyjE5sm30/a32lJhpiw+d24rt7A/LjUWWDXJzPb3p1zHOQJ0gbAtFs5VH5EtBkuN8pYWoN1m0VzXz3Kagzgft5h/uqWetnFWO7o0VNYz9bktVmim2+CTucfJN322yGxSA5tDzck5rhzK85TmXKQxz/Bzbj+/IKJCnpZjqmOpboNXBnfd6TyjVveWa26oh/O2mV19428Wsfl6neM3hOLiQmsO3xUrVqxYsWLFiq8J/Njlt+NP3/sBALgzVf3rPvMA/6v/2/eUhZD/8z/7q5vH/dlf/yX8if/SL7xYw37w24Hv/yTwf/h/A19+9GJlrFixYsWKrwm8/IRvnfeVaLJ0tv1GgnqFrN9Xl+PLK0EuR06FqoxI2XLYle8DOrYvhBk5e1KnBah80MYIslaAqLKlKzDbPBcYaiojOMsMhScVRW0t+CJ5XOs2WqCRnKyRXJulEWjmqo+s33xeW4+WXXO9jRtjQFgDYu4YEbVknSwIeRbAbKpflhQznkSu+7EOoLo2nRyX21DIaUzlFkvlugvqQPXMMtyRDN5q2zdDJFsgemI6TKRugxwgPtnk2tMIWPtttoBBK28fyzx7RmbjemZ3WBEMdfJb4fnzvwA5HMCPRdclXOyA1++D+6hq35zb13KSUmoFsCdL53hEtnnGNLN3pFfJmYtpv3Q0/U6Y50oNmBab5N/ZK5AzKWvErimQ/V8VptIt3SNTG8q9bHUROZI6K5fJyLuREF4bino25J0phawyza+FbHdsCJFBAbh/cUAgwXGMoEzashAoq3ZHDjimiF0cca8/4mqzKUTm/W1CFxMSE8akuXBiZPQx4WIz4NHVhebzjdomTgEY8jt2YxaYBDnkcdkLMAbQSPN7Q1D7ZbN67lmJ3wDQELTLelZlblYkEwPxaETCdO/NQpqC5lglIYAIIaj61sheIsHNscfx2OF4tdF+2TH6ywEXF0fc32i/AcDN2BdSfJ96DBwRA6OLjJEDLjZq9TykOK3B4Un9C0AXSWS7agBKbnesdtUJcxV6VvuSGz+mFqeEssCA3D8jQr3yvajU8zOi4yuTGl1QdfAoiNcD6GoPPh7fm9y93smCwxlbXp6fw6F8S2f7AP2W1A/Pmbyl9bkApvOXrGs9SWvf9DuUW9pftav5rS/fmfNFn0W9uGlJBer23Ur0Lu2rv80z94fqeNcHLRXvzMa5VQeAkhvZ/a7nOnK3bust1uGLpG+d33hJdV33YXWczyV8ck1LdtGteoCJVL5NCTxLV+HKTWk2vuv95Xuf3KIHvw84eSb03SMnx/ljz6riWebzwtZiSyOWT67TzWNKeX5+SKd/eyzNjVrlV38bzI5pHq/Ev6yE74oVK1asWLHiQ4ir42P8jU//OXzyte/FJ1//vg+6OXeCgG5V9ALAH/gHH8Wv/4zm8/1V7+xy5q8ce1o45zd85iH+J3/+2wEAb18O+N//9s/i2N0xnrumAFmxYsWKDw1eesJXXBCJRi7BFAnUJp+WrNdaH7ea7K1Jrrt+EOtcXUAzWEMhnBJgwZgampfRyAU2Bb9SDkQ3rgUo11Byq/nUdkZy52slyqrFOhjaCgSeU8C4XLDaHh/4bBBvdVDYglUuL3HBEnF3zqabzgSdgTmpWwhXp/q1c/s7EOJL+f6WlLsJ877yxzNDQgD5tvltXt1lJHUub0bU1uNhyVrU5787FyCtgsNW13PZEPrAp1fBtAKjpl5ZsmUMmF3jiXVnuScLahs7dhyLeoaGAWG3AS56MHWQLkKC5umlJG1iVPRfGEWPDUpmeeKWHCFrE3/bz/nYU0vnfC40sC00lQ1HwIJVEcl9PtgTxPZjY1shc+0WUGM/z9vv27jdHXG5HTCmaezvjz1SsveZIAT9Byj5az9f9moblTigiymTv50SkCRIHDCGiC4csAkjdt2Ip+MWSQgxcM5dKxiSWjv3MWHTJfRZ6S2ZYAWUSLY+oaj3UNguGDo2WEnsmX1xJ3rtiaZcyFHvMQ005aoNouYG+R0VEk7HiQDUmYWzknwhWy3r42rPJuFw6DAeO+AQlIDdMHYXR9zfHXDZHcFCGCUiZDvnLjDSEDCkWIjjQIJNTOhjwrOsnJ7sq7XdmqcYmfAFKFtaU5TJKtsT4Paj76M8JjzJW5ToIjCjVh3fMo1ZTOQvcX6uJPctdBsdBtDNodivv2tUC4FutXNeLIdPiTJP5BWCuF3+7J15LtXAc+C5y2ypdv3P5xSpS9/+u9TzPKrWc+1Z2N+yam7WVd874cVzT2ygfcqG29p/BoVEbimfn2ds1nMPPyeYF3p6ri0gOGcbnVLe31hwV80xluYDE2HeKMP3eWthWivFgrXnDukifN7gGbFc6n/B58+fN2QbRGtPcQGY5q2am7tRr/VXcdGZFpaW+b4nhosD0TSPEtv+XiyMWbFixYoVK1Z8nYDQYYP4EoSLD+M1/uGXfwIX/f0PhPC9HoCrI3DZ3x4eTiBcU4dja97rEBPh8hjww7/4Kv6Zv/+x52rPt795iW9/U/MAf+a1G/zZX/8lPLoccehvnxuvWLFixYoPD772v+C3gUjVvF7Fy5wDxTIRwKb69QpbH3wa06nKZUY6VoEnC6CEAHRm7ViV2bKsNUtnv78RpJkFaBoWcJJtjWcqBOuPbAUspoa0a2mB5aTsEug7o1AqgWvfX6VxjclEQiFPECLAqtYoFsv17MhUvyKYSYtqwl1kTgLP2tIIjLIr11szG/pO+0xErzG66/F2hdGVtxQQtX1WJwW9/y2LyeTGH4VJVQzMfqa+O7nOYi1aEw1mGWn9lnJgk/U6S71AUSI3F0m454FaawmzvbNXzpj9pyeYT+yeXfBSyw/zICYwD2S2ni2DC3q27J6JOiVvXeB+In7Pk74AwNfXwM0e4dkV4muvIrz2EOOrF5A+IFHO7ctS+m9SN2aiFwBIyVcSmufDpYkoo3x/UiRIZ8Q1QCPKcDaFk0Tl/ISNcM5knT1SY67P8xemxrShJwDqdtB0LCVAuqk+U2lqp8zL440gvTri/uvX+Mj9KwQSvPnsHsYUMI5RCV0hDE82QCegnnHvwR5EgnGMSIkgHPDW1WUhOe3RYdFHbtuNOKQOh9ThsjtilAgWwpAiUtI8wGYVTSToY8JrlzdIOUfwbjOg6xIOXY9xiEg3nZK3URC7hPHYQY4R6Fg746gqbt6yHpcIYR/APYM2rErgXtBvRxwPcUbGaL5c0kfSkaPhEDAcuqKcpY6x2Q0IQTAO0x9/fZcQA2eyG2AOGB7tQCmzoZ1aQH/8wTM86Pe47I44cofAgsteyd/rcZP7K2KXrbCxAZ4dNjCbcyOC+23CyLltZVyR2lcHvXYZApgEksJ8IYK4a0QmbBOKAtzGOiUgJMxWNEuwEwAkJX7jIPl8KTl/IVCL82MCvvI20uOnjSf1OeEdKAAUK2I0yDx/mrfo9+9zby9/Yq3sUh+0vlf2va1VmV75uPSearWhVglXZc7aU7tNLBHW9v8lgrdF3NbOEYMn6advOwUuBGPp87o8b2dd11u3p3mMs9xuELsn15x/pojm/Z6puu0bbeRcVupK9a2erKrP1LdA9uru0zE7K+PMdZzU4fe1nEVa7iRlPjRdU1OpXaHYgQNzNxtXpil7y2JEYNGGGZZrwNpgc4Vu+rOm9bzM6gVOFo3p9VSLKv1CM2tPTSjnVC3qjOII2jIeGs+ut2T3xzDrWKlcavz4mc9zKjVwq219D+xPm7BixYoVK1asWFHjAq/gh/BfxRb3PuimfM3jf/k3gG97Ffhf/B7goj9/7C92r+Jfee134J2wO3vcr/vsA/yJP/ddePX6lgJvwSceb/Hv/p9+Df7sr/8SfvR3fvZdlbVixYoVK14uvPyEryl/GHPS0AVDpBF8apUDUCZeq30tstdjFgxrEMSt3z0ZXLV3XnabTKxzA87y/jrlwCwXWam6IsQYc6u8ltVwJnhnKg0fuJ7l7MU8kD5TytJEgs4uqBGsvA13VY96ZUuxaSZHvDcIWGA6/jaVzpL1IXAaKG2JLGSBsH6evqiPrxXCL6JYW1KiNRZENHPqLjXTH1urUV5UUdO0VlwY8zW8gnxJLZ4XHvCBQVfXoBgRuwDe9RDqC4Hb9NaRiYylvCgkjJkECwR2eXHn57l/pa2uDiPBRIpKEkwTuUYT0SZkx6JYONeq3Vm9VNUFFOWwHWM/U+ZGuReEbcL93QGJA45CYCGkFNRGWXIu5QBViga1dCYyYjRkW2E9pguMQEpGmiNA4oAx20Qfk5K9fVRiVNcEUBmekQQxTJ2ntshB3a9tO2cykwBOETIEJTjtnthKWFJiVsYAGQiIor8fTT2oJKxYuSTTfSOAe2gO5wSEI2E8RLWB9kpZD1KabuSA4zHnOTZraQHQARQZXZ9w0Q3YxOnFwkJIub/G3F+St6V8TwydWWbnYwAgdAwegtpVsxsrduvTfJ9r8qnC17jLbM1cq8lJpvGjqnH3zqnHvghCYoSbETgOkHFodNy7x61K0Ltg6Ztxl/dww40DaLzDPLn7vGg5SFiZQPvbc1e16pL7h9n2Cp1VqS5aDb9btfOCWrYQy6321jh3/+pz8ryAgrve+nd/7kIbnwvniPDWNZ1TVt+m8PXHtsqrx1hLWczL173oEFK7xABqK92QVCwulDASt3bcaeGux9Xlt7Ak+/CLOj1JXEFElttQK33r+u6geF6xYsWKFStWrACAgIAdHqLD5oNuyvsCCoKPfEtC1+uc6dGXIm6evNg8/O0b4P7mNJTjwQB+avMx/Gz/Bj4f74NvmfNvh4BvfLRtiy2eAx0HfOLJDt//+Qf4XT//On7ym5/g8eUZh6yvPAa+8gg4vD9/Z69YsWLFiq8eXmrCl1xQQ7owKaa8yqqLk+LX587yytBZvs+KND6xIq5W1dtxdp63bVsifU0hECNmeX3PBWTqskwN6ZUPVk7X6XafJ82s74p6VYCYCdyum4hQTlNdFiRMnIUxcR44EwZGmV+XqUL6PDm0IF+qrq1Fps4UtzzdH0/C3UZkegVQUVkEV4711xRQK6oSy40bHRlc21m36rPyco65Wc5ff3sSF+UGWkFmDwon6tslFNVuHcD38kjMg59kefNKIRMJ75W4J+XBBU/T6XH+9/JzVvfOzgWmMRxoytnXCqwuBWvtuJzL1+o7CfI6pVJRR9WB99mYP2N9KIL05Anw9Cni8FF0lxfARx+CNxHSB3CfFUdJICyq/EUWDA1K7pn6l6MSgaYANsLM9hc1rUzHz6yYBVkBmcnm/DtyzliJAOccwEWNKVlhKQD6iRDWa0PJwSrI211u1jBoG6wuI7DDEcAGkAvGxcURr+1u8LnHr+A4dJqnNwVwIoAjiIB4OSLEhK5jjGPOISuENAZIIsiOQKT5ZjfdiEiCI5TIvB56JYABXA1bxMB4sDlgP3ZqGZ1JgC4wYhDEwNiPHSIJLvsB+6EDC+U683VH/SHdRNAhgg4E2Qhkw9i9eihEsgiQYgSPhLBNiF0CowMSYTzo/1UuK0AQVciS5hAeL/QaKQniDYH7CHk9FaJfCXG9AboGQnMepxQwXG1A+4iwN9tuAaKg2yTsNgPudwds44ircYNj6jBKwNWwQSDBthvVmVkIN0OfHeBDUQ9vY8IhRVwfYu4Xwm434CZtgENUhS8A6VXhbKQ3BkIYXNoEe4wwjSfu9LGKDMSDIB7122z242bZHEYBd4TUab7rEwtzuDF4MyI+egY+Hk/fC8+L8t1ypJNZ+CYUld4iOWnv1xjdO0bPKQrFSsG7iNbimprs9Qtt6sVXXrlbL8g5R17mspptq+2WW0rjcw4Xdq67HiKCRFXfz/rdf6fce1nctmKJ3UJNVM9snN27v9lEae+v8/Tmgd1aENAkjm08AahtnsnzedkaeZYL2N2vxQUI5+YE9TXNlNs6n1hUUdu9jhGCNJG+Sw4lfuGXXYPdJzdfIyKII4OldSvDfHyVMe5dRmxeZ8LZlFQ1nt1Z/ByjHOvmyaVs93uZq5yxPdZ5lpuf1C4keRvVziWlMW6e3CJibZ6byy0uKFb285LOvq7aIWXFihUrVqxYseLrGLEDft3vu8G913R+9Z//+Qv88k+9f+R2AuF/++A34Of6N5YXAL6P+F3/+DX8jk+9hj/6R34af++TT5YP/OlPA3/9p796DVuxYsWKFe8bXmrCV4g0gBwAiKhlM5Dtm3NQZ6wIUf9/C4Zlu9tCCPtjWijkkDvWAitdd0oO12re1rlLZG+M0/460JMShI2spNn2ybI4V2Pkqbv2tirT2RF620cKp+rTE0vqOMm1WrCArc+7ZgSzle+VwsH1UTMgTarGZpkHIWsbwpI7Ee38abUtdp0nuBU0L3U4lZVZPWcrR73WKeCoqmxXhhEFdR/5/SfXbEHWiaA9af8SyWDEcfL9MicRtK0yfzYqO+YTZIV9yYWH03OBKXhbSIOUcn65OXnrjz2xKlxQuJyU7QkJ6zcLcpch7vpmRm6452QJIuBHjxEOB3Qi4PuXSA+2WmUkcKd5xEuOWwBh4EwAU8mBSwkIozK9Iih5eI3gsq4UykQtTdsggHTOMtiGoTjCdtZJWraVVxSUNN2CkmvVd40NF3dMvZ074OK1G9zbHXFIXeHrmFVRKkyIPYNIipI0pYAQBCLAOAZ0fQI2ul/zyQbcHNXGaJvz+loOXgmMQ+rQI6HLxGXYan5fTqpq1cdYyU0OjDT0xfo5jVFVuYKJqA2AdKzflZEAJoTAZTjsbzZK4m4ZMTJiFKSLUcsBQFu2oQEKWcGcVLVM9wQhEXAF9FcAiHB4JYA61tzB1teE3EfA4dCDjxG0j0oK75SEtpUBFxdHfPOrjxBIkISwCQlsNtIAkhAOmeyO3YhtN+Jm6HF12CAxQSRChHAYOhyHDpt+RNfpit9xG3DYRdCxA43Zoh2s724BSEgVy9B7b+OxjA/CZOk8qj3ziSI9n8N5TIZRSs7eYhXe6b0gFsTrhHh1BL/5Nvj4LlYd1wuaDPaOr8hRCo3j7djWOwSYFrB4LKVAsG3eMtirJOvzrY4Tp44FgrlWAvvvmX//1+f468z7ij10TZLXaClWba5W13EGs75fKveMSpV8Sob6PLdfzrWpIlap8V0uC4kyeXsn+DlE1W5/TKu+YoHsyWDXzkWFut3z2tLZ9s3mjOn0XrUcT25TreexLX5O58dqay5lbfBz9XyO8KhznjwPIKJTa2Tb3uoCN//Q9BPx7mSon3vUBKwnbJfmSjaXt8WeNaE7W9zo7k89//ekcot4Bubj0ObnK1asWLFixYoVKwpsyvbJHzziI99yqnwd9oSf/as7jIcXJ2n/2vab8JcuvgWf7x7cSvZuB8L/4K98Et/zhffWSptACCL4o3/9m/Czv/AM//bv+gzGeMf574oVK1aseCnxUhO+hpKvt0WKWhClReTWNsgnBS8QPyUImfcXAk00n285DlVA2BOujcCRodXG1vGttnki09s4Q5aDu35bS+3TsgFs1K15W4GZQvJOwUAo4bJQ7lkY6WtVPq8VZR3AbAVhW3kNW6gto73KWHRfyWlLYU5YtwL2rfhc6/54hdlSfxuhW8WiZ0SuKV9rQsQWRORySp7a22ySAQBp9lyeBGHPlLFo6XhybVPg9ISY9nbe58bIaeW3jkU5HJCGEZrekYBIkLhFQMDY6wIDzVUqmdxV+3kjvSBKZFHSCTibtJaUMJTC4OYKG1y0qXDtOCOKKZPHLaWkJ4y98/Bsu6mGMRF4/pHwKkzJSuVXLvfYxFRUtkQC5iwhFlJVH4lTVgEhZJtnIYQuqRp2VCkzs1o+QwibTERq2QxASd0YuNg6Ewn2mRBOSdsQgqATxphiIZuNcDab7UL4dqL/Qt6Wz6fMThpBTB2DgiAERuxY7ZYTgWImh43wDEqPCRPSFki9bg8HIEYCBsqKNSnsealLCHyMkGNAOBKkF0gU0EZVwXIMuL874OO7p7hJPVgCQn4wOds2q302ow+MGBgXnZKkN0OXjwPSGDFmK+2QLbBjYBz7hGGbAHRZSU5F5azvMiVztZPyLSmDLI/BnK/XFhDURK/9v6RccISwjUfuCAECGoBwTKCbA9LT9yB3r6EiEpt2u/64u6JBTPr3WSGd3AN65/fdbfU2lLm3omW/25ov1ETjbergev9t84EWltSuS3X7NgM4sSWury05wrY+vzUX8srpqs6iYrVFXy3ivIETwvkMcWx9cLJgqbZvrlHXXx/3/2fvT6N1SbKrQHAfM3f/vnvvG2KOyFE5SJnKBA0lSEYJkJBKUAkUSDSiECVoRBellooSCBDNUNJCAlFDU2vRVayCLLWEYNHViKJRQ9JoKBp1oRkB0spJSmVKGTlERMb83rv3fp+7m53+YXbMj5mbf/e+F5ER8TJ9r/XWu9cHM3Nzc3e7Z9vep+YQonLuzsaDHHMISwsLllCOQw3V78yFwd0F5WYLwWQuPYzF4kPdF/P59uKCt7BzvjjtEGruQLqspeM1hDiu1ElE+affmBdsCbhixYoVK1asWPFKxuh7nA+3sLFHMAcWujUdY3Mc/p4X3P9ah/tfO597704Jv/zvOvRxzjjsKTiXFXAeePY8/Hwc0+6OINw0Hd7TPYAfPHrTpa6h8QZf9oH78Ppnjy51/O2AQPjNH74XD97q8K4v+SjGdS3gihUrVnxa464nfIOaN1/ZTs6DleqRnA9q2DZcblL9liSwkMai8JSV/1ruZitEkDXA6PJV90TAOIbfN10o07n5anzV7my7toguFI46aDypFUKbayGdTFkhfRJtNWdWlLIdlQCfHKtt4jwHVbPUI233RR9bA8ySI8eyE0uCvFwhTIkmIl3qT0Qx5QGyppn6uqW8PB3AlMBtGVgVK8hxnJQjZfC6DN6WymeNYZzOLYOSaZyZyfK6ElwPQb0YnNWqGx2kZg8exmQXzc7n5HLZTrnckhwty5XjtHJd7DgHlwLBHPswUyPx9FxmAVc9nonmypSapWHYEK/D5+rn4nlk55MCSPaQqO+VWpxamqw0o/r5kJtzFd7BPX8DdHoOahu0b3wd/HFI4uI7E9SPkbhCa0EuWNiyDyQpmWBjy4ZAzPA2Kn0JkNyybKd83UKkhV+QLJ/ld1k8IdbQiQRWqtzMNtoBJvCnU75fM/0DADvk5+adDbgNMB4xTroeAJKq1BtG34eKTOcwDoF0bToHI4SpDYRpuI0Uu9TANg5Xj/c479tE3gr6MVhFd80I5w0GZ9EaB0sep32HwVkMfQPbeBB57EeLxng0lnHvcfhL7LRvcePmMca9AUkeXvKgzsG0Hs40MJ3D9aMd9mODfrRouhGc2opITAeS1tjwP5G8l+QdDRhiDPeMGMcG7lmC3Qe17/jJBsM9Hrivj8Qy4EYT8/US+NyCRgJbBjcMND7kGLaM7mqPK22P1jg8vT/GzrXYO7GrJvRjUO8SGfjGoWXCnhpY8njw5BS7scXeWez6FkSMtnUhv+/QoLFBNX103OP0qoXvTcyti2DzPBDsuYHdyzgNYxkI48yMkewdgmpX/ienxl1cVECek+14GlJEYewjnjcCZu/RPHkTfOMFkL2FpWqVNMuOnxNnM4vhEil9gEFJGqZnWOye84Lj/QqWxwk1IqtURupvgHIwyN6R+hyx5i23CZkm9sXlceX1A7mzRkmEHlLhzr6FeYqBTNlb2D0DCOpMaeNFuXZLFbcr2pZsvN1Uh5uulwzlKlptGqPqIYoKZnFG0fvK72Kp4q2RrRpKhSzkNJm4rcy3WyOXL6M81ikkSkK7NjbK8oH5vuKep3mAXgxZliXpTmowBKImuIkcuJ4qORvnITxO6g2xaZ49jyoncFpEZsw0RmRuqEle5+rz+lKFW3P6uYAozhaD6LQxRV1y3MwO2rlgz71ixYoVK1asWPFpig888dP45Wfeg6986x/F/SevWjzuc37DHm/4wh7d8cULUTdHjC/+Q6cp3PRv332ET364nR33+C3gT/xT4Pe+DfjjXxS2fcxexbfc96V4zmzv6HpWrFixYsWKF4K7nvC9SIWX8vlG++cLcdmcCkI4HmqXBIMSQVche5eUyfp3fV4kMA+qDQSZPdxE+h46t56brxIATG2rqD2W8qCWtozasnmpTaUCuKx3Fjiv/L6k0jmARJaWbbkMSqWU1FkJ0Cerad02UdUeUrvU2mVM/R4X9WYK3tLWceGcVE92bVqNpH73kUmUSyrv7aEcdJrsld/LYOhCft8l1ZxGUL6oMQ7kwfbsPlUWd9TADB4HsHNonr8FM2zR4BiOGzBZsMqpG1hajsrfSMQaADzxtsnOuUawok68Ek9lIlZTrv5IRBsCIZfUvrRQT6HaNAPgG8zJ53htzhu01uGoHXC678JjjUDksgfgo5V1tCx2zsDaiYmWbRxtiYGgANZo7Py9QsRo4nHWeJioJB4Gi3GwuHrlHDYSiF5d6ETOTtfIzoRU8Imz41Tn0NhJdYxpaCSiN+toAEwgEyybqfXh/sd7DQaas5B7fmhb8JWgJvaOwM4ENTEh5OtNnQ1Q42EahrXBHtsxofcN9q4J+Y2JYYixbQMZLv8AoGUDA4alcK4lTgSxtH9S+ToY43HWbUJb9hRIXwbMzsAM0/jRY0eTuULyhvE6kbjpctSlAcitxOX1TgQ7ONi9B908hT/fze7/pXHoO1NgyRJ30Sq3xIHjqipeMsv7DmFJNXpI/Qrk+2oW1iU5q96ViWQEpndlLb+uWkiWLZqqtUGOP6SkLi2La84jl4V28jhw3uK3Yem42jf7su2qOY0sna8U6dNc6EA9l1Hi1o4tLbDNBfeotk/bMZtie62dF6jpuTKnrR1DajFZyr9rinGtj0X+/C09i1QSuOHgWKaZz+fDh63+7rkdVbCuT58v202xkEQTzgBwm6+WFStWrFixYsWKuwmD7+F6B3/BCv5mw9heudzEiAzSsczAQ28cYQzwxIcbvGrzZvzm+78G773xo3hueBxPnwPvfxL44Q8DeMMjeOLkPnzSHmOkhYWMLxOu7hp8xfsfwC88fIoPPnz2cjdnxYoVK1Z8inBXE77EnJO4SmGatg9jVFcWgRXmnMwRpSkQ1ajI92fq1UjS+vi7NfH/4mNuTF6vJpBYJg4qMCXHy7lAUAnr7d6DVDAp5fAt87iq4FIiucoA2VIQsCR3JSewlJsIw/h/1SLa5mXM1FMFYVvaWBsoVSvq59byJGr1a6lgEhWMoaD2HMe56kWratO1qOtjHxSkzYKi6VCuwTJgLMTooiqmaFtJBmfEcbEIoLjPzEr5pYPlpZrH5wryzFZa34ti7GgFU1LeaBtnIaIPxDZnCpZYBlkb9knQNCpWMgVLss4Oz3UK8Gqk3HZ+UivViAMpR8b6JUlfsMP4sY/DbLewr34E8Cdg2mBsbMhza0N/UrQSJuaYa5zAkQRmA3CDsN/Fc4CUz5djHxIUYQtF4Krt2t5ZK4GFhPNNIGolB2tGwOlzKKg2TQ/w8UT4wmMi/gxj7yy2zYBr3Q6fvHkl5Oi1HuNg4XsLmMnO2Y0W3hPaNlgxG+PB3mB0BD+Ge+I8BSI32j4b4wORaYONM2EieI+bHgaM58wRGutgbYPhRgswcHzfDQDA6A16F5Svo7PhQhsPHmPHegJ6AvcGaCf2cWMdNtahH20gUGNeXvaUrKCCfTVlN8EzoTEMYxhD4+GboOQWC+PuBmBGgt032D0C+M4Hm2fpJMvBYlp+J2B70sPa2B+xfYOz2I8NzvYdNu2Izjrcuz3H4CxuDR12Q4NhDGRwYzxGMokg1/bbhECwd1Hha43H6fkGPQPYmTQW2lOC6ZWqlxVZ6+P4GgG7x2QNTkgqdlZjLfQVYBzDDBzHbSRfKPRFc+bQ3Nhh/ORTk3PEnSI912Zu3RwJyoOkbvkOl9+LRUQUrVZneUs1aq4PQN3aOX67wz6lxNTH+0jI1dpf2P0mVwNph3bU0G31HOYWVtVhMdVx0e0Q5e6CXfBMMazamFk5lw4SJblZllUhP2t1lSrR6r0/8A2v5tc94PiR+t0QeKh8f+K9yKyrdV2lpba6X7Nt0payL5YWn5VtLtTdSbksUOruTLmLfAzL/JOdm+yz1dgF1Lf/0LNXzucq9QBIbjfpZ7kshLlBmifFuXn2rB2ynvbimhLnG+UcJP39YKc5yzCkNlDXZmXNSGFtC63n29I/2kEo1pn1n5ofBWvxOHeQtnBlnrNixYoVK1asWLHiUiACPufX93jN5w74l999BZ9/z2/H513/MvyV9/9OPPf84wCAH/8o8OMfI+DrPh+49tDL3OI6XnVjg7/6A2/Bu774o/jgw49OO15oaqEVK1asWPGKwl1N+LKoAU1gOKoKXiFCRR0L5GRObXW9kDwlCSnnApOa0nOwc9bn6eOzBqvyJOClj9WWz2I7V9pNL2CWu1TqELJWBzlnwbUpaEjWhLiQtj1k1XfJHtjVSW4pV+pN/VaQ7SmvhiaWfR50rlgjZv2qSXqm4jh1f8q2xWvNrqdE00SC089I3UT2EgFaLaq74oAaKLRXqZxrAVggWor7quX0rK5SqZtdV+V8acNCwD6RtIoITm0tSXLZJ2Rxma+3ch9mQdpSmSJj3fv0nMcD8yCr3h6f6ZJ8zuwYtc1mRRkVFGwGuTrW43YmwL4fgCeehO0HmPMT4OErcJ0BdQa+JXgbCFSdKzfY28Z/DhPR6kJuXyF4S6Is/SgkryhWhbBFTuCSw/SetBTJNiQ750TcRUJYynQdQNupfNNPx5oRsDvCk89cQ3/NorMOV7d7dI3DeR+C3M5wugBR8PJoEpFrDGMYwzaKqt/zfZeub9sN0ao42CvrbmjIY/SBxNw0Y8hh6w127gg0EG7sNpHADPlpQYyuCYpd13r4nQX5uCjGAGKlTQiK19YGu2hrNoFoJoa14XlnzgYKmCmqloP1qeQANobhIrkuRDq3oe+aU4AcBUL82IUyfcgJLLmAm8ahaXwim7vGwRDDs8H52OJ8aDA6A+c7nEflr40q3qBu9mAAQ1T8nnR9InVF9WzjO6R3NqiETcipTIYBR6CRglVzj8xWXI8xAMmq2YwhZ6/Xi4/k2g3SwoOUu9eFBQgUpeFmYJjBw97qYW6ew9+OgvMilO9bUdhm74eCBCuOnSH7/kQiSS+yKr89MzJtAdpSmXlGoGbvTrFmFjK5/M7F66D2AmJTgQ8trKqdVyMRy/P0gpuLzllalFXBrLzieCq+tzOiuYRYJOv9Rdml1XL1W67rj9/dKuFeKo4r5Degzq3ZRi8t5CvGQAZbIXI1khtJMW7IpMWGabwDuWWzLFpSVud6rlpV7Eqf1uzPC7J4Vpa01dYXVCQXkcp1zhZOqoWWpWo4m48XBK5e9JYWaM4WcRTnt3N7wJkrQTHHT23SJLbUX17nC10ss2LFihUrVqxYsQLdMeOLftc5nvilFr/87+7qcPqEZ24A/+rngMeffblbsmLFihUrXiR8mnyhAkQ5RSVBWFPLWJoFT+qFHiBwU3nFav2LoNUAtbJivTP1r7RHr/BP+bo42qVecE2FyrdKuAH14GdJopJZPr/2e3kvRHGbjhlz4lSOT0HcMqBaXKtumw6yl1aTF+EiS0ZNNEc7Y2bGJUZTXt6SulSDzJRPWCvCyuDoRQRz2f4UBJwHWXXdoh6uNk2razAfU6muGm73mdEoF2IICSxB69ozXy48WCIYxLYSivxZsihfgnfwp6cga4MK9doW4Ca8nxq1UCCRZYEMFaIMTDkR5oP69+D4ioRvtkkuTcheHwhkzZZKOuaZPT0F8o0bgE3el+QJPE5dGkhAQn/a4HzToXcWR+0Q1KQq/y6LFXK0Bp7WsuQNJxtsid0oBEuwHg4WxEg2xM5TUCgjqGk9EzY2EL69s+G6R8J+34K7EURjIGGjBbO1gWj20kc82X1TJGo9EwyCMlasm8M/JFUvx/ak9sd9wGT1HOyjGb4FbB+vOxL9dg/QQPCO0Gx8IsStDeS0tYyuHdE1DrfONyHHLweidmSDwRuMzobtsY93xqNtHI7bIRK5JvXb4ELeYxsJX8OU2mgo3A8hgY2Q3z4sDEhEv49jRMaejFX5pxYOZOx87VXCHM/joLJGJH4dw+49zK4H9n3lxDvAwvcx5YbVKkIsLGYSHFg0pMmvRevZA8TgrA5dztI7Vb/HdZ01wlCriGuqxtIhI514gJgtsfRNqilOlxZnxRzr8yK4bi+sraNr3y1N2r4ICwhqbTuIi/qk1tdLOXFLXGTjfeC86jzuMmWZynnFuUnlXiOM9bGisBcV+0KeYEDNMdTisJoFczkfXlLz6jy9YZ+an5B6rixN+1O7Yhv0Nmvzvx3ElaSGIi3F7CqW0lvoNuq5VG1h6KrYWLFixYoVKz7jcfXaVWy23eL+3fkOt26evoQtemlhLKM7ZjTtC5sXNS3w6reMGHvC4x+ysM2nwTzrvAfe/+id/S2xYsWKFStekbirCV/yIaocVHJK4avzcIndMhFoGGOQRJFEAh8j0zpIU672F6icZABydYReba8DNfK7bNO2t9IOrcgFgjJAAkf6GCD8Hi3cQrydw/G6vFhWpv5N1owMeBds36yN9r2UlTcFkFU/RItGaluwkM3K2m86RiltJIiplULkC7I3EnZawlhTWGuVQs2yGYhBcRuO1YFvItUGNx07jNPPcg2j2ibt1GpXbatJJhA6OrAuROlSjlx93WSm++ocyqB6pjrR1+yLuvQ1HAr+6rG7FOTX12sIPIwgWAR7XQmO0kQqisp4cEmRm+UKtlM7g720zQiKmY1pjQzWSsHYX9n4E1WLfgbTtcQ61LNKROE2Liq4XFIlcQrIX34S7G7cAG6dohlH2GtXQA9fA9AAZOA2ISfqZGMbq+ZArKU2JiUlJ4tb7czIFPk2IsCHW8DCe/tAmiVbXQCirmRLqV5iBMVZ/N1bwHfAeMLwHU+EL01l0EjobhiYHmhPA2k5njTYbTrsrrW4b3uKZuNxbbPDYzevYb9rA/fnCH7XwGxHbE762KUEIqDbjKBtIGK9D0SttT78zoTOMO47OsPz+y360aK1PuSsRVC6Ah5vOHkGn9xfwWnfAQ2DG0Z/YwN/YtBdHTHGHMEukp9tN2K0bbKlhidgJNgrDk3rcGvfwRqP1rrwaMUuaK1DYz32o8UwNBj6JhDBxgc1rvFp/zhaDLsGaBnnD3tsnzRozqf+JA+cPGowXO1gv+AcxngQpnzFg7PwTNgNDZwL6uX9WYuPA9i7JtkyOyeKYqAfLYgYm+0IazycN7gZFdOGgGdOj8EM3HNyjm0z4qgZcKvfYIx5mJ03eH6/DSrgxgUC+ozQ3orjS48dRiJ9zQCYnmH3gG/KZxCJPCYXFgCxfItZxnoY52YIZK89G0DP3YS/cfPFIS2UpTMwEb2ClKN22lAneTP7ZpMTvEDVynj2jivVkamJ+j1YLMYRF46ivpkSUuyfDSYXB0W6ZWpMF99zmpBTlsvUNso2uvjOaYjLwzjkVsfiJJH6I7h2ZArqJfJcLcDJNxcLeID8mxL35Yptyt/1yt46wOXHlijtlMnMjkt9qdpftUuOx0q1pTJZrLnDN0qRwYdSRqi5Q2qHtZNqOGu/Kstzlvc+XV+ZCiMemx1HMS9vJOYz1bLYcFMzjc24jXXb9bXEhYvTdSiFtcxTpX797dfPpRxXEKRp/FIgSqltJrLY+bAABwraSUQrdcv94nSjCV39LJYL0mTuLmXHa0tuJjplRZzPTJbZipCO18/SBrFylnp1CgwfV+isWLFixYoVKz5j8ce/+f+IL/7S37i4/wf/3z+Cv/Pff/dL2KKXFvc84vDrf/8Z2u7FITVf87kDHnrjgPsed8DTL0qRK1asWLFixYuGu5rwFXAZnFMKP5IAEjAnEDMlIg6vaLqdYPOhY2vqQ23bXB5zyAauVm+Rp5hrZeq2SGBNSDx9To0ULNWyZZ8tqWaIJhVhJRdbQhYspXngbAk1Ve6sbcX9n1lbX4CL1DUXqXVr5UkgtqZCLoO5QFV0lsjWUg2mg+GlwvWQSsxV1DpiYa7L0uUkgluRvZWgfE2Fk9cVg7HWJHI4C7wuWbBHy2ZSQVJdp87nO2t/re/LIP0sd2fleapej4M/PYMhQnO8ATcEtsHWOa1tCJwvzBjsjoVgZZqUvsHllsEI28SCOVlDZ88JpXJTc+U1IMrMGPcOG5HION8BfgOMxwy34UCappMxxYwt4DYMbgi0D+1ozgjuRotPbK4B9wFXuj22dsBRO+B8OwAAnDPYM8G2Dm3rkiLVGA/vTVLKEgFtOwXQJV/t3jVJfSoK3L1rYI1HYxw2ZkBnHLbNGPLfGgCO4HqLs90GTRNyBrMqI/UVS19Oql1rwrGjDzmFpW4fFcbSdmM8TFQMS37c/Wix27XwzgYi2TD81mM8Dt+e5ny6R7YH+Ay49dQxNvfs8MC1UzBCjl3vDXysU+4v+xDYl20MgL0BU2iLqIx7byP5PGJnw+feRuW1Y8LgbLKuBoAm5kQeYp7j1NcOSbXLatEBYxpHyTqcka3bCeNuInXJc7QR58lG3MdBzgQCg0aGcR40ePAwgPsBLwiZLWpFkatteeUYRYgdUstW849W3imzd5+hi9+H6thE0Or6ym1aVWwpL6O0kq7ZGhffzKR81gTzEtk7nTTfr8nv2pyhds6h+mrlyzkLi52q+YLV70v751W9OMTZbHFBaMT0czZ3raiia9tVXwYCtjhnaX5WuwflYodK+/XcZWkcVceOzHv0c7ZcEcC+qkLOFlGUba3NFbI2qnlFen4q52glbUEC52VX5iflPEHn59WoWTfLPEbVk663VpcmjHUKmxUrVqxYsWLFZzQefvXD+A/e8fl481veiOv3Xl887uh4m34esMcn8F5cwyO4B696KZr5ooDZ4yPPvA9n/Q28/t63ZXEfY4HNEd92yG4Jtgmq4d/5ji/D9StX8AM/9c8xujHM6z74ceBsB7zltXUhQwWf97ErePtjV3CyrwX8PkXwDHzwY8Anns5iRytWrFix4u7HpwXhmxCDJmwoKIjithCQjgHlIq/YpEQlAB4YPdDYfJ8+TwIzWeBItUFbu1mbl6FR+/DPVuQvbOMpyKtDOqIEoSaogtl5pXoN5/PoMNlCxvy4zgHW5oG5IgA4KQzmzQ4HaNlhGbyKgca0jRW5jaktSfHiFYEaA2Q1y0AdMNRli1q7RElgJ9WzzQPFpSq4thjgUNB7Vo+Z9Wfa73A5JTCQq4fKXIFC+l5gw5zaJwpZbRetyyx+J1kcYAjJB1j1Uxp7tftesTTl9FxOiw1SMNO5kEMZLgtqJvVKtihBqWygnolivGQ5g9WzJMr2TEWVmp8TARBr52QtfjmbZ3/zJjAMME2DprVgE5XGJKQuB3WuA3wLeEtZLl7ERycokCayEgZJwSuKy7T4RZHAKUewkLyRDISjpP41Ppw/XAHGI8Z4zzh/hAiQ/LbcAL4juA3B7IOqs3ueQM6i353gk43HeMXgtVf3uLbZwZpgVTx4gxvNNilgT3cdmAlN44KoyRkYE1S9R90QVa0GXSRqT/suEa0A4JgwjkL4BrLypAl1mtbBGwMaCbyz2LkN2pMebeuCVXEaHAg21dLfAPxIcJawaYLSf+8ajNEy2XsDR4FsNTE/r20mZe+mHXHet9iddxhOW2A0QOsDAd0whnsJfmPQnFJSc5ue0Y7A0Uda7DqPR171GJ7vj7Afm0Quex/IcmYkUl+IWrGBlleMKJJ7Z7GxI7Z2RO9tOodi353tOwyjRe8sjtsBrXXB+hkIamiEuoybiF1ZbADkCwmS1bOfxh/H51LyR9ueQT6MWd+Ed6sZGWZgkOOo+EX4ffCgwYH3PXi4Q0vny5Ie6bm30ztWvgdLC3LkPNmnrHEzJ40aauTnRUSiUe/IQ+VI05Kisd72RHDahaCCJlHDCXOisULkpvJqx+jteWPyOpcgC3Rq1scCpU4Ge5C1GbGaEaH6G3eg/7N8w/qalMuG1DE7FgtkMpnQjqJfp2O9Fh2n/aWDR6ZiFpWznFeOL19XTKeypY1RfT4jU2vjeYmwl76tqN2z6yqJYj1fSD/b/Bg1ryXvs3nphWlNJLetLHLUi8OcD4vNavbJUPOI7PrlJajI2Yrl9MwGWo7TCmAfx2s8L93PSr+TzNnLsnX58vdIbQ69YsWKFStWrPiMwFt/1efgW779my+eIyn0OMX78MN4A95xdxG+YPzbj/9veOjK6/C6e94Kok8teUpE+NO/95vwznd8ED/47/4lbp3fCjt+/L3AQ/cAb341qu5zFfzO9z6Ir/3pV39K2zsDe+B/fw/w2CpRXrFixYpPN9zVhC+XH88UXC5W1EsgxphA3mlCsma/XG4jxQRQEfgyFKyfnc/LKM+XwE4t6BIDPdm+UlGg98t1qiKosWAfyDXWwZ9kt6wCxUktavNgmiZRhQSN27lgf9LvZe45MpGoWgoqVq5fbKxTkEz6v7hmHUA3BFCTb0t1lMqHmiq5JOCLSZjuo0OKpDIvm4wVTfKWKlJp38CKfC9gKLeaRgzmig3lOIbAZEn8asJW7JOLMasXCmRKXNlWs5CuBOwDOauIVCl7SU2sA9NqPGZ/fJRkQZmjT34vF0IwV4kLEqtEvfghlsvlvQOywLXsz4jfyvvmMoFUv98DTz4Faw2oPwH5I7iNhdsGkpYpknc0kbJgjnllI8nWUEa2wQvBG0lfIYl9JHtVsyiScPLPOAAuKMh8S/AN4Dtg/4ADNwx4Aiwj2RwDgd2zDDLhn7sHONtYXP0lC7sH2psMuwPam4Sb2xM8fl+Le7bnaMjj3s0ZRg7EovPBAt0Qg47C/5112I0N9kMgOC0xumaE84FUDT8bnA1NUqT2o4WhYH3ckIcB45n+BAMbbO2AbjtiNxqwrJIdDMa+AZhwdNQDFN9iLYOTTDXczrZz2GzGSJwGJTEBsNaja6ZxI6Rv146BJPUGZzeP4ZyB2zWB7PUAxkBuovHgjcfYMM68RXuL0N1Auu/dDWB4vMPPda/Fmx5+Ctc2O/TuBEyUlNZEgGkdNo3Dxo541h2BiHF03Id6ncFggqVzazwGb+HYhJzK3mA3NuisQxv7UVS8Gxvsn/euwW5ocLbrQnl7i5YUySuLBsph7yN5G1W8bGkSm/v4vYqLEoSgSSQxq/IojF8zeNBuX39OL4vS1SHb58HeJIIr3zXlX9bHz0DFu9JO78EZNHFTEHEzIhfI7XylCVJdeb4m52p1VJDZIh9KA1AjY8vrlpQM5UIsgbqHVfI01sPOTXb95QInVVdmH7zQxkCWNYAQvLX7V5C2tTaFXyvfaEWEz6yjy/bXrn2B5K7aisvxWdoMM5HGRbuqfVi4fhSVzojXcuzN2qDbtrSAoSTny/P0JqL6gkKZt8g+Q9O9ryhy9RxEzzGmeZDPj3VOKWdrc7F8Lk5LfzvoOayMd71Nfi7tn2WbLNBS57JziRxP5O8QbbGjhTMAtWCzIIk1KewuH+RdsWLFihUrVtz9OD45wjf9+W/AGz/7DZcie3/dF78D3/k3vx3f8z9+Hz70Cx/+1Dfw0wivuf/V+Ed//u/iH/3YD+B//qHvCxufuwV8/48Cv/qNwOe/6eVtYA3v/Qjw2I8Cz9x4uVuyYsWKFSs+BXiRDC1ePmg750ndpglfnohWIV6XJjwl+XU7K+IN5eXXyCC9Gn9mKW2W23UnKAK3h6wjFyeANZtk/XP2uyKzD51XQufFnRqU94XeN7M2XCBML4K0n/3h8y+rwFo6TqvFyiYkMntBgaWVrJetW0Mrzso6S9QUw2UbanVqRfslcegPjhSY9Qv1aly0X8bRJW10AFxuLN2JDxAz/G4HvnUKc+MMZudgeg9ySBa5QvymvKhqXUKy0i2bR5hWfsixYp+r/mW/C/mryDbfAK4DeBOVqF6Vr6uL9ZFlmI0Drg4YjwBuADMAzTnQ3WC0zxu4Gy1u9Rt4EDrr0FBQwG6bERvr0BqPk67HSdfjuO1x3A446oag1DUhP29jPWzMaRu6cbIy9pGoMTSRc+euRe/DOqa2HWE3LhDXsX/YEVxUrhpiWGKQ9RO5bQAYhrFBMSyqYUMciOWoTA62ydP4YwDD0GC/bzDsG7i9DSSvIjFBIb8utR7oPMZrDuMVhttGtSsBds9obxLc0xvcGjqM3sAaH/9NN5EsJ1WzFN8146xdQLCFljzArAaQKH1FJexBcJEQHp2FdwbsKBAFeozJmJJxBOQKcp7Gq4xdYjWW9JhV4zZDYM9Bu/6FEb63iyWl4iHoOUjFtvmi3+ky7yhNqJXve1GE3u784TJ2umUbaguUDn3fS5eEWhsOYPG8y6D8/iU3kDt4f5fnlAvdLjydLraCvmRZs+Nr90SPycLCmw/Mp7L+0nOk222fnveUSvGlNi+1Y/mgC9pg5r8rde+l61TbD7arzBd8CFoBXNpD67m0+vmgY4BGsYDltt8LK1asWLFixYq7HtfvvY7XftZr8Wt/4xfhc9722Zc65+FXPYRf/yXvwJve8kY8+MiDICIM2OEMz8Jh/BS3+O7Gle0JvvKLfjt+4+e+A2965A3YthugH4EPPQZ87Cng2ZvA+BL+TXsJXHvW4bUf6tHuX8DfWytWrFix4hWLu1rhS8xJzVvN4wsE9S0wkayyTwIppZIWyNW6h4IlSuGYiEePifwdXR68kXolZ5iodsX6uRb01cEeQNkmmkkZHI8Te9pkQ8wMkX+wjznQugY8jsuBI46RfK1I9crGNtlc8rQNQFL1cs2GMAaqrJnaVu4vFT9a3Wto+lnbZI9jONYWBZZKz1IdLHWUWFLVTAVX7AUVUeo5vzYyBwN0s2C0IPbhLFBnKChDDIGaJvV3skduaa5WKlRbM/WtrlOOa+Uea0tDBuDAI0fLQwpjX6tMYvmTqqZU6xIwuKBMsWbKIVtTI2fXXQncCpSCXcYktU1QJ0WrcngPatWrzvtZXYy5uoeshajOpnFe9O9t2iS6Z56DuXWKprEw14/hu6PQpIbAMqyYYWPK0pEAYoqPOcPb8Px4C8AEojjIgzkQa8NklR0vLCN8zciBXISQzOGw/jpjuMcnNS9xVJkRJvIXQYEl6lzTBWvks89q0F+3uPcDoXzywJVHCf2NBo/ddw37axYPHgd7YQC4Z3MOoXCvNPtQv7fY2hFjZwJJzJSIzlQ7MVrrEnl5tN2jMR5H7ZDKMK7ByBb7scE9RztsGoenxytB5TsQ0Bt4RzijLTbbHifbHqZhOM9BjQsAhmFtIHYtTaQqjiJ5qt6Nu6HB+b7D+Y0t6GYD0xPQBUKWGw5WzpbRHg3gaAltTCSoj4DxisVwn8XRR1u0twibZxnHjzOOnjJ43D2Ex+/f422vexyDs+i9xemuwxj/3j7petzTneGTzRUM8Tt0su1hiHHUDom89cr+ubMO1zc73Oo3OB0bnO46WOuxaRwev3EV42ixP29hLMM2UfnmC4tx/Zp0cVwNCHl3eySbcBl3ZuSk3vUNBUtneWw9w/bh3eMbgnHB2tnuRpjTHfzzN8DDHQYYSH03jHoXiWozWv1matGoYEyqyUx9W3xXyoU9kYytvUtCc6bnrsxxSgtKRd2Gqk10UpMWi7GyiotvS/yOp/Ys2f8K5BsX36ehPy4ZsJg5YBSK1GKRkd6nnRWSDbEcV9oS177X2pmk6JOktI3Xln6v5bFdQsX+X58zU94u3JeaEli2p3I0Ua2+SaEfCjVvZd6hlcUzJwwZE54zhe2iGlm2ufzc7Dg3XZ9erDDLw1sulijVvOoYfe7UN2oOrI4pf5dUEYvOIvr4ghSm1Nbpb4WkRNeLE9M7hKdy9DsobgtKZjNvX96QqU75O8G54Gok8xztCqDJ5mHMnFFWK+cVK1asWLHiMw9f9yf+EL7id/92bI+2Fx9c4L/8C9+Ij3z4o/iWr/9z+MTuvXgCH8Svxe/HPXiJ7YbvQnztb/sa/N7f8Lvwu/7KH8BPfOBnwsZ//0vA+z4CfO1vB15138vbQIXfh9+Er8SvwZ/A38QH8NGXuzkrVqxYseJFxl1N+DLFfL1+In4XgxulDdvSMUQTwSkoc4yV9Qipy3S4/LIuY3LrN++noFIM7NQUQynvmBxf5DHN2leeL8cuqSuMnQcmZZvkKyyVvgBmNtClKkRbMyZyWLVNyNLbUSN4DrHOmh207AcmEnbJsvKQakIHknXuOH2e5M+tlXUo+H4ZNWlZXxmAhQpcZjaBZt73NXvmWpsPQNS3s7pVe6m45Hy/qQZaa2VdXp1cuZ5a3jz1+6E2JJIgEgI6cD9TnOmA7mXgHXgkmPM9TNfC7joAFmDAxzYRAhHGRDAj4C3DgMAOMOCwPoIp5eaVkzieyxYZ0asJOm+LPjXAeAz4FnGRiL62+H+2iEEWoIScsQBgrgwYAfTXGjSnQHfKaM6DavjWs1s8zZOaFgCeOT+G80FtetQNaI1Hax2OmgGdGXHPxsODkl2yE4LVGzTWp/qBYKH83PkRrmz26IzDqd9k53bNiO1xj962cOeSmx3wI6Hft2AmuOdbmH3M9RuJ2uGkwd4Ge2PmkD/4bGgxOovd0KRcvt4TxsECfWA4uQV464CGQa2HaUI+4msnOzhP2A9NUCkr+au3jN0DFm5LMAPB7kL/dc8a9Njgl4/vw7YbcNSO2HYDBmvR99Onu7PhuXfewHmCA4Eo1DM4A2sCQW+Nh2fC2dDh5m6DwdmUy7gfLcbRwo0GPBowhWsenQWPBpmyVw0Fyc2rc0lrEPM0DuO41j+T5DBPAzTsp9GDRgff9/N36O1iaWHNZSAk2Ivw7lx0SjCUFqAsHZMssPX7aQmH8ssLSefNRKot5c9d+FYG8t9MZN9l6q/B0LQ4rFZWrEMsjqs20BWkY6XMyziM6N/Lc8rFPrXzijYvYUbsxuurHcdLeaPJ5A+iLAKsENayaCk7t9Z+3f+6PH3OUlvK33XZhV354jf80HNUzruyfQWRn6WwqN+HtL/M01uUOStH5uYyb5f5dzmX0GSv/B4aB52rF0AiftOCVJnLlgtRs3eYIolruXsl5UXZnssu0lixYsWKFStW3PXothscnxzf9nlEhO3RFg898gB+9x94J97/8x/Ae/79+/AY3o/n8RgA4DpetZK/C9i0HVrb4A988VfhDQ99Fv7hv/5/wTkH7HrgPb8MPHMTeNvrLxcH/BSjQwsCwd79pp8rVqxYsaKCu5rwBRCDH3wx6SKq2ur5mMjepNRVAd6M/MWkAC6VugDQtuF/IYE1iVvWJ8EdfUxJ+hbBrqD0yVUNKQAl58Vgjw6ukQ46Fdvmaos8Fx9ZE2JF7AMZrtsvyt3UNilTFE8FCSkBQAco6WAdNQJb5UkM2yMJbecBMbCL10G5MkXOW8pbqIOfsn8pGC7HNg2S9E5fb1m2UcSxznk4u3ZFIpNaGKBz+GnbxJhzr5aTN6+fZkHZTPGycG4KpKr+yo7X11nm4S3367Zoi1Iz5axMeYSlrZrEBfJnRFBTy2grd+fCdZTPT/WCo3JKFN2zfL6qD2+T9GXnwOfnoMbCnnRh48aAm0CshbymnKyewQQPhhkpDUWO+X5DTl+K+czD9XLsBzOyOAmHeimQwZoI9g1huMrwHYOJQdG+l42wcqoAeRVGcpm9AXvg5MoOw2bE/t6rIE/AKaPZeRATto832LsjPEVIpOdzz50EEtERnts4NK3D1SvneOCYcbztcb29Bc8G565FZ0b0vsHeNaCYc1erfnd9i9PzLmxrg4qYgKTKbY3HA1dP8XyzxSlt4AcTFKuDwegMxr3F5ikLex4WKviO4DaM/moDMozzroWzwVb5dN+h74Nls+/tZHXsCDQQuGWw8WiuDrCNQ9s6dM2IrnF4zZXncTZ2uLHf4nyIlslMaBqA2WF4xGE4b7E/22DrgO4mY/s0wfQG5+YKdvf1MPec4sqmR+8shiGc79ngqBlgiIMV89BgjBbOAmvGZE89eIPnz7c4PdvAe4NrV8+Canm0gcRmAkYCx/epHwwwmGkYRNKXMZG9ZmSYEchswDn/F85lmDESP0RpnIfBGgYXMcM4Dxoc0A/g/f7Sz1UV2tFAlJeZcrQka4oFOZ7zd2/tPbZEmJbQ33L93ZH/banaU98Gh7lzxdICpsr+9K1P7hnx/RYVzqH56puor23p21fJmV79HpSQeQXR1J4lqP1J6bv03TYEHlgdS5deLEDFNU99oojjUvUs1yLtnF2mmmuVZKy2Sl4YN5mKuWgDsR7DcV/ZRt3Wyn2sjv+8AeH/yiK3dO8E+r6r80TpSt6HhQq1hROV+7i4+KFA7Zh8PjPNl3S+23jgIumb5glAvnhM5dpN2w7MRcL15PPyVLcuW81TtAI7XZ9+1uScktTVZSuSWsqj20ltsWLFihUrVqy4a0FE5Rrc28a999+LP/Gn/zi+//v+Md77c+/HR/hn07434ze94glfBuDhMa3jj6KTlwDGGHzzf/wN+PlfeS9+4KfejfP9LszpfvL9wKvvBz73dag1JrQ5xm9egsYyGP7ipcQrVqxYseIuxd1N+B4iWvRK+dpKeGDaV+bMKoNSmtwV60QhaqUcQAVi/NzKEJgsZuVnDd2+UrlbK6f4mZUNNTXhtlIkuIJdrgpaSwC1CNgGIlapQn1ubZeuW/+sY5ilraT0ZQoGhoSlWb1yjBC3klw0qUsov2ZSxL2Uoy2fhzFst5GEBaZ7lrXFTGS+7hsh+LI2qWuS87QFsvETqVwGVmv2iWVQvBb0nqmsKScAZsF/HxR2JdmaBWV9vi+WmylyvTA6FSVsNZjMld9dfrxnlDaK2Vgp61HlMhckellOZR9cVOgXluewdpo6q+erGljW/VYhL5IC605IX2b452/AALDH29hPDXxrwDaQsGZAtKyPDgYcCTIKytkaxHrSDpwRbUyAcUgEceo0A3AD+A7glnOFLwMhpy0HYpMJ8AB3HAX6wZrYWI/deQfPBPeGPcaTDr4xOHrSwwzAtQ8zbrDF/qSFP96haxyuXDvH+dkG464B7yyG3uDZweK5509SNxrDODreJzWsiYTlURfsm5032A8NDDGunuzQjxb9aEHEsCb84TI4C2ZC14w43vTYtGO0RLYYBzuZAvSE5gxobzF8C7gNYbinQQ/gaXcFtnGw1oOZQAQ0nYOzDPaR+SaADKNtHZomkLxAuK1XNnuctD2utvukVmYAPQGnuy5eX7je7rjH/m0eu2c6bJ6y2D4FdM+H93Tfb/DUWYP2ao+mdTg52sN5g6d2J3j4+AZ2rsUnbl2H3fSZhbMlxlEzgIjxzPkx9kODfmiw2QaSuB8bOGfgRgPnwoIDczyG9RGjBfYWtI/fgThewJHTNXEMxYVJ+j0S1OmccveSm2ycAUR1b/hnxjBQvQ1jHY5Bpzvwvr/c87QEbaUKKOIwJ37zc+ZKxwuJ3JLgQny/CXGVOQbMya2puQUBfJm6awSr3la7xoKoIygVaO3bpKyPS0vomcX0gqMFWeTn6+stzy1VqKUN9IHrFTWwrl8WD7Gaa5CeOzg3c26YLQpgn8jkqtK4oqIVwjbLoav7PiPfi/Ki+nlmq+zy46j8ppeqYKmzok7WJHSwKM73p/aJPbOh1NdhvlkhwnUdDoEULr71CWpRYbpmTN/2YH2M8D138/mqPnZakGaynN/V/N9qQWQihQ8tAIv7mTl9Y6sq4Zra17npb5FQabTjXg7icY3IjX8ThPcJDs81dNoTyLj387nUihUrVqxYseLTDp/7eW/FH/8v/ihe98bXvSjl/db/8Evw5re+CX/rv/3b+JVf+siLUuZLgY+dvx9/5f1fCYCxaTf4W9/wf8VbPuv1LxnpCwBvevgN+Off/o/wff/y/4H/+w///QuP/3++4zH85Juew19+95vx8M3Np7x978ZP4x/jx/ArePxTXteKFStWrHjpcXcTvho1wkUHWpZQUwNqslETwfJPFIM6oKxJYX2cQKsE5LhDbRPVcKnuhQpUzc5RqoEyf1i6xgXVZS1oV1M/zQK6eTB9queS5NdSUP2Qjd9SG2d2u2YiWG/DejOpxqttiqRvlehUdZbn3m4bNMpg/Astr0SpaK+poi5pO5ONzYvUWxGTdWJ+PbP8dNoCPbVLLbaojfcymLsU3E3KO1kgcsm+1QH/2yB9eRzBuz3MrgcdtaDGBFWvpSx/YbDEndSQk1IvlqMDu1EhCY+qrTZFAljgWoJvEPIBUzhAyk1/DHEkezn+7CmQwHIYMVyQGePo6h7ne4v+rEFzRmjPGO2ZR3vLYn+jQX+9QWt7HHfDZB/sw7ncB+UtfCCWvWWcRgVtiMl7NK2DNRx4AiaMzsBaj23jcLrv4JxB1zgEqalNttHOB4Vu24wYmkD0sqfEhpMHzBj+gSKpGa/dewLGQBxb6wOhbDn1NzOBjEfbOmy7AV3jknW1Y0JnHBrycEypv0j+Jw6qWmdgrAcRcHyyx6kj7JnQnhrYPWB3QHMaLHgH08JtDTbtGHMidzi6MsDG/MZA6BuxtJZ6AGAYbSCcOSigG+txugvKXmZKBLZpwvE+/k5xDQ6gFgzoYb7ASWpleShHjZs4RskFEoVBk4LYM2gYQ675FwuXfBeFBlfe3yXKd2Zt/9LPL+C9faHq8bL2YIeUzRc2woOomW3Lf43EWEUEnHBowVMJTUQXxHCpBl1Src7ssIW0jrlwZ3b9d4LL9GNJ8N6GZXm1X/U3aMnGulwwNmv2JcaNzMmW+mlJ/V6SzYcsx28DS2TtYl7cFxOXUcuWf1vony/6u+R2UP6dYUzeL2su3xUrVqxYseIzBteuX8MXvOPz67HCO8BDjzyI+x+8D29+y5uwP9/jsU88jp7PcAtP4wjXYV+h4eRzdwPvvfGjYHgcdUc4evgG7nnk8nPuFwNXjk7wW3/1b8YHPvqLKZ/v+T1b/MpTN4CrW+A4z6/86H07PH0yYN+8NO18DM/gZ/HBl6SuFStWrFjx0uOV+YW+LCQvmFgKj8puWAeBSgJWk7hyfKlclX9CvIqCtrRw0za3zEqJStNKewlcyzZgUp8uBWGShayoH6YADpVkMwBqgtUcM4NHB8BNiiNL8/RdOseu80DTRMXWAQJVt9coJWlGekkgzOfXpklAjaYyBLU6WBou/aatpC9QTM0slmvHOZ+XXR6Tkf5yTrRTntk8xoCqqFy1jWMlvy6P42SLfCg/oFzrguo0lSP5+srjRemtQGn8KTJZW2VqBXNR32Qh7YJSSluH2nowl3wegJ0UMjE4G1Xx1LXT7xCVj2ZAc/KEyE5kq2rX1O6KIjqN4fje0ISytcF+0hTXfFH+xpTnEdP4vQDcD+AbN2G2HdgamN4CZOCbQHRyZF3JAdazFA4/EtAgKCLlHRgtnYNVLgdFL+KQJah8nYnnRH8dGI9DztrQVwRYNdZdIF+TRa8H4AgMA9OEHK/MhK4bQcTYdgPswx79vQ2ev3qM9nmDk08wjp5kHD9OeGJzAn6Q8MCVU+B4h007Yoj2xMN5C94ZkCPwxgGjAT2xgd8yfMPwPWHoGP3VNhGYbjBoNiOOuwG7XQs3Whzfc4rRGex6i203oLE+KIGNR2s92sbBKKvUdJsIcFugv0borzHoeo/NdkTTTGPpqBvATNgNTcp966PSuWtGHLUjjtoBJ02PkQ3OxxYjG9wcNrg5bIJ1sjc423dwTNh2A873HYbeYNiF59G0Hs1mRPvaPW6eHMHcbHDlIwbtKWB6g7Fv4boGz501sCcjtkc9NveP2JgR17sdRjbwTLix38JF4nc3NkkRTcQ42gwpF3IT7+MIwPUW7AhuAGAZZBiIOY3t3oCCQUPK3WuGMK68nT4H8IDxHHNPx2OTupzC+R4w3sMMHuTCAgU0AFuC2TuY3oFvnYLPzy98hm4LhaVzBq2ErClZtUrRBNtVjnJLHVDRTgYcv8ez/eU3o1A2LuYMrjkNJKeDygIk5UhROipk51ul1K2qdeUdPykxZ2rkgmRMfXwZi+fppPrvh0jG8trUXITlO1zMUdhzIEy18wmKcaEVtKWatqbqLdWn0Sqb4ljJ5luXuS7nIMpmdi6pcTOb56IfylQc03ZkZG9uNV0ogLUlM4e5UTb+K4R79Rpq1ugCrRrWc6hikR/LfPrQYkA1J2bm6VuutsnPUubseRS7ZzXPoHJRmHYHmU7O/x6opYqo2T1rRyHZJ/NMZelcy9HLhQ21zL/YeaTcvZLepfx758UkmVesWLFixYoVnzEwxuBbvu2/xC/9wofwLV//5/Gx4efxGN6PX4c/iGt4+OVu3isef+wr/jD+8Jd+DQDg33zo3+PLv/2rMP7mtwO/6e0vc8tWrFixYsWnM+5uwhdBDcQGANFE/HrOiTpgTujq/2sE8OxcRRKVBLFX55Ur/yVAA+TBm4vUgDOLWxVYquUC09ABZCGErcmDtImgMsAhFY4qL9RXtFvnoeXICpEKctniOkqb5HKfQOyiU5DZ5kSwkLESHE8EbtHukqjU/e7V/2YKuCX4KDlLiu8L1DiFVfKlIcrhJXWQtnQ8RDzWlMDx95nis6b0NsW9qfWfOj6RveW+dC+UtbOhkItEExklwRCtYbU1atg8BWuz50vZR4dgbzympqApA7Ga5NVqGDeROFppexFhoS1AL4uQy3cHs+thugbGMdgh/K8JWsS8vJFoE8UlEU+KXcMAB8KXxUAgkrVCsoWGqvqb+M9yyNlLUGpNjlbOANpYkEMghQF4R2A2MMzB2tlwvM0Maz36aw5sATMYtLeA9hRon2lwyie4sg15WRvrMXoTCFxioPFgmJAz1hP8hqdcwhaAZbTdiHEIilvTehjDOO/bQMA2Dn1UsQ7RstkYD+cMjDGJ3AnWzAwjytcgMoZvCOMRMF5lnFzd4WTTo415b5kJR22wkz5qh0SmtsbDECdF7eAsbvIGg7M47dusvkBuN9FOmtFeOYe1Qbncx5zAepSajQuE7YME0webb7MXEj4omE97g194/mFc35zjWneO3jfoncWZ6TB4g36cXu5Ecq889lG1TKSfv+m5IQLIcHhVumgxrlW+aiyVYyuMwbDoYFLxTscGO2ekT6rkCw620AwaPXi3f3EVvpfJs1uzv/WcvwfSdrVoINo3Z0Wpb+RBpWHN0lm2X/Qu0W1T3/xEKi99Z0uCOS2AWahT3ukXfdNq38daebqcMjd9DQfI3plqVZVT5uXNCP/bUNUuqWWz/LllG/U5S3UtKWILVC2ky99LR5SaNXmtvPLYsh2e54sJyvu8NG4uo2y/zDjXCw/KcnWzaPkZXDpmakdljp4Xlu+vOYXU5ugl0Vtu0/sqC0ey/br8RacSUy8/vNArF7ZixYoVK1as+HRA0zb4yt/z5Xjb533ui142EaHbdHj4VQ/h//B1XwXnHLxnfPDdH8PNp5/Cq/H2lyTn7N2KtmnRNiEu8MaHXo8/87u+Af/q7EP4yZ98H/B5bwJOJqVvbz3+1y96Ar/qE1fwFe+/f+3XFStWrFhxx7i7Cd8ymJJW2KvgyQESl22wUc2O8zyRHtq+WdepVb36uFqbdN01G7iMgKwoRmo5yBRmyqOyHSqQRSgURolca6JCgPN8dymPa5PKS+rJGCSc2STKvnR9Ongu11IJvicFTNGXVhHWDoBTJACZUFYk/BfJ7zIYSjTlldO578qAaQpE2ouD3cB0fC1v7yH7z6WytOrWuYkYLo7LLJHlHK1SI1M9T7dHCFMg5plO96bIx4spGElWkSMVAjkd53WfzMfzRDgsBK9VmaSevdLyObv7S5aLpWpGPycH8/hpkqJUSRXjRsq9SOXrHfzpKcz5VdCmBY0bGOPB1sC3lNS6qZ7IZac018BEmskjw+H95RE5YAoEnYnqzKTWJcC3HPIBm/jPcjhJLicSvmTjEx5JZ3gCOwI8wVs/WSAjEL7GMLpre4xbix1v4DsDNoTtk4DpG5w/0gbrYxPy4oaGA9QwmDzMjSaQ0MdB6QsGuPGgTbBNPh0NvCNsjsK7YN83gThtgm3xOBq40aIXOSoTjJV3Gaf/rfGwhtGb0EdsAXfM8NdGPHz1Fq535zDEOBs7DM7iqBlgKOQS7l0DD8L9m1MM3uLGsMXNfhPUtEOL/dDgfNemG0OG4UYLtw/ELiyDT3ZorQNtGP2tLvZ3UOiyIzSbEbbx6A2jebpF9yzB7gEzBvtj31v41uDRK/fi/qsdfu2Dj+J03OAUHVrrMHiD0U3vokDKB2J+GBo4R9huh2moapLXMMiGviMHmCGMG+LYV1HZK9bMGmwAD0Lb+3DuyGALsInq8zESu+n7iDjWAxmM0YP3LzLhq9sXlZfJaUF+Dzund65eEJQ6UZGk6fvv89yqC++uxXf/EhF2odvGpJRcclao/ryA2be8IIgy6+QlBXJJBi7l9E3KZEyK28visjbI5bdJnaPHgHaEIP3NBWqfqzkKG+Vku3xRnxe5chfPK9WyQF2JLQS//v571QeXWSy2dP9KJa5SEFfngOoaqosQYqqN2rkXpYXI1PN6rnWIjC2wmBYFat6i/4aQOUaa0+j5jiJipX3yS2mtrAlb3eayfnEWyneEebwogPV8ScqJi06n/NpTn6wBwxUrVqxYseLTF13X4Wv+6O/Hq1/36k9ZHfc/eD/+2H/xRwAAwzDgT/3bP4dPPneK1+BtYVH4BaGPFcDrH3wtvuuPfBv+0t/7TvybH/hBjG98FbDtwk5DGBrge3/Tx/GbfukefMX77/+UtIHBcPDwuMTfUytWrFix4q7FXU34knOAbeMvgRQjzzlRW7E/zoncnARGEwM0EkQxMdAlAVWifD+pfbpua6bfL1IcZja1EhBTJFiylS7sjRGDUto6Uq5X6nSTArJUT4p1JINTQDBTFsSgHo/jFFQWkjXZEmvCuUJ0cmV/GYAtrbVFMaXuHQ9D0X8MwKnAs2oze2AsApwpQCqkrJlIX32cU0SpXI5WsXqDFAUu1cpLVqGyz0bv06HPyPWsDZocFoLX6fZHiLK6JHJnqh6XEaSJMLX5vciCn3qRQalunhHMMRDqinJE0Vv0Q0YCS5MVkZD2KzXwTC3nOD+3JHe9nwVh1Qn59oqypgwEZxaQLi50kLHBLzz3I+/2oJsW5uoWMMF+lxwAwzADxyHLoI5A0e7ZWwokWiR0db5UFi4rEr3Uc1L7OgQVq9sS3IbBrah7WRUSG7aJ745zsTyXDolMcrR0Fljjw5BgQtcFpe/uPsLuqMFwzaB9PvT7jU9eQXu1x5WTHY66Ab2xGIcGiPlqnOHwR+NIGQHNo8GNm0epLX3fwFCwHhY1L2DQNEH56z2BvQm5aGNbjVL2AsDoTCBPW2C4CgwPDnj1q5/BG648g40Z8dxwBDQ9vA35eD0IvbPo7IiGPE7HDqM36J1FYzy2zYhb+w1GZzD2DbgP8mF7PMKLYtqHG3V6vgnXxYDpXCC5PQXb7L7ByASyHnbrMF4n+NbC7gmmB9obBLcNNtS7J4/w+GDx+NVraMin67PE6JTqGQh5hXcDoWtHoAX6ocEwWLjzZrq/LM00sDctmrOJlGfKyV+KinTExQTEgeA1LhC84EmFmpS9HvHbCJBjcBOtyRkw5wPM2Q7jC3ymQoWVRRfynYvqzPTsluSgqr9mXZ+96+VdWjpGQN5PZbPynLMJmlCTMpK1r6mcM31vlyybZ5a+6lvH4l4R69KLvLJFS7E9M1JPX3MqtEJ6lkSjN6ksTgrdQr15QLmbfj8wRpL6dgGaKKwSs+W4qJ5i9JwAAQAASURBVOybWTUfKi9vnGojTd9g/a1dQq2/L6PctDZXU8v3vJaOo2Y5XSOaNakr47Nsn4+22eVCCJlblhbnclkyng1BrKoT0avGOsPl3+do6zyb76b5jswvkM3BM9K/XCwq5UGNm3KhZjwmWL0rZHMpNbcv5yflu2qJtGaVssIYNafLF1JkiH+zMC0/LytWrFixYsWKFbeDxjb409/2JzGceVzBA/i5f/gJvO/dT7zczbpr8J/9jj+KL/8Pfhu+/n/5y/jwUz8VNv76twG/6rM+5XV/DE/h2/D38HE89Smva8WKFStWvHy4qwnfBLGhrCluK8ddqLzTYA4BaqsI5NstYwllftHMrtbPti2qEi5QE1YDcdkBlaBh5fiD1pS3YxenVRu1MoVItQtBxpryKrMKVuUfsn2s2V7W7Bsvg0OKo5pi9bIoz5XfF603K+24iDypBXOX6r8MDhy/lNuyWu/ivgUyN9VvUhD2Qhxqw0sE7nugaUCDB7VB/ZiIVMXDJjUlY7KtN+F3JZacIPxBLEN61LeB9M2snEmdw0gHi6g3QY5P+3PSN1Udlb629XDs4ACYPhRGvcE4WPRjgyvbPRoL2MZF9TIBnYcfCTw0qvEE+KBqpcYHJaoPZJohWUwQ2mEMg4jhvY0KQtnus/YxE8ZkGQ/4DcNuHY7bAa1xqVwhUE3sRB9WykTyt0HvLXZjWHjkmSauiCKB6ynkXWaKfRf6wY2SqzG+ksgDownqaQA8EthbmM4BLcMf+cDix3IC8UpgshhNh4/dvAf3HZ3hSrOHQSC2G+vgfFCcSf8wUwr+OzeptUNfx3vrCcwE2wOmz8eFjMEwtuLAUmQxpWOWn+FwW+PAFRX06EGDA4bx8Pv0dqCVgsDF5Va+YySW9DUlo0bxXs7eb3f6DTjwXV0kjjW0Cln/L2XXvqUvBOrbPiN7D51TwlBdXXuI4FT3+ELS9RWAqpL3sikjDuEiEvhQDnrBbfTfzIpccNGYup1n4sBxMpdYehaYObyeXow5+0U4NDe5jOuHhiZ9D6iWF98BS2ksVqxYsWLFihWfVnjw4QfwyGseQdu2L1mdZAhv+pw3pt+feN9NPPXhUwDAcOrw7KPnL1lbDuHV970Kb3jodTjabC8++CXE6x98LR66/iB+zdXPgn3yBj74iQ8Bn3gKuP8q8MD1T2nd5+jxHvwK9hguPnjFihUrVty1uKsJXzYm5O0VdWC0jMwUrjoYwmqf95OlJJBWwWN0CAyECjAZCtuBSRkq5zKHfcnq2cy31SDHOqdynZr8eFH1xnLSHgncMKNUP6ZjpHxRBysL5nlbzBTQFnJYBw1LBVNSa9g8aBfVSOFYuaZC1avrFDVrLZiXgsUeybI5EbWxPK0CmViWeO+UisVgIoGljExBgkKxwUBLk9JKq56MEDcVFYxcl1xvGfCUe637sQzEa1tmGReF2gwc857WiNoDipxMUazz65ZQ54qilrTaeeEaiQho1StlUJasSiUtuXa14ph8vLYYLNWquqQGNjRTsulzJNiaqX7LIKdW12gVWyyHVMBW2zbOc+rl5U45fOM9vY3Arj87g3EOZn8v0BiY0YIbBiMQuoEHjYpeC/io8p3agqCcLMAG8E14L9qek6XzcAXY3xeVl0zTIgEmUOMCgTwYYDCByzty4MGAdgZ8xcG0Hr63AAXb39ClIaet9wbOGVg79Y9pPbxhDFG5SwOBzy3O/BabdsC2HdFdO8XN8y36fQNjHZjtREYzgXoTSEorz0cgbNkEJfEwWDADbetSTuFhEAl0IIGPuwHnfQsXc+/2Y4P9rkULwFvAbQNJuh8bPH5+FZ0NOXRHbzCyskYmj7Oxg2fC+dhiNza4cbZNRHNjPBrr0W1H7J0B9wZ8HhTMZuvgdwY0UrB3jiRqezKADGPwBNrEe3DagJjgh0jsd6Ef/ZbAxmL7NGH7FIfcw083eOzsITz3hpv47PufClbRxGitgyXG6A2cN3A+XM/uvIMbTSCkmYK6OvYVDIDewOwMmlvBRtq3gBkB209jbhr88XcP2EHy8zJMfPzZyncZ0yIEF/NSNxPZa3oH2vXg3f7Sz06GmYPH9L6byLXchaJKDJY2tl6pEQWH3rlSjP6eiIp1SSkLVPPZ6hQLZc5drrh+ZMdodWGp5CzVm/o7V6pn9fe9LE/KVG2AN/n3QqCtgON5STEpbdBzCN3mGklZsxvWfShzmujaEayj1XxEq521IvkyhOihftBtuoj01Jbiyho6sxmv9EeeUqBQDAv0HMC55AoiClFZyJBQtDUtcGAf0noAmVpd9212zSX0vSjHvp7/VcYcD2OaB+hUEtkiRnmmlN06xXlgegadS+fM7M+NyebW6bi4D9aGvxXKRWSa2JUyagtCy7QRci9KpOdHLUxSzwfHfcnSWT+P8s5rm2neptu5kr0rVqxYsWLFpy1+/3/6+/B7vuZ3oWlevtDuF/6B1+ALvjrYSX/0Z5/DP/o//zwOrZN9qfAN/9HX489+1Z9E+zL2zRI2bYe//y3vwo++51/jd/xXXw3/Ux8Afu7DwB/7HQA+NXbOK1asWLHiMwevvC/f7UCRlzN1L1EggJX966K1s95nTU7+lYSg8xORW9o1l8pi2V9p76Q8qmxjnqsExD5alb0UBCZNdqVrNvm16GtORaogWtUOGYe3AVPQMtUhvy8ERm0luFuqscqyNKEm1s+1eKwvWLCDqpci2KiD4boYCVrX8uaVqFgYhu2l8kIFPY261ippayfStUaYl/dFWXYeJNlVkLC0W54dm9l0U36ODthrK+m0RiGM2UzpK+FWMy1IyPLTpcYEopulXeo4TfIeVqLTtLBCyN0yiFtR1x/KpX1QTXYZVU+0qaRhBMYW5AJpZtR5BIaX/JccyDKxb9ZKXnAghcV+N5SfCoG3MWhvODwzKdFvKIB7efYoqD4RyV8GuGHAETxboDfgBiFXcBcqaK0LlskxN29ILxrU+mQAbgOpKDl/eSQMzsKaQExu2gHGeAxDA8CBTgA/BMUrNz5cZ8NB+Tpa2KNQ3xiVssHG2cRXJcfXdHgnu9Hi5vkGXin6h8HCjQabAaARgAfcaHBr3+HapoFng5tDyMs7OIttM8Ix4dZug8Y6GAJunW8wDhYuKo+TupgJfjDhprQe2FvAMprWoTctYJFUyvAhx3DTeDgXr9ebSPZH0ltstw0AQ/Ato78KeEvYPMdoTgnHjxucbq7gF5zB/VdPYYjRO4vBGXhvMDgbP0mBmGcmNJ0LxO/eQudeMjuD5ibBjEjWzZK/V5qEqDgnh6Q+ZzO9C8jztM1N41bUvUxh4ULI5xvHbz+Ad7vbWjChn6OLFPszUmzaMSfWgMMqxMo7tNyWSK6lBULZ8XZGHs/s7EsU351ZSoaFHLrV6zqk8izJ2vI8vWCpVJguzRXK72hNhVxDbU5RgybXtQ0/ZByEcm7bkl8TnOU2/Xvtk1Gxps6sp0t75xrIAHAzQjiVo++x7qv4+0ELa30Jau7IkmZDHVtalS+Wp8fyITeRCkFOerFh5ZnQ5adzLnoHyDwnpaYoFm/JosHSgjmr09R/Vn9/pN8FsnjT2uXzF9oKx2k+nxa5VeYn7BQpfYn34YoVK1asWLHi7oex9iVV99bbQEkwc+/rj/Cbv+EN2TTo2Y+c4f3//JMvWXtee/+r8Tu+4lvx2z7vi7Fpu5es3tsBEaFrWnzOq9+Mb/9Dfx7MjD2P+J/e97/jUXcTf+u3XsGX/uL9ePtjV16U+jwYP4CfwHvwKxirf6isWLFixYpPJ9zdhC8AEIFEcasIXTYq4FIGX5YI2lKRWw0Mx3OsmVS8ZdmybSl/V1aHIpiEhBIiqixbEblJwRMndwQVHLI2BIbGKLHSuczKeiXIpq0ftTplKWBcBj1FWU1KqQIE0pWQl6f7oMwVCCjSc4FMF2La0DygpQlhHfCsKYBSu9W1lMRzCgoKI1FgyT5RB/jLa1uaX5XK2dr404oop7al8ivBck0m67oVATxTigvRW7NC1QRybV8pXvE+U9yyCTkpRembciIqcjntK7aH68j7O1MJawWvPlZv08FbWRRRI3lD4fnvMo5r91yPI3bzcw+AnQMNI2hwgfAdfVAopaC+Pjj+oxh0JySijjiuQZB98fjkEG0RiEQC2PK0UIKBiUFGJIIBinbAAIK6NubWpZHAHBTAvg3XbYlhrUNjPHoXBoG1jJD51sDE44xhjLsG6A2GoQm5Zq3DUTti2464wQRrCYDDjlr43kZim4Na+FYLeMBcCXJT7wxsE5S942jSNZCRPJ4G3hF25x3IBBUvkQ3k6mBg9xNp6QeDXd9icBYDLG7stjjbtxj6BpvtgHG02N3cwG7HQE7f2ACOQI7gWw/fhH5DJHLpaITtPNxgQJbRdSP6qIo2NrSNR4K1HtZ4WOvh2MKPsb/lpsZXnfQDN4zxKuCOGJvnCM2O0d0CXGexc8e42Y6wUcUsJO842FSeDNW2G+G5BUaTxhUxwZ4TuhuU8vWmYRIJXUZYkEAuKH/Tgg4T7KJNIonD4BOFL1H8Tnjks4/4DPL+BSh8pZxC3Zt2lSRT+f5in79LNW6TFKTKPCKznRXHDWvT91yrEtOClpqLxZKKs9oQc7lja98pwWWuvVDLCpmqNi7OHS7KtyvHhFPkRbbw3c1Pytum+5A92CuydaG8bIGALGBaWjRwqL1LbdI/a2XvBfbOdSXvnIDO7sWhnMj6+mvKZCGwl+Y6SYVt53MqYD6uLui/NMdQbckcaAp18mxuKyhy8wY3fpknT+fMSGA9/z6w2Ctvc5xj6LlqNmcN7xeydj5P0WVMjar/nubuaoHcgbamxXBrXG/FihUrVqz4tAIRoWkb2EOprl4GXH/NEX7jf/aGbNsv/9jT+MUfeQohMAG44TYXXN4mXnP/q/EXv+Y/RdNUXFVeYXjDQ6/HX/6Dfw4AcOPsJv7Jn/mn+OD2E/g7X/0wHnje4rMf26BFA8IF8+cDcPDoMeAH8OP4d/jQi9X0FStWrFjxCsbdTfhKAEQrbWcETUG0yrGyQr5U4BLlFsvpeApBaoG2lrVGBRK1sqEWHKsQxE0Tfh/H5eO1PXOq1+bXLcGwcczVuiUiWZyCW40BR8tqinYnkxqjsHOe5d4tlCya9JX2S7BQ2iSWdkUANu1vmul3fb3MgBvV/WnyfizLAS4OCmtk7YpBzN7NgotVNc8SWStBWOemcjXIhC7OAuwmELc6SFsSrIMKetYCkqWqV9ogZXme6rAAaXvmsq5SraOD7nq7HCfXKpeoSX2xfI4qpXSutFl3TWm9mGwZ/URCmmjvqJX8OhCqF0scsjWUZ1UUwIJCTTQLGgML4+E2J+TswbdOYYyBudKBG4I3NKl0PWD3HmwI3hLYMjwoqXrJAaLqlXy9kxV2LKIhDFcJLipyaaRAFntMat7OB7JXyF0gKFQj0YhBxjNFt2UD31v0AG7uNth2A7ZNeI8ZYox+hPct2BPYU1TeMsh6cAPsz1o4R7i63cMaD0MMt+nhmSIxy+htA+cCkcuMYD88mkC2RrLbdRaI6lpQIHsxmvAK6U0gKq2HH0xIV2sYfjThejxAI9CcGvitRb9t8dTZMZgJt842cKMFjyapg6nxoTso9DkaBm8dKBK0PJhE0LMz8MygzqPpAqF9fjwG9S+QFL7npxuYxgd1tLofocJwj+RYEMDHDjwGa+jT1xKaW4STTzCOn2BsnrW4MV6HP/awV4NqGsQw1qdhOfYEHg3OnjsCHAVSd2dgekJzGnP3jkjKXq8XFfjQHjNiWkwQieBmx5Oy1wKMuBDDULRFRVjQ4BkY43ljWOBAewcMPXi8w3xC+tvKLtvGcu8MKTJuYTGTfh/VCCohtLzJFlLp94JYzJZuBtl3yVD2TsoW3ZQpBzQK2+LFNuv26nbra9X7a1g6p0YeSr/W7Go1CuKXDM3TRgA52VchhNm5iRytEZS1aynaMJG3Nl8QIKpZfSnaCln6vlxAVlHozqyky7artlLt2xp/LxcspGNr3/9a+7VdtJ5zCImtty0t+LtoQaC+Zr3QofxmCsrxqsfxwrgMfdfMlLyTQ4mffi/I3aTeRf68lfMFWloAVkK3oTbuSzVyeg/E8jMXHlquT89d4nEU/+7IrqNpcgW097n184oVK1asWLHi0wZvefvn4Jv/0jfhwUcefLmbciFe/QXX8bV/74sAZuxvOfzTb30vzp5ec8iWONke4/v/L38X/+oXfhLf+D3fju++0eEHcQ3/Db4eD+D6HZf7L/Bv8L34YXwUL53KesWKFStWvLy4uwnfBXAtSCqEaEnEXMJuNcFQTixJubLvUOB0qd7SAlpvS2qgOZk8s60zJthkXoLfnKkZ0o6gOLsUlgitmuJWyhbrZdbXXKhDy21S5p1YfGrUCNDbQU3NqsvV+y4ihy+LGtlba5e207xIOaOh1bgUSebbtbc8pDqTn5eUdUvlLREWqcyJvM1Uc3eK2xhfL7iuQ+iHsBBj9ICuhpGIXYBhXCR7iYMClyIJF4k35sSDToRwJOZ8G44Tq92yfGaEA+N1srDHQE5CGg45di0HghgIuW6dhTMTId9aB+7CeeMQctZ69fyzM8FuebfB8abHthlT7lzHhNY6oAv2y94HK2LY2FAXyyEGJwIa0IrnRJIywBxUrBwVttrCmJhh91G57IHRaf/X4jNgJ0UidW5i2VXfCEFOhpNaGijWBUn9ci4TvLNgZyKxK+VM7QiVIvUBI+QeppHgtoG4tjtG97zB4AjOMnwXyGg2ilCMOZrDYgECHIXrH0KeXhqnuljVncaTKHZ5aj55hhllu6rLIOWYJhbCOF6bD2ONPIOcizlBX7rn+fJFFiTRbSwkqr4zluxpl7D0Xq69f18svBhWx7eLpXmU/s6VFsZl/bV2vZA23SkWLLUvTcAdaHNm53xoTlEuqtPn1soTHCBzL4OLFNBZ++607GIRl54L3M53+qAFdC3tQzjp4oKX2lBbeBbVv1mdqMxvKoRwsI2/g3asWLFixYoVK+5qHB0f4c1vfRPMK0zhW8PmSoOH3hqsife3RrzmC67j9Jng1vXsr5zj/LmV/AUAayze/rq34ubZTXzx/W/FB/cfxgfOP4p/jw/jTXgV3oiHb0vpu0OPX8DH8B78Cn4RH/sUtnzFihUrVrzScPcTvkRga0IAWkigSjyFDYGEzNQE6iElTVS9ghkQOxCt5p1ZzdKkApY6JLhjbR6IlnxeQB7EkVX+omYEQFGNXP6e1Mhi74wpeKWVDEsB8GQdyTG4x1zN1ZYRmqUFsw7C2orqI/VPoeCpEeBJsaLaYKQ+uU+xrDIYecj6UueVtSYU4vy8jPK6hQSNihbuh9ivk1ony0Gr63B+pnQV1VZSrmbW16rNpUp4Mf9xbMcwBTlTWw5ZZWtyV9pobVCsLYiztM1oQlTpphy9WvkEzBTFqX3aRlpyU2v7xiLgr+0PU/+rcUeSv66wpU5tIAo2isoKMV2CBFTledTP4jCkvszsJEuo+0MmWIXedrCcGf7sDOZoG9SOowepXDjARLJNpFpgNrV60owAEBVVUXUp/4BI+DJgxqj01SQxAzSYQOYKG0wAehPqcgBvPNB4sCVQ62E6h7Z1MMbDe8J532I3NDDEaKzDfcfn8EzwTHjs2WsY+gZubyNJGtu0s3ju5jWc33+OB66d4kq3x+CDnfKmHXHcDdi3DfrRoo9le2/gdmJvHths9hTdtAk8EtAoNtIRMMRtBjGHbez6WExzBpg9wTkT2+/BW2AX+982LiiI5X4QcM+9p9gPTVDKcuiv9ngIJLQPVtPMhP6shRstzvcd3LkN6mPDQMOgI4ejkz2YCedPH6UFMXTsYCzDj4SkbtZoPGAJfiSMnnH+IKG7ATTnjKNPMtpbhN3QYDyx8J3Phq49D+pgNmHM2B0Fa+tRLQ5o4tDmfByZMT7vPP0zI8OMgBnUAgH9uiCAQTCjg3EeZnDwpgl9PyKM9/P9i6dGo+ldl5FPOv9phURM34pDillDy+RScWwt36h+j9aUvJkiUvdHLcdwcm9A3m4Fska1Q32HawusSqWtoeVctEXOXa2cTj9LfZfIt5vqO4BciVp845Zsi8VuWNl1Zyrdcs5Sa6vUJ8eKwlvapdS/pYKc5JsOhG8JUzie6rnW0vlynaWyOGsTpnboMVuS3EnZa0Ftg5QWRM7zxfhXiuKsXukvcUMpv3WFgn323VT3meR7K23R4zEplE3ap1OWUEx/Ui5eJGsPv0P0t1/3ufRxNm/S81hF+mrXoNgeeJnvmXTu4sJKVSYR1dsr+Xp1e1R/ictJSmeBYBOdyir/pijdclasWLFixYoVK14mdCcWv/u//VXp93f/hffjF35wVZ5q/Lq3/Br8f//aP8N//j/+KXz3D/89/Fm8C1+GL8R/h//TbZXzBJ7DN+J/wK0U0VixYsWKFZ8puOsJX9LWyku5eTlYRnK0k6VhVGRrQYqWFsLaJrpG+EhAuLR0lvN0Oyq2bJmFtD6OFtZu+UhiSFkLRG6ogmbHlAHoKXdgwfTVcq55M9+ug4pOEeQ6960cL+S0gAzgi2sXFXCJJWI+syEWspPq90rapq9Hl1m2VbbZ8H9G1EpzbVHGArJ7ktlW+jxQXbZJ6iuD0IeIhQuOndk0A8t56nwxloq2zwgNHQhXOYKzMqSZetyV40rXo9S8s7YqG8qUR1T1NZfjWgdCdW7hpee0tH1P26k+viBB/wVF+AGwc+HavFeK3shZyjUxgs2ukesM7WYiiBpTBLSkuolN/CcEL0ViT9UTSOJAApOjQEjK8eBA+kaS2WxHxZERvLfZq69tXbR0juSp8dh0YyA/9zZT18rP/VmHJ5nA10M+4K4ZMTiLkQkuqouN8XAIZC1ZzhS8obtjGxlxjUjYT45AA8HHBLTemmRlHPqGYPcM0wNjb9A2Dp0NHeja0GHWhns5DjYRyc5Hq2dCIj+Zg/o6EMQAwGg2Lp1rj0ewJ/hdUDzzaDAMFsYE8pdHA4zher0L1svJUpvCJaU1PAxww/BHHj1MuE5PgfwfgO55QnNO8C3By9eewj6K108OsEPor8RnE1K+3rSNEe2YpzEjY9I4wLic7E3nK1eMJGY2FPP9EgwzMHpgGOvqt9tF8f7LiCv2OYF1iIhUz3j6Th5yUVDfiOwdpOcopuJIUJDLUhfL4qYlpa0mIRVKNXKqb6mcQ/b9h1AQ5lpxOyMna9+wkpAt91cI6Yy8ry1IS9VV8gIrYjftV4Tlop2ytozWeXaL45KFcdlvFRUu6UVLClkO30LFm8ju8vrLhWO133W7NNl7YEyQrfSFJnSBfB5VQUbkZvOqYLOfzbOyuvPnaEpDkY9tbZcuJPBiO4DJqrm2r5zrp2v26bjJmlvPcevq38W8wqrcNP9QRHG2WFQvQquUUUtnUUXKP7BixYoVK1asWPHygoiyOe3b3/kwHvlVVwEAT7zvJj7wL144+fvokx/Ft37vt+Gd7/gP8WVf8FtecHkvNYgIjW1g4pzbg/GL+Bj+Bv4x/iO8A2/D6xfP/Xn8Mn4Y/xYAcANnOEcf0g2tWLFixYrPKNzdhG9p01yStllOvwp5WxKyQCAWE7EXjzGKQNT1yc8l2QuoYClN55Wq3pqdc0kYC/wUjOV4PVlASat4Vd6yMjCWBayLAPPUlAMB5qUAIfv8+vV2CZhmeY8rxG2Zs5VUUFUTotW8cs0UJPWR7eGSSF8IZqd7UrS9DKgWBGa4jgvyFapjaznngjJWlWlUsFbq1v8D+X6f53DL+6ByfE3VXJIatUC/Uumma7mk5Sc7FwKlBwgEUfGSUa+k7H6ZrA352JeAaOxH71NgNh1nYi5RHUw9ZJX4AtUwWuk1baTD5YrjgEcgjzxnTsHp2WWEfdkYRuaULqrM9KvEe0n9nMqliYmLik74+M4gjvl8oSygCbYNVsY+Ep6EQHQKrPXwhuC8gbEOljyOugGeCT26WIe8R+N/O4t+JNzcbLBtR2ybET0T+tGmw7Lbbj0AE+yJ07Wo6xLLZw9gDIQvWQI3COeMJlhiWyQS1O4JtDewxuOoHcAA+tHCNz5ckycwh3+EQPgG3p1Tp8o+a33sE0LbjRjHYF+9PQr2VWf7o0QSexcIoHYzYjQWPiTADTfLE2A5DB8hfg0nwhrRrtk1DHdu4faTWre9hZBL1xLGLTIEMnb6X/pBj5VyPEn+XlEBTzmkOeb75bD4QJ+nCYk4toKiP9bhGeQ9uB9ycvR2oOos86fOjy0UvNPB82N1WQvP7m3ZypcLxGoLmIQ4jMrBWZqG8ptiad5vxoQ+LecEh5SsC+T3THFaacfBMi5a9BJtjhMBW5yr88HOHDHkZ63UjgQye5MTz7odsj+ZdUx1ZAsE5LyCtOXy/VtcT/W6ZR5UUdCW+YNzVXYF1VQRtRyyiuCO38TqM1az4xYyd8kJJTvuwCKGJUvtGmEt5yYlq1pEAZ4/P5YOP3/Fc84G87mu1CHOOVrJ6yuL2gAkp5CSIC5dewpHEVVx+F/+JhCVsLiZlHVBiqfJqaRcmAbkeX1nC9cOLG5ZsWLFihUrVqx4mfDm33I/3vxb7gcAvP//8wQ+9KNPAQjTonF3Z38bPvbsE/gnP/APcP3kKn7dW38Njroj2LvA+rrEpu1wvDnG+f4cj+JJfB9+BG/CI/gsPLx4znvxEXwffuQlbOWKFStWrHgl4u4mfCtKXgA58StBHCAoe0sFbwlNOoq6b/TB0tnQPIevJoU9piDLqMjGxoZ9YutcQgI4uv21XF21uyUqHu+TQoEam+2DZ6CJ9nHIg57wk5oib9NCQLy0vgSQVLo1Ek6jaSZimDknZIVU19DWzlpRonlcrTBhH/YJsX2IjNXtz9QcBSlcI0trgd7svPi/qp+0daTYFVatr/V18WKwOlzDVG8iaqUPatehA9Yp4DiRpykQmgVf8zZq3Tk7P52jbK6z4DGZYCE5dcS83GjLHAKZU7sTCVyogDWJKwqhLMCpnp1kcVgLdtZUvWXQt8inpxcqJNvV2A4hAcrgfWIhL0MKOQfa96DjFsQmkW9sDAx8zIHKwBiUkdQG1k3MvJmC2pIpBrcjISeKS98wRI2aiD3LE+lKsSQKPwMA9ao/rQcsY7jVTaQgMcgyrlw7hyUGEWPTjrDx/NY43LM5x7Vuh7Oxw8eNx63TLcbzJrUFngIpe25x62PXcHPjcXzfGbbdgONNj1u7zUQoUyA/yTDYOngTc+UC8Ir8Nc+2MAPBb8L1ccMIal8EG+yeYM+CetZ1YVt7C7C9hXuTwcaO2I/BQjoMhWD37CUnMAHOhfrsJiiaEe2m2Rs4JwspCMOuTSTz0Dg0jQcYMBuHzdGA3VkHP1o0nQsqZRcUsGSCmloeOz5tADbgxitSltPP49FE3gpB61vA29R1MAOSjbVxcVxs5P6H340D7Pm0DiBx+Rxz/PpoJe55sntmjk2J4zESwCCKKRcYZvDBlcOHRQRBTe6BYQTvdheTgxeBTJWMq+Yo1SjJrYqSV1stM8L+agqFhfMv3CfvfCk/LmyZ5/Gc6qxZQoc6fJ6eIe0vHBWWIN8RMtP7t0b2lt/5gjgMRK4QWgukc2YJ7XJbXX2c/obquivEaqaErY0p3e6aOrk8LnP1sBlhK/sTwVxCz5vUdz2RzcqxQpTD7BbafQgVlw55FrI+PdQfhZJ2dk7N0UW2l+fK97pppvGrv+XlmJTtnsGuT8R3QqVN6ZvgOZG5aaGEemYyAl0RtWHeobZVSNesvIIMntpmpr8XNGoOIrXfpSzt/COWz8whvYQsehuiU46QxEAijlmXV6qUF15HK1asWLFixYoVrxS86Uvuxx/+B78WAHDrk3v8wJ9+D/rTO0/583/7Z38H//gn/in+4bd+L97yms9+sZr5kuEvfs2fwR/+0q/B7/urX4vHnn0CAPA/4J/ie/HDi+fcxPlL1bwVK1asWPEKxt1N+C5hSUmnlb61fTU7txpqZaQAaIWAvqgs3W79cxlg0qqBrIiCxK5dXyp2nou0mp8VuLSCcyp8IQAr20gFv2oq7EN16yBiVUVUkLZLipey7ENqq0M4ZAVa67fb7cuLlGfqmET2Vqwjl8qQcZCRp0uKrVpO4UNk9VIZui3ZPTgQ2D60ElMr3gtcWnGH2BepTJ8Hb0VJs/DsVXNm1tS9lwQzw4wuEmRISsoEHzaEnL0U9gOXC+ZSIPpKhS8bsWvGlMPXTtumA/U/AgyDGg/uDVjIUOH/DYONBxHDscHoDTrjcNz0uH60g2PCOQKJyo4CGSpB+DGM5fPTDbw3GNsx2SQTMaw1ANxk8NBMzTNNJAGicjcQJ/HaCRDLajDBDATbSx9EknQE7A7YDQ32roGN10DESdnLykLai9V0JHsBIOQSLu6/EOvwCMpotXAg3mDpQ3b65ggjPr+XCVKWYXDLcNuQkzd0SFyYoIpJYwDF2NJly+XIq9Ej2Tkn62bizAIaCMSvKIV1s5mEzKq8a30gfXkY7uy5qXy7Diowa+SVtEmItsJFIWtvzRVB/Vy1bC6ViVnzp/MPumio48XGdgbPc+JZ2nC7WPrGLX0/XwCyd2bR/2Tocu2/KE9wpc7s3EsokV+suqFyCle/F5W2LI7nF9oWjRd6L6sLGUxMVVA8R8XvWe7qy0BbbWss2Dpnz2ZaqGkmm2fl/lHLv7uYi1fqPDRXuWBengjcSvuz+YluZ35Q9dwVK1asWLFixYq7CZsrDTZXwh/326sNXv+Oe9CfBcL3k79wC7vnx9sq76kbT+N0d4b90L/obX0p8Mi9D6NtWjRNm7Y9hefxFJ5/GVu1YsWKFSvuBtzVhC8xg21UD6mAChsCRZkl20DcVHP9AnnwpAykMAfFbyJfOQSurJ3IYzlOLJi1IkHqlPbJucByYEZW95dEqA4oxQDaLB+v8ymQmPKRlVbR0p50kgdGBjdNHtDSClhBZoW5oApO90I3zOf/63Z0TV4f+1zZa6S/dN5WMx3Lkdz1qm2i1ioDyDqHXKOGPse6SbEUmrxO6pUFNZPuH9muA+1iQyzt1uUukQ+6/IpqJpUNTOqpsl6Brl+dm2WJJpMTrwXJy86BYC9tYR3qQ9537HNFrsDNg6uZvXQlqJtUUUp9yzrgeiDwqW0RUx0yvBbIY1I/SxmJqHF+UoklJVtlJepFls5AUPLs9qDhGNRa0OgTgWNGRkaiGUCsdn0z/cyZui2SxobgLYEtRwIwkHcppy8CwdzeMPAd4O4fgbMm5L09coFcHgjUm0AGHznYzuHoeI+bj18FDYTzdhPyzQ6E3dUBTePQxby9AHDv5gydcXjztafwwNEWN69u8fHnr6PfNxhcJJpbhPIdwXyyw+64wa7zOL73HNYE5XBjfMidG8v1njCOIYcwWcA7Azca8MkItzEwOwOOZOh0IwHTE5rTeA9jWuFmAEzPuPH8ESwxHrhyCivqYU/wLlpIR5LVtX4q0pvwSnIG3AYLaFEAb497EDGMYfR9g3G0wYrZGezP2zQ8/GlUPRMCaW0CsR/y9nJ0DwiKanaB2KZ9uCc48vBHDmwNuufDIPBNuMdiv+wtwJtAbGdjJZK7RPn4kTy89pxhov2ziX9nu0gcR/4cTAQaQ/1sEZTGoKD4NQQmwNpIXiSF3fR98/2AWU73i1CSKCVZm97RVm2Kz3DtVaYsgSmuJJCcRzWVbbY9qgyz5sj7QmxpZb9+p8dvPpXfdEXeZgu1hNCN84mSZE6qX/19SmrdilVw7duyZHtdvouz741F+f0hpcCczR0KG+Zkv6xz+pbEe/Y95uz8mvXyDKm8Ypxpi2WdX1e3sVh0VlURq+97bdEBD2M8LG+/KIyzHL6lEtpQOj+VodslcyhV9qKlddYXlWso1djlfdDblDI9zXdE2U2FErack+nxJONaxhLCWM7mLQcWG5SEbG3xBVkb5g6eJ+cRa/P5dDGG2bk4Tyj6S+ZCFWV1dsyh/YfmA95PdYi9dLiw6RhRGmuXoOTUQvPyVqxYsWLFihUr7hIc39/iP/4bvxpAmOL8r9/48/jITz77MrdqxYoVK1asuDtwVxO+AALZK9DEawzSJqI3ycEUkSqWz/p8HZiskbdSlqGwLasTl1MnSM4uXa+Gc3m7Flbvz3L4EgNQAV1RHEm8b6auyiPes4CXFG3NRCbHwHE4oULgsi8I9UPqTdVnzIBY3+ocyjUCQI5NKmFRX3IeBKzZWOoAaXl+6jcV5KzlDExlq3L1dVobWbaJgE1BSx3I1kToQZvFAwpfTWJL3aUi11DMvVkhgwUZWRzbaNV2Y6rnMXOwhZahJIF+yV0Nt8B9Lqhd9PmHoG2WL7Ff5+5lvXACUOMP6Rj9ey2QPLN01OQ8MKm2btOWk5nBwwBZNJFUllKMkIFAlqPXDJqsoUTwaZUm+ZBnFQywEEmeYXYyNlUdTKFOj8TqcSOEI4BbDcbO4NQT0Piw8AYIeXUNwY8Gg5+UrNZ4bGwHND02ZsT1dofjpkdrHW71Gzx16wTnZx38zgKjAYPhO4AcAXuLs+eOQK3HeevQbUa0NlgouyhXpphD11rVKVHt6zo7XYcLxHX3rIHdRXtn+QryRI7yaYPTTYdXXbsRy0YirskyqHPh/7jdOyHmpNOD3bN3BsyEtnXwnjAMJqqUPcyRx7hvgk0zIZ0HQlBP21AWmagudiaqhMN+7E1QZCMQa7wTciAQu0bIfjW+yAOIZK9KOxxusQ99YMbwjxwAOzVL8vFyZfyxJXgwfGfg27C4wCBU7olAI8OMIb8v2bhN3h3OxdzVd2DXVVPOxXcsL7hBkHovJlTUpZdyCfB8MN/qhWpcAAyXWUOzumM1cjZz6ChJ5uya5teezQEOEbmXVZOWxJ0QnXpucTuK01rqAmB+Lfrdqr/TJUlabku76nOUWa7gEqream7hhfrK7eHcA+2q5eiNltEzNXBsU8jTW6/v4DXV2pncWA6pVtW9P2ChPp93Yn4/TU7Opu92WX1pG700J9Ft0W4m8ZudkchqEVdS2evzJRWL/ubrBZ+yALRU+ar6igbm76zZ+4tTfXreMltslxHpejIQraD1orjS4nnFihUrVqxYseIVjiBgib8w44v+k9fgs7/0AQDAoz/9LD74vz01O4fh8cv4aTyPx/NUdncxTjbH+M4//Jfwr9/3E3jXD/7dl7s5K1asWLHiLsFdT/gmREKXTSBfJb+gBDnYmmhROpGhIXCEnAQG6gGYMliiV9EfsmqrnQMEUnNm48dTYGZmHVsEbXSbhUBW52uryVLpMCPJiMDe5+3R6g35P6kgdVB2IYh0WaKrRoqlIKOfiPZZ/raFess+JVGZSPCruF9L6lnBRZaVRGEMaStQvU1f05IN8pJqReJ7h6yya4pfKioX9W7V/nBOLpCPdRsChguChKWqpBboVahaSGsVdI3o1fvLsXvg/lB6LnxQES8smGAdrC2t1AFoO+eDto5Z4eUAuCQ8A+M4Ebwct0UiclZNfDUZUevKuhZM51O6rwQzAr4FJH8qXCQ9hVyWempdahBYRAbMzsA7G5rZ+kReUGQZ/RCtiRkYLOPceBy3AwwxTpoeR3bAPabHtWaPG5sNPBOe8oSdj5bJIHDHQVU8EOAtuDEYOgMyDGM8bLRZ9pE8MEYsn336HwAGa+FGG/L7jhY0ENobNOWnVX0JAGwIZmcw7hs0xqccvmk4G4ZtHaxljENQFrOjQNBKHwBBEayIDWaCGy2M9TCG0TQO476BEYWuoZiblxMBTGJB7TFZRSuLaRooKJcZIddyw2DiYNvsARqna0vErZC96XoV4YtwjiwMKMeBJok1gtqcEtnLlkJ/McAWsI7VOI7f5zFYQlPl2bwj6HcsC7Fj5/uWSKzaAiYpulg4skQOJRiaFobUFH7Fe+tSaRUOfadUG1OZ+jIVQSxtS8Ry6fixtMjpIpRkbU2hewGRrBWuQlhJXtuS2D2o1L4DzCyTy/4Wgl7ft4qKd1ZeOS4vYw2tjyvHdEn6lvmEbwdLz4RWUgPLY6Fmfy7laSK9XHilcWBMlJbKB+cUZRsMZfvkGZsfP29nUcFEopYLvYD54i85p6yjZvmc5kMHxkTRvlkbCgI5uZbwtOiNi3JWrFixYsWKFSvuJhAR3vxbH8i2PfpTzwIAvPc4O9sh0L0ej+EDuIlPqiMZN89v4db5LZxsTy4fz3mFYNtt8XVf9gdxZXuyEr4rVqxYseLSuKsJXyYKls0AwAwaXCA3TLSQNBQsUUtVr/7Ij04RZQQ0pk4mNrYIjPJE2i4Fe8rJhF6hP8YgsKzcF+K4tH11DmIHnYLNpmij2EWXKMuSgGVyNazYNqcy4zU5gLXaQ7braynr1qS0thvOLDFt6PdxnI6d1V2oqoFJYVheX2l/nFRHjMiWpOtJ12Io3ENXBKo1RC2uVbNa0WRindHGEACo66ZytGJH2y06F+wKJTgn8MW9lzJ8YcucWSHaqQ45p2ZLqerIctTVVLWi5pZ9SSE8PS8kdufqOtM1pe6jvC3S9pLAFRWyVK/7xi+01fNkX5rKnghoNgYkQXIJlMrPpequsE6ckb9W2Vk7N9k8xn5gIfwVQmD+AFlfATsHf76D6QeYoYXbhr6R95kofDnWbYag2nVdUPKzicpJ/XqgsPiFPEAu5sI1mHK7Cgzgjjjk9N1Z8MaDjxjmZhPK7nxQlDLADcAbD3sywp1b8D5IQTlUCOpDW/n6gP15m2yLN+2IG/st7tmc497NGRry2BiHz7n+JO7bnuH5founT48xDA2GwcLtGnBvQHsTyhwJw61jDAjtkdy4zcmAthtjbN6jaaacu03jwd7AAzDnQdnrW+nHQEhSJEcl/yw5gh8MntsdAQC23YDeNPDeg0wgu90AGMvoNiOOrvU423Vwo0W3GWAi6bvfEdxocHZzA7FlHvehL5qNAxmGvzoCfehXuR7T+umVmJS/Hu1mBHvCuI92w41i9xsGPGDc9JIUC2Y2qhgGzIB0H4F43Rz7wcvP8X0Xt4MA1xJsH78jNI0fM8bjZeGAKIHl9WcI3Bh4lduYXbB7xjCCx9vLxzRdYPGNvQyxK+/TYQyE8JKq01TIIV1VJT1DlUyqkbaqHbPvsiKLxX42lMV5GT7/FjB43uaa+wQK4k23Sd5j+r1VEsCGkjUuD1GpKqpoTfiVi3Hkm1JDPF+Tt2KtnIjdzDIfuaVxeZ0lYVxT4NbGhyZZF9qqCdeDbajUkS1A0G0pj61ZOpfHy+/aXpp9uCfWTmUsuYeIw0hZZxrX09iczV+AfA5YjPHwjc3J1gyKSJ4tVJBFmuXcVfUxUROej2EM7zZNnJaLJ4wJryHvw3yh9lyrRV2zxZFGKf6HYZq3yDnl/Ff/vSFzCWtzUlfeGareNPfQbXMuUxWnuq1ddBUQ15Uwv4/zHmOAtgV21VNWrFixYsWKFSvuKrz9nQ/jjV98HwDgox/+KL7tT38nhiH8gbvDaXbsrt/jD/zXfwRf8vbfiL//Z94F+2KtFl2xYsWKFStewbirCd8ETTAKCVPaEpdkrUapPNHllTbHQjoR5ZbOl7FLK8nmcpV+iTtckU864KRRBmAvsvjT+6V/HC4+LzQi/F8NglaC6Lqtl+3PxbqLwKS2Tk71xaC2waXJuLnK2E/lKkXF7dr4pjYDOKQKXSQfavXVtqn2k68EYcug+CUUWRl8JVBbQ7w3Fyraar9fBE3YHji/qhaq2ajL9so1LarydD01C85DENLe+6AoZg630k5kbzo0W/ww/ZOMw0nZK5JffT7Xfw7qXgoB40aVbeJCGjnexm2SV1ashuUAE/LPBmdzAhxh1wei0xBj5xrcHDbojENjHFryuNLu0dkRvbM4Nx5AB/Y0OcV7uS4EhXK0UcZIGE0DNwb1LxkOds/OBFUsMfxogL2N+YwjsU3T9YXFBgQWdSsx4Ak3dxsAgGeK8XtF4gNRaQuM3kyWzzTtMzbaSnMk2m0g6LWbPLUePEb2Od2E0IZ0u+M94Kga5j62QQvJI1FNtbU/svYF0/8zu2eeSGEQgko3EriSL1oUu8kWnMP4ShbRur2COL4k3y+AafGCkCJ3qlDUWCLPyn01XKBkLN8VzAyK75mqZW3lnFR+SfouIXMZqLRvwd3g4PtXE2eHIMfUVJ5eVgAUZKrKRTtra9w/NfIS30ilaJ3v4ok8jccuqm0vS/ZW2rVU5pKqt1reBXUdUgnXTyuOv0g1fDttfCHl6CL1vPmS15bloa4sVASQk9S1+fFFLhyzBREyHibCmArS9wUrYw+1R1tEH6pHFqDh8PM95fpe1bwrVqxYsWLFik9fbK402FwJwYodruELfstbMVQWED/64UfxiY8+ho8//Rgee/aJl7qZK1asWLFixcuGu5rwJWbQqKLbxoRAMhC2azJWVs5rMrEWiBKrZ2BSk3p1vlY1yqSiaaa8s0kRwTlxDBRElM+COEmlmyldFwJgUqbK9ZUFeKwNSoVK8CvLN1gGcnUwtMwXlgpQKknJ65saqYJnohYZx9hnBkg5em2uHpE2GNUXun2zPlJkRzpOlDM81efj/TFRwqctqT0j2BwXdoRGtV23pVTxiL2kU4rXppnKl3O04lYgyiOdR07K1mqzMjevbruCqFxnyi5dNpk8NzKcyrNbgShwfTxf5wauQLchqYd13mJ9HdL3AtXftaDv3IJckexuOj7Vp20cy3zYupisrbYeKFXvD92epHDLFioU5MghhdUSmMHjGHKPe4AGDzI2J2eFcBWCN6p1mSgj5DTxx0TwFvDN1F4f87PSCMBEQi6eQ0zwkcziJvyjjQ82zT5aRFIgc00XTmIf6/cU1Leh4kDMjgb7XQvvCUfdgN3YYvAWhhiWPK51OzywOcXVZoezsUNrgi0zAAyG4a0NdQ8mEskEJgYNBvacgFMT+yLYGY8Nw54ZkAd8y7AcFOS+Y/gjhrvCqS8pthtg2D3B9Ii214QbN45gLMM2LpG9bjQwluM/D+8Jt24cJbKZY+dI7t62dej78G4whtH7YCdNxoOYYAwwuNhP0QabXchHTJHkFQvncd+ABwM6t8G+2TDsebx5hgPhq8jXTMWtyVyj/geSqjezebZCfiMogV18jbaReLBR2Tsifu8QlehQKRWK8e05EMlJkQjQC1H41lAhrVI+SzJpXGnSLL0LCivbKffn9E5jcdywNi7O4BmRlPLsLpFxqjwA6Rsu9S0qcE3RFoNlUk0rMfW3ZGlRjSJvgyNC7JumCe8l+Z6yD44GsT/T909UnbVFXtKOVOfC4qiaZbP6JoY6XDxvUmdP+dJtahMVHvis+uCyC/tJlU/6G6wVt1ENPGtvqrg4vri+VL6pHFeUMVNQA5PjhNyHyxCsSYVbWR1SU6QnB4u5qpesmezBK4sJMiV9OfYMzV06ysV6pctHa6fvsZk/c/JMTSkq4lw72jLLnC65dJQLvSLpmyBzCJrGeXVOoefhxuT/Szn63KXUEdpCWtx/gNSH7Hz+t0RqunpvlO3ztzkPWbFixYoVK1asuEvw8Ksfxn/13/2F6r7v/pvfi//le77/JW7RihUrVqxY8fLjriZ8U5LASOSmIDMw2fS2NiNOAdRJVR0gkSCSKPtsSaTxRIJJGUKMpQCZqlPIXx3QkZy7OuiTBURza7cyhCc5d8kqRaPY2arAZk2ZNMtxZmMQSQcR07VO/ZGCwD6QUon0VIFH1cB4TbEPdWBxHCdS2EQiMVMrFventN6tkY7pHJ7qkzaMIzL7ZjJZ3DKcb4C2IHTlmkpLy5ryuQYhJTWWgvMzW+zKubpORZImUrasJ/vZ1QN+S9bPhiZCOJHjC+QwJAgq42SZnE6se2ZJfXGZSyQF6VzYNYVxxUZxdhVKpUfKKjFTy4gtZNG+RNAI8VJZPEFWERKXVa+PDjQ4wHaZNe5ktYug5GVMNrzRyl6sscX2mVR9ydqXw/9MALdybmyyA8xIcEceaDyYzaTmZQpEtCOACd43U9sMA5E8paNgV8xuajw7wjha3NptsGlHdNahtQ7GMDwTbgxbnLsW19odjpse1zYtnmmPcda3OD3fwDkD3xjwzk5DtvVwRDB7A3IIY5Y4EKehifGiOJGRMHn/s+VIkBN8E4/beMBGZTAC0cFR5QvILSQMfTORpDH/8EBNUBkn8jfsS7mHrYdnCtftAe8NTOPBNhC7IASrZ2/SGplUjqP4rQm5ekGA3wTVMI1xLAzxZ0X+A1A5wcM/5mlcJTt1IYF5Op8plpfG39R3QhT7hmAcQGPoP28B6/NjUl3xdUSeQc6Dd3tw3+MF4aI8qUJk6veksq4VwioQe/mpQixlhIoqXy/cmRG13kwksX73i620WMwq4idTR9agyOhF8ra0Yq7YVR9CZn1bElMzJ4hIsMk7sDxGjtPfOG0pvHC/qFwUJO3S5WtyucwZrK91SUVb1r2gFE55hKWeSyqBs7bONlP9uLINmlTXJLbq60QWL6VxKNvh4/s+LZ6j6rdrdj/1GK59bytjlrRFdIkauax+T7l/DaYFFTULdVHmmnl7OM4Ja8pfrdTXZefpJhRBWxyXzS8UOTtz8wmNnc4t/+4olcbSH26qM1k1y7EFWTxbsKbbUM6jV6xYsWLFihUrPk1wyN3lt3zFl+B1b3wdAOCRex/CB+7/EB45ewj37+95iVq3YsWKFStWvDy4uwlfQfmRzwiOSICUlsFy3OS/Od8m27WSwEXSxvO0ryxHK4sPtVWfv4RaXq+JRQAzzcngsrwayViqNTKVThH4qzFyzAjMj8FMkaRBJid7pT2aRNfq39vBUh/PlMNa+VMJkic7QwJKpYqcTyowrYOjS4qcsnytDtbbde5hqbds1yGr0to5ZTA6KV0OnLNUzwVE76w8vQBgUM9h0YZMvcvzAG5S75TqtEN1e56Nw+rYLJ/xQi1T/aNBP9dF+Vk7qosRQkC+JqZahPchgK1JbykuvjKYJF8v5Sy2/KyGM3FQxWbWvvGxyPLAyvFR2QnLgIgvmaZ/PvQHcVTWEofXBFPMEzzCGIYbNZkSCNF+yD87hhijtzhjgqEG19uQaPCk6eGZ0BgP5w2G0WIki8EZYFBldhzGWlTHJuthKh4X8SxW/RKskmNRkZT0xEATF6HENvt4Tp6XEmC5PsOpTB/7gNmH88XqWXkpp2bF8skARB5G+SKPo8mIUjDiNVJomwllSR5eGimR9ek5MxNRmxHgZiozGxPxNmddpF8V+jPqp4M4ctNmjEPEINlB6wUHmYuDD6Qv9vsXV+GrIMRZzQK39q2rknaysMqYPK+6oHTYgHrv6O8qeL7vkqSZbmP6Hl94XH69U3vn77Cs/lk9hcVt+Z5L37A6sZk3JfaBfJPDL9V2VbMbVL6zVbK1oiSFViXXoI8pcVmS904tkQ+dd5lvdWnJfBk1ZzkvrN3XpUWAZTn6HN0O3f5LzCPS9z/Nw8KzVfsmzwhZFGO5VBorEvdg/tslqHnCLJ0DxQUhZV7fUvWryd54XkYkH4K2f9bn6/3lHKVGPK9YsWLFihUrVnyG4C1v/2y85e2fnX5/HE/heDzG1eEErW8wj6S+8uC9x7O3nsPzZzde7qasWLFixYq7CHc/4auDPcMYVrrbybot2EpWCJ90UqEakOCLrJYXG2hRljRRmZuCZTTl8nULwZWkCqIpwKOtZuM2HsfQbkU+cz8oJW4MkEYrOrZ2CnAVAXNSdWXqCCAqccyk8kC+X85lIFNPJvs/uf5I2s5UNxqGANPkwTfFPE7qp0I1JPVoe2jZpslF+DlpngKMhZJXylhS4mhrwdLmUquRhkpdmVImHuc5u2eZxaZuz4LqV0gQsuYw6WlL4t4CcIkApabJCGd2fprc1ggMbbksbRNVdC3gzpyXx/NrocLyPFPvltfBPgwRUSaXZDj7usV0XNzBziVVEavAa1IaibquEtydL5YogqiH7kOpNottva0cvtKO/R503oLcSWirKBQhStXAynlRrVIggIVkAybiDgyYAbA7oLlF8B3AlmGGwNeNG4bpI0kZc/G6jRCjBOrje25vpke84XCsVURry0BPoIHgzxt4w6CdBToPOh7RtA4ghnOE036LmyPBth7dZgCuAw15WOOxtWPsTsKVdo8r7R4PHd/EzrW4sd/ibGgxjBan5x3GvgGfNfBdVGb60FQQ4LfhXpg9gZtIbDsKFsQeQSWtlLJoeVJT25Bv11iGHwm+t1E1zKCGEzncbAeAKeQPbkLOXTI+WD8PNvQXSe5di3GwiSQd900aWqZzIAoEuRDEPETCV79WxTZbqZRppPDPE8ye0OwCYa+V4aLsFjW4KHejSDwzSNDEsN0BZuRJRc5IdszkkOybAcC4ifQOHRHyODMTuM0J4kCmM2j04GG8eFHHEibpc/pWlHmzE8lY2Mqm71amxq+odQ1BLF3F3liToFxpe00hSHF7Lb/p5CYw1ZlZztO0cCB7HxbuBtn7WQi7Mj1D8Z7KcoEX6s5MtSt1auhv8yFiUN5fuiklUVgQsjOLZPm2IhLG0ncovqcl5Lt3EUHreW4NvXRsanZcUNCqqXRtPEjd2qGk/FYYyt1Z5PrhqnVP5VbKqc2nalBW5xkOEb2HvmcVJXl6DsRJZmkBglLaJxW7mjdl9udApnRljpbbRCBJtaCercwyPc6bl945JSmcekH/raHVvLGcrFdquXkr8w3tKBLmTmHOKDbyM5cR3bYy/YQQyvK+ie4nU/mv/IDmihUrVqxYsWLFpxofufZxPH7ySXzhk2/Hkdu+3M25EM+f3cDv+Pavxoce++WXuykrVqxYseIuwt1N+BKBo2UwieI2giMZS0LGLqHcVyp1a2TxLJhZrKi/RLvLfF2zlf9pnwqYFbZvlA47oLCFIn9r7ZPgd0EKH7wOIqUQW1CsFoHUPI9dvFdRoVzdL+dZysleDfb5sbq+Q5aVNTVtdn0m//mQtbJui7ZA1Nv18WXZYt1cUeZcSj16SKGjIX3s69aG1eMvAhnA+Fw5fCeQ+6WuvcydOcMFCqZ0vgrSzvJx1p6bir1jQnY/clVfsnW+Q96qcgHpnZBUkorIDT8AelFqsLMPql9Oz3v4J+LWJN1kAuxEcJIjmBEY2/i7D9u4D1JNIfz8JhC9pNS08jNrQi82lA0DhkEUbJuJKdqPchj+HGyeb+43MMSwxqMzDl0kfUXxurUDGvJoyOFK12DvGhjjsWtb7AzD723KL5zgAfIhX2zI7avaHRWoQZGs+pEimRotoe1mjKQYg43JDB0ok7sC7CPD7gNpKzbOAKK19XQsEI+HfGbCApuQB1nfO8rHFOdliLqbfCD1zajIXoNkzyznyhggL9c6jY2k9C3rAJKbN6wqU3M2Dvl4jMeT+j+pqdWYhPchB+kdLIrIoL/9h94ZmgirODUsfkeL98JMkVtRzWbn1qDOKcne+bHRsvZS84tLqjzLVAVFqoBsX9mu2nf+TrHQTiHuk812tmjsgnqXrr3sG/17Wixglsu/gzyoGdFcG5uVuYNc+0X5eA/uX8offQiHVM63C2U9nqthL6NmnT9TWU7eYltw3MmdOi6cB6oyqEae1gjhMneuPq7qNlMcD+Tvqsri05LkLcs++A7QpO9M5f4iPKsrVqxYsWLFihV3OZxx2IHx5NEzuDqc4J79tVes0vdnfvHf4ud+5T345cc/gmdvPfdyN2fFihUrVtxFuKsJXxZCJ66M58aGvICeAxEMIIvQZydLoFcRoUKM1o6V40c/PyZTQlTqlACMqBq9qlupgEjOUTa21HXAOIKF/CEClMpI2kW1IFJUC2glQqZaAiYi0AFMBtTYUJcrVCWiGikDl0K6yrU5BKVso4LJ3oXyGq2CqZG4ReBTVD+6z7QKpswlKPVpla0mbEVZnaqL+xK5XwmQ6nHkHJLNcFlv7XedH1faYWxQY0tdZX36OkU1JPdopsJNzFEsiwB2k3JNENvNzs+Vtfp+KuXrpE5TdWho1bNF3jeivK0phBZUQ+w84H2mlJoFNl20ViWTq5+rNpM+8E/qXjFzUAwppUxuAeknlU1RVrrnZbC3JH0rORGT4jDZgi8svsjqDASQvM/IIT1nbAMBbHuGbwk+/oFCPqgsJU8tR/JXLO05nivHOgv4VohQwO4Iw/VwPbQnmF1gg5kAMxJMHwhfGAaGkOOZgaAAZoAbk4i+0AcMtAgqYEJQyRKj2Xg0jYPpGP2+hRstnr91lLqjNR7bZsBx0yfC98gyjtodHtiMMJE8frS5DzvX4OxKh+fOtxiGJr4WCd4buBtdeK81HNS9ljPiWghhDMHqmiNBGowDLJg9uusjJHfvMNhQ7q4BWR9z8Jp0wewI3hPITuQ8KKh+eZBxAZAkt5WhQ4DrTVwDU/ljU1tVx+NBDPig6g1lEex5uEc0An4LsAV8Gwhg+QcCfBPJYZ7IW/KY7JqFDI51cbIdDY97Ios1hzNwnts3tTWyvXGhQUixwKAxjm/H8M6Hb8TtouqmodS6WunLQXUNuKT0JWvBcDkJrEk3lXuXTSCasnerqHDB6X1XLqap2sgeIqJiuxKpnOYKxcKhoq1To/U32syPMzS9t8s+S993O31zpMwCsxyzwLJadCmfbPyWB0J3IZG7nB/92dm5UK+aJ2TbdH06lUKREzhrf7FoLcsdXGl/UvVaC5b2Ey8eOyurdAxR52lV88E+ketbQi2X76GUFMB8TGpl9MxFBOBhzPtdY4GsrWKJBNfzTXUcg2eOIUCcQzifqfSnfcEVh9S3Vz9fmdONKGSXFsbJN1/PCUIy9ul3PU8oForN3weV56M2F4lzGl3WYtv0sbHOV2ogc8WKFStWrFix4qWGNx4fvPdXcP/5Pbhnf+3lbk4VzIx3/eDfxbt+6O++3E1ZsWLFihV3Ie5qwjehJGA1QavtmUvlniZeJDcvMCfB9LG6DqeI25LkLdWAck4K8h8gfYSoVW3NVLpiB13mDqyoAJJyQe1LAaeSGFT7WVsPlhaSOqBKJgbzPdAPgSBtGhVwjOdaG/pYCFaTKpvIVCGEU5CvCDJ6rgcHpS0A0Kp7dyhgqvfV+kGCozWraLEUBuqB81RuxS6ZvSJED6ikPCvWBBNZWLZFq2Ml3l4JeGbba+SrJijL8yv5CzMLTl3WBbbZiXQu26Yty3Eg2Krr0Js4J5zKYCjr94EcXyppygCqPF9WbNzVwg3gtmxoS5vZC50AnAPGcSJ8PSfr3GRbDGBSd4rV80TEZRa6wETSxX/kA5HLjuA7xmAAGigdR1GV6q848EgATLBxNoDYIcMyuI3kqSMwMbj1ieSFBzAaeE8ISl/Ae5OGT1qb4gnjEFS6p32H0Rvc6jep+bvtObY2kMA2PhdX2j2Omx73bM5xpdtj8Bb7sUHvLM77FmcAXG+Bm01om3QZTf0ieX4ZANtIDJtApsIRbj17DLtxsI1D2zqMI+AoKIo9A9T60JdmYrqJAtnOLv4jBBtoT4AHUgbfqCKWfwwGGZ6UykLyCjEd73foVwJc6HO7I5g+KLRBCDl99SvHhN+9+p3jmiGOBC55THl347ghqQ9ICwVSeayqYMBbggHDtQTfAGwJ1oVvYlIbUzgm5SBGHAB3oJqsfj9LsrVQhFJBHrFXaRAOkagaS0SWUjPWMMuBWyAjjiuWCSXRXC1Hf6/LfYVFdJX00wroC9ShVTJy6fgaAay/V9rdoTiWhIAWS+hykZPeVoMmBJX9cfWcpUVY6dzwski21IYmO+nyenVO6KWFaZVxL+1Kba1YJGcL4mrfZj0nWZpb1M6X8woXErLInw9FSs/aVtZR21fbXhxPTTMRsjJ2xzER1pODR15u7lITxjOjeB5kTm3t9KwtuXrM2quOkzmBdhIpid/y75KStC0XngKTRXz5jB1S6NbarR0JjLmcO8CKFStWrFixYsWKlx3//sM/j7/2D/8G/s0v/buXuykrVqxYseIuxacH4QvEnJZTJJ/Syn0CLeXWnRUiAVP9uyIoZ2qNgsDRSkCNMuizZJ2c2d5VSKXS+lnbQWtrOU3oXdYKrrBTTgHoMvB7KDjPHoAod2JZEnyWe+M55EGGDvDWFEBFQF/uQak81tBqXVPpy7I92f2LJKwEN0suTys0s3IX+vQyFqUXWQ6WQfDSMvvQvSjvmRDgpV1nrf4la+6lawDmeYlLqED1zOJRHyN16hzC5f4Cs3FdU+jUrBU1DpG+ADAM8+2XJXzLe3WJwGvIXejDu0u/jyiqUYFE2gIM4wgeYb+UTtEOeioUk5JVEcaSl5UNT8Sfje9QZf3sh0iGSqGKrAQQ2mkxkb2qXojylQAwzZ4a701QwY6E/WjhPMFFAsIQozUeYzP93pDHxo4wYDTGoTMjet9gN7Y4H1vYOH72TYP9TmTNkZzmQO4Sh3dAIp1tvL6GgSEQrnRuw6uAGE0T8uySYfBoAnlrTCB7qbgiRWRTtLUOfR0XkZQdkG5o+Q2KKl6eyoSnaIccCd99yEss3EV2f2OxLK88mn4XS+d0TPl4cLFPxk/kqRnqsglxwUFceEDzLtG22aFL+VLPwgxL3/Lk0lEjDdMv6nileFysiqa8osjfKZqQSsdWVLyXUvZeou5LY4FQvhTK97cmGC9b7wXq4Or3RStS9feuLPsyr9wD38aqMlkfX5KgF6lXlxYKJDcHMx1XHLOYU/iiBRC1+UlecL29NZK5pgC+LCrHXpRepNou+VnPW8XCHMspKEr1vM7VW7avWoYmapXTzkHM5o3yzlHnHyKNL9M3yTFHlaXmNNX+1Qsr1SJRlnes9/k3ecWKFStWrFixYgU8eextj9Y3sHyBu85L0R7v8cnnn8R7PvJ+fP+P/ZOXuzkrVqxYseIuxl1N+BIzaJhUOsGSk5KFKTgG9YE8UFOzca6pIp0EdMuKo7JgdNO5XhG5yd44krONWCQKC1D8H62WKcs/ViGI9DapdwyRPx7HeVDLuWAxawikreS8z1UezICdFEBJTaxtB8VCMSlbVXBOyNDNJvycrB0p5OCVaxAFb6lUlZx5HFkMfW/S9UZi+CJCXY7Tdpg6aK7PT0E6ALCToFiuR1+ntDuzRCwCqFK2c+HnMojpGWCl+q0R6Xp7UghXguDSb6YI2Kb2uqksIVpljMS2cFSpp22lSlerkHVfXGQpqs8XxPLJq/PLYH+pypY2StGokA9kgqKS1bFiDU0TKSs2rgAya2uKpF2mzNEog6vyHtEEcC3Im9lhxnYan27/ReBxBPVTHZNqd7oH2o432DwjvLMaSjl8iRlmZNiB4QcGjRStfjmoPCMJy40QoYH4RcPwvQnlEQDD8Mc+PCtM4TwAcAR7y4A8MB4z0DJo68C9DY+dZVDrYVqPtg0XPwwW1gZb5/2ug3cU6wpM5M1nTkLZA6G7Z48rxzucDS0GbzB4i6NmQGdG7FwTu4Jx3PQ4sT2uNnvsvcV116K56uFBuPXQBnvX4HxocT40GJ3Fvm/gRgvvCOxMUN8ONL3rhdkcCXSzgb9lcbZtgdaj3Y7wrQeY4PY22jAbwHCwmx4lOI8UZDeNB1OwfJY8w7QJY4aF0PUIRHIsbiJ9pU0ADQQzEuwukL3kERXA4ftHbjpeK5lTDl5dHhS/rFXBNJWZyF4iSLqCZPEspDPnhHAgcqN1s1dEcvkoDQ606+e2txehdNLQ3/VSyZsqqyhX5V3lKschvCeCxbJJ75fJFSB/F2qL+HCpnH6vplEQaFL4gA2utpeuLoJZUPXOypIFUxWl7EHymz144Ow9muoonUCK82Zl6+9rKqPyLSzbc2iclORj5dtK5YInqVtsmZeuXds8Sz8sfb/Vz+ndrxc7KeXujHhmn+yptZJZPx8EO33XU38uk8oA5guTyntx6Hte7qvZZQs8TwsUlshjOaecGwG5s0giOtWctDb3xLTwguOCQLI2vMos4sIprhO5el6tHXWUCwhQ8KSxL5lZORwUBK04gpTz8dpCzxpRHMsgojA3yZo8vVeyeVwsi5om/T3Beh7ODIzForUVK1asWLFixYrPcDy3uYmffvjn8DnPvRGvOnvw5W4OTvdn+D3f8Z/gFz7+wZe7KStWrFix4i7HXU34chlQgSJE0kHFCny9XUOsn0vFbRncdMV+YApA1UhlooV8tUW75dzgeToLUM1UkcyhXK341W1eCo7OCKzILEjADEUwS6OmbJmV71WfF4TeoXaU20tr7BRoLPpY7tkhxWgtqLl0zu2ombQl5kXKrQULx0ujDKAulVe795XALHBALaKOyfrudtReh47TNtTl8Qt9RLRQd8xtnNSNHIO7QlZfREhchMsof5YUPZW8kdmChDuAkHaJAOZgHzxrb9yXUksSZYSfEIWclPf6WZFzIrHBCApVy8Bg4vmUFLG+5WD/LApZhLIRyU0hh8tLZqZIuNJEcDKA3iQm0o0W5/sO227AMFrcON+ia0Z0jcOVro9NJtwaNmiMR0OB5B29wdYOaRuiGtgQY/AOjXUYncXoDPb7Nlgvm6leRlTwsp8WDXG4JrGkZk/A3kz3o/NA46HtncEI90eO51gOaaKXMlI3856O/WjGSPCmfLwT2SvnMQAYzByBS6UtxfrzjfrGQI0bzFXiGWOcn5tIZnW+Plasn82AqF6/w3diSfoCdYIpO6eibrzN/KM1a+aZ6vciXELle5EF9G1h6b1XEq2Hzilz28p7dansUuFaK7PW/1q9WsvjWlPAXtaB5ACqStvLHnvRcYf6SKAtoC/CnXzHDpVxmYVcJbT99yUxm28sPGe1ecmh8wIxqjaU8+d0XSXZr0hWlm8UhzQo5eLLpe8/0ZRiZWpsfW5ZQ81KunQaKVS+UztVvwjhXJ0TmnkbV6xYsWLFihUrVoCJMdgRz26fAwF48Py+l0zpO7oR/+yn/wWePX0+bdv1O3zkkx/FjbObL0kbVqxYsWLFpy/uasIXANgakChpJfKsgyA6X+9SEIYolON5TqDKufpnCSCJsjfZwSpCWOpjrlu/6vxeSnmbajoQMGJmkFIa5G0zkQSagnhEFFS9wDy4Fy4k5gzlpMLNcgYqlTCXdnE6OOgckrJWlL0SwPWMFMk1FmA3BYxTXtvYh0IW64BwLZBFJpQjitrMwpfD/Sn7R/pFK7dLFW+tnnSOR5ICS8DcRoWyd/NAai2IqlW6el9Ua5BFVIkUQfWa2laXo38XclEF0EnGqzonkUNaXSsKJVlkUJK+ZV1yjuqnmd1iVPZWy1QqlaQAthaAAwaX54tM1p4FIV1eT7lP13EoGHtRoFcHX72v2EmXiwxsXWF1AembFDzJqQDJKjflfCUKakoAkhrVW0ykXCIRA+kabO8Rc/4SPIdsst5HIpEBtuEYNjyRefHVajYOvLOgPQVFsAVo6+AdhRy5kv+WA9FLY9juY15f73TAGnDOgPuwzWwcPAdVMPVh3PLGwe0sznsDusYYBovh+Q3QMKjx6O+7FY0WDBwTmAmN8TDGwxrGSdejMy7ZO7c23IcNCHbjwUwY2eCx567BOQOiEcwU2mZDPmG2JtwmIWY9wQ8mkNQjwd6y8d4w3JXwR6Npw731o0mvHHYU1LvjRCoH2+iC7G09JH8wufDsmhGw5yFXL8WhlBEcZioC41Q8KeI15f7VRCxhKo+mc2QsTINxOj2pfmk6jy1gpV4px3Oyfg7tpazdluNipRdCXmWk76SY1PlW44ZJ7QZMOVgFhqokk35/JcTnOqkRFWlUU/5mkHMvIIhn39VYD3mfVIxVhWWlrqQsFacD1S6KDhx8KIc9kK6VXeW6Zq4XCqJSFAVm0YakgK1AVK1kFLGoFa0yZyhIU5b5hLbzLZwr0vgQdfdFeXJLzNTJnOYrVctofWr5LSsXblk73ybXoMluOa7EUtsvadWcyFNpg8zJLpNKYokw5jhnMgaIjjyz501ds7jSZPtU+YvfbxnrovQl9azpZ1TKUNtIz4/tVI92DZmdX0NS81eIXNkv84qibQJqKn+WyXmqbFbbZFzxMNaJXW03sWLFihUrVqxYsSLDYydP4snts7hnfw1GYhZZGPHFmUfp+W8/9vjLf/+v4j2Pvv9FKXvFihUrVqzQeEFLvv/6X//rICJ88zd/c9q22+3wjd/4jbj//vtx5coVfPVXfzWeeOKJ7LxHH30U73znO3F8fIyHHnoIf/bP/lmM44g7AguRQVPe3qYg/wAky1bvVb5fpP8T2ev8RLKlQCGH7aPLCWSBMfmx3qfAVlp5X1u17xRZaW0I9AhxKftiGdrumZpmRmAnhXAKAJlE4M3UETowl6lUYxDRuSmop45n71MQrVommYkQl8DgOIZ2JSJX9bu28JMgX6nolcCuHKNt/fR2z5EcU0SaDpx7npTWJco6tMXlUqBU+gmIY2Oc+u0QSa3rKxVSJlryKRtmvW/2eyJGkfeDnOvcNA5rKl9tB2jUmKsFkqUvrJ0T1uV1FW2cgq6c2zZKuZFA0cdlVsxSPHMgJ1T7ZFsiLZTNYyJ5fG4NLfascg4RRatSFaT1fqpbvTuoWFggz0Np6ar7OOuf7NqX/3AoSR9yxc8Sn24IrOx4NVFHHMndkRNjxzb8800kdD0CkeiFvJPtkfi1HKyWPYX1K5bBXSB7QTwRuyMBrYfZOLRHA9B58MbDXx9AGx+tihnGehjVSGo9qOEwvFofjm04qocBGAYRsN91GPdNaGQkT2+dbfHcjWM898wJzk632J13eO7pK3j22St47uYRnrp1gidPT/D8fosb+y1u9RuMLMHy0GGGGNeOd7h2ssPxtkfTuMRmkmGYzoGa2MaNA20cTOtTW/3GAwx0zxlsH2+weXSD7heP0H3oCN0nOrQf26D5+Ab2iQ3sMy3sLQNzbkE7A9obUE+g3sCeGdibFs3TLdqnG7TPWHRPWWyesWifN9M9sghW3A1C/2jiVRYCGLVNHjc91OK4IDdtNy78yxdMxG1jGENGxiDniwOk/NSGYhyG+jjmhJbjKYzhcVx+Tx5CuYArkm1CFHL5fQByq1xgst3HnHiVb5wmePT7aXqHuOwcsjlZNftO+vi+4nxRTFl3Kkfap9+Hcj2zOc68LvmZrM3Jxlr7pIzkRDAdc1C5LO/48v3v1fua/dT/8VtC6lvOes4R95VE7Wy+UrFxJrnWA0pZva9qJ35Rbna5TvbTN79U6F6GYF2qu7Rxlnuu+1b3V9k/Zf7hpbaY/PkBiu+OTksh/S3zm5qq2qv0EHp/nJewc2lczxYZyFymsAwP49ak+UH5XGZjU8039HGZNbr61stzqJHmJ2ox11T+1IbqQrBhyOYKafFobf4fCk7llsivS5HDC0jH6zaWjkUrVlwCr4i/61esWLFixYqXAc44vO++X8LPPfAB/NwDH8Bf/Od/FV/33//neE4pcF8ofvETH8Lv+6tfi9/9HX8Qv/+7vg4fefKjL1rZK1asWLFihcYdK3x/5md+Bn/7b/9tfP7nf362/U/9qT+Fd7/73fj+7/9+XL9+Hd/0Td+Er/qqr8KP/diPAQCcc3jnO9+JRx55BD/+4z+Oxx57DF/3dV+Htm3x1/7aX7vjC2FDIOfBmlAqrdXi7+QrgRAdHEmWxJRvK3FIzSNlGMJku0mZIgiIJGqpTq3lBC23lb9XAjwHLXvL67jIzk8CiVp9sEQMIg/6ZkRudhxygvaFrpwT1a4meV8oZorNiDJnX7k/a9OSGqQSmC2J2RpRe0FQOcs1CeR5c5fKxVy9kuV0lnNeDCwp02rbC3WutPPSY7sG/dwoEuQFlXlZXJbcUoH7TKlJkWyLP4vSN5FwqR5kRBvbydKZDaelPiHvL+IiGJ6IY1HsimzTA34Mx7AFSCygpdJ4WFgT4EE2KDybTVAAS17bEmTCyUQchP/E0Vo57ottSqpaqctTyME7ErCz8CaQxtgb8EgYAYAJYxPurzWM0XhsmxEwE+lswNg2IzwTfFQJe21VSgxvQt1kwu8EwDQM9gTfMbhnmJGAGNu0e8BbwLfT8+I3od/ZErzu79hOM04kLIniOubjTfl3hcAVIh4TUS9jIxaXxoYQsaWtc3YP9Pji6XdiIOTojQr9ShmZylzqXKhL2jEpkHlynngxsGTRjAoRd5l32dL3vVAEp3dk/CbnysDK+18Uj7V2LpUD1JV7h1S+5XFAlq/4IhI3tf/QPGcJl1GElseWuOy5JbmYUHFWYD33uv13/cFcv9U2HCxssY7baND0v74+fb8PPBezlAeFAvxF/R5G9SwRBQcaVd/t1rW0UOK2EBXMkh/7ts8vjs/mTwsLSC4zx632Q+1vgumEmfr3RZurrfiMwivt7/oVK1asWLHipQQT49ntRO5+4MYH8aEnPoSbdIqt3QIAnnn6Wex2uzuu432Pvh/v/jc/hNGti6JWrFixYsWnFndE+N66dQtf+7Vfi3e96134zu/8zrT9+eefx3d/93fjH/yDf4Av+7IvAwB8z/d8D972trfhJ3/yJ/EbfsNvwA/90A/hfe97H37kR34EDz/8ML7wC78Q3/Ed34Fv/dZvxbd/+7ej67pZffv9Hvv9Pv1+48YNAAB5D4JPQZRE9grxmdSiBaHYD0gKU22rRhSJEMqPZ57sm0UBIfEz5mAvW7Nyk31i4aYDM1ZZvZYBHqJcuSnnyXHOJfKYSgJZBa4yFYUE9rwDdV1QOIxjCvZRJLgZIQgmuVFLsBN1i+rTUf0sKlBZ2S0Esc7tW7MyBCYFrq43KZcj+yD7agGtcp8RBdGklM76umL/mF9s7ItkCxyP05aaQNzu8vOkH7QSWJMNsl3bJaY2OrDzczUs4v31iJbPBWGMsJ2EKPQxeKj7SqtvLIC+BxsTyKaS2CWTrMOznH3KTnxSxHDW/4SiToEcF8c/85gHWjUxE4n0iVDJ77lcn+xj59PPhDieo8Wh2FmHNtvMDhFAUJilYKmyTJTf4/MXnpkiuFpVA6m2ytAold8XBbj1whQKal4QpucNSHnMg7sBwYjjATSfSOlcGgE0FEhfRSLDTDm84RAsnwGwBdAwMBLMkx38NqpvRwIawLYeTob/SHCw2PtQuWk9mtbBW4KzDDdYjNHu2bQexjqYmN+XTLSzNwQcj6ld1nqAGMNz26m9MeetMR5sTMwbG5nGmEOYB4NhbzEQo982sI1D1zkMrcG2HXHv9jzrams8XnV0A3vfoPcWz+6PMXoDZsLNfYd+bOC9EMKEpgnW0X03Yr/p0I9dIEc9MJwAZiSYPihkp5y4SkltAumriVgmgNv4s4nkLgNmQFL2puMiOS7Eu1gxp7KiI7y0SZOwbBTJy4gq8ImQNYM+biL05RwfFeVadZ5UxUZIec5/tsEqVrcxuVzcCdJzlr8HZ2TcUt7eCxwU0ntTnBBMeD9SG28CUfjGxfeZ2MLWyJrMwtkAwGTHy8hJLwDT+6RY+JPUxFqVXJKxxXt45jJwKGex/h6WtsAUlIPp+6/L8yGFRNXOWH83y++AKiez4Nb1Lv1e26cJTz0WxEWCKNhSx3PI0FwJXqpmtdJZvnvOTarbcqFcVPtqa+ns2jTBWs1f7JbH8FL/1PpaPVeBQHa5LbTc4/J766afefT5NQKo5u3N+qiYc+q+EWWvUq7r5yc7NrV9XJjrRZV7Jb/tIjFaHlMs9ioXVJA+Vv6XY/RcMpZDte95tI7mJZtlmdfr9ui5ftmupTmDzK2lLleQy8x3/q5d8RmBl/rvemD5b/sVK1asWLHilYCv/5N/FH50+NDRR/Fh+hgA4Lv+5n+Dn/r//cwdlzl6t5K9K1asWLHiJcElpQg5vvEbvxHvfOc78eVf/uXZ9p/92Z/FMAzZ9s/93M/F61//evzET/wEAOAnfuIn8Hmf93l4+OGH0zFf+ZVfiRs3buC9731vtb7v+q7vwvXr19O/173uddNOopDbUpO3cXv6v7R/TLZzNJHDWh1bBkk1tO1sGZRZslGrBXv+/+z9e9BtW3YXhv3GnGvv7zvn9L3dboHUVCCkwiNCCMpAbNS2A3FUBsf4UY5SeTgRj5ITF0VhqlRgioQ4LgyEwlQUCKIc27hSkBgCxLiA4MKyYgIGEygUC4mHBBLQrUd369Xd955zvr3XmnPkjzHHXGOONdfe+zv33r733J6/qu+c/a291nytx1zf+M3fb5TtG1WBP74EarpKKLWN0/26dTiizFk/7x6jZKW3UWz+77U9t2PXWCXTGmjsBXQDtTbPtl++H702A9u6GxvEvN+nHqzi1gfAe/V7q8NL9pO2zU17DQHfKfuiCsUHhgN1SeMmqK3XYFel7ggMN561LT4orP29UanUVbQYpVJDKjvYtr+j3Cq9e/SW+8u0o2vnbC1m684790+vXLOYpJJvmRuVJCBEmyUJ7U/dhwBVCFPJDVsVokroZdknH3nN45tJiEUlEFMhKpmQVLmrXWGAUwDPAfkUMc8RnAkxZtmeCBSzPIJS3IpBSceLkE8RIMbh4JLKFoLabqMpC3kcUElf/T6fopDNS8DL0xFvPdzh+XzEy+WAU5pEXUyMU56QmRCI8Ww6443jCR+7e4mPP32Jjz55wJtPH/CRJyfcHRccpwWHmHA8LojHjHxg8CRkaD4A6Z6xPGUsT4HlKZCO8l06GMLUnCMOaGbjei7D+lmI4tLvtvsXLiDzA3NMOT4kOadMQD4C81Pg4Svk5/Rx4PQxwvwRQj6IQpyK7XO1ftaydeqM2tZSoS5QAQzRXY7NvG+z/4pQW+ddlaQ+q/zikb170ezbLBLxNrEXju9Zy16az66Rxpv2eXiHiFuO0e29eYrcAhi3ff1153hgfS+49G61B51P/Dzqt/ccM/SzdYnwRLPry96107Vr3nk32LWW7r2fWEtm3zf/+RJ23lEaK23ffqAlfXfGbtO+V0Fu75nN52vXrd1f07PUd/bcztcO1X79wj4Xv9sW+Lj9imK/C/37oZf2RYlt+zeG76v9+2Yvd7D9bmCggy/13/XAlb/tBwYGBgYG3mfc39/h6UeeIseMFBIWWvBz/7GvwX//X/gl9eeX/gu/BMc37/CFF1+86ef5w/P3pzNf/d8C/pf/nPz88//UNuY6MDAwMPChw6MVvn/0j/5RfMd3fAf+2l/brmz6zGc+g+PxiI997GPN9q/6qq/CZz7zmbqP/aNQv9fvevgtv+W34Ju/+Zvr71/84hfrH4YcXCBE1a3BBqXX4DOAVdnbrLA3agdr4+yVBzZoU/PvhnX/c5FH2bxbPSLYfudhlQQpVdWEqoyaNkJ/5W3guahatH4OALLY162qWZQAYdgEsZlTS2rb/LnddhfCxVo6c2GRKICmSepOaVUkUECV3WgdvbxPHZu8uj3AnOOEqsrtqXnt7zZHHSDnsZ5vR2Ja22YbCO0FJq2S06uArGoYsc2ZWxQ+9bO3H22uURPctqS0dQrV72wdta6iAjbnlXkp21R9y1Ux0ih2FbowgAhY9oKovD3GEghZr+2iwvUq2DoGkqeX1DdYx6nJS6kKrH5w1efys6obqwA2B6zPiKYPjrCNsV1E4YL6XQKhBt1z/7pWsn3JNTe5mBnwqtxmEuIOLLl8CY26V+ycsZKDBFHsZlHwUi7k47EQygkAE/jA4LsstzETaCYgq0KTik0oQAuBT1H4PlUMZxJ351MEuJyRJwl3xzPO6QhkQrhLSEtATqL0FSI5gIJRXC8B9DICTwnHKeGFEtmAELpTO2YxZhyOC5aHSfZT0jcTcArIDCyFEzrHCYeYEAMjhoyP3j0gEOOL8z2OYcEUMp5OZ0wh4S4kvJkjznnCw3LAOUe8fb4T+2eIVfT5sOB8PIKUQLeXZCE8w5nqeai2zXPhYVmOUeWtEPNciXhEqmRwJUsL4V73120o59kQvVUprMJpXknbqrglYHlSiOqPLVCiP74dEE+EkMR2OiyGnK4kNNXFCNp3tW6mDITEQhgHYbk5FXvxd6LwreOb+58prIrTa2RZz4FAi9H3CavgN7nB5fhQ7/1GzevfHWy5MZZn67aO2gZ9ru+QXxvraK1D5wKv9DVtqMdaVa8noTNvyU2gJVeb+TO2+7nPNQ+xV5Vegk9zoCpW60DSW0zj+wFsVK9kF7Y5bKybfY5es23TXu8a4q9RnW9nMx8FcwwVm+FLatneNd1T/XYWgVXcQrDad5ZXRef68/VWm2e/z479uU/xUNsK9Be5FVcWVdTbd2V/35F9//bwiuLeIlOtT/fz7h92X33HiHFtj+kXYX0+6LsaJ/de3ssnrHUrMUw6IQwMbPF+/F0PXP7bfmBgYGBg4IMGIsKv+Ib/YbONmfFDn/5h/Ohnf7T+/oEB1X+AT/484H/7TfL5e/4B8J//NSCddg4cGBgYGPgw4FGE76c//Wn8ht/wG/Bt3/ZtuL+/f6/atMHd3R3u7u52v6elED2FsCMfwLMKXg2QeALWq2A3nw0JbFfTMwNLWklkb79mid0YgEQrOWRJVKtUcC8KNPXz/elxGrhtCGGYoO6OXd7a79h/OfEB3D1rSEIJZJrguiVxId+zJQXN9kr8ekWJDw4q6auWylHHkld1nC3DBv4K2b32Dds++TFo2hFxm6QOa5A1sxCrntPQAKgPmtv6bDC8ySnaUTJZktgHl7Vur8CtAeRlDWbHtjxLBne7mQoZaQO6wDq2PrBf+7hTvo5Xow5Oa1C4LqzYIXm0e82ih6Jg7gS3K3GaMwjG5tlaNVoVTdP5C9dNtQ8tCx0skekXHlz5o4APEUyEsORiyyw5yElZPoLkUU16ezCY17YKQUgtKRgKuWgUvmoNnD46r/dSCqClBKGPWUjgcxAiOGCjshX2j4X0jfIdHbLYKU8JL1jqj1MCMyElAi9BrIkDwPMEMOHwZMZCAL+IyExYchALaQZwzEBkUGDpbybQWfLu5hyAQk6LVTEVEpKBREinKO0nxhfwFDFmxJjx9sMdDjHhE2+8hWMAAhhTSIjEOISEzASEBWFiPAXwU558EYEYgTIyB3zho/f4zEffxI+9/RTn0wH5LM8KCiy5i1NRQrMSvQRaGIe3g5x+Rv1bLEeu6mkqc44lUWucv3fZmHNMRakt+ZaxTl8l7l9VtwHIB2B5ykj3QL7LMsYsxH6+Z1EsH4HpBeHwNnD8AgtRHOTaU1JZraGFTGbkCASQPOIL8ZsOBFIb75SRl+XqPbALb1la5pGLOVYteWWeu5VsAprnsM/t2RClqvw1ROKGREKHgNohiJUERmzr2DgHmLbtzpU7bW0sdC1R60liOz63wBNzWo5JZ1Cfg16lawnSHqlsn5lmLuR5ac+1J0H1OJ1jzDxM9t3GK2JtuoRL+YXt975PtZHueDO3aT11QVD5TCGv1tNahksLwNb6+aJNdxlHbUdy+/dUwZ4c7i0862HverlyDe1ex0ruA+t86hbPUUkZYlNXNLl0FWa/3UUZeq/1VLZ20VcI67uBPnf03cGlhahWzaGzSM3uk5I8SzvkLZd9a7qKMG0XpxU0C9mSeQcPAetqoYGBFe/X3/XA9b/tBwYGBgYGXgf8q//6r8b/9Fd/AwDgL3zbf4k//cf/7PvcooLf+I3Az/9Z8vmn/KR1+0/9KuA/+K3Af/LngT/x7e9L0wYGBgYG3ns8ivD963/9r+Nzn/scfuEv/IV1W0oJf+Ev/AX8/t//+/Hn/tyfw/l8xuc///lmNfBnP/tZfOITnwAAfOITn8Bf/at/tSn3s5/9bP3ulaCkZhAypCFae6vq7XF2uw+O7qlKe/XbOq4dYxW/12xdX8GmtglqXQgIr1XQJni0sZ+8Fvi9Ra3jx9vCB/oUNSjtz52yTm4/r6q9hl7A1n+ngezHBMAvIbdBRqn7RqVbj+y8oALbfNfr5w3XSINKlOQ+IWwD+K6+5trcUxtdu44srrT9qs3zNQtHG+y1n/3zpWuhSOviBOBx/aplaDvRqjkLag5fZnDNEevu5YBW3KOPN0MgKulIEwuRm2klIwEgMOJdEgfeREBkNHbB1JYDJXwjIwQGVQ9qUeMui3SGMwpRJ5bPjeA5AGBCSgGUSfpV1tWgkL11P+LSXqpEL1L5/lDamkjIahLylycCT4TzecI8Jbx8Igl0l5BwP82YKONJFMeGXILlU0h4Emc8iWcEYmQm3IUFU2FQ3z4c8eJB8tWFwFgWIaI5ETiXn1MELYT8wGKP3bn1xbXZniiqH/dgLbvXje3/xQ0alt/kKKQvH3jl7Mq55yjEep4Yiww0Dm+jtpmY1/Pgym2Uxvq1vRbVZvWd4NK8o9/p8+hV7r9b8Jjn545yUNV8qyqvQ1r5Oi/ZOV9qS0/Zaea2zfvAxed0vD6u1xTWl8jTK1Cy9CLJf2M7qqrXqojfa+zN/abujdr4ynbALDwAX772XT3SJL/oyuEa8XsDLqkfmuuvt+DBvwua43bLLvfVVWv0W3IBaxv1F6Pgrerg3t8BPULYfufepUjL2Hlfrot2PkhKkoHXDh/Yv+sHBgYGBgZeAxARfuZX/4z6+/d9z99/H1tT8OYz4Cs/DvyinwP8d79m+/2zJ8DX/Tzg7/8Q8P/7HuAHPguc5i99OwcGBgYG3lM8ivD9+q//enzXd31Xs+3X/Jpfg6/+6q/Gb/7Nvxk/7af9NBwOB3z7t387vuEbZJXT93zP9+BTn/oUPvnJTwIAPvnJT+J3/I7fgc997nP4yq/8SgDAt33bt+HNN9/E13xNZ0K6BKfEJWuB563X7P5W8auwqt8agORt0GZS+1YXiMkaITf72xX9zMCcqtKgyQVoV/znYl2rVrllH065Kn05Z5Dm+9Igls1n6e0apRFiE7gXyLXoqF4ae2DtU2YgJyCogiYLYUBh3SYN1oaZbW5cRa5XFCiW/C3/L8vaBh0vawdtiYOINuBWbQl5a+Ns2+iDvFZlqn1u+mOCotZm+FDOMTE2QWyrtomGSPa2hbYdxpa5q+ro2BFXVZk5x2IRKdcLL+310tiH2n6WcsleDiUoToirpfl53tQjyGv5gVZraKP65ZREwRLNePZsP68R5FVx1w/sdnMBK8FSAqjs1TwWakHr8uT1VICNoqeM5W5e0Q44MyglyeELCDmpj4NILfFLhRwsBJs+CsIiVs95IqQDCak3AWBI7lZGzeXLhFWVS7wSc6EQyLGQtqrOnBgUJW/ukghYCJQIPImqlzOBAuPuXq6Lh/OhELMZxynh9HAUNS6kDkyQMuaAebkHAoOeLQAxljnWfMJkVMVpCQgTI3zFA+IkeYEpFWL4IKQ1AMQ3ZuQ5gE9B1KsAcA7ISsC+nJAi4zME2cbAT/7Y23jjeMJdWPA8HXFOck+EHJE5YOaAA2U8T0LuPokzPvHsi3i4PyC/KarkU5qQckBiwsM8gZnATHj+8ojlNGE5HzG9AKaXJNbaAaLcLlNJ5acSVVKdFvmcJ1UCm0d/KHwrYbWV1u/02khAPJfzj3UBAU8sVt6RgVMU6+6Fiopbro38NON8JNx9PoCyWE6HBaDF5OktluFyEFc1eZ4gtuMByJHAkV5pMZP0xR1HoV3QoNsCAancSzov9Z7v5tl3zQq+QccmeW2iee5aBWN5VlgVYv2+DCKbuc7Xrc+wai3t1ZpmsU21BHaqSK/YrG0tyuJ6nDo/0PqaWEWC+mizts9GzbuZS+wx3uGidi70f++0Wd5nsM4f3vrZPnv9ee7l+oUhOnv1e9xCBuv1lyQH+Yac7dRFYTtP7Cl563ZnIc266NG2A7G7sM8qfsk7c1ywfG4smK16uLcAzJXnHTjU2lzecUIjRO0uRqxK39hc417Z27wPWbK15P6lKOkI6u91kaT53aRmqdtyBp/P63fqiFJV4ztK30tQFbD5vaZA0X6X97BmkYxNS6EKYN2ntIOqDfSXYAHDwGuHD9zf9QMDAwMDAwPvDP/MLwb+rf81cDxe3u9//PXAr/ingG/83wF/8/u/NG0bGBgYGPiS4VGE7xtvvIGv/dqvbbY9e/YMX/EVX1G3f9M3fRO++Zu/GR//+Mfx5ptv4tf/+l+PT37yk/i6r/s6AMAv+2W/DF/zNV+Db/zGb8Tv/t2/G5/5zGfwW3/rb8Wv+3W/7tWtnfxq+t7qepIcgmSDYdQJOvdISU/UZN7ua/dX+FX8vfoqeUk1KEQ2J7BROmzqskEk1+4akNNg3oXg+iZXnBKQe/22n4NR+Ozlt2Oz71rAvnqBO/VYC8ZAK0Fs271XBlACwr39naWwDfL6QGvP0trn0t3bbw/WrlH37+ULLu2nXszOBlJ7RKkWbZS1lXj1SjG1VXbHrQHQnfNlt6dOYHdDdl5R9mm7dCya+nIb3O0o0Hbb64PYiUvQWe/1jJtUPj2CFxJYrkqfTuC+BvOvKQ45w9pLM5V8rSi5XVXZmwshR1TVlEri5UIMV3tfAjgwaCmqUkMM8oGRj4xQcuPmk426A2BCVsWs8gxM621GWBW4MQMkhG8Iej6AeCfER2ZCnBLyE9lH9svIkZGT9JMi43i3IEYZo/l+EtVxlry/rbM5r+TtXQICEA4J+RSxqogZmBg05bKNpLxl7ecyR+SixP2Jt5/i5fEAZsIpTVhywLPDGYco122gjBwSXqZDtZ1+Pt/hnCOeHc5iWZ0Dziki5VB/z2xOUEDJ7wtZK+QeFazrRpb2vIKAQFRV3/VY830lYHuPfUIllfN9qUfPn9ZdbLaVNK/PHWIsT6SQw9u8ruuo15eUa6vlsC5QoAzJ96s7vBuOCXvoqT/tc9oSpu45oc+PXecLt2jIk0x7Nsw3gVoSx9oyt3lAO23vuVv0FjeZxUrNdXdh7mqIa1vXpXPo97+U99bnvr1W3iXsOVn0ctraZ3Jvv1vV4b5sU+5F62k9tpK+tFXv9tqr2+0iMrjrXdthrx17Pdq2+Hl0xy1l8y65cw9t0LNcNtbmvJM+ot4DPdJZm3/J5QTYvItbchdwZK0/pndP2+9sPl/vWGAXmVoS+BoBnPNqzWzAthzNz1vKlEUg9v0mtJ+HpfNABx/Yv+sHBgYGBgYGHoePPAH+R/8D4B//ucCTG9I0HCZ5f/6Grwd+1n8T+FP/n/f2b/OBgYGBgS8pHkX43oJv+ZZvQQgB3/AN34DT6YRf/st/Of7AH/gD9fsYI/7Mn/kz+LW/9tfik5/8JJ49e4Zf9at+FX7bb/ttj66LbQCmR9wa22TeCQZxUc1qHmDZ6AJjPSti5jVHrFdU2PrtccEEz2yQSOHtYo3SgHasIGsdPt+oCZCREs09pZIPbhqlEwesgTSvyLHBwMX105O9Oo6TI0TJBBxzcmOxM542V6BVMffy9yksudsES2ntQyqSR08E20CiDwzbbV4dZFW8RKJ+bvqzXjuckgQclWzvcaFqM2nVxlaBq+RmkxPXBaotGVw/6zW+7lcVstXe0gWIfc7g3AbFV8VYqxQGlDRwQVY9xit37TG6j78uXJD6or1hh3jp5vMr26uSxts617o7Czq0rGSC8M31aUgmq1DfgxK+5V5Uy9FKoClxW57kHKg+8/IEs8BFnoEcGeEsx+WjEL5MQL5j8J3k200pVDtkppWcy7MuTilVqM2y7kMEBLFxpgAQMWKQHIQ5BxzvVhX44ZAQY8ZhKvnXAQAzCMCSAmLMeOP+hFxUsedzRJoj8imCIosttObKJUZaIpgJ8emCEDKmKeOBS47gTEKSHhMoigUxz0EqXajeA2kOQgAnwst0j9PxIArdXNTAHwGOWdo7lUURLxZR/57ShOfnI1Im3MUFCwvZe5onJJblFSkHpFRyDTOJapkD4hnruBrStjpWG8K3idkzGvvmXB41XI5hgszwhpSvP+XYPAE52mciy4FBFheERa1DZT7gAMwfYXAgHL+wlqNt01y+tj5LOkt+37LQ4N2wdN6D3nOO0OravppnvFfUNbAEb1yViF1yN27L21t0Vefaa0RQjzj2c5Pto87fvfnRbrPnwBN89hncOVfNe8KlOdiW35tHL8G0qebttaS4VzD7fvTGwLwbMcr36lqyR0r34HL9ag7e9lDqH1/m1kape+mY+u7Yf0e4ZPHcJUT3AjplDFQZvzdH+nY199YeAWvq9EreXj31/bdZdLbeJ5r3WtXGm+9779fud1X72m31nVl2MH017+36LuOI6rrgK0ZR1y7LupDMl3nJ5SCVd+KSv3cz9vZ5YR2DOn8XEZlFfgMDj8SX8u/6gYGBgYGBL1sE+/6J6wsEPd78CPCv/8+Aj71x+zExAr/yVwDf+b3An/mLEpMdGBgYGPhQ4B0Tvn/+z//55vf7+3t867d+K771W79195if/tN/Ov7sn32XktmHIBOTJXZDAM3Lug+zWKPaIIuSSEr0LqkQZiYKFTWog5X4WkoQRsmnSwSTUVQChfTzxB+wDaT21LtqC43CvzBvrJ19WzRIZG3vKARwUR/SJIQJJ+wrbLzKpKdiUZWvDTbZtsQSeF+WtT8aFKw2gi4XYCUkfYCsVV1s7JB7BO2eUjlACDe256mzX88Ssqdq8blrK9Hpgsj2WC7WyLbNqkbWMvx7lyVuI0A9m9Jr6lFfpiMzkE3Q1iqCU9pYGHdVuDugci03Ofr0/KXUDRL31MiVVPIq2h1Vb0OKl3HV+2JDxGQhKbt2jF4BbFHGRvvVEO7+fNyQ77rm9UQhyYqtc1gksF/teANENcm0KnyIxfo5FqKOZB8qBF7l+QOLne/EwJQxvzyAFwKdgmyLXO8PilkI0UxACuBJVPB0yGLRuwTQIWOaErgcc54nxJhFwZtjJYFjIUWmmBEKaXteIpYU8ez+jBgyjjEhECMQ49lPOiMzYU4RTw4zAhg/+uIpXp6OOL0UJS4RYzqKnfT5dAAF6RM/RCCIXbEQ4IUV1aG6kwHhTKIAPgA8B+Q54MWLO1DI5XFPOKeIt09vYH4S8exwwhdP95hzwHmZsCRR8P7Yi2dlqog4zxNSIiznScauWDIjy3/LU8aLrwLynZwLyqK+pgWIJ/kc5rWt6QmQjsD80QxkquptykB8WX4vRK5eN9UiOq/l5EP5/yiLBZiAkqJXbKMTQIkQT1T251pevmOkUgfpY1/J51KHtRYHyUIEJYR5AcJc5tJX/aNyTyUJYF0Q5OazzKsN7WZxTIdM7T3TDDFcCa5iMUsx1vm9lzqh7ueeN1sip/1enpkdG2jzvSXPmsUmQDPfEE0rIddLN+D7zbney5sFTZzX9SrXSNJLeZb9Z992u0DHEqF2UZUnkXsksLHV15zibOdma0ndw954Nd3pELVWgatzT2aZ9wxRXI/fa0MzR8e1XLOYqJK+ql63C/NK/6xldNNe9x5K9rpVBNpYfstCtDIPXVO2d5TxnAph64hjxdbW2M3Hpg5dmEBRLKzru/S1gNk8y7zuVcabRR9l/t+kbOC6QHMDJaG1XzuWzE1Z+s5f2t6ofe3is14u4CspJwYGruF9/7t+YGBgYGDgyxG/6p8H/rl/Uj7/198L/I7/8P1tz8DAwMDAa413XeH7JYcNsBQlG4D+yvm9VfXVOtltr/u5OpQ46pG3PXh17d7nPVyymHW2c00gWPMS+/1LztJ1G9WgXU/pdBOZZ9WKe8rFnurDKxL0971x6alGevsToTlvPVjid7ONNsHJtexOkO4xtpS+rl65XkVs1T177bGB5WsWh69iM+oVvL4sC1X/2t87FqgX22eD3xsS4EaSWVW/HSWOogmI3mK32K2nc4wnfV8FVvVEuO26NqhcTSH8KtFLWG2ASXagwIWULArfyJtHIgyph2KLrM3kKQvJipVQyVkILnkUiVp3TnElXJgwxYy7aYHHnNbzdTctCMS4mxYcghDBTw6LkKrhUO//nMQ+OadiF028jpYSvSh9ZtlGUSyic1HS1mNKe7m0N+UAJsaSAs45IqYDnp+P8vsS66k6LdKvZYlIiyh6hSgvdU4MTFJHOjDyPYGPeSXXE4EWQnoZEGaUVARy/tJRCNd8KPkclfBdCCEKYbx7eTAaRbAQsbySvYHlp/SdLJ+h1woK0Rt1oYFZfKHXhxava13s452wvabeARqb9B72nsfXno8W+uzaUwjXMnN3zvCWtPs5gbfPCfts6qr8rqFn8Xxp31dFz/Z4Z+y7StRL+XIVPRXxpfo618XmerHOFpcUsrfi0rtBqa/W/yrzgiedb9n3Et7JOffIXJXtF7H3XvWYe9Kga1Xt5vuN1fqlxVy9RYubthrS1eAdE6uv8O5x8ZlU8OjnxsDAwMDAwMDAwFUwGD9EwPPyR/aP/OQ3gZ/73361wn7+zwJ+wVdrwcDX/gzgBz8H/MRb705jL+HJvbT7B38E+NHPv/f1DQwMDAy853i9CV8iUegSgWMApQxKos7TIDnmRRSmuhre2jzHIIqvUlb93yuB1V7DBrOyISqnshLfE8BaTspNvU0dNsBjlQydQJRYw7EoMIlaGzpbZlF3MHITBKuB4zIOto6aN5hItqfUWvJWlQhqeQ10PKrCxih2mYG0rOMoySFXBXXK8rtiivK7H7POODW/N4pcT3SXMvQcxVDOS17Jbu1rZiBMhdjHqhLSvhdb4xpErGPngqc+CF7tPsvvtgwyZKTPHxjddv/Z1mfLzNrvrYJns0+M/TKNyhe5tKWnBCtBXLFHDLUt0t9O2bp/yuv4lTKbtsW4Kn8PU6vY6l2DRsFb+6lKl5QADqDo2m7GQ8rdUd1oX/R3qyAqx5EP2EbaquAa8vrC4gb9XuPPQa5HVm7UrFHRHL4c21y+xBDFaGbkieS2Um4lcrFjlTooiMoVKGRdIrmLojCFnEnIYG1+JnAqpG9gHD9yRk4B54cDjvczQmCcz8UynxjzHMGJ8DDf1duTpox4yPjYmy+wlHy3b7+8g+YHXhY5RtsXY8bd3YxDTPj405eYQsYUE07zAfMccf78ndyzU67jE58tclsvQfILlw7yKYJmQjwkTFPGTBPSOYp1dSjsKDHyWdrw4v6I47Tg7rBgThFzivjCW0+wnCP4ISI8WxCnhBAClnlCehnl/ATJHRwmUT+/+ewBx5gwhYxTijgvEfeHBceY8BX3z6uq+e35Ds/nI37krY/g9HBAOkfwWch4OoeGvOYDY47A4S1CfIBcJ+YaWK9jALmohgli6V0U3nQnltd5CYXsJeSDEMJ8MHPTxEJiTwFYeLWPNmRutXYu54CYwZDzmCMh3YXWTeMWeFcBAGye3bSzoGPz7PE5VoGuspe82wd2iBOv+o3ULhwJYeW4VQXYIbesE0dtRzBWtnCkryeQm3aHbnv52iI1rVsVoqqeDSQ21qXtXL6ngx03Q9r25sJK9Jl54YqqllMStXnvXUQX09h5LaVC2rprwRDfRLy5JrgzlwEylpzymnbBl7kW0P7f6dMlFW8dR53f9my4/Wej4t20z7YpATRNxTUitQsB6nuJSWOhKuSgZa/nftM/c042+8Bcs26MV/KVmn3tPNpVtZv5mdXJR99RSvtFuW0WctX3GHtPiwc+2ffulGob1G5+QxKvjZVjlmW7T4+ETakllIGLBK/YjZvPnf5v6rDlNn8PEPha+oiBgYGBgYGBgYFH4w/cLfiOkiIp/cv/BPAvft2rFWT/9vxHfzbwx34X8G/+u8Cf+PZ3oZVX8DN/KvBHfifwe/8I8H/5j9/7+gYGBgYG3nO83oQvM7gTNKbMxUKSim1x+Zx4s18NjKjCt1G2lu8yF7tLaifiam1nglk94rin6LXfd9QGXZ2Ar8MeYwNjO7nqpM1r0McG4mo+wvrlI4Lx2fbTkZWct2T5DvlXP9dg5gWStwdrZdiz5jQqq/rZKjAtuWnrtJbFRmnbEKq+DxfsQO3v5ON9e6qcXht6+xSQzS/t/Zt79fbaavtwSZXUJV53SNleO5yCmUAtMeEC0ReVvbZuYGshbfti0FPJNEFWfy32rJ13FHryQb4ThdkNajZfTlFTcsZq06zxfdM0ylx/183EhSxmIJ6xWjznEuwmhuberQlZlawDhPAFal5fAKBU8vfq9kSYTxPEIZWQU0DOhSyNJHbJKMRgUQ9TzOBzxJICvhjv69DK0JS8uSUHL0WxauZMSEtEMOdYlcAh8KrWT3IsAKQo6mXNLVyH/pArebkswOEo5EGupLD8F45JeNuQqyV1KH2PU0bOAQkAL/K/fsYSgKMQvU8/csIhJtwdFtwXtfKcYlU9ZyakHPBiOVbCFwCeTDO+6s238Pz+iBfnA16+uENaAniKMlYM0CwkPOX2XqtEL7ekb1Xl6sKACeC7LArh3u1aSVydB2W+yAcgnMt1Egzpq+fQkr6lHRuV8avAukIYYmxjVdtDZ268Xt2WwLqebzdvPl9V2V1oz00KPbvo5hZV8CPn+Cbnqn0m98rtKVEt4elTH+h5dHl0d5XAPrWCf5buKUh9Ob4em2MYK0HetOMCqXsJm75YwrXXtm0B/TnD2lj7cqyCuc5lnQUP+rsZB5uLuJnHemS+P97elx0SWLd3FbEdsrf3PYAtWQxsraXLft18vu4etqR5s79d6GX/12P8s0CfUbpdLZrtd66c5m8Hfbcoz5l9R4FOfl99N/GpYvZSUQwMDAwMDAwMDDwa3xsy/qsp41OBMetrY4y7rnKPQgjAMQD/zC8GPv4m8B/9OeDtF++83Gv1jffFgYGBgQ8NXmvCl/YCJ8aemaNbUW9R1aUFqgxt8r+VcjMk2H1J/Vcb5khfr+a1q/z9in/9PaU2MGRzlXmC2JNSlwLHNo9gbd+qcmVVtGr/LaFpsUe6eYtmoA2u+rbWNnfKahQ0F9QJe1aA1pLb76O/xwAseQ2UgzZBX/0s+ePQkpm9FzqrDO7Bk8N22x6pawP5vtxLNs9I/cCpV/fYz702hU6guVN3DT6mG/PGNXWQycdo1Ek6xiYvd5eE6fVDFzxYcZQjdTftt8rk2k6jki4BWHtkM8ZlX06pIS9qHWoruhfAt/2waj5mIctU9WsbQKgWuv5ztXXOQtBp3laYYUYQQlM5XUokqk4CKKq61xG+xfKZFiGImWIlBHORl/IpSO5hJkyHop5Kkvc3HjKWFxMwE844irVyIR05A/kcobbLrMH8RMASkBh4HnN9hMUoZCwiVwIaiUAs7eRDRjzaZwghHjPilLCcIzJHHO5nsW4uttDyaAyYDgmHw4IpZMQg510J2cNhQUqERBM4EThrPmoZEwqMOGV8xbMXuIsL7qYFmQlLDnhYJswpYMkBU3n+fvF0j6kQy3dxwX1c8JPu38bbxzu8Nd/jR4lxmiecp3XqTl88yjnASubWKZDNtWB7n9drQ9W9IbDfbbVjLqRuJf8jIx0hamKYRQT6eGesi4jMsNe2vCrpe4n4NCTjxp53hxTbLPRo7tcLf/Du2Kj2nktN2X4OMguhNsTNFULa7n+J2O0qLC/BuYJsrwq0eXMVPZK3R8p6wtGlC2DwtozSnu7CI7Nwq55z75Kx18aLuaCxXkfXiN1rz/JOWoLmnKmi9lqAaK+eWxYv9KysvUrXXqO6GI4zgNiOfS9Xsocts9eWTpsfaz3cXNtFWd+Umtfrym+r83Pphy4Oq/vEaObfsL4bOFePStDukb7aVl14pu8XPVJWt2MlxLmmYQlNX1g/B4IkVc877986LjdcIwMDAwMDAwMDA7tYxEMRAPC3I+MPH29fwP9K+Pp/HPhFPwf403/xvSV8BwYGBgY+dHitCV8AYuFc7HqtRTMthjB1Nsp8mOT7vbybNfetC55kFmvijeJAg1cE2Hq9mtfnB/NKQZeP1xPBdLRqGQnuVBLQBpZ8OaYNjU2lt6m1sETbpaCeqmoBIHRsiW3ZqbTD2wmqCljbVNttAos6hqrgBVa1dbRjXcpu1BnlfNpgfrHzWz8zqLGutkphsSSuATMb/NW+Nwpl2qpRm3FwxwCtA2WM7biqpea1gF2xfyZncynDR9Va2apnaZrgbTFbFVwhw9M2cLoS4KXsKH0jmMB8URhvSFZywc69a8wqlJ3VZrtPC2YG5tWGs94nHXVzTx3TI4IBCPGolpNm0QbJTmK7Prt8tHsqtGsKX72OGQhzRj4EIdUWWX1Siw1oyd3yP2UgHUhyrirBV3KvcgTyxKISZsl3GwLXcvKTXAjdosTlUA6EkKia67XYLSsZSJPsHwzpC2KEKL/nkp+W1S76UK6rmAEm5JkQprJtyuBUCAO1nY5Zhi0Tzi+OZRg1Dy8jHBJ4ImhuYRCXxz8LcZxlfz5HcFwwTamSxQwhjmPMmEIWxe2LO7GRnhJiyMhMeHE+QHMQL0uxrL5P4IcopPgkRDjuMp599CXefPIAIsY5R5zPEQ/LJPmAmbCkiHmeEImRguQ3PsSE45Tw+RdPQMT46JP7ekncHZZadyzj/BxAephAy4Q8MWgqts4E5Al1cQCl9Ufy9wL5KHbOsYw5Zzk/YBLlr94G9nZYhExP90B+KedXry+rKraW03ki5ANW1e+r4AIZZJXzXaJ3h6RqyMy6QCTWBTb9ZjDI2L02zzZDGDFzXWDV1Gs+95V7KxnWI2v12edt6CnnumCr9staNNvxMOXUsuzCmzoGZr71DhaX1J7Gang9pvMc9LbHdrw8IZw65etitY5Fc5f8tfPwHklp2lZVrrYvFwjkbh5gQ6CultNmzK3K2I/NHsnt4c+HJ23tNt2+V2Ypa9MXc120dXTG0S+w0MUDxrZ8q9w1+5lFElVZrgvvzPATlf0DKpnq31F0P/+9HgeY+7a+cxlCt2zn3nY9JrhrS/8GMEQw2/ftnLFJxeIXhmJ9hDbl2M8lTUXdR9ti6yl/ZwxL54GBgYGBgYGBVweD8e8fE76zLID+wju2rRoYGBgYGHjv8NoTvlbNC0DIX0DsmzOvIp3eqnfABK3QBsR26zL/ezK42uF1yrGBHVtGCP19XA7AbtsfC98GGCLrSuB5F7eohq7ZFV5Sx9g8wHvH34qan9eQywoNSPf6e42Y65KU2tYeqdnp756y18JbZe61y9W7a5u4Z9nSC+TbckoQtxuwfVXoebkW1O5hz0L7RvTUcd5uciWMw3bseuO7ITteoX3WWpQ0Ny8B4JWIq23AZpvPq7rZHlCfj7LOYiVKOXA9jl3BTAyKtB6rqs+i7m0unVAI4JiQq4tACdwXEreWy1iJWv1+b9gYovZliH0zByAywjFB039TKG0xf4wJgcG1DTmHag+dUqjksJKq+ll/52K9fCwE8EMhlENkUUdT6fMkeXs1N6+OYWbCeYnIOYAKKc4MLDmAmCqBDMg2AHh+PiKGjKhEb2AcpoQpJsTAOE0T+EDgKSJPhHAA6EHGiPLKB1AGQoLk3A1AOkJU3FNenZh1qAJfFNMCZcFAT6XnrjlV/9qfLwk8YfYYXHgO7zkXtA4KW/XeRXtl7MzBehy2z6cGl+ylgcvzhcfevO/nhT2yV8f8MXP1q8zrlvS9tWzt2w1kb/O/redKWxui9NJ8fsFiWtS+F6vxle5/d8u5v9Snx54bO76GxJV7wpCZe5bOe2XdaMH+GFy7J5u5/to99uqNuLiYpfueZv8+yHlVD9ciS7/0OdQspBwYGBgYGBgYGHgVfCYw/l78Er9TxQh87c8AntwB3/+DX9q6BwYGBgZeW7z2hO+q6uWq9AVQgiS5rrLnQCDLbgCoyl9gJQWsXVtTka7Yp9YGGjCBF6BR6W4IMRc8UsWvJ5B7gRkiYCnKwWmqagJalu2+pjxeEsAZdDis27zNnbZBg6FWjePVJT6o21Mt2vanJOPFWdqtx1rLalXe9JTCOa3lbBQvbtx8oLpRbnL7vQ222uCstscdx6qO9gqahFXhqhaBoUOYBt/GiIYMTmm7n2LP5vGSctRbh5o6qtpXCdbMojw6TGZ/056eutiXn5d1uw3QahvLdVotCI0SugYqE29UZ2TOB6dzvX+qsrjTHk5ZjjtM9VhKqd3H2VxTDEUZt44Tu/uRvSLfPieskigArWTb7GbvmXr+LihvlkIATFTJNT4EcCQh9xZRV+aDr2j9nzKqla5+ZhTyTfefA+bTJPlgyxoasZ0msG4LXJW2HDNq3t87IUQ5hUr0ZZYrJj5bcDguuD/OePt5Uao+kf7mpq5CNmv5SwA9n4RMDlxUs57kInnmFpUxExCIkUDgFBCmhBAyDscFOQcwA9OUwQyc4wE5E04vDggHITyJpI4QuBK0oah/UybMOSIzIRDj409e4I3jAz7F/wge5gkPDPA9wClgupM+P7s/13y9qdg4p6LqzUyYQkYu+Y7PpT7OhJwJKQZMJZfw2y/vqppXSd6PPnnAISYEYjzME5gJ56cJieRamZ4HhBmICxrSP5yBw3PGy59MmN9g8LOEeJcQYkZK5T6buFwrZXxRjmfI7wRgYuQ7AkeAMiNPZUECo6rIQyr3t94TZE7hu8XdyCqBqu6VsnvP3qJMTGmdOw/Tat+uh16xSfYK3s0284xtFITGGcAqdimGLeHUe06Z/XoElVVOdtXBXp1py/FWv5dIXddGr9psvrfkau+51wNn8Fz6bOcPmzPYzpG+LKuW3czV+i6BxxHgpc313B5MP/2ju4yfkL55XUSmx+6RljuLrLrvWKZNjRPItQVGfj9zPprrsIxrl3DuqXC1Trh7pvSpvmfa+VLnWKD7ftMsRDRl67auFXtz/ZV535apqns/9xO17+PaJvu3QO9vAk3t0Ev90Ns/pe07vq3PHEOa/y2l9b2jlF/focxYsymvsXnWOgbZOzAwMDAwMDDweuIjT4Df/28A/9lfAX79v/N+t2ZgYGBg4DXBa0/4wgRVe99VK+O0rnAnKzHaU7YCjtRy3/XqscdkU3Yhk5qV+j3bZbV4IxPE6+3Xy/vVI5g1WJbDxYAP59z2a4/kZUZJYNlVHdV9CStRC6xt2ASSjV1iMn3MaduXxmbYfLenpqawJdKKpbEQzGEluRs7Zt4ed8lOWQPHPZLTttWOae5csDYwroTxpcC4DfTW8g2puUcG2zY123bG18LaU7O7ZnrkqwlAr4oTE3y39szuvmqUP9wJdtrzdqnNPTtLU74lm82Xtb56T9oArgaHd1R2e6ohbpTfN6Lk+KSl5LYNVMjbYqNbCFOgELiBZAEMrf3Q/UJixBMhHYEcuVo7c2RRx0ZGiryywAQhW8l8nrWisk9g8CJkKk25KmFDkPy6Ocl35yUiJ6oKXiIAJCrY2v4lrCrTwOCnCRSEhOU5VDLYWkgjlPYUK+nMBF4CcArIMQNTwPm0WjA/FAVtCFkc4Sc5nplE7RtLLtt6qasdpyhzQ2A8vTtLWemAQCWXM1M5rdKGlAKWFOoMe0qxksixEEFz2UaBaz1zmhAC4zjJvZ1q2ySP8bxETFPC08OMiTJiyHjz/oTTlPAWMU75DjxPYuOdUK2dAYASI8xAWBjpjrA8YyF7w3reWM+tnl9jjV1XCeg5svtZMBrb5pBY2l+uVckz/A4JiHoP9RZn2XvVkX4mpyijzeEJtGRqn1hNRq1YjqfWsrVxAtiDsbS9rjLsWE93ynsUdB4yBLHU5RZ6WXSeWw2517MJttt65GyHpGxIUS3Lzpk9i+NKfm6bvdufPezkIKbeXN45lvz8dwk7JPhVW3LFrf2yOZctIayLqXrk/4V6Njmvy7XUXMcmncIGflGdtusGdO8Xt0iCOguzNmklevDv4z7dittGUth6rCV17bH2WdBz79FyTVvJvt/593u7UM49Z8S6mtdxGmTvwMDAwMDAhxI/9Okfwr//f/oP8U/+05/E1/6Cn/t+N+dDjb8bMv7fU8Y/CO/De1UVa1z42+Jf/qeBX/jVwP3dl65dAwMDAwMfaLz+hC/QBlx6wQ2/3QZPrIXynrIWEGLBB8O8wmFvJT1ROR7bQI+FVxnosbrCv6M4bFQPtr3Amg/PB+KaLjjirBfw2wukVjI5N9uICJy3pGmjAoE7H5v6uR8AVCXHLXbCXrlMtFXkgttAqg8+WrWzJQ+9HeOeeskHj5XQ3YGcR1v3TnC7tLW5BlICIV4OnFpC2vSnyaupweErCihOa47cXYLZn6tolHa2PztjUvMEQ4kUbf+qfCGnEOoGc5vzYtTLibfB2Kb9O8SNJ4D98b1FGY+FGTvKLAtVCtkLdueMZX8O64KWmtuXlWQD4olBH5HnEUcIsVr+DyEjqYoXKISqEgOi5uUlrkQfARQYvBQi96DBaiAErsRpzoSco+TOrWQyC9F5KEqvHGrdlQS9l3y1zITlFCF5Z7mSz5r3lznXHL6cCbwQwikgHwNySS5LxWo6ncW2OT7JNV/vPEfkFJAzFUMILp+lD3o1LYVsvZ8WZEi+XSJGKG2UMUIlkJcckMu5SIaw0mNOS1h/N388yu8ZSyGEZQzFAno+T9K2Z6KqPoaEj92/xCnJVD6fJvApIh+AsAi5q+rceFrJ/3TPSM8yjlNq6q7K3vU0QVW7xFRU3+aa8yjXmV1TRRlVWV6HQa/jdwAKJGtzrihGBR25oj7jepa/+hlwhCjXRRhNNU41WNu4Q+ZWUhhoFopsylX17N4cdUkp3MOe+nMPeySjHSM2bcS6sKWrZu2RprcSo07RyqYfVY3aU3dbcnMv16/POdyr2/6+V3+vDT3r5mu4oqzezM+X2m/fZYBVee4XQ9xyXVy6fpzKdn0v2XmPsIu/ihJYFbirKti/j5n51dpFF9T32ajve2nd7tq1C1XuegccW7+3b9ecvPq7Vy17i/cQ+s8GUxbb+i60tfl7xr6vGOeBq+UMDAwMDAwMvHb43Gd+BH/8D/3H+Mqf8pWD8H2P8Q8D448fH+EO9F4gRrF1BuT97+EsIpbjAfhn/wng6/+x97d9AwMDAwMfKLz+hK8hQUkDSzZQ4/dT+EBLY7FmA3QlcJRLpNwSr3pcSiUi3iFqdZ/sSGZD7vI8l0PWAFXdd1k29TEzKAQhujTgYwPRqmqOa3CKPWmVeVVGBwKVgBAvHaLKWz7mUAKGrUoEOQnZ4ZW81JbDVkFbSemIqgruKXgbvq7sN01r321gnxlIy5aE9QpTQF6SlAT2517hg5yXyFC/3dpQUxDeQX/3AduIVtXRU1qnBEDGuRK1RXFLSmo4S+Y9MqLuqwR4VVPxSk6rzXOjNlnbXctWy2QbVE9pHVutX8v2ZLaS19X2u5Agpn+ccrFyNkrabY9qv4E12EzU2bNRCK/Wk9a6uVpDq6LGbGe1UzfBVGvpascHKATVJXVYr326uCOKpXPhFSvpyhFCvGYI4UhUyTYl3irxCyDM5bgA8EFyAVMCeA5YYhTr5ASxSc6AqmeRCHyKK9F7L+rbesswwIlAE1cilagQuUsAzwF0yAgH+W6ZI/JZFwtAiNo5AIkwPUkAMXIOyEtY7Z6DkMScCJQIuE8yjInAxcKfND/wpONcys5ByMhjRohCDM9pwhnA8bggBD1vXB7poah5T/V03N3NmMq1dwgJU8gI83E9XYuokI9Pz7g7LvjokwfcTQsiZbxxd8KcIh4WsV/ORbWbU0SeA+aYK4H+8PKIhxdHxEn6EwILKT2LXXSMGW+f7pAOAcyEN44PeDqd8Ww6g4jxheMTnNIT4Mcj7n90vV7imXF+k/DipwSc/xsnfORjL/Hs7ow5BZyXCfN5KnmVGbTIGHNRUnPgVVWdSE9bcy2Snst6/bFMmeUaRYY8/1gWHmxSIzwGueRF3iPGvJ3vHqxVMFDnzI2VbCV61nlbrPHNPljv92rdbI8326TOVnm4zctrnh3T+qrWVR7bedCQTdZWukLtnXuwc00gEE0tYcdZSFI93lpFm2daJXuro0bZx5KC9txpyoY9wrX+H+s+FExbgZbA1/lFy7VtWRu5lmHr6Fla2zmvkMRk50xTXp0DvEqX5btdW+drUHV6x0FD+r+z2Eh/VTWvnzV3FvltLMF1PO094xb72c/1OrVEs87HukDB2HJ31fWO0G3m37CzwALlXcLeVztW1M297crZbLfEaUrr4szeIk7dZslYr+L1x2jdmo8356oYpmlanxPW/UfL67gH1X4eDuXvhE1VAwMDAwMDAwMDrwu+7muBP/l75PNPfBH4tb9LVL3/xq8EPvGT3t+2DQwMDAx84PBaE77sSdX6xc5nC6/G7Vki7x13sVGdcnxAzRHDNQjlVQMAeFla5S7tmgtfblOtbhvwamzfbMBzo1Y1AfaePaDHLePp9w9Yz03m9fdLUAVyL1iswV9Fbbc7vve5V9al7+zYNbaWvA0ke9X0xXHsqJZuaa8eXklzu3Ag36bouajm6Sm/WjJ4V03TKZeEIdyO0yXYNlzIy3ixLT31S7C5B6+M046yf1dx95jckcVqupJol5rCQrJxJVvcM4VF8UmJ2jUtDFHWJluJMnc3XCNUfnhnfEv5Sl7GKSPngJSKMpbXfZCpdpKL2ldI57zWA4CLShYBldDiaj+8Er6cqW1XuRWZilVyklzIcgqp/ljo6Z9CRgxc1boBjDlFzCkia9sBHA4JxynhEBMiSe7dYCyTlxwkX67WYxS2MWZkBLG/1iZzGVsmxChjKDmFA0Ka8AaAQIz7acaz4xnLk4DPf2zCiYBwilVdS4kwvwE8fGLBkzdOeHKc0Vg5985bc47ZXBv+u/3TbycsDnTlIn41NIspLC7du/7Z4tSJVxWzHfV/b6GHtKMQVVkWruymobilncBNc8VNil9b1qsSkbbunhOFomfFb7GnUH1svl21GO4d06ujN2ffkm+4V25xn2hUw3uw39+qdAYuX9OPGadrdcQL7yS2LvtOeOEauvl6vNq2K31Ukvjafr1y/btAd5FcXh11eg4gfmGnEuTvUGW7eSZpe/fK9f157Pv4wMDAwMDAwMCXOWYw/nbg98fK2eMjT4Gf+VQ+f/4t4Ot+HvC1PwP4mT/t/W3XwMDAwMAHEq814QtAVL1KWO5ZKtedbeS5s38nT5YEuct+wTAOmVcbNyJgKgrfeVnbA6zf609UBaph+2Jcc44RrTl/99qmyl4NNFWrW9pYx3HKrepF4a3wdL+UhYAIJUjVBDINcgJCLEEoVRwUxQsbFXQNaNoyTb9UhVytkzXwWRTVdv8eAWfHRH+v+4d1XJqxzC3Zqvv1rL4BowbuWB331ECxkDkpbYOilti1efV6quGq5LHtd8osLioQm4vRB5p1bEzeYk55JSHgrnk7OD1rYlXDWSJ5j8D1AeC9PmqAXBXMti+qmKqK9SDEcua2jqo2WxpFD1BUMc5mka0KvqrPTd+K7XezQKKobzYLNAAg5y2pbMclRhCSqE17Y9EBpYSwqNrZKKAI4JKnFSifs/zkA1YlcC4EHWTIaGbEMxBmQsqi0KVEoJnAiEKs6sFKtlJRZBt1JyejqI28EoJYiVOAEWJGKtbFcUqYplzz1YYQsJym9bbTW17z1p5iVfVOT5N8lQg8ZSCTKHUjIxOKOjiACwlMTxdRJC8EHCRXMAVGPkcRKT9ZkJOQ3MsSS9rxsvgmULGkzlhSQCpM5tNCkJ5TRGZCoIwXpyMeHg7ILyYgMuiQ8ZH7E+6npaqA5TIQgva8RDy8PCIraRwT7p8knIva+dmTk1hBFwvnnAmn00HO/5RxOCyYQkbKAQ/nA84h4s27CYEkp+9Hjw94Ms34qR/9As4p4q2fdVdzBd9NC+6mBW8cTni+HHFaJrx9Opb6rN22+VGowlfXAOgPCnke10ulXqNBiGFiUZKrjXieUJTpr0BAbJw6VqJskzu1qFEBtLbvVnHoVIjrPkHm8qqetAt4nFKvpxjU52Yu+Xc3SsXL5JhXHDf1NM4EhqT2++4tyrrFVlkdEqwrRlFjNvbF3prfqmZ9f3SOukYiWgWpqjLLM9AeW+2Ye44ZXnnqXUquYL1utvs36mXfds3hS0FUrJ3ps7ZbClsVm0jbsi+li1DspQ+wSmeLW84BFQWuVXRfUoZfg1tUcJX8Nfv3HEp6qviaE1vfj832qgbWvLvASsaGAMyzlGVzdHeeT42Dhy7WtJbOPfJVJzhnsbwqqHPzvsnNPUWbMqsC2L4XWQcSADVFjaa8iBHEr3juBgYGBgYGBga+TPEWAb/9fsGPf9DWzX30I8Dv+41jQd/AwMDAwC5ea8KXcl7jT0qo9tALLu2Rw2oxbJF31JA2iJNyvw3RkZyevNRgkA3q1Lx93ASla8kuwMe2bBuYjkJkqHprE3C2uQg1mLdRV8Z+34PJFduQmTuqlkvnZkMOl/9jWMciGtJZrRS7RLAJUCux68nujdI2SbtNwLwJIO+pjrQOH1jtWZV6dS2AJjewHUOvouZkSGkXCLaEcS8Q3csnyCYo6L+zbd0hFnbhVU17gWW1tq45jU27LxHEWrYt31tIqzV0dH3bs23sgNz1aAOztTebxSFt3r8moO3Pt912LfBNBI5CajBhfW7tnQ69JdkcHyx/KyRcWGRfjiw864ElB29gqG2zdlZtlJEBWgp5/IY8g3IiOaY+zqg4UYol8uGQkJYoLtFLFCITEGUprXl4bdvTEirhSIXwTbOxdiYAE0Pz20qDyodF+scIQiCX9tfy4vosjVMWolyHKhYb6XNACFlIySkZR3pCJMYxip3wi+WI81mslpEJ4emC492Cu5gQiHFKE6ZwBgA8Px/x/HTEw8sj0hwqqc4c8ZClbxQYSw5YlohljnU8OZHc/oGRkpDBORdSmgmff3iCGCSfzzEkEDECGPdxwXSf8Xw+4mGZ8Px0xMt5wov5gNM8iTp5XkmAZnzNdVS3l8crOdU0cVGN63GMjYiXymNHlMYALXz92r8FzAByk8uXwrpIqX7uHroli+o9rPNoSX3Q5CPVOWMPZuFHTX2gdrjATc/SzfML5jlkF7L0bHB7sM/0nq28EqvWetkfu9vYjmK2Lvxyc+q1BUB+PyXM7f6e4G8WgHXOdV6Jy7pbfS/rk79dUreTx7f7HgC9d/vng+wc7+vzuEZOG6cQziz90utTLbDtvsD23F4ify2B78/frYpkW/et35lFGR5742rt1D123T3cO3Ozn120CVSFvn4G80rOlkVgpMfp3wIln6/YWXfe2+2iTd9urT8luS97/bDvJNqutTNSjNpPDwwMDAwMDAwMPBoM7Mde3i9cin0PDAwMDAzgNSd8N4SffvZKzUvK36q2DH0y9pI9tCN8NiTQJWgAxgaHfH0uALQXoPaoQWtVIfgdKum3BoGaALXuU7ZvAq5AJbI39tABQmxpPl4dj5utEXfG0JO0OeyrpHT7rARmlv0vWHjW8bDW1vXawP6xvbi/J2V90Lu3b8/KWAPVKYvSyPdZyc1br7mi2KnK2GvwwWBvfdmzrIwBWPL+ufH7lX40dSp6yqSEtmyzjW2Ati4QaHPqNnVcs2rOnXux9xy5RrToNaIEciAhqG4gvDgEIWkBIW8JjSK7sYYlbKxiuZBw6s5MgCiBk2xHgKhio6hgweV+JyrsHNY/cJhE4UuMOCXkFIAc5HZVhq8QhDkFECXEkCu5y0tR4AIIB7E6plDGgSF5YhOJelgJ4SD75JOQqsgEHEStWy9DtXbWAcml3cYHu+ZwLn2ikM06E9LhQyr1s5kZrR0zANxNCxYWW+acYlE7i4L5yd0Zh5hE0Zsi8iTHvDgfcDpNWE4Rav2MIG1kw44yE1IKVRWtltcyDlmsoAHkLPbOzMDz80Eus0x4epzx5DBj4YCJMu7jjFOahICeJX/wKWbJCZwkBzCK5bSQ+nredXDK6c8k56cQv+rsXC+9hKrgJZZrTNW9tRzhZsv19y4RvjJIpRGd727J5esXP3WrMPNCwsYtAPDPmEJK5lxJX31W95SKzcKu6pywqoj36rC5gjc5fC/1WZWbHfLxKglYjt+geXbvLPzqlOsVr5v9eqkSqiPIO0SPrDYL15q29dp90Llkh2jWtqbUtxzHluyt6mI/Jpf6YPMnE4FvWXilUIJY+75JNbGzMGxt8JbAtur53jYzNpv81/5YfVf2ObA96vta5/7p5det7ed+uargT3ldgNErx9bTsVGuLiSL+fviVrvpxsWnfV/n0nbN89uohm1bH2ttPTAwMDAwMDAwgAcwngO3JLgaGBgYGBj4wOG1Jnx5msAxrLbOuzs6ItcESKoas1oDdwgntQ1sFB7cHtsj0G4NaHuSl7lazfGyrPay5TtOWdpJtCpVGsvJokpalq4dnqpQbAC6BomWpfQnrKRxE3B1AbtaHsDzvI7DNK37cRYC2I4nmfFUW2Kvgm4sKZ3NXSwEuVX1Bncejoft+Hqlk+2bV3f31LaAbLPKWiQhl5zCp1FS2QB47ZcLZGuw3rbNkbNi5VcIrEBC/vVUvmpHrNdPIPA5r8FHrcdZi8s4XFCiWdW3CTIzs5A8KbfHehWuflZSGKsCRSww83q9exWwtyqHklHuGte+WWvRrjIpVWtrex/xRvnsgsbOgrEGW+2+PZjnB8US2M8XlIKBwIcoCt9CYgrR5s4LAflAldwFUAk2DkCeqLo0h4URZsb0kta/XgJWW+a3J9kxMjCtRC0A4C7VQ9KipJKQsgpOBF4CMrFYREPI1enpgnQW39/pfhaiM5dctQxQZIT7JHUUUjMcspDHZwLOYW3rHMCJwQdUsllVvAzpS7hPyC+EwORzBI4J8ZCRy/BNU8Z8npDOERQzKDKmSZS7GRlgIJd8u4EYMWTcTQsOMeEuLvjBL3wUz1/cIT0UAnfKmKaMKWaEwpIGYvzoi2eYl4jnb90jzxGYCXSfQLGQ2RDCOkQhoM9neW5Ox0KoYyXXc4pmHQ0jk9wrS4pi8fxwwNt0DxALEa38RxRp7XKaUJXFqtIt+ySCqKMzQa21Odp5CUXZC9BCougt4uwcqSVbyyO5WpATqpUzZUZIjDjnyyrZPfi53MwjSpAJSefuQ0taOXtlDtgSPmqJCq2mlG2I3oaYrfXkxm617hdlju0TS0bF2pCm7fNV961I7vkWCEQTqp1zJ5UDxWLVi1gWEek8E7Z5hXtOFBY9Mt1bK1u75R3isiGdPblLoZ9KwbdR0054RW6d70O1Z94jXpu5vs5zS39fbbcnpnuLAdQK21+TvQVVnPfVvhY91wjIXMrJWENbIrfX73qPhlblbb+z9flUGPZ/oNopc88pB4bMNd+xe2fYqNaNPbovs5ZXUjbo741K/xLZW37fLLIwxC3ZMuzcq+lZiIDDAcE4gZgOyPtNQi2TYgQvcl3RNF0mse07WXk3ad9z2j52XUbMdwMDAwMDAwMDA7fhDx4T/tKU8cUbXs0HBgYGBgY+aHitCV8wC9kL4KKK139nFT3Vuo/bfTf7eyWIIReDBskdCWTa2aiGPXxgyhxbSdcekeSJqccEdErwbKMQ9WQS83WFyd6xHlWx4gK8tZ6dMfKBPruvBjIba2BHCnhcUy8Bt/d5T2F8KywJ3LN9toFa7uSINflsG6TUb4cNrodC+tjvbmn7XvDdtvuWMur5CvCkNtmydgLgm2M2dodXFNCBQBktwbtH9pbPFGN/lefF58+Fa+nScQCqCD9IblkAq10uQ8g01z8u/FslcBhVAcsEUALCjHa5qn10qVUyM6qqNzLClIWgzST/d7vKQPFSVqUvCqGZNPBcSArWf1gUz2Eq9s2VwAfUqrn2pSEhRXVKQcaBSHL61n30/+JnzUxCdAYtn+tnQIjRnAnIUTh8VfYCYKb6+8vlgLPaLhdFLE2MUMo655XwmZcoytoUyhyh9xyv3LzJeZxTQIgZ05SgVFMIjJy5PIqljpwJjGBcR6VvakCdT5rTHMChXILaf2vJnMs+BFT1rto3W1TlLyq5G5b1WmwWGxCa/TiI8wMHs0/aIT8fC3dvbci8K3bOmwVPCmvL3Glnmx4hb58brwJLgvUWatn9dp7TTVs7fd8S29R3qeihl0+253xhy7t1LtQ+XXxWdhZN9VwmPFwbbiJU/b6XbKu/VDDnfaM89oSyf7/aKcfjHd2TgdYFDxaX3D4aF43Ofn5b+b0haPcWjnjydscxp+bsBa6/Z/u/E3Sb5gO2Tj9+AaOrV9F9/tyAqvIFmmfV5p3n3Xo+DQwMDAwMDAx8GeHzBHxuvEINDAwMDLymeK0JX1KL2hDAgcQmcrPTFUJFV+lba+XFKBwblYMhFolaEjhAeY5WaWqVwJqT1gaErtmtqWLCBKBXhSwBRsXrc7D6wE+j/GEGgpz+Ro1hAoU19280CgHWdqeVuNUxUSWOhVfmGiUJAPBixkOVKEX9cFmVwqsNtyqBdHtpf892c6M2orCex6oYxlp2ozI2balBSKeGUdVsMGMDAAdCVfnadlnraFuORS+obsuoaeRYFL8UwKcTqgJciUI7xrWfRj3lVHDWEtmiqlNULYz1GtmM0V4A33xHU6jj0OTPddezLdvnuLxqUW0Dx/b8RKzkcj2HZgGGBorLPdbm5jULD3r1mbZWFdJj8h4C9ZnCgcDFHphmBrKodfNB2V2u6l+O5TY9CHEXFkZSFSYJUYcH2Z8BOcXl1mElQDXpb2ZRfhJLzlsWwrCqfmklTykAIWbEKeN8mgoBKbl8w5QwHcTqOJ1jowxmBnCK4GcLDse0ksnEmCaxhD4XcjtMWVTEKYBPAZiAcMwIQVSseFL6kQjhruQZnqWteSnHESMfJWfudFyQFsl1fpxSyY/LiDEjRqmbmbAwIQbp/0+8vMf5dADPhcSdgHgU++pAjIdFLJRjsVE+nw6VaKVE4IUABOBYFMVLIXyL8jZOjONkFaLrzzQl5EyYXx6BwMgUsYSi+CcU5S6AWYh2HLP0ORdyOxHoIYKLepvmsJLkRsUrFUOUvPpIjdJsjiyLBk4BVHJBW9twJXepWFfnKMdyIL3ZEJbcf9bdgmYxVS5kF3XJ3jp39fKq5zU/ryVdKhGkeTPr/kYNGMKakzPzqgL0Nsu2PP+sKM8WtXzuLlixOemBde6MO2S0Pue8Va57Ll8isyv0+WzHsEewlvmDiqsH2znF7nspt3xpV9P3lOQaZTPf+TnKb+vhgrq4u4+dCy+109g+y65uzvfl+9914Yslb2kts2u3XY7dJa2dotu+n6zKX/de1JlfEag6bgBYz+0FhxdgfTe4tthActrm9rrp3aN2f1+kKnCLKnljqa7vzmwW11h7ZvtOoPdDeRfeI0w5pZYgXjsnfbfv8yE0f3+IC0q/j02OX3tPWhVvacvGgUQV09k9c2waivwlXpwwMDAwMDAwMDAwMDAwMDDwvuG1JnwB1EANZUOidmwfOQbZhxmY4pZstQStkn1Ehch1ATwNTE0mcJZNvUmPpe1xdR9DpDkFATODnH1sVfpCY+ZcidH6XVjLkP92yMMcTBQbm2CRV502QT4bzN1T+TQB0853aeUUpIzcfIcQDSm9DYLvWw2jVf704AOeVT3rguI2cFmVqFuLzFqG/c7aO+vnHjzZq+1TpZMnPVXNuxdUNiC1s7Zt7J2n2ZSjCqGo45/bcS25kJuFBzpGezbQ7Ntrr3tHIJS+V3voix0046MLHJKxrFYkM34bYj2tdaYEilGCzym19463hPRqoFVmWX5tA7A1kG36ynbhxaVuKpHLXPPurnl5SQi3qM8HFGtYJYHX/dXSmTIQE1cyrnkOEIQUzCRE4DGbZ4rklq15XiH7UhTWmHNAfgjg+wVxyqsStRCKzIQQsnCDU0YoJGWmgDwTOBHyHDCHNScuc8krC4BTAEUhVBOVzuhpmANSYQMoCFHNDISD1JdlIEGRcbg/g4irJTWXY6iQs/Mckc8R8Ymcp5RCIVsZz89HIX9zqIthEBl0yDjezZiikL4fOZxxShO+8PIeyxyRFyqkOcDFzhm0ZkanwAgxgXNAej5hBnA8LkIUMyHEhOU8gU8ReFZsoA8lNzIKyRuA6ZAwn4qa+JDrueVzWM+ZkvrZnHyGnHPNF7yY7Q2ZS2InX4jr6SUQz3Kv5qnsm1Hz92oH9bqjUi8lgOb07hAQtJJm66b1mdvk3vX2/BeUno0lrMKqCa0C2D7eDdnrF1t5wqslhzoqv532dUneK8f0Fk+1i1fKnN05frWGNXOTr5uCe2bSlohlM7+4d4hG5VjGmGJnnva45DZhj/Mk6iV76D10LK43+XZ75ajddO/7Qt5WG/KyL9l0D74vt6iaO8eRncvtuVDY78tiiNpPXfxnLJnrZ3tueovsriiqm+sL7lrw5GvTr33yVJW9l+6pZtEY7zwTnPq3kr3ewaeWb5TE+q6g7+1+bK4pe3sqZvsuoqlpYqypKew+FOO60GxgYGBgYGDgQ4tv/7P/BT71/Z/Gr/y1/wv8Ix//2PvdnIGBgYGBgYEPAD58JhUdS2JWRawngi05fEM5m997lm26XQNhG9XRhbproGjnGFUc1qp8MCu0ASbXh4aos4Gva+pI0yYiUX70SExq+nZFUdAQ864sDcpa2+xtZZfb64KXzbnYK9e2t3fuLqFRi5j+7Ch0NmNzq83kBaVScx5jlJ8ryiYlIprArR07f7ySwJcURr1jdhtwRfVlsQnGGpLBEzwaOPd2x155VwhmXWjRqsxWRZ/+tO0xxK8le3173fnmayRFB6QEWmUJ5YeUCIZ8R+6SZYJRVso+IYnqd1OHIVFpoZXwK8f5vK8iGDekY1HeAhByV8nXJBbQzAQisT6mkEveWmk0lePzEsB5tR7OS0A+R1Q7ZNtB4rVdcyi5fUNtJ5U+kY4VAXd3M47HBdVGuewHoBLanNfznPNqmzwvEeclyn7mPBAxppgRS07eu0kWizycD7Kv2ihDiNqqblbSmPSRxKCltIEJaQnIc5A2zAFYyvgwIUTe3GqqSEYWUp1iucYWAp2C/BTimZhkzM35rdeVErT2ElUlt9o+MxBPqNceh3UhQj2+mRfXMkOCuHG8go2pf257peNGFWmf4zV9wA0EIdyzsVZ/G3nl8/vW3928spfT95a6fHt7bWlcPgJt+753vJ8LFZfmKT9n6jxh58UblL1SfWfu6dVX9tWfpp5LCmNz3EVcSF3QHLvXtytl+PY05fl59t1SaN5CbN/iPNIpr3fN3uS+0bnmN3Puzn2xR5pWdbK5FzcqYPtO7Qlks2B0A3+s/+7atr0y3fcXx05zAhMJqeufU0qW2/fygYGBgYGBgQ8d/s53fQ++/c/+F3j5/MX73ZQPBWYwPg/G7AMrAwMDAwMDrxFef4UvsFnZjlAUukrYpAy2q/l1f79Kv2N9CLVP9LbM9jgLJZbtqvoYURW/lnTU453SmI6HNgjl1L7Wdq6qBwNJgL1n4QyAVI3MLojnLHnlmACxbDb9UiWkKl+tSqcoZte2RBNcZ2WG1m0UAFalVGrHQ9WgXv1Y7YhNm+qxZmPP/lj7atoKYM1zq0qjaVrrTO5YX4+eX7VMDtO6n1oGW4XTvKCxvd7LT2uJ41wUvRr8DiTlaL1W4dojm227bX6/vKP66FlSlv0a1a0qVSyBslGvhNY62dUv9pJTu18hkyljJSo6ZECt0wWhm+Coz4HsgsVqecglYMql/XyezXiIWoeBVZ3TyQVot22sUq2i3CitWO297UKUDngKQqRlBqZC1iWWDLAEZN3GhnTTYwOae5gJYq1biDeaqZkBmEkUvijKYaayI4DACJGBWGySE1UyNS+iIKX7hHCQPLgxMmJMCCGL+jcTcpZnVohJbJ4DIxflbb7La87dvLZXOxSfSL1pjpKfNpE8C/QPMT2WAYpcyU5mAk36WXapQ0IsiuFFLIGPhxl0x8iHhFxI3cNBbJ5TAsKRsaSAl8/v5PDIwFuT9O0jhHmJSJnwmfQGXp4POL08SHsIYptMDF4CwkFUvodDQloCljlK24hBb55BkXF6OFQSllM5L5MS3Kj1B2JgkraeHkTVH+5SQ5rTQghnAk+8qsNLezR3LyUC3yUgMvgQxPq5WGETQ6yddfBYiN54KureWMq0hC9DcksTqlKQMorCl4Elv5ryzM5xFLDJZQq084zCphvweX/Ls6baxuatlbIq5TaEEVAdATZ2rb3FWTvP+8fk8WwX9rjnTcfJoefQof0Tu/lHEsvXFukY6/qqooxODeqcNnhZ1rJiBOlXCav61dep7y5aTiDnNBHX9vi2Uljr6CmPPVHcyeFLcW1D0y+jAN7gCtm62i5jq5D2yt5eXmGFd2HZg00z4Gyl6/FGGb/6EqBee906mkUNaX1/qf1cx9znn12Pa23O7Ttqz658a/lMW1Wtnb/VLjmlSt6Szsf2Xq73bmgWdzXYI3Dt3wP+7w0ltI2zSS1L30t0m7bV/j1g++YsqNkPiO/TwMDAwMDAwMBAF98RGf/HuwVv3fAn0sDAwMDAwAcVHw7C15KnXeUmgyxJ2yNZ9pQ2AStZe2k/3x4bWKoBV6zEsm+7oqc28OXYlfvGBq/uQy4I6VCDZeh/37TLBjK7No28rSdQL/WrOeaK4rMXQKQLQdTHqmOtCtRaJ3p1ps93q7Dqo834mID7pYCrJTo9eufN59i17ezhFuUWOgoS+73p+8bGea/cS+S7RXDn0xEVN6nbCjn8TnBVQQMAIeyTMT4Y/C5ijwSqit3eo86TPYV065afCzF3kOccEYvdbzB2npkqqZqTKEvbQmR/cPtoS6kwgCR2yRRQfw+h5MVdJI9uREaesjxyGLVvFIqls5Kc5ZZEkP3oaBalKDlaFMJAAGKSPuWAEIttMlMjZtW+Sdvt9cfusxxX9+H2UctMyCy2yPMSsCxR2qRWqIeWdFbbaRBLXuJqgV/49ZghjBIjHgrJzrQqqplKzmYuY7yWWcneosbmiZGR5Xc9r0r26rhpf4vSWgleVZZTwpqbtw5MOaV4BJQjehfvlS7pu36Juojl1nmi98zv4VofDDnTe87sPlPUon7nXWNDbN2Knf5vnjM3qjk36Q08Kextni+04RJpuHtubZ1eCWvtqQuBebEc2z5djPMq2LwL3nCylDz2qmG9dntzq30fumT97NvSK+tWOHK7OzddW7TQe5eK++dlL/+1J4MV9lq+riw2iwp7i0a3he9vl0atn/1+OV8gaHfa4Lf16lb03j/ssZYoHhgYGBgYGBgY2MUJwI/txFoGBgYGBgZeF7zehG/OonpT7JGpzMCSRJ3rLc4s+atB4boqPwtJG1AUldwGifSYnhXcVFRoLKpYKrm2NkGdnSAPq2KwEmOGgAihqoZpWeS7GLeKqaK8JNPHxuLNoVHg9CybQzAESWFhMgN5WcdNg+tVLWMUNz3lS6N0VjWDG0sNLKfUqqu1XIvk1CSqdFGV9cZydydPoJZRWSjXbi1PFc8JohCOhez2Cl42Y2MVHckpWXv5/yKKimxp972Uyy+lVX28p6Sz9qdKcljVsFXm9gh3n2dYB6KnuDMKlmoLDrTH9ogGS9TY9mqg214rflz2iAslimNsf1eiRfPhlfuKYli32fuxFyQueQMbEsVbyiounT+1dFyykLI2KB6E2GXTd7VuVlIOKGQuFQUmDHmnHMlS0oofc7EAZgTKyCxqUDAk92whefkckI/FqjnLdgKEsCSxHeYoBO/88gjOhHgnpGsIuRK+MWacTwekJeDJs5OQpTkgL1Ry9RYSM7I8PjIhnyPokHG4n+Uxnwh3T1c1dkqiml4WUafyTMAxCWk8B2Ba8OR+xpICUlqfbfJIoErg5hSQmTBNSdTLOdT257zaKee51DMxMImqOQQg5VDqUNKuTAf3syidi10zsuQRDjHj7m7G6XSoVs7hkHA8LpjPMj0/e3LGy3DAmankTCbkM4GJkRGK0lrGbEkRvOg1Wjr5RIhxfmEJh/JTLJpBKPMVIT6PAHFzHYWZkA8MPnDN8ZsnIYJVkV1tx6kQw2r3XOpqyOF5uY1U7cHb9V4jr8qzoubf1NyeRl1r1boANs+wS4Tt5jtDyjbEtpnzNzlKNU/nJWL62njV57dTbHqYuZEDJHe5G5PGlcCrWIE6PzY5z3UOac6PUc2WdxHrStJdLObrUdQ8vIbENyAisK3bLpCyi7f8HNZLKVEdGEK7rbSjHusI2mbxgVfONo4bpp9V4U0gGDUyZ7DmM1YHjN44XVpY1hvPPZIeZQzB3THR65RRrtOe6jt1+tdbHFd+571Fb659XnHfqPCrS025ZtVN5RrBad6L6r1s8+5aMjjG9R4Ftu/Q+j6g+/UWbHYWczbPEC1DlcZ24aTZ7kn1+r6h7XN/31AMMhUMge/AwMDAwMDAwMDAwMDAwJcFXmvCl6cJHEOr3gXalfZKcHqi15PDwEoIezu3DFQpYWN3q4E/E/zpqGvJBp70c08JYMjkTRDZBqXVhk6PV6s3DRppGdNU62kIZE9Ye7vF2ncbtArgXsSIsxCdPZXJXmCUikzM2jardbZ+7y0VNZA4hfU4b02swVsbGLTB6z0Vk1cHmT4Drt1N8NYFRvV62LGA9HU3qlkX2K6BdkMcE1w7bbC6HmOC6b2g94aINoFahdpF9/IfZm5J1lJWzZfXI3K9Ct0GxAuZXavRaze68dIxupCTcVUeGWLcqJHI35s9e9Xa5jXfX0MAa0DV348GDamh9WTeKhG9bblHCGLpHGhV7rI+ihgcZXsVpnLJhQsAJPtRYgRQtXtORyFdKQPhRAhHIJPYNceYkTiCYgbfreUgQJ6BSwAORYkbs1x+pEFlyRkbYlGblny2Mh6i6l1muXBy5Jq/V5S+AenFBDomhGMSy+YAhIOQy0JKCQF9fnGEqlOXOYqd8jkiFHKXYlEpMyHELNbRR7m+TucJ05QxTRlEC9ISkJaIWCyfcyr5cjOQA9XHqaztKKQ1gEVVzbFcM5kwnyecXh7AuahwSdpMqmY+TzLGhwSU/MEUclUSx5gb5eY8T3WKmFNELiQ1K0Fbzk0IubafGcBZFxoBSITwEJCfZCGmnySogheljUiFhdXVAcohBYAPjHAmIdynspBAbaITEOa1HcBK7FJG89i03yGX63JJyDdaGG9gn6/lOcXmOUf+2VY+M9PWlllxi+I4BLHcvcV9ANs53B5biRslh+08tjc3dUhoSxjJ9eMfzp0yN9/ldv7vuVbUSttncE3xYNvYc8Ao7wAczD498hXoL4Ipcx1ZRw7Xv41jiZ+HbVtsOgLdx9ob6357bb0CUeoWe2ajNq6Etb7P+LY37xjSX+61279feVK5t+jK9tP2Ub/PYX0GBWquUaQEpiC3utbdUxzvQctL8p5CMRS3gJ3rtQdLkMdQ70eg3Gv6jttL37JpT7tPmyvYLdLQxZ6bBZXm3dWBYgQbAlfbuJtvWP9mKYtCOYSyCK0dV7ZtsJbxnog25HB9f7nxuTUwMDAwMDAwMDAwMDAwMPB640qU5gOOshK/kiE9FU7vux7Zq/v0yNs9gvhCwGfTTlUN+LI9EY2V9NotV0lbayfry7Wfw1YNUxW6+vlSQNgGb72yo2lXhzjt9cESfjaY2VPb3GIJaZUu9nxnN46PVZQp6bmXb9cHgD1JeiFYX7dZ9eolpYsfm15gt3f8q1pT9nBpQcCtx91qq3qpDP/ZXJPcC8z2sNOOJiBbg+iOmHX3Z3vM9pFqVdn82GuQSJ7SldQFKPNKzJH5DqjqXZT1CGuby38RVQkcFiAkOV5JWSkEouqlcly1+zWV0Lq9ivALkRtCUQHX8oQErrcTl/o0z24OQjwC0gaWjpHWFbDm5J2FuVaymJcAnNXGGYV4lhy+qnylolDWvLxUVMYgllzEISNEIQS9tbM9DQSsZYZCbJdd0xyQX0zgFxPy2ahsy9jyEgp5LMdq3wGpLwRGjFzIaBaFcKkra99orbPWj0L6RrXEFkIWLLl744kkV3MihEmU3JXEr4w8r28CvP7OhWQnRiWIqSw4oLzaqTMBnSGTnPIGXK4n0rnrMbbO1+ZY/+ytx5nn5hUr2ltz6AJo73N/z6sa0tdVn9krAdRsL8dewiWy+VYiWhq2Eod1/u+MX7fMvfcB/axz2aW52rZht4m9d7SdV1Y/V9vt1+Yce9xem26c63Zto01fuCz+6ZbpF0dR6Jd56T3jSn8vzkGNo4Z/F8uX7xF73jvKYV9e4/RxCb0+be65siCGeX3ftk0v93fT/lvvF7uwa882uXGqcQtGe+gt7HTttrnF9+yrm/L83wP6HHqVXOkDAwMDAwMDAwNfPpgX4LM/Bjx/+X63ZGBgYGDgXcJrrfClZQGFWBVwlGWVvFX9UuaVsIk7aoJKeJZV8DVgUr4rqgQAogJOlbUo+xGa/Lw9ezciOTY78tgGhEr7hOgoZS/L+rkXuCl9Y+bV6ln3UwJZVThZovc+aFfVQV41ohaMPUJY1TCHI5ATwKmN+vdUJ7moI63qNBbyOqcL6hStuyhWqUgOAwAq6uLcUV/UXH7bYWv6Wc8jUBVS1RI5yjngLHUpoVjb2lEopbQKrXpqGKPgqbbRjc1lgE+CrOewkodWwau2iF4BW4L5q7K2/a5pz15O4RsJyk3g1rSHU16/9xbSvhxHgjDzeqy2z17jVh3NGZQBjls7UgJtry8bhLdKuVI2Q4PSsVXWyAHr/Wpz/ariKK75K2vZgSTYn5KUmQOq5fkeisMAZXN7ZRZCLwEBDA6EdFCCAMiTsJOURAWcoxC7lMpjKzMoAYe3gHwgUccWYjGdgxCGBGCRXK6s5O8xI0yMQIwlB4AhdtEkat7DcamkZJySWBgX8pGZhZQlIXVzJuQUcDyeAQDLXRQ1LCBW0cGQtSTKYURGjitZuxTLYxyzqFCXgOmQsNrOE1KilagNjPPpIIfciTw1FJI1BAYOCfMckVLANAmJOoVicV2uBy55dIkZsCT0Fw6YHgKQgeXjLI+feSrEeSGgS5/qep0cyuN7JbunKWFZRLk8TaluE4I84FDy+Z7PE5Y5YjlNmA4JuaiM+RyE4GXIuQtCziIB+RwL2VtYXC7zVihMLAPEhHxXrtdFzteqIJfrMCwAGXVvtRYv3+t23QagWI0TiOXaw5L2yZC9+6D5bJ7fcESbvf/tNr9YSZX3zi62ly+0+U4JW1XjmWeDPZZTUR/rXLi36EfbqgSNcdyoddhniT4bN2ujeJ23bP+LIrJ+X+Z26zQh839Y5yozNs2xtaOd+czb+vp+1uPjOs95W26jDqYDrfNn55m9dtzNrz3VsNZ/yXnDt1frc8RsdWrYU7kGkpy8Nr2EjnVxz2CrgrZtrjbolrST55ycezd/luN28zD7RXgUQIf1tX99vzNtKe2u1s3A9t25d3712M73zCzzZB3L/sKo5hqt/S/3HJn7YDbK8kDtPWLvR2vzXPbVOup3zmp9rY/q9rWusP5eCNqq5jXjv75zrwrfPbJZ+72+I5lxmKa1T6Uu2++66EbbpClc1HXF5g5+5eTfAwMDAwMDAwMDH2p87z8E/le/Hfji8/e7JQMDAwMD7xJe6wgA00r0Ug2C7pCFqrhRgs0qa5VEc0rbrgLggtKvove7L9t/9vtrAKmrsOm0X3FpNX9wQUFvf+zadFUxpMqYzbi1iqq6r7f09SrgXlDcBumVxG1sDXfOgQ+o2nqB4tOqRCFvz4Wqj21A2hLfl5Q0lYx141FzC5py6gKAvC3DNqfXP/+7LdsTG5faulNnc6zmA34MHPl8cR+vCvNKp1vrCX01zAab8XNBXYtA2216jMvPt1u3t0Wtnx8xpgQgADzJIoYavy0kLoCSJlfJOzT5U+16DA5APDHCUspV5Srp7wBiydk6FcK3KGClC7KN81pwzrSqY4ttMeztSajK3JxJiNSi1qVYti+h7pvN8Vq2PBpptfANjHBIgBLERVVsLX6lAfJ9Q9yWfi9zrEQvs+EqmZBY2plzQCRGLGraUFTOzAAWwvQ8gJbCNattsvKSJnltzrT2pah0VXEcQq7jIYpfUfsKASz9OZ8nzHNczxWAVHIGM5dzHRmq0M3HYnENaWe1cK7WzqWzuRyrVs9ciGJ99OppDWiuLfkx5EVef7jKovUUcPmukBmPUfg25/IV7m+PnQUnV+FTMOyg6xRwaR+7zebwVJtar/RzZbKbe5uFQQWkUvxL6BG5l/YB1vnmlrJ77waX6vLY269Dym7aeCt6udabX6m7fbe+3sImfUe41obcUab2du85oThSuNZtFyVcc3fxuLZvz6XF1lW+7ypu99wxgM19sB5Da9lo75PNfjdcY935ezO2WyWuKWC7r27vKIQvnltL4rv6NufNtKl+p3WZsRsYGBgYGBgYGLiMr2Lgly8Bn3gXjfI+8FgS8ONfBB7O73dLBgYGBgbeJbzWCt+GaGQGH0SBqUrfhjQt5PCGLLWEYY+M9cRr12bQEomFKLTBK6t+VPXvXuBYEkaKqlR/10NV5dlRKhNzXeXvAztrfj93zCS5yTYBKwqNQrHBxjJxHV9oQM+qeTbEy56iRvPGukBpDXwqwQNzblXx6232eFXfWCJf26v1UW5JXFUb274uRsVjCVyvaAFa5S7nVnmrRaYs6h8thzMwa5vydrxqfbnkdKO2Ha7fNvBp/2+URlbJq224FHymUJTtpY2+n3vIbVvkvjDn05K9tn2ap7EqB3Oj1gVMgFfHxFtcXgq4d1R+jSof2ASf5R4y6p7eAg4z5vXecUQvlf63eRmvWy4yoeTsLYeoYjIzCJK7lwNQc/cWxSbgiWE5DgxMDyyWvyTq0hBYLH9LnlY+SgHhkJEXAquithCUOQfkOYAOGQxgmSfEKSGEJORpokrAAqKmFeESlVy5VO2Kw5SRThFYAsK9POc4raRxPktu4XDIq8VxafN0SFjmWMlmzgFpCTWHrxX/WzIXgKiVz7H2kyAELCDkbEpTmQIId4e58qMplRyLS0B4CDh+gZDugHTHoIVE9apkJ0uOZABIS0ThZUWNXDBN8nmeJ4QgeYZjURc/vDxA8v0C5xcHEAF3z87CutKaGxkMYMoAAngBMAFMGUgkFsxzAE8s5+sU5KLS811z+WqbCbSgXSUQUPMj107UAUXN3auErxDI9ZKRQzKAjFWR9iq4RizWBUJOPVqfL7eSi3K/N6STfQZocy4RKZaAre3bscZ1drpk9qtzfs7t3NxZ2EPOeWC3roIteUTNM6y7SEznPaMUrt/XhWBm3O3/ncUvjcuIbWNRw5J95fHP9+okkVqlt1PX1nKqi0YHWh+5MbPuGT1lrlcS2+/3VMV2/vNTgKmP56Io7rmmqDOHfWfrXOOsanG73b5fWdeMzkLAZk7zZdj9olOzZvf/LfdeRx0MADRN5v3ZzbV7VtT+nbhz/26g6t7mXdSof9eGNXX0+2L2Lyrdpux5Rs0TnPcJ8MYiXh1I9D4nqrl/tX81J7Bt58DAwMDAwMCHGvI3K1/+22TgKn52IvzGFPE77xmfCeM9amBgYGDg9cTrTfgCQAglkOwmY0vYKhFjA1z2ew8fKFESF+grg2zAR8mjpgxHKu0pAqwlowsQQ1/eei9wLhi1WsiGldC1lpF+jBQmEMppx0ZxE3Q045kZErmMayC4l1PPBlvreUgtcQwUArbTXwor0QCIHXIMLVHug5a+r94CuumD394J9Nq21DId0WCVzDECOUgg2QZ8ldjs5RDUMfRWxk4h7dUttW6vLNYu+6CrD+LbILU9VolXHwzv4VKA1xPoStgmu62jDtagLuethbQGyF3QtK4FsIF/S4o7y0p/H0mAdc2lxzaYXG2l+8okUeuZe0XPV0/53lOY130YIbGKMEG5WDUfCnlriLocqSHhlABuyN9CysUZoMVc3oWV07y4iAwERp4LKXOfwImw5KkSuRSzNF3Vt5mQUsDd/YycCcs8VUVviKkqV5cFSAhV0TpNSQhgMwRc8tFyISSZA7LtG4Q8TrOQx0RAiMX+eMrSFuVFCJimlSyWvLfy//N0LwT4lKoF9aJKY6C0OeEQhYBdEopSGQhvRUwvxF47ngBaCOmegDuA75OoajOVXMEAAguRDSA1CximehmcTwfkTDjeFYvskMX+GTLOKPbbnCSHMS9SbrxLCMjgwGBEIXoX+3yC2DyfAupAJkJVIKtqGQAlgHKQsgKqYpgjIyyEsEBIbQbizMjTSu4yr/edWkCnUkbNCezJjcfALgwqC5Sqza7dpwczB9pFUJZQrc8HYEsQ6feZN+SWnVvVmlm/3wRf3POxsYBXW3j7PN8jie3zRZ9vG/awQ/rqnLRTHqfO+PUcQeycp88sO/erU4Zvr352z+RenRTyvrJUCVpDdIPzqqA17xp0mNb59NqiAVP+Shx3iF6/357S2RKriuzmwdLf5rP2ReEtk824t7mYC4Go15K5Tup17/tkrcDd9bl7fvaU5vZ7e43k9RryJGy1Ynbfk32X7twH9V6zuXZr/Y78dfdyF35BpqyIKpbUvJ2v9xaNluNqPd37bW0z+/bruLj9PGqKiBD6Dj905RwODAwMDAwMvPY4PZzwLf/278PP/0U/D9/4r/0rg/R9B/ib3/m38Uf+4B/D3/vX/iXg637u+92cgYGBgYGBV8KNUa8PPkS1VtS9ncCGfl9/gJXgs4RS7gRy/GdgJSf1uL39mkZ0ytjbr2cbR4QeubRb5rV9YYKEF3cyClAbjHPq1WZ/s+9umcB2zD32SG79zpPK3faY8nv19Yhti94xPih6idjs1XVtm0G1QrT1mLI3RG/vvGTu98MHrveC892GXVC27LR1T72zi0vjvnvMPtmzh40F5LuAR5XX29cr9QtZFpZijZsAVVFWy+byPwc0yt5ulVnyqbKxS672u2pJDPkeVNS/wEoWouzP5UcbCEj+22k9D/JIW62KQ+AifpW6Qyh5e90qWtaym42oHeYspGclhssCES0bahntFinIo1QVvXJAKBbLWctmIXZDsXGOQX4YqIRrfCDEU6kzASEBYaaihueWfC/t1j5zDvUnV1vmYnc9h6KEpvXwRHV89ZwBENI2u+tH8/Qasr/m7NVzq+MI9K+RsmBgHTT5Ic0H7aqsiw8cKLs1IurO8F6hV3bnudG1fm32N8TLFWzKuHBMl7Da28+Xs/fsu6C6bJ79t8zJe7hFnXmj5XIXe32zquG9cvYI3B4xewkUWoL1ljLt9nf7utZ+XXrPeiw6qvBa3Zc6OKjXd1gXBuzfk/n6++oN86hHXwHfGVtt66sQp/6d/pZx9uT0Y1wRHvl3wMDAwMDAwMDrjZQS/uu/9jfwd777e9/vpry2yCnjsz/8OXzf93w//r9/8a/ix/7O9wM/+LnLKfMGBgYGBgY+oHitFb6UEghpDcBYu9VqZdv5XFUSylaUzzYuYgNLlWyl9Rir4q2EIfqr/ReTr7CqUAzxrNsuvEyQXeGvtnB6jKqHijK4hnqyqAdFGWyUNBpYU5WkU15U2PZ4e0Rvv0gEHM3l5INyGrS1eXMzrzbKmUWlQQGwOr+O3WRV8TZtLYrkaRL1bkqreqWryub1fKoS0yp/VP2iSqiNUqV8PkxteUBrz2jVrHrcQa8XUWTwwmJXqGW7MaznqVr3OcKko/KqdsgptQo07UtKa5t76l+7rZTTqIx1X3ddNJ+tRbaqd0PbblL1e091XNreLC4weYrbfpkygzsnmYuVtlgnUpOX2Sw80LKs9XVZZMH+GWPvwZ5bgLGD9Wo5CuRUvtsAMgVa64hiR89VwFYIRuaax1zJXjAQkiiAl3tUe908yf/xDFBirLlWGXyK4LsFMWSxR2YgnwLoLhU754AwZUxTwrJEcCZMB7FtrurfyHj69IScA5Yl4HyehJTMQJgY05SxzBE5M+4OC5byPEpJSTchgCkyUNY3xJCwsNSHKLl6D3cL5tMkVtIxy+V3zOsUoCRwIrFoplL3EvDyxdGUPWNeolhBq3QaQE5B+ntcECPj/jgLAQzgGBNSyeU7Pz8ifGHC4W0qNtkrwX78AmHOAfMzAqZCvBJqu/R3oMw+vJK3RFwVzfOLo5DgU5YpJxMoCnmtOX2p2GSrDXN+MYHmADxbinOAXlBlgUCx60Y0uX0zxIb6KC0KL4PUNzEoyXzCQa41BFkkoLmfOQJZ5069DahdbECVXJZrlhjyvL62cOMS6pxuFkXpPdyzq3e2+t7toiohYxQrZd3dKQrt983zZ0eB59W/q0WzJbpy46jRWsK3Lg67i5OUuDOL16pq2D9bdW7rPXedSwVnBimzbxWgwPrsB4DsLIX1+zpw6zy4Wi+7eXUP3h7aKWKpI5ysFsb2GPM+s7F/tm1slMxFKTuXdBp7x9i29j4r/DveDpFbFesUGttsfU/g5Fw4gPV9x4wVwY2BwiqwgXruNuRn79zoe9IOUbxLyhbb6aarKbWL1YBtGzy8U40eY8vqbPPtaqzRrdWyT9tgrZibFB63qsS5fS7Yv0eaxae5JYWNothfy9XaOUbQYarvGDRN/WdOfg8WIwwMDAwMDAwMfIjw9tvP8b/5df8mPvNDn5UNv+cPA/+3/xT4f/xO4Cs+9r62bWBgYGBg4LF4vZd+k8nLC9RgCU9xE1RpLJ+V+FVyJ5jfgS0Bo/sBEqjWbYpbVId+db8NACn5q/tcWsmv31vCuLYjt9u8ohmG0LKBSxu8u6ZU3VOzAvsqUq9S8QpgO77XVKM99HL17uUPjB1ie68ve/V6G+dryqm9sguBuquq8WU2doFhGyz2lqZlLKtipkcWaDk9a2r93n/ulZPS+lPVWLzdr1dHTwlctjftdmj61VN598iEC1av2/uiH9Bej7nw+LyUP/NGrHaut+y8flQC2BJtuo+QcWtObyqKT85ijS+PC5J95yB5dRngREhLyRmods7lM6cg1sKVtBRyMnMhKHX/wIiFsAyBEUoe4JTcOGq364INBsUsbdI6inpWlbv6+OaiXvVKYXH+5ZUwVRKLuFz+vCpmAXCpe4oZd4cFT44zmAkPy4S3nt+D3hayt5KcsZC+hWQNMxDemuTzIa/qZWJoDlwiRjDq4zr2hcBd91/7bT+TKqozAQshvYzymdbx6V8rZcz0Igl6MpWoK9dKUKJ3PYwSIcwols+uXHutwX2uZVLXpf9m+PtQn3GB6s/us7Gjgq0kVyVK12dmF3vfm/ud3Xzryd4uQl9tfBMJd8W54NLvm2e9exY342nn9ktzzxVYe+HGXcWjV2ZvP/9M9ypd22bbL7N/szjAHmMWEVxV/mpZvc+37GsWINW67OIydK4HJW0vqaBtWb3UETDX5i0K8lvssO18an5698DmHtyDXZTl0LvHuved7UcI6z1X59orqv7HqmXLosvmuCvvBI3VtekDsyxcq/3pOQztYah8BwYGBgYGBgYugxkvnr/A6eEkvz+cgR/9CeBPfDvwl77z/W3bwMDAwMDAI/FaK3w5iPqBkYrKitbgSnYqUKvIBQzh27FY66lKdTX+sojiwub11WNs2XtoiOKyol+VhDGuBK1X8jK36uCNUkQJaaNi2bGOVAWRVQ01ygir3u3l7dtD1jy8F4KeSgRuFFp5JdOnqSUMPQnXi13Vccr7+6hCNfP2+rDt60GV3XotqPrUqceu2UXXY3Io5DNQ5aka3A1mDAOtSlv9rrYht9spACjtyuv537XftiQI0Zqnd9P3gKrM1fY4NVnNv1eYRKsqb4LWVlXr8xDavqoKzeY37o2rhVU323q0PblzPfVQldWtdIyIWg6LSk7feS7lSn9uIXk3Kt/tDvJ/cgs7GPV8M5Hwgar01UttAqr1bgas8lJVmXo9UwboHMSiuNgM106eS3/uRXHGScjLEHK1O6ZAQhgnyd2r9sk5BzADh+NSHp20WjkTizXyBMwPE0BAOC711FPgVQ0LgCIjRCE3cwrSt0IAr+NV7q8UAWKEyXYaCIGhzDkRYynktWxP5byZ+svvx2nBoVg5zyni5fmA/ON3uPuJgOntlejNE+ozhzIQToS7HyO8fLaqofW05pmqTba2R8adkBeSNhdlLxGQk96jEEIXhSQOYjstql1Ivt4AcBRr6jo+9n9a2wmG5GlOqOpxQI5v7Z71PgcoC+EbZq7ctbQLVb1beWNzCoQ8ppITmK7fgz305lXW8xrbZ6YiQQhA2pJNXSJVc4EaNZ89tpsvvR7vLFi9arCjjNwjkC+SxL18sN6d4hoCmXeFWN8BWkWwk87eavffPM87+XIvEYbX2t5zZ7Dbqwp5WwfFsLotXGqDzcern5vcu45w1Xp7c38OzX4bFbruV8qtyl7rpNHkEW7rFiVzpw+3znV+8ZZ/n9n0p/9OeYtNub2HKMb1fmmcU1w/L7S/yYtdcuzuzb32vuXG1efKAsve4k89N5fIYd9/21//t4KvI6zOJ5u8vv5Yzf2rC04uEbuD9B0YGBgYGBgY6IKZkXvvkW+/BP6dPwz8i78U+OTPW2PIAwMDAwMDH3C81oQvACDnqt6lzMI3pSRBZdCq7PVqV/+7JVaLjWoNxlQSllsSFjABKSVc87ZMLbe0twaDdZ9ecMgdLyReG0RuVBGhVRIRESgEsAlmNQEybbVVQtt22mClUbDWoLCzfpRjolGZcEv++v2yWgrvBJEpFCIhbdpQf9djekEzC7tvzzZ7T7Vk2+StMTUo54Putq0awARq/xsb7cUFxoHWItpaN9fxU0tntSUPbVxe2wWsCrwL6mk+z1sVbYyGfHbHZF6D24YEpsNUiV+yttFKNFvCWIlcaw2t1tY6Psn0b08Zrt/3FE0uML259rMQfX77Llnrg8IaaO3soxavrLbZnbayveZ4e02q/TQmSxq554TeukqyFdJNFbxVcaqkHAM5AiEB1WI3AfElIWUqRC2BAiO8MYtiNFGxThYlbAgZIEZaYomXZ+S7BDAwn9fpJJTzrapgAAgxYyNXLorWZSlkcQDSqZR9TMUWmpBTyTGsZGaQ3LqaE3g+T8g5gKZc1cNEotqdzxOo7Kvq2BizWFJnqrmGtf0hMO6fnHGcFkRiHGJCAONzLz6Ctz//BPc/EkEJyMfShQiwIZjzYR3b8FbEOd/hyVe8RM6EZYlCVjMhzREhMuKUQJTBRFhyLG0VopcZ4FT6FRkpCSGcE4myOpGQtqG0oRC1/FCU2Qeu10lto7GUxhLk94O2H03+5qr0PWaEU0B8IISykIBVGazXGpf5NmNVl+s1mgFKjDAzwqyLch75x7KfUwC5niiU+6kQtNbGljqLMEy99V6tpD9vrGEtmu07Ns5r03L7fFE3B3027CHzxvq2bURnEVaP7O2QWc3c7Ra0WFvpm2EJ3VhIY5vGoEeE1gq3ylzb9w056xcKeXgnEkcarv3baVOvXH1m99I0WHL0kouFqZP8fOqOrUSwGVexny6LGh6LWxTRlti+9A7UQe+dUrdvynYLHeq16Odr975ZEXfeXUt5m7rtfmaupnXH9R5tng9mztXfdX+rvl0rWL9XFBtomibwsrRpZHp/F3hlf8qrZTORvBfmrXtAtWv242DSUPQWuwwMDAwMDAwMDKz4E3/4T+Iv//m/gs//xBf6O/zl7wR+9b8F/Ib/OfCLfs6XtG0DAwMDAwOvgtd7ybcncCGkr7Vv5tAJrlwrC1gDM/qTXWDmFhs1C28ZZ7fZNtg6e9gNLrucpu679wR7atD6vSOF/fh2bRd9IFsDbJ2g2mNhyf9blC+X9tkLOl8baxtU7QadTX+9veQt9djybwzeb/Iu9tTAHpXIpfa40CEjesdaPKZ/Wldn/01Q0+y3JXtbxVEXujjjkgLILt5QvFtKmhjAkVblqBK74YItru6jULLX/m4+a15f5JKrtZDKISbQxMDElewlK9+shKCobylydfRlQEjjmNttxr4YUHVtefSWhRGhWBRz4STlUchrfabjEscXe+iqli0KYlsPl+NqWQ7BHCOkc8ZxWnCcEmIhaBYOePnyCHoxIZ4K4RmxWjlrs4hFIasc34kQXkZUG+uQ61hybnP31rYHoJHHYi3bbmPNx6vn1do4ZyGGq1WzjlFgIYj1ulDy157bWp+pN8g5oAVoyGBPVPjrktf/iWWxgZDB/O7MS5Z827GrBXC1rm5O0B4693bPRrZu9/OyPf5a/4vl7Hb7zs2/ea52iL0dheautfKlNvYWffXa0VOzXkB1H+kt8OnBWhp32tsdw/cqn+mtKSlusUW+Bm9dvVdmz+ZZ979mD/4qSnzFY+5v72rSfBeuz6k73++mYugt1ro0zz+y7q17gF3weKUvF2y11Vlgs0jPktIDAwMDAwMDAwOPwqf+/qfxXd/x3ZjPc3+HH/088Jf/BvA3vx/4hz+8Ou297mAGfuCzwA98bv27fWBgYGDgQ4HXWuFLORcygJvV95bkVfKXY5DPPiBiVQZ2pX5jO0ytCkHLUFtn3TdQu23PDs6R1JsAULFqs8dQEygWhRQBVfXglUTIeVX3BpOnTC2kYYJhRLKvVVtY9YoqXCisdnjANsBo7Q97weDMhbzKoGmSepckKl42CpaN8secl65ihdt9PDZqKDIvaa7Pvl/exjIrfVX2s0rUZh9XjlcfIbaCHT0mmSB3o2J2JLEnZR8bwK62xaZcmws5QNpoVbgaUK9JPf11G0CTU2N5lbAdL6fsoWgVRkZS1bOALmUz71hzR7evXpOGFGjVQ6JqtlbY8PccAIqxqgBXS8rVStLaQIvlsx4vdVtLT86MqmD3CDIWeZIfqzjKkcCRkCchfplEuauqyqq8NKDql1xUvpD9wsI4fiHgdArILAQig5BIFLYEYDqk0k2qJGU8JITAmKaM8xkAE+KUy2OPcDzKeckpgIoK9/44IxaS9zglZAaeQ45lrOTtEpUIpkIoQ0hKFPI4EZhF3ZpiqFbRISxVUZyz5BzmLO3SNmj7zmd91hByJoTAuLuXPL3MwJPDgrtpwZNpxhdP9/jCy3vQp57g7gXpYcXKuZzPYtHMhHLvMGghHL5ImJ4TXn78Dsf7Gc+enPFwPiAtAWkJ4CzK4hhFFhsPSfIpMyFEBgcGiqUzJ1Ffa95hAPU7eSQZgjeW+9R8T+cAPjDoPoFfTKBE4CeizsZClQhelcBle7nIwln6AgLyocyz5eswF1LeLDAIqYwHkdRvHrnviOztKUN7Sv89daEtyih6KyFb7uc99WKjnLXHFRvoJnVCcM8Zp2xsrG21TcHt66DPGKsSpsP6Kqfbm2Pdc7dJ67Bn1dw7R9b6Wcsr27kX+Lhl4Y61FfZqWpRxBPfnUHucrdO8vzR99PO1gShpHfGYTb29BQW9ede4OFDPCrr3rlB/387pavFc5xPrdpLNdW/vA2/VbGHz/VZ1tvV07ylyzXtHnUfL+AbsX0OmbOtAo2rrxma7p+o1czAvS9Mun+tWz7PeC1xUtvWzK7s64fj3gNrnVS1bDjbvQ+1iMrapWUJY79H6t0FY/5cv2sVi9h1Wy7RlnCWVjFX+c8qN+hcxrg4raO9/otX5ZWBgYGBgYGBg4BXxu/6vwP/9PwX+2O8CPvqR97s17xxLAn7T7wX+xt/tOyEODAwMDLy2eK0JX0CCzpTb30EEKkEk7gV6XXClIXv9fvp/T4HaU/2qMjRjS/paArlHTGoAqEdK232sDRw7ZeOeujeWOjsTuSWGazBPJXa13I76whPDe4H1euzazsY+UonwnuJ5r1+NssW1yZP3uh3oa9p7BK0NYFaC0Qec0bd61I29fHi9PHW+P7Yfvg2+LAufH/dVVEyW0Lbt8oFkrd/nSryUA7AHHQdPYF9TV2sw3CqiG5Wau4fsde+D4XrPpm2QFCjbfH5eF5SmjuXz+nm9viispO9FlAUk1bGgWDUDqApJYiAHqttV0KlkpNo4W2tdBZfvKANhRlWKUrE3VvWtVcuGAMwpCIkahDgVK2ZplOT2lYIDlaUh5nhmQmYupCoJwaw5fWMuw0a1DdpQLmpYVehKP3n9vpCdzJB8tyQELpWfOKWq4g1B8guDqaqQtV5A8gwfYsYhJkyUseSAt09HPH9xh+lECIuMLU8QJW/Q8eV6bljPwQTQXL5/64CZGG88PVWlNBUSm7AeL0rkNQ+y2ljLd0A45PYYS+4uQjojoObmXVW+EHtnzc+rl1nJl1yP18IZUGtmIbHluLCgIXFrW+r5Qt2YdTFSuRbXXL6QPO3vRD3oIAsonOJRvpD/DCHUq7cu2LiSU3dDAmku947Sf08l3CwE6bSjRzI3JKt5tmzapfD9dPPBxuJ6h9zda+PmuFsJ/J6F75Xju231+/fmO5uL1+7X2wdYr53ecb6OXqoK+N2pP0faftgyevtpXZnbxXbAdQL5Urv9ONjr5dL8Xd8nnb30Xt3YkqzXrpVdp5qu3XRH2drJpe3Tndi6GuLYl9U2zLXHvB+Y3+t7vHfz6TmBbN5Tc0OQb8tu+ylEc9uu3YUqAwMDAwMDAwMDDX74Bz6Dv/jtfwnf/3f//m0HnGfgR34C+EP/L+Af/dnAf+8XvLcN/FLg4QycdpTNAwMDAwOvLR7BzHwAYRW9NsChhKoSNURbda/9fmPvxm0g0+blVXIo2Dpc0Eb301X816ziVH2rhKwlp2wgqJC9VknT5EpT4tSSwn6srHJJA0od9UOjmtGcrGWfup8Sw3uWgU3eXgJCNOcmO9VRRGNHbPt1zXbQjtUmsOkJShP0r+cxb8lMi26A2V1zvl29Y6zlpA329sjIvTb0ym3UuWYMeyode7wnPmv+ZbMAIMZtcNeW11M73UI094iZvb5rn+w5s9A22u/suOZyz/QC5JZo9gHlveu+9qE8O2r928dpq1Z6fBA2zBm0CLmr+VJrntQEuYetKEyJXgJyyd9LGVUJzOU7oPCFGQgzi9qTCXFK9YdKvl4uJGQsuWe55pENWOY1761aLMeYEYiNJbMQtYkJS4pIOWDJAfNSrI4nxuGQhORMAdMhGTUuRFW8BCFzgaJy1X4KIym5fgPyHMFLUciGjMMh4XBImCYpPxpimogxTUnI50xYZmnP/XHGXVxAxJhzxIuHI9Jbh2rlnCcgT4w8rQTmhsAj2UdzKE9fCMgvJxynxRDoWX5iruOU2fZR9oslh7KkDM+YpiTHlG3hLoGOqV4fKBbbCCj5eAuxfp9Ah3IxAGBiyScMyPU0E2gmURWjHKsXSpDzGVRQHyB5L/VRxOuuNe+vtbwOZvsUQMfDq5MSO4QUxbhDCpnn3N6zqTwXuypVvc9NXkw5ZlXgbnJpXiijsWq+kHt0D5xcbmDdlox6GJ1nlnWJuDan9lwQ9sjWbiPdXGK3e3hC1v647y9eM1a56tGbO/aU4rb9/hg/F3VcLiw4S1773Xb5/ez8ZdsOrOV0+tbkfFay2pO4vq1+THrvBrp9bSistXC3PJTz5MauR/Z2r/ns7im7IHH3/cjcRylv7tNLizHqgi59N23qNKSslmPJ3J49s30WdBTBzYINfW+wf7P0oM4DZYEJ+78Lrvyd0RwzMDAwMDAw8OEFM1JKyK+aquLLDJ/+B5/Gv/ctfxDf893fe/tBX3wO/N4/Avy5/+q9a9jAwMDAwMA7xGut8GVDlFbSlxk0LzVIQ4uqLU0wpWf/67dxiVwHw5DY/fZ+t9s1kEMmUKXksQaPrNrX28ntBIJoWoNEZAI5nPPaUio5OTXOZFUTPeu4zGBOa2DwaCxwLf+sn2uws2P/p99nE4BdbACORXHsVTme7NVy7LYYWtvj5ti8WvfmZUto2vpyaL+/qHKKa/DXj4mes8xo7I9t4NgGXpVg1vbEYu2sx1ry1+cl3FXBps156hIfxba4IZ0vBlEdQZLLYgENLtvgdIzr+e4RysGcb0uw6rG6n5ansOUltG1tyF20x+j3FIAIkCF/G4tpxbxaQ9dgtVERS7Cd2/tV/5Cyv2tgN4TGclXaXxZWBLqq8qVi497k8E1Sf55WS2fKjABCqirK4nhQuskRyHd2bNb/i2MywlnIvmVZr5mcCTGueW3V6ljthNMShEwmYH6QaWS6W3A8JtwfljrUx6OQqcyEaMo6nSfM5zL9ENd95Hs9D2VoGUCQXMHTIcm+dZjFVnpZAnIKCIe0Etrl+HmOZb+Eh/MBzBBSuxDTqi7GlHE3JdxFOU+JAz7/8h6nz9/j8GOTEOaFxAQKka7jPpVLmwFkVPI1HxiUCYe3CelpxIvTsVpQn05TbX9KoZoq5GLFHEhOIhGQTxF8DkiFeGUmcArl8isdjgxMWfIpJykDVLbHQiAX8p2DNJxTKONb2s0Qe2oAHFnsnQlAJtAMhFPnYmWI04YSwOVHFiSs1xmX67Pm+X2VXNesA9z5Si15bUoBJcvqwixjua6pD3i1ge3m2vSWy84pw9ojW1tob+Vsy71EvjRkrpJfdqh6z+vec7Ehptyz2JRNMZjx6aBDDq/pI4xy2sI+2/1zvWerXOaF2hZfbyU9c7P/Bj1Ss1FF8vZYn75Cy/FjqsfupazotKM6Ongi2dtW98Zey4gRjLQ5ppaXAL7mjuH77Ald/71/J6rXjD5z2vNdFbTVWcdUbd7X9N2he461LGtbrPeCJ0mBSnLuqdW95bN14tB7trlH/T3p388t+eufDXbSsmXahWB2IWbHdrke39veqbOml7DtqF3h5rk0MDAwMDAw8OWBv/U3/g6++Zt+M/6Vb/qf4Ot+yS9+v5szMDAwMDAw8D7hFSKuHyD0rA+NkrfaOV8KeFQZmVtdb+2XvXr4Ujt8kNKSvdcUTb4ubwlXyw3N9otBq8eiEICV9Lpmz7unIrXYBNJuGIdrbbyGx9gZ31IehfZcvoqKVcvZK//Wsh7T/0vlXmqfVSTdqury1wv1g8MX23FtXG+1Dr1WhlMt7QZGa2D/xnq90mbHQlbr3UWgDSGmVs4cyFk2c3UElnJR3X5FVUmFaKNm7Yr2KyQh53K1TS5NCLkobamqYAmlTFWiGivilckrHAILaal2ytYemplgraaZt2NUh6eQlGobrbl+m7EhiIVz5EYdCwA5hUooc2nXug6HTRmMGDJiWRAwp4iXpyPoFBBPMnaiWOWVVNbuY+1L7ZPZn5KQ6qd5Ei6YuFE/67hQUUYrS2r5BhkT0lO+1sXt/mvl7fg0cGME4rVfhfhtVNSZQLlYjOv82rue6mCsnzW3dLP9PbIcZXdf32Iz2+AKCb133MYW9p2gQ3Req//W7x9b76PIop5rQ2/7FdzUhx6xe609e2U8JgWBJ4rrxx5BJ/OhJXNvsvP3ZdyCXv7qW3Cre8pjy+7tU8njHaUx+ue+l2ah950t75b7sXud9ZS9e/B/M/ScdXz9brHl3ndNWy6gyT2+h6HwGRgYGBgY+LLB22+9jb/1nX8bP/HjX3i/m/KBRk4Z/+D7/iF+6NM//H43ZWBgYGBg4D3Ba63wBQBKec1tuaSW7KUSDfdRc0UIojZpFJTUfu4qf7VyQwCqEriSSbxVT/bsIrUcX7bPJxZjq/7U4FJpI01GHezJK1XUogTIVO1rgkSiqnAEE5EoeJZVxdsoOcrvVcGR09qXqu7VNob1e2u9WG0bExrllh+TENvyIrlzosrpjmKi6ZazJ/bqm0tBaqvsqapTqxxVFkgtH1UK2FE/aX15S5DWa29Z+oShb4PuE40qW5Wsqry1dRwcQe9VyI0S2lx/oRB+VhHk9/PW2BRAOuS2XY0audynlqCxandV5Jr+6TVHRNvxseN7KXcvynVslLlWWdfcQ2qVXtuLtezDYc3l2bFqrSq9zH0lVw+k1pHcChqJqk1wVWZCCFtRnDIyaLXU1VNqbVENIUwJiGdGmAlpjrh/eobm5o0xYwoZ5/MkRKO1G4aoa6v1M4Cp5N49LRGpqE+PUypKVeDusICZ8Nb5IOSq5uqtCl/5PE0ZyxyRTxHhLiFErnbOMgRcCOggl0xRI6tyViFGClTUs2SIYq59yaWvzFSVvhNlzDni+fmIlz/xBNPzgDADyxPph+S0hU3dW8YYlSi1+yjCArx86w7how84TotYNTeEMxCUYC95dXMuRDsx6C6V20TaylFsrNcCUI7z11K5/lKQcxcLsRsAzc0LEBAZHIDwEMCBJUcxADCBTjIGIQHp2C44IAbCIuWQn+LKWFCWn6D25PEGQmUPdk7RTdaNwCpIyzOWYtiq8my+3iukSM0rOk1CeG+UhcamWS1i/T65uCMUkqaxgy7fS1mOFIpmnEIoz+CtrXMlfso7DfckoYZYUxVmVeja/PKmzd3npn+/4Awg9hW1RdnJTNv5zNnsa59kfNI6l3rni06fpAD73DXzaTO2sd3H9s87dvTIYD9HZcZGfmvHA+t7A+miqD1HkXo4y3M1lduzmUPMe4Odg3vvCb053eaIhRl/fZ+Dux7tZ5vzmFZ1tx5TFdpGZcvBl2XV7u2CxQ2BW/pg75WaLzsEceYI7f3UKIC13MU5eAD1Ht22ySl7bbuta4869RwO7X4pXVT1Nm2tSvlV8bvmyG5zDzdtsAgkeXzt+7ypo7bzMYsgBwYGBgYGBgY+xHh4eMC//Zv+D/iBT/3g+92UgYGBgYGB9wSvN+HLDJ4CwLwSGntq1x5xWwMrhty1gR4NLFtY0pYLGWMDWjaQd03p6rf17CTt9s4qfrbWkS74u8lTpm3qKJ97Som1XEf27h0XLOnsxgm5HcsdpUyrMOXtPnskwcYaL/S3ezTB5wvBXUACeT1S2ZfTbZ8jk5Vo7vU980pS24CtL8/X7S2Yffvttj2lsv/d2ybbdlgLax/AvqSa8hbVvYUQPYWy6V9fnaPlXglsmjFd7W1Ltd7msTku9O/RTv68Nfi8BsAt2Su2zgF1ocIOOBZbZ6AodTs7FRK4fkdoLWALCemJQLXarWRxVfgyYhRSdMmhkrcEVAVqMtLOaWqJSwBYFnkWHKeEzKJKPS+xqoWlQEbOAcQEirmxkJZxJYTION7NeHhxLARoKPsAeQli8xxXW+ZlkT7EKDbJITBQ8t1qXl+UfoSi5j0el6pGnsr3D8uEF6cD6GVYrZvreGPNhZzrJndO1vHV32kB8DKC3wRiVT2Xc1HUxzr96BixPX8AeAkybnWhkZxItuc4E9TKmWMSUte1bQPtDwvRyyUHMCIDiRBfEsK89hco/StV+r5yWBcZEBHyVLarJfZOzutHwTwj1vsJ7TODtvPoxbkO2BLD/nuzbVOWkituAUlDWHlSR9sV0BzTFtta227IYtfHa/ORXbBV6852/tHry5G9e4uPNG+sh1cKX5snDXl4s/K2V6+fN4CV0NZ2WKLa7uvn3D23jN5861Ig1Lp66FlJl/Y1C4Oq9Xa8TtptLJh35n/4OULGhu0k0SPm7SH2nO4ohb3d96XFDcD2fmkWKFx6lzP3kZRfFkS4chtcU776926v+pWJpl0Ipos92k515/jd/th2xdjfxxy/WWSTs5zFUB8ou2UMDAwMDAwMDHw5ghmY5xlp6SyQvRXf/X3A7/ujwL/0S4Gf/lPevcZ9qfDX/ibwX34n8Nkff79bMjAwMDDwHuC1JnypjZA3gRVyASgOJDkwLVIWpREAhLAqhbMhRI2KtubfrYVq8Mp81ry/3grWBoKtClBJpB45rfuw5k6NbZnAGiANxtqtZy1X9tUA5yaA5vO4cQbHWBWUe4E4G7izio9av56TlIFpqmXXQJYlUVXJFEjIxZS2AS9LklaVBbeBwz2liw282W0VV8hhoxK5CB9E7sEvDPAqJU+u6jE+L+ymXrOvbrO221XR7tq3p+ryeYSRGjWKkBAsxel5uxCo3yhbfLttG4CWvO3t1wtsX7OctMR7atuyZx9pCZq2nfuEbaO403o5V6UvFfVXzQ/s+6U/hTysqkoAYIDAyEVBlSeSbcxrXlkl4TIbQs+QleX3sDAoUSF8DeEKFBVteS4aG2BLVMYoKt5UyFgAlSRWsjfngBlKbFItg5WchJC0MWSkSjwR4pRwd1jwQMeq2I1FecqJwEGVvbm0NyJGIXOVOCUTEVdCGwAiMaaYMRWy2BK+L88HnE8HTC8CwuLIEZTxDQyozbWFPvIjgxaqYx4SIb4sauKSm9djzZdMsPbXRGJVnbOcOC4kLgWu5wfEQAoyH0UGTYxwTDJOWU94OXfmOtL+KDFc8/ZGlm2JEE+EeDbkQimDzWfYcrHuW63FI5BL7mk+TPsLK67BPsftIqc9Ys2TT/aZ4Y/pWbnahR72OWDIV7JzuT0OgObzVTKtye1t7FjJEkwdBa+iuhtYNWW4QojZ/vaITqA7JzUOHrXJ2217aN4JLhGIvUVLdu6/NKdo7ua9fXxOeGCzuGujbG3GycGMk1o0X3Ru2CNDVa0boyh5M69uGL2+6Pza65tbQEc0ybhfIog3CxJ3iG2LZlGav09Wcha4QGi6NnAwcyVQFlCZd1oHS+Su7WqP7+a2dd93lb497BC2qsDd3M/22aRl76mY3T2/3wTavickccxh/07iFp0MDAwMDAwMDAy8B/ju7wP+5vcBv+C/85oSvn8L+NY/9n63YmBgYGDgPcJrTfiyBleIwFGDplgDHkANtFAyxG1PbcLc38crgWGCojVgZCLdNojmg9LWpjnG9XtP5FrFoCWM1CrO9k2DbNNUj2NjVclsAmdTABArgVzbWwlYZ3WINThlg8z293V/bkkRq/ZFFjLXWjo3Vo55JXs5A4v9rqAokhqJmR4bbH1KrlVGqqpXELAN3u0qdlVNY8+9UwLV7W6bfs5LP3htyXUKK6mp50HtsG0gsaf06AWSvV1kr309ctcQ6RJQNQF0Clv+mgJo6iie9pTbeliUcy8kCaTvTR5oZ5HtVdAKq3ZSm2pPhjtlUSWrDmV8ih2k3d8GcMkQ27X9NpithE9KICLZ39rEArtB3JrL0SvZFSGuxHog5EOQ5xOjVZwSFctcljy9RgVMsnuxgBXCLd0R4klyyi53VPL3iqUzTqLAnUIWErdcl+c4IavitDwX8hxAMW8C8oEYU0wl9+9a/yEmzEn6czgsSCkUtW65BVNAKqrXEDJCzEAhOFMO1apZBFQMIlHtgoHzacLhKIsx0iLXRYxSPgDcH+eqVA4hizCXCYkJaZ4wBSF97ycp45QmPJwPWB4m3L+k2gnJx1sI0XpBoKprOa5jDUBIdAIwAfkg2w9vSTumkPHRpy9xXiacliiW1lme1zrGXMbz7tkJS7HJjndJLplkn43lHEyMcL+IaP4sSuBQ1MDMABUldn2s2cuu5OnVcnQbRQYnRnyAKHy1z2WxgFo1K6nNE6piPE9U8/1SMvUR1sUMrwp93nfzqKaWgFNbXJ9vvrOQiTr3q97fADYEEtltTmFYj++8bzT2z56AMoRVV40c27l5b4HTZsGKLhiisJlPGqUv1neHepyWu9OmBmZ/TrklWZvFcGaBmT1WVa52Udqe0lidE3okpXPPqAS5Lae8i7CmFFD4NAg78zx15uV1/ui0Rd99AhnrYUaT+qCOg3k3y7yeOzsWPSUzhfYceVtsvwgMwO4Cteb9EJtrq1HwWnX2zr3tr7NtfeVe8Ne4Pda+39uFbM7SuHlXtmTy3n1rCVLm1aq5SQtRykxJ0jgA7ft7+fuhvju4du2SumVxY3PNm+eCXfBZCWa7WEQXrpIsWOFemwcGBgYGBgYGBgYGBgYGBr4s8PovAbeE7LX9XqW8vEMIXqvHq0e9UoFou03RCRDtEUia725Tv8eewmCvrF6As6eUqW3uqz0aYtN+x7kNgj4GXYLMEQi96+LaebSqSo/M7Tl7LGGh19GeaghYg8G32DZesGrcxY053Dbq21uO21ML+e+dPfi2cqO+vVS+3XcPt56fR15/zf1z5bniLS2lOnNv7DUpBrFzVnJNtxuijnUxi21OWXvSHKeEJFFZ9FA2F3K42jovVLszxYwYuHDuQhwSMULMokojhpdZCTfEOJRcuuutIiSuqocjcfm+HRfNt0sot1lR8majdq3jUBSvtS82v3BVIa91eOWyVdJqG2PIyEw4pYhlCUAiITOpEBQ6dvpTC1t/GOY7Nv9pPH4p5DYTjjFhilvFPpUEy6H0sY5VOVkU1scbM4TwVREZoemnWkW3FUCUu9F9wVivEJNZAAEAAElEQVTX05TzSzEDVMjeeh1tx4DWYa+/A+s1arcBAF+wKn0Urt27fu6xX72CwvgS2XmTohGOyHTHNzk8XRt3XQZ62JsL3Fj4dmzeJ2w5156ne+8ENz6nfd0Xx/Mx72TvBI99N7F4jLr21uMvOZlcw4V74V3Fpfldm/IObYb9fbJtwyv0s0eK+m3vBXF6w3Pj0nh13VIGyTswMDAwMDAw0MUP/+Bn8He++3twPp3f76YMDAwMDAy8Z3itFb4AZDV9UZuyCYDxJAFlyiYybgMgvSCLJQkbhSiviiJv1az7Wbvnqi4owfwY5Htb/xRRraBtXa5uZgaFosixlm4xolGrmhX9FMKWtA5reevQUZu7z273RFVRInJV2mINLkU3No26Kot4RBXEahOp36lKtAlEarlmXFTBUNtl2QlsA6iWON0Lcvp9NkSnI7pp6gdhtRzf/718t732qIrHlh+Nik1VyqqySmlVCB0mUZvMi3AwbOq4FFgOBISpVRwDq9iHs1F2Y+1TL+9woygp9ds+W6gi1y4kUPWXr6MGMN24+cUHnjerSueltN+oyn27Gstq3KzsLV+s58EFZbf5PV2bLwV69RkSZWEBMReylxEWIEPuXVX98iEUy1xUgjIfqDz/AJ5kf1biF1zLpFR+ZsKyRBynhGfHM17MBywpYJpSJUbvDguIGG8DgM3HCxTF7iLHng9Ylljz/gZCtUueYkaqiuG1yykV9eskCuH4ZAGR5APO1eY5gFnaE0rO3+kg+xMx7u5mqG3zYZLCT/OEEMS+We2iDzEh1TaXcijjeTri+emI5TSBzkHGLjLyAXX8rDKWLWnKVCy09Ryu/3FgEAsjnM4RL05HfMWTF5iTqKpjlOek5h5ellBzGudMogBmgEBFoavXLkCnIOrejyxFLU1AlnPT3BZMQGTEMr6ZCelUkj8TROGbS6ERoMiIU0aecrFzZuSpjIOS34yq8AXkM/nLPrQLFXIk8P0krhSvAmaAxS2CpgOsTbo0wjw/6rMnrgtljMWz3tf2/t4lHa3bhiWUvL2zUxeuSs52vmK0OUY3Vs2lbMrrc1hyI+daRk8JuWl7h7Rt1bNBFIG2vAuWzet7g3s/0P/Ns3y1nXbzUSAQmfNvbKwb1SYAVecCWBWkNh+vnTsv2DrzXjaEqpjdUQnfMpea/a0Sk3w++d783is3pdX6X8f7WooxqwrW1Apxve6rChRh+36nx9v21EVtrp3ZpRGJ7f0i26KkwLD22OgvMKiwyvbU3r97hCdN0/a92ZS1ufd6RKhe/1qPzvF7yl/d5p17TD2s6T9sjt8QWqWxLY8Im9y7rt/13cN+H0N919q8m5TfKUaxfd6VVQ8MDAwMDAwMfPngT/5Hfwr/yR/5U8hjcdzAwMDAwIcYrz/hi5XotXl7KbMo2IKqtKglVvVzj2w1VtGYjBLpknrWB6R6KkAbbFIi2u6jwRzxLS39KPtbG7fG0i6s2319uu+OWrLGf2yOQwtrv2jr6JGrwBoctcSlDyJW+0Relb7AGlS1RJg9R8Yu72Zd+p5a1JaRO8G8XjlVldwJlOo+EW1/1J6S87YNtc5CNipLsmdhXMnYspDBEqCaRzDGlRh9jCpX23BNdOfz9+3lGfSfL+3fw17b98j2HqHsv1PrbG+7fUElZe2ngT6p0rbvBkIAWK1nvb24L4uLTTPpM45Xco4g+XpF0omQGBkkRZaneli4qjGFGCZZ1+Dq5CAKzniicnlTtXAWwjHU229OUVS6keURxEJIMsmxSw54fj5WIhUAzsuEnAmHSRStx2nBudgYUwBAQkLmJPltl0VIULAofnOytz8X8jevKt86ZHKstC/XezylACKpW/s1xQzKQogeYkYkxjlHzIV05pcTwplaclOaami68rt/9Otlrre1nrZCjvI5YF7kZptCxiEKga3Ertg7B6Cof9X+Ggzpbyzzgqp3NddvRhk3IWtlGxXlLwNBVM3LeUKYlHCQ/aHllAUD2sWUAnAOYgOe2776fL5aXFU7RzTkuI6XJ4RfCXXe7jwTegt9zL1uyV1P8HaJpcwlJYGzMO8QQtes3Cs6pPNFxWaP+Ors3yPgeujnEe3Ub3P9ljG0NsuVqPbPdv+OsUPG1rI0t/zefkoA9hxDrHvE3iKv3mKhW4hcu8+lBWRNigZ5b2rmaNuvanF9uV4li71t8uad6lq7gebc1vJsm/y73qXyO4sGyLwbykKkzmKvXt5o7Fyj2h5zzXXvzfIu3JC7mi4lpe192CF74VXtPfi/E+znvXv9Wpk6qZVcwLKpLbPbb7fgDHZRgf6NYf7G2dhKDwwMDAwMDAx8GYM5D7J3YGBgYOBDjw9HFMCrcXVz5jboooSh/blWpqp1KtnoiGJ/TK8tltzVVf69wBGwKgtqfUbZqscqUeTVR52gzsVAVubtPr1t3aA6rz85oaqZq9KHW2JdVaqc131tP6x1sFdRbzu1Pa97CDvn259PrdfbJQcSdXEl2ksg0VsdqxpGg47W0luVNj5Q7ZSl9Tj7fbeOAEyTUeDYvl64pW39WnYJtG9yJZZ6q82mDxz32n2JsLjWLi3zMXbWzWKE0P6u/dM+xzYY3w1m9/qgpMYN99qmW53rkn29t1hbEpX8sQSOJU9vANYEvfKZMiMYFRjpLUmy6IUSN2pMm1M1LEA4ozJ6manaOOeiFpUY+poLNxbr5lzy4wLy/Wmemls3pYDzSfIhxsA4xoRQytWcvdMkeXuJWOpYiqIvkyhWAcAQvDmrbLR0paiNhRylSqAKYRxq3UpCxyCW1VNMmEJGIMacIpYkuXLpTAhngrXAruPKhrh0BCYTwJHBxm66ql8L4YuFsMyxtmOKq921trtRTqdQ8vuW8Sq5dSmWPMYB4HIsSi5gKjmQKymsttgM8Bzkd5j2FfUvIq8ELjF4CaAlIJzleiLTF+272odXsrdcU5Ush/m+DuIN1/01UABnbtW96NxjTbWde/KSOtb/7u79Pfvl5vtOQMHaF1+2Ll5VwrfM5U0blUjaS1VQnoO2/k3e3qYzvflqVfNeTIdwqd2G7GWdA/w8wNnlJXXvFXabwuagt30A1np8eonHwIwr+/nRzsV7ny8tVrDtvjYv3tj+em4754N672mvCndN7Z1/SxLvzsed77uq4Ny/zziparzMJ11yeb1fuu+cF++7vH0X98fU92Snvi1123u0l55l9/ng7tvdfnlSfmBgYGBgYGDgyxA5ZTy8fEBartnmPAIM4DQDD6f92OXAwMDAwMD7gNdf4WuVnx2VLS2rDfKqBMY6IfuJuaf03ZCrhshjBkwdtQ3JkJ3LslXiNsHL0JK72o6epZz+blfx676dvvQCQd4G0qoIaoBerZtVpdqUq+2KK4HmidOemroZW0O+cScQpmXWwFjERmEbTLnq12gDh9GPp2lnox5OKymo++m4prTaZ/dUPnsEaEptoNmeb+07IjZyN3ucHhNbhRWs3aYPcivJqVaOdhySabsLkss9kfu2kf7cblQ7ZrsNZpvAL2m7rArcl2GhVo1+zFWl21MNW7I9aZvKsYslf914mb41ipqeDWUvaGuUupv7zSqpimqrEheX/ig4HMDHQyF45dml9s0gOV+V9GVGngKIWVS9YbVvlvYBeSrnuThNcgQ4EjKVAgHQIgRpyqFywYHQWDoriQpAbJKnlaxUVW9mqnlnn96dMS8RORGeHGfcTwtS2e9wSOAy/ssShPQ9Lnh4OIAC4/7ujHmOyCkgJyGg7+5mxFLH8/munELC4bggBK7WzkqeAqhKuZTL7+V4j3OKyCyEaTiTWGdHXkWwqiZW62agtXRWKIEKVHUwMZAn+S6+DJinI17+5AMmyvjo/QMe5gk5R6RCboeQKykMoFo+KxF/dz9XNfD8EIEAxKlYgnKxfc4k+X1TKO0PYv18l4o6OiPeL8hLAM8BVFS/fI6gmDHdLZifHxHOsmBAFh0AoUx3eo0Rl+uzKNKVVA+L9JfVmT6UJh0I+RgR3oU8vpbo1WcBqdOCVRSqonbPqji214Pa0hIzVikzNso7UbimDZmyVT7mVXlobVnLs2BXwWjqvWiH2yFarU1tl4Dzz3W7zapmFcYeeB3PtFWf9tSiQPscr04fxY47yvZ67nzd+p1to583Mrfzni/DvMtUq+XM5rrZsTr2bbdtqNW4sdRnfo9k17lfF47Z/bKZP3UeT2lbRpOKwql5fZ/3jrXdY3OsvwbsoiczNvZ37xZTx6UozqX89n6/pK5vF1i1CyP8fdLU4e5FimF9X+70mXRxJdDel8D6PrEeUPeriuLDYXt+gLXOzbnLm7I5JeCcgMNhfaYY+/jegrNunm39G8C22/ZvYGBgYGBgYODLGN/7t/8efs///lvwYz/yY+9uwb/t3wN+1k8Hfv9vAp7cv7tlDwwMDAwMvCI+HArfS7ikEr123B4pfGsdFrfYhljS2u+/t9218RY1wLbaftCtYk8hZL/3xzaqmivjY4OWVpF0TWV8a1ttoNIHc3tKa0s0X+rDJUXrpq0uKLuHW7+/ZAu5p3jy6qFNMJz7Cmd/vB7ryV4LDaL7c+iVvpfsq/22W8f72hhewFUVzCVl78Y+cu/Z4xZ/9BCDBLHtLoxqx2xthuW5gWr/vNYjPxxWsq7mAoYSdnIMJSDMKEpSbULGFFMlb2Gq04pUcRpVqVuOmcrnSO2xmQnnFIVULrlrRSVM5ZFrn0UsdYdcrZ+b4ci0Mo4F0lazD1Mr7AcQSYkDLo8KIYBTXtW1tBCQywEBq9LXn7LeNttGHX+S9oMAmgl0DpiTBOYPoaiMQ17b6heCECPELIpnJa3ctcFeRltsnNcTLj+y3mati0q7muP08ZtkLGoRhEatuyp+ef2f17qacXqnuODKsVXO3/Bqc+vz5JI68AI2z5Jrx19xDtjM027fhlw2z6Krast38LzcLWtPbdsB9fbd2793zvy+1xTHHu9Ezdprg1tEtMFjxvvSHHJrigRbzp4LyA1tuklh3nuH6NRRiU3vLOLxmHesTh2ybV2kYbGqmnk7d/vFl97h42o7OtfU3v29szDzlYnamjZmWBUODAwMDAx8ueJT3/9pfNd3fDfO5/P73ZQPDE4PD/iH3/8pvPXFt9/dgn/oR4FP/fC7+zfVe4nnL4G/8l3Apz7zfrdkYGBgYOA9xGut8PW5KDcqW1XelUAxVYXjDqGnAeXUIcyq4jNvt+nnvQCvrvbPWZSLus2WY/e3n3W1vg1KlZX8VaEAF8zqlVe/csoAr544HEApgfOqlFjzilkFyZbsaxQgqqZhq2y17cqo+W0pFHVNIR2bYXSWeUTrMgVth1Hv0uEgKq7sVde8qnX92FhFrVXT6ndeMRSxVUdxXo9NWAlKOx6pqErsMX4/YEvY9vL/7aGqemHq9cFMavetAeCOClmtNpPmr0zAYapB3XrdwASSa7tp/U7LjEHak9JlhVkqCj1VbekCgFhU0T2V0iLyVVWwb8Y1YtunYvXMvMhnVVQZta+q+KTsKOqbbM63Cax2bVpVdVavdRkbsRXtqIOIwFMEH1alDmUWi3oGeEKxd8bGTpcDrduKilf+h6g0M5WyRHEaANAMxAfGNBE4CeEZiRGLCu4FHZEhyl5R0GYsSxSFb7EkBmQyOU4LjjHhYZHnnBCZQvrORRn89sMd5lmsk9949lBUtQfMZwIVwlatncU6GlgWLo/mgFzUu5wJNGUcDqk8igmhtNmaM+jvAHB3WBAM4avkL0NyDc9zRFoCDjMQFkK6LwrfwFVRbfjuqmyzItCW6CwHqOo6ANMLAnHAnAOeAHg6nXF3EOWz5kvOmYTgZYCzqJ+nKeH09h3AwFL6mYuNMwCkhyi5e8t4U2RQSMhkVI+B61QXAmM5l3EMYt8s1yuX88BAEqUzZQZA9bpDeaSCZbGA7TNlNNbidT+UhQXpFf4Y7s6tWXIdA+V+LuSh3m/+2a2w1qlO2duoATX3pa87hHWKsnl9bS7fXg5OS8CoVbNVThphnn2OWHKXfDm+jh14B48u3LhwfQZfUYzWZ7ZztfDzX+lg2+crKm9//vYCKapC7b27+c9G1VvBeX3/KL8D2CqGrUOFcTehGKRuOwZ1QVSfYG2syG29Xtnry+udgz3sWSX32rR3TEpg655hz6n93Y+dvaCrsljLMfdZcNd6wZ5qvrEg7yn2jZsOL8t2QZp+3yNG91x13PaaL3ie131Uwa/7h/Y8rvdWXF0+NIdwjKIctnWbhSb1HUQdAcr3agctjh+h3W9n/AYGBgYGBgY+/Pjjf+j/if/sT//n+Hf/6P8ZP/mrftL73ZyBDxJ+4LPAv/rbxYZ6YGBgYOBDi9ea8N2gF/TsbesxAXb/blDzQnlK/vSsDC3puwffFmuDrOXb7SVYRo64bhQLfhsMIauB3Z56YllkPw2A1ja4flkSK+9YF66NcAFW7U9eA/fcG7vc9GWDjqVjJXu9oqXks2yUw75sT/Z69AjK2kdDLuwpaPYsK+s4msDknnqnp6bdI4Ezr8SqVQR5e2nfP3tedTd7vVRSOYpVsw2ge4LA15NMIN3nJ/btsf3TJvu8jK7vG+Kj1yeTn1jLWPMUr9dOq0AyKj8fKNb70li2ii1jZwx8Dskeat/aa4w9OSUc3PrDqDlV29y+6/f6u83lmw6i4BQL3pILlwmh3P9TTGBILl59JoRib3xeIqaYEUPGeYmYU0QkxmmekHJAOixCxEYuj0equXtjIYoZQnDGKRtL5rarShqHIM+KvbU+mudWy5DTxjjEhPtCqgLSjkPJ3SvqXtmelgh+KRbJkosXqy1zLkT65HIh23NRG8zV2bmkzq1lhplACXhxOuJ+WjCFjEPIlYxOJRfxaqMtBPeyxH4O42O5nqcs7SRGiKV+zX/MBEy5Euo6ZqqSZtP+MGXEKeFwSDifA+KJkON2HBrVs780y/fEQvCmshABAciRwBNt79VL8Cd8M2+HffIM2Dwzd3PveqK1V7fCkkC6oMuSNR1idlOfItBmf3sc9b4zNs+3kL6KS7mDmzYqSevnnN4cBPTJW3tOerbaPTeJPZUwsJ7TDmnZzT3sy/J2yPb/3nVj5rrd94LMfSL9igK3Xq+9PnVdNoyldrN9B733DF9ms0DP9d+S45fq9NeG6Xej4LXnK7s5uOzr7xF7XXffZUvZG9tjYH3PCe5Z40ldor71siWGews/gJXQtfl/7f7GUnmXcHXPin1r65YIXtvq7lnePnsGBgYGBgYGvvwwFnsNdMHYj0MNDAwMDHxo8AhPuA8oHmt75u3ZVJlrFbr+dwtrGexth+3319raU/005YQ2EGStm5XJCKEJkmmbe9v6zdkGyppA2gV7Pgodktejyb1q+94ntNa+dwLtGwLZkN1EqDkbswncKRlp6927Xnrn0uPS97daD/aC4kVtutYTtteZhQZVa55Kc9ym3LQGuW2Q1wd/LSlsA9G9cu1xPavlei46186eSsm3xdtiKplvj98j4C/ZXd6gkG7uH6CvAAK2zxIbkPV59kx7K9m7Y+NYiQCv0ClKXQCrNTNRo/AF1s+sJLCSk4zGcnfNQ1vKLDmCxcggQPPcxrBaKVf1aVGYLouq9lgI3kyYs9gVLylgLt/HSfLGShlU8v+mQgAHqNVwjLnYPGdYK+gQir1zOV6JXY+at9eqeEt53l5aTosQrLmUyUsAncOqkA4Q8lbHklci2JLq7Tksm4PbVmLxyAAlwryItfVEGXdFGX2YEg4xCYle7K5DUeUuSwDFDFXp6omnKYMOWRS92u+Qt+7TgSthrOfRWnhrPygyYhT1djgTwhmb/urCgqp0buY2979ea6X/HIAcLzyLm0Z39nHbKJh7RnGLE0JeyVIA/UVZPSJmz661gx4Je7G+Hegz6ZK68Zagzi4p3Hke6/vBxWMD7e6/gY65PTd2DvNK2mu2aNcsm+3xhszk3tzn5zz9rvf/tbr8tXdLQKVXh+Z9L+NK/t3h2vh49Ma69P3mxReO+K1tI7OI0I6naWN13kD/Wm3ny5WkvilYGdZx8gRrt9y10k05FdYa3ajsm329TbPdvwdnt74hn/W9urNARa8B+xza5DoubjkbS+pBAA8MDAwMDAx8mYKZ8eL5S7x8+fB+N2VgYGBgYOBLhg+HwldVLoGK9aR8BpTs4GrXyzGAlrQ5FkvqB/RSIWbi1G6zCoAY1wCP7l9Vv47ctOrAGFeLZyWP9izlrMWfKgrQCcKG0Fpd69gkIfxoEhXiReUE0BJmlvjLYhXHxUa0Kl8yA8silr02v2swqlkluVTtY5W/2jdmYHHfc16XJuxJ+/byvgKr4pdVmgZDuPN63pdlJTDVmlEtiC1soLVaE5tgbAxrP3ukaWds1VpYxkyvJWPpuKeGtYFVq1IxFsSb8mJc25jS1oLaBnXtMSnJdTOZc1YVUGZstHxgrcOOA2dg5pb8rkrhNkjfXKfRneNCAjfXsQ/c6/UZeiSNvb7WMSUz1pQLD6b3uy7C8ItGmMXe0dtF6phoffWYwvxtlIsBNE3A3RHpfkI+BuQDIceSR7WQtlwUxBui1xBzYQE4MDS/bx3qIOXk4o6NDEwnRlgIWFYyNWoe3pJrVsndQIzDIWFZAlISkjcGEh65qGVFjSuE65PjjHifKyGsKl5AiOVUrJ7VIjozVUXxskgnD0dRCi851ny/ccoIhRRdlgjmlRiOxEilPcdpRgyMc4pV/RsgKt8lBywp4ryIxTSfAqbnYVVF2+uxEJxUnn3yuRCfE7bWxgnrOZoYULUtSbHzecI5RWQm3MUFmQkvzgcsxdrZkupcch7LmhUhsHMOQthmyVNMk5C8RAwu5yAecnlsE7gQ2RR5dY69S+BEyEvA/5+9/3vZbWnXxKDrrhrP8875fdmdBj0ThIihDxSUJIIEPdAzISCIeOIfoKjHOREiouQoIChih4AhGEWJEiKosY3RTdN02sTYHWNr2u7e9N5Jt2ize3fvvdda7/uMqtuDqrvqqnvUGM8z1/ftvb45v7rgXfN9x6jfo8aPVVdd141HkeTe/8QOqSrt7Xtg+94mDhB2Rb6V6xM/MG4kQE/H/wr9LbmSxZs8t/MFJvcH3bPDcTo2I9jI2eKgBK0KTaF3tgDDu3pUvjoVr3Pa4L9VtRF14so6PCNiJ6r8e32qYHSwtim9B67UvNPnUvt+onJj3Vhm70dLx+OZFXrY+UA4U+b6kAb23vXX2Oq199CD7JABNJeRMwtja7MESCAF75nbBY9PSqP9Mqc9bGojJbAntl2YhOF979rdLKI1Q/eTjVdt/J06ldtC/Tj0geocrh3fl2dK4HqdWt2Up825tkGrnGv3Qi4b3BTuPuS8j33oo+X3/W/tZ9vkKyW9V+62skJtV+r3OCv8U4LueyfdTRVs5dX7Wuz/BZw6eLh/2cGHbeBvWx83//8BOY+WzXSuPS/MocTDxmR/HM8tLCwsLCwsLHzj+Pj4wH/nH/8n8df+nd9aqueFhYWFhV8bfNWEr/LizqCw0BrTihfopKfzC7TAnOxldSwv0nzJh4Ll48WnM9Ly2S78M7UTt+1ZGSEc7esYM4u/gaycEKV+wdIv6voF+GdqWn8tJOAQ6/QQl21Snj8/sxqeKFFanUPek2tupKGbf6dk7xleScP1Gc6uw4wUYVypqxNOx1N8kd4Kksu3RUh/rSSMBOxFO3t8TNeeq4V9rw72v3NZZ2qs2uanajw/j+n+O/wPxZUKzIoLhQjTs/ujkoyocWw9BnWv/c63oghCVQdba1gBbPa+QbT8EBEgloRsk8EWyigErppqF1Ud7FS1zaRAFJkK53Sm4uXfW521g0b22jlOD9hjV91joNSR6++KeqsCSHsoMWtt74lM/rVBaA2th7QSwBjzTFHPpUfAIwVkCIIoNslt/MreH9vUAyBkSFUiA+M5MWJapSh7gxYCF0UxnXbA4vyWTHWsVBGDIkH6+YBmn50zILtAdjSF72m/2mTq/TuMlYz8eevAH+X/eJ8933FCop605WAJy6SvV9DR3zPS6UwpyzHDn+HpYgU9v7xK9zLvZNPPYROYfx/6sT1zXjir7+y4bUTykAAgHc/55+vMfaLlp995o8DJe1j4vTtTJM8zHUnfk3i+Q7kSxjGfvSv8+3SSZtjcMGvrRX9fAoUnEDmSt61tjCffp1dz08/dU+vjWT2z97e3XQ9hbp3u65vev9d5X9qsMbtGLypzeUPKkRgP4zNrYWFhYWFhYeHXBL/9W7+Dv/HXfht/46//Dn73b//uT92chYWFhYWFPzZ81YQvRCBefcmnszZ2QWOYp2VbYD4mAt1iWbu2fEzeekUPUFU6lfyzNDkXFa+RnCkf6mnpmLi140wGm+pgpgSu+XmB9yyuX7NtrkpNfbKoxKrgQcnKCNLVyvY3UNWd2sem9e+CQHtFrcX/ejWwv6Y2rhvFja2K51PCIVBe/tufN0WPLZ5avFlTp9q1921v/XUK05T6ovBMFcxlNYVt7GkijYcKkHdS4cYxL0MzIFuvoymq+HwAbjIqjy0NW3CmVNmvC9KZYyKeEaFhMlfMltLK5vjZ21au12PvfWgKbJv3GXI2hx2aZSqp6csCOhPu44KxKZOaGtlbmKKQB1rkp8dKJUDu9xISNpeNK2LcBhFokoAARd6kx4l1ZFuOAgR0lanho6h/81bKawSndUsFAmCTEptXtRCScUslxi1QlLihKEJjVdQGUTxSxEcKSEkQo+Jt2/GRIr7/uOG+lYpSCgghYYupqFSjnKyhZ6SqLs65lPfp/sD373ckBW631M6ZojhX4jIHQawxeo1Iziq413Zms3FGmR6qgscPG8J7gOyCfBvj99qY2tgPUHQ1ryNGW7zkLI1UbwTy9xt+qIree9hLbNvaH4vhK1Ksrw2Pjw0pBeSPiHBLJTbyLfdXRe1vfhT75/tbxkdV92Irls4StRP8Rv4+Qonxe6t22gBCVOwPIH4odCvt1kDKclNBo84h7XNIwzhOKm4e2jtytpnnGXR8VxblYrfq9da3ItLUsx52zuySxZO5wECWNCXh7JjInKDxSkJ37kDSkJvCoa0YyaOmRjTlMMUtPUNXMOb+LeA3R6UjoWpK3952il1LBOtAxNkDi51AXtm8Y04R/DflkyDtGTuEoWDM1Kmz+jyRW/vf5lPdhNOVq8eqzlW6ZX4M8Xpn7fPEMJPdJ3GoD33g8XEb8ySGaf/EhpjacpiP3D5rFznO+NjZGmyOSWtLU4HbfPHnXDo/j0qeQqpqyt22eLaxYna/nW2i8Of5/rTfzVHnhOhFVS0PaVIaf+c6TjaPtOdIjFDvJGLzLwgEsX3be7eAYX9NHJXVEr7u/91bWFhYWFhYWPhS/Jn/9b+C//k/+y/81M1YWFhYWFj4Y8fXvQKgWojcppCYqRjKSrioI1D94gsvErEa2PL4uLNsH8uQQrI06VpkWz1q34y8ZWtobpvvD8Pby6ITvVLVR6bysAXptgB+RXTy7zqJozZTAntUC0XoiV02MKhaunLmiQKZidqB6LWy6jWobW+L10GPi79ni8Xt2lB9jfifKHU8uRnj0T4xyDhe9vtBseuUN4Ni1ZHAt5NF7EayRxwWk2eQ4DYjTFSyIZ+rrhin5Pgk3Ux163HR5tGymha0OV8dB4no9+1BkV4Xqy/sVA9xfWebRZraOpxbcveCj/dgJa71FpHvEXkTQFCsdOvvAGp82fqc8tM312T2dNfOWXIc1aEpiqb0VRUkFewagFxUu0AhWHMWCNk2324JWq2RC+makbPg7S0hSLFRBoDP90crZ9tyVZD2PCGmFms3oChYH2oL1kL7bATblhCCYN+7RTOrnUMopG6q/dgmcX0DgKTSYg3ve4R8tyE8CnteYvfyAPVflflE7f+a5XZLH9CJ1da4ml8U4fuA9/cbvtvv+BQfCKL4dNvxjq32OTe1dIlpXGysASBLaG3KqVpwbxmaA/YMhBuNcVBoJXtN2h1iIUlDUISoSFuG3DPCltt1UZU+L6ztNJ809D7nKG2DgqUFbSSQSorb/Mv3AGyxkBtXz/sZzA69PofsOWv/NoJNiBC8wHDPs+pvtrGjPcf7ubNNVYP9s5VxsrlqKIOeNbPNW+2YFe1jeb6AFtsdROQyqerJVqpPRI72zWRXPLPqPbzzzp73/G5p7+35t5aFqTgtZ0b08ju4fhO1jT1sVw0iMmtZ/pnZ2pEV4q10SaU7qINnYPeRs3ddIPtsauNAuNO3wdBWttuu70xFfR5OVL5DHTZeHPaB+jjtywS8seJA3rv361ms36agbdfzRMXrY+T6eLal0mMav5nzsClukteDN23O3ANOngl6pkC2Npilc6YxqY4rwyY0I5rN2j3UmL75xVjICwsLCwsLCwsLX47/3+8B/8SfBv4z/wjwj/2nf+rWLCwsLCws4GIV6iuBSFUdSV+wmYHJXvv7SblT5JNFn1nd/u8Z4czHeNHpBVvHln+oUtxpbaqNWVtnKqJpGYd6na0hE658PMzGJRzT86IoW0rOYCSv/XtGvHNbTIHqF1RndsSzfqqObfZtn5Gc4TUl6aEtXAbDk8A8tkHGa8JlXVlf8nl/TXzaZ9dlNg5n9pmch8/bz1lbfZmcf9Z+n8/HDb0ims+U736Txck9ON5zrz1qRWqc7S2U59qGFnO3VRdQYvgKBiKylZHRN5y0TFRGJd0G+11FicOqaLbNrbtayIGtEoRWnKlPy7Solsv1+C0m3LeEvcbn3cjCO1YFqeWJoq1cwPi0Gue32huz3XOo6VOSFv+3j5/9WwhLVWntN5tqOw90cjvtAeEHaTF5yxjZs7oes0eF0E/UUQWsALI0En4g46WObS03vAvyR8R72pA1IEDxaduxxVSJcK2W1UZ6F3JcQiVvgVHRFQqto1XxLJV8t3OweM7V+rkQ73UsYiF+jbC3n2713edII7YFg3W4WTYP4yNo9uQt3nEANFbXDR+X+1U4srcdm1nx+x/CYNlOpIsycePTeri8r+CwgYTLeSUsQ43nOW3XpJ+cdlqvw+E7gB0cgPFZ75/7nHa2gcy1aWxLP6ZU36nV9Qs2+VPwxhx/bBY72Ory8+fqfdi+FU/mhh9PS/vKu4Lf9X5Dlx//yXtxGu/e0s/e83a/vfhdyvbkbb5NNhEM7eHyG3nb0/lNEFd1n5yY/87HWKV7tkHjrPyz+/ZLvufh2j+d8/4bLb98XRYWFhYWFhYWFv4I8AffAf/SbwJ/6f/9U7dkYWFhYWEBwNeu8K072eWxw9S+gBEepNJpKt2RTNVQLaH94m5dcCnqYRmtiIcFTFIUeKtmoO/Ov9/qwhyRvVyfLYRZOydq4wG0i7+BlAxif6MrK7hth4UzUlxMVTOzhcmZPbAcF+n6cbcoafmbgoHyxHAkxve9k7tsdWj2h7VvY711nG8bjWMY07W+OiLQL1Ly4q1XiPr+tjxpPEeqqtKP6qnLffDENyugWamUFY15YRvPZ3GDOX7umYqY+8UL0TOy1tro2+cXmX1dDyqb+9zUujiOOejY2eYC3+5Z/ybXrqlheCE84ai+sXtz8rzof2qznjyMgXbr2enCcYzA/VYIsVCUky2rOXebUjJKI9WAPh3M4jnsWvLHfl4e2oi3HCsxGIGwo7GHgkLKGm6xxJbdU1XamoVzyMXOuaUNUM1QAG+3HUEUv//DG0QUKQhSLgRsDKW8XNWrqRKz+x6RszTr50JalvbmLJUAzdj3rdo4j0RwI6BzwPfvd2xbwhYyfn5/NHvnTTIyBN89bk1x/Hhs2D8i4qM+A29lLCQLtNofi6IrVXMfK93KwGoo5KgAyPcywEweIyiwAyFJI37ju2B/D/hh3/Dz2wc2Sfi8PfAH73d8vN8Qt0T7ggq5bQTu/fMD+2NDfgRs9wSIFqvsSt6mFIDcn2kSq+y7ksdQs42uV+6WEbeisgaK7XZOAbcA5A0Iqc6v1DcLaEQngnMhdnOsYyFl/rUJVaGxz+kfBVWYuvdA9tbnkNzqZw0/ByaqQvvXrN7ZyllaXSfwtrGOhBGzeb2K6e2OCX2zCKl2myoylne+Vsv6g+KXlH9n9QwE3PQZGYc0IuU5hFzHN4f69+wdiq4GNcyUtHDnLR8TjZq7NTera031OwsJQDbDYx3l/TFYUrfn/kdPZ1nPHBkm71aZfQ/5vvkyPIk8dX+gNtS+qpLN9tX73ddv709SiwL12s7S++8MGrvD9+GExD/YN9ffJaXhe7TZqF+QmnzNmkUxW6ifbFaw8sV/Z56hKfhJ7ctlD2S12/BlZcfYv+EnkG07PGu87TL3D0B5lmUdj8Vi6VyeA6Grea0N9bnTy6vPoS/ZELGwsLCwsLCwsLCwsLCwsPDV4utW+HpydJbEVJCTGFzNCvrEOrlZOrO1s69/dgzosWuB+cIfWwr7/gyE5EQ9xAoEn5eJbs53okAeCC7DmWqlLtzyQrOEiarqmdLT6jA744MK9GKhXUix4q1Avar3kPdJ2Wd4ptTh8p+pU4H5tZ/lPyNhvcr4xPLyUPasnqt8s3MH6+g8P+bBsXd92TMVlVcoPVMXz9p3YQf6tIysz5V7k3ichkYsnF3PC7Wg3ramigQqyaja48HCCFtUe+YeV3WI1ctV2Dn6l39YLWzZLP4tx8A15WnpQidxgarcrWlDVfvauUBlpBxaHamSvqy4DaFYOwNo9Zvi9GDdXH9M0ZtzJzGbXXRV9m5S2me159r+xyNCH6GPLVD2hVRFLCuhW/X2r07m1vQY5TOCPpe0jxSRa5zkt23HfUsI0SvyjtbVQ11qJIdtEKhkObU/xlytnE39XMZQqmrY8m+VaE6pjIlx6m2OKEb7atgxHchdzjuMmY2Hxb/8MagbJ/rmiQmRdoJTteuzWPazd+VVPovNeUVszeDJ4xNl65mS0athn1q5tk0svb0HeFvis2eqJw1DH2uPQ5xYxuxd++z5/8r7wadjV4mZuvZKQf5jMMvvjzGpe1bfl77TJvX8aIvfV9/FDnYfTFXmF3l6vf37VvgbeKLE/aK+zd7xk/zTGN3PnH5OnYJeuMeB18f56lvlmWPAwsLCwsLCwsLCwsLCwsLCN4WvW+ELQHZTl5YYgmbv3GL2gkhfI3G9OgcAdooza2qglIpyN6UiTTosypwpZRTKNmusChyUq24xZxaTbIulDZ4ETqksIld1kVL8UlEtC+kbqRtIheTjFRZihhbOgaaKacdiHBalxBa2QgBc/LpBRZRIlTKQ26ZKjeP4ebLPwCpoQ1P7OGK79YXasG39d+CYj9PPFKLPwPbKQz8nalr7nVUnnhgclMCk+GU1r6U1tRMrbWf20Dw21scQ0SWfNF5+gT8GYPdWgtqIB7G/+d92zag/kfraFEyhb6yo/WsEidhc3zvhEmNXADOha6otVYjErqJWHceD1KuNOCF1rylimrrmavE4TK4ljzkAi62oszR8TVAUTbjfWl4j1iQBkqpSKheiN29yUFuy+rSRbYJmC60Wu9uOQaBS/6b7O+ViMbyF3IjdrFLJXkWu7LLWbm4x4S0mpBzwsUsRtVaSMggQiTg2m2cRYN/LHImx1COiuG8lLvDHvpVHTMxIe8QOYN963kJMljZ+aFH97ntX/m4h41aJ0yBdiZy0tC/lUkf6foP8EBF2IN9QbLSjdtJ3kFCjxU62Q2pexlW62+LY8rr/Ls3uGFJPKSBJsKfQCN9/39sf4g8fd/zB7a0pcDuxnbHvsewzMmJb6rWoUHTSFvX3nArFfX/b6xiFkj8H3N4+kFLA/hBoFmQAP3/7wN9LAdlIcDePykaocqDPTyUVtBYRbiq/q3tv2gYGbBHy+RPw3XdfvhFHtbxDQiwxVPl5Te+c9s6KcryP2S42EKEzU/SbIs+fB0bF4RMM70Z3fOyePf+P6uErBS8rgVklfGr/bMf42R3k+K4HjmN4Yf/b1JfWBp/Gnt1n6lYru7ktOBcRPx5Xm7KYdHbvybNrpumY/9B+xvCdM3Hl8Hn95ier79kGiDZesfebyzkjCLM2+/SXydBZ27kOX1+gecefO15ZTcrls/uhtXPiPjPdzJDrN0gI45zn+7fOxUNc7Ilbziyut5pbUOuYjPenfXcD4/cAK/UZOff0dSx9muGbweL4mlV2a8aLmzt+LMG/sLCwsLCwsLCwsLCwsLDwVeGrJ3wBAEIxfIFCuMYAyVosm4H2N4C+uMMK3S3S73ReZLRq44WhzVm4WXoRyO3W2zNbiLN8KR0X+ViRPLOctjSW3+oA+oJvzkCiBa+qHB4sJFMaywJGq8SW8LiIqrX9MlMyWjvUiOqJDe4MjRSckKNabawldGUvWzyrG6cZWWxkYSM285jWFhfZUvrMunIGJvOVFjZb3jg6R+eJ2pWt+WaIcSxXQh/rrIXMNPtNzmPtO9gZp56/1Ul1Wzm8AD5YOMdKXtk8mywqmo00L/byYr7ZddtYcBmagdtW6rBFdVvkjpSG+immJk6YL8K7dg6L/vyMyBOyhG3cW558XCS29NyP6e9uvGKE3jfoJs2yuRG6Vt1W6gi7Hi1ytaaVogBGVf4KXz/BSA6boEy1bpQp5X3kiIxCwm6VkC1DVFS6MWR8qtbNqoIf9g0pSyGJUYjVLeRmpxxDmW+VGi0E7FZJyUoeqymALSawmEpVoTng/f2GbUsIQbHvsVgQWx0hI+f+7LD8MWQEFJXvngMyBHsO2FPEvgfgESB7J89RCfAynkbm8vgRUSj1PypEotdrFrSEBNBKIFdFr+RyXjKAhEI6V4vrpIJbSHi7PfBdehv6EjmOcSWys4Smhs4pdkV0CoAoYlTkBGgWfLxvRdmLqrgm1XBKAdst4XYrxH2ZAKGStr2LKtJI3KbyrRe0tU77poSuQK7Ha9HpHqD3DeF2w4+CuUzws3NyjzVF9GwTj7d4nin2/bGZhWyzHvYbYk42WE2eEf7ZMVhNAz3W8UytV0k2AI3s5bL976UcNx62weQV8uiZ6rC9T/O8DKpLZ98bs/ZxaAWnHj7YInsXCe8WQXUM9tRnVsWzzVPtvCP4gvT3us87tNtZUvN7ydc965t/RwLj98TEdWO4F1x/CoF4fr31OO3R7b61E7FsF21zm6y8yzzuhQ3fo7O5x3MljOdYye7b5zcciL8X+Xc/R/l+6g2qITly/zbncwb+pp5tHGnj4L7vmOxlEnnyTLIQExLjcY7P8sz6uLCwsLCwsPDN4/s//A7//X/yf4j/+H/iP4b/wn/5P/+629A3gH/vt/8m/rn/0T+Pv/r/+ms/dVMWFhYWFhZ+EvyC/nQ/MSq5qidEXImrWInJKREl4++zHyaST+pvls+GInnrC4NsBXmW56xtbSHx+lIdFsvUlf/EUnGIB+htcM9UKlnHuHxni+9XmC1YndkrzvLOFu2EymTlT9bxWnA7W7qLhV6ZjMlEYXoJP5d4XlgZRqbGE4WQHxc/1k/i1Q5gsti3aVbmjDSh/k/tGn2emdrL9UGm9+YL88Erk63tbP16ASNeZv9DdPo/ST9mMfXimaJbaE4F3UqY7u/C5SEkoNnrAvBKTLZq9rFnLb0Mz4ixKSkH7DmUeL1mj1zJVaCQhrdKDmYVPKpyN4SMXElctoQOVe1rZG8MRc1721Kxg0YhNvcUkLI9j4i0AopatdkX209Rx8ZGEHdlcR9WbcT0ngPFEBZIkh4XuY5fG7vpNfJ/az/ertc4/v2aaPtbMorCdw/YNTSl7hYy7lW9fLBwbv1BI2zF9dMsm1HH35ArkW4d69bchRA2C+xYVd2yhwPX7ftpaPPVumgkMLeN7aEjito8xuf39Ss4K+PEfvb4jLpow7PFkdn5JzbPZsH6bOFlIIFcG58u2vwI292hjVdl2KaaybvCyL6DGpjOy+xdOinnqg2/lEUr/3708+XsnUltaE4URnr674uzzVA+zr0v/4WNdwf475IvcSp5RcnsYP29UpAf6znO5Wm9eXwXn72XWzuA8/vurB2WZ+au0wuflz3b/HXWLiNx88n38knbrM/jprT5t9jse76Hlvj1WeBdWFhYWFhYKHg8dvz53/wL+H/8xb/8Uzfljx1/7/f+Hn7zz/xZ/PZv/c5P3ZSFhYWFhYWfBF+3wle1LBpXyJ4aC6C3re+yN6UML9AYicTwu/abwpeIW1MxsL2upTuz1KtWdIhhVOzOfmYLZqwqsL7MFnKmapowpBdWN/NiFNBVEKjElymFsqml3AKuxSmutsxctlQL5cFG8WzxyZNxrMr0KlzN88UrO9YUQ7lsZ2iLuPuRxDZy1a7xwTq7XhMmtfkazVRAWUu9IsDtDjw+xnb6a+QVvbxIO1OIkrL2YGMZJguPXj1sKmdutylw2TazKYalEbkSQ6/fxtUtOg4LkzPl0bZ1tQy328pN1GY7tu9ju7jPntxu99l4rqh83LhwP639MRzu4W4bmbs9uj0HWIU3kBhkqVpVX1Kvj2ZSqTNChNxuyLdYVLtGCmaF7GikYVdPKjSEqrKytPUWAZG+pvJVQFIl+Yy0UzTVZXmW9r7HkPEWi4IXVYV63/bG9YkoHim2OL6qgi1mbLH37VaVwe8p4pECshGtKeKRgM/3BwDgkSIsruy+R4RQyGQN5V42xertlhpRebulgdAsl6jYTrOyONe27TngPW145FD321RS9EMQHkVNXYhIDC7ObayyPS/teYVOfAYtt6ui3P/2uygU0iyc+6Qq4x7fBe9/eMf7n9iQb5Uwr+S1jYdIUTM/1BS8aPMo7QHpUZ/fQYGoiDHjdkvIuSh3JWREEYRYxjHtAdtbQowZHx8bcgqNXM454H3fsD8ipI5JiRUtVQGuRWEupf1NwFud4eVR/26q8TLnBGWs9ruUsRdAY+hhB74E9O5qlqeiR9Ucg0kpsobtKsTj/Sgze9ZWXuhWzts2HD9TtgqnMcQIqeEZbLPJlLiZtcGXVaEpHUjJwVLX3jFe2WpKTq6LLXSpz2xX3KyCzU0lufeQjXV9Hx/OWxsm306s7LS67JtiUHXas/xZHGevKJ65a7CKdnCzoGPmHsHuClmLSjb0ayZ+A5Lf2Mbgdxlf7sm8Hm2J6VvL19G+J+J4jPucAOV49/w95m2pz66RfecFOarVb9uoWLUQJE5V3vKRdfIs9nVLIzK9Nz356zdDsvq3j4kjb3ljhk9j49a+++1hJ/AksqI/R9rIqZb7KPVyp0R2a0OdQ/YdVNMPyulKCuu+A9LtnhFCGX+gOJ98d6xmYWFhYWFhYWFhYWFhYWHh28LXrfAF2sJvU/BW4lRSbnbOw0IM5RkINSZRfTqDV83OiMtGcNZ/rQ1e0csWyr4tPs1Z+xgUg3Rs09GaTm1B2hNZM1WwX3A7UUxxetUTpecVqW2LnWaFbAQxq6QBDMpfK2dYKE0juezB5Lpv+6x/XMcwZnq+cDzDTD3k+8NpD+0msvVZmrO6OS+35Uz16i1P7dhZPlYVMWnL0Iv54xfD/ZiyUmoWG9nOpRPllOvT5bFp3tAXmp+BSR/ql14opiTG8jxoc77mkfK7VuKtWw9XEs6UkzWN2TgzNIDyoamHtRIqTUGcbZ9FaCRuqOrYMmXKYnIMenzUmHK0kZVFNRpDxi3kehsXIteIWiNlxalVVXt5ZXCKPbEpX1k57JXEABBChtkg30Nq9Vj6nANSKj+SSr+7jTONG/exSVdrGpWeVlEIYZVSVjsv/TyV2a6HAvgISCrIkKKmrrGTi6Kax0QOj65BAV3ry7knKMpdIMTcVMGQQoy3dKIIlSgO1Y475wB52HkMSnDm2NuQzB7pRJq3OdcbXpTst1/CnjPe/HHhdvBK7Nxnxz0ZK8MGoHA4d0lClwIPdc5UfadqVrKTP2zIevVZN7M0Hpo4ubhfohw9K8PKmbllcD56V10qSPldcNa+mbvEVbqzd26ta/qd05J82Ri9BH6XECn6krKW3/ne/YTL9huuJnWf1ju7TmcK2Cv1MCl8D3imDp5hlufqmAuFAuD6u9EwUQEP43S2ofMEbf6n1IlqXNwHbtNZKf/k23NhYWFhYWFhYeGXi7/6O8C/+H8C/vbv/dQtOUIV+M1/E/g//l9GQcvCwsLCwjeJr1vhy2Svlri97dRe423VRRKNYYznm6q9GiteT8ofSL5GNEn/lxd97d9kpG/upG5yRGIIRY1oymSu17eHlIRetcv5ptZvrQhrW5UWmNoSmKpuTK0iITTV76CikQBoJVgTrfnPFl55UT5rUcbMyED+V1xeLg+xKB5MZTFTtzD84quEotRjpYW1D8AQh6+1Ged1iACw+RF7vpZ+EuOP7Zxbn2mRrs1nPaZNCTAVOytg7V9Wrpry146b0pfBhDBfY69AZrI3V7aHVUxeqcXXKyvw2Mf0vr12biCHjkrckjaXOWxq3pqmq3jkoFZramYum8foSsE0jEM+qPmmMQjpmaE8dhPIbQNitXM2Mrbyvi1WbyXOjDSUhDIfYiWCQ1FkmnrXLJ91QyVzO4mndTgs5m9pr0CrpXKuJKTFvwWAvcaJNVvnogyN5XFHw2dk7T1k3GLCPSR8pAgRwS0m/PDY8EixxKWVQnCmHJDB69SFlFQtqt0YMz7dH3h/FLUxYHUKtmrhXEjRYol8q3X//PZey7PFcsHHHrE/IvIj4LYXS2e9VXLSFNQcyxcYf6+nVcqYAeiW2e29Qfn40V+J3nwv5+QjlPbkgADFPe54i3uJTwwUpbMCOUca80pyB3H7gkIbL1P43uKObcvFvloKAZz2iFzj9oaqot621OIE5yS4fXRyVzJI6Vz/iehW4dzf+rt2oR5ylCEOdVP43m+lD6/+P6e45wJXWSef3CiNPRsyPVPav6PKb7BfLYN5SDeoB1llOMtTvz1k2PwxKggH5e5sUxqd9zatM/XjoR/u+cR5hvi1nI/qaAReoOmveVCVXpKNTJZ6BemkT1PY+4jfUTOFMkDjFXsadqTwE83Ktd/tPUIWzY10c/1qikrL69viyzsbGxsf0BzmjQIT5XFTN/vNT5MxPqSz7w/NR7cPuk7DfJh9Hz72cu9y3+xeo/7pvhclu7licN9rX9oGhwsyt81d+waiufdUxUv34quE8XB/jbtshntLeNOm9ZEsmTW573vg8Lzw9+hwrqZvKt6Le0ViPIwJPy8WFhYWFhYWfg3xR7AHceEEf/b/Bvy5vwT8T/+7wL//T/7UrRmRFfjT/0vgX//1s/heWFhY+HXE1034qkJSrmq1MC6qsJJTFfLY+yLMnvqiTS0HZsVrf3M5HiKdjGNy0khcI+RCGBfUBmJyssI9yNvq+W1rKp6hXZWEnY3JrMzBxtIs5q6UO1mbVSN4AWnbxgXQaufcYAuLjbydEK0bk79EUoJUvpze0gLArsdrQvaAiDT+3kqR22nW0ER61wLGxVJbrJ0JtWZEQg7jAm2MJa8nHoHeRl689f3y9XiL6zPEysbwYvMsDq+3VfbplPtG5XnidAbfRi7Pg8tLqbORQXp72PbaxnPfe3vYYtX1VZpc1i2+GxmbiNAJMhw7gNU/qIvzpzE765x4xmiJQD5/gt5v0Njj9w421EbSZm3nHj8LLaYvKukaqv1ztqe7FmLY7KFVpKR9QyXEuL0KibkqeIvaNIbcHBSiu+aqUo8FfOwBSudVBe/7hqQCjYVATlmQ8oaPfUNKAd8/tqb8VQAphWbZXIcFIoqUQrmtc8DHvmHfA+73ai8tipwD9koQ5xqjN5IUddeI973YOTeyWAV42PyvJGTQSmxqJ2or0amxDLDsMvzdmF9LN3tlZCoL/RkmCQjv0qyu3+tFe9t2vG0J7wD2XKywNQuSGjmiRbUbFDmVPHErqmaItjGUSoLnGqN32xK2LeHxsTUVdnndCD7dH3i77biFDCgQPqql863Ml7BrI8ZbjGKUDQMWT3oYr61w4ZI6IW6krwZAt6Ly/SL4zUA8xn4jCXCwwz0jSZl4OtzLmec0kUkeMfZ3vJE+9kxyRBCXe4g/Spa2Vmd7H9t739lGz4jTRjST1S7gnmsnVsrDeWuHWUVLePrt0Pt4TTJNn7HtmVzLNBvmMwJ2RvyeEbS2AcBbOxvcN4Paw5Gf35UkLptCTkhdP65Mys42ldVzEty1Abp9tD9uvyd3/EzFfCCl+70hIr2v1mS6V9hKu79TYzvX8/S2tTl5FXs4nGxSDH0+2/3WUtX7y9/LjejkTVmGmSU638eT97f4zV1nmyv4u909F5Q3g1hZZyrfYGNMm1D8t3qQceOo1eOJb95oWo/LWu1dWFhYWFj4tcLPfv4Z/7V//L+Cf+A//A+cuwUtLCwsLCwsfJP4wtXWX1Gw9WHWSojIuEBTFQHD71cfPoPlXS3LK4Rm5Cqfm1nA+cUtbtcMYVJGOxfOF6wO/TdFJtlFTmyJX/kYHOx9Z7a/z3BGVvqFwYGY007Mzxb9/aLmWZ1WztnmgLP2sUrIE8fPbCJlQkR4zBafvUVpI9NPFEPDorQ8H2evsj2zAX3W9i/BLPburJ6ZGqtZHdN4zhb7jfjhH0s7G2dvkzmxxu73zMlGjR9jM+mxbSWmaSXMALS4qUNdQLPS1arQZfdgyWh7J0qnJnXJmMenGeyRq6VzF5mXuLj2Y8fYYtlg8X33XFXDOWBv8XqNnJWmzlUqz7ej56kEZu9Ks5q2/OpY16yCXQvZOwityf64jfvZY8yfG37XPp52cYYfSs/1aCFEk/WtWmjfw44Y8kBam9yWH3/F8pksrqst9jhufTxCUGwxl/Zy31QQg+JWrbChRfXc5kkAVITsmV1fFOM8Rc93GE8rLwj0l3HftHLD+Bw4Ua9O8WPtdy8I6IHAnal3r0BWzb0qPTx/rlR7jaCbPWt1Qix+CUyJyt9es/fnbJPRL9vq2JOxTML6tlkabseZrXQLM5HnVvyvWOR+ybuT31uzTVlc7+xddmXb+7KEfiz/qSqU1fJnsWhb2uNY+Lj3wMWmjNY+2sjwIqb9uPzunhO8r2AgXScK5EO6qzb4b7JTC/Lz67sWeBcWFhYWFn49sd1u+If/k/8Q/tR/5B/8qZuysLCwsLCw8MeMr1vhK1UJp9psnZuiNY5qXr1tPQ2AQYVr5BjbxTHRysrdtqjGChNS7jB5aOUmqtMQI5GY+bggbH+/f5S/Y+wqBd69b9Z2+16Ujaw2ZHWwt50Dumqj/l5O18W2+zaoIg7xSE3lQYqbYikrAOKocvXKE/uXVTZeEdPGfqKIsPHftkImBBzJzhiL+rgEJO0k4b6Pahu/mGbXPdZ5YIrfiWJokP3yAqSP25jyqDAxG+TbnRbEj2PbVL0h9nYfrJO1j2NKXanLyqlZXMsp8Rr7uFSb7gOxamNWlV7tnNlEm5o1K3Svc8ni0np4u0+RUiernHjcWBFt4x/R58ptO16rZ2SHBOAmEFOv+TrPwHaRzxbFmTA4W3iXAPn0hnzfkKMg3wR5k6bKldp1FUXepNvr2m2yoR9rRLB0QjigliU9fiw6H8mknKpgTwG4FeJwk4xNciEg67V5T0dV18/fPvrw1IKzhlJGyE3VG0JRDb/dHm0q7bW8UGPXMg/NJO6eAmKs8XlDbmSyEZzbllr83ltM2CTju/0+EMBGNOePiPBdKOMlVln5kVzHeNP2qG8xbYfrRv828m8sB4qqBhaYJXJTAmu5Llrts63nofYvhAxRqf0qFs1lnIjMjArNgv0jIt4yJOYWnzfEopbfHwHbDQByjderECk2zrnG+X3bdnzeHvh+v0F3QfxAU4a3sQtAqlbU4VGPWX9R5prl0a38G3Ytls6hl5FvgnQPuG3HzRUvQbUM5BC/V46qSXtmRL7+2i4TgLlilxWErJSbPRvY1WOmDrayB0eRkcwdzk8wqChJNWyWyhz/l1Fsm8OQvj2nwzFPczqIExVve/6OY+ntc0Wk20VfWRO7zWIHEs+/M7L26zi8t+k9dKKKHRSSlpbL9W0JALt9DOrxGcF8tiHMfyfwe9O7ZgDF1j/nrnw+fVdj2s+xXvRrNnE7KYrnqqbG8RirbIdy+V2Wq8OE2Q/Td0dTzNNGwoMqPYQ+n929w/MbKR3UrqZ4b+k5P9stixw2o1gatl4fjjuFbO8UbfC43crv/EzIuWxi8W2pZLg/N7VgJuK8jWdKPULAdvzfNrV6gEa++/t3WTovLCwsLCwsLCwsLCwsLPx64OsmfFn9EgrbIW0xihZmgH7cwKSszvMM9fCCoSOXD8pQsyHkumaLLS2fW7Dzij6/YOxt4dyidIMtXLVkcujbISYYL6oeyjv24ZDXFg2vFKgzQvFVnFklHuoQWti26+cWaqnNrezSqT43AAyWy8Fd87NFNE4XUIlMv4CdjnnOVDpukf6wYH02DtzXZyqfoX8X14UXfA8LyX2xWDLmqmG2tbRycsDgN+BjPtcyB3vrdnzSRp5r/De3HyjtTRjruFIOzZwBZvc3q4ZfUCJJkGLnvIU2do1oEzQVbykQQEAjhAEgk81uWxk2MldRY/2i3AJE+B77V35MbcqKW1OcZqdGZUWvVDVwRikjBkWseU2FGuocyTm0+WL5JBZy2OLUpkrmmpK1K4ox1GkItb6ikk24xVQskSFV3dtVwkhS7IbFxlgHEr2NB+iYkeNn6eq1sd/Vp+MsZrucipX1I8U2pptk3GNq7U31/rBHvxHnNp6K0OaH5n7dQtAyZaFtHENTBPcxE8n1ugkeOQBJCp9axMDdwjnUv60P1r9QiXlFed4CLf6vCgrh0iTo9dcA5C18uc3ITLHG97l3LsAJ2fFqPM+zvMDz/EzwuLQzdWM9UaslIsiTSE+bPLb5oPKbkbZ0fDpefoMU0DZ6MdnGxO1A9M3i3Pr22nvuWb+mxGpv02U4h6HAfGjX0PczN42Z6vbsd35nz6yfE6UVtxHgzPVk0u5D3Wfgfrr33XDsjHz3G74wmS8zt5iJOv0wbzDO1VlM26fwVukTZbxriGv78V6c4mxj2My63YjgC3g1/zB+tJHTzo1E/EnZrz6nFhYWFhYWFha+AeSU8Wf/1T+Hf+ff/ivIX+Jws7CwsLCw8I3hqyZ8JVdigMi1svhYYvsCgG6x/J7zSNCKQGMYieCmmAw9Xc5dLfmKNZotwsQwURsSkejJZSaVecGIlcCc1habYgRCKAvqznJW970rf2YLPtSOw2LTbIGMFxnPLIhNzfIKcZa1KjQdKWdqXF4M5eN57+mtnIlatCuN0K8tcFxEnYxHP2YF4Egs2jmvHvLtFQDREYqmKA3U12F86ljXReCmOm5kqVuU5rJQlCFNnWbz2eIXcvkeM4tkfx1nVsvDdbK5eyy+ocXHmxDXEop6e9/P51mmOWN1XyqdKHtV9rOaiWP3tn8flMltqCgxD62O0O7Hdh9NxleCQK/i+d5vyPetuhaU55gGgYqU2Kf2+MpF5ZvuRWUpCdA7KO6vtnT2bJS9TKOQFGmTRgwPts5AO9Asm0lxeo/mMBCQWDFb/80qhdw1a2cAt5Bxiwm3kLBVcncLGSkH7DngVsnHGBQiCaqCt9tex1LwsZf6YsytjjL+fV5IbV/5o1gWx1rvPezY8x17DnhPscQQVkFOAciCkGr7A6AU87h1zwhy0RIDUeoxKccggGghRyuz2dMC/b5P0sj3hvr4kFSUu48c8JE23OOOLWT8/PaBUInvR1LsKRbSO4eq9M2IscbrDQkiwP6ISCm0eL4x5oH87aS7kStaHk8xNfJ+T7GMTZ0zYxzjSgQDg8o8R1D/yuQa4xa7vguQbwK9T559V7Bnqj88sxG+2LQyWvxOnvshkGoxddLVh1CYkMaD6tXXQ+UPZIy1wfKZ6tGeO7zxi541najt5R1I0ZPxPVVdnhxDdCSTIVP8Y6sXGOrtqllH4lEZbbOYpWOSK7i0rn8HReSsvzH2OMQM71aS0nEDHX/P1Pf1oIadbbDy7XXlzcZB931ehmtre/85lXZTVp+1pabVlNFiGftNZN7S2r5DqN2IMh9rbg/N1wOBWcs7tHcyV/2cHJTt5UDNa98+ieaiuyeovEsSlDZZtO9hTk8q/X5/xOE5Yt8USu04jeELjN/01uZar8TyjLBjQwknVtr6ilPJwsLCwsLCwsI3hJQT/hf/7L+Av/KX/+pP3ZSFhYWFhYWfFF814asxQjeyMLZFUyJ3JeWRLAXagks7xyTtTL23xTGdHR/s7bRYNzdyLY+/Dw13JPBMYTBTkLbFQF44m5DRV0oBPcZlGxbUSOXqrf0OFswMUz2nVNS9bRExVSIkOGIzolnzMjHe2lZJPSNMc7EmlBigw7TNpRzr4xYbEayP6jnqrSgH5Ye7FtYXUzmzpfSgNFVA3eKxLZCyffYZISyhE6Iz9YyV5+2ZMVlgtny0uDvY/jEJyfXbv40wrvXFMM47vyAsfSG3KWRnhIthpuRmcpfnVTtfLaLDNo67t0ZmtbDdb6qjaooJcQCCSL9T3yxNqy/0RVvbNOJsJUveTtyIWbVSnySWOakzJbZBQlP3qpFhEYjvfWFcoxRVZJ2bYbe8hfhF0G6bK0A2YpfF1AJoBPJWiGLRki7d7BmokJg7gdqGsahMkwoeqZCKW8x4u+2NhLU8llZE8bNbuQeTBsSgSBl4f2zYYsZ92+vejKIA/u79jscekXJoimCtsXmN4A019qyqNPJS6u+hPQIS7o3ADODYwKh5c67qXq1Eb1CKv4tOUlbSUnysX/vVjkspA0Art1wEN6+NOIUCWSC5xMrdU8DHviGjKHxvIYFjJJuiOqWAnALyHqBZkPbCtAZRhJgRYoYE4PGxIcSET58eJU8OeDwCRAJSzCWW71bo/BgytlgI8gAt9tpa54k1PwBIfc4ManJFU/M2ta+RvlrmqynRNfT0KtI3a70Kdmo43bhTnwlnm1pA5JFTzQ2ohM9AHs1IookV7TT9zB2A0jVrW352TzZezQnTI7Hl2zMlvbi8iRKWibtGIGXtISC4exMCcPiGYJKvljOQi9UemPt0afNMG39aROpZuIb6bNe8dwLcv8u4rUxwnm1wy1rq9M9zqnc6ruzS0bqhEHv3XjlrWLuCdMttG1Mcrx2AcQzq/dC/8y6+5/x532/eSMDzgTcQPvahbG8NPZDUL2AaL7oUXNvhv4n6JojxG5c2U87cclpfa96Ze069L8TKAV/vrugVHMubfkOg3/cDsT173vDGD39vG0HsSe2ccXCUWVhYWFhYWFhYWFhYWFhY+Cbx9ft8sfXubOe8P3ZC/rZyuDw77sGLXWwDfGHrerqr3/fFY0bo/hgcYhTSQqqR4zIhKNhSd4KZsmAKzUdi05+f4WwRc3a8KYWpb7ygydf2bGH10H89HvdKpisw2TpTFrlF6Wl/hvLyfKy8TeSXEimvpvfXkevnH4P16+z6nsXY9Yv8/n47s77m9szKH4j/C4Wzz+NtIi8sIp/eE7NnQSiLu6bSLXF2jTikrPXcYN0MdHUlpxd0F11/jJtofwcUm2FBiaXbSNbc1J8pBySLD1tj80b6MUK2kcDoJLDlaYrT4XFQ02Vp9XDzAKDZPtf0/nFiJHGoP4aMbk/d4gEbKUvjOowF/z2Bir+XXb5pHndA+nXRLG1cS3FsXz0j8RTMN1nf2Kq5dUdQyfND9TB75xgyAkbb7NavUOfjpP2z/ppd8zDXhM7R2Oov+l77ERAZY4oOJJXHl1qhsgoYOD4nrr4DDpueONvzd81LtrpfiEPIhrNn7olqtk3QCXH4RXWfJsrz3ytGYvDkHezzz95vr1jCvRKegso+kNl2/kve3b5dr3yTVLw0N87a8gX1XNZ9ZXN+hWf32Um6Vv6XuPVM/x8gDN+Tp/bsk3yv9PGU3B4TtboOsbuJ2P5FnwELCwsLCwsLCwsLCwsLCwtfF75qhW8Dq3mBYuM8I1ub0jK0XfjgBaCqOJI9HRddmwVt7oRii2XmSGI7ZqpfK98re8+s5cxSkK2cY6iSK1Iscz7LwypnUy3ZTwjd5pnj9DZFYh6VNkEgsg0Lk6bkKNl0VPVMLPtK3WGuzgSA3bMQbgE20XHN0J0XeN2CHFs8A0CI45aGIGPcNZFynklhJvB9X8wCMcaitvYKMrYptsXlZsnJUihbBA+diDb2xoiuk3iJbd7FOPbF2uYJVlYr2fmURrtl37Z9ooybWTxX5eqQxq43UMYonCzIi5u7XG6Q8dpzHqfWHcaA7TC9QmlmL01kxBgvsz5PrLkpFTtQ1aJyI6vFPib5SI6c1ecRImTboFuAblKUvDYNYyF+278BSHeyPVU01a6RcqHG653Fj9VQrIUl1f5xk7Skl1AslkvM3oyfbY+ilLXmCvB227FVJfBHilAV/Pz+gT0HfFTrZNWI97QNSlURxdttr8QisKdYFK0xFRvmWyLSFmX+1Ni7hvuWOglayeHP93fE2pZGCNcW7zV/IasD9j1C3yMkw1yYgVzGsBHmdew0FgXxMIasAtb6N00FgZHJPAcUzfZZ63WLQFZFqMcsxnCAYguJCPdyPVQz9JagW5nzj0dErnbXpoZuY/zpA7EqsPdU+h3r9bpvCT88Nuwp4NP9UQ0LpI171qJ+tvGxGNKSe58F5VFlQxOq+jc8tM3TcgEV+YZmKc7zzMqWGAvx+wrB1wZ5fD5p1q7Es+cyvXOuSA8+pykP77jSub7hw8fRbOe81TPbwTa74f6sOtjAZnoWITVSehbX9OrYUH4te7B2JZXtQCrFWJ6RHBKi2v62kus7xreLnUEOauKLuL3cngHc3hi7mtWDy3blaEoQleI20uqP4zvU6r/aAGRzafY+BjDEG3bvSNXUyzxTKQeBhK04o6RU3Ce43lkeTMbX94XrrO+dpiDdd0AC3aPzOlp5YdwgMbPP9gr5ZvtM38qseFYt36uC63tzdj82K+cZyIq93Zf+W7kUQt8ddP/6DaB2/PHobWHFb0rl2nn79qaKJ/ePE6U9bzgZiWMBHqk8LsM25AEA3Mb/fROM9tGDMjnMduwsLCwsLCwsLCwsLCwsLCx8i/j6CV9S1mqQHr/XLyJ5Za8tMLM6WN3i/mA5qENdh0VGb3vLmCmGuayZlSSfs0UzW4DysbncYjT8grDVdaFK7EQyLVAGaYtQFmttWJQyYrERnW4BttkhF9Km2xCGo73cbNGP7XrPFJvWP27TmXqYydRn4LHz19oTqNP8oZBVfgF2SgTyRoB8XMTlc2bdbMTqjNhlJVPI4zW1MmZ2p14t5dtxpXIysjoAI4uI+TUxzK6rTz+7Xm0h/4REnlk/+3NAX9DmJhspMiFWer65umiId+njO/L14qLuN8inN6RbGC1utcZBNWvjAORK7LJisql+gUbSsWLV/rZDjcQLaMpgcbejKXGTBuy18CiKh0rZx1Dti43s5Xwlfq42u2AjbAtJWyyhQ8iIpth1qtLYjhVCOFcLZkCgwRSp9XbKhdZ9pIgcciFMRfEWdwTJyBqa6nhPodpBA8h1UHhqNa/i+jvQ3weKon6ux4qdax07+9vG1cf2rflt7IWum5h6tiqb9xzwkSM+8oYtZGwh4yPFMhbVJhuw8ahVis3XzlPEWMY35TLeOQukNmdPpvwq4xdiV0a3sba+1aYrzaOpcrylkX7czvHtttMxQdncEGMdiD96y9GZdXN7xw2Ws9fviFNF34VicWrFzJvQrp43XPYshi/l63HEr9/547t8ki7IPDa7K8PbAnvr3uG9550agPptc/KMz92mfijzCcTekzMC9Op3//fsvXFFXs/sos++H7gsCcXW+Un86aexin0brCylDUmvfP9w23z5Uabp+Lof5oBPb99i03lHGywmbShONCf5Zn/7++BZ7N4Z7P4k1az6ts7KJzJ5sF2u6Q4xnP2msbaRZPLdePLtKWQZ/bLyeGFhYWFhYWFhYWFhYWFh4ZvBt7ECwEpY+/sMjnzVGKAWszRlgNW9gzWwU4/6nfhndZFicAqOIcaLv3aO0/l6CaoKrWX1hT1e7BzVGMPCUiWVhxi+OQ19ZeXjIb+B1SCstrW0MUKCW0AVKUpcbwdsi7VeXcO2zVwOE+jcd83luqqOJKZXtviFaW9NzIS+5vHatrbVYz6W76wMbznNfbO0VldVkbSFcT+fmDSt6do1urJeNHtoyncgmLlc30Y/TkY0pzrmNl9SwmER3F+LWYxfSx/rDy/i2zGeN4NCO/f2TAiJYQ77vDguXh/uF6Ao+FLqxLBX1FRiXbOW+L1nuN0g9zv0FpA3ORIc6FykqSdNzVtUWiPha8TjEFeVSWDrV+z5QupknJGIew7tJ0MQQ0bKgj1FbLHMh4891tu4k7a3kPFp2/Hz2wduITWrZyN3H48SAzirFOI3KFIOjTjeYjmWSZGbUqixaKUqYQtZmVSQc8CeAvZKPgdRfIqPoa/J+lHrkVTnQuTr2se6IWMgLEsmlNi7RuhmQPaqik0yEr9AJ5cB9FjB/bpp0GLpnAIeOWLPRRm9ScItlHHeU8S+R1jc4kz2z2wwYWN4iwkh5JavqIELmftIFnNSy/hpIdlbl3MosYm19o3mFNBJ3z4WfYw09uPtX0f42uYCm8+ybfM4mS9AvHVwOVg7ckGmMEjhX54DwdjwA5nzJaQw5zndPOI2izTVsLehtb+FbJrpOT8lfuuziS2srY8+punBraMVFqhdjtgztwjXV1ZVi7jrQ9ekXXN79s6IQZdnGKuqNvbt5ffBoe+toRmzzTdD3Vfq1zO0jW7nhGWrf+iLU47yvL6ymD4jZX3/bEOYVzefbULDca6qfUMB87nP5Tll/fQa5Mmce8Ximearpny4rw/fvzNy2J+7Ip59OAfg/Lp6sndQ7+fxe39oTm/PqLzvGyUP/ayqcP5pbXNxgpet88LCwsLCwsLCwsLCwsLCrw++aoWvpARBaqo4Sbn8HjcUdRyRgOOqOJVxXIhs6e+3nv5R2RCTloX6u523cuy8EdAHtakjp7etLAKZJTO3j9UDZ2S2LUZ5hdBMDRxCWWRN6XLRqZBIWz/Gi02HcZqofpLZIAJyC30RmMix0j7KzwSgV6QC3frZxoEXsFhxYs0xZfGhcbYIZ22IaGrjmTKY+8vXx9qWtRwPQnPAbJzpmg3XQTqR6dW9BiY8b9IXamfzoFkpb81qWhp7FcZ5mkMf6yClXRKOlsdM9vrzZwvx3rq79lnMBtvOsdKV0zuLwkuy2reF6jtNY4vQkeZZSjh6R4PsJzPdywFy28r8rsodAYYF3T7XaUE/yCXhK58+QX/+uZK51dIZleQNgIoMsXuNgPNqy5Kp/6pSyDUxIvdiOLMNfVXQAoU0fIt7I3LvIeHTbccj9POfth0/7BtUBW/bju8eN3z3fsdvfHovDqq5x81tStR6TGHcfcY9phLDtsYIFlFsMeORIlSLYjWEHm/WypOqHFYVZFV8uu2IVekLABmC933DIxWi9/GI2B8R4QfpJGWNW2yDpBD6m4ZWBSpaVMY26GwDXX8Glwgb86DlXBrPSQZCkmKjHTPe4t7a/ZE3PHK58TgmsUhJm9PWSNwQFLdbqoR2UTxLzXe77bjd0NW6lRQHUBXRwOfbA1kF72nD/oiQhyB+KPKtb0Aw63AjePn4MLcUCIkOhFqx9I0KECBvgrwJYKTGyNHP4QhEzfQsmRF4jvgYi6L3HcPZMrM1rMxIY34mZ3oH1PwDYQt0y1mrA5adQjDUc+KJqErQCgBE9M00UcYyJiiqRD2Oh9sM5sGk8UDQsU0yw2+cYUUnn+ONQPWciEBnxCdv2slaFfbum2SyGWqmQD6kn52fPa/P1MLA+E7llyW9c4a20DfOMP9mG6qorJb2bDNa+zsejrGlcsvTbI3DWE6Qsb23CMkZGmOZA7Sh67Qd6PNpaldsfeLv1qtYvGanXkMstGG+cq7hvEzGug1d4r+9AdrkRt/TXmHNx60e1X7/W/u4jRMiWrl/Qxu0p3XPimkfU7WApgeypoRXYwcvLCwsLCwsLCwsLCwsLCx8/fj6Fb5nC7BSyBMmfI1QOeS3RUlWavryPEydOqv7Sg3ilYKvKEfO2mOLS2Y1x+nO1EwvLPp4VcapMspwZVdI9bUFROXFskl7ZtfIK2FftSX05Z0R169gGN8ni4xOSd5/9wu67pxfyJ1ZYD5T7nJ5p0qUk3F/Vcn0DIOt9EWZP+o6hD7vZ+WcxWL0ZcxAbfVEzUv4Ef0xdZeKHAhcDZV8HIhHX8BICpcfI6EKQdcVwr0stt1lW2izkDZVbjZL55AbiWjxZhmhUKWwmL1ZpRKxMqSVStwK0BSr7ZzZV1cit/ygkb1WipHIgfKrCqIoturPnbW0UbnsLNAkXXU7Jc3tnTH+KB1X0fZzCCj5pVNgkv4wZqIIZF8+Pl54nAoxnun6RNFun21l1R/LH8nTXGkIxnmBY18tLY2TqPZ55/nKYZwrgbxtX36ftQKPz+FLNT2D7Fmf2ijPMFEAT/OTOvdlzN65Z8RRy3J8L0yfYWfjc/EuHhTQPq17b/j4wz8WlwSVd2+4wrN39Ze+937MO+tLyjtT7X4BLtWor/T1YHN9HEN/fdrffjxPFNpfDD+PD9+Wk80RZ3ktPx+/nG/0vW95nBL/UOcMszzPnn3OBeDgMvDCs3ORvQsLCwsLCwvfOn73b/8d/PW/8lv44Yf3n7opCwsLCwsLPzm+aoXvYcGzKiZl76pfJn+lLjxpDO137AnNxtGraXPuv2+s2sxdxWuIoSsBLJ1q2aG/xUKtJ+2LM37RRqQrCrgt29bTD2rQ0eKNlUCmPhDqi+ZcFuJZsVuVHAfrvpSBnKDbdrTki9Q/144W6xeoFsFhZKcmtsAtTwIGlS8rb0RQGAQZ4ubKtvUxYHXnGfHNi3axXp/9g2IQM2lICtREHqTN0rm280bjYWOTct9KEWze8MKimwPeZtGIclJGN4XsgTRnlfmOg+p4FnOPFdRZ0ePgmsolj+21Mtl6OSt037talsdwpoz2i/Om8uV6WOXO13N3ffXnfd9i6PNpGFdW85Oq27cl9DEUzQMfp6b0b9fOW1JKH6uZCmy2ILxt0NsG3QoBKbkobjVIeUJrUUyGvZBZ6U3A8VVLvwHdCrmZN3QSk2+FCOR7J/DiO4oCOGu37Z0gQxCguIfUyN4fHhuCKO5bKkNVCdnPt0dJo4If9g23kJG02AiX2L4Zn94e2GLCfUuN3P3+cWuEba7/lvJ3bCFjz510TjVu7xZK7NmtksQA8Hl74BZTjX1b84jiFjNyzvg+B+gjFAI8KvJGj6gsA9nrlb8DWxk6I6qq9bpJy1tOmRJY0RSuNwVSTdvYa0AfoVhd54BdFCEHbFWpnFWwxQyRh4tpXMjz+73MyX2PeLvt2GLG73/3hhDK+Jn1tY1FCLmNuxH792rRnTRAswBBkd4C8g0tdnTMAHKfP97KWdD/Fi1pW4zo+rvnHTQK8PkT5P0D+O67+QQcMtRCZs4SWSFBevxW4KDqPyUhSa3f3md8nlW/KKq54b2ZEjTl/jzkfEwQOccNRivPnDCy9nabW4JIt26197ersylySSl76De9c5r60tnR+g1aajbJPJb0DaGm+pzFNfX1+o1hs3SDcwfZUAd0xfAZ/LuG2zgowrsttO57T+/fr7P2zt7DfIyg9X1kc/Q0hIH//Rl8u+p7VkP/tvIb94a/azt4DpkKnL/nLmPyUpnD33avTBw0WprhGrt5QwrZw/1W7yudfAdIjMc8MZZvVVMHkyJX+Bu7NGxU61aFbFPuuj4r3bd8Ti2vJ4rr74fv7oONu9RreXxOKP3/QPubHAmU6hus0xcWFhYWFhYWvlH8y//Sn8H/5E//z7DbN/3CwsLCwsKvMb5qwleZYAUGMqURuqwCqKRvs3o2Za/QT8C48OPKnf7OhJ1S2Qa2QbTjLa81WEaVrosfNrTHFqpmgyJuAdgv9PLC8ZkUzdsSoi8Kq2v/M+XAM5XPIYZbXYRt7TDLzukia7EtncYepDZe4iTe46jEdqrbs8Vmr4ICjiTfjAjk+sNkzs0UOrM22PHo20DzlMsLxgo6zGwlAy2S566M+4Uwq8dbXvKCOs8BXpS3Y22TRyiEHI9Riy16YvPN/1abSeHFZG/zaoT8jNxo1zC/pja8bdBPW7emz5UoNJ5Q55ep1FHItLBrs38WI+WkE22lD/WnEsFN4Nq5yynpew/F1vkjF5J3iwlhLwO6p07+/MHH26AcNdL2UW2aQ50v962Sizm0tCUmcETKJZ+INhvmMqQl3Z4LMRcr2Zxq/F4AEFHwUzFDStxeUhnnXYA9oNkvE4E5kL1eRn12AawcO699DO0aDp7HuZK9di2sGpWhr1vIZV9RI+WkqXbNxhmi9XUlVQFcyHIbjzYOZm+dy3281YueVSE5lLxQfORY4vtqaaMktC8EHw/a+mJoQ6fUp8qRgOdfI8PR41DH8OVkhN8sAvR4vrM47egEZSes3T1d1XLSyM5+bIAnpWbPfT5v4A1dHkQy9Zjgve6hrRSr08fuZYJvqgy0Zwy9y4f0B/VhfadQvsN5Rq431RfilXfJaViJS0cVe6YH2qzGxLazSebYt94hI/fxOlhVD52ZvLvqvxKejM1gDT3WO03n4e20GVZOJLvmWs4vqsY+NE/1YEd+FmvXbzZoGxBmFsfWj1jOj0pmR6jyPcMKYJvn3L5DHbT5s5LFw3EQQcvWzUZyW32Tec1tPouxq7ZZ9EUM3+bkXDD26Zd7jRcWFhYWFhYWfpWQU8bj8UqMoIWFhYWFhW8fT2QSXyealXPOA4nSzrEVslfl8gIuMBK09jNbOLFyZueZALZd/3zOLPCsDFML2+LujPg1cpjrBcrxbSs/pOSwBSHd09jnCZq6AONiG8fixb73fh7s/7pyZKrsJEIMOZ0vXnKetiidCoFuZJuVw2Nj4+rbZO06q8sTiG2BNPRrcgYbG6/USaR29XaYfNwWmoXOefKTMYyhlRP7XJr13Yhznjcxzq8VL3yfwRMsdmxmJX1lm8n12O9GAvH18jaVnqz3duHRtWuGrIcfW6xVp6LvZU3ag36fnZIXJ/NOt4h8j9BYCdtUiVrbnEJ1TclfBWQHwl6fc0pEr6ITi1qOMXnXyhKUt4H4Ye7K3r2Sg7eQWxzdvapHUw74w/c7PlIhgmNNw3bLqZIjb9sOER2IWiN5AWCLGUGAPcVGZlp9qeYJIWOrdaQTMtYspRVAytViOoU2HpKlc1Pexhl9zNoPKK2WwZMsI9kLIouN7KXrZNdD6KcVa/2XhE1KXGOzp05ZkBrZG+q4ABJGC+xc1dTl9uZntyClUEhfG/PQrZ2DFOX0o5aNjD4Pqf8tBu8M/No0QjegzatG9ga0uV7mXUBzQngF7V168XyqZOhwP2btcWMz3ds84WeqWFMEHuo4KvaG54VXJHoHkVm6UDa9HBS3RDy3fnGc0FaUzElqyxdjj6nu0Eiq2s7m7hHDoBj2z8U2vu6dMSWHZ5bQ1j/QmD/bAMAx4Gd4dpzfn4ei+/fL4XnuiW//XrO/g4vb3r7x6H3G4+VtsSfX57Q/lHf2/vHX6xBawztyUD8PeEIajvda7uRtPXZoX1Z4stfqaO3231XgeRJO5/tw3G/K4v8H8PDHuYzh/wNyI53tvmu/n2zuEPvmAt1vDsMGDPftPxDEF6rqhYWFhYWFhYWFhYWFhYWFX1981QrfRoJMFRBlUUZSIdEOsXuB+eKIJ3iBrh60RZac6rlaZqQFoUSLul6l4Rep+BzXnXvfBlWvX5w6s6F2ccmGngcqr6k258SW2CKsKSlEoCAFLjCqa2tdxXJxsig/EItpVGWymndKqBvJhsJCqELf34/nM6syafGYF3g9QWn/JlRiN/RyTE3i6wfG+cH9TNQeJne5v9xGJi+d8qaV4YnsmXVkTnWDgPYFfS7HrIyZkH3s5XdvyTwjJ6d22/XYYKldx3CwUMbYFxvjrGVzgvW7lZePc4fHJk+uoeV9fIyL6gAGxfoVmWBkS4zj4qr9PVMFxdj67+NoCi/8zwgqEWCL7fmkEcibFGK2iF6LEt82b0jlGytpVg6ik7fctZrucM4I4UzcZUSxgq5WxY/UlbE/pA1Zi8Vwqn3YYm4k7qfbji0mfOzFbvg9RVi82LdttFSymLpGUqZKIqsoUrZjUutIuMVCGn/ssZG+jfw1u+NKLMdQYtEaOZ1VkCH42Lfy87EBSZr1sgYtYxi12TdLFrBKdyB/7fKFSoiyLTPQtk+JSiF9jSdkJS9fniocE7p1YshV4ZuQNSBIxp5i6VtIeAcQ6jVKKSClYgUdgmJrFtloe5k+3XZ8SCW8szSi3eL+fr4/8KnaZluMZt3DGJcXx00CNp9so0GxUC991SDF4jlpsx1na+cy9qX/6SbQz3eE7+7HAboC39/+WVWfDwc72yCQsB3fL80iebw/WWXozx/ITBHgdiuqQk8YZUd8cVmmHqT3tty2TvScEVmuPYMts1dW2js60LcA2UIrtBHkVtZhkxL1Y2pvHDqReaoWJXvtrpCt5DvIeUT1tJxmM+yVtfzesnKDQGTrVtOcvxUYDhvShBwyZlbGPJ6Huqk9A2nr+87vOu6bjSHZEbfvKc2YuiNT+9VPl9yvbVO2S3V3ofd5G3f6RuFxO2xks/E08vKxD+Pf+kl9Q5Rh7rZjXoke3Bj7a8HK9tMNfu5dy0p5Z10+pOHNk6zqJaK2weZpswKXrvo92fSltlkyxtrX4z3T7uXb5FllaU8t0ycKZM63sLCwsLCwsLCwsLCwsLDwzePb2g5uCzAXhM6UHLa8rPiZqDpeqfuXgjOFgeFssYfPW5qZEudKBfCltm8z62DGlXJ3Bm/Ve4V2vb6gjqvYea+Wc0aG5slC7kSdAuBcAftjbPdmi7KvKHSzI/rPrCO5nGdKWYZXMinNyTNi/0wJfNYXI5dnpM9ZHWeYpGW1+ynO7v1n80kEst3K/RgFWjemdItRV4e4BX0i4QZyjhS9AJG9lt8IO/T8g9K3VWlWyH7hWOj3quYV7XsqnAQ0kHoXKFbOZ5eF0wFoKl1fVjFxkEMes37OylbO1KYkYCtir1ZVKeM8Bm52jVR0VS/ls59DPk/Eox/v12bsQ/SW0j7roN61H2n/Fu6vE+QioxLYxlCEVb7VjpsIaiN3W3e5e25zwWD7PGuzI76t77qFU4LkFwIpBc8m3NEuNo/HvMr2sr4TBS8mBHFvwGlxU2KHbWkv8Czm6hS/qDpw9h6apJkST68+p5+1cbqxrxOGB1voZ2Nz9v7mMs6OD99GubXhrF623D68m4HXvk9eGMehnp8KF8rcQT39JfBOOFzXs29ft0lyuIfPNmpyvV/azlcx+05sv1/0xZPaX9rGhYWFhYWFhYWFhYWFhYWFrxZftcJXcoZu0klc270voStiaeGmpbNzdl61KB03sjp0eZudWytMejlmkwyMVm6eTZgt+vpFvZTGulkBZG0zFY8qKTNzP1f/1j0Nypb2b1s01qa47Ov5XeWhXkEEFHWCYdsgIRTVLymFAPQ4wiLQLKMC1MYiSlFyhtpvU+ckHAk+I4JNddIUHpYn9XLtGNtOz8ae1aJBqtI0Y1AJtwHI43UxEuF+6+UYwchWwqZUndkcR1Kt2u9WF/+LOM6Ts0VdU0lHypt1DMfMCiilGHhZh9iQ1pemNonxmoid2TvPSNqmdqUx3ifjE+v9w0pmmyO8KeBZfZZGpMyzHMaxucBgT3lFzFQ1lsRY7jtTZAUBEIG89/nD5ceI8PkT8qcN6S0i3yrZK4Icj/XlCGisabQoK9P9SAKHXcvQtfIK2dZUvJa0lqMinUDUQgLeohEUgnssMXz3FPC+b/ioVsu5xpWVGnP2g0jISDbMURSfbjseNd/7HgvRWM8HUdxjaqSkEcJ7itjblNSBqDTLaOQAFanqYDSSN4jiPW3NYjqEjBgFkgThQxoJKwpoKopqBBTVb1BIkgPRq1EbkW6KYI6JbONndtHlItM5AMhlHmq9JkB/TXSCXfDIRS0NAPdtryrlSJbWneAFgJwFHx9F6RuC4tP9gRBys9EOAnx8bNi2hJ+9dUtuwyYZm9TjSTo5WzcJaEQxB7Db1m0iGI4rIKo9tIKWvoakSLGMq9lFt87wM/MM/OydquWPmz785gOOXT+N/8nEyOxbgN/HjJTKs9KrAFkZyPe/KSP3fbRw5bagknOs9lQd3qUzItnUkaZwlhibgvagUo4yunSEEiMbEY38tvPiLPL9BrKmIk2pKXBZzdv6kOj9xs4SWQd3EKvPq6O7ylfpOQsUdW4tT8iSnx0WrpTh1Lc+mCXdEHeVFbf5OCaq6Vi2Dz8w29jkHUDsm4rbNVM2c1uB6lQSe55ZHV6xGyfpOL13q0mpqJH52kho19vUwcc4shNlu0cIxV0m52k5dl2F1bgzRS/PT1Pp8r3M9zyr489soO2Y//+AQclNm9qcQ0BT9NZ+K7fB1aEAsGtXAlt/6f9hWpiWlNrfw/MnxvIMbAN3rGphYWFhYWFhYWFhYWFhYeHbw1dN+KoUsrfF6YVbWPVk70ExIf3fW495e1i0mSl+88liVVtwlGN9nkT24Bhcs5i9fnHLL1jnXBZbaxsGW71KRg2KX1vA5WNbWYgblDC8MBviuNg+sX8cYhmeqXCNtGvEsFsQPQMvOs/shIG+EMukMtsyG2YLqK1sWxTEeB3bQp4bH7YgfOU6q/Y8Vq5v08GOGePiayNZeB7UtDGiWTgbPGkrlRxux9y1DYLBENwvFs8snmMgW/MLMnZG2g5WoRjJXiaquQwirw/lA2Db8mZ3PdiIuwV1aseofnblnyw0DwquWbsYMQKfP0FjKM8wexwlG18Ue+dcn1+CrrYMdZoYacmXKVZS0W4tp/htxxxUBAhapzcrQYtF8iPFQTUbQ8bttreYvqautZi7ocaULUNaCGMjNYuFsLa/HxRb1sD5y9jWvLHEALY2FvIXjXgGgL12Xjgvk7CgMQk2tr1uDTxYlB5l7Hsj6/Hc05pKuFk7A10RLAqFVFtuIkv2Ys+sKthzxB4yQq3QbK+3mFozShzf2oRK8m5banF69xwQap02re/3HTHmruStZRsySvzfNplq36T2z6y/xXjvUI63uNA0x7RZkEslf/sGA4Tyo7EQ1fkeEbYXYpZO3uuHZ8wzFaQRmvT3oUxfn/+d852V257xaU7qvGDLOovF2ovvBNVhM4rb5GW/e4UrE7gH0tnVNyoLO/k8bCALoWzCo2vwzEZ2sC12OMSdBYolr/XHkaEHC+7az/Ys5rkxe696kpPSPbXD5XT27p2RsbONX9yO2fvIjtP7RLatk9ntvRXG9L4M/ptsr4f+8XnrmshkLsR27qqeISwC243TN9thXjNJOtkIMlXLc9meVB42A05IYh+jN6WRAPbfc74vdn4WYmVisT5TGx/G2NLlDA3hcC+Xao/k75DGNiCeWcMvLCwsLCwsLCwsLCwsLCx8k/i6VwHcIkyxQ7UFxJO4vabsdfl1i30xyMi47NJ64rdZ+LrFoOgW9ViZBPRzs0VEJn19H4Fx8cgv4vCCblU4SP05lEtlDwvBMTZVAZdr/ZQYSppqYawu1qrMxsf67O2BJbT6DkTkbHzYvnewC56MY3Zq0GHxPh+vxWRchn4YWehhZRnZMFtUPiMheDxYiXymlh3i5E4IbAMroL1qlusKda6KFCI/yNhm/pmpYjl/q5eui5HTL1miu7mRKB6xLZLPxuZMue3bU4+3ee6v1XQRPveflu5kAXoakzv3+L0TSIyQ+x26hcE2NyRtBNpgpwugqSprrN9Sz1iuRiBHNDLYYvVaOiPoBqvnSiJL0Ka0LcOitUsBuwYkaoyI4m1LA9lr2EJRjBpJCwB7JSLbUIqWWysXVa86cnccYx26yvUZ6XsLncxkorjxIRa71/ptBfLfbpyb3fJAAOvhmGQppC6V11TAggPhPtahhVBNJeZwhgztN1L2FjO2mEa7Z5VG9n667S2+b85dgZ1yIehvW8KtksazLu+5Xt9G2tIY2THiZXn+9HFQiOqxAsHwPi5q9TpXb+EYH/PHgu3jT5+Pof8Ah3dje2f6+L38LODvAU/yWHlGwsw2izyzWD2zjwU9b1r5ejjf0njCiYjD9t7vN0g7pvb98wJaOa1O9w3g0/mNPkxo+TqtvaYA5u8bR0oeQ19cE9alUfm199MTm+op4endL6w+a++sbMpj17GFFdDxPXRqE05o+X2dvl2TPJy3qa79uTrH7O9DiIhXrdRr+uFbFOhKeNU+n2M83h+zb1lT0tp3k9/ANdtAMgmFckAoSuZhEyZofGcbM2YbRM6uS6vDufcA7t6azaWq7le6X55tVlhYWFhYWFhYWFhYWFhYWPim8FUrfKFa4v/ZooZbhJV0skCLvvhc1G9a0hpCwEHZaWSw2b9toVg586LRbKHTl9GIKwBJuwLIE6yGfe/neeEqxvEY2Soe1MGmWqjlas5N4dMsIm1xad8raR2LmkaqjoYVG856UGQb6wO6lbEqmqewJzC1sk6z+KsSiiq3KV/INrupc0yJQcrURgRSHTZWOhkX7otXLrd0lXi8nSwa1/EqbeLxzKNyyNfLRGZbYNdOpNqctPIiDmM/jHWz6DYpHY0nUKyTbYysDLPoNlLXiNDDYjD1z2DtHf6e2GHzwq+N4aCmysc6zZr6rK5mey1j34HxWtj4P0o/my2is7T1aAvMZzCLdbKmHMiXen0l0IKzR4zQn30CpCo+q61mCp2QNSVu3goRJwlALMdNAVosd+t5v8Behy3fKwlsh4X4OAF0k2L3TDbC20SlG1qsWkEMuStqichVLUpRqcpga9EtJuQcajmFqO17XwTfP7amZjXC9xYTQsjNOvotdjviW8hIKvjYN9y3vZC9tTaOSbun0JSv2AVhl2LdHNGVhQoIZFD5loK0jGHmARvHdhbjlyFEogJodsaSx+PF7nrDLaQ290NV9qYcGvFrBHcOZvWpSCngu3xvls9bHacYSv/3HBpR/EihEeRbyKU+oNdhbRL0MbJHL+850XI+1fNils8KSFJo3ZBgc9nmnwpavF+VOrdfUfi+ijOiNys0786auH4/PB4jMWP3NxOMQLFv5/AKrew8llcJpUE5y+VZU7mc+m5Q2+yCkczxts5iG7PYjvcs5q/lj0YSj2N0pRLWwwQnIit3Ylg53INTkJa21HLMgYTHxtTBYeyzohLE9ExX6OiOYVbQ9pw9U7eeHbsCh2M4uGzQtbNwA8DorGLtqWUMSus6PhLDuHGuOpQ063Ger2bxa2EEblt/vziHCu7rmUK5kbQDMU/hNQxeCWz5vSL8xLL6FSvyI2le7yWbG2RtPtvsOOlcywugvaOHzQEzK2iDkcKmkLX2p1SuDCuHA11z+8YDmt1yGwPf/5SKCwJvsowRzaqZ2lTGkJT52o83Aj7Glk+tL7VsObzAFhYWFhYWFhYWFhYWFhYWvkV8OwpfoBO/tthysrh3dryVweVPdu23v1lJCYxqlJl6wNLMFqcOC66TS3NlP2lE9Fn6SZ2D2vEMlaQ+VeD4tO0aeGu7CVk6U6l6VeYZzqxyZ6Ttj4G/jtzmKzxbUPaLonZsRjqflZXdGM+URAaviOYyZsqiZ/UOfaF6/WJzVYAfFoBfVBl9Mbzyl2MqX8US5r8vFElf3I4XIDFAbxt0KzEpm5pXpKkrjcD14cCPhY3/sqK3KXhtitnv0ss1u15UG+dRIdtJ1FYNEaOp2j0bLK+qFK6UrIXFEar2Nx83K2n73fIZ0cmxbrn7InpQyDYL6iw9Vi+IxPQErwLINHZtwBwO0mscyWIcyd5na+7ZlcljWeIUSyPDbUy0Knkfjx6veIsJ0dS+NQ/HQLbjt5gKKU6euoc2H/ruOzkdjiF9s32eHNcobbPDHwdO7Xn5HeqJn4qDkpTKGso9q4PL9xu9ZjhxFJjaF1sbZspel/+gIL1sw9n7gN+1nfg9tfmdoFtMT9SKlxlP3nlnaueT8weXB09Qv/ItwuUEmX9XvfpemLyrX/pOY7i6DiQtfcs9tap+8k5sinAux9X/0hx7EX6+PElc2/PquJ1svJw9C16p/5fR54u2nyq2nep6YWFhYWFhYeFbxvfffY+/+K//W/hb/+7/56duysLCwsLCwq8Mvm6FL4Cm7AUgO8UFa1a1ZLvGaS22lV/gSbnb1DKBuVc1aQzjQlBAKSdNLOJ8/DFTHGf0hRxWDtxuY3qvQjA7OyahD3W681aG7fo3hUOUoioxhUldtJM6XrrvMCtoud2KEiGTCiWhL0BG6SqHfQc+Ho3ck61PMVOOiAiUlU1GynHs4ZRJfSpFxdsK8qoMAVDj5u07gBPykq2Jmcjl8Wq/28IeLcBaGzT3uZEmlpBsi5z2rhLiGLJiqu3c+x6E4vKG0o9Qx3pGUHJ9rBT28QJNAW1ls1qJCVKO05zJwrou5rd4fPc6TxPG8m262xju+zgWoPObq8P6xMQ3xwj2/eYYjBeKPiCV/DEO/fCkhNq96RZKDwvMfN+WBE1R09RSTH6LXcAJYoR+vmH/vCF9cn2w51Qy5lYKsQb0GKpE8mpAFbWXmL9sSWyxftleWOst0wjOrZYRS3/3FLHngFswsrZYNL/Dhq2mywGPqiq9xdzOGVH5SBGhErWlW0Wx6gneGDLebjtSlhbbd08BMVje0PLkyi4awbrFYlV8D6nYEueAjKKW3auiOKeA/IhFsGvk9gSSpA03SOw6BRPqE/tmYQaUOcJo10KLyhedZDVV8iYZGYJdYyN7TTUNoMbwlXLLpwDNgrQHvH1+4O224/NtR1LB+2NrhG9T/YoiVSL8T8Qdm2R81LJvMZW22zyivoqNi6KfmxC5jVTPgKg2W/Gwa4kvbXxyPa5bfR/Yc+cZ+DkNQGYW+NYAVrI6hWUjTWcELjt6lAHvRCqnteM+lrepEWMcXTi8+wb/a8/X2cYtzsdK4Rnx9AKJ3FK8QLTOzh3jjY6qaSE1pSk/zQZX63tQq5vFoHYVZwvM73b722+Yog1pOrxmZhs18vjtckUYW1387gTKnHLvWFbhappcE9u4w1OUVbO1n5dxm+t3kY1bKXesq40DtCufabzahoWUer9ihNzoO83mbghQpMPGras2Dsrw9q3ZY+m29tm35wkpqapFmTshPE/v3av89btY/IZOS2vfzT6eL6Ur/TMVd1XS8n1objL2t6WfxPpVV/Zg/W52z/ZN6Ih5TbmNWZt37f5L5Rh/16XyjaL6wrN1YWFhYWFhYeErw9/8d/8W/pv/jX8C7+8fP3VTFhYWFhYWfmXwdRO+qhBb1HIQs4CdKHPNxnkKVl2ywpcXfTzhmicLQ8BcGeHT2MIOtW/4lxehroheW8Rje2ZguiDYiDsien39QzyyurA1ELW0AKhalX9GaB4WoXD82ys/czguig5kPFkrJjpvZbJt7pka15O9rQ2T+rwtMHBORpxZSFp8QEc6NLj4x0O9HGeYF6c90duUrIH6QelFeh1ehcsYrk3qC93N4jl3kudg6+zjG+vYF2/tqVqI8NbnMN5HLV2t/ywWI7clSLFtZoV4cPPHuuo3YgB9gZWrn5EqdWFXq6XqU/g51ysEtg35Hgv5apxuJcaa8jbUtALkWJXAVQ3c4qKecTXS0+Wt5zNCrtgKF1Iux2rp3JrXLZEDFFvILVavqUpFtNkCAwP/2QhhI3pzTR9QrKCtfG2qU8VeiUnjS25bQo8hjNL4UGL+AsDtloauZwhuosii2FlxXOPZdiLXBoBI2lJA+1vjhMVMQsS5Yhj4K47Nrq8hlOsriecn4CWyAYpNSozkLUpTNrdxbiroQtSHmLFthUz/7qNvHrJ0KQuClAlg12+TjC2kdq1TDpCHDNbN1v0W57m2V0wJreg21drnnGjZmZCru31nejEQxVo3IEmM0LOY7B5E+mrWQvr6+PDeihcTohLAYPVqJNHMcYOdMpigqe9osd+B+bOBLWJn73xL80rfT9LKiZvH0A+XV907/0wRqvTetGfosMHF9WFGDIpZQM828VzVbcSld5DwVsNclj3m/TvT4NswaxO/v72jBqWdfYMe6jiD+5Y6wzDWKUEnoRcO+d07tV0DoG9GyFrDRYzX7WAVjfH7sdlYT0jgob7ZRoazPEao+nfuDEymckgTBm/IOCFw2198T4+d6Pk8YcuYqe5n9dLGMuX78RDntz+7Whxn++bjcBUALESF2T4D2Y13wPkkXVhYWFhYWFj4iqFAfuX/H3+d8a/934F/+c8Df2OpoBcWFhZ+XfBNrABILsTvQNDm3BdbeJHW7/D35OlswXRG9lp53r6Zf6aNFSJEZczH5c7IZiZhcx5JzpZ18rHjSV1qi48R6JUHrT5LY+oDYFgIHIjjK+tBVnDObITJGnJWzkBEDzGBdYzr18Ys9B/Xl4YD0Ujj7xeBzywOrd0cw5VVxNwfJmrHzrlrrH1h7xDfzpXJ43Zom877PSvP2j6rx9rh227kMC+Imwraj2FrE6VnVbrBWzOfWXhTG30swlYOq4H9MS6Df66Q52N9uMc0Q0+uicQI2Yqd82C1DECSIiStnKIM5K/FVC3kbSeAZ1LUxh9qz1MqsH500terXo3c5R+L6dvSVGXu59sDb9sOqce2SuhaGs5jal5TATcSuY1hsSe2NhhM0co/VtctludgVsEmuZWj9VjOlenOQrbZjuxFH0MNWkhhT9RaGguAHE7uKV+uPxcwvnkn9tn2exBt47zFcazK7aV1z1DG/W5xl4uy2uIqSy0rV/XzWEe/zmZ/LbtT97r2N3vmSviagrflkUritvEUaKzE72xMpaQZlGmv4NVnmj2zMs9DaQSL3bc9tupE1cvPp/ptof5bwn8nHDYcnRBKVmZLZu+NH/F51uLqntRTSanZ98Bh8xdwfM6dPc9kotZkYswTs5iRcyfXs7kqTG6qw+Yjd86/m2bPd35nA8d3TQtHwPLh0N/jXNcEZ2TogVjN2glYl64pOuvv2pTHE5eMs5jxuc/zQzmZCEP6l6+rt8a2vO1e8vO1jklRdJ+ocX/EHB9iPKfJXD6042ITid2nV/cMK3R92bN7nMd/UD8fx+iLLJeZ4Hff3qWd2vuRUlH1PoubvLCwsLCwsLCw8O3j//lbwD//vwX+v7/7U7dkYWFhYeGPCV+3wlekWDfbnzPCzxaaeJEo9BV5MStmvzAD9IUbI2ln6tyAUtZV7E+vzGQ76Rg6ObiT6tGskJm4NvgFPetfjKMygptKC02CukhEi3p9sbuqVVRpQTK3BSap/ZZ7tXk2ks3sGNlC0OphtUxKxfbZSD7riyoQ4miB2RsP2SI055LXE6ne7tGUvzkBStdQqjzNVGQ2d2zeRLOOzONiruWHLY5qJX1oAY7tkj0GBXCtY6pC1aNC2+r2Vs0MazfbIFu9nNQUOa0+Su/tlFu70/G8b4NXMds5ns9Nne36EWRM55VVsz7NIAJ5u/cxPKifYu8Lt2m2OF4X+CXX+TuLh8lW4M/aVts3bJz4/Bm435BjKISY8dsC5BrTF0boSiFr81YJ31gJNZgauDyHJBX3gnSXRg6b8rLVS6RcURMD4VFIOw1ACIotZtxCRqjM3C0k7Ck0e+RQGb+tqnvf9w1JpRC+IeMeEt5TsRLeQsYjB+wpNmUvUOL+ZhXsLdZuIXWT/Z1iHWJ7RvUYvlssBOUP+4ZbTPi0FVviGIoNsllIv6eIPQXkLEgfAfJDKOOhlXOUQu62mLViZC/qfaNF1WsXxlS/lTwuDdOBsIVoOee5f64n1bkVy+NJozaCOIZinV1I2PJvori9ty0hZan9ClAtSmdVweOxIceMEDI+3x91nAX3rczxvVpvG9FuRDATwKqd7M11c4EnaU0lHuzW0Z4ui9SNBOrUvpUUTmVsrQ4NQL7V9/iXkD9tYww9H3iTiAc9U4W/DexvI38b+ZbHvPx3fd8Kv7t8nllfmPRKafwuIav4KS1jtriH5xBtHnPOA0z2NKUgZT2Qr2a3DJQycj6KAt37bfh28PD1O7LKk8Fc3tDGCQl6rsZ1v/v3xyT/YMesCrZWHuyZ+f3dvj0uyGguc7ZBqN5UYta9XB6rfqkNdj3GPP0brHyHbdSXmp6/f+lbr8+V3L/hrD5SHA/OMCJVkU/jlibfCWTv7DdX+HuwjZHqWJfbnDCSznnq1mEq3EG5zxvp7F8fpsGOW1p/3wPjnI6xuOQ89l6OV+9bOu6Tjbm1IYTqbjD/fmj5UgISTtMhCARUDiuJz+7RhYWFhYWFhYWFhYWFhYWFbw7fhMLXoGzl68gY5QW+lLsquCXQY96s47krtbA/dqaYfAWzxeKZemi2Y/9q0ZwWh794EYgVLH7h+RXbQkNT3HrFzJMyztr5pWM7w4y886SB2SkebKptznmC0bWP5+YzFalX2LJyWmiB/9CHiWp1Bq8OPsMsv1fH8uLuU2Xs5FpdqaZfaaNhUOpf3D+s+LpSDQ9tpHTqnhm0MeJl1A0TetsaUWaEGABojYltatSizqUFe1tI18JcSjYG01Xz5NbolrqVSAidYDVklUbCAl2BKvWc/QClCUZM7kTeclmq87Eq/Ew/Hy4azypXANgkH9rNUAWQq3KVk1Uysv0e6G/FcUx90z3ZC/S/BdBqWa1VTWz/DmUNbRjJV1NHjyRdVzi3ZlQy3Po6qKCDHsbGyjTCPkAbuZ8n/R5iRQv9q/24HWuEFJfhx5yOtbJDifcuX/Iu+QUxe/dN72VW+DH4XTuzcr1K9wq5PVMdegXvSQxX/7vHVLXp68ac0D1YxU7K/kUwU5Negt89fhPYlyjGX8WXzNGrd9uPqYfJ3dm5k2N2DWfW1yXB5F1IdsIHEh44UeweNwT4v09jAJ+M6+VcZdXsMwUtf7szZvbRr24+GTZynudlVfWX4qU8NM+6A8/zzQgLCwsLCwsLCwsLCwsLCwvfHr5uha8nX1DJEJGi3LWd/gOJS9aOTPTNSFRVINd0e93Zz4oCLoet3KJ5V2KySNxWuMs/1s6q0O1lO4WRKQStvBbrtf49UyqSPV+LTwj0haD3d0ACNPRFIsVkYY8WAzXZeHAMVlYsTFQ1vOAUBLjX+JJ+UfaCiFSrz1S6vs9tkcv6nfuYmdJVveKo5gsuLjGre1mZ2RTd0bVXgEiE61ms39ZGq293c4b6nrXPNXW/t3SVtMyVbN62cl14/EMcj9mctyFm1S+rdExBxDHimirbLQ4PC5K0GJ1pHLl+Gz/f9zMV10yxy/abCeM1G+4jaz8Ox9p94es7s/gGOhFi6p+6yCymhmN1eyOXJ8TSz36G/OlWyN1K2oa9kL15w6CANEvcduwNRanaYllXfjIUkrjFUtWRhAPQy2GyNwL5BqR7HRcAjxzwVtWyH3nDXq2ApZKFikLQPmqsXAHwvm/AtiOGgPd9K0L2W7lvY8h4pACVoi6NIRfFK2FP3XLY1LyHcav1M/EcQ0aqBPMW8kBCi5GyucalNbKyFViJWKA+D4wQsec3AFP9ZvTMZvn8QCdtjSyNtc4DQYwab7ZOqaoe1toGTm7tD1DcYkJSaSroPRfVcgiKEGq+RvgKVIH3PWILGW+3hETqexvXiEr4SkZgG2yVrsadEb9VaR5SGQ+zCje1b+u2olmEx0fZkKCh3wohYVC1axDg86fyTuJ3ywyTzTmaA0zBb+pHI6oG9WrW8qy2rPVZJkAnjPx7cuaoMfldtSomzbmCFb3eJcArDj1Y+ZjSoJJsxw3ettWRvp6sa2VZun2HxXZtBK8pPieOG74MibGPbajH+V0CjM/uqQODG0Ogx2SfKYBzjyNsriBDP03pHDrJpilP2zO1sbY5MmljUz+r0rfRSTx3fifxt5F/l02UsZfgfrCaOYdRlW3fBwx28mB1fNby/UcOHF2Jq0N+my/e4WW4z3iMTTluzjX17yH/tsE2E/IYD/O1qtgN7T08ux+8crdlIkL0zBFHpNTj1LJevdvSOOVxK9ueBSLA/Q5ziPHW8RbL19tVNytv/v+ONM5Xf4+LFPV1y2/fiq/EB19YWFhYWFhYWFhYWFhYWPjq8XUTvkAn5JiYU+0quNSPAaiLNkSe8sKrX/jbiFSdLXx5Eo7J5UaqyZiHVbKerLUFr1m7zALS6mnl1YXhnIttsy00EdlbmBenRKiLV22BmFQWbdHJFtjaWNMC+MySuOXfRitE7ru3DWw2yhNUC+gG1ULahpPFVWpzG0MmN6kNA9k/WDd7YpX6d6VE8RbQljfQ79yHVk4cz58JS7y15Mze2YhmJnY5XSOHT+popLPO+2gkuZ/3fN8cbDUtrSlq6drNFMmWd6ZAMgLZrqFXG8/mpyHxmNfkformo5JNRID7rdg2qh7VO7SIKiJ9w4TmqlaMfbMCtVM/3aFvN+RbQL5LjW9qzyxKquUZptWqGYFuZSMZGZWA68rJ/vtZXNYWEzh0QvUtJkQp6s9NMrIUEtWI1ejYQFPzCooFdAzlelkc2Uwsa6w2xQDmZGTIiDU+bsoBKZd6Y8iFlKzxZgc1cCWHP1KEmu00CkGacyjWzCrdsnnGqWjtQQtSW/9WI1RkTMvkLoAW09enI4jWZ4Ki8JNayfsq584qyCg/AUXhayT4LebmMJ2jEdpEDodcSGBR7CnUa5HbOIootJL0im6rbQ+EjKoMluMcak7guZO9LY6vdVlKXzSWsgzphuqoUR8V6vLYo/bHxKydgYivQ5zUMJIjI/HmiN7hvUjHGETqPlO+Ho4/IXsPZRIJfFBJVoJWVYv1K8XPbaEWMI7HZWzZ6MZtaF8J+3AIH2HfDrkTVcM1cJvVBqJqsDB2z+oTRStb3fprKuiWxwcFqX/H+OOau4J+8s2iHBrgbLNSLecQP97b/fo2zDYdnZHEfiNd7mna2F5tvPP21FaubyPl5WvW5mEkFThdu6nanDd5GWncHgjuGxWYz1EmmB+P6ffw4ffZfec2UTD0WZoZeTpLZ9+hoX+7zBTSZ6rn4V6fzLFzhb42IlkmG0YWFhYWFhYWFhb+iKAZ+Kf/V8Cf+4vAf/2/BNy+/iX3hYWFhYWvD1//CgArWoww4YWRRqJ0xabGUGIGPrN78+o/U/LyYtBMIeytpf1ipSeX/d8ze0hWBHh1kJG6vs1XsEVZp/YRN5b931BUBkxqhqP1olcYXcLKOlFWiu/nJM0lPCE4Fn7eJu7jbFGer/Vp3TInI4Gu6HnWFn/+rF1GlPJC+VWZvODtbbX9/GUY2erHdWbL7K+tr8POTTYMtPwz22VeMOU6/KI157V2A2PbiRAY7S5JDROkqp2J8DlZnJ321/J43LZC9t4K2auxWzgXhWWJgWrEIisoW72VMCt/oHGTLe4q/d1INT+dLV1AexuYwrbHke2kIRO3Fv+Vi7RjFq+3ELbjPcg2xYXMrcpSUWwxNRtiES3TmvKbepfrtLjCoRKaFsdXjUCtLKnQGA3K3jagblyGc/5esIuFTvQG9Di/MzSiU9u4t3bVV4CNcaDGsFo5hhKjtzy2tZG4qtLI3kaMA00lbeMLVLvtStxndDV0u7Y0f9ocItOKokhHm5s2rjx2pu41q2yLU60ylt2GNqBvQPoS2P18sODP4/PI2506HJ4B07rqu3JqZRuG9+jhOcFq38tnsydRw1Dn+Kyhc/YOaM/2PH9XTsmrkzKfwI/ZgfAO4XS8Twko/y6xZ/kM5tRgKm3/vebKfMkmmuPXn6Vx9rmjbfCMCBzHoOX5sVbPrqyrerw6+nA9iMi9SsfHDuftOlJ/zuyXB7Jzdj2uVKj0DTxsIjixN3cdoLro/c7fcvw97PPy/ewVxc9g90E+Pl9esVU/79KTa1vLmN6fCwsLCwsLCwtfOVQVf/D7f4g/+P0//KmbMkIB/J//r8D/4S8cnfEWFhYWFhb+mPD1bzcyC7iBbKor0CLVMlWL0ldkiIUJoBC/QFerVEJYsnZLQcYWe5qUbZW+qB7NqxMox5jI9ERyDG0X/qCoEDkqLEy1G0kN6hat5H4rf+97Vc3movrdtpK+jpPmPHIZrMoALSj7BS0jER3RpwHNpm9QMrqFRgCjEoQVJgyyPVQbX7NYFCnj3xYpt65gBtDsc2cEaRtbW5CfKGOtfqCqrXO/tkD/YAsYx8LIxWaPWI/tNH+4Dp5TVo61fbCpDsf5x230/UqYWD9LJwMG5a8eF8UTkaQSSplsz2x9tb6wWrrdK2RN3Yhdzq9HMmTfRxKWlcFWZxu3OM5f7kO0+y+OeSWUQ2wRTePoLRFbVi2qROQdzZ5xkm6qVANOLZ0lCPLP35A+bSOJpkTQpkL6YpNORNrUTcXBIN9kqtplO2gjE5tDsQ2rAvsnIOyAJEG+AfmuiDVmrxG1e4jYc0SuhOEtJoRKFob6txGFWyzjmnLAp21HFMX3j1tT7d7qZbH4vkW5Wo6xxXOzdK6q1iDoZYSM9xSRcsCf/Pw99hzwd374jL//7QfcYzoQmFkFuocyBjeFRi0E5EbXxEhaJnVtwIKi2TdnOk9kfBl0rX9LI9/5mnE+yQJkQB61nTc7J806+y32Z2kQxUeK+NgjtjoewUjdauEMFFJ324o6OsYSn/ceEv4gveF9j7jF1Ij0UMfXyHK7bqa81gDkrbQ37OhW4Rltg0Aj0EMngFtYYylz2MZH2vMIQFUJZzPQiIJ0K6r3qbrQY/aMr88PjgE8qFNtc0fKw9/NgtnK9fX4+N0+jIBv79kGoVeUvR7eXrpaxw/Wzt4ql8ZGqJxBjRuK+rvb04f+Xn4c3+FDTFCzrh+6R2NreUyN7MbbY/rsnSlRPXizWZyUPQkP0Igvssc9PLe9Yre+O5VCFTDZOGw+ss0H7T2Dab+fxazlNtdGjQQn9XG4FqyS9opnGueZBTCnfTXebFee5uFd2jYn2Fzyym+2/AZdD57bPO/tW9fuAbovpsQz38/2O1lID/fKsVO9bb4crvd+qxbheSSCw9gXse98N2as4J2eq6RyI+0lACG3jQvTOfRsA8ErVuELCwsLCwsLC18Jclb8U/+t/x7+7b/4l/H4ePzUzVlYWFhYWPiVwtet8CU1jSdyh2S84FLJV/5Xsg6kqGS3mDIoOHQskxcMvWrXwIrL2SKaJ8BO1BHTsv2i1auLdM8wKFBJqXNYjMVAPqtXK2OinpqpZwYS1KlO/bU9W9jyal5Wc87UqlzHGc7mlRqZR6T/oCp9svjmr7kR16xEPeQJnRD1x4d2UVlMiL+y4OfLOjs/s8U8U1P7ug9zdqaYk7GvnhB+BUMsY7lWbQF9kXumcHvFDpE3HlxBQrfNtc0DdopIRBORtnTWLZGRULQf7cTbAEcY+98H0sCskCvBy0rTIIrN4u8ClZTNw/kg2hS2sxi81hzVouztgr6u0k05QHW8xmY1jZY3NMtjIywZVoaqAEkKyXoGG78zZCk/nuT1ZVi6CxxUxZbXzqOMRWrjkYdxtHGx8Q8hI8by03gHRSN2dy2W2DkHxNBV0IJCot9Dwlbl43Zdp32sY6ShErWB0rg56xW85V07zu2hTCmk76Ck/xJIgAQZyN5yePYenTw/eHMMY6awexYH0z/XufwZviSu5iTt4X1+ovIrzdDX65soP1kteJVnwMmz8LQts41iPh/9fqrK5uvsN/lNyLYvJcOGjWb5pJxZyALDFTnnCMID2Uvv3Cu7Xz5+dd1mCtCzcb28/sB4/9ZrcLiO9r34xxFTdvI9+qPzsrL3Kbk6Xns/nlff4YcY28D0PlL+znMOBtO6fgmK8oWFhYWFhYWFXx0ofu/v/F383u/+3k/dkIWFhYWFhV85fN0K3wNJ6hZuWa1Ki7piylpbdLRFWiPubLHFk6x5LGcg01SBpF1h6dsYZVT97qQiYIUA/+1VwUNbSvtVtat1rN1+kYqVQrPxYcIJx4VFVsRwzDaO/8t5VCcxVIHjopWPOYdKonJcX1PcpFSvYyp15jAqe5oVMPVN6nElMpIJWStLQiVs0mTBtpKGgz0wySTbMcWgJvWYqUO5Td660i9A+3llf/pFvOTUt0MIRopJPSOBvZp3agkqR2Izh1HpdkbuBiH1jFsYPls8t+sTBAiRxkj7tWDVMlDGat9LWZHK5/i/Dryhwatme6xCF4/Xq5FmkIAWs7lUVBR1obgPZFLw2iYSgRFndSNLne5m1awsYDZSTUv+sAPpTQ4OxEasNQUmgLijKTaN6A2hKD+NSN1CagTuFnJRzwa0uLJbJSMzxfXNKtgkN6WuqXVTVdwaqbun2NIwE1iUrMA9jvFDFcAjBzxSJ4Q3ybjHhC3kRk7nqpTdU0BKAdilxcudXyOqoA1+HRNFJ3s9MU6vHMsvucYJtrK48UNn6sWQI5Fc2h/xOT5wE8Fb3PFIEY96z5Qp3At8u+3IKnh/lNd5zqFeQ+BR1dCqwK2O56OO+z0k/Hx7R9aA71PAJrmptEWrCvfGGxNKG1WBDGB7AKDbkeemKJryV/ZO9kouv+dI8zkUwlc/3YZ3zasQ3mwyi8fu0zOxZQrZV5TFBnunzoikphCd2L5O3uvt/d1cF9y72lS11k6/cczUu16FeEHY+di7HCfUx/oF0FW6rU1fQI6a8lpkLIfs9Plvqe4k3Df1bikeXtFay9E0vs/HOLyT998Mk/ekEW2aUokVfAZ+r/F3jm+rHeN3k2aIbP368zu7lteIQafKHsZac3n2uTAGQ/8mJPsshmxrQ5SX3n2DMrzV1zcfDLbetY/tXmBlL+dldbvq+X2rOo1T7dXqDS0cRjjepz62t+r4HTBpw6B6p3rUVL9AjWlOKl765hXN/ZXh5vyw6YHafSjH2hzKfHhK1i8sLCwsLCwsLCwsLCwsLHwT+LoJX7cDX+PJIuxMXeuUK23hq8b2VU/8UAzg0/IBUmjawgsv4mlfIPdk8oEYc4tNPk+tY1jwuljonamCh8W8J2qblo8WwwY1r1MEt4V3I289kWvY9zLeTYn7RJFpC46gBciBhK1lxJrfFsTOVJeqQNo7aWhK3TZnal/UruOkDxKAmxsrKcTYUA5sk4HNCxq7Zl2ZyjhZW2wsuL2Wx/rFdtE2ftHl47EAjtaVfgwNfqHdX2fuL7fP3xNnyicb9+gIcbv2TGw3r2JHjnM6O28WiL7e4Aj8E/V4U6D52JmzjRegjRBGKJyofWW7Qe535Fssqkagugx0kkyD9Fi83C0m3oBOFDNZuNE5LQScHWukmw0zqYE1oNkcm3XzFgppu0nGh46L2qHaAT9SbBbKb9vezhVlaSdmgygeFju2lrHF1N1PsyBuGVEU962k+EjdSnpPETEUm+JbzOBYwveQGgHKqt+kgpRkJCOFxm8Y3D4WfXwrKcsxehsBbOXawEutQ+fE8oGAH8lejQqJhRjfQsYWEvYc8Z43JC1UNq/lbzHjfY9IKeBWx0vrtRNRvD+KT3S4l/E0kh3ocX3N3D+rYNeAjBpLWVEsxSun0eZGFkhC2z+TaTxNWd5IXp72RIxroGGzR4bFsN4C5MolYAYmejmerye46jPIqxhnCtYrourwDubjIkeilzeiDBbTnQidbtZie9oYiyU2xx0dvhfCSIbVtMLkswP3kwm9bpMcgZTQwy9gSMtE5KuqX7OOtmf7jFy2dgDoxLQnTick7IGoTONmkWbLPGnXlJR1aadELauIafMat8n3cWbFOxwjhw/V8s6ex2at4zfrZ8ChXdx+I9BbP701tMMwL7RYyR/aZQS+35jQ2nVBODKhLZMNirOYupT3cN4rlv19XMd1+GbhOu071+f3ffKkN30fT18B9M11pqoGAKH447PNAdM2wDZz0LdLbduieRcWFhYWFn798I/9F/9z+Ef+0X8Yv/H3/8ZP3ZSFhYWFhYWFnwA/wj/xVwieKKVFmmbVDFSV3GyV35VVy7iyh54qQnjhzy/oHQi644IfE0cvgxehPAn7KrJLP7EmPItv2tK/YJM7tpv7bcpWIvCe2UJ6oo+Vt1SGiFyTvL5834cJQd4XAGVsp6lPz3AWi5f7YNfRYt+eER883k1hq8drFwOVKSOBfujrj1RwPbNXnm6+cGSvHeOYvwyvfL6ai6/grH7CEMfa4g5O68xj+leqjwG436Bbf84Ik7BAJ3sPJCGGZ9OQTwEVqT9UlpHEvijfZAE0aJ0uheQ18rR1lwqWevwjx0pGljyWz1S2ebiNpP0rooihK4CZGN5iQgwjqcu2z1Ltoo2w9ARmy5MDNIdi52wso+Boq+yJ3sNgobwpWzxfHfPxoIaTuTCzcub6pZQfWalc4xHzOLTiTE3N1tVcpPbrFUNGoPGM1BZWZWcrp5LQQuOiAc1iHKi/G+HLY2HkrpvPveG1PC5HpJK+F89Jj+mmJiNE+4R/KYQBkz1fYns6e2fbu/yEZJ3WzWWx6pHPX9XvCTDDQMiFQ1neHvlQJ5HS05iuz+y3q+qQ840E+2Q8XvkOIqvg82fzyXeN5f8RuJxLJ3bNL4fQmOHKjtm+WWaOFTMl8C+I2XdiJ6rD4dyPLvtVBAozcjZneM7P7pGrsA1GAvv8doznNt/D/O1wUva0v5meG194X8xI46Gts3jHCwsLCwsLC980/tR/9E/hP/Wf/Ufx6dPbT92UhYWFhYWFhZ8AX7fCd2KRKKmqXJnwqoRiO0bphgUdVSCdEDwb2eEOu/9RlJiNVKM8M9WukdS8Cl5VPO3cnnodPpaXL9vZzpn1bDtmagarJ4T2t2ydpJQQKqkRxoUrbiOfm8WtS0WdWkjiQjDqvtf2kKKUFublbevqDkNKnSTNSqotHidSaIhTsZittO/DiZ0vtq2XEwEg9GuR9kqeBoxKWhlVqTn5Uml+VvWs9dOrZmPsfQxWZh5JWlsvHBaWw/GYgTca2HjfTm73M7tHoM8dVmozgW3jwBaSHlmBsNXxqP23+83umzS5XtamVMvdXd2+PrZ3BvXf0nk1IPc5lbQ6UUEPipkTy1R1/ZdY7Kc1B7Cls/zGbwB/8jeQ7gG6lcdAjjVebrUdNifhkRSr+fP47NCJyhIoBF2+o1nscmxVMSvn0Hm5ogoDQiVPP3LEZzwAALsG7DngkUphAYrP2wPf7zf84ce9WTu/bXtT/aZcaMtPt724pavgHlMhFVEsobMKYiiKsRgK6dusoclWOqvgh31rv5vl9Pu+IYaMN1F81LZllPq/f9yQUkBOAvmQNlYacyNX2yBb3N2BmLT5I/242TjPVLyqJW1GJ33bBayFKyCmOK5jLkBR01ZSuqiVM7IGRCnzJtT4xSIKbQRvGa8QMj52m6eFZBcUBXAMGT/sGz72CFXBb7z9UK5nteMGgDSQ6pX0DYBuQN7qmNHmA1OhtzmjZS7ZXNaA9qgPj5rOQgDYayiXc+mtzDlRhYog3yPil5AS9T2gVXIsQQ73ub2H7BmsgYiPqmwUUgm22pkEPostfKIsHNS6KfWyt+3kGRfG/KxapOeRvduGEbJNJ/Y9A+of52XlpZFlpuD170Uil7zFcivnhEQa4uOmdE4+TiySD8e9EnWC9r6fcc/Wr5kSeGIv3YhMUsh69XOzSw4CkW0cP0cyt9AWbDlNSvNLotMcURjO9vdwjvrg+ztL69Xb3HZLd8i/uW+IV2Ju25x7EhNb+PuEFOTiCVr/Pp7V58H3JocJsfQT9f2UZDVlMNUr5gpECl/QfTaNGW337cX4lblWnh88NoI+h83GeVD2hlDuW/5GA7rryMLCwsLCwsLCwsLCwsLCwjeNr1vhCwAiRzUv0P4ekmbtRG/Ny+U08unsPMMri72KmNWVQCUuTxazfdozNBIyzRejfBlewUMLZYfFxpla2p9nItgWUllpUxfaB4tCCX0BkewKD2kNRvCeYTZWVe1S4qXVxX0m5u2HNwHMxmsybkMdfmzPFmwbqU/nh9iSVC/F7Gv9N9XzZBF8VG3JccF2puCl8T7FiUKp5T9L64/N6pq1kTcseFtKy+MX0Wft47pmSu0z+PFmtbtXw/k4gq8o8jVPF1glBuC2VdtmGVS6gxrXCFrQ33B/T1TAw3NPe1oXJrecrsfFTc3yCOwFB3RCV0SRIXhPW4vjK069yn9Lrdbi9w71O2WqVCLXmtpVwl3ZG0iRakSzHTPCuPwAOdfy21hVwtb+5XHyl2r2KJ4e8/eKlSnD+M/QCHq+9SDIGpy6ufT1FlNTRPefTp5LJYZDVUBLJcgtrZVp56MLVm0Ee5srs3bX+WIxfsViI+txKOadpn957gnKxpEvtXS+rCuM75wrZad/D5zd3zNV7dN2SCeAfdmsUrwisWBkrRyfTz8GfjNaO/yCS8jkucYWtTOr3yGdI1NPwcRkxaWi94mS18i31oZXlL4X43ywZ/b/+radbTibtZ9iH88wO97mh2vj1TWdK7ddOSGcl+HV7JNr9tL78kvg38dnbWHwdyCnY+XuF+Layvzk+3batFEpfPwmztP5PWxccXme/b2wsLCwsLCwsLCwsLCwsPDt4utW+F4qJAq5q6RibSpYlcMirMbQyeAZ4dvK0CNNHp0VnOWz48kt8FodfmE0Y1wY9v00snZPhTiyWK+q0JyrSneiTrA0BxLSEcI44SZSKjF2WSkzUTe1GH2m0G390q7gZAUyMCowDRxflhWYMzRi1NRYpKStBIJEWkjzFsEcz9WIYm6X1QGg2Da7NGcKGX/cq5hnbW2KMCn9nZEfFgs45aK2CVLiILP6ltsBjEoPboe3QJ0d90qiK0KGlbuYXWPqP88RTMZr20q/jAy2zQO+HUF6XSnVazi5JrN2z2LlsVUkUBQ2fK/WxWtPQngFmvp5Rv1Si98rgFisbpESE7USZxbLV7JCIRhC6AZHDitKaOJMsYBRyDRFSSepHrduVHUmQG0IikBEYamqkIB3SbiHhN/Tz0gp4LsaIzaG3EjGvSrO2QbaiFuzcTZ48lekxK+NIeOxb4f0RuyaylcBvMW9xfV937dmgVzaAOQUoEmKIpcJ9Bl5DtTnr0s3JT1tEC1NHVhWDSsgWUpMXzsOIaJTIKlqtQTQStZmlWZNbepbU0JHdHJXVVrT9j1ABLjf9kb02hgYoR7DSPjeQsI9JkRR5GrHfQupXP9EZHQlZbXOK9s8IDspeOs4zWzIRcv8tfHUSr6rYFSkC5BftXT27+Wq7rUNFuLd9SeKyiGGJlufzuKHunySc3/3loPnbTvbOGJpyXFjWsZAzIY6X0YyDkD7xjizXRZ+ZrGq8kKhK9bHC8XjmU218MayCfF6zCPH86by5Fj2tWy+fgp+1saW9qDmjdKe9+2bgBTfZypi31eJoSqqc3M0OYxFEDQHDjr21NKaxoIJPSaTT8uI9VzsTidnZXel8HHcD7bA0seNldRTq25S5hrYNcNbIA/34SQe75C+5jnA57u6H/k8q3BJiX+Kwfo9NyLcq2u7y4021xvryzQmb/vG1dM2mFOOQA7XdXAgsbZR3xfZu7CwsLCwsPCtYX3fLCwsLCwsXOPrJnzrQq3OFl7r37KnTrAacVP/1SCQfWbbVtScusW6KE1E6YRAHuqNVVVUbf+G81dK3pTHNKw2dMoFIWtqSzeQvX4BWbUqcPsCs/JYWH6Xt31IzWIiThbPy5i4Rc+WMZywyXSeCVfLf6XYHJTERirUekw6phm6mypTC5FopCkA5IQWf9dUvLxIPSyuunH1yluv+OHNAUxwurE/9qVbkhbwnDOL5VB+tyRBANnKPDIL6avx8krqwWrakfW+r8M1rn1vNtxUX1sEPjZlSvrzWBuJ7QmgYWxdm2akrvXBq39PSIjD/zzwIi+TwsBU2VSsuzNtInDl3TbkN3rs1nlQrJpRn0v1nBaiFrESZZWAY4tnjqGqIlBzJ69pLY1uaOSdqXqNNNYoJa4txZ+NISNIIVl/SKXQLWTsOTRLYAFwi6kpa7973HGLCZ+3wgRmFbw/tharN9ZYvSmHQkxWO2erL6kgVetmqYrWH/YNe4rYAWwx4dO209CV9n6kiL2qYh8pYs8BKQtyFiBJHzyeHhmNmG1j2NTV2o9HnadllbDfYFCZUbXxNMtorcRuKOOdpJCmgR6MJRZywhbKfb5rsdJmsjtlKWQuyvS63YryN9broyr4fH804l1q+z5SLBbY9ZoBwCOXsdvVxQLmuRPQVeg07/KtjGNINbmWv434La/NomLXOh/DjnEcAeQoyBuQ76HYHs82PTF4Awa/my7Uk0xUTRcI7L3H5JHZGfPmDntu+Xe6/W3E0SQvgCMx1Ta0HN/zpwQUfxu0NvfnVyPJrLxKTI1F6EjSWTmMGQEOwCyKT2PoeiIP45gPdQNAps1is3Kc3XQjM298LUrIAa7PK3DPFoYORO2sDfS+6QTykezlfsz6NCihY5ie82jl1DactVf5m5PPuXe42Dtmogw9oKnOr4nh2Tx4JWb1IZ+ba4Olsy+H77sz5bdvw+T7W/k+9BvcuByzc7a/bVODpanW7wOxS0Q2z/uW5+Qb92wDGl8zqf+vUa5nV4QfNra075dfosp6YWFhYWFhYeEnxJ//zb+A/92/+L/H3/jrv/1TN2VhYWFhYeFXEr9E/8SfALY7/oxEBY5k7+z8K/ALvPb7WZvOcLDLO1ncvupTU35MFofPFt64zWcLtThfdPT1T60Cn9lnzmwUr2LIDXVeTFVe/GdrYaCP7VTZqyd18Vid1Ht1fTxmdZwtMs/qy5Mxnv39bIy+JIbbzJbyGZhUfXVsZnVxfdwnJuHP7rGz495C/Jl1+BficD/xJhE+vEXoLTbCawjlnemYAsILt5VEM5XlsQH0A8CL1VoMX704J2hqXfsB0GyS99xJQU5nVsvvKQ7KXSN3C09hRIcWMrbaFI9DVtKjll3i2Sq5nI8d91bOWpW/uZajWTCNz6vAXAWundlsJLAe8zZraM7r/p3WWX8VLWRwKESkWtqzVxi6ItrGoIvmyzjGeh1UK9GNMtZsg+0ttIFKKOc4KIuH+UHJm5LX/p0ZENgcDjSvuCwa4lYuK9avnrknmBK9r1j2OiLRk00HdSGsfU/KnRFUqsd39Mxa9lk5vi3cVuDLnvEeM4L5og0zMvOLd9v/EuKKPrOGPlhMPyGAXy1nOj8meV5S9fryz+Csfa38y7yHb67X76/Tb7w/YjydS+579hR2j/lv5Vds0U/e4cN5/teTs1aXtQPXc252HdvfNSbvU2turwBfWFhYWFhYWPgG8Td/52/hz//mX8Dv/93f/6mbsrCwsLCw8CuJr1vh28gbin2n1ZjPlHOm8EUhWyBSrJuBHu/SFHYig1WjPPa+oDQjWXm3/8xSzlQhTUkjvFJf/k06lnPWx7P+szLB2rBt/Xyuy/isTJopeliRY/03lZL0xTdvC82KAlaimGJYSX3U+m6qWrPaDDguJNrYcV62Xy6Vd5LXqzctvaCrZr3CQaRsecipl8Xxf0sHhvFp+fgalwQjIelV3/FWF2tTv2bWdk5/vxE57RTBEtC8rb2aWKTkqeptuZNShfuSQ2kPjzm3odUdaXxcXYOCPPa+cBrVrpzGZAxt7MyG2i9Km9010O2tA/UpdaVnmyccJ7GRz4nKjxA7zvEWszZLx8OifkZRz7RrRteKCBwl+2m1Z4mbMxIjsEXoJkh3Qd4E+QaEXYDcn0dNISmC/FaUlLpJtdWt95r2YQWAvGG04hUg3Tt5XPyCi8JSI5AjevzVWqdExRYTtpCxiVkoZ9xjwp4DPvLWSMEt5KLg3bcWW9bshoFiR2zkbQxa7INDRsoB7yjk46MqToFOZAZRPFKEVKXwR+4kcqiEJuB4RCKmraysAn2PkPcARCNYbbBkTtAyjOiV+jv/3chrFMtoUwRDzslkngrZ0nXuGEERoiJAsWvED+mG39jegfjAp23HI0U8KnluxG2uBLyNQZByXZL08brHhO8fN6RsttqFuP+0FSWxjdtH3jpZX+dLpq8DtX4LoFGQAWyPOt/sccFzUtDU5KY+bwry2m/d6rxjK+0YIDFCvZsCY6LuBTBaOl/FS23FEGHnbGOHTVJ0rCl8/TubiRlg/ryw300FbEpgs41ndSF/21xYKlvbZdt62aTsHd7lVJ4A3Wr3sRe1ID//Zsrek7oPil6ydC5dKe2SbTuSbPxdwekxEmCD4jFnKHSwCrZ3iSacX3dW6VIdM5vdQ32B8lCIiNZPe3bzjR5dO5rTROg21PXd1OZi7VNrg39XTXCIJTzrs9/c4M7P6htCG/h3t7ftPjl3ion182lc4llef9+dbZr0inxWvHJ5s9/pHhYjXJPbpHGigEei+cXnciZ1b+jjHWOfH5S3Qbsiun2Lp9xI3vFZ2MNgtO+XX2YM5YWFhYWFhYWFhYWFhYWFhV9pfN2ELzASqGyhyKQMk5S8MMTkp1/g9en9Ob/A1Mipic0rk1GW1hZ9bRFYpNtBP4Mt4AzEYz62cWYpOSF5D/3zaaXHi5xaFLpFwhIflNL5Pk1UDGpcphGXXuXVrHmprDCx35uNH6t7z6x2+dyZctssE3muzMhqbjMrr3zMXD4/q/cVBVIjOGubgkDOWCxPrIbJfD/rhy9HaaE7UDqek3oy13xZV2mGWMoX125WbsTYTvt9pjJ3csUhNh/Q+zVbMD5ULYV4cO2RtzfoLSJv3GccfrfYvaIKNYLChjbY/QU0xS9Xk7VZ3LeYqjqm01DIvKBoisxB3QomUQMCRkJViHi1HKb2NbLVEGvsXaCTumbxzArfWAlkoEynINrIZVOwsprYjhu2ShznFFvbYeQ3ANETdRQrenlamIXzTOGrhTBuxSmlPy3/nHzUWl9Ogl0D3tDHM9LYJ7JpH64FjOQuMZjb+NU8KQfkHLDFXCydt73FRL6HHUkFm6Q+nqbO5S5w38T9Ho7nJI+bD/h82eAzGQfbbPRMmdsylPeE0jPioPadWLcPtsfASKpSOg/eDHVsC70T/DzjZ4eHiwk6KBefvZ+pDPVhHLhdJ2hj4ayFW31ncY0pf6ni+nksIlDekPYjyaeDUpcxsav1MWaHR/wTe+SebkK0TcjpGQ7W1UEwhFrw7+Ocx3b9SDXtSFhfzJsTZTxf16Ni1b5n+niPCubjdRjKmajoZ/fjF288sLRjxa/lm9z//nu6bFq4uH/r7xpCefY9+5azDZH1OwNIh+s9HX+c3Hf+2xL40fNnYWFhYWFhYWFhYWFhYWHh68bXTfj6+Hp7GhdpgkBvRfki+zGuLQBoXeyUNFlUyn0B/Eim6rjQnWpb9r3s1t+cwjKgxQYGADXl7bYRsRp6Os4LHBe+/N+s9rVzSvG+ahrlxbSWVUcFEI0PgB6PkPrOKhePYUGKF6JbHWFYWOwZjXzPTQnT+0vEqSMti4piQqgaTC1meXNt1207LsYbibzvvZ5hQbOmi6aqyEfSd1Dk1v5web5cCWgMoRGTNna8KOwJaT9nU6Yxrn0NsefzC/te1TyMmZvfrACuatke91I72cuKNR6PttlhQuZbGQxOx/bcdu1sTLi/3NZo7Z0pu8PhdyHy0MgTBQ4LwVNixdtPW9uJ9ZUYIT/7GfLbDfkWahxdLfFVC2NXCOZYCLFQ1boarSGgmLtoJO4geDcCVxQaZSDf1MhhLfnzTYuy2Ka2AEIxfL3dcummIEBbLN9cycSw7YP9816VviKK+5YhlXzMjfDNjbg1a+dYYwJrvRZBtFlIA+hxgWHPFsFW2epc74couZGiIgqoQHKNpZsBQY1V3Ppc5/hwrP77EY5pmjKXnz9ELlv+Wnf/G3Xg6ZjnBHeB7iVe717v01soMbpztapmwpezpxSgQXETxX1LA3n+yAF7CkgquIniLSb8/PbRCN63UJTye474/UcZ18E+vJHa1nYd5qOdYitnU/2Gvc6JzZ5fGDYrNOtyyxtR1IExTrnz3nkmV4l4Oom/OZJuTn3oLZV5Exi/YysZKzEe32tMGHmSlsvgsrgvV6Qv4+obwD2XDrFPB4Kpt1dihGxbea6ZO8RMuVj/vrKLPSP1Wszzeu4QaxaOpHT9GMr2dVGaBn5HUz9k27oLA46E6vBNw4rdUK67uHi+gyr2BAcFa+x5pkS7/+7BcWzOxqq/83uM+SFurCOsz0jsHv9Zm0r5bLxftaHW4Mqoc6BbEdPmxydWy5pSz+O/U4ExHjefs3vN0tF3Ms7mbulwj99rynz+fw+u10hf3rjiPxncNWlk8ln8bvr25es5tXEPxw0KS927sLCwsLCwsLCwsLCwsPDrha+a8BUm6kh90xRyWaG02iKThblG9HqlJZNGXtXXrImJfAy2sr8dz7WFoa7gldttPKd6JPB8e/h3W3Ay++aUuh01L+i6BWHh2GV1EUtE2mJvqaIQd7rvlWDri3O9r7QwaouU905eK5PYlIehWq2f6yJWU+DYJWOSt1lXhzlhyHUNlZBSw07HMJKfXk0VpJ8fyGCv2sjjteW5yGXl0IkhRlv4rour0KpKdQSitYPL9VaFBm+/bEQzE7atbSikZKY+RGNi0K+tb4uBr621v52Tugmiq5aK6pYI2umCd22jWZRye9m+3OoNsfSRCWJPMB/qeKLQNVJndm6ywG2kQOvXpA6JAfLpDektIt+qnXMEciwkKkSQKqHb+MIA5IhCvqXyvFORxgeoADGhkY1FEQxovZdY0RZ2NLIXCoRk5GUpX0PfW7CFTLbOGVljI2xvMTUrZwWaijRLIYJv1RI6SnnyphwQQ4ZWUhdAs3FmNMVqbdKeA95TsRmOVe3b6qppf0hbU8IChaw0gnPfIyQJJBmRiBY3d4hznKS6kldC1xphhLfW+8Ye70beZpT0No6tI4JRTl1/cp83KlqUqHt/LummkC23/gRoU1aHSobHkLFV6+y9jmsMxMmq4JHK+LBVtogiAkhZ8MO+IetnfN4eeNt2fJ/u2DW08QWIgG39hU2wMhx1DlWhc5mvoac1NXojelHmphHIpv7VW918IICkUphuhYB8Cq+8B6BZR4WvU3GKvRvb+ScOBJ4o0Woj7J/zM7LXlxEjPftcvY4wauSUlT3boDUj2ogkaqSukX5kPVzcNFKvk8awhXF4PEZyC47oq21u5BvX7y2eHfE4wyxOLId6aIShswHuDXLvErvuKfX3z+7CALh3pbVxFmZi6Gdt45BmsoFtaGdKUAkDyXsgvi0MhZHJ9f3JNtVM9h3i3Fo/qK1MSg91qx6uyYEgfEFprzxvat0vwY8XE7HuvvN1GJl9UOb6DRP+3vEk8cwB5+wetnxc59l8tr74TWjWJhqDQTXM968RxuwM1Jp4JOzb70lbXoHUeVr/XwDzDTELCwsLCwsLCwsLCwsLCwvfFq630n+lYGLXiN/DQg4rembnRIqdKu+i92TabEGMyVlDUwASaRvDsNB62pZZm4NMjp1cSiZ4fTrKOywcnixkPbNupISuDc8XDg/wC7h+YdOpHqZ1zIg961uMYx0zFe8s79W8eaX+aTqd/36VzrfrlTo8GXnVT8NkwXHAgQTnvnjC5GI8hIj8V+aLT8NtbCppIqv5x+ebbQTxi9FfisM9EKBvt6LwikSmUTVswQyMhFvZ3NL/LcfQjg2bWbhc6WU2Yg4Acs+vRviKdvXticbSCElW7Nq/ZhM8UwdfgS2gOW/K4VAepzX7aG6LGimcpZOyA2npflphAlBs3VOLZ8WR0OU0rR4dj6tL67OIQsjqmvvMfwe7RqgEcEyIRKaX/o/3hjQr7ErQqzSCd9ei/h2upVXNj0c7djZ+wGGcTa1+NTx8H6i9F0+UulO4+4ztnf3z5vL9ZQTSDN7d4xU4VXE59OJ7cPYuflavJ6GeqCSn9ZGyWf0mty+Atzw+U8E+jdk6Ibo6KTn5xqDvskIO6+hC4XGyCe1QZn1HXM2fgfQ+2ANfzTvXn6v4w1+AqXJ3hkl7eZzt9+t7h763pxsRjmT4q/cCk/BfjFmeH3Mve7BS/+Q+G8atprN+DOrfKwgpznF9LU/VvJN4zAsLCwsLCwsLCwsLCwsLC982vmqFr9ICJVAXhyq5q6RmGI6RQlaSDqqUphA2m+esXQVg5K/VdZPRBrpZ4IXjQpJqIR8Cjgs9TPra76bWtXJDVaQ+9qOVHC/wsKUz57W0qmN+srGbqaqKGth1pfZT817Hsi/Q6/t7V6hURYRiXAxUrWQcYvl7Tz29KUKNlBvUqKTq9Iv6u/bzuSqWYizHgaIW9coTU7xILG0ACvFg9s9+gcz66slSVgK3NtH48oKuqZMbEaG93Lz3POrKllDaxfF6TWlm1stsdcyk5qx9pj4J0scm5eO8DdJZGj/uPC5AnyfDfLa5d8zW+tHGsbbLFJV2b1m9QYBwL2OXMrUl9XQMsz+839rfZRzYAzn0/BUD0eEXc9l60pASmsI9CKB5JJ0s67ZB/77PJX7vQBLi8Heoqp+i1jVCVjoR6fKpCATz2L1o+Y98Y7F/BvIboLeM7VbsgLeQcY87MgR7jsgotssbKXMVlYiMqZPAQCOKUyUeY1W2mwpYVfCxR7zddrzFhPcUi7Xwthfr4kpIKgpRWdTCGUkL+ft5ezRb51ss186sn3cNjfxNe5GONltiG48sXeUbFNgUeNRBaiwkgGhzGJ0INiLVlMJBMdg8C5Wrdd56G2dFt/G2/PW8BMXPbx/42faBz/HRSNlYJbemlg6ieLt1tWJRYZffzWb7FnMj8B+pzOPPt0dT/t5Cwj3sCFAkjHGXTeGbY28+Muqzqr7LaEyFRKLNdhwAYikrfqBYjCuApONQ7uVHkhaC+L4hvN3H58gz2DMUGBW+EqZEmrcJPlWfmquCt361Z4S9o5nss3QTAkZT6s8PPj9R8Q7nGDFCzI3Dq06tzdYm7qepI6m8pgT1Yz2xZAYwvENnSk5lcnUaY7cSX8eeUvPLe3mwTo6xld2+IRyJeBmzNnTbYH2U+6apXSOVUd85Lpz7+buP6mv11/IHy2cLgWAYvmtIUUznNFgbx814Mzts73wxJdKdm8alGvmEfD4lHIP060PW1y+RjGe25OxQY/GfLUxJSkXt6+dttSU/bGrk+5Lvt9n9OGvz2QYUswq371//HJiQwT3Eiv9eyb0cI4pJka7ULyaMrRx97DA7fK8ab+n1heuxsLCwsLCwsLCwsLCwsLDw1eOrJnwPiks+Tr+3uIKUriniJgs9Mouha4u4tsjjxS8i3QKakfVkMfdk8YwWZxuYAJulf6ZcAsaFNU8m+7ImVpYDeAGTFpcaacyLzbEvWPpFxWFh1StrappyLjciuacnYpiVzyrH415hXfOzVeJhDGYLgEwWnqm7uT+qgPntchxeI32N9ETuGwpmMFvkWT3h5Hdux9V5r4zldKeWhUbASidBZveh9dU2QXiVvK/PK/HbJotJfxrxfqZslxpLdEZS1/H31zNP5v4MTPxYea3LiqmSOQh0C8ibQGNf4C9xfOvzhAheoC4gCwbytlfUCVsIkEWqVa4iByIQKgfZuEynuGRClOMY5xoj19S8ALBJbiTkoxK1RgKnHCDVevl936AqKM7ouSlxTYUqlfh95IBYyeLk41basJmt8UQeew87do2l/NouVUHOgpwKsatxUqiRrTyuXpWslFhc2s1IT6FronSt7HmEI+kLQKFlod5VyZfXK5mDKLZqp80q3lCvW5Ri2VzU2T1frmkyVdYsu4NdT7+rR3q3tfLUEf2PULrLCvQ2b+28/U7D0/62risG5bDWewQW7uAVENnb6/KbOmbZiAjCE9KX65rBngczi9iZAvCUOLtQ5bp39VMyzdfhibCWTItrwNVzj85dEoWG6buRNqFdYLAiPnEZeKUNjWjNYUKK2+67F9o9O/fsPXoBryA+KF9n30tGfBMxPMTllfm88ErrWZrp9WAr4R/jzuLrIBxiMp/Nh2fv4RNCdcjLNswGtl/njQzP7tOz+402m87aPou/XNKcbLCw7xZf5oTsHcoZNnbml+fjwsLCwsLCwsLXhN//u7+Pf+V/86/iL/0b/9ZP3ZSFhYWFhYVfaXzdhC9wIDybDbNXuogQydtWVHqaVoAj+2xh+LEfiZ7NYu/l0aL5bLFlUKZeLJRmHNvP6l1P8trftoDtYgS2RV3u00zBCnQVBS2AzxZUvWIEQI8hDEAfj5Ju2yC17U21wwper5CRMC6SPbNFHhSzGMnyFtM1j2lbf/I5YThVKXmG5mQRUEIpO+WuIGJC1GdTRVMoW7tmimHNgDy5ZZng8DF4mXhtc40Usk2hFZ4v9HIZ1n5baOS5EaRck5Q6AQb6d7BNT8fjNpZ2LON8TjBxLAHwsWKVykmApvyaCmmGWazCq0VWCYXQCiV2byd80YhaQCqxZnlwnCuVSGtxUCu5phGQBxHHofNzACCppGsxgZXKN8Vm60ZXfIZaSVHxlt+zCvYUsMWREI6iTW0LGBGp2Jvatx4L1RI6Rfz8/oEgivd9u7SCjiFXO+JSfxDFPSYgAe/YsFdla8qClALyHspj0YuzlAaxFV4Hiq2Q7bQKsBW7ZSM4ZcvQRyjj1ohjXoQv16CohOVI+krZGNCUvnacxj6DrJdRiNxbyPhIESkHPFIsZHnMjVRPtZBA896IeBIyIkrGPezYDruWOtomhErU6mbPICBHRQCR3drnYRs+3mSV0a3Irb+hzEmblyqCHBV6i/29+gwnyt4hlu/kOdbu+Vfv/Vc3gcyIJX7uz5w3mIDy7/WrMA1nbfQxTVvzyjeEeFcQSnelypyRTwCG5yDbGivHzgXKhhedxIy9iIFrTiCn4E1sE4htwjP48fDt9ngWn/eKEM3a6z5Jd6g3K3CrCtnZBr8Qmnr2EjwuT0jb2Th0snx4KdSy3XFWMgPj3L64NgPxezJnKfGo0OW07j4b5hjfE6xk542PVS0vfIzrtPx2f7p7eOj7bD76OL12zCzCB3toGc6f2WPzd20ro7YFQYCHi8/8I0n7hYWFhYWFhYVfNfze3/m7+B//D/45fP/9Dz91UxYWFhYWFn6l8XUTvjkfiRdvUVgXajSGrtw9s3DjhRuGaifLiEAeFmuZKJ7F2PULhH4RCOgKR9+2nKE5FztGtrjj9pkN9GQxWGr+Um8ui+9+oW3f5wuyKKRta4MngZs1MvXT+gJA970Tj2Y3NxDv3YZQUdLpfqLQmtnyWpozVbARvE0ZUe2MM80bVhDnSjDO1tp9H/k6MWFr7ZuR4sBYt2HvVpAHQt7mjWzj+FaLaImhLBDv+3Ec/Pgc2qK9zoEsr+mbGvzJ4nam9jslN/a994mtKzUXR+VtG/Mw+FrbGNHGgmGDRRszHa+1tSvT4nCMI5dqBLGGcY7bfcML2ugLy92iHN3KWQKKfLwiROB+Q/68Ib8J8tathpuap6pyNaCcz50jzFGQ3wDZO9ELATI/vSs5510bW5zeWrbeAA3WFymXpE3nYhA5xsztNsm7xkKsaiERLZ5syqERuNrylYbcYipcao2t24akxpU1pXCg8pBia89HrkriOlAB2myNf9hv2GtbrE5Vwb5HyHcbkGRQoQ6CwVTnYuD7hAZtZn9ZeWLdA5qVM+exOqSeS7bgbmX2uqWSy0JzgMeNydgo/Xm0aSF/y+3f1dFF2WxqM0Gu/VLqR1ZBrMfO4gQHk/Wi98+TuWGXQtSizqmIQSne1L6VE7aNVhxDWnhOBiA8gLDX++C2He+hM+Q0PHsHsteHBhhUmqGRsIcr7cnTmdLP8lv6EPrGFoZ3QAB6eAWPGWl2lsanY6LqkGWeR/iYw0A21TEabJyNZJqES2hW0WyXbN8W9RvGCGh+Nw3PVABmya1kuz8QoTPS1hSXsw05LfE4tgfVqbUxoPYtHtINNszAMLcORB0RxoMd9YQgbO1271qpCvIz9S/3xcjLwzWY2UGzepj6dyCCuZzD57EjJ8+I3kpYH/DChgMmYKdpqkpXuP7ZPWTfOfad7b4DJMY5oX6iSD7EuvbxkBNtwKRvqTbWdmzmeHIG+iYyu/ZD7Gn+/4tan6YdCwsLCwsLCwsLCwsLCwsL3z4uPAS/DkieLM4AR3LO//204AkR/EwZ5NvyqoLoSnHb/hwXNMvvP27nvjKpzMdsYciRtj7dy/HZTPHpCdpJuy9VK97KGegLxUxwWl1NwX2ykD21PvYkssznwOzcl4KtjV+FJ4D9uVftKJ/Vcda3L51rXsntr++z8mxjxdXiq5UNlLpO7FuHdE/Q5keYX/vh/jiDm0sSI2TbkGOoDgQAW+a2bERO2u/Dv1ae5aH0p+JYI+KoDvsZ6hc04jRgJAOBTkSy+lccacg5mGj0JLKRvUG0hnXt5QFohK6Vw/bGFk84iLaYvWo/tX2axYdm7rAxOzDj6APC8Xxrx5THnH8/gxt3Tt+UvV8QU9H62YnZfs7GKrtxtN/tB6ikvl3nC4Xv0Gzuh/V/dmya2ZVh7Z6MTSF/5XyjzBn8hgvg+Czwz3fvhPEKZpbNgHsnP7GGfQVX1s6zNr0AIymHPOxg8ouU/yXtPeR98t76JaoTezzdL8DFO4W/gb7EKcJfhyH+8Cz+u3/fOYUtp7tsxxf03d6D03jAtZ6n9V3h1TnDMadnGzLP6j+Liz3Ld9aWX+Ab74vG5eS6TL8z/PwI9syX4fyZtffCwsLCwsLCwsLCwsLCwsK3j69b4RtCV1SJQPYEQLutcz2mpkCtP4Pad7KIpHXBuVhaak93ULGyErWqIPY0EnB+571X8VperiMSUQYUBaQvSxXY87h4awvStogr0tQ3Yv3fwpgHKFaPXrFiyDq3r7XFPs6T0nGRjGLtHtTBVcHTxiYIRLapzSBiVZ0kFFWGL8vqsnKH+qWrhcxWuBGKaRiHNsY25kYiWxlDnzJdSyIDAqk2bOy4ne160vyJbty4H7HmN1WvxYquilfViUK2WSWHHv95Vkdto6Zc1FoxjP1s6apls5+3fhE9xKq6kzFP1qqopGOmbjHlkUyYI1OBcXu1z8mh3VauKYezArftWE4bj6rIy4pm/xxkVOXwZg+v0m/jEMZNBu5ahJ9/Bt7u0K2qeKVW54nYWAkvHY9BgfgDRjLYodjjarN51kikbh7ToXo6h0dtQyVBt63f5yU+b8KNMudU1L0pB8RQ7JpvIdUhDdhzwBaKxfD3HzeoBuitk5BxQiKnXOyib9s+qE6t1pTLgMXtgZQDvn/cgFtRvXLs3ke1OR4HRSuRqF1l2xTmAIJCovbLpVJUuUm6k6yRm1lIDVx/V3QVL2wcdUJmKpDo/RJKDF9WyVpVScs47hoQVPDIsY35oyp4zbrabu97je27p4C32477lhqhzlNF63W4x1TU1KL4efzA97jhh7Q1Ml9yUUbnzfpe5k3eyrwq86xe16o45zmpQn0i7lylptc6X+vvuSqENQryPRZb51fAGzH4HSUUA9jeL7GrNId3h3u3CbtksOOBWb+2hHJ8NrT3d+xKQX7+zzadTWxpp2k5rnENl9Csk01R6975Tcl7pqrkeq/UkWQP3FWvJ+XinGxqttL27bBt03RN9UhtnClfp/W0sATaYwB7UixetM/KMOKMNx+Ya0lAG2+zWB7UsaxCDse6DhvqqvuJj1t8+Y3DzijDN2a3HJ7ZTnvldnsXur40FbNXPzOqQrmlO1GonsbrZccaUiZzn3lODlbsXkmretx/4+fwbOOm2TKXQoojjR3ne9iUvE5J3/Jyf4B+PVV7O2hzYru2KUEQD5sXW73b1v6/oamJzYXE2hLR50VKvSwupz6TFhYWFhYWFhYWFhYWFhYWvn183YSvV6myHS4vINpCpf09s3amRdYe69ctED1rC5O1rbKxLadKUV7kZUXk2UIxg+OK8WKYLV4BZCfn7CJtQYrsmq0eTwCPsXX1sBh4WHRzVsJTpUGzuC6E3HCdZguOYralOi6YmsLTFL5MwsXYids8VDD0d8DMPnr2O8+NVp4tvlHZPm6uVw/7eQLgsIJp8du4X9x+H6PXz0kjqfm6ViJbGsFF5DUv4KpbMGWCg6GdHChMkFt09uOm2tvN5DFvChj6P86DpmZku0omyls/J7sZnql+fSxC3shhxdpGiRwgIR9daEWAtzfo2w15k0aMqdTLq2gkcCMXB/Jsxu7Wf5K7R4log6JcZyPVtnqunZdG9OYNwJYLgRsLWZhVSoxYUtJmCAK6WhQAWIH7+fZopGEMpTOs5I213FSVqgIAoccBjujqYqnk6g96w15J4SyKLeRWr4gWDlaMPJam8JUk0FifHWrPERvk2v/D/UaEsCl91cZK+5Rl7+zZdQuzY0QEVztoDQrkau8dFCFkRMnYQsYmGUEyHpUAztVuGygK6EjPcFNIh1DiI3vlNUNVynhCESayXK3/8SryRug68tZ+H6ycgVEgHToxbGXweT5e6nvhfTu9L8Jl7N7WHiK0+O8D3IYuMSt5v2HrS74TfLpXrJt9W+jYFRF3+rc/5ojfTvB6p4Lwo9WC/C6/IhGHeKqTNpzlK2np/XFCOs5si6fE6pPvFmtnI3fDeRkHUpbPsxPGpN0HTOyovZ3y8G1k2WZ9TGkktCflPlWqHubaZNyvYi2zNfqsvbyZgdrdNjfwNbS22rmzOtv3UolnrXzMfs8Z6u/NZr88UR0DQ31qbaS+tA0DfM3aN4Yerz2H04B9a7i5Ytd5Em+5EcR2HX/crbuwsLCwsLCwsLCwsLCwsPCV4Rfw4vvVgPp4uUZw8cKsaiV9beEl97ye5LQFsDNi9rIxjrT1eZlItuONpKJ2mBqhqncG5SlbUbKqx363H6AsRs4WoyekeMsXY1toagt+JwuzFp+VFStN7WKK3RDGBa+ThchynfKgruE848KadgJXacHVWz/bYuAsFmM5MScCRQopm2nchUjJ1l5arLXfOV1yC47W7kznuDyflslrvg5Wp0hXE7Piw/I/66chhjG+cqrXgclb3iTB//o6BiL+eL17OdQH69+MgD1soKC2htpnGycmqGMY857ZePs66e82/2mRdbCyrPdMs4HmPnGT73fo2w0a+zVsJC/QFJFFjatHe+ZKqLVmV0KxqSUruagipQ70clu3NkA3IDcStJeV74Bsii0WsnG0X86NxM1Gsg5K3GI1DABvccdWlbdbTNiqktTI3RgybnFUEd9CHpS/Uknne0z4FHd0+2Ft6uFhaGQkLlMK0NTVswcL4uF3OTzmERTYclcEM4IWVbD0/KYiHn4PiuNmDa1l8jFqU1DEqI3svYWEWFW4HPt4q+MVQ25js6cIVcEtpkIGn5C9dg2tvCCKXBs0EMR1jBoRK2htH7pljzCby/wDnmMy/N3q4GHLgKjWe4GI2xnOyN4YwRtihnt1+myJdP8GHMhXT+ya+tfXPyGWhtie/n3r3tNTeMtp+pY5WEjPymKSzRPM9n2gpBrk59xZu+hdflCKBiKDXX5TI3ria95vhaYxVm371sgTouwEz+yWZwSstyo+WCkDA8nW4rdPQkdc1W3lTcMHnLS/v3Pqd5Uvt45/GytrVzi+w4bvkIt5yNfzEMpgdh+EcdzEz6mhjSdz0/9uim36/jmQrKa85W/Ys/i9lmfs6LE99v1t94Z7RkxVy540tvx2KKWmVL9UTtfjtsHCO9707w1ra1dmD5sq/IaOX6I9+sLCwsLCwsLCwgW2WH4WFhYWFhZ+InzdCl9gWMSRlI+EbQh9wTlPFiTdYqx4ktQv+l61ATiSfLNjTEqHAOR9QkYamaV9UcsWs4b60nHRzizw7mQD6Ylkr/Cx381msaofzvrflI1Ki48T60CtKiS2jO6qSEfiRqkL931B+rBIxaoGVu6yZW8jNyuxv9OiYSP9TxaMD8R4GAnFA0FP8+Vs4Vcq62SLdPt+JDy9FXAQmjekXtVuWdmsKW2efjzG/EAtc0KyMliF28bb2+Oe5Gn9snpjJ7Ky2ZnmXl6zZN77eLFqOYdxMRMYiVuza7Yx4H6dxN0d0nI5g+qaFkoBNLtUX169J81KdYqBRQzQv+8z0s9uSPfS97DLQZnbflX0dimdUwABza65pc8AMhAfWmOgVuK3EsgQIMeaV4CQpKh+M2BC1XQvRCYAPFJEQFfiZg3YJONDN7ynrZC6IeN937oyl0jiXYv1sJGK7zvbtnY1sJGPb5UAfic75i1k7DngPW2wuLWm8v357WMgLnezmBbFLWb8YZaqoDWmF6Ols42nsY9k1awKYuHr2EftJGa2ZxoxmlL/jdrJZCsj1gHOUqyf/Xp7rUMjILEofIFCon+fbtgkI6ng8/Zo/dxzobcfKdTbRPvjsPYjqeD9sSEGxRtZZQcihZngNdLXro1uimyKsDpvmv10rBsOIpBvpevBbgO7HauduEpPVzZ0AGEvY5a3vmFBUeuBIN8C9C1ehkceNlYBaMpe9/w1JZ0nTJpt7ezdCfR3oXdQOLvfjfw6U9ZaPnbZ6A069o3LPPv2mNk3+zacbXSqbTCLV02pjEW19gfQlZ9UnqktByKPiDKvyhytiAu5WO7K4zi2b4hbHManlelf1xP7XyZCWeWqmobvCo9Gvs1cUExFzeEQIvVtZpPL75RYx8rPneDGx1lQe+txtpA28Fxutt6tfUS6Eg6hO57EaPa255pyGUeeYzGW+cP1xDjYjc/j0Z4ozPl3vgfrt7rwN7BX/lpev9FxtnHD36tWhnfA8e1F2ZRyGLvhm6XPi8P8mqAoxuvvtQ2SUcJVnG1M2/fDBjX7PvZqYE0Jqvtp/QsLCwsLCwsLC78kBAH+2/9V4B/6U8D9619uX1hYWFj4OnEtk/gK4e2YWQGsQYa/xS+iXIEXkKYKo5MlalbmnJ33BJevxxalZ3VcLepe4clC38tlEol4af93dQ5AU0h6gneiCj5TxQzt8fBkLCuDRc6v67SsCTl/hhmBfNbGV+sHzvs/G5srQprbwmNwNh7ThVvtpPizOma4UEjN07s5cTUfrH1X577kOVBxUH9dlKExQmO1K3djeoh96v5m1eRwno6VxPWfIBiUo/Zr0PLD1bc8hThkNAVvJVwDxfKd2QXnahXcitZOOlierM/nt09zZU88y5OzEeX2vMaRaGXiF+gDy3W7cbby1EjdQxod6zrUgeF6XDOarrl0LRTHMWqu+GZpXX/8lPRELwA88pGEaPMuuGNn8H1THCydD/l5TvP5ML6zz+t8cs8eNnB8wYCf4ez5/CXPbeCFtjvF7awuf/7p+9UR2+574sdaNZ/h1Ca74qA6vYKz0D2oTWt5Z/VpfT+91McXvou+eKy+xJb6F8EzxfgEfjyvFKezvD9mvE777jcIXKW9rnB+3KvmfxFclXOqkH/ynYKTuXX2/eSfcT7bmXp6YWFhYWFhYeErg6rit3/rd/DX/spfR/5lfc/9kUGA/9B/APgH/4PrG2xhYWFh4SfDt7PlqBJUs8ViyWVhSm+1uxxH1IjhGEYCuJbVeA5TuWxxjAEMjGSwKVBVe1xRtmDbExFWTZpVlCCP/Ui0DcQvlW2oMdD08ShqACaAUzqqfrxqiO3qqJ8wVUZWCNmRCOoiYXKE6WQRFsBop9ykaDLkFQC6baM6ByAiUQHE68WymXrCCChWzw622pO8bQ6YGnrvfdy2olpNqSutOc6aj08b0BfrApGuFrO2jaFTrLF95Bmasp1ULWwbk0lxY7bPeaJQk5rXvkUl9HEZLJ13imFH+b2qlpXWNq/tHLd7i6U93Fc/N73SntFiNcY5YZwc+SxFZaWqg9LLL3TzImlT8czaBLRrrlkvLWj1FpHvARplJGzrv4X0kpHANUKMyLBm35zKOVNJQgA8gLwJ8q0qegVNxVv6Un+iIqDEjQ07imKzps9ayMUYMu5VtpkhCDWu7C2kprZ93zfctx2fJeM9bU11CwC3kPF9LqTj24amMLU0TAQ/qjr3rcYONhRr6QceKWKvkjQjlbfQraftmf2+b3ikgP2HG7CHRliq2SuL+7cd72Nk5/t0k35OpcfuNVVwqH83ctmRvAxT+6pdc4VU6+mwAykJMls3V1tnG9OUi3Laxi6GapUtWsjdFPD9+x2f7g+83XbcttRiJ1sZbzEN9tdZBQ8N+MhbUQ7Xa2MqcLvPRdGU5cqPh1jGLuza5rZGtHi9pkTXWOanZB1sovPWf5cEhPdyH2i82BTDUAVCLPcep7eNJ/y4M0thVluymnB4h4fxPOPVBQZLpzrG/jSb1wu131PFsZVraX2b7DnHfbG89k1AGOyDb+efhGIxT7XG37bfTRFb2zKUR6rZM0tgH1e291tPVbmWb6Y4bspuu7ygd/TEhcTKUg4n4RS2Q1vonTVYTFPdQL1n7O9at43hMK5edWvHaFy80radn8R+Hd5pk/kxVdySGtmurYe1cwjhEQCxb2jVQcVq9ZzacPP8AYY5a+4a4uc8j/GZEndGTnMsYP42tvRXim3vKOD74pXKExwtuMucaKQ5WaK3Pk9cC9pxLtsnobLNTh0AJHw7/7u3sLCwsLCw8GsGBf70P/XP4N/41/5N5Jmj4sLCwsLCwsKAb2oFQGekUT0uCEfSiX4XJlL5GNAXfJjg9STQbFHI0GyIJ/VbfqdM9u0bLH65rlr3NE5tIwUvrOf8ojeTxNY8W8RlUowtDm2harIAp24BuDeh2hGeLSxO+6E0lpwhTBc+awMqGVCJu2Z1PEk7kLY1D+zanyzmndl8Wrt5wY6vG5OsfN7n5+NZu73xgbQncvuQPx/LbnWyJbWiWUb7a3ZlXWl5s2JQac/uCbbItjJm941tluC+Ct0DllfpnjibA2T5LI6Re6ogYtLXiI1XSR8pC/x6C8ibdOUkCsHV+M3ZGnMlf6USb6cqyYq8dVJXMqqauP9rqsvytzbbZysjBMW9koRAIXpz8V2v/xYSlmP5AsXCOYYMmShzLQ8wqlI5Lm90Ct6NYvRukvFAHPKy8piJ5mTK1r2QlYM6ug2oHzftf4u2AVYFzL55SBZQSF8aNxgxPFMhK+ojhN839bhS+9ojwZGxOeLhmCCLYZxTLOS8KLSS6awEDpW4v1V77EbIC5BzbGneJCFrwO6eb8KvOG4zT/3ZI8UI7UDnua/82OJiuKyA1xW5mqE5AEid+GWLeODw7B7ibxoBxKSqf29evdufgQk+Vu76MqfOCSfWzP75MynvGLfVvYfOnmH2HcC2xvbMs1ARZ2PhibtZWy0/lT/d6NWaWgjBQxo+P1Eqj+TyvL1TZWQYy5IYITkPRKfFVvV993WPCsv5eLBV85kSlst7Sc3J/SOiUx1hPIwBj9HsOk7qKc4Q8nxeuHLPyhvI4ukGPlfP7D6YtcH3Y7aBwq6DSBkn26jhbJ+vrsEUfB8BneRNNEdcX4dNA+libCdxpYc6WoH5uFF0YWFhYWFhYeErggJIOS+yd2FhYWFh4UV8Gx4TRrjygo9bINEgkJSbOtfbO08XQ5jYrYTnoAK284kWVDKln5VnxCmXzXGDAbS4f0ZQNs9Oihva8qa+qDQhshv8ovHMJtoWswaFiIwLSNZ+Wxg34tbG35frF5+8woZVNYfxyri0QPZlemvdgVT0fR0X4V6y9WUy2JP//sfX0crQsU+8kcDaYnVxulkMN/sZ1G1uYU/COC+tzjNk7XOP641hHGduu11HoBO4nqy29N1/lsoJx77aIqWpoxieZB/uHXX5aWxiHBdX7d7y8RThCYMz4qQuxl7Yi8ttg97ioOBVKapISUWharF2x7wYCTJHDjYHYpsukRRtRu7W9C2er/a8VmZTD4eMt5iwSR7UuFlDIwc3SZVc7Yrbds7ZBQcpKtQY8kDw2k90ZG8jKSU3gnerKmNTtXJ+oMQbfqSIROpU7P//9v4+VrvtLAtHr3uM+az1vm3Z3UA/dgu0AgK1QKuClB0lJNJQSUNQyAmnaZQoCRGLhy+JcKIUNbEEE42YiiZ6qOd3jlYwQSMCoXyVAG2FQkMB7QGsFqS7/Unt1/541zPHuM8fY9xj3OOeYz5rve3+7Xetve8r78r7PHOOOb7mmB/PuMZ13QGUpa93SNhGRBYSmEJR9TbSVshhTVhWApgISq1v0m3KoXkaRiPIW/9TJ3wzEzIIKwes1XJZ9h1CLiSv6nfpR00Yx7pdCGLZs+aAY4otbu8hJBzCzqIVPV4YLeauRhtX3NOITbPNQ563VNO19TRVEQygxaAme188BWslrxW/e/dPjNd4+7xHvNr76gwzAmqG2bNjW7n5MZUYbIrUGax9s+1HnYd9bu/VFZocDGq3ec+a3Ec1YXmpzfNl2HtOn1iEI+WSeie5ND+NSvTZ7zOi2R6nSe1dsvCSds/6zcal3uQjz8Gq9h62S90swWqss6dtmZz7YQy1crZEpR5zw1jaeRcd3uV136myhvzsIoeSYDxmQqzL/va+a63Ph/8vCV2i22/H5DDu6n71DjJdmKDTQZ2XPLn+J8eLCnxmg+5wOBwOh+PJhxACzs/PEE+45DgcDofD4Xjy48mh8LUTMHuTpZVoLVbNkzR28lURtFxteGlmu6ytdGWGW1bdiyozoKzql/wPSy8vq/KAUXULbAlhqWtKxWYY6JPSsk/nA3SSzE6qWVXJsh0StBi1hZQtE2y5kGu8rjVbauqIwZJxT30ZCBRCUftW60QiAse4JXATRhtl/b+UIYSfHC82wzECtY49z04OUAzgVfpR6qYIWEukDkRzGs9X3JkU3CHlaVnKhNzFseevLaIDOoEpBEcjM2rZFNAsjrVyh2lc2jG7PnT6ZoXNncCNsfSj1EMsIGfkthDMVuk7kDBKwZtHG89Spro+9LgJhMHeW5PZ1v7QqoSyqauQwkCf7KVQxrFW89rryU4a175ho6IJt85BT3860nlEPqOBBMvLOD4o8xhvXEgzMoQYoVnlAkBIpSuJi610NkrgZsUb0RTDVMlLjgAvQL6Vi6N8Dri1dPvlJSYcKOPhdNbi8wZiBDAOMSFWwvHOujSV7XlMOMSEJSYwE44pNrUpgEJOVmvmVAnjJWTcXo6NsDxWBerTlotCXHJXCQdiXKQIZip55lBJzICLNaIpTA8yJqSjGFgYVklKoW+gyGCxM67ELlXb5jJhjhGMfl3tqXgDd/IXwMDuiwobQDhknC0Jt+IRZ6FYLwdipGqjvSi1bmLCmgKABTn2a+dp5+XewWx17AUph06+1464k5bW30PT1GKBDQjFKjt0i/K8AHb5mFiOxwt0e/F6+woJEDH3oAYWxFjvdTukZnum13u3tXWW+5hdpKJImEYqa5tnYHt/PBxOEoqbY7QCURNRWu0n+aW0Jbtkm1pkRTEWgifGYqFr33nkGP1cljbptlXiazhalIztfUQpktFJplncXU7jM96SmtbyeMhvj3wDNsSaVtcO5TP3OtT3h6uSckQEHOL2fq7rbeqstyEE8HHd1LcpfUVda4839SchZXXdJ/2l67VR5urxMjQkzBdP1LFo7bB1OQNZb5SuOj0RtX6gw1L604yLVvfJooLBblnVrR7UxmRL095Fuv0067Grx7BcWyo/OnEukMz4N8R4C2VilbtmW+mH3n920YOEi5gpePXChGaxPls4yaHVudmGqzx02URbdxOHw+FwOBxPPnzuH38x/h//z7+GZz3nWfe6Kg6Hw+FwOO4hnnxLv/YmEGcqCEl/lZXvzFuS+LIyr1oHnYeehJ6l29tu87UKAz3pN8TVzWPavTJPwfTLZbaDnCYTvYq4k4nGRsKdglV3najXZuKzKa0mk7qyfaY6GewPeVt+m4S94gTbnvpiuk2pjO8Ge2PmKuNfk6rAVo1i4/DK51OYqlkmRLSthxx7mSp7qq5WY0WRvY8bJoQznR3AS3ET4GEs9T8hzQYbYkmq1ztM9ss2HRt1Gwu4TjZXErLFAmYhkEd1KICmwgXQyEexdhYrYa3O5XqMpN90jYrdS8bG2cJaOAsB3cqqCljJiwFkiW8r2dr+s32n+mUD3f813ea2MYvXKySvzcsOxXbuVB5Goav7R9oeq4o6ECNU5bTuV1FTS5/oaiUVH/gQU81nft9k20e1LtqSXL4XG3HajEfbLyUbHo+luk+Uw7rcEE7Gxb4UJxS901jze89mMjFiZ5iRvRqzYy97ppq8piEO7ja/PWiSzBDbM+vi4f9hMc6EzBtIqtBIRh0zfUN2XfG8a9Jzqki9W1zxedBVlvPrRxN2V1FVsnq+XkZUX0mlKYum9HP61HEzNarO626ekyqfmSK8YUpw7tTDkrcTJf2VVLe67L30G1Xu5LtdNKLqcVe4i/Qzm/CpYv7juWc6HA6Hw+G48bj9tNv4I5/5QnzCfc+411VxOBwOh8NxD/HkUvjqCSYbsw7oCjqqM82a7JpZwql9dJwoZEVVkap8qfiYjsfqzzGMdW3HKsTQ85WJQKr5Jk04hq5+0HXRk+prAi3oVraaVAZGtaudSNMkpI1lKEppYzc3qHs0gawJXKAqOmNVdhWVHkv/AZ34hZq4VPa8XeWi7K3bqa1KyiTlYCRprTpY6sMJg7+qVuyqGLDtWM7AyqOSVRDifOJNq1wlXyEJRYVVleSjslkRnYI4GacANkpka+VsJ35F/bxR0ar9AHBciyo9xKbc4ZTRFHhSnxb7GNuypM+ISh/p8zNro92nrz2u9Sbqamo5f1rlPLR/q+wdkLnLDvcmqa3Ke9g/KhLp7ACcnyGdBeQDVSK2kpJrGbMl9i4Nyt0h1m9mcCTkqtK1qst8AMIK4CiFdiKuxf6tp6SQvASx0hUiDgFYlowzIQLBOAsJqcZ8vR2PeDQd8NHclU4xZDAT7qyLFIulEo4ZRYkrd5M1h4F3XRRxKSTnRY5lO4SUo6YqjtQVvkL2DjGB676cqaiXa5uatbOoeBMVxS0BFDPABM7UVb6ZyhBbMgbFLlA6KodGgJahWBjzPiRoJH01MZzGMcqi/FVJSz8sOFM2y3dyxGPrATHk1m8HYFD7XqwRgYAlpsYtN5K4qqzXFHBrWXEWEm4vx5a/EL+aYObAxXKa0eM859KneWGEXLVihKIQP5MDS5o2rjJKrGo13kqh6PdoAsKxqNvzAuRIyJGK28KpRS1K5dqI4XYvlU4Nu4uR2vNIiE4bz1MQ6r0xjcTlEOtzFlJB6rdxGZg4B8zUgpKXqG+Teh7Z43V6q9LV6fewYw0tRKRWakpc2FJkUR5329lK6E5IY9J9JO8iWhGpSbT2jN7WeSC+jJp3RoZO1cYaSmWp32OGupOxY87c7fMlnm/ddiqWbjkgzFXzYTy3p+LtSp0aUXxQCtQ9NfBx3S7UwrzPNBlfnh08qG9Znf92jB0juhytWLbqXaAp6Fm9jw61lGMlvbKpJgktYq8zsajWSvqxkV01r8+Pjtu7R+zrsRv6A7mfk9xv7ZNY1QhKbSvvgPo9Usewtori0Md9uY5yyWtyn7MqX7d0djgcDofD4XA4HA6H46mBJwfhCwyEJaU82KMWZa6e7JhMfGiVgVbAapJTQ9vHAVsyV0MmaCwJPFM05jpTnlXZQCGGG1GbtvWx5YYAOpuQz+r7QMLKZKyyfiaVvk2wST21uoC3McJYLPjEfi8zmu5skMsZMlV/FnXJZROVRG2yn/Vkvxyi459pNepJhaievFdEglViW+tmCvO8tZp4Zn8czdjRatmB9AxbUtcSDRpWdarH6FXaL7bYzX819z7Webdy1bZmz0xmGyoZNmmzpIE6djbW9QTvrM2z9lmiV1soi7Wi7q6diV62eWeuds4m/bKAzw/t2BLflPq4ZCHEClmQYiHZQi69SAFIS01PhUQbuEUqxwOV2KX+uZF0qESx3AIzN0vnBlFwcidSRf0ppK+QuIKzkKodcCjELdDI2zWHRs4ec2jxeiXvOyk2O2hRnorlM6lGZiYslIFQ4vUSFStpySflgBWh1YuZ6qIYLurZWNtmCRYG+Bhav7bhw9TI3Ha5ZcJGCTy5NexCVMfa2plKHRo5LZdaYJyFFedxRQDjyAGZQyO+ETIeq/bZ+nzFSlin3PtiTbGQ8iEX++1KxseQcRbXUk5Y8cHj7RYnWPIMx5J/PnC3Fede56E72na1LdRm1WM51v0E5Igew7ceK/bmovLlJQDLUsi0I/bB5VnJtX8a8Tt5pszip26ISMlzuEdW8kY/61Pqan0hszSpZWG3CXlrF5jNCGPbXv2MtkSxJnptm2xd9lTHVr2on2+VzB2U0sq2eMhbpaO959Osv8y2jdWyJoNn1s1hrMvUYvpQiL5TLiJ7isrdWO/qHaMpL6NKvzMmh3yyvZCugNDfe3VdrqT8NH2/q5IN+2NAytUqeNnf8rNkqx2DZvHCVG1vLKsH22sZ63YBhf5fl63jFc8WX+iyZ1bs+rrNYz8M7VLQY2e8V17tfDeL6JT7Ygek8d225r23yMEtnR0Oh8PhcDgcDofD4Xhq4OPwAbxG0JMambeTNkCf1JE/ux8Y92lSx5K+beJXEUhU4/zqOlnb28us8drEKW/rO9Qrj9/1/7rtSxyI8KEvZnbPtj/qNq1saWVVNY9MttkYYps2ARhiz2rbY6Wsmatw+iTqZtKVQiVBeZgQlLwlHnCr/54FNFGflN1TQsj51rFapXz5G/pJ9/HkUrOEqR5zUp8W93ZyfvbGVDZjQpdh62LVvVKWhsTHlHZLH+r6zupxt/bTegwJObt3Lmx/7PWFPt+W7LXnDWqy1F4fsl9f87YMS06EAD7EgeDtO+t/uf+1XalzjE2hW49vRJmkbemokcCaIG5lST5hZz+wsUsWJKN21crcVMld2Q5U4rXml6q6VxS9XI+RonMlLfcsngNlLJRbnRbKOAsJS8ijxbHYVmd05jtyidsbeCRtGcAaCjksJGxTPss9vmxj1tvU55YXbbcN+zGed71dziWh9edZSFgoI1BG5tDssqWfjiniYo1IOZR+rH0Xqr0zUPJKmdq5icQ4bzbORb19oIwDJaw5tr7Ntb1hRVN+t/Gi640JB563f5J26KJJd3FEi+PLoaoKNSlzGWSxj17MY58pO7avrJ+ns3uNfd7Ks1M/A/eIsmldbcepZ68moXTZs/q0hSdGjSiw96/L+nKPAJbzoEjt4Xlq4pTuxsKd1Y1oeswebEiGu7LxFYgi1OSrVa2ljvPnyV2VacecJWKlXxWmJLnaPqu37UN77Mw++9QxU+LyVMgPnXYy1mb5sRrHl5K9s7L0dWcJ3b267dmV20UTcg5iHIjsoey68OCkPbz9rq7b1v977y12kaNa6HDq+FMxsd3u2eFwOBwOx03E8XjEIw8/jLTjSuRwOBwOh2OLm63wlVX9WhESCMVSNzSykwNA2Jm8kgmwpaucSNS0h2VLuAI9bxrzoYEIFEITXZ0bQ/nMrCxwNSHKPZ1FDEXZC4zqRj3hK9bN0i8pF3WFnTgWJYaeyJJ0WrEk29pxNKaXtDL5FKjkqVUT1aavWB/2iUc9sbkbWzGMk5Ay4UuSdlB5CimjSEatKrbQVsZc+wuXTGpGRQ4KwTdLmtXLKKl6DcrevLXz1m3W9Wl5BfV/HtVXzACnPvmnbY0bmd1VuuXcmTrOyhI5r1XqynEb9aQqr01SGkW6qFP0tnZMzSOHbZkp9212EYLOW+oUqOQjnxGxUfkqe8gNpC26yYd+y2RRru8R07dvIX3CLeQDNUI2rNxuGxy6urEpduvnVl4lDCmjqXgbmUYYSMNGDsvniGLPq9zKi90zA0xFHVyVl6EqQc+XFUslApeQEKmoTiV+rxCrqX6PIeNQVUrHNNpqBmIcU0Cg0KycY8i4taxFnVsVqTFknMe1KIbTAedxRQy5lQkA57HcRzIIFykiVeVrygHHHHBMEZwJHLkR3KXBtdESi1b67TwVwncl4MCgwODa8ZyCYtIV6UuAZTrFDpo1sRsYyNT6ttUj1A9pHFNyookYj6UFS0g4hIiVAy5yIXdj7PeUGIrSWSBEPdBj9S4xN9W0EPTS5ysHZBCOXMooiuxiD51zAA6lmrRSv8epxQFc+5eJEUK5Bwhpmw/oNs5ya5UxSdTi+OruzIS2CEFiAtPZGXB2AB7ZdtW27+R5ZvpV2+xOFKcs95PhmLy1h7XP/pLJth5WCaj/l2MtwRVjJ7+Uu8amPP28rfk2Bw2VLzN3m1ureJzZTut6YXwGN/WzVWSKbbM8f7QtsyaGT9lI17TDAi5LOs/y0Ha+M5LSbN/kkdJQ7vQ4UZNWRWVZOKasfmfErQLrMAg1/VTZa2ywrdXzzKrajl2KcXwFmZ1HtegBqLekPbvs6soh6ney14L0n2qnXF8Ioe9XBGU7xym17a3OavEhLcv2XVVfe/Za0u+Ae2NIH6uVwHZMy/lVCyjZhjyximTdp7LA076PhDCM70FRnhksfXJYgOPa7gWE8i7f4rqLfXlQP9myvo+YxYaBuh00+v3Y4XA4HA6H46bh59/0C3jDP/0/8IH/8wP3uioOh8PhcNwYXFFCc40xJas0aVa+b9S3RIPt8waa5N0QUyeOvaJaBcBcWam3WaJZq4FaHjPlKI//67RXUU0pxZOeXN1MsN5NW2mu3n3c4orNlLZ3dewVZsNm9tO7aScEqWBXYXzimNlxWt18WdrNd3OMVf3O6qePlb+9OgupTKSUwR/HtXGq7voYmXTVaj9grqJR2Fpg3u0YmoztJSKfhUbECukLGN5QSLRZN9L4d5VJW0mnlZQzAW2zfg7csl2oqGcFQS2YyDWubrMYBppq1Kpto1IBWwgBadW5AEAqr1auspMucWtDUw+nSnamFJCSkHHtwMomAlMlbiMa6z1OKYHbsJZ66EPbY0GRvRotFrgpy0KsmQkIgVuc3ljjKC+UG0k+g1RfW3ELpL/09qbgVtv6OciDLbcuZBh3uW+fNbn36bTKAGNQlmsufmjYEq9+H5/dT/dUb0blP1VszlS4p76frNuEsNohKndhHTmA8VmuiCodZuHK9ZL80J/zG5tm+3mm/rzbe6ayXf5YcBV15ZUstvf2a6LWWl2fONaqejU2imat1p5gEz5AYSjnKmNqT+EKbMnIVvYlfSXpZuPhVH00uW4x2zZRDn9c0IshZuVepjCWRQ3DtWIWA+288w7vJhNr6LEsuZ5PnAdxK7HHKDDzQAA7HA6Hw+Fw3BQ88vAjeO/vP4Q7dy7udVUcDofD4bgxuNkKX0vInlIDxFBVC9zJXzsZU/c3ciplYIngGIrqtx7DVmUo0PWwRC3QFZ0S71eTZrZdGxtmdOVv5n68qHxEVVKVFEO5ksZO4opKQqdvVnFqMlarfte1T0La+LWtrn0CmpkHJfHe5Ngw+T7pW15XsFKzWJXwrC6tnlpda1W2K4MOh6KQW9fJ5H7ok21c1F8UQrUPzRgUxaKoDbG1aVBOt1jAWmlblaxNESP5cq/rYBesyrMQxW3mXoaOHa3Hp+5/Gz94IKrknKj2WTLV5q3HZeaqeKzHyBi2JExAb7eG9CfnTuZyBpZ669LdsCy17RdoFtRSx5SmE6EIpIT6VdkkKqpBlaxcBJQSqnQN9bjG0h3LAr51wHorIi+EvBDSGQAmxMwQ1S5xVZbqrswMJkKOKPF3gQ2JxlT3HdFinzaVpMSurceJKrilq3FlOQK8AAideF1CsVAGgAPlpvLNTDjmiLXaCEtc2Fw/BzAucix5UAZRRMgBHKkRuMfclb6l67mRmcccS7lU9gcUEnLlUuZSy7qTloG4bFbHx4j8mFW71X6NjM5bE0rj676FG7FLoszl2n/ttJTjeS0SawZAVUnc1b+8JTmJOxMauVy6qyGlqfR/jBnnMeHpywWeHi9wO15UW2fCWUzg2ubSbiAGarGTpT+o2jpnBpamxCaEauucjV13qOrtgGLrvISMEBipjhMOPYYv124g1YVBKZV1U5tFsxyjSOI2DiV9VPvrOeIA8GHp1/gMm2dmrpmFfo8AulOAqA+BUemo8xNSpN4DmlrWKnPNM5tiiQk7e5a29LocrZrVz3mrMgS28U9t2y1xtaPInb4jWcS4ya/1gWyT+KzK0nZQeAoknVZt1jS7qlrbHwZDXNj6POFQ+n+mJt4ouvXxGN8hhvYb0lZI2kE5PSHC5blAh6VeImlsX85NmWufIcMChTCpm21TNIv3ap02z6Y6plpeVVEq6ZoCvj6vqaYZ9mcVk9e8y/V3QYxj246HbUO2pG9KXbGeRpeUVueJEredAz2GZmXLObOqZaVkZrWvq6nTqOQFwJogF1vzWv+uqC5ELKl40e38oe6LqO8sqr0h9HFBAQi5n1PS9zFD9EpaYHy/a/cat0F0OBwOh8PhcDgcDofjqYCbTfgCGBSG9n9gJG8t9KSTJnsljxi2ebJYsvJ0H4CuaLSK3RnhpInbUwQa0NVVs4lnPVlrJ7RgjpMJo5l1nkxWDf2g8qNiqYxY+z3nvm0oSk22WsIRqBbP4ySY7g89cVkmJMM4QQkMk76tLCnbxtG1lsrN7jd35cNOXQfiNTNYk646/5aHJZgljZ3krRN7w3jdIT0tNFmsx4WQ39qu9NRk/3TMqXExI51n+QopqzGQyhu/yv062HrKRGVW41tfa5rU1US57J/F8M1cJkfFRlrbUzZVTZ28NpOxzX6z5s3Z1JeqJW0IjVWizIgXhJD0WB//F+IrL4VpJAbCWquxdA63qSQzgIAuYg09H47lGMlf76NU8m1kMGEgTzNRI30zBzy8HnCRIyLlUp5KW9KU+qYcwMSNhNexfiV9NArSUNWs0aiKJYatTjOogSuB3CAKXqr9qQlYIboboUuKZVRZaJUsF8qGKlnMoHK87Ms129DZS861LFFOS9n6f2FGuZwHOW9LLLbWoqjOTLiTF9zJSyNzAeB8WcEo9tmslNIZwJoClphxFrtt9qPHAyJxcUqvVVgoIzFhzeW+LjbZAEo50q26HebyFXtxEJAjEFPrhhbDl2uhYUW1eeZGHouqd4hJra8H+zzcnqzNc54zg+Sa1vfmzJ1821ukpO5tG9tZvX+2COSwlA4R22VgJInts/wUOaUJWw255+kybD30Z0t4nSJ6TzwfZgpFvQiMZuXpe6kiIoUYPhnX15LhNV9W92AiGu2P7WKcnbpfqiSeLbRrZdTBas+PJaoDnSStp/nKcaae7d1o7zrYIzbDdoySGbdyLbT+2nk32MY2Hts2nAvdf9b+29RnSKO3yxjX5KwsEtBpNnUN47U3W9w4O0bIekXqtm2N1B2PlbpwCOU+Z+4NnVznQugqDCR56O+eRNTHeAidRAdGIlcWvrXKTMZaVu/eACBkua2Mw+FwOBwOh8PhcDgcjiclHkePtGuCPfK3TeKMk2ccTtgzt9h03NPIpO2UhOP5Z2BL7EnddL4DyTgh1eyfTmuJb/1nlSCok1KzdmirSDl2IPbCWJatrwVtY+X1XdQJZl1eq+v+ZNawP6s2yXfO8+N12aKQ2EsrhGowaTUBaPtxqrydkJ2tfNNvG7L3CpPHs74/ZWUsJKmUb9XPs7Fh66WPa9vMOJN+lUUDw8KBE7eeDaHB48R4YSj7tkbu32Xf6Xh3pwgRwSYGppqEHa7HUBS+kTqZy0BYC3nY1I0ahV8s2YVOqFEl0lp8U32ccIdhPKbXF/0Or28t3MvSXrqayA2N8CU8lhasVb0rxKtFZioxYI1lcCSGqfImD6rKYm0vrCHb5BhN/HblqypD2zA3EpE7YavQTmclYXf3o5C7VM8TSx9qglnyaQfo7eiEtOxWqutYrZtbjGQEXOQFF3mcpD9fVhxCBouldQ7tOOai+j2EjLOQEIiRci9Qzkuze1aVWbkTvtb9mid/cmhTmus2C5Gr2qnH9kCGq7RDuVexzb/smp3dY/aUf/WPZs/QPQJP3SNPxXS9qhXtEGvVhl+w9s177yA67WUE52X1m4WAsO8Htm4bZ5I5GWtxt6EdNtbTJ7D3/iH5NEzi3zarY5VmN+awKW+W92Xj2sbt1e2ctlmN3U17LOq528SUNflI3Qd18olwIHuxlGfvn8O5uETNPdk4Lrw48c65OW4PlnQ2pPJQV33u90hnnRfQ1b8zWGWvxd77ryxokXcg/TdDuPq14nA4HA6Hw+FwOBwOh+Pm42YrfJlBaxotlvVknNo2WDlrNa9MsNnYucAwcURJTbQSjTbPkk/7q8cvYqOcxnztZ4EuQ9dfwxLBszrLcaJa0GQyEbAszbpvW4fUCTqgT4KZCbCNpfKsTrVekpbVJNgUxOOkWrVPRgg1ViVXu0FNkqOohde1bBKSFsrmum7TdRZrxaI01hOotU1RVCW2/5t8sW6I5nvdJpN50o8JRQU7zJmqCb2m7oidQNREoiZYOVcFb2X8qCpJ9QShVQ6J0tjmtxdPuE1sTtTPQP2cT6dr10VQJLzkoRkhc+1Kf8TY+0yOtWNsplAW9W1TQAcwr2oCmxRJnMu5ybnzfQmjkksTvWJ3KX3a1Ny9bXRYQM+8D/l8KVbOh0q0rdwIvmLXTEWFO5CVAC9ArmQxJQZV22mxyhUCrSmACciHSvhGQ/7WLmufuSh/AwC6ACgRxNIZKMTfgnFMLCFjzREpBxAxIhjHdAAAHGLCIZRrklAshI/rgvOYaldzI4MPldQUopEUaXuRIhKX+MDhjLexgxGLfXRIzVpaCM+LNSIfA7BSv76EwCUGFi6f14Cm/K2fW3xa4j60FBldhmXJi9d6nYWelprqF+BQy8mmDjImGV2OjUp+BoCXroR+NB0QKOM2XeBOWnCRltInUqeq9DpbVhxTRMqEGIoC+LAkEDESEx5dDzjmfm8LxDiv5+pQbbqljwOKtfMxB6xrLH2RCUiVzK2LCopKF13RRwxeqDhnP9zHdZDHZL2lrbeAkMpYo7X2b+j7pcu59kleCHx+QDgccGWECLIWp6Xh6lyWezJpq2h51mpUW1Z5pvRK0lbhWRefcL03NWvY+uztKk2l+JVncy1LPjcL+T2Vr10QJQpPuxBFt00fK9v0Z8nH5qnsjTf9QzS+O5xStLZFc3lDhOrPjeietVH2q/z0vk0+Nt1xhdh6i4qStHVvU3kqclo4bUljHCpKeJB5u6fk/yytXpRl3EqKKr2/i1wpv1ZXtQJjpq7ds2qekPPNrnsGbVM9fZ9VilU1DgbsqJTbNaqvFT029xYWyH5dfmnIWO9JO1p58v47UxTbcCkWpl6a7B3I4xgxhPJAeW8o+1ktBJX3KvWupi2ds7qm5P4X+nhu7jght58hDofD4XA4HA6Hw+FwOJ7cePIpfC2E3FVo32dE04xIPaUQsGqbRjirSdVTK/BnE0cz9axVNOhyT9VPE7Y2rZ74mpG2pyz0PlZoIrISrpiR7fr7MMEuE56KrL9K/XaUFswnzg0wJ0SlfGsXPMtHb9vLay8er/xvVaWTBQnTvK31H+0QA6fy0OTmKVw2Fq0KdrjmdlTjwFYRxeP46XmcaBc0EWD+35RnlEz6utZ1tkpztY+oEFZ8KDFsy8by19YqBOqKxsYqAAiV7BXSVlTCjEbY9oI6aaiVxGKVO4SVlc+5E8ZCRobYCcfStHKUELNisawJWlJ2zVxjw0pMWSF5dV6DHfMJlBjCCUsofwElJvBCqdlMa5TLi9Bi71pYqar0d1CdI2QvqWNIkblq2zZ/gDOBm1X0JQ2szCbptCzDmRsZm6taF+j9mauqV/dpDP0ctCKAFtdXmp3rOQuK6M0gZA71f+rHMDXl+LwNaIJlABs1r7Ye193X1L16vKv/9fBgCRlwFVCYk717OKXSm+Zv6mIUrtpudldNKs8we1+3xNXMilk/A08RV1fFnnpS11UvnDuVds8qd4KZenU3711rZdUPp5TU2hbabpvl1/Loz5XHRRF5ipglFetVbWv1eLzLbDbLk/LuxoZ6k+8VFaR6gcIEbN/1rgJbpj3vM9W5TW8XTswWOEzaJudu04e6jars6WIE7IyzvXfS3fcWQxBr15saisThcDgcDofD4XA4k0QLWAAAhb5JREFUHA7HUwM3W+G7R5ZqZa+O3asnE80kTlMAE4Eu8oRoVPlqhYwQhgHjPq10nJQ3rOKftUmTeqJg1m1p8UprelEKXDbppmMALstYT6ArgjXBVdMMNoVEXXVriWiMk1g6Hq+oElocwBhBzOB17fHMqqKFmbvqRibWdNy5GPvEmFHeElFR+7ZKZGCtddWkMYAWIxaxfWZRgYqStqk+7DEA2EonJvFsG8mQeh2aGhmj+kIreeU751JmSv04m24GNWYphlLVqMrQx88WPqRcl4Xk7VjRcYJtmZIf89g/Mg50vZYiSy1KodTP595YTrnHBJbPzZq7nivJRxTYWvXEfUy1OgFFkRfDdnHArqVrjd9rCZQYgfMzpENArgpJAE2dy/VzI8AqEclBlL9o5HA+Qyd6ZTgwGlnMh55/qWv5TkyglVs+BCGCqSg1U80nACFkxKryzTW265pjlWUWYnEJGWcx4c66YOWApaqIMlOzHRZSl4iRclHrrrmkPYSxD5utcK1cYOAQEpaQcSuutSmd9Fwo4yLHweJYE87IVNTKBBDqPUIRquUA+Z8RDrkdVxS7Pa8iyORRvUuo8XwJnAgcGARCXuVEmfOgTxTQlb36Vrlwq3cMGWdhxdPjBQJlJAQEylhCwiEmHFMsCtyqsgaKDfQCNCvtNRV75yVkHCsxnJlwTBGEosZeqMQKRj1OzsHKsbW9ja84kroyhiR0MjNAF0A4qvO6qrFliVzTP0zoymdZ0FAXI/AhFoeMU6j3URKlnFpMNI3nXvdN43rqmKFyXCV/rJvFxtJXq/5mCj97/9D3Ih2b1qiDAQBH3bmhl7GnUrT3In0vtsftkWXyec/+esdumpPESVbuIPV/ThkUx77E4QAcj/29oubdVLiTuL7M1SI+BBN3vfTNVJk6i0Vr26vTKdX1ZqwYFazOb0ZoN1W56WutqrWxpSkWZxhe11HBWft4Vp4d77tvgTWm7kZtXc+PuKlcmXiV9NK/e4soRE1cvw7K4paGez/od2d7ndpFD/YczZxr7PNc55lSv/Ym43oYszoPAKKelee6tsluyn4ochik3iFtntvFIqTj7rZ3XKPEzrm8y5u2N2ed1K8dh8PhcDgcDofD4XA4HE9+3GzCt65eJ4SqdJMV+gQc16LkJeqWzwKZoKxWqfK55QmMBK98l2NzrhPTfYJ5A0U6lwlSlZ+QRIl7OdVysJPIGD8HVZ7kqQloXd6eGklNYg9t1e3TyghLPtu0MBOoeh93hQERAUtopHHrC5m0bX1SVKh6Ymogf9skoJnAV/VgS0I2ZWvYEjK6zi1er7LVA/pEGjCSrZgQiFa1qmO86n4arJlNXZpF8GSbrv+EZB/6fqJ+bX2fw1jn2TlspHoY22L3XaYWs3UN2+28mk7QdZc+11DW7FN1+J4KGOhksibJQ2Vb6/7NxKghHNoxOYBC3vDtFCPS08+QD5WEkFtHtcQlBjiVmKsZaKRsT8PVmpm6A7BUUaUtFarVXipBFyUdb+KlMgFYGGJRrOOnxlCIwLOwtni659X+FwDWard8vqw4B/DoeqjdUCogBK/EkGWl6NXkbhEkM1YuhOTtpRBaxxwbk3hR4wWLyjUQlzjCHAd165oi1hSRtbqXUKyVRcGr+k9LnpsiV7qnErmAuoxqviyMuSEumaFYTVWGsm1ututQx4ZiJU1iKy38GAc8mg44jysWVNtlE7eYqBi9phy6czRLvcu5FbI3EONsKYTxUongUNXSmcf7iY67XAItm/GT65+5NES5m85U/y/1tpJ7fmSU5WJtzmHcL6r2vIQegmEPXFZBcA5AXgeV7xiHlbYLrE7ZIJ9Qlw6EUN1W2m3IKw1LFmqrf3XPni4yEWtlXT/7TLckmEDXSUiuE8+NKQmn67KHU/a6QprLd1QiV+6plmC8xD64EbmWeJUmz+x+oUhYS0are3t7l1G2/Va9uYnNe0rJqT9LOXUcWvJzSK/DWtjFC5My7D77zGttUXUm/a6Qc7eNntg6z8qzaRvhLuR26Nch2WOkfNN3QjgP76rRLPqQxQanxuTs/OxBLVbYg77mh7AgzEC1fSei0UobY58VC3ApkzZEPgKNCx7lPUTXS+5vdmFLnCwwNHVwstfhcDgcDofD4XA4HI6nDi6ZDbkBsKSlJneZO9lLfTsHagSv/rwhzlQZLd2MBNX528lZoE/A7U0wh7F+VwJNjtkjaPeOn33fscCbThjZPPYm19TE3WbiUCa6JxNWNGvjJA3N0mzqZsg//Vniqen8Zsfpesp2mYTTpKQlnE+BeVRuT/NQ42jW1lNW4afGwmXjRCungW07dbrduMwy9neOBYpyWRPKun57ddyQ3LnXw9ZbQ/frpM5NMaOJnMuuS7s/RuTzpd9dpQuE6IIQXNyVkIpYC6vab0i2HnO25wmMZC9rsk7nDfTYvrbKlRAslsqFGDxUS2WNhRLOwtqJV7VfpyRD9sLsa8rdWmauttCiSpU/sSC+yCWWLTN1S2IuZWYdF1dI3YBCtg7WzarDJD33um7sn7mSvkPl1Unk7T7Sfd7+2Pz1rIByvqQORw5VsdvHr/QV1c9xUCNTSyP2zlkRwDFkxPp/seaWv1yPy0MZzQa61l3z2boLen/WdDL+qJPAm4UJDBDXONYT4nj4HGn/eWLBebzPzuz1r2qRO1PJ2v2asLxbzBaTAPvvBrN9p+5Jp8guu9jrlN3trIwTdrzlkBPPnBmJrBerAYPqdEowqjx2FZezsj4eqDZPFwI9Duiksib852PwKtbJ+xbB6nyH0AnKx6u/NBGq/t8Q6nvqcb0gQRPlp3DZ9WqhroGBjJd3jVle5hoZYh6ntHEHGGBjiF+pjqEdJ9eEdioYFj8q15zN/U79PS725A6Hw+FwOBxPIFJK+MD/+t94+COP3OuqOBwOh8Nx43CzFb4hgJcDmoL2uDbFpKh7AYwTp0SglBt5SymbiVV13JqKmjCEMQ6wnjTdUzhq5aSUIfazgdDkWZpMPK5jPkJgA2gxa215UU0YixpYx+2dTa4pJcvQHgCcMyiEomwVu8WqwuGUy0Q8m7pY5bC2ldN9VdU3JN+rvTQB3X6Zc1H6WRK+KmMohMY4cMrFJtf0i0zIUaxqxlR8jImoEGFmcozqhB+va+EhNFmoz7tW+4oiWcjizEDYsSDdKF5rO7VS1mJj95cU+6L6ytZL1MRDv9V9VsViVcdivUwBQD3XOY1p9didLWgQO0yrHNZ2y1JGTr2djaAMvX/2LKu1iltbOgcelOJWDdP6Q5P2tQxaQlF2KTtVqoqlYSJ7NhE/qKsiEAN4IeQDIceRvM2VlLVxToWgpQygnuqidKzdxdhYMbOkl+MFmoir5FuoyuJBTRmBvDDikhuhpwnaR9Oh/b/mgLOq9tXxZcspKIrSW8s6xoLFqByNVTkspO1ZJZSF6AWAAGoKY4GoiyVW8JoDUg44xFwUvilgZplcrpc6/g3RS4GLojcRsJTvdKh27kwj0Ztl8r0fW29iTRXcYv5SJZCFOJX9kUs+q2XaAZxlnMeEs7jivuXO0P9rDri9HBEp45hj6+sl5MaZnsWtOo0NaQ6g9fOax/tUIMZCCSmHpmrupC5DNHpUxxJVV3oGwJGRF8JyRCdx6/Ec66Zcz0uuBHolfUmNyeHctHxOECT62W7vM5sOHkmwwWZ3RnqdUrlqEsuqZ/egj90s1lFK017BsY1WRTpTAst9SxO19h2AaPsMUBhUl3tkc4zjfVGTYaJG1m2y7xjV3hmBumWzLn+GSf9ubHZNH2n15KDK1PbKlkCWdwx5huU6SEMo7Z68Lw3lWxcIXV8hPQ/LVs0sNsuh502TBQWbMYxOAG8UyTMLanluplTfuep5rM+0prDV5elxYAjcWV+cJOrt+6tdbDB7v7WW5nLc7HzOyhRCVq5zdT0M1tuiDNfXkYYhdcu75HjO5YiNChyTfrH2ztSt+tt3bSJzXMEhgDiDlgVDXF5F+nZ7dG7vMnSZU4LD4XA4HA7HNcQf/p8fwHd8w3fhA//rf9/rqjgcDofDceNwswnfYXKTh+08m+OQSSK96l7ZOu+SqQAG20RLJA9E1mTSam+7jSE625ZVGTOkWq8ATMkoO4EragZd700su9DUpHqaapg42lNCzBRDkwnSrc0gTZWZe6qIU2qJYp9nbSa5j4lAY1+xsdOc2SqrfKbfB6LBEL+b8ZLHfdZiWBOWVvk6q9ep+s6UbTPiwZbfytJkBfaVvDNowvYydQvReF42ttbmGmn157pP9+klBLqeKFXtthaW23h6BLbslG1GjKBlQY4Ebudd/mq/NyKWOjk7tFVn2HnLtrsSb1x5zkIUYCM4lbw2xFr9LMcFRbCKCnSG3Dx4S7qm1E1o5GLvq5pftWZOTO2qEHrZqoeHuL7qWCEtkyKTrRJ4UtlyT+R631WBjMuteEIQS93DSOSi+WFL/6kTogPVilV2U8v2ZCTnkVBPGnDJUOpNUWXLZx2nl5lGsgBjH7aYvyQq7lT7Lba0xS679oseS9aOuv7P8n9tk8Sn1mQx03ZhQ8uKMSxA0HkUlbC+xk/g1H1RFnNM8mnk5uxeaDB91swIYRtr1KY9ZVdsj9N10nFz5T1EP8/Hyu6357J78IzInChpN7bWs7SnCHBRHO6ppGf9tUP6lmJ5s9+SoPL9pNLRKiFnLhu6PrM6YxxvV1V1DmrYK6jH98jfk7DvAnejjL0C2TtsE/vtq2B2Lc2snCc4VQZRfQbPQpio8TLE5D6xIGJIO905vksI8bqBtZcHxnLtopWpg0tdxbWXH3A1Mt7hcDgcDofjmiKnjA/97w/h0UcevddVcTgcDofjxuFmE74CUU9kLnH/logWJ1fHVqvWuSyxR+vkKMeqBFlTn1AlAi+xK4BFoWvjAct2IaxEHaCt5tpkjJlMzGYSTcW8KzPf3NXBeyoimShalu2Eq2oLjseed63bEF+t5jNMCmnFzuTY1q+ikL04FlKYqCiF9WTbbILNfLaxFq2icojTK5NiOTSVr47xyzkp5WklTlcGHYpqkYtfa81P9eceoQqM8XabgnQyQahJSxuP1qpB6yQzr5YU1aTvJI6tRspF3RqUimVv4YH0aZwQzTpNU5fLtZS2xLK9DkS1rcd95q7ClT7Rx0dD2NT60LL086/Vyk3NK2PFLIiwCyaaEvh0H7JS1+tYjiUvde3punAGm8lYOizA4YB8HgACQgI4FnVvSEA+oNrDKwIQnS+Uz0AlvsQmFxjUvKIIzgvQ4ta2xtR8FfmmY6fafIKyAl5CapbBAiFmL1Js6ttDVZUulPFoJX5ZkYOxTkaHmHBnXYp6NGRNyxfFqWFciRhrjlhCwkK57T8LCRcA7hyLtXNiQsqEnHvs3ZKBtLeODyFY2/mpY6ZuoyidDXCmovQldS6awrXaNUusX6psJveC2zoJCbsqmVQpNoVyPpEJZEhfIa6PHFr/C/luFdOhWjQfc8Ca4ibWL9VjAOAQU1XwZtyKK27FI87Dijt5Gcq+SBE5lzOdF+6xdVW/ypqPwe5ZLotY+35yOxkWHJgxSQyExMixquFT6VeONHc+EEwUqJx5iONr459qxac9dliUU2OMtudJdaLYpAXmpKR+9usyY+zkZItbGkeybw825qzc321MWokPbJ+7WuV7VaLPqmXlWEVODe8Buv6ajJV9lbQ+pUK9VCld2zIlb63q2uRJdr/6bmMXb2LvTuq223ZdriUQbb1yHuLHbuK22rrMMMR53T/HuwR5MOP5ksUMJ4nzWvY0HrSuk36f3FPoalWtJcEvW/QgpLG9Hm27JL1W+k/GwibUQ+u77TmR9NIHPX50gChvKSz1PpU254My0NxHJJ60vm7kPWxZgHXFEB/Y1KMhVs99h8PhcDgcDofD4XA4HE963GzCN+cy4SyTTFHIVt5O8DB3Za+e3NUTs/LXJl5UHjF2ckmXTwQcDNkqRFWg3ck3AGqiLfQ0MvmzUQOHXr8YOhEs+2ZWuxqNSFbkxzI5/bJfyG/b3ppmmKITYli3AXViUCYjFQm+q55k7gSo7kMNlm0y0V3SbRTdmlAPBOQAIPdyZdLMqkot4djqX9M2QlOOv2QSLZvydHM4A6gT/tbKeKiXTPjSmJ9AiBFdBpuJVGmbJlm18tYSGtoO2e634Eo2W9vmZoFpiHd9XMvfZLmunbiRa4ir/A+5k+/6+hrqqPK2fTaJeVesNstkLOsxC+xPtFMAhTwKtp92G3z7HHmh+terIvbOYWWkM02Wq/9ZiNjuUqDJsqaErEOQD2jxU5FRiMR6n9LpGrGsyFEhnZeQm93yY+mAhTJuxyOOHAb7X63AfXQt6RDL8QBwrISwkL2S9hBTS5NyKHF2Ky5SyX+pMWYB4CyurSyxkf5wXjYWxc31Pcnke+2sgGKhnCqpqu7bzAASlVMr8XQrOc7aujlT20/1f27KXnXuVN4k5QMgIYADILLVNtyJ+yKVyKCzjPNlxVlINXZv6auVAy5yIcsvqp2zxODNTIjEOF/WRr6nHHAnlXS3ltKHKQeEur/YYcdm65yYcFH7NRBjiRkh5ELEplL3rNuU9TOmCMwolc+US7WblTOVfWIf3vp/ATJRebbWclq8aYVCKp+451wFKRWrVqA9IwYSRN+r9D0kd7vs4ZmmVcfWXtkqVsUitqZlYCSfDCG6IbMs9D3Ikpa6Htb2tr0zRMC+F8yUj5P9pNuXxveCURG7JfdIKzUtWXY8NhJ4wEw9a58pCkMdNLE8yY/twjZL2Fuc2DZ7j7HpLDE6JUJn7QA25PXUvlgTgZP6DmTjjPhWZW9cV2YW1tV+upVlrcI1gX4K0m92cYLksffuafdb++W9xYSnSGVSC0PquWm25RjeJHbfBaziejeOMsw1IQ5DjXBW70r1PZeGFwxZRKDCpqiFMZYsbkgJ48pGh8PhcDgcDsfjji/7IuD/9nLgj37ava6Jw+FwOJ7iOCGnuAGwEzp28lZ2Ze7krSY863baI7YMkdQIZVuNne0nYdO3CcgJWa0VSUIiTy3cDKHdKsjbiSpNcNttQJ8w3pvQnNR/NsnFesJcK2L0eajlbo7n+cQy6bSn+kEfK5NghujbhS5jUKUaIlTip+m/U7D7r2qR/PHYMVpl616M4r30druxw54eR6GfcyGQ9+o9G69C8O7hsslcwV7/2v7UdZfyL7ElnYEOh7IAhNCsl5titzGUkrj+V8lcUoSuJiJt+lZW7uln6uANdD6yP2CwdB7tlMOgwBWysVkt15iwokRlYCBk9XEx5KkNsyhX40yiBCBQxiGkIe3QJEWkshC4gUExj4Ru608aOmewQpZ9rL6r/hpjLNbJe30bbbF96/Dkkq6tSTD5yecQuZHd1r652C3X+MVqHzMhhtwUvJI+5YCUadimz5VF2S8kDSMEtuGOW31b10g2uk0GMu5tjF5RlVuS12bD0Tyb7han7h3AaZKx3X8m9w5NUJ64B0/j4fadY7l79sCz5+VMDXvZs0DS7S0+u8Q++GN+t5nku6tm3ivjhJJyF9rZZLp/3l+iyhwsfm09TP8Pqtkr1U2lu6zfTd3uJq1uxx7BvNcW2cf6GXhVFbZOs7tQauc9dY+8tf/P8tJl6fF3WR/Xeg7n/VTaS2DzuJIF9GXvjuL0Yt/LNKE7e2dTsX0dDofD4XA4HE8AXvAA8PIvAj7xE+51TRwOh8PxFMfNVvjqCSI1SUtisSzbG9REfyqTQbzE9r0QMjSSw2qCkljZPEv5ktdalZ+y2l7bRoewP+m76thdovwx5O9AxDKazErKOEUWs2nLZtX/hDizk4UaM4u8mo+2fmycgCnfxtWz9dS2mxxjn6yKfZKQcwYyN/voEquTm0K419WQyrF/Z7F8FQtM6T+pS6u3UtuuaylPK2pzGFXJsp3M9hx6fXS8Yq5q1eG81W0yiSdq7mFClvtyDRrb3CyiW2ONCoyVRaksINB9rftOK5z1BKXOr40bmWivbZ2RQaIqF5tonfc6mZjUKuRBGWPjJKu0AyEtqmdVf1GOyyIAzt06UZdj1F+byVtr6UwE3L6FfGup6kYGZRqsm3VMXuE4c1TbgXZeixq4EmSxE7vNllkRxeFYiQchHSVdwqDwbXUJZR8TcIiF8A1gnIXUYrweQkLgjEfWs2L3TBm3liMA4OHjWSMYiRiLoobXHHBMEYEYt5djIxs1mVy6qxDBS8hYKOGR9QzHHKvKuKqCM5CVRTEAHLMQoHIdU1M3syZ5Y+mgLeHK9fRRsXGmso1iBjXSlss/JlBlLDmFko8meJUSWAhQXqn1cVP2yl+iojAW9XGtT1HzRnzC4bFi0Qwu/dLUhOX7Y2u5fm4fjo18f+R4kKFV+jZ04jgxAVX1K8T5gRIQL7BwxEcoYy0Ss9JGJhATELmOS27jZriapb1UnDNyrGLmY02rx5tSuRMr0lfGPJXMeSm3hJwL4ctLKNf5zDZ/qEsnO4qtcx62EXW1PDN3hd1MnTp7vtnFSUCJY5vMs7sqHgfr6BiLUjCE8rwSW1dJry2YT8Sz3dx79upot+ln/olFcYNaExgVm7X+zdpaq4XVfZFsfgqDsnZPyXmKlFTK3anFsrWfNkrPRnqmGuphVtZxLc/P4TlzCeEZI4irM4R5hxmUnrXeWmkrIK0Gn5Q3fRdTdtAUYz/XSn08ra9WnesxUC2QKYSivLZ56GP1eTilxJW0um762WqV3rN9elGDticvFezlyNiU8yzXVg3hMVyrUo4cY8ehVuRDiirvCzr0Q1MCryuYCBSW9r5nYzJv+5LH8QGM766cgSNvt++Rt6zGfwaAel/hyXuLw+FwOBwOh8PhcDgcjic1bjbhC0xX/fMQ+4+26l4uk9S0q05SE7zZlDFTG4iCNKsyLBEtn+3ETzSK0Znyd0/NqAlKOxEkE7O2DsA4qSj5m4nJTb/OJj5NecPk1Z6ayECTxDyZrBS7umEidzLpdWpSa7pP2zhP2rI5Tltm62OCSdtI90IGD1bTtt6DVZ8ZL5mBRZGUQqRy3o4HQ/pv7K1tGboNQrraup2q6yxPu39vYnI21k/1w1XUZZbQHuonE8dUSHcAQOqkL+eRgNnkPdmehTDkTbt5ieAYkBfa1L2dl0pICvkqKkhRPQ4EMY9/bTOpYcgYdmjL5JbONm04DV1hqrFQRoC2UK7WwFXFK+rTAK7xf3shQkbq70N5KuZsZsIFLwjEOI9rUwwH4mpD3Ad0KxuFnMy5EKgtjrH0VT4xbpiAkMvp0c8AfUi7Peh7AI+K1Up4ts9C7oZ+LEusXinXQqmmRVUdKSEYxXOoclnpY67Mv1g7J6ZC7ta0R2X/LAprC6smXlOoBPh2LIhaV3he2SZtEutwqqGyGehxgFmnx0b1S1yI83Act5c+pN1bz6aOljDZcyqwlrZCcp1U9E+IV32vUirK+fMmT64wzMuc2QzvEcJSD03A7bWDuVtN2+fzXqxVTbgCnZxWhDDNFsMou1xYYmuv3acwsSDeQyG9ej9s3ER2y5i7lGzqoM+JafduWfaczkjYjwc77z/MPLW23tRP8riKIvbU9lME/kwxPauDxmw8fzwEpn1H3cP0uuThOmzOMWbB4KD6VveEwZUmn4qDPFlcpxep6fro9DvvXK0+rvR1OBwOh8PhcDgcDofjKYGbTfjKBNVs4lVIy6BiRmqrN4zEsCZ5d9UyQFHzynaZzAlUY2f2bbtKW/1dFAkkJKEii5OZeNNKVNCEoMvbCSxNJs8UxnqSTisxsDMxavt5b8JYKzAmE6KD6jflMbaiJSylzRfHbQzGSbsohFEBDIBtXwJlgizGcXLuFEmgoWzyWntS6sc29W1XzrVjbNzcgZDkQsBaInEgMrhvayRw6uckp87yWXJYx2yeWJx3clkdq2PzWuj6r2uvk2VoWDOVO6Rqy7Pml2p+A/nAY19IfrNFABvLZmpEHLRgcEb2ymdRbdWxVOL6Cbm8MzF+WJDPIvIC5Kg4PhrvMc2GmdBineq7sXYeJu51FqtcsYsuG00dhFCuzZY7C1WCkpiaHbQQjhqZAzIxzkMhX+9I/Nyq1F1zJXnr92ONw3u+rE3JKzGBVw5NPSylBGIslBuxKDGBby9H3IrHEs+XGGdhxSPrWYs7K4hUSIyUA3IKgFbUAkCumtwwUffWzqBYyOGmvgUGopO5EJ+a8O15cVH7Zur7mRq5S1Gxo5rwJd7eowkIsccvXjnggDTYZgOFfD/EhIUyVg7Vujk0lTRywGPHBYdY+vVijYiBcWtZm4p6PMfULLtztYxec0BKoVz+lvzWVteyLSsiONe/hDaOm515GknellYGJgOUGDGhWjnX7Zct9hicBQJ0nPVCbiRQWDZKOrlfN2Vk6xRDhGpVqUCrAk/EQW3Ha1iVoX7+zoi2mYLREr91GxH102PVokS9bK0mnqU7AWYu5LxNGwKmR+p8Z3a9MzLvFKkNdLWxbDtF/unzpxe0zdIBXdk7iRc7EKc79aXZ+VF5TOsGzGPz9kz391WyfaYG3ozDalvc2jnrZ7O4oBHnuh2mzVcm7u079UyBvLe44YSiezp2Z+ln539PpSxq/NyVuqwV73JcdQihiPH9Q7ZzHt8998KPiNo3T9LUd7Fhv7ixaCeDGZkr98WITexth8PhcDgcjuuMK4XbcDgcDofDsYubTfgCW+JS/hcydabOFdWJmiRhIatUWtIWyQNJNxKfQwxgPakyO1YrQQV6FT+AIbKyEHliTSfpZgSunUzT6fSElyG+N1aORCM5qNshdo568lrysraY7fCxvl1xkLtCttWFiq2glKe2A4a8tRPIGpwxi/nZ8xILU0UWijKXAnit1n2DmjeaPFR9tPWzWkjQ2rquIzHZbJHrpFzbHiv7F3q+nHr+YSlptc2prlcjf+uxhE6KiiX1DJJGVCs5dJJW5zM7TtojqvJ13ZKzOY1lU+htEFI55bpowoy/1k5VTytZnU2mDpOg6vNg2ZlLd0c1HhSobFTZ1HNIASNzXHcfIvJZHIirsAqBxmAiDMwBo1k2y3cCGiGb45jWii85qjIChsUSIXVSuRFrQkASkG4x8vmYYVGElr5NTEiV1L3IERe5n5PzZUXMAcccp/F/B3UvGESMs1j6a6FciMaq3BXrZyF7l1r+Y+lQiN+4FpKzpj1WsrNB2gcAoSy2oJjR7ZSpEN0qxq7YNYMxqngly0oWE0q6MuxKek6FySTVr7oufS0PA4Grhbdi3jGmX5ZC5p6FhKfHi9b/WgUNFKtsHVM511UBQq4fYkYMGZEY5+epxPgNqd0Hxa4bABJ6XqGSydIvuj9lXNJa2wYUJTUAPhAyGIGrZbIax21BgbkEtRKYSdJTJYsZYeVCGjOKTeqyFLJl9oNfFqQARd0r9vhCwnBX4mnSdxNfV5OIJUH5vz4Xm5IP/Tm1IXeBsZ4xNgKxLShRhGK3+t9ZAGMJKqu01fXUClsb5qL104Ss0/dBOVbenXT6mq6RvTM1tC5T96clzyWtLkPvt/W3JOpMJWqtfu1+oCwCSLktAtv0ldSrprtU7SvlzradOGfD4oPJWCKbrxpjs2MtpnU+RapP+k0I6MHaWiu8Z0T77PzYNszqvjeO6ntmI8MtsWvHroYo0O1Yt+SuXrShF0SgvNdJ2BG277pybF1UsoHavjkfbYFfVmlt3vX9C2m4h9m8Z0pg/S5j86TDzf+553A4HA6H48kPZsb/+wf+v/i1X34HHn3ksXtdHYfD4XA4biSuuDz/mkKTr5awFViy5jLl7VX36UlJ+cs8ft/DZdZqM3tmbedmieSr1P/U5OVlE5utXkJu9vRTRZPaP05U9fK2MQknbZnlIzBx+KYTnZm3+c6IQQAt/uwOyJ6DPZj905WJM5Wq3qfVarYOs3pftT52AcMeiSLHzdQm+v/LcIka+2RddR2C6fvLrp+9fpK/WTnt0Mmxs7E3LTeAl27j3dYbzIhanYUmLPcwSdNEq5ZYq2VOPWTl9BOQF4BjJRoq0RsotxiyAq3sbaSu2C6jk7s6Tq+kacVWK+ZAPCh7BaLqDcSNlMw7CzaYqfyZNjWIulZ9F3KWVPl9PzZ9W9IXVTILOSwdtwdSJ7rWcZ6u1oXLMaGS3IeQ6jm4ZHxj3jdUlc9i4bzUvKZtnoBtnfUxxOPiAajFBOqzHvNT5bn9Xo/ZXCsENMeMq95vLPaOO6VKtM/MWdo9e+FT97cZUWmPuey9waafuYlc9iy3x+tFWqfKkLwvUyKfgj32KvdajY91lb8ixE8qBT6W/C9RuDZ1wil7Y41LVJi79b/COL00j4/1mLtIs0m7Q26frJOMW/2nMVMHz8o4NR5PnAchgkt2PFWg7PbFVf3pbbqrvv9ImsveUx0Oh8PhcDypQER44FOei2c955PvdVUeF/zu/++/4Td+7beQZgvvHA6Hw+FwXIqbveRbE74zNWtV6XIkYImgxy662sWkpVQIv2LPLARuHstQ5XIg0Jp7Pu0Y7JPPGstEPcFc1KFERe3IXNJlLt+jkIDUJ32sQkXymX2fQVQuomiV9FoNqpU2kteylDQpVevYqqLS6qSajqQvxSpwmJDjoj6IYZwkq5NobTK9Ka16e3hdh4m3bdvqud0hmJvlc5H5mUmyUSWxsQUVxe5SFbeciyrDxnRLCUwBVBWrg6JY2zzb+JPMvQ5EAOcWbneIWVv3te+i9pVtooQkwwpqpYzUJ6293kPjJ5OPWSl0AQwqYyIgqn6QF3UhNIQ8H8ilUI6pfVaOG4sd7K8ttKK4KrS09faghhkWH4Te/9beWVvDA6cn40MEVTtnXkJV2gAcqCgiCUWxyAwG9aU2rP4nVJUuIS/le1gLMZsPvbvCseTdVbvoykpGUUhaQll/rscIqRZVrNfzSjoK6ZsNSyck76NrcRwg8ZdGIQx1fF4hiuV/OR4AImXEmHEWExZKTf1b9jFiXLGEhMfSARdpKVbGVAhnITBTCsip2OlzCzBLRRglql4CILF9Mw0W22SIYal/U7k2hbDqvphBC8CpWDg3njJT2RcYeQ3luKTGeKJOghLAgUGpDILzJeEsrtWuOSJwId8fWw+4qHbZGYQhnHDtg0CMO+vSqriEovJNOSAhAAm4tRTl9MoBa45ICDhQAgJwFlasOeCYoiK1VR+tk2tN3x7kEFH3yu2a0WzLm7UzA+GiXHL5gGbrHOpth2MZnMwoMbCtAnMGbcM/ia0ObO/dmxAGVpVZbY+HZ0sy6WYwikg+YUHL9hmtYdW95QA0BwXJb6YmlbQ2b53Ottlu18fM1JySt1Yui6pS+kHXQZ7lUvdT91NVh3beqtKzZKfOq6g/q3qzPVv1YjBt1zwThepJpJZ2SzCSDpkxISBpdi6Cim88xH3tY0C+X2qdfAonyGNty0x2PKhz29TPVtmrVfF2zM3SqLKHcsx22lPomkm9K6XbU8NfRrKn1B1tbHgPYK7sFcRY3gG11bo6VrsCyPuGuMEU54fxum/pKXSVec4gxL4dUPbMDBzKs27jppLSVHj8MS+YcDgcDofDce1x+2m38Hf/0XfjU17w/HtdFYfD4XA4HNcAN5vwFbSJlfpd2+BpEqiSt4XUxUhAyaSVJY7lz0yWUB6P20r4DPEpsDF1rQI2cyG+dPmhto1UW2R/Iw0Vkbbm/lmIY22np1U90jZt59j61Vgm6n2t/gEbVaQub6KoIE0cx35sI2b1pJkt7zJM6jWN4aj+3xCIO6rgqypYWjtCnZDjDCBsj9dkpLV6nkHHqtSWxo3oyCaNOkZITaKR/NwrR/KdpZsp0C3xwnkn3eQ6qTbaG3J2uA6N0mw4HmO/BXX9BHRSXZDS5ecc2FcKtVjMvY4UykR5IXgxxNcVDhFAs3SufGQnF9FJWNnX4vTSmK41neo20t9HErPF8tWbap0khq9YApemUeFLtMK3xnvViCEj76hYM1OzZV7VccyEjE6sSlzZzAGZcyOFj7Sd5L/IEcnUoSlS9akLY/tZf9X3aAYYNChfibjnV8niEBg5j2VQ6CeUqBL40u/qkcCMZhfNQLlkk5xsFHV17MQtUGy0u5VzOS+dRGBkpbIupC5avF+g2D5bsCHb1xxw5IiVY4uPvKsAlu3U+6xkSp3Ahtqki1ccvCwy2BSTURZBULWF5nLv5EDgSAinrFt1UZlBQd23DAnC9pmiLZat+rYSdFPCVuW3WWw0IcP6syDMCTy7fU9VrLfPYp3axSkWVy3jMsxUxbYMXa9qATwl7vaIynr81L5Yu3rohXKofd0ehaYuVyGyTxGt+p3lkvM42DPDvMcYNEL2EqXwZfm0Opj67R5jy9TuMbP+1nlbQlWP79kYmNWxV/B0uTad1MG+X87svffewXfyHd7PbP1tfdo70pa47feD7TVy6Tms701tIcNe3N+WYQB0fPbM23udHHPKncLhcDgcDscNB+HW7XOc3zq/1xVxOBwOh8NxDfDkIHyVCrSRuPJ9mMDdJyYHZa9AVu0HArEpAwDH7cRhy0Pike6RlqLYndVHk1jteB7TSdlAKWfN88mtmZpHlAs6TqqeBNb9qf/Xn6uygVQ9aKj7jvJIJrLsBF/dT7Ys3trlnQLbvhPVT6Sxb4d4j4qUEjJdE4Si3LXEIdE4qSdx/4hq7M++bzMJqElV/T2bc9AzKP+LClZIUa1MzkKU5q7cFcbLksStbWP9W1laOWzrgPlkZ1M5t7yNCkfiEQNl/OhzI2U1VTB6usNZ73/dX1rRZSfwTyy2aIo9jJOim3Fmz59V0gzlVRV3pEb6AnI/gJr970Qto4tPQYUQs2RxC+Wshx2PZK8QvdpiV8ra2BVz/2NCVXmWzl5zxJFDUZiGFZkDkrFpFgjJuHJo6uAjU1+bEgp5mnJoFsPHHAAmrMQ4D2uP5QvCRer3ogsVu7YQ0BnHfDaQmQPRrInzIOdVnR7d/515B1DIWmqBkyUvatcNhQxCKP2VqaWngEYKl3FRCFkiFEW35BOqnTIRGKFeOqVC+cCgWPoGQO3ngEw8xFoYVNOKZJdzcx7l/AUwMdYcGpmu7bNvxSMCMR7NZzjmiJUDLnJE5p7extzV/C6pBG3RgKSXdEFxxLl2c0QjfDVJ3AjgWk4hfOsjPKAsjggECnTaCbXu5BxKLF8LuW9b0rEtkgrb59TsubmH2cIQE27A2voOZPFssdUsb1Nvomprftnz0b4PnajrXbXbHjOrs34PSGlQtQ4XqX1PMuek3aclFquGqq8oajeq7pY1AymNjhu6DF22XuRmlMeSfkr8p1SeUxEtr4GE21PunlrgpvpxyCvGubJaHydKX1PPRjRrhbHKX9rSyjEL5Taq5BC66lowWyyo27tHDJ8iRpmbIpetQlu/f+pxYZ/zM8W2JolnLkD1fBeSXhYYbOtvyxpjh8t70HYs6feTQSFsrek3TgaxqX5H0lreC+W96S6uaYfD4XA4HA6Hw+FwOBw3Fjeb8G0TbErpwdXGeVgFT2N6oOwPl6iHZgqBnMFLVa2sacxf1aGrKc0E34x0lu25fs8YSSzdTk0cBrNNiKxGyp5QAtn2ycTZLJafmQBs26p6Z7pfrO4s6oRri73WSNk+Acei7gmh2OZp++Wdidw2qS6TrQBYiMkwKofLATMlnCb0hDDNigjN2+MHYpgL4WHrVPeNFd6ZfMupj8umTkcnTC3pzLnXtTSiHiPnczLGtXpW1LUycSj7ZZuUt6sqnmCmfml2zHEsP4bxvIiVuExka3tsq/oN0cxhGtLGWjcf6sRrs+DW156cJ0V2WEtHrRg055NunYM+4RlI5xH5IBO1hbTi2MnYtm5kraRZBhAqxxg72cuxp5VjG+krpzqgkb2UC7nY4qGqsnTcXl4YVFWm+cDAUjJdKOPWckRsBGHAEhIC56ICBZU4u+gEYuv1SjxGFYdX1Lh62yGOsXmXkDpxnPs4vRWPAIDH0qGpi48pYs2FgF5TRMpUlLcobUIlYJEIYpncO1B1gpyvKBPuBE0GU+DGwnMjf6mlEwvrsq6CoH2WmUnZrhOQKyE3XAcAEoHqH4gbYQsAgTIWSjgPKy7ygjtpqf05VL+R30GR4zHkFsNXFNSROpk8xl/OCFVNLOe5qXyFhOVqRy7jLKPYhYuFt3AXoYxnwJDA0l6q24XgJYAXKtdQJY4pcV3woPoqUFmUdOJeo5WjnLkrfavDQ7unT5TP7VrX17mxZYYixYZyNXmmn6MmnSUHJV+2hGpQ9Z0pdYl6PaVsWTRj85Dts0VX+j1A1WdY7GUJuj1iTLbttB3A1qJ3j8jT93XzrjKQxJLfnp016piQ/rIkbT2/rENYSL1UHRoxPKgkK3moj+sZlLxzBtsxpMod7J7r96nKV7VJ2zJLXdtY0ue/PVPjdlzs1Hnz3mftn62iW+el391U3dox1sJbv3vKO6Ae07reetzMxpVcQ5KP5CvjRy1cmC7qskStJs3luj+1AOOwjErcGQKBKPZ3jWFcKKLXkMAEGt8vtUuLXnR2NORuIBB2rq+U0B9ODofD4XA4HA6Hw+FwOJ7MePIt+Sbqk8Z2UsxO4AghK392+2WwJKL9LsiGfJrVZW+bLc/mq9tmJ59ndZEJucssIPfK3GvjkMTUYXaMtZjcK8/CqhiAzXcAW2J9tr/+iWpjmmZGNggZaq31av2Gek1J75mixRIAJu8ZwSwYiM0rjNs97PWZtPdUHfeO03Xf7L9s8n9HGTSzX5b0Oo3uq726XtaGaf2254CWBTg7DOreltwSsFDEGG/TTYvUpKQcc8Wqk/0i9YlolsOB8mDjPMNClbBVOWrCsf0pUlhvW6hbR+9B4gdr2DjC5bbXCV+xpu7+wSMacasxuyxrmvF2ROoWy5u0w2d1TndvY+LvrfbHMI4n6TNBNmVlppFTnfSp9Pmsv1uMZprvH+s7b0KrD/UNe1nNnET1WG9qeEaJ967TXNHS+fEEVfXsXRywf6y2Jta4anzWx+s4YHwOn8rn43mGnIImzq/y7mGPFZxSyO4Q7pt0w9ed9u4+Z06/H971+Gnl5fF/Ud/+X3E+Lql/K/+qx+3FzT0Fa7Ut+V+1vXd5LehYylfKZ7LQo22/Kq7yHmrRFsfR/LeDwq77zeS9626cchwOh8PhcDgcDofD4XDcXNxshW80Voj6fzt5BjQ1Ch3XYsdsILF9ZR+l7WQUL7Fs51xtmw1RLJOqYtmsVaMq1i6fL93+WasdhwqpyZ49IneJ2wkhUQuL+kHqRVTKSHmrXtRqDE0iE3XVpe5j27fAOBFmVJKDdaI+XhHPGzXUxbGoFkTdm3JRwDKBKYCW2PqokWxi0TxTdUt/BioEnS7X2H5O1blqIq4pvAZLZR7b2hSkERRDL0eqGsOYVlS0Yo2sladAJxp1mdLHtT84k1HlYlQKt3bUvMT6WSmjW1k6vShLtG20qOasPXVVo7T26fETYz1O1Q95OG7oO6Ccc1E4I5dlKsxAWnv79PnWCt6gytEkcO7WjOUwXd7OBLA63trM0vkZ8tNvIx9K7FGxpw11bLKMlwAMal1Cs3EuCl8qF0i9rfVxjWaXy4wWL5UqmcmBe95CKNq5ZCHZcimfzzOWQ8bKocXoTUwQDddFXnDMEWex2C/fjkf874vbWPNSu52xhHUgJIVAvJN6mgBupGQEI8bcLIQv0tII3YWK4vdO2j6WRB18cTyAmZCYkNYIXkNvq1LbGsFeQQucDHAiUODyR/W0iiI3cF9fIccTg3M5JsRUWpIV2Us1sSaNF6XSy/ZklPMXIrd4xxk0kN1PWy5aX0YqfXZMsfU31f49CwkrBzy2LkWFrWMC5wAyxG4gLrbdlLHmgDXHYu2sCfQA8KGT002NrrqRY+fYqal/1RhXjxitWNd5gYD1vDx3Q1MJV/I+1vv0lBSp15O5b2lL5+F+yxlEC8R2FqiLNCYLkUR9SzGOitsJobhR+LV7LW+3HZWaspJdFGNT5HLNnw5LfdblTXmzOgx1n93H5D2gd0zPSyBqWJ3OPkPvlqS1yuHZoi8bRmICCZPQsBdrd0LoNTtdOUfyXc79rI+b6pXG8BMTl5T2zqIsomeqYKkvyztjSmNc4/qexu2dR9V3YtU8vEONDe5lMY/5nCL7VXs2BLM+lrmP9+NxU/+WRv4fnsvmXdyqt9HPF6v3wqHfbd0OB4hd+J6imDVpbt8xrXK85jO8/2kr9kN9NumFh6IkjkG98wlZq5TkKfV7gXlnBNQ+SaddCWRb7IrhPbeb0s7c37VCPkkaOxwOh8PhcDgcDofD4Xhy4a4Uvt/zPd/T1Avy96IXvajtf+yxx/Ca17wGn/zJn4xnPOMZ+Jqv+Rq8733vG/J4z3veg1e+8pV42tOehuc85zn4ju/4DqzGXu/K0ITsbJJK/pe/mdLUKFA59HSiFKbcJ65IWygPMXaxzb8RhTXdEhup2/LRhJ9Nvwe7z06IZzVRZdPqfaeUClnVb09lpeuv4hCSLre2heqk2ym1it4/nXQUG+7GxvTz0I7lOuk9Oddin6cn/4YJcuoTdjKZRkscJ+nq8U0VLMSiEKIzcoLrRK8hji9VXJyYpJv1JWczsdeIWVWuJmU1ITyQvSp9jOPk5MaS3JC9rYKGOGgLIRJmCtkrwVpF6/7WJIa0Z6ZKnpD25bDJ2FST5608oFnHDogRfIgbdW/PyzSlErY5bvdNwdhVBXPYjhOtoByUl5Uc7SHJOxmoid8ljPbLwKi0PQsJSyiEodgFF2vmYr8s6lJR+3K1RWZR/dbtS0iF6K3pNWGp1cFCGktdmamQqEL2yl8scXFB3AhdEBcSN6pxJzbN+jZBnZhutw9N6LbhEJqlM6f+15jQFuC2lpMJyFTsptdQ7Lf1YwLU2ih9XojY0rdWqRuIG7+cmHAnLUg1bu8SijWz9JdW/y4h4zysOIhSWw3WJeTep1I9fZmqMSPxomU8NpvmWP70eCYGQirkL2WTj0qzGaOMQoCeHebPDH3vtPeTuL1n62cYxViIMLuwSe5Tldwbnw3mXlvv//Zvo8ibWDdvPsvzMqiFTbNjr6JolHbE2I8Xi+M9tMVgJp19hu49r65KAl9WB/nTDiR7ZRgV7AazfrblWCgL7/4+Yd6XVF486ZvNWLVEsbxT7vQFxUpO6rAbts22nbpeqm1XUgbr4zUxOlsgMGuTTVsKnh876fvWx3XBwdRtxS4KmPXJrA4qb5YFDbVvWUKOSJvVdaPfQbexf3lD9pIcczek6inlrrW1lz+z0O/S81sXqHHK2z51OBSu3W97h8PhcDgcDofD4XB8XLhrhe/nfu7n4qd+6qd6BkvP4lu/9Vvxn/7Tf8IP//AP45nPfCa+6Zu+CV/91V+NX/zFXwQApJTwyle+Eg888AB+6Zd+Ce9973vxl/7SX8LhcMDf//t//+5rnzMQJ+SonchV6WkyydKUtkRV5VvJ3hDAyKCUwTGUdFZRPJuEkn1AmXSJNa8YQEcuNPsQV69PHgGhpBdYlefetpmq4rJ4vLqeVu2j1S8yGT2ZhBxUJEIO6/iArc6TCVxLFtu6CsEm5Cspu9zMTS2zUQBpxW9rZiWeW5o8KsAs5LzFCGIGw0yiDjFlpe5WGUJdJTtT504JVN6O5xms6gZVkTuzT9ZqXIEtV9epjVmlZJ7Z/Ur7mDvJo9rZ+iHGovKVuNNSf6s81qrkvbbOxut0TGvSxTJMSkks+yhs4wpKPD9gPK+6na2MAD6EYulci++cnyIN5fCqguRYiDBx+i07VVpddUP2lnzquOz84vazJdNaP5RKRsrIUDFeiXGghAt0lS5QyEX5voSENUewYe8kn4VK/FjZr8liod6E0C0EZ82XMgLlgYzUIGI0O2dpG0lbUAnemraSmOByHMVyLHKxaS59rvYLca5Pcyu3d3IheEMZdkmd21jrQKocqWeqpG+umeoTpfoDKETssf6fmQbSVmIIB2Icc0ASUpgYByF7DTksZHwh6RMOlPDoUG4GONS+osFiWceRLn2geiYXZS6YCtFbNw8Kc0aJV13bLeNd5yn7GosNleawnF5w1J6/ucZuDcO1SrNj5boWVeDe8+cUwbpDeA22sTt2vOU5Fobv0GpinadVoM6UkubzUKbO194zjQtHUxvr+23OW+Wk7Qd53tu6ancROVczQhQjeTo9Z5K3xHbX0ES96ZNBBVnTbJSRe0QqAJY4vrpOp/phbxFdreOGUNXPG/mu3WlOkf57/XHJuB3ab8+HXQhhr4VZfXU+tv46ja273S7H1uuGdVm2H2Q8zc6FrotVIev+sgproCi1U5qPEe4q/KHeRnULYOocoknhfn+SvHbeQ2ehPLSKWG+bLcbLPPSpw7GHa/Xb3uFwOBxPWeSckdaE/PGEsXE4HA6Hw3H3hO+yLHjggQc22z/0oQ/hX/7Lf4l//a//Nf7sn/2zAIAf/MEfxB/7Y38Mb33rW/HFX/zF+Mmf/En81m/9Fn7qp34Kz33uc/HH//gfx9/7e38Pf/Nv/k18z/d8D87OzqZl3rlzB3fu3GnfP/zhD5cPMuGjJ/Q0iahRtxfVbl3BX4lcDgClciylkh9lbmSvPpZmAQl12VKXaCZXcx7iEw6TVU2NpCZW9aSOTAqJ8oeoksYqv0VN1K2pp9Pl6c97Sh6ZCJ5NOhp7wjaBqScPRf0haiHJy05K6jpZq0hRWGCcMBsQqpLY1J8Oh63SFYVgG4gAoBwf0OrIrc1C7GSAj+17Iz+5Tq7lSs4LQd76Rk3yidWjIqcHQlhZjpZtemJZTSgCIFqa+qu1kdvM4njsHvHbUNPKedEk6KJsC2WcNStklW9S48wSoJZkJmoEeoO0XWylZ3WVehFt2ySEe6iKvmEimkobtWoe3CdBW5rels1Ym43Z1p4AcN/P5wekpx+qLTOQl0KGUWaEVG2dB/v38teUuIRiBU1o9s6a9BULXQDAnmiCAARFUurtlYQLlaDkCCAyYhyVuLfjEefVW7epbilXUjZi5Yg1ByxEhdytpQQwbi9HrFyUqaLmBUqM2kO1ahby8SJHrBwawXsrrsgo288mQ/ciRxxTIZgTE1IKxc5ZWyUzwClA1L3abplzV68ijKRoi90bC8OprZqLShYAMUKs3ZjKCSEQsHBdb1FJ5DzGcC71MCcpl77nyFiWhNvLEbfjEYeQcDtc4Miln5eQsHDAw8cznIUEVBtsIXEDMdiQxsxUiGAKpd9D6qR7PYeP5LN+3ohxkRc8uh6wHiOwVoI6oNmSAxhUvHSkLmROQFjR7JxFxSsW5EAnP/R5olTt1HMnfEkIFXVN1EZtB0R75qj7liRXzh+MStjtkU5CFNoFJfqZqI4X21a2z0JFqLAhxaQ+YhGtiV1tKzuQXIZAbPvsszKZZ70ipZrFrCWz5ZltnvGsn2OzRWPWgjkE0NmhtE/bRut3C11n1VZ7Lto5MmT1hkiekZuz95P6nXQdtGr7lLuJyntYzKaJZTnfKmQFSV1mC+VOKCxposAeCEfpW90fghn5XUnNVieBLG7QJOrsGbe3SEL6QaDPtyWG7SJBSS/56MWDlkxPqbzf6HOkr0Ei8LqWuh8OPT87rtSCjuHdTSl45Xoc+hrjogmiavVPNC5GECcBQ/buYUP+AgMBTBn9nXC2SE3Vryl+9fuMPY4CEDIoLKV+buvsOIFr9dve4XA4HE9Z/PIv/gre8AP/H/zBe957r6vicDgcDseNxhVmvUb89m//Np7//OfjMz7jM/DqV78a73nPewAAb3/723E8HvHyl7+8pX3Ri16EF7zgBXjLW94CAHjLW96Cz//8z8dzn/vcluYVr3gFPvzhD+M3f/M3d8t83eteh2c+85nt79M+7dPKjmFiUZGOV1jJPih9d46ZqYHHBCfKsfvsxPLdWqxtlDE8EsM6zaw9etueync2mXeqnpKnnhy3x1y2Ou/UflJWzXuYKIm7iobauNjNwyqtNvWrJOEpG2IK87Ews3eWPGexefcwG4eahAWuNOavDKscOQWxhtZ/J9Luns9pnM67vj1tx+IeTHknJ2u1YswS9CpNjrM2yIH9u14zQrZYTQCbtL0sle9lsHno8gImitBCwA7F1e9rVZyOVWGTdswPwDTGb7OBrg3RBOSwnwlrVZ/qXK2Ie9M+3cda8izfVT/Ld02QD3bI1UJZK227qlgI4ZL/MIzsfkXgy/8h8NCHWk2t+1ErsC2Cqd+m/0HjXyXNB7vuJuWdFrEFQ4csnkOy1H09G++z7PX2k/d/fQ+c3C9srE35/9Rzxy4+GkjPSQcZ8vBjVdK1ek6OH4jKq+SfFQk1O1Y/32fP+hkhukeSXmUF/syi2OZt+9ru0/nM0u31iyWWr4JZm2Z1n6mq946X9Fchm1Xeu991WfI3IxUNHlel5+w9F7h6G2fvqZelEeyVMVG976UZiGCDwV56yJPG/9WCwEvfV4c6jKTyXjiQK4XAkHfdu3mvdDgUrtVve4fD4XA8ZfHhD34Ev/1bv4OHP/rwva6Kw+FwOBw3GnfFqLzsZS/DG97wBvzET/wEfuAHfgDvfve78SVf8iX4yEc+goceeghnZ2e4//77h2Oe+9zn4qGHHgIAPPTQQ8MPQtkv+/bwXd/1XfjQhz7U/n7v936v7Ih18kyTvSEUtatgMtl5kshlrqpfpVrYUcpyLDbNGyWQnqBsk818+k9ivGr1ocQIZu6qXWCMXSykL9c8Ui79osnfqPqIudjrHo/Kkk4pnfSEqp4oJ+r9alUbKXUVirRdtkmaZWl10qomlknK2SSZqD90/EU1qcY65psoW1S8VQqh/C2x9aPEEmZRbucMvnMHfDw2pQfF0P5KoaHVu9lASyzalEpZy4JmG73E8hdCiZ+2rlsViI2tq/6nWOtcLUqRU41Dp239UidYl2J72uqrx08777nnB/Sx1r6ncawO50FNJIuyRMfClb4StYuFxNBUFt2DsiiluTpFjp3lp5FTGdP2GtKTqElNnIpN7J516GwstrifeewPoKi4l9gUusRAvCjKXkv0inqXMkpc0xVb22V0kqwpfTMQjiV9rrFSOXC5gwcgL/WY2RxvLXcgnxmgwIVwrBbNS+gHB2IcOWDlgCgxfnNocXaBQvYeYkKkYiVsCeGMQtYec8Sj6wEBxT5a4vRKfNrMAY+sRQFyOx4byXuRFjyynuFOWnCs1sWxxqmNMdcOHdspts7N2pkAkri+gTu52y4LKkKotq8QtCEyQuwEaly6UnZKUg5xe+smHVu5xhGG3hY7qXwnL6WdVcYdFXkr/S2qad3HRIxby4rbhyOWkHFrOeJphwscYqrqabHMLsprAD2GL4r19kIJh5AQYm621E2tW8cXGEWNWy9bGcftT7omY3pO2CiGOVDb1v6qulcs0DlQuVZnpM1Ayobx2hQoQoa1gl+eU5ok04uXZLtS3rZidTzQCYbnUa1De15ZQlUUj0aZSHabOGToMu3iLslbjhXFrlILNxWtVqfadlj172yfUkPyY3fGe7l189CqYU1Maotmex+W58PsvOi66PcN+a7Vsvr8CrEdwqio1Xnquu21WStJdZ30OdPtAPr2vcWIkwV3A2mo1M3DOFaq5fZn38XkeK1m1/uk/3Xdpb/0tTBbSKUW+w3XhR3nui22f82CBIqxPE8Ph3EcKqcYlrigE3J1iH9sr1tRBbdrgYZjWKtn1TvGeN9QZK/E85VzIu84YVQOb/5i6O9i8m6k3s3aO+bsXUqHBJEQGHKsifErYU/4WPpreD90OBSu3W97h8PhcDgcDofD4XB8XLgrS+ev+IqvaJ9f8pKX4GUvexle+MIX4od+6Idw+/btx71ygvPzc5yfn293ZAYO1AnP9jdRHczUGZMJLI6h2DjX75KmkcR6Um6irpUYwBtsLNrsJB910uuUGtfmYVQGZZJsQngRlYn7jHECzvaNnmiWdDJBOlWa5tPfJ6oiUpOmpCclrfWjnryzqiu7TUMmAmd2ivYY5jZRZicPm3Vz6QRTxqj6EstoyX+Y3DdpN9vMd2YeOaW9SWJjszzE2Z0oPVoM5IQ+WSjW1JYptJONVIlePRFZv0vbiQgs9sw76pIhbrJNM4tVbeskdbB1A7bLV/bGhy5/Ygnb8tTHi0VmjFXl24kiksUMRJ3I0lXXhG7lBQcCViet5JjE9KU07mv2znrbJhOVtyZ5UfOWbYERQzbWzQErR2ReEavVs1bf5lwJx4BGJPZupabwPRrFLlAIxsCFOF5CxllITT28EOMsrFgoI4WEnPvxiUveYlfMoqSV+LmV+B4I1mH4F2LYkr1UyWAAncytls6NDAiFMOV1vP6lLJY6ZGqkspxv5mojLSdKxoHULTBizDiLKw41vm5ERlb3GiHJWamhdX9LDF/5fIipENSV7NWK6zXHFodZn5NcFdQ5hSEmcSNyazDfNibVM3aI10tAPnTSV8cC1nlqATlxT0+ZwZE6QRypfJ/hMhXdTIVXiRiypBcwPnOMjfGJJ/CAqUvAFWxUe5z0Ut50IYqtl902i5tqCMfBSlpt/7hhFZWWMNUqYlt/u6huRgheBkkj8YevAlnspZ+11r5a8pR3GLGETmlqwzyFXRynt9vxt0eyq4VzbeFA7edNrFmpq3oPGaymT9XLjqWrQBZR2jFrF07Z52mp3Ca7jRp/Vl+d3vTNVeo6wKpiTx6u0mp1rlrMVurKPX2YH1MqXxeoBfUeknV85Z13E11OMO8w7TdEedEb4k+7pbNjB9fut73D4XA4HI7HBx/4MPB//CfgV/7Lva6Jw+FwOJ5gfFwzfvfffz8++7M/G7/zO7+DBx54ABcXF/jgBz84pHnf+97X4gI98MADeN/73rfZL/vuGjJJa1UIezH57LHmOwdFElqVgCZGB3J5Mmll7aWtssNub3aGkzR70ApgQE30Uq/X1CaXtooOPRGkJjeH73uYqaBtXrZNNg6ajvc7U7YoBUvbfmqy2uxnezzQJv+Bonwg09823toQc41VX2sVmS5HVMA23Qyce5o6QdjUvBNF7fT4Pes/o0bd7GuNDP1PxwVu5/dEfyvlMs3Oix5fNu6wEO62HTMrbub9doqt9qAmssSwKkdUxXX7yclimeivimiySuTDYYy/G/o9YGNhCzQyTIjhpuaV/+vlUWIAK4Ks7h9IQ9k+KQMqaSfduKUnIXwpt1i6K4dm9xtQlL8AGnEoxKIoRnnKONduq/sCKnFcSUuuxPBZXJuC9SwknIeE81CI5kVZS4vlcSmbGvkLUZMKKalUtqxi++rPJGlrXxCxupXX+L2Z2mVDAMCEXIlQqnloFTFLJ4euCoaQvUxArnWV7zU9RW5tPQsrDoqk7X2eB5tr2S59oP+OOeCYYiPU5bhYz6+QuzOsHArJXsnxQrpWArv2GYfy18aPfYSq8d86C6WtMs4HNbAiwCnzqHQnqtfDXVikGuzZqzbiU5478rwTIk222ef8bGGUYKZelbJ26jZgpiiUcmbPO1FDmsVUrY76/cXGTdXpJI3er8vS+d+NzbPeN3sPmpHVFjt9uqm/TrunRJ3kx7YPdP0sSa6f643A2z83s/ePDSlvCNjpe4r+LArwvetBv0edgiww0PUy52BTj732WZW1fd/WaWfv0nsK6/YOG+ZjVf6fxNw9CX1eZ+80eoGI6peT+WvnlFbN+i6nyeDJO9awAG5WD/tO1shcBSGObRzhMKmDw3EF3PPf9g6Hw+FwOB4ffOijwP/rPwBv+fV7XROHw+FwPMH4uAjfj370o/jd3/1dPO95z8MXfMEX4HA44Kd/+qfb/ne96114z3vegwcffBAA8OCDD+Kd73wn3v/+97c0b3rTm3DffffhxS9+8d1XQKtyADRLP20DqSc+VVqOAbzEYQKJ6iQPL7H8BTO5JBA1n1g6q/rQmkApl2OlPLEP1uqLNY0Tf3a/nvjaWOyqybRGRNXjtO2vWNzKMfozUbFo1nbPti6aGJY6acJY6qvTyYSaWDvaST5Nys9UHFI39b2RiXsqIKBYMl8cax8o+z5mZe3clZhD7DY1wV9sEXu/iaJGbyvtHC36GmkM9HTWitr29dB2QxLr7Xqyr2UYtn9SLylHJgdDmZAc2jA7RtAsAqnZRW9IZVJlKJKas9o/g9RpUNSpuspx1Zqy2GHL5G/tTyF+Vdt2y7KwCmEpx06yy3nQxIBYUoujAAAKBDo/A58fkM8JeaESy1eRuKJWtMRsI3M1UUboql4qisl8qERZ6KQwUAizsKLYQmeTX/0TftOScaKqTDngsXSodsy9H8Xm+TysuJOWZtccKkl6Kx5xFlMljDsZbOP1RiXnXCgjUsb5UiwmH0uHQYV6J0c8nIqFc2bCWSw200SMQ8hVvVrqvK6h2w9nAIkGYlfH4Q3V0lmTsWKlrAnrvrahpg/c9jfXdYntWwldCoywZNDSyWM5OWHJoJgVaYqRJa199lhasOZ+r5AYu0M/hoxDSDjEBIm7vISMs2Vtff6Ms4um8NV5ncWEpx/u4FY84nY84hnLHQDAMcdGwtu4v8gArYqczgQSwrrWvVWR0RYl5EMfZ21MCoEcS1oONZ3cLpdyfZS0DDCKbflC4GXn2p4ttMrcY2zn8bkh9+eBJBV7V02I6udKtZfVf+WETMjeEEDqveOyeJ4bW+jM7Zm6ec7NXDOUBW179rSFY+rZbNpFYk0/U4Vq2989QhWY9v2mfnIP3SPNZX+Mxb7XqoS13fPk/WJTJ7ttpnSGFM2dMFehJjZtC2O/koRNCFT6/ngc6yzlA+rZZoh5UVjb501Q41PaO1s8YMjWVr8Yp+eFFvUufDgM6XZJTKmzXpg3W7go51CH7tD9IH2k32mkjnoMSnv1e63g1JizxLrYStt66MUCmvBf1zFMBlDsjycEbMsb6O8V8j6wrj1sB6lxCwDHUgbLO4uGqHn1e4oNw2ExI4dVme09jnMpN+Xe/zPnAIdjgnv+297hcDgcDofD4XA4HB8X7srS+W/8jb+Br/zKr8QLX/hC/MEf/AFe+9rXIsaIV73qVXjmM5+Jr//6r8e3fdu34ZM+6ZNw33334a//9b+OBx98EF/8xV8MAPjyL/9yvPjFL8Zf/It/Ed/3fd+Hhx56CH/rb/0tvOY1r/nYbJ30av+9yavJZN6MyGU16SKWzDwljGj8PFOUXKne3D/vKjAV0TSb6NlTB5yCJlSvVE/M26jrbVUdp2An8KQ+s2PVNqLtORvrs1VUtQn/neM2cRUnmCowdgjGjbri1P5pBmqC75Qiw46Hq9oSarL2bus2wbT/9uqxidEr5zP0fdKOmZXh7uQ0jaS4Tf8xtOuuQAF0fo68hPF+UYmykgaDkhcYeb+yjwBD6OrPQCeC89LzFFHrVLi513SpW1ufMBK1ewiKaAQwKG9tGrEhDsRFiFtJ1lBtogE0orHnE8q6h1qxZlXMoVo7UxVeKTZb9XHvqJ3PtmvEGlr1RYtf2463ZBFVYreQoRRqXmInPakP0eRUUCGWN0SrQmn/SMIzl2NSLUr3faxBd9fcYyl3pXYeVNOxqofXfBjPveoL4kqIqzpOq7vX3zzfTqaPWF/uDJA+0BIiGpNnGZ28b05IQ+zc+xTJNoun2u59QvZ+jCrkJwTmOd2IQ7u4SKe/rD17Ktq9/ZfB2kBb6IVwlhyW/2fEuP1+qpxTdb6sPVe1Qa51GAjgnXFpMbwDzcjRu6mLjONTaS9TC9tzcTdW0MDlY+iy9FdJY8eKVRSHsLn+S+iGUEJfzGDfcQY1vWSy0xfaehk4/Z6XeYwkIoSyw/E449r9tnc4HA6H46bh1hnwuZ8JvNCdLRwOh8NxPXBXhO/v//7v41WvehX+8A//EM9+9rPxZ/7Mn8Fb3/pWPPvZzwYA/KN/9I8QQsDXfM3X4M6dO3jFK16Bf/pP/2k7PsaIH/3RH8U3fuM34sEHH8TTn/50fN3XfR3+7t/9ux9b7WOdwAlUlH5rVZTAqAVy7qpbYEtkWvXCWpQbpAXQQhbHMExMUeaipJXtQjLquMJa7StpbKzeXJkbnWZIj55OFMK2LTq9xh4JJ8pjyUcUAKLMkfzWtaswRCGxpxYQJZGoobSit37XJCppZYqZPNwoe80E5DBVJsKGNRXFalWMMHNRX8QImqiF7UR9iXlGvY4q1q2uB6v4eRvCwMZVzgzmNE7W1fxKOYrxoKIWljJKXrEpgEXBwXo8WGviYUKY+vlsfajaPIn1O9SndUxXA09VyEK8ZqXqlni+knc2Cmc93rLKv+zs6VJq52CYhJU8tUU0kVICmzaI9aFgjygXhc6knZzSkC/FAH7aLeRbETmW654yEBKUqraSk4bABfp+jp3IFcUkyTqLekxYa3eco6glddMVWUx5znMSA5SoqTFDYCxKESrkYFQxX48csIRUyFgQnrZctNi9K4cSQxbluENMWChjCanF/s1KESqfl9DLXGplVg6N+BXC8iIveHQ94JhiI3+ZCTkTUhKmtfaPWCwDI4GL2odMI+mahfzqal8K3FTClrclVX8hipmpkZOaBG5E5qCIrScAfSyEyDg/rHjacmzW2ULyrrlYM0sftnNUCfLEhIt1Qar1PT+suBVXPLyeIeWAR9eungYKWXw7HhGJ8Ug6A1BI38fSoVl08xpALS7yuIhga8Nc+ykAHBm8SqPRxm+zhtY2zqL6rZeWKIE5FFUvMYq6uB1/CQkkC30yN0UixdDv3zoGsDyDDofyv1UnCiqBy/W+yaLUpO6EUNwStoo9Of7UApoSS70Tx7Z+PCMxbcxVrfpMjBmRtVGJMoMvLiYhHYyi1y6S08962+YJGT7kafNSz82BdNbPLP1cMGUMMWl1vYTEnkGOt/1pHFVavdS9fxYDl2Ic00v5UoYmp2d9I+fuuJb3gFld9fnQxOps4ZtVTuv9e6S+pJE+1MfNxq6OZazrtLewSqvGZyS73ladYCjGvohC0h4Oc5WvVojDLNpQ4785uSg1/9ReW+oMdU3OzpmUo8+JHud63NR3reEMV+eBzQIR/W4ijinMIE3yXoXsVQvrBteWzACfGAuOpzSu3W97h8PhcDhuGh54FvAv/hbw9Kfd65o4HA6HwwHgLgnfN77xjSf337p1C69//evx+te/fjfNC1/4QvzYj/3Y3RS7DyFJBVotapS4HMN2MmymMrWfBU0RwdWelUBCMEcz8XM3ah+ZqAzYEtCz9uo22DSadNb2zbIvq2OLN+p8gk8m6Wp92qSnlCl2fHKcTAZeBVSnv6Kp+6mJNzspPpucVgQn1bo1creSz1b9a+P2DoQ9USE8JnNknNXk3BI25bW6R+qWgTuTda0cRXBy7Xc9KchB7QN2iUtOuU/4yWSnbp+2NFb2gYXgAHZj5ApEgRsUKT5tmCJw5ZhZXq2BimyeQcjdPewRLG3yFv1cTlQ1jXy3E/W6rpxBgcZ50xCAs0O3cAcAKuSVEL3pULYJuQVgiNMbUrECzqmk14JLSqXuWQjhmn+pE4rNbrXXJQASL1U+Q/8vXxt3wAgE3IrHogANhvyljFjjvloF8EVeGiFZqtL/X3PEWgvRpGPvyp6XKE4X9fkibxeTrLmQy0L4NjKVWKlrqX0mFavYgirhCqUulm7SalxN9kLaUUlnIoAit3I49XPf7KJR6yckMFEZhwQwMZZDamrpzKGQuYMdc1frCunL9XMkxvmyItWYyoEYj1UrbGvp3D6jWEUfORbVL2U8bbnAI+sZOC21LzFYNfdO407yRgDMCEfTWYzNWJPvoUqShTAuqvRy0EY1TP3vCsLzckigdg/hhHZvGxb4CAkl13cl7ob3BUvsqEVG5TmIlt+UtAU2zzK7XxNOfJk6+MRzdb7YKIz7ZZtu/ylYclT3lyUdbf32yGBJ0yyoJ4vFdDssSaneiQb77ata1Jr3FLL7NJFr6jJTd8vnXXWsWWzYoPtRLR64jBje2BJb2Heg2TmeHTt5T97N2xK4M7JT0uv3ah3WY6bClvbVRRJCuLMeAzPS2BK8kzYM507Os5xja8GtvnMIIF1N1d72TqX7047DQEDifr8wCwA313t7N9JtrkSxfm8S8vcy9bDkadXEDscOrt1ve4fD4XA4bhoIdU73LuaBHQ6Hw+H4vxBXZOmuKSwpu4cZsbeTF2lSVOXPgbYWz7MJtlOTZrMydf0sAa3qNW2PjqHatoW+bwYy6XfTTCYjddm2HbN4ejaNqI7IlK/I5WlbgWHCkjW5ao4ZYvPqWLqtLENS6snZy0hrnccJy+EpUT2Jy9bIiBD6ny5jBqm/JWZ1/nqydBib+6TzXS1SsApmvV1IZah+CJO+YdUGCtttwx/3fbpNZF6qhwneE0o00w8b0kQRv4PSewYi8CGWRSBAJamo3i8q8Vv/GtPA6IpcxhB/t8U8lS4V715Ci43a4/DSSJaxSiukWSXXmjITNY8IoMajFbvfuGHeRoiSV+L18oSNk5iwjaQEt7+FEhbSStZyvNgLR2Ic1Ey7Jp9TDki5HiNK2pbQnhJ9P5i3pdlLx4wQMyicuHeJAriSxFy3STxfAqZ90erRmOOeFwiIMSvCt8ftDZSrFTY1kptrHwiRHmtM4/MaRxkAktq3ZxUt6mEAOISEs0ryr3UxBQuBTXrcUKs7E8CR6wIl1GM2XTV+rmM8rBhJYcL2mSqH1Ovo0h/N+n4qMXzrNiLq98uJGnEW93ZDxoQxPvvw7LFVuexdpN031T3N7ptAxwPec6bQaW39pX2k2nml57om9ey2PewslBu+y/PYLuTSqkshm+X7KTJzBvuOIfno7Xt5aYX0Xn/pttnzbmMIq+P5sr60MYht/a8Ku3Dhbo6b9Y0lvvVCgD3M3gl1n+7WYXJe9uql1b8mX2n7Xh+062GCmQq3xdsNY2xuuS6LVboas1J2NvUY3lnCfJv8tXbKzdZet/UdSLaH/v7l9s8Oh8PhcDgcDofD4XA8NXFXCt9rB6KurgWAsHQVrLZqlHSWJGQe7QOJwJFAKQ9lDOpgdTzHrvodJielXKmjlHVcx/oCxZpZJnvEGtpOMLbJLjXxKVbSVsWQ0qjghJr0lvroPtDHauJZ2+Lp9swm8TShKnlZnJqotVbSeyqQU5OXpnxR2LZ8gbZNJuEYjGapmFJX4wJ9kn9ZJioqglgJ84o2ATgocrmeH622jZUkM/bMAIpqWNJV0kJIpLZt0+YwTD4y+ngeFKub/hnVUZyy2hYHC+WNioxzF6LoCcV17WRvJWl3z1YQRtL0J7K5HutkplUzA33bNLa1mgQWNGVyHs6fBhGBjVqHch4V2FZ9FgL4EJEXghWmhsTACsQjkCMhn0mmGMjXvBRLZxb1Z+hpmhVuQovVW/aXnVnIt5ovm/w325hBTGACYiw2zKV7CuF4FjLOwopnLHfw0fUcmQMCZWSOjcwFiio4hzCQu3fSUiyhQyEyCzmsFKyVkMxKY7fmCIQ0EL2ZCSvHRkJq8pIB5BzASe6vpS8oKktnSZuLwlFvH0hbJiAXspali4iLsooJrFS95WCTvyK9KXA5X01eLf0NYS+BDGANwEqgOBLTuSqpRRF9CHLP6gR74oBjigjEOI9r6/uYA5aQcXs54s664CJHnIXUyPxy/gi347ER7itH3EkL1qrenhHELe50YHDkoibP3An3+niBLCBg1UWEpmLnUC43CkA4lsdYUadX+/NjOZZjVaQyEC8qSRIN8bEDbelcOrTf3xvMtTu7P83IIU55JHWqCnD3mB3Vbnu+KJXkYLuqLJgpRiAQ+Lg2lW4je6tbB0+elSz3Yf28nqkh9yyd5djZ81aXJe8LVu0peegy9uowSwuMNsNE5bt+lomdsuzX1tBata3z1/nqNojq0+ZhYRcM2HL3VLq6bOZ+59PvWDOo96zBAltgFbCz90CYRQ2q/xBjsTfW71zSnlm95PjjUb1Tq/NiFlMM/SAOMPa8SN2UapuB8n5h2rd5D7HnSKugVVms2w+M14zKo12HOp30n7mv6P06H+ITY8C8723qn9JI1gLY2Dy3sBapb5vlp38DtPoQxoDADofD4XA4HA6Hw+FwOJ6seHItAbcTcnsk44S8HXariZQ9BdImy1Pp9Mr+zaSoXtlvyNi7JU4Fyqp3Y+0s23SM4dlk3WW4rG4yAScTbKfy3mvrZeXNyj1lW1nHhFZq9OwtmdPP0yZOX8tPJrQnx4rSzOzbkMJ7bVMTf1OFiimblQJ2MzlqCROxddZqYbs/jBOfJxEm1xrRNt8ZJO6wney8DFoBLOUNSmE1rvNOX6jtG+WemsA/abkKIC+hkV/c1Mf1P32rob69bQtqG/U0Ev93Fvd3lFFKRuPX4Rh9i8m9YiHkTdaXqXwBNGXuEKMXaPbISVlvrxyxVuavKFdzIx17HqGreVHIxwAe8tZq2r6RhaXt5CowftbJdT9IUhvbt+XLfb9R75JOdxlqvN/CVBM0ES/tClTIcSF5I7rql3X8Xu7kOtU+CpW8Hm2yuf2vidyFumV3UkpsnY54W0dL7g4dQeNnK3Rmta2Js9W1oS2eW5pg8jvlVjG7Z8xs6RV5Nr3vamXljBTVuETl2u5nwPSesiHv9IKsEwTg5l5s1Y162yT97r3cPjP3rJktNIEo6fZUux8rTqkzdTn282VuI2z6+2Opp1Ihs81vVqbFSZXrJSrYq+R/SRlTtfHd9sOe4na2727eL3fUutN89TGzumkieO846/xyBdhFfrN9g8uJfmdri9Ly9D1x+u5k37Mue18y77gOh8PhcDgc1xUXFxf41be9A7/72+++11VxOBwOh+NJgZut8I1hVLnq+Y/NBNactGtxeKnGUrU2bplr7E0z4UQ1hq8CByoT5racqtzlswPouHblp50gDfU4rTCezekQYcNo5FwS6zi+SU1gS39ENekk26Uf90jcmeLFTrjayTTJK6WulpipgfSkteS7pz4yGGz3dia3N3bFEotNYsuFUFRRwKgmlfOuSWJNFmhCXU/uN7tlw8BphY2UkxLYqnS5K0GGeL2mvBJzt0wWNtUwq7jEdYy1GMFa0dqI0VrPEEExbAiBrmg7QR5L3Q+H0j8p9zTrCkSAlEqaB/V8GCckrXq4KYxT32b7V/q2qYEDsF4o1ZDpc4kFrMclUVfGtbqwIRJq/ScEPkcqKl2ttK1EFROQl05iCXfW05VvxGiKSKjPlBUJJpcKdbKMdYa5pj/raYRAFrvosKKphEPo6tEQGJG4kbEfXc9x5NgIWQA4CwmPpQVrjrjIsVkML5QRq8L0Ihfl6KEqXS+qIhUA7js7NlL4sQQ8lg5Yc0AIhey8kxYcc8QSclO0At2+GIhgztC2yNJuRijjPwqx188lZwKFQhhzZRwpJnC1S+4xd9XlGkrH5xwGJa46de0YIXS7Il84JSF7qZC9mUCJgFgVs1WBezsecR7WTsbWm/4xlVjIt+mII0ccU2x3/WL5XPI+pogcMi5SHGIpE3cL7kCMg9hpIyJzQFJkb6ztlTEEUeUyUE2rwRIfmVtShAtjK66IWms3ThngpY5TRrnWTRqxPu+246cJCzq50Kpe66X2w32z3dsFWt1ZFZJk3R0C9Rjc+v4wU/Tm/qzQZKCQwU3QrpS6FON4TNqOOx1HuG4YE9hnJ1CfB0a9qhe0xFgUyzqesXIZEeX0hrwWJeleXNSZmlPvk/cBqxQ+BXET0Qt6REE6PGMVia1VxJoQFnXp8Tj2zd57kF0oqNumy5wdP1tEYNXIul4qz2FkXUYsz+otx8lnNcbl/a5cF8oVZ1YX/S542TuaPcZcL4OaeHZ+tFOJ1Eu/G9qxqq5BlljN6litim/jOaWupK/vysM1OFEZ9+ZRJ3G14laHEQHmxC1Q06Xtdqvq1fe3zN21Rpcnbii6vFD7XZdzlQV4DofD4XA4HPcAH/nQR/G67/o+/O8PfPBeV8XhcDgcjicFbjbhayeZ0mRCY1gRT+MEWPkwzZPVpCxtVt/rNJVok8lZrR6SybKlTl4dK7EoBGukPtmpMZvEtgTyJm3YppM260m7PKnfTNmgbZr3JpVPKYHqZCbnPJKuMok4s4XeU+cQDflMp/gtUR/CZoKWmbfHSr6tHoq8rcdtMJmQG4jgBCDE/h0YLZvbdmWrrMhdtnO5gfY/i5qy5tdsnIWItRPQmrClziJuiF1b/sxWWdd9qmAyRDjQieWETd/RshTilXl7HlphohqvJHiI6CqZSmoLMWwtXaXNnLfkzVBvcwIaSWGv0wicHZDPewzfFl9Xho9S8A5EjQyDxI0sbiQZY7DGFXtcDiiXeeHfNreuZqMrZDD1460SGASQUnYW5W2J/RpRLJlTDgjMQ1zeljYUsvCANCh+xW4YANYcKmlb8rtIscULDsQ4C6kdd8wRx2ovvOZu/9xOQVW7rjmAU2UbG/upOhyVeFXsbVEHoxO+qJeFTm9J3YmyV8jbIX21gG4q3moFLXUo5TAk5i0HlEVBxDhfUlP1Sr+Lgveo/MFXLqTzISYgxSFm75oDYujxlyXecaZS5soByBhUv+e0Yq0W3Y+Z9hGX/ixjh9v4FWU4Kyku6XNg1lW1cSzdIjGsc90WgBwLIY21ni5Gi1kt10o+hHKd7RBpsgCDdBxLfY/Tlvqy2GeTCY+LmgyxI6pg2uFLZuTP7uIZYLiXDsrQek8Su2htJzssTrHEHDCSu/NKjt/34spOFnextuTtFR/rYJ/ZmhC1ddxTu9oFN/r4WbtOELONzNtTAuvyrGW0rcdeHew7wh5pbYnKvT67Sh/q7ZfBvvvaeqp3spajJr213bImXWd1lfxn7VcW5ps6DXbJOxeYIeqHBQp6HJvrYfw+WYCBOrZ5HNs9RIYqvx43KssrmTpZ/NczUwvtNBl7CjGO7xqDzTP373rhp773yWcbfsLhcDgcDofjGuNEQDCHw+FwOBx3iSvKBK4xupyq/+ltAomzS9RVsApC3mpy9yp2zi3NHukF9EkwrQhWpLH+Pi/E5G3VJTLhDDSl50YBafPT2y9LfwpGATXUS+dnJwJnFnta/TtMhJt0ut1W1aP/V3Xs6tvJebL5qbqftDTOagLQqmADtTjAOgavzm+mCmsKjxP2ggOBruMHCzE7kLOW4EU77spoqtrJhKy2hpZ89TjYO54UqaHjS5/q78ts03X+s/paxczMTl3DEgYtXyGvI2hZkM5CJWypE7yKcG28oSVpFbFlrXA1mdbyWaBUwJ3U3BC7Uo4t35C/hEKCAsXKOVBGRCd9y+f5JHwAY1EkcduuiVzTqFwJSkm3hH4/XGuMX61Qbd0khDKjxO+tatnuDYxN2taPipgdSWGMn3lnIUnLyByryxFracgwpH6eqcYWNn0PAGfLWtXM28ew7jv5LErqYMjd2GL19u2s7J9Hsp6bZbY+b1n5LUvc3nIAhjElls8zN+u2TbrcjGHhsFvTqtJcj0/KjJA6uVoWOZy67rP6OLkHwdxnlSKwHNSv5eH5MSGupgtDgrmnTuo6tfHfw0BQ0yZPu7hmYys71Cds6rixmrXtMfVt2CPjNEFo2zYjiPcwI3t1vbSK05CVjwuuSpRLffawtwhuj/gW5evMlvqq5X6s1tmT62BTb+yMB/uOpo/Z6zN77T1ettWyz7rZKEXxRp1+qr/bdTcqh7dF1vfKU9bKcn/S70izEBv23ayRunbx2V1MhH4MNtUOh8PhcDgcDofD4XA4bj5utsJX1LNiy6xVndo+jhm0pkKukmZAhHAt27sla5+9b4Ss5C2EMhFI2yCLCkBUvzNbw8PSSa2oJnJm6hurONFk2CIWeSZN7PUu+VBXXtl+G8qjbuncrG8NATwjlEVdsSx9n550EztCPdk3m5y0E3R2gh4AVcvg4dgYmzUvVaU051zUvWIZ2LIx59daWAqU2lTya8fUcjQ/M1gUi92ysmRuyq5TKtmmVqXu8tfsjLeTdmJPOq2DJRxSGslYbWsM9AlFq07J3FdZimr2VL2MLXVDjFVtHfoEaWYgJ1A8DKQw59S/XxwxxKyTWL9is2oJdgIgxy9L+azTiPWoUeicjL14SexpunUO3DqvxBWV24hJPohHM7q1cyjEGYuiO6CrInM9DupWlQFEDLa6lEteTT0qtzJFsun4qYhAOivkI0dgiakobkMfP0IIHjkioZCw53HFMRd7YcFF7lbNa7VGluNBwK14BCJwkZdCDhtyV4jfW7FYGSce4wEDhVTOKJbLa4rIOSAL0cu1E0K3cW7npapbh9sIgBAYOZeO4hxaWql7XFLLn4KQMQEhZoTASKmrfhtJrMuoxC6nsp2iyFmFjFREcACedigW14+mAwJlHCjj/sMjOFZWvyh60Wy3hQQPleA91vEdanzjQMUaWwjdGDLOQsISUv2/kPhHLmrqOzniIi24SMUuWqyWGwlL2Ch3i7Ka2piiUMYSx7JPrw8QwnfgMlZslLKWKBYb9LCeIHrbSeh1o0qUNIJG2Z8Wha5RYGqlnyWEDEk6S2fVfpyOw75m+3yoz8djauTTxh52hjyWVdSI3Cx4AfRt9ZlWnk/7Kkttdzutq5BjMwJxpijumWzKQgjdIjelra30LFTE5r1jtOZtbVMkI69rJ4Ktk4bN1yzoGpTX8o6llZH6HUOeH7LfqkIt8amfLUpNbfMZtmnIdylPW1drS2RdrjqPm/4U6Pcwe6wut5bZciAa7b1l7Ol37dkzU4XPGPr2xMLCpqyXNp9SDqvv/dpX9Zy954VQ3vFUaIcGHTaDxQZakbIpFSeSWEJhDOcxo7y31IV7w/U2LDC7hOjmDE4ZtIT2fYPmkhJ7vyqCud1n2gK8m7++1+FwOBwOh8PhcDgcDsfluNmEL7BPyBi1waCklcmt2SSgntAVVWagbTmVDC6T2iqdLf+S+lLmedrLFDFCvMoEky5zprqdHauPMROhLZ826XgF1YmeXNP7NWE9s3OeEcAzwlyXY9t5N7AT2mYysJEDGxngFWAsmW0MyKntH9TEs5qUaxN2cW4H2hPm6WTeVE0mNtCWcNb/27i6iuzdzVfHPN7BMLneKzlPPOmjS9VxJ8qWOiJgQ6RcKe9ZccsCXiI4UIuL23cCG8lo3cZqnxzHlbRt6WSIa06kkoyW6Np8VunJfA+JkBcG13ngKCpdlBi+mnSNyMhESGqbtgaeIde4sHk4Jg/bsslPq4jl+IUS7tTHU1GrAqkqV1n3k/xp0lBuZZr5BgqZC7VdHSblXAYirq6ZKq9KQGsbZwTb+bqgXnCgjENIVaWbuqWzGky2v4BChgupy6rPy37Vn6oShTSOjVAWG+iNKppVv+i+LgUD4BIXGZX0nYxzfT00e/FZP9T/KQNkrkGJg10cDQLAaZPF444wuf9qXDXWrM6vLejZVwsOC6pU2UMdZs/Oq8LEzuU9Eu1u22cxOEoYMlWTtbN2WLL31H6pK9BIyCvlMYMlOyfvHzR9t1Lp7kb1a44/9cwc8j6lSr2sv0610dbVEvFXHRNmcdwUsu+SNp96Hvd3Ib265JI+nPZPt4nea9/mneVEHNzB7UUvFB0Sme/yfqUX+8326+N1HaSsSQzfjTmHx/B1OBwOh+NJic/87M/Ap3/WH8Gt27fvdVUcDofD4XBcE9xswpd5tEnWEJJRKXgbGVn/KCsFr1Z9GHKTRBXZ0tVJ2VisXFv8Xlu+JQz1RFebHKqqmqoKHVTDQCepBtVF7gqNKMERMR4DtEnmgQjWfaDrYtXBtt5WPWv6bFDG7E2+2T6xihCjcuHaRlF29qIYyCUe7yxWYquLmaTVk3e6hmKTWZREVYmjSBMdP7Fhom7llMs4SWiTeJvJXK06S2MZpM7D0K5lKWRIzkUFW8tvSmJVjwGWHDYK5FaOHNeUS2ryUKyXJfauTDBacjgVNSID5TwKsSzKXWVVWshNQ2ZIXhKHN0zUX+tar+tQFLwAxljJUSmY5ZqNva5SR1HdaJW9voYtObJD/NP5Gfjs0OLrckBTNTZ1rSF4LUnLC3WrZk3yymc911vzbnnKPk2oyWdGUwyzOj7cKerJfGCcLStuxRW347EoQ8G4k0VtmlSM3lAtl6mQw6GQixIHFihEqCZ7L3ipp6X310bBS4zzUBS+KwfUCOe4FY+4oAUPH9EIUBab4qbwJWDJoFgsk5uNciWESSyLiZHWco9sqt5a32mMXgAg3l/fUZW0GUGRngwWq2kmhLM03HpaOYxmiSwnZQkZt+MRT493cKCEI0fcyQsu8tJU0CmH0Za5KqYPcdyecsD5smKhhMfSocVDPqvj5FjP151czs2ykdr2sdM6ivW++iyScZ5ImtXHmhqXbRxnAMt4PbSxLGRv5hq/Vk5G+S9Hqi4BNOcrJs+a2f16SqrtPKe0epZhCEUAEke0Qd0P7QISTQKRPMOqem+0n+XhOP15yOuwgJO5JykyVd9TWe6X1vlExz+V/M09rylz9fNZK1r1/tYPYdjf6gCUZ4JNu0eEamUrMzjG+btFfYchcX3QddTk8mXvJXYfUYvr22IB2/pL+QLZbxej6QWGwKjklXJ0fWd9ogl/nXd9Ng3qZvls1b66H2aqXr3fjhWV3zCmZosk5Vzo96+af1OfX8WyWpett+1Bj/84XlObvCvaNWiuOXuv6GR/bspZqOu6l6Hei+R+ENWCj5nCNjMQzHsK2UUGhoTPYZJHLXuwU3CC1+FwOByOpwL+3F/4cvz5//tXXr6I0OFwOBwOx1MGN5vwBRSpiz5hsqcgMJN6LESqUfwKCTwSwqGRxE1ZMuR1ojxtaaf3yWRTzoUIkLoL9GSSblNUE3Yjs1A+DwpNHicddbzUqCYQtVWz7hNJG0Ihe+2Eq1WEzNJs6hfG9EAnsIfum5SlidEYuxJXk8YnrHjti/BAYkrf5b6NJhagjbScqXX1hNtE9TpYgmoS1SiDh7qu6zjBf6pMC60QESvnHcWwEBKNiFZqEmYaSVRDcvCsDrVs3c7WRm25KFAx7toxersmgS0hbMntGAqz1M5R7BOpk+O2Sh6TH+ceI1RwfgY+W9T9Ao1opczIRIXzPtRmsdqfuCuDCUMs02bVLH+sCLIA0LHHCt6QyYQm8NSq4SZ2DWMHZBDu1OCqgXKJ5Tu2EhdtfyFmi6M4Y0HCiljj0JZ4skKICs7CWruZmnW0VqkKAhjncUXIER89nuMiL8goJG/iYutMZPo/13izibqdMgMUuBHQ3bqch5jFYtlM3C3aiQDOpUyqdSUqZHJiVDKZkBOhryGinh96f7fbnsQbTvV/zRFV5bOOpyvq27Ow4iwmrLkQ7YF7/2cQLvKCY4pDTGQAuLMuuIMFK4em9l1zbHbOkYAQuRLKhEAZVC2ikWkkXTMwxPCVccMYxtXmyaf2l0TqlMXKB9e8GUVxHhI1Rw2xHB8V8zv3OKt+A9o1vyHDgJEQtCSQ2O4a22Bty7ohenVVLMFs30uSWZw2PAdpvBc3km/Mg1NuJNLMhnpjUSzbpN6WPNxRig5W9xNS9xTZi5yH0795F7tM3avz3CM7ge0zxCpgpc2yfWIh3QjMnfqQzmPvvdL2kU2nv1tbZvUOuGnf7P3HvDtNp/Xsu6aUqxcZzhYASFtm0GPXLtRTfb1rBy6q8lPku+6DYXGdqdsVQoJoi/JT6l3UhQubhWfTAwKA1I5rjif1famtn9lz1Ylqv14wR5UUbuR/fW6FPN7TBI24n5DIPDnmVAx0h8PhcDgcTwo42etwOBwOh0PjRhK+MsG35osyeyz2mimPE2MkjAhGMvjUpJr6TFxVYIoAJSEmmVHZPDBRs2MTW0rWk79rjUeqJhwZBOJcFMoTlfFAzkLVodVTkbMy0WQneKy13EZ5UWMBN8WwOl5PAmpFCqt+kjpWMrwrDGhMM1GCDPnqtu5Nqq4lPmJXGRPAqZ2LNmknk2cqHz5hm9gJV0PAVmKTNLGoJhr7JHN9wWb0eL/D5H0lhPREuiaTmftxGcPk3F6sXOS+H0Rd9TtTelvCV87PZL+0VStym5KWO/kLiv14VHUzeNNm5BI3lzhUtTa3Ng7ERDv3qi6kiAWdxqQbts3AhcgqBLFMlNZ2q3M2np8xRmO53GqsP20rSysSXeC4PoZ8rMRkvTRDLjFf8wIkqgRh4mpdW4rgQOBYucBcSK6idqxVp9qsDISEQSHZVMXVAYCB8j8BJKdsYaDWiXLdfiTkxxiZGOvDd3AnHXHnbAXT2mLArgByODa17p1Hy7W3hDwQjJkJx6oWzUxYUwCHDAoZGYQARoqd8JX4wFwJzgTgopYraRICHr4TkfIRiRMu1qJ05ZyQ1oj0WEJ+NAMXAYiMEsOXC0ErxGQAOGSkVDqGAsBS9kD4VntosXyuSuHMhKDVUZXoFRI5HyMo5qIsTkL4KvL3opO/zFRI3zUUYvrY70n5kceQ1ju4uDhiWY6IyLjIhIvESDmDjwTmiDXJtUAtjjLFFcecS+xdADFkUEg45liIdyTEUOyijzGB4oo767H19UU6w2OJcTxG5JSxHjPyo48Bj8Yex/dYSAomBmUq8aNDGY+UCJQIOBIoAXzRLUQlTq++JNvChrWM/bCW/iEGkBjhCMSVVcxpAq8MOiasfIHERzD3GLk943r9DpJ3tPiW5R6LuhBirBA1y3B1/+EyLsZQBbmmJ0Oe1DQDGaaf4XVgkFIGYpyQYeaSL2K/xwCqrNDq1fctAOVCVmryjakrb3W9lcJXxn9RXk+Is0a6mfbLfrkNb9SuE9Kzgfrzw757SZlChEr6lkc9Vh56Kt1w/hohq+pXb5Kcj+VVgA3haxeszUjnjZLTELVyz9HvPLN0QRaipdoXKM/RNuYm/WpVtPV8DovxgJI3Ay2GPQBCHJ9XOQOHQ+/D1ge5XCsTW2zOuVyfQT37gV7/4XzX45PqR1b9J/u0yni2+KAtNIi9T9iMSX0t6zHZLJr1+SnxrlmPL1kcIYPFErAtP/3OIdeiIlsh9+W15xkDYJdM1euaQv25lc35Y/R3Gnmfl/Pd3rX0OZP+pX6PkTxZVumg17XeC9fqofGxhK9wOJ4I+Nh0OByOjw0Xdy7w8EcfudfV+LjwyMOP3OznQM7ARx8Z56yuAx5+dP4bx+FwOBw3Gld5ZhLfwCfr7//+7+PTPu3T7nU1HA6Hw+FwOBwOh+Pa4/d+7/fwqZ/6qfe6Gg7HBv/tv/03fOZnfua9robD4XA4HA6Hw+FwXGtc5Xf9jSR8c85417vehRe/+MX4vd/7Pdx33333ukoOBz784Q/j0z7t03xMOq4NfEw6rht8TDquG3xMOq4jHs9xycz4yEc+guc///kIe9bdDsc9xAc/+EF84id+It7znvfgmc985r2ujsMBwN8PHNcPPiYd1w0+Jh3XDT4mHdcN9+p3/Y20dA4h4FM+5VMAAPfdd59fxI5rBR+TjusGH5OO6wYfk47rBh+TjuuIx2tcOonmuM6QCYtnPvOZfh92XDv4+4HjusHHpOO6wcek47rBx6TjuuGJ/l3vy7wdDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofjhsIJX4fD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4bihuLGE7/n5OV772tfi/Pz8XlfF4QDgY9Jx/eBj0nHd4GPScd3gY9JxHeHj0vFUgo93x3WEj0vHdYOPScd1g49Jx3WDj0nHdcO9GpPEzPyEluhwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOByOxwU3VuHrcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcT3U44etwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBw3FE74OhwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOxw2FE74Oh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8NxQ+GEr8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcNxQ3EjC9/Wvfz3+yB/5I7h16xZe9rKX4T//5/98r6vkeJLi53/+5/GVX/mVeP7znw8iwr//9/9+2M/M+O7v/m4873nPw+3bt/Hyl78cv/3bvz2k+cAHPoBXv/rVuO+++3D//ffj67/+6/HRj370CWyF48mE173udfhTf+pP4RM+4RPwnOc8B3/+z/95vOtd7xrSPPbYY3jNa16DT/7kT8YznvEMfM3XfA3e9773DWne85734JWvfCWe9rSn4TnPeQ6+4zu+A+u6PpFNcTxJ8AM/8AN4yUtegvvuuw/33XcfHnzwQfz4j/942+/j0XGv8b3f+70gInzLt3xL2+bj0vFE4nu+53tARMPfi170orbfx6PjqQz/be94ouC/7R3XDf7b3nHd4L/tHdcd/tveca9xE37b3zjC99/+23+Lb/u2b8NrX/ta/Oqv/ipe+tKX4hWveAXe//733+uqOZ6EePjhh/HSl74Ur3/966f7v+/7vg/f//3fj3/2z/4Z3va2t+HpT386XvGKV+Cxxx5raV796lfjN3/zN/GmN70JP/qjP4qf//mfxzd8wzc8UU1wPMnw5je/Ga95zWvw1re+FW9605twPB7x5V/+5Xj44Ydbmm/91m/Ff/yP/xE//MM/jDe/+c34gz/4A3z1V391259Switf+UpcXFzgl37pl/Cv/tW/whve8AZ893d/971okuOG41M/9VPxvd/7vXj729+OX/mVX8Gf/bN/Fl/1VV+F3/zN3wTg49Fxb/HLv/zL+Of//J/jJS95ybDdx6Xjicbnfu7n4r3vfW/7+4Vf+IW2z8ej46kK/23veCLhv+0d1w3+295x3eC/7R3XGf7b3nFdcO1/2/MNwxd90Rfxa17zmvY9pcTPf/7z+XWve909rJXjqQAA/CM/8iPte86ZH3jgAf4H/+AftG0f/OAH+fz8nP/Nv/k3zMz8W7/1WwyAf/mXf7ml+fEf/3EmIv6f//N/PmF1dzx58f73v58B8Jvf/GZmLmPwcDjwD//wD7c0/+W//BcGwG95y1uYmfnHfuzHOITADz30UEvzAz/wA3zffffxnTt3ntgGOJ6U+MRP/ET+F//iX/h4dNxTfOQjH+HP+qzP4je96U38pV/6pfzN3/zNzOz3SccTj9e+9rX80pe+dLrPx6PjqQz/be+4V/Df9o7rCP9t77iO8N/2jusA/23vuC64Cb/tb5TC9+LiAm9/+9vx8pe/vG0LIeDlL3853vKWt9zDmjmeinj3u9+Nhx56aBiPz3zmM/Gyl72sjce3vOUtuP/++/GFX/iFLc3LX/5yhBDwtre97Qmvs+PJhw996EMAgE/6pE8CALz97W/H8XgcxuWLXvQivOAFLxjG5ed//ufjuc99bkvzile8Ah/+8Ifbyk2H42NBSglvfOMb8fDDD+PBBx/08ei4p3jNa16DV77ylcP4A/w+6bg3+O3f/m08//nPx2d8xmfg1a9+Nd7znvcA8PHoeOrCf9s7rhP8t73jOsB/2zuuE/y3veM6wX/bO64Trvtv++VxyeUJwv/6X/8LKaWhQwDguc99Lv7rf/2v96hWjqcqHnroIQCYjkfZ99BDD+E5z3nOsH9ZFnzSJ31SS+NwfKzIOeNbvuVb8Kf/9J/G533e5wEoY+7s7Az333//kNaOy9m4lX0Ox93ine98Jx588EE89thjeMYznoEf+ZEfwYtf/GK84x3v8PHouCd44xvfiF/91V/FL//yL2/2+X3S8UTjZS97Gd7whjfgcz7nc/De974Xf+fv/B18yZd8CX7jN37Dx6PjKQv/be+4TvDf9o57Df9t77gu8N/2jusG/23vuE64Cb/tbxTh63A4HI6O17zmNfiN3/iNIVaAw3Ev8Dmf8zl4xzvegQ996EP4d//u3+Hrvu7r8OY3v/leV8vxFMXv/d7v4Zu/+Zvxpje9Cbdu3brX1XE48BVf8RXt80te8hK87GUvwwtf+EL80A/9EG7fvn0Pa+ZwOBwOh+M6wH/bO64L/Le94zrBf9s7rhtuwm/7G2Xp/KxnPQsxRrzvfe8btr/vfe/DAw88cI9q5XiqQsbcqfH4wAMP4P3vf/+wf11XfOADH/Ax6/i48E3f9E340R/9Ufzsz/4sPvVTP7Vtf+CBB3BxcYEPfvCDQ3o7LmfjVvY5HHeLs7Mz/NE/+kfxBV/wBXjd616Hl770pfjH//gf+3h03BO8/e1vx/vf/378yT/5J7EsC5ZlwZvf/GZ8//d/P5ZlwXOf+1wfl457ivvvvx+f/dmfjd/5nd/x+6TjKQv/be+4TvDf9o57Cf9t77hO8N/2jusE/23vuO64jr/tbxThe3Z2hi/4gi/AT//0T7dtOWf89E//NB588MF7WDPHUxGf/umfjgceeGAYjx/+8Ifxtre9rY3HBx98EB/84Afx9re/vaX5mZ/5GeSc8bKXvewJr7Pj5oOZ8U3f9E34kR/5EfzMz/wMPv3TP33Y/wVf8AU4HA7DuHzXu96F97znPcO4fOc73zlMWLzpTW/Cfffdhxe/+MVPTEMcT2rknHHnzh0fj457gi/7si/DO9/5TrzjHe9of1/4hV+IV7/61e2zj0vHvcRHP/pR/O7v/i6e97zn+X3S8ZSF/7Z3XCf4b3vHvYD/tnfcBPhve8e9hP+2d1x3XMvf9nzD8MY3vpHPz8/5DW94A//Wb/0Wf8M3fAPff//9/NBDD93rqjmehPjIRz7Cv/Zrv8a/9mu/xgD4H/7Df8i/9mu/xv/jf/wPZmb+3u/9Xr7//vv5P/yH/8C//uu/zl/1VV/Fn/7pn86PPvpoy+PP/bk/x3/iT/wJftvb3sa/8Au/wJ/1WZ/Fr3rVq+5Vkxw3HN/4jd/Iz3zmM/nnfu7n+L3vfW/7e+SRR1qav/pX/yq/4AUv4J/5mZ/hX/mVX+EHH3yQH3zwwbZ/XVf+vM/7PP7yL/9yfsc73sE/8RM/wc9+9rP5u77ru+5Fkxw3HN/5nd/Jb37zm/nd7343//qv/zp/53d+JxMR/+RP/iQz+3h0XA986Zd+KX/zN39z++7j0vFE4tu//dv5537u5/jd7343/+Iv/iK//OUv52c961n8/ve/n5l9PDqeuvDf9o4nEv7b3nHd4L/tHdcN/tvecRPgv+0d9xI34bf9jSN8mZn/yT/5J/yCF7yAz87O+Iu+6Iv4rW99672ukuNJip/92Z9lAJu/r/u6r2Nm5pwz/+2//bf5uc99Lp+fn/OXfdmX8bve9a4hjz/8wz/kV73qVfyMZzyD77vvPv7Lf/kv80c+8pF70BrHkwGz8QiAf/AHf7ClefTRR/mv/bW/xp/4iZ/IT3va0/gv/IW/wO9973uHfP77f//v/BVf8RV8+/ZtftaznsXf/u3fzsfj8QlujePJgL/yV/4Kv/CFL+SzszN+9rOfzV/2ZV/WfhAy+3h0XA/YH4U+Lh1PJL72a7+Wn/e85/HZ2Rl/yqd8Cn/t134t/87v/E7b7+PR8VSG/7Z3PFHw3/aO6wb/be+4bvDf9o6bAP9t77iXuAm/7YmZ+fHRCjscDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofjicSNiuHrcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcjg4nfB0Oh8PhcDgcDofD4XA4HA6Hw+FwOBwOh+OGwglfh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhuKFwwtfhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDhuKJzwdTgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcjhsKJ3wdDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofjhsIJX4fD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4bihcMLX4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4biic8HU4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HI4bCid8HQ6Hw+FwOBwOh8PhcDgcDofD4XA4HA6H44bCCV+Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+G4ofj/A+evfFJevWF/AAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -559,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 21, "id": "d5b43501", "metadata": {}, "outputs": [], @@ -575,7 +586,7 @@ "# ์ฃผ์˜: validation data๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— `num_wokers`๋Š” ์ปค์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n", "valid_loader = DataLoader(\n", " dataset=valid_dataset, \n", - " batch_size=8,\n", + " batch_size=4,\n", " shuffle=False,\n", " num_workers=0,\n", " drop_last=False\n", @@ -592,7 +603,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 22, "id": "687f29a3", "metadata": {}, "outputs": [], @@ -608,19 +619,19 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 23, "id": "19be0316", "metadata": {}, "outputs": [], "source": [ - "def save_model(model, file_name='fcn_resnet50_best_model.pt'):\n", + "def save_model(model, file_name='best_model.pt'):\n", " output_path = os.path.join(SAVED_DIR, file_name)\n", " torch.save(model, output_path)" ] }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 24, "id": "dd22e901", "metadata": {}, "outputs": [], @@ -637,15 +648,15 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 25, "id": "40c3a306", "metadata": {}, "outputs": [], "source": [ "def validation(epoch, model, data_loader, criterion, thr=0.5):\n", " print(f'Start validation #{epoch:2d}')\n", + " set_seed()\n", " model.eval()\n", - "\n", " dices = []\n", " with torch.no_grad():\n", " n_class = len(CLASSES)\n", @@ -656,7 +667,8 @@ " images, masks = images.cuda(), masks.cuda() \n", " model = model.cuda()\n", " \n", - " outputs = model(images)['out']\n", + " # outputs = model(images)['out']\n", + " outputs = model(images)\n", " \n", " output_h, output_w = outputs.size(-2), outputs.size(-1)\n", " mask_h, mask_w = masks.size(-2), masks.size(-1)\n", @@ -692,17 +704,20 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 26, "id": "3acde59b", "metadata": {}, "outputs": [], "source": [ "def train(model, data_loader, val_loader, criterion, optimizer):\n", " print(f'Start training..')\n", - " \n", + " set_seed()\n", " n_class = len(CLASSES)\n", " best_dice = 0.\n", - " \n", + "\n", + " # GradScaler๋ฅผ ์‚ฌ์šฉํ•ด Mixed Precision Training์„ ์„ค์ •\n", + " scaler = torch.cuda.amp.GradScaler()\n", + "\n", " for epoch in range(NUM_EPOCHS):\n", " model.train()\n", "\n", @@ -711,13 +726,25 @@ " images, masks = images.cuda(), masks.cuda()\n", " model = model.cuda()\n", " \n", - " outputs = model(images)['out']\n", + " # outputs = model(images)['out']\n", + " # outputs = model(images)\n", " \n", " # loss๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n", - " loss = criterion(outputs, masks)\n", + " # loss = criterion(outputs, masks)\n", + " # optimizer.zero_grad()\n", + " # loss.backward()\n", + " # optimizer.step()\n", + "\n", + " # Mixed Precision Training ์ ์šฉ\n", + " with torch.cuda.amp.autocast():\n", + " outputs = model(images)\n", + " loss = criterion(outputs, masks)\n", + " \n", + " # ์Šค์ผ€์ผ๋œ loss๋ฅผ ์‚ฌ์šฉํ•ด backward ๋ฐ optimizer step\n", " optimizer.zero_grad()\n", - " loss.backward()\n", - " optimizer.step()\n", + " scaler.scale(loss).backward()\n", + " scaler.step(optimizer)\n", + " scaler.update()\n", " \n", " # step ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.\n", " if (step + 1) % 25 == 0:\n", @@ -727,9 +754,11 @@ " f'Step [{step+1}/{len(train_loader)}], '\n", " f'Loss: {round(loss.item(),4)}'\n", " )\n", - " \n", + " \n", " # validation ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  best model์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.\n", " if (epoch + 1) % VAL_EVERY == 0:\n", + " # ์บ์‹œ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์—ฌ PyTorch์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€\n", + " torch.cuda.empty_cache()\n", " dice = validation(epoch + 1, model, val_loader, criterion)\n", " \n", " if best_dice < dice:\n", @@ -749,21 +778,10 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": null, "id": "73b106ab", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/conda/lib/python3.10/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", - " warnings.warn(\n", - "/opt/conda/lib/python3.10/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=FCN_ResNet50_Weights.COCO_WITH_VOC_LABELS_V1`. You can also use `weights=FCN_ResNet50_Weights.DEFAULT` to get the most up-to-date weights.\n", - " warnings.warn(msg)\n" - ] - } - ], + "outputs": [], "source": [ "model = models.segmentation.fcn_resnet50(pretrained=True)\n", "\n", @@ -773,7 +791,24 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 27, + "id": "063b93e9", + "metadata": {}, + "outputs": [], + "source": [ + "import segmentation_models_pytorch as smp\n", + "\n", + "model = smp.Unet(\n", + " encoder_name = \"efficientnet-b0\",\n", + " encoder_weights = \"imagenet\",\n", + " in_channels = 3,\n", + " classes=29\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, "id": "801e9a3a", "metadata": {}, "outputs": [], @@ -787,7 +822,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 29, "id": "a11d1b92", "metadata": {}, "outputs": [], @@ -798,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": null, "id": "7564c751", "metadata": {}, "outputs": [ @@ -806,47 +841,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Start training..\n", - "2024-11-11 10:25:33 | Epoch [1/25], Step [25/80], Loss: 0.5416\n", - "2024-11-11 10:26:00 | Epoch [1/25], Step [50/80], Loss: 0.4473\n", - "2024-11-11 10:26:27 | Epoch [1/25], Step [75/80], Loss: 0.3589\n", - "2024-11-11 10:27:12 | Epoch [2/25], Step [25/80], Loss: 0.2706\n", - "2024-11-11 10:27:41 | Epoch [2/25], Step [50/80], Loss: 0.2141\n", - "2024-11-11 10:28:07 | Epoch [2/25], Step [75/80], Loss: 0.1718\n", - "2024-11-11 10:28:49 | Epoch [3/25], Step [25/80], Loss: 0.1351\n", - "2024-11-11 10:29:16 | Epoch [3/25], Step [50/80], Loss: 0.1124\n", - "2024-11-11 10:29:45 | Epoch [3/25], Step [75/80], Loss: 0.0954\n", - "2024-11-11 10:30:26 | Epoch [4/25], Step [25/80], Loss: 0.0794\n", - "2024-11-11 10:30:55 | Epoch [4/25], Step [50/80], Loss: 0.0699\n", - "2024-11-11 10:31:22 | Epoch [4/25], Step [75/80], Loss: 0.0611\n", - "2024-11-11 10:32:04 | Epoch [5/25], Step [25/80], Loss: 0.0525\n", - "2024-11-11 10:32:32 | Epoch [5/25], Step [50/80], Loss: 0.0474\n", - "2024-11-11 10:33:00 | Epoch [5/25], Step [75/80], Loss: 0.0431\n", - "Start validation # 5\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 0%| | 0/20 [00:08 1\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrain_loader\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalid_loader\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimizer\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[0;32mIn[103], line 34\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(model, data_loader, val_loader, criterion, optimizer)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;66;03m# validation ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  best model์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.\u001b[39;00m\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (epoch \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m%\u001b[39m VAL_EVERY \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m---> 34\u001b[0m dice \u001b[38;5;241m=\u001b[39m \u001b[43mvalidation\u001b[49m\u001b[43m(\u001b[49m\u001b[43mepoch\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mval_loader\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m best_dice \u001b[38;5;241m<\u001b[39m dice:\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBest performance at epoch: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mepoch\u001b[38;5;250m \u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;250m \u001b[39m\u001b[38;5;241m1\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbest_dice\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.4f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m -> \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdice\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.4f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "Cell \u001b[0;32mIn[102], line 24\u001b[0m, in \u001b[0;36mvalidation\u001b[0;34m(epoch, model, data_loader, criterion, thr)\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m output_h \u001b[38;5;241m!=\u001b[39m mask_h \u001b[38;5;129;01mor\u001b[39;00m output_w \u001b[38;5;241m!=\u001b[39m mask_w:\n\u001b[1;32m 22\u001b[0m outputs \u001b[38;5;241m=\u001b[39m F\u001b[38;5;241m.\u001b[39minterpolate(outputs, size\u001b[38;5;241m=\u001b[39m(mask_h, mask_w), mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbilinear\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 24\u001b[0m loss \u001b[38;5;241m=\u001b[39m \u001b[43mcriterion\u001b[49m\u001b[43m(\u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmasks\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 25\u001b[0m total_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m loss\n\u001b[1;32m 26\u001b[0m cnt \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n", - "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1518\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1516\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m 1517\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1518\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py:1527\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1522\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1523\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1524\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1525\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1526\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1527\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1529\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1530\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/modules/loss.py:725\u001b[0m, in \u001b[0;36mBCEWithLogitsLoss.forward\u001b[0;34m(self, input, target)\u001b[0m\n\u001b[1;32m 724\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor, target: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 725\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbinary_cross_entropy_with_logits\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtarget\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 726\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 727\u001b[0m \u001b[43m \u001b[49m\u001b[43mpos_weight\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpos_weight\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 728\u001b[0m \u001b[43m \u001b[49m\u001b[43mreduction\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreduction\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/nn/functional.py:3195\u001b[0m, in \u001b[0;36mbinary_cross_entropy_with_logits\u001b[0;34m(input, target, weight, size_average, reduce, reduction, pos_weight)\u001b[0m\n\u001b[1;32m 3192\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (target\u001b[38;5;241m.\u001b[39msize() \u001b[38;5;241m==\u001b[39m \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msize()):\n\u001b[1;32m 3193\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTarget size (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtarget\u001b[38;5;241m.\u001b[39msize()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) must be the same as input size (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msize()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 3195\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbinary_cross_entropy_with_logits\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtarget\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpos_weight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreduction_enum\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mOutOfMemoryError\u001b[0m: CUDA out of memory. Tried to allocate 3.62 GiB. GPU 0 has a total capacty of 31.74 GiB of which 3.53 GiB is free. Process 3519779 has 28.20 GiB memory in use. Of the allocated memory 19.15 GiB is allocated by PyTorch, and 8.66 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF" + "Start training..\n" ] } ], @@ -869,7 +864,7 @@ "metadata": {}, "outputs": [], "source": [ - "model = torch.load(os.path.join(SAVED_DIR, \"fcn_resnet50_best_model.pt\"))" + "model = torch.load(os.path.join(SAVED_DIR, \"best_model.pt\"))" ] }, { @@ -904,18 +899,7 @@ "execution_count": null, "id": "ecb5c065-b44b-4f82-ba6d-b41e3e7f6ad2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "288" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "len(pngs)" ] @@ -1021,7 +1005,8 @@ "\n", " for step, (images, image_names) in tqdm(enumerate(data_loader), total=len(data_loader)):\n", " images = images.cuda() \n", - " outputs = model(images)['out']\n", + " # outputs = model(images)['out']\n", + " outputs = model(images)\n", " \n", " outputs = F.interpolate(outputs, size=(2048, 2048), mode=\"bilinear\")\n", " outputs = torch.sigmoid(outputs)\n", @@ -1077,15 +1062,7 @@ "execution_count": null, "id": "fa7c963b", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 144/144 [03:00<00:00, 1.25s/it]\n" - ] - } - ], + "outputs": [], "source": [ "rles, filename_and_class = test(model, test_loader)" ] @@ -1103,18 +1080,7 @@ "execution_count": null, "id": "eeedc485", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'finger-1_ID040/image1661319116107.png'" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "filename_and_class[0]" ] @@ -1149,18 +1115,7 @@ "execution_count": null, "id": "679f5401", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAB4QAAAN+CAYAAAD9nrbGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9T6itW3bWj8+9z177xoQkYEKqEvJHSS8mGtAYRAiCkoDpxJYoavw2FKUiaIHEkqBGwYgtG9rWjgE7imAjqBEVMRCISIzBgGloGlaiCFVJVeqevc9ev8blWfuzPvuZ69yqVH51XXc8cNhrvWu+c445xphjvmc8c8735ng8HtdgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMrg63X2oBBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYPCbgyGEB4PBYDAYDAaDwWAwGAwGg8FgMBgMBoPB4EoxhPBgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBhcKYYQHgwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGgyvFEMKDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWBwpRhCeDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDK4UQwgPBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBlWII4cFgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMLhSDCE8GAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGV4ohhAeDwWAwGAwGg8FgMBgMBoPBYDAYDAaDweBK8YEmhP/BP/gH67f9tt+2vuzLvmx993d/9/rpn/7pL7VIg8FgMBgMBoPBYDAYDD4PzP/tB4PBYDAYDAaDweBLiw8sIfxP/sk/WR//+MfXX//rf339p//0n9bv+l2/a33f933f+pVf+ZUvtWiDwWAwGAwGg8FgMBgM3gfm//aDwWAwGAwGg8Fg8KXHzfF4PH6phWj47u/+7vVd3/Vd6+///b+/1lrr6elpfdM3fdP6C3/hL6y/8lf+ypdYusFgMBgMBoPBYDAYDAZvw/zffjAYDAaDwWAwGAy+9Lj7UgvQ8Pr16/UzP/Mz6xOf+MTp2u3t7fpDf+gPrZ/6qZ+q97z77rvr3XffPX1/enpa//f//t/1NV/zNevm5uY3XebBYDAYDAaDwWAw+H8Jx+Nx/eqv/ur6hm/4hnV7+4E9PGrw/zA+3//bz//rB4PBYDAYDAaDweDzw/v9v/0HkhD+P//n/6w3b96sj3zkI2fXP/KRj6z/9t/+W73nx37sx9aP/uiP/v9DvMFgMBgMBoPBYDC4GvzSL/3S+sZv/MYvtRiDK8Tn+3/7+X/9YDAYDAaDwWAwGHxheNv/7T+QhPAXgk984hPr4x//+On7pz71qfXN3/zN62u/9mvX8Xhcr169Oq0ozt+np6f1+Ph4+v14PK6bm5t1e3u7np6eTt9Tdq11Ytdvb2/X8Xhcb968OdX9+Pi4bm5uzu7Lvbe3t+vm5uZUT8ocj8d1PB7X09PTurm5Od336tWrkwzH4/GM1c99BL+nbvaX9ac99om/UfY3b96c6qBeqKubm5v15s2bs/7ltzdv3pzJdnd3V/ufMq0OlnNf2X7kiy1pJ9sy31+9enXqZ/R8OBzW09PTqe/UFfWUtnM9MqS9+AVly33Ufa5RTvYxMsaPdjaPjZuvfD6r6aO/1Jdrkd+gfW5vb9erV6/O/OF4PK67u7szvfMzdXh7e1v9xqtach9logypk3am/qLvfGZd+Z7xnH+JFdRT+unraS8+xP49Pj6u29vbdXd3d+Yz1DPlpB1YhjGN/Xjz5s0LX4i/UXfWO+XlvZEx9XAcxV4E40l8Kf17enpad3d3J31SZsvm+q1nx42UTVzm9fQhv0c2xsOM2ZRJ+4zf0cf9/f1JDscr+pNtzLFvmdnP3B99J27G3zieqJPD4XDSDXWbPkf3bM91BHd3d2exlPHSMZA2p+6jH857sQ918erVq5Psib/02ehxrbXeeeedM//1fMTP1OfhcDiLh/Tp/NvNs23OpY8HbNPl7KuMf5wD0qfYinXlWsa4ZfNzS/7S1nd3d2d+7ZjJPrBvKRffe3x8fOEfnK93zymsZxdLOPYiE+Vj3PcYclyjv1m+xGrbjLaL3LRl2vX1fI+O4rOc09y+Y3zkjp3oC5E18YB6ov7zG+u073O+o33WWmdy7b5nDqJNqF/qkGPUPkPf4nwRmVN36yPr8FzouMbngPwWPXp80uccZwjHbj9r5Tc+B7A966KNJcP1u//W3/vBzc3N+vSnP72++Zu/eX3lV37l+7pnMPjNxu7/9YPBYDAYDAaDwWAwuIy3/d/+A0kIf+3Xfu169erV+uVf/uWz67/8y7+8PvrRj9Z73nnnnfXOO++8uJ7EXJL/TDKvtdb9/f0ZWUoSj4l8knJrrRfJqrXOk2ROFCYZGZKJdZlsYzLIRI5JK5Nha62z35woZ1kmkFzeCSv21Qkp/mVCzyQ0SZZ8po4aKeFEIskuJjipGyfKU56/Ub+NSKN9WBdJj8jWiCUSDLYjdUG7Pjw8vLCrydHc6+QlbZl6eH2tZzLpUpKQerRvJMF9f39/KkeiJ/798PBwdl/6EN+3j7CvJBtoY+rKerTfePFGrt3e3q6Hh4cX+koieq31YnzaDrk3/SdZSrmsg7Xei0WUN/4WefOZ/aGunOSN3BzbqYcESHy6kStMkpO84LihH4TkzL0t0Z36bOvUyVjK2BQdxwc8fpycT/8ZEyNn+k+dO85xcUrswXseHx/P+kSyKmMyOj0cDmfxIHq5u7s71UOCz/2LXI+Pj+twOJzI2JDmn/vc587iPvtBMj+ypz36cSOtOL7oR/SRyHFzc3OqP0RadGbikIQv58jYn7Euf3/913993dzcnObxx8fHU7vs97vvvvuCWGJsIolOPyeZGvtTNvqk56/Ynn89vlM2eudCMSK6iu1MJoX8fv369dl8QJKL/aZcaYvPO/FdzneeN0nQcrEBn4ei87RDf+Q4YSxwXOJcTiKWfpS4yDHV6mdd+Z02jH0jK/2X5LDnUMY1jnn6E22fGMQ6aBv6S8ZG2mVcoU/Sj47H47q/vz8bZ69fv35hw7Sf+tKO/cHPg7zfz3vRxd3d3VkszefMc4wJ8fn2LONFGAT1SH9zH/3sQx1nPKd9+h/tat+n7fksGBu0hSKJI5TRc52f/eh3/r9CW+DFfjKeUg7XEx3xuZR6Z/xJvYxTl54PB4PfCD7f/9vv/l8/GAwGg8FgMBgMBoPLeNv/7T+QhPD9/f363b/7d6+f/MmfXD/wAz+w1novkfGTP/mT64d+6Ic+r7qS2PLOECaUmSgzObDW+e4aJmciV77f3Nysh4eHF8mhgEkmJ/QpQ8BE1S757OSYE/8mq1KWSVQm51hnI9pMLLekL+VhPUzY5jqTVpSvyWxiJ3U5scjfSXYwIU27mXAl2ePyuYd6cPuUwztlmbRca50lLk1aOTHtMk5mpk0nAJ1IbXoycW2bRu43b96cCBnbjGSqbUQCwcQ763l4eDjbDeQdQ7Qpr0UGj/HWT+pp54MktBJD2s5bxw8mlmlvk27RlReC5Lt3EbNPbINJdiaIE2dClHHXpRP2JgKpX9ab30lwNdI25aIzEoq0Afthssg7q018kbBgDCOZvNY6i3PWKf0gCOli0s2EMOum3jhOKVuLy+07Cb34pQnf2CByWleNqPKCKMtAOTz2bFsSV/R7EhtBdL7WOi3GyO5qElaMz1xw4t/Weo98p2+lryZtaBuTUZGTfcgisBYrQoClryRnGHPigyT1shiG19MOx4lJSj+T3N/fn+oKch9PtYiPR/+Rw/OCn42iN5OH8ecQtIHjJUnDRlI1Us3xu+0QTdn0jfGXds3Ya7vo83vqiy1ob9ZBO9Jn6BOMRWmHzxG7ZzbWFRnzObrnOL+5uTn5PHXCeE4/5JzGsZPrka/NZR5HnBu42CT+lnqfnp7W/f39GVFM20RfXEhC3cX2XizkZxyTmVzMxFMGTJzaJpwXuKjK82G+e+FV+kwf5AJSxnz7eWSkT1BW+31kbbvx/f8P+qB13+ZmPk989rOfXYPBbya+mP+3HwwGg8FgMBgMBoPBF44PJCG81lof//jH1w/+4A+u3/N7fs/6vb/3966/9/f+3vrMZz6z/r//7//7vOpJ8iNJqCRKiZbce/Xq1SlZt9b5rhMmb7n7hMml1GtijEl2kxqUgfWa1GWyyURn2iUxy2QU+0iZWcYysx6TgPnLfrkOJ8yZADT5wP4xAUfZTMQwuWgZ/M/9ZBKdfWJ9Pgqa5Aj1wt+sK/eD10wWcecJE3wmZlKeyU/bn7pkMpp+FZuYdG718TttanIo9ZoMJUFu8oxkZmQmGco2fSwt/WGt/THHLSmf3VYct7kv8BGt1gt9j7pm0pW+S5nY35A90Q93SLLP3LlHkOjM58fHxxdHurM8+7PWc+I5spggaHLTN0hGpP4QgybI6dskDbhIw7E5MJmRdkhUkLh8eHhYr169Wvf39y+O/7ZtHXvcFuVyvHefuJM2bXFucTKfJJ1l5A68zDU+tpyx1ARIfIIx36QdycpmA97junnMdPyTcS19pw+R/CEpRT/hvErfJ0HFPrHOkGmNLMkObvon4yH7mDHB8Z26HVcZB03crPXemOTOp/zOI79NYOXZhbsyo08eKU756aPcMZ5+pF7Kbd/3/MD+mVCNfXziAmMW5ybahv4TGSkPSbu2E9kndUSXfpZJv+37nrd4ZDP/8bkl9XkuiG+abE/90RHnjNiBZDRloZz55x30uxjCOY06bbpMn+j3WVTkZyjGNI6XFh/oB3xVSyOEeVIE5SLhG/tx7qVeGcsog+Oa52fv2s11LrByHGSd3GlL+9P3PD9RvuY3u1hyPB7PjsKPTH4OTju0u+epX/u1X1uDwW82vlj/tx8MBoPBYDAYDAaDwReODywh/Ef/6B9d//t//+/11/7aX1uf/OQn13d+53eun/iJn1gf+chHPq96mOwxUZjf+TnJGRNpTBQnocMkGBNIO+LCSZskgUj8UAbKb3ncPyecTfx4d0PqZ9ItYJKS97MdliFhFx0w6Us50yZJUCZXqUv3m/3n/byHdcRGTsjSDv7d5LrtQR3mXsrr/rRdHLSHyQfWxb/UpfVDHdBXnXx3XewTx4TJUf6We+kb7BOvOUFJwif17EjWlmT3ZyfYbROSo/RfkkxOlu9sYPKSsto/2e/U6zHC++nHTV+MYR7/lJsyHo/Pu7SoC9qn9StlQzawbIgOyplybdGKdcDEvP3NyW/HM9ra5JD7xIR4dn2SzMkCAIP3sX63EblIvlhuluXx4exHG5NM3pO44/yy1joRwi2eMPGf31IfCWHu5uTuS5M7rJPji/NV9Mcx5R3MIbrefffdU59JEuczd+ORNPMR0DmNg/0NcUXZPvOZz5zVRXDxAcdwI7joeyGb6M8kX3P94eHhbOdndBP70YYmpW9vb89IOC5sSF9DFpIkz7+11un48fQ198XPOL/Rt9LvtElfp15iA+769uID3mPfIBGahSt89qH+00Z047HOsZV2SYTxXo4HErR8xsv9nv928YljKwtTHPMYJ3kk9t3d3clvE3/5uwncFveiQ9qNv+/iGW0R/4g+4udcjMLy1CvnEcdt2zP+wWP03Qe/75ztZXGPn4tpOxLdlIt6dIykfuwz7VmT9gm4aIQLWTjWcl9snDL8/wP/L+K4bjl9nXMj+xbweSl++pnPfGYNBr/Z+GL9334wGAwGg8FgMBgMBl84bo4tM34F+PSnP72++qu/en3Lt3zLGUHJ3Zdrne+GY7KGiSkmHRvJ03ZiELw/YLLu1atXp+M0Ixt3IZscyn0ml5gkartMd8k5E0kkdk2CRXYmzPmdemikDftFws7JQBIsJC/ZX/bN9mG5tV4SJqnTpBt3x1m/rmeXZLW+W9K6+YHvcwLSujRoK5IMkdsytgR6bGRfYgLVumj9IXnEZHnTVSOYmdhkm414M3HkPlBGEnnUb9ON9bMbQ43U5XXe267Rj0ic2DfZB5b1+2wzvmh79tttNeI5Mtgmjgetz42scRLd97kM3yma30iwMGZbLurZ8bPJ5jhlf3SfG+naxix/25WzXdZaZ32OzG0xhf3BcxL7y1jabMe6Q1CF7Itch8Ph7OQKymkfYYy37UzSp+0WT016065edBCb8WhbE/cp70UkJmJM8njHJ0lbk4iR93A4nI7A57tIIw/nNceGgO+R9Zxj0iiI/mI/HlFL30lbId64+zx9pS5tV9uafuoFC4fD4fRe5BDY0WuI0IeHhxMZyd2y1EWLT7QT20xdjHV5R3cbE941Tx/kOGT9x+PLdwJHt/RtypMxwB3MPNI7fhGy0LHL7yLnb5wDrB/P1VzAkL8+hcLjJ+22uEv/o004Jzgusw3qjPWkHMdoCGHb3s/VbNOx0wtMOJY8V1hn9IPd8wEXWVBn1A+faxm76XvxHZLctklkc9z3HMKy7OvxeFyf+cxn1h/7Y39sfepTn1pf9VVftQaDDxry//rBYDAYDAaDwWAwGFzG2/5v/4HdIfzFghPDTMo4ebPWeXKHSWEmcpIEbDtAkoDiEaFMcmVHLt9vx3chpk7+3pJ8TPJEPr+/j8nU7FpJWRIivjd6oJ5aMpEkHBNT/MvkGtt2m2zLia9LuzNYhm3vyBgmP0kuuYyTniZtnBhngjb6NolPX0j9+Zff2vtAG0HlhLb72vrr+9ln2slHNTqhbFLcbdsW0bMJDyYnDcpowtpgnSZnOQb4uz9bJ/xr36e+aF/7Eevx55Qx6eF67TtrrbOkfauLOsh364FtkWjijiS3zz5aduquHanpPrQYEV+jvCnvdqintc4T9bSJ3+tIws+ycAdl6zvltQ1YV9sFbTu3um2X1JF7uXCI+rwUH02spbzj1lrnO5n9nvCbm/Mjmkl03dw8L+TxIqLUx/nS/by5uTntZvc86zmLsdCxObtB0w/qgXEsMvB4cfpzG3eM602WtV7OCZ5z6RvRB+c61hM/5DzL8cp7SE5T915clT6bhCNZzfme/ePzC/3Q9dMeIT45rkkAxwfso+zHJULYiwO4g5W/N32lbPrx9PR0kotzJp/lTISzD9GVd91nvKU9P194NzB1ycUAbI99jJwsRz/nLm3vQA74jBF9h6wmge24yWOs6U+MAdGFX7VCP43O+P73p6f33kns50OON/oen9UYP6mb9N+LN/gc7+cU6sVzlMdVfqP+/f8H2zU+w/nEv9PnE1M8VvMbjzl3TPWcm3uis8997nNrMBgMBoPBYDAYDAaDwfXj6glhJ/eY0M1vJG8D72Bi+XxOnU68MnHktpJgMkGXxAwTrUz6kWDMPZSFib6WhGJC30k5lmWSMnozqcmdFY3wcbKM+mtJzktJUOrKxCATk0zg7fplWRuYUKN+LZN3zTLhz0S15aK97CtZGMCEoxPBvEYdpl7KYtKG5JJ17/q4oKAteGCdbZcK7RU0+ehXlpNtNl0yoWsCm35oX6DvND9lO9a7ySXayWACvdmScgUs2+qxPazDNg5M3K/1krSNPhsZ3NohSea2SUS0ftFvTFbz3b70NcLHVlv37ptjmBf9BOx79N76QF9g31tsZl9MllFP9inqx/ezDeqD8pIM49/U43c0U9fWl+cYzpsmTkj8sn7H5fTJxH5ij4kQjgGOg/Tl9vb27Mhl6oiEHQkX9q+RkfYNE/L0Ze/0Zbxqdqa8HteMaX5WaPMbP/Ney0E7cZ777Gc/e/acZEK1PQO1mOg54Hg8nj0b5b6Q5CbL+RzEMbDbFWni0MR6SFnOH56rGEs43kKgPj09nYi19gzpxTTUCZ/l1lrr/v7+xX35jYRxEII09+R91yEuOWboZ4yvJHLbu7Q9LrJ7Pzu6vUs4z1rcfR2d8VUgjBGxS45Pp6/5GY92bjvC7WfRO3XDGOVTDHIfyWzuSo9P8Tk0Zaxr9tXPQbQP/dWLA6yHtO1njdyffnocUue534t+MvZazDkej+vXf/3X12AwGAwGg8FgMBgMBoPrx4eCEPaOhFx3GSdik0Th+xVTTxJGSYCb8GBCyTsmnGyKDNmlYuKtHTuXhE87ttMJ/Vzj8Y8kmNMOd0owoedkJ9toO2aYkKcueI1J4GYD6qcl3Nxnym9C0Pd4V7DlSr+ZZKMcJplcznpigpIJYya7o3fvhmEyngSG2/QuqFwzqWDi1LusKEsjTPhbI1JI4LFe2tbkAtuw/Wh3E6zeRZ7fqEMnYvO7SX7bkfqmv9jX2Y7vM1nTPtu29jWOd/fH9fizY4IT465/refxzv5EHi8kYP0twezxadhfXDfbcx+JFrPpB94R13ZYpx624wUoTX6OZ+qdsjb56YM7At6yNH02woR1tt8sj0n3dp31Us8tRrAPLcbuxj8/mxxvY5eEYtsVyPFCueMPjGmBSW3L5Pkr9ZD881y11vkR9i2epG3PL9S/44B1lt9Mwvp5YK21Xr9+fUao39/fbxfVrPVyQZrnC/+1bJxPYtd8jx25gzNlSCDS12j7X//1Xz8jI+mr6Rtl8uII3xNdvvPOOyeCMeUyz9JPvOgq+spx4Z6vU08IWvt47B8fCjFNG/CZlM8YHF/pJ583qcMsSojuuVM1/aY/eM6LzBlfkbO167Fje9I/Uqef0xwXuLCDO2fzW+43CZ7yJPkjf/TB3ebczb/W8wJS+mdskH7Tjz2WKRefzfislP4ej8ezBY8+yYf28P32Lfq+49jt7e367Gc/uwaDwWAwGAwGg8FgMBhcP66eEF7rPKHFXbJJBLUdKPyenQPc1cUkS+CEN5O/a50nQfn+XNfTdn8woc1dqU4qpz6+B5DEH+WjzIGTikwaOSmc8pZ9RzCYqHV/mWB2gou74GKDJOTyPXWlDhII7Kfl8PHeTNKZYKFc1Cd38yQhn/uTaI1tvLvYeko/bN9GmHGXDPtAIpgyu36SGtTdpd947Knta5KLOqR/kCC2XSgD35dossXkLYkh2o/2NsHfSC8mqj02WlLd9vOYZBKc1/w7+8ekfgMTzqzbY8uxITYgYWeCr8WGtxFBrRz9mfI0XRiMUayP4yDX/RvbohyWp8lnedxmi7fUFcdqm0toX5JP9F2Wp50D+rHbJNlJXa91Tkq6j2zDxHjzJ/uG54rMrda3ddfmhMRQlvOu8JQzsb7WeuHPfld92vUudvbV5Gdkos4v2dtkE+eVtJu/3glKOThm3Ufq17u1GaejA147Ho/r9evXJ3k/97nPbcchdU252vNAG9ucN2NLxp3I//j4ePa6Apalf6WPJvjZHvVLgjx1Up+p3/Nf3lNL+znG+Lkg8oYc5Q5d+lL0n37xmYK+cnd3tz73uc+dxVyT9AGfI/n8lx3F8d/UE0I48vJYZ+pvtzjB5CSfS/n84XnSczV3Atu+7FsWXfgZL6Ssxxn9MEgb9/f3Z2XaaQc8YpvvxE6b+Ru9pj4+W7nvJvaz6CC+QtvwtTGRjbvD7XP+fwwXfOQ+6iA6y+7oOTJ6MBgMBoPBYDAYDAaDDweunhBOwioJESbBkixzoj73rXW+o9hJVib5mOhLgiaJJe8QdoLR741tRBUTOk4cm3RgGdbFBF2Sj0xEcjdO7slxjJR7rfXimOy1zhOS7F9LJlMvLRlnMoeJYuuciVoTZSZlKB/tx99MVjIZ7d0XvN9EiRPs9CHrw0Qmdcc+koCgDekr7id1zv7Q73JEZANldoKVSUmSVOyLvzNhe0n2ZlteZ/1MnO4WeJBcYPJ2rf2uMevZhAD7cIlwi5yOG16wwM8mRzzWeZ1xim1ZBuoh5fy7ifnWvm1m+7TvtIlJNdrAbbN91ksZ3IZl3S1QyHcvRsk/EpOUxdfab9Rdiz2MZ7t4ZHK26aW1Qb06/rrNpju35fkq8dvEL+cU19naI0mV+0ngNnubrLUMjQxn/TvdWg/UHfvksca62gIT9iXET5PDccwxaDd/8VmDZaIXxhUv4kk/Ls1bTUexU+o3GefynJsZ9zwH8tnJ8c6Lh3wvF1tRR94xnbL2NR7FSz83qWndr3U+jzw9Pa133333TL9+rqLeuVCAz1Be7JIFcL7H/kK7393drXffffc0l3gH7FrvjcGHh4czW/HYYvu+9eHYSju0+YrHUPu5h+2lv3wei16sv/QjRGqLZ3zW3cnAHeF5j3J8JKf3UP/RWe7JTnvGSz7rxvc4Pvg86P8zRF/0CftHay/w4lDGxvy7v79fd3d3L95PPxgMBoPBYDAYDAaDweA6cfWEcJImPi45n5ko8w6NJEyYAM91J+LYHhPwJghCSOcekj4mQ0xaOQHspD8ThEzopQ7W33ZzsL/pC8FkIOV1cjC/tQQzj3a0bqxHy8l3ozl5R8KSyS4mjgMmeplEZZ98xKUJCNqHOnSC2MSRZWJynL7jfkS3vNc6JNrx0UzWcgcOZfGuI+uOfTSZy3ZM+NLO1ouJPr7Lj/UmmZr7KSf7nT7aV21T1m0ZG8m70wl1Q/9JnSRsaF/e46S622ykFX3JyXpes7/QLpf6YlKMsrV77Q+W3yTXJTk5vvOdMlAnJrca+dlsuNNj4PaaHlssoxxtbFqu3XXX2fTJWOH+eBzTB+mX1nsjvyynddPKmggk6F8mMVyWdbDutkCj9c0Ee+Y4E/K2P+U2iZtrvLfJ7LopG0ma1m8S7o4N7A8/U3bPjSmzG0f53GJJsze/M4Z6YYfvjcx+hvF4ybMSZbTM9PUQyp5zfI39Sx1+jsl9lMXPCtQZ/Yk+yfFmYtPX89uOXF/rvffw8vmEbdHPONZvb2/X69evXyxoyDybHbD2GcbfZivKx740/1jrmbB1GRKw9Js3b96su7u7Fwuj+JfPLNzFm/554SL1Sr/h80Hayo7pNg+0GMf/G9Av3R7/Nl3y/yv2e+rscDicno/TTx4vHf1w5zFtELlzpPoQwoPBYDAYDAaDwWAwGHw4cPWEMBMrSdz5HXBrvSTQmARjEoq7LJysW+s8KeukDsklHnXcEoJJUFEuJsWScCIJzERg5HNiMGW4c8C7F9K2k7aNeGoEAJOvJmF2uk75Rqo+Pj6e6Y76YjuNXGmEU3Z6kJgn0Rq9RA/ewW27mtiif7VdGTxCOte8s8n6pp6Y2GykaGRoxGNAHbakoxPALTnJpHrK+NhN3muS2Pc1csp15X6OEybG6R9Mvq61ahvNZ3x/7o2sJl5sL/7Wkukeny3BT39xDPKYYr0kfBrp636lTo5nEyZePJCy3OHPRL/JY8cIy9Rs0XTH8b/W+U5n2o19o45dv3XdxhqT5434MylpP2Vbl4iFILLu9ORj5u0bTcetPsYF38vywe6aZVirL6LY1UV7UabWXluMYrndv7XO503Pd455Af2DenPd9gnLzXpMBHLspH3WxecTEou747MdI1IX5xrGYo931knSdjeGvLig2Wrnd4wpTV+O8fzduo9s3l3s/tA+l54XWjnbju2v9fyMQlIxhDb14HmYbfi3h4eHSlrnO0m9tkAxZfm8wldrRL8hCe0feYZhbGSbfnZoz0P2B8dZPoe8++67L/r45s2b9e6777549klfbm5uzhZ7xg4kVekj6Vt2HtPXrX/qlWOUJw35FSAh2I/H52PDaV+3Y10fj8fTu5F9AoOfm2iz+BvJXeox8mUnOHW2i9ODwWAwGAwGg8FgMBgMrhNXTwjzfafetZfr2WVwc3N+RKjJk3xn4i/JFO5g5G4cJ35aIs0Jt7XWWZIodZmU4Q6oJK+cfEpdbtMJRMpHwjTYkUOB2zLp0UgV7+p1nUm6meAxaUEdkzBpZDav50hA727ibo611ilB9/Dw8GLnqe+7lGimHC3Zl+Ri+mCd+ehALhxYa1VdeREBk5tO9FM2+kj8wX1oCcXUSWLYBCF1Yjs5eR8/yfemizau2XcmfhkHqA++x9NHKsd/vbMnaDq07VsCtunPOvLxku4fE+vcGR00PzIRw4Q5dZO+pX4TBinX6vMY4hGY7GdLkNNmlK/FMevLpJV1xXYcm9qR6W3xgq9RX7QH76EOKcMuBnuMuZxjZiNs2K82D/Fe12Ndtt9amVyjvawH178jgHexg7GM/m07UEZe4zzZ/MW/tZjl+N/qaeO2lXVdvsft+LrrYFnW9bY2G0HOeGwbmPi3v7o/7pN3BFv+Vr7Z188EJlF3dVomzocs34jv3fMHn5lcl/W+8zsuSOIiBT4P+j7HEsZ0ykQd8DoXx6WtzIUBTxdp46f5FO8lLC+fLx1j/ZzAui3TWi8XpHh+cZzl7mK//5e+7zmXz/uOzU9P7x0bzmet/E3bfvcw491a6+wVLozhtJH90X2lP7BPIbXjY3nGGwwGg8FgMBgMBoPBYHD9uHpCmCTHWi8JSh/7yCRJkjfE7e3tiUhsibhcT51sM5+945TJu7Thd3+tdZ4sY9KQRzzzt8jHXSsm2/KZ5A3JbSa/eC19JhnG5FXTwy6hS2KWuvSOLRPfa63TTmsTV2s9v59yR3rkvvxNksyEd9sdRLmoY94XEozvF3Sik2QaiUsmM0lipo7s9nAinAQiySGTo/Q93kdfMtnjY7Ab0WjC4+bm5uwI6Pb7LknfSMG0z8UQJuhTppFE3BlkX3Din783uzC5utY6WyzgekyaNoLSpKl1zL7Ev+IfXgiQOtl3xhHrmeM/5Y/H42k3O3GJSKF+2G7K+z3L8WePT+rEifCU42/WW7NZrpNYYHvcOco+tD5aJu68s5zNdyKzSY5Whn8bbA+jkdO73fJtHOVvm+OaDLvxnHrs02zTxP8l8p2f29zb5Nj5WutTypoobGh63LVD+Xj/TvfRS2uvzUfuP2POrv3WN9un2Xfnn77HfrTrN8tfqtvPL+5ns8Hu3vzmEwcCL6hoOrNemtyUjXHI5R0TPGdahwSfwRzP/bzDObTNOZHFffKRyPb5toiG/Yg8fK7iX9Zxyb/XOj/NxXXlM49JDvnLZwc+m/BUF+ucJ7vYDpmHaRfGD+rU+g38vPj69euzZz3bkjHZY4jyeAFke8bLzurBYDAYDAaDwWAwGAwG14+rJ4TX6mRWridJRTKUf5lIzv38zCRXEj95HzGPX2aCyYRE2uHfRrSaPEniakd4r3WezGTyyMdmmjwkMUqCtxEjJDp3JJGThb6H5Bb17AQu+8q6W4KSxEK7zqRg2m07OZ18Yx/sX+wry9uveOwg7zMZnbJtFy3Jb+rDiHwkg9pOn9gt3w+Hw0l2JzuZCKV+UmfbEepd0dRvbEA/YXt+N3babMn6fPeYN4Fo379EDrWkttuj7WhPysHx5/pNuLAOJq4bmUydtaS7ZbBPp0wjULJD3mPYPrrWy3FtAq69o7qNsya3FwGYwKHfpQ6PiZaAZxxrcrG/O4Ki+bzbZJ2U4ebm/HQH6sv+yuu2X+uX0eLKJTtQFs9H1rHjtG3jOOMFJC2+8D6WS9tcJNJ0Qdntj9YHwfY8v3D8+X7rYedfLt9saj+yfJahkVjNhtF/89VL9/gv73k/aPfv4uzb+s1yTa87/7dtmjxvK7Or8/3qwfdZx/ar2Kn51a5PO/ns12udP9/Rv3nPzc3N6bm2ld2N0dQTQnMnN58d+Ly0i4WBfd7tcmy4/PF4PFt0yR3TKWs9sY/2Oz9n+BQeL7piLKIsmUua7Vqc8PNo6uY12i/PH4z/n6/vDgaDwWAwGAwGg8FgMPh/Fx8KQnit86Ohs0tgrf07Jrlr1YnyllTl/SFQcj93j5HwZKI5SSmTsUn6mFy2zEymsW1+TiIo5AKJ0ciXNiMjiUMTPbtdDylHgoSJOpJ9SZzlfXmNAKGes7ujJXFb0o3JeLZJwp4yU19PT89H6bEPfg8fdeL3yOW3HdlBEpvXWpJ4R7wzoUsf5Y6PRtI5kUx70f94vKCT2PlOIphtxX/ajlHainpg+/Y9J1cpDxcw8PhH+j7vMbG5I6W8AOJS8pRlTPpG79RH7jFB33aPeXxz3DKGUL6U93WShi2GuV0SfG7HpG8bj/QJJ7TZZ9uhJfpJFud3E6pc4NLGWdMJ7/VJCJGdMjXf4/ixThqpQT25z6zPevE8ZHs1OdNGI9abzakj+73t6znS/TCajVze482+7/nCcZPyuFyLAR7X7bvjs8cPZXKMsk94XvFYaWPGMu3mFcrvua35seebnQ6s17ddfxvRxOee94v3S159PnJ8vuXehkvzBO240/n7kaOV2cWonW83He2u7Y6rXuvl7nNeez++ws/tRArX77nQzyGX4jz7k/HmZ0aOacvAeMLnl/zW4r9jEq/7mW6t9wh0L7LiHMcYnv9X+KhsP8/xOaMtkHWcGAwGg8FgMBgMBoPBYHCduHpCuL1TkwQHk+QkSEkiOSGVxArrdSI4ZQi2zXJ5f5nJ3CR8nGRKQqft5Ih8lMtJspb4YWIqiaq3Jde80zOfSU65HJNt3Pno5CATXZd2JJvksa6ZHEv5Rqrlt0YmtMQ99RhdsVyOSc7v1J/JCcpHfbF8I4Z2ZE3ThRcQmKzw+5TTjm1j4sW6Sd1pkzLQ3k6KZ6ztCI/olPpkQpV+kGPE3Vf2hTEgPkG/ZDuNUGrJbF5v/sm2PdbpF9SZx8ta54leysZ7qBPGuNzj2EFdt7oCxkgveiAxTX/z/ekz44h1R99j/Gh6ii1pY9qc5RhH6beRpRHo1DH9imOQ5UxCejEDfZ+LIzynUG7HWraxI/MoI+9tx1q7DvfXhE2LuSYwLSv/7WKwfXtXP8uv1XeJ0qea/qxHg/32OObvrIfwXOIynjebb/CzT+pgXS3+e+7ejfNm40t98O87XdoPmk2bXDt7vK2fl2Rv9zh+W4b3i7fNv+9nfv7NwG9EpvdT905X78c3W32tLGOfy++OOPYzEU9haTLt/Mb+yjmj+T3LttMrds+ebbGiY86l3dgPDw/VnpzvPa/4COrfLB8cDAaDwWAwGAwGg8Fg8MHD1RPCJtzyPjH+liQLV/uTNFhrvUishJwy4RGihH9T5vb2+Thpvs+LCV4TDCaxnMRkwpgkC/86kd6S6D5m1PczaczkFd9vSz2lfpIi1inLMGFmItVEw+3te+9xbsce87v1GsLl5uZm3d/fn5J2vsdkPG1kwsjHztJP+G5Z2pbt+Dv7mTZNevMzdWbibLfjw/2j7XaJRZNb8RmTdtFn/pnAo57ymbtWvFtnl4D1mGB/aO9dX7zrudkhi0GcrKUNOB4buWTymDL6iGYfqZ0y9ivCum1kCsdy2iHp1oge2519TD/aQo9G6rTkeeog0UV5qTfaxe/Ttmz0t/budI/zBs4LJuV2eifsQ1xcZJ1bFvsx5xET+5x7bFvLS93Sn6hrlmGcbuOO19sCiWZv10MbtTLp526xBP96PHLhAWOhfdKkTYsl7GOwW7RDGfJbGyfWDWUiaGPPHzudWMeXyuRa/JPvV23ztBe60F7swyWbNlm8CKTpwDtOHdvb3NX62nTU7tv5ytvih+/Z2ftSW6znbWh9+ELv8++X6tn91mxz6f5L7byfehp2JLIRHXgucflLunV/27OBY4PnRPp2W2jZ2nNZ+yjfI72rk7LOO4QHg8FgMBgMBoPBYDD4cODqCeG1zndEMalK7JI2XNVPgqElk1lP/mW3IgkyHu8W4jDvD3MdjYQgyUlCkAQS5WeStpEETHanvryrNbsP0mYSxrw3usnvJD+8mzeJJxMqJN+c2GJdthWT/U7S55qTg2kjemfy++bm5sV7akMe7kiTlrD2jsXIxHfpteSv3z9He1M/Tt6RtGcfWXf+0gcix+Pj49n7k3kPZWi7zbmQwmQV7zO5RgKG/Yvd6Hc+/nC3k5Oy70gR+yP1QWIievS9TUeWk/K3IzDZ/lrPsaXt5ry56buA3Bblt+y0B+MXdx2mP7YRYxd1zSPwGyFHoin1cBy348UjY+Sz7zsuUK5GLnrRj2XLbzt/4aIQluH49nhyrG2ym/xiGcYGj3uOCeq7+XkjWlh36mI7vr/5EUnuS2TwjoBx3KSem+7dfuKf9c7fmy6DLD6xDZre7BPUiRcSsV3GROvXstgvHQdzD/2J/mHZ3JdGGtkPKEP+XtoVzXr4u+dj68HwWN35bJOh+QZlsl6ssxYTAhPUO5u47aafnbzsG3W+i0W8v811b4PjkOsxmo+9H3wh930h7XwxsGvz/cjiuS5oO3l39TZ/3ZWljnbPPLv5gDax3HwOGQwGg8FgMBgMBoPBYHD9uHpCmMn/kLMhNZPcNjGS5ElLiKZO7+JjIia7T53QTgKdR9o6cXgpee1EOsmI9IW7UtdaL4jZloAi6ZF70y+/D/np6Wl7dG9LiHpHkRPY7G+SsHyfMO/htRCr3hFIufyZyer0syXOQtI7sc/vJKtST35v90a3bfdhZCTBxCOnKX/KURdtJ+f7Ib3ylzund0l7+jnHh2Vz8p32a77Ydppx926T1/26vX3eeZ9r9NN8p+34l3rMfSzTSMlGCvCd0tbl7nNIVfop66EMhIl4xwXGgcjSSB4uIGF91A99if3id8e62IR+ZYKFbeQels13vyPbetjplyTujly0He2XbDf3+8j/5uuJ8azLvtFIUMufNtyWF1cwdrR5y+Sp7ydJ2MZ66mJf6adtoRHngEZUtB3e1BX7zfoiH+siseH5JP84J1o/tp9tYX9tOuQ48vH3lIMyexGD26V/73bsc/7hdcrrcUN5rDOP9V0dtIm/Uy+tXdZHQsptRM/0j0v9aDGKY4Y6udSvRr7vxpblcT/9285OfEay/hqht9Nr8yXPfW28WU7XxfHc7MDylLfJyX60/rwNfq40LrW/G2s7edo9bqtds+1c1rp9G9zOrq5LMvn7F6L7wWAwGAwGg8FgMBgMBv9v4+oJ4bXOSSbuQksS3cmjJMiS1M81J85IOrVdAUzCmUhlgsg7CBspyPIm+5KYzxFxTMIeDod1PB5P7yk2iewdKU5SedfK3d3dGbGXv5d2OHKn7N3d3ZmcTMI5ic62j8fjOhwOZ8QfyRvu4k1/LyVJrVcn4E2GkFizDdMmj7Jtu5lTv5Pv2THOfpi8olw8qtkJ64B+1RKTaYPytOQ7fcBHdNNPnFw0CeRFBNRXS55mrLZkv+tJG3wvuJOllI91UJf5nHcOmkygLZmQdhJ8t3s75du7kt+8efNiZ7p1bFA2xhvqhTpmQr8lvekTqYvjtsUi+gPvNxHd5Mm/3UIVoxFUjrPc4RiZG4HDsWKytY0typ57TKZ4oVAbK7ZrZG6kKYnn/KWMO914sRD16l3Vbc4wgeQ+UF8cP46dtKtjfcabyzM+tfhm0pdyeX5r81rqbfGf5durHLxb17qxbamvS+PZzxaWhTrxjlXPO/QX9pm7uimXF6QwrlG2gPMx/c0kIa/nvjYWPP+09ihHm3tYH393fPC8RgKWNuU4bAsp+LnNQ02+ZuNdnz0/eE7wHMi2Wn3tWYWxea217dfOt62X1nf/1mRuMrVnpzambb+dTpoeG9pvvuZ2LtnD46HFhp1s1sUXG24rMgwGg8FgMBgMBoPBYDC4flw9IdwSOkm0kOAKEcek81rrjFh0Msrv3U2dTGIlwXh3d3eWNPUu2MhmOY3D4XCWsGb5tc6JFv+etkM+kbg8HA6nazn2mTv8SAylXw8PD6e+MjnHhCb1S13kCNzck8Stk5f8vRHnlM1H6LKfTtwxyd+SwbY162Wim7v4uDOTpBjlTTvegXc8vkd4k2AJSALRvnmf6s5/TIiQyGH/SRY0v6Hudkd7u/2mR9YT/eQzfTR64pHCJuRZPvpk39h2G/+xo3XHv41oNEyIsaz9x2Mz10MEW97oweQzk/jpA4/QjSyMY5GNi1w83iizSd0dkeG+pl7bo5F43hHHBRHU/e49ypdIq8A+z2u0meuib+QeEm+sz/ZzPCE5Rr0xjjfSymSa7R/97Agj2ok6cFmPkZRjjLKeG4n/fgkGk8+M7YxVrI9l2li8RBy1/rk/9g/H4V2c8zjL7/TB1o7j4aW5nPJnQVWzdfyT4yvfaS+Xo449rqkzXqcOG4HoRTAtzqSenQ4ZG1nWstsPqS/H+zYX+DPrb/7TCH7f09qx31OP7ofHmp9hHNNcr69xzDc03ez60uRv+uIzx1p9Ed4lO7W49X7Go+Vyv03kt1jHuliP+8s6PDf62k6flGXXB/eZ/djFWbexs2WrezAYDAaDwWAwGAwGg8H14uoJ4bXOd2uFcAqx6V2PSWKZMM1xzLe3t2fv8+Q92em51svEbeBEcK61xI6TYm1XWHB7e7sOh8NJ5twbGZJUJFlKoiLgLri04QQdSe/8HjKcfWTy1gmxRhilDb8vNvYKScKE+83Ny92nJK/Tp/zGnV+2A+Vr5I1tlJ2klMPkcX7zMcDuA8kf95H2aWQY5SM5Tp1EtrbrNn7x5s2bdX9/fyZHPjsh3XYgOslvfVEnHFcsQ3KafeNYjB5ubm5OPk99mTjjWHV7jYiyD9gXeEQrx3fbocdrTsa2xHfqN1HAxSoZgyYt2Q/rnLqnD1C39jMmqpsvsj3Ly88k13ZxhzalLmlHymLCxH2zbXi/Y6ljccrRLtQlY9hOD82W3q1tEsR+T/+jf9AOjSyjfhlDm91MdHOeSLs5nt9zXsYTF+o0YsTx37tVTVawv6zX9VsHtqHnR+qh7UJssvKaf2v9pf4th32yxU+OyVyzv1NHrV1+5rxH32KbeVaxDhkzdkdb83mD72VucrR4vHumaXK28dy+e450u96Z3t49brvkO+XgYhLOU7RVGw/UoeeF1i+X4WIS9i/37cY6fct6Y5seB66H49Ox1s8hHj+egxkzPR4c9y2j46XHDHXX5nPahGPSffH8YBnWOn+OsY+s1Y/Hb6A/+RnK8qQeP8NQT/5sfe5+HwwGg8FgMBgMBoPBYHC9+FAQwjzWOQkWJgaTLGUiK0cj5/eA9yeZznfu8rdGCK91Th5yl3EjP1Keid1cy/WQINz9t9bLd+a6LiZC2Yck15iUclKbMppo3MlPEpaEAPviRLETczy6loloJvhaX29vz99pyr6Y8OVORZM8Tpa2ZP7bCIB8j/yHw+EFeeREpUmGlpgn6WHCg3I6SRnbMaHv+nZECdu4lKx3spy7aimvSc7Yg7KbULDfmJDluPDYb7uWmFxOHSYPUi67tGnPoCWgLTNtZz/xmGlkQhLCJq2bX5MQaTvybE9ez277u7u707HtHFuMi+kjyVn7CAkUt2Ubsk9+t3Yjt7x4wPbdjSHqmfa3Demb7gdJovhexrVJEvaPfUy/rFeSwby+8xPL3IgR6sGkVnTCeaLpzyczuE3KnPocP5us/LwjaPI7yXkTQ56/qFvanjI1splzaVtQ0BZ/eE70HJC23rbYy3MZ+8d6mp4cQxkTGA+MlPXiIoOLGXaLVFq7jlUpy9+aT7Fe28djyLHPOuC9PGUh/bWvt3mindLhxSPskxcmODZ5TLu/LV6wH/QLE6W+zzHf5DL/Rg+en9zf6ITX/SzFeND60GKV4yD75Ljdyvjetc4XQNJGRluUwX7tYlO+t9eh0C8og69d+mz/YX/Zp1xnnHaM243vwWAwGAwGg8FgMBgMBteFDwUhvNY6S3qamMhvfA8tEyYmKLzDxMndtdaLxNLufakheJlUbzs+2AaJaiZs2a53r7AvTgbz/bWpI+2Z1I4sr169OiOGQrozoWnSqCWiKRN/D5KoDZjw4/svTSwyQU3SPvoJkcdkduzg9yo6SU09W5+7BHbswSNio0ff0/xql2SnTiijk3/2IROCfi805Yj8tL/7Tnnsa7FL5Ii9vKvm5ub8KPQQ+OlPbJP6fCR38zEnS1kmMqSvAfvtJPMu4WtbOwFtG5qwb4QMiQba0jamPdgH1k80gr/95VHIOwKXbfE6YxDbchI6hCmP5me8StuOQy2GNOLCBIztRlt7QQ/lJFyf23VdzUc8Hjl+rGfamDHESX2TPbnmBR+cdygLCWcfhc54ygUMbqvp2HNhTlbwmGw2NglD3XJsUk6TRPmddnVZj3nf40Uy9AsTMY2w5+8eL47Frc6mZ8YB32d/bwtgUid37TOmUP+Wkf7GOTZt7RbDuQ/0MdvB9zOeGB4LltW69DhpfmT72ed3dvLvzT7sk3XhccGTSPh86v67r20evPQsQV/3Pe4rdevxbZuxDc+njtu7fvhe/8a4S9j2rX/53eQ52/Xc7d/bM1CbKy/pMdd8fDWfp9wXlmF8SzkT9dGRfcB6HAwGg8FgMBgMBoPBYHC9+FAQwkyu7HYp3tzcnL2vjmVJSK31/F5hJ/PyNwnGkB1OIJHgWKsnzp10Z7KGiScm9pM4NKGRMrv2mGDPfd7REDhB3ZLTr1+/PquDRzozqcVjb2mPtZ4TXN6p56Q+bcwkmROQTtiaLHBiLzshc90kPG0eHSfRRtIy5fhu4fx1QrQlGaMD+w0JNRMW9m3rJ7ZJ/0iMsw72MfeRJKT9bZu0wQQnfdCkcVuM4GTy8Xg8ycy2TRQ4id6SnfYL1utx2vydZVrilZ93ftpIEOrIPkzd3d6+t+OdCwxa8rslibmj2O04URx5YkvvRqbPUnbbpxHe7qtlYsxmv3mfSRvW5T41gtpjr5FHiWF5t7rJcZMIbyNt7EONnGj3tN2E1CN9Nnprel3rnDiJbXNvi8n0If9uvZFwo5w7ksljxgtFdkRxZPEOZerIsYfEJe1Iv2lzMOMjy6ZeLxozmW57tfvpc5GvkZVrnb/6gPretdXmOi+6sG7znf3zOPHucfpII/XyG2Wzrky4tzmS9qOsue4TSy6NPeuozcFsq5GfjoVcOMB2+HyxO2q91ZdnKC42cPu7hQqNJG3xqc0JxKV46nGUdvw8sFuw0drxs4I/757jqB+P8VbPTofWJ59H2jxBuVjO9bBM6uWzV9O3/y/Q5i2Wt+4u+RfL+ej4wWAwGAwGg8FgMBgMBteHqyeEG1ngBF3bVZrr3DUcQir1JHnuRBGTnCbCTNp5hxuTV6yDuxqcPHYCjok6E28t2cz7qDMnp9hWdgenrrRxd3e3DofDqayT+Ul+tfcQU2bapdktyX4nSJ0Ybz7gzy1Z50Q3k3bcKRZZrAvKQhvSrjvCJn1ba50WFLBOJg5DDLbkN/2L15OYPRwOZ98buebjhZ3QbTajXmgfJ8et89wfkjsICR2/aYsV0g4JcydSm29ERxwrrpf2o05bwpr+bnLDfsQxxnFBv42M1BNtxWO+HWNoc5Yx6ZVrjE0tvlHPtFnup69Qr2nfiXkTSyFy2tin71CPrJ+6MMHj9iiDvzPJzsUsJqOjIx4jzkUiTuA3OWwnJ/cZQ9r8lHqpexPwaSOENvXKuchzkBcyUU7rzwtFKJ9j1ttIoBZL11rbhSW26474p51MoJgssR3Svut03KYPOLazHPVnv/Lnds3yrnV+0gbb4VjfEUn0Geqo2Z6LQ+gjtpd14nnVzxm0I/tHH20LDZqOGoFrf2xj0PZsxKHLNtk911I2LsBzm/nr4/atM9vZ84mff3a68ZilDB5bXvhCX2C/mw15fefvbM91sn3Xwd8zzh3P2nNIG0O2g/VEX/F85rHVxpTnAcpnWRkH2X7Tv2MD9WId05d4T/xuMBgMBoPBYDAYDAaDwXXj6glhJ0ad4CFBwqSUSba2g2et9YKACln08PBwSoC6rdSVJDplcsKGu124E4o7RpiIcuKdyX2TO5cSi0x+OalNOdluyhwOh/XmzZvtO/mcUM/fEMm7ZBaJOPfH91E+t83+mlxJGdo/15gs829M6FFHTuSttc5IJveTSejUx93FTmjTL1jHq1ev1uvXr2uClLZiX51c5Njgrjr3zwlXkgQm/pl4dF95LXpp71Wm7+Qzy6YOEoy0Qd4zS3kdG3wsL8cRxyf16f44Ee8Y8fT0dKb7nY3Zxxa3slPYNjMhQLmZbKb8KWfyyH5vAiTtZgfm7ihnH4fJhDp3aVtuE+tNZurfi2nyu8d125VFmUjmMJ7HX008cUwwXuwICY4nE6H2H8vNa9QZZaVP0Mesv9aGr6WcPzP2cMx5LDd5PbZIdFguz0uxT7vedMj4zzptgyxmoI+6D6yb7bEtL7xgWccSEvq0gcca5z32zc8OlKkRcJSHixpaf12H+8eyfo1Fi9OOu81Grpe6bWSvx0ojgU0mt7m3jbn4gp+DKHOLiZaL+mWcZ4yyvj23tpjoMWK98Bky5ZpuqQf3p42ftNP63erczeOON17Qwzp4vxd+mFTd9cv6a0RzI3ote8pzvuQcT9/jvR4HbtttcXzb3+ifu3mlPRPYHxKPBoPBYDAYDAaDwWAwGFw/rp4QDslIgofEmHdbHo/Hs6OXWZbJnyCJmTdv3qzD4XCWqMk9TPSHlGB7qYdJquyYC7yz7vHx8UWZRtw6mcWkUtplX5mEenh4OEs4RQ4mV5lIsm4olwnMvB+WcnKHpOWjXk30pXz0ETLeO4p4XGjk9E4S+kj0Rdl9rDhlo16Z9Gf76W/KOHG31joRTS1hzjabbnK/5aKPeyzkOn2otbVLQFJm3xswqU6bNxtzIUH8sPltsxltlOvZGZlxlftJXLo/lCcEUSNymMimDig/d4l51xLbsB6a3b3AhH02gcyx4veEUgcmRJ0kJ5hcZp+4Ozcw6Zhr9DO3nTIs5zHgOEe/S308MtxjxQRE6zt9yvHOcZt9Zaz0wgMTF7YhfZj69fgzicpkf3y9EQ8mVJpOeZ/jZSPP6fu0893d3Ys+XoqdzU72FZLzjnlt7JogbTsc7Qf0D74LN/e20wkcE9lPx9cWt1OOdmc8yLUWLy2Hbe44YoLINmV5+2mLV5E593psJJ63uajF2hYbmx/TP3bxkXp3OyYT+Tt12RZs7OZOy+gY5T5xvNvfrBvqL3Hmkv7cT5exrPk98wXlZr8tk/Vm0Pfo35aN7XhhGhdCsi3bOtf8bGi78tQUxzzKTD1Rf5TZ85jroc13z1bUPX/3ogrbbSd/0J5rPS5aTBwMBoPBYDAYDAaDwWBw3bh6QpiJEJK6TPYxUeV3iSaR7V0Ej4+Pp52erj8JO7bVks6pZ63nXaM8hpHJ2tTx6tWrs0R95ExiiMfrOlnORByT2AHJBZO2JBFZF5NhlJ3J7CTookfrngi5RNKN/WcyMNdZlkcsexdOrkUn7FNLJKfu6IH3UvZG8qQvtLdtxbqoRydl2xGITDqbIGECkrBsTvQzyR35TH66vkZE0S7pD+thn+mfTBa3hD7rpuzxdxKUlM+Jzka2s48mAVsi1Tpv5IT15KQw+0zZfI/7nc+Wiz5lgs6EX/SV8Wa92UdTP4llEl+xQe7jooRLSXK34wQ5x3fGhWMI9df80DFr5wsmD5oNiEZImLjjYgDHPJOAlME2s+1YxrHEfWmEAvveCAXOFQHnO9rLhK3JYNbZyDPPV+1vm89czp99D+Vt4yfjxrbxvYyhJp0tG+3nsd363PpBfZmgpH+7n9Q97Z/Y1hZWMDZ4PrHctu2l9hgT0j/PTwEJwN3YSh2ei92+x0vTCz+nj4zLjlOUkydY5Fqr2/bhv+iolY289hXqts09LQbys+eR3ON4wPmQuuFv+cxnX9uPv/M5x+OFuqAvWjfuQ3um8LMzccl3qBfGBc+B9Iv2TML2Q3JzfmpzsvvffIi/7WT337fFl8g4R0YPBoPBYDAYDAaDwWBw/bh6QtiJXpMT3MWV39q7Ctfq5BgJFSaInLwkScNkXo5Xbgk6E4o+ipPJJ+70MzHG5BblzGf+3pLM+eydod6hxkSWie211oudJy3Z5d0hlplJyZD3JqNIiJgcbEm5yJg2eSxsbOuFAkwAMmnKpCF1SvBe24my0idICueaE6fWp9vhb7aF20+d1EVgffOfiSf6um19c/O8szXvpPa4i07jT/aH3JP+RE981zAT0CSc6U8elwEJPdfBccOFD5aRdvDRsLYVxzllaLrzTiuTO9FryjfCg7ZngvpwOJzFu+jSMcD9oJwu0wjZ1OmdrRy/1rV12nTT3tNJ21BHjYjl+LVPu036EH/zTvyc6pB6PCaoJ1+LXNSbCSP7CmMISVvGPtaXNj1+L41v+o/vpcwmfjiOmv2sb8Zplg041lmO5fme48Q2xwQfq+2+7fye/dgRNewP0fy96a75ved1XvMCojZWm30bWUy/8ru6U4/b87PE22KfiVjriHGadbM8/YykPm1kn7JtvMiC46XZL2ixhTbxZ8vpWG6dxz9s09x3d3d3mjtY/vb2ts7j9hWPbfZlp4+1np/rqF/rnM+HHJseOz5FJTK6XMr4xIy0zQWZJnMJ67X5nuMg40hkMgnucUm92QY7XVvfTS/0GRPJbb60Ltu8NRgMBoPBYDAYDAaDweC6cfWE8MPDw9nOppubmzNyj0lI76pjknaXNEviiYklJ62ZZPJuYyZKSYa6niSGGvGbMkl2pYyJbSZkA/fHCbT8dnd3dyJKoie2b8LOSc5cOxwOZ/YxCWiCqumDiVX2g7pa6zlxzV3DTLDFdjzSMtejaxNJrHt33C71zgSv/eFtyTrW28p4N090eX9/f6bT1OEdbdSJ9WtiwCQN7cv3C7uvlKEldDPuaM/4LuV0kpW7lnLdREb+ctc89RQikkdHMx54p1zkzFhIfTktgCQMSSYSJ03P1EcS+40sY792O3AD+mVbnBI/MHFBHTKmOeHuJHwjx9qYISi7ya+gvY+4kWKN2G0LRiwDZSXBzlMKMn/wxATXwX60cZlyJlToXybQ2BaJnkaq+a/1Q52b2OJ3jqtGSNo+XDTSCBATxk2mtZ53FbfFF9Sz5ysTH7Sp/5KUoo4tU1t4tYvJtAVjP9v2mGHf3J8mG+cL6oL+3uozqcvrnE8sa7MX/YB9dVx0PZxf6dO0f7OddbzW+UI9+7w/RzaTyOxDqyP1+9nKsSb3k8D0uEvfPc48f/O0E8vP+jwPct5tfkwfsf822C9sD8tofTJ+eE5vfuXY73byu8cU78982vqZ2ET7tAUsnB8bIetYTtvw/wy7seLns/dbvvl68yUvzGBf+CzDa37Xt58RBoPBYDAYDAaDwWAwGFwvrp4QZkLWSZ/s2goBYwIjYLIk7wrOZyel1nomZ0kyMWGWMtkVme9pm0QEE6UmLY7H53cJJzn16tWrU2I2hBfbc5KfxER+y7uDWY4yRCfs31rrRK5FdidEWYcJpbZLxjqjDZmMto2ZAKMPmLRIP0w0ewcLE66RJ2TTLrEeGYNdMs/9vbSYwL9Zpy1hHnJ49x7HliR3ktF6ZH9MHJjEYln22f5lcpf9Zfn4afobUt5kNOvLggAm4CmHiSKC4+L29vbMx60L+yxJxV3S23+tY5b1WGpkiGXjmKFtuaurkR/RLXV5d3d32slL25iMaIskPMZo19QdX6Tvtd3R/M7dWqnzEjFCHTse0J8dPzj28juJYsvluuxj0Zl3lTMmm6y3HuxT1jWv2VcJxle/a5r30T70qx3JwXjSyI326gOTMewn/ZE2o+7cN/oYy6Ze9iflTaSazPXcyVjjsdzG6G58ex5r8dXPMJ4nKFfqa3pLPDTxaP+nDagvysTFFozd7J/bajZyP5qeOMdbX2ud79Rk7OA44jMP9b+bVx0v0p7nHC9uu1Q3bWwfbXGKMts30l6u+RUAri/XvHDNC9Uoq+M2+8Z6qTfGrzwz+RmFevXpE26beuL9XMBin/cYpD81G7U4wfFgf7DuPae0mMy5wM9lO/unvE++4Lh2v3hvdGK7pY7MZYPBYDAYDAaDwWAwGAyuH1efBXBCKMlfkiJM2DPhSQIpCZ3D4XCWPGNSdK3zHSRM5JGcTRtM9FCelGnJyJQNIXFz87zjmUniEEj5a2LIyUMmZJkkIpnGe9c6T9aZnHGiMgQx5XfCznJZTy35mvaZTKQu05f7+/u11p6kZH+SPIuMPD53R7pwV4wXEJAUcgKVZGPb+WeilMnGkHPxSx4Z2YgV+6b9ywlG35vvTqhTZyapaE8TEvTVRpxytyJlob5o0/gB+2pik75lMiFjhddp64xjJqA9zr2br5E+/Oxxl8+8J32nL/i3tmPYix/Yzq5e+zhtwvi1S7ZTBh/Nnt+abhgTbH/6B+FxyH6u9fKEAC5g8c49/m1+aL2ZPLDOWC7Jdsf8+BN1yrmGcbftkqO/HI8vd6e2eJK6HM+tC/oBy7lt3sOdoPSnXQx3nLcdGOOb7VnWc0PQYpXbpXzsv32uxWi2HZndfxP7toP1QV2znyTQG1GWdjhmrCPP3/ZXgnagPjOm2Bf2nX7M8WHbuP3mX+ybxzf17/t4vdVJ2Wlr2obtuu34TfO/1Jkx6WdFP8+1+bkR8pafddGHCMb01k/r3YS7F1t4bqFsHH/s/1ovj5Xe6T/1ceetnzObbxMu3+Sn7XytLWrgHBm98Hf3v+1M9jxMPdB+lJ3PL5SxxV/X5+clxzj6zm4uHwwGg8FgMBgMBoPBYHB9uHpCOMklkwBMCK11npRxYj8JGO4EYyJlrXW2a9hElpNIlCm/t0S2E4gmdp0cctKQCblcS91MWDlx22Rfa53tiuW9TGTf39+f7QphW76fCSgmkFsiy0lsJyxJOKRu7kpy8o4kYXYnmuDkIgG2kZ2STPKzzYDJeyf+KROTi3yndH6j3rzrx0li9vfp6Wm9++67p+upq93PRH/+7ghPJzBZT+vn8Xg87U5v73ZlnU52R39MinqnC+shmMQlGdjaYfscBymfXfO7JLbljS4oI9sinGimnul/XlCQ39vxnPZFxiT7YK57UQvB3yILZaR9shOsEZXsXxvbXjRgYoY653eTK6zLiB4Tq03kxF9MtDTfTFxuBEDGGgkx+pdjtP2P8SM2aESS/Zdtemzt/DD98Fhm+46Fb/OPIHJQ9tTB2NjIMOu9ETD8jfLT37NYqZH37che2sL+canv7r/la/Nq0y917NjaiHPHZM6lfDWCF+Kwr7yPdmvxK99JrO/0b4KaffOYNnltfTcSzr7d4mTzm8yru8UWTafs19PTy9eMRCdt4YDjAP0mdXL+9n0sS31QZuq36YC+5Pm96dd+2uKg46/HDOO+j1iOHOy3bWZZ2B7l4W+2l+3RFl6kDZO/jrmX5kDHKo8bznmX+kL7NH1a9sjDdlvb9JnIPxgMBoPBYDAYDAaDweDDhasnhJmsYWKIybe1nne/vXr16sW7d1+/fv0iicxEMsGkKxP9QepO0tCJwJQnQenEDo+4TrIqyajD4XBKdq51fvyxk9wmjNY6T/rxeNh2DCGTh9GvE6v8ziQYk/BOYDNRS3KACTLWncRswP49PT29eD8l6w4RQkKESFsPDw/rzZs36/7+/gWp4SSpd484mUe/NGnlI2RdP/vJvjqBuUtMcpcZfcGLCW5uzneBkZhmmei1EQJOWjo5HVKd5Vrim/XHlrFX+mTfth5cP+UzKRFwfPj49l3SNf7r+tkv2pGJ7kZg2hfevHlz2m2f7+04cCfzD4fDmYztPeH0mfgWk9/up/vExLMT2t65Hv8yQUFCiu8kpc3YN5MulMekeuKYyZYWo0heOOHuOMFEvHVG33V7HMssEzlNEDoe0g7UM22Q+uwXfJe9CRgvaPLc0RZCtLhgHSfucu7xwiuTMc2OaaeNF88nzUdp58jXyJE2jlp7tKnnhkuxwguCPN+3WGpf2+nGZD4XZ/g722/xc0eG8dru/b6J8fyd/WlzBuGx6fty8kr6wnmeNo0sHhsm7ikPbW9/570N9uHYxP7NmMF2fFKA9c4xnbp5f9qivLZPyvN50s8fKecFHo4z7RQaj6f2HJSxZ9LTOqHvRj+etz3e2+ICf29xnzpqZDJ/D+hn1nebMzlHsv+MtZGHYzt+4Zju+MH5N7COWx2DwWAwGAwGg8FgMBgMrh9XTwiv9UzmJIHIhL6JBSdXHx4ezsgols13khhrnSe5uGuAZEzAhOda58fWkVh2Ej31OVGZ5Ct3se4STqzLCbgk/fibE7BMOq61zt4R5+Rj7NB01WSInpIAy85ZvieZxFsjD2Nrkk1JDLst2of68hGdsacJUO8Gjj1M6vCa2+c1J+edzGNCs5EQgXeImxhy0pX6TL+8u7j5SNoyeRS4Xybxmay1bZIMti7cHxMCjVQyCca2mUC1bBnLLNfeHbsjH6kzkuCWw21w3Kee2IQ6MHidSW36I+u33qxjJ8BTb3RLPZLUaEl7j7mW0KZOmdzm4pTU13ZTsZ4dOWMSg/rZLXChzJ5Dmu75HmmON/q0SRyT1rSBbWc90I4k4hxvGgGVexp50fyDtqcc7mMjItgHznHpExd7cMzQH2gf+wznq8wB9Cfb0zLlH9vld8d1yhr5/TtjAOW0PC02Maawfvo0dWF/s/4IP0/Q7u6nyX3Gcbdv/7Nfp00Sd7nf5GSutfv9LmrrkTJzTmpzvHXZYpLb8TXbmXOC62/PA5Q9esu11j5tkT74xIIWc9mW9dXii+PPLg7u2mn64fwcxJ47+ehffM7wa0Zs70vzQso1ct7EKk9SaL7WxlPTzaW4Sl2xLsZd18+xymc825C6YF2DwWAwGAwGg8FgMBgMPhy4ekL45ubmLLnkXQxBdt2RPFnrecfwWussIZvv/OykTEsyM8njXTXcpcMk39PT09mxxk6ocScbd+JdIjUoM5PGkTmyeZce/3pnB+Wzvqh/717xLoyQj8fj8Yy8ZSLQx+TyCG7vvOCubZdxeevX90WXORqbBAUTiyZ0uPOEpKkTx+4j+20Ci3Zk/S2Ry76wLdqLyUK3Y58jqXt3d/fi2G0niVtymO8Vpm6pPy8YoD+TgKZu2T5lzxiPb7WFIflMfZlQCSI7j9kOKdTsEDhx3BLTHgcmyd1v38s6mm58T+wRNBLTBA8JDSenSVjZZxyLSYo4ZnrxDHXg/rtvsU18JfUzvnoMuu+MBwT92kQP+2Z5mt58qkQjVQjGKvtW7MhxFN/n/GBi4v18j/2bLvzZtuG/xLH8o37aAhrrkHV6fqOOPF48dimrY0zu5fijPihfwHkgdXvM8RrvsR4575h0tfyNYKf/eix7rrKvOXbRx7Poy/GE8y/HqWNQI/Htq7yPdTXinP7cfKjpi/1ybG/jtMUX6pd9Zuw1PE68iMV6i9yXxgR9gP6+u7fZyEfFW97mV9lt7WeHtNF0Sv15gQb9hHNE0zvjEdtt8Ze/sS/8nLHA+dzjsvWv9cfj32X4G/3Yctn3GfPtg81WJMnbc0baajv7B4PBYDAYDAaDwWAwGFw3PhSEMJNEa60zIoBggunS7jHWyyQ5j9FLou1wOJwlZXMvk2UhYnwENUm7thsxbTARbcJhl6Rm8i2kr3fPENyFw11vTGS25GPbHcMEmXcB5d/d3d1pd3bu8263gMTMq1evzo7Htdxve1/g7mhgJp6ZyPWxsiZFrZedH/G6faP9Tj+gTdu7qZ14TPn89Tjg/Tmi2QQ8yT0m5pk8bgluJ0adjGRZH6mb35nM9AIP+0eTMzZp5GN8Zkew2+cix24Msv8kgmhjlqUtKHfGaerh+CPBY7syRlGP/I0JZPaL78Blv21PjonUme+Pj48vTlZoyWjGCOuI3x1L7Ttpz7GWMnM8pX+XbNziAb9bdx5PJD0I2zALAFr/TfKstc70agIlfxMPomvGfdfP93xbPvaT8Zt1UI87IiK/pX7WZ706bmcepE2pV+rfeqPu7Xf83dfdL8exdp/nFtqXNqCd49d813nq83MF/YC6JcnOcd2edYw2ptdaL+YTxlsu1jocDqd6PAd6IYj1Tn/iswl9NX8dN+l7bN9kt2ML9ejvjIt816z93YvHHMtZF2Nii12UgXrjYpEsuuLrTWIHH8m9O8nE7Xl+aLFuR0jzs/tHH3LMCXIPidimF35vfuyFbra/xy7jYXtNSMq6L46D7Bv70OKP5wb2/dIzQhu/8UvHHMfoNqfuxl17/c1gMBgMBoPBYDAYDAaD68TVE8LZwdiSnWs9Jwp5rCSTrEm+kCBmkqXtUjQBwcQed6o5+eOkG//lXic+mSh0QihJJ+9ecNKeySgS3I1gIoFs8ofytqQ3d4YxccakHHc1J3HHJGgj3qzz29vb9fr16xfJ3nzmMcisj/5AP/BuEZInvMZ+cBcVk+je3ULig/27uTl/z7LlZH+Z2KPsJuSdLHWCn/I5ieukftpqx1ky8ck24l/0R+rJ+nayOu028st9ctI6f60X6jcyefzaH5yANVGRelqSmG1y4UgDdWI7OdHsxHR+IxlhWU0G8/dWl/XK7yZSWM6kBHeX8Z/bbLYjHKOsk7XWWeLfdmS9jiWWmza55CORJ3pIrIy+2W/3NfdzrnGfGRO9O5I+R32s9fLd5JTTfXGM2X02WWLCi234txZn6Ru5n3bIXEz7W1f2X+v50mIUE1YpxwVQjsM7pD9t0QP1xjlqN1+1o8X9fvc2lvg7dci6GynPeYy68/1s17GAC4Ts9+wL++T51GUdfz1eHYNYF+Vo/cmrMPI5trOtTLazfsextuCDz4C7mEP9cgzlWpuPSdx7TrZPp47Yme+kd7/Yn92cQ9uZgEz7kZXPl5SROtzNq/YZ+hzlbLHZfeI8lfYjWzuC3P6Ta5Yz99Fe+c4xlja58789M2f8c06h39iH7H8c3yznRT+0xWAwGAwGg8FgMBgMBoPrxtUTwk9PT+vh4eEsGcNE6FrnSRvuSmJyOskeJoyczPPntd57BzF3mTjxlfaPx+fjKdda63A4nNo0KcLk3N3d3dkuEhJ4ThanrZbgYvI7svA6E1a5j/pxcpky812/TM6mznfeeecswc3yTMgHTOo5Sed+0BYmhSI/22skUEiY3Me62D/+zs9OsjLxTFIndrSuTealfRMkTMw6geukoUkQEo6U0UfMUk/tqEknaGMnJ7A5DpnYZeLT9XphQ+Tj2G7+GF2nv5TBiV2WCbGRRRC7BDN1bLKIuqPOvVCAumMfXKbZlvZvMYi7Q1tcY4wg+dQWIJCgN2lA20VOkjwmc+xTjs0mEVmW9eeeyNyIeN7bFjE0X6QunIzn+KSO7KP2NerNBIjLNXunXybe20kC1B99tZEA8Q2PG95jn/NiqNSTd73HFm8jjuw/7VhqE9rUG8fwzq8Sr2hfz9ueC/PZ78il7NSr22yx1uMn+mpx1P3lPW2csG3LtvNHzq2OoyzPMdZksW/Yfl6Y4rjCvua6SbSdnm1P1tNIW7bLeMBxyH7R3taV5yn3yW01O8QHeP9azzuwUz47gU3mcd6kP9kOHGds27HEeqZ+OTdzMQZjrm25q8/fvaiAevHcYV3TPmy/jW3+tW9xvDOeU5eOxcHt7e3peZz37HyXMudv9Ml+xAftr5zzKK/jMccS/cn+axkHg8FgMBgMBoPBYDAYXCeunhC+RCYmuZJEyTvvvHMqs9b5MXAkiwMmvbLjtCXWuFI/pMvt7e3ZLlPKmnt9VGQSOyR0TCIyAebkN5ObNzfnx7laXhMV7nPaS0LRRwoHTnaT4CZBkIQnk1epz8lTtkEig/+chGUyOkk798W7hCg/j4ZupEnqtQzczcfEWyMtGsFFe7BsQFvtjpDdJfzYjpPmLuudbiZEmTz1woD8a0e1Ulf0n0bQpI1G6GWxBnWa/kWv3mXuhR1cDOH3G9uvqT/3KZ996oBjhP3TY94kPRPE7pv7TTslsZ6FMU3fJgmd1DcRwnJrrdNiFvuE/cmkYOxAP/bYb4QB5WqEqetgvR5bl2RtJJIXZrhe27T1kXOL+9J0YGKAcxRlaot8qB8vBmi6tK6oc86b9J+018gUxlnHG/tR003rh33fMYJtuX6343hOH73kP42I8fgwOenYyvhAPdunaVvPd+y/d0w7BtNWbT6lzCYO+QxCuagnXmeMamOY5a1L2jJ99rHILk95vOCmxSbPV9QBbdnm3pRhvM71RrKvtT8pguXaMxuvu//08bZYgrIamUvd5m4esB48JzJOsW8kqRtR7HrsGwF1wEUvuYfPWY5lPBXG4zS6cJzwGKe+2bdcpx/61SSeu7hgJvdTJ9Zr6rAtrIO2WLXNnZxL3MfBYDAYDAaDwWAwGAwG142rJ4RbEtLJf6/GX+vl0aBOLjLhx0RQkHpMBBAmW5mIfHx8PB13zWN1neAmEeMdIo3kScIysqU+Eht5B69JBhMkl3aBMIGWPjhJRz0m+c+kF4m8x8fH9fT0tA6Hw9mOR9orILkWMob15d70J7s/uUPOSfIdWcI6mcTOfe0dddQnj65uCUn6DW1Pe7QkJxOGbLMRFm7DyXjqhAsAaCeTDznG3MRKIz2ir9iJixSoy7TvXTmU0Yn4ZtOmJ5N5fpen9dBsk3FLm9hHWS/7Tj/KDkvWQ3+ynSgLdZz7fLQwy7UEc/TeFmaQjOduMPaDR1zal+l3lndHYpiAC1gfy0dO95M6dwLeO+1p+/TBMZ8+aRLDRDH1YBKQccXEL+WgP7VYYT+1nvI7225jIvJ4R23ThY+1Z1kvhmljqC2ssa4pE/tjnbsf9i3vbGccNsnJPlDXlIlohIvnEJbzeKRc8dU2J3hBCNtox6J7zO/syGuWzeO3+Uwjqz3G2hhiHanHfWh+0+aTzDckem2PdnIIbW3dtRjMvlufabfFTj8/pD7b2P6R57GUb4sqHAPc7+a/jWDnPZQnaISvx4O/t/Ga+Pzw8HB6/rK/Zb5kbPE8yTnMsbiNm7bIif3iHNfmVfpE6sicZx3nWcV+ymOl8/zH5xrbzPPCbq7he7ypey+OYF+9UHEwGAwGg8FgMBgMBoPB9ePqCWEmbFoin7sCSUo68bbWc4KbiW4e7Zx7nRB0EizXnOhyIi7JItfjpDnLMInmZKYTSSQeUh+JUvbb7zozAUOZmBA0CcOEH8vtdv/QLrSVE+wtSWqyNjs2nVRj3/g5MvhoxEZWUKe0b0vSspx3KZFkZSKcCW0n/t0Wdc+6SY6a8KQ/2C5JVraEthP7O9LcSWS32xZcHI/P72B1e9EB39EaXXg82F4p6zHLe9vOr7clTJlwbr7c/MtJ6vTJZFBs13bTenz7b+438UXSxmOSMuz0QD9I+ejcJI7f5eskd0NbaOD+RiaOTY7/JOS9YKTZxgsYGGPTh0Y2UZ9pl3Vbfr8TNmV4vRFDa50TzYzDbRxGTrbFsUiZqUvGGJJkjP0k3FkP5eeCnOb7bNd6ZB+Mm5ubF0ezNn1zDJGgMeGU+6in3TwXnXA+CbzYiTpjrHEf6TckqR1PPAYoa2xCmORui1TYd9uG45PPLrTNbgxwvDR/ob97Lmcb1AX76jHW9GOZGNvpK5wrWHfzBc/hnuNZL9u2LdtcRzu2ceXFSXm+oW3tr/nHRTXtOS3wPOg5JnpMWfeb7eYafZ+6vrm5OT0/51nPcns+p4y2se3JXbjUActTP7axF+5Qf5QjfXOs9TMv6/dzFH0s+iVxnPr5fNj62E5ooC1YR+qxXw8Gg8FgMBgMBoPBYDC4blw9IdwSc0y6kSwwWcUjnZ3AJRF1d3d3Ii6dzDI546RsI6eI29vb065DJrD4uxNxLSHJI3XzXmP2i4k3H3nYEvhM1nkXJklTJsMDJjPbrh/2i0ltklpObJMEYNKL5XyUrJOT2YVsYsnJSLZh/dBnbJtm+/SRJJoT5EzYPTw8vCDZKCvbsr0eHh5OdfJobLb/9PT8vlzLbp+kbzFZyj7RB+lD7BPvyV8mOjOukjx+/fr1iyQ4fdekw46oSTkmg5nUjZ6iD++mMZFimRoZ7l1P9D/WQ93YXvZL+4htRwKHvmdClnbjri3C7TR/daxjH53cZ3ygTpygpqweF43gsq+xn7sFCrbnjkzxey09dtvYoc48Xh1fqOdGXrMO+rbf/8xj7psud/piOxyrIWE9fiyv+9DmQuuDbe8ICo81yuyFNa1vvM/jNyS4yZymK79OoM33qcNyNt/0IoQmq/vE5xePt4eHhxdttjmNtrDfe2GPx4sXdrQy1h11wmeAFi+9CMtEPuth/6xzj/m064Uxlt8LZXzvLi5S39SFfYJzAccS+5RrfpWGxyVtnbZMZlpW6ob3ulx7xmpzAO/ZjU+Xi138LOXyfg6nPJ7X2H/6r593TeC2mB2wDb7yJPW6zyagrQsvZuCiCerHclpHa62zmEzfpx/ah3fPKoPBYDAYDAaDwWAwGAw+HLh6QphJIiYgX716tR4eHtbr16/PiKe1Xu4kZDLG755NMotJxsPhsF2p72PuuIuGO5aS3PEugVxz0pD3pC3/Y5/4mUnXXDcZ4aRSZF9rnciqtB1yPGSxk5w3N+fk61rnRLh3XlBWk48k2Jw0vZQEJ6nJRFuIfiaEUw93zWVHZNOTE+TW2W5nFP0o73u9vb092yXbkoJsmzq8RP6xPJOiXpBAezB5m3KNNHGd/Gwyn76/1nsJztvb27PjD5nA5j3pA7/7r/USu7v/XAjg3zjmPb5ct33O+qc+uHOyjdvUSZ22nfqRK7qgDPnHd6U7zrXjLh0zOP4yrmMT64X3OBHvmJX+MS6akLFOeF/GZavfJz6wTO5N/PACBLdrUtenFlBW6oMkwdPT05nvXYpRgecDx3vbrL1Hm3axPQmSA44lrqvNNfGLyOUdq9YPifb3q0/b5tJn+7H77n+M295Rz5jtI+t5P+Vo80CzMftHf/Hvfu7Y2XhHbKVexgqOZ5Ok9Kf0m+9WT1/pH95Z7r55zqIv0Rdse+7KTtmmR76awn3huHcsof1oX+o9R/m7TyYj01b01eJo0BbA8Dkw5f08wjkx7bo/BOPXpd8Sn6w/tmW90M9MwLP/HCscJ9Et+9vGMglZLyxqzwkuw/fren7lXJjv3qnNRSKOLVyQwtM8bG/HgLZIic8o+c546/8HcDFEi/98xmb/mjyDwWAwGAwGg8FgMBgMrh9XTwiv9TIR+fT0dNplyASnd6ckMcPkGH8jeUGijMkyE2BJaGbXhwlhJ/xM5uV9vD6ucq2XiXnuHGBy7HA4nMlHAmatdSIjfTwtZQwhygQi3wvHpBV3X7VkmuumnVqi3MeYsn9pw8k/2srkc+pln2Mjvs+WfuSEqJN1uc4+kLjK706ScqFAI8dacv1wONQdQS0x6kSoyUuTCk4Qs59NvyQSSE6awGAyk0QK7WF5vaMnn0nWtGR4dG+CyglrJ4WZsG1ET3wk9xyPx7NFBo1E4nHzHucmBk1eeSyYTEn9vM8+yh1OjF30uZbANtgnxzbKlzYYS9g2SRr6h3VuoqztKrO8Jp8cW+l7jr30M47Fluinzzu2UeaUNbHH+9M3+6TbaYuH6EO+zzLQP2hL/h7ZWS/nS9uL/aX+dgRN/NGgr3AxhueHXCNMgKy1XpBALk/7t3nXYzFy8zpjXfPhfHYfTChRp16gYt25P22xBv3bNkgMtw4ZZ9w+47NJPPe3kWfsW56vfE/q57xIm9AfqO8WJ9t368T3uu0WR3e68uIhz//UFeWwzVjOu9d5X8D5kT7V/JiyRZ9tjvacxJ3xnE85TjlOaM/I4UUH7A+veyER9d1ivuNlntv8eyOxrS8/X3oeoyztucNjvC0YIDxXUFf+f0XsTpumDj6rBiaSeZ368hwxGAwGg8FgMBgMBoPB4Hpx9YRwSNS1Xh55Z6I3ZdbqRyQ6uZZyTBIliZPkkZOYjYjzO3qdHObuA+8eyT1OjpEYIIGdvuTYaCeDdwShCVcn2HIv22q7V0xO0yYmt/jZpBV367DeJLb4O/vB43rb7mzrPn100o+JQCYonThuiVX6IMs4Wej7Wt22PWGfYJskL1jeNs+RhJHlcDicEsBB7mFS2GQ++/nq1avTggjqMN9NljphTPmTCF3r/F3QrM9JaN7LOmwz69A+trNbZKGuTZZyfHJ80865xnooi8cSk7qs3wtIaBv6MZP87hd1atLRpBjtxPjZ+tf04thsgqSdmkBCzgn2liSnH9FPTFy0seWFCa2c+06dNCKcJAQXpbQxGbRy7R3NJmmoZ48PtvH09HT2ugLKkjHjscj+U6fsm+dWxzG/9zk645za5mf6H+dUjhv+a6Rkk4n9ShuegyODY5njHm0e2RzbGJfYRuq1jRuRlbqbrlLm5ubmFPcY02xHksn2H/aDcsRv2Bb94Xg8nl5/wEUG1k1kyHzOeh4fH88WwLSxwoVH9k36FW3Bfrm/HvMtRrIfbIv/TMz7+Sd6fNuc0GzaYpP9nvMu22hxlu2zDX73/BQwNl+aw3e65PemC7dHuzY52X6bJ+xjjqOpyzb1NZbzghaW352iQNuwHvsXfd3P3Ky/jWuPFT/DDAaDwWAwGAwGg8FgMLhOXD0hvNZ5UjNJUBIR3unWkvRMMrUdJAETjGk7dbjMzc3NKanJ9lneMjqB2Y4wdIKKOzuSqHUyjnW15GxLJHFXJI+/TTkmCEMksr4k4/3uNO7udSLSJIYJnfSTSexdYppHMdM2tDET3z4uPOV3R43n8y7hGrC9+KXJafocdWW/CrKD23YLmeEdbuyTE+j2S5O5tJcT1C0x6502vObEffRrUoN9I9HJZLGT4BzD7LPHQuryMaUtcZ1xwx3/qZ8kFhdk0O5c4MAxs9Y68wWSI4xPlNf+6eQx26WvsW76vce/xyD9h4tBPE6jX+ogsjEeOZ5xVxxtxp3X9ovE97TZiKv03QSDYya/09eOx+NZ7Ggxif7jcUidmRy6BMbcRvhENykbWSJP29Wasm3RiwmPtOeYSr1aX7w/+rM9KYPnpKYrxna2SXloXx/Rn3KZA3g8tOetNgcGXjTg+ELCmeOpkTuOtynn8dV82vKwr/5Lf9n5pGMkyV7bO35u0pj3+16PZS9caKdHuA7KYLj/1pXt7OeDplfHIS8KsR82+Dc/XzCmvM1uJgw5Xuz31JV9jrGJ84nb9zj2wh/OvZ4rqEf2o8nAspSH+qMvtHZ2crNvLW4wRjWf8CIl2iEnDnHsp1+JM00mnjjkZxCPGfev1dee2Zr/Z45c6+Vi2MFgMBgMBoPBYDAYDAbXjQ8FIUzSjkRUIy8bGeCjGFNnS1SHkGDSyokyJ/EMJnJI3LSkNslbJoGYZHPSzUk0J3yTjGNyvx3tSdkoN8nM1MEdPUkCe5eDk45MyFMmJ63b8dDpF21E26Xs4XA4kVLNR6gHE6NO2DGB3dCSmPm8e3cf+9ySq+2dm43gS12UnfWkvO3RkvhOBrNO79JlG5THxBAT2ZE3CXKTALlGYpl+1mzDf6yTRKTHC+MDZafd2uIM9rURB4RJ0Jbg9piwH9k/STbFJjt9ELQL4YUJuXaJbMl71HcxhzpyO5Q996Yuxhb2bUequt+Rg+PGMYy2NQkRHbj/0XtkJQG+I8yavtn3RgDmFQaUgX7g33a22vlDm7cIjwHXZz1mDLcFLdSJbc747nmOMrN9XqNfeFzSF01G0SYmI62nRlLnN/aXY4CfbcNcT9uUaefbLGtCqMXfFjvooynn8dRihf9F720cU++WkfdzgQx1nz5aTstlu9p+lIv+7/Fie7c5kXW4vlaO/fS4T/te0GF/YNxoc4njLH2ZBCDrSJ15RUbabfq1bVPWz0b0B8vuZyT6AJ8L2zMn2+QJCR6z9Jc2BpttOY8yFnr+Z/k8g/hkjciSOOH44GcRj0nHqPv7+7N6qT8/U1Gvu7mtjcHBYDAYDAaDwWAwGAwGHw5cPSFMQm+tcxKV10kuJRGTZBYTOlnp7+SLEyxMmHnXp3drOIHk+yNv2m5Ei5On+W5CKnWQRPV7GnekWsAknJNYkckJVBK2JqutC5LA0adt1o7ppq1JpNrWSTi/efNmHQ6HFySMk51OXrJflM12YPKXxAcTmLmfiW4fvUz54yPUB312lwi3Xo2W+HWy1LZigtTEpnXkhDzHVepyktvJXt7n77YF7efkK+2cRDjbbIlTkwlekLDWOVnR/CUxZa11dsx1I6zy2e9H3uko7TcSxbJ7vLpfaau1R5tSxx77XqDRxiPHREtw2358P/Mu/ua4Wh/B3+Ipiafo2kd98x76HeN4k4P9ig4bAWoZI1PaaLI3kip/OTZpT9a91jPZwjHsecexhf5EPTnWe6wTjmlsm9cci6Mj2sRkE9swgWOZ7O+e37zopZGulCP38TQOz1n0jZSPfTk+ds8rTbZGxHkxF+VtMcqvVqCuqce03/zM9ts94zQ70cc5jq2zFsdoR8vsmMv5kaeypGzii+e8Fuu8MMmwb3t+8hyWa/Yt2pBxnnOnTytg+5YlYJt+VqEd0p772ebb9syROqkvkpS0GWXjPEyS3M+cjjmOl4y9nvctI/2WOnKssI1iA+rZ46UR6fb7Nu5vbm7OdhdTrt0rMgLHPNuGcra5bDAYDAaDwWAwGAwGg8F14uoJ4SSc+HetlzsNnYByAiVgIskJyNvb2/Xw8HBWhsmblvh00szv0wtZ5Z2gTNTuCCUnl7lriok/J5aYJG1Juehvl5DLLjYnQrkzxbstIt9a68XOUCbqogcmtk3U0Fbe7Z22nQRmErIl9huR710pueZkp2XMXxLTtp2TxCSILQNJJPpHS5AmQU6ZbUOTPK6DbbTjnJus9NW2aCL3mfCgH8Qe0YePnW59oe+Y7N3d936u5V6TkyY02CZ3z6Xspd27TJQ/PT2dEU9pg4shbDsfdc0+29ds45Sxjk0k0t4cz/RHg/o30UZShGQFx2PeXWvfc1yjPCaTmj84WZ5y3InmGEl9OC6TDDBZ0MgA/6NN6VuOJSRnTVTb5oxz9i8TqIQJg904YVvUJedMjkn2nz7h3+g7PjLc+vC8ZGK29dOEP32bixvyzzGqzXetHeqFY8RzwC7eMO7aFvQ318NXOrBcYod1aBK6zRHNFxwXOO86DhmZjxv5a0Iv+uA7rqlrzkGsh+UYv237Xdxn/DYZ2mIMSUWP43zmWKS/tfdtX9IfY0obi4yNjlWU1eM3fY2vtPdD8zOfrawL6p5tOA61vjp2tLabTna28fMZ7bJ7RrUtWqxnOfaljQHPYY6BHmd5DqBd+LfFCuuR71d3/YPBYDAYDAaDwWAwGAyuH1dPCCcxu9Z6kdgnnChyQqwl51Ivk5IkHEleJYnbki5+X66JCiZySYRRNrbrBFMSQI1IaOSB9cUkk5NR6VdL2KYMk3gtUZvy3LXDRHVLZNJOTDqnnBOctrePmW42d1mTZk6gpq5mZybqnUh0gpbkX/MX+qp3wLMNJwPjIyTUSGqxXEh5vhuXOqBOG4nbbOHdOk7AOmFOf6QfZgy0cRPCkGNo5xcmEnLN9twlcZnkpT+kjJO7JHF8D3XR5OJ4IUlroiG/cZELde2+RVbKZVt6vNpujgcej66LejM5RZ058e7x6b4/PDy8sF/K2bYex5Qn/fLOtEY+MFZyp3n0yuPxKb8JVsZSxy7LYplIXESP9HHeR72RJGz64neSMYzJjrHN19huQB14LmAszPt3uWPUY4fzB3/nfOO+mbhh/zh3Ux7XwT6ajOUcxThC2zW7e+x7QZN9Ptc9rxL0/2aDS/1Z63zBAfXH+zm2WFfTIftH2bxYxuO1jQXHT48J/k07zVdtD9rsErFv/7Z/UkcZlzvy2T6W+cw+nN8Ph8OL5zO27XjM2NP64fnOfc91LiBoJz9QRsZ7LyZq+uP36Iu6ow1a7PBiES8uaUco02foe/bj9sqY1GliOM8hRBu71Bn7aT9hPzxO1np+lYD148WtnGftr4PBYDAYDAaDwWAwGAw+HLh6QthJ3CRbdrscDofDi+SfyYLUw8SKd2aRPGMC0wkrkxuNKI0M/GvZmdxpSWEmx3YJ3NTr/jpZ2MjT4/H5HXRMJrZk8lr96MrUw2Q0ifjo1UnoXULLiU0SP7bbbqFAdO4EHa/7nnznDj/2g8nRtfpOIyefmeiljVgHyYe0zzq944Vyeacj6yCxQdsHkYd9ZBtM5JNsIegjTLR63HoceKcc2/P4dNK69YXkMm1NHUQvIaUb+UtSzn5O+zph7c+WL3DyP+14jMYH2+IPkjrWS46pZLlmc19rtggxmt+9U5r6YLtOYDeS2P5A2VjO8bXJ6Vjs620xBHXfSBv7kWPQbszQj6kf6sILNBqRwKOLvUDJsZO+kHpyggJlMkmU/tM+bWxRZ9ahiRDriPe3xSOuk/VS/57XbKdmu7TJdkyMW1baka+i8G+E7Z9rHNMeH56bHVd3ZGZ7DvCcnrJcSEd/93zj+6g7LlSxDhIjHGM8F7qffrWCfY/64/zmuLfWeuFjjJu2Pf/ZBp5LSBB6jHIupMz2bdbvZw4vlmrPDM0v3F7+cQGYx2Gbs+gDjLGsM/psp5i0xUeOSblO/XMhm8u2OMA4mGvN930//+6eEbnYwP8HaDGwxb9mL8bE+FB7zqDf5/42FiyD9TsYDAaDwWAwGAwGg8Hgw4GrJ4TXek4y8fjlJFRM7Kz1vJOgrdJPAsy7kZj0ZUKMdZCQZRItJGradgIp7T08PKy11otEkROIQSOAcn+I7yQ8+U5TJt2Y/KYeKJvbNfnixCY/k+hIP6P79C/JSe6GNXHe9MpEcNtV4fcUsh+sn6QU+0h9+V2vTDI6YZ1db+kjSVcSeS2xzb7xOn3HeuZR4bYnk5LRR97B2vrBneq3t7dnu3GpX/aJZGDaMjHmvjkhatLAu3n4l+QUk62sqyXzPV4IE3d+9yx14DFsf6ePOUEe+dmPxKuW2PU9tHEDxwX1wxhFP9wl+o/H8/epcwxTj9GN3+PpeNdISxMPjexoiXwn4dkO+0Q72GfXWqfj/73owwl9xzT21YS/fZ7yrbVO48mJf5blbyZi44+t7xzzTYa2WMm29/HClCXf/doD24o+w7G5W8DSdNxiYIt9rI/lqL/0hwt4TLI49nPBR2urjR3bmm140YPjmm1pmIC3/I1wzOe2UKi1z7Fh3V+yE8vRD0wot365ftqxvUbD5ViPSTQStinv57oWR5sfu/9uO9+9gMmvFkj5tOG4b13TJk3Wpl/32TrkqQacgzzuOAY8jwQmh72wwDt2PR9mMVHrb/NnLziwLH5mtt5sA88nkYnzbK7xfj7zeBxQPs7V0U+emeyv7q/Hcer3ePb9u+cUyjYYDAaDwWAwGAwGg8HgenH1hLCTbfl8d3e3bm9vz95Zl38hR00CMnHbdo6YbDKRQBlIVJr8YCLIycH0yfU5mWSZ207b7P5iHU6Iph227aOWSWZQXyGMqPcgO1G408PvzOR9x+PxZCvqgEm13JujY52EbLuE0j/by0ljtkWEwH58fDzJ7wRj6vfv3hliu1oXTJK6b5SfuuGOopbots+Z8DVx2Opqu1CYbI6fsM0szjDpQ32YsA9INlGX9BfaP33i0eq0DXXLPkWGlGUbTJabXIg8rW8kEjg+nBzmCQaxQXt/tkka993Jcy/4YB1e1BJY/yQW8t2LDByP7Ff00/Y+cCfC6Z+UKTrxmDZJ439+N7L9jLY1KWA9WF4TLiZt270cLy3mZCxGB81vaX/qt52qQB06FuSetmDGvmM/oW5Tju9p98IKxpPWL59cENmoR/qrF11FRtqHNg5Yv2MI7cD2GlnM8djmKMYNx4YsBmiLMWxjwnMMxwj14nHNOk3k8fdLxxZTNpNOjImMCX62sA53dnT7bT7zHMrfrAvblc8z1I31737vFoCYDG3jjXbJ79F3/IH3+NnCBKvtbruwfIt7KWM/ph13/k2/cP+pO9uHet8dkc627u7u6ms5WD/9g9f4rEkdtWd326YtUDHZSh14nvN45JjwGKGtPa/lGuOzYz7t1nzMtrFNBoPBYDAYDAaDwWAwGFwvrp4QZvKaSbPsCA45m0QKiT2TDklYMbmSxE92Ve4S9Gudk5tMrDPBzTI7AqUl6J0UdKLeyW9+5844Jiu5U5cykMjKX+4wTj3tHa9tNxKTuSQUKD/tdylRnPtJZJogj5zUJ/XIpBkJJyeKTUiaVGBinok/6stkHm1I33B/Q5Ycj8dKLLakO2U2uZHP2YXOnYpOhFpWJys5Pnz0ZCNOSa7wvvwWcoqEaMo2cubS8dy0veW3X1pf7AMJSCet0z4XPThhbvLEPscyfMdrI4tsZ36nj7r9Ni5ZZq119l7c+KyTyo1QpJ0iq4/Otyzsm/2oxVXvym9xIfqLvLxOX8hn2pd9cYxxm9ZtykR/jazYxTPWZSKiyeXjdj03cXcf4zJt4fnFca7FaRINbJu+wGPiLRt1md8cm9imCSqTnJmzeNIBiUyT8pSTcYTlU1fiImP509N7J214PrW8+U77ORZartzjsU6/4dywO+3C48G7wFl2R0DxOmM8xwFjJH3U5e2/8ZH4MX2AtqMvRlbHALZJH/ac2mKESVDOqem7FxRYj9a/iWjPS7vxvhuHboN10iesD9rBu6p3OiNMnFJn1okJXerJerkUt2kb3ht/9G/GjvjmMwXb99zQ5kP2q80JnMcSi1in53zHDdooMZNttOcV9s+vYvC8TxmtZ9txMBgMBoPBYDAYDAaDwfXi6glhJvh2STMTB04yMXHJ8ibzjsfjGTGasinjnVNM+uwSY05QO9nvnRvtXXh812R04gT2pR1P+Z19CUjo8bqTt0F775sTnLSbySr31zs5QugzaUg9Oqkd2UzcOBnoflue3NN2rjiRZ+KeCXEng03SPz31naWN+LN+TQqZTLq5ebk73n4e+e7u7tarV6/OdrKmb04Is+/e7WqixHpOH1POuw29W9rXncR2P9imE9FNf+kDZXPil+SF38Ec/bpuXrPNnVD2O3kDJ5czLnmkNckPlosN3G5LqLOt+El25dtuJpnaIgfrz8nplown0Zlx7wUZtJnJTP7mZD19mPp37LGMqdPkmIkt2stkm8cayYe2sKX5bdpOnTzamzturQOTKOyLST/+NfnjHaUkcTwv0Batf40Usn9FBu76Yx9dlvNksJtz41fsY3TbCOkW+zx/2M/YZ/oh2/G86TjOZ4G2UKPpqM1nnpvacxJ9thHhnm9Yps2rHBveuc9/9MG1Xr6mYxfDUxftxTr9zJW+XZI5zwsZX7TVThfRL9v1XOIYs9MtYxbjUfM1xx7GyZ3PWh+0I+cPP5tckjc2o048/1kmxiDPv47Dth2v+1nZtm8xjPV48UaLR9Z5ZOWYaTbc1cP5Lv3ic06bw1mfxznHL22ZMu35cTAYDAaDwWAwGAwGg8H14eoJYZIoJJNIDvNoviRgDofDKYGeBHcSkCGcnLBpCSkmfykT77m/v39BLEXOvG82yWnuBMp1EiMtwejEWsgFJmyT2GQ/mHBNv3jkHmVlgtKJNCYP+VvqC4EbcpE7akgahQxNPdztcTgcXujb5KSTokSS69av+0jdrvVeIi16yy7x1NcIpiD2ZPskMlPGJEzkZHKfpEt82olxJqyd2LRdbE/qkH7iPllP9DvbOr858c4kLfXD8ukPfYGyemEHF1KwLtrTJGz8j8Ty7m9LzNr+tEnaoV54D0lc+wN9j6Qf+5J45p1x9BWWd4KYvzM2Nr35ukkF+lzqp40Yn6NzvzPSPpX72mKa5stpl8fpcvFAIzfcr0Zs0095cgT7xQS+CQDqrBEw7jOT9o3o4aID9sU7pE1E7vRLkEyxnNY1Pwcsd3d3d4qV3A2/i7le6NDGIWXnmM3xsu6v5WOsbWQdZbKvNSKMfm+yhYQ6+81YRp1Z9vgyfd1xqJFKnEsih/vGmEsfZhscwy0mcI56W8ygjIw97IMJec8F1pV9hr838j5txOacR/Nb/vI3y8+5jXbzLmYTk5zH+WxjO7AfHm+c31sstt7bGODvjKvvlyhsu89TD2O1XznCZ1HPHwGfGRI36AOp2312XLFPRW4umtz1t80BfsZMfYwfkdn9i70cR2hb3tdsy+caj9f8blLaJ0pQxsFgMBgMBoPBYDAYDAbXjw8FIZy/3kXCBNrj4+NpJxWTnY28crLRSZoQDWyPZbzzxoQWkz8mZXcJKyeDk2gKCW6ShYSBieKHh4cTUX5Jn0HeHdwI7UaSMOmasknyMVnFhG90Shux75H3y77sy07JvdQTotnJTSZSKV/aM0FBW+d377Bl0pAJOF6nvVjPWuc7pL17iXpm8q8li6331OcdqvxMm0WGRho4Gc82WIcT4yY4SGjke+zl/qReE0hB291vIn5HHlAHHu8twezxz9+YgOa9TJa3XeTRdyPymHhm8trj2KRJIwU4JlOfYxP1Qf3u9LbbaWXfaXpzfObuUv7OPka/x+PxNCZ83eQAfdmxyQl19oF99hhmvLO9W4xqZA7vI9Fh/2ZMjM55rS0ioG/wPhKVbMPzU+5lXwna3fIyNpkc8qID/84+My7aNryXbZoANuGTxV4tLvE+/uY26Gu0PxfLkGDy+GKcsa5bH9k3E6FtnmpjiH1OGX9uu/UdSyKzjwf2+KS9UyfnLpNkjO1tEQB19DbSzvOrbcj5xPpszyy2le0S+PUflp2xnLJYPrYdPToG5zsXRjV9NV2xXccJj10uiGynYVAfXtSQOr1AwmPP85ht53GeNryjnHX4fn+2T7lu6pHPaa3v/L575vD4jm68oCnwGPLzCe93ucBxgGOX/U17g8FgMBgMBoPBYDAYDK4fHxpCuJEeTOxwVX+ShEw2hVh1soWEK5PD3FViksTJnF2S1skb7yxh/S1py347ucTk0eFwONURMtgJQSYmKTNJjHxnEopyencOSeH0L/c7aUpZSGaRlDC5wrpz9GfbWcKjjyMX27QPsX/xFSddvXuECT0SNkwmm8A0UUKS2onQ+G7AJJ9JAiYUW0I615kAdqKfdo5eQ+RGHy7jJDX7ecmPLyVgc41jhP6VZDQTvHy3b75TF+n7jriK/pnEZjI3Mjw9vfeOUfs4kfuo38DvnGwkPG0UH8mpBpTJY466Z708/nQXUyhDi2NMQK+1zo5ztl1t07aggvZ20pz6Xut8dyj7zd3pHOetX7RDS+QnnnrecKLfxI774bhvktIkH2XzYiPGUtuO46ot8PBChLYYxfVH194V6Z3SXgDDz7Yv+5n72hGzHquOaazT+mtxgz4Sufz+a/uE53XHL7drf/DiAsdL+oJfo+B42HQR+9i2jvW0KxfBNb2ZjGr9ix4Ti1o99FmOlUZcUu/pi+Nu65djF9t3v6lz6q2dVLBbIMVy9I3d8xjjeuRpC058Sspafccx+02/SL84/1lfiWMcq7wv4LOA6/HiEC6C8++GnwdMilLXtlXst3vlB2NZyntxi5/HrJuMTV/nmKC+aQfqyYQ4+9FiWXTBE2FSNu3x1REeo01//pw2/Ew5GAwGg8FgMBgMBoPB4Hpx9YSwyUMm4NZ6SYjwe5JaTuw4AcPdZ0wctSRxS/LnOgkeJh+ZfHKC10famhRloovvRTPx4EQvE6ZOLLIfx+PxRLCxHO+lLGutky3akbwmDp1Mpsw5qjXXcrw2++sdxe4v7UgyxKQKSS/bwMQj9Ru04ycDymEfsT0tk5OLTvzFp5x8d9IwemQbJGNoj5YE9m6v29vz3cgtMW6/bMnY/HXinX6TupxUbv20f5lETxkmWk3i0vbc1WZCJvVTt7k/48bEQe4n+cE+kWyn3U0kefw2G6y1XpDjJBvdZ+qj9Zf6dpxsiyZcZq11Ok7YeqeeKIcJGvbPi2BYjjGnJewdnz1Go5MdIWBf5hhrccJEUur3SRXtPsddv4uX/eScdIm4ioz0p+ZHjTxm2+kHbZd+UU+8ttM37cf+85UDLMP+myBx3Pb8ENuyD/Rtxxf7jutb6+X701mvYzlt67+ejzz+bGPbpj0fXBpHzQ4e055Lec06oY09x9k27rfb2vlke+5gOcbZID7o12G0/qeP9lk/F9ima/XFWqyDfWtzq306C26oU5Z3vdQvr9FOjr1pt8U8lqNfs24+Y+X39MPxkHpkuzufow1Sj8lNjjPKZ9/a9duLJO13tmGbRzjWdu21Zxb3xz5GPVHGFossJ5+d/JwzGAwGg8FgMBgMBoPB4DrxoSCEmaQ0SdEIDO9uYBL34eHhdC33hMRg8pftJyHT3o/pRDATONm1ETIhCUsTW629/M5EkvseOUh8r7XOdgwTu2TT09PTiXilDNltuEtKuS9OqDKhnMR/vuf+4/G47u/vz5KV6XfqZxKQSTPWweOYTe6mzV1CNnahfkiCmLwk2cgd5vlMu7BNJ/9oB7Zn+al/96slhZmod+KUpGRsTxI1csdnmXSkP9lXYgvulKLtSSQ1f2r+an2yjSwoaIldx4z87nGT+ngP/ST3W8c8EttlAu7YMgGWGOSY0fTWku22Jfvm5Lh92PYjudD0FT3sCKn4fu4lqdcIfNqgkUG89+npvR3ajoEsTzLBR7HTLjxhIL+nXyY302cv4KAN0p5JI5PmqYvjkz7jOYP3sD3OYW7P97LfJIA8xrh4xjKlbcrOMZfvjBmOQdZXs1MrsyOpXI/vi59kYVHqYj/SPkm96Mn1te987qB+vVCHccS+wTrjZ47T1INJJo7p9KGRSWzL8cR+155FHFMsG+N5W8Dj5yk/e7R45BjEuuxbtIUXLdC27J/nUfaRPsP+sX0ShbuxR/1wrt3Nvxnb9g3HBdufOmEcjA6bLumn3L1MOazjNtfbxy1jG/ctBnmRReRyW4w7LR7QHpTNi0WaT5Mwdp8pl2NFPpskdhnanfKZxKVNCOqHdmD/KN9gMBgMBoPBYDAYDAaD68bVE8JJnHB3HokiIyQmkYSPk+xMsuRo2IeHh7MEJ5NITMQwYcjkDu9ne7tdBW0nBr9bF0nC87vrcILL9fA6j2G1TE4gU3esd5f0ddtMXibJRd3STkl4pwyTl6lrl8AkkcN3lFpG2rDtLDKZz4Qx/clJ6NTbjtqlfrhgwAlW7qjxLsP87qMTGwnhekmIehcMd4qnLHcBpV2SKUxu+5hW+59t551wjZyw7Vri/NLuISe2vYOaY4VykOBoR6iSjGn69f2RnbqxD3qs2Vd5vDnHjIkX65G+4FhhXTkGtQUH+c7ktX+jDpjgN4ETZKy0nV+OL43Uol+SQOYR84w9a/X36rIdkvrWbYuBiTdNTsdE2zn6coykjdIOyQC2zfh1SfYWj0zAOObySFeTpy2mc24iCcY++TQNx6/oJH2MPb24gTbLP84jjWBJG2wz7Vhu+yJJdp5y4bHDa16Iwv7xeHvq1X03Oe/Y6HK81napOub6OcE2s/7avEQduU/N30m4Mp41nzB28jZizPJ7LmUcjd7TP8vvccRnLuuSZagv94kxmt/z2THP/sR5gvqwvnlfYi7bZF89D9AX8tevenCf2nznvnmcUe8ev54fPOcT1ln6Qp2yHNvjcyGfRz0eSL57LKZvJqqb3/p5yGX5rOBnBz6PDAaDwWAwGAwGg8FgMLh+XD0hbBLGSaUkRUwmMrEe7HbSkHhkfW6DSahcs6xMjDnhmb8twb/bacOEc+rk704uklxcqyfWb2/fOw7Yu7qY9PPuHyaxIk92OlKugJ8pp99j13ZmUde2FZOckZfEqhOVrLu9U5fykbggEUYS3gRV25VCvbOfJE3sE5SL7fg9hEzoMzHpYxepq52MJD9T3olf6om+n+8en7SFyUfKZz3xuse4d3+nnEkvymM5+dmJZo5HkuIteZs62m5N65b25zWSMRn7XPBiv6dPtmR6PrtfzSdNGtBPLYMXQLhNx0rriOTFjhjgdRIBa723uIeLbuwzHovsR8az+9RICxLRsQ9ldixtCXnrw0d5s12PKcrR+mnbkcCiPFx4QN2zXo+36MZt5bdGrDbSzQt2olP6Wptvou82r9P3SbSzX9SBCSD3jyQN9c/+edGGdcc+5neTaiToTSpSP3yOYDscX9GPfYPxj30l4ZfYaeIraAtQ6APUW+s/7UEfTd1PT08nu+0WlrjPu4UBvtdzPAldPm+0MUR7O2amHb8igrJQNs9FLQ7S3mudn2Bj3Xk+a3G9EZ0uR11YdscNXmebXuzQyFf7lMdM7n18fDzN44mNfqba+WFbvGAd8bnXY7rFNuvSY5jPg3z+uzQWqKP27GD9tQVMud7i++6e6LLpbzAYDAaDwWAwGAwGg8H14eoJ4YAJGJKWTBaFQON7Z01+tF1DbTcL7yG5FQIy100OrvUeqfTw8PAiac5EnRPWTFAdj8/HNTdShySziU8nQ51E5b8mi5NcJrjTPnfNsr7oJYngkHjpk0kx2iX1keijLG0XhBPL1HXasW69KKCRB7RXS8azHeuHyXAS4SQKaLPca5LXxCHJivwefTFBnvZoa+rBhEbqzFHj9icTC+y3xxftZkLaZDN/iw+QtDfZ6eR2IzRYL5PwTBTz+qVdOfktvmzd2xd44sAuQW9/TB1ZoOGEL20VHdHu9kX2y6SAF05ckt39pf4cV1wnxyzHTAhBEiIZJyYUad/c74Q3Y1hbkEJi1kfiM4a5Ly12ePEPQUKo+a51SZ9o+tqRDNF/a9/YzU30H9/b6vHiHPsBCZW0y7pI1lCGzCOXiC3enzYS19KWx4nHC2UyQeM4kDKcA7w4KPU1GS0DjxRvvsv+0lZeAOL5iOX499WrVy/e+24d+/lmR8I5plqv9AM+RwQ+QYH2bycztIUdlJtxOuONMtFWuzFCf2AMYxkTte4Tfzcx2+abXf3vp1yLv81+HCMePzs9uO7Yx78ztnI+yb3WSRvvTe6Azz2eF4mMdS6yoI3so7yPz0btedd9TmzazYn0zcDPDW1OsS0tN33Xp9IQjC/0vcFgMBgMBoPBYDAYDAYfDlw9IezkS0tOm1zkzlYnfd+8eXM6Ks8gacNra/V3jaYtElmRiYSuk6YtkcQElXdsteNDmTRm4o3v80z9+Y0kIftImdd6fncryYPoksQmyU4nFXmdu8WcWItd8t0E0y7RF9loF5YxCXCpLpaLviNzfmuJ7fzmHV65djgcTn1hgpGy0pdtWx6pzeQf+5FdN7QTCarmzzvdOPHO+3wcJvXVxiSPN859XEzBfjqpHRmcPL+9vT17fy99lPGBtmuLC/KddqZtvcgh5UnamsjymHYZ67iBcSJyul+XyCkn+N2+k8tOilNHOyLKR+Tz90YANBKhlU/faV/2z74afXHceUEGbUBZ6bv0MeqM8Ydkc+aOxPdLR31TnyEk2m5nE7eOiyb5qQsSkbYpy9DHCcbdS3Nis+OlfrQ5NO1wZ6v77TmCNqb9aCeSwl4sxbHvcZGY6rmQctCP+DuPrbYNUo6f7Weeb6hPE0m5r71iILpjm26bdqKuaSv6ehtr/M5xvfOFNr9yt7nljI9m4Qbn9tgqn5uevTDB5W1X6ydl/doIfm7xntf4vOdFF9aNF4CxPsrkOZFyc75oY9fxe/eMFLgOxzOPkyB95ckE1hV9NuXaohLPP3lmYD2eUxl7ODY5l+c5ifK3Z2D2zTq276Xv8Vsff07dR7+uxzK5TcrGsowDXGg5GAwGg8FgMBgMBoPB4Ppx9YQwyZ21zskWJnnbjhEnEk20kWhNGRK5ad/EApP8TuCFCDTBxGQlk2NOVjlxSNlMmuQ3Hzds/XiXV+TkvazX/eeOLsrlpJ8JTCbm0hYTokxM0sZ8D7Nt1+wS+0cHTD6n/vzm9z2mbNsNYhKJtuGOk91OjYeHhxeJaPsL7RX43axMVFM26oN99DHj3OFK/XksUR4mbrlzlclK+sDbErvRY+rgbm/6hQkhJ7ztc/TxgDr3exIpR2wXEsLjjTLYntzBQ/moO+uUR2rbF5qPtHFLfVDv0SvHWhu7jRRh8jm2Yd0tSR0/DTie2aYJU7ZP4ps6d3xI2VZP2mvEOGWhjewPaYP9oD+zPZ8OYdLFBIUT/s23qFeTr5Yz4zH6bfVw3JjkoD4dQ+Of9FmSjSRiGH8oE/Vn3aQM361OOUyi0MaU28RII2p2BEnKcid3i8devON3pXJBBL+bsLIdWzzc7ZRu8dDxwvck9pg4JllH23pea+PTem62oQ+3mOWYv6uL/fOR2NRTe18vxx51107WYGyLbZvv2lYB9cTXDLC/nJvsS3kOtc6Im5vn51EvxrBMadMLGPjswLlq52epJ8+Cfobi6xvcdhA7+bmD8iYWMIa6HOcBLsCIPb2w088C9KWHh4fTfbvFMfZF+hHh+aOdBMA56dWrV6dFlp4DKTttyrHX+hg9tNg3GAwGg8FgMBgMBoPB4LrxoSCE13qZcHQyhcksEwgpc3Pz/P6ytZ7fKcuk9FrnBJUTwG4ndZN4YgLPxGvKp2/sC5PiTFQ66WnCgv28lCDPPdxVyraZlGqJw/xlMtMJRe8wcjtOOLZEa/424j/Jt0bE8jhRJzmZFG9kBXVE8tWEUrs/11M2/YuMvo+JfPoZ9R7Y70NWmJhtidBdkph6Z7K8+eLhcHjRT/qh/znJa0T+lngnEdP63mzmJOslwoN6IFlKWZ0UbrvvmLC275p0ZP30A9uB9b5+/brqgYtZ2Ib1z/HZSFfrz7vpSFQ0f/d4oP2sTxMZ7L8Jx4yZRr6lLZ7E8PDwUOOydWw/yDWTMSRtaE/fG9lIUtDWLO+xxTFJnZKUoq+ZBDNB7zYZOxrhR98h2UL7myjOvfmNOsg1x+FGulMu+4NjHmX0uCXR4pjpcec5qB2pzHrsq/YnxiS21Y4Kd1x3fYzb9C/7EPtA2amD169fr7XW2dH+vsd68jXPubat/YfPTu63/671TISyHPu81jobU3z2y/3ttBT6PeOFx57jpYl4zhOeT9viihbLGUNaefaXerW9W3v0fY5R+7HHFmONfY22zOf2bEFf87OPkWt81qZurecmcz5HDo55xoOmO9qDNudcSB3aL9zv3ENf5yK56N9yR5a8Pobxy3314qq3PR+7HbY/GAwGg8FgMBgMBoPB4Lpx9YRwiNYkE5n84S44JnKYfHn16tV6/fr1CxIiyRju7mDCx4motc7JERMOTIAz0bhWP4IuspAA2ZEILXma+rP7wLIw2ZZ+kgAgwcLdHwGJu7RJvTLBSiI9/TCxQhIpZZzgdxspzySwE7yUl235s2WxDpkgz18m+o2W+KWN7+7u1sPDw1mbTADzPicgqSeSDzuyvyXH6e/WVe5h+7nXu52YKOY1J4OZpDfR4cQuk6m5l0dMU7feRWXSm2CSmP7FPlPWfDbJxsUOrovtOnZYPvqqZTDRzHHG9936vpSlX+4WENBWtGnqYzleNxHTiBL7acZK6zPRSDcSIDn+cue/zW4pZzLV/SIxkLnBdeZvi9kcox5TvEaixmVZH2ONicdGRJu0cgzlb7bLjiSzX1EfHsep1wRTOzmC91L37mfKcO5gPWzLMZRlIksj+dm/XOeiA/tHi4vUFedQthWwTvtH5ljLubMJ7WKb0La5n35AfedezyH83OYc9oP65LPWLl4032rPU9Rb5MuCGPvgWuc7Mndjnu2kL3xWsm44Bh3rrVPrzwucHItIwtNHPQemTOzqGMM43nTMZ7zme/ZtxgQvvGjzu/XgfrDPbNfPx3zmZb/Ydu7PHNvi4W6csByfH1iGiD/5xCDKbLmyOMGg/WlT+oBtYp9hnHVZ96M9Kw4Gg8FgMBgMBoPBYDC4blw9IcxkhxPKO/KHSTOSpY2kzPHOuc9kBZNCJG5JyiSJw3v5fkInEXNP+sIkYMCdm97ZE0ItSSkeb5m2nLByQon9uLu7OzuGmok+7shwAtyJtsjGxCpJOtrASfa0QXg3JNtqyUEnspkU5i4wlrFcu8Rj7vXOTfphjromkcF28p45Ex30N5MfJGOcPDSpwIStk6Umq9x2Pvvo7PTZO07jr97Z4nEa3ZrkYdu5zp3rlNs7waNrtuukaSMvAhPAJmSoD5MS1tmufcvAdm1PEzr2m9TFhP1a62ys+f2ctDl13GwSAtrvSbeNTHQ6eb5LvNvO0RWP3bZ9TVx50QkXcbT4yn6SlGj2o55NeDrWMM6wHu8WZn+N9h5mkluMdT421+Sp/cf+y3nRvzOWsD4TbZTPpJFjUHTY/Nx2av5CGVr9Ib3awgui+UPrv+UwMeg4aV+g/l2XZWvzoeX0YjLGf+uQ99pP2jzn5xHbY3cf/Zm6ZJ9Z3j5lnVB26ts+R0TPPB2DsbnF3+iShK3j7KUYHTldps0z9nHOCYxnqZ/1OQbSHv7cxjN16phs3Vi/jrPsY2K073cf2/zpa23+aYtD2D8uOtiNR8vP2LWLw7zOeNsWeFCXjH8+rpl+Tjnb8/BuzvRc0GKw67cvDwaDwWAwGAwGg8FgMLh+XD0hnKQUkx7eTeTkf67lvV38x2Ryft+9Q84JRSaE0l7uCxr5ketODhJphzuPmBTivW6TspBIZsIpOuGRq0xSXSI+SPLtiCfKQDsx+eW2c08jWKg/JrvZFpOEtCtlavZosqdse89hS8RR709P7x2tvEsitp0nttslwrv50lqdPHAb3kFGNN+kbryrh7uFScyYYG26aiSb9W/C0zt0OP5IhLptHyvZ7J36mMi17iznbgcR7UTihaD8tmPqasc+suyOqGUS3eOzkRnRtZPq3pnMNrwLiUlu2o47fE3GcgEN5XW8Imni/qbt+KBtz35y7DXSwmRG+mEd0Q9tO5Mz9E3WxXiastFVykVWx03OAVwMYr+j3UzA8DPrauOesjimthi71vNiKeup2ccLUyyrSVn2yzZMfW3MeZ5t8zFtaVu3ehhjuNjM/sAx4Pbtj9YNwYUG7ZnBMu1ibNrxu809BnY6yneXa/1s5LW/u1y+N52zHcdQ9tvPMX4PNNHiHHXFMvRfPou5vhZzW7x2W7Zr2nQ7HH/NhtGN5ynfzxizs297/lhrvxvYCw0oC30kY9vxlgTrzl6eQ9uiEPsB9dximee1Zifew/HoZ7f2vNjGjGNS6vCucM4//L+K5/vmj4PBYDAYDAaDwWAwGAyuFx8KQpjvqmtJFybpnDB3wpMJdl5ryXLflx2gJhoiR0DijIkwJnTYTsCE1+Pj44vdMCnT7ud9az3voHOyjElv/mNyjP1vybm1Xu70Tbsm1Q3uXHbS1MRv2/mwI2da4jSJz0Y0tfdGmly0fqN7J+lZtpEwOSa0JQOZoE+92UmcMtmREr37KG+WYbKyXWuLF6xb+oqTvtEDCSATqtZLS7K7jchiAtu78F1/8w23ySS0j5Bk35xw5lghWZp33do2TNJ6DDR57aeOcayTOvNCD/Y95RI/uAiD+ndSOQs2GklD2akn9jH3swx91AstOPaa7+SvySX7MnVMYjA6op+297yy7lxjPGKcbbZkX+xL9i/W7cUO9pdLi3TYx53uml6pU5MZ1rHHtOMr5WsLTvLZ8YdxlnrwPNr06bmrxV3HV+uY8nEe8CIz65P3uF7at/1uv/XCqTYvUD/0Z9qNzxe7vrbY23zPcwPr5TUTcu3kCMrihSdczNEWN1CmJnt77kpZHzPNMk1P9L2mf7bPkzACx+48czGWu863+Wqbm2xL6pNzjRcUuS7W3/RHPTcdZN63rZsPOxbQbvEdytF04JjytjFOGdMmn2tt+6aj1jbL8jnQ8Zd/OYcQnHPz3fNL6mjxwfPKrh+DwWAwGAwGg8FgMBgMrhdXTwgn8UIilUlEJkLariKSaykTwsTEAD+bFDQBcXd3d5bkT5m0zeNvnehpSTEmhZiMYyLNyap8964FJiJNClOvbNMEYvTuvnNHQvqQ43ud9GRbls8J9diEdbicE5T8zHac7Iwe6CPcSR25co+JuZY0bYlvy5I6qQ8mbylXZEr9rCP64PHgjaiJ/ZqNnGyOnfmOPspuOag71t3syDGShLmTqIR3ieZzEuusuyWvdzsEaRfq3UlU2rMtHHCSmv1o/tN2d5kIsC+RrKBftmS0iRkf201yi/amDtNXj83I0nYbWo/8jbokadz8KKTCzi+sa7YTRAcm8GlH24fEvXfRtbmk+TdtZh8yueV7bNPUsSNZUn/zG/aV+tsRSjt5qQvqnDFjR6BzAY2PzLY+3X5bvME5kW3tCB3qwnHJxEmL3dZjfDLfveiF/uf3Jts3KZftyrieXeLe6ccYSDuyXyRmeY/9tsUboi12MPHe+ta+W8fuTz6bTHbf/NlzNX3CsSifvejBduDCGvonddbmHseaJpcX9rgvvtc6bWVyjc+uLdawP0Gbdxm7d/O4F+1Er22cph3aI88Arr89E3kMZW7j3Oh4yIWInFNSL+fLS/EiZewXtgfLeBFJi4H0K8dojw/OZfndz6I+AcR2HgwGg8FgMBgMBoPBYHD9uHpCmCQlScsc2Xg8Hs+O6/V7c9d6TqyQzHh6Oj/m1ztcG1lCmUgwpA23ywQSk2btHZLZXRI5nPxm3UyeOXnFRGvre5JqKcvEnhNqrJ8JMSflTR5xpyETe0lmZscsdcTEVsh2kzqxHROCTqhGh0m2OxFvHViXxI5gZLLchCF3bpHQMJnA/vB9qCYkncj3cd/Ujwk9Eg+pIztH2Q6TpqwnsjtRad+jn6/1ni8/PDy8WJzQSJHIynroa/EVJl1dn/vDpC31yHHAflCH+UxZMy68uIL1OklOXzTB4Ho9ZliP/Z2yWg73xTvG7JNMqOc++kDkouze4b8jFUxWtyS8CRnbzP3lfSTrvMvKdbBfze78zrEXH7f8rMOxxIl6zif2Feua8BzkOcSExI4U41+TMG6D/eZ44zXrznrhIiLqyH1oO+RoY/djFxPtH4zPrV8s7/jluTQ6c3+94IGE7s3NzYv5i2M69XixlZ8z0o7t2MaMwf621y3kvlz3700+oj0T2dfo9ybXGH+a37d+uH9+pqE8bc7nvZbF8YtzCGX0ogDel+sha9szFHVLWXbzkGU2CdviBsv5muf7pifG/ZThc+6lZ4DoyHOVY4Lj+1ovFyx5sVDGWNshzrjaTsZhfGi2ZBuMNXx2t2+xL9FV2masT9+azq0Hzl1si98tS7PBYDAYDAaDwWAwGAwGg+vG1RPCAUlUJoAa+eGkzVrr7AjVJG1b0pnvRmVdLJOEr9+JyQSxk5mWjTs5mXxzsjrJMe/cbckkJp5JyDAJS505eZd7k3SLLiIrjz5uSUzuciJBQV2SPCZxTTLcCWq+zzKJQ++UMNnB+5j0TtmA7e8IHybe7IMmJYL0JbajHzgRHn21pCOTibQlZXK/85mkzu3t7TocDi/I3oeHh7O67+7uXhy9ySRx0xt9kWMg8IKB3B+ylCRO7uX4Zh9aQjoyete16+VYyXfLHbvR103m7MiaXcLXBIB9xclo65inDTREV4lL9C8nxk3AUZb2vmmOG5MKjpFcHOGFMG18tmQ4xxTHveO09UnSpfWtjesWl2g7EguXSF/qj8fGHo/PC2BMhHhsNQKuEWZNHo+d6M364LjetcHfM55MWgYk+wP7KG3kMUE/I3zdi0A8/1C+3Tiy7M0XKWdiDttJfxnPPObdjvve5iC242cBL5DxXB4f8nHtsR9P79jJstbLOM4x9DaiycR67ostdrupvRiB8wxt5nvdl0bkc97dzbltwQVtTdKPcwDnl+g+3xn/6B/WN22w26FPHeU3x4c2nlu/vIjHerUe27NQ2o6PmniOLD7phMeDp272lc9SPmLZCxQ9n/jIctvSz0v2Ky9M8Dzj+SAyRVb3yeQ4YyQXf7Ge/L4bR77GfljOwWAwGAwGg8FgMBgMBtePqyeEvZOKyQ+SpElGJfF1d3d3Oi7axB2PLOURsn6/aHYhr/Vy10nqaklEJm5NajBBZ2KFR+SaJGJCz8RCrrekcOQMkihtxHASUkzWO8HupDH7mbYaqcGEVohAlue7JluCd0f+sg3qkMnLyJ2/bs8JY+48Nzma9vmdcqc+JtgbcUyd0EdNRkQX3mXCPkUm2tEJzrTJMZEFEl5YEewSpuwfiWHql9fYbyd/01cufuB91P3bSAzf1/yH8rkftpuT1S1pzPrcR4NjP2VNWrSdXCF72fdGzLrvjo30Ze/AYpzj/d6RZbitXb8ps+OS7ct2/ZsXC9COLaHOsUeZ7U+8b7d4JLBfU2e2BevgnBU5TGA4yU+CyTpuMbARIRzHlLnJyPFAu3NceBza31s7HmO2RbMP7Rn/jxy790FTT45V7jf1zzmJ+nS84bjL57YQhfVTxy1GtZhG++90ahv4lAGTmow1rCNzkElI6tC6cR/aCQcm89i/NuY9ZnnN84rnJOrFxCb13+I45037K+vzvNXmA9rIbe3Glu+znzLusb+tPdfX6uLf1k6uO67F121f/uZ4yvZ3dqXO+fxhG631vGCCffOYcDxi/dQfn3dbnGQ7qbctpPG8ZT+l/PzsMUh5rUf70yU7DgaDwWAwGAwGg8FgMLhuXD0hHCTx4aNbk0hxUopJGZMFTDwdDodTvUy+B16Vn3uZcCSJ0BJgab8lQlMHk0pMPDr5xaQck1I+dpj1OtnF5JR3gjHpRX3yvlznOzltjyTHnAD17hnKbBumjpTN35Tle5xJmtBfrHMnEGkHtsuy9iXqiffST6z/6MBkNn2SeuTOkrYzmAlD+pd/a8lTtm3ioyWRd/5qPbTErJPptD2TyU7S0l9Iopkosw4C+xv7ycQt9W4/dGxx8tpxYmfXXZKf1xuBsdYz0fLw8FB9IX3kIggTNu5j9MydSrQFbWbbmjhlHx0X6fPUHYkDE51e5MP4ZiKkxakdWULdtrFgv0n90QPJdI9vtuFdpSYEHHvoL61vRMp7PKQ87eM4djw+Hxfv+tgH71b0+PV4ZB9ZZ2vfpJaJE7aT6yQrOR/YX+mDaTv3cmzzvlxjDKNOPMafnp4XZnExS8pxDtgR8LQhx4XnV9rWul3r5RjyuDSZ6fupQ57sQf3Qfo7TO9vvFitEFurW46/NW22hQWuPNuXvroP3cY4KPIdQb9FlTkvhswt9q43FthAgdcaPWpxtenQ//Z7pZi/GWPtN6vB88n7q9Ly4u9/jw3NY8838Zb/drsvyWGnGj/S3Pdc4DrNd2t4yclzxuSU29QIM18d7WR9fy2A98P8GjFnux2AwGAwGg8FgMBgMBoPrxYeCEGayI0e5ZkfP8Xg8HYu41vMxbSQ71lovEkRMgPs9mS2BRyKpJatubp6PWDbpRwIqBDQTZjymmqSPE05MXKfe/M5E+lp9Jw71x7qjq/b+YuqVstAGTIJRJiYcG3nmJFfu8xGrvtcJc5J7tH2St26nJVZJ/LgvOzKfhInt3XYB0Q5M5jEJTBLS8A4h1muf9TGdIVV2x6+aHGJSO/1pCVW3RTkuJbZJsLF/bN/jjL+RPGJi2GQD+0H56VdMhHPc+f29JqrpR9S1E9HWrYnY+C1jSEsEU6eMZyQ3aAfqe0eMmOyg/NRRG6eMR24/n3m8KN9XbJ9o/pd+8f3qJPhIcDYfYP9ZhvZ3XPCrB9h3HhVMn3ViPmXZNm2W79G7ZXLbvN/kB+ul/UIqcNGEZWTd7KdJLcvfxgJ3DprA4RzjuNbeZ+5FDbH1zqfp14zVfj+2Yx1PBLEPezGACX36pmMB44Bt6dgV3XpBV/TJhS6eZzzePbeknt04JvFrnXt+sby0n4lwlvHYYFx2TOH91rPheMF+7p6LfBqD5WC9BHXbxqPHpcu3RQd+DrHvUaZGXnORhGMD+0Ebt+OX2UeW4ZxJopJzLp+l2/PyLrZF/mZX65vXOH9blkvzuuMEdevnhPYbddMWPKQ/qcfjtT1TRT7K7rnEY5I+43mOdhoMBoPBYDAYDAaDwWBw3bh6Qpg7xpj4OhwOLxJax+Nx3d/fn6452eKj/nw8HQkW3sdETa5xZ0fuTZsmX5gAenh4qMf/+mhWJhFNxBBOtFEXTD4ZIV1DpnPHU+owaeHdFk5UMvFGmzE56sS1E3VMgDXym/0meebdK61dt8O+MkHpZHNkbglV7wh0kq8lMS0vy/Ld0vQFJsadcGbinP16eno6LQDIdxOk7rOJYMq4S3CaTHGdlpn+xR13lM+Egeu2rxiNwKZNnXRvMrOe1h/KQhv5HYuX9MA+7XbUmwxu8l5KHLe2/fslIoRjiol+253XTDDkPvux9Zw+esdc3kO5i4Opw/NEvps8MXFFX4jtKI/JBdZh8oe+QdKEtvE4bMSN7e93T5qkpP1z7D2ReGW70x6cm6g3jhnHp/SzxTXqiHMqZbKM7TP7SJuwrON7i/meG9yW45cJyTbO/GzQbOI44ljHOn2dstEPY4ccp83fqf9mc9vIzwqM87tYwrraeLHe6QOcT/mMY1+nfLZZi2fRNfVnm/kezn2833XQhuxTxk3uM0nKfu38y/Lf3NycvceeCyIYy7iAzfOdY4j9LG1RF7QHwX61+c5l2Y+Uvbu7Oz3fNNvYTs2ezY9si6ZfLuZpzw15luTvba7h56ZP64eLSSwryXf+3yO2d3+805n3Oh4PBoPBYDAYDAaDwWAwuF5cPSHsd+cmseVddgETW3wvZpJQTMA1spUJYyYBGym61nqR7KKcx+PzziiTwCxjYo6J3cjY3tfGY1Qjm5O7TIqz/nxm/S7fEtPUNfuUhBrrMclikoQ7jGk7JyOtg0vJZibjnp7e25FNoib3NbKH/mUdsH7KGpn8DsVGvtBnct0JRidoG/kSu5P4TV1JEDdSLKCeX716dXb0tm3VCDQnIlknx4/fl5q/kSVEBkkv1t+Im5RpiWD/NZyAZ9+oKydxKVOD5aDd21imPK2MfYO635GbjoNMSFv/qZ+7SC8R49QN+8kx1eRv+qfv0MfoE/QR/sYY7CQ9+8cTAqxfyuWYyvjEunPN8Tr69Vh/GwHkxQiZPxy32zxlu1gHHqeUiWXaONkRQR4v1iN11vrPMWSdsK+xNXXeyMB8zxxIuXmvx5fRjunNvfRl66Hpl37d7J640OJA6qP+2IbtHBnzPvjWt+PxeIrrjZR337zT17Lb3pHTz2f8Fx238ep22gKptdYZkZfyHtfRO09WaXpjHLDO2nPEJbnYD9Zn23FuoS6tX7frOYft22d9zD7b5txA+e1vLc6R6N3NR4xplNU+zjhr+7R5u/mcbUn9us+MI26vjWHKQaKdu4LZt/j+Ti9rrTP9pXz8tM2fnuesV+vM+t09nwwGg8FgMBgMBoPBYDC4Llw9IbzWc7LDiZ789vj4eLYTMskXJjqZwGRSPMkXXmeydK2X7xVzQj3JIybHvCNhd1yf22K/Ut47Dtl+jk3l7lMntEz2tuRo20nBZFsIWerOxEuSZ+wTbUY7mJywHagnJwop444siN6ok8hDEiyJdbfNRDCJIJKnTvg6KUs9RAbrIL+xHBOTTmRSHhNGJpRJplE/Nzc3L/rhxKblb8loJ7BD8LJ8Iwp4j8nO2C3X0mbbiU8fdZKYyVQnoVkuMCGZdv19R9g4ee/vtA8T19ZNI4vYX/pmsHtvrftHEtZjgnahHG1XVotj1o9taSLHfeP4tz493ncLKnZ9tY52/eE4Z98iDwkQJ/V3PuZjxxuBstY67YCOLDwSNjJwDnG7jjW7XeokoTnfMQ4wLrBf1pfjUuRe69xHTRZxIRFBX7OcJGI49zA+MqbZvowhJqJyLT7vVyGkX5bbsa7VzXmTsrCcY6LrpV/RnxgnWxxvdXus0X4tBjB+uuzOZtGb7WASPfCYt3x8TmC7qTNlfIyy4xd9xPMYy3FhH23bds9Tz02H9nH7G/tofwtMpFpnAecW+l2bk/OXR7bHx9lu8yO3G937WcULFj0m2a82X7RxYD3S7ylPK9tswHFO+Tym6Uu3t7cvFjNSX4yh/I2+2mJA/JCvw/EzhfvXntEGg8FgMBgMBoPBYDAYXDeunhA+Hp+Py+NuNyapvZrfhEjubclIExGsn8fxMZnqxBcT6aw3iTKSki25yUQOk41MsJLYZnsmPiL38Xhcr1+/fkFEsG8+6s8EAHXDpLP15uvcYWmyiWQJd4g6+cXErOUjWWF7spxtvNbzOw8bkXN7e7seHh5Ou73zzlKTNyQXIm+OaCVh0QgUEiJJwkZGJpn97kfbpCVorYe7u7sXiUjrJ3LYp5z0pgwmtEh+UEf5LfalX7Ac7yUpQPvsFhoEjWhvZDjHs5OpsVuOUW/6auSIxzPvbX30NfoKY0TTFfWZmGdCIgsX7N87MiVjlrLvSECPUf/W9M8Y1MgikhjuC23D637ve3ZLpj3GX/fJ84AJUPsux1XKhMDlji/qx8STZeLYzn2X/Cj64S5IEzaU2QTHJbIiaL7nuZI6Mxrhw99anKLPNnunLya8aSsTLWu9JMwoV7Pz8Xg8xUvqxvOeyVf6bBtja71c0GBQ37STxwH1Z3/252YjEnQmZ9MPxg3ry3XyWYjxgn3gb80frBfrlTbys0fq5HHKTf+OSbt6Hc9IDFsPHnOE/cH30ZcYQ1rdjAmMk5mrmp8EnOf4lzKwv453PIWGsWE3ZlOXFyrkeov/9FXrqz3Lt9jHe21D1s3v1HmT0aDc9I1md9uMdbT47zFCcpy29XOZY8FgMBgMBoPBYDAYDAaDDweunhBmIjG7d9Y633XkpDATyCF3SHq0xNmOrGJ5J9+chF/reVeqE5NJBHnXlxNYTJrxiMnXr1+fCAGSiCRDnp6eTkQEidrog+9rNTnBtgO+h5KkBvVvAsOEA9t3Mj1tMjnoRL+T3AG/514vGPDOmpub811ikSE+ld2gPIqZSdc3b96ckYVOxjViIPU4mb/W+Q4t+xHBBLKTlS05aPmsE+9Kop18RGIjqJx8zTX7nIkHXqNMkZ27g/KXxBQJMfqMyYq2mML6ZBu+131m3/mX97sv9GHHJPpNS0bbp9KHXKdO7fvtGHHqh/GI7Ta/4Zgl8Uny3bGMca+RMjnRwIly644webUrxzo5jn2ssOVt5Ge+k0xh7DV5YzLA/mQyp8lN0oFkEYmdtsCjETRux0f70j7RFe1ufdn3WY/HOOOICdbI5s+eB2ln6s6+2vpq27lOxkBed/w2uRM92n/XOp/329iILLYpx6SvWx8pk76zLsdFjkP2qz1zUCdt3rBv5T4TapSv2Ze6pM853nuObnObF7NQ3xz39OnmK44Z7PMuNjY0nfovbUa9W0+0G3+j/J4Dd21RHyxHf/BiBM5d7bjpPBfyOdL1Wi9+lrI8efZi255HrTP7nvXC5xDbss3bzU88Z+zGT/TshStpw3GQOvK4d78sp3VInQwGg8FgMBgMBoPBYDC4flw9IbzWS7I0yRAmJEmeMjETgnStlwQcE9aNZCCJcXt7uw6HQ03qpix3GOU+7rgxoeL+EU78JdHeEnm75CBJ3+iFu1NT3jtNqJ+1Xh7Ly+Rx2rdeGwngRCsT9C3RnzqdyHTduYe7YKhDkz9cHMAkeBKTSYSSBKI94ntpg3ol4U8dsl87otukn3dB8n4mAO3f1B39wwlMJp9zv5O5HnvNv9hn18G6vCDCCVqSj/l9l3CmH+Y3/mOf3M98drK37aBqSVySdj5i0/Ehdfga67Rt2mceI0ldxWcbqcJFLpSdsZJ9ZFkTBSZjqGv2JXLF1o1g53hrPknfoo1MBOzkY19Y5yXsiJ9GvkbeHDXf/Mv3J+57Dop+4qeOna47to3/t8UBjfBp9rAtbYddP/LX5JVjpHXJOGQfb8SO42izKf+5z20OYt+afhtp5LL8nTGffWIsMHHK+dryeR6mn6x1Hl89f7Be3su2TEiyHo9ny+h6d+8cdgy3jalzE7Qe/5fuMwFH8Fkr8jnONj+IjlqMav1pvk17+9nGevG9/pt7LvkL9Z/rvNaeMahD/s5+tnHQ9Ga/jszpK49XZty2blln7g/5zPnK+mP857Npi2GRgc8ifhc37Wa9em6kXtv14/H5XcwtxkYW+lriBudpPwexLT8PDgaDwWAwGAwGg8FgMLhuXD0h7IShd/K2BF9LIjKBwgQQSR0m8ZLsT7LFBJOT4Skb5BqTOo3IYYK/9YXJN8uZe9quabfXCKnj8bgOh8NZEorJWBNf3PlF4mtHru2IAMtDvTfbWp7I6+Qf5W87LWILJ+BoXyc7TUix/UbK5C93E1IPTE76Hcw7UsQyUIf+nUlWX7dP+QhRJxZpF78zb5ckZ18pjxdq7MiVZiP2wfGAv7n/3Bnld4yTRKcP7xL93jlkW+6S5vR5Jvvps9YndZm2XQdl8w45khJtZ1/q8+IJxpfd2OW4auRII3LZftuxZR2z3UaqeKFH7Mtj21usa/Jb5x7/7E8jbRgTuEuUPtFikckGXmuLWri4p+mR/WB/Ym/+pXzWV/5lTrk0zr1Qh2PcMa/Z2L7DmEBb27dZt2VIP9vijDafmVSxTVq8oe+3mMky9jXHOdvP/acczb72NdqHdnEZ9t22NqnVyLFmL9qXvzu2+Pe0YVKafbu5OT8W3v5KX2gxz2PPdnQ88z2Uh88Lbb5oJL3b5hzF8czfuaDA/boU46hPy7IbL57P/Czl9v0slGuNrDchyjo9tqkr2zqyeT7gX8tsvfs53r7CZyrWxXZ3dUa+9NllPX+4//zc5uLUH7n4TNIWwAwGg8FgMBgMBoPBYDC4Tlw9IbzWc/KrHQW41kuiY63nJElL/voo5BBeTAZ5x2eS8SSkSQQwsUeSwklhEgbH4/FMtpbgYjvt3WPsV75nJ1pkZZKTieFd4tmJMCZCmQDMjui0zeQ67bHbEc1kOvvlI34DHl9IkiU2SN3tHZ0E9ZHvrJP9MZHU9Bh98frT09N6eHg4LS5o5An9hT7gJPeOrA5iZ/qUCRu2fTwez3zTfWOfKC8ToEyaNmKCyVwneVsSmPJTP9mdzz7xnZGxPRcHNPIoskR31DvJ07WedzR5sYfjCMcJE+DUM+1pYonk0OFweDEeSVrzHrZBO3AsOIaY5KDd28kBbI82oW24KCLy+l7XYaKoJbEbOcPfmg7d5lrnC0lMwHHOyH2M6w0kHHhtt6CDfU9bJBY8btLv2ILzlOPcWs9jySQs26XvsZ22AIJEC+fbpmvrin1LOc4hthP1QJKtkSxeEEHdsz7GHto1ZS8R7ayvkTTsQxtL9iv6l0nj/G4S2nW8efPmbGHa22KJ67V9EmsctxnrHbftO2y3xRjK7rnUuvP8xDocP1Nn7mUMaYsjKLdtxLZIEHqua3GFY6SN7cDzhMf62+xH+NnL81sbE5xP6QveVc15zTppsuUet7l7DqAvZp6JfnKv527qwPpu8dqytXHtuMs46uc+4+bm5sWz/C4WsL1Wf6ubZZocl54jWswZDAaDwWAwGAwGg8FgcN34UBDCXsWfpHlI3LZ6vyWinRx2gqwlkfPdpAyT8Eysh4xNG0x6k2h2Qit9clKISaj0sx072hKoJG+cgE1ZE8eUOXLwKONGEqZfqYdJbibiW4KYdmLy1onMkPZOwjspyh0aKWeynuWYNE2i0Ak96pYLBdIX6zMEMPvHuqg3JuNdhrKRmKAs9HmTytlRRXvGPh43JocoO++5lAR1sp2+sdbzO5pbst7ve2RCmLthqG/aopES9AuPI+rO78RlewFJZ+/Upw7Yt52PtsQy7zfh4P61BQLUtxP0rJ/fWZa+4/sJ2s312J9cj/vnMUW9sb2Au7mbnIxjKb/zz9iUcdu6dgzajRGC7XPMNBkcF4IsgnAc5fuXHTupV9bZfG/nQ/7uvuZ3x1bXwf55LmvjwDZq5E4jiQITvTtCyz7XfqO/cVy0smmb/aM8lNGkPW2QOil74rd9ibKQvHV/dzpO3PNR+56bWQ/HcvOvXRyjHam/Vj9lb3PmblEMn6tYp+e71HMJnGPZlvvIOarpj3pveuMzCmVzmdzbdhGzXcuR8eH38q71HBMfHh7O5M1vnP/ow14EZD+2DvKPZHDqYf/Y96bL3fOG/WD3TNIWZKS9PFPaB2gD/5/Anx2H+IoR6tFzsUnzNoYuxdVLehsMBoPBYDAYDAaDwWBw3bh6QtgJryRYeDwoyyXJZhKJx8c6MevEtZNtTl7xNxOITNI0wteJqZaEc5nIbWKFyVATMXyHHkkAJ84aWcB+M8nlBGTs0Mg61k07pX2+jzmytQQuSRkn1VyG7eX769ev11ovjylsxzmb7KN/7BK3uT/+aLIqu6i9qzWy5D3T7BeTsOx/kLaYVMx9LJs+hkgKvPurJSZfvXp1kquRYiljEoR6yTXqlTq0XhupQr83ec9FHazXidLowmP7UvLV303wOInbdrUzoU+0RHezv/uUukxCxp9Yp+XwuDGxwPFgf+O4cd9s8/zlMda7Mcq6mo4ZE/id8rOu3J8FGW1RR1sg0/REW+TzLsakbdvPPkJfTjkSJNQhCQXvfGd7u9MU8htPZ+Ax9gHnL+uEMtvGHnccj9Rng+3JhQgtLlmX1lcbu+0d96zfscLtUhf06zaXBV5MQHkv+VMjx5q8Jv7aWLLu7fP83dc9lthnE2ONjPbc3/zHxwA7xnvO81zLeps/uP+2DduwLuwv7A9133yuwfGp2TPtUH4ueqEcu4UJPrnCPs3xsJuv2vzTxh/jEtvywondcybJez6HpJyfy3iv9R4fsv68EIhwnH4/Y9tzeBvTHJ/0tTZ+vaiJNrx0KgP742cqyzwYDAaDwWAwGAwGg8HgenH1hHDbVfPmzZuz997xXaxrvSR/ApIdTEKTRF3rZaIoCSGTAUz4cOdN2mHCkwk0Jr2YFHKSiAlbJzFNkjNx2UjllpBzosl9tu7dNhNbr1+/Xvf396e6aA/qv313sju/cdcXyzt5l/6yjhCw3CXDeq2j5hvWPROqxs7f+I5jJyLz10RRS3C2BOnT0/Ox5M1G9MW1zhOoKRNCOr8H3K1u21huXqM9qbeABFdkYH/p+5S3ycKxRBs4CU8dUH8tMWsb872wAWOGiQSOGfaP9+5iUCMBvBiC30mm8HcSbl7MYX2YaGgkrNvyeGDfWD/teolIoZ/y/e7513bGUidZlJLyjq/5THs4ThC2tf0pf02yUP/Wi+NNfIsyWe+NcLV/m5hh7KbN+Dk6pw+2WO1FHClP3br95hP5yzgUpE/tneEmgUzAeLx7nLfx4/tJcLFOE+Mc89T9Li6z75aRCxcoJ2Nfru9iL/869jqO8H76VLAj15u+aK/ors1h/LubC2zH1k8/f1AnLtPapm25gKj5SvMrE9Qcl4wp9jfOBbaRYyh/T5zLDl76mP0jdXF+ot9mbndMb3pLnZxPW+y2v9sW9h22x++cSwjqiH2zrSIfn384RqM7z8/2J7dLn+Y87ThE+WhjyuqFHrYjy9M+mbPbGLd+2tw0GAwGg8FgMBgMBoPB4Lpx9YTwWuc7b7I7kjvQUoYkVsp4xb2T70x8M3HOOhpZudbze/KY2E9Cb62XSVfv1DRMPPGYyUsJS95HMqCR0EzQss8B23BC2Inw1HV3d7ceHx9P5IoTZTlOmnIETgQn2Uw9OpkdXeVIzbbrz7YlAbIjzfPXuzWcvG07e0xmOOGYtvMbdUmf86IEJwXp4yZjqGOTv04WWj7qIr5KPbJ85GU9tGNLTpMUYPLZyfKUpR1C+LUkfvxlrWcSO5/t5z4WuBGH1CdJIv7GpHHTr4kC6seEhn+zjVry3N9Zj0kX+jAXFvCzyRbHA9bteOHj5K1Pk1s7n2U7XozAe+wnjDWMhZTFZIdta0LBY4H1tKR7G/smX2yrVkfao2weZ9YDy7E/u3d45x4vYGJcs34bmZG6W/99jfXzmG7aqhE1nu8ageUxRvtZvkZKUj7GToLxwgQO6/b7eT2n2WZe6MMx4L+MSbxn5yvtmYHtNFKRddt/IxtPKCA53JB7HZdpW/cpcXvXvnW1i8/xNdrbzzZe0OQYZHKR8zT1H315rLQYn7bas0WL37TPJd013+E8zHFE/cV3uZCI9VD21h/Htabrt8UHft/FR9s5yHOK+xfZmm7auPDCoF28jT6bn8aWXMDEV3Z47uPzB2Ohdczn1RYH2yKPwWAwGAwGg8FgMBgMBteLqyeEmSRhEsdJWSf71zrfgbfWy52v3lmW+0kmXkpcJeHI44JJSqQt7tLzLpUkllh/6vYurvy+1vn7KZngZNLdCTTKxkQWk6e5Rl0zEb7WOtvZxLqZwIqsbVdbI3lIxpAMpi15D0lb9suJSJOOux1kJhXpByYVU472cmKX11mObRO74/94P/3P/0iw5Bp3W1KHjcSm/n0cqHXh5KXJltgnes24aAll7+6PPE0G+m38xOQ8fT5+asLCyXeSFdQhienWvgkRkiktiW473t/fnxLabrvBMSpymIRgeSfqA8YfkweRx0SF+9DkYz9IYtDP6Nvsy1qrLkTgkfjcSWo7WT+NDDUp0BaGOP7bX9h/jlsn5i2TiUYv+GG8pK4oE/vM8eg+pm3W56On3Rd/pvy55r5zERDbs994jrKf8rPnkLVeHlu+I2zYtucVysTfPV/siNpGuDiG+Hpkp85zjTKZcKIOqO/Ukfvp4/GFdrwtv8e3bX/7N/uUWOpxxdgfGXLd75dmu+w3bUKCj3Lt7E3dcix47uK9RBsP9NPI3Z7BaOPWl5TxMyF9zeOmkfruW1tolXscc9rOe8eUtfbvW+fzF58RW8zh8yf15HbZnzZPNr0y3nk+so9Rz7Rbi0VeeOg5o8XI3Gs/TvnWrzYPRZ+OA/SZ5ldNvsg+GAwGg8FgMBgMBoPB4Ppx9YRw4KRKdqq0nYBOaJLkYpLfJF7Kso7Hx8cXiRkmp5jUS4I/iXLLz8RNk9FgW0z+O4lI8IhkJ/4a6cnEqslxky8sZxnzW6412x2Pxxcki5PXKWNiiPV69xB3dZl4sW94p03+MjEYeMdH6rBOKMtODyZavYDBO41SxiSGSUMSeLEZfY1JXNuaOqd/sU8k7eJvJBN8HLEJGBP5HkshAWg36tcnArAciVgn9e0nfkdudMmFGm2hAtvnTp2033ZItUUQjXRgbOHuQvoq72lH4dsPeS9JDZY1UWW/T5tO/jtG5lQA/sbvjF/0D7ZnYintkfAiQeaEP33UvsC4vPvdyfgmm+3LtrkDzEQK+0Md8RrBPkeX9m2OPdqZfkf5Wvxc6+UiiUY8UIckQEjO2/fSD9qadqMuLvkC4bnfi0RSPidLcLx7nmHd9EvKQxvartaTSSbH/PS/EX5uwwsTKGd75rAMzRaO4bYRdWRbtOcI4unpaT08PLyYu5r/8B621eqkfvxsRl061qaMbctx00D9c1xb//nM+M/+tLHWFqVYr36OtPyUg/akz9h3OfYdHynHLt6lLO3ANlyfxwXr5HOqF4TYd9t1L3zwuM9nL9zywhMvyqRc1h3jOvXRyP2mMy+4aL7HhU5u3/HCNrKud749GAwGg8FgMBgMBoPB4PrwoSCEHx4eaiI/cAL86enptKOFO1ucIGMiLiDB5sS2QcIldYVwJIEU+Zxgbkmt9IfJPie2nFAzQWBdvY3o2CWtnKAmAbBLWPNadmD7KO/c68Q2CUnK1Mhq99FEaeRnotiEiXcz+v2lJvaYmCQZSJ23nVcpw7/0Ce/qon4boZr+hOjwjhzqg0Qxdcad1Y0IYr9y3WRxfoudc92EjEkLjlPusIwN7M+pm3+Z8KbPpQ2Tp5SfY4bvIKTeU5/bot7Tnnc5W37rLJ95FLblp85IxLse+m/K0q5sm8c7009aUtty5zp128gK9p3l21hif61D6iHX2+IRJ8xpL9u7jdfU1frDmMLfGtHA3z03USbqKH3m4g/2nWRB7vV8xXboE7wnvzd4TqI+SU6bePJ4aospvPjDsdwx3vVaFtohsYM2bXPqWs/v5PRY85zhOOX5nffbprt53Lp3nGSbvN7ma8cz95P6sc79bEHf4DOPF7jYDgFjIa+lvK9THsrIObqRcIQXdkRPPo575/O0pdtoc7bbaXqm37e50npoMYbEYGShfrhAJvW3xQqWsy1C2PXT8w3L85/vtb5t60sx33GZfd8RwG2M2++yuK8tvgju7u7qs49JY+ud822zW54puGig+SZl9FyV+aD5T5urqLfBYDAYDAaDwWAwGAwG148PBSHMhOHxeFz39/dniWkmsknyecfjWuvsiFbvnGDiLbv3dok9E8wEk4S+J+XbDq0kmdhf/u7jj/kv/eauQyfguHvYSVMm4pxAzHXagMk5kqB8d5oTp5G17byIDC2BHTKIfU3dkYcJPu4iasQW9ezEuxP6LWHJvpig8dGL1iP9wwRns01LfJLYTptOuNO/dyQb23Cy3jtXPNbSBq9TLh5J3BLGbyOGuGiD/sBEaksQZwGCd0pzPDARzQR7271E/2vvtWY5y8OEcgMJmNRJosayURctIUw98zhK+h3b8vj1eGgLEWyjJo/jr8k864/jlHJwsUCzCfu+Vj8SmfdThkZssCx3gpk4cIww0XQpae8FHdQXx7PbYP0mX9k/EqPNnrYdSYxGqvqduj6mnX3I3zZGTA5Tlxx3rc+2kecfy7Lzs6aTHeyf1h/9dXcv7dQWXvA6deH3LFNffodv4h3raYtBHMt3frojlhhLbNfWHxP11pkXeFHOgM8il/TdZHHfLvm06+Rv7fjtlOeCjrYggn2lTKyv2dhjJG1QH9QV2/YzbfrgOdbPhpf06T5w3sgJGnym8RjzsyDl89hn3fZh+rj147jU4gIXHbVYbjvbn/iZ8bO1GXn53JDn/vz+8PDwQk7Gbj5fWRf52/Q6GAwGg8FgMBgMBoPB4Lpx9YSwk8hrrRfHMa91Tqr52Mi1zo+ea4nTEBBMrLN97wRJgocEqOt24oYJKf7WdtA66Zt2SRJRF+lfS4ZllzR15ESck4+s2zqwnOlDYCLdxAF3bNFOkd/JYpKDTqqlznbNhKhJlJbkdNKb74mmLzFRHT/gTvaWZHffKKOP3rXubFcnoNvOM7blfrEukgyWgfqhLI04ZXnuzG9+38jZm5ub0zG5lD/3sl76hfWSsWaSyjq07akX96sl+JkUppysl4l3tnV3d3eWEA+enp7W4XA4G1sswwSzk9oecyQCGsloUtAxoCWraTvqgbpx3HOCnYsEWmKdbTYdEfZV+wL9q8WvNh4cR9r4cXtcqEAfMjnHkyPsH9QZf2f71qvHeeIp5w0TKSaVEr9afxIbLBftaXvsdGy7UJ+MB47LJtroX5wP2Q4XXVlfjL1s337AuZn9dUzib/Ynyshx2eYiL2KxjhxrqNO1+ise8rvj3M5/2HfWvdY6nWjgBS6Wx/ACMJORnNtdPvryWNmNHX5usXxHLLfx3e5vuuVfP5/s5hk/q/mVBmyzyWm/2s1Vfv7id8dqytXmtXYSCevx7lqPz9YnypNyIZnZZ9rH8eOSzairtZ5J4Syc9HNIyttPOIc0P2jPAJeId8udfrIOLq6IX1G31PVuwclgMBgMBoPBYDAYDAaD68OHghAOgUiiJ0nCw+HwIiFEAsEJ9Rzn5mQx8fT0dLbjNMkuJ15IZvg417u7u7N3bPI3J5Larg8naHMt7TbCpCVmKXPKOeHKz95t0u7jTpXosu1IbbvFKIuTh0ygmQgimZ8kcT77PdIkWZkIZJKSZJuTpk62UmYncuMnITLtU7vP1CcJccsZmNBifdFN+sv2qEP2if0kieqx0Haye8yY1GPZ+MWbN29eJMqdGGb9rI874NivlHf7bXy5LSd/49dtcQaT9s2eTNTyCOq2W4rfuQiA/st2WAfjke1vcso6TDskRXbJascdXo+veZwzxja7pr2djVN//rGNz4dcIHlpwj72pQ5aIt3vxaauSII6bra4ljZSh+M7+8B5xfPCTo+N7CGJyTmnxTcT2c1XPa4cQ/x+1laOdjeRQf2mvtjAi0gIx+jdePCcQduzrjZfcUyaNG8LVnzN+mn2cgx233ZxkrLbVylP86OmL4KymbzmfOVxSp2xXc6zu77kLwnzdo/n7PasRHmtS/u/5xba0+1zTOzGQ4tvfM5piw8Y5x0X2C/PAfYhX+PctJv3aTP7Jv3keDyePed4cQD9gfpxbPQzgMcx9dMWLLn/aaPNdc0vWpzdPeu28dgWFdhPKI+Pf44P2B+bv1r/9lW+dqIt0BkMBoPBYDAYDAaDwWBwfehnkf4G8GM/9mPru77ru9ZXfuVXrq/7uq9bP/ADP7B+4Rd+4azMH/gDf+AsWXZzc7P+3J/7c2dl/uf//J/r+7//+9eXf/mXr6/7uq9bf/kv/+W6s/dtcCIxpEs78jkJsCRQUo5El3fykExlojNt5W+SdkyYMYnjd7SGnIsMaSs7Ey4ls70LxP1iktpJudavXcIpRF0jpKn//EufUubVq1ennY5v3rw5EeDpY+Txjg4n0m5vb8/eu5a2Hh4eTkQi5aAtktSNHE4aPj09v+st95AYsh0N6opkH/0tSBvNfk6W5nf6DZOyTFZmAYTJrfi47e+EPMcJ+8SEP5Oh9COThk1X1jf/xU89fth/10mSwglrjm3KxfZyjXW1pLl13UgYXqMubQuXYxnacJcEpp6YvLfu4+s8VtZx49KOb/uB7Wt90I/st9TBDt5h6sT1jgAhacFrzRd3xHLqdwK96cdkI8s0InDXV/sB7+Nntsnxw6S//bbFc8ZXytfirH838dLGhmVmLLJ+m63o7zty3/GK8aIdHcu6Wt3tiFrHpDbH24aRyQsfLMta62w8OkZ7sYZlpo3sWzvdUffWB8dZ+rNbzNII7Da2bKu0H1+IrWz7fLevURe2lf2G1ziPW298JnC9sS3v8djx3Gx9Nbu3eGQfoA/ze/OVnSwe400/jv/UEWVs8c/6aLqlP7IevrYjdmVZXjMRaj/hNcc3+yg/0z9aTAzadcrpMZFrPHHENvOY4jhgzKWNmy9aVvazLUi1b+zmpcHgg/b/+sFgMBgMBoPBYDAY/MbwRd8h/O/+3b9bH/vYx9Z3fdd3rcfHx/VX/+pfXd/7vd+7fv7nf359xVd8xancn/kzf2b9zb/5N0/fv/zLv/z0+c2bN+v7v//710c/+tH1H//jf1z/63/9r/Wn/tSfWofDYf3tv/23P2+ZmPTwCvmWuPNOPydQuDuYSX+WDRGZcmu9JI/WerlLiJ9D1jEJnPIkkbgjhsk0JuLSJyaGnAhjUmiXLAtZa5KDxzI6+Zm/fqcniQsm4ttuk8jBBDp3jTKxHeLVhAnbDdKX1JHkxN3d3bq7uzuzofvnnVFORqctJtq4e41+QJ1Glylvn3GilohOk1x9eHg43cP+0MZMNlPPTFA+PDy8SGB6sQXJnuy8T6L34eHhjBxhkpv+Ep8lAZq687v1nc/2fY9P1sMjl90udcD7swDC4yT3U9ZmK35OedqaOrWNWD93pVH/bIN9cLlGTqSN9NH6bWjkmP/ZlwK+q52y0b7td9dtXySaDbJT02PZ9+5eF9Dew97GJvtDncbmjQhgXVwE4MVLTX/UGWOSdUHZdrrNXME5M/e18ecxwHk28pBE9vhon/PdCyearWyDyNII3MjF+d169Nx5icAhTCjudE5b7vqb+hyTW19t57c9b7SyJlxbXHG/LUs7IcLx2XN6k5l9Zf9JqO18n3XT9o5Lu0U4fqbajW+2Y720efFSLKUeTJgzjux0R93wuco+yPb4LNjIdsLjt+mQzzn8bD8KfNICbUq9t7nLY9W2pV7YBnWd/vv5bDdHBm3OsH9cmvc4D7heyuBxz2chlmttpL4mn0llv7JmMGj4IP6/fjAYDAaDwWAwGAwGXzi+6ITwT/zET5x9/0f/6B+tr/u6r1s/8zM/s77ne77ndP3Lv/zL10c/+tFax7/8l/9y/fzP//z61//6X6+PfOQj6zu/8zvX3/pbf2v98A//8Pobf+NvrPv7+/ctT0sMJ/mxO6qSiWImeFqyjEkZJ8iSbAqRygQPE+a5P8cHJ2nk3bctwXdzc3O6ryXQKLPJTcrnBHUjYKK/llxtCbok3nNMoEk3EsIm8JzQ8g6LXdI99mXize9x5M5oEnLtb2Tw7j3bMeWZPLWtaAuTRNHL7e3tibh1sjk+FbLXCw74NwlEkuP0Z9af30kYNzvZto0gaAsKOCacvIzdMz78vuDoxDuSSBgY9EuTWvbntriBY7kRxbmPiXSWs4xt3PM+kkD0E/qR++kEPPt+iahphEZsznc8tnjA+nIfYx4XxThpT1tTZvoRiVLXQdsRfJejfY8LTRLvbWfao8X3yGgyspHgLBt/p074futGiCQmmERN/YwXXrhgWdq4oN95PFunjXxw+cSi5lPUJ4lS98mysx0fN39pPHG+oI09H1qWtqCI160v95G+wLIp1xZXMJ56oUps22KkxxPHnecWx27e5zjumGSdm5xiXZSD7UYnfF5ocYF6Z3uOAW1O5hij7PQ/x++1nuNcyjjGtfjDaxz7tKf11p4B8t3xw+OL8Yr3tjFj+WIL64xt058Dj5VGpDo+G44RHhsmYGkb+4n9ty0mYf84/3I8WXf2L9qZdTMGNztQFxzruznL9+zmWJ+IEj1YfutoN8d73Hq+9D2DgfFB+3/9YDAYDAaDwWAwGAx+Y/hNXxL+qU99aq211m/9rb/17Po//sf/eH3t137t+vZv//b1iU98Yn32s589/fZTP/VT6zu+4zvWRz7ykdO17/u+71uf/vSn13/9r/+1tvPuu++uT3/602f/1jona5j0SNI9CZN8J3nIpL0TlkxCMZkUou3Vq1dnuyRTB5OfuWetZ+LSx1kzAcbdTQETQU6m8XcnxPMbZXYfnKhrR5ruEqUtucU+M+nJurxz1DrwXxL7tKd3vThJaXLKBBVJ5VynTG13MvVHGb0jkDoysdMSoyG9op+W2N0llunv7r938XAXL4mpm5ubdTgcTmXbooAgR6w7+Rmftu9xXDj5yXHLsrSH7dLIeOudf0kmcMeUx1V0Yv+nD3H3KMtxUYoTvbZjvsdvuHAk/3j0+s6vqGv6v4/79Lik3ekbjYhoYy1yp136jO3iz5Q3ffRiEevsUjziAgj+1pLk7pPj0tvGmAkeEhPpR+YDLyTwGGL9ju1NX2wn44z1uI+U0TptctjHKJvlINoYbH1t7RGN7G1z+a4e2oP9vkQm+6hy6tQ+wGOVPZd63qVf+rmk2cg6aHGO483PCx7LtjvL2N/8zJM6SFZSz++HQLT/eU5qMddxlX7k2NOeJTz/O56zPoIy0r47P2vjgGU8n7X4w77wM21lfXg8t/mPi0xoW4/LNh4pi2OWf6fPNB22uY86WOvls0raoL0cj9OWyWb3kXZgrAw459q3Lp0qkN8dM5oMHJOc+9lPjz2/vsY+7f+jpE0+6+U+nxKT//e0RUSDQcOX+v/1g8FgMBgMBoPBYDD4jeGLvkOYeHp6Wn/xL/7F9ft//+9f3/7t3366/sf/+B9f3/It37K+4Ru+Yf3sz/7s+uEf/uH1C7/wC+uf/tN/utZa65Of/OTZfxrXWqfvn/zkJ2tbP/ZjP7Z+9Ed/9MX1JEe8i7YlpZMYyffslEr5EDs+NnStc9Lv8fFx3d/fnyVgSZIxScTEENtjfSnjXZ1OcjNZRJmz44lJOu9M4m66yEgdkZiibtu70VK+7RLykXkpz/56B49JE8rsxJx33Tq52naomRRjf30v9e8k51prHQ6Hs2Rr6rE9W0Kbfsnj/CiDE4mWgb5GssKkQ/pi8shJccq71nNSNLrfEVaBk4xMjuceymii3knoloyOf3tBQHyH45tjwOOLOvKRwezLJRLByekcTZn7LTuJPCfnW9Kd7ef+Zi8n3lv8oj14P9v2KQom0ZpuXSfvbWM3v3GHF3XSSMvd2N0lxakH69H6ps0Ya2kP/564xYQ/dWkCLXU0otG2WOuZbGhxqfmjxxj9nP2wjzi+Zf7wIgLWyXqoJ7fBOaHJYh/L6QbWDduhLzV/NAnGfmR3M33C8aPNOa18Puf0BpbhHOkxzv7SbinDvtEX8vsu/nKMWmeWweO1zWv2593CG45J+o4XmHDBBOeupiO+M5cnrVBetk8/8+sZ+BzjsUL92G+DRkD7PpOAbo/24thy7GU79L+32b6BdnQM5e/+HPC5gm0yBjTbsa3d/Edd2+czt1MXjEusl3ZnnZQpf02oUse2bT7zpBv+bp+mnqkLjo02H1mvJu9jA+o7+nHc2Nk19beYM+9yHbwffBD+Xz8YDAaDwWAwGAwGg98YflMJ4Y997GPr537u59Z/+A//4ez6n/2zf/b0+Tu+4zvW13/9168/+Af/4PrFX/zF9a3f+q1fUFuf+MQn1sc//vHT909/+tPrm77pm84S0E5K+VjIJC6TiM51J6xy3e93ZKL/8fHxRQItSRgSB0ye8vhT/8brJBLSB77jlHBisx1rl9+9e5DJeMKJNCY3Hx4eztpM8vr29na9fv361B53T0Q2JrucuGxy0Kb57nIkDUiqUA72IWQQdc2ENNuzjpn0tZ7te1mgYN+ITPYd94V18hoTnVxgwOSfE+NOEKfPqTc+TaKZfmDigIsNnIRkf21P2sykuschCY/dUY0mh6w/J/pJHth/eC/7Qls4WZs2nNhtYALc9RImqqgLxxqSNvRZ+oTtQB1TR2wnctCPUtZk1c6fWgKf7ecz/dI+xPqoQ9reyfrmT62/acPtt3nDJIdtY9lsd8eg5tOJW7y/LWTheDTxbyLBevf85N8jh/uf+qjXFpO5MIJ+uZtfbLumT/uK5+lmY5ZrdfPeNpYoI+Fx73Fq32d5yuq6HUMpT/TJWOxY6XHR2mFZjoXENLa3i5FE5PScYf+zfGutFwslGGv9/nS2Z9tSN21RiOvg58wHuZfPGnxOyLX23EU9+JmO81cjo63fnZ9bl54f2TZjlWXl+HcdPDGG9rPcl+bz5puNlG+xtMWgtiDJ44ny8NmvzSHuQ+SlTKzLBGru54IQziUeq82Wjk+eY1zeY9q6o64sp+3p+waDHT4I/68fDAaDwWAwGAwGg8FvDL9phPAP/dAPrX/xL/7F+vf//t+vb/zGb7xY9ru/+7vXWmv99//+39e3fuu3ro9+9KPrp3/6p8/K/PIv//Jaa23fT/TOO++sd95558X1kBFOiDH5kp1CTB62XSE8mpFJFiZ6+V5NJhEfHh7OkqprvSRrmaxi4rElbUz2HY/Pu2dMVJsMT13pOxNUJJZ3CT+3yf63pDNJsbRNHVDH1KntZHs4yb7We7u+mKBlEr29z9FJxrXWWbKXbfM+6paJtfYeVNadJKLtQb9oSWjLQXmcwKUcjQhkO7nOXbr0HSdDfWyyfTa6ZCI/95kEaP6U+rjT2vKHaGg+50Q69Z57OFbz3fLZN3yNCWMntyMP9eJxQYLSCVyXoS/Ef3ZxxIld2y7lm+855rVFCexP9NcImhDAHg9ph+/1JSHkWEJCxf5luVs8aHKamOFY5xxgEibXSYhaf23e4PikvF4EYD3v4m764CPOCRMfrR2T6V68wP5bF/aXRkzYh2gb+wvroX1pL4+9Nv5tE+vfY8Mxw3N/7kl77f3Klpf1WTe7dnPd8re5gPGTcdNxtNmMftDaMxrR2kgy94dysC3GHo4j3894zDjoeWlnLyLfuRCPC1d2cbPNT47tkY8+4v46HrGffC41ODY9Bj1/UH6PT46/thgm9ewWfDl2tfnDcc+y8HPzE/pKyqSOxNzIx2fW1k+3Rz2zX577m/78/JR7OafktxYjPCbTn/ZsTX1mrnc9u+eCfGY5ttvmANbB8TYY7PBB+X/9YDAYDAaDwWAwGAx+Y/iiZwCOx+P6oR/6ofXP/tk/W//m3/yb9dt/+29/6z3/+T//57XWWl//9V+/1lrr9/2+37f+y3/5L+tXfuVXTmX+1b/6V+urvuqr1rd927d9QTJxN4YT1iERnYQywZFyJmudYDOZcHPz3jtYk0hiEjAJHhNBlNUJHRM5a52/Xy2/JdHjd9imzkZEUG7qjn1Ov5nYSlvcHZqd0i3Jn7pJalAWJ7Pc35a0JDlHndFusTl1FHtHj9FN+kqSyO2nr7Ynk4r8TnvxPie2nSgmueQEPxOb7LeT3vaz1OGd4WmfvpCdL+wfiS3WQZnyLu0sumhJSY4l99t6c/K3HX9scut4PD+SmWQaZaJfNxKlvTczMlD3lpe+QD8hyZk+PT09nR2L6vjSiAMfYd+IDeu1kYl+z7MJZNaX67tkPglJ+tFuDNE2JiJolx14D9tvNvHCBNq83ceFBO6j++L42X7nXLNb3GLyK/K0sUrZPPfwvfSUg7qybTxPtnLsf/MDy83x4/jBfnCuoS48b9hHqO8215mQ8YIStu9xFr17MYbHD+/3+Pb4dR8ta7vW/MyLEFjOCx3aHNvk4jMGZXEbQXveoS5oU97v93RznPsZgzI1WTze2Bb7aL9M2TbnOCaZSHe/rH/O7dY/y7c+mCxP2cwN7GfTfepgLLP+PB96Lk2b7rd16X6mDJ+hPHbb/OC5Md+9kG93/6WYxTjv8U/70mdtx8jRXsPhsuwnx4Pjpn2m+YbjkmOjT9+wLzU/8/iIHwwGDcfjB+//9YPBYDAYDAaDwWAw+MLxRd8h/LGPfWz9+I//+Prn//yfr6/8yq88vRvoq7/6q9dv+S2/Zf3iL/7i+vEf//H1h//wH15f8zVfs372Z392/aW/9JfW93zP96zf+Tt/51prre/93u9d3/Zt37b+5J/8k+vv/t2/uz75yU+uH/mRH1kf+9jHPu/Vwo1oazsFvRPGSUQehZx6mHhzApiJnJTlTuXUkd+YJPXOxSSRkvhxPU72vHr16rRzt8HJe++wST/aTrhLO36Y0HLSizuOncCjXE7StXdnmjhJ+chsO7p/gYny1NESrCa6qY/8zgQedRR/o5/Qt5joSxsmOuyfrN/vScxvfBdz2+0ZmVjm5uam7kJtu1WsU/qsde/jumNH2zb9a4Q4fcK62JFLJsEpm3fqcNePyaPm24ET5S0xn7pSngRksyt1knt5H8evyR+TBKyfftJ2P5kMsg6tszYuqaO20IIxw+9q9jXGRt6XNqg32odx1fHCxHzs294b7PjRiG+PBRMBLE8f4V/233py/OI9JJcdUzwuL8luH7YfOVal7YyPNh+lH/a/u7u7FwuY2L9G/nnONBEX8Ih/x0S24XrbIhDOQx7TwY7ccTkTRJzbPHeYREo8bnNTswv76fFxPD6fMsD5wfrI50YOO7ZwbEUnjNFeJJB7TPTbH6Mjx8Vdf1tsYL3xG58A4r63+Zj95cI32oKxkuVZJz9b102X1F/zQeuUPmQZdm02m3OupV7ZT+uJ/WoxiOCckdhLW+90Rjnb720OdmxyvPe7xB1PL8VILlZodspCEs+bjhMca36eZhnPjW18rPX8LEd/9PhtOhwMGj5o/68fDAaDwWAwGAwGg8FvDDfHlpX9jVS4SSr8w3/4D9ef/tN/ev3SL/3S+hN/4k+sn/u5n1uf+cxn1jd90zetP/JH/sj6kR/5kfVVX/VVp/L/43/8j/Xn//yfX//23/7b9RVf8RXrB3/wB9ff+Tt/57RT8W349Kc/vb76q796/Y7f8TvOkuYmcpOUJKnGxFaSiE4Spa8hCE2ukEBhkmyXnDaxkITO69evXyRsktBissvJ1JR5fHysuzsDJrFyT/rCnYohdG5unnc7O3nFa9QB+71LPjm5nXtzPKBJOO5EST98v2WL7mJ7Jy0D9oEwGZ5rJnxTb5L5fOccfYg7U5xYZdvuG2Ug8dZIguZbbI+kf3QTOXmcL/UV3YaAt739/tMc/8zr1EHaoV3dt/SZidiWoOVY2PmY9dDIZOvM49nkp/2bidrsvkri2eMiOjCxRh22Mb5L5tImlJFEDe0QOOY1QiSxhe008sE65tHy1BmT9s1m9gH6jfXgMcQ+pS7Ws/M5kh7UZUvS5/5GZpnc8Ph0XY142MVF6sqytbq8sKbZnnZnXGI9/sw44bmN+qZeqK9mexMZ/I0kDsev/SLlPcbbsbipP33nsf7us/2Qdubih9bv6MTxlr5oPfGeZpPInXbtc7v6Mo7TLl+14AUI7ZnFvuJ45vYbye+62zOWy3pcBSbLOd+0+dVzucdC7MM5mrrjGKL/ej6nzO0ZyOW4qJBlmy/ynl1M5tzJe9K+7cY57ng8nvzCz7n2My+e2flhvpu853OU52PqyM8NfsZznGUs8YJKL3KLvvjal4yTZivK5uceziFNbtZnuzBWk3C2H0Re64f9cVz2QjTX+Wu/9mvrU5/61Nn/xQaDFnPX+tL9v34wGAwGg8FgMBgMBpfxtv/bf9EJ4Q8K8h/Hb//2b3+xS8kJpOPxeYdCPiehw+RQ6gh2CW9+35EgTMCTZEq5gLs1nehKWe4IZiLveDye3l3MHa5MjvO9yLmWhNTDw8OpbeqPSfbdTsckyPgbZdiRIE5qmURwcpmJipaIDkJops/RtYl87451/U5YO4lNGeI/TBwz6cukH/vDRDT70t5PbF+IrSMLfT39NYHBstRbfIgJX+qZ5agfJpdN+NqH3aZ3EvNeJmjzvZHF1CXl5uIPJnqta5MDrYxJQuqPY4i2YyI4+nJyvsltvZuEaPe0sUmYGGR/2g5xwsTXpSQ+22tkjgkUtktbGe63bd/iruOQxw9jzVrPC2J83Hgbg5Gljcsmt/tr8iBtMT65f2zX8ShjMidbeG6h7/A+j0tfM3Fi2zgetviev5xHPKZDQPm4cMZA10UbekFH4Dab/aKnNn/vCLboPISqxzp1z2uO97at27Q+my5yH/vjuZvzd+B5x88q9HvGeurJZd2Oxwf9pfm7CVn3Pd99igP1vRuvhP2WssYmlCe/ebEh7eo6cs0LpnhP+tJifcacdRBilCQn624EtX1pF9e4gMjPV/5uv6B8gZ+HdnHVY4ftRWY+15LcZaxgv00gc7et+0Hs/v9gGR0feX0Hj3mO40vzFD830pj3eDFGdO3n8ePxuH71V391COHBBxZDCA8Gg8FgMBgMBoPB+8Pb/m//RT8y+oOG7NBk4tIJ1yRDvLNnrfMdRdx1QRIlhCwTfk548e+OTKBMARPGaZPvkQtpkvtIerXkGnfOMOl3d3d3IoKSWDTxy4RxZKTOdokykkbpD5NW1A/r8Q4w/ubEY2CSnYk1H/XM3TjRC5PLT09Pp93QLRHMHVlM7NF+rKstIKCd2YdG4pnAjF5pb8vQfI0JRdbNY309Hhqx46SlE6ceDztyyzK25Kdl3vWlkRUmeZyEtp1cN8cu9WSZ2f+U4e58jw/ayQQW/b+RHbm3kT6N2DBBQxty4Yt1aFKHY7kls70whO1TdpIoJk/4m3XLceFYbnu4vP3s/fql5afubLNmj0tEkWVqY9V24e+skz6VhUCNXHFsZR3s/26nK/vgBVOsi/HOcbaRG/md83Tu5dzGspaZbbUx0+xA7BYXeF5zfz3ebCMSpizf7M0jiTn2WxuOG5wDHKt3MaTF2/Z7GwOOX208ePFMe0ZoOm9zoGXINcfjkH8uY/1TP5fmES5wYj8djxgHd/MV+8jfAj9r+D7eSzny7+bm+WQVL9pofp/+eB5Ya72YF1KOMZSEb4sFjMUt5rivbZER58wWw10P5aTs7dnKzxceY16EYr91TLKvWff0QcabNk9YHi8yfHx8PIuZHmO8P/d657vLDQaDwWAwGAwGg8FgMLhuXD0hnCRHSFu+P88ESsAdj0kuOnnbEu0mTZiM4/1M6rdkZpNrR47mfif4s0spx9SyPy3ZeHt7u+7u7mrSlHJHd9yRYnmduM49rof9jvyNcIqMtB2T1U5CrnWeyCSR790jlCX3UJdOyDLh10jlHYFEXbBd6olHXNrXvCPPyWnvtqHsJjtpB5L03i0W3Ubv1CsT9kmaepcY+00ZqIu1nt/h9/Dw8CLBTvlMeqd/Ttgygc1dMC0xHngssFz++X23HiP23fxLP7wgIPXT71mWdmablGEnN+t28tnjjHK1+OakdSM7KEsbA+7Dzh4tPhkcw1zcYgKU49Xxk/riZy808X0mgkyY7gjxXOP3pj8n8zlmvdClxVn6DceLyQyTL9FnI4r4mX7Az4zJxG5hi+t0HGsxNH7afDAyxAYt3iSGRoZGmlCX9knaq9l0t0jE9rJvMb4Gfr89YZt4rLivLW60elo/HQs8JikDiXvPm47LO/+1jpsNdj7N+3g9BBjnKMP17BZDtbHJfjcb0RY3N887ydmHfHZc9LOkx2eba3dyXCIp/Qxh3eQvF4B59zDnQMYszjt8BUjzA/qP4wLt4vmK84oXUHl+avZpz727cdvGEq97HmZM8/jh+6xtO/sa5c1v3vXsRTht3qc92+KDwWAwGAwGg8FgMBgMBteNqyeEvQvDycS11tkuhySb2zuNSBTnLxO6Nzc3p3f2OjHGpG+u3d3dnY5lZqLSf9suHSZ1TN743iCJqfv7+7PdGkwEJjnFd8clqeSjgU0YmOR04inls6vBCdd8Tl9MwLlskn9M6l0iAJ1kTDmScSQr2H/3kUlJy5V2WFe+kwwImc5rtAdl2x3P6muNSHcykTKZDOL79ZLIpg7op0wOsw33lWMtSUkmoE2kNBKACV/q2olyy2a/bEnsljCmPUiUmXyOjbx7O+3xCE8uFsl1Lz6IjKyfY426tH81PXIsNeLEtknC3e8xbElykqjeKXqJnOb3yM3j62kb2pQ2ibzt7y6e0K9aUv/9ECLWH/3y0n2u14s5TALtYhV9xu2Q7HSfU2/Kk3hpRG5r99Lc49jmd5maMMt8QnKMOm3H6tr/eA991DK38c1yrtN2aX7heEaYdEmd1LHnJspO+7NM5CX57rjr9tc69wfqy/7VZOP3RsZzPjHJ2eIL/STfTVTyXi+Cig78vEMSrI1nxivGWxNqbId+QLlaW+6rx4/1aWLaOvZzq7+3edJE6W5cWl731/XTV9Kf3cKZ9p3xgPK2uG6dGm5zF3c99q0XttFsZh3YF3ycM8twXiToj7tnaOvRMT//V3nz5s3p/xr0Z+rNpDv7ZX16zA8Gg8FgMBgMBoPBYDC4Xlw9IZwEKo9ETsLGRz2bQGm7wpJ0CzHUkslB6mebXs3PxGZI2JbAW6uv6HfyOvcwycNdCE5WM5nuI5X5LlQn1r2rgvWxfh6dm7pCOFkHTvg7eeykf5JhLNOS2ZSPBBfJAL6vkolot+vkP2E7BE5qO9FKmZhQZJ3sDxOh1J2PJ2Yie7ezLuXbcem7RKX9iP2Mz1BeJt/pWxxr1Il1HcLRfSORT73TnvYD3kv9ByZ22Uf2OWPKx5+THG3vALT+bae2S5PtRx8e+7nGMcGkMsk/jgfCY7CRAoaT3pcWCZgg4XWTb+yb4y/7FXuZVOS9LU7btowhbWylvRZLaCu247FrUsK/ew5hfG7+6HvjkxwrjhWtzR1h4njmWMu/XgjBObLFG8cB2td1eaEA5aYfUEdtQYFjM/vD+Ev7tPhrHTm2c0ym7jbWGonD8j5hhO07ltP3TARZ/+z3Lta0axx/tjXL79r1vMT7HZ9345R6vjQft1jl9mlzv0+6kfK2d+svCby11ot5q+m19bX5mXXquMq52bGLz59uk3K3nfOOnbYP59nUbRLdY6Lpg/Ob++t47ucV12c9Uv7/H3t/F2rttu13gW3MOcfH/Hg/1lp7n7NP5BiwqiRGFCFFJQeUooIYJHhR5iqIeuGVRC9MRUSwMCgoeFHe6ZUoFHhhoOpGQWIEKYjJjTclSkkU5RDMOWefs/Z6P+bHGGPOOerirf+zfuM32zPWzsnXqbl7g5c5xjP603vrrbXe+vP+/733p/MlF2p1/nGcdQto3PfoyXjlc4v92o1fPxty7jchznzY2YGLSewb93nIkCFDhgwZMmTIkCFDhgwZ8nrl1RPCVT14T3DE75jN77w3vz8/f3mvrHdN5HNIOQOfHVnQveeXZfb7/QswvgNxuuMx+Tl/CaqdAhLTf+5q9u6SXAsolZ3Oy+VyspUJseyI5e5r62kivgO+zs7Ojoh82t8gO20xt4uxA/1Zp49eTV2xPfWmXQjwsb+MQ5LesVlsTTt416AXC3S7/0jAz/WN8RQSgvd4EYQB5ZSJTo7VDrRn/NjXtJeJLPua/ebfECmdvgGlTQY7/g2s8zp/p9Bn3K2V3xijBtWje0e2GOj24gWSI10uMehtkJ6x05FXvKcjaOzTbnx193hhhq9391gf9sGkku+nP5JDujHO8ci2SFhGTi08qDoe7wb1mS9oQ/vbxKLJDdqE49Qkwykiq9tB3hGhuddxwzb9G9vkIimKCW/qx7qdByyOVd7TjfHuffa2eUfeeKza53P+9HxcVS/mF5I+zj0eq6zfi734lwsmut2NrI+5kf36IeKou+45q7OLx5jvY/3Ob44T+4h1sT3n5m5ecz/yzEidaa/kk8y7bLvLsSb7bGc/x1AX9tMLA06R2fxe9fLVKZ43OntbtzlfduMh9fC5h4uoPKbZ5g/ZwXpbxzm/RodTxy97PLF+68yFJ+wTdXUdVfVinoh/TuV92rZb1GDf+XnLi4eGDBkyZMiQIUOGDBkyZMiQIa9fXj0hTMIuoEh20fGdrU9PT7Xf74/AfYNs+/3+6D27VS+PGe1293SEgMGhquPdP7zPhEQHOBL4JQhFgjGgkevxEc7eCUQdCToFUDIRnV2ivjdEWHSh7WL3EL0d2E9gtRPaLnUQ7A1A1pFsy+XyyJYmzgnwkfggSByyyH6MPt59YqA84mOQ0w/HI+1Hoor6x+4mF3g999vGJkisD33c7WKJX3mNNqKffI2kZ8R9pK4mK3jksevodsiQpLPvTi0Y6XxpQnMOqO5AaJJELt+9a5BxbHCeJEZHuPBvl48IJnunG3MF7+H4TbmOULBdmJvZPmPYdk8uoV+Tz9hX6kqfmxSybbwLjLnL/jXIn1zLvP34+HiUu7v8b5/QjvZVN4aq+iOCSXB4lxrr55hhO9a5i5POFrzfNvHYt86nFhTYN+wDXxtAfziWWIb1dMSLx7nF84b9OFeeuTNlmWfYJu3jhT7O5c4Btof74jnPuSvik0Y6mzo3e/xZXy8QcF9zjxc9sTzL2d5z/baeLMt46d7f6/Y8XpyXbSvPw6yX91Hf2OCHYoxzbfKV/cU+dPlmLpa6vNPlJdqPcW5fOOY6/boFbay7iw/r2dnUenLRROo7tejCvnE/u3Jdn6IXF6t1+tq+7HPEC91Yh+fOzm5DhgwZMmTIkCFDhgwZMmTIkNcvr54QNni5WCym96MGfN3tdhMY4t13HVEWEOv5+ctu4RAFqSOkcbdrigCWQXG/Dzd/u3dDGuzyDi/uAtrtdhMBnGvexWCAkUTS4fA9IUkgjUA+iXKDYQQCvfuIviEYmzZps9ifO/sitGX62oFo6StB6Dmgln6zfdKvXAsRQWDP5RyXBloNWkcHA4uxC+ulTWhXSnRjXSlvALEDrGnDHE3LnT6usyMXcj9BU/6lrTlmTNa5vY5oYHyTOCQQbmCVsea4pE4kcEy4cPc6d+97QQLrduy7P3Ogto+Y7nbx01ZetNAR+STeDU7nvvTHYLLJGAPdc+QD7ZW2TYDHj52P2cfUz6PyTdLMEeOMNZOgORmCbTHX8V7mItbvVxS4/yRkOd/Mkdusm/3OiQ3OB/ndfuhIiI6AsF/dF8YXx0Z+3+/3R+PHJyF4THLcmDhOmYwD1xPbcH7t5iULx7/7YsLGeaQbB3Nzh8v6d86D1o/PKJ5vuucDt8OYmyOx+IzkvnWxN9e/zs5dvPld7Z537VP3zQtr3K4XszGG2bfESlW9GHfdM1CuWx/HaCceu74vOviZy3ZPWeZM5pC5dpkbHTf8R1vQZ+yz5wYLbWU9mD+cQ7o2PX9yPjtFxiYGOoLcvnYdHjedTdOG9ci9eU5mefaPMeu2ujwcfdO/7nmV/Wau8PPGXIwOGTJkyJAhQ4YMGTJkyJAhQ16XvHpC2MSAwVMCLN1OTwItJlQNnOc37gTl9dRpojN1GygKedABYd4p0h19SdCL4GJAt+wMNqAdEHgO5CTo1AHhIdwNsqY8+5UyPm6X9mb93Q4N7oLpyAODc7QzgcvECUkTgmu513WzDwTnOuCRQLTjj2A4yxqo471eZMD6CC4anDdISH3pVwPMJmt8VLbjwTHQvRM7v9Pf2cVP4cII3u/YpT078Nw+yN+06TptFwOpXV1pM7tCTThTJ+cax03XHolOv2s7fe8IhlMxw5xi8oFl0j77NJcPO/LIbXMMzbWZ2GG5U3Ha2bn7zPi3/ZfLZa1Wq+lv3oPOHJ/7Hx8fa7fb1X6/PxoTzqPdX+cC5mqWyV8uDPJ4Y55z/u5iMDkv9Tpvc4EU56sub3nc2OaMBc9lnFu6ecJiUjtt0YY+BtzzPk+qsK4sw7HPI4NNPLkv9nMX15HEt+dpxqV183jz4pm00fVxjrRz/mE99r1P30i93XMP/dPFiOeObiGM6+hyS3IFn1E62zE3dAsNfA9tY73mYp1/u1jlfe4Px7zzddcOY9GvEMnvnQ3y2XmI8dctFEjueHx8fHFUN+/nOOlyBuPHCy7m5mDnavbhVLlukYLHI8s5juZsx3ya8lyAxr74c6Szb5fb/Xxpmzs3s4+eC7oYHjJkyJAhQ4YMGTJkyJAhQ4a8fnn1hDDJGBJKfndW/pLYIbjE3Z8hH/K+XAOwAWV4JDOBJgJUJDMN2pno4fsXDYL7WEMCZHMAVK575xSBp25HXOxwcXHxoj3vrul2U3kHxtxffiZhYCC7AyBt/84GrD/94Q6OOdDZuhKgIxnekTHWlTvcUudyuTza8UvS5uzsbLJ7B1KanKG9eZ26mzA32WAiySSHgcWO/CBYafDZZfm9IyLYD/eXvsz4IrCe+l2+Iymon+2c+0zcul4TJrw3Os0RumyTNqOQHHe8de/ZZt22D21rP1BHjz+PPeoQv6dM6vHx27Grd5BWHR/n3J2SQJ0IxDtXzAHt7vd6va7Ly8tar9e1Xq9ruVxOJ0Ewbycnp38hhR8eHmq73dZut2tJDsaA9aev4vcuX84RTJyzPE47AqiLc45hj0+W91HkroPxYv/M5c8IcxdJqbmxwrmVunuxhwkc3kufdATaD43TjtShXTwHWUePc+dajgH70vN9PvM0CS88oH29qMo5jn1KHcmxfCZwHnROtO26scBXBTAuvOiks7ttxt+794STBGSsdG3T3q7f48NzXyfJHfQD6zscDkc2pt4ZCy5vezMn+FnAtuPY6BaP+HmI8Wg7dP94j3XxMwAXAbEM44r9yj/mY/eTccp87FzX6Wg7+SQO9zNl3J6PXKfd02/q2i3aoH1Sp8c+daVfObbmxuWQIUOGDBkyZMiQIUOGDBky5HXLqyeEc3Rm1TEwTTLHwCjfgWsQNUflLhaL6Z3C+Z2AjHcjBdwJYep6/d07C0hyElQywJR6CCQRwEr7BOA60DjkDb8TUCWYSelAdgPhBmVtM78vtwO6CKClXwb5c+/j4+PkJ78DlKBYt7M7JHzKElBjO9HJQKHBahNwBnrZXxNYBo07UpHgYqQD/mynDuS2fw0yGzCND032RtifbvcR9edu4dzbAbYGP1PWQDvBffqSOhls7ogGA9eOTRKebs910T4hrHgPwXCX966xDmC2z2k/kiBdrNquc8R6fmdOiXCHp8k02sx5q9O/W5QQn52KQ+cNxh3JycViUZvNpjabTV1dXdV6vT5aTJT8aD8TaL+4uKjValWXl5e12+3q/v6+bm9va7vdHp0KYRLfZPpcDHaxTnvEDh0JQF/Tvl1u4FzV+Sa2Y6zPjQf6qSMrujnAud8x4Njj/OojwufGAfvmRVwerynb5RfbhXqzLepv3zLGPC7Yd95Hkmku7zsfM/aiv0+jyG+01xwRa6K4G6OOJ+vpOGb7XR6wD7rFKLnWHZ/vMcv2qb+fhTx2qA919O9cyED/zfnWdcb+Xjxim/h5k3Nfd9KK72XusJ9PXfPR2mmj66tj289izAFux88cfobg87vb5H3d84Dtz3mu8zfbzv1dX3jiEPsSfzq2acduPu3yAvvYjWHq5EVVXjRlXYYMGTJkyJAhQ4YMGTJkyJAhr1NePSEc8IWg+BzglO/8bOA3172TtBPXlTpM/JwCq3hfyGjqa+CVgJBBdh6b7Z0HHTFpYNvH3+Y+kj0krKP3HABO4HXOTgR1DXzHJtlFw/IEsrOj1oBf53+DYwFUHx8fp3eIEoAk+Hx2dnZE7M2BnF27Jmnok45gMDnn+hzDPPqV+lbV0fuUeWw2QUvay+SOfUf/EYT00e35O0eQefyx7tjHJIvJAdq7W6QR6eKefc1v3UKH/OXxst1uQo9Vxr91IaDPOOvKdxIdmO/mFotQPxLkc+QHSY5c985c2rLLg6zPNnduJFnDdjodXa671+MpJO7Nzc20K5j5Y86HaY9l0//lclnn5+e1XC7r48eP9fDwcNSnjkDqrpvwoL3oj1MEhsdCN//QX+yvcwzr7sqY6PD8eYrg4He35esmxdIW60ub3VjxPNP97jGa8i7nGDY5xnmHcz2P6mZZjwXbw/bONecFE7SHw+HF6xxs385GtC91op8729G+XsSTufrUs1Pu97vq/VxgX7Adj1XHp/Nu58OqOnre6/Ib6+rmzm6MU7p5O9+75wn6w/W5fHdvyvlZzPXMLcTh97mFDHN94jNj9yzRPXN09VE8Hrp82eWfbnydEhPz1mcuR7vc2dlZ++qUlKOt7BfXxXxBYZ6gL7v/t+R5YciQIUOGDBkyZMiQIUOGDBny+uXVE8ImCklm5C9X7LM8CRgCmHmXpAkXAkzeQUYwJrvJuJshoBpBog4o8/tT87kDkAwmnQLeOgCXfUt/2Z4BR7YT+3EHT7d71qAwwTsC0CTE/M467r5LHd1OM4P7Kc/dzuy7bca+exez33lrW5OYIKGb9knKGkAk0WNANvU5tud2rUXoZ9rBddKWaZ8+nfO/wdWO2KedfJ2AugFu+jB2ot70F23zQ4BntwuMMcU4tI14XwcUm9DhfQbGkwe6XYH0iYlC2oP1+USAjpDwtTnixDag/Z+fn48WZ3RANeOA/fEiE45Hjh/HQ9XxDk3eR9vSv9nxfzgcarVa1ddff11XV1cv8hvjhSSPd97ZNtGJCzBub2/r9vb26PUBHFusm7v9O39x4QF9kHZNZtGffPUBbc94miP1YzuOf4ptznxtO86RHM7VzDkcQxznHcFBm3iOoK268r7muYH+SZnuXcuOV88JtIc/Uxgf3RzMcpa5XMlc2ukTXX1yAevo8lzEC5ZY3n12m7nfC4O6BXPse7fYrhubtCcXjtC+ngtoQ8+Tfn6h3T2nzfmMPuFvroP97+bd7pkn0i1mOrVYhL9380t8ymcIx1XXDm1gnzlmXK6bx03+dgshujnQxLTt0D3HOD/ZNuyz+xVJnuD80PnTOcTt+7pzC8tbV+arlOtyz5AhQ4YMGTJkyJAhQ4YMGTLk9cmrJ4QDlHBFflUPPnP3GQG/U8QDAUHv0AroY9Cf33lfAFiC86yfJLV33ri+/GYAO+A4AVYD7inDo7MDqs0BiK7bAJZta1CNQB4JWduUfuO706wXd4QzFhwbc7tiOpCP76A2eG1AzUA0SRUT0O477UrAdQ6878BY+tj2OxwOL+LMQDr70BEx1sfkB+1rsDPXSHp2Osa/c+/MZL3Ry8exxxasryMJ2LZ9Qxv4r2Pp+fn5aFFH947w7l76mKScySeDvswJkefn56PxZtDbx3zSJvRn9xvbN8lmcJl5K+16nJowYE7yooUO9O7IpDlSIO2krsvLy3r79m1dX18fEdmOU/vHO90Td7mHOen5+Xk6fvrp6anu7u4mPTpSNfbq/OEYpX8YDxb2I7ZxzmessF37Jn60Hs5l+Y1zFfWxb2gLt8s+dPnZc4Db5D0cLxzLaa+LoS6W2UbGeeZMSjcunMtMfjoPUuaO2aXtGJfOx7RZp5/nAeYVk3z2EfXo/MmxNFemy+9dP/gb/eOxO9dH3ufxwXh0/qBfKT9Pvurq6N4Bz/mOdjKx7/5wnvF7ZdlH+pDj1+S2++lcwX45tqw/4zL3dYta/DzCcTc3F/E7++XnJtvP87EXLzhWu3hy216cwjxiHahn2mDMdXku7Vu655fu+dc5prPjkCFDhgwZMmTIkCFDhgwZMuR1y6snhCMEfAjcEEiJdEgSfQABAABJREFUGHiqOn5P3tPT07TTi2AbSQASqlUvyReDdgTPCdpTDxKJISFYD/UkSUHQKWWin9+jadKGAJIBQwPNBvhN5BGomgP0aR++95cgHevijkMCf965Yp0prLMDxwjS+d1urs9gMMkNA7cdIcK+sk62NQfwm/ztSI/OTx34Tp/RRnPkQaQj1bzbijpHH8ZcbMAYNrjO+z2uOxLBBLgBXurBsT7n0zmgPJ9zlDltHlvY5gaRTfKzjyY/Kd1Y7XxkEm+OgPC9+dzltPzW7WwmAZP6PS5YT0cIUbeOVGYsZBxxXPNfVdV6va7r6+u6vr6e4iGLSLJbP7sjebrEcrlsyYD83o3bxeLLsdRv3ryp5+fnenh4OOo/43fO33M25T0eF8wn8RsXC1h/2s3kB8swxqjfXM5i7nCO9VycxTY8MSH26HL6XMyQuHVfuznB5Dh1585f98/ieLW9mHc9B3gnNesyyZ62rK8XJ3Vx4/nX93R5hL6LTbrc1fWb/WFedY7p4p96x37Jqyb8uvbnyGIvHmB9KZuTO7xQgG04lzkevRCI0j0HcQ6zHTsS1n2jz5y/Up6vi+DzTEdkp07a0mRpNy9383C3OMTzMevsntc7EtmfbR8+EztXRgf6gHrRpvy9G5dsw+PFz76sLzmXJz90cWG7sL080zNn0A7Okd387pw7ZMiQIUOGDBkyZMiQIUOGDHmd8uoJ4QAxPt7TgLtJKwI0LBugiORsQD8TThGCggR1A6yScIiO3o2z3++P9OQuRPZnDhSKngayCLalvIFO6uR7eJ2Aa8gVv8uT5MCc7r5G8jfvA07bHdh1ClzMd4PT0S2gWAdo00aMnehF3RkTPF6cYCzr7Uj4LiYMFDMWDLbT/9S/I0l8VGb3e0ckGSimbax//npRA9vt4qPzB/1g/Ux6ECTvCBKTEnO+IKBuoLcjH0guc8zTD2mLCzFM3Di+SYoQzOd4I4nlY+htt9g/sWrg3LrbDx2R1BEatmUW1bDO6DA37rrr8QnLdHkg967X63r79m1dXl5Ox/eTlODYzX1pz+SK+0+dqPdi8WVH8uPjY+12u6MFRRbqnO883SL+tU3SLuPOtqAdTG4wlrvFJI4JkjxVL98X2+VMfmau4u7ajvRkm7nH+ZBEB23AsZlXNUSsK4nOzo60czeOaC/qwj67Hkp3P/MX9Z6zKZ93XCf9x3kx7fA+LyrxnMlcP7cgwGOi05k5znOrY5ZxaaLPzza2q5+B5nI4cwDv60hJjw32dc4OLMPFfLYHdfT84uuMedrasclnTT8zdIttqPvceM53j0kLczv9xXFG3Z0HHP+2S/fM0x2R73scl9QhdrFvMlbiQ89vrIPPtd0zTfcO8fQx1zm+GMddfnFMe5xT2LduYcWQIUOGDBkyZMiQIUOGDBky5PXJqyeEq6qWy+ULENvATMiUjnQzAFN1TFiGRCQoFuA5QDdBvlzvdCBY24HzIQdIXnS7Vk3S5np0J3BoACqfA3qZZOzAN4PW/GvA2MAygVfaiCRrB5BGSBKTKKMenW3Y1w5kDsn4+Ph49F5e69qBbfadSUTaPPrzeOEuTgmWE0SMvQhiJyYYKyQf6QfbNWOBdokNOhCfu1Noj9zL+xiXjAvvTHf9jJHUw+sGRz22upj07wZTGS8d6NrVaVKCdbpNA+D0gcdX/M662bbbY9zN2dR6c8FGyvs96QG4Wa7LIQbZ+d1EC23N8dWNXZbLP8Yqy3V5ZbVa1fX1dW02m1qtVi9iNeUSs45r24F5wXXYBxcXF3V5eVl3d3cvSKi0aVt5TsjvJPmjF8dbxK8soO8j3Vzk2ON3X3e/O6Ilv/udtPZlYq0jV0wIe+x37Xs8Jq97XM2NPRNk1In6s57uXvbT4rGS8t3ftOOyXrTBscX3hTJWUhftQltyXiM55/b9bMS6O8LJ12kDxrTz1am5nGPDMcs2GDeOY45X95lt2n58dkg9toX16Mhsjpkujhwj3bVuvHa5mGWZs/Pcah08PjP/8kQT5suuH2mry/0+qcZ9p570Vyfda1rYb9rHzwKst7u3G4fuC2N37pmRdTEWTs1/+Wy7zNna+YYLXOOrQQIPGTJkyJAhQ4YMGTJkyJAhv3jy6glhEkW+ZuCr6vgdjB1xFKBpt9tV1TFAaCC928XD9kwwdICodTZZkN9YpqrfmWm9ThEQBvNtFwLrJL5jC9q2A6BTL691BNPZ2Vnt9/vpegc4mnRg3QTlUg9BMQN1Ke+dKYyjlPEOMuptvfxb+m0wL20/Pj4eEW+MB74fmeBlynHBQerl7jvHZvTvjmf2TviqY/KZsc9xRr24+4/kHcku62KSh2OFMcUytm/EMREyjbuHOvCbvxlcdjtz8ct2IyYx4rPYiyQyy/OfiQrWSdB+zob0lWO2I1fZ5zkdrAvrNjnm3Wy2v3WcA9xdJ+3ufpydndV6vX5BBjMfmjzhjmDnBsc9Y8Q5hjosl8vabrdTLuvymecl2r8jxrp+O3fN+ZN/5/plveZinDHtvtu23fzGe32EKvWYq4t6kgg9NYZJkrJN2rIjTvweaY8HzxnJ25yH7QPHP4Vz2WKxePHaCvvD9dt/rr/zC+1kP+W75+UuP3scdj6l3Ty/8V7HZcTEnu+zb7xAjQuy3GfLXI50P5jHfb9JfN7f6ce8mzIeI9047/K1F5FE3y4fWWe/YoDtOvd0OfvU3NDFDAnoudzHWKJezMvMya6ny78Wxx/bp3S5tFvYkza86CgL5DiX006n2rNteZ35r1voOZcPhgwZMmTIkCFDhgwZMmTIkCGvS149IewdYARFAtQQ9PeOjwBnHXkckIk7WQliBVja7/ctQVB1DFYanCbom98JeqWNHHnKFf8k62IH9p2gVsRgL0G4AKb5Pe9kJXDpnQ5sKzqlz+67xUcw86+BbdbdAXUGkAO2VR0vAGAdHeBM3a1Pd41AfQcMW/eOsEiMdYTa4XD4uY645n251zHXgZzUPySzAVgDvrYHy4SI9aID6uzdRyZvO/Ca7QWsdlnGGce5deG7R1m/7UnCtSPm/Y5NxyNPI+Buz/i1O4ayi3f61aQNiYCObGKfGbfPz88vdtqz311/OhCdNnDOi42db1nGY7DLKdQl9c0B26vVqlar1ZQvLy4upveEOnfSbunzarWq9Xpdl5eXtVqt6vn5uR4fH+v29rbu7++P8qNJGM4j0cE5mv0KaO847uYICmM6femIe97rvO0YoQ58FUC3UMF+TF3de6e9UIh95L1VdbSopCNcGI+O5fzOBUxdTvE9lC4H2+7WrZsX4vMuj1kYz8xrtFfa8XMO9aJfaGfHg58JPC4dn55rmGcZqyTOI7aBY487RtlPxz3ni4wv6s9/c3mBNuJ4Z3wzh7JPJu66XDQXE87b3XhjbLMexlPXB88F/st46OYh6+ecmN9ZR8hi+sV5xXNz98xAvR3nvh4dmO98Iknq6/zN3zwO+czu+Z4609/MHXlu4nOU55Ruzu5eScF52osIaBPP/c5jXrjZ2X7IkCFDhgwZMmTIkCFDhgwZ8rrl1RPCFAIx+W6gigRYQBXu5ujA9fwlSBlQx+CsASaC5yEYCCT6/WM+1jGfufuVbeV7jg42YUBw3O+Ize+8b273GYGtbjeoQUSDUAaeDa4S9GL96fMpMNS+Tgz4/XIdSdMB1wQfCXrnGqUDEm2zfCZhkXIEYtkm+5h6CVJb5oBZ9zGxkrpzr4kAg+0GvW37OQKr0zGf46P0rRurJpIYXwaPY9/swGG/Mj4YU/RhN2Y7YNjjnUKw2iSs/UhyJTob+O7AftrBIL5J+y6GFovF0RH7Hru0NYkRXjOwzUURXODiHMKcRx9wHDBmHXP2A8F0ksEd2WBf0fYXFxd1c3NT33zzTW02mzo/P5/eA7xYLGqz2dSnT59qu93Ww8PDi9357Cvj+uzsbFos1OUs9snx6Ho5xubIli5OaYtu0ZIX7DBOurHiXMH5yrutnUu7BTb5ThvN+b4jOByzzHUmTKgTx1zV9zmR0o2pXKedujj2mLedPT7dRq7nmokozy1say5HeZGMde7q73Tp5gr2y/M0beH5nv5IWRPUznWOXd4f4ZwcPZxjaZeq4yPdSQB6zPAe6sL+uQxtRNvkWdKnubBej6FufJmgnpubu1i1Xpx3u7hwTvf81eVajn+/LsTzuXXyHOixlXI+JYXxl2eC7v8Hnc8TD93Yor/cDutjO+xLRyLHDnM2T/t+1un6afF4HDJkyJAhQ4YMGTJkyJAhQ4a8bnn1hLAB1+wIqzomWgj0sDyBqnwn6JR68tfXOgI3ZR4fH6edeAQAA06lLIF0SkiFx8fHI8KXoJJBPeppgtLEZexggMpEjm3N/odk7UBW7yRLGyHFDTLnGklbExodOBlb06/RgcAofyeYSX29E4v/CKYz7gzMGpClGDDkzjATKgZaqXcA0C5mDGCaVDXInHIdiMlyvpd1Um/aIbHF3S+R9M++5mceaW1w1OOUOnUkzmKxmIBogt4pR3vaFt0Yo+2oh8Fb28WAPwlp6kK/cHx0IH/X3whzlEl2A/HdmMtvPhKXbcwtCOjyqdugrbw7ynZ3H0PCbzab2mw2tVwuZ8eET0A4HA61Xq/rzZs39dVXX9XNzU09PT3Vp0+f6v7+furv2dlZrVar2mw2dXFxUR8+fHhBijCHpg8XFxcTQe4xyFhxvHrc096d70z2elHSXGzaXx7rbKcbpz8k7hOvO/dTP9qgm2fmdO/yEq977ORaFjYx9lwXbRcx+cKx7HtP1eF75ogl1umjr2kz1m37nvLfqbk/17zLNO34VQFdDs5nzzn0ERc7dTl47nmk6xtt3i30cd3JJc6r3XOEbeNniU6cLz0X0ibdWO/6OGcbSkdosx9d3vY9PzQ3uSz7Y6KTccbnLerW2Zm/OYY8p/w8MZ77o6NznueobqFZN667fOd+pu+eF3gP++e2mAPnYt527cjiIUOGDBkyZMiQIUOGDBkyZMjrk1dPCEcIfkcMcBK8MhjT3UuA3btr8zuPVj4cDkfvwz0cDkfH6EYH7/A0qJbvIZPTTj4bpCO4RHCI4DrJxtThnYod6ZprKWu9o5OB/KqXpKvBOgNdBM2oE+3TgYUpb2Dfx1J2oCN1sk19L/243+9fAJwEwjug0f41KZGy3g1lcJB/vdjB7XvXTNXx8a6nAEmDxuyD/e4dWbnGMZT2uBsq9xtoZR/pD8aGj3knKEvA2CQjYyP6kQw+5dfo73h0XHLXj3c/M59wXLkvHajtXWixIf/SD35vNH1A+1PnLlZzzbtjSbKS5HD8RieTlcxbuY8xlWvWi7bIUc/pE/Mb7eTFK+v1ur7++uu6urqq5XJZnz59qru7u4nwvbm5mfL34+NjLZfLevPmTW2329rv9/X09FT7/b6Wy+VRjMXmZ2df3ifsuYN+PiW0O8U+YR85TpxfPZac+6Kzc+Bc3nTMdbqmzrl+0ceeYzzP5VrXNxMjES9k4e+eP3PN48BjO3V0iwCsS8aaiXmOAec55q7Yj3ndv3c+p55dbu/mIupM37H83LhMWffB+cz3cU4i0cW+W6fcR5s6Rm1PLipy3+x/6+a6/XsX+7apfyfJ6NhgW55j6eu5HMr7bBvn71N5wrow/hg/9B3jmja2Pf25y3GeT7vnAz4zcU7v6u0WHTHn8Hff43ESHTpbsd+cm/mbxxXt3/mBccBnFf+/JXI4HF68FmJuocKQIUOGDBkyZMiQIUOGDBky5HXJqyeECYaYeDEISKCMZBhJDQNYqcPkQtoICJUjmTuQlWBOdqYZ2CIgTpCL/TL51gH2h8Ohlsvl9N7MXOtAeRIX0Yn9TN0Ggwn+5X6D8QRYO+DUulvX7v2k1MEkmgFQk7z0lUFLg6YsE9+SADHhbQDPYD+lA3c74Jb1kWgysJ62TAY6DtlPHxntz6l3uVwe6eF3BBsQpT1MhHIRRGfDquNdxYxx+58kQnZgOk6r6ggQpa1oa+/ON0HGthnnPk43dYf88f20Pwkd9p32sY/Zl45gdk5hXRbHhUFpjnPmMeagTkym8d2iJC5ocxMctHWnG8mI5LD1ej29N/j8/HwCzLnwgd9jv/fv39fbt2/r8vKyzs6+HO+cI57Pz89rtVrV4XCYTjTIUafX19f17bffvohTvtsyx3LnfvbXNmGspO+ch3ifSSbbz76hnSJdfrcPGDddfmM8zOUv68f5kPHnst3iHuca5wXmfOd9x7lJnS7ven4yeezFRtYvualrm9+Zk9KOFwYxRzC/d31x/nIuse9T79z8bd09p9l+c7ZkbFO4OIV1dPMK9fRzlfMoc6T7Pxd3bM92mIsp/k6femx3duR35oQu1ucWTFEn6+4YPkV0drmGdXfxkDImYvnZ8wrr4FxDndgP+8/jiGV5CglzAnc0p525eHOcemyl/m7RSGd7zntzuWeuT7zG/6OwDPN1N1d3fRwyZMiQIUOGDBkyZMiQIUOGvG75hSCEDU579xtBLZIC+U6CuCMrDEZm5xfrD1gU4sZEMtshWGkQje1xdxOBrdRv8jr1hCQLGMUdagS8DEiy39HdoN9i8fLo1ehuECpExGKxOCLuUg/Bb4KCBsjtZ77Dzbp1ZAPtmjImHLv3ghq4C2nEnSRZCEBC1qCcgT6CiiHuSbR751NnW5bjggH6zzZImcfHx4k4M6BucmgOYHbsdEAqY4z2MTAZn3Z2I3Btn1R9T5LHJiYBTF53AC19w3aoE3fnpB0e5e4dQd24ZC6K7owd9qvzhUn2DkhmGRMlLE89Op1Zzr4y+eK6LB5XJjPmyph44F/6I2QwAXLWbyJtsVjU9fX1lMcvLi5qt9vVZrOpd+/e1TfffFPPz8+1Wq2qquru7q6en59rv9/X4+NjbTabWq1Wtd1uJ328Kzh+MLnnMUyyp1sI4Fxtu9IuvN/+pz/n4u2HhOPG4tzj3EB9SXJ049pklcklzzG+Z46Iy++OPcpcnvG45DjjfGB7d6QP/9HP/O5FAbYxxa8aoP7UufvLfG3yz7mFn+cWbCVvesGD66Rt6AcfGe0cYF1sV3523zmv8FrimuU5f/lat+DKeZ46d2OO9oh9Ui5iArfzWX5j3Xk+mosx53r7lrZi//wc4kUrrK+bW5+fn188N3MRDcumPS4ycnzaj/Q7r9tubIftzc1R9A/rPBWDrIP18Jne8UOb2h/uC+eLLifwdy8mGDJkyJAhQ4YMGTJkyJAhQ4a8bnn1hLABIJKgBI9ILJqI7AAeA5WpP2DnHJBF8ibtcudwABrvVs11k9i5J3rmSOr0swPoSJgul8uj3cvUuyON2FcCXTlu1YAlQSragWAowclI6nIfCZARSDWITv8a0At4R0KGdfq9z1Xfv1O0AxTzPW2m3diStmU7VfVidwpjkTHD2OjiKfelHBcWcFEBbWD96csuFg1QdtejRwcUk4wxAdbFFvvreGB7Ps6Z9RqEdQw6jijPz8+TLVJXtwAhfWRecUx1YCv914092pYxYXIjdVE35jZKl1cYOx7v7FuXd3IviR2C9RH7l3pyDGT80Ra0CWPcRy1bLi4uar1e12q1mvIT82JHKjw9PdXV1VW9f/9+aufz58/1+fPnabdx6ssCkNxHPTebTW232xckgfvPvjJf2fexOfXkWDfwz3zJdj1+ONfxmuc6jmNem6vHeasTx5HHboT9TDnvwHPO7Mhk1kcbdrm8+2y9La6ryz3MzVXHBI+fKSKew9h2l7+7vphw7XIpY4s25hzW5ZvoSPt0zymUbh5z/7t50GOItnbMeUzaN84rLNflKdveNnfe7/o9Nx95bvQCCurG+rt2mDe6eX6un/yd17tnZP7l80Unc+PKi5esX6dn52vW3T3z5r7k2ezMZ77NXG+b2G62lfXi9blYyRyXtvne7W4MuF/W71TO4efueYD1nPp9yJAhQ4YMGTJkyJAhQ4YMGfJ65NUTwiagDKZVvTxyrwPmTBwGnAnoRiLYuwE7UItkANuoegmQEiwz6J57Teh49yUJK4oJLAJIBp8ImkYftkfbxPYGoH20NuvnEasd0EYbBfBlPQYxn56ejo4JjHRALklVApzedcW+mPQ/HA5H74y2XwnUGhAN8co6eaTuHPBZVUe7q73bg8AnwcaOuGf91JN+6GLMMdEB3u6DiY/UN0eekmCk/Vk3SUn2wT43Me+499HXVcc73jpyg4R12qPutkPXPu1sX9PGrJ9x6t+Sj6KX+8I8RLulLyQU8ruJCOrG+PK4cEzQTvzscccyjunOHix/fn5ey+XyqJ+JI75POG1lvL1586Y2m03d39/Xfr+v29vbur29rc1mM/Xv8vKyHh8f6+7ubnpP8Gazqevr67q7u6v1el2Xl5d1f39/FHv2O8l2Ex0G/rvxxrjiseGe50wY0afd2O7ION7vOLBPXB/9OhcPXgTgBUVziwoszlHuRzcf8/rcXME+cK7q/MExaLIlNugWWnT1uW6308W++9XFQzdvOua8ECV/5+Zwzn28z23xucB9ZR6nTt2xyNbN8dD5ZW6xWDfmXG83nmhv+pFlun7mOvtq3T3Peh5nOfvYz4ruc9dWZwPLqbj3NX9m/a6D8WAdOp0yPzneu7klknnN5K/tZN39TG//2i7U1c9RjOsu9rhAynGW+F0sFu0rL1iPP7OeTrchQ4YMGTJkyJAhQ4YMGTJkyC+GvHpC2OC2CT+Wy1G5JkUCvHSgUSQEZAf4d6Bq2uTuRhNBBHS424V/ucu1qqYdjQZeXW902u/3E1HCXVVzu0Kt69z1iHdqeUce9TkFfEf//POuUO4y9u4jtlPVv/cu/eC9FBOpcwAyATu/lzNxQYKau1YINprsZNvdTlITKgaRO0C4Azm9EyW/h+jujiQ+RbpEundP569JRMYB44d9CqnXkRuMqW4c2K62Y0c8ZcFHrqfcKQKA4nxhENf3dHWSOPRCDoPO1sPkUEcUsG0SpamHRA3rJVme321Xk/g+pt4+7ghh605dcw/LXlxcTO2xruzqdZu55/LysqqqttvtlBsXi8V0PePg6uqqvvvuu6qqWq1W06KO7XZbi8WiVqtVPTw8vFhMRB27hRKMa89V3aIJ+852TT1zwD/HYDdndWWZTz3HdIREfM/xTB/QPt08QN1JBHX5hn2YG3e2G4XPCCRtu35Zfoi0d7t+1zDrPkV2+bN9Ypv5mcVjjtKNMdfjedJjic8MsaVPApiLG+c1xm9nG9uE7TOWGRMcV45l22/uuaR7trBOjueu/u45pPNH9xzZjVPaz3axb7tFiJ1eP68t3AePG+ajbhET/TY3xmjTbk63royhxWIxLRLqFjjy+w/lpKrjxVXsu+Pf/x/o+tbFoOOccxV97Djo5v3D4eUixNTr/DBkyJAhQ4YMGTJkyJAhQ4YMeb3yC0EIc3fsHHha9XK3VEAU7pYjkMnjPvOuUAN6BD9JgnZgWK5z5b/BpJQzCGrwK7+xjN8dSmLSZJcBLQJ11Js6muw0SGhSxLtdSILaNv4c8t5AsYmDjkSKrx0jHWlDO1qPp6enye/cvZR6AvaTlLK/DJyahPCxpt0CA4Pb/K37S7DQscDvXVzNAbXxY7ebtQNYDYy634wL7jo7OzubyOmOpOF4c92Mi253EduirelvEkU89pV+jQ70TQeYMyeknkhXniQwbcR6OiB+zuds0/dxbLFP7G/sWPX9sd3OH10+6sj4OdLCi3KoB/tDu7m9Ll5TJ/txdnZWV1dXdX19Xbvdrqq+LLDZbDb19PRU6/V6ep/w4+Nj7ff7ury8rKenp6nM58+f63A4TO8QduwwR9r/Jh5MWth3p3KIc19XvpsD534zyZM48FzBfjjPkbCZ85PnRs5LzKPMDY7hubHo62zPc6GJ665++8Xzre1ov3Q26OxsHTh+TEh186Xfv+76T+V16sZ6ucCHzyjOO12e8/zieDj1PEB9+S7i1Gvb8+8p/1FX99m5dm5cuc0s7ojY97FdfmPO9YIZ6j0373X6dHqxXfvKC8L4nePph/zl55lcYy7v5gD7wW3lmhfKmAymDzrpSFnOb90iENbv/0MsFscn1rC+lHO+dL+Z6xhjjhs/97I8/cjnk4j/D9I9OwwZMmTIkCFDhgwZMmTIkCFDXre8ekKYQC8BrRAY5+fn9fj4OJUnUBIhkWygPfezbrZlMMvEDsE0k3/L5fLFTt3Ukfu5I5gAUiT1drsbvdPPQKXBx6p6AQwSbPJRdx3Z1JGnaY8+4D/bZY7Q74gE1m29qBP1tB4GPA06+nPASpJAaddx0pEn7KPtS/KKuhjUNzljcmSO8HW78ZOPWWbsuI3UHfCXwDKB/A7IjHSEjP3AMcYd9NTJ/qTtDYjS5x2B4iMaO993gLl9yjHmccYYt07MPzzJgH1iLNAW1IFxPLdTrttt1RFJtClJdhMQzndeRMLYtDjWT4H5jLsA5/nn/O/8tVgs6ubmpna7XW232yn/Pj8/12q1Oorb/X4/7QTOwqCnp6fa7Xa1XC6nd7OT8GH8uv/2Jd/r7kUW9hv7z/6krAkGExOcA1wXfUMfdORZl8ccNyZtHFMW53zWy/Hv+p3zOxs59/D3uTmP9Xleow+7+GfbXX+dU1Mvx/zZ2dnR80qXO6rqRb72iRrs/xyh7vm58xXzHRdVsU/dcxFtw89zOZu2i088pqJP5wfrTPtaJ/eBcyLnJc/D9rvHhZ+9Ukf+Zszb3nPPaK7fPuy+5xrJfL5ywjbjvEKSmvawHZlvOB/4GaR73qItuzr9nBL7uP8cN2zXbdI+ji/qxEUjbHsub3X29zjt7OUc6bxb9ZJ47/JuR5qnf363tvPokCFDhgwZMmTIkCFDhgwZMuR1y6snhAm4dCBTJNdC7lYdkxbZlRghkJf78/3i4uLFUZD+nO8Ex1JH3iU7B9wYSCWQHB28KyP3EXRMH6mLj/bl7wR3adPD4Zgw5DtYTWSlzg4II1BJ27Js7iUhRtu6TtqaRC316OqhT6kXfUTwuCOgTdpRt/i2s4GBZcdarps0cGxEF+rQ7aYiYEp7EVztgGaD3wY7SRAQ4GS7sYVj2H4nwG4iLXWwHe4idl0UvwfafXLf54Bl+ph2Z9zSlyZYeK/73JEVJlA6kJl9MiFAW5pYcDyQTGJ/TaaS5LCOzl25lgUDJobz2W3Q9iQluNAgOl9cXEwLULJwhq8FSD5MO8vlst6/f1+Pj4+1Xq9ru93Wfr+fyJrotFqtqqpqt9tNZHDi9+Liom5ubqYc6DilXzqC2P3s/OzxYx8yvmhP+p9tc2yQxGZcdQs42I5jje9uPxwOR4uq3K9TOdv98XuGHV+s0+OxI1tTp/vre9k/X/OYoS09/zkPnCL7/NqALhd2+cHf/b5sjy3PYc7jjKNcM9HL+7qx73q7XGxxjo2+PI0l8UCilm04X3Rtmzick7kyJKbpHxNyjP/OpnymyDU/F5l8t694X2d3+t92jQ704ynb0bZ+ZuT46uqI8PnFsVLVLwxzDqU+fs+0y/M7xwN/Y/6iUEfb1v5gn5h7TCZ38/xcrmC9tCc/d7HD+c7PgWmve/4aMmTIkCFDhgwZMmTIkCFDhrxOefWEsFfKE/ww8ZHfq74HZAnMGIA0sUkwiTuPvRuEx0ynrfy1Th34Y4CP11Jn6jB4b6KAhEzEoFeIYvafQqApNvOOTfaNYBv9Y6DSAHLKWWcCdSarbSPb1KAswUsfAUgg16Bg7iVQPgfWE1SNLbJj0e3FbyTZ04eO9Oj6Z8CzI4uiE3+b8zN14/U5OxuYNGBvMQDM8eHy7qP724HjqacDmm1Pfu9IB/ubu4ioM2MmY8D38whj6t7p6vii/7rFIbE/+8k2aDcvdmB7tKcBctY5t9sq97CNjhRjHR15wnoYZ74/pDDjiDmHu+Our69rvV7X/f39tMP48fGxNpvNVE8I5efn51qv10e+CZFcVUfvKaaPaA8vULH+tj2FBERnO/uCtqbP7Ffr4NhiP7o+dXmXtrd0+nQkEvXr4qqzF4lD+995fI4M6ezOfnM8+xrHKBft0LYcr55vbEP7hzraXvzdscJ+MBZ9/1yO7Hwxl7O7Orp5l/Vbf7bnXECdusUt+czv3k3MebBbrNY9W9jOjns+B/H5Zi6e2BfPFdFr7rSYrh7XRZudeuaZmxur6mhRZH4nAev5s4t/3mu/nCI6aS8/Z6Qe5jn3c27hF79zHvTiJsdDfiNp6zh2bpkjg+d09b8uL3c+tO6xGeM3cxnn/CFDhgwZMmTIkCFDhgwZMmTIL4a8ekI4YImPxavqj6FcLpcTOBNgr+oliUIwJ59JTswRZ9Gl6suR0Pv9/sURohEC2ibqSOB0AF8IIIOIHWnHfplAMamd67xG0DM2JQDXkQ0hzfP78/Nz7Xa7I0KNvpkD6Ob0sZ/mQFDeT6Av37nTje2TRDU4Ttt2fkvdPsaTfbd+sRUXERjE7PoSWxtUj73mSJ458qQjamwXAo/sC8dTyucYZhMy7Bf7mjZMwNDv9v8p8qfzC3/r4q3qe1KBuhio7WxAUsBgfhdP/q0DpO2H6Bfd5/oQMfHBhRkG6bs841jtSI70hQQ422Gc2ob2F/WZG1s8Mtq+5Njl0dHL5bLu7+/r06dPdXFxUW/fvp3eG7xYLGq73U6+fHh4qOvr63r37t0Ub4+Pj/X8/Fw//elPJ/ssl8va7XZHdudcZOni0L/Hp97xabvkL3fAdr40ee+5je1yrHFcpayvpSzrmss59qHHlOeYfO50dsx3+YRxYb39uXtmoP621VwfTcrYr77mdm2HtOt8TZ1ICHeLUzg+58Y0/dKNYfY5elBv25z9dVv0H+2d/OC8MRevnf3n7kn+mSNoqa/nEPePvp6znZ9BOjvHJ8/Pz0evJbF+XFA2FzOMLfaHOYA50bbjd8ZanvPmSGT3K/dVvSRpeT33Mc+5Ps/pXXz59QhdPHT6cayxvOOSZV23x4b/L9HNYd24dC7nWLbOz8/PR+Mkv7GNxLBPMPA8MWTIkCFDhgwZMmTIkCFDhgx5nfJyW8ErEwMhVd8TEwSTCZoQKDGQStL21Pt9O7DGO3UICoVMJoBKMIpks8FsgjsBnrqdTBEfc8o+sb85LnUOcKbNDDoZoE2bBF9pL4JZBjZTj21Fm6QuHu1q3xjs53UCpwaL5wBI30+ygWAkQfjEH8sTuNvtdke+YEykf6yX8UyAl76wf/M7Y447mhhbkQ4YZd1dfLC/XGjQ6cJ2bFf6hkQsdemIysRI2qRPO+B/sfh+QYTjp4ttjj/2Lf/4O/thwpz5xEfNm4BxnBrkZfsmQJ1fqCdjZi6maCeD350POzLZJFYHirv/vJ/jhnU7Tkz8sT/27fn5eS2Xy1qv1/X4+Dgd+f/58+fa7XbTzrj4Zrvd1u3tbR0Oh7q5uanValXn5+e12WwmH2Y8rVarF2SRd8p7YUZnz+6zSRLajbFDW5u0YezQv/FhSG635zo8Tuyb3G+SiX1hXFP43THL31x313ePq44M6sZs7mEOILGS9m0LjjXrNWcP3zMX7x2B47llzpaei5zvU3/nU+ccz5cew2zP9u/67meK7n7aZM4ePxT7vt+/d+3Qvh6LnqNYr8e044M2ie/5LNTpQzt3uYBiH3ZxNPe85T52/5zfmG9Zn/t4Kl/nPseMF0F18xfngjzrZCFON1cxpvmbdZhr13HWLQixLTq7cMw53y4WL0+T6MYf4439pk/4f5e028XNkCFDhgwZMmTIkCFDhgwZMuT1yavfIUwALztyA0SZRKk6BmgI7HWANcsSvO12S3A3zWLx/bHHBJ34nkW+Q9jl8tckV0DE7LqsevkuVYK/Bq8DEnF3YWzXvVvOYLbbiBCcS10EBPOXRElHdNFG9Al3mRJEZV/TLgFAksf0P3eu0H5py/5NW91Oi/SBu16il48MN/huQJDAa/SP7qmX4B/L0Xb2g0kO9j162Ken/J7254ghAqYmy12v6/A4te7Wg3ZjHEZ8zYRp1fFR0fzNiyXm2rP+fmcsiU7GFskPkwn2iQF8+4q+td60q9/BaDDZ+tJPcwB5tzMt15JX5nYKpv8ec8wfXZ85hubyVXLl8/NzLZfLqZ2bm5uq+nLs88XFRV1eXtbDw8M0hj58+DDpnRMeMp6fnp4mYni32x0tSEhOt59IQngceDzZRp6jOnF+4jhx/vNCC7fXjQX73Z+7azxVost3Ht8mnrpc5PlpLsat09wCBt7DGOx04LWUM9EWvbgrnXFsfWmzLj9aF9vbhCXHJO3rhW0co3PkO/Og44F2Yxv8vetn5wc/B7ifnuPppzm9U+cP5W/e712XEY9d/uP87Hq7Z8TuN+d398/9d+7txgznNj9f0Re8h31IHbbFqfmHfag6XuDIZ6POL+wPf3Nfk5Njd/eT0s3R1Ns50XnKdvXCgfRxbq7Lfd2zE8eC49PxxHmTtiPB7v/f8C/zfJdjhgwZMmTIkCFDhgwZMmTIkCGvT35hCGGCZjmKOURdQJQQigauAu4ZaOxA9ABSFIIuPIKY4HyOBCSgahA6ABDB5BARBIG9Gyn6eFcu6++OFe3AIpOL0dVEVwdkk+DifWyfRDhBLR/dbDCQOqce6pU2OiDbNqYNqHcHnDp2oh/9QGDSuhsUtB4GRTtw2X1gO+yP3+/c7WIxceB3y5nA6nw7B0Lbr3NguQmwDvjvxh791oG01MukA3U0CEtQl6AtxbudWNYAvuOH4t3fboeAN/XoAHiS/rRNt/OIdmBd9HW3QMU2MbDtmJzru+PFOZZ6kqRiW24z+Yj5IzZ+fn6ejnJOufv7+9rv9/X27dv60Y9+VLvdrrbbbe33+2nncEjexOfd3d1Rjq2q2mw29enTp2l3FnMQcxqJZIPxHRHQ2ZJEcyckRmgzEwm+h+Rx9PTRz9SF4ynjsyO2qJPHNmOzy3fsNxcp0b9zOqUOkrTdODhlM+vPdjwHdb7iuGG5quM5sVsA4rnJRFKueS7xmGR+ok5djJHQ6mLR8+Kcbs6JXb8c/6fuM1HX+YHlndP9O+ds6s2Yd/wxPpzzOjvbTn5OSww7lqwjX+HBZyXqSFKw04f2dtzmd8+Pfg6hTrmnyyNzn+0P/8Z7uleAeIEM8043F3b99FijH3lPRwx3cdZ9Zx0eN91YYj/9DOl8eeqIZ9bXvTqB9uvm2iFDhgwZMmTIkCFDhgwZMmTI65VXTwgThA3AFxCE710jUF/18uhbAqdzYFZVf6QnidflcnlEPEcv3hvQJu+uNIGXMgawCVKSEKXeBiFJQHG3iNugHTpAiwATgTmDTCF1O9Azfe1A6FPfu92F9LEBN9uaf03sGcjMbwTjfJx3+k2wzzuCcp1EhvvUAdwGPAkemnDlDmDGrGOl6pgs5kIF9ttCf6e+OcA4sdgBoJ0fCGB7h0va6na9uNzceIxPSDDP7czqCPDYrAOmPdZoH443jlWDvRSOJfvObZm4oV26McD8l7a6sUab5LPjOffP7fTnvbx/7t2d9BmPtOxAefc3u9u72KeeuSdEy8PDQ61Wq6r6QuySfN/v9/X09FSr1Wo6Vvrjx4+1XC7r6uqqlsvltJuY46IjAn4eQoGfTebwL4nRjvTyjjLrQpvSRrZvt2vQ8+Yp8s19Zv7zHOxx7Dapl+vmfM08YZs6Rj2nO090cxZ18GIYjlEvZpqr51RMp04SY84XXfv2bUd0OcdzEQvLOt9zju9yr/vRPTOcGgvUoRsD9HNnU37v8rF142I9XstJAuwfdZjzxZxvnBMjc7nq1IIvx7yfFdInx4af99gvx5kl7XIes3/yDMsYcV/92bHonJW6vPvaz5WdDzwHxQ7WxXFj//pZbm7s8l4vAGC/nc9zjbmU/o14/Ka+btzQ/7Rb9+7pIUOGDBkyZMiQIUOGDBkyZMjrlldPCJvkIQGX41AJthi0DfBkwq0DiP3+L+7mMIjLNnzMr8lF72oyAERAndfYR9fbEVcErNLHDoTt6jDIa0A1YnLh4uLiyA8E8Q3cut/5691xnT95vSM30k5HMkantBOyKWAa+9b9tU68ZkLFOvkv7WqfdyBmR2pHzs7Ophj1QoHY32SpAehT+hHkNaDdEUesi+OMviewSds55iIkuFOOi0LsH4Kx0d32NslgEL+zEY8Ojq70n9sx0eI2fc02JNnMa/nLdzEbwE65OeKEvxlEph05PmiTjgg3WWEb8lQHxrWB+Kov49MEcgeQ296r1Wp6l/B+v6/lclmbzabOzr68bmC73dZut5u+73a7uru7q3fv3tXl5WVdXFzUarWaxpRjkuA7Y5w7uNL/6O04Y5/nSCjfa9/4O+eH1DlH0M+RQx7rnTiH55oXrrhej2vatcshHjdsL9cYe6yneyVBl1u7/MG2HL8ceymfecTzvuPfPnBfGdfMU/yNfWKbfKag3qfsb6LZ/nZcMfd0C534zOA4sE0pXSx3z0cuk8/dDlvOD3N5zu3ymok3+9x96+rjWPLv9C3nIr/mw/GTOcM5iL5hW51unK88BruynV06Gzofds9UHoNe4BS/deRxF2se113M+pmAv3N8nRoLXoRAmcsZ/MxxQ7uzH85T1tU29vW554ghQ4YMGTJkyJAhQ4YMGTJkyOuUV08IV9ULoMYkAkGxEA8BTniUMwFLliGAWHW8qy3C9+b6Xb1Vx6Aw2+P3rh0DQ/lOoJOSnS4EzzoSlH0kmEXy1eQmxUDyHPjZAesk+vx+w+gUv/A4bOpAALIDlA2cE4Q1gU8glDtiUk+3w8o26Qgc1ktwsgNGuzq9k4l9MwBrgtMEMG0SoLwjpn6IELKuqfMUOGmwtwN0O6CbQKntyjGU/rqfHejLceeFDARnTwHXJom7HTgmgnOfCQO/95mAtIXEisF7fjepakDZwLT7xxgyCcX22K8Ic+MPjRm3y/KOX+Ynjy/mr3zne9ZztPNisaj1el3n5+e12+3q/Py8NptNLZfLOhwO9d13303Xzs7Oarvd1t3dXV1eXk593+/3dXt7ezR/mBDqiMYuf/pzl8+7e34ewJ877LoFGyb9WI9jPz72wiWTYhyjvNfjnPHbETF/vTbi2I5070+nfnOLmDwvccEM2/c81vXbzxPdXOxFXnwGYG7tFj5Rn7nFVB0J7b7mPi5qMVlJItTPQRTaYW7hQOcv29Zjir+fyn9dvrfP7SsviOr67Xmua8NzmdvI84znvs52c3nVz1z8S1tY127ceEEQ66ceLN/Zj2W7uO30THnPNX7W6hYT0F4e285z/Ou5hjp0c5x/pz75zCPH3Xb61T2HuK7OV36eYP70s0439rv2hwwZMmTIkCFDhgwZMmTIkCGvX149IWzApqpe7A46HF7uVuNnk7a5p+olMcHy3J1nQIr3GhQ2KHY4HNodlakvdT49PU1H9BEwNFgboIqgv3eO5LOBehPX7gf1YVmCadxdYWAq9ZBAD4FjYIt2mSNl3Sf6vCNU6f/udwNy3GVkwJO+XywWEzlk8oIkPu8hoEjAkHqcAkCti2PKbTF2aSMDhgQss7iAxwR3O97m2s3u8ByPbmJiDoR1XMV+JDsj9mO3a2eO3GScztVjUNn2cmzZ/6mrixmSAz6i2ro7Dux33+Pf53awxj/+zTbgb50tOrCa7URMELDuOXKCpBz97p1Z0YfHRS8Wi4nIrarpyOjz8/M6Pz+v6+vrOhwOdXt7O5G/T09P0/uF9/v91JaJN/Y7i42oW6d3p6+vu/8s5/xjYoz29OKAjjzgZ7eR2KNv+Y9+zmf7Nf8eHx9fzMPd/e4Lf2PMxUYdUdXFkG07l0s9n7v92Im/J8YZ517AlVjIc4NtMbdAiPrw+HWWT+y5H53fO+KUC674m8cX2+3moC7G3K5JTT8/uO/53LXZEYDOSWyLzzDRiW07tuZyvPXtfu98OZcfHee0E6/NzS9z4573c5zYD5QuProFIl5ocspu/muCk/2gX9in1E1fzy24o072NcdRF9udj3PN73Pvnl1I/qdO251ji22lHv5/wLnQ8c17nU+6574hQ4YMGTJkyJAhQ4YMGTJkyOuWV08IVx0ff+wdMQFgO8DKO8tCHBDwMqhNsCsAN4FX7hgw0GdQxoBsR1iZRCQAPgf+ngJ/OqA4bbNu71wyyMc65shag70mFqgT/ZV7WU/qCJhrgJLlbG/6+Pz8fCJuOyDNAGHsYz/yPh7PG/K4O06307cjYqzz3DX3jzGUcilDEJMA6dzOs9wTX5GwdDn2hfaoOt5FPwfEd6QC7dHpa0KJtuyO+jbAzfFMfUwy2JYGqTlWO/KoIwS5+/AUiH6KjM11lnecMG/NESRz98752PnH/XUdBNjTJ+cB981EhHMa7/e72h8fH2u1WtVqtar9fn8E4n/8+LEeHh7q8vKylsvlC9I233e7Xe12u7q/v6/9fj+1eX9/X+fn5/XVV1/Vfr+f8ghJPi+qMTnR5QHabc7ujAfGp8lglrOPWA/bcbzQ/44P6umYiiQPJR925UiOOE75+ymhPTiWeC9zZVfGY4mx0Nmomx+6dhnLXQwwT3f+7vzQEfJuhzk/9zO2SRbRdm6bbZjQ6vJG6urm1JQz4etnFy6Qoj4RPqPw5BC2n3L8Th2tl3V2uY5wdhnqOjcm+DzHebKrm/NYl1dTn8dPlxPoQ8b1XK5JO4wr5gv3r5tXqCvneS/w8Xigzn6+4ekE3fjmPfav5y36yjpzvua4Sp3d6ygYD763m6t93c8HfB3C3Ji2v7p51H38oXw6ZMiQIUOGDBkyZMiQIUOGDHkd8uoJ4ZAABFq6HSckywwGEmzijtDsjMzngDLL5fKIwPFug4ByrP/5+Xk6tjS7JR8fH1+889jkqgHD9DegKAE79skgHcnr2IZkCG3XkQz5LeAcgawAud2ujvS9I+HTNx+Vzb7OgZ30PwFUE+gmAxgXtC37Ynt2OzcIvnERAPvQvc8v5Uzm5hp1JcFMEDnXGZ8E+KmLFxawTfrYcWcAMjF0cXFxBFAScJ4D/XnNxGraMjhLf3Y7agxme6dO4ruzvYF1lumAaZalHefAetrGfe2IHtvcutLeHtusy7+7TZPf9gn75frn6qmqKa+5ff7tAPRuIYn77FjtynXkGkmEyNPTU33+/Ln2+329e/euHh8f6/Hxse7u7mq73dbZ2ffvEmb9ifndbldVX3YYhyBOXu30OjXm2DfmRPaBOZTfPa+l/vzLO44ZF8yHXc7rxscp0pL38z6PZfrRBFPKMAZoP/ubuYQ5K7p4LHuc0w/Ule14rjW5yHnoFOHTlaUe3RzdjXv2nwtinLM8Rrs8eErfLv44d5FIpO07wpRx5hi0HynWg/pxTnQfT8VX5/P0p1vgY3KOenU+m+tL6uoWC+XenPjCWOziwb6Z0yULU+yXLr/P1evx0OXuLqfMzYX2p3N+Z0/n0Dzz8PUu1snkv9ulPzw/8T6Pz84uXuyX9njKjefjU4S3fer/T3TPHPQx6+YzeurwIoshQ4YMGTJkyJAhQ4YMGTJkyOuWXwhCmGRkR1aSkMw9+RuwJzuDq14CMAT1CMBwNwGPCyVIxB2jJLQ60Df3GAg0CckdBLYBy1kf9jdCktjA6RxAG9KBtjEpRcCVAHJHkuToVhKibIvEund5xA8EzAkgcwdhAFMDwSRTQ/6w3bTF6+xziFLaqAMv851AYOwfe5LYIfDn93emj+mPwV/61KBmB+Aytk0CsK9sP2XmiCX7iEAlSXT600AqfzcISz9Tt8SUY9b30icdQM3feISj4851217Ug/7x/XMLMZwH5kDxDlxnzDk/WLdO3A+OM77P13HOep1HEvfdrqfYptspSB1D1HIXHeOXYzqLJ7K44OHhofb7/bRIZ7/f18PDQy0Wi1oul7VarY52Ea/X6zo7O6urq6u6uLiou7u7ur29rfv7+6M+MQdzXHf2pU07v3TzAu9zjuQ/E4CeUzi2PH5NhNCWkW7nJb+TeOnGAOvo7u/iiG3zuvvqzy7X5UATWJ4jT+nj312W9uvmX/vIY8Jjwbmh86P77jHM/OH5gXUwV3l+Zuy6L11cc96w3R0TcwsUOht0RFv+ds8m+c45s8ulvG67zi3m8Pzjsl39XgTkMia7HeOdbbq/p+Zl9o318/QbPoNZBz4PmwDPc3XXP+eYbi5OXZ4ru3mO/uj67XE+Nw+mT5nfunjv7NX50X2Y6yPr5JjuFvxwXukWtGXO+3mOpB8yZMiQIUOGDBkyZMiQIUOGvD559YRwAJIAliQASaIRLCGI6d1uEe6IMSAbYiHECIG7XCP4GckOAkuANt5LYInkiXfERRe/N5nlop9BPAJE3i11ClynuO3s5Oh2Qp0CRju7z+2qMABm0D1CwqoDE1Mm7fJ+kq7pA4n52Pfs7Gw6mpZ9IoDYkREmvzvJPTxaku9UNhlCMDoEsxcxEMi0LTo/sZztbKB0jpDg58QGAd6OeI7Ydp3NTBA45nyf+5BrHUFBIoS2YVwxLumbxF9Htv88u9MScx0YTf8QRM41j2WOky7W2XZ+5z32jwlbkwMu41zoccn6bQfnDeZJ52GTUFXHR5+nP3yHOUH3EL/r9brOz89rt9vV4XCo3W43tfndd9/Vd999V/v9/oj4cdtZsJGx2ElHOvHd9L7PPnEuc2x048l25fzg/EAfMV7myBXbnrHZESidLU7Fsf92+S86ug6TMLajd9qxDdqN83+nq/vmuaHzD3Xonh06P9C+/N6NgR+az7s5gdfoc5KD/s3zr/tV9ZK0i/iZJDKXD7r4tg7dM4ftQvt4cYTvc1yxnS7O+Rvb4/zNBUKsk/MOFzjR1nxGoL84p3bPdrQr5wfnY9Zv8po28/yW3/gud8+L9mOkW5TmRRUeu8y5c7mI7XmceSy6fT+zuL6q4/zb5ekur9of3TMCdcx9nKOdQxwbp3LukCFDhgwZMmTIkCFDhgwZMuT1yasnhKvqBRgW8INAf9XLI1Pzu99DaWAowJZJEwPtHcBlwoA7hg30GNxcLL5/t3DKG8g6O/tyzGlA6vQlO11NeKaP1IcyB6BHTxK2+Y27EXKPj5AmcWwA1OC7d9t6h0rqeH5+no5cZHn+Tr19jwkU99U7LGgjg3WplzqzztQRPxmkZf87cJ2gK+/rwM+OLKautHEHQjMeeYS6SQXaq4tjA6AmOtKfuZ2JHHvUjTGUOMvvjG/70Ys/SCgmpm3bDuDnYgGTGI49+siLGQj2e1yQ/M3njhxmG445Xic47PxmkphxFB3s0862rqfTx/Fm23bfowPFQDhtks8ZbyQrGKPZDbzdbifduiPu9/t9ffjwoc7Pz+vi4qK+/fbburu7O7KnF+0w55jwoH6MfeYy97vLExSPqy4+TQp4wY3r97XOr/nNOXwu73T5gzHO/ljnboECdfM71FmXnwHcT+YHt++84KPInZOsF/uR+Zakv/vJOv0bfcy49kkYHMOdP1MHn5G6BT20D8k5lj/lw65fczHejRP7ku3ZVnPz0g/NXVU98TjXpnOoZW4enBsXc/dFL+tq/fk+ZdY3FzdVLxdMsLxJ6LSRGOgWj3Cu8DxrktN1V718vQbv8/zTPXvz3b4dKWw/dvPR3MIGtp1y3TNJvs8tFOlisItX5rnOpl1ecX52rLGtIUOGDBkyZMiQIUOGDBkyZMjrlldPCBvwDjBEUtFAzxwRSGLIgKiPbiOpl+sGfVNnjg9m2917vQjchGQNyUvClaCPwUOCddaxA4vSRneEK4Esgn4+ri4kZ+onEUKCmvXSF7meOryzN79TN9t8jmClbelLg7LcyZKY6dqi/yPeRUoSyCQg7W5SpGub/eNxy46Bjgzt6rG9OrKjiyfHmn12aidMtwvXpGx0nztCm9IRlY6/uXcPG+iPDnMEQOe/7jOFbft69DfAbMDb97HPbt/CPOP7GLcsT2KB16lvPlNsV+ZRjjf6co70ib6sy3mg6vtj7j2+Hx8fa7Va1Wq1Our/crmsqqrdblf7/X7KX5eXl3V5eVkPDw/19PRUy+VyskPGWkjg3W43HSNtQsQLDjK+TdB4HM4RFyYJ8hvnujkbdjvH8nu3w8332abdNY+7ubzLXMN7s1iJx/NzkU7qenp6mt7znCO/I1540O0gtN0pnofcN5PP/NzZwjnHJFDnKz9XzNVvH/B7F0Me48wDHFOJb1+3sB/OCSafGbNu0/Y+lQdsx64873H9p3zrvMI87zJzY8CEakew0v6dLl1MsZzvZb9MwHqO6+LbsZL7fJ2/x68kXOdipRtznHc4x/j51XGUe7rnr3zvFjtY766/HNOdv5zfnXfyTE59Ge9sz37snpFM9joW7UfajwR0R8S77SFDhgwZMmTIkCFDhgwZMmTI65dXTwgb0L64uDg6qpAgCckdA+sEkQLYPD4+Hr2TmABQwFSSiz5SmOAdgbC0R8DGwFXKEEAiMeR38aZ/Ae/2+/2LdgwABkSa28XG98V1pFn6kzbpE4NlBqkNqlI39on1kBToQFsD+AEgDTSmrI8unCNcDPR5QQFB5TlQljso6S+31YH6JuG6xQAhsBzH1O8UWN2B7wahU1f6k4UK9hd9ShDWbbIvHpeu07v3qCvb7IBeA9mOaR/RawDVOYQ6mOzsxlTq8akAyR8k+Onvjuzo/NKVYx2niCa3xbzZgfH5x9MVmGNirzlAm/HAceOx2cWhfex8RKCefYudOfbS9sXFRS2Xy6OjzM/Pz2u5XE6/dbnXudTzAGVu3M2NLcdxRxBx3PB3EzvO7R7njAf6yfMLy8/tquvikb44Pz+fCPuQwc4fue/s7MvO7Lzrebfb1cPDw9FR+LmvI+Ns724MOWd5TNmWXfzb7pxr7TP7fG6hxNyc7zZ4zTJH/nRx19mJc5TnEevChTdedOCYjr8Y29bH83KnP3/vSPi59v0cM5cf0zfbtxs7p/rLWPU8wXL5zEVDrpOf7ReToJ1PunhOXadyEe/1uPEc6b6zftbr35zXPffnumPMdmb9nU6dX5PzbZ+U9bMHJX5y/urs2c0DlC5/8jc/h1K65xbaoIvlIUOGDBkyZMiQIUOGDBkyZMjrlFdPCFcd7wog8GfCh+XnQNeqY+Ii3wn08ijhjlQiMBXQm9f8bj0CxLknbR0Ox0eJUqe819IAqMHc6O9dJAZHvUu425lM4pEkSwfwxoYh6dlvAlgGP+k7g4IGMX0kbOqLrtYpu7WzC9Bxwxjw9W7nSQdAz4GoBlnnwMFut88c2O56DNTSpgZRDW7zO33OGDZJ4EUW3t1jUs4AcuIkuncLNWgL72jj2GR/LfaHAeHo2u3qNGlddTyG852yXC6n3aWLxfc7IA+Hw0Rq5TNJYdZFH3pBBW1nv7LPjjGPVdqb8ZTfuNPV+bB7Zy31tc3Zjv3ksWK9LMxFjo3dbjflLefejK3lcnk0T1D37XY7ld9sNrXb7Y7yzW63a3Ofd3jFRjwNwP2NTvzs8U2fOI/E1q6ns+ncwpIuN6d+x11HdHWkMBeDrFarWq/XtVwup2O6Ly4ujo669a7vxN7l5eVEDu92u7q/v6/b29vpve1zOYD6dvHj645J28w5riN/XF+3435urrYvu7HL+ZkkaHTKPbFlxm2XTzxH2TZeQNfdy5zjhUhzser2umeGquP3hNP2p3JcN/fOteNxO0f6de11C7/se+rVPS84ftwXL5LJ7yb2og/tHpkjul3nXHvpv23oHN7d140tl5+b0zimaZ/uGapbuORnwbk85oWMrD+/+TnG96duxlSnc75nPu3+H+FFRrQZ+zg3P9ImHp9zeXDIkCFDhgwZMmTIkCFDhgwZ8vrk1RPCBgsN/ITMMhjLe0mWpi4KgbDz8/MXpCLBHoM71MvvKk7dBpTye/6ZfCJhmrJzoLzJRdZtoMu79lKOpLfB16ovR0g/Pz9Pu75MkhsgNVjqflGfrn+sO7u4SW7EBvRF2nLdLtvpx+sUg92281wdHWDNOKUvCD6nPpOP3W5xt9MtDqCvDWb6vdzctcVFCNSTdiEwyzFAf6ffJC8MtLNfXQzb3taDvvfRvtSB/qTNLB6jXngSwuvy8nI6Jp2LKDhm0kZ2P2632+mY3NjZtqYPqavtmrq7685T7Nsc6O+/zB0dEE4deE/37nTb2uSG66VPOfbyPfZ2PqTv6YcQkiEZt9vt5IPF4gt5vNvtpvtIypkYzpzAcUO/RTrA/3D4/lSK1B9fe97o8oK/e2zYptTd8xBjgn/Zjj9zvsh8sF6va7PZTCTwarWa7HNxcXFEZvK1AtmxzbbX6/V0/3a7rbu7u6OjW2mfjvy2vRlPnN+8UIrl8tc5trPT3LxHW3vXn8ksiseYcyvr7mKmiz/6zyQlnwe80Mcx5njkeOjmT84RXrTR5SHX6z5UHS9gcxzT3o5lLwpJuW6xTOd7LjzjfRlfjmP7gHo4r7Ntx0r3XGTbdvmc9ztnRAe/BsP+5n2nFg7Qn+x3t0jBfvVrD5y7OxvS12yb+vM93hxvp/Lf3GLG1NUtjulIfz+fdDnb+nI887l8Lh5s8y6XDRkyZMiQIUOGDBkyZMiQIUNer7x6QtigaoQglcEngpwd0FhVR0Aed8ixLIHOx8fHo3cisj0CUAb4TajldxJlBqoCDIV8SJm8KzMSYoFEWLcLmXY0qGT7GAT3LrgO0DJhGTHBxN8uLi6OQC8SMrRT3unJPsyBlCZBDAZSRwPq3S6cU4SYbbZYLI4I8viPZQguGgTsQGqS4CTJHE+53sWdAV7qFzGp14HDBrLjP9vBZEWINwp353i3TNUxOOt+mgQgeN8t9KB9WYd32XDsUI/E4Wq1qqurq7q+vq6Li4tpRzCJLRKFIcOqqlarVW02m3p4eJj+MS90ZJbHIn0/R+J0/sx9/M3+7I7TNPnRkT2MFerWkS25jyR1clsnJFD4L7qnDZIzWbiS46Cj03K5rPv7+7q7u5tyefr99PQ0+TO7VWMbtxufe5ED+z2XCykduWah32lT5/Vutxk/d6Sz25kTk0rUablc1mazmcjgzWYz6ZNc6MUU7BeJHMbvxcVFvXnzpjabTZ2fn0+7hZNPadeOLGK+z3i0jeIn38984zmPNqQd6IuOXKJOp/Ir66HtT/mrG7P83t3H+YNjqCOt+Jn5wvrzc0fIzo0Dlume8Ww3tsNnB4+nzi62JfMa58qqY6LSZHLXr1PtdTHK3B995wj5uXHiZ1rbys8qnR1Zl+dy+iU5jddTP+cOttX13b+5vTnx73NzpOO0m7No/45wZQxbX9uhy9/UxTkn7XTPI4wHz8HUnYsr5nLzkCFDhgwZMmTIkCFDhgwZMuR1y6snhCMmyAKGcLcVgS2Dq34XJkFR7nIJwUOgsOp7sockUQeGVh2TcyaCDV4ZtA8Ax2OkO2Ao19O/SEBM7lY2aETgicAU3xlLYiTkVgdY5VpsaHCMhICBRtZpwrmziUG2rv88xpMArIE7k6DWz2B9rhsYpu/TJwKPfEdpdwQvY8CEpuOE+tFWtIX71u1a50IJ9sH2oi2okxdSuC/uY9rk+OlAVPfDZI71cBx1fUgsmSxnPbS942+5XNb19XVdX1/Xer2edjnGDvEv/ZI+ZkxkYUfesRqii3aOn0wQW89u0QLHikHyblED+xB72CcG1jtChPZibul8RRuRdDOIvVgspuO47Yuql+8LDrnLfiyXy1qv10e+vb29rc+fP0/3ZjdrfLBer+vy8rL2+/3RO4bnyAHHNfMUpSMd+J3+YRmTOm7bBNFce4x1k3ocI3PzpssfDodar9dHR0RnDCyXyxf24mfqy7hKm/mdx00vFov6/PnzRPbbPrG752LbJfWTsOYYSix5fpubN+Z82tnOvuv86n55brZeXR3MBV37bpsLM7r8YR96EZHr6xb3dMSXc8Gc/Xivfe3++5nGNo9t/BvtaTs7Xu1rPntS5mzuxRJ+fnHc8plobgER55tuLHQxlHqcc+hH6uXYY5z5vuiXOaabW2ybbkx4DHTPFHNjj69BYHk+k9vn+d0xxTatp+eBuT6wDdp97v8D1os2cBn6Y8iQIUOGDBkyZMiQIUOGDBnyiyGvnhDuSBMST/nMXXoGvFOPgRbukjFoFyLBoFx3LC2BJB6ZynYJVnZAUgfkhWDoSG8CaTkWNX3rQG2/R5Ig75y+JqAM3tHu3vmX30LApLx3Ux0OL9/xTILApIHrTD3eqUIxwdYBdx3IzHiz3XifyUbqZeCUvu3sTxsYFGc7ucfvL+2A1+56F4fdOyy7HTfuC8chdzO7XfqQ45Mx0YGh3UIE1517DZa7PYPL7hevLZfLev/+fb158+aI7MqYS92JyYwXjmeO6+zwv76+rqqadqx2OwoNJHc+pB4G+r0L0mOe/ujsSr+yXx0xQv1I5HHMd6QE+8E67MOO5Kn6MuZzsgBja71e183NTS0Wiyk33t7eHpUNMZ93BlfV9M72OYCdOZL26aQry/6wDY/p3NcRM5S5RSzUwX3pck3slr9cqBNdOCYuLy9rtVrVYrGY7Oj4SF2JUY5BjiOPKdqHu44/f/48vfvZ8TM3bjpyheWij8ef5zi2N2e7Tge2l3qd45zf7ae5senY6Wzh6yZEHZNzdTCHzc2lc7HK8Z/84PmdZC1t77HY+cP3dL7qxs9cHHVze7fQJmX8fGS7c/5kjuLfuXzqxSVzeTDPAbZRl8vsRz43Oua4CI/PW45LjzX21f1zzLm+bn7gM6btwByV3/lqk/SDfnL+9fObF1Z4QRnb7cbp3DNzJ8z3tlX3PEP/Mbbm5qEhQ4YMGTJkyJAhQ4YMGTJkyOuTV08IdyB31TGgNQf65m92LPB9kqkjIEvAr4DsPMo5ANHc+zEDlnGn4hwgS3At5QkMpl0CfGyH9bGvBOwIfLHNzrYEl90ey/B4V4PLc3XM6ZC+G9Ti7hKSSLRX2nOb3RGgVS93DnWAMsFfAtiJD74rsAPsDKAzvugTA8C2E+tMuRB7rI/6Gph0vfYlbWMChEciGnxOvwjOkyjw+0ptP5NEc7qxL9TRNo+fDNLmXpN2c2Sw7UdQ+f379/X27duJDKakzoDPiT+SWhw7aZ/H2GancAhJjgcv3nBc0j7MTbzn4uKiPcLYeS2/eXzwM/OU7cj653YqnQLFXY7+Tp2xtUHx5XJ5tEu4qurq6qpWq1UdDoe6u7ur+/v7Ohy+7GxNTL5582bq/36/r4eHh7q9va03b95MZGfa56KL+Ih+5thmP7ocnc8myUlOdHHtMcuxPkdO0I5cTGSfWB/ey/ns4uKiNptNLZfLKb5CBtM2c3nNx0hnDJzqC8dejgV3Oed4x/GpuYmfu/mhK0ddPZd045W2Zh7y+LPt3FfHxBxRad+y787t1Lc7wcIxkvHjBQBztmNcd/HZ6UW9SfTRhl0e7+Z1Skdm26+n+jIXC6yLtjtlR475bnxzUYbJSJPn3UIC1uWcSr28gKcbM56zO9t6vrANrJvr7RbO+F73hTbl735e4mIU1jFnt7mFl6eeJVjGz4+OHcevSXs+N/L5L89YnOsdn0OGDBkyZMiQIUOGDBkyZMiQ1y+vnhDuVsgTeDEAm3K8h+//zT3n5+cTQWzCMkBMdvQRqPIuZYK+IWDym4+XNtBksLYjemiHgMQmG0wUGTTrfu8ASepH8IplOlDRJNApoo7X2O/YikR8xMced77nMb3c5Ub7sh8E2gwGm2DI/QRyCdh1JAHbJZBIItygoe3UAYkk5qhXB4qnbwSUu3f+dUC649G6dDu3ul1eBk87UiA65nfvymdMEQT37j7ayUR6N5YsaW+1WtW7d+/q3bt3E/lFP9Juic+5HToe0/F9+rjf7ydCOOK4NSHQxaoJWwLXtLv7yzhk3SY66AvvuGJ9roO+Mek4B2BnUQj1pu1joy6OVqtVvX//ftJzv99PRw5nxylJg81mM9kqO1mvrq6qqqZ5g4R79LNup/pDnTtSwGPPZAHrZWzM1cHvjhUuNnK5buFO/p6dfdl5HbKcPvJ8mDFkksZzX4j1uZjgWMtx3p8/f24Jl66vubebt/hbN5/P5SvHGz93edNlPLbn7pubI6KjyWC2Qzv+0Lju7G7dSU6676cWlLBd25W2n3ve8DyVBQXdM9Cczzwvdc8EtqXt0S2W8Dj23N8R4F28sA77ML6zTRw37JsXlHhRgvWgvWhHlmHOcKwxN9tnnhf9fJN869eFsEy3gMxjYW4cdrb2szhj84fm2S42unxL36WM9fLc2C0oou25sCv3zi2GHTJkyJAhQ4YMGTJkyJAhQ4a8bnn1hHDV8XtxCZJxd1J2evE6AWfvADaos1wupzYOh+9JKRNOfj9ZRwynTu5MSJ3RtQNBc19HGhDA8k4zEwMEYVmfQd/UxV08rJf98308Ots7XggOmoQm6GbQtgO2Wda7pk2O/hAIOgfQ5hqPAWYZvkOZhLPB7dw/tzChA065C2iOjMj9Jrk7gN7HPNJejkX6mf7NvfSn44x9JDHcie3tBQpzgDh1IyFn8J47cBOb0bsDb2nzjOXocX5+Xjc3N/XVV19N76HlmGPMJT88Pz9P773lDv/sXiXwHb2Sy1arVS2Xy9rv90f99ridA+rnCCjGyikbGwD3mJrLXS5HP3mRjf3VAeTUIf9MOFZ9TzI47+bvZrOpy8vL6fjn29vbenh4ONr9XvXleOgcd7xarY6OOr+5uanVajX5JGPWYyx1JifMkQn8btszlniv7UbbOYd5LmJ73E3mtj1P8D3wbHex+EK0c4d14pvjJnHtefPi4uJFDkosUVfnJubL1P309DQdtU79bB+2380RnU2Y02xL+tl5eG7+sq9MCDmO2RZjzrnKJC/17Qgi3mNykXmBMcXFR12/WFfnS8fk3Nh3Pst3PjvlHr/CoZsz2Tfak7agDt3iB9fBfsyJx3G3cIPx8PPkwjl9u/Ld8yd9wPnbz2a5nzHnZ0GPAedTx+CcPd1f96PLZb7uMdzNlbS7fUQ7cnGTxX5inbluojY2so8cq9SX9XNc+BnTOvG7+zpkyJAhQ4YMGTJkyJAhQ4YMeb3yC0EIByAJQVB1DLKRLA54TWDFx1ISgCX4FQI51wPAdjtyOjDTuwcJarMeg0MG+kxwGRg12JY6Dfx14Jp39BgQJqHYAVe0Pe2WOikE+fMvYFl8RqDLtjExOxcXJipJWvgo6dw3d83An/tjEJ42YxkTVxQT6AaJqZM/5z7Hmu3A3zuQm3V0Cw9IQJiEjq1IGjPW7B/3ybaaA9o5fhaLxYv35ZIkPBwOR7tKSdoYQDZgzbF5eXk5HRPdgcAGadNOdq2lHuaMxAH7lbGwXC5rtVpNC1esF8dgxKQUdSIhO2fPLh7YXnd0LOOlI4k6ItF51jFusiF181/6ZOKGhF/qOT8/r3fv3k3xstvt6u7ubiLlQyg+P3+/eIg7hPf7fd3e3tbl5WVtNpujEwTYdpeDOz91xAXv78Y3vzseOjLE7TlHOcf8PPdQn4yr9Xp9dGQ3j5plO8y/9O9yuayrq6tpHG+322kO8DzZEUeLxZdFW5vNpna7Xe33+3Y8Og/NzR9z5IkJNx/FPrfYxzki4jzrez1emJ9pA9ppLg67Zwrq8fPEjedoE8jUu/vN8xS/86+vO86dw31qhJ/HuucUxlTXZrdg6NQ4dVseT54L/Xs3z/1Q7M+N2a7v1J86MP74LDznH87vjsd8nnumoM5+NrFP5vzXjc1u/ujs2sXC3CJE9nvue+7Pb57PWKevMW66Hb4sxwVXHL/Mcd18nc8/tGBhyJAhQ4YMGTJkyJAhQ4YMGfJ65NUTwgQ+DBQZUCbIEpKm6vvdhd1ut4CL3h0VAPrx8fHFLjSDd9QnkuskVwhuRk/udpkjENiOd8QYECRw6iMWac98z+5Fg+kkfQiEcec062Of+M+7xzpCuiPLvDvJIKV3dbA866I/2Xb0NfnV7fShXWw/EiEduE+C1X3JfbRDyCkCjB0wSB8wpryzyjYwseZr3Tu0bdOuX/SJd9B7l5j9Y4KRRBztlbJ+1zFtyb+2Ne/J2CeIv1wu6/r6ujabzVF8sl37jrsGI7kvpBVjln25uLio5XJZy+Vyese5bWQQuFtMQn96jLm+/NbtliKZzVjLfRyr3AU8RxTMgeMdGeB45Jj076w7x0I/PT3VZrOpb775ps7Pz+vi4qLu7+8n4je2Pjs7q++++27aHXx2djbtdD0cDvXx48eJEP78+fPRLuDYze/SzhzRkfAdeeP861MHHLf0eed7xhx97PnQY985s/Nn+h7bpd3MvXy/ssdybLbZbKZ3D5+fn087r3e7Xd3e3k7veOY8wDoj8RUXUKQ/XZ44FUPO6/zLe3hfnifYHndVelGEn1c6Ior6eBGS/UOb+LnItnD/3Vff0+XzLr8wlh0P1NEEtH3kfJh7mYsYE10O6J6FqIPnKvvT/eJcmD7M2cDtzNXPdmivLjfSlskJXbywTYufc9gGc3vqZS5jHe4ndXOM0+f8PucXSkdkzs3Z9HunLz93c/IP2dLjhfozR/iZtetHYskLnjw+3K5zIJ9P3Qbzr+sZMmTIkCFDhgwZMmTIkCFDhrxe+YUghKu+JyBIrhiE566x/Mbdtt6NxDa4+zA7oQjmECAiKBVdOmArJFL04g7G/M2//X4/Ha1pUJdAP/sbMIiEBAH6gPbUx6SCjw42EBzdU3euzYHesY/BrDmgkGQF6yIBkzbTJ9ZvoJXxQX1IaHUAdgeqd8CkAWOCiSQrbRe+W5rAP0lUAnvcqc1yjA3/5nfx0ca+Hv1TxragPizTkVaJ7fTNgGm3UIL6GNDl4gy2bX/QV/7uMWCA1iD3+fn5RFxxh1z+po4cLZ86QnRxl2lswM/sB/t/cXEx/QvJZbu7f85h9E1HCLGvzCm2Me3bjSETQR5D9jHvM3nD/liSq0MAMhfn/uRVHvP+5s2bevv2bVV9yR+73e7FPHB1dVWfP3+uqpry8fPzc2232ymXpq6f/exnkz5z+TFtd3Gcuu07268jVyxetNPlJ+Yh6kx97Efncc97i8ViIs/ZBhfA0C6x/WazmYjb3B8CI3Jzc1NXV1f17bff1sePH49yXsrlb44ADyF/fn5+NGd3/2z3jtjJ77SN80f3u7+TmHF79LVPK7m4uHiRlxw3lO4Zo5un3C/n0rmy9GWXV11fF2P8bIKXNkq5jggnQZ32rZf16/IV9Z3rq8t0C2p+KHfRBxyrnu8911LoS85Znd6OVRK9jlOTkhT6r3sO6555PPdTJ9qKc47ncMd3N5fM5VPW6TYdS5xLOltzgZTzum04l1c6e7Acc41j0ePX8y9flcHf/cxLGw4ZMmTIkCFDhgwZMmTIkCFDXre8ekI4YgDMwFqAkQBGJkYJTIa0C4HHug1c5v6qekG4dSAp6zBRQCDLoOFisZgAc7ZDUpXgTwfIGbg2WBs7dOR1CL2QyybMSepQ2KZ3m/H3bkdE7jGIRpI6dvFuHRMS7pPJlpTpQF/7NL9z5x776eOBDQzGnj6u2uXY9+4obe5KJXCZuDAYmDJZ0NABnAY2GUOOzW4XOMcCgU4SyOlL9/scCfXzgvce5/avd7h248XvP6yqWq1WdXl5eURAWt/0//n5udbrdb17966ur68ncvJwONRut5vKfv78ue7v76d48fgPUB1beucp45GxYuC+Ixdoc/vZY3iOFHCeSt9NmND+JLUp9jFjkfrEDtHFgH30DyGYMsvlsr766qtarVZVVXV3d1e73a6qvieHswM8ZVJvVU3k8dXVVVVVXV9fH+1mzZiKrxlTni/ym/OocyrzH+1I8tX+YluMR9rZi6VMSFA/CnXiPMpjk5nfooP9d3FxUZeXl0dz2Hq9PtrZm2OjN5tN/ehHP6qqmoh6k3PJiWyHZbr51HrxN19nTqt6+W56k0muk4QT/ZN6+UxBwopziOdCjw3veHResw+75wP3N99Zv8eof+ticm6u6eYW2qeblzluYls+D6VuE80eW+5fN0ZtE/vFv7mPHu+MRT8XsbzrYTseS7aly1GH/E5bz/WbJ7p0uYt+o01ZNmOTzyDdWGEsdzaYex5gbPua85HtYf9Rh+4ZJPd4PNEGjJHuCGjXRX3Srp9TqT9zgf3KfvMVCuzjkCFDhgwZMmTIkCFDhgwZMuQXQ149IUyAq9uVlF1eIV0IBBsk6gAnA1+pK8eOEnQ3cM82/J2Ajt/bRjAuO9ICfhJ0Yru2Re4nWGmQNP1K3Z1tXd7vLyYQRRuwHwTmCNwT2DKQHF+xn/mNn71zNqSM9Xc71KXbGeo4sJ+iq0FJg/IECAnmGfBOfSRcWIZ2ZfsGtG1D3jfXt1zn0eFd2/ns97OyT+wLbcq4zG7X/X5/dK93wNvGvk5Sttu1xTiOkAgjIca4YswnDjPW53ID9dlsNvX+/ftar9e13W7r/v5+Ovo5xOJqtap3797V5eVl3d7e1sPDwwvy5+zsbCIc045PQuiAYfuBIDeP/M53xi3JEwLjjN3cZ4Kis0037ijOl7apfZkyJIbnchtj8v379/X+/fuJiP/48eNEFJ+fn9ft7e20GzM2Yp6PL3L89NXVVa3X67q/v5/djUafnep/58MuLplzTdB4HHpsMncyxpz3ulxn/9DGOc58tVodkW9z7a3X62l3MInz8/PzWq/Xk90znm5vb2uz2dTXX39dVV9I4Y5kygKbjJvEZ7e4I/HfkVCn/MA6uHiq6vgYe9aRspyDumcCkzzsn18rEVv6aHy26Xkq9eV5yO12zy3eWWgikbbgfc7N0ct5lf1hGfepe2bK97SV73PzpvvG9vzb3PNJN8ZcZ5cHPK97jKUsbcH+sn/2L8eC/X1qnqLtHefMpex7t3DE+jFuTsU0SX7q7r77u08mYb8cL7S35zLWydNL2CfW4/zrMeuFWvSDn8HoP+vSzaddvLmtU7HqOBgyZMiQIUOGDBkyZMiQIUOGvG559YQwxcBQwFTvliN4Y7BzDqwicJOy3AnqIyHZlkFyg0IGl7hDmccwexecQUiCjiZK53a4pB3eGyLEx0XTFgQkq+roGG2W7YDwDsCMvwiwEzSjTwz8LhaLIwIjfc4xpOmzAekOsObnjoSZAz9zzYAl28nfx8fHF8dZ024d6OkYMJDd2dllOp8wntlP2p7HcRu0pk857giCu+20y+uOs6qq/X5/RLrQJt0OOB43m/oMuncx6aPL+fvj4+NEGoYcTPsk7iPL5bKurq7q6empPn78WHd3dxNhlpyRXcLZFZm67u7ujo7NjR3TdsZmBxp3fnG/eY8XjnR1zREm3VjyooYu11ESVx0hMNcP+ouEHP3qGFosFnV1dVW/8iu/Mvllu93Ww8PDRNLnSO+bm5tpp/BisZh8E7Izfnt4eKizs7N69+5dffr0afLLcrmc4nCx+P54aZ5GMSe2s/O8c5LnFO8sqzrepdaRF7R7p183x8TO9HtigXOp56r8Xa/XtVwua7vd1mq1mnYFVx0vFLm4uKjNZlO3t7e13W7r+vq6fvzjH9dut6u7u7ujOaojPUwIu69dLp+zw1z+T51eIMXfujzOelm/51br1o1Dj7fuecJ99+9z87vnsC538x7r1l3jvNnFTfe7+9XV537+kF1tk7RFHTyeOPfwOcV6eP6nfTuf0Q8cU8l1tG+XJ+yPbiFPN1/Sd9SX9XQ+dx/43JZnIC6s8VjpclU3T3S+7Pzl8cK2uvsYS9281S2e6+xt2ztuurHL9mhbL7T08+5c/Hqedq5Kez4RYciQIUOGDBkyZMiQIUOGDBnyeuXVE8IkcAwaVr0ksUIS5ToBMQIvfJ9wiByCKgTRuPOBAKB3SkVYPqQlwcjsnDRx1xE4Bhy9U4l2cTsE/Kjjcrmcjj4NsOedvbR/6l4svuzy5A6UCG1JmxO8CjCWttyXlOVxxNTToLUJJ9uEYJptwOuOqTmA3+Bn93632J99Y7ykXAdyRrqdRQQyudPHgK2PZk773bhJ/bYHY4j9zRjpYpbAv3fXsU3bz0Do3M6dU8e5ztmHtravadflcjmRgxGPx7SzWq1qs9lUVdV2u51I7dVqVVdXV/Xx48ejfj08PFRV1eXl5bT71AtWYquMRdrRgD6F/kquYR9ZJm3RjpTYyaTFXN7t9KiaP2GA7ZwipNknxibJP+eBr776qs7Pz+vh4WGK/8Tp27dvp3c539/f1/Pzc71582aqY71e13q9rouLi7q/v6/D4cux32/evKmvv/66fvrTn9Z2uz2yzw/lV/ZlLv940QzLe04xmZK/PmKcf02UkHQKwR09PI9x/GX3NP3Iv8zVzk2LxaLevHlT9/f3tVh8Ie4Ph8PRWFiv1/Xw8FCfP3+ur7/+ut69ezf5q6qOjlsnyXJ29uX90vv9vp0DaDd+notJ3s/vtJvtyVjI7yY9mWc8jj1PdfrRZ12MePxYZ+ptcd/4vNPZwXFoW3BucD7hNdvKv5lQpA2oxxyZ6RzihSWu1/3rxvGpcWUdIq7HOZVjzbFH8TV+90Ih1t/Z1vnIdXR5iQuxPB90z26833HUjRnWTeKZ9XZjuYunH7Jd+shnUtbJmPLvfNawLt2zZBdP6Yvfa9zZ1PqzjOdRz0VDhgwZMmTIkCFDhgwZMmTIkNcrr54QDnDSAacEVwhopSyJuTnw04BLgBXuEOROWgJeHfFBnZ6fn+vi4qKWy+URYZbjLwmi5l4DZnNgpgGoELUpR1KRpAHbOhwOR/YxWRGAj0dZsw3XZ/u7DduJ5LLBwg687XYaGZA1+dIdIZ5y9GfKE6hmv+2jOVuEpOFn7y7vdtAkLmxXg+SM7cViMRE78RN9Z+CZtqCdTLByHLDPVce7mDtdO4LEJEV0yI7LzhYGxztd+NmgPtvn/Y6BjM/0tyMZaB/uIs5xuvmbd9oul8u6ubmp1Wo1HSF9fn4+EWEElfMu3LTp3Vz8Z9Jiztf5zfawfW1LSmc7AvY/5Ce3Y0KCJwR00r23NuVzWsHZ2Vl9/fXXdXNzU1VfCPrPnz9PRxMz/2QueHh4qPV6XU9PTxPxW1X16dOn2m63R4T2+/fv6+3bt/XTn/60np+fjxbysH/d5zkf0bcePz80P3lcmTxwPmP+Z77yHGBihT7w+OVnn9qQcVD1JU9sNpu6vLyciODVajXtDn58fKzPnz8fvc/5w4cP0/uHb29vjxY4VR0Then/xcXFESnc2SrSEUanytkWGVuniBva03kj7dnm1CVtdGOe+rKt7trcGEyOMKl06pmo67Ofv6rqhd7MzXNkXZcbaCfmqcypvr/73vWhe07jb/SB/eI+RUzIuk/dAhvWObcIaW4RkBcI8L4uVro5oMsBzuNsoyPOO1vzSHde59zBGHGZbtHf3POSY5r6dDHQ3ZcyjI30N/Vxh7jnQT9LMT5Yhgu2TulqP1GPLvboh0EGDxkyZMiQIUOGDBkyZMiQIb848uoJYa+i78CZEK4EYrlTMvdml1lIHQK8rH+5XM4Cad0OTIOM2dX6Q4DVXD9ThoBTR4IZNDV4ZELTtiMI14Gr0SsEdsREKEnybtcs7UAiyEet5jNBVAKrc7uNSN53NjQ4S7uaCIntvFvc9Xb3uh8G8jrgloTRHKjLPnegKYmE2DX+Oj8/n3aE039um9epC8kYi/UMUUebd8RHyidGveChA6DpW9bto9ZJhrpdj6fD4QtJlR2ibjffuaDBizmurq5qsVjU9fV1PT4+1sXFxXQcblVNOyD3+32t1+ujRSrxXe5JbmIZ9zf3nSIPSdJw3EcMWjMHGqD29dzfgfoU7+azP0/FRXJO8gPzKcngd+/e1bt37yZf3d/fT/7KDtK7u7uJiMz1ELu73a5+9rOf1bt37+ru7u7ofc77/b6ur6/rJz/5SX333XfTTnD332PR0pEtXc5jvbYH8zNzoseB20t55yrn5+5v7o0vohcXL/D91IvFYhpLJHJub29rtVrV5eXl5MNvvvlm2jX88PBwVGfVlzFzd3f3Is44L+Rzdgmz77Ylc4jtazKQBBSJLj8j8DPrJIHUEWSdn6pe7oql3+fadBymPybkPMd4/ur6RftQn7n5k/W4Dc6BczuXu/zkNjr9OLf7WYT3ey47HA7Tke8sw3KxpfNl6vdCO9qJ+joXdrrNzfmdba2nf3M/555TPB/mmm3iccP4c6x5nnbMJGd4HvQCJj/LOSaZf5zzunlnjtzmZ48ljrFT74Oe86Pzg+PdudjXunmCMeh+DBkyZMiQIUOGDBkyZMiQIUN+MeQlS/PKhKAmd1p6J+Lz8/PRu1sJjpno4rGtBGz4bt+qL6RA3ulp4CYkRdonEBdgcrH4soMzgHd+83vjAk5yp3MIPt5vkLAD9PgbQX1ejy3n7Jsyc8BybO/d0rFhBwpyZw/b8w6Zv15QLHoyJlIuvxGsy3cTZvaPdztRTx+jauKF/rcO9htBV4OK7JvBaNqWdre92B8Dn1Xfv4ebgDB9ZEmdrs8EpYFg+otEX2LcO307wJb6mUDp4sW/UUggRNd89tiIfXMsdHaabrfbevfu3bTLtOoLmXV9fT29R5VjY7VatUcqV9VEgDJevPCCtuBu5m68kNQgWO9Y4D3dWOBn9oWkQNrriAyTCh2J1LVJ3eibxeIL8fj27du6vr6uu7u7Ojv78n7mh4eHqdx+v59I4O12OxGMWQiUnauR8/Pzevv27fTe28TlN998U998882L3JM49kIVyxzR5XHY2aEjfeg7j9luPHSLK075mXNqV455g7/lXc0PDw+TfzabTW232/ruu+/q22+/rfv7+7q7u6sPHz7U/f19vXnzZjrq+/z8vL766qvp1ADvIM/uY5I0zI+Uufjq4o85uCN8TMDM1du9R9okFu9jvcypVd/vjufY7Yisjoyj37p5viPcurHJNkxqec7qfqcNPN84hv27c5wX7tHOXiBFGzM2urnWRB7r8nOkfd7123737+6P7e7n1Dl7Wve5hXK0mfXyGGGfbT/X4blnjjC3DagfX9mSNujHzu705ZxtMr85HthP24U5kWOyi8tuHHTxYV+xDtfD8nxG7WzVLahwrhgyZMiQIUOGDBkyZMiQIUOGvG559TuEs2uuO0LUJFTIX4OMBO5DCHAHb9UxwRESNoC8wSgfvdsBuyTA/L5ik4cGxarm348X4Mc7lNNW6jLJ1+1syRHFbKcDwA2OkryirnO7Gg22Rnh8rgnebhdjR6DQdgQVO9Azx5kaxHN52tEg3hyBaiDeYKFjjUD9HEGR7x0gSNDXvnO/TwGK6dPz88ujrR2Tfocry0cX264DlGkz+rvzgwFU+r1ri/qxPfs735Nb4teQgblnuVxObeQ42+w4DeEbYtE7nlarVR0Oh/r8+XM9PDzUmzdv6vr6ejoOl+9fJRnM9/x2faPvIgbvHQsGuOkvxhPb5T/vsPJO1W7HlMemx0L6fir+2W7iOEcRLxZf3kubY7ffvXtXVTUdC71er1/saH18fKy7u7ujayEhc+/FxUXtdrv69OlTff311/Wrv/qr03tuOS7Y5zlAnnawnXON80d3j+uznexrkhenSCFfs++y8IXzBWNsv99PYyendOx2u9psNtP8GX32+/108sanT5+m3ZnpPxdCZH7Z7XZHC3gyRucWETH+us/sq+O96vvdi7aRiXz7KH5g/nM7HhtV378f2f6wvo4D+73rT5cPuvo7G/o5o9OFpNtcnpmbmzqdmK9PzWduJ+W94MzjrYsB2yR1cWFgN/9YT37P/Zy3uzYYH44p25F5olu4Fenm/q7u7pkk49h1OB/PzS+0pxc0uS3e42c9zzXd+O2eOSjdWOtOfDnlA+udv3zGjZjI72ze1RW9bJPEc5ejvIjAc8iQIUOGDBkyZMiQIUOGDBky5PXLqyeEq14CczyyNRKAKsfjEuTtjmnsyBCCMwTPTC4Z4CeRZZDYwBkBIxOdfpfoHADLPuc3XuuIBhMwtB917XZWkNAhYGpwNte4M2du91FHduQaQTeCewQKvWODfjWQZqCR9uVuM5Kcfvc06+4AR7bP+0juzdmW4HkHknftGST3kYYmhEi48LqBZ8c4y5Fk6HY+d0SA+xGQnLtxDbp7sQP9w1joSEjbdA4QJ5HAfvHIV5ePrk9PTxMRmf5x5/Nut6urq6vp/aabzabW6/X0HuHlcnk01mn3EJS73e6FrwmQG9ynH1gvy83dZzEp0ZXpCKEuH/D3zk+dDibgGG+LxaI2m83kt7dv39bt7W1tNptpF2lihX83m810P8dziMzcu91upzLb7Xby5U9+8pP6a3/tr9Xnz5+P4jM51uQPhX339W6hjOeO3NuRdPZZR152bc7ZvtOVi7HOzs6mHf30e0jcfN9ut9M4qfqyOz4+zOkaj4+PE0n88PBQVTWRwBkDnv88nruYtv4duTNnTy+GcP5zDmfOrzp+96vneo9RCnOZ52LPv5z/7E/33ws5Uo6kMfvi8dnNmbR5lx84r3b6817q2JF71JllnV+8uCR942I26+o5175PO/FFR767zyYxGV9zubobk53/qY/95PFs/3Rx2PW182V+5871OV38XGF97B/LnO1trzk9vYAhbUU3P2t144Z5obMx9e6eO/w7dejmaPuOR5k7B3mMOJ8NGTJkyJAhQ4YMGTJkyJAhQ16/vHpCOMC/QReSqQYqSa7knohBw+waMzDEHWkm0vI+SZMVuceAZ3TyjrL073D4fudBt0uS/YwQ2Mp3tsNyBoGt2xxI1hEfJOI6QL07otJ1cseqd/a4XddFMDPte2dy/hm4ZB3pk4H62IhkkglokkC0JW10iozJvem/Yzu6O/YifI+1d1Z1AL5t0Nk2erMvjEWDloxbgrtZjEEAlOOE9rLPKfY12+782tXDvtHusW12B3cE0RzRl9MDGHPb7bZWq9Vkl+SV5+cvJxL88i//cq1Wq9rtdnV/fz8tWnl6ejrabc/YZF5i7M7tyurIBNbZ7f6ay5tzBJnt6hh3fuGYYRwyh3TAPsdZSB3m1byj+ezsbCIS45f1ej3Zd71eT/VdXl5ObYbozW7ws7OzaUfxZrOph4eHWiwW9enTp/r8+fNEFl9eXtZ2u63tdjudNmA/nJKOHDHR4fmsa4PjgO/x7fToxt4pvzhfcCykPcY4f9/tdpOfbm5uarfbVVXVzc3NFP85Hvrm5qbOz89rv99P7xi+u7urT58+Te/lTps5yYKvafAcaxt3JNopP80Rtsz3zBMcSyTC/UzABVhsu5tXPM7y+6l8xz7zOxe25Jo/dzbpckt33WPX8drZ0eXzdy52mQ9T1rr7fs/9zlVe/EPdOeexbj//VNXRYqCOlPNcZ0KQi1K6/Go9qGfnx26u68bA3HNJ56M5EtzPsNaf+pmod5zPzU2pf07nzma8xjb5jOl8R5vRN1584rZzfe5ZyrHa+aKLv+5Zy2PVOaLTcciQIUOGDBkyZMiQIUOGDBnyeuXVE8Je3Z9rBvwifOevSbwO1CRhUlUTSUDgN7uMD4fDdOQ0AXXWY2CJAI+BZQJmLB85BTib9J0D3bKji+27DZJfPjaTbbLO2Npl89fAHN+xaFA/nzsgtwNeOxDV9fD3kHMGKvPZO0cI6Kdt2iJ+8k6tHKlK0ssx0QHc3tnBhQi2C49PN5DbgdMdIMkY4fGY9JmPmfY7l38ecD/1e0xQB5KDXFBhMoD9NLjf7dqjbdiWYyt1sP/sT+yQd6ReXFzU27dv6+Hhob799ts6OzubiK/VanW0Ezg7hM/Pz2u73daHDx/q9vb2aAwxHpNbolt05pj07nmT8bSXSSj2rSMqaF/mJdrU/u/AcuZO5jaOle5e1lH1/U6px8fHiYDNDurr6+uq+nLE836/r8vLy+mdtSHd9/v95IOqmkjki4uLevPmTT0/P0/vIN7v9xP5e3Z2VtfX19Nu1efn57q+vq79fn9EevrfDwlt7LnBJEln95SzD/PZi0O6+c02ZhsmlbJYgfnTcVFVR0c8553N7969q/Pz87q/v5/mz/h/uVzW1dVV3d7e1na7rZubmzo7O6v7+/sp3v2ahcPhML0TmvrPxV/XR8+znc1NVNH+vH+OrLVtOP/aH9aT+Tf35rvnjJR3fLC/Hcntz66DOT/iPOC2HIe2BZ9POtvzWqery7KtU/33c5j1999TseTrtFOXG+2j6MHngi53+BmDc/hcfvBY7/Iqf+8WwZ0aN/nLZ8y5Z9VuPJ0aj35W9Lz4Q3blsxjHuOeZOfuZjPZYsH+7+dI29qI82tj2dgwvFt8vkmScedED5RRxPmTIkCFDhgwZMmTIkCFDhgx5ffLqCWGCYgRHDGbye8ATHk9rAMdgWCT3BpgOCWNQNGKQqdtVGRCQwGdAZQKdPw8hQ6JosVi8IOrYXoB8isFmg12xH4EsgmI+Vjv3nQKk7BfWZ4AxfQ8wRr+nvwTr+DvBwti3A0+tbwdex370LePBfU8576rxP/oh7y5lzPB+gqP2GX3Oet22dyoRmKd/co/JaI8ZA6Luv9ujvt6dZbCc4jY7gNnl6AODwd2Y5Q7h+DbH2MYn2ambcvf397Ver6d3CS8Wi1qtVtPRt4vFoq6vr+vm5qY+fPgw+fj29rZub2+PbNSRR45t+pL65zfuFuc9tEnu8SISxmUHxHvsELynzgbfaX+KxzJzQqcz/RdiPWRhjhSuqomov7i4mIj7LFbZ7/fTvSF0syN1v99PRxrv9/u6vb2tt2/fTjuAExOxbd7/fHd3d2QLEw6ddISJCYIu/9punA+Z4+xb+2duJyO/2/axd+qJ7RNz0TO2yk7e3W43kaBVVXd3d9Ou6x/96Ef1/v37Wq1W0/HcWWBxOBymHd4ZeyRfaYfYJ2W6d3ueikHbimPS5FB+d55mOyS9cl+3y9O6cVzRJ93iDj4T+Fmh6wvrtp8937If3bzouYu26Qi76DHX71N5yve73lP1zM0Pzn/d73NzhnXyM6hJPdabv50dXd7zZNruYutwOEzjrYszz93dsy/nGi8opH72I+1xql7GHed8/vMzjQnazk/2b2d39q3TO/fEhmm762fngzmx3bs44XOT2+QCsKqXi1ectzmG/Qw1ZMiQIUOGDBkyZMiQIUOGDHmd8uoJYZI1+R5wiTs7udMvIErKmPQlEJ97c8xoyIOUM9hmUIc6RLjrcg6wI6hMcif3RT+TQ9Ev3wloEUjju/MIThnkym5Q9qcjiqhHfoseBstpqw4wJeBNX6VOkvImpA2UEdAkaG7wL/0iycy4oT3oz85mBgRJvh8Oh4mMop4GPk1mdzvG7H8vcDBQzkUMHCsdiZv+ZVczAVvaJOK+0xf8nbqwbNqhn+Zs2gHz3ThMO6mnA7UNuHekKD9nl7zHWL4/Pj5OxxQ/Pz/X4+PjtBs417MrNTtVcxzxu3fv6rvvvqvF4guxTB290CN5zO/ApM18LKzt5+sdeZu/BusdW64r9bFNx6Vt39m7G0/pG48mZm748OFDvXnzZiKFV6tVbTabqqqJnK+qur6+rsfHx4nAXa1W9bOf/azOzs5qtVpN77E9Pz+v1WpVh8Ohbm5uar1eH+1sPxwO027jm5ub+vbbb6f36M6RCe5PR1pYTAw7hvOZPvIcYt/5dQi0v++lJOapFxfEpN4Q8ff393VxcVHX19f1/PzltQrxI4+K5gkH6/W6np+fa7Va1cPDw9GR3N2YJ/FBEtj9c57gP/ed86XnqarTC1Xoq7mFZSnT2b8jmdi+dexygMepY6B77nCZ7jUXXrBDcdxwzqTNTex5DqSOnMM9/3Xj59RcxIVntFNnF9fja7ZpN1Yozpn0JePXbVq655xcZ5+6uqyn7c36rRP19Os8utiZs5t96sVK1MGf/RoK9snPL7n3h8abPzs+5+LUc/LcnOj4yj2085yOfPZwnmNdtPkcUTxkyJAhQ4YMGTJkyJAhQ4YMef3y6glhEoJzOyYjJFQJmBA4SZ0pR9Cxql6AYNxd7Gu5zvemEqzje2KrjnfKkuDIb11dBKcCDIVwPHWU7BwImX85jpW24L0BnrzLmESpdzkY3GWf+c8APSU7y2jjAITun4Fz/m7A0v7vAFMDlN6t0gHnERJqAUFDaBHYZz86EI9AcLcLzQBnB8CbBIh+qTd/GaMdYEtws9tB6jq7PlGvDoxnuQ4c930duM12vJPQsdABvFkUwd2IHaAbW6XfIcPW63VVfXmHasZnSLCqmshG5yuSLyS5suvSO/0MOrOOjnigXT3mGJMdMO+86JzGsc+6fohUMajuMow59pkLHT5+/Fj/y//yv9Qv/dIvHe0iXSwW05H/8ctqtZreSXt5eVnv37+fyMrtdlsPDw+12Wzq+fm5ttttnZ19OeJ3v9/X8/Nz3d/f1+FwqKurqzo7O6uf/exnExlM25zandXZofMN/eExzOs8ucB1028kqRnXczanflnAke9813bqyq7g5+fn6bjo9+/f19nZWW2323p6epqI+rwr+HA41MePH+tw+EK+5yjw9+/fT7vo845uxhzf280x4Hd8Wxw7vN7lNucm5zPGr33GfGJSib7hgi+Ovbkxx3gwqUofds8TJpRYvou1boGBbWY7sp9dzvUiLeYz6+M8Z+Ir4tcmuM/MVXNzdvfs4JzbxYHnFrfBuYPHrXfzMu/x3OZ4YJxZFz/HsS733b53jqF+jlH7tlvIxs/sO+t2bPI+k+YUz0FdX9iGFxwyl7Gs9ep+7+ZdfuZf+8xyym6OdQrzOO+xHYcMGTJkyJAhQ4YMGTJkyJAhr1dePSE8BxyRZPVu4ez6MnGb3wg68XpA1QgBKZK9JCtSjkAdQSMCSyF5DHyyjTmw1GCadxHbRrGL+2lbGMRmPWnDQDNBPpPXBpXnwPMOMCOATJubsGMbBtB5H+3D3wm6dWQWy9ovpwDiANgd6OidPp2taN+Usf60zQ/tDmS7HAv2L/tDnzFeuAPaICpt0BEhjgMT5CZx5+KZusyB5gb02TfbM8RryniMMBfk6OEQZY+PjxNJuF6vj3ZAp/28jzZtnJ2dTbshSaYH4M1YytG8HUlPu58Cjjtw3ItWTIYwHunDblycAtCpk3dFBZyfE+rl4/CZTz9+/Fjb7bbW63VtNpt6eHioq6uryRfxRwjexMVms5mOnM67iHMyRHTL2M3R0dHh48eP9Ru/8RvTKQ0dOei+WJz/up1eHdlgcoQ5+IfIDM6Vro/xaj1NMoWIyakUJlsOh8O0YztHq69Wq3p8fJyOVw8Jfzgcpl3emRvZ38fHx+n4dvaZujpn28YdsdQRQJ10uc1zltt3LrKY7Onm9bm/sfdcv7vnEed05/w50s36eo70zsqO2Mrilq6f3TMBSb5O7HPPDV0+8zOK+9rNVWzPuS/X2beq749W93zsMeq8bcLai/98D+OQtqVfUtYLP5LX5uzKPtuueX7I527e8HNkZzvWZ9vYTuyf457PhaybMrdIKddij+73TjfHrp+LbMturHbzGPvO9rpFBPRvVU0+8fHyQ4YMGTJkyJAhQ4YMGTJkyJDXLa+eEA5BUlVHgFPEoDeBMO4e8i6hjrwwwWIAykCWd+P4u3e2kmwgeGwdO+CbACHJ4IjfhRbbuSyPxCWo+kPEZMpwFyXLp1x2+JrcsL07gGsOGJvb/UC7hTReLBbTOyipe8rT9vQr2zVZ6zZNTAfINghKUs8EdndEL99V7dhxvbEX2zUg6fiKf7K7j2ByJERXZzPX7VjsgFoD+dSFNu7ixYSoCYmOUOGY7/6yfdrIixpsE4KwPi6Y77fNu2rPzs7q7du3tdvtarlcTu+s5Q7W+CE+5THF5+fntVwua7vdvsgHHbFE4bgiwL5YLI4WxHSAd+6njhxnjD3GR/rQ5cKUO7WggNKRKOxXxvqnT5/qw4cPdXZ2Vh8+fKirq6v6nd/5nTo7O6s3b97Umzdv6u3bt3V2dlZXV1dHO7uXy+XUn91ud0TEcwHK4XCoDx8+1IcPH+qnP/1p3d3dTbGT8vv9/uiduRb7jTZnzjZJ0MV36nOZ6Eriyws+mOc87mx/jr18T4ymbua/1WpVNzc3VVXTUenv37+f8sJqtardbld3d3f1+fPno8USDw8P01He19fX9fnz56M+eY7xu90dR7QPc739wLK8PuejuTnFNup+m5truz54PHZ52nFBX+We7lpHpHY5u9PNC8s8f7usbe5+uJ/sR7fgi8K6ujzIWPdv3XNJ1ffPEV2bXR9ZH8vwL/VkHPL0EBPn9o/nPMdVpJtTE5O+3o0Zjvsu11MX5xPGfkfUdu25jx6zbpN96mLfJHAXN/aj++SYcS7g71X1wnfOFfQNn/t44gL969ik3l5AkH7+0EKUIUOGDBkyZMiQIUOGDBkyZMjrkldPCHfkaK4bpCGoxft5nWBWRzYQHKr6HnTzrsYOOI50YNbhcJhIg44kJIgV4o4ANMnF1EsbeOcPyaZcI2kRUMrAMe8LWNmBXQEMO9Az9XQ76AzIdWA3y5GY8I6O2CC2om2qjknVAGreAT7nCwLltLtjkBIf07b0DX3mutNXAoc+NpW/U5/uuPA50NdkhsFl7qbkdfsuffT4JJjruDHo2gHc7oe/Zyx67BL47uogcGqb5LeQTbEBSeLYOWTW27dv63D48h7U2JXk7sPDQ93c3Ex2Oj8/r0+fPtVut6vD4TARZPSLie6cKBC9vfvKpI0BYS5WoLAOjo/Y1wsODPDbhibuuIij8zPjxeJ8FPFu4egdf33+/Ln2+/1E7n777bdVVXVzc1Pv37+vH/3oR3VxcVGr1Wpq5+rqanon9Ha7rdvb2+kdtvf397Xb7er29rbu7u6mI6RJRkYnLuTo+mJCh75hf+ds0o0FLwRhW54rSQZ5Dulyb2KZ5UwOkbhI2dj3cPiy+3ez2dTHjx+nOqu+Pzr68vJysltse319XXd3d/Xx48fa7XZHi1OYSzPWu1g0WZJrJol4zeODv1cdL7aiPViXx6J18fzZ5b05/3XStcVr3cIW18+FQY4v2rCrI/c7hm2f7tnI8es26fMf6rfr7fS0Hn5+Ynvd84l1nZvfkj+79nxajW3N9nx/t+grZTgHc0z6OYHzh9vhHB89/O5xLrhjnb6f88VcXHhM+34+J5jsPBUbtBnJ/XxPPxhjth370+WMqnrRB/rQC3L43EGbeZFjl4e7fiVeWd5z9JAhQ4YMGTJkyJAhQ4YMGTLkdcurJ4QDfPi9YQRevFshwvIEe6rqaNcEr6VNE8lp5+npaTqOlOCRQRoDiSaYOyB6DoDlbr1cc98NmhmYy31+nzHvcbveCULy0iRErhm4jI5zgHO+G6R1n2ib7og876AhcWRCn/cYlCP4l3ttB4PYJCk62xIENCBrYDrlDFBaXwOpucdH2RpgnwMeCcLad4fD4YgIc2zkGkHXLi5dL9v1+PFurcVi0dqX9iKAz/5655Rjbq6egPiJt+fn51oul7VarWq1Wk3vUGUuCbnF3b1pY7VaHZXluFgul9P9JDtDeHb+miNb7OPO7l2+pJwiJ7JDOnGfekmcmzjo6rVu+c48l3KxFXf/X1xc1PX19RSPm81mOqJ4t9vV/f19ffr0qW5vb+unP/1pVVWt1+s6Ozubjjauqnp4eKj9fl+3t7cTsczj9BeLxXQMdUj6kJkdAeT+OPd1OcTl+PscUeAynLdYt9thbpgjEmJrzlEc31yEk2Ofn56earVa1fX1dW02m/rw4UPd3t5ObT48PNR6vZ6O6049qWu73dbPfvazenh4OFqokHLMX3O74joCh88MtIHntDn7Ou/P2cu+sK85hpi7c5/1oP7d/MX2TGT5eaMbj9085UVcHXHl3YzOD1XHC4M6AquzX9o7daQ8yzrPmSykj7sx4YWDnoNp11PPJB5njNNTBGx33f2iPf0MYtLXi7G6sWDxOPPiL/51TNF2c+11z0FcIJk+8AQf+sG+oK/cjscX4/eHcqLHH7934+ZUvY6Fzp4cO75nLm/4+Y0LY/z8PmTIkCFDhgwZMmTIkCFDhgx5vfLqCeGsxucupICRIScIRs2RDXxnWLejy+CmgZuQM1XfA1ZpIyTBbreb1SH3mFzkMXskIFKuI4NMps2BjCZi/O5V1uedo7F5t+PDwGOkI06tB+1GApM7kSn8Hj3tpw4843WDZR1B2oGDJqc7sNTAOO04p1fi1n3jPQSmCRwSGE5ffggIZbx451/uZXnv+GRc2J4mqb3jxuB4B5zmOo+jjS28E9Dx5Fj0uJsD9RkjXYyGnPWYv7y8rMvLyyPiPTuCs3Aju7vv7u6q6gvhuFgs6s2bN9ORuRnX0S/fl8vlEaF6cXFR2+32yF5dX3KdMeG+Ot4du24j9o2Y6GVMcNwzz5jE/3mERGv+XlxcHBGSZ2dfjhe+urqqd+/e1fX1da1Wq4nE3G63k18eHh7q9va2Hh4e6sOHDy9OPYiej4+Pk3+rvj8i++npqbbbbRtb9Mec2FZeXBGZi9UfqrsjHbr8TB1OSezdLTrg8fwZI7vdri4uLurx8bG2221tNps6Ozub3pUd33FHPBdL5NjoDx8+1Ha7fXGKwxwRc6ofJmAcsx4rVS/fmd7lZ+ZS2oZzk3W3//yswTL2XedfzsNsy/ZiHrU9aKcur1v/ufyQ+6yHfWV9OkJ/joR1u57//RzA+udI0m7cWTrd3EfbsPvdZSldDnCd/tfl/26cxw5+3mGZ7rnIOnsumYtLfuZCPC60jC07m3R9T12cZ9iW+0N9/WzC+xgrJu0dtzz5o9PV9vb8Sj38rGObkeRlHSTBPXbS17nFPUOGDBkyZMiQIUOGDBkyZMiQ1yWvnhDuQJuOCDFIlevdkcckFggABVTpjgUN6JKduiZUA874HZ0pazLaYJh3DRHs4ZGVaSPgEckX7qoMkESChvVGbwK6BK6oo3ePdnXRX6yH70XudmjFPvSB+0+imTsTvRvO7+XrdpUbVCNBSr+SEGAMcRckwVm/341xaRKhqj+G1MQ8bToHorMt1t/FkneKOTYp3fHc+Uzilrp0pH761pFLEe9oNhjc2c/2sm9sP+qSzyR+vLuVZMJqtTraqXV3d1eLxaJubm6m3ZEhxbKDlTnp8fGx1ut1nZ+f12azqW+//bYeHx9fEKccc3mHcOqj3eYWBDCfdX1mvzuCp9sN2MWkF4l0Pp0jQPy9A7I5jp+fn4/sH1mv17Ver2uz2dT79++nI4hj681mU4vFYiLvn5+f6/7+vh4fH2u/39fh8GWHWmJ2s9lM5GXyx8XFRf32b/923d7eTkSyxwvH3dy4tP1pX+fYqpfv4PQimq6tOWLIJBnb7fwWXdge360cfbJwIcTucrmszWZT6/V6up4Yz7jIEd3cXXx+fl7r9bpWq1V9++23L8gT9pkxkIUXnbB/p8i2XLN/ut12njfsc5NVvtckE4kiz8NzRFzu6+qn70zccd527NgO1DX+yTh0/mVO7Or0gjXb3brnHv5usY5zfQix1p0mwvjo5uDOzh4v3XzG9nkPy3r8up5Tn9m226We/kx72K72x6lFAazTC9/oiy73+5nBMc57na86W3g88T4/p/B5x+M1Mc4+J+b5bMe44mIu9ql73spf95n2zW+c8+iHPKOYGO6etYYMGTJkyJAhQ4YMGTJkyJAhr19ePSFM0DF/u1X4AW64yp73s46qmkCdEHMEVwjShPAJUWBQhzoQACXoXXUMTlGvDoDOfQS9CZoZgMq1DvBlfexbZ18Tv9adx1aTpKMt/O5c2yfCMrQLwTD2j38dByQMCDy7PROmJGG4E5RisJI2NbhKQNAgPO+hvwzUG5idq4t9SaxZRwoBUY4P1sf3VLPv9FFHLnWLB7p7TQgYRM3v0YP6ehdPRxzYBl3cMDY6wonx/Pj4OBFfsddqtZrIxpBdVTURwvv9fhq7VV/Gzv39/UTs5lji/BZ7B/SNbgGlczS1dxTPgcEdicDx73tMIjvWol/iw0QWY7UjHJ13OL55j2M19rE++UuCfb1eTzk3O7Vjb74Te7VaTbZer9fT7tbF4gu5z12vsdl6va7Hx8fpfbjeGX5qzHWxl2un4rbLLXP1RE/GjsmSufs7gqLq+1x4OHy/yCjfTaIkvvOe5Tdv3tRyuZyOFaf/clz0drudSOIQ9XyXLXMybeW5c7/ftyQXFwyxf56TaEPXwftoY5I7c88MtqtJ5Pw2NzfkO3Ojc1Y3V/OzY8z+Zp7u7uEcZf26Z4y5vnj+Yl6xDeZk7tkl3+cWwnX+8POT+0h/24Z+Fu2eYZyzqKfHI+dILkbj7yYnObdSry4WWU8X3/zddmW//J02yOdTi/S6PN+1Ofe5y1eJIbfHuPJio7m8mtc0dGOwq5t9o32qvj+JiPp6nDouaEeOO5arevlMeKpfQ4YMGTJkyJAhQ4YMGTJkyJDXK6+eEK56SeyQwDFo2oEoBJJSPoRNgKwO4DXoZfA092dnGokqg1je/VdVR2RF1z+Kd0q6jwQ35+ySPnnXoYnl7j4CewRMDWKRLOl2s3HXrndURAfbNrvUAogaOO0AXPuT9rJ0MUM/eNdV6s+/7KCLmKAJUDwH1Brk42cTph2JwxgnwZdy3Q6VDmTkbrD4qovnlF0sFi+Ovp6zE+MvY84+t078G/HYYF+7nWpdnPuzbU89q2o6Ovrx8bE+fPgwEVghtaj/crmsh4eH6X2zIR33+31tt9v6/Pnz0dHy2YlKm+x2u3p+fm5jpstTXczPgc/cOWdyzGPffsyY9a475xr64hRQ3RFBsUmAdZLNjNXYKzF7eXlZz8/P9fDwUIfD9zu2c+38/Lxubm5qt9vVdrudiPa8Rzg7W3mEf/yYna0h8mmP6DvXH1+fG+v2G8eMFxed2h3H73Ox4zLWNXa3HvE/Fy+k/hwXnfnlcPj+ZIuMhex6v729fTEP/9Zv/Vb99Kc/rYeHh3p8fDxaUJH8GUkMZm7oYqwjgmx3zz/2n78zv9A29G3VS+Jwzve8RnLLPuvyfpfTLCaXPGY5L8w9M8wt+uieW6hzZ7/I3HXq1uVk9z/PJfaFd3xSJy8Ecl/YhnPs3BzKsp6b8p0LF1y2m4vZRmdT51o+a9getpnJz/SfdugWY7Debq71KSm2mfNW5yPbpKsrcyav225sL2OdOZs2z1jgyRRdbk0dmVc8pmI3x0Hn6074vEX7+pnp1JgfMmTIkCFDhgwZMmTIkCFDhrx++YUhhAm+BAwKeE1AjORd1cv3lXXHJxPgcZsdeBRgybqxLHcPsC2CcDyKk0Cd2zAJy75a11MgdvToiLHo0gFWJswDxFbVESFI4J628E4c+i5lU6/L0Xb5bFDS9/qdbyyfvpJsJBBKG1MP6mrAsAN4Da6TSEmZ/M64NeBLwqWLjRB8trl9mnu9gyafTf6SgLd4THU7WmjXOVLKv9FuIUnpizkg1IQ9QeC04Xtjtw7Yp09ix4z9x8fHur+/r/V6XdfX11Pd+/2+lsvlC1A5dfCEgf1+f0QCU3+OJ743fb/fH/Uv0gHpBJLZJ+YIx7z9S5IofeS9zpVzusVvvKfTi/eE7Lu4uHhBqJydnU12zi7h1Ldarery8rJ2u109PT1NxGQ+p0zeB395eVn7/X6y7Wq1mt49nD5fXFzU5eVlHQ6H+u3f/u2j+CGJ5nfOdvLzkDXOdfaPdyN6NyQXLnX1dH6zxD5dzuD4yHuDOY9locT5+flEpIdUPxwO01HS1PP5+bm+/fbb+u677476yEUtzJfdogTKqQVVJKW8IMJ+cr7q5lded56ivVyX5/qu/cw5zoNzuniRxxy55rFMfThGHZNdfV28OVZ8n+t0fvazE+3C+qlnZ5NuPrZuLNuNDZOnrMs5lDnKvjplDy9ws12YQ93/fO/8Fx27BWHORd38yjiyDbqY6hbOUc9TixM4V3bzAtvP97l+8Z652GVbnK+ZV7q5LNd4Wo5t5n52CxQ6nTr9aJdu4ZufG4cMGTJkyJAhQ4YMGTJkyJAhr19ePSEcgMUkR9XxblMCSB2gFMmuXINJ3W65AC0kbQPQ5HtIC+9I4mff15X37jeD1wZzq44JP5KcXb8JQKeOAFW0b3bmdcBmJMBZR6ZGd4KDJiE7YNdEBwFxg4C818BygE2DedGNx96yXyaP7SPagyBfyMD4w8CcbdAB6CxHO0W6WOlA9q48SSvbLbam/UPqGDSnTWI/+oi2T2xlh+Dc0bpzRBbHieUUsMo6aSPqx3sN/HIHJO3BnaC5L6Rurue9tBzfftf3ZrOpzWYz2TC5g3b2MfGx8SnC4hQg3I21OV84LkyoGIT27sHU4xjvdDglHXFCop25MKcz3N7eTna6vr6u3W5XDw8PtdvtarVa1dPTU+12uzocDtMO4c1mM7WXOhI7Z2dntdls6nA41OXlZX38+HHy52KxmAj9U7tULbHvHOlDEiBC/3LselEGxx6vz9l9Tt9uPmVccDFWCGHGU4jivP86u+EXiy/Hpe/3+2mMhRi+vb2djvrObmK23+Xm6PlDtu7mUPaLdeT6XO6hjVie8cj7aEe3wz50+T3l4lfOq4yZtJN7Odc5vzuns0225WctX6dO7H+3cGDOdu4zdbCNPPdkzjHxTvt2uTLSEYku5wV3nZ09Lq07c2Q3l3afPW/NkcX0gxfWMX93sUd/ds9PvNY9A7Isr7nvLNMtvqB+9rfvZ3nmP9/PsiZSnXu7/pwaI3PjxL6nrZ3jOeY5Fro4sc+5UGsunw0ZMmTIkCFDhgwZMmTIkCFDXr+8ekI4u5VCxgQAmwPEScqFTKk6PrIvYApJTYLBJCB4VCUBJu+cy/3ZzZcdbjx6j0QHSQBe464vgkH5nPcuGoxyPR24S1Ap1w2uzu2EPSUG7Vyny1kH+jJAM21NMI598jvcqIfjg36nLgT5vPCA/qIPeV9XpiNwKB1gmrI8ttlAYlUdAf2Op9RtADiEZGIr10k0dMCjgV+TDV1/OwCbvqH97Bfqfjgcpvfmknx2TJKU5L0c7yRdDJ46hhx3PD6X43K/39fj4+O0A/L8/Lx2u920g/VwOEzvSr28vJzq5M5Lj1vuTK36nggj+Wh72QcG4U1y2OZz/jFoPQeuG1hPWR+jbEKkG7NdXHRHki8Wi+m9wSF2l8tlnZ2dTUd0X11d1fPzc3348KEuLi6mnb8XFxd1f38/HW/88PAw9SW+5PfFYlGbzeYo9rLLODbKYoBTuZK+mvs9/fM99pFzl/PED9XV1cFyicluYRJ9yUUfGXPM37keIj52uri4mGyYuXK3202xwz4kjroTC+ZOtLBdnRMjJrs8nrrfPW+dar/zN8eM58duLrJvWEeXm1lvt5DuVIzMEUveudnZyrqyvMlrl+N7V70wyHp1+Sb1+lhxl7UfT9k136k36/Ucznhhe44X+617HmHbXZ5l2a5Nl7M+JhTdBz8POHdZJ+rqU0n8HOSFcfQfbeR4MGHKscMcRaEOjn8ulGCuo74mnbt6U54nrFgH26wbv6dy9g/d6wVaQ4YMGTJkyJAhQ4YMGTJkyJDXLa+eEDaRY7Iq4I5BSYNGuUZwKtfOzs6mnU4EqwgWsU6TaqyfQBeB2RAKBva40yZtekcg32uZ36u+P16WwKwBtTmAif0nuTi368b+yGfb28cxd4A69bV/+Je6BDTmDkqDaF07fq/dHEjsdyTnWoDmDkw2WGx7R7odMCZVTxHQBuTnfJP2O8KhI8jn6qBt5oBj1sn4jb6MpdzXgfQmsrtjvjtQlHblZx4D3eWEDoS177goJN9Dymb8393dTbuEcxzu7e3tRGzx3ZaLxRcC83A4TMcdp99c4GLdEpO5x0D7nB87AsG7Dt3n1ONjZ12XSZoOiKfuXjBDcn4OwM59yW+sK/dlp2nqzXvRN5tNff78eSLrExer1ao+ffpUb968qd1uN70POLtUr6+va71eH/Xz6empbm5u6u3bt/XmzZsjPbgDj3Fn6YD+XHccOgf73m5cd7bzvWzr1PyYflMfHnVeVUfHbzuPZWGESd0Qwnx3Nfvx/Pw8lbGdGPfsA+uzeGzwyFaTO13sekzQtnM5jGM9fbKPqUPnk4ifKbo58+dpq8uD7k83F3He5m9dvMzlEpZ3m77G+dzzo5+paD8SYVk8ZP9V9bujuznM86vbtD1/yBYcR92CJM9HFMaZ50PvxPZnLxjkM2bXP7bP51s+e1BfxruJ2i4+rQf96Wcc27LLkRQ/M7FMN14cU/ydccLnDuZEzin8x1jMPXwVjX0WW/M3+sZxT/3Yd9q2i8khQ4YMGTJkyJAhQ4YMGTJkyOuTV08IV9ULQq7q5S6JELpVdQRKp6xBucPheBdwgG6Cnj52kSCnAT9eCwjtnXIkQwy8G1Ai8JYyHUhE4Cx1B7SasyOP2g4ASCKX7ZHcpW06QDJtEExLHwj+E5QnIJZ2XSb2IvhGMThO2xgMtb9MoFPmwM7owF1rKcsd6d59nuunAD/vcqr6/p3Z3oXSgfwGQ+fAzQ4s5S7IDrxkm+ybgXaW6XaHdX1wewb9HW8sE/08LrpxyXY7oim+jM3j0+iR48GrvicTF4svO1Vvb2+P6litVhORnKNwc0xxF2eR2MeEN4XjnQS8bdQB5h5/BOQ7O3XkSTf2qZvzb0eynCJDuGuQ4zh1brfb6R3A2Ym9XC7r7du3td1uJ8L4zZs3067fu7u72mw2EyG8XC7r6urqiEyuqtrv93V+fl7X19fTbu/r6+u6uLiY3k88l4cs9oPHK++dIzc6ksUx0y0q6MgD62T7J6dx7stc6bk3uSq2v7i4mEh19oV5hUet7/f7ur+/n3YJOwYOh8NR7ou+Pp69s6WfF6g356SOHHadczuJ3U+3k3s9p3sBkXNcdPQiDuYxtjGXgzlnu4zHJm3Ae/O8YLvw+HT22bqx7/ZBYopzr+3o5yzPF6nL9/Iz86J/53zY7V6233m905G27sZfly/dJ8+XfJZxDu52h3bxwHvm9Mh1Lljq+tnd1/WHPo7uXf5zTPtZKp/dR3/m8wLtYL0430UnEu3Mf6knv3fPT50N2Y9cc3zN5Wn2wwtJu9zW5YQhQ4YMGTJkyJAhQ4YMGTJkyOuV+ZfovRIx+BLwPgATQecAJHynZ8CcDpjnezIJhJPUC+ljQKs7Wu/U39QTMTj2+Pj44rho7yAgSMW+eMdVBzB2AGHuDejegd7Zabfb7V6QMq6LdRDsop8ITnY6zfmdwLRBygB1tq3r82eCgd7hRwDWIKJtxfs7QJnt8N5uJ6AB4W4nccTHIptUso0ZVybk0wfqQ5tRjy7u2DfuaE89Jhzn/NXZohvDBuJNkBksnRPGVGyRY+ppf9onn3e7XT0+Pk4LSQKAr1arF+Dz4XCYCOHsFmZfaJO0S2Cc4HhHgJh472yU6yaaPTYY8934ZNx17zd2/ur84THLe5nHTXInJ+f3+/v7+vDhQ22326r6nijO+20T6znO++7uru7u7urq6qqenp7q8+fPdX19XYfDoT5//lyfPn2qu7u7Ohy+7CoOARxy3zmDC0pOxdkPjalTMT5XH38zgcM8EPl5CAPHiMmV2ICnU2Qx1nq9ruvr66M4zq7hzCGxWfz46dOn+vTp0zT/8YhozntegOK4pTgXOK/TF1wAw3zPujqbOq92to8NrHfnh4xx+4zjhJ89Nj3f+vnBOjPf8drcHH3q3ymCirnAZfxsMPcsEF34W0cwzs35c3aiHv494ucL+2cunzLHdbFqGzEXRObGNPvE+Oye9dgP96+zM33iOqmT73cMdIsFuIjOzyhuh2PTzxcp57q6WKQw9/D/Dynv2HC8eI6zDaJTYiX5zGOzq8910o9z+cVja8iQIUOGDBkyZMiQIUOGDBnyiyGvfodwB9Lwt+zY8/G+HUFhsIlHSVZ9Tw4RAPTRoNzxQICLgJt3vBK8IdCenWsES3k0rd9fnPY7Qog7T3nUbcqSuCDpTP1IkJ+dnR0RKgSYozv7zLrpq7kdrQaJTYBYP/qtI1cIOhIg8z0hlc7Pz2u5XB7Z2IBs4sPkf+ohkeBrtHnqYKw8Pz9PNuxs4z53+tg2nX6OiZTh+z47GzKm2H/+1pXNNdq9A3ltN8YP68rvpxY9GAymTel7jgfGCsvEzrk/iyVypO1yuayHh4dpocT5+XldXl7W58+fp7yRnNT18erqqt68eVMPDw9HR0B3u+S4OCXvyDVJQPvMkTPpexc3lI6gDfHHHBFhXXO7GX9IPF5NwHT1Rqfk+8ViMdkzu1XjA757nu9i5uIWvlP45uZm+r5cLmu73dbj4+O0e5i5gznxVF+dy5znPPY7oqAjb0wgsD7a1sQGbd3VeWqnpPNh8unT01Ot1+u6ubmpx8fHur+/n45Pr/oSR/v9/iheNpvNRNbHrt7xyJ15tvWcXaJvZ3ff499Yt+dm5m7PbdbHJA5tFd/4N9bZjaOOJOoWwphkcx3pQ0c2+d30/OfFUSRJaaMIyf3ON53P/Nn24JzlvnaLtxwrc3MD22BZ+zjPYG7P9u1yoOMu15KbrINt1NmdejqeHCu0vWOt8yHLJc5I9NrenoNtB4+NyNwrS1zWMeFc4fu8q7gbz160ljHK793zBXOsfUvJ9bnntW5OoG29mID1+dSGn2e+HTJkyJAhQ4YMGTJkyJAhQ4b8/7+8+h3CVd+DO1XfAx95j6HJHu606QBAHoEZcsBtVb0EekImpC2CNd5NxftTpjtemIAkd5ZwpxQBdBJVVXVEKJGEC6hlEG+x+EJwrVarFyRvdCGwt1h8OQq3ex8xiXfqk752QCDv5Tub2Sf62P+424bAGndikISlT/OPfuhIlPjF/jPASYDfoGP6YF2zs4595y5DLyTo2jCIm3Lsf9XxO2zdD8spADp6s4x37hg4dzx6NxfjK+Lxbb87Vkxkd7uJ7I9OQu7lyNv01/YgMJs4XK1WdXNzM+WSvO80RBhtcH9/Px1T/Pbt2yMwmnmJvja47T7bDuxv2qdtuOPWbTiu6S+2RdKus63HqceA67dfnp+fp9MdPAbYv+gSv93d3U3EYj7v9/u6vLycdnDnSOPUu9lsarVa1c9+9rNpt3dIy7u7uymWttvtVD7jqnuf8xwg35FDKW8b0B++1hEaXSywzrm2O8n8YDKEumZsxO4co2/evKnLy8vabrf18PAwHdtd9f3JHpzjzs/P682bN9N8xFgx0cU8Fz95kY774l2KLuscY+EYYVteYGQ7e1HUXO5ifzkeOEaYzzxHdiSd9fXc5b6fki4fOC678dvZ2Dayvq6H3z1/uI5uzuQ/+nmu/85bne7Wh7bu+kF9bJdT+ZvzLiU5z3Nc1wf2vVtgM2cTzkXW1bmA9Zio5jju6mDdHAfUs9OZn714jPbPb7brqecB5jf3y6+h8fNM9LGdTp0c0dko190f/3/EeebnGc9DhgwZMmTIkCFDhgwZMmTIkNchr36HcEjeqv69uyY9+FtA5w488g4Stpfr3EUWMTFBwI/gNYG7Dig2gdsBhwSaco9BK5NlBtXdR5cNSXk4HF6AVwTvU5477KrqiCCJ/QzG55jRrv/53u1wtk86m1A60NF+tq29Q9H1sayJCsZi/hr8J9jnOhibuc6dcFzgQDC863Ont8FL2o++mwO1uTOPJEjnA+uQ9x2nT7anwVSWZz9YP+1OW9HPrPsUIXI4HF68kzlCIiY5JIDwdrud7gspdn9/X4+Pj3VxcfFid3DI4cPhMO00/dGPflR/9a/+1drtdrVYLKZjda1PdgXnnbZzgK9jPL7qyHrHYRfDc/FkYog5LOU6wN0+cD5yW14Mw/gNac+FFc/Pz9Mx3VVfjo3Oe4R3u910lPFyuayPHz8eHXucUwLW63U9PT3V7/zO79Tl5eWRnRJnXkyyXC4nv3Xj0DL3XvHuvo4A6NqZI8eqXr7zec7mFNs83xPbXJjAnL7ZbOrHP/5xPT4+1u3t7dSO80r8u91ua7fb1eXl5bRTmPNW7M7XN1TV0TiYI8bcT9tsbs7vrnl85LNj3fNe4sVzAX1h29CuHrPWnc8y1s07I2mDbmyb1GI+8ZhlWfqX/XJ8MZbm7JvPzuepzzHctTM3FtjWXF7q6pwbz7aHx5wXR7kcdWQs82+nj9tJvHVt2wbds0OEz6pdHnGszeU6P2dQb8/XtjvbZXx1iy2pnxfszenYzXduy3qnfsa5n3scYyzjeDRRz/52i9D8LOM8wX4MGTJkyJAhQ4b84simqv7eqvp//51WZMiQIUOGDPk7Jq+eEK6qFhQhOE6yIhIQu+r4PX6Hw+HoSOUA7QR6UicBXYNHBEQJpAUIJqlkkMcgngmQqi9kUN6VacCLJF0IjeifY1NThiR1yuSo21OgZgegE6DyjkWDvelnt6OXdjTgGYLF7XWgLv+SROhA5ejVyRxBFRt3fTWhbTBvsVjU4+PjUbkQUfRV9OS9Id0JJHoHcLeDj6R6B457127GAXfnmgSjP91/xkLVPEnREQIcQ6dA2W7McZc/x53jvCM/uno9tmiP8/Pzo+PR0/fValVXV1d1dnZWnz9/rru7u+ko49VqVfv9/ug95jzO+PLysq6vr+v+/v6IdE/7VTXFDtvkUcj0aTcODBJ7DHXxapLGi1k6Oxrctj25qOaUPzq/xBaJK+5c2263tdlsar/f1+PjY93c3Ez5MIRu7t3v97VaraadwpvNph4fH2u73db19XVdXV3VarWqu7u7ad7Ie4W5OCMkNIm76OVdde6TfcT+M+6ZLzhWTaZwnJG0MLHQ5dlT0uV965P6+N776+vrevv27bRzN/bKPfv9/qhv8ct6vZ7GGHMt+xjiv6pm55xOTBAxpuaIK+fLlLFNk7+Zo7v5hv5xfurEfXd+7BaDuc/UxYSTbWPCbW6MOkd7TuhizPa3zuyj+88yXBBF+7Nu3s9+WwfbbC6vpa25E2R8r58H3EfHoP3JsZ05iM9/rpM5iPfZfvnMRZWMXecyjw/HrW3qZ4Tu+a4bp/aLn1VNTlsP9tN10VeM19TlZxTawnOfn4n4zEM72jaOla7/fjb37+5/N178mpYhQ4YMGTJkyJDXL/+HqvqXquq/qqr/Z1X9+t9RbYYMGTJkyJC/E/LqCeGOqAhw0x2tHCHBknfhkrwK0JN7DVyRxDB41gFdHWCa40cJxnU7Hrijh/d370BLmejD92GSBCHAFbLCu5NSH3ehmjQiMMidcgTMTGgSDCRRwXoM0Nsnc+C3AWrHRD53xEsHTAcsJcnOf7Q3beI+Euin3gamO6Ke/WefaAP6NYQKQW6Trux/t1sldTCmCe6yTS+MsB98fDh1MrDb7T6bI9dtWxMQ3Y4m9/UUYDy3YIDH5rofWbCwXC4n4vfjx491e3t7FEsk6UJahhBeLpf14x//uD59+nSUw9JuxnTyB0Fo2439nQOjO3KCoLtzBOvodv51C2U6+xpEd1x3EjKE8Zny3El9f39f5+fntdls6vn5udbrdV1eXtb9/X1dX1/Xer2uq6urqqq6vr6u8/Pzur+/n2z8+Pg4vReauWOz2dR6va6zs7Pp2Oizs7NpxzF9W/XyXdpzYiKs85X96t+7HMv7Oj9HTo0D6shFPPRt+u72Mh/86Ec/mo7uTrzz/dMcF7HpbrebFi8xF3POt33yOWTZKelikbFvm7B/ntO6uky+W+ZysXNd93zTPWP4e1eX51DmpLk44b1VL3O++5A2upjvCMWuDcef50f2kfF4ag7wdS+28b20gfWhLbtnDMZA16b72dmcbaVMN1d293fPFh739hljqhtzXNTS9cU6Ood7LMzNQRw7rNNzylye9JjpfMjnDPa/q7frG5+z7JduzLvfXNTHOOIzIvtCu3f2d95KH3kyz5AhQ4YMGTJkyC+G/F1V9VVV/Z+r6o9U1f+9qv5fVfX576RSQ4YMGTJkyN9W+YUghDsQNMAIdz12wGBIBQIqrJtAHgHujngLMNMBYSRJCXR3Zdk2+0ggiSBZ/lEXgno8TrMDmrqdRCS4CD7yPupocDWkSgfunQIv0zZ91AGX0S3X7DPr68/5Tr+yLtrZYHm+u78dkEgiIWW96IA7uBmjJOEZW3OAY3a8k4Si7bwAoCMYWB/j30BnR2LQZ/SP9e+AVdvPMUHfGYDt6rHNuwUD/t7pwL4SbOV7sE18xBcXFxe13W7r06dP0zG5q9XqaOcqF23s9/tpt/G7d+/q5uamPn369GKXVnZeRt/z8/OjncH0Q/Qx4ehdTdT91H0duN7FDX+bIy94j2UOlGcbJolIDOVdsvf395O93759W09PT7VaraYd2ZvNZjp6+7d+67fqcDhMuXm9Xtd2u512BId0fnh4qLOzL7vAD4dDPTw8TOM4diU5PUdM0R6dbRnn6SdtStKN5J/nI4+LOV08JuZ+N2ER3bKLl/o9PT3VV199Vb/yK78yEfUh2jkvZXc2fZo6Li8va7VaTcexJ68w1/PUiPzm3ZvUdy4HObd0c2Nnuzmb+Tp9wRh2XnJbnBsdF5zvf+g+lie55H7NPQ91OYN1uCzbcz/n8j3HC5/N+LzmMdU9U3T1z+V269URxV6oxmdH+2LumcXzpsc+y9uers+vHXE597tbFOa4sX2iZ/dsRp/NPUN4XDlPdWPO8WgdWQfnY+rWEdW+n7HlZ2r73bb1uGJc+FmB9oi/TEh3dfOVNsxx7JNfpcHx080NQ4YMGTJkyJAhr1vOqur/iO+/UlX/l6r6J+vLbuH/qqpu//arNWTIkCFDhvxtlldPCBO8CSnJnUcG7EKohEjxTiCCUQZoDOK4bHb5ERQKgWzAKLqZuEp93IXDz9z5NAfCGnCsqhe7NLmrsSN9OgLJ4KXJSQLdJjm5y5Y2JDFAkJf3kpwNAEay0QBfdlWSzCZIRx+wzehs4pw65lr8lnjzjijuTDfAGOK2A+JtR4OaJIW6XTCsz6A3fcs6OXZ43XXTlyQk6QPq3ZE7Jlk68Dz3GCRPeS986MB3Eq0ctwb6u/Fhe8+RGcwLBqdvbm6mHZGfP3+edM4xuM/Pz3V3d1eXl5dTvD0+Pk67fp+fn+vNmzf1+fPnozYSP4nx9C3H6pocs+4mWFimix+D3ZYOdPdiHNva7UW63NBJ/BiwnEeDhyjJmKUej4+PtV6va71e13K5nNrcbreT3eIf6rjZbOry8vIo9pfLZS0Wi7q9va3dblcPDw+12+2O+uzxOdfvub7T/iRyTe7lPhMaFPvZ+a1r1xKbm5hOn6NjCN8sePj6669rs9nUhw8fpl3VnCc7fXL/drt9cUJFRxDxeGYvKOrs4FzgedP3Ox+b+KI96OuunMcXF62w7Klc6AVY7h91plAv+tGkl/vhPMu46X7rxPMB750bM7Sr7cL5h/XzWWBusRL75ecB1j2XQ6lnbMd5ieL5rtOVenmM23dzce74dH+62D0lnBtdV363H7v6TQJ3bdjeKedj132f+8u5J/V6PvL8n/p9wgZ15RzfjSnf19mGPvViDNff2bj7vwP7TX28g/+H5p8hQ4YMGTJkyJDXId/8//5Rzqvqf1tVf6a+EMP/j6r681X1ckH9kCFDhgwZ8lrk1RPCVV9Ak+xOqvqecOsAzao62mFkMif1eFeEwXTe1+1a4S4q7hxju91un4jJF+6Ay28hh/mdBHNHYBGA5nWCWN3OVPbVgLzBLAPc+c025Y6+2Ml65TsJYJOiHaBMv3V+5DX2sdtl1QGv+cy2Yjvem3IGfUkwE6w0uB47cuECCY0OBHb71NXgYudP2sN9tR8dv7zPbc7Fm+PEPjN4zl02Bp/dNomTrj/0Be/zzp/cm52ftqNtc3l5WVVVd3d3R/nhcDjUfr+vp6en2u12tVgspmOis1P1/Py8Hh4e6u3bt3V3d1cfPnx4YVsudoi9Qkh2O4lyfwfsdz43QE+AuSOifjdkREdMdO1T0t8crx0iPb4IqB9yfb1e18PDQ93c3NRisaibm5vpHcF8D+f9/f0UC9lFXFW1Xq/rzZs30w7si4uL+uqrr2qxWNRv/uZvTn789ttva7fbTf3NQqDEX0jNn0dsK8YOx8sc6cW5KPUwXukzjwfPO7R/bOu5JP1jm/l+dXVVX3/9dd3e3tbt7W09PT1NhLx3yV9cXEyLa6qqdrtd7ff76R3OnGuZHzhW89nxyT57jKffzhOeh3JPN/c5X3rumLOrc71zFG3tfOfcxP55znO+ncvZ1J39OjXeXb/b8iIcv1fVtnIesh7d85JzWpdnTs1rGRvJB3lm45glsTlXh3/nHG3bUF/q5fnwh/rTxSljxXHTPRu4T66f97IPHEtzOd9tds8U9g8XwLDdU+3YD50t8t197+Yb5lET9B63Kc9YTuyQ1PazSedXxgzzi/W1P7oxfUrfIUOGDBkyZMiQ1ye/r6p+NPPboqr+N1X1p6vqD1XVn6uq/09VjWekIUOGDBny+uT0iwt/F/Jn/+yffQFC/YE/8Aem3x8eHupP/ak/Vd98803d3NzUn/gTf6J+8zd/86iOX//1X68//sf/eF1dXdUv/dIv1b/8L//LP9c7/zohQF71kuTIXxO1Bsxz3WRXB+x1OztjiwCJVd/vqOLOA+4McDv+x12LJJjd/7SV9qtqIiO4e446mSz1DlF+73Z/miSlvrQHdWMfOtCT7zLsiF+CgSFuTNyxfPTgDpHsJiPwnzYNANLHBj/ZrmOBxEL6RZt4dxHbiG7ZrZhy2QFq4Jj6G+wn0Ekf2H+0KYl6+9c24DXGle1mIol9J6HZ7UBk/MzZzL91iyF4D9ukHhSD5IvF4uiYd+7CzfHEKb9arerdu3fTfdkRTH9GR753lrtWn5+fa7Va1U9+8pNarVYTUUYfWJfYz/1gf7ox43rta9uEMdSV6wiHThcSC94p1e2Qc9zQDl39IRTv7+/rcDjUZrOpq6uridQ/OzubdmTzVIGMPZLGORb67Oysrq6u6urq6ihf3d3dTe0zNhiHzsW2VzefdHHf5RyTL84PtBFJJ7bxQ/5PHzwXspxPtfjxj39cq9Wqbm9vp/x9f39ft7e303iIXZmbF4vF9A7u/X4/7aT3PGT9ujnA4nzinGa7sNwcmWU7c3Fal4+rvieKck/ixicbeLxx3HBOsf/4TMM+0G5+DvKirE5vXqN+jhvrlWu0j3UyWUfdKB4HHitpo8t1/M36278Wl7H+/L2zY7cIgXUnD83l1M4X/n5K56589GIs2q4c+9SNuaDT27rbDyzjuGSbnGPnxmk313dzmPvn2PXcz1zpZyM/S/g5lW04hzuHWMfMS7ZdhM8EzsfOD3PxPGRI1e+9/9cPGTJkyJAhv3v5u36OMudV9X+qqv9bVf1fq+p/97dUoyFDhgwZMuTvhPwt2SH89//9f3/9hb/wF75v5OL7Zv6lf+lfqv/sP/vP6s/9uT9X7969q3/hX/gX6p/8J//J+ot/8S9W1Rew84//8T9eP/nJT+q//q//6/prf+2v1T/zz/wztVwu69/6t/6tv25dTCAZmCE4wpX60YVgCY819s6/CMHciMmk3EMCwMDm8/PzEcF0OHxPSPodsGzDRDL/XlxcHL1LlH2zjj6yM7YjSG3SONcJTHXELY/Iph4dSObdEwawCB524HcHeHXv6KXvOkC3s2vq4dHiFO9g4fWICYOORKG/XMfh8P3Rq47zOaCeYGB0DNHVkakeH/mdO2FzTDHFBEQ+E0B1+Y4Q8Hf6w/FpP3V9N9njhQq2kftgn6RPrI/vh6XPFotFvXv3rq6vryey9/Lysh4eHqrqy7hbrVb18PAwvTs1O10Xiy9HSm+329rv97XZbOqbb76p+/v7+vVf//V6fHys5XL5wt7sGwlh28LgNO1vW9sGLMP8wDzQkTQmAOwv/vVuqDldEgdcyOG2q77k6O12W6vVqu7u7o527C6Xy8l/AS1pvxC+IY+Xy2XtdrvabDZTnj07OzvauRq9OCf5fc+ddCSFxTnU93mcdPU7n+cay50iDjriJfZPLJDM/Oqrr+rdu3cTmZP7Y+8sgAgpn/h/fv6y6zv/9vt93dzcTAsjqurFGCR5xJzfSWcH2u6HFoc4bzAveYx0C8m88MxzrOch6uDfPVY6/TlmuvqdA1nOROFc3vGzQTcuq14en+xYZnusi+10c27nR/fN9+Tz3LxMHbqc53nKfYvMkeLOkZ1NHG8Ux0H8xf7abqfmPS60ccyaCGXfrBPt1T1XOPadx704iHqyHutKH9j+3VjvcmZ8zHK5zvtO2dDPHXNjlDq7vcxDfh0JfXlxcXHkI/5uvYYM+SH5vfT/+iFDhgwZMuR3L//7+rIT+IdkUVWXVfVHq+p3quqv/K1UasiQIUOGDPnbLn9LCOGLi4v6yU9+8uL6hw8f6j/4D/6D+o//4/+4/ugf/aNVVfUf/of/Yf19f9/fV3/5L//l+iN/5I/Un//zf77++//+v6+/8Bf+Qv3yL/9y/UP/0D9U/+a/+W/Wv/Kv/Cv1Z//sn52O6vzrEQOwJFg7wjXgSsgV7/bL59Qb4IWgXUAag1JV9YJ4dn0EkfPP5G9A7bTBdkyIps2zs7MjkIigmwHrbrdhdhgaBKt6CfyZBHb/qJ/twXoNXtuu3HVKPdJGd0QzwTYS1BQTeh3IbMCOfWNfO+DbICx33hp0JxBKQLyrg3rENlxAwIUQHQib3Tbuq0H9DkCm/tSZMd2NlQ4ENcDbgc0EZzsClj5iHwwiczGFbUjxNY4D25NjM/ql7uwOfnh4mAjB+Gu1WtX19XUdDodpB+pqtTrSPTtbt9ttXV5e1i/90i/Vp0+f6rd/+7dfjDEe1Zvx3/XNfu58QyC+swd9yGsW+8NlPcb8m8H2U/2g3ry2XC5ru93WbrebiMS825YLdRKvFxcXtV6vJ9L9+vp6IjdzPPXDw0Mtl8s6Pz+f3gu93+/r8+fPtd/vX+RnLkzhDrdT0hEfXT6vevne+arvj3V2fmf9JpJYxyl7U7/utQuJ9fPz83r79m390i/90mQvkujL5bIuLy9ruVxOR3WvVqsjAuXi4qJ2u13tdrtaLpd1dXVV6/V6Iozt/24e7fpi20bmFvGcmh/cBnN0PvM7bchnk6qXx3x3JJLzW+dD5yw/c3T9Zb0k/mzfXPPzh8kqk6aehzh3+JmK9bCvfv6wD7o842e47rnJn2nD/NaNI89bXZmIScZc6/ztZ0nr5DnZ9/h68sHc+43n9HFdnQ7um/3KOHKMRbiAxmT23LxugtR2sT2dUz0mvMix66/jk212CwH4vORnEs+htpX94uvWn33z8w3H9NitOeSU/F77f/2QIUOGDBkyZMiQIUOGDPndy9/0I6Orqv7KX/kr9ft+3++rv+fv+Xvqn/qn/qn69V//9aqq+m/+m/+m9vt9/aP/6D86lf0Df+AP1N/9d//d9Zf+0l+qqqq/9Jf+Uv0D/8A/UL/8y788lfljf+yP1cePH+u/++/+u9k2t9ttffz48ehf1cudC3k/Z8iRqmNwiLseO8DUx/vmN+8yMCHq3ZdpJ7ucOl2r6ojk8u9sn/pFR5dnGf5mcoDAqAkEgpwdqGy9CHqReKNO6Sd9kfI+Jtq7qHgPxWRc7rG9SKjz+G6Dz6zX5XxUoYE22pJ6GWDNcZDUi/oagKX9OgLDBF63W4d10O78TH/nr8HjkGOxRxcvtBHtEDKsIxI64DZ+JLk9F2vdwgSPCRMqBmptR+uTst27wCMhw/LO2efn59put0dtPj9/OTb6/Py8Li8v6+zsrO7v7+v+/r72+/107PB6va6Li4u6v7+vb7/9th4eHurHP/5xff3110eLG5yXErvdeGHcOB68o7IDsfmvu+ZYY04lgdeV43f6uyOBOG4YY7wvvsj1EMEhbau+gJ8hern4ZL1e1/n5+dFO7fjs+vr6CNg8O/ty5PTt7e2LfMB34bLfp3zjsrQLf/d13sO84HLduHa9p/RjXGRXL8dd/BwyOKdQ3N/fT7+t1+vpPc6x32q1qsvLy8kHNzc39f79+4kQrqrpuO/0Mfm0IyoTz3MESEf+zNmHdp2zTTdnV9WRfmmX7Xs+cR08Itv3sJz/OQ9TR+YHPwfZRt348/imXpnfbBP2y3OVdWfbp8o4R7n/3VzK8nML2vjcMPeb5yDmOduSc5jnzLmxbVvR7vzO570uZ/A5J7rM5XLr6Hj8oTjlIr5Oj1NjJ7HDBXHdc1EWO3X68LkxY797BYbzYaefxwXnDudJPzt244k+98JPf6/6Pm9082r+0l5su9PH/R4ypJPfS/+vHzJkyJAhQ4YMGTJkyJAhf2PyN50Q/sN/+A/Xf/Qf/Uf1n//n/3n9+//+v1//8//8P9c/8o/8I/Xp06f6jd/4jVqtVvX+/fuje375l3+5fuM3fqOqqn7jN37j6D+N+T2/zcm//W//2/Xu3bvp36/+6q9WVb0AhA2Ok5BlGQOe3r2ZnQshgnJ/1TGJS9DLu1UJLBm4444+kqIhDFPWhEc+s14CeSQd2bcIASQTpew76+8IDQLBBqUMTvlz7jWATFIlbXSAF4FOA7EkLLvfO1DehCDLOSY6IJVxkN+906oDHH8IhGS9rqfzqQFa+7CqJnKbcUi/+rN3/XRAJ++JnQgwuy73x3YyMcP27R/r0JEJHUFggqcD6G1Dtpcxw/Fyfn5e33zzTV1cXNR3331Xnz59mnY4hnzMMcb39/fTb/v9vj59+lTfffddbbfbqd3tdntE1r5586bev39/tNCFPj8cDkcLRmirDuz3WGcsd8SBbcl3o9vXc9c8vu0Tlu3ExzGnTuYvtrtcLqd8YJ+fnZ3Ver2u9XpdVd+TxIvF90d3Z2dxdg6v1+sjIvr29nYi8uOXOSL4h8j6bsybSEpd3d/OZ3NjLp9Z/ym7py6SKCRdnp+/7KT+6quv6pd/+ZeP3tF8d3c37dbODuKQwDwyPfXRX8/Pz9Mu4+vr6xeEi3NSbD/3PlPKKZKKtndZ12vf/NAc6Hq6XMa+cfzNLaI51UfmNveHY979JqnsejqyibmhW6zVkY6ud65vJmhNVnuhy9wY6p6nKN1u0W5u7PKp7cEFOs6Xc+3TLp3fOf/7mcjxZMLR8cdY5X30YeePbp7onl06m3nOZz2pl3nS4536djHAe2xP3089ac/8Zht3se/cOUe6s/9d2+5fl+NsBz/f8Tc+03bjZcgQyu+1/9cPGTJkyJAhQ4YMGTJkyJC/MfmbfmT0P/6P/+PT53/wH/wH6w//4T9cv//3//76T/6T/6QuLy//Zjc3yb/6r/6r9af/9J+evn/8+LF+9Vd/ddqZGwCH7yvLtQAp/EwghURBygWUNnDF98kSHGe93IWcY2FNahGsMyk5B3Zb15TJbx1BQL0Xiy/kNt8f7F1WVcfHOhrAJOme41bz3uL4gvp0u6Q6sMuEyRyQPberliSYd0WlPyzvnVZzJBp9lb5zl2+ExJ1BOgOyBuN5zTFg0C/S7bjm7yQIMy4o9gFtNgcmEiQ1+Jz+EByOjRgzBlBzlKf7yvsJpLLPJGS9W+sUWGpguos5g/a8x+M+i0eurq7q/fv39fHjx/ruu++qqqb+pa7Pnz/XarWaiMrslKReeX9txthms6nb29va7/d1dXVVh8OhvvvuuxfvKLy4uDh6Vyt97Vg5BZ7bzswHtIsJTvraMZp6o5/zbRdPFt4XmxtYd5zwqOb1en3kw8PhcPTaAJPKKZf3BC8Wi1oul7VYLGqz2UxHR9/d3c3u/OKx0fZL1z/bYc5nJoI4vihc0BG7+V7OP6d04/3ODTlm+927d5ONDodD3d3dTWTxdrutw+FQHz9+rN1uV8/PX3bM5zjp29vbya8PDw/T+7afnp5qt9vVzc3NdHS3SZkuP5yKpdzne5wraHvnYeeGzuYu63mM/jCxxPY9tpgnORY8nrwwyvown7EfXd6dm8fSJmN9bp51HSwf8WsiOrtzbmMM89kr8zr1oS3mFh7xN9vF78P1XMJ+uF/dZ/oxfU9dPJHCJOFc7He+6vzgftF3FM6tbI+xZj3m9OFzGPvcEbSd+NmAOqVuL+qj7t28yAULfh6yb+eI2i42eY110h/dMxl17e6nHfiPi16d23PvqfeqD/nFlt9r/68fMmTIkCFDhgwZMmTIkCF/Y/K35Mhoyvv37+vv/Xv/3vof/8f/sX7yk5/UbrebyJDIb/7mb07vJvrJT35Sv/mbv/ni9/w2J+v1ut6+fXv0L9KRvgE/8v5CkjxV8zvnUkcAlJAJBB0J1nQ7CKq+352cz3nfpIHOlCNwG/CXwKfJEH43GMUj8wxemUDhjrvURRA191I3As5svwOxWCdBRwJwJiRiLwKA9gFBQfqta/9wOD7ClQB2dgSmPbcTXWhz7vSJvh2Q6jb517rSH9GL16OTCXYCgLStSdLoRHvFhvQ/bWcQ3SBp6jRoyjhhu45xjkcTE118sS+MC95ru7pO+tWkqP0YX3shCYnQ9HO1WtU333wzvbs27wre7/f14cOH6b3AOdI+uyRvb2+nd9ByYcvNzc2Ut7bbbW02m1osvryXOEcbZ6zzHdK2l23oPDA3duMvA9H5241Rxxd3yHVkbZeTWI+ly9GMScYb80SIx9SRhSv5PQQmFwEtFotpZ/f19fXRYqMQlVV1lNNJ3niRD3+f803XT97f+cux7sUknZ1DSDA/sfwpITGWuHt6epp2+sYXz8/PdX9/P5ULYZw5IDuv8w7hzWYzlbm8vKxPnz5NxO/9/X19+vSpLi8v6+uvv576xPhyf50nLY67qpevVnDenMtD/peYoy4ULx6IvVgvy/LkkS438v6uDpbN78xtXfzRJrZLrnve8TOQdeR8Mqer45rzjOd45+3YwfHexYHJPZbz8xb7mL/dvO650fONy5zqq585nK/n2u5I0W4uzfVunDjOmMdO7d61Dy3WvYsffu784+e/zo5+rrD9eD/jx/fRTtSbZK7nRj9P0Sdsa27c55rHHPvQLfJhzmF9bnPIkJ9Hfi/8v37IkCFDhgwZMmTIkCFDhvzu5W85AvD58+f6n/6n/6l+5Vd+pf7QH/pDtVwu67/8L//L6ff/4X/4H+rXf/3X69d+7deqqurXfu3X6r/9b//b+q3f+q2pzH/xX/wX9fbt2/qDf/AP/q50IMBjwLDb8WEiiKCRCQYSpgFcfFRq6jL4RILAoHUIhhBM3Y4n7wgg8NORvd7lkL8ECReLxXQEasiMOQCZQCPtYPCMZK+JGYLiHXBo4pAkU/e+ww6oc/0mQQiqd7HC8qm/I8E6XbrPJhtNXLleA6AEavPbqffX+jP9Q3DZcdj1n6AjgfEO5IzvO/DXYLP9FX0IambxRdow4Ek7MX49tgxYs03aaw5wtS07ci/3n52d1Wazqa+++qrevXs39TtjjD5cr9dTvw+Hw7Tz9OnpaSKQb25uarfb1dnZ2fR+2+iyXq+nY6ZzzLHj2kdGuz/R26C9CSX/y/XOzh04z3Kd/+dODuD3Tv/lclmr1WpayNHlOY7DEPB5dQDf9c78m/r4XuGqL7uus0PGOWK3203vD04dzDXRmeOsE9bp+cKEBf+Z2OD9EeYRzkv2h/NSZ3u/f91xsV6v6/r6etoNzB3wWRCx2Wwm/202m3rz5k1dXV3VarWa3r+dcZHxnbG+XC7rV37lV2q9Xh8R0iHuvRjs55VTeWPOJx4bXV7v/rKdjiSsOs693WKpjuTq6u3GH/vV7ZDtciDvdx+6eGTdLHMqLzi/u33q5xh3eyTMft5FGPQRv7scv3fjdi53st9drvOcTT93zyLWuZvDM/fzpAYu2HL+97OMiWLHKn1gf7N9zw8dqc/fO791+cmx7Bhkubnn3C6uHVudD7v46RaUsT8ey4xlLyLi79QpZR1LXghgX7sfQ4ackt8L/68fMmTIkCFDfnfyF6tqPPMMGTJkyJAhf9OPjP4zf+bP1D/xT/wT9ft//++v//V//V/rX//X//U6Pz+vP/kn/2S9e/eu/rl/7p+rP/2n/3R9/fXX9fbt2/oX/8V/sX7t136t/sgf+SNVVfWP/WP/WP3BP/gH65/+p//p+nf+nX+nfuM3fqP+tX/tX6s/9af+1ERy/PVKdm4RjDRgHmDm7Ozs6NjS3GuSmEe9GvwhyVz1EpjykcJph0ecBrg+BSQTsCVgyOskj3MP9elAvYDsFxcXR+C5AcGIQWOW78DbDtjyjg36g/cSIAzRMgfM8pqPPKTdaJ8O4LaejKPOBh2Yy+/eSUsykSR5rhl8JcjH/lF/xjzBRAOWBgmjTwds82+3q8q2Mxnr3YmMA/raddKuHUHRjTUTICSXO+B9rr+0GYVk4mJxvMN9v99P9W42m7q5uZmIr6qq1Wo1vYOW7z4NCXZ+fl6Pj491dnZW19fX0+ezs7Pp/cLn5+fTbuP4+/LyciKPu+PJeSqCpRvbHQFk39hnjq1uV5J95/Hb5Vv+5rpOtd3Ftf1+OBzq4eFhysEhfwmic1FOfJV5IOW4uzU5dLfbTf55fn4+Ou42p0J05MGcMOfRDvYbbWi70SZVPYnoulNuTrg4ike1Pz9/OQ766uqq3r59O5G/j4+PdXl5WZeXl/X4+Fir1eroGPTYKotAQiBHQvIeDodpp/Hnz59rs9nUj3/84/rpT386kV0kVNJ/1vXXK45V57XYznPZXB2Mf/714qROj4wh7xLupJuLrPMcgei5kX1jnnTbLsc6vAvXc0zEuaB7rqCO3dhw++5395zFObj7vfOV7e3dmraL++NxST3ZV173okY/M1HvquP83+XEXM9YdhxwwSNj3/P9XG6P+NnDn71g0s9EzOkc37QT/dU9/3RtWk/rTltYN/bNfuV8mH/W2/7qFk6kPsaVn/t5P+v3WGYbfyM5ccjrlt+L/68fMmTIkCFDfnfy23+nFRgyZMiQIUN+T8jfdEL4r/7Vv1p/8k/+yfqd3/md+vGPf1z/8D/8D9df/st/uX784x9XVdW/++/+u3V2dlZ/4k/8idput/XH/tgfq3/v3/v3pvvPz8/rP/1P/9P65//5f75+7dd+ra6vr+uf/Wf/2fo3/o1/43elT0Cb8/Pzo2N/8z0SIIUk7NnZ2QT485hlgi7ceZf2CL6QCIg8Pz/XarV6sWOEvxMI4/u/uFuW7YXM8Dsp88/vEDQJQPDOxxGfIgIMMBMQtE25W5H3mqAiuEXfdGC2d0JHZ+qfPpMQ2+12R+QKAcPOlwSUSeqwXoOIPmbadqev0779G5LF/uZuR9rbQC11Y8yblCao24GTBCCps+2atlKGdjpVpwldvovbAC7rp29sB//W+dK76yysi32lL+gnjsWzs7NpZ2/eCRyCar1e193dXZ2fn9dms5n8H1I3xGSOHs5uqru7u1qtVvX8/Dy98/b29nbS6d27d3V+fj69m/VwOLwYz44p9qUDwmOHlDNI7fgxeeI6GbcdAcQyHvenhGOCYzr5N3YIobFcLuv+/r52u93kl+QDkvBPT0+12WymndnpY3ay7na7qf6Msd1uV9vt9oiYDzmaPM6x7KP5T8n/l71/i7V0S6/DsPGv+3XfqurUaXY3u0k2by1RJEVZlKhQl1iSLUgyYgQypERAkIstIIChyICf8hAHAZI85MkBISQwEMRWYj3YQWQBMhIBimVJUAiHkHWjyBbZ7D7d7NPnUlX7su63Pw+bY9ZYY39z7V11qk6ds2sOoLD3Xuv/5/zmN681xvzm9LbvvnaBjO/kItu8v0SRbC7a5Ozy9BqNRjrqud1uYzAY4Pz8HHV9LcJzo8RgMEg+b7fbyW88Ap0RwPx8t9uh1+thPp8nMXm5XGK32+Hhw4dYLBZ4+vTpXvvyMew2eLvNCXP0SfSZfq5CmteHj8XRWO6+1/YZ9btIyNRyROOhfx+1K34XRYBq24vGChcQ3aZDY4XOEfzM70T3vKM0FYfWFj5H6/fROszFS/+nabsN/l3U/7y96BiuZfV61TLoGjKXhs+5LpIeWnOofZHgmZsb1D+6Zozyi3zp411U57rBx+tBxwb3MX9Xm3w9dmis0DWC25/bfKfQOcT7XLT+1fr0Pql56Bood2pIQQHw2ft/fUFBQUFBwaeHGiWiuKCgoKDgPuKVC8J//a//9YPf93o9/NIv/RJ+6Zd+KfvMV77yFfytv/W3XplNSlg5kQPsE6tOyDIKSYXAQ9F3kSDl5IuSZErw+J2bSiQrKeZRyyqEROKZk4S03cVIJfHVR0ruAftHY7s/XSzkTyV2+bySmE6+OonFv/VIV7dbST19PhJ9nWh28SQnkLgQ5gSi+kIJSBUAmAbrkX+rnU62Krmq//i5R0Tm6p9QoUzt9zqPiHUVs7RdaL7qU/2pdvG5iOj1jRcuWmgakVCTq0v/3f0bEfZeJ3xG+6v+rWK2RlpVVbV3DDvvBebmEApj/X4/fc9xpdPpoKqqFBHcarXQ7XbR6XSw2WywXC6TLZvNBhcXF3vjhJL6FC5dFNONGJFvtR/4GKHjmItd2id1/PQ6cUSCQNSWovdciNExyDem+Pjjdwgzipe+ZloUd3mHM+uR7/nd777phvXr7SuC951oE4X+7uS/zwGRsKHfRZsFDvlcbeM73ExFQXg4HCYhl0d0A0hi8MXFRbr7ut/vY7fb4fHjx1gsFlitVjg9PQXwPAKbUfKsj263m4R1isKM/Nbx+rZyRONYNHfxu8iH+ruO2zrueP/zcV99778D2OtHOTHM5zzvU8D+piS33+3y9uX55fxI273v6xwZ5ZVrlz43+XPe/vX3nD8duobx9Z2/631Xx/5oDvZ8b/NhNKZ5+1H/qM0+pnu78Z/uJ/d7ZHOubN6mbvO5b3Lz/L0/RnXqPlM71D/aH3wTIt/nP2+3Pn/qesrrgXZzHGKb9fWfltnHmGiN4nNLtA7ScUd9rL6667hY8Pbis/j/+oKCgoKCgk8HWwB/700bUVBQUFBQ8MrxygXhzxoospE8ichbII7mVOJFBVwnkjQNJx+B/egNj+qhQMFjMl30UntcnOH3FDAUEQGp5YpI0YgMi4g4JagUKhTrHZ6Hov08siWKvFHbnDCMyDQ/5lAJca+zHHJikQvWtMnJVidhFSpssYy0z4961nci8RlAEqn4jBKT+iz9QUHMo0L4XCSYRVFC/rmK9fpdJD5qmVWQiNqj1p1/rmSm9zcXFzwvt8XL53Xk91xr36ANbPdVVaWIYD672WzQbrcxnU73hODNZpMiS6uqSkdKA8+Pgu71eqiqCr1eDwBwenqK5XKJVquF09NTzOdzzOdzbDYbXF1dYbFY7AlW6t/cvc4qGnk/jwSPXBr6jIsm2sbVb7lx75BQEhHYkdCi4w8jtVkfLlh41KK2HUZm56KJKYCu12usVissFot0fLiORbpRRuclF8dyiKJBo/JH/sm9559FYsoh6KYHb3Or1Qrn5+c4PT1Nnx8dHSW/HR0dpeOzAaSI7dVqhfF4jOVyiXa7jbq+Ph56t9slQZ11wEjjxWKRIpGZB9O9rfz8PmpbPn9EvtO2pmORj4f+TtTGcwKNt9dozNPvtczRe7fZo3006quaXm4toXb5vMZncxurfOzSPA9Fe3re0dojej63fvO+ofn6+iYaP/3dKJ9cnTGPaH3o5fS/o/HEfeEnnugz2q7VRq2jQ3YzzagP5NasmibXFeoDnY+Yr8/r7if3n7bz6Fkfr6N+oetC74ecW3TOYxnpB03P10g+jkZraLXJT1QhdB2d6/u05y5zT0FBQUFBQUHB24XvAPitN21EQUFBQUHBK8e9F4SBm6KnEvEUeqIIViWc/TsXGYHnR8KRcKHwoOQVf2+321itVjcIrtsEFT+eWAkwPerYBVX9PSfu5YhPYP8OTLWF+arQFBF76i894pJRYi7W5ohmj5iIiEgl87R8SiTTfhU/1R9OCnpdq49UjKWNTjhqPkrcOcmnxKVHoGodejSxR6uxbEo+umChhLG3CScXI1vVt7R3t9uh3W7v+YgimhPjhyJXvN4UXp/ua+/vGt2jz3he7lP1fxQpqAKJ1jHFMW1//X4frVYLV1dXabwZjUbpXlUKV51OB+PxGLPZDFV1HVHc7/fRbrfTXWu73fVx0YPBII0jk8kEVVXhgw8+wIcffpiOUtX27u3TEY0pfF77RE5M0mc9TR8TooiziKz3OvPxQMGIUf5Oe3iXLD9n3ej4odGmVVWlvsPxieWn6OuCgW4oYh1FR/1H/dB9GMHJfLWd8M0yvonCRQH1aVQHt9nkiATTur6+//e73/0udrsdxuMxms0mRqMRzs7OsF6v0e120e12098XFxfY7Z4fnz6ZTDAcDrFer1OEfbvdThH2LAePlGa9cGOSRtXzu0jU1fJre9fvcm0wN3freK7+dFHHx7zIJj7Pn9p2Pc9oXmTdaNvQMqktOjZHfcXLeWgcdkFQn4k2Z+XaMHDz5An3kftJ4esd/1s3/UV15X73+UzLTVuj/NymnOgX9XG3mXOWR59qfjoPqe1qV7RRUMsQgX3M69rTiqJXOWb6BiS13cue6wfav3Kb/nzs0zx1Poz87e1bx33mqX3EbYzag7fd3GY///+Bpqs20KfqC49W5meaTzRXFxQUFBQUFBQUEP8YwORNG1FQUFBQUPDK8VYIwoy+BZ6TY4w4omir5KSSYCom5SLaNNJXyVjmq3nwe5I1SmCpnbTHiaiquj5uVKMVIyKWnzvB7BG/Sih5Of1obBVZFEqGaUSF50k4ARkJe8QhktCjqJxYr+s6iQBKykWRom73XYh7fZfEaGSj+iaqB83f4f7QtLyevW5zhLm29YhQ5bsq/kf+UFAE1fz8eW1vmkZETEaRvMxH2yV/+rHgCi97zrf+fiQaeJthP1HBX+9qXq1WuLq6wsnJSYp6pLA4Ho9xenqKuq737pvtdrs4OjpCXV9vSlksFuk+YfqQxz7PZjM8e/YM3//+9/H9738f5+fnyQbt41V1LXCzP6hQ5j7Qsnub8XpjnahPIgJd60o/j4SIQ5GI3h4ULLMLtFEULqNTKRpyPlAyXcuomxr4Pu8Opn/1egG9bz4S8XRTjAopOVI+KneuXecQ1WE07kd+vi19vwPZxYj1eo3vfe976PV6GI1GmEwmaLVa6W7hdrud7mR+9OhRavtXV1eoqiodIb1YLDCZTNJx6WrbbrdLojGPXr+4uNhrY3oyRw4uWtJPUQSf+tHFwsjf6uucQJgba3Ujm36vP3Pp+rgY9adIFPPyeJr8Ga1Bou/Vb9ruo81Pnl60pojEt6hf6PfaTn295H3VBUGF5xn5PrfxQNtYrpyaVlSOKP1Dc5zaGZVBfao+zJXB60rXw96OfS7gZxyTc6Kl+5/vcI7jZ74JTzdkuZ1RO8u188jv3rb1Pe9jhLc5RTQWaf/IjRP+O/0Q2Xdosye/z9VzQUFBQUFBQcHbiUsA/883bURBQUFBQcFrwb0XhJXAiSKYVEji7/ocP3ciORKzVMxwkS0iFp2k8ahZkloUI5TsIYmqJJhHQnpUrhKcLkD6u+4/2uuRo8zjUESp+4rlcjHaBSInDJ24dRJSfenHIGpkNT/XuneBPCL7KQTlyEC1hdCIGYdvNiCcoFRfRhFn6i+SpNpelXh3EcB9pMJ4jgRVezXKR/2rbdzbniNHQLOt8Hfap/mrH9hvovQjUS4qV+R39kEXGTRPF8Tq+vlmhPPzc7TbbRwdHaWNH91uF71eL51CMBwO0Wg0kmDc7XaxWq0wGAwwHo+T+DWbzTCbzfDkyZMkBr///vu4uLjAer3eux9Y24tGwNKGHPnN37X+I79pPbjvcmJAVMf6mdaV1p/+PCRQqFDiBLnexe5je3R8OvsMn9d/vANXBWG3j9GsurGCNjJqWdsN6+4QcsKQCzrRe55/lE5OHMn1XX4XRaXqGEB/bDYbzOdztNttnJ+fo9Pp4PHjx3j8+DHOzs720mo2m0nYXa1WmM1m6HQ6OD4+Rq/XQ7/fx3w+T+PLxcVFEpn7/X4Sh7UfUDTOleU2P/umHX9Ofe3josLXGJHf/BhZ74e5KF/ve15XPl/73K3zId+JxolorNTPHS44uu1qo64NojVZ1MY978gPUb/xsUnHNy+jl8frIFqjuE9z46yLid7/NF+116OD9Tsvg/rUy+r5aLkUkS8Pjc2HbNH3feyO5htNw79zHxxCZIeXx9c/vs7TdHSO0fWP+yAnuuv8F9nm0eP8jP6K5mvNJ9q06X0816cKCgoKCgoKCu4PLgFMAYzu8OwEwPuv15yCgoKCgoI3hHsvCAP7BEmj0UhEPQU0PyrWhVSPptRj+pTQV+JF83Wyxcl7jWBzcl1BYZjEk5LOnl4uCkZ/10hCfsefUboReeSErRKURESiuy/5zyN4lfRyotjJLic6tS4jeAR0FKGrvojsZDtwgVvbgAqzGknaarXS7xFZrPWpbUB96s/731HkRxQtonWoeamP+SwjK1WgjdJhWwBuRlw6ee4/VbzT5/27iMyOhD/vi5GvvR345o5Dvo4ig/hzvV7jyZMn6Q5hilwUaSnOUghut9vY7XZYrVapPOfn51gsFphOp5hMJpjP57i6usJsNsNqtcLx8TGOjo5wenqKi4sLfPDBB1itVunoaBUPmKYLPeoDbcNRm3OBIqpDT1fbuefHd5yM5+e5OlCoAOflY/7c0MG/VZDTMUb7Kfu4Hh9d1/Ve/1WhmLao33Ss1nasGzBui9CKBAn3MX2n+Uft3f0cjRFa1tvs8jmB7zKtwWCQjtumn3jP8nK5xOXlJc7OzvDgwQOcnZ2h1Wqh1+uh1+ulyHadg3lnMNvTZrPBZDLZ23gxnU5TfUQbOm7z84uKJb7JwduAi7vuPx1vXeDR93Sc1nJFc7KuczStKA9fo/jcp/lFfvJ39dQML6uvSVwwu23M9vIR0drJ26X2C5+ztM3qhi3PPye+aj5RO9M1hMPXM9GRv1FZvN7ULrc9asduTzSGR+O7rwu03NH44t9rOpo2241vaHOfanlY79p+3Le5DQnsq94OfU0ZjQO6VtBxXtsJf9cNnD5W5OzWfqc+8rWH2qnzYDTucz479FxBQUFBQUFBwf3E9wB8jLsJwgUFBQUFBfcX914Q1ug+JdoORSE4gQLghgiVE0darVYSHZSc5ztKlkVkotpCYULfUxHC89efSjxpBIlGdjrx5REvLHcUeZYj0pxUUtFU89b6IZxMcxGyqqo9//p7Sm5F4ooKQS48KynpUa36flTvfs90FOUckY3qUy8zCXw/Glzz9/sDvc0pPPpSyX61WSOQvZ3yORXRNPrRSV/3vcLFEiXKc/2BBDnzi2xk/UYbDfQdbb/0T47A9/z0O5YhuqOWebRaLaxWK3z00Ufpzt/pdIrtdpuOy9XjLykIX15epqOMV6sV1uv1Xj/tdDoYjUbodrs4OTnB8fExAGAwGGC1WuHDDz+84UPao9HC+ozXNxEJCYfq14WA3PhA3/lY6ES1t+8cge1R7qxf9nc91pnPb7dbdDodtNvtvXyr6voOZwrr/Jxjp9Yz82g2m+k4ar0qgO/qGOh98q4+9rHPhYtDUaxeB4fmI/38ENimVKDV+avf76eo3qq6PgGDx0PP53Msl0us12t897vfxfn5Ob797W/j6OgIDx48QKfTSf/a7TZ6vR4ApPu0m80mFotFOr6b7f7Zs2e4uLhIz+jYf6g87iP1nfrMhVL3UzQmad+NNkcA+9F+vmbQ8ZrIHa/r87KWISpTtAbwd3xc8Hana63IVvWR+i+3viCiTU3+TC6fXB5RH9IxJdcX7mpDlIevA6I5MhK5c33Q69H/1nGwqqo0bnl5vL37xpVD5Y7yjuYQXxtFY5+Wkb7SNWuUL9PM2eb16n1Bv3e/ax/1TTtRv/exlGmwP0RzlteHr799neObRnyzkdrh+aj9Xje3jfEFBQUFBQUFBfcDPwrgy2/aiIKCgoKCgjeOey8IAzfJI40MVeKGz6rQ5gS7Cpz8WwU0Jb78mGeNdFJih5HGTlw6CaokFr+Loo6ivJxYU7JMyTclszyCjWkx6lAjWCIyOoKTopquEpk5wsvFDBUh1uv1jfrWv5WcU3/lSEl+rmSbljOKstByRqQ+fReVj0KmixZKiGt6Lh5ovWrbiIhibzP6t5Om0edO8N5Gfut7SgYr0ep9MSfWar17GT16ztuV2uh9Oap/tnMVdLSf8ehgFRo1cppCWVVdC2Gz2Qzz+RydTidtbKDgxWe73S6q6lqM7Ha7aVMIf6+qCp1OJ4nP/X4/3ala1zXG4zEePnyIjz/++MYYVFXPBWFurnBEBPyhKFZGi+cEKB1DcoS4IhJmtD4isD5ZNq9Dtc3v7221WhgMBinqVMe59Xq9V5+sM9aVt0v3IdPpdDp7G008WsyFi9ugY4eX1aMsvT7vIvT474dAv+u4pBt4BoMBut0uhsNh8mW/30+bGtrtNrbbLZbLJRaLBZ49e4bLy0t8//vfT3MjBeW6rtHr9dImi8lkgsvLS0ynU8xms+RvHr2ucwzzjtqwI2o3Pkbp91qfLvLo86wLHfMj//tPTy/qS7oGicStaP7UNKM8c3NAlC9w825knyfoR45pvo5RW6Ko0NwYHfUhF9O0vtx3kQirZVZbojryMdbTiHwXrRu8vUXfqz+juVfTjTaCeXp+XUjUJtz3UXmiNYi+G22mc7s0P2524LgZtcVojPJ1ZTTe+Vog1998k5u2Ic0rt9HE26WOFToWcA6N2re3Yfed/tT/2+ja2H2qZSwoKCgoKCgoeHvQBHDzVMAYQwCPAbz3+swpKCgoKCh4Q7j3grAS/C7WKAmjhKEKqIz2UnJdhaaIFHMiGcAe8cnv9XhRFypcGIyOyY0IYcKjPPWzSKBxggzADeEkEmaUYG+1Wjfy1TIoMe/EohLZ9ElEHGpZ9RhMjyiJyG6vW7UvIlqZr0aKKLGvhK2Tci4A6HNO0GqUrfvK/eH5+Wf+uUd8ado58jzaPOD144j8EZGxTrCqb3JliKKmPC+10UURJV5diIsEg5wwEpV9s9kk0ZXjCetKRTIVlYfDIb7whS+g3W4nQVnHHr47HA7RarXQarVSn+HvFJF3u+vjczk+MIqYAudyuUz9UsvhbVPrIfo9ItDdh1FUoCMn3uh3t4kOORFARdhcebT+1acU5NkXedct771lut5fKG6pbbSb9a/2VVWVIodzY8NtcGHEx5UoCuxQGv6Z1u9dBAPmyTKp2Mef3LAwmUzQ7XbTdzzxAkA6Tv3hw4dYLBZ4+vQpFosFrq6uMJ/PUVUVlsslqup6swQji3Wzhkc3qgi12+1uHHN/CF7X/N3HmlxUn39G6MYAP8o5EoAim6J5ImoL0dwdzYtqo899/o6XUT/z7/kM11GaR2SfC53RuOv5RPNL5Mdo3nHfRmssbVP6bjSvRj7JzenRmKltytvWoUhYtTeavzRNr2+3O7eBJzf25iK4/T0fl70fuU06rkS+dD/o59Fz+n60kU3Hah9DOc57vtpuozE9t2HOfcOx6pCPdd5SP6lffR2m6bMcuTHhruNiQUFBQUFBQcHbgWMAX0URhAsKCgoK7iPuvSAMYO+4YifOlChUUkZ38UcEqZJHTtqq4Ox5OOmiAqbeZ0zymnmokEH7+B2h917qHa9KkikJ70S+E0ORyMA0VLD1SM6q2o8ejohNJyDVRkZbaj3lCHnNl7Z75KcSeU7u6jtKlOlnaq+LTkxXozu0/CyDRhPrkbM8staJTCcnDxGduXbo/uL7h4Sfqqpu3DsbEctaN+pbbZeefpSmijlKkEdEJ/3F91Qsd99EfTsSC9SXTlzrpoyo/bHe9V21Zb1ep37NdtTpdPDgwYN0pyrz4FHSVVVhMpmkcrHcvV4vRVZeXV0BeL4BY7vdYr1e7x07zXuKLy8v03d6ry7TjdqLCnnertSfhPYVhZPgOWHHI+GizQWR2JIDy0exnn6K2t52u0W32013OvMZHhXt4rWOX3r/Osujgih9zvHWxxHdcKTC6MtA26OPFd7HfcOM+zUaEw75XjeQ0Afa1yn08jjtwWCQxsNOp5NEd/qW3z1+/BgnJydYLBaprhaLRRozh8Mh6rrGcrlM/2i/CzTat28Tr9wPDvWvj2k5ceo2X7qYdChfTVPT1rksek8jQX2s8nWNp6vv+HwS2cu//eQTn/c9b/Wj/65pR/ZF8Lpivj6OeR9nnbqP+KzORWqDr4v05AS1wdsZ3z1ki6852MY93Zw/onFcfZMb5/wZT9Pz07E21wc8f/08atda5sh3fD9ncy5/b3u67tZNmF4upqPzv3/nbTdad/lGN52bWF5NK1qLRpsoor/dPv8ZjTkFBQUFBQUFBW83/jsA/us3bURBQUFBQcErx70XhJU0I/nikaVOXgHPySC9s9fJNiX/KBD48bOarkcCezSrCjaMSovIq4hk4zGpSh5G4jPTUeFU31O7I9KZcH/WdX1DjGB6eh+uC61KmvK99Xp9Q2T2e3q9/Fpn/N3tcHLXRf3o2G4nFbW+VLjyNqS+dzGfNmgeEVhu/4zHqKqvo4he5qkiqrYFvyc5Ivw1X76n7V4FM60T9VfUv5wY9zYdEdbaB5m2CpcaVaX1qHWtxK/Wldt/KOpJhW/WBzcxaF673S71Y40IpBDII4opGuqx07wTtdPpALju3+v1OkWzUjxmuqvVCnVdp2OlO50OTk9P8f7772Oz2aDb7Sa72KZ4jHEk1DrRnhMEXLBwsZHQscujjV3YyIkl3ra8TnhctB51n4vqZd3wHmfexcxnVqtVujtYx0kfN3QTD9uWirzRuKE+4d/RRorbcKhOmJb/dHHEx/po/FLfRdD5jb7V4155LDQ3PjCKfbvdYj6fYzgcotlsot1uYzqdpv7Fts56qaoqbbLYbDapnj/88EPM5/N0h7CXWY+K9vvnc37NwcUZj2B0Mdbf1XHMI/00b2/nud8B3Mjf1whRn/J24OsUH2s1fRcmD81p2n8P+dbHbB1DPR/m4XZo3pqvR0z6WsfT1nnEy6DjgPZr9WtOXHMfe534uOg+jcZO/edjnZZHv4s28EVjBsVR95fP/e57LZOmF/3t6+9cu4/GOF+HsEyevtaj+1U3Mrn/og1nPk7qc16HOb84ovWLbkbLjePuL9/ooGlGPlQ/ajkLCgoKCgoKCgqIH8A1ZX7zmq2CgoKCgoLPM+69IOwkogpeFHtJzhIq1vI9JQKBOHqQgg8Ja+C5gOY7/pVkosAHPBeOmFZE8rnA4EfZMR8liVx8VbLMxQol/pzkUkFNiX8lltSH7n89vtZ95+K71wXFFtoRkW8uQCp5z3xyxJl/r0Sh+j4iZRVKwDlhrN852RuRqfSzkn9KYt4mUEQ2evnVHr8bm79reodECyWKo/dUBPENCVr2nF/0Pa8jbfNO4rqIrqS45x8Ro1oGryePFGNb5tHA+jwF4U6ng8FggLqu09HE9Fm73Uan00liJUVe9l0eF11VFfr9fhIgefw07089PT3FcDjE1dXVjXbHccP7kbYl938kCvhnPl7l6s/FBK8v9bv/rW1E4ZtgIjKdeakPxuMxhsMh2u02qqpKEau8Q5hHP1NMrOv96G/3G8Vg3uns7USfVdGY7SMnIER9RL+LfONzhT9/l/rK+Zvv5MRu3m9NUXc2m6Hf72MymaR3lssl+v0+Tk5Okr+rqkptkwI/j0WfTqdYLpdoNK7v1J7P5xgMBnvzm9e/z3uHEAlQkaikY4Q+z/TZxn3eUpHH88rZFo2RPnZ6HXqfBJ5vmNINWD538TsXZH1+0Pc8v1za/qz73Mug3/vv3q5zbVx9mLPLBXXtxz7XObwOfFNMtJHF65v5HhK43Xf6MxqTfX50YZzlztWdpsdntU0zTX6nG9f0HW3v0Vooqu9D44+PbdE6LeoD7teoHrTv+rjt7dbLpH3mEKI+mxOcfe7y/H1zkteZtx33ha8rcxvgCgoKCgoKCgreXvwYgC8C+PabNqSgoKCgoOCV4q0RhJ0AUtFKowuULIvIFBLVJEb1aGmNxFBxLiL0lEAiqcSjeolIkI6iO5QQ43MUwJSk0ohQJ72in8wvIuvUnyoi8nMV25UYZ3n4nUcHu1DHaAknu9Qvmp7apMS9Cqu6KYBQcd/rU+GEOfPVutAyMR0VJdQGLWuOBOczUXlULI+IZhevtX14XfBvJ35VWGAa2jaZD4969U0G0eYArS/tL+oXJ7hV7PF+4vWkbUE3MfBvJ8W1vqKIMiVrvd3oPcLqD60vvsOI0k6nk46BZhoUH1erVYqa5HHGl5eXmEwm6W5gir4UmxhtfHV1lcTIXq+Hs7MzTCaT1L6j8SiC+iwi8X3sUb97HWnb8TEg9y6fybWZCN7eOXYASOJ8ROKfnJzs3dfM+tTNC7yrFnh+1DTt41HIq9UK3W4XdX29IaDb7Wb94r6oqipFiufKd6js+oy3OfWJb27R9up5RMJMBN08xfIAz9s6xXQAGAwGKTJ9Npuh2+3i6uoqbXCg/3UMZhqM/mVfW61WSVDm3dpaTp8r2Q5zcMHF3+czPt96ffq4QV/k+kzkbxdz1KZI3PNxMte/vFyR6KTfucgVrQVczPR+G7XbSKTLCXTuU33ex24f43yeYhoe+eo+0LEvst3HQi+L2ujzia8rfS471E4j4dh9o/noqSmen29m8bJHeUSb0XR+dD/kxvScT/U5fd/7k/+ua/JD6yidm33tou1dy+jtQH0R9ZNojRDZEvVvfcbHal1fK7wf6/jvG6/4TG5tUlBQUFBQUFBQoGgA6L9pIwoKCgoKCl457r0gzOgFFzjq+rkASyLaRUHgZjSbirhMm9/p3bAkwUlek5yjTUAcXaIirosX+o6KjCp2Ei7IOSGq5XVCz4lrvQ9YRW4+p6Sjk1YqnDipFgneUVSqkrz0oxN1arP6kj7k30pqkhhmmaLjmXNEpfubeXrdsTx6R6ZH/fJ9jwhXf+pmAZZVfa3kr4sfkciu5aO9SpAyfQo53h71ffVnJLwoWek2ejvwSDyvC+bhQoX7wtPw9u9krPaXXN4RSCYzDfWBE+70y2KxSMei13WdIlO1nfCeYPr//Pw8RVlys8X5+Xn6fTqdJlGMabVaLTx48ADf+9739khptjPt446IyHdfRP0iEtv1XW/fmqaLM1oPLkw7XARQf+t77O/82W63kxjcbreTD7XO+CzT1rFIy+qiGI/x53c6F+gYxfZ8KDrY68XHAm+vkSiTEyS83tz3h+xhn/Voc77P+63n8zn6/ev/TPP4aI2gvri4SOMnxfuTkxMsl8s0/i2Xy9RXlstlqrNG4zrS+vz8PNwYwp8+LuV8677yNum+8TEUuBl9qZ/r/KVpR+lFfSDaGKPzr/6tafj4r2l4XreV2cdZwtcrURuKfo/Sv60evJxaRvVltEFC13GR3/0zb0c6X6p9Plf4ZgyvF0Xk61zabmM0J6ovo3mP/fNQfvq3t28XQd1nhD7nG820LJqX/x6l6fO116XbH5Xn0NjIZ3xN677Wuok+j9qyCtgOzVvfz60z6Ffm4YK3llfTYVo6nxUUFBQUFBQU3G+cvuDzTQB/BMCvvQZb3g7cxm8UFBQUFLwZ3HtBWO949Pt9lUQlmaMiggpVKmzyMydZq6raE9AUfE7vVlSRwIUTFR5UoONnLnITTmBq2k4iMl1Nk+8pUchyR5HATM/LE5HIhIqi9CXvhFTfOuFHW9UvJNf1HQpem81mT+Bh3kocHopcVeH2EDGp76gfvQwaBetpqz/oa7VN69pJfic3PSLFCWG1RcvgZdJ0+A59q3Zo+/R7MXMig+atdezRXb6ApB1R/fA5F51ZFrfXiXslbLVM7mu1hc+qaOgiPu2lcNXpdPbEf7ZRRqhOp1OsViv0+31UVYXJZIJnz56h3+9jPp8DQIoS7vf7WK1WqW9SbFssFqiqCoPBAIPBIN3NqvVKX0VgO/W682ipSBDx3/W56Hsfhz29u5DVkTjjZLiPf/TP8fFxEtY3mw3m83m6k9n9sN1u947o5nva1nkfLiOEOU7xjmj2E44VRE4MypX1kAijc5j3K/V57n2fI+9iC9vVbrdL7bzVaqW7fXlEOu9m1o0Jy+UyteHpdIp2u42jo6O9DRfdbjdFCTO/druNuq7T0ek+n+qx7fz9RRCV34Udb2cuuPi7uc0Yubmcv2udRGN/TuTSdqJjKv0f5afz0m3zivfpXDuLxKnIVo/S9LJF7T5at+mYzLrQ/pUTz3N90OvH1x0OHzu0Dv19T9/LqnMW0/HNiuqnyP/qK88rajvRWKw41M68jeTgYz7nbi2X2ukbv9wnOmZrHtE6wt/TsnIcidYNXn7vF74xkND1nbaL3LvaP32+9bnTfaVjoObr72hk9IuOjQUFBQUFBQUFnz/84gs+X+EtoMxfG37fD/8+/Lk/8Ofwjfe/gb/29/4alpvlmzapoKCgoOB3cO9nNxVBSIJGpKmS9PzcxS7+zuOYKUiR6HdRi+IA0+W9kx6dooScR5EoceQkGdPUMnq0Lt/3o5nVDicSKVJ5WZxk88gCEu7MN0cMqviZi2pxUpb26l3LGpnGz5iPR4vQLiWOowgtgt+piEN/6H20URlVGIkIYCeu6Qe1yduhlottVQnniPSLBEAVYFWgjohmP+KaPtZnc+XR8rsNkRjimwSiiF8nV72skaCR28SgR397Gdxvmr8LawD2RCdtX+z/SrZq+a6urpJQuNvt0t3A7XYbi8UCm80mHQHNu4DPz88BAI8ePUK73cbl5WW6l5VHUA8Gg3QEdafTwXg8xnw+T77QTSm3HRMZtSf1cYSo3yoBr+NeJFhEwlJkk0LHOo7NWudOeDOPXq+HXq+XRHq9h5ltpN1upyOk9ahZbjpxQYaRq4xm9fHMRTba7hsrDiHqE5FfcoJBNL7Sjy58HYL6Queiqrq+35rHObdaLcxms71xnP6jwK5HzvPobdr10Ucf4eTkBACwWCzS+LTZbHB8fIxms5n6jG6W0v7I6PsXgbd5H+8jUcfnUhf89LtIkNI0ojE8J7Ll5jQXDnVMJKJ2oeNZdEdsND77GKzP5cQs/T3ym8+fOXs9/2izF+tAv4vsiPL3vPxd2hfZq3/rmJBrj5EftIxat1HZcz7VOU+f8fWSC5aaptcD22ld75+KcZst0fgfza/+HpC/8iLyjfpZx1pfj+qaTvuSthmdy7wc0bynPtJy+UYMbxvRmKG/axm8ntR+z0N9cKj9FRQUFBQUFBTcT1S/86/gdeNsdIZ/+1/9t/HO8Tv42rtfw3sfv4e//U//9ps2q6CgoKDgd3BTjbtnoAir4pkSrU4KKREfEVR6v6QSKkqSKRHNf0r0K+HmQqOLaLl7U/muE3DMTwkrjzLIHaEdkVrM3wlMJcwomlKMUR9HNqpQRpvVf/SD2+XklYptXn7g5vGVfF7JQRdC1HaPPlbfKummxJtHpzDfiMjNkb6NRiMdhRrl5UQf39dNDxT0lWxUX+R8pv6PIl8iAt6JzCg/TSdCJHhon/A2rYK4brBQP3i7clJaoYJijuCNhAPaTlFY/ab1RpvZn9brNWazWRKxOC4sl0us12tst1vMZjM8efIE6/Ua6/U6RVm2Wi18/PHHWCwWmM1mmM1mWK1WWK1WaDabWC6XmEwmmEwm2G636Ha7e36hzdrOIkSEsdZv7h3fKJITB/i7pxc9n0uLYCRqJMax32sUMKNUh8NhEi0bjQaWyyWWyyWqqkoRrt4HFeo/zjUcP8bjMXq9Huq63ruDmG1N/c53aMcheB/0OvE5TqFjXlSXUf0dgo/BFMy1HEzz6uoqCe2tVguDwQDr9RpPnz5NZWef4DvcANHv99HtdtFqtTAajdDtdtHr9fY2IUUidiSW3AXRWBmJLxF8rvDxK5qfdWx1UcrH/1z9+Vzm/Sb6lyuPr1s0P4WfJOJtMHrPx1cvq86NLozxe18/eXm0H+q6xOvX53OvR/Wr+8L9GrUD/V3tVFtzNviGt5wvfe2iz/k4oGsK3ySYExi9HtzHvnbzckXvRfXFd7SO1OZo/cXvfc3pZfB1ia4nVSD1dYU/r+2Kpw952XwzipZF64y/u++9rDpf6MY8XVv7+tH9oT6N5gz9f0dBQUFBQUHBp4MG2mihhyJQFtw3HPWP8O/+6/8uHh09AnC9Pv2Lv/gX8cWzL75hywoKCgoKiHsvCAM3BUglk0g0RlEzJHyAfTGMIgAFFf3ef9d7hfX4auatJBQ/I6GuJJOTyCTCvWxOzkXklpbPiSsSUYzc0u+VyHIikTar3U42RUKNEpr6U9NRUisiyZ0gZH3qcXgeEeT/3C6Pnlqv13vRbGw3TnJ6/Wsb1Hpn/Sg5q/l5+egHby9aF1p/6vdIKHBS3olJJ9Sd3NX2phsMVAxxstrJ5hyJ7qSu/3ThJBIgXRxywtnHA37HqMOcYOK2qM+1/TB9TU/TX6/XAJCEXoq48/k8Cbk8vpiCMQB0Oh1sNhs8e/YMl5eX6HQ62O126PV6aDab6Ha76HQ6qKoKi8UCk8kk5a3lZVtywjhCTvBQf/pz3t/5mQoz3sZyedwV0WYQpq9pU2DvdDo4OTnBYDBIUcCMpOY7rDtGD1fVdeRrp9PZG1dWq9VehGqr1Uoipm70UZFH24QKxrdFbatPIyEp6tf6ufYdhYoed4WK7dHcs9vt0mYFnTu32y3a7XbyPTc67Ha7FGE9mUzw4YcfYrPZpKOheToD7R0OhxiPx3vH9PM7bVu6GeM2uOimfj3kn6j9+5gP3DyqOEpHbYnyv+1dHxO130X1H9nubSeyS9uUboiJxoGoPP6drie0PF6uXB1FY472NS+PC2PqrxyiOczLob72U2nYFnXNF/krt8HB14Uu7Dp8Lva1os7Nukkv2rhyKA/3m/tW34/qwSN0dQ3ka0HfUOf1qzb4GkR9rWsjtU995IJxtM6L8o9s0fFR/abl1fyi9HP9K/K391lvW7etxwoKCgoKCgpeD/p4gH8N/yf8W/h/4UsvfIxxQcFnF42qgb/wh/4CfvorP7231hz3x/jTP/unw//DFRQUFBR8+rj3gnCOKCaUpHPhMoraoUDgImPuHSW6nPRSUsZJOrXZj7JWsYnfeSQCCdroaD2WVe87ZnpeNrVHfcTvXJCLiDol59WGiOzV5wgnQNU3nj4jBSOBxCNMWO6IdFf/uZ05Ylx9onUXRTxr2mqDRoB4dLiLCkp0ajmjsvjfToCqPbRJ7+KNyEzaEQkUEdmveTA9PW7ZSWut12jzgObtbTCKIouIf7VXfaT/1P8qMPj7fnKA9x19ZjKZYLlcot1up+NzKQzzntRms7kXZbpcLlPa7XY7CWWMnKSoWFUVxuMxhsMhqqrCbDZL45aS4MyDkbMOX6yr4OrtnJ9Fmw68Perz+kyOAL8Nno72WX3Gx9zBYICTk5MkZlKcVwFCxwzeDTwYDNDtdrHZbLBYLLBYLAAg/V3XNTqdDvr9Pnq9XiqP3imtPtG5iZ/dhqjP5b7TcqsvvH3rz7uAc1Fd13vjrorcq9UqtUtuVgCux435fI7BYICHDx9iMBhgt9vt+ZdHTC+XSzSbTcznc0ynUzx79ixtnFgul5hOpykPrV893eJFBGEtH231+ctFoWgMy6UXzfs+RumzPk+4uOVzoOetdRyNZ2ob83Shyn/3MvmaR5+PxlO3XccNny89D08rZ4s/oxuV/D23XdPxevexKZqDtL/pGKJrzKg+tL48n+h5zy83vubm56jMmlc0lkY+V/imq2g80ne9X/jmMp3vvWy5uvP01Ze+JvM1pfpH697rzTfrRb7wsnv0cK7PR2mo33STg7eR6F1dE3k79rZYUFBQUFBQ8PrxU/if4Kv4EzjBj+Bn8O+gcf9v8it4S/D7v/b78cd+1x8L1+Z/4Mf+AMa98RuyrKCgoKBA8VasPCKxgCKTRu9FdwGT9PYI4kiA5fcRyRmRL3q8Ht/ViCYlmzRtzY82NBr7R2bqsx5hwc+cKCKUmHMhAcCeKO42MrLE8+bfrVZrTzQjoaV+4zsa6UpBUNOjSKP14ESe3puaI1b5nkdNHKpbfdbf0zrWn2ofbfe0I5Lf2wjTyRGr2tac6KQvXZSIIkaiyFGtd213Xh4lF/XeVSVSKeCrXxhhqe2C7/q9yU4yO9l/iOiOxAWvP0dUh/ybEeT0h/rFxwIem8vy03YtN481fvjwIYbDIS4vL9Fut9Hv95NPZ7MZlsslhsNhiq6cz+doNK6PK768vMRut8NsNkv56xik0aoRlIx3H0Xt4q4+y5HPubEtalNRPl73/DsXfT8YDHB0dIRer4eqqlK9UJhsNps3hMZGo5HGv81mk0T68XiMdruN2WyG0WiEdruN0WiEo6MjVNW12Mx7hSme6vjGeeYuEduR/9xPLiq44OTj98sIAroBx+fH7XaL1WqFuq7TkeVVVaV7skejEebzOarqWpgHkMR0Rgszeriun4vCzWYTs9ksRQo3Gg2sVqu9Mcw3TKn4cxsO+ck3O0W/A/FGMh0r9Dv1vde7z706r0XRo5FwpPlG9kfziK5tvO9Fz6uf1Hbd5KbzZhQB6XWgZYrGY52vNN1ow5j2B/eBp6VpRuuEnK2576MNNFqeSGzmXJebq9T2qC3pz1xdRnOepqv+1zWUzsv8XseRXJ1GtrL8bkvUZnNjnq+ntMxM3/t+VFeav5fH+6mm7fXoc4XXO9OhXb5WjHyleeo6NpqT3e5oDo++i8aTgoKCgoKCgteDCk38EP4kqt85KnqML+MtiNP5DKABoP0S7335d95bv1pz7iEaVQN/5vf+GXTb3fD7ZnX7SWgFBQUFBZ8O7r0g7ISIfk6Cmb+rGAvghmDX6XRuRIw6iaVEC6N7KDYDz+/+8ggTFYOJSJAlQaeCjgplTPNQxALtcPJOy0PiyaOTSa46SaaCgNutwgff0fxcFNS0NcJZxZKIINV0nXDTsrs4FpHc0RHiLkbqP48kUbgQpu2RbU/zV9s8Lb6jZCnLqhG9XmcuKGhaXif6Nz9TAcvfU2Jd82Nb1+/cdxGh7mVwcjxqSwD22pGXKRItWL/axpyEVRtz0V38LidW66aF3e76+PFer5eOxqVvq6pK99Cu1+tUX91uN4nB7XYbVVUlMZJ9YjweJ5GYeVxdXaHb7abjellWjkfMl2nmxoKITI/IeW0PUb/yMUrrJhJqNL3bwDT0CH/WNU9C0LQ6nQ4ePnyIo6MjdDodrFYrXF1dpaO89djv9Xp94w5SAOlYb/7ebDYxmUySENxut3FycpLKTlE450uNnr+trPq+/q7jnvYx7ws5AekudU2wzjQy2CM9VeRm3dO3g8EAi8UiibzL5RKbzQYnJydot9s4OjrCxcUF5vM5Wq0Wer1eaquLxSKJ691uF9PpdO+KA9ajlvmu7SjyS06Q4s9o3nN4PfgGFheBdFzwetCxTMen9Xp9Q4hyGyIhycc490XueT+NA7gphOX8eKi/+zpAbY7GZvYxnRvdJj4Xbb5SMJ2ob0RRlrl+Eolt0TORX7zvevvTv3UtoWl6PlGaLG9uE0rUPrmJ6dCzTNfbTO6Z29ZRWiesa30m2tyi7cTXQOovn7PVL94OojIwD0I3DkblUnuidZHnxf9H5MYXbX8+zqs/ovqIRO2CgoKCgoKCTxcDPMIpvoYn+NU3bco9xwMAP/0S7/0ogB6KIHw7+p0+zkZnB5+pyp3ZBQUFBZ8J3HtBWAUkRvDp5xFxqQKO3lnohBEFFifnNA+NbiW5QztUjAKei8X+Hv9WIklt4j8KYircMU0nAJ3s9IgeJXz16E0lBJm2E9cunGn0oxNTHgWqULHByTX1eRQNR2jEmhOMObI/IgCdoFSbDokphPpM6y0Swpy4ZIbWL90AAQAASURBVDn4O+vE3/M2nSOjPYrVI3jpLyX7tf1pftq+PH+Fko3appzA98ix3PdOCus/P+bSCeFIXFDkBJhISNHv6Uvt7/4eRVtGTfZ6vdQW9b7ZRqOB4+NjDIdDNBoNjEYjANfi5nA4TPXKI3h55K6OVzzWWPsdoRtiIkFYoVF9/Fv9lPObt2d+FkXyRe/7e4fqi2Mf24XWi54KwWcePHiAr371qxiNRqiqCsvlMkX7qhBA0ZcCuvuE94ovl0v0+33M53PMZjOMx2N0u108evQIvV4P8/n8RtpMX9uLbgzK1Yciekb7iPsvatve57yP5KC2+tgIPBe4t9ttOvpchXam0Ww2cXl5uTfmLJfLdKczj5peLBbodrvodrtJ/JxOp6iqCldXVylymzbofe9avhx8DIz8peOYjv8+NubmFkXO37m5KJce33NBx+vO0/Ux0cun9kVp+1yg7x3ytc43ar+m4++rDbfNNT6m+Hzh+bn/dQxxH/qmp6jda9oeyQwgO/4pXEDM+ck3F+baj4Jjoa/FNA/Nx9dc+p761dcyXmZNK5pPc75Qf/sa1euN9tylz9d1nT0hQ/0abWKK1h9eBq8T/lT79B1dr/kamp/5eljz8d9v86dv1itRwgUFBQUFBW8GXRxhiMdFEH7tqPAW0N9vFD/6hR/FuyfvHnymxu0cR0FBQUHB68e9nxE1GpQEkYpz/I5kfyS0UaTRY4uBwwIG/2ZEmJOrbhef4e8kznmfqD6rR1sD+4KoEkp8noIGy0G/KIGnJJULKi4E8fOI8GOeGmEclZ9iiJadNkRCqKatpJdHWPB3jbB0wtDLEJGr7ptc2SOBJXrOyUVvM56vE7Kepm88iEhBpqMEvJdf/cMNCpGNWnfeR7TeFFonWl8RUevEs/r7kCiide+E5iESOarH6PMIEfnOvsUjarXv+73JvCeYfWM4HKYoVY4xnU4Hm80G2+0Wy+US4/EY8/kc6/Ua6/Ua3W4X4/F4T0BrtVro9/vJpm63i6urq71xwNtYVEeO275zotsJcPWpiyTuyygdfp8jrF2I0PGD7Vnrp9vt4ktf+hIePnyIVquFyWSS7qFdLBZJSOx0OmF7ZGQ2x2EeZ1xV15HbvLO53W7jnXfewcnJyQ1BmOM7y+kRbndBNOa434B81Kd+nxNODgkqrVbrRjSob/7hZ9vtFu12e2/e2W636PV6WK/Xyac8LppHoA+HQxwfH2M+n2M+n6PdbmOxWOyJ96vVCtPpdE/EJ3iU+213oXp5o7EvJ8Bo23Y/uzjldXtorPc8chsFDo1j/pwLe2qPj/s690dp67zptmh7dr/4eK5rMRfcIz9rntFcyt+jcfpQP9A0oj6ofov8m3uH0HWUtxkfM3WujWzXtQmwfwqFPuPpRt9rdHtU9twYn/NNro68T0RzfK7986dv7PN3fW3ugrzXh+eba/tui+btG0B97Qg8n4dytvDZ3HiiPvY2Eq19WD71vaalx+rnylZQUFBQUFBQUFDwIvjFn/jFN21CQUFBQcEdce/PCFMyiyS+E5FKUmtUrr7voqgTl0pyO/mm4iwjolRY0yP4GEG83W6xXq8TIahHWvM5Rq8x3ejeOSfs9QhPJ4somqi/6Ce+q+XVI3pd6FNySW1W8kpty4kS0ee0VY/6Vf+on5V89e9pZ85XbB8RMeftIScWqEjIeo1IwyiSSO1jOk7+6ffuK00z8jU/180Qbrunw3pTRFF4LlyoeOB9gX1OxenIbrXd+4P70f2i9qufbyP1vY9ou1Gw39Z1naJGtb17nVEg3Gw26ZjXuq7TUcM6DikR32630+/9fj/5k0LxeDxGv99PYt1sNturo2azmcZAlolHVzucSPb69brNCSmRz/2fjx9at1E9RemyzNoXIyHi+PgYjx8/Rq/Xw2Qywfn5OSaTyV470fHXIxPruk5HFXc6nXTU8Xw+TwLlarVKguajR4/25h0i2hTEPnHIjxF8rtHy+++R/14ULiT5vMixE3h+rDDbNd/ZbDZp40Oz2cRwOMTp6Sna7Ta22y1arVaKkt/tdqm98w5h1nuz2Uy+Z92xL9IOPUL6kA8P/YueoS/cv7rpgn1Ixzj1u48RPp7r89E47+lF9enzUyQuEho1GW1Y83E0gs8x+rwLY7q5KfKLvxuVXXHID4fecdEzeiaKJnV7fM0YiY46VuqaQNPJjZGenqbla1cdF1R0dx+pTfovt4FL0/f60+9ybRvYb2deztz84s+qrZHforR1rM35MFor8J3cGsDzicR8TVP9oe2ceURir89n0TjB9H3Tp/pL043+T1NQUFBQUFDw+lBjh/fw/9n77Kv442/ImrcJjwC8zB22Fd4C2vwTo9Pq4PHx45fiFgoKCgoKPn3c+whhjdZzIoWCoUZH6D2EwH5kmhN2DhW69ChdF/s8EoDEj+/YZ54R2eY//ThsJ31oH8U/FX7VJiWP9J5hJf5ykZh8Rn2v5Y6EvYh88/cB7EXTsf4i4oz1ouI1bWSZ9T5cihEqYNA/Skxq3tEiR8VMJYS1rXU6nRuEqNpFG5zA8zyjSDGve68b3wCg37N8KlRHhHEk2PKnH8vrwpza6KS02810cgS4k7ruT+atBLiTwyp4uKDjxKr3YY/cInRDBQUvbyNVdR29Pp/P0Wg00Ov1UhTwYDBIR0lTQKTYO5vNsFqt0Gq10Ol00maMyWSSjtLtdDrodrvpO455epertnP2Ed3cEcHb321CS9Rn9G+m6e2JtrjwlNssovbwWfW5RrOxvjudDh48eIDxeIxGo4GLiwssFos0jjAylXYsl8s0ZlDkZ3rNZhP9fj+JwJeXl8n/vHe41+vhy1/+Mr75zW/uCZm73S7Vj/vgroJwJDS5/71udKyO5oi7gj7RfqR2s53TZ7zvlxtA5vN5OrkCQDoKmn5er9cpWpj9hL7i+M1nl8slrq6uUpn8CgPad9dyqZ+izyMfe3uNxhciEl5c2NJ3tZ68L+mY6POC2kPoHKU2+jqB70dXTnhfjDbcRH9HApra5ONB1FajevHPojx8/eF/s13d1ieiecTrzb8/tEHD/RrNiYfGXm3v2l48jVzauv7w53Qu1bKqHfqOtr1oLnX7te0C+2sG95u/o8/ofO5zSfR+NG7m+jt/1zaubUbLzDlBv/Oyqc99E4SujfV6AvW9zk3+z+vFN1P4Z7rWzK1rCwoKCgoKCl4Hakzw/t4nI3zxDdnyNuFnAXRf4r1jAD8H4O+8WnPuGR4fP8bX3v3amzajoKCgoOCOuPeCsB9rCewLVDmyTH9GRGhEiioJpMSO3tFJEsuFX6bpxE9OxNH0WBYVTf2Y4CiK021n+lFkArAveAHYuwuZtmj5aFMkiLuwogKbE5R8V4V7jbiLfOm2s4wa1ax1G/nfhcGo3r0enORk3fizjUYjRbFFbY+/K4lI2/iTmxec7HMhgO0hEtr0qMmcSKvPuz1RW2I9RdFc6vfobxWWoggeFUZy36uPvC7UzoiU17TYrtwv6uOojRB6+oAKB/T5YrHAbDZLAtnx8THa7Xa6F5jCIiPLOZbxSF3moXlRdOMdrHzXNwwoGezjg0PbjAsBuX4Ukev6ud+FGAkZOeLdQdt1U4KOe/TPbrdDt9vF8fExut3r/wzO53OsVqskzjICezAYoK6fC8Lsrzr27XY7HB0dYbPZ4OrqKkWhUqgErkX5hw8fYjweYzab7Y2fkSCkc1M0rh2qG4X7K1dvOZ/eBkaaex/XfCnsclPDbncdMc0NEDySu9vtpruy+ZyOk81mEycnJ3snJMzn87QZ4vLyEvP5PLUBn8PuUsZoDNB252V0//rmr0NtOtrsos9wPvTNNZGfo7nnECI7idyc5Xn6PBCN9VoeFxj1O/9d1x0uaPl4EW0o0Tx9bHFb9Dv9XMW6aA14aN2o/6JNUZFwp3UZjXORb/U5vQokt5Y4tCnKn43WErmfkQjtdeDvaD5R3u7bqC69X+t6kmmqbdEcpOX0MvkGxCgfrTemy3nZn/Pyue98TeV+dYFY26j7Q9uGpuvwOeFlNgYVFBQUFBQUvBp0cYwmethi8aZNKbiBJoDemzbiM42qqvAnf8+fRKfVedOmFBQUFBTcEfdeECbZwTtlCY8uUJGEhBCJHpLMhJMtJH40GsjJJI3G0XRcLIwIRr7vf/szXjampeJCREZHYoHmQ/FDfUpCSv3C79TWSAxmuTVamfl5tJKW0wWSHNkeEddOCmoaWp+av9aPE8Q5MtvFArVR7df6YLnVTvVT7l5fzUdJxJzQ5BEptMMjEtV3ujFBhVhNxwlhJ2cjItgJcCfRI8GW/7ztO7EdRbtoObz+9PmIhI4Eihyqqtojkz1PvYd8vV5jOp1iMBikY4cpBm02mxRtSgGNgq8eKT0YDABc30PMTRI8gn6xWKRxL/Kj9rnoTkH1k0cg5oQWH0u8jfKnjpneJqK+cxe/85+e/AAgHf3carUwHo9xcnKCfr+fjnbWsaWu6yTIU0yniAlc91cec9xoNDAcDtNx07Sd9xCzPo+OjvD48WN89NFHKS/1tc8jdy13NI458R+NV+pb7/fRGBmBbZCgOAwgtV8dL1jmTqeD6XSKzWaDwWCARqOR6oJRw76JCgBGo1HaQLNcLvH06dMkHl9cXKSy6DsqIN9WHi1zNH/xc/cfsdvt9gRybcfaD3L9R/PXdsHPDz2v84WPxZEQFvlCv4vmPBe+cgKbjytuS9S3PY2csOVpeplzUY7RmizygZZP39W0I0E96nPaDqJ2E9UR341sj+x0GzUtby9aLh2r1M7Ix77O0TlR842iUd33bpeOD15v3ncI+lJPV9ENidE6JtqY5m1WfZfbcBbN/z6XcSOQr1N8jRGNy9H3hJ4ApNB1eO6edO+Xard+d5cNSAUFBQUFBQWvB4/wUxjhC7jAb71pU+4pGgB+8E0bcW/R7/Tx+7/2+2/lMb5/8X2sNqtPyaqCgoKCgkO495chaMQRsC92KXGpUbsa1UpBR0kzFcuUUNIIzugOUIpAEQmk9vGfRoAq4eXEj5JSapeLUZHN+pxGVqnNzJdRYYfIdd7XqCIa0/OIS62LiPxVm5SA9SgszScXLax17WSY16Hes+wksAtWTohqO4pIXyXfvA750yOxFeqzKKrThSUl911w8kgnrXdvE0zbNzCwjahP/B2/m9jLE/lA+5/X8aG0nLTm3775QP0UCdcRoc73I9vUPxq5pvnosblMazab4fLyElVVpaOL6/q5mMt8KQbz/aqq0Ol0cHR0hKOjI/R6vXTcdFVdi8K9Xi/lQxv8DvXILoeT2+5v/V3bUE500TrOEdhaR7f9x0Jt5PgUjSn9fh+np6cYDAbJ91dXV9jtnt/7O5vN0jHEKqYz4po+I0Ff19cC8mAwwHA4RLfbxWazwWw2w3w+x3K5RLvdxhe/+MV0PLhvCnJ/HhpfI0Tt866bYXLpHUKj0UjHO0dCjvbfVquF4XCIXq+HXq+3t9FKN5lwbmQ9djqdFC2vY1FVVXj69GkS12ez2V7kNUVZ9cFdfOptWf3jPvMxQfsHv9e51NPwMZr/fL6OxpdoveHzkY4Z0XNe3lwfc7/p5g31hz7r5fV8gOenkGjZXWzTMkRzF+EbpXzt4s973ztUL7rO8LR9vvb5L+pzufnK25fXn4+tOr7peyoYqn+17D4m3DZGRON77vPcJi7dKBL5Pvczst/biZfT/eNl07WE1q+vF7RufVPjoTFFbddnXBz2NZP37UPrjtvGerWVf+fEYrXpReedgoKCgoKCgleHBtp4F7/vTZtxj9EC8PU3bcS9xc9/7efxcPzw1ue++cE3sViXKPiCgoKCzwLufYRwRG4RHo3o7zHqhyQ2P+c9iLpr349o1vyc1NW8XcQlgaakuZPsfIYkj5NhXg4+75GbfF9tV8JNozDUHqbFdz1yUG3gd3rcqpJy+rdGOVAAyNUXoUSZk2iH6kDLG5HvKlx4G4miTuhT9ZWK6R4hogQhbXFf8lk9htD95+JkRNT6sdCM3tN7apmGlkN9zO/dBj96OCeieF9xMVrzchI/Invd3xEB7sRwlJ5+puXT5yKSPgIjhFS84rsUKkkw067tdounT5+i1WqlI3b5LKMlGcXKtOij3W6X7hPWO1hps0Yja/24GKVjxCFE4xjf1SOgtR69vWh9eFvNCSg58p3Qu6O17C4OHB0d4dGjR3tHcfP9druN9XqNxWKxd/cyI7SB6/uH1+t1Eo9brRaurq5SGqw3zg2LxSLV/YMHD3B6eorpdJp8o/OKb4yJBDqvCx/n/LPb3le4z297V8dLzTsSetrtNobD4V7Ub6fTSfcC67HmOlb2er29vrTb7fD06VO8//77qOvrTRNXV1fYbrfYbrcpfeB5m2BU8V3hY4LPiVFaLJPOo/6+zxfu82iMcgFI+6f3Dd/U4vNk1J58fNO+63Nxro69rL6+8TYS2U7ofJlrj15On/Pdh4fWYppnrm4iG9RfamduY5HOT94/orVBVH4fE6K+7r6PxhGv66hs/DwnIHt+LJ+uCwmdp1nWdru911eiMSNnH9NSX/ncreXz9UzkE28/3he1LFpnOV9zLNDnfU3nGxloo6YTrRd1Dc+2q59rPebqOhpvfO1TUFBQUFBQ8OmigSYe4CfetBn3GGcABp/g/XLHcw6DzgB/5uf+zK1cUkFBQUHBZwv3ftTWCBMSLhqhp8RIFD2pIoySy04M6bN6f65CySslCGmHk3AuwCmhpGIwI/xIMDn5FRHDLpbQbo+CdfIoEiE1GkfJKyW+cgRuTuxxEkv96bZpBJFHgqqvNaLNy66+c0LONw7cJgZ7XRNevwSJPY+407JpxJ3b7ITtbrfbi2xxf7uYo9/ru17X6ku10Ulib4fqD/WJ+0rLH9U1f2oEt5clWoiybUd2ar145I7mq/lpvfmzkc8A7N0FTMGl3W4ngf7y8hKXl5dJkGQUK/2zXq/3Iq+5IWS1WmE6nWK5XKbPKfbXdb0XrR8JFtpvuPEgh4i0j4hnTZs/I/EiIqb13UOigD/neXC8Zn10Oh2cnp6i2Wymo7rX6zV6vV6K7uX9wRTY+/1+Eof5N9NlNDajilme1WqVbFmtVlgul1gul2i1WvjiF7+Ibre71y+1jUT1c1td5J7VecbH41zfvytUzIjGE7WL89NoNEq+rOs6+baqrje89Pt9DAaD1G7b7Ta63W5Ku9vtot1uYz6fY7e7vgv66upqr937+B2NQ7fhkBikzxA5McjncR3f/fmoPnwc9d99Dsj1L7Xf5y1/V8dhvsOIa8/vkB+07nWtwvf0SHHPO0ojgs5X/pmXjfloftp2FT425qBrDrdL699FfU33UN/V9Sp94ussT8Pbu25K8n/0nc55uqb0Z5lXJBL7+sjXE742zPXHqG37xjFvozrnuj9zNkVzi86tarevEaI03Featr6j/6eI2mLk+2i9TGh60Rx8W7raDqL5u6CgoKCgoODTxVfwr6L9iUTLgjx+BNei8Mvi5wCUtZKjqir8ka//EXz14VfftCkFBQUFBS+ItyJCWCOygJsRHk6gkdBTMVNFLCWF/HeSK4w+4ztM10XiiEBTkgp4LvJ4OWi3ko8k2Bk1pcSPiosaQcVIRCVIc8Spi0sRYRYR2PoMEZFoOeLT7XCSUL9XcktJcL+zk78rUe91dogwVvidwF6/SppqOhFprMKNkrQ5QjgiQqP6YTvyckXko/tvvV6HkWKRj5RgZKSZChJ+pLaSuZqW5+ckpteH12ur1bp1g4O+F9V/1Aaj/GiTR/AA2Is4ZYQUI4JpI+8QXq2u71Tp9/tYLBaoqmsxrNPp7N1ty3z9nU6nk8htCs5Red2PzWYzHc/rhL2XWduek85er9r/1I/+u5Pkmq/72eGbb/RZjoFHR0c4Pj7GarVCp9PBs2fP0Gg00Ov1UluhPzlON5vNdF/teDxGt9tNgj2FZUYMb7dbdDqdVL+s06qqkjB8cnKCo6MjPHnyJAliHHv8KOVWq5Xq9UWgvvJ6YZ1EY8aLQDdkEDreeFvTZzkvsV3ofcGct1hH3MzQ7/eTzRTrJ5MJFotFSlPnJxcg7yoIR/1dy0bcJp742OqiTLSBiOm6AKZ2afo+VxB6F7ZvRvJyRd9FfTFqMz4fe1rRppgo/6gtsj9EY7yPCWq3+s6fVZv9s9w7vrEuskPLoP7y6FDNPypv9L3P496v3Oc67+Rsd+FU68bnT8/PNz9qPWh6OXH2LmlGPva52/3v/ct9FbX3qIy0X9tJ5H+Wz9sOn/ONpXVdp5NDWObITiJao6k9UTvStuLv+/rH/fUq5oSCgoKCgoKCT44xvoR38LP4bfyDN23KPcQ7b9qAe4kvnHwBf/4X/nwYlFFQUFBQ8NnGvR+5KbipWKmElZIhSoQ6OeYEINOuqucCMonMnCiov3v0ptoQkZT6fHQPJclzfd+FTr3/10k8J7X8yFWW26PBlPCPiC4n3/QdrQNPT+sjOvZTyU8neSMi3cl4+tTrBcCNCB/dIOD1E0WSqF81L9aJR+6o/11ocTLU26Ee651rU96GCC2b/nMCWUlOJ47dd94m1G4/Djw6ljuK5vJyRe3SxRV9T+siaheReM73fQODIiKaXex20tvrB3h+VPpiscBisUhCIUVOHq+rabBf8M5u3nkLIN01PBgMkpimRySz3QDPj41vtVpJ6LwNEUFPqL88Oop5e/15W4p8nYOPM74BYLe7jg5+5513MBwOUVXXdzVPp1MAwGAwSBHD8/kci8UCl5eX6f5m3gPMCO1Wq4XFYpGO96a/G40G5vN5uruZbZtprtdrDIdDPHz4cO8IeArDWh4XuA+VPTcu0ieRn10UeBFU1fMTKTQvjiXRfeE6pnMsp1DP95vNJnq9Hvr9PkajURLcG43r+4SZFtvoZDLZiw7WNk1EUbGHkPOXzyv6vI//Dt8c5b7R8d7HNP7zedznABfZVHiKyuXP61ym6es4HM3fOd9GfvM1gwuA7nfvx2rvoTo4VNYIXg85H/Gn2+Q+Bm5G5np9RXUc2e35+Zopag/Ru4fata/FPD1/l23Vo8ZzZYvSidaR0frW+1XU1qM2xL99znebo/8XRPbrmKx259abh/qp/9P+oPWaW5/o3+pbt9fzZ9pRnXJeK0ReQUFBQUHBm0ULPfwg/uibNuOe4g++aQPuJf7Uz/4pjPvjN21GQUFBQcFL4K1gAEj2aZQS8FwMJhmiu/iVVPGoGxcXHdH7SpgrgcM7iqN0I6JZyVsltkgcq8inxFhVVXtCMp9TclcJUSWmKLzqsbsaWZgTdyJxnPk4GUZb+Jkfn8w8+U99qUK0RkZHQqv+7X7PEYxRhJkTh5qWk5oRuRsR7Cyz+sijq7yc6pvbyhUJQE445kQjtSeK6skRt5oeBUz+TZGd4lLk48h3LqywX6p/3O6I8OZnugFAEeWjv3u6Cj2qme1V3402HFxcXGA6nab7tim8dTqdvWPhVaTXOqXYxvbT6/UwHo+T4KybRrTu9d9tx0YD+xtIdExUn0aigr/v5LzCRYOcnzmGah9Sn9d1jcFggLOzs/TMYrFI/UcjVNlGKTbSTvq+3++nyG7tN/QZy0Rxn1HC6/U61fE777yDfr9/Yy6JNvncBn/Gfa4+Ut/7OJfzbQQKtC6e+RH17Nvc2MA5Vvuwj3uMUqefd7td2tzAutlsNlgul+kuZhdQdCxgBHc0fh/yqfbvaNw5JGy57+kfTdc3iKgvfIxRf/qYc6iNRM/4BpeovNykAMSbOKKyervzCFG1n+lFIprO6z4eu+irZXRfej1ENurayMcZ+iH6ns9E/chtcT/rd7noz2g+1e/YRnyzk9ad5hWtUX1evc1nLyIURnOotgdfu9JO92O0JvO+pv/Ut/p9ro6isdP7u/shKqvboLYD2BvfPL2ozXIc1M+j8c19ov0uGkeiNuvrt7vMOQUFBQUFBQWvFz+G/z7G+NKbNqPgBso6yfHuybv4xZ/4xRfiEgoKCgoKPju494JwJLj6cYRKBkb3/zohpgKMio9KfkXEGIkhJ8mA58QNCfQogpZ5unDDvynOuq1OQjsB6X7wsvAzFQ5JVvldgCpIOaHt5FNEYvEzjy5UAZT25USPiGhzXzAvPV7UyUfaru+zbEquK2Gn/vV7ayPfaUSptg8n6pWoVvLSfeUkq9oZiexaLhXwaY9H2SixGAl2XgbPI0IUSaq/ex6RYK7PRzZr+k7w6zuRWOBtRgVUT8dFF28jHGNojwplq9UKi8UC8/kcdV2ne1P96Gff2EJRk+2ZtnU6HQyHw73xLiKfWb7bxHknmSMyXMuqfdr/RePOofdy0DaqQhJ90263cXJygl6vh9Vqle6uHY1GaLVauLq6Ss9STKEASf8w6lejeSkSM/qXYgyP+Z5MJvj444+TMMy+/uDBA5ydne2NfS7g5EQMR/S9tr9Dfo3q9S5ge9ztdinq3DcZ6E+NdFc76FMecV5VzzdHsb13Oh10u929CPpnz57h2bNne+1cr4LwOUqvbrjNh9F8GIklkTij79MG9ikdR3Ts9vx9DmYemrba47b5uBCtQ7QeNP9ovtMxS/92QS+XNv+OxgfCN0152z/UNqPxIRonfd46lG60XvA643O+hjwU1epzr6//mH6UZzRXaTl8fRWtHzSPyH+5crrf+J6OhZGv3Zfa9923/l40t0froShdtTuqj8jfml40Hmud6WbLyJ/86XWQsy0Sdz0trUOfN/w7zc/Xhd5OIj8WFBQUFBQUvFn08QCDcrzxa8Df/YTv/30UUXgfD0YPXig6uK5r/PbT336NFhUUFBQUvAjuvSBMIsRJ0khYcSIHuCkgKQmjkWFO8LqoRNJajwwmqe7EopNktJXihBLsKhCq+KQ/c3fnOkGpfnCSLBLANH+3V9OlH0iCRdFOBPPQSCElsZiPRtN6vi7YURiIiDy+o3XgooqSbxrhTVBwc8LSn3G/U1DQutF/EbFLYUHtZjqRkKZl1c89X4+0cyKVgpanq/Xptnj5dVOBtx9tq9qePVLLhQu+y+hB95+3nUMkreehz0d1qnYQfty4txEl7TWanWmtVqt0XHG73U7Rwd1uN6XJsUDHNabHaFSOT+PxGO12ey/qL9pUwHLkBGEXPdw/EfHuZLm3sUOkt/fPiNRneXQ80DYIAN1uFw8fPkSz2cRqtUrP8+5g+oCRpyzbZDLB+fl5uquWm1LW63V6R8dVipjb7TYdZcxIY9YHo44fP36cBHz6U087OCRkHMJdCP1ILHgRMDrYBS7624/354YH1k2z2cRwOMTp6WnarLBarTCfz1PkNW1jdDyAdLfw5eUlJpPJXp/0DUj0pc6Tt/nDxahI6PGNMJF4pn/rOOhjh4/3kUjDvLWckf25I3aZj4tN3g81H/Wl5xv1fe+f+ryutaLy3/a31oX+Ho0T0XrC50Kfu7Rdev15O/D2cNsYeWjOiMY/L7PmE5Uhgh+ZrmNz5GtdTx3yp5c38rG3DX+Oz/paQfPOrV89L4eWQ9dI2qb9ff9cv/eNaNrHgP2NajruuL+87nJl8v7F8dU35EX/X+Hc4mNxtFnN+zPfpw0vMx8UFBQUFBQUvFpUaOBr+LNv2ox7iPNP+P6zV2HEvcIf+ok/hAp331C4q3f459/956/RooKCgoKCF8G9F4SB5wSoHvWpxJ+SfxphpmQ9iRrgOXGoxxwrsaMkMP9WgkqPqGaeKrYB+0QbwTwi8k3JHScUtXwRgafvOiHqtrDMjJCLyCcttxPiHlHlvnISVgUfJbJUuHOR2YkujYJkHiqAR2S0+08/d/9EeToJ6dGAwE2xxKPtmLZHqTjZ6e1LSWlvI3zHiURt+2q32xyRtpquirBq63a73RNsI7v0b7XF6xfAHkHL9nEX4j1HemobU4LXn8nlof5Ru/TIWz+y3fvNdrvFfD6/sTHD+6/6VY8jXiwWmM1m2O2uj9rtdrsYj8fpTltNh/Whx45rv3a475T4jsYcllH7cOQjADe+189uI6kjwUTHlOFwiOFwmL6bz+fJZ7wrWMcnHle8Wq2SiD6dTrFer9FqtZKvp9MpLi4usNlsknDJuprP58m2RqOR7sKl6HxycoJ+v7+3KUB9wk0/kejkdRL5I/fsJyX8G40G2u12Ss/HQH6ufZVHQFPg6Ha7ODo6wnh8vZtYNzBoW+92u0m0pxA/n89xeXmZhH0vW26zwl2g7+fGWE0zEgt9rNY5RzeF+fgG7Iu00VjMZ6LPVXxiXlGdRKKxpuWbu7y/u4DmwqILS5EIdmi+0bWZbqzReoz8o+XPbeRyO32+Ufty+eXs8XddoNS6izaeReOczzW+ccrzj+z2dQMQR8FHPlJ7vc1of8j5lPn76TxRm3d7vY95m4mO1/e+fkgU1We87tUfno/62X2vtvjGEeD5ySlR21Hf69o02ljG9PV9PTnHEfnG2xKfKygoKCgoKHjzqFDhy/ij6ODoTZtSkFADuPsVRG8DRr0RfvorP30rX1FQUFBQ8NnF7RdGfs7BqCTe/aikKclmhQuYSsYoWROJgy4MOkEL7AtZ/h7f9bQj8ljJ04hw1WiCHEkIPCeMGBmoZfbfmZ8TXRrZEBHK+h7JLyVHXZh1oo3Pa3mZtkZIOmGtPqEozLSc/KzrOh3HrYQk7Y9ITSWvI9K5ruuUL4Uj979HffBdb0/aXrScWm5/ju97W3cbvVy5OnC4eK0katQWvG16//J+EpHiOYI3R2hqfbvv/Tu1U/uhE9K01fueP+MEufYvFYhUQJ/P55jNZkmMpE2bzSYd0aukMO3W4+spgvZ6vSRwUuT1Y5HV7/zMI81y8A0akSjA55zU1t8P+fEuRDXzph+5saLVauHk5AStVgvr9RqDwQCz2Qyz2QyNRgOTySQJlRQmB4NBSpc+azabOD4+vjFOM8/lcpkiXVutVhKg+/0+gOtIYeBa/FwsFjg6OsKDBw9wfn6e8uGdufTbXQXxCFEd3OY/Fz4iUKjmEc4q4rE973Y7rFYr1HWN4XC41/5UIOIGhu12m+Yetjve6cy/1+s1VqsVLi4u8PTp0xsbTvisj5cupryI3/TvSPxTwUpFOv3n9eBioT8XCZPA8/FB+32Upm/W8XS0P2p/yT3nZfL1gPsm2qiW86GPAdFY6Wn7hjx9/1AZ9Dn3X+57r1vPS+vGN89F7+fqWsvqm568TNE6jun6nJqrK9+wEPkpaqPa3n396e9GNru/fW6P0olsiWyN1jCErvU0Lf1dN7K5f9RPWn4Ae2tKr19f20Tl936t9aNru9xcoHXA/+foM1omb3fROregoKCgoKDg08MaM+ywRQM3/989xpfwEL8L38M/fAOW3Vd8D8Al8FJC+wWAX3m15nzO8SOPfwQPxw/ftBkFBQUFBZ8A9z5CmGSHksT8PIpQiUir6C5Vj0ShUOwCIdPWo1gj8ojEjxN9Sha5gKflq6rnx5a6WMXnPWLDBVQlOf3+W7dFRUcK7k5Q+TGo7lcn7NX36gv3udqjdedlYb5675vWjQq06lOWz6M6DolXtJn+q+t675hkJVJzkUYqBLk9mq5+xnc9+izytdunAoLm7f7Qsjkp3Wg09iIaXSRUmyJy2N9RP6gvaIOWJdr04P1SCV9NI/Kn10uuvUWihj7H46s9Apf9JOfnuq5TlK+PV5vNBqvVKrVnRrbyTte6rlMU5XQ6xW63Q6fTwdHREY6Pj5OfPFJN/cj2ymjX20DblIj2NuPjrH7u/9TPdyWq2U/b7faekF3XNXq9Ho6Pj1NddLvd5Mftdot+v4+6vj6mezKZ7B3tDACr1QoA8OjRIwwGgyQaU7BkuXjE92KxSHnzqOhms4lOp5NE0tlshvV6jYcPH6LX6+21Ne+PL0PU+5jtPv0koLCr811Uh3x2NBolXwHP6325XGKxWKTj0blJwe+J17Fzs9lgNpthPp/vjTla1qg/30UQzol07kMVcHwsi+Zctc2P0tZ1hW9UyW2e8PYQzXtRuaI+6SJTJKRFUam5vurrmdwzOv74c/65+sbni2gN5Glqu/Q51NdXaqvao37TOcnLpnVyaK1Au+gvzpueptqqiMZGfTe3hnAfR3ZHdefrksiOqC78mUho9/rJzbHqB68DfnZoDtHxyu3JtdtcnWu/8fWcls83+Kn9nq/Pv26L5qftwudxXeuwXeuJH95ufA31IptnCgoKCgoKCj4Z3sN/hRUuw+/a6OPL+MOfskX3Hb8NZPx9O7YAFq/Qls83KlT42a/+LDqtzou/XA6lKSgoKPjM4N5HCAPXhEoUKeuEoEYIcMe9kncqNqmYqEQk04vISs1L7VASXH9npJs/r2SQRmYxqlDt1TLqu7TRy+jEFX93wo6CVGQb81YyTok4Fbuc1I6IQSXDcn7m3xH55iBppvZptJQe16r25UTNZrOZfK82O3Go8MiNSABiXtGR11oW9buSt7lIIY+a8bapZd9ut3vpeVmiOnT7/DklgD2qTf3itms5tR5U8FW4//lORH46iezRNlpHnn+uzlgOHlXv7VY3DjA6l1GkFMoo9io5TUGT7VTbR11fH4u8Wq3Q6/XSfa0cH7rdbto4EpHxnU4H3W73Rpt2PyhcyMy1g2hDg48hWue3gWXX+iMYHXx0dJTGx/l8jslkkoTewWCQ/Lnb7dDtdlFV18cc93q9JFjudjt8//vfx3K5TFHAHJ/5Dt8fDofodDpYLpepPO12O91DzEjXTqeD4+PjlLcS8y5w3BWHfHsIdxVNeVy0fsb3VWgCkI4s553DnKcA7M1TOsdtNpsb9cl/6/UaV1dXe3MebdBxgZ+5UHMI3la1bP6MrwVUIPI5S/tClKemq2NKlJ73jWgeoh/0d08TuLle8bSiTTXR3OO25uZbF7YAZMfXSBT09unzpqYT+Tqaf328v61sfoR7JDhGfvW24OMd09J528vP73xDQlS39I9+5xsMDpXD83Z/+lpQ5zSvh9w84e008re348gWTT9qs74xU8ur/Ug3tvgaIBobI5v8/wLRxhZdB7uPuU7QMkS+9rJH/cDHDX3Hffyic0VBQUFBQUHBq0GNLeoD6tiP48/hn+M/wQTf+xStuu9YveR73/0E794/vHP8Dv7w1198w8K3PvoWfvvZb78GiwoKCgoKXgb3PkJYCZuqei7kkljmvZB6RCyJGydolNwjgaPHQ+t3TCeKHiCUDPP3dfe+p8vPSYx7VIGXmaAopJGCjG5Totv/1vvMnIDi94zCU/I1IiNzESqEEqMeYaz2af76rv70ND1qQ+/8VXIuivxwe5VYdBHTn1Gy3P0RkdJMV4liTYffadtTAlL9wrJ4/tqm3W61z33lwoISq/69wtuztgMnRl3Q0f7oIk8kmvDvSKhS33g+OYE+Ik5dRFF4/1VCX+tM7SMBzaOhNS19x8ckFdCY53K5xGw2Q1Vd34n74MEDdLvdG33b/cGfFPJyiAhlryv1kfdT71PRd3eB1pGOaXV9fSLD8fHx3qkJi8UibfShSF/XdRJ5NfK31+ulqM6qqpIgyd95TzAFYQq5rCPOM6vVCovFIon8PFp6u93i+Pg4bQRQscevDfgkeBF/HgKjzQCko/VVMOHcon2r3++n+6vVHpaRke7sFwD2jpfWtqSCMMU5/Z5HWes49yJl9/Z86F1vv5FQ5eODjxs54c/ziD5zRPOpz7M6hzMtF5dvmw/UjqjMastd/RPNqfp3JERHc477WD/zcdjHTU/H684FVr7vJ4i4Dewj+o6u3YCbV3r42kbHyNya0NuWi5javg5tNsnVlW/q8vrwuUTbgAu+OUEyWsNG86jbp2sT4PlGLK9DP+VH11PqO7VBN45FawF/XtPhSQo+P0brPB+rvB1rPbg/3CZvh1oGX3P4mqegoKCgoKDgs4MhHuMn8efftBn3CCsAf+8l3tsB+G8ALF+tOZ9j/Inf8ydwMjh54feW6yVWmyKsFxQUFHxWcO8FYSU7nNjTZyKyqK7rPfKZzyrB7SKUEn1EJEo5saREmIpEbhOfIZETRU2qfRS99VhfJ930pwpLfr9yXdeJwHd73d8kQ0nEKQGrvqL9mpcSlxox5yShE7heX5H4qWSakmNRW1CyUCM+tT5Yvy5uvUjkmJO/TtBpuT1vzdPrV98lXARQQtaFeK0ft0OFoIgojsh1r5uIeFdhgW3Cj9V0X6ifNO1IcI6Ojvf+oDb591rP3u8IPfqW9jM9Cmfqc5bXN1XwH/uc1uFqtUrRpV7+1WqF5XKJuq73ImV1c4fXidZLVVXo9XoHRQMfyyIBPHpP/RqNue4XPh/hkB0UMFlHFB85FnY6nb2jtzudDprNJubzeTpWmp8PBoMkkHe7XdR1nZ4bDAYpMljHK0Z9L5dLTKfT1Pa63W6y4ejoKB3PreWIItteBt4uFS+ath496n3X5wNG+o7HYwwGg705gG2UbZ3gPMWf9CU3MK3X63SUdyTW6Pil49MhH+R8cUj0yYlimj//1mdcfPEx3fP28Vnz9jGXn/nmNLfdx2afo6Iy+5iZ+xe94+JUJFz52A7c3Fyix+zrfOf1puVjHn71hfrZxxm1122nXb5WyPlN1yc+V/kcQztzAn0010fP6Pjp/o7qwMXhqMw6d3kZte6isqlffZ72fHxDD//pdR9eLi+vt3P3hebv6eg/fyfqo56mr118g49u8vE1Q66d+OY+wtugr2v1bxfno/Whl6ugoKCgoKDgzaNCha/jL+Jd/NybNuUeYX37I3u4BPC/B/CfvQZbPr/48oMvf2KeoqCgoKDgzeOtEIRJkDgRFRF8JLpUHCPquk5RUU7Yq7AZkW5MX6M9I+LICUgVU/mdRyZ7ml4eJygjAlEjstw2fZ5/e3StE+L6XkTOa16R0KoRMU4QU1BQUtcJc61nj6zhZ/RrJO6pGKl/R+S62s3fvW1p/Ws6Lubqe0omahv0utDNA07w50hz/d0J9Oh7JYDVvogMdmHZ/Z5rL04ca73yb28jHpmoda15aZncB+4jr0snTdXfkY+32206btjJZo9wdLt1EwXb/nq9TlHD7OsULZfLZRKMva/sds/vET49Pb1RJ+onjm16DLVuLDmESHjQOvX+mBMg3E8R8R7BN3+oLWwbu931kdEqMPAnxWDaMhgMUNc1ut0uAKSxRsVcPrdYLFJEto5NzH+9Xqe67Pf7aYxvNK7vau50OjeEVvfTi+DQO/rdi5L/jA72OQDYP2Jf291oNEK/309isrYnrQePzmZb5HPr9TrdwRz1aZaNdc/68vE3BxdnXCjk55qPz1nRJhfvF9E44u380HyttkaCjvpfbY3K5Xn7fOR2uwgdlVGfi/q1+lLTddEqyp/fHcpfP+NmAv8+2jAUrT+87nye8lNTfNzh83rKiaebGzO1vqL1hvfjQ3O9rrHcR14fXmf+05/TcufGd/V1VC7WiftFy+L1lfMT/a0nO/h87f6O5hn3qdvnmwO137gQq3O6563rdv0sGqd9XtR/vi7ysrLN65pd03bbCwoKCgoKCj4bGOId/Bz+Mjo4etOm3BN8A3c7+rkG8I8B/K8B/L9R7g9+jnFvjC+cfuFNm1FQUFBQ8Apw7+8QVvKfUIIqEjGdzNOIPqLRaKQjQPl5JBqSsKIQoKKvklb8p+S6E+1OrGnULfPxcmn5nVhVAskJPSWGKYIzTyflKGiof0ma6rORkE4wDfWhpqflYRp+t677wuvbo1317jj6xaPL1A7e2+rEmZJ/Tlxqe9Bn1TamSR9HbUR9qOS9bihQ37sPaDt/13bn7zuh6/XhxC/rwUlYbWe6YcJJbU03JzywD7nvtKxKdqoflbimrWzTkWjk/dLLHwkQub9ZZhXA6ZvId9EmBQBJFKN4FvUT7RM8pvjo6AhHR0d499138Y1vfAPr9Tr5pdls3ogYVuHoEEGsQkDOf5GIkYtw08+cwM/Bx263r91uYzQaYbFYpI0VKrhTbGeUrgq26gefA/r9PubzOeq6xmQy2RufNpsNFotFEpkZ8cpobrYFCtWMYmb5IxHoReBtUf3Bn7lncmAZfGOFHpnLdkQ/DYdDDAYDtNvtJKT7eKDjro5n9LcKMhSE+bcKzCr6uLjxomXVsUL/jsZBhT+fE7ciEUjHAx97vG8cGoejPsXPD41RLkJpGaL3dKNOlLfPA56nl53v6dzmop3O3dH6Se2Oxm63U8t6qI3oJpvoeR/n1Ee0nWXUcqhA6H709uPlV39GbSVqq94OXQx0n2u751ioc7M/q32T6asf3O7Ir5F9Ogb7vKLPaZ5edvWnbwz1tDXNnD36t6fL97T+vW2rTS7m+hpVfROVn3lEfUOfz7Ud2vqy801BQUFBQUHB68UP4o/hj+H/gL+Dv4I1pm/anM85vgVgAyB3NVaNa/H3/w7gbwI4/1Ss+jxh2BvinaN33rQZBQUFBQWvAG/FlnAnaPS+VScUGXkXRRXkSDdNk5+psENCr6qqvQgzAHviDEkyjzzxKEIV1zR9J5c0Oi56brfb7dlJEUXJStqp5H8uapfRGS6oUqRi3n48YkSes9z6GaMtaJcexeeCm9pJocJ9oXm50O0ksvstJ04SPDLWyXZ/XtuBpxchVz98R0nbaBOAtqNcxI2mpWVV8TkiLZ1YjIh4tS3ynROmkaDi5Cuf0Xv7lMhmnWleSoj7d26/phmR3FH9apvMEcVszzo2sIxKVnNMopjbarXSMcYU2yhu0t7VaoXJZIL1eo1+v48f/MEfxNHRUbqj2KOFtPyNRiMJeYfwIgSy+l3bqI4FHk11F9DHLg6qiNlqtfaiRvk7cL0RZb1ep2OO+f1yuURVVRiPx+j3+2ls7Ha76PV6KaKVd+T2ej0Mh8P0XbvdxmAwSHcEUyhmNLffQUrbtf5flqA/NN4cEr9y0LFMxzP2N9+sxGPKh8PhnjBOP6sgxv6mfUXHe87J3ODgedGP2uf9/s67+iwaq9R3apP7Mte+/Xtde+jmlUjsieZAXSu4/V4/Ps5Ggt8hEYyf+9iuz/gGJy3PXUQ8RVQm92tUtlzbVl+onZFdnob7QcdjfSd6X22LNq1oO9D0c7ZEomq0rnAfaJl13ZNrpz7PRWuzQ36K5mqFi+Nebl+v6HNRufU9Fz5zbU/Lqc/k7pTmZ/6eb46J/KU2up/0e33f22m0DtJ+SNt1XFBbfI3hGwvUP94mCwoKCgoKCt48KlT4Ifxr+Fn8z9HMCpkFd8MOcYRwDeAJriOI/wqA/xuKGByj2+6+NEexWJdI64KCgoLPEu59hDBwM2rFo/MojuldeS4G8acfVazkjUaIkmDySKcoahLADRKOz3q0hx/VzHdpg5NgmoZGIqn9Gi0ZkWce+ex3PxJKgqrPnBzNEWvuF0YwugBAUVnT94gMr5OIlNXIZycCnZBk/VDgYX1qm9LP1BavJ2+T6j8n3SMSWn9GpL6mz89VXMhF7eh3Uf2ogKE+84jjHMmsbc+JXrdd89NNE1qeiNTXn7noH+/f0eeRHxVeBifilfym0MtnfBMG81HCnkcJ73bP7wtmdCl/d2FxuVxiu92i0+lgt9vh6uoKi8UCZ2dneOedd/DFL34RH3zwQRLmaJu2DRXSKXp6+d0/0XcRSc90vY86cu3YwfT8JAUASdRlVPBqdf2fv06ng16vh8Vikd5rNBrpMx7z3ev1Un9n2uPxOOU7Go32ykLxnHc36xHItGuz2aDT6WA8HmM8HuP8/PzGndY5P9wVh/z1smBUOudLtkPmp3PTdrvFeDzG8fFx2vzU7V7/x3E2m6W7lzmv+EYkj5xkm5xOp5jP53t2abvyDVq+SesQcqKNizHelv1vnQ8iIYrQDWKaF3/PRRdG456O07kxGNifRzw95utjtvvH6yUaFw59lvOdPpsbF3QN4T7Tcd6/U+TGeP1M2xHXe1FakbDm9nq5tRzRO97eNK/c2uxQmXJ58KeLsmxH7oPoJBX1m9oQrbk0LfWz17XnkVuTOnxjZ1T/LpS6r3zjhfrK1y/edqM1BsuoQqyv8fl5lG9UPwrtw2qHv6s+OdS/fT1WUFBQUFBQ8NlBA038DP4SzvFNfAP/+Zs253OMJwD+VwD+FQBfAfB3cS0G73B9RPQUwPKNWfd5wM9/7efRbrZf6t2//2t//xVbU1BQUFDwSXDvBWESw0rAqoAFPCdSNHqH7zpZRmKFYgJJcBcWnfRlOpqW2se0XGClKHobOe2EaI5EVsFHj4wlWaV/azSuR3Y4CahlYjmU6HKCKkfCR2mrSBBFTClxHvnaCU7mc+joZH6v7ynJxzI5Eehtz4ndiKz0elT7KX4rWev5uO1e/y6y6MYEFwbcx+pHb3MuSkTErhK8+r5Hc3t51G760vuT32nsAr36LhI/NCpfbXUf3LXfKZjGZrO5Ec3l/lVf8H5w+oj3B1PQVHJZ65CiJoAUTbzb7fDs2TOMx2OMRiP8yI/8CH7t134Ns9ksRRNzHGAZ6MNms5nufuX9xd5eo80cXu/ROHEIhzYKRD72zQ2se/qW4nin00FdXwu1jObtdDpYr9e4vLzc69sqAnEcnM/nabxklHav10uRxKPRKN1RvF6vsVwu0el0UhqNxvWdwYPBAABSveo9p/QR/X2bEBLhNv++KOhDFYGA55sevP83m028++67ePjw4Z7Iq/dq67irfUDHL+bNz+lbvZ5AN0PoGODHoN+GXP91Ww4JKsDNMc7T1rlUx2g+5+PxofkiJ5S5X7W+FDkBzOvA39X51v3kc7umqTZp/jnf+juRX3NCoAvEmq++7+sWIBY7tdz8nXlzflE7fV50f3g9eV1628vNPz5vRdArCVRU9zr0ej80bntduA25eTTaCBXN/ToWaN/SMmte7nPfqOW+83nK/47WNNH45/mr/Zq/Qtu9rwuYr17vwee8PnQ9pOOwrrP9Pfel21NQUFBQUFDw2UULPfwR/G8BAN/A/wPXQmbBi6HGtfD7j9+0IZ9btBqtg//3OITtrpxGU1BQUPBZwr0XhPUYRSWmDpGqJEzW63WKEPNIXwB7EVMEv8+R5UooOVnTarVuRGMwbSWAnKzVaF++73dTOrGn5KmSdocicSLCl35UYl7JLH/WxXknwT0/J9zUd6xLjXB2sVbtUPJWy6j1FhHPfFdJTZZbiTdNT+vRRUkl+r3Mmm8kOrg/CY9c1+/1p5PfERnq9aJ3GmsdRGS2+9I/47t+RKO344jM176jbU4jyd1u39QRkeCaT0RQq9+9XiJo29A03Df6O8u02WySiKzlciFF+zuPLD47O8NiscD3vvc9LBbXR/Kcn5/j7OwMJycn+OpXv4of+qEfwq//+q9js9nsjRHehxqNBrrdbhJNc+XM1bnXX+RrHx9zbfuQn/XYeL7Do+tXqxWazWY6trjf76f7gqvq+jjoVquFBw8e7B3L3Ww2U8QvI4ZVLGY5e71e+qzZbOLRo0c4PT3FdDpNmw1OTk5weXm55xs9Ppq2ugjCceJNg/6jfdr+gOfjAOthMBjg8ePHGI1Gqf3U9bWgq0ea+waP1Wq19x3bxHa7xXK5xGw2SzbpfMk+wpMbDkVgvgiicdnbcjQfEtF3Ps8deicqR+49ID6N4pCIFpXNyxjNxdGckitHrv1GfvA5V3+Pyq9zReQHPhPN557ubeK61ouOV56m9ll/JyqDt9co/5w/DvlIP1eB0MeUaF6M1iLRekk/93R8rlQ/ax7aZt0v0bvuQ64leZJGVC6OVTquKHzMdVtZbrftNr/zs2iz2W392YVitcftzOUbre2Yjp6ooX5+kU00BQUFBQUFBZ8+2hjiF/C/xHfwdzHHx2/anIK3DFVVYdgbvmkzCgoKCgpeEe69IEwRllFfSiJTAGm32+lZkky73S6JwU6eKFmt4gzfAfYjqDRNpsOffqScR256RC6jHknsKNmlYq7fEarva7oRMeTCXETaebSHC8u0SYVUt5n2qK/cPwDS8bZKfmkUIG31u3WdlHdi08sXCctMR0VuFUZU5OdP9wPTdZHdST79LiLoIru8nFqHEXnN8nuEmIrhmkdEkrqtLF8k6ql4qzbpncleX56Hli3yiT6niMqd853m64JtRP7nNh7wmfV6jXa7nQRbFcD5rvZF7bt69+1yuUxCGnAtnNV1nUQ6jlGtVguz2WzvaOlms4n1eo2rqyuMx2OcnJzgp37qp/C9730Pk8kk5asR/doneNzvbDa7k3/dny7YROS0p/eipLRuMtDxdLPZ4OOPP8ZXvvIVnJycoN/vY7VaJUGYdgyHw/QO2/F8Pk99e7lc4tmzZ2i1Wuh0OhiNRphOp+h2uzg7O0v+GwwGGI1G2O2ujzfWkyNGoxFmsxmm02m6h7jb7aaoV93E4ULGm4ZuiNK5TOuWmxiqqsKjR4/w4MEDdDqddGz2dDrFxcUFAKTIc50Tfa7inMw6Xa1WaYODzqMUgRU6930SgcPbrbYtfq9jXW4M0/r0udbh37vIq3OCzuWRwOZrB7XH8/Ly6NgYjX1ePiCOVr1N7NQyuF9ypw/4nH5ozsiNWb5B8JA/fB72NVouT19P8XMda92P2ra97XgZIqg/9V33mW/qyLXp3Novsk/zzB0pnxPeNS9tt5F47WtA5heVIWoHkV/V/uiY+aiNuT+9TbnP+bv7mO8rXBD2PuF+0HUK532+F23c842P3gcKCgoKCgoKPrtoY4QjfLkIwgWfOrqtLn7uh3/uTZtRUFBQUPCKcO8FYSfc7yIgqUCTEzgo+ugzTsq6mKiRT0o0uqDmZA+FBSelI8LXSTTarQS8RgHqM2qXCs0k+5Wo8wgEJx/5nZZNI0NVJNTnWWf0m5NsXkb1mxPoEZzkdWJMyVktV0Tu6/2iery03k3tJGAk9Dj5r39r/ennTtTnSEi+r2Ky2qppeFqejz6nz0Tt2AX+XDr0RyRSR0KK1qNGYXvZPE23Q9/36EfNw393nx0i59V2zcPJ/93u+p7gzWaTRFi2IX7O+qOA1ul00Ol00O1203cUf9frNbrdbmqfT548Qb/f34sS/hf/4l8ksVrFGRcJmI5HCUdtMOc3bw98/i6iziFEfV199NFHH+G9997DyckJTk9P90RJHiV9eXmZ+unR0RE6nQ76/X4qO0XkxWKRIo1Ho1F6luMjBWPmvVgskvA7m81wfn6OXq+HqqpwenqK3W6Hb3/723snJuQ2H7woon77smi320nY1UhstgdGOG82G3S7Xbz77rsYDod7p2dMJhNMp9MkxjNNAClKWjcncGz1e+JZ37rBwsut4/snFYQ9apufuyjL3/WnpgPc3Izic7k+fxch1QUw7ze5PhitD3zuvstGBBds/buoDJFv7iKY+fu+qU0/941XXlbPw+dlnc98vaG+Vp+6Tdr/fB6IyhOJe96Hc+sUr7fchqkojdvmevWRlzMqh/4eCZCH6tXbsdoVzSFR/fn70XxzaJ3kayD3oa8Ptf51o4Dn6Xno/O926Xe6Tlff+1qR4Jjop/BEcy9/apvP1U9BQUFBQUHBZwdtDPAufh8+wD9606YUvIUo68WCgoKC+4N7LwiT9CDZDGAvShXADbGN70UEGn/XSN2IfNKfLkarYKi2RQKUPh+RgpGI5USm26p3pyoZrHY76eTPu49yBK3bpIRhXccRtkq88VmKW3qEthLyXn610yN/nQjVKAr/TMvp6Tu5rEK6L5aiyK5ce3Eymb7Uv91PTj5SjNF6cPKS73mEaBRVovZoBIo+x+gUF3b9LmBtU44cucxyMH1NS+tF7XHi1dvlITHFifTod+17ERnvmy60T7I9MlqS33W7XfT7/dRnV6sVWq0WWq1WOtIYADqdThLj9FhjrR9GqT59+hSdTifde/vTP/3T+OCDD/DkyZM9UVjt1r7T7Xaz9wgf8pETz+4brQP/3cWqHNy3KiLO53N861vfwjvvvIPT01MASEdlU8BtNBrprlv6kBG/rVYLm80GDx48QK/XQ6/Xw8XFRRKHecwxo1nn8zlWq9WewM82Ox6PU77dbhe/8Ru/gffeey/5mKcguP8joeY2vOjzOahvdLzVTUIUg+u6xoMHD/DOO++ko7QbjQYWi0WKRtfxRdvcbrdLd163Wi30+/29McTHsujIU+1/2hfuCh9HmI7PXTr2R5uGDqWhAoy+z+f4btQfPG9NLyoHf1cxy/PSz/Wzu4pDLkppGi6Yad7RGB+Jd5GdCp3H/N1D6zhtG55ubi2n5fJIXn82mtd0zvN613nL0zrkH7Up8rXmqz+9Lbs9amvUpt3uqA1F7dmf8faj+fvmy6iNEbqm0Hd1/al17hsbXZj18ub6gq9z/Fmfy3x88rWEr9O0bJ6fryO8Djk+s5zezg61p4KCgoKCgoKCggLH1979Go77x2/ajIKCgoKCV4R7LwhX1f69ry5aOTlDUkhFMeD58ZQqOKjQyKOilUiKiFUlhPlPIzZzYhTLwfyc1NNIP8/fIyk14tQJWidZnVhzsYJ+ZBn8efexk9QRGahEFsUGClduB9NQko9p0S9K1DqBqSSZvqvpHxJlIiJNidaIVPRNBJE45v5QwUi/84hO91WO7LwtjVx9ONGrz+aIRievc767jTgGnm/eYDtmW1ZRVQlUt1GJ1EgY1vJ5nUfCT2Qv7XRiF8BeP43KXlVVikR1YpfvbDYbTKdT1HWdjojmc41GA51OJx17vFqtkjD30Ucf4fT0FI8fP8ZP/dRP4Zd/+ZeTyKx363p/4maMXB/QMrhoxc/V7zkhQH9GIoND7WQeLlxOJhP86q/+Kr70pS8loZZ9hCL5eDzGeDxGr9fDYDBAt9vFYDDA5eVlulNYfa/9e7VaYTqdYjKZYD6f4/z8HMD13c1si+12G8fHxykq9r333sM/+Sf/BBcXF3ubk1iHLNeLipqvGq1WK0UHsx00GteR6C629Ho9fPWrX8XZ2dledPpsNsNyuUzv8h3C50C2Z+2r2r+B63pnemz79Ncngfdv/yzq93xGx0jfGKXzXk5kokjO3/V9hY+nbmcEF8s0j9xYlkuL6ycdf30zEdP2u7E1TR8PdCzWn7k5Sf3mbcjL7ul5fUTrLvebfxbNg5q2zyM+T0Z9we2N1kuOqH3yc/W9i4LRukvHT89Df1efu71RvUV1qOuuqOw5W12M177ifTRa30a+0/Fc573IBv5UIdbbR+Qz/c7bi5fB2462a63X3LrFy6HrIYVugvJ2XlBQUFBQUPDZxRl+AhUaqPHJ/u9TUPAiOB4co9vuvmkzCgoKCgpeEd4KQZgEFgl5kixOFKkIqPcJK6kWHWPpd/l6uipMKSmjQgMFZyeFPPLQo0sjEtLhRJzbwXRoa0QI5oiyKA0n9PiZEmJOUqlgpvnSv+ozFwc074ggc2EuEs/dRrYRzT+KSPWoDW0XTtI5Aal5OSGu73g9RiS8llvJZo0uZ7lps0efeN1o24qIS7c3OsLZCV+SqN7e+Wxd10lMcpv8ef1MhQX1mfdzL7e2CxcdIlLf23gOzMf7E+snijRj+t1uF1VVJeF3Pp+j3W7vtbfVaoVer5fuuV0sFmg2mym6mBGwwLUws1qtMJlM0Gq1MBwO8UM/9EN48uQJfuM3fmPvSGqKONrGGCXqmxIiRIR4JDZFUXK59w/lpScHaOQox3oAePr0KZbLJUaj0Z7wyDuWKXz2+308ePAADx48SHdAqwC23W5TNPDV1RUuLy9xcXGB+XyOq6srzOdzfPDBBwCQ3u92u+j1esmvs9kM7733Hs7Pz2/0f5aDEbhvGoxM974P7G8G6nQ6+PKXv4wvfelL6Pf7qT7n8zkmk8ne3EtwfN3triOyeU8223ldP9/k5Efc+1yrn3s7ehFEc6iONZ6uC0VqBz87NE6wz/l8oT6K8tZND17Ou4xJ+s6LbDrgCQMU43VMZFl0jGKfiTax+aYoFbf0b59zHf6Oz7ORSOi+Vrt8jqStuXWP55Grg9vmIH7v9aHzqX7u60La7mtIH2uZx21lUJtyayyfI6Myu6/dN15fTEtt0t99LRX1R//cy+D9NPKL2xKJ+FE7ivzgArr3AeYXCcyeT/S+Crtui+fpa81oLVRQUFBQUFDw2cZj/CwqNIsgXPCpoqwZCwoKCu4X7r0gTNLDIyZ5R6GSME4oaYQSo7f0GWA/+o1/u5jlxA3T8J3/fN5tcBHKxUAlhDzKSIU5vkOxQYkmFxWj3100Y9q00Yk9FZc0ytDTU/FJ01YCPCIWI4JUhSHNw0VhFw/874hAcwJRofn5c7p4ikQLjYijAKLkokajeFslttvtXhSelsP96PXHv5VAVB9rm4vKrO9GxPWhPDWfyKeHxHWPDtV03WYnnnXzh9uj/tB+EYn22tcVXjYS9n5agRP3PDK6rmssFgssl0us1+t0hDGFM28T6/Uai8UCVVVhMBikZxjRenFxgcFgkIS53W6Hr33ta1gsFvjud7+7N76pL2lTp9M5KFJGogE/d9I58vltwkEOKqxrus1mMwm6FLqvrq72NpNQEF4sFqkOP/74Y5ydneGDDz7AeDzGYDDAeDzGyckJ6rrGbDbD1dUVZrNZikBer9eYTqdYrVbodrvJZ/TncrnEs2fPsFqt8PHHH2M+n6f82R58fnF/fNpoNBppQwEjdDlvqs11XePs7Aw//MM/jNFohLp+fr/w+fk5FotFqh9u5qHAzrbBKHUKiKvVCqPR6MZYonXsd7ZHm3Ve1H86/uncBOSjfb0tR5uI9H0fk1xE8jascPHJy5dbQyhc3DyUnn7H9sD7zWm3ngzifZ6bSNh+fIOM26djfRRprWO2R82qz73+dazV/LW/eV76vtZTtEnJhVm1ycsRjXHuyxx0bND2x3c1H21nbnM0/kbtQdvEbYK41gXz1Lwi30Vzp9vg5XdbozWHl/m2tYXOwzpv6lzt+fs86W0hWvNFwnBUVl93Mg33Fec2fSeaR7VP5ebeyIcFBQUFBQUFn01UaKKBJnZY3/5wQcErwh/80T/4pk0oKCgoKHiFuPeCsItshJJpfM7JZ/0ZvcPn/f5H4GZkspOOJLFV/HNyzSM++K7+rWSlH7XppCbvK3Xxz4nEKBqM3ylpqaS5E4cqVKvv+F5E1CmRyzSc6FLiV8sX1ZdCRXMXD5R406gtj8RVUpkbCrQ9RCS1+1iFayXi1CYXx5m3blDQd90/kQgQtXe+r+lp/UREL//WI4r5TkTCersmNHKX33l7zxGnTvirHYf8wed0IwjfUb878es+0LrJwQUDRkRrvjyOWNPq9Xro9/sAkITKTqeDTqeDxWKRjtTV9HhcPb/j2EKBst1uY7lc4vLyEp1OB3VdpyOif+RHfgSLxQLf//73U7SslpP26THUOXh9at1F45KPo7f5NAKJe91sAzxv3xSF6/paqORYPRwO0e/3U3Qwo6RXqxWWyyV++7d/G8PhEJ1OBycnJ5hMJgCQjkBuNpvpvtuTkxM8evQIAJKgudlssFgsMJ1O8fTpUzx79mzPVhUidEym7erHNwG9Y1nFV/Zz3h3c7/fxpS99CUdHR3tz1nq9xnK5THdda7kIrRP1gdenzgU8tYMbjAgdG3NzwCH4eKXwduztXH/X+cjHMB23fIzxCNpovIlsjgQg/y43L0Tl93Kzrbbb7XRSAOvG74HWdY36hHlzA0EUFao+zc07dxmPozqhfT53ROsutSuqB53P9XddL2g6uoaJIlL50zfFedl8HepjhK8hvLy68dH95X6OnvPyRnUTzdOO3FwdrX+5Vorqx+skqiP1X85Orxe+H62hFb6G5E8feyJ/8W+ukVl2zTNaQ3IsjjYo6hrmUF3n+hDtKigoKCgoKPjs4xhfwTv4GXwP/983bUrBW4TjwfGbNqGgoKCg4BXi3gvCSrapaEUwMikiqSIxOSIWc6SmC04qIPqxxx7Rq7YwX01biWQSS1GklIuL/DwS6Zz0ZvoRQeXvqX38nRFhkW+ifPVdPkdBimQY/yYxptGBkQioflWSlj5Tf6j/XczWNuFksfvIhUWNSvJ6dr9ExKr7ip+pOO+Eo9utZeTv2gYjcdTTUhs0bf1OBU/vM2qr11Mkxmp+/ru3E4XXk9ritjrJHRHGiqgv5aDPsr0qWavPVVWV7rNldCnFMrbT9Xqd7rltNK6PH16tVjg+Psbl5WWKEOZ9uIvFIuXR7XYxn8+T4MlnGo0GfvzHfxzL5RJXV1d74oH6k8LqoSg29fFtEdjRGJQTpaLP3c8qOqrg6kINgCTkDodD9Hq9dPQ2Ba+6rnF1dZX8v9lscHl5mdKlyLnZbNL80el0UpukuLxer1HX1+L7arVKIv56vcZqtUrlU7Jfx/RDbet1g8dFE6wr+pnlfvjwIU5OTvaEJ+BaOOcJEbyrWfsuo0bpCxeAfLzVMZRisPdpFU9ui7a8KyKx0fP2CHV9J+oHUYSu5udrFkVuMxXtimz256N+GKXFDQHA9RHs+re2Dd9I5HMH89DNL9GVHf6O+8p9qOuTKK1oc5uP2+pPXSu5aOb9MdooFs3VuVNgPD2vE92sxc90fvL25usVT0frge3LNyPlfkb9TBGVRW3VNhGVNXrmULv0tYqXT9u9rim9LLrG1TW5/vPyuijraXq70O+1zfJvXW9Fa2S13cvhfvQ51X3BfCJf3TbHFhQUFBQUFHx2cB0h3L79wYKCgoKCgoKCDO69IAzcJGpcZFTCWQk+fUbJIiU+c2Qk4fcQK5mnR0J6Whp9q8K0k0waVenv6h2MLsi5+KXkl0Yt+POE5+EEJsuqZfC6oPDBY0jVNxH56PcLR2R9jiTjM0qCaoSmv6t1pO1BI9WUnFSh2sVFt0/t0khqjRhSck9JQ5bL6y46olTbsoqf0eYIFS78eHUV0Pmutju+r/Wqfjwk9qq92tY1itqJXS2Xk8FOGEfCu28OoF25u0q9X+UI32gciMpKG/g+I+eazWYShNX+ur4+qpjHFD969AhVVaWIXopurJPNZrN33O/l5SWOj49RVRXm8zlarRaePHmC4+NjNBoN9Ho9/PiP/zi+8Y1vYDqd7rVBim8UEA4JbVGf9f7o30dCiwtJh/Lz/qR9VccnbV8U1dvtdhIq6cNut4v1eo3tdpuOym42m+nO4aqq9o6H3m636PV6aZylaMafvHOYwnJd1yliW+cRFbc+CV4Fuc965+/et1arFeq6xmg0wsOHD5Pgu9vt0j3V6/U6ja++sYpCu9a7HkWtx6R3Op10zDnL5eKX91sfg+5aZh9n+XmuzUeCl49JkbDvG4jUdn+O+eiY5IIbn/G0fGw8VGb/nH2DefLu4MgmF9DUTu1/PEKaEeG3tVUvYy5KVdOJxiC1MRet6fOpC2luUzTGRXZoW2J+OkZ5+p62pqXfR7b52OnvR/Oj53loXat5ah/ztYpuCNC/cxuKcmtNL4tvOtR1tfspSj8ay7y+DvnK20i0WUPXDFFdeL465qtvvZ513ebjjvpeNzrqWtTXVpr+m958VFBQUFBQUPDieAc/je/i771pMwreEpwMTvBw/PBNm1FQUFBQ8ArxVgjCKoB5NC2Pc1bCGnhONPvxlUqKRYSUC096X69G8OqduiTNXKDjexpNoz9J8Gj5mCZFbBKyURQt03EySN9Rkon2O9EXkUoupDkJ6SKh1o9G9vGdSChWkk7L5ZFKbgP94NHL/ruTbEoCqt1OvqpwEZF4Xn/qDxLnaovWm5ZV84xIPbXFI6qjcnp6TrpHJLa3I61DTTsXIeRErddzJH44ceo2uYjgkTlRuto/PQ9FLh+H2qXRll7velRuu91O9wfP53PMZrPUFnhcc11fi8MqNM7nc1RVhW63i7qusVqtUj2vVqsU3dpqtbBYLHB0dIRms4nz83McHR1hOp2i0+ngq1/9Kn7zN38zHY9MAUjHLEa2HoKT5/q5j5ne9ryO7pJPo9FIIqS/y2dYhna7jW63i/F4DOC52FVV10IlBeDxeIztdovJZIKqqvYEXEb+MsKYYwOjjEejEZbLZarLwWCQxFKKpBx/VCz1yLGXIemj8eFFQfFfN6p4P2u32zg7O0s+GAwGWCwWyTfL5TJFt/NY7kajkSKLgZtiCDcc0Bf8ju8Cz0UOFZd0znN7XwYusPi8o8jN4Trm+Zyl46jP6/w82kjjYqLb4yKP56FpHwL7CJ9lHerdz8DzscvrAXi+5uJnjKDXcS+ah9QXh+rQ5yIdV7XPRxuHfE7zdVGUf/R+ZI8/53WhdeptJ1rj0ZeaTyTkuR9dyHTbo6tKNC1d40XtJ5rD1Q+av/rA7YrmekVuveNrAs37UDuK1gD83Tf+qY/dRt/46H3Ur7+I1olAvMlR3/O1kbYXrQsV3bWuo3Wb+znyZUFBQUFBQcFnFxUqvIOfedNmFLxFOBme4OFREYQLCgoK7hPeCkFYSUsSXHrvrxIhStD7e8BNoVOJm1xkhRIw0TF90TtKBKlt/E7vCybJxWg3PZ6WorCSaCogqzCtxJ2SqloGikQkFFXwjsqk5L+TbUpK5XzpdZQj13k8Kd/NkXBeF1GUC/9Wu/ToXrdb60brT+3lM1qunDCiderRJF7WnBAcEd0ujCoRGJGV+pmT0kqsOqEYlTMidTVdTSMit+t6/35K+sMJ01xfzEXr+O8UmrSMkUjp5XGwzUSbOYDnYooSvb1eD0dHR9jtdpjP51gsFqncm80Gw+EQ8/kc8/kcwPUdw41GI92Fyw0oi8UiiTe8C5ZjA6Neq+pa2FwsFknoHY1G+IEf+AF8+9vfTsdNc/xjOrl7hN0fSqRHAor3i0gguAucGFeyXK8DoJ/b7TaOj4/R6/XSsc/dbhe73S4dBb3dbpPAyTuXGRFM0R0ARqNReh4ABoNB8tV0OkW/30en00mRrnVd4/Ly8kb/8P7IsrzssceflNinsM16a7VaaZynrcfHx3j8+DG63e7endeNRgPL5RLz+TyJib1eb2/jlc4/Wl7ey86juH0zgopZfI/iC8fEly17JCzx80hc8eei56NnbpvTorR9Xvb3I/GXP3PXCkSgn/XebbbVSPRl3ioUu6ClawBfQ3DzQFQmtyuao3T+0/ma8LVHtDFN04ry9Tkymtd1vrnNx9puPX2tTz15hZ/5nO/tRvPX332jgo+zuTJpG861VS+zfq7vqO/dH8wrt0Eg93dkbzQ/+7gT2RClR7jt7i9fa/nnvvb1sT8aW/i+rp2iNY1/nrNN8/R+pJttCgoKCgoKCj4dbDDHJb6FPs7etClvFY4GFXrtF9t0PVvWmCzKxrmCgoKCgvuFt0IQ1ii8iKh1IsnJGycT+ZwSWBqVSgI1IsBVEFZR2kk+Ele5e25Jsum7hB6pybwiApLfuaimZLK+y+9zUVARQadkk/pFo3OVuNR31YdOfLkQm6vPSDRUQYbpUmzU/Dxfvqt15cIW7ebfKlQptD60npxopV0ave7kp9aF+pj5UxhkRGlEFGvaKmIyLz+SWvN1cdhJYf1Hots3ZEQbLiKfRKRtRAJ7W1DSVYWmyFYncj1dFyiitsA2zs9Zf3oUr/YlABiPxymadD6fYzKZpKNbeYTxcrlM0ZebzQbL5RKNRgPdbheDwQDPnj1DVV3f/7lYLLBarTAYDNDv93F1dYXtdrsXebxYLJKAvN1ucXp6itVqhffffz+1FQo+tEUjcQ/hNqEgej4SJ3LQPqR1Srs1spRtrN/v4+joCMPhEAD27q9tt9uYTqfYbDY4OTnBbrdLAjCjvPv9/t6mol6vtydeUnSm8F7X19GRy+Vy74hqFVm1/ahgcFsk5+tCt9vdi2jX8Y7C+aNHj9Dv95OfeYf1eDxObZRRpqvVKh39zDapcwPLyzxXq9VeBCnbH/D81AWfp3Vupd0vCx3zFS4yRRsZcoKYpuFjPNuvPxOJcD7uuN0+d7k9/o6CG0e4uUTXG9qPdL3RarX2jpPmHeU6tunJKFrX2uaj8fPQWk3XY1GkrK9Lbktb25Iec+1rLvehvhd9pmV24c/FQLVR155RO/CNer6WuO079ZGW1dtNLt+c//i8b9xyYZvPaZ+N+sVt/dht8rUvP9cy5jZuat65vhltxMv1eRfAdWPCoTWq28x8Pf1oLIoEZr8CRNPXNnZobCgoKCgoKCh4tVhjio/xq3iM3/vC79aoMceT12DV/UVVAf+DXxzir/zZMb501rz9BcE/fW+N/9H/8Qm+9/Tt3Tx31D960yYUFBQUFLxi3HtBOBJUCZIovjOepAqjmpyEUTJFxTO9L5if+X28m80mRTs5UReJnPxeo355FyVFCRXZPD+m4+VTAkijtZwcdMIzirT0Z5UgU9FDSWYlDd0X+p3b6ekrlITzd6Ijk/19imJK9unzThT630re5aJdlATX+lZyUG1jBGJEYivRTNFYI761vl3UdwIwEkCcRNe6U7KUf1NYzxHCGnXmxxEzfSV0ndQnWe/RclFbdULWyWYtD/+mj7Td6DNanqjfOtw+1o37g0eynp6eArgWxBaLRToaejAYpOOG6bdWq5WOJp5OpxiPxxiPxylKU+3r9/vodruYz+d79cy2zrbDejk7O8NiscCTJ0/2BEp+HwnC3tZdYPBnHPrObSJA7j0dK/WI281mg91uh36/j9FohHa7vXdlQFVVKWpaj3HmO81mM0UbUwSdTqeYTqcYjUYAEN7nTKGeYzIFNz02Wvsmy8N/KpZ8WmBbVF96/Y1GI4zHY1RVlY7evrq6QlVdR2Xzd0buLhYLjEYjdLtdTCaTJAjze0LbF+8pZmS6Rhjr3KvvArgx7t6GSITJCTE+L2q/v03E8jFK/RkJeWpb1I8iG/S7HHJjlZ4koFdDsD2ofxlFXFVVEv3ZP8bjMdrtdtqs4n6jT5mW1r8i5yf3WTSWR+n4c7m8fG2h80FUt9Ec7vM0f1exLlrfaDruM10/eVtTG3STVyRIMy1fa0Vt0Nc4Whb9Lud/n1NpY+Rrtyl6PhL+o7nF6yjaYON9nOnrT92EonbyfRd4XYzVeo7qIWqLuXHMfez+d7FX15NcU/kaWMd293VBQUFBQUHB68cWa9SoUeHFNmWtcIV/hv/ra7LqfuLHvtDC/+5/eIJ3T1/8/9d/+OsN/Jmf6+P//Lcnr8Gyzwd+/kd/Ho2qrBULCgoK7hPeilFdd8grGeNkd13XKfJOoeKSi5gUwVREoNCiEYIqmpHA4Tt6B6WSsZqW2qKRU7k7yKL3mL/a7vaxLLSJ77LsFKMdOSJa02GZlCRU32nZIlJPEQmSSjir2OjvaJ4uUvM595PXudYXv1NyVaPfcrZrvv6MiqH0k/rafcTn9WhPr38+p/krQag+03I6ievtxNt/jhjXPub15sS7v0dohJGT1Z5e9H30nJbLbVX/eXtQ5EQo72usS/qd3/d6PZyenmK9XmM2m6V7gCm0aMTmdrvFxcUF6vr6COirqytcXFykZymo8T7b4XC4d0wr649iZV1f3/nKsrdaLTx8+DCJn9pv9Sjh2+BCmvpEv9cNKS8i5uk4p21Pj73lcywvxc7BYIDhcIjBYJAEbvpsMBiku5kpuC8WC1xdXWG1WqV+xTuZp9NpEr9Wq1US7+u6Tj7UeUVFV+373s5vE/deB1T8U3Ds54aBXq+X/DefzzGdTrFardI9zA8ePEhR0IvFIkW1A/vXNlA4BK43LqiYCDw/vpoifq5f6hz/IqKwP+ft1ccy9lvtuzpuROlGY4s/62MYy+JpR3OJR0znypBDVe1H06sgRoFYx67hcJjqvtfrpTGHx8x3u12MRqPU9nXtwfnCx3j3VRRdGY0l/q4jmtP1u9zY5O/q82qnry9UeNS/fe2pvx9qr55fzgZtM15eX+MeKru2byJKxze0aXm0f+jYFrXl2+rU16f6e1RHLrRH7SxKQz9Tu6N5Scue6+der7etK/RvrQv+Hs0Huq7Qf3zW50Vfr0V+KSgoKCgoKPj08Jv4m6jx4idCPcM38BTfeA0W3U88Omrgr/0vHr6UGAxcr5f+3C8M8Cn/t/wzh0+blygoKCgoeL2494Kw7/bX352oI3miYpqTN/x5SHBU8pP5qXCoEb76nttLYkmP+eVnLrQ6YaaRPcxH09aoB4oofN5JMS2jRiCruKvklxJQSg7qcdEajeH2q+isfnCiXIVZJR6diFNBTYl9igxuv4r2Xk9KvGk51D6N6tU24+Rc1Ka0rTE9rysXASKBQYVTLXckoHjaTqRGZKMe6arfOXHppHUktPizrIOoj2mdOskfpeP2H3rf6+qQaBGRsxGidu6kcKPRSAILBcV2u7139yqFGQr+vKeV/Wu5XGIymST7GYXZarWSqAkgHemqbVejMClUdrvdFP2pfSMnGCq8PUaihIsDLwO+z2NrWQbtW9oX2Cd59HO/38dwOEz9fbFY7Inq7XY7RQiPx2NsNpsk9l5dXSXfHB8fp8hI4Lr/P3r0CL1eD4PBII0HPErXRRMdz1xo/LRJerYBnbvox0ajgePjY5ydnSXfbbdbTCYTVFWVjtPm8eWdTieNvbwbmPMSy0yxkT95RzXrq9FopMhVrXMd9yPR7GXgwko0buh44mOH92lt41G/93r2tcahMdXni8gGfnYIVVXtHRWt/mu32+k75s07o7fbbTr+ezgc4tGjR6kfANd9YDgcotPp7NmhNuq85vZGopnXQ7RWiSKg2cei7yI/ua1er+p7n1d1vRLVd5RPVO5IqNNxgpsFaVP0rq8/cnOvz/k5v/AZFRwVPo/qOtr9qf5yoT5nR85OphHZGvVft9nXMEQk1Edzm67TfO7xsmsavh7R9YG2axfVNU0/Qt83IkZrc66vc/4vKCgoKCgo+HQwxQdY4uJOz9aoscESK0zwT/F/QY34lJ2CfXRawL/3bxzhp36w/YnS+YGzJk6G9546z6JEBxcUFBTcP9z7I6MpRJL8IDGi4oAKjUouKZHiBE90XByfU9T1/rHJLngxLc9DiSAnGZUYU8LeCWb9ybLlBBn/3iNa3BY9rlP9x2f0bz7DdFRIruvnR9n5ccERma3igdar3rGrUbJ8xwllrauIxFNyMIqQ0by0LijaOWnswjPL4e1H60+Pr1UfahnUV0rYevvg334ktqYZEYjuL/pqu93eiCLP2aftLxIHdeOBt8tDAg/LEdWL2uFtnuKA3hut70RtQeszEgzUd26jCjr8XY/W5vHPu90Oy+UyRQe32+3Ulvr9PlarFZrNZhIZ67pGr9dDVVUpWpWRsBQMNptNaqMagcko7aqqMBqNMJlM0h2wAFKkZ7PZTPbQn+xvOeTaQa4eb0vj0DMqHOpmFfY5JcIphFPsbrVauLq6SgIXjyuuqipFAtN3PN54t3t+zPTJycneHLLdbtHr9QBci2lsY51OB/1+f69N6CkSWh4ASTB9EX+9CrDN6RjNfyzL0dFRahebzQaz2QyTySQJf/QvhQdGpK3Xa3S7XfR6PUwmk+RLPX6Y7dU3UFFYZ39RISxqi3dpO1HZgf0NCzo2EdH8rm1Oxxsdn1xwicYq2q5l8PcjUS0S0+5afm4G8ahdXwPQ1xT5t9stOp1OOmXg+PgY77zzTmoPjUYDvV4vtQPdgMLxKndcdGR7FE0abciL1g2Rr6I83Mf83d/zecKFxyhfz1PXmb6ujK5dcBvd3lyefC4aU/x3t8fndE3P23o092kauf4VtX21zed3bwduh76jm2+8P6ltzFevo1B7orWL9gumFfV3t+1Qu9Pvtayc63UOpp261lVfaNoq4PtGFZbPx6eCgoKCgoKC149LfBv/En8Dvwf/4/D7NeZY4Bm+h3+Ic3wTv4X/EhsscYXvfsqWfn7xb/2hIf7ynx6j0fhka50febeFH/tCC7/8L1evyLLPD4bdIX7mqz/zps0oKCgoKHjFuPeCsJMdJFk8EksjolRUi8Qm/q2CHklSjczkuyoa8ghMF+FI7OjdqpGo4gKfkqA5YlDL5yKjPq/ClUYjKjHG/PQzkv5O9jmxGUX7av4e8aJQAd3LqUeRMvohijpRMfBQBJcTetomchGwKvQpMRelr/6m//Q53wAQkZRejxpRqwStpuMCR0Squn+Zp77rZXGiNEeaa12qP7U+9HmNmtG0tT1FUUpOQkckbUTYervTcul3upHDyVWFblJgHh4VRzuPjo6wXq+xXq+x2+1S9C/HlH6/n0Rfinb8eXV1hU6ng06ng+l0miIyd7tdSo+Rn3pMNPs401ksFuh2u2l8Ypn5vI5f0T3CWt/R77lnXuZ74PBGGRUOWU/cxMD7bOmX09NTnJ+fJ0FyuVxiuVxiNpthPB6j0Wjg6dOnaDabSYCnwMw6Go1GKfqVJzr0ej10u9090Zp2UBClMEQhms9otNmnBT3Kmv2S9tZ1jfF4jLOzMwDAZrPBxcXF3t3BVVWlY4Ln83k6Npt1wA0JLq7wiG62ueVyifV6jc1mk9oto49V3NA703XsfxkxPRKmfEzKiVeaRiRS5cZYHz9cpPHxy22IxquciBj5o9FopIh/v6+afUV90+l0sNvtsFgscHx8jLq+Polgu92m8eD8/BzL5RKdTgez2ezGXKjjt/YXty8S73weyAmIUXlz43QkoKl/3Of6jLYN4ObpLuw72vd9zeHzW1Sn7peoPUW+0zx8vovKH20E8/YWzXlqfyTSO6Jyqu98za0bNPn+ofWK2xVFKbtdvjbIbZ7Udqn9jWNXNBf5O+qDqL3pelLHX5/rvGy5DXfMT9eZXhe5saOgoKCgoKDg9eKf4z/Gj+G/hy5OUGOHC/wWJngfv4G/gQt8Gx/hn2KDOWrkN2MXxPiFn+jif/MXjtFqvpqNb++evNyR0593NBoN9Dv92x8sKCgoKPhc4d4LwsDh4wcJEib6DIl8J3T8XyQ2keRXgc9FTZJnEVED7B+9rO87cexkKHAtLDuJpmnp5y4mOhHq+fqRc07UUaBV8spJSa0XjyhWQl5JKgpsTgS6UKz2ep1q+dRGhxNwOULSSV4VeZQ8jcRsFTciglDz1zT9u1xbJhmt+avg43Wh7Ujhgq0S3NoO/B21kz/9qGoVmb1duFjiYnz0e0408HpQ/2nd5MSGSJT3eorgGzi0DfPnYDDAyckJ5vM5rq6u0p2pFFx2u106lpdHD19dXeHk5CS1C2+DwLXgslwuk4gLXEf+DgYDnJ+fp3J1u110Oh2Mx+MU6Tkej2+0B+ahkbi3IRJqovZ6l7Qc2u70JwUubbdsd71eL0UHT6fT1Pfo80bj+sjjjz/+OEVSLxYLfPzxx9jtdhiNRknE+uCDD/DgwQMMBoN0zPJgMMDl5SWqqkriOsV6HecYPatjnYsPn7YgTB9o++TGgk6ng4cPH2I0GqGu94/XZgSw3jn97NmzZD83GlC0pWDOO4n1XkvexbzZbLBaXe/A3mw2yX/qE4/Oq+s6ie0vAh8b+JnXR9R+XZyiPSrm6hpCn/c5ITdXHhIl+d4hkTDqW1VV3ThiXdNlvdLOXq+H0WiU6qfRaGA+n2O1WqHb7aZ82CZ6vR6Wy2WKAKdgrD64S2Ri9L37H7h5WoT7Lppb1O8+D0Vrp8gObR/R974B65D45vNCJPDlfOLpRD6OyhmVxfPxeTRqi+4H93NUL74eVPjmD6apfSlnu885uq5VGxSRbz2tqB25Lf6cRvfqu14vCt0kd6jf81kVzHP2eVq+XsqtgwsKCgoKCgpeLy7xHr6D/xpLXOA38DfxBP8CS5y/abM+9/jFn+ziP/nLD/CFl7w32FEB+Df+lT7+xn8zfyXpfZ7QbrZv/f9HQUFBQcHnD2+FIBxNYE56K/lJAkcjezVih5Fnevyuki4aUafElpIu+hnT0KgsJXacrFHRUY9iBLB3ZLEKEJG4oLYA2BPAc5GXkaCcS+s2Akr/9ihZpsUIWvWBC6MqYCsR7/XvvoyIe/5+G+Go0cwuGkT5e/QI39U8nAR2ItHbk9vmZfR2qb5V233jgaahaXk0s7ZV9QffYb3pZy6C5IQYJ+SjsqkPXazPpentyP2g/vJIZG/P0U8F24lvtFDittls4vT0NEX1djqdvXrudrvJvxS79ChWlp15dDqdlFe73cZoNEqRloPBAFV1LX4+fvw42UARcD6fYzabodFopGhjpq117XeN5nDomZzw8CLQemR7UzFdx/O6vhbe9cjjRqOB1WqF8/Pz5PfT01MAQL/fx9HRUfL1YDDA1dVVirBmhC8ATKfT5Ov1eo3Ly0v0ej3Udb139Hav18NisdhrC+oLv5P804zYYpvTuZB2NBrP7w6u6+tNCtyo0Gq1MJvNsN1ucXp6msrAu2UpqDMSdbFYpHbLCNH5/Po/1peXl9jtdjg6OgKAJDpTkKZ9tFHnBffly/rAEaWVE8pcnIme93RzwtJtQpA+8zL/Qef4oHcz03e6WYH9nqKvnh7Q7XYxGo1wdnaWIoJZdxSBeb/3YrFI84euraLo4FyZ3O/RGOKbl3LQPCO/6/pExz5vZy64+VotqldNw9tGJNL5nK3PRbb72KLf+1rQ1wo+N6oNutY5JJa7XV4Xnpd+rmu/nB+9z+nalM/eJv66Db6O0nnD11/aJtTXUdvzdhlBN3BpPlrHfh2C2+ZrNPVnbr3p6ys/JaCgoKCgoKDg9WOLJf4O/j1ssXzTptwbnAwr/If/01P8wNmro7qrqrpWhd9C/MxXfwaj3uhNm1FQUFBQ8IrxVgjCKhopeURRxYkVkvMkiJQoWq/XN46A1qgFTzNHAvFoaOaphJGTyXrXaSR0RISjfq9iN8UlJ/mUeFThj76ISFbP10VP+oa/q9+deFOCzu3hT73jTckrJ/Nc6FSijuWnTRF5miNtPULVn+VP+iuyz4UWtclJUPVHjvzm3x4t5/dq6uaByMf83P2q0eO0k+lpO/e2oaJSzjfaRyLfR+0zEmO0bavvtA1o29BxwPu5braI6kH9rt/l4CS9R4K2Wq10LHGr1cJgMEhCGP1I8Y3+a7VaGA6He/5qt9tJJFssFulO4k6ng16vh3a7jV6vh+FwmPLudrtJrAOA1WqF2WyG1WqFqqqSeEk/+bH6t+EQ4a94WeHTBRX6kOOEHkPMe05PT0/TPcoULtfrdfJXXV+LuPP5fO9+WwrJAHB1dZWOie50OlitVpjP50k8rut670jofr+PwWCA0WiUjgL3dq7jdtSfXjcoWPNkCbWn2+3iwYMH6Pf76dQLCrVsC/QT77keDofo9/upDTFa/erqCs+ePUtR1dwI0Ww2MZvN0uea/3a7xXA4RLfbTf7juKFzqI4XL4KcKOSfK6KNOf6dp69/+8alnKjmNugcEL1zF1TV9XHmHC/0c9YpI4fruk53Py8WixTtzvcGg0FqC8D1Roput5vGEN4fzDIzTb3fPEI0z+b8FUVa+5iv/S3yh+bpeel32j5y45nmr3Mc51G+m3tfhc7b2rKvU3QdmntObY/6kCO3yU7L6fOvQte20Rzuc6vbqOsbLRs/j2zw9hH52/0U9S1fVwE3157uE/1b1yAcm/QEHV0b63O+fqQtuY1u0fO+XtGNXNG67dPcgFRQUFBQUFDwHEUMfnU4HlT4q//OA3z9y+1XnnarUaEC8LadqdJv99GoPt2TywoKCgoKXj/uvSAc7Yp34dEJKiVxgOcCqYqsjHjSZyJBV3+PxDAnIJWkoqDqO/mZN8lyjZCjwKVCmkYzkJwl6U5E4qMSqvqMRzzqM8xjs9mkaLpImHVSyolS+ojksZLJUeQoo9Uoxii8PiOiOEeSaR06Gcy8NS1vc3xfSU1/PyI2tX06Ue3tB0A6hlXfoS1Vtb8JgPXv9juBqOlEZLCKvh45o/WtgnIkgkfEu5O8WlYVY5zEPUTQqo+1fDmhxduN40XIet2EoO2dz8xms+Qz3mdLIbfVaqWIS0aeDodDTKdT1PV15Gu/f32vix6NTPtOT0/37szl8dEA0hG+6/Uaq9UqRQdfXFzg6dOnyf9a11VVJSHvrsgJXtF3d4W2Q+D5Mbf8jmnzDtp33nknCVv8B1y39/l8jsFgkNrsyckJttstLi4usNvtkqjLNnR8fJwEYW372+02Hbc9n89RVc+Po6bgqrbpeKligJP8rxsqfms9N5tNnJ2dpSPN5/M5Op0Ottstut1uijpn5DrHa7bbwWCQ6mSz2WAymWAymSTBkeVmZPvx8fGe2Mz3GJHKzRHRuKTp3RW5NhjNQ/68P6Nzg25e8vk0ZwNw89oEtc03t9w2/uTAo6JZR34SCsdpjtXcCMDIYQr5ANKd271eL/m/qq43BrTbbSyXyxQBrmO5C6S3IZoLvR14XfqcEPkrV6++zuF3Os8THhnqfUjnHa0/vWPeyxr97fO/26+bhqI0fY5nX/Xn+LnOu+pHn2OBm/fX6u/R+tHT1XWB++ou84Ta5nZHaxCv91xf1zWA2qXirK/dItu8ziN/ell1TQ0gXNdG+ejaQutF69TXSi87BxcUFBQUFBQUfFZwPKjwV//SA/ybf6D/0v9POoQ/+rt7eHTcwIcXb88muqqq8As//gtv2oyCgoKCgteAey8IA7hBsJPAo1igQhmfIYlNwkzJR0ahuZCo0ZNOtOnzSjQp+A6f0+MVgZs7/p2Y8yhPJb78SF++o8Jd5B8njpiv2u93irqd0TvRs7RByxFFzWp6+nlEBLOOPU8lyLROmL+X3yOmmY4Sg0o2+vHTGrXrBCV/qp3eHtWPTrRGbUHJRSUu+WxkMz93UYBpqM/pI49uifx8iLTXOo0i0Z1Y1rKoTfoc39O2lss3igQ+RH5H/SGHut7fnEA/qVjEqNa6vo7E472qXg8U1hjZx2hfHrPb6/VwcnKC5XKJRuP5HZ7AddQexV7ac3V1hY8//jhFu1Lkm8/nSZS+urpK4pZvQHkVx0t6nb1sGkyHwjZt5vetVgsnJyfp7l8e6bxYLJKvVqsVer0eer0eLi8vMRwO0/HPo9EI2+0W0+kUw+EQjcb1EcrD4RCr1Srdq9tqtfaOlabQzH5EEY6CvPdR9Qd9/ip8dBf4uEe7BoMBHj16tHc09Gw2w3w+x3A4TGXkZiRGBGtUL++/ZjS2jocU4tlel8slVqsV6rpO99Xyp0fmMVpZoWPbXRD51scKn6tcSPExK9r4dMjnTMeFMKblQtknaRMU/mmfbsjxjUt1fS3U8z5njj1sv9yYxrpfrVap/mezWRrDKOhzAxDb2CHx/jahVO2nX1ysPTTXeL4+R7owSXgdRXOrtwkdy/lsVO6cqMh2EgmAWiYXWLXMPqfl2r37R9eI+neUvvtK1xVMU/3i9qsP9HNfj0TrKz7Hn1qPbrevx7xPRZs29XMtt5ZD60/Xry4G5+qTaUab0LzuGN2va9jIp16GaD1Gv5QI4YKCgoKCgoLPK06GDfzVv3SGf/Pn+2i8BjEYAPqdCs3Gp3uK15tGo2qg3+m/aTMKCgoKCl4D3gpBWAlaj25VIisialSUVMGS6WrEn6brhBTwPIKJnyuRw7SUwPHjljWiRMVFJ7BUXFCy1CNPlSxT+0m8R0SeEl38LhLZSCI6Mcrv3T4X5/Q7phsd7+uCJp9VYjQSpg+JmVovTsZHdUtxgiKO2u/kvm8McHJVoXlr3bpwo+m7bSTiXejR+mA7V3KRdXTIf2yTUXSUtzP3o5aPtvhnXgfaVvV7baP6jopczMN95iR2RGpHmxj0GRfz1KZDdadtlNGpdV3vHT3s7ZSiJT8bjUZJqOR9wbwrdzab4fz8HOfn52kTy7Nnz/Dxxx9juVxiMpkk2xndOZvNcHFxgSdPnqQ2HQkJvgkkh4isVr99Umi72W63WK/XyT/8rtfr4ejoKN39O5/PsVqtAFxHXX300Uc4OTnZO8J2NBrh4uIC6/U6RQtfXV1hPp/vpbVerzEYDFL52K54N+5iscBgMEh5qiCs/tATG3KCzesCNyW4cNFut3F2dpYiRHkPLN/hsdiMFr64uMByuUxtmffKUhzmONFut5NQSFFxMpmkOlssFkk85BHpVfV8w4zPVy68vYjvovHd5yVg/3QRn890ntH5nOnzfW0fLk6pPfzpc4fa+zJ9p9FopM0KKq7pxjNdc7BuWE/9fh91XSdBWesRQLov+OrqKm1AoZiv6yfg+ckEOXgd+vgfzTfRpqUoTa8bH8dy80E0l2k6agfwfIzMzTeejubpm7Q0f382mlv9ee0zuWfoG20bPhd6fbhQ7P6L/Ou+8nWOlkvT8/FR+5+ud6JNFr7+ifq2lkvz0HWFi87eF7Wtsx9F60D1t5aB871uItC1sY9BWnfuQ1+r+prztv5SUFBQUFBQUPB5wC/+ZBf/4f/sFF//UvvGWvlVolFdi8JvE7766Kv44tkXP3E6u90Oq83qFVhUUFBQUPCqcO8F4SgiD7h5ZDPFLX4H3BSi+L5H7xFKIHkkgxLNtEuFIn4WiWH8GYmAOTIb2D86MBIdnVzSMni5nTB1O/Q7QgUG9QnrxN/LRXZonlE5WHYX7pUsdfGY6fr9ymoDf7oQrQIr89eysn2wjC6Eq01K9DFPL7P6R33Cz3ORhFHbUuJRfaftNIrsichobwc5sULbptuZ60sqrmj5tA74nRLwEYmuaWheevc3n82R65qWl9/L6dA2rxtGVFBrt9uo6zpF6FLAbbfb6VhiAHj48GE6prXRaGA6naLZbKbo4tVqhVarhcvLy71o2cVige985zv48MMPcX5+jtFolNLfbDa4uroCcB05fHFxkY5+ZV3oz6qqklj0IsdGv2pov2P0L9sTv+d9tjwSm33y8vIy+Qy4FoCrqkpl73a7aDQaGI/HGI/HmM1m6We32wWAJHbWdZ3E3kbj+sjt3W6X/M+7cxnRqn3QBQqfEz4NUITQDVFsr4yeZjl6vR5GoxGurq6wXC6Tv7vdLpbLJbrdboqS3u12uLq6QqfT2UuT/lkul6nPzudzjEajJDx3Oh1Mp1Psdjs8fPgQdV0nYVjHcZ3b2ZeiPpiDjg/6dzQGu/iiY5aPA76xzD+vqud3ieZEOB9fovHzRaBjCjcg+LirvqAAz+c5DlHsPTo6SlHhjcZ1pP2TJ09wcXGRjqXmXeisK5/vXhScF3SeInxe9M/4ua8BI+GUv/s8wO8PtRO1lfArR9wm7/+eD3CzjfIzne8Uvj7LEWQ+j3ubYz6+1vQ03S9ROhE0De8Hmo7ON76pSuFrM0W0SSDyi4u2nra+F9WL/u3tzOeA6BlPQ8uuazZddzmitbv7RPtSs9lM/bWgoKCgoKCg4POAr73bwn/8lx/gi2evn9Ye9yv8qd/bwy/9l5PXntdnBZ1WB+3mJ7+P+dn0Gf7Zd/7ZK7CooKCgoOBV4d4LwsDNiFGPeox20Xs0YUT4Ek70RUSMC1B6n7DaE0Uq8HMlCnmsrIvYHsXhpBShZJoSUyoE6RF3ahOfUV+5sKF58FkVwwAkAkrFOxWYlCjX6GgVcxkVqOVwQlAJUxdcPQpDy6URTE7Q+v1/Xh9OmmobdHHQI8vUBvWHih8KFzY1L617/dzrRusnepbpRGRrRHxHUeZqo+en9a1p+/uHiF71L9M/VGZtu26f1rnXp+fv/naof70PbjYbPH36FA8fPkyiMEUbCpq8ixV43n4pwPBo1sVisXcc72Ry/R+V9XqNJ0+e4MMPP8T777+fovjG4zFGoxEajUY6Gvnq6gqbzSbZQbHP/V5VdxeEDwkBnwTa14F90ZplYITeeDwGcC12M2pxvV6nSN2zszPU9XVkNjd08H7hH/iBH8BwOMRkMkG32019kvnwCN66vj5el5GUjB7ebre4vLwEgHR/LiOvged9N+qDuY0erxoUfnmfLOv16OgIp6enaRzkfcHqP5Zfn5nNZmi32ylC/eHDh6nOGCk8mUyScMyNDGzzrNPpdLo3HjC6lW3T5/GcAHIbdN7JiYqR2JMbb6P3fVxTRMJmJIgBN4+Qvis4pug90Z4+/coj5Glbv9/fWwt8/PHHODk5SZHz6/Ua3W4X7XZ7b/PXYrFIkfgaFc/o4JxA6XAbiUPrLX032lyUS983yUX56js5kc+FzMguT/fQZ/w8ElqjNuvvRpu0/G8XFqP5T+doz9vT1XnW64HvR1HH/revJ30d4psyfd3t9ZvzEb/X/yP4Ok7z1zy1j3N+8H4atXdfb3F+4Tu6qdCjlVk+rRdf53idup/Ux1E7LSgoKCgoKCj4LOPRUQNfOP3kV1ndBVVVodN6uyKEd7sddvUOzeqT+biua2x3by6QoKCgoKDgJt4KQRjYv3eXR4NqlKoSQC5Cqojn4phGwLiw5dEMKpIpWePCp5JwGtnItJiGitZRlI+SSExPhZOIrIvEH7VZ7aCtejRiJPyp35VMIymsR2XrEcQe7ec+VT+oEExCTcutd0Vr2k466u9ORKuvlYw8RHTqcZy01cnViMjmO/p9LrrFyUkvh5Pg7ttok4SWX9uSE8JMm+VzgVDT8PambdBJ05wIo2loXpEo45sAIuJc+53nkxNiDkVCOdTPAPbu0ySePHmCy8tLfPnLX8ZisUjjRLfbTZGrPAaZNjPvBw8eYLPZpD6k756fn+M73/kO3n//fSyXS4zHY3zhC19IxwAzuu/i4gLdbjf1Uebhx71q32OfepMRRTo+ar/USFFGKbLd8J5TirsUvHRs5vHZw+EQ4/F4ry/3+310Oh3U9fWdz4ycpD1VdX0k8mq1Su2Etkyn0zT3RCKH9mff6PM6wUhQHaM6nQ5OTk5SpDSPIp/P51gul0kMV0F8NBqlcnMDQ7PZTJHFjAju9/u4uLjAbDbD8fFxuqt6vV4nf1JQ73Q6SYCmncDNO8SjzTV3gY89OoerSAPkTxCIxn4VZ2ivv5/bpORCl49FL9omOH6wvXr5tI9zvqLYX1UVBoMBFotFsrHf72MwGKR+NRwOsd1u8ezZM2w2m9QO9Eh6/qP4f+i4aIX6LTcfELp+c0FWn9N5VeuRvtI53/PTPLS9eTr6mc8nuj7IrS90U5OXNWqzufVI1Eb9MxeOI2E4gturn/lz/vuhzS7aL6K+GdkU+Vnz87WDP+frkkPrKt9oFiFa00TrR/3c252uhfzEAR1DaAfXZrpO1/VKThjmM35qT0FBQUFBQUFBwduNb374Tfz6934dX//S1z9ROtPlFLu6XE9SUFBQ8FnCWyEIK9lBIQPYJ5xUdHOBUYUvipp8x8lhFVydtFbBRp9TUdjJYCV+tAx8T+8X1vf1OLmI5MtFGkQkNtNn3mqH+ilXFs1boyc0DX6n5fboESfg6F/aoP7OkbpOGms0hhOEEYHYaDTS8bQR8ahpU5hy/6u/lLhzqNClxJ76K/eeCxbeVqN0XDjWNJx41khgJ129bMxnt3se2R6R6Fo/OWJX7YiEFC+3PpMjcSPS2Mn83Pu3EcPeT5mP9oHpdIrf/M3fxPHxcTrKmdGmdV1jMpnggw8+2DvymBta+v0+drtdEu7o9+VyiadPn+LDDz8EALzzzjt4/PgxTk5O0jg2m81SXo1GI4nOT58+TYKw9mkv75smkJvN5t54quIw2xijXuu6TmI872HudDopWvfk5CSdVjAYDJI4xjuH9Shv1id9R7/xuG7mPxqNcH5+jk6ngydPnmA+n6Ou6xQ5rJsrgOdjh7bbnGjyKn3II5zZLvk5RXMKtOoHRnnS/6vVCsPhEBcXF8nmVquF4+Pj9BlwfZ8zjzwfDAYYDoeYTqfpiGlGvDPafbVapQ0LjGJmPeWEn5eF+lvHa//pv/s4GUWZRpttcmJNJG55fi8CRsuzTefGe/+9qq6jstkOxuMxWq0WRqMRWq0Wlssljo6O0Gq18N5772E+n+P4+DiJw4yy13y22+3eUeM5+LjqIp0LfOoXH699rcGj5f09ph2t29Q/UX1q+j6/RXXo5SS8zqP5kc9FonI05/s8eajOFdG6Vtci3k49/6heorlZy+T5A7gxz2g9Re+5TyNxXd/3z3RN6GsH1km0PvQ1+CHboragPtK5PBpbdJ2s73qfiPL09T1x100aBQUFBQUFBQWfFbz+rdNvN9bbNf6L/99/gR9990fRbr380dG/8lu/guV6+QotKygoKCj4pLj3grASI9vtNonBJEhIkJLM8TsJgefil0ZQAbgRseREkYtKLjQ7ceMkGyNvVThQIlzJI43WjUgoJcmc8KRvnFz1KA4VXfgMfyqRGRF1LkL6++pHrzfNL4rSVnJW61U/43sRmZgT/twO+kmfjXx9W8RMjlzlZyQXmd4hQo/pHSIwIwFB01WBUp93YjM6sjoSColog4OS5bl+kPOZl9//Vjvcvwqm70R0JDhoPi5CqaDj5LDazbEj+p5t5dmzZ/j1X/91fP3rX0en08FqtcLTp0/x7NkzTKfTFM2r/XW326XjiRlZ2e12sVqtMJ/P0/254/EY3W4Xs9kMAHB0dHQjcq/RaKDb7aa8J5MJ2u025vN5slnrgEdZ59qX4i7PvCxcAGEb5b2mFC8HgwH6/X6655bRizzqluLX0dFRagMUJefzeRK3eBdxp9PBeDxGv9/fayv0CeeS1WqF7XaL2WyGqqowmUz2hFT2A/Z330zzuvxGMBpU64hHSDN/RkQvFosU4cyNMRyrKBizP/D+X0YMX1xcpA0M9AXb12QySZHE3PRA32sf433ajFyn/do/P8md1r6pwOdxRTTeeVtUH+vn2u/03nNNNyfOvWhf0n7NsmmeaovmxbUSxeTj4+O9SG22a/a35XKZ0nn27Blms9le+txcoUdFHyrHbWuY3PwcpZmbGz2KO3omqncX6nwsVd/n5iidN/0Z3Rjn0cxR2t7ufM0WrSEi30X+8nVMtK7wjV+0Q097cb/zPV+HeSSs2uTrEf8+t1by7zwtLWsub+8fvpFPn/HNkJHfo/UMv1N/+eYSXaNomaI1p5Y12hTqaRZBuKCgoKCgoODzhng1W/Aq8d9+67/Fr7//6/jdX/7dL/X+drfFNz/45iu2qqCgoKDgk+LeC8JO6pLM07sIleAhoe8RXCQ1SYIqWRaJSJo3RWC+4/fhqg0qwtIOz9PJJr6nhLin75/xpxJETlJFkRs5Qk3JQT1COjr61G1T+1QU14g8j5RwwlNtUoJMxUctjx8RDGDPx04Oul80ypdtQO2IyE71udrqpLAe2wvgRsRKjoCOSE6W3X2kNqhIH4mnka9pY45Ujr7TOnA/5KKyaEPkS/er+sehpKi+6770dqrtx0nWqE3n8tUj6jU94Pld2O+//z7a7TaOjo6wWq2wWq1wdXWVxE0Ae8euU3Cbz+cArqMvKRrznmAlevv9/p5Aw3uAG41Gil6lGEjhlPfDchxj3oyQdZ99mlByXNuo+mc2m6V7k1utVopAraoqHUnM+ul2uxgOh+lIZN67qhGN9IEeOU1BlD5ldO1kMkG/38eTJ0+wXq+xXq8xm83SHa0UjGm3+/JQBOWrAtuAj0mDwQBHR0dYr9fpvt/lcpki1/29s7OzVC6WVTcqzefzdJQ221pVXYvt0XHo2+02HeW93W7RbrcxGo3Q7XYxnU7TM4x8ZR2+qM98POH8Bdwt+l+f4+85oScStG4bQ1wMfNG+xvrSutJxWMd+zW+9XmM4HKLX62G3u47YfvbsWTp2uqqu75K+vLxM88HR0RE2mw2urq5S/dNPPALc57YXwaG69bkgmuu0j0XCIX/qmM/PfLNgJPTl3ufzmpbal9skF83tOg678Odl0bao86vOs/ynkaeRcKo+VDv8GgG1ne9Ha9dcOVnP7hOvH8I3BKqP3ffeN3N91teXmpf7wP2teebaiK559f8Gvs7SNKLy63x8qOzRmsnXQwUFBQUFBQUFBYcxXe7wD37t7YtyXW6W+Ju/8jfxk1/8STQbL35C3Dc/+CZ+5Zu/8hosKygoKCj4JLj3grASKxo1yogVFYJVKNT3IlHTySF+r2JPRFYp+cbv9BhYJadU4FVSRyMrnWAjaRkRiGqj2uPknBNTWj4X8egzJX9J1JMM1KignOimPj8kwilxqTa4vUqMkYBTos3/5nMePeXRLFF9e9vgs9pG9D0Xt/V9tTvydSQq+N/604neyN9OUGpdq81qm9uj6ahQ6JsqtN7djxG5eahPReS2+8j941HDHqWtabpNXv854dn/jupfjx7WNvD+++/j/Pw8jUcU4Y6OjtDpdJLAw6N3Cf7OCE6KOPQZTzNot9vYbrfo9XrpCOB+v78n3rXb7STedTqdNAbx+GX1B6MFD8FFhVcBHdMprHqdAtdjKsupY8VgMEjHPfMYc90kstvt0pHGFNzX6zX6/T76/T56vV66Z5X50uftdhvD4RCbzQaLxSK1rcVigdVqhXa7jUajkY6O1s0V2ndeRjR7UR92Op29ds/+e3x8jHfeeQeXl5dJEGfZiM1mg16vh6qqUpQxhXUAmM/n6ShoHtNNAXe1WqX2U1XVjbuYeXQ673zmd9pf2LbZL72fvYw/gJuCVCQo6ecurvEzPuOCnX7v+fvck5tj7gJGf+u6R9cGFIp1HVPXdRpDKPJzHuf4wDuAq6rCbDZL7WIwGODDDz9Mdavt2eeyu0Zyu4/9d5/P1E++XtHvfK7QzR783tceek2Efu+bUlxw03lW69ft0s+9rqO2pe/xmWjN5ulpOd1fkW9UeNT1cNQf3D8RojWol8t9wrT1igDf/KP9RtdtBNfX0aa0yEc5eFv2dWWu7NpufXOBjj38ybEyGhOYXrRxkb7QsVL/z6B50X8+PhUUFBQUFBQUfB7waW5LX2+A73z88qdRfZ7xj37rH+HXfvvX8Lu+/Lte6L26rvGPv/2PsVgvXpNlBQUFBQUvi3svCAPPCRwnhJSYJOFJqICmQokKiZE45AQgwfsr/TuSPSSIaCvJVNqtz+bEAhVC+LeKWBEJq+XRyKiI1HTCzqMnlEh38inyi5JcLjgqOeoCN5EjhilC53ySKyPTZBoqMChhfIhk08+93J6XfqeiOfB8gwL/qa/VVidBnahUX+k79LW2Sa0L95dCyVYnEbX+ckJtRDw6qco0vG5yJLrm421Ky+oCi/YRJb09Cgh43n8OicIR0c92xPFHy0V/Meqyrut0PDHHjOFwmCLzKAjz70bj+Z2YjGidTqfYbDbpiF3aMxqNsFwucXV1hUajke52Zb8/PT3FfD7HZrPBdDpNhLRu8NBxjHbfJgirLyJEY8ttiAQSrV/WJY/avry8TBGPjGbs9/vodrvpiGKKyozIpoDpx7YyClhPL3AxUu9m5jOTyWTv2gLgOSnvYyWP630Z37yIDymo036WjdG+3BxAQZb9pdvtJh93u90kBF9eXqZ5kmkz0nc0GqGur4+gHo1GaDSuI9PX63U6Brqua6xWKxwdHWG5XKZjijUv3iMcbX56GV/lRMDoO/9M1xAuqqjwEm3y8ed9zNHx62XADQuMbmU7ZMQ1+zfHDxWHOdZU1fM7pAFguVwm28bjcUr37OwMVVXh4uJib+7VE1cYNazj+204JGRqXWndHBLkog0DKrRpOlof2s58g1BUn25DtJbwvHT+0fR8nvN1lsLXJG6bz8EqCEbtPrfG8XWX9wm3l2n62jU3h7sAGvVxTSfaKOZ1r7+r/ZEffR2h+ej30XzvZVE/0x869/s6j+/5kdvq+2jc8Gdza1v3pddhQUFBQUFBQcHnBd/6cIPvfLTFV955K2jtN4b1do3/6O/8R/j3/+y/jy+cfuHg/7u3uy2+8+Q72O12mC6n+Nv/5G9/ytYWFBQUFNwFb8XMGRFMGukGPBdf9Ptol77v4Nff9Y5hJf2U8CPh7kfu8jvgufCkNip5o+VSEkjTdILHBQcn4pi3k1+03SNnnTx1Mku/9+O5ndj1vJQg84gw2uhHYyv0SG4ldfXIXiUrlSBz0dzLqbZq/jlyT6NqIiLSxUcXDNXXEcEbkdUuHkfksZO7UZuJIuXcNi27Q8nfqIyRHfozIsj1e22T6g8KRR5No+XTKCIvm+blwoAvfnNkq0PHEPcXxWDNj+lyvFDhns+x3zqBfHx8jNlshn6/nyJQGWlJkW4ymeD09DSNVYwSHgwGuLq6SnlSOFJRlGi32+h2uykK9mXxMkS0v0P/6cYKFWovLy9xdnaG09NTrNfrtMGHEa60f71eY7FYYDgcJiFUhTXmq8+pqOp31FOM2263STjPCYs+1n8Sn94Fekcs2yVtePr0abrvuNFo4PT0FHVd4+TkJPmD0dc83lznEi0L71mmHzhPNZvNdMxwVT3fFFPX16LwcrlMz/Ao6sFgcGPMzIljLwpfI/jckov+83nQ08wJmbkxXd+N3rsL2Ha1LoCbY7WKV7vdLkXB9vt9DIfDdMy8Rv4yAn40GqHVamEwGKDVauE3f/M3MZ/P0/yr7YnHRWu08ovWVyQKahn892iNwmeinw5NK9rI5RuucvOapqf269+3Cbm+FvB8fJ7jfBHNcTrX6xqVfx+KoM35F8DeGsftAuJTRehHXU+rT728ere4r1lyvtc+SJ94m4nWdlFfdrh9ul7xDXMu5EdrE19T6ZijgnJu/ezjR84f6n8i1w8KCgoKCgoKCj6r+PBih4+viiD8aeBbH30L/8F/9h/gj//UH8c7R+/gfHaOX/6Xv4za4rS3uy2+9dG3sN3dPGWzoKCgoOCzg3s/czq5pqSXEygu4JHQJJHp5IkTgk54ReKSHgvtpB9FACcfVWBkZBrJNxU/2+026rpOxLoTp37cnpOFHlGpRKWWT6ME1VYX/5i338nI36O6cQJUheKoXp3sU0TCqAt8tC8i2NQuTYPtx8lSLbO2iygKUNsIv3cRk9+rPxz8zNtVlJYSop6n14GXo6qqvU0PbqNuplD/aD3miExv4/xdBXx9Pqpr9ZWXOWqX2m5zvtI83Yf0yaG618/oB4qHfI/RevqcCtq9Xi8dFa0RQyTGGalJ4Zh3/jLCjyIwozEZbcz0eSxvr9dL0at6byvznk6ne75knfL449ctXjroJx2HuImH3zHimhHPH3/8MR49erTX7/mP/tR6WSwW6ahj3vnLqEkVm+nHuq73oooplNZ1nfzHqGEdE3zTi6b/OqFiMPNm+S8uLvCtb30ribkUxtkeGo0GxuMxHjx4gPV6jfl8jsvLSwwGA4xGI2w2mxT1y3ZYVc+jTRnlq+MN75llxDHrhlHK0+n0xjinfVjvWn8R5EQ190n0rM8lao++f2hsjsYste3Q+BKh0biOpOax5jre0Z/RWL5ardKGKI4T3DzCyOC6vr5f+sGDBxgMBjg/P0ez2cRsNkuiMW3gOkrXJC6g3QafN+lbnbN8I0VUX/zdxUz3dSRkRp/7HBjNR1EauTkqWjd4utFzbp/7IVdG7Tsc73xujdYcTCsSd73M/Jv56Tzsc3DkLy1zrg6i8jAPbRfqF1+7R+X19bF+rxsb3Vb9/VCUMn3oGxLVlkajkfqPrpMiX3neUd2r/6MNCJ/2HF5QUFBQUFBwRzRaQHcItHvA6Q8CFYBn3wWmT4HN23enreNiVgTHTwsfXX6E//Qf/Kdv2oyCgoKCgleAey8Ie5SvHhvtUbGMkCHBr/ffuWDqhJ6mpWSOk038TO8NdpLHyTbNJzouUIVsFeI80kPh5J+SdEomkYyi7/R9FWCcuHNhI4oK5rsuHmr+fm8fER2prPdv0kYl71SojKD1mCMN+VxESqqI43mxziMi2f8p0ag+iQhY5se7THOksZOOLmq7PaxvFSEj0lHbqvuE/tAoVrdb09L3dfOCk71RGipKRmQ734nqQPNRH7jfIvL7LsKGjilaViV6vQ+zr1HY8Wf02eVyiaq6jsTk0b4U3ObzeRJxrq6usFgscHJykiL22N6XyyWGw2ES/hqN/ftdnTRm/n7iwacF9QGhdc3xgO13vV7j2bNn2G63SeTkmMDy+f3Ls9ksHbnd6XRwcnKS2jSPc6YARpGNUZl6ggHT4t+0lc+wHBTNXIh4XdDjfHXM5Tz4W7/1Wzg7O0tHA7N9MJqcNne7XZydneH4+BjPnj1Lkb1sZ9vtFoPBIN1fzfupp9MpJpNJOkKaR3WzL3JzA+uQYz7rTcXhnCB1V+SEKZ3PfUOLj4H87Lbxw/PJzS38/EU3XPDEAY8oVF/pneM6v+9216cFnJ6e7o0h3GDS6/VwcnKC0WiE2WyG8/Nz1HWN9957D+fn52me41y82WxSHeo8+SJ3CLvffP6ORDJ9V3/6XOrzitdXFBkciW36jK5nvL3wZ5SGPhfNN9H8Fq3t9J2cb9xWX5/pvB75KErXn9V1ta6nos0Ske3R+isSUfnTRU6fp6O68L4Xbd7LldPX4Zqf2qMR8/zeN4T4Oioq413bj/rE7XPfAM9PFiqCcEFBQUFBwRtG1bwWe0ePgGYbePAVoDMEWl1g9OB3nvmd/yf+wO8GFlfA+/8C+Og33lpheFcD//k/nOG/+1O9N21KQUFBQUHB5wpvhSDsAmtEEpIYJXR3vopTSvTxGY0m1ogrFdKcFNJ89HklyDRt2u3EKvPl88DN+5Cd6FPCiH7xiOiIRKMPnJDS9yIRkyKKR0e6MOZiNG1XkYd2R+Q8o8qUYNPn+FMjT1Xk0jy8Dp1YV19oWSMxV9uS1m0uOs/JWN0EoAS1PuOkrpPZTlJG76sNTlJqnagwqf6LCFmvS+1DTIuIiPuIVNd8nBx38tM3fWibyEUF+1jhfdTvEo42OyjchyoE8ntGtGrkKZ/n0b5eXzy6t9vtpr8p9F5eXqLRaKQ7WFutFobDIaqqSgIyj+HlZ6enp+j1ehiNRmi321gul3vCrx7HrAR9t9tNEYSfFrTNs07Un+w3ukmE9yc/ePDgxjhHvzEalaLVcrncE3094pGi8WAwSPnySGrgup9TiNf2QvHNbdbyvU5hmO0NuHmnKfvHdDrFcrnE06dP0Wq1MB6P8ejRI3zxi1/EeDxObYrt6ujoCN1uFx9++CHq+lrQBa4jTxltyvpYLpdJkAaAxWKRBGGOjfP5fO+u5rp+fpS09kHvVy+KaG1ARIKbb6bRdzQtH2v1fW2jmlY0Dr+IUKObEvSOZY2m9zGPGwD4/oMHD3B2doZGo5Ei3Nvtdrpzu9Fo4OrqCpPJBLvdDu+//z4++OCDvc0/9J37lPV01zLl/EdoulF/8THT33FfRPOJzv/6nfrX243Pc/6M/tQ6Un9FgqPbE20E1HTd7mg+V5/mNlXp726XRoNr/tHcr+OM14vXjddjFJV8yE5NT31Cm3Nztvven4vWp/SdjxW+PqOP3D5fi/IzbRPR5gT3n0cv67Puh6guCwoKCgoKCt4ATr/8O/++eP13dwQ0moffqZrA4AT44T8AfOEngfd/FfjoN99KYXi7K+uYgoKCgoKCF8W9F4SdoHGhiT9JVCtho8INxV4/sjJHamnakWjn0btOBithExHPJIeiiEeWx8k49wc/87vbKBQQUSQW/fL/Z+9PY23d1rNA7Plm36529+ece+71xQ1uCF2FuirKIDk22LdUUUIhJBIwcgSCsqIIIuSyZClgK4CQokD+IysS8KNKsqiEUCl8pRRKyq4YyriMMeX4HnO7c88+u1nt7Oda88uPxTP2M5/1fnM3a+2z91lnPNLWWmvO7xvjHe9o9/OMdwwSzUzHI6SdhHYy0AnfiGjV7yMCi9FjWn7+UxHaSXwlXr2+1C9V5CJ/epSNtzmt500ipELzjCK9vD1oRGIULavigtdHFNFUVVbNp4pcVkR3PTM/RvxtiuzVvLTt8xmPtInEHG/7VXXkGys8HS+LHruq6bovKC4ul8vUplRopXDmmzjKskzv1Go1DAaDJNLw6GLNfzqd4uHDh6lfsh8x/Xq9jna7nd6n6Mu7hoGLvr+9vY1+v4/xeLzmcx2PtC3rMcifFOhn+oe+5xHYPOafUY6M+j04OMAXv/jFdNQ2NwKxfBR3KV7M5/PkQ5Zf25/WD8c8HpfMOj85OUn3r+rYEwlbOna+TpI+iq6m/+hbiuaj0QgAMB6PcXx8jEePHmF/fx/D4RB7e3u4e/cu+v1+Eha3trYAXLTnra0trFardHS5Rk/zSOPBYJAi3SeTSeov9GWn00k+OT4+TkK+izZX8ZeLd/pT27u3/U3ji49fPr5pnVfhZcpUFEU60pttUje6uZ0qRjOKdzgc4s6dOxgMBunIb2764DjC48+73S4WiwU+/PDDtQ1fmgf7ntrwMoKw+8fnvchfOi9UCY6+ztL1jYurTJc/q0RLtzWai4DLGwo8L30nOjJY26La5Gsk/S6al3wccr9WtT1fu3qahK91qtYJUf1qWaL+7WvwyI9aj1XrbIXaqxtJta6qNnl4OtH63gXjSPDnnO1+Uf9V+Txqs75+1LmL36m/MjIyMjIyMj5B1BrA+38QuPtdQKP1amkUhQnD/+YzJww/Ha2wOCvRalT/nyojIyMjIyNjHZ8JQdhFMACJLNXIWBfNNDKYx6syio9Q4pX5OYkVCVckjZQkIlkKICSmIoHUSU0+EwmkTM9JMf1OyxUJnR4dCjwTjLU8ftdxJM7p3ywHj17VdCPSyskz95FGDFYR8k60atr8OxKgnbCMRFKFfq9lUpJQfRHZp8fJKomrpLCWQaFtWX2kGwGcTNa09DuWl/5lGhRpnLTWunabtB+oHe5HJdCj9gtcjsjiZ2q/krruNyfsvfweHabpettwcPyI/KHjjZafYMRfs9lEr9db+67X62E8HuPk5CT1HUYG86hpADg9PUW9Xkev10t5sm+22+21O4oXiwWGwyHu3r27JmRG/YDl4PG0nyShrHcE612oHI/V53xmuVxiPB4n0ZJjJNsEfch3dUzXscw34ThRTz/w52KxSIKZtiWPeGNkrG6GqRIdrgqNut0Utadj03K5THbOZjN0u10cHh7i5OQEt27dws7OTvIp76Xu9Xp48OAByrLEaDRCu90GAGxvbyeheTgcprFgMpmk8fLp06dpvGy325hOpxiNRmtjBG3n0dQvCxfSInFXn9P6837r8PWEo0r48bQ25aHgsc48OYDjPtu/bo6K5rx+v493330XOzs7WCwWGI1GWC6X6Qh52sB1UFEUGI1G6X5oX2t5H6maH6ug/cPbo/vF11fu12ic9/Wgp7kpb31f25A+XyXeeaSn5qfP6bgWRRz7GsLtIlwQ5fii5dZ01Je+mUDT1GeiOdDbt46Tvt5x/0TvaR4uqEciuLe/aD0Q2ebp6Geal69DdBz1/D1PFWd9LeObGdxPUbvyPPj386Lp1YYowj4jIyMjIyPjNWL/feDB912IuldFUQN6u8B3fOkizW//JvDxbwGrT/ZapzeB//dvznE4WuHuznOiqjMyMjIyMjISbrwg7CKV75DX5wgVnyiGqNjpIq0SNk7y+7GNSsBEtjAvjwpVwsnJN/2eabqwTMKH932qeKFiipOkLgAxgsx9zLJqOZRkisg4Ci98TsurpKXXpYtzelSh2u0RIpq//vRyVuVVFSld9Y5HDKuQQL84YadEsBOFfF7r1u2hWKv14QIKn2Oe+o9tVIVXLYv73Nsmy+/3ftIeFW2iY82jtq2+0T7pz3haanfUx9TvLpA4wexEv76rdRvBSW7dgOL9gfWvfa0oihT1x/tXy7Jc26RC/y4WizUBh0f98n2m/eTJE9y+fTvdp0vxlFGdt2/fxuPHj9fuvqUoqtGAFIh43+snCdqk7YL26DiiflwsFpeib9l+Kajx+GjfvOFtjd/rBgn2He3r9AvHX+0jKmg4IR+NMdfpN/Z19Y9vUOJdyRR3efSz+uXhw4c4OjrCzs4O7t69i+FwmI4d5zPNZjPdQcz0VUhk/+OmBwrOq9UqRbUfHBwke3U+Vr9fBS6o6O8+H0ViET+vEgr1M/ezzu1Vm2Q2gWOEbnLQeYLtW+dGfk7R9+7du7hz5w4A4Pj4OB0Zz00WbOPNZhPj8RiTyQSPHz9eu6pB5xr1ma6VXlS41/qN/KBzdzS/+9isz0Q+1fnM5xRN2//W9uv1rP5w33jb13kymmMiu/mcb2aLyuNipY85vm7StZvb4+tl96O24SpRUsvgczZ/Vm1Q8z7qbY9+jDZt6JpF12z6vq+9ojWk+0L9rM+q3/1995u/U7VZzv/2NuE2+HrH332RMSYjIyMjIyPjmrF173rEYEVRAN3ti4jh/i7wO78MrF7tWp1PC8bzFf7lv13gj/++7ps2JSMjIyMj41ODGy8Iq1DmEZEkTShKatSUEzlK0JDw0ogxFwaUXOE7kYim36tN+k/zdOFKSS8X9CISKxITvaxO5CqUfNc09Ihat09JSye0/N48Pse8lNB0kc7Fdf3p+dDuqG5VROXnfuSmtwGmqe1rtVpdOm7bo86cTHShXN/T76tIT6/fKvJ4U4SP+tt9r7ZEdaPEsearf/M9j6Dx6GrNy0lW/h6R6BGRGpGm2g/VPs3PhdqoT3oZvb05XAAoy3KtvfB7j65Tgn5rawutVisdvcv7VufzOWazGYbDYRJrer0eOp0O2u12OnZ3MBjgww8/RLvdxrvvvrvWzjn+NZtNzGYzLBYLdLtdtFqtZJMKTaxP9Zm3+9cNrR+PuGM7pgjOe5KBi8jV6XSaxHSWg8In3+XYrv2PdaZ1WJZlul/Zo4gptvGuVSfctf3zb+YFvL4jPNlOOPepP/m7iirb29vY399P98fSPhXQl8slTk9PcXp6ivv37+Odd95JbYpp9Xq9NKZ2Oh3cu3cPAFJ0L6OzeWfzvXv30Ol0cHZ2hq9+9as4PDxMPvJ55SpHbFcJONF44r97vbowo5/p377BpiqvKM8IjUYDnU5nTXDXdHUTCuc7bb937tzBvXv30Gq1MJ1OcXp6iqIo0gYA1gtPHTg5OcHh4WE6PpprAF2z0C4dd1/2uGgdC33jls6d0ZjNZ3wu87Gbz2k78LVf5H+fDzaJatH87t+p+KnfRetQ+ljXhi7ucXypaqOahq7fdJ3kbdjbltrpQuQmH+imOP/O18+RLd5ntP6iTXZuH8f2aCND1L/1Gc3TT26hvb7hzzemed/3+t409mxaG7qfPE+vvyo7MjIyMjIyMj7lKArg7ndf/P7BLwHlzb0aYr4EfvF/mOFH/icd1Gp5g1tGRkZGRsaL4MYLwsBlUdiJHT16lBExFBEoEgPPyBonpUksaUSZi7/8RwKK6avoQ1udCNKjqyNCh6KOkj9KoNI+JawcTmZFz0aiXiS48R0SwCSvVFTTskaEmBPmSv5quVxU1zSVJHViVOtJ24jCReaozFoOrRMVjbVcEWmtpLeS605kkrCN6kdJZfeVphW1LyVQ9U5UjWivIt29XEyvStRyH0V1pXXh7U2Fuki48WiwqO4UTsJr2k6uO1nsaW0SdDR/PheJHMDFeDSbzVL/4b2+FIAp5lGE7ff76Pf7OD09Rb/fx+7ubopwZVTxfD5P41xZluh0OukIYABJuJtMJmg2m+luVx5L7YIAx0tGHdKmT5JUVj/qGFSW5VpZ1abZbIbJZJLqlG290+mkMrGvRUdRR3Wu96jzM7ZV3mccjXvAunigfUk3qVw3eOczy+XjA8vYbDbRbrcxGAzQarUwGAySvfP5PAnE3pcnkwk++OAD7O7uYn9/P5VNhciTkxO0Wq10JHmr1UrHSXc6nbSRYTKZ4Otf/zp++7d/G7PZbM1/0Xj7snCRyOeBKE0fnzblG4lEPq4/L7/noSiKtXuDmQ/bskYG8yh03djz4MEDfP7zn0/3bfMIekaR0zetVgvdbhez2SzdLc1y+ZykdcQ5lML9q2x08LWHi1su6PKZaIyt8rF+7nP1izzj4z/t8nreVOfRmoT9lH7wd6NxRZ/V8VHHTD7j87GuX32Tio+nWr9aFi+zb4yLfOXvexmYxqY+p6ff+Hqiar3J73ztFZW9SlyP1oTRmFrVrqI2rG1en/V1tkeUq11Rfmob09O1XkZGRkZGRsYNQVEAt74AfOt/AGanb9qa14r/57+c4v/wp7ax1X19gvBkvsL5Km+gy8jIyMi4GfhMCMJK7gCXj210ssyJeRUDPBKD/1RIUKHSiSUVwJQw5bMatbBcLtdIHJJiFH+B9WOMvZxOCCrRx+81Sk79o36IImu1DAo/eo++IKGp6Xn0hJJXepwq81P7NB0lzpScdBHL/e317+V1Ik6PxNZn/PkqctifqTrWOyIetT6jdJ3gczvV9wrWAwl7zUtJ3kh8c0HGfe3+qSL1oz4VEZpKUDMt2u6+cp9VkdNEFXnvIo7jecQ2f1chxEUa9QnbPfPl/b4kfZvNZjrildGdjUYjHSPd7/eTaFOv19Fut3F8fIzpdJqO/C2KiyN5aQ8FOPp0tVrh5OQkRRvz6F8fJ/ReZAqLn9Sx0SoyaVvXaGd+R9uKolgTxLQ8FIA9PQCXxm/CRQ7f1EA7mL9GUq9Wq7XIZR2Logi96/Sb2qNigdrAI577/X4ShMuyTCIhcNFuKPJR/O50OqnPHh0dJf8sl0vM53OU5cVdwhQTF4tFmusY5cojp8/OzvDxxx/jq1/9KqbT6Vpf1DlW58kX9YH3z2gM0b89/ar1gotO+nskJkXj9MuCx8a7qBfNN9q2Go0G7t+/j/fffx+dTgeTyQQnJydpo4i3ddrLiHDd6MB/m8ZLtpVXRdWmMubHnz6nR/Mm03PBTevKEdVd1fzCz7QemL7OcTqfRflGY46mE60z9e8qMbyqvfKnr80iP0RznW/k07w2fRZt8FK/RWs1fVZ9VTUXa325H6N1i36ndbnJF1UCuqbnbc7HI9qom1fdL2qXvhPl7+sMnfP4/w1NIyMjIyMjI+MGod66iBT++r9405a8Vnz14Rn+7/98iv/VD/ZfWx7/zW/M8eg4r5cyMjIyMm4GbrwgHAl7TsLp7niNnCJ56tG8SmpSVPWjmCm+OtGm37sdzN/JKb7LCGYnW/l+1R23TNOFS80nStf96O+qwKzpM82I8Cb5pEIe01ZiKiIu+beSh5q/R0rwdxLXKgo5oaY2e7SEk8QqRJFo8/I5Kckyv6iPPZomIr6dBNZ8ovpwMtrvtI6E+SqRxP3nRKVHsUSEvZbbI3+ifqt1ou1I/eE+8aNl3V+Rf7TNOsHtv1dFpjmcsKU4ohsltBxKyDOiU4+2b7VaePz4MU5PT1Gr1VI0b6/XSxGw/X4fk8kEs9ksCXvL5RKHh4fY3d1NaVJQZvSxCj4AkrjK8Uw3v9BWRhV/UoIw+zL9p32af+tz/Hd+fo7JZILlcolut7t2VLHWm9avHx8NPDt6nxHYWm9nZ2fp2GP2K6YfbQKhXQCS8KrXG1y333QzAm1Re3hfMP8Nh0MUxcUmAm4ooF8nk0mytd1uYzqd4ujoCFtbW+j1ekmAXywWyX8U5MfjMU5PTzGdTlP0L9s2jyaeTCYpilijXGkr7X+Zdhf1Z697h44zm75z4UoRjeFRnlXzQ4SiuIgOZv/T9uoirm7y4ZHde3t76Yjos7OzJNozLfqVddDvX5As0+l07RQUbvrSvPQ7/v6y44P70UU1/Uzf8brVz9jfNs3Dmk70mY4HLgr6PBPNkS70qZ1uh6YZbWbieOFpR3l52lG7juY4LYfbqv6P0qnyc7S28DWvpq9jKW1X23zurmoHblO0zuC70foq8oOvB6Iyb2pLbkdUf1pXul7TO+q97qvWn/p+VX1kZGRkZGRk3AAUBbD/PvDNXwNWn8z/098EyhL4L35pjD/1H/TQqL+eNc35S/wfLSMjIyMj423HjReElfTQ6FsXKp3AU3JEic/ozkfCBYMqcSkS49QWPbqaUXca2aPvKAGkhBIJUyVgI7KIz/vxzhpB5uIP06IdGkmqeTtJpyLHpmifSGCLBEQ+R1/qUYsRWcj3+JP2eJ06Iak2a7lVeKVdXh+E/65EItNWodvJUY1miojqSBiNiGqFE7asX6/zKgEliqpju9GIU35eFZXLdCJxWvP1NuPvVvWFqjrQskeRQypCRfd/VxG4EaqOSi3LMkVHev/ld2yrjMLk3/1+H4vFIn3e7/dThB/v/+X9rIwWHo1GSays1+s4PDxEr9dDt9tNkcKLxSIJfYwO9vao7Z/l/6TvEaa46f1P7zv2sZ8iV1SHLIeWzX/nM2wbKl56/wWQRDYe4a350LcA1voMbX8daLVaSRBmPvo7Bdl6vY7hcIjd3d0kAtZqtRQVXKvVUpQ5v6f9s9kMx8fHODo6wuPHj1NZ2+12Olq81WoBQLq3ejweYzKZpPqZTqepf1OcpD8jge1Vo9uqxBsdb4kq8SRqP1EeLh5ViVMvg2azme4O9tMSWK88fptj2HA4xO3bt7G1tZXqi2OQbnDzKHLWzWKxWBPwOVe4WMeycW7Wk01eFJFvquYr9Z2K35FPfQ71+ow2R/G7aJ7xdYBv6PJ1m/7uY2v0nrbzTWOEr2X1WS2vllHzq3re1yy+DtCNTjpHV/UtrwvduBXZ4T6K5nZdy3vf9bbjdRJF2DKfqk1+ek2M2kMf+KabKMKY3/nJQrqJyOtD4Xmo7fQB5x39PwQ/j9plRkZGRkZGxg1DdxsY7AMnH79pS14r/tv/cY4PD87x/u0bT3FnZGRkZGRcGTd+tlQiyUkrJ5Y0YliPVta7gpXo0X9K9kekk/6twqR+p9GCJGyUqHFhxgUIFWo8/arf9T0nvrwsTiAq6am+UYHW/exRCpquknLqVycXKZ7w9ypEd6s5AeY/9XcV5p2sVVLTiWgl7/znJkJcBWaNUPf6ikh3f36TeKfpuD1aLq8n+mRTmVlnTmQ6oakbJmif2xEJKFFko5K4bruWt4oMjsrp36lAoH6KCNkIFGf1TnL1BetcxReKuIPBAEVRJGFxsVig0Wig1+uhVru4z3W1WmEwGGA+n6MoCty5cydFXna7XbRarXRMb7vdTndFMw8dNxqNxtr9sEVxIeBRXK4SHSg0vqo49zLQcRTAWvsnsa53oFJ4jIQMF0pY5mazCWA9Sp//6Lter5fuY3bx4uzsLH2uEZRMU0G/6Xh33SiKYu3IZ+1TOuexDXS7Xezs7KDdbuP8/By9Xg9lWWI+n6dxgBHlPNK52Wzi1q1bGI1GALDW5ihcnp2dpfuCx+NxEpo7nQ5Go9GlzS+REKZjzVXEYE/PhS9+H4lh/E7T8vlYEc2lmqc+8yKg37TfqYi7XC7XxsZGo4Hd3V3cuXMHvV4vnQLAeudGgOVyiclkku4tp/h/dnaG8XiM+XyeIoajtqrrrbIs145of1H4nOF+9rE9qkvf5Kdp+PolqtuqOcPz0c+8DPqdi4IqAHr+Wqaq6HQvN5/l2jHyl7c5nc+07fq8yzWGr4HUBp/HdQ7XNWlkU9Rf1P7INl3D6Gfuz8inCq/DqjUl0+OmFPYNLa/mw3UqfRflW2Vb9P+DaDyJbPcNdtHaxtN9HfNNRkZGRkZGxtuCAujt3XhB+HRa4p/891P8pT8+fNOmZGRkZGRkvPW48YKwEiYU+JQoUlFBiToXfJy0VeLIxRwlhFykU+HCo1GVyGO6mjcJRJK+HhEEIEUUeqQBf2c+KnIrmahkkgvojioicJOQxzzdny5Equ/9X0TEad1G73k0o/50stKFcf3JtL3uXCzXspAQjMjsiCR1slWJvirSWetY33VR2f2h4osTkF4n9I0TsQonHzcR+04oq0+0TWkksJdXf3ebHZHIQzgJrG3VydyqfF5EDKW/KWYxmtXJf0bU8fnpdJruCWYUL492ns/n6HQ6qNVq6Ha76Ha7GA6HSVxTIW+1WqVjiYuiSHcEs4xMs9frYTQapTuMi+LZUet+DDOJb4qkn5QgrOK4+o6/exRsrVZLojaFMEZFerv2DR86bmkktAolfFfHD50nmD7vaPVNBnpnpLfP6wAjqmmb9iVt6yo01ut1dLvddF80o8v13lqKg+fn5xgMBgCQxMWtra10LPlwOExlPD8/X7u7midZsI0WRZGuamD/13r0selV2pyP1zpWReOh/u7CUVXUptevjuFX7Sd6/LefyMD2w8j/5XKJTqeDnZ0dABdCvUZbc1NIs9nEZDIBgNQ/lsslFotF6iOMDNd2qlGItEPnLPa5V0E0D2uf9HWXz6Xad9Vmn6cJrfuqOUPXAZFtimiujOZ7LzPT1nryPHxtViV46vwS2ejzsY9BUeSsvutipq+xPB3/rmod5GXVMvhYqWsezdPT9Od8ra5+A9avB/A1q7cNtnvtEz6W6PpRy6b2ENrOtG9pmjoeRusvF+a1bLpGfl3XFGRkZGRkZGS8YRQFsH0fePhv3rQlrxWrEvivf22K/83/bIBWI292y8jIyMjI2IQbLwgDMYHLz5VQItmi91FGkRZKrPB3F9+cENN7Jj3i1MkkfqbikKYXCX1+dKo+pyKvixURAQYgLJ+Sv/qZ+lFFER49WUXqOZkZEXiavpJiTrJRnHCimmnpfa2R4OMispabvnPR18lHJfr0MxLpXj7+HhGBHiWnPnaSVdPQ9uPlcuKWz3sdOFnJz6pIaY1O8ygZJ+PVXq1X1pHbrOVUaH2ozV5Ob9/qV0VEdG/6XOtrk52et5PEWm9FsX4nLjd3nJ2dYTQapWjTsiwxGo1SRCaP4dVIYfpka2srCUKz2QyLxQJFUSTBbzAYpMg/Ri+zPufzeTra18cnHVv4OY8jpuD5uqFjim4eUIJcy0N/cFyPNqFEYwNw+QhPAEmQ5njI+3I1Ql6F8kiwYrt1X+qdu9cFbSssG+uRoi3bIAXfs7MzNJtNLBaLtfuDz87OcHBwkMowGAxweHiIWq2Gw8NDDIfD1HbYNjgHDofD5DedC3kcNf3n4zH9yUj7F+l3z0MkoEXjq//U76L83W6dF/j9i6SzyW4ewe2bvvh7u93G1tbW2h3Q0+k01Z9GeXPTCf3PI+cBpGd5agCPi2Zb1TYMYE30Z1m5ueVFob7TMvtn0ZxaNV7781XvROuQyIZorVe1honS2VRmTcvLonNcJDayj+rc6Onzb9985dB8fPyL2rSvnwCstQMtU+RLz9f7hz6n7+vmKV8P+Tq/qs9HayP1f7Q20Hc8L7chAtN0sdvXHXpyhK+fNuVTNb7wd67ZPolNXBkZGRkZGRlvEBVrkZuGf/3NJebLMgvCGRkZGRkZz0H1ebs3BC4oOrHFiChgnfxXEt9JKBIoKhw7AQQ8i1zlTxWDnPCKiCAXu2i/psl3mLceH6mRDVrOKuJIRZSI/KI/XKh036k4p+Sw+lzLqdFfkX81XfWtilTu04iY0/pxYVz9wLpiOWiHkqssM//26Ei1G3h2LHAkCjkh68fGVkWPqB+8Lpz4rSKgI5I6imzRutLNCF53+p6KAE5map0yfSdgPbJFy+VRMlo/7luvC89bfePpO2GtpHIU+aXpej0xQk5t1DaukasE2w0FXbbN5XKZjuMFgMVigfF4jLOzs9TXaeNoNMJkMkGr1UK3213zTa/XS8Lf2dlZEnXZd1UI1fuhvT2o6PdJQMdoR1RXtL/f76c7aVU80eOlPR3m12w21+56Zl3QH9Hf0+l07ShmrVvmoXMD8EzcqBK1XgVFUazdB83P+I93B3c6HWxvb2N7ezsdh03bJ5MJTk9PUZYlms0m+v1+KttisUhi82q1wnQ6TUeWj0ajJDKyHVP0JniEtEfQ0jf8nO2N/3ReeVl/VIlRVXOhj3k+LleJY1X/1JaXLUOj0UiR/RxzNIKx2Wxia2sLg8EA/X5/bc7lZhOmsbW1leau+XwOAJdOydAxRZ/h59qH3EcALrX7F4GuudRX0fjqop2LgPo+f7oQpuOFz5fRPKD5+LxO0De+TlEf8TlfS+kzOrf5Bj33QVWkazTf6TO+ttL1h2/sc5/7Bhwti+db1Q+iOnqeyKnrQvWr+1nXgPovWsNEa18vb1RutVf7m+ej6UbrE03Lxx6Wwe3TPhHltek7tyMjIyMjIyPjBmLrHtDqvWkrXjs+PDjHL/3W/E2bkZGRkZGR8dbj2gXhz3/+8yFJ9pM/+ZMAgD/6R//ope/+4l/8i2tpfOMb38CXv/xl9Ho93LlzB3/1r/7VKx83qEeCqiDoQltZlmv3fDoBp3f0qYDlQqD+rgQP36WoQ1SJcSTco2NrSQi7GKqCjeZPO0myq6Ctz7gQ6d9FPlAhzf3ixC4FDy+j+ox5VZGfTgBqpIv7oorgVZuZp/sj8q0+6ySd+0GFQycntZwuYEWCpxPGzMfbnxO3TsS6IKS2aL3zWd1k4JsetE5YB/x9E7ke1a0T4BGp759r+trHAKz1DcIFvSqxwPN0v0fvqX3PEy1c0Iw2ElB85f2dZXlxLyiF3clkko7rbbfbmEwmqUydTgeDwQCr1QrHx8cYjUao1+vY2dlJx8byLlBufuh2u9je3k6RgOPxGJPJZC062f2hvqQYHQkOrwPaj9jPOSZynONxt/QpBWsK4C7KuNig7cXHb31Xn1P7WD9az5vGGfXxq4hoVXAbfHMEjwbn3dR+r3S/309C4Hw+x+npafJPs9nE2dkZhsMher1euncYAE5OTjCbzVCv19HpdJLvmW9RFBgOh6ndqchYJZbwvmNGaKuw/KLw8dvHHn1OoeOJP/cioko0Fr4K2M51TlHb2f/b7TZWq1WK6u12u5jP5+me8GazifPzcxwdHaX6bLfbaTMA74vWjSi6wUH9qMfcq0/5zsugKmLVN4L5xh0du3UTVhV0HorS2yRc+uajqvWWz/e+qcznomju9nf096hNVtm8aZ3i70eb0DbZGK13o/7EdbRuuqy6UsP9r31MhWqtt6o69LbAMTFag+jY7msmXYurn9QmF4q9Dfh8r/b63KL+qVrLaRuK1iNRWyiKInwnIyPC2/Z/+4yMjIwbg+f83+HaUG8AxY2PBcLZOfB/+5Xpc/9P9rK4WL9da5JvNQpcHCXKf9+FBv4w2ughrxkzMjIybgqu/cjof/7P//ka+fcbv/Eb+OEf/mH8yT/5J9Nnf/7P/3n87M/+bPq713u2W+38/Bxf/vKXce/ePfzSL/0SPvroI/zZP/tn0Ww28Tf+xt94aXtIxji5rNFv/L7q7lh+riQaCRmmwe/1qL6yLFO0XUQ2KckT7fqPBLuIfIsiHXiENL/XSD6+56Srk4meXyT+uTinn7ugzH9K4mm62m6UgIvKzJ8st0YuKskZkbZqi5J7To5qnpovoeKwtgP3XRQly+80qphpMNoqinSpKr/+7QRgFSnoz2v/0HyVNHRiVetQfeuIyFX6JiJ8te782HYti9dVRLB69IzXj/706CG919XHEI06Up96X9ayej+kTdp2Fefn5zg5OUFZlhgMBjg5OVm7N3c2myUBr91uYzQaodlsotvtotVqodfrYTwerwkOZVmmKE09baDZbKa7XyeTCQ4ODjCZTHB8fJyODubYyXbqdUGh6pMg+VRcWK2eHXus3+m4yDrUY5O1D7MsrAOPdNP2pe0AeLb5gOI665kCG/2s7YnpatuisMz7oq8LKiBq+6eI32q10G630e/3sbOzk6JKeYdwWZbpCPHFYoHRaJSOHy6Ki6jR2WyG3d3d5PNms4lOp5PSH41GOD4+RrvdxnK5TG2E+Y7H4+R/jsvcsKDznLeBqv72PPh45XPDJv/r95GgotGWUR5ux8tA74LWiHTdqNXv99HpdNLdv91uF0VRpA0lvV4vjbHc7MF60floPp9jPB6nvBeLRdqcolHJ0XiqIvLL1pHPfZpuNMf4XLZJzNTfvV6i+SPqr7r+0/JHG6Wi/DV9X99oHwUutyV/lvnqOlfbsq+z9Ge0KSvyu78b9Rmd13Tc1TTUz+oDXbtW1ZPboXm4YE5bdD72eovqJ/KR2qVrEk+nan2l73HMjdq1t6dorcI52/P0enAbFO7jKvszMhRv2//tMzIyMm4Env5b4N73fDJ5FTWguw3MR59Mfm8Q/+OHS5yvgMblg8ReGSWAX/jvJteX4FuCHgr0/53I+wfRwhf+nTzwOTTww+ik5x6gjh3U8KtY4O/gFL+ACa5v63pGRkZGxpvAtQvCt2/fXvv7b/2tv4UvfvGL+CN/5I+kz3q9Hu7duxe+/0//6T/Fb/7mb+IrX/kK7t69i9/7e38vfu7nfg4/9VM/hb/21/5aupfwRUGihEQ9yRAKHBrB4eSZCqoRKaPRmSpKEkrkES4Oup1O+FUJeSTMVaxTkZFYLpeJLFQBhc85+aiiGMugwhF95MIpy++kmpJharuKbireOlnp/uHPKAJV33FSUUlTlksFvUiA9Hp0H6mvI8Kb5dGjPJUAVXFebdXfVQx1/3gbcUHdRSwnzat8HJHkWn8RoRiJAhHR7PZq/pEvtb7odxcD1IdaBj+i3aO1ojy0XSmJq22E73jfrKpHzYebNTQ6iQSxl0uPheVRuxQZW61WGmsp1DL6bzab4fHjx0nc5ecsG+8RVl+oCKrt5fz8PD3v7cfJdtYfI0ZfN+g7FzV0zNL+RnGKRz9HZWCZo80zvnmB9UfBi5s4VKTrdDpotVqYTCaXNg8B66clqOhw3ZHWFJr1GgEtM++T3traWvPNcrnEZDJZu3+a9vHO4J2dHWxtbWE6naLVaqX7qHl/7Xw+x0cffZSOjOb9tOwH3MAwnU7X7irWPkER0ucgF1deFj4u6+c6ZkWo6v9Rm/J3fGx+GTSbzRTFz7wo3mv773Q6mEwmmM/nadxZLBbY3t5Ox5lT4K/VaulI+slkkjZXsM+0Wq30jJYrWq8Azza/vOzdwQr3f5VQWBVNTHj/8jxciIzmPM/bhUM+p/ltel/nMT6r9alzs77Pd4HLV3+wDNEcHK2XIvt9nOcz0WdRXbgorNDxT8uifS1at0T+VjvUJ15HLgpX1YemG61D3BbfSOjiN/0QbTr1NZdvJvR2EI0z6iOvz2gNzee1nesa9nljXUbG2/Z/+4yMjIwbgeUcF1LjJzAH1+rA8DZw9OHrz+sN4198sMBXH57he9653qusDkY3K0T496KJ/xN28b248FMfNXSe0xb/PbTx99BCDwX+rxhvfDYjIyMj4+3Gaz03ZLFY4O///b+Pn/iJn1gjG/7BP/gHuHXrFr7/+78fP/3TP43J5Nluq1/+5V/GD/zAD+Du3bvpsz/2x/4YTk5O8K//9b+uzGs+n+Pk5GTtH7BOGDoJV7XLn4SJEltKVvGoZ/7td1AqgVN1ZLGTk0oUkeDyOzL12GsV2iLyy4ViF3HLsgyPTHWf6Xe0mWVygcNJcBXUIh84Ma6/+53LLo5SxNDjRdVetdmJTfqHP9V+F/r0XW8/LhLxO42cqiq/ErX6Getb7y2ORFWtcworngfLRz+ocOZtjXl7foro/lP3hx9t7gJXFFHj7W2Tr/Snk53RP4/49bpwf/lnfCcis6vs3wTtTySNSYS54Ag8O9p4sVhguVym9t7r9bC7u4vd3V0AwGg0SuJcr9fDcrlMUZj0D9PQdDxCVO+7bDabmM1mlwhw4JkIrT6KyPLXBW3/PKqWPqUYraIq+8JisVgTqpx0599+H6oe48n2rPeja568B9rHxiqRg89oe9X3r4qqTQisK9Y/28NiscB0Ok33BR8eHuLw8BCLxQKHh4dYrVZJTOSYcPfuXbzzzjuX7pSl2NtutzEcDnH79m3cunUL3W43RSM/ePAA9Xo93TWsdcvId50vVWiJxqkXhY9HPrZGfvRxU+FCC9OsGptexe5Go4FOp4Nms5mOP9eIYbbt09NTzOdzzOfzJOrr5oPxeJwEfh7nzTURxwRGA3c6Hezu7qLVaq0d9828WGcuiul64VVRJQDy9yrxUMd5F04JHRui93UD0fPqzIVZTdd9o2m47VE0q8/90VrK5y5f+0Tv8Dn1k56SE5XX60N/j9Y0Xha119dfkT+1z0VCuM5Xbp+Op7728TTVBzr+6HdRObRuvX597adl8vWDn07kZefzuq73+Zfl8TWNjpualq6rr3O+ybj5+KT+b1/1//qMjIyMm4MSeMX/x2RU4+y8xPkq+3UTagD+99jCf4gO9lHHPurPFYOJDgr87zDETj4+OiMjI+NTjWuPEFb8o3/0j3B0dIQ/9+f+XPrsT//pP433338fDx48wK//+q/jp37qp/Bbv/Vb+IVf+AUAwMOHD9f+wwgg/f3w4cPKvP7m3/yb+Ot//a9Xfq+CpULJHB6bSpC4UdFAf1dhlD9JmKqoSCJGRYNNdhBVUXZKukVkqJJfSjS5/U5iapSgCkka7cCyAVgj75Us83s3nczV6GYXlVWU1HdcOHbC1PNXIkzrQ8k3+sNFykgkZL15ubyOmR5/OvHnwrO3AQApMiuKIvLoo4gwdrHEfRkRzPyeP5U81PLoc/6++sPryUnVSMytSkOf9+OrvV1oPbrfq57z8m/6nfB3XlScUrsBpEg87VPadhjxu729nURP+mNvbw/L5RKPHz/GwcEBtra20Ol00O/3k1jD44p5jyf/LRYLdLvdJC5TuOOdot1uF3t7e/jqV7+K5XIZHsWsbV7vD+aRzM/zxVXAtHUsZb/hWK6bOzh+UQhlXejYHbUFFRN0TNExRoWjZrOZRHfaQBHax1Ntly5aXCWy0qH38vJ0Bh0rVSRerVYYjUbodDqpHYxGI3S7XQwGgxSlvlqt0G6300aC5XKJg4MDnJ6eYjqdYjAYpE0FRVHgzp07qe0VxcW9wRQ1t7a2cHR0hMlkcql/aD1zTuLnKihdBVXjIMc9ryM+G7VvF4WqRONX7RuM+ldfErrB4fj4OB0NzWjtdrudhOKyLJOwXBQF2u02xuMxVqtV6kcAUnQwxyhto77ZjfM5+4pGyr8KonqpEnejOUmFM9rraeu7+l5V2lF9aj92+6P5Rn93u90+n1P8eV3X6fzvn7ko6X1M23hUX9x44+u5SGTU73yd4fOwziXMX8VO5q1lieZZX2tV+cvLrv72z7xdeN7q56r1nPcZT1ft8TWQ5qOnqWidexm9jn2jgLZXfs46/6Suesj49OOT+r/98/5fn5GRkfGpx+QIOH4I7L7zpi3J+Izhi2jgy+i+8vu/G038MLr4L3DzjtHOyMjI+KzgtQrCf+/v/T386I/+KB48eJA++wt/4S+k33/gB34A9+/fxw/90A/hgw8+wBe/+MVXzuunf/qn8Vf+yl9Jf5+cnOC9995LhAzJXCWVVeTUI6SBmEAiUaNHAKsg4OIryRbNE1g/UtBJVM1TIzcj0Y3veZk0HxVDXAyOyMWIrHJxMCKvmDfFDPpdScGiKNIR1lp+2qqEu0eEeSQH3+FPjYjZRK5W+VCFXBdzI+LT/axto4p0jQhgJ0sZccXP3A61XW0mPOLNI8y1vXq9qfjidvszEamqNmr9KTHuPlAiVf2uaUZ150K+5xERoVpv7kdto95etLxV9kd9xxGJ/FpvFBk1emo6neLJkycYDAZJ1KAoVK/XMZvNcHJykk4taDQaKR3e8dpoNNDv99NdoU50M0KQ7/HeUd5BSqFQN8DQb75Zpig+uXuE1X88RlvvOFW7dCOBnzTAsvgY7ZtgdCOJjs/a3tQub4dK4LuwpL69DpFTwTahYzP9QyGf9d5oNNJGAa3zra2t5I/z8/N0FDR9fnh4iOVyid3d3XRk+GQySYKy/t5ut9HtdrG7u5tsY/S6C36MWNWNVu7jV0Uk4OnvWl9ez9FmH/58EVHqVVCv11NkPtcbulFG+9v5+TkODg7QaDSws7OTorQ5HhwcHGA2m+H09HStfbD+aS/TnUwm2NraSndCsu9o/lp3Xm9XQZWApu3YBciqPujzlv4dRaJWzWGEtxkX5whtL/65p6XPuc1RGXw95/N05BNv077Zz3+vEsL9d76nm2T0HX8vSk+/i/qoz79V9mg96lo4qkv9zNPxduY2sx9E6+ioHWq5tL9E60Vvm+pbfbZqo4qvadw+pv0i65eMDOKT+r991f/rMzIyMm4MyhXw4b8Ctu4A9es93jjEzjvAt379It+MzzR+DF30rhDhW0fxwhHFGRkZGRlvJ16bIPz1r38dX/nKV9Lu4Cr8oT/0hwAAX/3qV/HFL34R9+7dw6/8yq+sPfPxxx8DQOXdRADS0ZIOF508EoEiHJ8lPBpSn1chzclDf87JGX1G81Qhjfkx3Srym+9oVG0UDeO2AViLLiIhqNGJHsHmvtAyuYgXEVBObPnzGvno5VTRSUUNpuORu/SFR9MyLT8W0d9Rsi6KTnGxUfNRIjIiV5WspO1KNurnVSRyhCpCMorq1QhkhfcRt0fr1qOt9HkeTxv5NCKEvZ7Uh5p+FdSnLgq4LyJCOWpvVcS72+9E7CahSsl3vyNWCXTaTIH2yZMnKWK33++j3W4nAYcRwsvlMkVbUBBlH+edubVaDdPpFEVRoNVqpfLrUfeLxSJFgfL4YEb68TlGKDIf2gI8E60ajcZrFYR1LNX+4tHs6nuKYfxdN/J4ZGPUf9guNIJS646ivh7hzmN7VUzVsUzrSUU1H7euAkZ3RtF3mr9uGGGk+HK5RLfbTWNur9dLGwS2trYwn8+xWCwAXNwfuLOzAwB49OgRDg4O0O/3cXZ2hn6/j263m/xDgZGRxOfn56ndEcvlMtlFsdjHk6vARTYfD6Nn2Oc3CWR83setq9rMjRbA+sYPAGncpZ/Pz89xcnKCx48fY7Va4datW2i321gsFmi1Wtje3k4Rw2VZYjweo1arpUhubibR9j+bzdLGi9lsltpslcCn1z68CCJ/Rf6P8ou+13SIaD7UucnryIW4KH0db1zoiz7Tv6PP9LuozUSiH/tQNHdq+j4P63jgaWpe7hufI6vagK97ovT1PY/K1/Sr0uJnuoEneo/1V7Ux0uvBfR+th32tp2tG3TDldrGsWg7+rfOEjjl83//WtZauf9Qu/13na77DTWUZGZvwSf7fvur/9RkZGRk3CkffAr79r4F3vh+ovdZYHaDVB4oCuOF7wNrNAs16Fis34T3UUcuCbkZGRsZnGq/tDuGf//mfx507d/DlL39543O/9mu/BgC4f/8+AOBLX/oS/tW/+ld49OhReuYXf/EXsbW1he/93u99aTsiYkbv5nUCGljfVe8koAthVcKpE8x6xKOSjE7YaFSwChVML4oy0L9dPNV3Xeh1QlDfiUhCJbCUlFdSKRIctPwkip3scyHb683/ReVUMpHilebFMuh9oFqHWiaPoOVP9UEUoepCUQQnKqN2plGiTsSyHavwBDy7b7YqX/ep2sLfNQ/1j0dEaz3o5gUlQ51g1nqpan8RqatpuM1Kjqpo7W3aSVL1hbY/JXgjkjuyxRER1v6d3juuEbiRzxeLBT7++GMcHx+v3Y1er9fRbrexvb29dvSrtnnd5EGxlhHGZVkmQU9FZm170eYP/uMYpRsyWA969P7rgPZZbf8qqnuEH23T+4HpR32Hn/mYpvOGjqu+kYb+5fjDyGyfg/xeX45NRFU/flk/URB2QUXnK859tIuC//n5efq72+2u3XFOUX17exvb29tr/X6xWGAwGCQRczgcoixL9Ho91Go1LJdLHB4e4uTk5NJ96efn55jP50nkpL9d5L8uH20SsaIxrEqo0rQiEY1pvAp4HzPrh32V/9rtNvb29vDee+/hc5/7HN5991187nOfw3A4xHg8xte+9jWMRiMMh0MAQL/fx/7+PobDYRLqF4sFjo+PMZvN0gYACsxFUaT7iPv9fhpvtEwquK1Wq5cWmKJxdpN4SkSiWjQH0cZow5bm5yKnli2qf11T6fioc4xv8IsETc3f59eonfs7vh7RzYW+luF7Ub/y9uzl8n4QtXVPw+dWXbe4nzXtKD39m+Onb9zhM/w7WtNq/upLjun6rJYjGhO0bUbrK1/XuBis6bifdAOKrk8j/zJvXTf6eK/5cePXdYyjGZ8NvC3/t8/IyMi4UfjGrwIf/DJwnq9uuA78gS+28MV7r1lcz8jIyMjI+JTjtcyUq9UKP//zP48f//EfT4QuAHzwwQf4h//wH+LHfuzHsL+/j1//9V/HX/7Lfxk/+IM/iN/ze34PAOBHfuRH8L3f+734M3/mz+Bv/+2/jYcPH+JnfuZn8JM/+ZOvtFNYozdUBFahVcUgEjBK6GgUJ/9W4kVFCWA9WoFktz8TiVBOJCmhw8/4txI6Lt4pAeYkqkcaKJml0YJKfPHzKkJMo/KYXiSAO9RGRhOqLyLC1kUgPqufOUnr/qCtWvceWehljYRFPXrW6939xLbghJ9G5Xkdar3xd/ezE7JaziqyVtuVtlPapFFfVWXVetayMHqU9rtY6L7Uz9w2R9Tuor7h/djrw9OuEndopxPL9EckEKgtUf3pUaqM0lVxR8VbpnN2dobRaIQnT56g0WhgNpulo2PL8kJkm8/nODk5wWAwWBM05/N5Sqvdbic7KRIul0tMJpM1kcfHO5aRIqCKDzr+KPQe8dcB7S8uqLuAohtAeE88Ix0pwrZarbD/6vjMfqVku4pgwLPxSTf0lGW5ttmI73Ju1DGb4+Z1EfQuHmqbVuFsMpmkaJxGo4HpdIpms5nul6bQvVwu0/HO8/kcALC9vY1Op4NWq4VWq4WzszPcv38/Rf2Mx2M0Gg08efIEe3t7ODs7w3K5xGq1wmw2W6tT3TikbUznWbZBCu2vCu2zwOVoOh1fmLeuGfi5IhrrmJf+fBkURZE2cujYDjwTijudDnZ3d7G7u5uirVutFvb29lCv1zEej/GNb3wDn/vc53D79u1UNor9s9kMX//61zEej9Hr9VL98Cj5oigwnU4xGo3WTgDQPqJ97zpEJp9rojksWiP4u9FPfS7qFwpdl0XrM10/+e+RD7xN+GfRusnXDVX+8Pal7djXI2qnfuebpLyMLuZWzeW+lnHf0t/+vfpRN3Yxf81HxzVfP+tz6s/IbxF8fPB8aZ+WX32mvvRNAVVrEC1fJHK7T7S8ej2I5hOtmaOyZmQ8D2/T/+0zMjIybhTKFfDxb138/h3//idzfPQNRr0G1HLwayUKAO0cHZyRkZHxmcdrEYS/8pWv4Bvf+AZ+4id+Yu3zVquFr3zlK/g7f+fvYDwe47333sOf+BN/Aj/zMz+TnqnX6/jH//gf4y/9pb+EL33pS+j3+/jxH/9x/OzP/uwr20PipErAc0GH4piLbCRm/DhmpqmksZI/mhbh9kTkM7+LyEctF+HijBOKzNfT5XGwLhp4pIX+rqJkdGenElSRYKQ2OfnH3520VNLWy6JiWhQRw7818kPJ14gojshOTUttU5+47zS6xkU2t9XbiItTKhZqfStRq/m4zV4WJ6ydtPT2EhG6/jyFLfpexfboWMsoPa1jzTMi3bWevH14v6GvtCxaD07EV4lGVcJClV8Jv7+2LMskoqsQD2AtcnQ2m+Hp06e4d+9eIuIo9E0mExwfH2M6nWJ7ezvdAapl5U+NuNTxjvcGF0WRxFFtM5Gw4GKojiEUQ6/7PlyiLC8EaopVFBHVBhcQeb8wbVWBTccW2q19gWX3Ewe8L/tmD4p1enevgnVPfxJ+MsCrQts4/aVR+vxuuVxiNpuhLC+OBmZEcKfTQafTSZGp3MzAclFEXq1Wqd1tb29jOBxisVhgPp+nd/Soetbb6enpWvQ165B+ZwQ725pvnrgORMJPNO77vKzPEi8rOr0IeBIA/aMbHCjYAkikOoX6+Xye6q/VamEymeDp06doNpu4ffs2VqsVer1eOjZ6b28vRW8fHBysRbny5AGWh/07isZcLpdXFuuZD/2s87SO85uEUf/e60nnVJ9D+HkVovaiv/tcFs2bke3a/qvmb18HKXyjgubFz73v+7rYy6k+0TSi59wXtOl56w4tf4SqjUeeZ2SXvu/PbKpHX4P4WM951df4+n+FqL1W2el1tKnOfcOgzn2+Po7Kxud0Q+J1jacZNxdv2//tMzIyMm4ckij8JaCeI1xfHVns3IQtFPjj6L5pMzIyMjIy3jBey0rjR37kR0Ji57333sM/+2f/7Lnvv//++/gn/+SfXIstGhUKPIuAVJIlivZxAszT0Wc8ksJJTCWDVLDQZ1xMVuLHhUaKFiwLy+nEXSSGEZFo1mw2k7gbkZgqnhAanev5RuWI7NE8+XkVweg+dPHHCTitGy2XEoRab+rfCPqd173aoeS5PqP1pCS3EoXaxhiNrn6jP1UUUd9GYpK3T9ZbFAWkZXUSksSjfqeR9/qZE69OYkZEsdZTFG2j/nS/u5CrP7Xs6isV5Ly9R33J/aN+Uhur4KSsiioqPEb3mo/HYzx8+BDvvfdeKkun00GtdnE38Hw+x/HxcYroZFSn+o33jtJnFKJ5tyif040HGu2nopSOCU64MzL1dQnCOiYyv6pxUcluFYJpo44ZuuGnLMskoAJYE4kVfId1xbRpD9umnhKgefE7nS+uy296XLT229VqldoJ6265XKZ8VYTkMc8A0jHSZXkhsN++fRvn5+c4OjpK+THyfTqdotvtotvtJuFXjx2mYDwcDtFsNtFsNtfGEK0Xnzv0DutXRZU4E423/NtFG0/H7b8OkUXboNrBfBaLBZrNJvr9fqpb9vvVaoXFYoFarYb79+9jNBrho48+wnw+x507d9budd7b20snELB9LBaLdJw0cHFP9Gw2S+MA7dGjxFer1SvfH14lZkUiqM5/0RwWCWDaz/UZn8f9Hfd9le3Ruorfueim9Rj5QG2oysPz8zmuav6KyrharS6NESoY6lpF8+Z4G33n4rHb4Rv4orKqL308d/9FgrfXl6+FdHxhGpF/tD/rZ+4L+kvt0nnJy+jr5WhTiZcp2nAVrVnULrWNNumzvL4iI6MKb9P/7TMyMjJuLHKk8JXxH//BLHZuQg1FjhDOyMjIyHh9dwi/TSDp7mSjR4KRZNHIRr03Up8hCepELdOPSB6PmI2IbierCCf/NGKKRJUKtkqkqcCmfmAZlZSrEh2Zh0ZPe3mdlHTxzeFlduJR89kU+eJ3yKn/ImJWSUAVvrS+q4hpJ5m1zWiZtQ15XUSISEsKQ0qA6mfuG33P0/J6j9o64REuSlqqYOX1pr/zp/7TvhYR+05eui8jfwOXI2q0LqNNDO4njciK2oyWzW3l91UikiM6EljbCO3h3yxDq9UCADx69AgnJycpnW63i/39fTQajSS2tVqtdJRsq9VCu91O94+qX/hZWZYpilPbQrvdRqfTSd9HbUvrQ8dVb5fXDR/nKGrRDr0rmM8TeocybaQoriIj2zl9o+1R2yWfVZFZ5wYV1DUNPeIauJ77cBX0gfclF/JYXzzKudFooNvtpnbEu4Mnk0k6glznnYODA3z44Yc4Pj5OaQAXdwe+++67KcKYdvR6PRTFhWBclhcR7uwT2g51vonG2Ovw1yZRTccX+kvrqyq96PdXBfuxrjl0vma729vbw3A4THdWT6fTVA8UdcfjMYCLfv3w4UN87Wtfw2QywXA4xP7+fqoXprdardJdzhSyKNyrv7S8emf2VRCNxTo/6E9g/W5elsHfj37XdRo/17S9PUTrCxcQvRzqH31X09fnNU0vj8+Rnq7P476pKnovWhdWzfuOaH3labmNXg/6fLTuVTv1GT7n9us87elEa0n93dfl7otNazifx/X9Kl9FbVn9FaXj6x6WydtXdBJEVFZPPyMjIyMjI+MN4+PfAh7+FnAN/5f4LOLBXj2vazIyMjIyMp6DGy8IO8FE0l7/Bi4fKUeyW5/hu0osReSMEjcuiKpAFpHHUXSAH1/KdPSYVI2aVLEiIuCcWFJRxH3lNpH0dRspNEWEuorhSmCpaBKRoP5Pj0r2OlYxqCp/FTJVtNL6YPpOEFMU8wgfJx01XReqnaiMCG/1D+s58o/b5j5R8q+KbKSo49+5wKuf83e1QSNQ9Z+3FxfU1I8qTKkNFD59I0LVxgYX6aL/DDhJ6psQtNxVbTEi46N3HCrkRH6lrzjOuCA2nU7x5MkTLBaLdMzzrVu3cPv2bfR6PbTb7SR48ifvBqbfKBRTbKLgpNGrtVoN7XY73UmsdaJ1QAFV23lRFOme0dcFH6/1jlktg/uX/tCNPDr+MQ2ONbohg7+7oM/89Dhp+kEj/BVs03pfqI4X1wHd7LJJLKIts9kMs9kMRVFgf38/RVJTAGa5uUFhOBxiuVzi6OgoicUUEHkX8Wg0wtnZGfr9PobDIXq9Hvr9/lodzufzdG2BbsjRccP7vUdbvgo2iYEuUGl/j/p1lQB1FdDPHAtoD8cFRnQPBoNUX9rfeYS3noLAftHr9bBYLPCNb3wD3/rWt3B+fp42gNy6dQu3bt3CYDBI0cGr1cWR4KyXxWKxdi0A29F11EsE97sLwC7a0VdeVzoHaVr6jj6refsaTvt59K7PJ1XElNutn/m8oultKqfb7W26yl6f273s3s6j9cqmtq/+j+rL25GXPVqf6DOadiRyR2Wqqg/NV0+c0DFVy65rRP88iizmOKb58XnmpXXla8hNa7Lon69xdX32uvptRkZGRkZGxivio98ElrM3bUVGRkZGRkbGDcWNF4TL8tmxnyQzKQwoaeOkjBNKTlb5XZIvStLo705q6jMqxuqRpVXEj0fCqSBCqECin5MMooDBdCgEOMEWkZeet9fB83yl0XVKWLnoTkHCy8b8vU5dzHGyT8k5t0vbifrPxXn1F7+nHfw7iiBlOTQi1OvL/ah1UEVAV4kXTioyj+hdzVOPJdRn1ZYqW708XieejhLBVeQyo9BcMPJNFlrv+p3a8TwhwEllj1CPfLaJbCZprPYyD4/2Z3567+9qtcKTJ0+SiLZaXdwDevfuXdy5cwe7u7uXNma4qMwysH/zjlHPm6KS9lsVLfm8i6Ycc5nm64L2NfqKhLy2HX5O8ZXlpl8peGl0K+tFNyrwc25SIKqOkqb/dcOOjz++kUd9fVX4RiHtt/QX7VitVukIZ7Y5HvfMd3UzgR5VXq/Xsb29jXq9jvl8nu4XHo1GmEwma9HqZXkRETwej3F8fJzuGOa9t7p5Z7lcpohhH8uuelw0y+3zhfd3n8t9DnSx7TrB6H6tR2/Hw+EQDx48QK/Xw2QyCaOq2W95jDTTqNfrmM1mePjwIT744AM8fPgwHQ1dq9WwtbWF4XC4tm46OzvDeDzGcrlcW1NxPK7qC8+Dr4GicVmfc0TzRLTW4efqn+hqD+BZ//DNLpruJlHR7fA1QdTXXWis8gt/RnOeio3R5jlvu1WblHT8jMoUrRu8/0T+0L+j+vF+GZVNx1b1kaft0DK5L7VMumkgao/Rhj+1Xcd07YdR21KbIrHd89Wy6O/6vNelp6ubtXTdn5GRkZGRkfGWYHYCfO1XgDJv2HoZbPUKvH8737+8CW18BkSAjIyMjIzn4sbPlkrM6F2nSswp6aK/Uzwh2UIy1QmeSLh0YkzvZtQ7cJVsJUmrpJQSrJHY6OKfimP+jB7zq4ShE0suTDhRRoKZaThJy8gh2lAVberik4uCXi+MYFSf6Tv+HIA1HyiZT6j//N7WSCR0Wz0tfsa7WrXcWk/+WUQKOwGqdRGRnerP58EJbY+udLJbNyh4G/EysH6cvNVnPEpISWff3BCloYS42uhktrdNF2E3PaN+rupf/I52RvXiftfIZ7ZXJY/Z/tUPuqnl5OQEJycn2NnZwXw+R6vVwv3799Fut7G/v4+yvIi6rBIcKPip4NBqtZJQpFGhu7u76HQ6l0R6rV/Ng2MkI48bjUYSWa8TLsz5mEK/8ln1PX3rgsLZ2Vm6b1XHYxXjIvFC84+On/doQp872IZpm252eFWwTr2Nat/VzTW05fz8HMPhEN1uF1tbW5eOnG42mzg/P0ev18P5+TnG4/GaiNhoNNDr9ZIfOp0OAKQ2cHp6utZ+VqsVjo6OcHp6utamtA/qphn2j+ie9Jfxjfrf+7jPaT7WuAD1OkBf68kWahNF+HfffRfNZhPT6RQnJydraxP6iveDr1YrTKfTNWGYZT06OsLjx4/TBpNut4vBYJBsKcsS4/EYJycnGI1Ga+MAfcj+cx1+0fGY8HHWx+RN83IklEVrPO372qc1vWiThadfZZc/F5XR5163men73OebY1R01HnF53z3V7QejOrF15KRiBrVlb+rdVq1nq0qp8/lvsb0dLUcOp/5RkPfBBedTsN8fXOo+6gqfx1PIv9H402Uh/vP20vUhvX/B3pKT0ZGRkZGRsZbhKdfAx58HzC49aYt+dRgf1DDd79z4ynuK+GH0MGtLAlnZGRkfOZx42dLJ935mRLKTgpqxKa/7wS6k2keTRLlr2KaRuspGU5Rhenz2EgXs52A82g2JT0VTgYyb41+i6KO+ZNiiUdMaloezcB01N/qVxUl+A7t1PqKBGM+71Go6g8XDLU9uPhKLJfLNVLNNwP4vdCeh/pBj4eNBB8tv5OKapsS10rYapl084OmrYRh1H7oJyeBvQ3o8bFqpwr8/q4+x3yizyMC3QVo9YX62/uy2qKbH7yNRaRtBCW/9TOm5YSsg/kpYc/69H7BdkLxttlsYrlc4vT0FN/61rewt7eXhNtut4u9vT202+0k/GgZaTcjd70vl2WJZrOZ7nMFLo6tHgwG6Ha7mEwma/YDzyKMta9pOSnkvQ5BWPPRCL9IPFQ/q7CuR0f7uOn9W6PR+YxD26qOEyq0a7S3jm+RyHQVMM1InFB4VNpyuVy7P1hFZRUp+/0+Tk9PsVwu053WjDanQNzr9VJ+rVYLk8kkfb9ardDpdDAej5OwTDs4B7HdtNvttTHdhZlXRZU/IiGPz9O3msZ11JeiKIp05HbVXFWv17G/v5+O6aYveef3dDpFr9fD2dlZijKezWbodDqp7ZdliVarlY6LXq1WOD4+xpMnT9J9wzw9gJsUeD8w/+lmhpeJDnYRDIhFQof2Gf0sWqN4v/J8fL5Wm3xTnNqt6UdCXbTe07xdnPN3tWy+UauqzJEP/DqOyKfRBimF28T25+Xn976uidKuskXLG/XNqjr39qDPe3tUX+tJGro20HLpetLT9c+8HUX2+prc89Tno7HF12wqkFfNIb5+c//6ptCMjIyMjIyMtwTnywtRuL8PXMf/N4oCKGoArrbxOOPTjSYK1PD6TnHLyMjIyPh04DOxNciJO5I8foctiR4eU+liAt9xcc7FKY0yIIFDUYdkjh5F7EIk7WREmosKSvqQCFIBUEk1FwtVJGB5PLqZ9qmNTnpqmoTapN+rnU52ugjg/lZbI0FQ81WyWPPxaDItK/9VEftet04eqqCoJDnfiSJK+Lv6VX2kn+v3Hr2iopPWgRPZng7L4mI2f2c7iyIrncRUOyJfaz9Qf2p6kY8iIUSf8X4btVOvG6bjmza8Xfpz3p5cZIjI101CkUdTaduO+o9GYNbrdZydneHb3/42jo+P18aYbreLRqOR7hFmGRipy3Iqyc1jknkfMSNAueGD9whrpKhGzdIuF+u0jb4O6DHCKsD6kdY6hhHabr1/s350HFeRnmXTO1y977Nv8Qhlt9XHTe8b1wGvI81HBV5ta2wPKpbofEjhnccI837goijW7qWezWYoyxLtdntNSKeQPJ1OU2TxbDZLQiSFTtav+oQ+LYoi3V/7qvDxcZN4skmUel1otVrodrvpLmDf4AAAg8EAZXlx/LYe/Q48E+61XfqGjp2dHTSbzSQ8AxfC+927d/G5z30Oe3t7KMsSJycnODw8TMdE63ys4wiP974qfH7073yzEp/1Ots0rkdzcNVzLmJWCXj6nY5D0VpJ51AXR6O1kuapbVLHvajsUdm8TesGx6hcmlZU/qr1hqdV1ee0jernVesgrsv9O1+X6Nju/nVBtcoeXzvrWiNKL1ozuHjua9ao3rxO9RnOw1ofumbyjY1uh77jmxs/ibEtIyMjIyMj4yXx5N8CZ/PrSavdB7buXk9abym2e/H1JRkZGRkZGRnruPERwgDSMc/AZWGT4peKHR6VocQNo/aUvFYCKRJ3VFzg89GRq07UqTDnpBewHgWqYoOmr2RPVTRMRFgpCe2Rhk4+EVHa9IMLcwASaa3vev1UEYbRQk/LoHVRRT5GEapOGDabzUsRyVGUmtrK75yMoy+V+FP7lDxk+4ryURHV01B/ejQJ89DIaW+rVRFVEXnp+WnUS0RCOpGq+buo6O1C/RDlXfVZRMxq/lpGt1Hbi6bln0f9PRICCBXXgGeR4xQXVWhx0Z99/vDwECcnJ+nOYN7pqu2IUII56s8qzFPIoAh4dnaG7e3ttftJ/W5aHYcYgcu8XtfdhFqPWlYVC9RGlm+xWITktwrrFB1UgOM7LnRHbYDv1Wq1FA2rkcbR+BmN9VcBBWmNgtOy0lec8zTSLNoIxLptt9sAgNFohNlsBgDpaGFGn7Ida12sVqu02eDp06fpHuLt7W2cnp6mI6Npq87Z9B/Lwv5zHaiaT6qErKrx4LrAvkyRlmXWPtzr9ZKwTtF4Op2mjQfcyEG7JpMJarUaer0eVqsVut0uptNpiibmPwq6k8kErVYr1VdRPIum12PTdYPEcrl8qTbr83n0vY9h/l20kS161+tL+zXTIXz813HTba9ap0Rzro8RVeX3NYmnzb7kx/yyTLqu9Hkp8rGulXy+jnzp9hOREOkiuuftG840fc3H184+z+rc7nWp5a9aMxJ6lYuOh/os//a1jj6nc6ym6eWnuKvfa32yP3qZ9Tmff6raT1QOndsiGzMyMjIyMjLeAkyPgZOPgf33r55WUQOK1/N/87cFX/6DXXSab9qKm48SJc6R144ZGRkZn2bc+AhhF15VjCOh6Xd4etSEkqVR2krkK1nt0aoaXazHMSvRVxRFIoPdfiUnlcRzIUnJI492I5xIi4QVF5YiktCFA31f36vKw0ERSYWkiDxVIkzLroS9Pqd5OpmsPnGhR5/nOyqgaPpRnai9SpD6Hcj8zKP4nPDTdqLtaZPv1bdaRr1DMiKxPU9NQ9/x6G4VqZ301Y0B2u5d4HFf6nsqiEftT9uLk//6L4KTx0qYez4uJnlZq/LQMmgEpZO0tdqz6F7g2RHNjUYD0+kUBwcHmM1mKVJVfcX3tC9Fvle7NSqYbaper6Pb7aaNMlHbViHY/cPI5NcF+lKjcCMxiD7gkbd6dLTOBR5tpW2q0WgkAU6FW/WJnqygn7uwQ/94W3xe23lRaPl0TOQ/Fe69bfvYw7+73S5qtRpGoxEmk0nyK8XdVqsFAGvtWvPRI8k7nQ56vR6azSaePn166e5mtnkVg12suyq8rVTNneojIhJ4rgOtVmvt3mm1i99vbW2h2+2i3W6nqOCyLDEYDNLcxL64WCzQbDbT5gTe6c06AJDq0IU35k3f63US7HPn5+dYLBavHB0c9Vl+HvWNqrUAP/PoSi+Pzh2ep7evaB7QvP2nj63ez6P1mZdB7Yx8pf7S8Vw3qlTNb9HnVfOp+8PLuSlNfaaq30TjUtV7Lhb7WkU/1/WEz1FRewDW19NeZu+Dvi72dWRUXl0jRn6K1mu6LnP/uN+8rajNVeXWd/yZjIyMjIyMjLcMo8dAnqdfCDVby2W8HjzGCv8NrilyPSMjIyPjjeDGRwiTUOF9hH6UokfOaXSXkmR6hCaf599O8JGIccJGRRUVMID1iIlIKIrKpWKHvsv3IsJR7WOZNEpav6dN9FWr1bokkigRrH5wf+gz9LWSXiquRoR4RAZr5A3tVyKwimSM6pPPeVQI86mKHtF3lFhz8jiK1NtUP/wsIp39O613j/zVetHPo3IyXSccvSzuAxfZqwQt35Tg/SUSXr38/F3bJtN226J27b6u1+uX7myO7HP/RGmpqB2JHEQk9vAfxTMKZIzIVbGDffbk5ATL5TL94zHRUdq0jeOgl4mbAyge0Z+MPNYIWvYH7busA/YH/h4d2Xxd0PFDy6zHOBMqCKtgVpZlupuZ9aKbUXTsYblYZkax8hnPtyzLS/cn67hNWyMR4WWiLR0u4jFNirMqUtOPah+PfvbrEXgsMH8WxYWwzN8BrG1mYl7Mg/5677330Gq1MJ1O8ejRIzx8+BBnZ2ep7ek9tT5u6fh0VfhYqmNi1dwVvXtdQgqFdfe75sXIXeBiQ89wOEx3DVPY5R3hZXlxbHetVksbRzhGDAaDtbbYarVS3bZarXSUt54G4Bt3VqvVlcRgIN5U4+NjlcipbVifidZM0VxZJVbq3z6/RGKzrl2iqFFvQ6xTvUvYxw230ecJtcvXLR7NrJsKo3nU123+fdXn7ttN82SUXvRMtEklyoM26zrM1wtRfqwvTztaD/lYHY2XVenp37ouUl+4EMvv2Z91jeXtLlrnebvj+kf9oc86rjLnZGRkZGRkZLxGnD560xZ8KtBuAD/4ve03bcZnAmcoMUZeO2ZkZGR8mnHjBWGSKRpxpGSMirT8p+SNi3NKMhFK5PEnn9fISeZPQkdFXz5fRQKpyMK/9R09Xg5AKrOKApuIP73zTv0QEWsaDa1/R1G6TsapjV52fq6irhPEng7fZfk9yo8/VcjRdNwf+rcL1lqHtE3FRz6rbSZqN96GtK4VUZmZr7cJfUfL7MK11pPape3dv/MyRcSivxf1IydlVST3SJtIkPGNAmpLdBJA1A4JfuYinpPkShRH9aa2Vm0OichX+txPA9DjlqMNBlrOxWKB+Xye7rRtNBopStPrXH86uaw+1EhXCqckqNUOrT/+rfVCOxndeV1H/LoPtZ60TPwdeBYJT/s1apW+Zhus1+tYLBZh21IxXftQ5AN+xzuEdSymvaxj+pf+v+pdrD53RP2cfvGxKRqH6vX62n3JejRxJKZQ/KXIy80N8/kc9Xodt27dQq1Ww2QywYcffoj5fL42ptEWbYfaX6/jrlr6KRr7ozmLcH9eF4qiSGKu1p+2KR4nTSG2LMvU51l3enoFx4Llcon5/GIHNwXnRqOB8Xic6pDPnJ+fJ7Ge6asd+u9Vjop2+LhMX/h33s+r2nfV2BytOaL8qtYFPg9oGpqWz2P+vY6/UZr6vIt+3k712ao5R9cvkZit5YvmSC+Hr4V0jaDPbEqrqsxRv/I+9rw+5/N9VdtS232Nwnk48jFw+SQQh2/K1Od0PaXrct/QyWd1LVq1LtE01e+6gSwao5mWrhMzMjIyMjIy3kKMngCzU6C79aYteatRrxd4//aNp7czMjIyMjKuBZ+JGbOK2NO/SXB6RCHJFwogQCzIuTjnUS1ONgPPBC59LyKfnAxyYtDvNNZ01DZ93tOhL9RmAGsChuZBsl79FJGzTrjxGR5d6QSWl5lQsdoFDiXYPC8XbtQHmqe2E482cgK3KJ7dcalCsNeb3reo3/F5j9SjDUqoavv0unWbnZx0UtSjEbV9u51R24jSdjLYyWr1p9alpq1pRu2cbS8qu9pMX2mEjX7vxLx+7m12U51UEevabjYJR6vVKgls9IdHF5PMVWGVfY4Cqx7VrdF7fIbiJ++xBZCESe3PZVmuRXzyPd4byvbudX1+fp6iFWmztm3aTRuuE96mvZ9oFDD7In3q45Zu6GD9aBtgmvycIpmOCxyHdHOMfqd9IurjHMv8+Vf1TbTBRzcgsK71ewDp6GA9blr7I4VDHXdZ57xvfblcpvtnNdqVAnG73cZkMsGjR49wcHCAoihSdLD6Qvuk+vM6BOFINPK1gY8NhM/RV6krgmIwfeBzLdudCrQ8MprrlvPzc3S7XZRlidlslvzEY+BZJ2zrvE9bx63hcIjpdIrRaHRpHNeysh6uIgYTKvLqHKvwunLxi58porVIlG7V35qfr2P0eU3Xba8a/6ts4bN6soKm4e+4DdH8G/lN6zzaVBaVTW3wDYledrdZ7fb1lPtH8/N3tf3pGOXv6fM+rrtNOg77xkEX8Gm/rxnUh/q5ljlaD/k6S+3QelDfRPXhZfU1rNd7JNpzTZ6RkZGRkZHxluH8DCivf3P1TcNWt0DrM8Fuv3n8CywwzXcIZ2RkZHyqcePvEHYoQea76jVyTAl6J5iUaFEBAnh2z6dG2Okdnv7TbVFxwfOjaBORgy5yeHmZln7GdPmuiiIUK1UsUfGb6SnZpgIVBSPmR/v5fhTRrH8TLtzpfcn6T/3gwhzTiaKLVNiISDLa6iSppunfqY80akvz8HJ4mb2NOckbRSIpqehCtwssXn9Rmt72tbxVZXc/qG0umLkwrHXkbVgjafV77bvan7Vd8Z9+9zxhwEl7bddO4qodSrxGZLfnpeQ6cBHNRwG3LJ8d88ujWenHer2O8XiM2Wy2li6j9tivvT/oeEOf6jHA7Jc6Hnr0ph8DrfXOMYDvqQB7nfDxSMdU32jh4xL7Au1juaOxGLh8XKznoX3No7IourEt1Ov1JH7qnazPE31eBhR6iajNswzaj2u1GgaDQXpf+5jWe9X4w+/ZF3WTAucQ3lvL6GBGD+u8y7bJz9mm/a7yq8DHKp3TovGrKo3nPfMiUMFWx36fZ4qiSL4oigK3b9/G9vb2Wv/t9/vY3t5GrVZL4k6r1cKdO3ewvb2N6XSK+Xy+dty8ivi9Xg/Hx8eXxjvfrMBx6rrgQqZ+7j91HNf68/erRNooP23XhKar32n60fzttjEvndt8PvI0ozIC8TpJ7Y9EUfellyuaw4H4KOTITn3X51if533e9jnS7Y7mmcjPboOmq+Obp1sUlzfPeH7enqJ6UV/phstITNZxkZ9H64tonaLQecz9oulFNnNt4GvDjIyMjIyMjLcQ5Qo4+MabtuKtx7//3W3c371+3gEACgD/8b/Xey1pfxrxAc5wvdv9MzIyMjI+aXwm9lCRMImIGiWwNPqGUTdOdJE44t2eFFD0WaYRkfxOIAFYi+RR+0jWuN1KOjFvksVVxJdGHFVFM0RErEe8OWFFYosigpOsGm2hfnRCTglPPTKaefMdRlWrL/04WiUAlVx1IcHrxOtQI9acnIuISiVlnaR1cVXLH9nmPtS/IxLVxSvNT8vh+asgxZ9aZm9Lmrf3D31ONzt4m49I6yrfAuuR9HxP20WUtvpG09VjqrX9KjRSzfuv5uV9QetnE9x/esyrplmr1dLdno1GY+0458VigfF4nISdXq+XyqNRoEwHQNrYQEHShYGzs7O1cYVCFe8hVQFRo5iivk6hVTdcXCfhrPWtkZ0+NqjPtWwULtUujYLmXcM63qvAEYkb2h59jNVxq0q00bHiKqCY6n2Tn+s8oZGetVrt0h22GgFOEUE3ONVqNXS73TV/6PHYesw7NxjMZjM8fvwYh4eHaz7yKHTWK/uHtr/rxPPEMxfOrhNFcSGS089RHmy3FIwBYDgc4s6dO+mYZwApHW4UKYoiRRHPZrN0ZHdZlphOp+kEAOCir29vb2O5XOLp06dr4wjtYt6LxeJaxGDvB1VzrPbvqrE16ncqdkXzgo7zTNvXG17/Pqf5OsDfof36LPPVMdjn+aqNUdGmNi1fNG9pm4o2OPpYxve8rNF87Z9FGxoU7m+WR8dHF859Te0+93bj5fL2FdkWCfs6n7G+XOCN6sT9r3OU2+vXZvB394G3B31Py+b5e31HeN56JSMjIyMjI+MtwGL6pi1467Hbv7xh+bpQFAXu7X7mYqkyMjIyMm4wbrwgTAJZj5fjPxeZCP2dZDSjbVyk4+96T6ZHGajAqSKEi41K7mgklEadKemmhJdGERH8Xsl0j4BRPwHP7ttUcsmJTCXJnIiMyDFNi2mQ0NJ/Kmxruk7IO/G1ieBzUlC/p+ivPlAb1SbPj3ZGYhfrQ+/YdOFRicIq8pZpeV1oeaP2o+1P03Sx+Hmkb9XzEXFfRbRGYoqS4U5oRvWuApQLA/ypfUw/137hfUzJf/ep109UN1X1oT6qImO1LzMikmXVMYMiLXAxduhxuTy+l31W7yCuGnfUXwTbsfucx9jqmMW+qUcwq6hBqLjnR3teByJBRPus1ilPbdB3fdw+Pz9PkdkuOOq4QB8wTfqdEZoE7dJoXR0HVFygjRqB+apg3Wlktwvh9JX2Kx7/3ev11o4Nj8SxaGMN7efvPBq62WyuzbUcNx89eoT5fI5Wq5XEUG4iiPpT1E+v4qOqMTciEaLPVKS5ClqtVvITcFngUt/y+Xq9jnv37mEwGGAymaTTA27fvo2yLPHo0SPMZrO0bimKi6O+W61WuoO53++j2+1iMplgNpuljQDf+MY30rvqH45FbOfXKcq7MEs/6Lqjqs61b2m/1u993Ndnq+bAaN58EYIpKod+54K1l0Ft5jPRGtXfiebkaByL1gL+vqbjc7/apH2xan0GrG/EVB9VCZq+JtN0ffzS8cjXg2qTr+fc7kjgBXApD/ezPqPw8VJ9GLWByOaoLtQGtT1ai2heUVvXtqW2ZGRkZGRkZLyNKIGyBF5gPfpZxZ/8Uo7g/SSwQolvIR9hnpGRkfFpx40XhJUAcuFAyXIlgjwawEkcpqvE1qbIJY0kBi6TvkoE+RGiTmA5oefCBz+LRFcvQ0QYsez86cddq8hAG/hTfen5aFmYjz6rn7EMrAPeCavfqzitEZZe50rIqf9Zdo1QcX+q7fydeXpEiftPy6N2qMCs9enpaN4ugni+2jY84lfbmkeaONGq9kR16HlFz+rnXl4nrKM7u72d6+8Rkc527+Svlsn9VUUyM+0oOks3PET14pFMVX4keEyxtmPfSKLl8EgiimfT6RSLxQLz+RztdnvN/tVqtSbMOrGtdcQNEtz4oqcJNJvNJH765gatQwpXFFY1jRcRU14FKkKquMvvWBbWA4/J1fJTDOZn3DzDNlqWZRLj9UQI37iiEdy6IYX+5mfuF938c1VSnr5w4l/nOx+72TYY7atzW7PZTNGg3rZ0EwHTYhtttVopLYqQFCgPDw/x5MmTNV/pKRlR/2HbnM/nV/aP/oz87Z9Fz1yHIFqv19HtdlPf8jpjf+OxzovFAo1GA/v7+7h79y7q9Xo6Anp7exvD4RCPHj3CYrFAs9nEZDJJY9b29nZ6nv3k7OwMrVYr9dWjoyM8fPgQwPpd4+w3bP/XcYczEJ8YQlTNkT42R/OSvxcJZUxL50d9TudLf8/Xbuw7LvxFaxy1R8vq87J+xnFGy+ji3qZy+nduX5W/o00BUZ5epmgNqN/5mlKxqV9G/o/WwVEavq7yNKOya3nV3igf94+OY2xLmr7n4/98PcI06Fdf40Tvqn/4jK7VvcxXnXsyMjIyMjIyXiMOvwV8bgk0Wm/akrcW9VoWyz8JLAH8InLEekZGRsanHTf+3AsllD1K1gUfJVSU/NF39DMl7Bip5wKVCjhMl7Y4qRaJwSoqaARZRHpFhFwk5GpZNR9CRQu1xwXZKMrGbaZdSnIrwai+8H/qG82DIoLXoQoxEam2KQ9/Vp8nVABSco3+iMqr9uq9bZq3+zGyKYrGjCKHXFSsIljVLm9DL0LKuogZkaLa5qM0mLdGuLJNqH1Kynt98HmtA/ebCmR+t57WQZVwHJXNiWTm5/6vIln1Xm71kfYxFV/VT0xTv9c7bfm99y0tZ7TZhemp8FsUBbrdLrrd7lqZXOjQdhSNJ/r3dcDHMh7pzO/0Oe0rel8wfcj7aaO2poKxC74U3BkR637Q+tC2qN/rfOMk/6vAyxoR/z7GsDyNRgPtdnvtTk3aeHZ2lo4nVlGHPlwsFikatdFooNPprPUH5rVcLvHo0SMcHR2lz1gn9K1GKFOYpJjMDQtXgY//at8nJYoURZEig9l26Fcera1tnD93dnbw3nvvodvtYjabYbFYYGdnB++++y7m8zmOjo7SRpH5fI5ms4lbt25ha2sLs9ks+bjZbOL8/Bzj8Ti14Q8//BDT6fTSuojtKJoTX6Xc0d8+3/GzqrnSbfA1h/fjaC0WiWmKqJzRGsLHRC2brj1c0HThTn3h4xaf0Z+aj/rEfRq1dS+P/s2+537WZ6vWaJG/tGy6ZvF1gvpc7fa1TjSuug1Vm5Btf2FyAAEAAElEQVTUt8DlTWvqN+DyySNM29uh56WbfLxs0TtRW1BbvR2pP7iu5PixqX51Xnf/X2XeycjIyMjIyHjNOFsAuIb/p+y8c/U03kK8u1/Hd71z42OdMjIyMjIyrg03ftZUEY9/azQoSRS/f1cjzTxaQEVDJWciYUTzIaGjAgxtcfKNNml+/F2jCklOuTBHqC1ORKq96ge1h+KJi11qt+ardmrZ3R6Kcy5i0Q59z0UNTc+joIFndzJHJD997iSd1qcLf1WCnfrVyxKRllG9eNus8pVHG7nNfM8FZ33fCUUnX6N8ve2yzJqPE4xVRLoTnCyD9ruIENb0ve/6z+eVpYpwjvyg9eNig5PtTvjrzwj8TkV5JWc1SlN975HCtI0RSRzffCOJkr+NRiMJnBTatH2TZCa2traws7ODjz76CKvVak3A8rbO9qH+o8h1HWKe+k/HT43yVb9xnOGYoL5j9CqA5BMeiwtg7a5lPsM0tI553DJ/pz3qF72TnulEYu1VoRsMWEe6KYDPaPugHcPhcE3YZjrL5TLdG7vpvnv2Y40o9/luNBrho48+wmw2W4tC9WNlVRj28fsqeJ6ffQzwPn1d4FHRGh1Nf+kx44p+v4/79+9jb28v+X1vbw/dbhftdhtPnjwBgHTHeLfbxfb2Nra3t/H06VMcHx+j0+mkkwR4ckm9XsfHH3+Mg4ODS+Id+w7XQ9Gd65uwaTzWZxRe53xv01isaWmdVc1HUXSs26ZtrUos02ddmIzWbmzv0eYln6P4eVV0Kd/3vh35zfuNr6Oi9Hy9WJVfFK3KZ3Vtqr5iuXztp2WL2gHf0fE1yntTGl5uXTt7GaN1QrTpzseoaF2rz+uYGfkxGue0/vWIfvrS/7/Bv31DgtsT1XNGRkZGRkbGDUV3601b8Fqw3avhzlb9+Q9mZGRkZGRkAPgMCMIeYRGRVi7AAFgTRPiuE4RKypDkV/FGxWeSq56XHnPqRL3aqtEh+r6KEEouV5E/LiTxfRWB/M5JLXdELLqPmJaTgVUCcEQMUiTQ7zTtiKxz4s7tU/LQRUCtG4VGiLjQVUWqVhFsap+WzaPTma9GBfP9KNo2EhDVr7Rd24lHars/NH2vWxUTnNx2wriK6NZ6cD941KxHzEREsKbpdaSEr5aTPnExqkpEiOo4Iuw9/yg9jUzluxTaaYuKL0oWN5tNzOfzNb+ofwCs3SPLcYi+YJmXy+UlwVPFy6K4iGLs9XrY2tpKkaC0wYVnAKE/KUJfJyKRSccybauMcmSd+FijxxbzWOJarYZOp5Psp0Cp7akoirU+4O1PI7SVnFe/6/hfluWlqN6XBUVUHztViGJfVpvr9ToGg0G6Z1Y3CLCMbJvRfMP21mg00Gq1Un66ceTs7Ayj0QhPnjzB+fl5ikb2iG2KyrpBiaL0dQuz2hauO+0qMIKadeWbqLQ9sB7a7Tbu3r2Lra0ttFqtFI09GAxwfn6eInvb7TbOz8/R7XbTsd3tdhvL5RLtdhs7OzsAgNFolHzOI7zZLgkdL9guX9ZHVWKffu9tE7i8UYjweTcaB/ictn+3IxozmUY0rz9PfHQhz+caT4vl9XlS0/C26SKqls3XHF5m3xCoc6vPze7PKjHR7fa5zm2K/OFiMT+L/Kzl3/SdCqC6ZvT1QLR+jPyn9rm9fpIO39UNk/p/AvedQvOI/BqNFbrm8/+f+HhfZYO2rYyMjIyMjIy3FGV5ESXcaL9pS95KfOm728hLmU8GY6wwv45o9YyMjIyMN4obLwhHgomSH07AObHF7zSq1N8B1u/PVeGTdyfqccFK1LgQWavVkuiiJB7wjEiMiCp+58S63tfGckcEXyQ2Ml2PNuTn/M4jEJ0MpTihUWN+Zy+hfnVijM+77XonphJnTogq2Uxf83s9IlH/8Tn3r/pHv3OB0Ek4F5WryL8qktXFcBVd3H/+flVUt5ZFy6ttVZ9XEpX9wqOVNxHrZVmmthAR/k7Sqz9UYPN60WeqBAhtl9peaVtUd+6zqC9Ukd5VEY0qCDMSVYU3b6taP9oO9chiHV943C7v/uQ9sBr156IC0+aYVZZlEpXu3buHXq+XhCTtT2qfH4XPvuj3PF8FbHceZadXAlC8jUhwPQKX32mEMaNkdUycz+cpqlqFPPrMxRr1B+3hfOD9j32nSph5Geg4dnZ2lv7Wf7rZRtt/q9VK0b2+mUfnK35Gm/UYae+/Kngvl0vMZrMkPOqYyDGYftF7arWtX0f78XSZp393HfXhqNVq6PV6SQxnXvSxbxCg8Hvnzh2899576PV6OD8/x2QySb7k0c9FUaR7m/VeYuAiung4HKLVauHp06c4OzvD8fExHj16hMlkEm4i4uYIjiFXjc6O4PPPJhFR5yNfF/m6JxrbfP2k86PbE6Xvtnpfj0Q3fcfFV29bnqeX3/1SNb5tWttVbV7S71xc5PNqn2/acv9Fm/yYdlQ+f9/n3mjuq5rfffNaVd6er67DPT/fROl5ql3RxiGtN90M6nWo3/tY6mVRX+v3moaujav8S7yO/p2RkZGRkZFxTTibAccfAZ3hm7bkrcT3vtvMdwh/QvjvscC/xatvYM/IyMjIeDtw4wVhJepJZrsYGRH4BMklEvlKtjBtJzJJCAEx4RURe0rGuJBbde8k4cSTk3Z8Z5PYpSQqI5+VgI0ENOCZCOOkmQtZWm71XSQguZ8ajcaa6OCErj+veUQRtWW5fiSuk4ARMUqfqm/Ux/q++joSkT0v2h5FZjupqpsIvD1SCFgul2uEtW8i8DZDO1zg9Lbqwqe2LRf69T31k5fRjyn3utKyquis+Wq9Rv3Eyx5tDIjIbbVDxwoXEtwOreOqdJkW+49HC7Ls+p0e26oiYxQNquKS92U92YDpUgxV0Y9oNBrY3d3F7u4uTk9PU3n0eGqKjDpOeD1EdfEq0HFI27b3F4LtRtu3jvGz2QwnJyeYz+dYrVbodDrJr3oUNOcAlpdHS/uYGIlRrCMd1/UZ3SxzVd9oO/A+rP2P/vBTJfTeXrYzHm88n88vtRP+pI/pW26CYpvlPcOdTgfj8fjSGMnxg22pLC/EeeahIvF1oEpQ8vnxulAUF4Jtp9O5dNcn7SnLMgnf9MHu7i6+8IUv4NatW6jX65jNZhiPx2mDAu9gpqBfq9UwnU4BANvb22i1Wtjd3UWtVsPBwQEODg7w9OlTnJycpHuFvd9SwGfdXVUsqvK1f6c+iebNF/3MxVdfG+l4GI3pVXNelGaVuOrrAL4bbYbTdQQRCY/6nucf2Rx952sDtZfPRnOjjy06f0T14PNxVCa3z8euaK3nZXT7o59q44u0Dabpefu6BsDamOdl8rlGP69aT0VrPi9TVL/6T233+tNnNonkGRkZGRkZGRmfBnRbBb7vc803bcZnBnnVmJGRkXEzcOMFYT3e0gVCFxMJP0pViZrnEaMUDapEXBdLos806pJlcEJMo9IIJYk0+ouErkYQOgGl/vCo5edFKUaELJ8hoeikWBTJqnXFn0WxfiyrErlEdIS0pqORbB4JrHAxj59FpCmf8Tp0UUoFOidh3feanubF57X+aJu/p+n5EZ+aHn+PBCr1g0cwaxmqyGi1zaFilKYbtQeFE+cscxTx5H7RfJ00j/wXlSEicN1XTra7XRH0uUg8YPok3tkG2Fcmk0kSMqsipimysR8VRZEESBeyV6tVun9U0W63sbu7i29+85uX2p+OLwDWoo+1TqrGiZeFCw3aFrh5hL7S+3PVVq2n+XyO2WyW3onuJfb2pFG9Wl9Vbc7HOeavgmc0Jr0MPOpWBdqieLYhSv1FfzSbTfT7/eQ/bRvqV61Hvs+5hv1YN27w97OzM8znc4zH4yQu6yYS2qTtVL9nlOqnGe12G91ud00M1rmJf+ux67dv38Z3fud34gtf+EI6tp3+4cafxWKBRqOR+vliscBqtcKdO3dw+/btdILA0dERPv74Y3z44YcYjUZr863aw3/XJQY7fHzfNC5o3pHg6UKcC5Y+Vmm60Tyh8H7s31WtH6I11aayR+NklX98vFYbN82j+nsUYa3PRGOr26hrMG07kW2Rj9ynapuf3uDPb/rM61XXZL55s8pGX0vpfKF58FndFOXz/ovUic7XBP2rm72qNh65TZq2l8/7y4v2w4yMjIyMjIyMtxWdVoHvfTcLwi+Kd5DvWs7IyMjI+AwIwhqVFYnCJFI0MsnFUBU7IsJfiUg+qySQH2HnR5tGUY/6twqOKkg4PMKM7+txrZqWRh2qaEG7XexyESwi2UjCudClEdZaB2qbpqOigorbHhHICEr3mbcBtVPz1ygJtgPNRyOCPf1IMFQikrb7cxSetP1Febj46MSh+kfrMYqAiQQrTaOKFK4iuavaYURmeztmGnzffaRtzjdmKMHq8LYbkZ1VvqjaAKJ2bPKVlqeKpPWy+R3BUXk0j2azudZ2lsslxuMxZrNZWAY9qYDjGY8RbrVaa8KPbh5h5Kum1Ww2sbu7uza2UcxU8DsVqJl/FH38KtgkZER1qMcmA1gTffm53rnMNuZ1zXeJWq22dvyx+pL9UDcGqX90I4Nv7nlVYt7Hb9YnP9OoRfqGc1G320W/378kOrA8KibrfKiiu2460veXy2U6LpptlcdD+3H/HgGvUfDX0Xaeh0ggug7U63W02+1UHmBdDPbxtNFo4Pbt2/jCF76A999/P0X4npyc4PT0NG1gKIoCrVYrtd2yLNHtdjEcDrGzs5OiukejEb71rW/hgw8+wNHR0dp8r3Osjgn68zoQ9Scfa/VZ/ozm9ap3dH5XoVvnZf7cFNW5aY7RNYpvdOMzuk6JhEtdm+nfVe9E7dLHQV8/RfkClwVNn1N9TozmPIWPGe7DqnFNbYjWoF7Hvh5V6HpR10D8XeFrtCj9qnx8fRWtXXSt4+3I24Wmoe/oeoPPchzUNuj16nXhftC2omV+1TknIyMjIyMjIyPj04MagB9D97nPZWRkZGTcfHwmBGElbBjpBKyT8y4euFjkJB9wefc/n2XamwhLfScijpQoUjHZ83BBW6Ekm9uteUdijZJrSmCr3eo/zYOfO4kblc1FNxKJKpLQNi+/2sI0vGxOOEeRJy7Ya50o6as+0WeVNHViUH/ncyoqqd+0XFWRUZGQGj0X+cd9FJGqSt46uRxFADnZqGSw5602uwDu6UXfeR1o3bnPtH15hE8V8avPRyS4vx+JEi7G6/sOvZeTZC/T5UYJFfq1nfCe3+Vyme4A1TLrMcAq6mnf5PHiKhzTLn4OPBOzhsNhEqXVb7rhQk9IYN3occkUm68CCgiEb5RgG9ZxnuVrNptotVproq1vzOERvJwPFBwTdIyin6N+6v0zGrsiYedVwPQ13Xq9nsqgG0gUtdqze20J3UTFdxeLxaW7faO0/B5j+mm5XKY0fIOF/qTNFOmZzusSa1836vU6+v0+2u322vgSjW9nZ2fodDq4c+cOPv/5z+PBgwfY2toCAJyenuL4+DhtAqnX6+h0OinqWNMZDocYDAZp08hHH32EDz74AMfHx2tjhUYrq4jH+rqqCB/NFZG46L/rfOrCGHD51JJorvf5oWrOI3Tu077t85raqOn6/OiI1n2RQFf1fZSuPl+Vjn7u5Xa/O3Tjiq8BqkRi/u6bQzwPL7uvPfT3qnYSwdftUT3qsz7+RmvCqvVqVbv19Lz+vJ6jzY/eDhX6TJQ+53fO/0zbj/d2GzIyMjIyMjIyPm34/d/RwlYvb27LyMjIyMh4Gdx4QZhEHUUWgiSKEqkugrnAqASlk4cR0esEFEUSgmKJpu2CpNqokVhaDo16iURrPzpYCUy+7/dIahSYQoU4T9cFB/WRim0eHed2ubARkaEqHri4yJ8uJvs7/KdQwkx94X9r+VR40rL5u1q/2o60LarQ5G3WiUzNQ+tTy+QR2FoXEdGohK/Xn9sf1YeSsV5Gj6B00l3bgObF9LwO/D5nL3sVae2RtP68tjcXtp2E9TTUjoikVej9nxTAKERqtI+PRWzX7Lfz+RzL5XItQpO/s/9r/nr0dFE8O7ZYowPn83m6P5dp9ft9NJvNJBSxj6mNzEfbEfNycfUqcOLdo/2UsNcjmlutFlqt1tp45JsrOBaWZZkigDV6kv6iSKkkvvqVwiajZFl+HeN0DPXx8GXBiFo9fQB4FsWr/lHxuyiKdIyzi/sUytXOTeO5+l7Ho/Pz8xQhPJlMsFwu03d6fLmLMwDS3cPXiSif14FarYZut4tutxsKNwTrp9/v491338WDBw9w584dDIdDFEWBk5MTHB0dYTqdYrFYAMBatLH+7HQ62N7eTtHBx8fH+OpXv4qHDx+u1ZduiuC7ek+5z++vgqox0Of66LsoHZ0DiGjdQ2j6Pm/7nEXfRGIz04rKFJVZx8ZIdFT7fPzSNPwd72veptSuaFNflFY0B/rnPqarv7yMVem5b3xO9vn7eRv/tDxV6zWt2whqs5bPhX/mWdXO1DZC52O1wX2l46X/34J90q9FcUQbUaP1prY13zD6usfCjIyMjIyMjIzXgfdv1dFtXT61J+P1YJ5vEc7IyMi4EbjxgjBBYkWjpVQwJCkSkTIuIDmR5d87YbWJPIyETiXLVETzfEj0O9mlggTLCuDS30zPxR2+S9uiyA393MtDUkoFTi2r3l3IMkRinkf3aPpaDiXaNOpM03OS18vjhJoLRU4mK9HKOnCSLxLJnKBV4U5t0aNenfxUUtgFbPW7CjRR+TXtSEiNBJpIAPQ+ovlEhLj6Qeurqp2pXVoXLs66kOv9yEldJ8SjPq4/vX61jJHNzyNata8Dz4Ra97/6VqN8KDZOp9O1Y+i9XRIaLcr09L5yHfcWiwUWi0U6jrYsSwwGA3S7XZycnKzdM0shVH3JOlCfaeToVeGkN4VF5uuRj94/dCOQCuEuWOjGmGazidlshuVyufa+b36gDX48sP5U//g4+aqIysR8orGDn7daLXQ6nVTXfpw931NhQ/uPzhmcp3QT03K5xHQ6xXw+X5vT9O5gr0e1bz6fJxH0uvBJiR+dTgedTieJ3uq3s7Oz1I8ajQZ6vR7ee+893L9/H8PhEK1WC2VZ4uDgAE+ePMFoNErjQbvdTj6mX5vNJhqNxtpGjtlshm9/+9v48MMPk8Dv0cG+cYJ1dtX2CKyPByoe8jsdH3wO8XGXn3n6kUAIxCfA+PpNv9c519dt2sajPuz2+xrjeetAvuNzgvdbT9s/859eRn3Py6rf+/yuiOZGnVd8zcbPo41gHonr8220IYvQtYP7yp/TOapqXeLl8/JH87ynEa2JonWR56l+iERn9emLtIloTePpRm00IyMjIyMjI+NThxwc/IniP8fkTZuQkZGRkXENuPGCsEYgKbmtZBLJG+AywagkrkcF83uSV0rEaiQkn9ejMmmHk+F81r8D1gVdJ5N0t78LeVGkr6blZCFtVLExikzR4zxph8JJWCX+ItJOSTG901nJRj/CMhJEN5Gh7usqUlUJ84gg1XpU4U7zqPKXRm5GpFz0PutMhU19z/3vUYHeRjRtCjj6d0S2aqSk/61RqFFkj9robdxtdxLTRegq4tLrMiJ03T7Wn0IFBBfSPX+vM98wsElU8T6vn6vN3n5V7CvLEkdHR1gsFklkY70sFosUobhYLNYEYdqp9xFT/ORY5cR+u93GYDBIkYbaN9V3rGOOCxpJex2CsLdhfuYRjRpVpZ8B6wIty86+6fWsfZf5qJ9VwFcbfRMPgDQXqe3R0apX8YlvJNAjQ7U88/kcq9UK/X4fOzs7SbjUsaJWq6UodhXMtT6Bi3pvtVopQpl50Lc8hlxt83GU/tL+5+3904R2u51Edl0PsE4Yad/pdHDv3j08ePAgrSHOzs4wm81weHiIhw8fpk0f3W4X7XZ7bd2i4rtuSCjLEk+ePMHXv/71FKHOZ1nPuhFEj+W+TnHI1yqRGOfzoCIS4SJxTsvj7/pag99per5BKBJwo7VFZGMkJrtv+a6Lojrn+Tjnc1qVz1xUjjZx8PPoFBFdu/kawH3nZfQxt8p37Ac+N0TrMh9HtY4iW9SOKsHT69835lXZ7z55Xl34mkM3K0Xzv6YV1YWfaqT5+P9fqsrBcUPXehkZGRkZGRkZnzYUBfCjvy/fiftJYpwjhDMyMjJuBG68IAw8I0r0yGUS1iTKlExVUg64HN2lZLsSOxrdpMS2k0ce+aoirv9UG/1nRDJp3pqnQwVRJyy1fPxMo5RdeKkSlJl/JMpEgg7TothE+zSCWP3tgoyTiYy+arVaa/UXkYVKJKtgoWSdvqdR5VoPWjfqVxdTo7JUEapOyEb2uIil9a+I6ljTiwhfFxkispl5Rm1KfyoBqaSu2+5+V/u9vB55FBHK6hP9PErDN1xsIkufR0brc14X5+fn6U5VFR2jetJoXy8nj5Hl30yLAhDFp7Is03HJANYEOieFuXlF7a/X6+l9jUhWYt/HRu0nSkBfBV6PjGp14VnbGX2mY4H2ex1PfDMM67PZbKLZbK6J5fQv6/Hs7AzNZjP5UgVS9bGObX6v46v6RDcksR40XeYHrI8d29vb2N3dRa/XW0uj2+2iLMu1u4O9r2n62s9qtVoSPHX8ns1mWCwWa2Mk/6lY3mw206aG64pWVWwSfq4DrVYL3W53bTOa+o31MBwOce/ePbz77rsp6rcoCsznc4xGIzx9+hSj0WhNKO52u6mN+dqFQk+j0cB0OsW3v/1tPH78ONU1BUCWne2XYxDr4jr9rUJtNC4Dl0XYaK6pgr7Dv6vyUbxM/UfCo/8dwTfnaXrRWO/2RWV3IVPHfV9v+k/Ny9/TZ6JNXZvWFLqBLJrbvT50nqgql/vgVb4nfC0f2RVtEvR1Md/hRiifJ9Q/fq93VG4dAyOh1/+vEM2rWnbHprbp738aN91kZGRkZGRkvCRqDaCoAeXNmPcLAO/uXw5+yYjRQoF2DqnOyMjIyMBnSBDmTyXBPOLQBRf+7qQZsB7VoULC84Q+hUdsOtmupJyKvE68UZzxI/GUfFKijySwElcq9GoEXETmKaoESrfRyTb/24ktt8Gh3ymJ7eIs09I8tL7c/1Gb8Ig79Yn/7nXFeonSdnIwImiZnvqX6UYEs9aFCof+XEQ2O9HqBGFEGjMdf88Jam2rVe84VBDwqC71uR71GaWh5VY7PD0lZl3k1rSitF3o1HJHfV/LTRFRoZsvaLP2UbWR97Lycx5VzCNkKWCqIKQiUFS3ZXkhPnU6ndR+6/U62u02gHVRWtuai74uEFC4vSrUr9EpAZG4VavVUhSs141GDus44pscoqhj+pYCqN7HS5+zDrTPMA+NvtW6eBnoaQZeH/SNp12WFyLsYDBAu91O7Ya2McJXI0f1WHM+VzXes1xsD9PpFKenp6ndVQlHWmer1eraj4t2P1w36vU6er0e2u322jinGzAajQb29vZw9+5dDIdDdDodDAYDNBqNdET0fD7HbDZLm5qYbr/fT/1ax9ter4dGo5E2PZyenuLhw4fpvmZdU/A9Cst6bzA3j1wnonGbf1eNjx7N7/MY04nats+hRDSGa1/U7z1fFz19bHte2TeV2/P3ObKqzFV+iWzlu76m8jna/aPrRl/jah5evqry+Pisefn6WdOJ3o3GHr9uw/PytVzkf32X45kLs/qM2qvrlao1rPrV09RnfKOqzq1RPaq/3H/uS6+rjIyMjIyMjM8ABreAzhCYHr9pS64Fv+t+A1+485mgtK8F348mvhfN5z+YkZGRkXHjceNnTydn9HMnS6KoX73rUMkYihAerediW0S8+ff6O6PdVFxScVGFIY+IURKd6UUiqUcvq936mYt0KpK4j1lOCk76vkdn0C4VFtQ+FU79PlwVIjTNiMxUMSQi+tQW2qkkG7/j0bgq/DlZ7ASbEo30hR+PyPe0XiLiTtsjy1Wr1S5FdSnZuykay8lZtTUicFWU1HrVKBUnndXPVaSp39noEdRqE5+LbHT/eHkjO7T9u/jqhKn6NSKX3V8RUV0lTkT1rZsVNH8do1gGirvHx8dYLpdr6Wt9uRCkGy6U5Gd9r1YrjMfjtWOEa7WLY4E1LY3KpV1ar2yjjJTtdDopQvRV4fXI8tA/LDPFZ312e3sb3W537ZhdirW6EUc32Kgfi6JYG9+0/1JI8z6o4oRHPPI9zedVCHrWEeuP6WmfYH0XRYHFYpGERt5Xq/nzfur5fL6WHn3F46FdMNH2roIl05rP56kuWH5tT0yTEeqsn08Tut0uer0egMunizByeG9vD3fu3En11ul00Gw2cXx8nPoy76ru9/vo9XpJNGb7pD+5mYT+azabWCwWePjwIQ4ODi71FwBr6wzWH4/1vk5/+7zEz3xs9PlQx09PL1ozEC70bXp301wbzatEZLuP+94X9H0to8/T0RoyWlv6XOxrN/9dfePl9TWU+4+f+Xpw03yq5dQxsqpeN61XfDx0v0R1HKW7qXwsg2+04/fuO9+EVFVfPqeo331dr37RtPQZX1u4nZvWJlF71XdfZd7JyMjIyMjI+JShKIAbFCG6P6hhZ1B7/oMZAIDav/uXkZGRkZHxmRCEgctHEFKQUiFBCRIVZZ18UXLFCX69t7Usy0virhPEfMfFSL7vhDmfVcHB773UO3ddzFA4Uce89DmmpWRWdBet+4afO4HpdaBlVJLKBQMlzdQ+Fekj8djbgdrl5LM+50Rp9K6WIyISlUDU9qf1r76KIh35d0RGaj14mSJSWUlFtzFq446I8I0E+ci//NwjoiP/u9+A+NjRKpud6I9Ib/07ao/qL44VEZHq7UxtdT9E0Oe8fjQyE0CK/uXRxACS+DMej5N/NeqI6TghzDHDN5ZoeSga8rt2u42tra219q7fNxqNdJcxxTzfPPK8expfBFF7Z5k8mt7bJIU3CmIAklhJoRNYjwxm/bM+fEwviuJS1KuPje4Ht9HHypf1h25YYHo+t7HOdL7QiFO+S1tZl8D6PdCsQ7Y17Zc86lnHbR6pPZlMLt0BX1V/asOnSRDmseJsMwSF3f39/XRf83w+R1leHGO+WCywWCxwenqK2WyGer2eIvwHgwH6/X64iaHT6awJWu12G81mE4eHh/ja176G+Xye6p9tmm2h2Wym/s80fVPJVRGtOaL5p0rciubeqvWMC2VVc5sKcv5MtCbQd6LxPiqHryeivh7Nj8DlKzi0fB7x7zZGULt1DRaVJRInq9a+mm+V2BvN1boZUK8miNZsPm9FdcI0fYz1MdXHYk9T52Lmr2tirTsXiL0uNM3nrVf8DnlvDyr60/5o40M013i96Pr+ZeeZjIyMjIyMjIy3Da/vzKeMCHOUOMXNOG48IyMj47OOGy8IA1iLhNFoT5KCJGRU3HABScmgs7OzRMwpScvnPdIxEu4ITd+JeyWE/Gg5j0ABqqNUPT/93Mk2j1RVIVOfU8LL01bCj3mpkO1Cjb7vdRGRekpkeVSok5MKJ2M1bY+81LpU3/B7JaU9mjXyL79n2i6MeN3o+94e+J1vblAfRG0jIr2j/CLi0m3QvPlM5JMojap6jdqxCujebpwMrhLbPdpWv3O7IpLU27zXhefnPnR/KiimVb3HutU+rxHN/Hl8fJyEsygdF6mBZ30yuru4LJ+JxUyrXq9jOByi3W5jOp0mm3RTBkl+fZc2UtBuNpspUvRVUNWHo/6pzzcaDXS7XdRqtSTc6ft6jLZuQlG/UVA+PT0N5wxv9/qMbwyinXr876tARVon/2u1Wni8MHAxd21tbaHb7aajwQGk9sZIbp3LNA/Obfye0a7qs7OzMywWC8xmM5ycnKSoV5bV5wnd5LRarV7L/cGvC2xfjNrnvF+v17Gzs4N79+6h2+1itbqIvuc64uzsDLPZLPUpRmcXRYFOp4Otra10d/V8Psd4PMZyuUSr1UK73U5tqdPppPQPDg7w+PHjNBcDWLt32McV7bdXQdU4G7XtaA4A4isSNC1P39dbuv6Ixuaquc3tjNYpvv7YNLbr87oZQ+e7TWn590B8Ikq0vnNRWftstObRtPm+2uB14flFaw6vV9+wB6yfAFI1Z3ra0bpG12w6D6h/In8+b57WTRT6jv7UPDx9X1dGa5HoPfXfpnWvtqtoff08P0btICMjIyMjIyMjIyPCt3CGX8H1X+eUkZGRkfHJ48YLwhQi/HhiRthQHI6EM+BZ5BvTcvHDfyq56ASNEjoUSZSwrSKL9G7gKnHKj+yLImgIJ91JTCuxpgQ9xSF+zzs4nfgjlGz2iGMlJvWziKxSctrL7EIwfRqJIipe6Pca6ccy6vHgLsK7fRGRpn+rL1UEUfu8bXi9alrqV7YLJWNdnHN7tFwRiat/e9mdeHcC3X3hfcojUfWn95mIxPS6VNLTy+P2OBnuwjHzceLc6yUijJ2k9ud1o0hEumq0n+anUX30H+tYbeWdn0dHR5hOp5ei9yMSWf3p0cRedhUqm81mOnKZEcnaBlQA8+hUHUOuKgirjcxfRYAoGpcRkZ1OJ7UjjsE86pnjPJ93UY916Hf+Ei6o0RatU48GA54JJVUbWZ4HCrEcy/X4aNqr/acsSyyXyxR9SpFc50mNDlZhn772jR/8Xn2vfebk5CSJ6DqW0C9apypMv477g18HarVaOtZZ+2mtVsPe3h7u37+PoigwmUwwn8/T0euTySRF5S4WCzSbTWxtbQFAqiP273a7jfPz89TPdR5utVopovj09BTf+MY3MBqNUltjmyB0LtEI4etElZCm31WNqzqWRmsyX1fo3MS2pHNdZE8kEPI5Hw+jMvn7Pq9Hc7uXuaqMWqYoopX1pvlV+d/XH7rWidYCnn+ULhFtolT/uh36vq8jdD3g6yt9h7ZFZfbPfHOjpq32a9miTWjad3zznV69oJ97HasvfA7zv71Mmn/UttzfVfO5YtMd3RkZGRkZGRkZnwbs9PMByC+D7Ws4MDpvI8zIyMi4GbjxgrALRUqmAevRtyrCqJij70XH0hFMU+/QdIJbyaVarbZGwqogpZGkSpqpgKNEWyRguX1ORHokDkWTWq2WRBJ9T6N8mX50lC7Jx0i4iaI4VWhw4Z7l5/eRgBWRgPqzKgLUxUYtG48yrBIYq9rAJlJNfaRkY0T0+juaP39S6PE2GOWhdRTVpbeXKA33vROfm8rNn0pAq6Ad+c4FJ/6s8r/bUEXeR2OCC7Bevij9iIDV+nOyP/IThXI9dcAFDUL7kkbElWWJyWSCyWSSbOadsBT59GhOHfu0Xfj3FOR07BsMBuj1emv9gqiKhmJdAxeiMsWwV438dAGDYqZHqPJZCru1Wi35heVUcl/t5ju0nfXDI3hdINC6oM+97ejmH/UZ89STLF4UOr9Q8NA0dNORzkOr1Qq9Xg97e3spcpT+07JX9REfDz36Wev9/Pwcjx49wng8TpHZz4tKK8vy2u+zfV0oiotIXh43Djw7FndnZwe7u7upPOob4OK+Yd7TzPm32WxiuVxie3sbzWYTBwcHGI/HqX6Yjkb8crNDvV7HwcEBvvnNb17a6KX3eaudZVliPp9fi6+1TqP6jcbEaN3CZ3TTgI/Lum6IRDD+/rwx3EU7t8PH7ehZ7SvRfObtXedX2u4RutrnfP3q876v5dj3VAj1Mc7T0Hrx/FiWaNz2NZLa73Owv6N+8vl0U/uhb3SjmX7u6ygd/7RN+YatSMT19UvVGqTKb5vKumnt4unqPBq1Ad1Qw76sG5mq1jk6H2ZkZGRkZGRkfJrwn3ypd4NuRH79+E+Q/ZWRkZGRcYEbLwg3Go1Lx1JqdIlGwCn5ooQZxQQl14A42pXpK+HpRDoFOY9WUDGiKn0njtROJfqYHp9RQi86tlCJNhVJlLBV8YKIhFmPQI5sJxnn9aL5KkG6Wq3Wjvp2QcwjKPiM/mS5+YySyRTgIhFRn90UWeLEsNZ7RFBrmlFUitvi9mj53cfuvwhRBLZGpLpPvQyECl2RgOvEJcsRRc8qGatEpddN5G/tS+ov33zgdirZ6kT5JrJaSVVtG5p/RAor1K9qEwVFvS+Y7Vc3nDCP2WyW7mhVv0VRZHpqAscbrXvmwXtNy7JMYlej0UC/3wfwbOxUW3zDCMvC9kFR9ipRwl52jWxVP+oYAQCtVitFCHP8mUwma+XwPsO09Whk3YhBgXsymSRh36P4fQzV/JiORnv6pqMX8YWeXqHjD8upY4UK3e12O82RLDcj1t1/Ok/p+MV+rGK7tqfpdIrj4+O1OVBFG+87TI9C6duOdruNdrt9ab4dDoe4e/duiuwFkDZmFEWBVquFer2ObreL5XKJWu0iyng8HmM6naLVaqU7hRuNBnZ2dtButzGbzdKd12w7tVoN3W4X5+fn+PDDD3F4eJjsc3HTxy328+vEpjFPbfK1h89/UXSsr8P4fVVEqY9tOi7r+/pcNAdUiXsA1tpz1H91bHK/+Hz/vPkisjeySRH1YV3/ROsNBceWaE1RNV65XT5X6HM+Z0TrBp9f3Q+6zvW6jdYzDveD/+39JipvVf46Xvpn2sb1Xf07qg9N05/1vuTrN5ahqm1nZGRkZGRkZHwaUK+9/Olan2XUARRXkIR/A0uc5RjhjIyMjBuBGy8IA5ejeFWYVfKPJLkSUU5KKYFJMofpuCgGPIsecxJc09M8SLqpgOKEmZJTVYSYE0RKcDEfLSMFCbW/SmRRPyhJpvf/qhDrRBhtaTablwQr/buKaFRiskrI1brRDQBa1/6dl6+KEFYRWsvsJKGKi75Q5ft6LC3fcXLO26+m64K4C3BOgquw5fZU/YyISW1L/nwUQeiRThHhqnl4+pGAG9ngbc5tid7zfqVCtZfV27JCCVhNexPR6mVx4p3irfZt9akKEKenp0nY0b7MPChEtlqt9LdGpzKCEEASoSk+dTodABeC8Pb2dhI2ecwtofUcCew86rbT6VxZEKbPGFXJsdZFJoLCJzeWUAjTjSk+Rqvt9XodzWYTs9kMi8Ui9f9arZbuI1bhhYIr0+SzPAZYBVwtC+vhRQj6RqOR7mWuOi7cN5xQ8KUv9OdqtUqRuRpV7mONjiEqkDMtth+OORQwVUCO6pTQo7zfZjSbTfR6vdSm9O7f+/fvY3t7GwAwnU7T3cD0/Wq1wmg0wmAwwNnZGba3t1M/bzQaODw8xMnJCfr9PlqtVtrQsLe3h6Ojo9RGWq1WEoWPj4/x0UcfJf8zGljXFH6qx3XcHUxEImk01gKX56Zo7I/mTX3Wv6sSNbW9Vp1M4XORpqs/3eaq8usaKNoQ5jZ7WtHGu6g/RHOIpq3p+zzov3uZvby6rvLyEr4pS5/TTZBePs1Hj7j2dZTaovlp+pHt/qyXW8unNvnaUcupY360lonWvZqvr0Xc/7qmcfFf4WspL5uO2fq7+zQjIyMjIyMjI+Nmoglg74pHRv8qFnj7z+/KyMjIyHgR3HhBWIUzYF3U8531TuBEUUskq4B1cU5Jlk1Rkio6kEBmuiru+N2VLh543iTh/Z5cJ/b4k8dJap5OnLmvIvLTRWgnT1k+Enwe3ah5MD21QQUrFSUiEjWqZ4/EViLMhWT1UUSqOcHpUb1R21PbtX1pfk4iqv/8d02XafLuyHa7naIv9bhIjQTlXZGLxQLL5RLL5XLteFgVBpy4VNs1ssh96X5yolXTdmJZ+4cLs1UkvpYvqquoXgjarSJJRFh7ms8jvYlIAPA0tY0yb/erRppStGa5GcE6Ho/XojtpBwU7FQKjdqxtvl6vp/bBY6PZxnZ3d5Oo6eOn2sey+X3iZVmmNvuyx9QyD4qgFF4Jipi6IYLgHa8UZn0zhvYBrQ/6rSzLtahV+pRipxL2FIn7/X5qSxTDOV5zLtEI7Xa7DQBJdN4EpqMCBoBLc4AKwt7+VNTWyFXea6ubBHSO9I0w2m6Byxs4mF4UZahHffOd13Gn7XWD9aXtj364c+cO9vb2ADxrk4y2L8uLqOnVaoVOp4OTkxM0m00sFosU5T8cDlGWJbrdbur7x8fHOD09XbvOYDabpX6wWq3w6NEjPHnyZC0SW8dZHVtZL6ybV4HPny6G+boqEiGj+dfTUvjY7u1T1xM+h0cCX5Sn/r1JYNR+XzVn+7ORAKj+8nVUNE/qxiEtp8/5VeVxG3wzU5WNUXo6Z0d5uS847qnffA7yU3LUBk1b/avzjo5DURr6jM710XrP24m3MU1XbfK1amS/f+ebKPxKA/6uG0C9zWgb0zU0n+O4GrWpjIyMjIyMjIxPC3rtAp+7XX/+g9eE92830GsVmCw+nZvobqGOP4zOmzYjIyMjI+MtwY0XhIF1skvFGiViVCRwEqgqSpfpuaikxJwSdyRnGI2nhJKSSR4RqOSSE0wqYOixo/xOj5n1MjFf95H6xgVd4PJdcQDWyHsVByLfszxOjiq5pX7X+ooIUPVPFA3scHGd/vY0IsJR25QTrvpcJJiyjFoGL6NGfSqRrHXFzxmdxggyimwqBOhdwVq/y+US8/kcs9ksRQQyGlTbT0SI86f2n6jsXmdOoCo5rOXyn/ydPmT59GhebT8OJ9c3CRial/ot2lRQJSy4QOCErYPil447rDc93l3HAD1BgNG6o9EovddoNNbEYqbvEbwsk/dpikT8vSzLJMLu7Oyg0+kkgYtlUHGRZaBfKGBru2+1Wi8t+jWbTXS7XbTb7bWo2KgtqBBbFAUGgwE6nU5qJ9wMoXZGG4X8HndtEx4dpvXNCGGtf7eLvtP3O50Oer3exgjZoijSHbKsX/pe09SxQMvAtqGiuooRKoL7phb9p37i2KM2MwqWmwr01AnNz0XlT4MgzPEWWJ9rms0m3nnnHdy+fRvHx8cpQno+n6/dR817hyksz2Yz1Ot1TCYTDAaDNDb3ej2sViscHh4mH3Y6ndT2+v1+ev/rX/86Tk9P1/q0tgvFavUsWvxV4X1OP/O//buqth2N/1E/87nJRTHNR8d+36wQ2efrGy0Pf6/aABj5RNdcanf0Dv/W+c6f076o5VXb9O9orvI8tXyRwAus30n7InUZrfP03SiC1t+P1oO+/ovyj9qJrsv03eiZqk2Q6h9d62t56Cufl5hGtI5S//C7qMy+sU7tUfvd1/pOdJd9VR1mZGRkZGRkZLyN2OnX8Hveb31i+f2e91vY7tcwWbz9VxpF2EGBq8jn5yhxiFf/f2NGRkZGxtuFGy8IKyESkfL+HeFEDHA5Aku/A56RZSoqRGQrhQCPBtA8nMxSkici2UjwaP4sZ0RMqShE8UYJedoZibYqnG6KQlFSmvZ4dGJEBFaRdXzf89K0FEq8OQnsIptGfTvZqs9r/XieKv67eKJ56fMKFfy8TEr2lWWJdruNra0tDAaDdBelRh961IvmTz/W6/V0fPD5+TlmsxnG43ESL5ys1XJX+Sfqbyo2VvlFy+h+1r+juvDoYBf03Rb1q9cVP/eoVv7zsvjYEOF5RKv2Td884u/r/a/aXii8zWazVB49Lpb+4dG2Ub/W9qvRxdwoQBGWkba8F9br1H1fRca3Wi0sFosXFv5qtRr6/T52d3eTaMj0i+JC4PVj67lZBkDqK6xDRkdqFOxqtUpCN4+HZh1QAJxOp2vjJTfjFEVxSWBjtL5HYXp/UdGu1WphOBxiNpul/CNf6HzjY6anr32LIni73V6LmKZdGlHO93R85GYD3WSgx2HTvqK4OJb78PAQs9ns0hjufYY+5QkGVxEqXzcYLc+jttmeWL5Wq5XaEjdqsHzdbjddl3B2dobhcJh+TiYTABf3JzM9Pqd1yk0gzL8oCkwmEzx+/BhnZ2dJ6K8SkFi/V4kOdlSJctG8HK2tqsZofg8gHBO1vfPZSAz0+cDXgdqHojnO5xyfr9xm/d7t9rSivLW8fM79XVW37jdP1+Fita4fPE/3oc/xmkeVCO7vueAfrQG93NG6wNuWp+Pl8Lyi8kabKZivn+Sjc9KmdVxU3xybtR9oOb0M/pmvi3xznn7Od7SvbVrDZGRkZGRkZNwQFAXQGQLTozdtScYnjB9BF4Mr3B88RYn/CtNrtCgjIyMj403ixgvCJHMYmaMElRImSn5ptJuSMX5E3ybCht+peOppKVEURXap2MPjRin0qOijx8q5QKWkMtNVscufV5IyIjHVD14uj1LQyDsn41wYVmiELN9X+7WeNE2tR5J0kWDtZCfJcZJjStC6AEg46emR0BGhzTxV1HYS3EVcJRiZbrfbxdbWFobDYRKcarVausvVjxdW//B3tm+KOhR62u02FosF5vM5JpMJZrPZJT9rGtpevA69Xp109Dbh32ubrPKvi2BaRtqkoq621SrRIbLd0/R3vOxOJFcRzlp2RtHq8x6tqnbwPfal6XSahKROp5PqmD7Qn+r/qAxqB6PJeTzuYDDAcDjExx9/fGksYfSj+lnLSBs4hundv89Dp9PB1tYWut1uaqNOeEfjGPPZ3d1NkfRF8Uy81TmAR2Rr/6CYp9Gry+US7XY71ZuK7zo3UHBVmzheMD2NmqWfGo0G+v1+KIz6OOh9XPPx6ELtR1tbW2uiJn3COUiP9NbIQPWJnmbh5aA/x+NxaqdudzR3qtj8NqIoirQJR8cR3cQxmUywXC6xWq0uRdPz3uf5fI5ut5vu0uZczXmezwLP7q/ms3r/NtvHw4cP8fTp02SHbv7wDWWr1Wpt08/r8pPPjczfx2o+/7x51tdqLoD5POd9IhqHq8S7yD7+resCwoVdtS9ag/ic5+s3La+XRf3gc1oUAR2NkVURsJqnfx6VQRH5XH3nvnJfuN0uxkY+cxujOome1bS07fiVAVF5/V3mpWWPorS9zVT9zvQ0L7Uh8ovb6f3EfeF98G0dbzMyMjIyMjKuEUUN2HkAHH7zTVtyZQw6BWp5P9sLoQ7gD6CF4gqCcPnv/mVkZGRk3AzceEEYWI/cVDFOI3UpfGwSMVRc0KN4SSApUehkmJOi+h1JX73HlN/RDhdelTDXtJWYJsEfkYBOujkxpMcouzBcFEWKcHISr4qEcvE8InYjUkr9FaWtIgTJPH9GfeJHW0fkYUT8VRF3UcQSBTH1RxRlooSfR5b4P37X7Xaxvb2N4XCYRAmKMc1m85IdHmHEaHH6g/VIQZjHAjN6cDweYzKZXDpKWn9WtS0nIKsIZid4lfR0IlTTdYLVCeGojWl+Tkh7lJKmEfVp/12FTT0G2/u8Q+3SiH0Xrd0XfvfzdDpdixCOIt98nGC6ftw92xS/Y/23Wi0MBgPcunULX/3qV9cE1Ui84e8apewbLjzaOUKz2cT29jZ6vV7ytbZbHaeYlm5coZhMAZTl9raiP/0ZHt/b6/VwdHSUysDIZL3LmtHEPBb49PQ0FL5dxCnLcu2I7na7fUm40/GT9cS0omf0b637wWCwdmQ0x08epc3xgv+YnkbFsS70ffXdfD7H0dHRpXlG2yfT5yaBq95r+7rRbDbDyGq9i5nHQzcajdRm2P5PTk4wn8+xtbUF4FlbBi4i8tvtdhLcb926hclksjYv8Xj4O3fupHvja7UaHj9+jPF4vOZ/tnVvz4vF4rl3VF8FOs5UiXbeF6K5v2oM13T8uWie0vJHfSnaqFA1PkRrJ10LRYJcNNfpd/6ulzVaW0bioM/J+rmug33tE5Xb643paLmr5lR9Xm3wecfhPlO/6vylZdLv3Kdqj7eXaO3nm828/D6mAs/Gv6q1YtW6IbK/yn86dqq9vrlRv6Ot7kOvS7bVqrk3IyMjIyMjI+NtxI/+/i4GnawIvwgaAH4frna8dhaEMzIyMm4WPhOCMPCMsFWikp+rMEFExJoKt0AsxPIdjcqpIiQjIUnt1SiySBRSsVHJUBVG+D3z9TtltcxKCj1PHCPRBGBN0NHyakRdlWinebmooKSX3rHqEWl8h/7S51xcVL/SX1XEn5J7/lOf9TblJK36Sus/8oHnrTa0220Mh0Ps7OxgMBhcupO12WymqEf6S/1zdna2dtdorVZL4pWnMZ/P0Wq10Gq10O12MR6PMR6P14QaJR61nUTErdrCz52Y1vqJfjpB78RwJLprn3Sb9H7siJSPhIuq6LSoTehzaoNDSVvNl2Kn2sTfubGB5WMfpMijebJOl8tlEv3VjvPz8xQVq2nR78vlEtPpxfFAvMP39u3baLVaa0fh6gkG3v7UdzqmuRjj5D/rdjgcJjFYxSytI+alUav0I6PqaeNqtUrCq44ftJHl0iOf2X+4aUKjMPk+n6MYSAGafVKjiatEF20LGqWrz2l5fdONboLx+4mZbqvVQqfTSe2B6bItcBzhxhAf71kmH4/d96PRCCcnJ2tt3YUM/s0+ST+/jVC/RW2Pvx8fH6dNFPV6HVtbW7h79y76/T46nU46iv3o6Cj5HwBGo1ESlLkZgP2WGzPYhihM857q0WiEsizXjotmneoGE47v1yUARePapnFQv9fvNolnfMbXD9EYrHlF641NZagaq7UPVeWj5ajKw6Nq+d6miGPdTKefq03a731scB9FczE/j8RipqP26trK09W1l/aJyFdaHv1O03R/6mYr96O/52u/6DuHj5dVdc9nta8Bz9bzUTrR+75O5+eahm884GYdfzYaizQvvVKBY3Xkv4yMjIyMjIyMtx2NWl7DvCj+Q3Tw+StS//8fzPEQn877kzMyMjIyLuMzIQh7FBbJM5JBeuwpsC5KKCmn3wFYI8L5t4t4wGXCWwk9ig2eF9NQsow2a0SWkv9uF8lo/Z0/XbB2Qsn94QRXVYQII1AjIlaF0Igo1DS07JGAQKifIiEvIpCVwIuI5egz+jq6J5rfu8i2STDw/FS41Lak+W5tbWFnZwedTgdF8SxKm2kwGpyCjaYDrB8l7WUriiKJPKvVKomIjEKmOHxycrJ2r6mWT/uB1pHa5eRy5HevX7Y3LauT9ypYeX1UtQltz26T2+OEttqt5Y3EABcbHGy/bh/7uQq4ummCfU39o5HmFPh51Kz6nsIm8CxCkXloBDnfoQjb7/fRbDZx+/ZtbG1t4enTp2t393pZ2C4JbdceaapjMn12fn6OVquFXq+XysvndKOLthNtD/xd06Dgtlgs0gYHrXP6kHkDWBPk2B9YBxzDF4sFGo1G8gfF816vl+yh7fQXxePoRAa1y0V6FXzYd3VTE5+N7pYvyzJFL+uxx9qW6VeWnccfc5OCz53qe03r6OgI0+k07GscbzxfjZh9m9BsNtMx/dEYxTY9m81SFDDb6HQ6xXK5xNbWFm7duoW9vT0sFgsUxcXdv+12G5PJJB0tzc0/0+kUzWYTrVYrtRXgwtf063w+T+Iy+4VGE+s4X5bXG4FdJT7RL5vmbk1Dn9VxytPT+TuaOzRfT3/Tdz5G69+0X/uW5+Xju/aJF4WKupqm2u5rJi2/P6dlfJ6PdL2lfVHziqJRNW2fUzXPTf6o2hDkafkz3k6eN8dr+XVtq21T81NRu8pv6he+r9ehuI/Uzqp+4+2T7+r7HtGuc6C2W99o4G1If0a+zsjIyMjIyHibUAJlCeQ5O+Ml8RMYXCk+uESJU6zw9p7hlZGRkZHxsrjxgjDFDWCdkFHSxo/KU1LMCRm/+1ZJbk2Haeh7fM4FJo1aUwLX03WiPkrPn1FhUp9zMjUStTy6xIkjJ/g1SlPFC4onfEftI3GlPqZQ4JHHTmwTFJyUtCW0LjQPF2C9HWj9+t9OYEckKdNVQrGKwFb7tH607O12G4PBIAlUFOkAXGqTWh5tV8yXgo5GsjgZTSGYdyvr/cSMFtbjuWmTl0/rLoo+ijZhRJ8pMe8kbvS+k6YutLmv+LcLz1qfEbldRez6eOG+cr85We/HAKtNGuXPNu/RRUVxIRKyvfAzPsf61M0wFJTPzs7Q7XaTYEwBaTabodvtot1uY3d3F7du3cLBwcHafbK0VUVOFRO1TBwvKHh7+2AZGJFJodA31Sj5rXWtbW4wGKTozHq9nu4g1ohUjRKmPbxGgPaMx+P0O99lvbCfjUYj7O/vJ+F4MBis1bPaSxt1nFD/aLQ1+2OVIEVbqsQcACmtXq+Hbreb2g5FbdYV/cF0XWRi2V28VT/MZjMcHh6mMYS2aT1pf2e6et/u2wLend3pdACsj2scS4FnbZZjNvvbYrHAwcEBjo+P0+aeZrOJO3fu4NGjR5eEYLaFdruNdrsNAGmjAfObTCapTZyenuL09DTZy7pnv2T/5n3gV/Gvj+H8TH/SR/wsWhvp874RRKFjWyRm+djpdmg707xdqNYy+FrDxUe3xZ/l9752ifLzMvCzTWsUX8e5LZ6vr2uq7PeNfurTKK9ofaTrF8/P09T3/Hktt6cd+TAqm27+1Pc9f/1cx9/Ipy60+hpbbdN5mmnSJt2cw/nEy0y48O1r5mht6RvzgPX5PlrXZmRkZGRkZLzFePp14M53vWkr3go068CX/0D3TZvxqcAX0MAfRvtK9wcDwD/C9JosysjIyMh4G3DjBeFarbZ2TC7wTCTlP/1bhQsnqvwzJ+I1Gov58m9gPQKW73pUhhKkTvZEYiv/ZrrMRwknjdzS8qhYruSVoopcqnpO81d/0z9qjxNzKphoWuo3Jec2kdpOiGo98HdNQ4UTJQG9LUR5qqijx/Dpex7B4e+7D1ww10g+tUmPaPXy6rsq7FDI4TMaOaw+cOGO7YXH6I5Go7UIy4iEdt+pHzz6RtPROqJflGTVZ7WMWh9O7LstWi/qP/3e7XsR0lT7igpFkajAclDoo+ij44QKoPSh3luoZVaRTgn76Nh2Crnav3h/LMuhbXo2m6Xv+v0+bt26hd/+7d9eKwvHEO1HVZFvwLMxUyOMtZ5V1Ga5GVlJIl1FErWb7aTRaODWrVvo9XrJlvF4jOl0moTNxWJxSUiez+fpeF+NztQxe7lcrkVl6n3LjBDe3d1dO/VABVIdi2kr64L9jaJfURRr99dre6RNPOZa+4iWifnxXttGo7EmGPIdnXM0MlvbHMvPsuomA0bKHh4eYrlcpg0mWj+0ifOvCiVvE4riYkNBt9tda1s6/7M98v51jpP9fh/tdjs9N5/PcXx8jN/+7d/Gu+++i1qtlu4Mrtfr2N/fR6vVwmw2W2t/k8lk7bjxXq+HxWKR6ubw8BCz2WxtnvSjddk2r+M4bu3HPt7ze34Wfe5zqf7tY6wLhb4ZxAXKaM0WIZqHfT7wOTtaT/iGjmj+4t8+H2zKIxJNN/nI5zp990Xqwetskz36uY6/vtbx6FlNR8VXv3s8WmtW2aHQfHUdFflC7dXfI3ur1r6b1sW6vvd1oZZH04nagz7r60L9jM/5s5qHbr6J2nlGRkZGRkbGW4xFFuSIWgHc3qo//8HPOAoAfwED3MWLn1oU4SOc41cwvx6jMjIyMjLeCnwmBGGPjlLykFCByEUhfs+fKlw6eUaipizLtaNenTxj2rpjX0lCJUE1TaYBXD7mliSwEuxaXj6r5SS0vEpk8T2WRfNyEonCU0TYKtnvEaBqC4V0FTy8Ppw89GNStYxK3gPrwpParwIMhZ2qutD7GJ1cdNJayxkJV/xeCT5tLyrWAc+OseX3GnnKKEoV0/Q7JV+1LrSsKiLwc94xzPQY/dlut3F8fJzul9WysAxa11F7i8hw35igda/CVVWe+rl+xn7rUeTubz4bEauaZpXooGR7RPRG8A0DWldRdHHkO4pO/E7vYo3s1rLyO7YbHeMoUjKilqLX3t4ems1milRkRKwLEyyPH2OufU3HOK9f/VzFLI0YBp4dg619hcee379/H91uNx2zPp1O05HRFOOZXqvVwng8xmKxQK/XQ7PZTD5RsV3LVBTF2oaLxWKR7t++ffs2ms3m2tUAOuZHYo3WF8cmPaLa+yp/6tikc40KrbVaDf1+P9UVfUoRkm22Vquh0+lcimjTo+rpZ6ZLP81mM4zHYxwdHa3VNZ/XPs1/LOOmaPo3AUbFA+ubr9gei6JIR+q32210u900bp6dnWE4HKLT6aDT6WCxWODp06d4/Pgx6vU6Hjx4gP39fbTbbaxWqzTP0l8cW3VuK8sSk8kknRjB46L1ex+P2HbZBq8CTd/HQR27orbt6xBC26a2fz9ZRNOI1iB8Vts+041s52c6Jur3Pi/4vKwCqK9rojWmi6fRmK/liMrp77sPNq3R3O/+uZ4+oX6I2lTkF53HCD3phc9WzfGaZtXmvMg3bivf1/EWWG9Pnpa+4+NT1dpXP9e0ojam0PVMVf+IxFuOD94Hog1Ymp6vsTUf93tGRkZGRkbGDUerDxQ1oHy7NuFmXD++Ew38r9G/UnRwiRL/XyzwYb4/OCMjI+NG4cYLwk4YRcSKknoUDCNhTwVlJVJI0PMZksROEOpRc0w7Iu70syqSxoVSpqc//Qg6jyRVEpb5UpB18kiFG7VBCXL3sdqp77lYqnlFtnrZIkHWhV/NV6NhIxIyIrX1p6en9kZRGB6tU0Umavm1TrRdUGSh/6PjeVl2HvfK+0s1kpH58z1GranIpVHItF+j3pXQpvBWr9dxdHSEyWQSkp7RBouIiFdfRCQ2f7p/tZ48cjgiaj1drRMVESIBQMeHKnLa09bPNxGuKsoqMc/64N/eZ+v1ehLxtK86mU5ws4X7UtvBarVK0YcU+Cie0gfNZhP7+/sYDocYjUZrUcU8krnVaqVNCtrGWEYVNDleujAT1ZtCN8comU+xbrVaodvtYn9/H51OJwnYk8kkCaBEdDd7WZYpgvPJkyfo9XqpLDxymeMi2wWP5R0Oh2i328lPBwcHKYJb74fW9sU0WIe6UUXvT64SrdhW9D5wBf3c6/VS5DXz9HuVmQZFc9rHqGjmp3Wq7ff4+Bjj8fjSOB5tZCrLZxG0b5Mg3Gw2UyQ18GxjFMXVWq2WhOB+v49er5fGR/pXn6nVarh9+zYAYDKZpBMBAKSrFYqiSAI0/c02ySj9sizRarVQq9WwWCwwm81SX2M0uwr77MPX4dto7PXP9TOdg7TOve06fEyMxmQfIyKxLhL/3AYdgzQttVeh76rwuEkA3CSU+zrB/Rm94+ss/zuy1T+L1mLRelnzUJuq1k5etzrH6nNaD56mtl99n3ZEmxq9PggfN31jpsJFWvWnfu4CPp9zn+raQf2ldcq50cviNvpGTfWz+sXLpT7Rdkgb1TcZGRkZGRkZNxzb94BaAzhfvGlLPlXoNAt833tNfHT49vxfdRNaAP7P2MVdXC2S+pexwP8WB8jbBzIyMjJuFq52dsSnBEqkkXRRgpsEih7RqeSgEt8U6Jx4U4JKxVFNx6MA/XvgGXGjR7mqGOdlcgHR/1WRShrVxfzcZgqREWHmAl8UrUYxQclW9YW+q3etbiKcXYBwuwCEvlPRRu1woi/ylUblqS2b6kD/VqjY5GXwd5w4jI4gp/BFEV/9yHtfKQSo6Md0/Dhp1jujG3kMrIocFPp4v+v29ja2trZCglThJK3Xr//uRx9r9KC3cX6vgpP6MeoP6ks+F5Gp0TP6nbehKgHCv1NoNC+wfkdrUVxEG7KMAJKYWCWIeF/XtCkOTSYTjEajdBc105/P5+mfHmW9XC4xmUxQFBcRkXt7e7hz506lT53Q57ihx/fTZh0P2AZ10wPLrM9QLNVyMS09DvvWrVvY3d1Fu91GURQp+tfvqqXf2Jc6nQ5arRaGw2G6c5hlZx/QNkPRdjwe4/j4OIl9e3t72N7eTqKrbtzQiGqm5WOkRvyy/OrzSNiIxh4d/waDwdoJAqxfir8E7aW/2VZ5xDbrhsfIcyzh0ciz2WztSGptI3oygY6jbwtqtVqK7vWxjf7mUdi9Xg/D4TAdxd3r9dBut7G1tQUA6c71er2exszpdIoPP/wQwLO67na72NnZwc7ODvr9fjqdodlsprbCsZl2MNqdftZ/wLN7ma96d7CXn/C26d/7O95+NR3aq32K/tF52AW3qrWV9xPPy8esaF1H+IYj/z3KW6Fzi4uTVRt4qtaL0aaQqA6iMdmFUh033X7f9OZ91e3TvPR5Hf8jsVRt1bYb+UDnC7VV11ZeVqYX+d1t0fWDj+9ePq8XX9fpuFw1JtOWqF1F7cw3IEV+4hzKNbzOIe4DvzIgIyMjIyMjI+Ntx/d9roX7e5/skdGdVoEfeL/5ieZ5FXwPmvhBdK6UxgHO8X/EMR5lOTgjIyPjxuHGC8JKkpBQ9OgA/cc7NPlPSSAn6j0fFStVfOI7LpBovoQLIhq1GQmFSvSoHWqLEqzqEyfRnPx00dPtVCGXIofmr2QX83XRw4lEJ2S9Dr28kSAGPCOVi6JIxJiKuiqKRyKL+lJtV384gcrnnkcYa536My62a5lUNNO/1S/8nUJWt9tNwqHfHUwSMIqW0TxYXhWT6VNG0G1tbWFra+vSccwR6es+0/qv+t7bvH4ftRknZJ1sd7LYxwG3xUlq948TwUoiR0KCg4Iwn/F+v6mNsm2r+Kv9VSNOmY9H+69Wq1SXGnk4nU7TmLhYLHB6eorz8/N0ZPT9+/cv3Y+oY5+LOyybiqkcR9TPPj7o3bw6xmpfdHGYQua7776LnZ0dtFotTKdTPHnyBOPxeO2IZ7872dvO6elpKg/rhe/zWYrEDx8+xLe//W2Mx2M0Gg0Mh0PcvXt3Lbo8mif4k5to3Bc+F+nx9/xcx3QXmvhcq9VK/uAmD4rBFGm1TpiWCvk6vgJYExXoT957W6s9u3ecaWu/o//eNkGYR0Xr2M++xfrm0fncFANc+GJ3dxf7+/sYDAapzx0cHKAsL8Tdra0t7O/vY7FY4MmTJyjLEvP5PPWrfr+PwWCAfr+f7hVmXRXFxQaR+XyO2Wy2duy59wnWF7+/Dnh78zboY5zPW3yOafn86Hnp/Md+Es2fvkarsjGyP9pUp99H9laN5dGawDcaRT5in9exIbLXy6Pv+zoiKqN+5gKh2u326bioZfF3fJ5Xe7Qc0e/uG9rNNDyP6D1/vmpNEbU9n881HW130drD1ytRf4s2nOn7Wje63orKoZHM2k71ygTdRKebNjmPul0ZGRkZGRkZnwHUGkBn+KatuBLubNcw7OTTTTbhf4keWld4/wnO8RN4il/E7NpsysjIyMh4e3Djj4wmQaICiJKGJOejCCbgcrQpP9Mj2JSciYg/Em/6Pm3i+xRVXDzRKCoS/U5SRgQey1kU65FYHu3B55iviiJ814k1tYHpRKSw+0F9xc82EYOMuHPyi/bpe1WREi7KeTvguyTIlPRUAjIS1J2A0/z8OReZvL15+bQstJlH0Wp0qJejXq/j1q1b2N7eXhPAp9MpxuMxZrNZivDTdkJxSeuP3zE6laIR20Wz2Uy+1bxGo9FalGHUFpSkdkJa+5uTzpHg4MSupqH1p3USCQr+Dn3v0e9uk5PsmwSOKrg/dDxRKNmtAp6WheMKo4NoE8UtjQjm8+fn5ykidjKZrPUZHpPL9rdcLtHv99HpdPDgwQP0+/0ksALPjqqnSKvjmf7TsY7H3QLr4qKT/dFP/q4iOtMeDAb43Oc+l479PTo6wuPHjzEajZKt9MHZ2Vkq+2q1SlGVjCamPyeTCebzedp4Qfvps8VigcPDQ0ynU+zs7GB7exvvvfcefvVXfzX5PiLgdYzyTQ9+3CjTYN/z8cn9rRHnvV4POzs7aUMHx1ndMKKCsEYI67zkfYP1tVpdREKPRqNkkx7HrfWmG6Wi9v6m0Ol0MBgMkm+0PsryWcQuxfXBYJAihbe2ttDv93F+fo7Dw8M0Vs5mM4xGI2xtbeHs7CwdP/7kyRN8/vOfx/3799OGDEapU/DVvsD7iLW+OR9wLNK6WC6Xa+P9VeHzezQuR/120xjp6wlt69H6wm3RMRN4tqbxflY1d/hc42vFTe/q2o2f66Y/tVPLpGlGc1Xk02iui8riG+Z8btsk5jqYXnRkvb8XzaFet/5ctO7YVC9V5Y/W8J6frr0iW5iOj1OeBoBLefFdX0swz6o+UVV295H6kvXrJ9f4s1omfufCvo7RGRkZGRkZGZ8BNFrAYB8YP33TlmS8JtQBfAcar3x38Aol/i84xX+VxeCMjIyMG4sbLwgDz4iXSBgty4uoHx6Nq2QqUH1PmBJLUQSvE0D+TJQu3wWe3fXpefIZLYcTVU7++N1kmheJeif5VIjl93pksQoAmqfaxM9V2NXoBfWXE8teNpbHSayILFRCVH3q9eOii0fpqGhF2/RIa00jir5x273+IgKd6aqtjABjVCVtYN1xc0G9Xsfdu3cxHA6xWq0wHo9TlNn29vZaxOdoNMJ4PMZ0Ol0TjWgrBS61T0UH2lkUxdr9shTHTk5OLokQSmhqGi5kRf7y/qNEaiQcRiR39JmTslpeFdo8Mgh4RqBGZG6U94sS+j42ROKJCmkqfPAYZCeEV6uL+0drtRo6nU66i1RPQiiKZ1Gv6nPmwUjHyWSS7uO9desW7ty5g6997WspipgbCFwA0TatZdH+qn5sNptr7dBPd6CN6gsAa8Lm3bt3cefOHXQ6HZydneHw8DCJvoPBAGVZYjabpf40n8/R6XTQaDTSsch6FG9ZXhzRy40ZtJd9rizLFJXPzRedTgd3795Ft9tNfqc/1Uc6hvgY6sdTq/8oSkX9ywXWoigwGAzQ6/UuHfHsm2/oUx59re1N252eFMFxhGMM7actPh/55oG3QZRoNptJDOZ9ytr3G40G2u12EoO73W6K6GV7ZR9jO+a920VR4Pj4GL1eL7WPRqOBp0+f4sGDB6nd0SfD4cXufT2mezKZoNFooNfrpflB26POLx79fh1wAc8Fx0iE841ourHFxS59zgW5SIDzNH1jl9vlmyX8OS1j1fywCT4fRN9pmf1595fPw1Gaimgs9bJx7OTfbouO33zO10uevs+PXlfR3O3+9fr3OdnbntYlbYw22uk46+3J86jynftD7Yjmec1DoWOornEApI1Rnka0MUzXRF4W3Xyp46/C67zq/yQZGRkZGRkZNxB77wMf///etBWvjGY9Rwdvwg+giR9F95Xf/2eY4+/iFPn8mIyMjIybi8+UINxsNhMprQIoyXklqCKSjs84wbKJDOLzKiZqhHFEekXRpMzP83DytSqi1oUzvkOxw4+QjexRf6lQpumpXz1yln6vIn+9XFEUB/Ng/pqGkmouEjmc6IwIQyfrlED1sqkAo3V2fn6eIiy9buhzP/o1IkmXyyU6nQ4WiwU6nU5IvrfbbdTr9RRVpkLXcDjE8fExzs7O0pGks9kMT548SRG9XqdOhrooq0fKah8jCXlycoLZbH1XoQtVGvnoEYRe/xHxqv0nIqQ9YlR96iKFksde1mhc0H7jdkbtLupf+p2m5Xd6a3nYrtwGthMVf/j5fD4HAPT7/VQ2RrgWxfopCu12Own8FKLow7OzM5yenqZIxq2tLbz77rv41re+lcrANqBiGm3VsrBfqM/11AT2DR2zWW96rGqj0Uh50ccUYn/X7/pd2NvbQ61Ww3g8xuHhYRI4GSE7mUySUKtpsh1Pp1MURYF+v58ENm6OYVrsb41GA91uF2VZ4tGjR2i327h79y7u37+Pu3fv4vj4eC2aUOtIxzWvf45pjND3uUPnGW3n+h79ubOzg16vl4RKCtx+tCjrQSO29f5j3kHM44z5TlmWKRq2ao6JRJFIPHkTYASu3quumz+4UWFrayv1Ax2r9PQPpjOfz1NdTCaTVB8Ul09PT/E7v/M7uHv3LnZ2dpLgrHU9HA5RliWOj49TfbM/TiaTS2I7++tVo4OjudrHUiCOAvYx2sddF6mIKD8f26O2o894lK7PPUw7EtV8U4S+5yKkzy1VoqKv87z/ahpRFKv+rCq7n2ZRtTal3To3apreN9Xvvu7TfFzg1zpQ/+n6zPP0OdjXcVF7UD+7KOz+Ultoj5fP09XNUVW+1XS93Wgaujb39bW3Jc1ffexrNG0v3ua5ntC0/FQJzS8jIyMjIyPjM4DOAKjVgdWb34z7KvhT/0Evr1024IfRxfYr3g75GOf4z3CIaZaDMzIyMm40brwgHJFmTsgomQ2sR0KoOONippNcShiRECZJq4SbC4C0z22OyEp+TrGGtjabzbXnnLSijSp6klhSwlvLr++enZ1tvINMSSj6St8FLgsNbo+mo4Sa+8HJPCVvq/xaVT9qg9utbUbT1fr0OvM8ozqNyGt+p+IeP1utVik6rCwvxD22o2azmdpBt9vFZDJJogXfoxjGNsKy1+t13Lt3D+PxGA8fPkzCMAnDSCDVeqPfKAA6yVur1XB4eJjESIX6lVDRz33pImCU3iaiOhIqtF488tI3QSjh62KHixpO5vOZKvGD+fN7v79cy6dgebQPcaziiQeMvFwul2sbYvj5anVxd3Cn00miVaPRWLvPeLVaodvt4vz8PEUnDodDtNtt9Ho9PHjwAL1eD5PJZK0stM83tOi9wkyfUbAqbDAincIX+4Zv9tCxmWIcANy+fRtf+MIX0O/3MZ1OcXx8jKOjoxTFzDIul0tMp9O1e8bL8uK46fPzc8xmM3Q6HfR6PZyenib7WM/1ej1FaLbb7XQ09/HxMQaDAfb29rCzs4MvfOEL+OCDD5JIV6vVkrhYJXroPfAqNPIZvddXxy+dB9TXjUYD+/v7qX1wPGF70M1Kulkgas+0j+MQ7aNIyQhhH0PYxhV8701D7+kFLve7oijQ6XTQ7XbR6XRQr9extbWF1WqF6XSaNutwvG02m1gsFqn+eNT4dDpNx043Go3URj/66CM8efIkHVnd7/fX7ggviiIdT801wNOnT9PmH90wwu+vGh1cJay5CKjw+S7yp6+zonFd04jmBh37dK6IbPDnIpui9eKmcvn8QrgIGK3vorlI54HIb56Pf+9iN+HRvfq7roE4FqvI6WtKTUtt8nJ6/ejnvl7ycujc52uLKAK6yp+avq851G4XR5mvrwFd4Nb1jovBEUnp/2eIyhK1GS2Pr3/p56o+5H02mmciWzMyMjIyMjJuMHq7QH8POH38pi15JfQ7b+Zkk09DYPI+avhx9F/5/f8cE/waltdoUUZGRkbG24gbLwgDSMSoR6hFJJF+F0U3qCiqhBJJe9+5r+KvihZK4hAuLvEZCgb8DHgWGagiixNpEXnrAnZETrno5eJXRDA5eah5aln0PSW+lJzUd4Bnx4pGgp5GnfnzVYKzpl9F/PrdzU7oqoiuEYxaJidSN5GgTkp6uzg/P8d0OkWv1wPwTGSnDY1GA51O51Ibo+hEQVCjoplno9HA7du3UavVcHR0tCa8qUCsEYMqTtFXjJQDsBZBeHJyko6mVihhrGSn10VEpqvf1I8RIa7vUOys6hve76sId60nj7aJxIEXBYUxtZ3/NPIp2rShdeMRm6wf4OI+aYp/LPN8PsfZ2VmKVpzNZiktHhXN9ObzOSaTCba3t9FqtXD37l3cunULX//615P9bDMamapjFsvCyHS2QxfTffOItm36QTeccBNEq9XC+++/j/39fcznc8zn83SMuUbfEhqNSYG02+0mv56fn6eI96Io0O120+e8Y5fHdbMfTiYTjMdjnJycYDgc4r333kO328VoNEr9UcvMvFwQ0PHB26e2A2/7usGA/up2u9jd3V2LzKfdPheoCEKxXkU5nXNUtGEbYd1HAoT2l1qtthZ1/aZQq9XW7vDVOcrHNfaver2OTqeD8Xic+grwrF/yiH72zdFohKIo0gkN7Fvn5+fodrs4OzvD8fExvvnNb6Lb7WJnZycdR812dn5+nu76fvjwIU5OTlKfot0A0p3v14Vojvd+FImQ/rmOaeqrqvReRLDytQU/881iVUKdQvuj2sR0fI3i6xLvv25XtI7xqFb1tfdz95OWTcugn+kzkV1Vc56WMVr36XigdaB+13W3ryG97jUvXT/pektt0LHc/RmJo+5fjuG0X211P+v7zMP9y3nP69fXLdomvV2obfRVJAJHm9+ielGbfQMF0/a0MjIyMjIyMm46CuDOdwGnT4AcCfrC+J//T3v4u/+PUyzf4sDqP4UevvMVaf45Svxijg3OyMjI+EzgxgvCVREPhBIjEbEUpcd/Gt2l35OUJQlM4kpJfyVmXGyuIh096k5JPBcw+V4VItGS5VLiUIkuj4BQOwCsCUyaT5U9Ln5H4oETvV5GjxbU8vjdlk5Yqk1OXka+VHLSIzMoRjESTN+J/BARhHyObcGPI+ZR0BSceGcrj75lO6MI3Gq10l2v9Xod4/EYp6enSVDo9XpJmCrLErdv30ZZljg6OsJ4PE53oSq5qAQi24Dfs0nBhD5uNps4PDzEeDx+oTYZtRUXF5w41nc29eMoWk5JfH3PxwlN2z9Xu7S/qG0acRRBTxXQ45SjNq8CnNpGv3sUO4+gpS08Bprgvbq0YzabJVGU6XO8m8/nODo6SnfR7u3t4cGDB/ja1762Fr2uEbfqO42IrSKvnTRXUYT9S4/5Z/ocU3Z3d/GFL3wh3WdNYa7T6aSjjFerVRJneRw7+zGjk3m08tHREebzOabTKVqtVjqevd1uYz6fo91uY7FYpGOjaetoNMLTp0/R7/fx7rvv4v79+/jqV7+Ksly/u55+L4oi3SurYndVu/PNBtq2NFqaY9Pu7i729/dT3fD+b0bxU/xl1K/eMV+WF2K5Ch8unnE8GI1G6ahijpe60cRFik3jwieFdruNbrcbimM63vNvYjwep7rqdrtotVo4OTlZ29xQliXG43FqU0VxEcXPyHudv/v9PsbjMQ4ODvD06dMUkb+zs4Pd3d0Udfzxxx/j4cOHWK1Wa2sH+vN138ns8wJweZMOoZ9HQpb+7puqNH1C+zrHG/9O5+eqeZ/P+zyic4w+F5VVv/cxy9+N2pCvs3xt4L5xP2xaq2rZonWl56HvKdw3vi4ifP0T2aRl8Xk2Wm9FbSxKO1pr8ucmwd3nF/cd0/FNArqpRtuMb2pyX7pY7/Wt7Zr/omtFvJ50XRZtQtM8PY9orZSRkZGRkZFxg1EUwK3vAD76TWBy+KateSl0mgV2em9m3bLdq+FtXjJ9Nxr4TzFEgVcz8r/DHP8vXD7dLyMjIyPj5uEzJQiT6AfWCUUXuDaRYcDlKFYVLknOkrzRSCMldJTsVxKJtinhE5GkHhnBn04YuaDkRKsKL2oLn3VilXCizL9T/0aR1g7N19+jmKDkYRR9pAKIkm3qg035O9Grd2q6L7wuPfLC81a4iOVg2dynjFJkNCPFJB4/CyDd4drpdNBoNFLEW6vVwnA4BHAROUbBi2VpNBpYLBbY3d1Fq9XC48ePMZ1OkyisApRHbDebzSRkARfCCn0BYK3PUYxTv2uZq4ShTZ+7P7W9sT68bUX+ryLx+XtEoEfRwfRTJBxsEr5c2NR25ZsQ9B19pt/vo91up/pQoY/1xvrg2MR23uv1Uj1oRHlZlmtHlvMeXQrCw+EQn/vc5/Brv/ZrODk5WTv+NzomXn2pdwTz76h/uKCjv6s4zg0R77zzDvb399Mx15PJBGV5cQwyhU5G91LgpVCtAgGF2Z2dHUwmk5R+q9VaE7v1HlkeP12r1TCbzXB0dIR79+7h1q1b+O7v/m587WtfS6Iv5yS/b5n14uMx/a8+UjEpEhpU9Njf38dwOEx9liI202w0GilfRg5zQ8lqtUp2Mi+9y5rlWK1WGI/Hqb2xbiIBiPYxUvxNgXc/s5+wv7Eds8/QH/RJURQ4PT1Fq9VCt9tNEejsg6vVKrWN0WiUxtKzs7M0NgNIdw2z73AMnc1mODw8xHQ6xWw2S5sWHj58iCdPnqSNHVrHnCuuMzqYZQcuj3E+BkfvRcKfjgE6Tmte+nvV+ByNFVXjra8BqtZ+Pn9omtrfPA9fd/g6wQVELwfTVEEyWo/6mrJKVPT1SLRm1Ly9rOqzTaKh5+/1p2m6j9SOaJOBjv263ozS3LQRy8vugrn6KNoE53ZH0bZej74WjOoksl9952sJtdN96+VmmlXrYvVrVd1mZGRkZGRk3FA0WsCD7wc++G+B8s39P+xl8e5+Hb//i+03bcZbhw6A/wzbrxwdXKLEL2KW44MzMjIyPiO48YIwsB6VEBHT+nkkugDPiBqPZnPiT8UEJ5GUUNT7X5kWn+PfHnmr35+fn1+KIvM8I7LQ7Y/uZVWyScla/q1+dUHPiTAXuRVOsEZREOpnLRtJez1+myKLisdVEaEREal/qx+ckKTNWs8RuahlpM2RYOh14pEoShLOZjNMJpO1I27Pzs4wGo2wtbWVRCbeezqfzzGbzZIItLOzk8SXoihS9COFCwDo9y/uHDk+Pl6LWlW7aaeKJ04i1+v1JJypuHZycnKpLVQJqO5HFw60zrRtet1G5L4KVbTBI4WdgPX2HJHBm4SRTfAxQKOt6E8KQnxex6yiKFJEeFEUmEwmKbK1LEvMZrM1cliPEm40Gmi322t3y+pmAbYzbf+TyQTL5RLdbhfvvPMO7t+/j9FotLZhwsc89TmP0nVym3UZiSa0TX3EOmF5tra28ODBg7Vjs3kMNDdHHB0dJZ+22+3U/niqwMnJSYqaPj8/X/NrWV5EwargqfcHT6fTFC1aFAWWyyVmsxl2d3fxu3/378a//Jf/Eh9//HEqjwr0bK/qf22/2v5Y93xXj4+nXSoENJtN7O7upgh+jhM6r7Gei6JYe5d+0H/Mx+eL8/PzdBqAR90ptE89r2+8ThRFkcRZ+tijKYlarYZOp5M2ENCvzWZzre53d3cxnU5xcHCAfr+PWu3iSPGzszPs7++nY6mPjo5SpDDbKTf4MH++t1wucXR0BAApH+1fBMXg64gOjkQiH6fUN/7Mpr99vojmxmiMrbKH0A0y/ky0dttUVhcLozTU/kjsi9aJ+o5v6Kgqn7ZJ3TRWFakdrf3cbi3ni8xhhK531BafHzUf30CgbdY3TLpt6gtdA3g67mP1X1V78Dnf20X0mcPT8Hy8HfmmR1/zbco3so+fV7Vpb6e+qcjtzsjIyMjIyPgMoCiAu98JHH4TePq1N23NSyFvY1tHC8DPYQd/Cr1Xjg6eosR/jen1GnbDcO/ed+A/+o/+U5yfn+G//C//Lg4OPnrTJmVkZGS8Mj4zgjCFT/9HottJFI/6UzHUReUoUkCJOiWwKKo4icP3VQTm9/qdCln8TKMUlZxTEZXveGQo7VVhVe9CdtJPbSL8uEaNbHO79Aht/s13XFR1QcIJY9aJ+lhJ8Iig1X9KsGpd6n25LoxEhCP9x+81qkyFHdYjf7qYot/53wQjHgeDQRLAG40GptMpRqMRbt26lfzC+04pRpAIZPTZarVCu93GaDTCwcEBBoNBukN2MBhgMBjg+PgYs9ksCUCsM62viJBmW9OobdpaliVOT08ryUglL6uEBa8DF/SrRIJIZGT7pG1Ru1GRIrInylPzrfren9U7dp1QL8tn0dgAkqCq/ZhHQxfFRfQnBSZumNBNI/y80WhgMBikY5N57HFZlphOp0kwpQDKCEgKXrdu3cL+/j6+67u+C9/61rcwn8/XxGz6kP0KeDa+OVlfFMWakBtt4GGbY79SfzWbTbzzzjvY2tpaG+cYeUmbZrNZqnfez03f1mq1dAQ0+wzvuKWQqpsynj59iul0ip2dHUynU5ycnKDT6STxudPpYDKZoNPp4Pbt2/ju7/5uHBwcrPnU27qWT9ur34HNsvPYd90goGPharXCzs4O9vb2UuT3bDZbax+sH0ZAs/0w0pS+VvGc84+OffP5/NLx8JEA5GLRmwKP19exWsc03YDByGCexFCWZToC+uTkBKenp+j1eqmOer0eOp1O6jO8A55H9wMXvjk9PU11Qv9yHuHGMb1judlspvajmyL42XXex+x152uW6Hkfh6Ox0wXCaB7UvDT9qjRd6NN0IniU7aZ5yMsSjc+RL/xvLZP2p+i5KA8tm/qwyj9aPi2virden14HXna1TdfQamtkl89XVX7y8SBaL+n4rus3/Vv9pGs6HT+1vJq3th+vW18TR+sAH998Herp+/c6N/pcoM/pd/6up61jt/qlajNCRkZGRkZGxg1HUQO+40vAcgacPHzT1mS8Iv4oOvhLGKJxBan8X2GJ38D1njB1U7C9fQc/9EN/Bj/2Y38R9+9/EQDw/vvfh5/7uf8Fzs+v7//dGRkZGZ8kbrwgTOLZo31IHlURWCS5lCyLiFEnelSk4Gduj6bNZ/RdJ0j5jJJ5SiYp6cU8/DuSylomfy/ynZJ+Tp4xHRV3lbRSX3oEiBKiKupUCWFefs07IuecbI7qwgnKKpJRBQJN26Nk+IwSeE5+RsSqCjdR2b1+ptMpJpNJikxjtOXx8TF6vR7q9Tq63S6GwyHKskz3ubIdFMVFJCnT7/f7iSTknaJso4PBIIkOFNTcH14n3vaYf61Ww3A4TMfKjkajtXI5qeqRvVpv3oac1PSo6yrC1vtwlE8kKHidaFuIyvI8EYWfa9vTPucEN/+mULRardDr9dDv95OYy6hY+kMF2Xq9juVymY4Pp1jMDQCs//l8vha9yDuFeXfuwcEB2u02tra28D3f8z34N//m3+B3fud3UnpFUaDVal0aS4qiWBuTIp/pT77Dtqn+UjFgMBjg7t276fhrRkpyUwR9ulgs0v3AjGrmEclMm9H43BAxHo+TfxkpWpZlEud47LpuUqEQ/PHHH+Po6Ai3b9/GF7/4Rfzmb/4mDg8P///s/Wm0bVl2FgZ++/T9Obd5fcSLJjMjI1LKRpnpkhLJMmosZSIbCWRjAYPCGCRwSXIBw0DJNtjIHkUJ2TISxlIBg6LAMnYVLskgqmSEZDuRlCSZEqkmM0JEREb7Il5z29N39+z6cfWt953vrX1fNPc18WLPMd649+699lpzzTlX8+a35lxYLpfhrl23O9UxD1foARq1YZ17FfTXw0LdbhcbGxuo1WpIkiSMdbXP1WoVIlY1ypQAgo57zw5AXufzeUjRre/U/glA32sQgnrUA1E+3nm4gTbL3zl2yuUyJpPJ2rzKgze9Xg/T6RTD4RDj8RgbGxsYDAaYz+eoVqtot9shk4OmJKeugZtrvz7TKG4eDCGvnF/fLp00X6lObze/+nOSjhMtp+uor/2xtnUdiLXne6mT+qnrus63+l7r9G9jcoj12Q+7ZfGv7fuhvBgI6OOMv3sEq8pVeY3tT2I64DvfE7oc3D58nSRvvq89iWJ2GZOBHyTyvYFHovua6/tN76fyq3sI5cdl4e91/+t7DNYbI5eTz6W+bsaAcrfXNyL7nHLKKaeccsrpAaRqE3j/NwCv/hpw9Rnc7+mjP/JYBaXi7cvdCSqXgFolwXx5fx2k+wbUUHmbcdN/H2O8/fxSDxZ1u2fwjd/4h/Bt3/YncOHCe9f261/1Vf86PvnJ78Y/+kc/fg85zCmnnHJ66/TAA8LuKPLoWjp7PeKRznR13Lmz2J3uMSdhzFmq7bAeB2oI5KljR9NLk59YBKLfL+zgJcnBbHUw0mmpf6tDMBb5q0CEOsxUduyXAhUuD3fixRxqMQesPicvBCzUcRlrj851d3LGnN7uOGRZOukpCz9Q4I5I51+dhLHIZdX54eFhSPHL7+bzOYbDIarVakhJzmg/twtGuBHka7fbqNfr2Nvbw9HRUQAxGD2aJMcpiMkbASoFs9I0XQPsCG7oHcSlUgndbjfofzwew0ntWMdAzNHtdsH3HqGq38WctKqT2LhwZ7zq1sdWzDnv/MdIgTKmPtcIWR1bOl8R0G02m+h0OqhWq1gul+He0dFoFFKGTyaTtbS/aXoMaPLAAOcZAlAEldnnYrEYQGimvR0MBiiXy9je3sYHP/hBvP7662EOY50+fmLjArg5j6icON44/7mzX1MYnz17Fr1eL9g8QV72hdGbBD0pR4K6i8Ui3LsM3LxLmXUwfXStVgsRnYVCAd1uN0RY65y4XC4xHo9D1HShUMCZM2fw5JNP4vOf/3wAovWeXl9rNOOAgsIauatjhjJlfXzWarUCoM2+8c5bBzxZt97/TdtkO6pfguSFQiEcWIkR6+H3jLi+VxHC1CWANTsH1kFw8g5gLR14tVoNeup2uwHY5bw7nU7R7/cxn88D+Lu/v4/5fB7S6dO+hsNhAKgpp93d3bVDT76XIa/K+51IFR0DO3Wt9H1P1rwXW7P5LkYngVQxHrL6EJuP+Zxy1bET483ndZ3/9TvfuzhY5+Cc8quHyXyPwTacD+XHI2G9H7H9aEz2vlbp2qZzFPsTW/+8Lv1Wv1N5+IFL7V/sAKf2w9dqbZdlTgKJtV6uK/pO7YdrlmfTcd6dv6w9gmYhcL3FSPn3furcHNOD7kO97znllFNOOeWU07uUqk3g8a8Bam3gym8C89G95iiTPvxoGaXivUka/djZEv6V91bx878+vSftx6iBBF+Ht3en8hwpvow80pXEiOBPfeqP48KFx1Eo3HoCoVyu4iu+4l/NAeGccsrpHUsPPCAMrN+tq1En6ojhc3feuZOOZfU9f8aAI4/McGBH/50UsayOMnVAESjh7wQiHaxUByb/MX21gkrqhFPHpMpNfyroqo4olYvWqX3V/sQcWCoHbccjVTyls4OpDvTq81gEm0dmOi/eN/Ktjk2m5o455PTbGBDizkKXZ5qmAXggMME+DwYDVCoV9Pt9AMDW1laIJGaf5/N5ACgIDDNlMIFtRi8SaGu32wAQos8IIjHKk45o1kdi/yqVStBDtVoNDvhr165hMsm+q8Ttwh3V2o46fG/3rcs3NqZdH2wny+HsbXm7tyMHJ3T+UCe6A2icNzY2NoKexuMxJpMJFosFRqMRCoUCtra2AsA7nU4DsEudUNcE6Xgvqo4hHjZQh/nOzg6m0ykuXLiAD3zgA3j++efxzDPPhHnIARL9XcEE2hOj0Qlq6nc6B6gzHgDq9To2NzcDqDybzULkJuVFkJxlKpVKSP+cpil2d3cDYMy+VyqVIDfyxhTSvJ85TdMAtrM8gfLRaBTq3Nvbw6VLl/C+970PL774Ivb29tbsRKO4KRef79TOaI+0ZcqDczttpVgsYmtrK0TDMuKbgDDr5DumLiYgrncmq007GDWfz4PdxYAX/Z1zjd5NfTeJd5xzvqctMhW4jj/yyQh52g/7vbGxEeY1HhygDLa2tlAoFIJtl8vlEHW+WCwwGAzCQYRarYZms4lqtYr9/f1wCIeAPdd72qLqXA95vFXStUf/1nUciEdnKrkNx9Yy/Z51+tqnfzuYqPx5PU4+11BmHnmstux8+prhPPl7LRP7O9Zv/5Zrgu+bnFc+i4HZWk7n0di6pPKN7Vey9OhyyarL+8z3fOfzhevGdev7ohivbssqA98LeNkYUBtb47WfbsO+7jmPvrd2vXnben8736mM9aCpzlEx3XgdOeWUU0455ZTTu5iSAnDxK4HeReDpnwem/XvN0X1HSQLcIyw6k5pI8MjbdOvvY4Vfwuz2BR9wqtVa+NSnvgff9m3/Pi5ceM9t/Xjvf/9Xo9PZRr+/c5c4zCmnnHI6PXrgAWF1iiu4ok4hjwLmdzFni36vEQ4xpyjrUT7Uwa9ANclBSm+bzxgppo4kB7WyIldikbP6jUYQ0BGt0SDaFsuo04vPVQb8xiNnsxZZd47ymcvH5azte3SyytCdkQo0a/+8HNuKyY8yi8lVnbnajstW24w5QLWtwWCAer2OSqUSIoWn0yl2d3exsbGByWSCND2OwuM9loyS1Pt9CczMZjMUi0W0Wi0sFou1SMEkSdBsNnFwcLBmR+SfvOsBiyS5GbGmY4xRhxsbG0jTFFevXl2LylS5aX993Loz3MGLLGDgpLGqTlUHEXRuiEWxnuTYj/0eax/AWrplAu6UradZJm/FYhFnz55Fs9nE0dERhsMhJpNJuM8VQLjrtFKpBBCekbGHh4chJXi1Wg3t8w5cAmKDwWANwG+328HmisUiLl26hI985CN45ZVXMB6PA3jKKHEHTU7aZKseNRKS/1gPx2Kv1wuA3Wq1CqmWCbYxaprlWR+d66PRKNyfvFwuQ6Qmge1isRjugKVTnmMPQGiHYCGjqMfjcZivB4MB+v0+qtUqLly4gMFgsHbIIDa3aDQ4bVPtxectnbv5vNFoYGtrK/CmkdDUtabXVuBbQRHWrYc+OIcoYM4+sd96Z6XeOcxnJ42LO0XVanUte0EMHCRAzj4xwwH1SwCXY2oymYTI8CRJwoEdyodpoev1Ora3t0OU/Wp1fMdzsVgMkcY3btwI8tc5yOVM+flBsNMg10sWkOdlaIs6154EDGaBib6v8DL+PgukjLXl/fN1w/drPnfp3s7nfgX5tG0HCT1ttr/3Nc3by5K/H2rTMv6370ecsnTh36k8OEfpuHe+fL8a49H3V/wZyxySJR/llbywvO6B+E7nWd/HxeikMeI8er+9X3q4g2U10wn502/cbmN73NiYPEnnOeWUU0455ZTTu5SSBGhsAk9+I/Cb/z9gmYOE9zt9A2o4i7eX8WUPKyxxf6XBvttUrTbwJ/7Ej+Kbv/kPRyOCY/Tcc5/HYLB7hznLKaeccroz9MADwu48AW49ya8OJU/zqwAkv9W61EnmThrlwUFJdYq7Y5MOeY3I0nqSJAngDckdPgoYkW8FZNmO8q391ncOBvs9spqikn1xQM2dh1rOnXXqGCMpeK590vTMDuZr2yoTTc3qabFdblnON5WXRzlqX72Ok5zj7gCNOXy1rvl8joODA/R6vbVvmTa60WiESLRCobB2j7A6ag8ODrBarQJQXKvVQsQbAUVNcUrQi/JL05upX+nAJGjBNqhDRspRx71eL0QKE3xWm1ZbdMelyyrm7HcgxaPH3ca0Xne00gazgIWY49yfufPcSccw/1b5qX1qqmGmbKbO5vN5iAJmXQQByQfTJo9Go5AKmW3xPtzRaIRSqYRms7l2Py7np/l8HtIi37hxA1tbW7h8+TIee+wxfOlLXwpAstoF/yYQS5nqwQLVR2yOdH1WKhWcPXs23B3M+3GZNn06nWI2m6FSqYT+AAh9YJ94BzfLaIpklQtlrqnZyRvTfbNe/huPx2g0Gtjb20On08HFixdx7dq1kKadfSLYqvOYAiwEMXRt0hT8GjnNervdLjY3N1Gr1VAqlcL93Tq3K/DNiGgeFCE4ru24fXKuJVgZGxOxMXsvqFwuh0hgX7/5O21T17dGo4GNjY2wbpw5cwalUgmHh4c4PDzEfD5Hr9fD9vY2SqUSxuNxuK+auuGd24zW5hxaqVTQaDRQrVbxyiuvoN/vh3Gjay31pL+nabqWpv1Okeo0Bmw5IOprqq9puq7r/OrtxebNLEAwBni5XGJrMpB9Z6vun5wvlYWDew6ax/YByo/Pfw6C6oE9/d73TFntZsku9ox/64EQ/Zl1KEr5oG3HQGjVaxYfsecul6x3fthSedT9XsymqQvfy2cBqLRfb0flGdvn+Z6Y73lQxcFc6kPtJHYoUduJ2XSsbznllFNOOeWUU04AjkHh5iaw/Thw9el7zU1Ot6EmEhTe5v3Bv4Ap+u9iQPiRR74Sv+/3/QD+tX/tu275P+5JtFze+f9/55RTTjndKXrgAWHgpoPegTV1HvGZOypjDnB3WHkkqjqH3Emqzxnp5yBVzFkXc6SSR40aiDmAFBRzAFbbjYHdXo8CMe7wz4pc87R7Dho7yENSJ6i25Y7H2CLsQEQMVFS9UobucFX+Yk5Xbdsj31yfKsOYI04Be3f4qm06yFSv10OEMG3i8PAQALC3txdA2E6nEwAzgglMfTudTrFYLEK0W6vVQrVaxcHBQUg/7X3XSFaCRXyngBXltlgsQrQo+azVatjc3MRyucSNGzduuf+SdunOY33uDn8H1lXvOmZ97DhlgfZ8F4usUluJObPVLmKUZSvuHNe7V5fLJba3t3HmzJmQgpagJe+0JfjFqPEkSUIKW9bN+5/1MMdyuQygMB3VGxsbWK1WuHjxYrAdymR/fx/tdhsf/ehHsbu7i+vXr6/Zq49jAszuIPeo0hgIoZGzlUoFnU4Hi8UipH+mfWpqXbZFYDdNj9Ov653ClJ1Gu/MQQ7lcDvfOjsdj1Gq1cDcz66OsFXxnXxlZygMWFy9eDPftOpDm9sRxFQPi/ICLrklJcpy2mHcrJ0myFmWuMudaCWAt7TH/pg2QtB7yzn77ONO2dP4/jTtv3wwVCgXU6/W16GAAt6Rh1TFHuTebzXAPc6PRQLfbxXg8xng8xmKxQKPRQLvdDpHk0+k01MFU2oVCIdxbrFH3GxsbaDabWC6XuHLlCmazWeBJ19DVarWmF+ozC8x8M5Q1T8VA2RjY6Gt0DJj173UvEZvLlXxOjQGxLKfrgMowC9DLOoymthvjJ7ZOxEC+2F7TD7ll9Zt8aP/876zvXC7+t8/NDlKqLrU+3+tqfS57bdP7eLu1UNv1fafzEtsvxdr072L99nZ8T5/Vpyx+sgBq77Pzzjb8sGJsjo19r21n9TfGS0455ZRTTjnl9C6mpACcfxK49ltAml8rQZovgdHs/gEAEwC/D823VUeKFPt49+q4VmviT/2pv4UnnvhX7jUrOeWUU053ld4VgDCdqBpNRWeIRqepc8uBvCyAic8dvFAwjOXVgeeRyGxTHV4EIVivR2IpSMI2YymVHbByhxCfKx90/LNN5VdBI+XZ5eXP1AGskWke7eCgmz53R506yZiqkzxpvR4J7H3mc0/PSVKnp+pEZREDqL0elwvfx6JtlC/9W/twdHSE0Wi0dn9lsVgM95ky3TCjGFut1prNLxaLEMXGtLoEmBuNBlar4/tEh8NhAMv0rkp3JirISsCF/GrUu/arVqthe3sbR0dH2N3dvWWsqb5U1mrTMf3w9xjYoE5w1S9lo+M5VlcWf6qzrPGa5QCnPhmty34xrbM77AmyJ8nx/cGNRgPz+RzD4RCr1SrcHU3dM2KWKZEZ6V2tVsPhF/ad8lCQjCmoq9VquGe6Wq2iWq2GdMu7u7soFAo4d+4cPvShD+GXfumXgs1wrLizmm1pmzpna2Sx2prW0Wg0UKvV1iIOCXASFKf8CJSrXeghDJZZrY7v2fWos1KpFGTAaOSjoyNMp9MANlLuvK+YIDV/T5Lj+5i3t7fx6quvhlTDsfmBNkMZcM5wMD0GDjCTxMWLF9FqtVAul8M9v+yzRh6yjwQ0aRssx3GsOuKcSftlSnGd79W+dQxlRbDdSWKUuJNHq9JWefCgUqmg2+2iUqkEYJhzLVONb25uotfrIU1THB4eYjgcIkmSkK6c0fjdbhfVahUAQtR2vV7HarXCzs4OdnZ2cHR0dEsmER4o0Mh/HhR4M6RzoYOVMaKOYgfdYt/H6nOwyteBmB2cxJevAc6fP/d1Ias/undwnmN9jgHasXU7C6zz9vncDyvpOqLPXAYxirXj+z/XY2wfpu3o/ge4FbDUerTerMhi5SOrHuVB11m3Be+P6ywGxLtcfQ8Zk5vrV+dj7WcW737Qw2WmB3tifGp9uj/XNSJ2YCEm67s9D+eUU0455ZRTTm+SNh++u+3VO0BrGxhcv7vt3sf04vUlPv/8/ZVGu/E2o4OXAH4a49Nh5h1IX/M13473vvdj95qNnHLKKae7Tu8aQDjm3PHIVQWJHITS79yx52nxsgAp/UnHHh3rsbTLwDp4qg4vjRSj08ejABTcdIcT66MjyJ15Gk2nTiQHvsmnghmxdgikuPPKZaUORrajALeCYfqe7ei3lJ3rL8thp8+dT8rXQRiNFFUdqqOS5VS2sZTebiPeJ00PqmUmk0m4p5QAGgDMZjMcHh4GkKrVaoW0z4z+I8hL4IrPAeDs2bOoVCo4f/48FosFrl27FlJIL5dLNJvNtbGl+os5eZliV6M2+a5araLX62G5XOLw8DATFKac1GGv+tIDETGnvY9vBwr4TL9Xm/Ox507rk4CQk8roc8owFplGvjQikOmSy+VyiPhm+tharRaA4HK5jF6vh9VqFXRZq9UCQEnw9+DgYA2cLZVKIcXueDwOEd68C7derwdbmk6nODg4QL1ex6OPPorr16/jmWeeCXeh6h2/7qz3OZqy4E/OUyxLoLtUKqHT6QQQvFKprEUPE/xttVoBJO73+zg6OgqR9cDNO5oHg8Havb8EotM0DQcnOHdz7MzncwAIBzNYt0aFzmYztFotpGka9MEUxJPJZA3wYXucdwhgevpt2oqnbufBguVyiXa7jTNnzoSoWGYDcICZsiwWiyFFdKFQwHA4xHw+DynFCVQCCAcMVD8aIRwDTHTcKBB/N4iAvEaLcjx7hB3HGXA87zSbTXQ6HVSr1SCf+XyO8XiMcrmMVquFZrOJ1er4ruB+v4/FYoFut4tisRjSljPCuF6vYz6fh/T+tNuXX345AMzUux6KmM/nt4Bbb1aGvu46+dqnz/U7B/fcfl2eMdDR91p++MttyW0otmb689gez+Whc1BWXb6fyJIlyzpv3mdd/0+qy/n0fVmM/HvfS+r6q/Ln79pG7ACY68PXuRjP+reX1TKut9gz33Moz7H+aR0xgFTJbZB8exsxiskoJrNYHdqG2qnrKTa3AuupuGOH5mL7Mv6eU0455ZRTTjnd51RtAbfZ/50qFctA71IOCAul6fG/+4XOo4iLeGP33Z5Edzdf1/1DhUIRX/d133nL/+/eCKVpiuee+5U7wFVOOeWU092hBx4QTpJk7Z4+j/xzxwp/0nlCh7ADSuqMjzmXHDAiH2xbnTEagaVOL4IfGnHp6YQVpPS+ZDkSlT+NiFIHlDuBCeQp8KykDinttzoZFUTVb9yZnOXEdTl73QRw1FHIciof5dGdfQRXPPIt5qDmcwcSVN5uO6pvBR49MtVBM9ejym21WqHf7weQScHl1ermHcHVahXdbjcAh7QpgmkEdJhWuNVqhRTTBDra7TaGw+Ha3bCu+9j9wuSF96MqkM5+1+t19Ho9LBaLcMepkzq5Xd4nOTgdgFZZxnTmznR34ruDX39XW1Fbf6NOV9qDjtVSqRSARdbLQwWNRgMXL15EsVgMZYbDYYj41ju/p9Mp0jQN+uv3++h2u6jX62t9Y1Qtdbi3txfmUYJfvMOYeuX7w8NDDAYDdLtdPPHEEzg4OMDVq1ejsncnNXUFYA30JJAL3LSdSqWCSqWCarUaUu0q6OnzS71eD306OjoKd/rqfKaHaJihgSmkS6VSAO0Gg0EABZMkCVGnlUoF8/k8Gt0HIETkA0C73cZ8Pke73Ua5XF4DnnUuJOCq79xuFbhWkDhJju+53djYCPIkgO1XFgDHh0gWiwUmkwmWy2UAvSuVSgAkNcMG51wC0TyMQNDY5/ZKpRKyOOgBl7tFCl673emaTluj/tM0xcbGBtrtdrDzQqEQ3nU6HbRarZCxgXNjvV5HpVLBZDLBZDIJaabb7XY41MCDFATwmS7aI/dXq1UY05Q/x/Fp0UkgYwzA8/1QbJ7T/QVlSnL9nwSU+d9+iCprLfDv/F2W/TmoGAMZvU1g/RCLt+u/x/aMDoryd4/0jPVX9aAyjh0s5Le+lmr/VT4xWejeJwbKaj2+Trrs/Xfdk2Xtw3yP53L3esmn7m9dXjG7ie0Z3Ba8nM7jMf5UVto3PTDoPHqbeugxdohT/7/ge2rtQ0455ZRTTjnllFOUNh4Crvw6sHq3Qob3N11EEQ+9TUD4ECuM36Upox977EP48Ie/6S1+neK3fuufnyo/OeWUU053kx54QNidb+oEUUcrnzsIqyAo69MoEjq11RmjkWx+b51HjTJCi06vQqGw5vBV55ZGlboT0B3vyqs735RvAg763h1cdH7HokS03/pMHW7qGIs5gMm3tpflKFUwwnlwxyXbVZ0q6K48e/SKO2fVfhxMd8dlzOHszje1B63b23JAMRbRCtwEmph+VPlM0xS7u7s4OjpCp9PB448/HtLZMrKRMmJK2fl8jtFoFMCR5XKJbreLp556CovFAnt7e5hOp6hWqwEQ0hTj5F9Ts6rNEljTsVSpVFCv17GxsbGWetYp5sQ8ydnsTtqY/PRdDCzQb3RMug1kAQ1Z7cYoZsecEzhfULZpmuLs2bNoNpsBVFJAnqDmarUKoBR1woMBBJoAhIhhRjISzGK9jK4kjxq5qIdFqNt6vY4PfvCDIe24goE65/F31gfcvLdVbV/BFgLCnU4HnU4H9XodjUYjlCdITX50/mD6ZAK5eriB4Cfvu9b+6V3K5Jl1cK7nndu0h2q1GoA/2nu/30ej0Qg8EBB2cMUjMFVelJHOx5S/jqn3vOc96PV6AcAcDofhzmONsqYdMAJVU2DTvphmnPIlWK/rJOcU5VkPZPj8frcACQV6nfQggEY7z+fzcLf6hQsXgs60X7VaDcViMYC1HCs8MEB7OnfuXDiEUKlUMBgMQgpp6vvVV1/FcDgM/Oj40jvfKTP9/a2Qzo1Z66jaV9acFlu/Yge8YsCb1qvvde11nnUN517O18aYXJxH5S9WzvcxWfwo+X5AATpvL0u2Ks+sPrlsYyAsy+m+M6YD173Pu7F9S4y/k+Sh707iObaW+vssuTkIr9/G5ky1oZP2EFqn2jX16yC0/l8j9lxl4vzH7F6f81vOEbqH0n7qwRcHzlmWh1tyyimnnHLKKaecotTaPo5Mnhzea05yilDtbaaLBoDfwAIvvEtjhD/60W9Bo9G512zklFNOOd0TeuABYb1rTx1bdLICt0YRK0CszhZ1rCnQCsTT87kziOXoEHLHDfliPWxP7270qFItS3IHrIN0Clirg88dVHyvDn++Vz4UKM5y/NLpFHPmadsK4Lh8syJQlDw6Qh3T2jfvpwNO7kR1x7A69tThpvWq403LKUCldhbrQxYATH6Vr/F4jGq1GlLjUp6U6cHBAb7whS+g2+3i0UcfRZqmGAwGIW0uQUECO5rytN1uAwAuXrwIAPiN3/iN8N4drQr0ua2pTNyJmSTH9wkDCAAIwSXvuztVFVBU+ccc5jGH+EltaF9U9rE6Y/avbb0R8IZRmNovgkwOmPIe2mKxiPF4jCS5mZqbemfUJnVFYJfpfglwTadTtNvttT6wPUbeMhpX5T0YDII8OEfxgEKhUMDW1hbe85734Nlnn11Lda32wjt2OSczG4I76x3Y0HFKMDtN07VIdI1eJtBbLpcDkMd06TzcwEMR1Wo1AL8sR34Y+an3tlN3w+EQzWYz6Ix3w5IfzqcEnNmuHijxPqid0zY08t7XMOp8e3sbDz/8cAAyh8MhptNpSDPP/qnNsl2C5LzrdjqdYjqdhvutkyQJB0G0zel0GurJWrt8Xr7TlCQ3gXu1H+dJ10j2BwC2trawvb0dosDZZ8phsVhgNpthtTpOLa2pyNnXTqeDWq2GTqcT7HQ0GgUbmU6nuHr1apgHFZSi7eo6qgfV3iqdtB763ywTAx2z1uOsvYn+9P0Mye3S+fV2dX7W9/pT913Oh36r5Vw2sf4p8OZrAXlTXh2cdZ5j4KSvP07aRoxfXy99T5UlXy2vctM6XS6+h4zVrQcpvYzOhd4/5Ssmt6xnWfbBQ4MuJ9e/zxH6/Ha8kU6So4+7LDlzTda5wGWtfdM1Ug9Iug3drbk4p5xyyimnnHJ6B1GSAO2zOSB8n9K/jQbefLLjnACgWCzhqad+R6Y/MKeccsrpQacHHhDWyBH+o3OVpMAVgLXUpJ6O0R2iBE2yHItazqOk6Nznd3Tm03Gj4I87+RQo0agwdfRoBDL7qeCbOgTVqcmy7EcM/FInmztZ3YHrzsmYA1Gdnu7UUrm401jbVweYO+f4jg4xd8Bpm34AQGWqOlTZeOSyfhdzGKrc/b068Nx+VC7uQGQKYKaOdudfoVDA9evX8au/+qvodrsB8CoWi2i32xiNRmsgD3Ac7djv93H58mV0Oh2Uy2U8/vjjKBaLePrpp3FwcBBAPgJAjDp1W1HQaz6fr41D8st6mAJ4b2/vlggWtUW1MXf8+pjh34zydN273bmzXvuj+vL2HHxQmziJVE/q/PWxp5Gk7XYbW1tbSNM0pAFOkgTj8RjL5RLVajVERnY6Hcxms7V0tIz+TdMU4/EY0+k0pD1m2uXZbIZC4ThzAVMsL5fLENHNgwQEsgnmjkYjLBYLVKtVXLhwAcPhEK+99totQBb7yLlWwWw9GEK7YhnaN++sbTQat+iatkm+GaXMPlerVYzH42CLzWYTwPG9zEyTTv5qtRpqtVpIpUw7YKQ8qd1uB7BYbajZbAZQnoBho9EIKanVhnxu8dTOOg5iQBH7fe7cOWxvb4eDFuPxGIPBYC1ldJIcHwZJkuPDBNVqFaPRCLPZDKVSCePxOPxNvRMs1gwXaZquAcLkSecC1fcbGROnRbRLn5P4LnbIiDZRqVRw+fLlkG6ffZ3NZuE+Zh4MoO4Ycc19xXK5XItYVzlQbq+//jr6/f5aenRdh5jOWw9UnCbFgCUFwGLrNssA2YBlbK8Ra9Pf+74hNj/HgEStm2V03fcDcmqLul57+9qug3b853bkfYmBjLE2fL+g40TLxvajsWdOsfVZy6kslJ/Yfs7lqBTbX92uH3poxrPSxOqM8e82qW3EDqLE1vas/YPPH6w7xouWvZ38tLyD1zEZqy07gM61k+V8bPmeMqa7nHLKKaeccsrpPqJSFeicv/vtJgWg0bv77eb0hqiGBMkpRAm/G6lUquLy5Q/cazZyyimnnO4ZPfCAMO9KVccWgDWHvkf9EtTKcsZ41DBwM4qH4IsSHTcKHGoEMVOWalsObLozE1h3KLMfdDirA88jZWMOLfbbU5CybY+81L7xp/ZL23HHl0aMulPPnfIKjCpP2qbeu8syLictr0409s+d3ic5Zd2Wspydsf6pLk+KkFNeT3JMOjHVc6fTWQOSCBIDwMsvv4ynn34aH/nIR8JdsK1WC+12O4CFBGQZSXj9+nU0Go0AIl+8eBGFQgEvvvgirl69GoAhBTg0va7efx1zbBLkpJ3V6/Vwt+ZwOLylr7dzPsfkk+Wkdz062OuAhrendThvWc7wLGI7et+4Ood9PLfbbdRqNSwWC8zn85Bme7lchhTSOh9VKpUQ9chUtqPRKEQ9MvqTaYMJ8nJcE0jm3al6L+3R0RHOnTu3FnlMMLFer+PcuXPo9/vY29tb669H/SoQ4AA5/2YZjXSjvGgzSZKE/tIWGeVarVYDKFosFjEajQLPlUpl7ZAQ79FlxDrTcDPalKA7ZaMRouwf66nVahiPx6jX66hWq+Gf2gp1TGDc7c3nQ40M1sjqcrmMCxcuoNlsIkmOQd/9/X0cHh5isVisgZPUJQFfHhQoFAoYj8dhbSFg7ncJq95oXw6ysA1de2ORjneCaMO+Buo87gepOCedPXsWly5dQq1WC31cLpdrhya0T6yDY0bHggIwjDivVCrY3d3FK6+8gvl8HqKPae+0U5WrAsNvl7LAPO2HliXF9gGx+mL7Bie1I21HdaRzqdep8zDHrvIR21v4euHR4llrDHBzD6jAsbdzEhgY21v4oTrfs6k8svYEMdkrz7E1znnOWmsdlM7SRYzv2F4wpk99l7WmKp+633TdUp46rrUOltODO5xPYzL3706aS5zvk2TEv50/txWVgR4WdPnE7NYPWmp0dqz9nHLKKaeccsrpPqOkAJSrty93J6i5ddx+mu8V7idqIcEHUH7b9XwWs1Pg5p1HTz751Th79pF7zUZOOeWU0z2jBx4QdseRRpnGHEQeGeKOI4IkfO8ObQdDlQ+NAstKR0hHWMxZpg7L2H3C6hxTkIuOcO231u3RIvxG70dWXjX61Z2YCq5n9ctl7pEg7JtGQqlTT2WjvLljn21pVK+Tg0nAzbTVWo+mr3X+tW4HmbUNyiDGpzoU1dkc65cfRnDH92g0CiCVOvqYpnQ+n+Ppp5/GhQsXcP78eTQaDYxGIzSbzVDvZDIJYAYBon6/HyIDm80mer0eHn/8cVQqlQBmEIhiNJympFUZsI96uIJUKNy8H7bVagVgOqY7tdcsmbiuKMMs4MJtIzaWYzz4+9vxFOuPzh0cBz5+WU+5XMaZM2cC6EmQqFqthohEynE0GoWDAizPwyt6jyx/6j2xlUolHATgXbfkiferHh0dYTweYzweB5CYQDTvSd3c3MTDDz+M4XAYeI3NzTrHsA4e7NEUxNqGHjpg5PJoNAo2yZ+sg+1QDu12G/V6HeVyOQDkGvXZaDRQr9fXxiAPX5Bms1n4m+NOD2UwWlrnTQLJtB+PjGN/ybPOfzrvK5HvTqeD8+fPh9TYBwcHODw8DOA97xunHDm+lWeORbUnRhPrPcqqN9oHAW2f53hA5W4BwpyPdH7V8arzEvnkeKrX63jsscfQarWCzAkWU1YqC+qD/af8+v0+jo6OQur1wWAQUq0PBgNcv3493NlMHsgnQXbagaZdPw2KzUsOSGUBb1nfsg8xoNFtV5/zO/3bwTN/p3shbVfnUh/7SjG+vA0/DKbfxsBCrc8BXC2r5WPy072WPtMDQ7F3atPalrbne8zY+qf/aNOxNVNl7n2KAcExOfF3XTfTNF1Lz35SW9of3TP5XozPdY/le/0YXzHb0D56n7N05d+yTV3/VA6+v8z6nsTDR1kycr79/xQ55ZRTTjnllFNOa9TYAApF4CgHhO8naiDBE6fgzv8XuPWKtncD1WpNlEpvHVAfjwcYjQ5Oj6Gccsopp7tMDzwgzKhIBw7d+eMOJwfm3DHjjjQHNLQd/adO/tVqFYAOlndnENuIOSHVEc9v1Amp5fQOzZijVZ1+6gB1gFPBWjq7Yo4z/p4Fosb6y2eMjtO0m9pvrT8GjJwEwLmstZzqRetz8Fn1EgN1Y22rLegz/lRHHwEGBcmzAAzvH3AcvUewgVGgagfFYhGHh4f44he/iF6vh42NjQDklMvlEEHIe4MrlQpqtVpIAUwHJ+9hfeihh5CmKV5++eXwngAd5aDgBiPvCEy6ndOJWy6X0Wg0kKbpLfcJu43HnPxZzm5/7np1vaudqU17Onq3L/7tY07bcqL9qw066MY6ms0mzp8/jyRJQtpkOs+pZ6ZKphxJi8UCGxsbAWBaLBYYDAYhTTLlXSwWA5jaaDSwXC5DavFutxvaJfDM8cp0w6yL9xtvbm6i2+1id3d3bc6ibPwwCaMiHSAgYLtcLkMqXbZXq9UCyDqfzwMQq/cFM7KTYHa5XEa9Xg9tEsBVIC5JkhBZTD6YHrlWq4Xn1WoVw+EwHLLgGCKwx7mYdfI+YrU1jhEePvL1ye2Saw/bSJIEFy9eDOmij46OcHh4iIODA0wmkzWAB0DQN/VLoLpUKqFer4fn7Dd1UK1WUalU1tJ+65hSYJjvyL9mLbhTlCTJWqpmn7t93eQ8yIMFjz32GC5cuBBsi5Hz/Jt6Y/2c42i3GuHdbrdRrVYxmUywv7+PND1O0354eIidnZ1wmIMy4lqrc2aapmtz5mmQH4zzA2C+/rCcz7u+h/B5U+fC282DDnDdbs520NXHSwys09+zQDbfd50ETMd++p7FZej8U0a+rjg/sf0GsL5Hydo3On+xsln65jcx+bicYu3G7EXfxdpRwF/3e647t7WYnFzu3ldfx2NRwCoz5SO2l9b1LWvP4ntY5cH3Dm7TPo8pAM35TOc3PVjG/nHNjukyp5xyyimnnHLK6X6j8Sz7SpI7TaPZCqf437C3RU+ijFqeLvot09d//b/ztr5//fXn8corz5wSNznllFNOd58eeEBYnTTqqARuBQcVEPKIPI1MI+BFh4s7ufhTnU5+2t/TavIdwQJPY+xl9W5RdSLFnEwEGEgxBxhw8y7F2AZL2wVu3q+ojiR3RsYcjU4eAaP1xP52B6s7VL1OBV1jTsEsx3Os7+oUjEUdOyjpDsTYO32vdqj8a5+djyxdTqfTtQg+3ntKcGY+n+O5557DmTNn8KEPfQitVguz2SwAHml6DGwpsDGdTjGbzdButzGdTgPwlqYpzpw5g/F4jKtXrwa7YKSg8u7pGQkIaf/p1NTIyclkcgsQcjvbcueuyjHL+ey2FtOtgl16YMSd+O6M9TpjpOCvgqP8jlGJ5XIZW1tba+mO0zQN4C7LMdUxgABYsv7pdBpAX6av5SEV2gKjysm7RhATMGUqXHU683vyUa1WQ+TS1tYWBoNBsA+d69iOzoPa/2KxGNJb8z35UB1TR9PpNNx9vFgs0O/3kaZpSN9cLpcxn88D+MnfGVXL9M4EQVl/rVZDpVIJfT46OkK/3w8gIfvAiNrJZBJ0Wq/XkSTHoCLBZ4LpBIz9EIwCC3oQhOOZ9kyAvFqt4vHHH8fm5iaSJMHe3h6uXbuGwWAQ6uDd0OS1XC4HeTKVNfvANNwAcObMGbTb7ZAaXFNb+1pKnjXNuY6HOw0Ikz+Vpc8bOq9SB4VCAefOncOlS5dQr9cDv4yS13VQ10YF/RXQajQaqNVqQY6r1XGq9sPDQ1y9ehWz2SwcMNE9BccybYVg9ZulLFAyq5zukWIAmh9icn3H1iuVd9Y6q/sZLRerw59ngWf6TWxN8Pb1MJyuFd4uyUFiko5hl6/LMqtfCupl1RHrR4x0b+jriu5PWUYBSV3TsvSiz7L0pW3R1mP6832evo/tp1Q2yr/LyPdPsch377O3p3W73FwmWp/OkaznJDvXPUVMvmqfulfQNYnt+cEr/am85JRTTjnllFNOOd3v9NP/fIIf+L1d1Cp3t900TfH/+ewEi/skqcqHUUEDd+f6pQeRms3e2/o+zVOo55RTTu9weuABYYJL6gzyO8LcoUuiw8qjZt3hwmdal5bTMu50SZIkgDIaxcS29C5NdeQpeKbOOy3rgKOWU/nEHFPsvwOWMQextumyVycvQUL2W6OqWA9w825klbfL2dtVHh3Acv5iTk13DKqsYykHnRflKebkc51rv9WeTnLakffY+yRZT/mXpsfRZwTPNF0tbW06neI3f/M3Q+ro4XCIwWAQoklHo1EAI5bLJYbDYbhHk/eeMkJuPB5jc3MT0+kUh4eHWK1WAUBzZzblSuBFnasaCceypVIJzWZz7Y5clzl/+h3a+s/BddWF1+W/q/Na64gBELE6/LBAjNwm9HdGf1J/tVoNZ8+eDbxxPOmdwZPJJICTs9ksgIC1Wg0Awj27vEd6Op0iSZIQ+TmZTELq8Gq1upZtgQCm8seoWr1rlVG07XY76L3T6YT7doGbEWB0mGtklc/HnpqXqYfH4/HaIR2m9CUP1NV0OsVisUCj0Qj8TqdTNJvNkBa41WqFMTCbzVCv1wPoOpvN0Gw2Q6TweDwO9zUrb5PJJPRH78OmfAg8E3Al6Kw2z9TA7vjnYRy925k2xij6S5cu4b3vfS/q9TomkwkODg5CdLRGbnNMcG6g3Nrt9trdt4eHh2v3BlOGWXwq0ESedTxoKuk7BUZwrFA+emUDSdca9j1JEvR6PZw9ezbcxV4oFMIBAp1fFLwnkEvd8F+pVAr2zujs6XSK3d1d7O3thYh7PRxDXbjc3qqcYmsQn/v85+shy/sa6/OgA3wua11bnQetw3mK8e08+T7C5/XYniU2Z/v6qv3PAqq1jO7BnN8YH8CthxaVpyxZxtahmG34GqU/Y4fx9Lus+pQHB0+z1ttY/2N7MD1s5ftz35+5LvSZyja278taa30P5napfOs8p/3Sg5E6H/Ab14UC/ln7D21XbUXb4dzltqR7d/Kn5V0eOeWUU0455ZRTTvczffnaAv/06Sn+9Q/X72q7X3p1gb//y6PbF7wLVATwu3F3+/8gUaPRwdbWxbf8/Wq1wqc//f/CanWfnA7IKaeccnoL9MADwsDNE/J6917Mkcnn/AZAiAgm8XdGpLnDiXX4P70P1J1YMcBZHc16h5oDJR6d4pG2MQdmzAHoQGrMIeo8Uz4xUsecOpHVmccIQXd8KS/KjzqpY0A4efP2vZ4Y/9Sz8+wOU3X6xRyH7kCMAYEx51+sHe2XRo359zGnJPs0HA7XIlMUpFgul7hx4waefvppbG5uotlsYjKZYD6fYz6fYzAYBOBH7wUdDAZrdTQaDbRarSBzRsG5/PkN++p3VPN7B4UJphCw4djzvscAAh8DbicxPTigRdm589/twYEBrf+Ngl4x56yCWml6HN3aaDTQaDQCbyxXLBZDCuXZbIbxeIxOp4N6vb52jy4jVpkOmBGitOtKpRLA1nq9jkajEeSp9/WyTLvdRrFYDIBXrVYLd7Ay0phAdZIkaDQaGI/HwaYU5FQ9EryMyZ5AHVOkL5dL1Ov1tTTOet+t6qrZbKJcLmOxWGB7exudTgebm5totVohDTJ50/u4GX2rd/ryLmGCy/1+H9VqFYeHhxgMBpjNZkFX0+kUvV4PAMLhiyS5CQaq054/fY3heNbIYOBmauF2u40PfehDOH/+PNI0xf7+PiaTydqBAuqCNpWmN1MRz2Yz7O3todFooNfrhX4BCNGyfE9gmf/c7nkwRNdYnSNja9Fpkaat9/WLNkWZUJdpenxf9JkzZ9DpdMLhB94vTXvTyHvqyecMjUKnfKmnnZ0d7O7uhoht1qvyUR4p29O851PnTP4dA/B0DtT+kkedw2OgHClWt67nLKPvT1rHbwc2Kv/k0+dWn1NibfLvmJwcbCN5VK+3oT9PAgGBm3vOrP1E1rqW1Uf9zvdLvk75flL1FBu/Kv+YLvxvla3alP6u63kM8PS6Xb+xfZ/yoRkqWL/uG7S/LB/b7+lYcH5cFspDzA5Yn/Pgc1isrqyIZO2HyzEHg3PKKaeccsopp3cKzRbAj/7MAF//gRqq5buzhxnPVvjLP93HC9fvDwDwPSjhK3FnM209yLSxcQ4PP/zUW/o2TVNcvfpl/PzP/51T5iqnnHLK6e7SAw8IO3imIKI72um8Zjl1eqlTiQ4hBxDVwZIFMrvDScFf8qTfqgOLQJlGOGt92jfy5BErJC+r/dQ+xZxOMcAsRgR63Gkb48EddQ6uOWio37Mtd1a6c9mdzzHw3J1o6ux1R6b+rvypXF3OWkbl6W3EHOFqF8qz2oLWAQCz2SxEgvJuUbe7Z599FpcuXcKjjz6KXq+Hfr8P4DidK8EQRpYyje50OkWn0wn19Xq9NXBwOBxmplfXcUO7JUCs/eF4XK2O0/A2m00sl8tw/6ZSFjjgjlhvV+uJOfF1jPk40/pdL24vWt9JRL24k9bnDEZnan0EnBjVzShuAnKatjhJkgD0EixUAK3VagWAt9VqBYBX+eJBAY4b/isUCgFA01T72j/trzqxVXcqa79rnQCq3nubpilarRYAhLS8jIoFjsdCuVxGu90OfZpOpyEFMu/yZTQ1cOz8JyDM9Ohsk1HThUJhbSxsbm7i/PnzODw8xOuvv47d3d0ApM5mMwAIUdqVSgWTySTwq5GzlIWC4mprCnDxXaVSwRNPPIHHH38cpVIJ+/v7ODw8XIve5Hgj2M008X53+3w+D9HN2iYBUR42IXBK3cYil3298/Fxu3HxZom2rJk33MYcyOF80+120Wq10Ov10G63w+GA1epmOnW1Edo4ZQoc3+/NQxIEcjlWDg8Psbu7u5a+3IE53Sv4HuU06CQA0d/7WqakQLDyqzr3uVn7qX+fxEtsD6F7Mn8Xaye2Pnq/suQSs9XY/iKrL86rjmV95wCm7ldO4tvrzIr61fZPWqeyePH5hu0pP74/c11nrc1q386TjgFv1/etJ7Wtdesao2Vi+2Df9/ohAD9Q6Xtut3WdizlefKyfZNfKM+cm3x+6PHQO5zMF3rPGX0455ZRTTu8OSn77X54ENadbaDYE7rP0uD//G1P8h//Pffypf6ONh8+UMF+s7/dmyxS/9PTsLad3Ptcr4COPVkJdP/DfHeB/+MXx22X71OjrUMXmKaWLfvzBhwROlZbLBX78x78fBwfX7jUrOeWUU05vix742V9TqGq0b8zZ4g5MdxS5U0yfu3NeHVuM/ImBlDHwN+bc8vfA+t1g6oDVchp5xDqyHIyxyIeYPMk3v1eAz6PAFGB1x2IMZEuSZC2VHcEmd8ipjN25r/pRR5fLX/lQ/ao+XBbKp/eB9eg9ufqNylydgkpZzkvWE4sOvh2YMplMUCqV0Gq11g48UK7j8Rhf+tKXsLGxgW63G1IzM8JSQX2NqBuPx6HMbDbDxsYG0jTF9evXsbOzE+TINnkHpspWgXwFDYGbEaCUP4HG6XSK8Ti+IXe9uONV5ablFMiIOedVvwrWZNWj+vNIptvpS+3Qnbxsv9VqhbtoCTQRsCIg3Gw2AxgMIESydjqdtcjOSqUSZD8ajVCv19Fut29xOOs4ZOpjRo8mSRIihn0s8O7pra2tcE8tx4j2TcHQLFlSPj7O9/f3cePGDZw/fz4AvcVicS1lcqVSQavVCumueVcwbXgwGKDdboeIadr9bDYLz/SuX00hDCDcA0uwOUmO7xq+cOFCkNNkMsF0OkW1WsXm5iba7Tb+5b/8l9jb2wt2pvJT+1O70HleI0jPnDmDp556Cs1mE8PhEHt7e8GOFLQnwM704AQ45/M5er0eRqPR2mEQjZLWCP7ZbBbA+HK5HO5WJrCs8w3Hu9rknaBCoRD0wvXfx7D2BbgJ6DQaDWxtbeH8+fPY2NgI9kLZT6fTkPpb1xhGEgMIcy3vYOfd3Yy8fuGFF3D9+nUACONF7ZtrNnknCK/r+GmQr39APGqTY1/fK78OvPn+SNvyvxWo8rVYyzlIF4t+jB2QSNP4VQy+94j1h+TRz9qHrP1gbO+kco3J4aQ1JLafcD3E5gpvI8ZXTC/OVww0dH1RTtRV7OCgH5J0HmI8a1t8ppHyvufks5jdaD9jwK/v81gX9z2+f43JWev1/mZFVKvcfBy5zXJPrFHE5MP3KbE9rkdEk04z+0BOOeWUU07vLEoA/N7qWZwtVPA3JlewxOke1MzpHU79q8B9lhr3aAX83//xEJ/+0hQfeqSCf/YvZ7e8f23vCKu3aMqNaoIzncJaXbdx4dw1KgH4djSQ4HQO830L6vivMDiVut4pVK+3o/8vuh0dHS3wUz/1I/i1X/uFO8BVTjnllNPdpQceEFYHjDtRFOTQtMzqCOJPd9Toc22Hzhd1ILljJssBqdF07vhSx5FHgMSiC9x5pG0ryMb2NQV1DDiNgdH6u/MI3HofW8z5rI5ET8Gpso4Bae60Uz27E8yjImKRFA7y3c6xrQCmOyWz+qq2546/mG1QFjFnJ7/11LEx5+d4PA53ClPHdKovl0u88soreO655/BVX/VVaDabGI/HWCwWIY1stVoN6ZobjUaIFE7T4wMPe3t7AIBWq4WHHnoI8/kc169fx2w2w3Q6DdGiGiXsTuaY81aj8BgV2mq1MJ1Oo9FyPoZjDlGWUZvPcpRrfTp3eJte3sfnGyUFyvUAi/Jcr9fDPbx8p2l7CWDxHQEpAmWVSgW1Wg2DwSC0NZ/P1wDkQuE4NTQB1cViEcDDw8NDVKvVcLcsqd/vBwCN5QkqjkajcB8vgOghFQUeyK/bvqfPpl7m8zmeffZZPPHEEyEN9mg0CmnQl8slOp0OgOODCZ1OB61WC+VyeS0Cl5HAbJt6JRBMHXNcUEeLxSJEgTKCmP8YaUv5827eM2fOoN/v48UXX1xLn61yYRuc8zW1vYIsPCTw1FNPYXNzM9z5PRwOgxy4xmma/NlsFu6PZv0AQjQ5wU+m157P5yiVSgEs5WEQHuJhum3aIvWk0X9q07H5+O1SDEjRdUYBztlstrYX2NraCumiNU10khynWedBFK1rsVispVyv1Wohzb0eghmNRnjxxRfx8ssvY7lcrt0ZrHKKzVcE4U+TTlpzdD70SEdd77RsbK2PgWf6XkG2rL2RtqNlnSf9Owby+R7Gv9f1KAsc9La8HpbnWHLAUPuSxY/3Q3nTfrj8Xd76Lkt23j/+HctCo/3P2g8rf7E9mO95YrwrHzE9xsrF5MDfdQ3xQ1YxXcb0ofXF3mt9Ppe53cfsXXmMyTe2l9U9vu85YzwqYO/90nUnp5xyyimndx/93upZ/IXWe1BBgiIS/LeTV/JI4ZzeEfT0q0s8/erpHpoFgPEsxUs37i8QnPQxVPD1qN5rNt7R9IlP/B6USpU3XD5NU+zuXsHf/Jv/IX75l38Ky+X8DnKXU0455XR36IEHhNVJ5OkN3UFDomOWZfmtOgvdyeSOHIJffiemn8JXYETr9WgLdzKSNwUlGVnkTjyVAymW5o+/O4/aJ75new5Ukmcnykid8aw7dn+vOymVB/6tZfm3gg50bJIcXM9yxLpjkTwTpIs5r93O3HHq+mA76hTOAiXV5lw3JzkglZbLJQ4PD9FsNtfug9VotOeffx6PPfYYNjc3Qyphts90uUx5y9S7k8kkgCEEBM+cOYMkOU7z+9prr63pXaNRaRPUEUEkBYYVJKH8S6USKpVKuNeU5LYY+/2kMeF1eaQmKRbxqzLXiHedS7KcyTF+3HmubReLRTQajQAIM32vppDm/c4E8ghCjkYjDIdD1Gq1AFwyZTTr29/fD2Cm6mI6nSJN03BvNKO1W60W5vN5sAumDtcIUabvrVarAcznmNdx4NH57C8BWU1HTCCYgO6rr76KZ555Bh/72MfWIncbjUaIdK9UKuh2u+h2u0jTNAC59XodzWYTq9UKo9EogMhpmgbgnPLlHds8XMF00IzaXiwWQcYEwAmwNhqNAAynaYpnnnkGL774IpLk5j3C7D+wfkiGNqVrCkHo1WqFCxcu4OLFi6hWqxgOh+j3+yGanqC/ji+C/uPxOOiaOl4sFlitVuEwAO+mLhaLqNVq4f7g8XgcUsQTQGXkOudK3jdN0gwKPs+/HaJN8FBDDOjSyEFdk4Djgybb29vo9Xrh0AttcrlcrkUGa+QzKU2PD840m00UCoU1MHg6neLVV1/Fs88+Gw7I6LxIXSpopTo+7buDyW/sub+Plde5zuc1l7mW8T2YztmxfVjsub7TuTcGCMb6lFXeeVE+/dCb2pYedqBMYgfOPBrZD/KpzGKyUJDWy8cOVPjeNFY+BiLG2o7JM2sti+0tff2MRbdmfeP7Qf3dedO9ktst21Og3vtD2bidcL72w5jaJ92r+J5a9wE6vlXGMV2xvD7TA0E6try/umcn+V5debuTWRtyyimnnHK6f+mhQhXf17iMZnK87/0j9Uv4ufkufuvo/kmPm9M9pHQFjPfvNRc5/TaVAPwHaKNxStHB71YqFku37LlPot3dK/hLf+nfwdNP//Id5CqnnHLK6e7SuwIQLhaLwbnvoKpG4wI3nUYEGTTlpDuL6IzRdIrucPYoPwd6yQN/uvOH37lzKeaAjUXYquNRn7OvsahHBT4pP3WkebsuD75Tx2MsKpnfkhcH8GKAmDrC3EHoTnSCUi5DrdMdotqmR33Eoqe1D16/giLaVizamjJSG9NvPEpd23ZZZTlqGa3LCEi2Wa1WMZlMsL+/j1deeSUAwv1+H9VqFfV6PYCHjUYjpIUlyDYej1GtVpEkCcbjMRqNBtrtNs6dO4d+v4/RaBSAEY3S1zEZsxuVQ5qmwSlbqVTC/bWeRlV1EHNyuuM0pk/Vj9pNTK4+L7hus3SRRT6HKLigf49Go/ANIxE1QpXzUqVSQb/fx9HREebzeZiTgJvzDWVbLpdDVGmz2QzleVduuVxGq9XC5uYmut0uKpVKuGN1OByi0WhgPp8HmU6n0zD/tdvtABA78MnyjDLVNOLaR3W6ewaBQqGA8XiML3zhC+j1etje3l5zsjebTdTrdXS7XdRqtQCYUw68G5byOzw8XANHAYR0xwToCApThuSb33Ee4hzE79n/F198EV/4whcCmKr37xJ41HlOgfAkSQLgeHR0hI2NDTz00ENotVqYTCbY29tDv98Paw9B7CQ5vjt6OByGNgjgEvAkaE5gn/8YXd7tdnF0dBTuwJ3P5xgMBiiXy2uAKICgU9cf5+YYIPZWifKlDD0jiK6vBNE5fqvVajgo0Gg0AmCbJEmIouZ4cLCH8zxTpusVFZznDg4O8Pzzzwed+EEx2j2Jc4nfV/x2ydddPvM9hvIRAyh9Pff69XfnPbZ/ie159KcfzvH1W0HArL1D1u/KQwwodJ4djHOeYpGwWQBrTHb+XtchlYn33+Xne4KT5KbrV6ydrL1YTN4xmWhblFGMT69D9aLlXZfeZtZe2fcEekDR+dB1P0t+WXYb4133fz4Ofd/pe5RYeR0bvpfXdUL3odp33bNzXs4pp5xyyundR3+s/hAeKtyMNuwWSvjj9YfwHw2fwzSPE75/6GgODHeB3sW7226aAoMbd7fNnDLpo6jgk6ifWrrodyNVKjU8+eTXvOHyOztX8EM/9PtzMDinnHJ64OiBB4TVyaFOKHf6qJOaz9WBog7kGMikZbxdllFQT53RGvmhZbIcSsqflvM2NQKP4IeW9/SkGvmb5chUntx5FXMWav0qKyD7zjLlO+aY1UjfNE0DCECnmAJdbE91F3OmxaJV9L33xeXvwKI7OhU09AjrmIMzJm93WDpwzm9iID/lTeBOQWFG+C4WC3z5y1/Go48+iq2tLbRaLYzHY0wmkxCJSbCEEcdHR0cYjUaoVqsYjUbY3t4O9Z0/fx5pmuKFF14IAFRMZoxg1TtkKa/FYrE23kqlEmq1Wng3GNx630mW81pJx/FJjvaTwCoHhlRnPk5j48mJIIPWzXHrfdnb2wtRnEmSoNVqIU1vRnAzvXelUgn6qlQqOHfuXJhnmNZ2OBwCACqVCjY2NgAgAGNJkoR7dpn2m3fvzufzkCa3UqmEQwMEgnd2dtBsNrG9vQ0AqNfraDQaODg4WJuPFDhL01sj4dhPpsLOSm9ZKpWwt7eHz33uc/j4xz8egLd6vR5SNvu3BM8ZCUteaJM+RxEEVhvTCHdG1fPAhM4zlPd4PMZwOMQXv/jFAKRyziVQyEjXGNjBuY5/V6tVXLp0CVtbWygUCjg8PMTu7i7m8znOnz8fgG7ywJTeADAYDEJ6aUYKK/BbLpcxn8/RbrfDN2l6M2q6Xq+HQyEE/RuNBoCbd2/6gSqdC9lXB4reDFEmnD+0Po26ZeQwbY02yKwJnU4n2LmmEicYzPK8K5j946EHyo3t8d14PMYLL7wQsiXwjuUY2KV94uEEyv00KQaIxg7HKF8OImatz75PigFp2m5sbj6JZ8rX13I/SMO2ffzEQDsv6313vrysz9uxaEvdM6gMvbyvX8pjFp0k15hOVT++j3B5sbxHler+y/eY2hfyr3up2B5cD4wojx5J7fJjH1RmJ/X5pEN9MXvwiG++UxtTXvwQqPbN947ebmysOYitc5oenvLI7Kw9Jcn3xKd9R3lOOeWUU073P/WSEv7VSu+Wfca3Vc/gf13s42dmN/LbhO8XWh0Bs+Hdb3c+BvL0uPcFnUEBP4ge2sizurwdqlYbuHjxfW+o7NHREv/z//yj+OIXf/EOc5VTTjnldPfpgQeEY4BdDIjzMv63gzrqqCKI4RGeLO8AYMzprc7+LOeUlmM/3FlF/jQ1qILPWiejt7yvWp86u2Igo/KlDk4+c/CCjkN1eLnzOAZoqsNV71OkfLOAW63ToyM8CpWAEZ874KcON42WdueePgOwBlZrm7EUkMqLO0a9XpW1AypZ4CNT4TYajbV6GOl4/fp1vPjiizh37hw6nQ7G4zEGg0GI8qzVaigWi+FOWDoSye/BwQGA4/SrtVoNDz30ECqVCq5cuYIbN25E9e32q05OjUSjHgm+8H5bT7vOelwO6ljVcaFtxxzM7ijnM+cx1p5+90ZJ7YqRPYx+JA2HwxA5SMCeaZALhUJIUTwYDAKwtVwuAyA4Ho9DfZVKBc1mM0T/nj9/Hs1mM6T+1jHMNMkEnGu12hogTHtgdCmBuvl8jlarhUajEVJSKwDKv11utC23fz7T1PyMOL1+/TqeeeYZPPnkk6jVapjNZmt3YBPkZES1AtKcSwiic7xSDwSLFaxjpC2B3Wq1Gg5dNBqNcIihVqshTY/v897Z2cG1a9eCDqrVagBWdO7R9Kbstx4SKBaL2NjYwCOPPIJer4fVahUyATA9NdN5c4weHh5iNpuhUqlgMpkgTdMwltlvgsObm5uYzWYoFApoNpsB9AYQQFN+TzC83W6HejjWfVxo2ngdQ1nzVhaxboK9HnlLOfkhJ01nzQMO29vbIYKcc/NsNlu7S53ZMxRESdPjVNHUIXDzcNh0OsVrr72GL3/5yyH1toI8DgSRFLR+s/PHSeSgIZ8pH1l6cNDXAVmfe33d17odXI3x6PV52djeLquOrL4rKKZrvANnTjHwzvcLsbVd91sngbDKC5C9xmhfXMZaX5YcldcsEJG/K8/a39je+CQ703Zd5i7HNwIGx/YU/Kdp3ylH1WvMzmMyy9onsB2OB+WLbcQy6/ieR9/HSHnV9rwOykb7wm917vG58I3wkFNOOeWU04NHHyq1cL5w612kxSTB/6XxKH510ceV1ewecJbTfUPjA2AxuddcvOupAOA/RhffcAfuDn4MJZxHAVffJRkBPvShb8DGxvk3VPY3fuPT+Af/4MfuMEc55ZRTTveGHnhAGECIDqLzA7jViQTcdLrR4asOEn5P8EGdTg5WuRNQHWZs0yOX1cHjDiV1FsZATXV8uWNPnVta/0lRqic5ivSbGHinYCr5Jx+UncpLHcsus5hTNuawdKeh9z92R7E66Vi3pv4uFG7e1+vOXZed8sx6vD8qe+XTo6HVYedOW+pNn2m0iPbHHc6kxWIR7n1V3bHcfD7HCy+8gK/8yq9Eq9VCq9UK6XEZ4cg+ElikrJiafW9vD9PpFJubm6jX67h8+TK2trZw48YN9Pt99Pt9DIfDtXTaBOXIPwG+JEnWQDt1BjNFbSyyxWWuetU++3hSe+DvsTGgulA96SERvssCfZxi41Z1rODpcDjEdDpFp9MJKbmZ8rdcLuPo6AjT6RTdbhetVgulUgn7+/sYjUZhPiRg2Ov10Ov10G630Wq1AvhFeyDQS/CsVCoFkDBJkhDBq+BKvV7HpUuXQmrm6XQaIlP7/T6Wy+ValKRGVnoUqR62cWCCYLcDEa+99hpKpRIeeuihNYCSIB7v1u33++HQA++k5vyvIGOlUgn/OEZ5HzKji3d3dwMoStuu1+uo1WrhgAS/HY1GmE6nATD36HidC2gP7KdmsahWq3j88cdx9uzZALwTkC8Wi7h69WoAhwn6UncEdOfzOYrF4lokKg8TAMep5pPkZtpt2o/eT7lYLDAej1Gr1UJ0+eHh4Rqwo9G0MXBL58Pb3ZlLO6AtaHTwSWsfZcgxxTnuzJkz2NjYCOnw2W+mxad9EZBnHZRFrVYLd3DzoMFyucRoNMKrr76K/f39W6IT1aZjEYiLxSKA+adBCrT5mq+ycYqBnTrPqQ59TvV6lA/ly7/N4kMBQe+b//Q9hPbXD73FwEjn1X8qnXR46ySwTdtxoI7PvS9eX0ynLg+dH2N7LZe71+961oNzOl69XeUvtk/J0lesDHBrphntX0zWbuP6jcojJhtvJ8ZjTJY6vzm/vq7HDoW4LbgNxmQMYG1PG7NRtW39vw7fZY3bnHLKKaecHlx6vNhANYnP/2cLFfxQ6334k4Pfwk56+tlqcnqH0N7L95qDdz0VAPz7aOGPoHlHUkVfQhFbKL5rAOGHH34yM+Oc0nw+xU/91H+FxSI/FJNTTjk9mPTAA8Ixhwx/qvNEwQx1HsfAnJhjMuuZRngpuXOG7dHJ7hGKWaCSO2iVR5Z3R7SDyP4N5eJ3MKqstG/kg/LWd+5gVYcZeVM+tX53ltOJdlJEqTvrtKw64LTvypsCES4PlSnbVCehvtc+uE04cB6LvNF/WZGmMcd1zOHt3zCFrOqXUbfL5RLXr1/HlStX8IEPfGDNxpgmliAc7/QlmMToyVKpFCJUeR9xs9kMkajNZjPcVdvv9zGdTtfSBdM+FOAhQML+lUolVCoV1Gq10Fasr6pjtyXVB2WvDmi1T7Xtk5zPWrcf/Ig5aZU06lXLUybal+VyicFgEEAsAq96Fy5TNPPu3s3NTQwGgzWgaXt7G9vb2yH6cz6fB+CQ99qm6fF9wEzJzOhfAsc6D3D+qlar4c7VRqMRQDYCsABCal6dE/iNOso57lW2jFTmva2UHcstFgs899xzePXVV4PN8UDDfD4Pd1szApSRyM1mE71eL9yDXa/Xw32y1Wo16J4y0Oj4w8PD8G9/fz+kW5/NZiEiO0mSANYyJbXeKau2qtFt2j+2WalUcP78eVy4cAHL5TJEBlN/7B/t/vDwMKRHppyKxWIAtAl8K7DBSFfes8zn0+k0AP+UBW2EdseU8hy3Ov/qOGLUrc+BDuboPEoZsT79qePE1079V6vV0Ov1sLGxgc3NzXBIhjKfTqchkpzkkXmUWb1eDzaepseHDiaTCXZ3d/HKK69gNpsFIF/5pM3rXoDjW1OOnzZ5xGlsj6M8xkA2n3N17eO3eniM33o9+q3v0/h7DNjTOnxfF2vHDwv43K/9yNqDaRmVpfPg+xC3e637JODP+xLTA5CdLvikw01Zewtfx5wnb0/146BiTKcxe1C9+fh3nSlvnmEg1g/nxWXg677z6LqO7TVjMtdx4AAvgLV1PiYbH0+Ub2zfqAc09GCj8hmLtvb/F+SUU0455fTuoQKAp0rNzPdJkuCry1381c6T+GvjV/CLi4O7xltO9wktpkD/9XvNxbua2kjwf0QTfwkbqOX3Br9tKpUq+Jqv+fY3VPaLX/xF/Nqv/cId5iinnHLK6d7RAw8IawSqO5oIagHrqd9igI5/589iUb/q3NXIWJaPOVxPcohqxKQ7mNQZpc5OrTfm4FLnljpCtU/urNPyMX7ZhtbBdggKqPw0ylVlQseWO5X1mdaljjhGsGl6aid9zt9j6YpV1jFbcp27HmOOZJenR8uwfQXj1dnqevG6syLs0vQY3COgo6Arf47HYzz33HN44okn0Gw2A0jHiEECWkwjnSQJ+v1+AKwInE2nU+zt7WE2mwVwkT87nQ4WiwVef/11XLt2Ldx9S2JUMHkmAEZQihGcBBX9e9WB2o87ff1nDJxX3cYAhZg+Yo7x25HPAUmynkLeo49Ho9EaaKCRo0wBPZ1OcePGDXS73QD28a7Ter2OTqeDVquFQuE4zTTvfF2tjlNR12q1ENXrDm/aBXVQr9fRarUAAI1GYw3o43ej0ShElVM3fghHoyJ1LHI8u4z8sAXHzWKxCIcONMqYwDn5KpfLaLfb2NjYCBHV1Wo12Lj2hQdSdLwQEK1Wq+j1egGs393dxbVr1wIArnrW7zUaXu2I9k0QmHLgnLa5uYn3ve99YVwQ0GekOMHZ6XR6C6igADPl1+l0ACCMMUbfq93rfEM9MTKWWTRoBwp4cLzybwd3YqBYbLwqHwqseFn9W22NkbuFQgGtVgv1eh3NZhObm5tB1mmahjTReq2C6ozPy+UyGo0GarXaGjhD27ty5UpIo6980a51jSOfBNFvFyX9ZsnnO5c36Y2Aay5vf+YHa/ieP33f4fsPrVN58Da9fz53q850LXWdxg7UeT1Z7fta4fXonkpBOJeRyzwm99gz32tk8euAYEy++sz3wkpZ49T7621k9SG2L3I+3S5i/Y7JkPxrHd5vtz/fO/gezNef2J6ZMlQevb3YHu52Y837HivnNqC/+x6Wfc4jhHPKKaec3l2UANF00WtlkgT/SrmLH2038OeGz+KfzPfuDnM5xWk+BtIUOGE//LYpTQGkx2DwwWvApH/n2srpRCoD+H9gC59CHeUcDD4VeuSRr8Djj3/4tuWWywV++qf/Cubz6V3gKqeccsrp3tADDwjHgDc6p+n8VSedOnXd0cWfsWgMfe7AEXDT8Usnr0bQejScOv+1Ho+i4nN3SqlzSnng7zEQ0h30CiCo84jfsD/qMCepfLQ8ZeTOMpZjGUY7qr6yHF3eB+03Zeh6Uf3GnM/uFGTdWd+TJ6aYVXvS72NOTJbNctbGnOUOjMTqjDmnSUwbXavVQoQmgaFKpYLlcomXX34Z169fx/b2drhDGLh5B3G9XkeSHKeRLZVKAWAjiKYg//7+Pg4PD7G1tRWiLRndS8DtypUrGI/Htzh2+U9Ta6s+arUams1miFDOIne0xpzYXkYPcbBcbF5QveiYizl23Q6cVBf8hrL3McTIaB4QSdM03A3baDRQLpexWCwCsMcxxqhtpjPu9/uBHx6kYApknZOYHpnjk/1m6uHJZIJ+vx8iRDXidLVaod/v49VXX11LlRwDG9l3j6BSGXsKeM4TesCHdsm61UZZT7vdxrlz5wIQfHR0hHq9jkKhsAYa69zEwwe089VqFe7gTtOb98ky+vrVV1/FwcHB2j3JOk+og97HOssC6/NltVrFpUuX0Ov1UCqVQtpw9pegIqOi9aBGkiRoNBpr9zNr+VqtFqJj9X5kAr+cY3mHNKO1J5NJ0DvnBeVbM0PQbv2O3Bhg4cCT2gv597tCWYbR8TyUxH/NZhMbGxvodDro9XpotVrBNnhPMg8W0Z5ICtQSdOfczz7N53Ps7e3h6tWr4UCYpwX36wLYH03Tfhrkc5W2yfe+VlGWJ5XzudgBRZebkh+gU/58DdD2vX7l6XaHcNyOdD7xNTRrP3OSTmLriI935+sknXjUqtan+9YYH3odQ0x/Lmf202UcswvfN/l7rd/3NLG9isvidrJR/mLkdbhdsa86/zr/QBxEdvmrvDjOY+NA9/j6rR9W8Dr9HevWDDUuC5et9o9rAZ/7/3tyyimnnHJ699ARgP9lvoNPlLsonLCuAkC3UMafajyCf744RD893QOLOb0JuvoMcOY9QK19enWmKXC0ANIjoH8dmPaBnS8D8wkwG55eOzm9afp30cK35GDwqdLXfd2/hWKxfNtyX/ziP8UXvvBP7gJHOeWUU073jh54QJjgCh0odPBqtJc6ax105TNgHbBQgJD1kdyByPLuLFLQkQ48v79YnTUxBxnr0ZS7pFjki/MYi7TVSCV3DGo0Vsyp7U5Kd0CqE0pB8RgQQABFATIH3FjWUw2zfpWDEkGCmJOPRNkqQJXlpHbePKrYo73cuelOW+eDdapclS8HtmMOXRLTkTJNLMcE+1AsFjEajXDlyhWcPXsWwDGI3Gg0AlBBEJA212w2A4DI1KlJkmA+n2MymQSddLtdFAoFjMdjNBoNdLtd1Go11Go1vPTSSxgOhwGA4vd6wMGBdr3XNnbfZszReRLAoLKPOaype438iR0AcVKbySoTc1hTPxr5yjGhkZyMImX09mp1nPK2XC6j0+ms8V6r1dBoNJAkCSaTSaiDY24wGGA+n2M8HmOxWAT7VV1qGmumPV6tVpjNZpjP5yG9+Gq1wnA4DGmU+/3jU8aVSiXMJazf5zd3aGtaZb87m4d8dP5bLpehXzqvU86dTgeXL1/G9vb2mnwZ8Uw9zOfzoAPVUa1WA4A14JnRwjxocfbsWXQ6HVy5cgVXrlwJYDJ5pn55AMaj4pMkWQO1aRNbW1s4e/YsKpVKSLk+Ho8xGo3COPBDClzrqHvKhxHStVotRLeqfbNMrVZbAz2pd+puuVxif38/RKdzjnWwlrrUOc2BEV/zdIwqsMpvdY5XoIXPGfFLeWxubuLSpUshnbjKezgcBj3p2q38aVpWRpOzndlshuFwiJ2dHQwGg6BnHljgvoOAvM45R0dHIeX7aZKv0TGwN1Y+Fk3o67aDVU6xtS0LMNTy/i72PGutzJrDgfVDZr4PiQGWDtBlrSe3A0lP6g8Q3z+cVJ/L1fnXPezt+nA7PWj9WQAp+xCTvbfpYzrWrh/6UR50vvD1mHzEbDrr8J2267LmdxrZHZO/A8uxfTRw00503fTxxnpcvr4P0r57G9pfXQMoG2/7pAN1OeWUU045PZj0M7Mb+F2VbXx1uZu5LpPOFipoJ6UcEL6XNBsCz/wC8OQ3AtXWcaRwxv77FjqaA1MBeA9fByaHAFKgf+04+vhoAaT5fuB+oU+hlqeJPkUqFku4cOE9t53rDg9v4K//9T+d3x2cU045PfD0wAPCsVP+/g64NRpGQTy/L9a/VWcN/1aHvzt46Iync4bvYxHGrNeda+44d2diLFJBHbraL7bJb2ORBw6GkF+VizvkvX06xrR9dX4S+PW6VJ7qAFRHnb73yDrtuzoOFThwB6pH8JHUSefRySorLe/OZf3udg5U11mW417t5yQHNZ8zCo39o70TWJtOp3j99dfxoQ99KNgJgV9GDeqdrNVqFa1WK9xbSn4JHNXrdYzH4wA+Mc0tQakzZ85gsVjgxRdfXEvznSRJAJ7diU1eCVY5IHy7zV7MKZwF6vv7k5zn/reDClnAids5wQrKnsCbAoWMCKZzmSmeKRcCmTwAo/dGO7CrgCLvTtXfAQQ5E8Qkf9euXcNkMgnpyIGbh1wULAVu3omsgLDKju90rPLQggMBOi/pPOmHJ2hHPGDQ6XTwyCOPYGtrKwDJbEfrKRaLof8E29mn5XKJRqMR5hw9eKS6L5fLePzxx5EkCV599dW1QzpsS+8kjoFSlAvleO7cOTQaDQA3U+QzTTEjd6vVagDeOTaog+l0GmwiSZKQLYCRxhrZzchpRghTFuz7cDhcs2nOBeVyGfP5PMxfvg5x3tF02Tof6mEjB4B9jDnoovM2AWzqqVarYXNzM9wRXa/XkaZpANdHo9EaiKJ6Z93Kl7bDO7gPDw/x2muvrUXDe8aB2BzBOrLmiLdDup7E3mW9z5pHHXiN9U3bdXCUP28Xgavrs9uC7gWAW6NcnS/lzfdYJ63T3pfY4Syt10HTrPUhi7KA1Nvxr39rX7La8H1LDIzM6kMMsPT3MXk4uKl7Nreb2N7Zx433me/88CCANVtxfcfGgP4d2+O5/cb6oIeUfCz4GFI+fZ5TXvUAFemkQx66RumeknJSeeWUU0455fTuoX56hB8Zv4Sf6HwAm8nJUXP/cHYDV1Y5QHLPaXgD+M3/L3D+SaDSPAZy9166/XeL2W8DwKQ8M0hO7y5qtTbx4Q9/44ll0jTFL/zCf4cXX/yNu8RVTjnllNO9owceEAbWwR116ir4qM5Gd/wqaObOHGDd2aKRrOpw8cjjmAOTwJc6mBhFRFJnujvhtG06yTV6is/UKeUO1CwgjG2og8wjLTRKS8kdZuRb76eMOeFUPg70qINe23CnljuFqQu1B3c085lHk8TAPefb++/OUJWT2qDKJcspnqWPLOdxzFlL0ntG5/N5iMhV4HFnZwfj8Rj1ej2kkiYQRNtst9shMo4AFQFBB8aYipUphY+OjjAejwNIubm5iclkgtdeey2MKR9XCmKp3gh8aSR2zMGreuTfMZAxJkeVpR/kiAEj3o7XESO1Q40sJCmP0+kUh4eH2N7eRr1eD9G9xWIxpAdmRC95ItDHu4IJFk4mEwwGg/COsuddps1mM0RyU/4EAqfTKZIkCXdGj8fjECVbqVRC2l6dR9XZrYCK3uOqUU1pmoaUnH4YJ+tuWpblAYY0TcNdx2fPng1ptcvl8hrIx7YIgI5Go8ATo2QBhOhp1SnlRvBPD1k89NBDODo6wrVr19ZAfvKq44V2rkAn26rX6+j1esHmK5UKDg8PQ8S/2gp1o2nFmf6bslbQMkmSkE6c4DABUaaN1vmM9rFcLtFqtQL4WqvVUK/Xg+x1/Ol4U33dbi50m+HvukbQtrg+6LUQlHWr1cLGxgaq1Srq9XqIgF4ulyElvqYrV7nR3nhopVKpBPkuFouQZnt/fx+7u7thHLD/ng7e9xOU31ulkwC6LCCRtqJzX2wt9nnL57lYf/ynz4MxoDFWR2xv4jxqfVlrIcu7TLLmau8n5eMAmsvb24+VAdajSGN7ixiQ6nI86YCZ9s33vy7fWN1afywbTFYd+tP3UM6TytltKsYP5RV7rnYQ+9tlqSCp9kF51P8n6Frq81Cs7zH+XX5qU2zP9aN7AiVf77RNHct+uIH9cXnklFNOOeX07qNfXQ7wD2bX8e/WL2WW2V8t8JPT1+8iVzmdSNMB8OLn7jUXOeX0jqLHHvsgarXmiWX6/R38o3/040jzSPmccsrpXUAPPCCsIKWDwuo40VSdBETUUePgljtq+Ls7utXJo1Ge6mRi5B5BN48EJHiQlZ6ZEXjeZ+VFSdNf+j2dJO0/29P7gh2k8r9ZJ9vXdK/uGI1FpqjzyiOy/Ht11jnFdO5REiTnz4EpfecgovLsPKosFASOObQ18tl1os7HrIibrL44EZwl2MPDCAQ9CoUCRqMRDg8P0e12AxhEwIL3zKZpikajEYCUcrmM8XgcZFepVNYiQ1erVQAtGcVIsKpcLuPChQsYDAYYDAYB6HPnqR9EIPCnY0zl4ICB1+nOUj0wwPckj2JkXToevU7XYxZRrxxnHO+M2CSAp+PxhRdeCGC6H0YgLwQFGQ3ZbrdDVOZoNMLBwUEAcZk2OE2Pwc92u702X6h9MlV3u93G2bNncXR0FCIjr127tgYGaoQv79t1XWkKSz/MooCVO+j90ADb8Tk6SZIQHcoDCewXeaGt6hynd8QWCoVwkEXn4+l0ik6nE+xAdUj+ee/vaDTCYDBY6xP14fan8yH56Xa7aDabYQzOZjMMBoMQmc/DATxsobRarQLATXCf41kPAQDA4eFhAHVns1mwA/a/0WhgNpsF/nn3MuurVqtr+tJxqGufR1tS/g4KOfDLcm7zBPg1YwD7VqlUQhrvSqUS7nsmeE7e2U8Aa9HSOkfyW64j5Gs8HuP111/HdDoNhy6cTwd/CoUCZrMZptPp2wJn/NsY4Op60Ge6R4nx7DKPlYvtsbS9GDCp80oMlNO6AazJ29dfB7i8r96fGGinh+pi4KLO9yftXXyNdzn6uuT7y5isfT3yPsb48Lpi+w+Xje89dF8X483BaJXLSfs/7VsWqd71b/Ku13n4uh47aKLzicrR+xDbX7kNx/qr89RJe7WYfevY0LkyZlex350/5cfHIm2c7eWUU0455fTupJ+cXsW/WT2LrcKtUcLLNMXfnryGF44m94CznHLKKafToAQf/ei3oFptZJZI0xS/9mv/K1577bm7yFdOOeWU072jBx4QBtadTQ4A8JlHaPGnvtM6gPXIwCzQkMCYkoIdLEfHjAKbHh2r9ZwEZOq3/B1AAGUcsCYP7uRUB6Q6X2OO5JjMWa/LrlQq3XI/cZZzLtYvb0eBOC1PYMOj5rSs61TBB430c71QBn4PmzviXIfahjvmyIcDEt5XlWtMDy6jGK1Wx/e9sp9MH8137DNToDINbafTwf7+PkajEZIkwXg8RrvdDnfOMs3wYrEIKWuZnpY6SdM0gFKMZGVfqtUqzp49i36/f8vd3UmShLtZ2WcCc4z09MMRbp+xgw4uX3+n9heL0NFvPeLI6z2JnB/lfblcrt1jy77s7u5iMpngkUcewZkzZ4I8CTDyzth6vY5msxmAML3rl6DecrnEtWvXMJvNwj3DTPPNdmu1WrBPAsIaldnr9XDmzBns7Ozgueeew+7u7hqAyrGoYK8CoAq00v41zTW/ZWSzluHd1TpP+VjtdrtotVrBlliOdkkqFosBnKtUKiH1MQFAfsvU0QRFp9Pp2mGRTqcTgFnad6VSWZvzqVsd+5x7dJxz3Wg2m6jX66jVahiPx5jP52sR/7rmUL61Wi3IlxHBuh5wrLMO6oOAMO8dHw6HAehN0+PocEZaz2azIGseGKAOFHD2saTfeFSb6tDHh0frsX8cL6xbU0b3ej2cO3cuHEhhOmyCwc4jdaVzraZxZ8S4HhZ45ZVX8Oqrr4aDXlmgnh6WYtR27B70t0u+9uhPB7aUvKzy79/oHOfzH+vwtdbr9HJA/HCV16E86RwRWw9ja2is3xoVq3XE5nsH99QOfX32/vihmBhAGJNVDESM7Su0DufT5ep7v1ibWYAmbZrkh0BisoiNaT0YEPvmjfTP9R4rFwOLWZbzrNuly0wPJrmOtD4t6/anz2L6iI0L3w8rryeNZR2bDqyf9G1OOeWUU04PPr10NME/nu3g99cvrD1P0xS/thzg70xfQx4vl1NOOb1T6ezZy/jGb/xDty33v//vfw/I06nnlFNO7xJ64AFhBfL40+/XpVNEowzUCe3RtupwijkVHVzV5yc5XRh5pOlG+TewDlayfY9YdH7dieZOdAUO3GnrDit1XLnj1R1S+nfMIaj9OSmyRJ3n7hxzp6UC/TGnptbvTkLnK+YMdyDdoxDZpjsU3UGsoICCRy5/d0jG+NB6XGa3c/Lxfljyx2hhAm4EhpgKNUkStNtttFot9Pt9tNvtENm2XC5Rr9cxn88D8MdUwaVSKaQubjabODo6CtGjwPG4q9frQXatViuAXZStOph1fBDI5n25MXJ9u84d6FcgwMdJjPx91n3Pb4R8HFA3jDjVqGnyOBqN8Nxzz4Vo7k6nE4DbZrOJRqOBZrMZ7OLw8BCTyQSj0Qg3btzAzs4ORqPRGuhPgJBjj+nAmeaY0ZYEswgaF4vFtejLF154Aa+//nqIclaZaJpUvcOX/eU4Ipio0aT6jUefKTjHtMuFQgHdbjdkYUiSBJ1OB+12G5PJJKRNp906uJkk6+Avo3MbjQZGo1Gwn9VqtdZXpl32eVmjmhmdzwNE7IeCRT4ueefwdDrFeDwO8tD3jUYjAI28J7dcLqPZbGK1Or4bmAA253Tex10oFFCr1VAqldDv99fAe94ZTtB1sVig0+mEtvitAsc6N+ua6AdqHPhR3epcmjU36jjieko7azQaeOyxx7C1tYVms4l2u41yuRzAYM5zBOh9HQZuAs3kg3pme4PBAC+++CL6/X7QK8kPRvHub86Hs9np38um65WuLw64qWxjewOWj62Xvs57+1nfnPRMv9X9lo7H2Lda1uvTuk7aS8T6lsUj29LU/jF56/NYnTGg0fcDuu/SPUUM1NZ9ou8RYjLR+lXXOle5nLMATN/z+nvlTVOoq9x9HvA++2GxmK3E9nwxPbJeBYlZB+dUP4Cp+z6PLvZ9pOvTbUL7qbz6QcyYrLNsyeWiunK9uU5yyimnnHJ699EKwC/M9/Bv186jJGvOGCv8X0dfxiA9yv44p5zeQVRpJOg9dPJ92U6rJbD70hz5MHjn0ic/+cewsXH+xDI3bryC3/qtf36XOMopp5xyuvf0pgHhT3/60/jhH/5h/Mqv/Apef/11/NRP/RS+4zu+I7xP0xT/6X/6n+Jv/I2/gYODA3zt134tfvzHfxzve9/7Qpm9vT18//d/P/7hP/yHKBQK+M7v/E786I/+KFqtVijz67/+6/je7/1efO5zn8OZM2fw/d///fizf/bPvukOKuCmTg9GGrrzRJ0lMadKDHhwpy9/xiImvN6Y408dVMqLRzwQEHLnrTvQHNDWiGcHKeiEj0WLKrkDWfueJMlaGlLlmeQOLe/HSc7+WPQIn6vzjX2PAeMKBLpT0oEALavta9SY9lPboiNR37sdxZzGXkbb9og5L+dOwJjzlv2ez+cB/CCowTo5RubzeUibSuCMkXWj0SgAIwShisUi+v0+lstliHijrY7H4wC4TadTVCqVAEKyDdogbZWg2Xw+X3M6qy0zWo+Rx1nkjnKVu1IMUI85W2POVdV3Fg8xfeh3nLfUIa33/pJnymKxWODatWvY2dlBs9nE1tYWut0uqtUqBoMBJpMJDg4OMJlMArA5n8/X7ok9f/48tra2AijLaFMChYx4JHCpaeyZBpoRptVqNaRmrlarePnllwP/7L869X2O0ruOqWeVH6M5WZcC5Q5+JEkS+KAcGd2s/yhTvTNYI3kJJus4YcQt9c6x4HfBEmwHEO6rTZIkRDVrP/WuWrejcrmMdrsdwEQAa+0QSFBdVSqVAFyWSqXAX61Ww3w+R6/XCwAzQWfqarVaYTKZoNlsBsByNBrdAkzrHMKfejcz9ZAF3nvGCNWd6zL2TkFiPQhAm0zTFBcvXsT73vc+9Ho9NJtNVCoVjMdjDIfDkAWB7ascqR/+TRkyRTbXmNlshhs3buDGjRtrY1N/Kv+0dYLBJ81bb4diIJiuFQr2xeYlX6f1udfr61oMtNL3OoYdzIvxqwfafN/lh6tifXAeYyBpDDyL7U1O2nfF9noul6z6XabKC3mO7Z28PgcuvW+xNmK8aNtZ7cbKan3eZ5V9zAZ03nAZx2zK+8lnrl+3qdh67W374QK3UweCY/sxlavLUGXLvYy2re36XBjbJ54kG/9d68/ak+T04NM77f/1OeWU052h31gOcXU1w0PF4/+vrNIU/+34FfzacniPOcspp7dHxUqC9tkSPvCtLVz8yhq6F0rAmzi3v1oCn/5vd/H8L43vHJM53TH6yEe+GZ/85Hdn/t+H9Mwz/wz7+1fvElc55ZRTTvee3vSlUaPRCB/+8Ifx1/7aX4u+/8t/+S/jx37sx/ATP/ET+OxnP4tms4lv/dZvxXQ6DWX+4B/8g/jiF7+In/u5n8PP/MzP4NOf/jS+53u+J7zv9/v4lm/5FjzyyCP4lV/5FfzwD/8w/rP/7D/DX//rf/1Nd5AOE3X4E6ijEz6WmpaOa3doxyIxgVtT+KpTJsupzecefcE0olqvR4WSB/3J8jFHrQJYrE/7rQ59d45pvcpzzImp/VRA1Z2CLO91eFmVjTtCY/JQHfB9LG13VnSNA4ZZYIQCg+ogVKel6977r9+obmI65u8KVOm/mENS9RYjghG0d43EJKCTpmm4C7NarQZwmFGkbFuBoW63GyI0Gb2oMqhWqxiPx+j3+yGd9GKxwM7ODqbT6Zo8CO64w91thKCe35nqutW+Zzn+s+QXG29qh1n1xpzrMWI/dE5Q3lXfnJ+03wTW+v0+Xn31VTz77LN45pln8Ku/+qv49V//dTz//PN45ZVXcO3aNRwcHGA0GmG1WqHb7eKRRx7BuXPn0Ol00Ol0UK/XQypuzgucl/iMhwkIBk8mkzCn8Hm328Xly5fRarXWIjAZcU59EaTm2KMcVL6FQiHc8ZumNyOD3QHO7/Su13a7HdI9A1iL9OWYZ1pkj0Jj3dPpFJPJBEmShJTbBBNpswTOCS4yinqxWIQ00wTFdR5m/2M2QT0AxwcrGNnK7xnlqinb9/f3MZlMMB6PAy/L5RLD4TAcDOCaTH1Wq9UQUU7As1qtBjBdD3ekaYrZbBYiqSeTyVrabqbJrlarwTZ9Dmff+dwj9DgfxuY517fawWKxwGKxWIsqbzQaePTRR7G5uYlWq4VqtYrFYhHkQ3nQLigTyo3RzwSEG40GGo1GaJOHY15++WVMp9OQscDHrB+24reU42mRz5WxO1wdbFLydzHeTgJnfU1WXmJjNga4OYAYK0NiO74+epkYSEeeY7bFMlqfA84xvmJrRWzv4+BqrO9sk89d1t6OU6wvsbUw1qbvJ10nvg+LPWddutdx/fje+XZtOnkZ77vuWV0mOt+ovephoJj9ZdlzbG+qe0PdF2p7boNsx+Wo9WYB3q5j3ddm7Z1jhyNyenfQO+3/9TnllNOdoZ10gb89eQ3z9Hit+V/mu/h709fvNVs55fSWKCkAvUslfPj3dPDJ/+gM/s3//Bw+8K1t9C6VkRRu3ced9K9YTvDx399D60y2n+mdTCOkmD2gaZI//OFvwp/5M38Xvd6525b9zd/8NNI0z5iTU045vXvoTUcIf+pTn8KnPvWp6Ls0TfFX/spfwX/yn/wn+PZv/3YAwN/5O38H586dw0//9E/ju77ru/D000/jZ3/2Z/G5z30OH//4xwEAf/Wv/lX8rt/1u/Bf/pf/JS5evIif/MmfxHw+x9/6W38LlUoFX/EVX4EvfOEL+JEf+ZG1/2C+UVIHFB0g6jgEbnW0uEMv5vDkaf4kSYJjW6NN3enDTYWnNXYHkKcc1vd+vya/0brdmcTfFSxj32MOSwW3VUbKr0bjUCZaRwwQjaXWizlf3Vmp9/ipLrOiblVm1BF/Zzl3nBFMc2ei99Xbcqe42pdHlsRswuVyUkS2OjfdQegObndQZhGBE/KuUd2M8KPTp9VqBdCsUqmg2WxisVgEsGNraysAaxcuXMD+/j5WqxXa7Tb6/X6I8GUq2fl8jnq9Hu6q3dvbQ6vVWuNFI/PUxl1GrteTyB3xKsuYgzc2J6j+sxzUWU7qLIqNW+9bzJmrcxsBpzRNMRwOQ7+YCpigK+292+3i0UcfDWmCmeaW4JXeLU1AU0E6vbNWAQQCoOVyGb1eD5cuXVpLw+z/0aIN8T11rGnMKRMfpzrmyBcP/BBAZcpkAAEc9vtfSUwfzIMLCuJRfrVaDYvFAsPhMACIPFzB8TQej1GtVoPsSLyXVu8ITpJkLTJbo4j1UBDTgFcqFQyHQ+zs7GA2m4V+UvZcIxhJzLuGa7VaAD4pM+qJ0cer1SpE8heLRZw9exbT6RSz2QxbW1tIkuMoXKaSZt94IIQRrzwUoHfu6vzmYJZGnMfA8Swwx+8n1p/s3xNPPIHHH38crVYr6Go4HIa7l9M0Dfw6+ENb4viinBqNRohAnkwmuHLlCl566aUwfnQNJz++ttHWTjs6ODZX+fqh4GAMRIvNkT53epkY0Ehy8EnX8qyyut/Qdnw+jYF12lef21Unvn56XbG529dbf+4HyXSfqLKKrdcnrW2c47TsG+EvtkfwfdHtynubbgfOl3/jh7r8p9tO1t5XdavlfZ30d/xG7Un3YW4DMRDe97X6fUwXrl/lQfsQ02XsnfKme2vf6+me2/fzLj/fa+b07qN34v/rc8oppztDf3f6Gi4Wq7hQqOIHhs9imOfIzekdQoUSUCwnOP9kFY/8HxroXSxh+z0VFMtvzD90O2qdKeKpb2njcz958PaZvc/oC5jjedz6f+93MtXrbXziE9+BP/bHfvgNgcGLxQw7O6/eBc5yyimnnO4fOtU7hF944QVcvXoV3/zN3xyedbtdfPVXfzU+85nP4Lu+67vwmc98Br1eL/ynEQC++Zu/GYVCAZ/97Gfxe37P78FnPvMZfP3Xf32INgKAb/3Wb8UP/dAPYX9/HxsbG7e0zWglUr/fB3DrKX86gxxMUZBB01eS+Ewj1+hs0TSf6uDUu4oJTqjjRtPDucMQWHcgKygArDutNKJNoxD8xL/yrQ5rEr9RYEcjuPR7dXp7RJA68jQCj+9jPx2IU+LfsXacb++3OrxPAvpUrgQS1NlGUsBH76zV+hTgdYe58hdzCvs3MWDYZeOOwZjDNotYv+qJNkh75fhghOB0OkWz2QwpUymrXq+HxWKBfr+PM2fOYGtrC4PBIOiNIGGr1UKhUAhRd2l6HGEIIHzPSE3KWO2R45k86tgrl8uZd3FmOc7dOe0Ah9u0y9X1Tn7dSeuOZiUHMdi+g/M6f+l417FMXepYJcioAG6n08HDDz+Mbre7BjQcHR2hXq+HCHG2zzTBAFCr1dbu9OX3pVIJ4/E4zBfFYhGtVgsXL17EYDDA9evX1w68KNhMIkCmII4eDmA/9WBAmt5MM815p1wuo1qtotPpBPujffMubOqTUc4E+Agk8m5rgsAEPfmNpixfLBZB9sPhMES3Uw+MLq3X62t24odKCIzSttl3RmQ3m80Qfc9vNJKbv/PQBqOYOT7Yp1qthr29PYxGowCSM70j9cwDHnqIgCmoC4VCAFg1hTV1pAcIdM3TcVQqlUL9BKB5yETXN7VnXY903CjYpodczpw5gyeeeAJbW1vBbsfjMcbjcQC6C4UCGo0GNjY2MJvNsL+/H+yOfaJ9M5K6UCiEqPf9/X381m/9VgDS9aCBjntdr1er43u678TdwU6eBYUUmxMdzIsBbzqv8XkWIKbrroOt+revtyfx6XO11+/ge2w+9n2A8qRlHQTUw0mxQ1xen/Lj/LpcnVRGOh/G+u7AZIwP77Puy3zf6ONIgcwY/86f/h0DXWO8xtZepVj7nIP1oENMBjF9n7SOZ+3TlDc/aOC640/dv3u52Ddud1n6cxn6uq97Ct9ral9zyimL7sf/1+eUU053jo4A/NXxy1imKSbI14gHlkploFK79fn2eaDRXn929WXgYOfu8PUWqPdQGY9/ooEz762g91AZzc0iCsW3DwA7JUmC9/6rDfzGz/QxPXywxkb62/8eBNrYOI9v+ZY/iq/92t+Dxx77MIrFNwZ3TCYDPP30L99h7nLKKaec7i86VUD46tXjnPvnzq2fwjl37lx4d/XqVZw9e3adiVIJm5uba2Uee+yxW+rgu9h/HP/SX/pL+It/8S9G+XKHiTpoYungANwCWvj36lzR9M7ucGQZ3sfoAJFG29FZpOCcO3gUpPMIWXfuOJClAIpHSjjYyncKHKtTWQGomJNOHfqqBwUIvIyDB9qWyt/LqyMzBnr7XaXqVFPHGB2AWQ44d267fGOgdMx5p45BrzOmt5Pek3flmXqOOZidVF8EZjwCFAAmk0mI4GVZgpTL5TIASsViEYeHhwHgTdObkYoa6ck7OxWAq1QqGI1G6Pf7SJIkgE6sRwFIBe0VsDopZXRMn1k68jGqOo05/v07t2OVdZZuHGzh+NBILo3gjjmj1YYVpNNUy5T1hQsXAhgMYA10Zd2NRiOAkryHdjKZoFaroV6vYzqdYj6fhzmL6XV9zLbbbVy8eBEHBwdr6XEV4NN5jAdoyIveWayRs+yvzqHsIwFL9kvnyEKhEO70ZRroSqWCfr+/Fi1NXR0eHqJYLKJer4cU0fV6HZVKBdPpNKSTbrVaATjWSGBdczqdTkjzTNBdI5oZpU19KyDDyGYCxIwk5jhaLBZoNBqBt0qlEu5O5vpRLBbR6/VC5H+SJNjd3UWn00GtVgty5x27jOyfz+dB3wRtmbqaNgDcBJP1MJGnflfb5doYA3F8jFEvfjhJ13KC2Gmaot1u4wMf+AAuXboU9D0ejzEajcIcxLksTdOQRl3r1zYI6Nfr9dDObDbDlStXcOXKldB/Bc9Yt/JLu6VcTotUhrF9DWUInBxVqRSrx/c5un/x+VPXMrYfA+pIuhfxudb7F1uD+Z3P8/o929Wfzo8Dai4/lY2DbTq/ZbWbtX/yth209bLOexa5LtTuYvrQtnyvpM/0IIbfb5/V39jaqPbh8nVZO5+6h81aZ32/GJOb7klj+nSeY/tH1bnKR5/F5OI2HduTu637N95Pl5u+873wnbrDPKd3Nt2v/6/PKaec7hwN8qjgB4uSBGh2gceeAuqN42eNNtDq3lq2UAQsoASPPAF86fPAK8/deV7fJG08XMY3/eltdC+Wov/nOW2qd4q4+JU1fDm/S/i+pF7vLP7Mn/nv8OEPf+Obtoc34jfNKaeccnrQ6FQB4XtJP/ADP4A//af/dPi73+/j4YcfDs4PjXiik1qjgtVh6yf59XsnOrtZt95BqA4Xdyg5YKjANPlz5yfbiDmS6JBVwNgBSl0YPYJA79SMOQoddNRnymNWlI862tyhqPLJckw7MKYOLZWXO/JdZlqeAIVH5ZJfdyayLn5LoEx59wgij4xRHvS5OxQJ3KhtuM61TWD9zmbXxUkOf3VganQpQdz5fB6AKNLR0RFqtRo2NjawWCwwnU5x48aNABwNh8MQSceIxcPDQxwcHISoQEZMcqxMJhMcHBwEgEZlqDpUnRD4AbB2eOF2m7rYOOTf7uR2W1O7zQIsYjK/HV8axcP2lT+ChX54hOUcVM1yjpdKJfR6PbTb7aBLRsgqyM+0v4y0JTCouuF8kSRJSLOsY4Lgb6FQwMbGBra3t/HSSy8FgFqBY5WD3rOr9u/zmM5xBEZpV7VaLdxdTHssFAqo1+toNpuhnAKSjHIfDoeh3wRWy+VyuJeXdyAXCoVw+GE6nSJJkrXvCoVC+Fblp+NMI2Kpa50PCG4z+n02m4W00YxkJl8KflPuvO+WEcxMO61Rxfv7++FOXQDY3d0NwHKhUMBsNgv37ipP8/k82E+j0Qh3jLfbbezs7NwyNzpw6GPCD/u47VJGajc6P+ihlkqlgscffxzvec970Gw2AQDD4RCDwQDz+Tz8o8wVnNWDCIwCZtQ879eez+eYTCa4ceMGvvSlL4UU4RoZzPHEwy/km6miKc/TIp9vfM12ciCQzxyw83ktBu5lAWj+DsDa+uxrof/uc7TuOWJRq7F1ImtP4fuCLBDN5yiWcRA8Nudm7W20fAywo5z4LctqNgeVjx++058x+ekeIbZ2KMXqJumYzpJ57FCh1++y137HeIrpOXYQzwH12HzidbNNlYvv5f0wpe+RY3XHnikArvOez3H+re4/vJzrWPeZPido+znldD9R1v/rc8opp5xyeiOUABcuA+/5SqCzAZSrx+Dwm6V6C3jqY8DhLtDfP3023yKVagm+/v+0edfAYAAolBJ8xSfbePGfjbG6C+cmPo85/jXU0Mad3auNH4D44EKhiO/+7h95S2AwAPyLf/FPMBjs3QHOcsopp5zuXzpVQPj8+fMAgGvXruHChQvh+bVr1/CRj3wklLl+/frad8vlEnt7e+H78+fP49q1a2tl+DfLOFWr1XBfo5I6RBSMjIEmSgog+x226ljKAie1fXf4AVgDpOnkA26m6SVYGXO0etSrAj3aLt8T6NX63DnmkRFZTrCY7Nxh631XsIp16E+WdWDkpCgfdxhqPeq81O9dbtSDOuFIDtDEHLkxnlQerh93Gmu9CgJp35RndwDrM5eV2p3q3ilN0wCMaCQbgSzWxwjR0WiE5XIZ0q8SRJrNZhgMBmg0Guh0Olgul9jc3AxRl0zNOp1OUa/XQyTpZDIJ/PX7fYxGo5A6Vg9bADejXPUuWh8jlUol3GOaRa5XByRicorJzW0i5ljNAhNi5XiHKckPf/gBB9UvZajziM45GvnbaDSwvb2NcrmMo6OjEEW7XC5DWmJgPcKTEag8HFCtVpEkSQDvqc9GoxFkwfYIZFYqFWxtbeHatWvhbmLyRz0nSRLskP0hD2qLCtw5IEKZNRoNVCoVTCaTIFeC2QT0WE+73Q4AH+VZKpWCrXENYPlerxfKsU7ew6v3zDKSl/Jg+sNarYbxeBz41zTDOjexP1wrxuMxdnZ20Ol0UK1W16Jhi8UiNjY2AkidJMdpobvdbpBDrVZDuVwOKY85j+/v72NnZyeAzLQF2gijsnlfMcHMNE0D7+w3bZGgJ+d+PeSg67LObzqHaXS02gDb4rcxcClNU5w5cwbvf//7sbW1FQ40MDJY5w/q0UErAuFqA51OB+12O6xXo9EIzz33HK5duxb0pXsA6tznCtrFW4nKy9qzeBmVh37n6zB58npjoJyWje1LYiCd/oyBl/5tbE+RtQ+JySHGW2zN1nr1b+VTn8Xq8jVDnzmY6/zF9mEuD/8uaw0naYSuvs/aq7hsvWxsfWQdMT7cjlRmrnOvy+s8qd0snTgfwE3AWvvjbfq+VoFgktYT4zNrPGUdbPE2vV8xoNmBebVXt03fJ+ieXfdVMUA/p5xI9+P/63PKKaeccroNlavHIO7l9x2nh3671GgDj38F8IVffPt1nRKde18VW49V7vr+pdoqAHepyb+MPv4JpvhetPEJVHEZRSQAklNkIEWK/xGjU6vvXtF73vNV+Jqv+d1vyR6OfSyHWN0NlD+nnHLK6T6iUz1u9Nhjj+H8+fP4+Z//+fCs3+/js5/9LD7xiU8AAD7xiU/g4OAAv/IrvxLK/MIv/AJWqxW++qu/OpT59Kc/vQbq/NzP/Rze//73R9NKnUQeMaiLRBaAQwc3/1YnMVN7kmKOZQVqPBqM7WoKTXf4aJ0OLqpz3B1fGk2nziw6r5ke0x2B6mzXv7WP/KkOKY9cVQcXwQ11AGvkg6bQdkeXt6P1az0x56zqRkEkd1bT6aoyV0eh94t9ocNVHZHqhFW5+z2o7ix1/pRv9kX1GdNHzNkdux86i9xOKHvWqXcpr1bH96iWSiUMh0O8/vrruH79OobDISqVCs6ePYuLFy/i4sWLuHDhAra3t9FsNkN0MaMmSQSIx+MxJpNJSOHqd+NS7iorAk4aHUhwSO+jjZGOI5eFHsTwb1xmLvcsh/dJz/SdO3DVPnWuYN/VVufzeZiD1H68r0mSoNvtBjCRcx3rZ0QkiSl0edczU+YyrXGapiFylGAi6zo8PAz6JHU6HWxtbYXxDyDMk8DNOUXBP95Rq+NF51j2i/JlFGen0wkgNoFYHlhoNBooFosYjUYYj8cYDoehDt4fy8MFo9EI+/v7mM1mAdwleE9QkLLZ2tr67f9UHEfattvtsCYw6plgsUbzsg9+aEfHQZIkmM/nwYna7XbDoYpSqYRWq4WNjQ2cOXMGjzzyCN73vvfhkUcewblz53DmzBmcPXsWZ8+exdbWFtrtNiqVCur1Omq1Gs6fP48PfOADeOyxx3Dx4sWwlhcKBXQ6nZBavFarBT4JDDPV9Wg0CvpM0zTYjNqpAuAa3a5jjPrXgyG0AYLuur74P9rZBz/4QTz00ENoNBrhwMlwOAzR1LpO6RyscyLvpS4UjiPLe70earVaAMz39/fx4osvhvvRud7rIShfcxUsfysUm5v8IJGW1bZ93tN5x+t0nehc4nsF16HW46Cbl/N9T2zt0rHv/fb2dL/1RubhWL2+FuraoHVk7Sf1u1h532f4uhuTt/Kq7WbtibzPDooqv7F1z9ulXPU9f+oarX33+tRWtK861/l84XLm729kj6N7Brc/nWN9nlK5sS39m/3UPmXx4vryeSa2X2e52B46tn93u4rpy+1CZQDcPEyQU05K9+P/63PKKaeccjqBSmXgY7/zOEX0aYDBpM7mW4swvkNUqiX3hJ3WdhHbj1duX/AUaAngn2OOfxe7+DpcxXfgBv4ORvifMMYujt72Pd8pUvxvmOEXMD0dhu8RFYslfMd3/EnUaq239H2arvCZz/zPp8xVTjnllNP9T286Qng4HOK5527eIfHCCy/gC1/4AjY3N3H58mX8yT/5J/Ff/Bf/Bd73vvfhsccew5//838eFy9exHd8x3cAAJ566il88pOfxHd/93fjJ37iJ7BYLPB93/d9+K7v+i5cvHgRAPAH/sAfwF/8i38Rf/SP/lH8uT/35/Cbv/mb+NEf/VH81//1f/2mO0gHioIPwHqqUSA7GkGdMe50pVMIOAYhmAqXQJU6x9gmU426M4ZlNXrKnWMOKGp/6CxSx5f+Iz8aWeX9pvPJoxDcoeuOJY2sIlAQAxpjzmTVjfaH9fH7WGREzOnJn1636t0djTFnnd5LS5moblweDjhrhKSW1b/d/mIOxVjkRlY0h9pkLHIyRjGHNeW+XC4xnU6DDAgG7u3tYW9vD5VKBZubm+h0OgFk29jYwGq1wu7ubgATCTQyyng2m+Ho6CjcxcnoYQKDjFBlilu9k5M2XCqV1hz0JL7zcaIyYn9jYIJ/47JWeel8EHOCu2M/xo+2zX7rHbw8PMK5SMc4o3bJg6Zydmc722g0Gmi1WiGqd7FYBFkul8sA2mtUI+XcbDbDNxznBFoJeHL+Y9pwRpmr/Zw7dw67u7uhHj1Mo/M1Za/po7X/Oofp3FYul9HpdFCv1zEcDrFYLILNMcKTIHi5XF5LlTyfz3FwcIDNzc0AHpZKJTQaDVSr1ZCumXa2XC4xGAyCzni4YbFYYDKZoNvtYjKZ4OjoCNVqFY1GA9PpdA20IvCpqWD1LmG12eVyiWvXrqHf74e7iGezGcrlMnq9Hnq9XkjBzn/T6TTol/cWV6tVTKfTIM9GoxHSSG9sbGAwGKDb7eL69evhLuHZbIZCoYCDg4Ngbw6alctl1Go1HB4ehgMeDhKR/O7R2HUFOvfoGsMx5+P26OgIjUYDH/zgB/Hkk0+i1+shSRIMBgMMh0PM5/Ngn7oe6d3camvkuVgsotVqoV6vh7uUR6MRXnnlFezs7ADAGiCmfPmamabHd6hrlN7bJQeE2I6+93U4tp/wg2G+Pnhd+swBTeXH5yGtR8vE1kH/VvdK3obz6vLxdzFeY+utgqix/QfHQWxNeaN8+N+x/WPs0IKTH0JjeZezy9vl53s28qWRplk2nrXe+TOXvT538NLX16w69bAk61E5Zu2pCGr7XpM/NRND7Htt3/lSObIvsfTZvi9xHfkBUe+PPtM1NPYd64/tX3N6d9E77f/1OeWUU045nUDnLwNnL50+eNvdBNq9+yZt9Hu+thH1h91pKlYSVOp397qNFMB1rPCzmOJnMUURwFkU8X6U8FEcg9MfRxVfidsfAEgAXEYJfazwkxjhr6CP628TWL7X1G5v4UMf+oa3bA+z2QQ3brx8ylzllFNOOd3/9KYB4c9//vP4hm/4hvA37/f5w3/4D+Nv/+2/jT/7Z/8sRqMRvud7vgcHBwf4uq/7Ovzsz/7s2v2jP/mTP4nv+77vwzd90zehUCjgO7/zO/FjP/Zj4X2328U//sf/GN/7vd+Lj33sY9je3sZf+At/Ad/zPd/zpjsYc4Iq+OmOIwJXCmq6w8TrYnQbo341jSXBDvJCUEcj+ViXAni3c6w6MEnghI4md6bxHR1XBJ/UwRZzyKqTSCPavE7lnQ6oWN9ULs678+x8uFPNwX6NdNT02d5mDNRjGepf5R0DgF02mtpWdej2Qj7VWRdztmv9zp+WcyevgtAkyiVG/I42D9xMzcy6eC/scrnEcDgMoEun00Gz2USv1wtlCP5WKhVMp1NMp9MAOLKNWq2G1WoVgCv2q1aroV6vB+cr095yTNFhq2NHx6UCaVkO6ZgduKz8XczRrQcF1DbVOet1nETsm9atcxTbVme/AoZuIzp29NBKt9sN9sA7dBndSPuljpbLJUqlUki3y/thZ7MZ+v0+ut1u4KdWq6FWq2EwGIT2m80m0jQNaaU5Ngk+HhwcBHvhOKZu/QALgGCDmtLX5xvORa1WK8zNTGNNWbVaLVSr1QD40sYZ7cu+LJdL7O7u4vz582g2myHDQqFQCPZN+VE20+k0RGtPJhPM5/PQJwLIjHh1EFLnGZ+n2f/VaoW9vT288MIL+MhHPhLAfQKxq9VxZHYsspF3IdMm9A706XQabIf8MRo2SRIMh0OkaRqi+lerVbgTmXbKKG62yQMdumboXKggh/4jUOry0DHtVyrwcES5XMYTTzyBD3/4w9jc3AQA7O/vY29vLxwO0IhgHkIhsE65cHwwLTbnO0aMz2Yz7O7u4vnnnw9AudYJYC0Nuq41HoX/dslBstiaonOVH25jHVre63eQSss5GOh86PPYwakYiJi1Dmb1UZ/5+ud7Kf4dG28+/+ua7XKKHbRSXfjhPLUD3R94H5RiB/S8bS2T1VfXgfYltnbp+9hhyJjs9fcsh4zKJraX8j1NFuivbcXs86T1m8/8Khgt77LQg4WqU12PY/JQ3mL6dtvQ/qj8Wae276n23d6cnyy9a105vTvpnfb/+pxyyimnnDKo0Qbe92GgcAcAy0IBSO4uEHoSlar3Dy93m44AvI4jvI4j/G84PpxfxABvNNfLR1HBdazwApYPwO3BwDd90x/C5uaF2xfMoOee+1W88sozp8hRTjnllNM7g940IPw7f+fvPBHcSJIEP/iDP4gf/MEfzCyzubmJ//6//+9PbOdDH/oQ/uk//advlr1bSJ0rCjAQoGIZd0Sq41kdJ7EIDZahY0kBKXXs+D2UbM/5dIelPlPnHYDg1KdjKgYGqtNcnaZavzsu3REZkxOAWxyRnjaQZb1+fkuwRCO/FCjQ7+jEcyent6NgIZ8pKBH7xh187jA/qf/uNFbno9ejwIGW00hadzC6/pWPWDS2fud9jTkKNfIyBu7zvtjBYIA0TUOkI9PuFotFNBoNlEqlcK/wdDoNgEi1Wg0pdlutVqiHYBGjVHkvKyMa0/Q4FTKBJf7zsejjgYAWo1ddh+4cdopF3MTKZoEPLt+Yg9ZJbV1txNOUerp6gvc6vlmPjq0kOQZtGdVLnfd6PaRpGuaRJElCdDz1NplMAqhbr9fX7g+mzRYKx/etHh4eIk3TkCqcdxITWGRfe70exuNxsBGNiFX5U5/kTfvDspp+vlgshnTMBGZZV6lUwsbGBur1+prMyNNyuUS/38dyucTGxgaSJEG9Xg9R60dHR2g2m5jNZuGuYUYZVyoVNBqNAC5yLtT05bRHjp9SqRTAVQW5/Sfth/f/jsdjPP/887h48SLa7XYAvBWk5bhZLpdB3zy0kSTHdwEnSRLGcKlUQrPZDKB1o9EIUeK1Wg2tVitETVNus9kMw+EQAAIYq4ddNFWyPvc5VHWr44XyVRvRscT6qbtCoYBHH30UH//4x3HmzBmkaRrA4NFoFMBd1kW9UU4KBpNXAv2c7yjn0WiEl156CdevX0eSJGv3rTsgx35Rz9TH26UY8JcFOvmcpmVPWue0vqz2fI8VK+MAYIxXnyd1HYyBdi4L/8b7EVszdD2Iycvr1SsUtI/Kk+/d+D4GusX05bz5/sT7qf2PyS5L5i7rmCxj/XT+tbzbBZB9rzF/qjy1zqx6Y/LyfeVJfcnaA/Jb32M7H96HGA+xv0ncY3FN8XlD9+nOt+/Lfdy57Lx/PjZ8Lsjp3Um/8x32//qccsopp5wilBSA937wOJL3zjRwuimoczpVOvrtf2+E/hnmd5KVu0q93ln8rt/1JzL9em+EPv3p/wFp+s6Oks4pp5xyeiv0pgHhdxox6khP05M0Cg3AGtDg6dySJFlLxenAHdugk0Uj1tyZpU4c8hRzhKpTUdPV+TexNJsxcNOdwDH+2IZGmMUiDxzAUAeTOoApZ3cSky+VhUf5qb7cqeyOXq1bn8eckjG+KCuNyIvJSW2CPBHY1jbVyaeAnstTHZFuF9pWjPdY1JZHlKpcTgILjo6OQjpVymJnZweXLl1Cp9PBarUK0QDNZjOAiwBCNO/R0RGef/55XL16NUTjPfzww8F+Odbq9XoAqg4PD1GtVkOd8/kcOzs7SNNjIKpQKGA0Gq2NUXcgUx56hzAjPrOiuGIOV5VjzBnvztiTHLFZYzuL1MZoHwqoMW22gsUKEvCdjnnlkXLXQyvUaZIkIY0xQWT2QUEIPmM0N+8lZzpkgpvL5RLj8TiUczlT35VKBfP5fC16XOWm92drRCgBTD+8wPY6nU44kEBAcTwehzt0GeXpcmK65MPDw2Bn3W43vG80GqhUKhiNRhgMBmi32wCOHaGFwnHaZdo5bV5tgLyXy2W0Wq3AJ9Mq+5zHOYVAJv+uVCoYDof40pe+hEceeSSA1tQNdagpiYfDIfb391Gr1XB0dBQiggkCz2azAPwWCscR1gRCObbZDtONHxwcoNVqYTweo1wuB52m6c1IYuB4TuJYpFz07mpf+xgJnrWm6NpEe0uSBJcuXcLHPvYxnD9/HmmaYmdnB3t7e8HG9J7qJEnQ6XQAIKSQ5prGNX61WoW5hGA8eTw8PMSXv/zlEAGuB6F0T6BrG3k9jejgrP/0OtilfAC3guoxsC22Bsf2KDE+svhyXSro5fX6fKF/+3td92Lt8J2353N1TG7+3tfeWF91/vZ9j/LvsvL1OcuWsvjzOn3voXJ0+WkbLgOt3/dAvh/z9VD1QbnFgEqXrb53nm4Xbav9Vl3ESNd1XdtjcvX1VnnTunSsu/xitn2SPHzf7faUVRftUw/PkWK8AwiHsXLKKaeccsopp3covecrgEefvLNtXHoc2L16Z9vIKac3SMViCb/7d/+fcf78Y2+5jn5/F7/2a//rKXKVU0455fTOoQceEAbi0beaipROEzpQ6BhmhJI6zxS4Y710wOs9tVl88L079zyKQp1nzoPyriC2pgBVpw+d2yc5b9XR5c5hdy5rVJ3Kj444bYsy0rrowM8CLN0RpjzFIjLV4U1++I86VGefHhAgD9R9zPmp5dgXAkYOtsec61kHANR5qfVn9Z0/9QCAH3RQ56brLot476vaDgAcHh7i5Zdfxubm5lqEr0YC7+3t4aWXbMc3EQABAABJREFUXsLe3h5u3LiB1157DYPBAKVSCQ899FDoGwEZvf93Op2iVqthY2MD1Wo18My7SZPkJkBPwIb9YySjAkoqQwLCk8kks98xXbkNuT3p+5hjP6bnN0LenvKjd+jSfvmTevMDGhoxnaZpiF4FECJ9+VPlTuCuWq1iMBisRQqvViuMx2NMp1O0Wq2QEpmAGm29VqsFW5nP55jNZiGFM0E2vh+Px5kgUZqmATikXBgRrPLROb3RaIToVcqGEeaXL1/G1tZWsEceNEjT40jS1eo4rfLW1taajBltfHh4GA4pMHV6s9lEt9sNc5oC9xxXTCWt9+QSQNZU2uyjg9yc82n3aXqc4vmll15Cv9/H9vY2Op3OLRG1hcJxGme1G+qK0b/UO1OCz2azEDVbrVZDJHSlUgljvlarBZA4SZIQ8cz7p6fTKfb29kLkv+qO41/TowNYSxVOolw4Ntiv1WoVQHKWv3DhAj7+8Y+HOYcAOO2LY4g8aYpzjaxmqmjWzX5TVxwDr7322trdwQrAsC2dn1gfD1CcNulclLWuOlDGMj5nkU6ax2L7BN/3qD61XCyCM9amv4/Nsw5Aknyf4CBfjF/vf2x9OEkmMYDO5cu9h6/pyndsHXD+9RBQrI+sK6ZP32tpG1l7wBjpPJ1lP94/5Y3tx75X+bqNxPZZ2gffp8e+cdtRe1HeOG/6oVLnzfdzsb0s/9aDoyp3l4fbU6zt2MFVlmOdsT2z6yJ2L3JOOeWUU0455fQOoa3zwHu+8s6kiiYlyZ2tP6ec3iQ99dTvwO/+3d+H5G2kMv/yl7+Aa9dePD2mcsopp5zeQfTAA8IahUpnlzu9CJo46EPHiafvo5NIn6vzmuAAnW0OIPN3/UYBYfKgEUv6LAtkVFDaQWQtmyUH8uzONndWAQj91IgjB4hvJ0d1KBL0YFmCG3qnr9+fG9OvPtc+qRyUL5UNI9PcqU6K2YdGirvzW3nN4iFW3qPm9Bu9984POZzUx5OcfQT1COgQiDo6OsL169exs7ODhx9+eC2a8LXXXsOrr76KK1euYH9/H/1+P4Bk1WoVTz31FB5++OEAIDJ6tFqtotPpoFqtrqXOpewoTwXPms0mkiQJdXgEDMEcfsefHNuxiLyYTWaV8blB9a7vs3T2Rsid0zpfqZ3qgQuN6OVzn6cIUDWbzQAIUh6tVivIiUAmx0C/38dgMAhgINM7c3yQB4Lui8UC9Xo96KxSqYT01PV6/ZZ7oJmGmfamIC9tnGl4s3RGe+E31WoV3W436KbRaGA6nWIymeDcuXO4cOHCWprySqUSIuPTNMVkMsF4PA4RzASWaZuMCu50OiGStlarYTabYT6fh0hYjgGmIiYA7vfesk8O7Lj9qLNegaCjoyPs7Oxgd3d3DYSkfpMkCeB8pVJBvV7HxsYGer1eKMM5nAcDmGab31PPTEFNQLhYLKLZbIa1s16vhzuEX3nlFezs7NyyrlFPOp/zbx1rtGXqkfMcAWFmMQCOD0tsbm7iq77qq3Dp0iXMZjMMBgOMRqNgl2mahvuVaX+0aR5qYDrvyWQSAGOOLUZKA8dpv3d2dvDlL385gOX8R350PSIRDJ7PTydFV2xOcrvx9crLsYxHOjqQ5yCaluN74OYhKd83KMV4cuBU11K+1+wAukYq4BarV7/VdmIy0f7E5BYD/Jx3LZ8VcaryjcmI33tZ33+RYv1z3Xg/Y/zqT9dNVhmt03Xm+7SY3JxH/dvr0+wgvvdxm/NsE/xGZRvrq/Omdep+WX9XUhnp9TR+aJFzkctT36uN+PhTfn28Z+1dtc5YeznllFNOOeWU0zuQNs8BH/8GoN68822VK8fA8JvwcdwJKpSAcj0/yPZupief/Br8mT/zd9FodN5yHYPBHv7+3//LWCymp8hZTjnllNM7hx54QNijL7McderoobNGQR+ti2X4rabZdQe2RymwjKeXVkejR/mp01PvHVMnmDqY+I3y7xHR+pN8EJgj3x7dwHq17xq1qWVI7tR0B5o7zdW5rDqL8a2OQ3XwaTSHRldqO64vEvujTljtq79XUhA65pTzd1mOb++bOg5Vp15XDAyIgZVO7JfzRYDrpZdeQrVaRb1eD9F/L7zwAvb39zGbzQIQd/HiRWxsbODy5ct47LHHMJ1Ocf36dVy/fh2VSgXL5TJE5lUqlbUUrn7nq9o609ASYFMggECMyoDfMdXrSSlaYwBJ7D11cZItxxzybxYUpkw8ul/niNlsFqIVCaTyvbbJb5mOezKZBPCuXq+j2+1itVqF1L4KtKXpcVTxfD7HaDQKemakK8E5RuSSl/l8jul0GtInLxYLNJvNAMJRdwQpm80mBoMBAKylCnabd3nr+Dg6OkKpVFq7O5h1TSYTJEmCc+fOod1uI0kSjMdjzOdzJEkSbI6poAuFQkiJzEhW1kPeKpXKmr7G43EASufzeQAKCTSXy2VMp1PMZrM10JgR84xadZBE5yYFB8gjyzLqV+dBRsm3221Uq9UAwFMPPPzBcU+74jxH4JJgKvVDPji+ut1usL3ZbIaXX34ZX/ziF0Nkvs557KP2UwFhBz9c/77uVSoVnDt3Dk8++SQef/xxrFYr7O/v4/DwMKQMJ2+6TrEdArS0+eFwuJbanmOrXq8HQHg0GuG1117D1atXb+mTRrMrYMm/Tzs6+KS5JQYOsd8+b/G92puDST72HIxzvWoZykEjLr1+r9t/Vz6z1tTYPisG7MXeOR/OXwwUVXBSefM9ptflhwlJvteJHTDT/vt67/y5XLP0rt/7fldl6bakffE6YrbmPMbWT9YXW4dj66u2p3w6wKnrp+/fsmxR2/S1XzPKaOSwHkhjezG7JA++b4vp6qT9r66DMf3peIt953NUTjnllFNOOeX0DqKtc8DHvxGoNe5Oe9sXgXIVmN9bAK21XcKZ91buKQ853RsqFIp48smvwZ/7c38P29sPveV6BoNd/MiP/BH86q/+41PkLqeccsrpnUXvGkCY9+JqlKmCKLHoVX0OrKd7U6eSOjwJSNHxpPXGohb0Wcy55s5x8q1prdk38quOSnVgEbjRu19ZTp3xWk/M0cj+uiNfy5P4LnafWcxhqYCgRsKpYysGkLpTS/vujmB14Kn+3VHmdqR1UFfaZ3fuxRx+7th0WcS+VR2p/L1ed6S6E5PPYk52gl0Ehwl0HB0d4erVq5hMJuj1epjP59jd3UW/30e1WsUjjzyChx56CNvb29jY2MD29nYAH8fjcZDRZDLBcDhEo9EIOmu1WgGsJV8a8UmZa0pd/akAvQMxlFG5XF4bV2+EYrpw/fO9zxmxb1XnJ1GpVApAH2WhqXW1bdbnqYp5oEMPgPCeYIJcpVIpALaUu8pfD0yQtra2ABzPGcPhMNwRTNI7YjudDpLkGHhlyl2C9LPZLERgdjodLBYLDIfDkKqYpPOGHpTROYtzEMFoRvUS7JtMJigUCjhz5gzOnz8f0jOT1/F4jOvXr2OxWKDX6yFN05Aem6mXGaVcq9XCvdiUOQ9HXLlyBVtbWyiXy9jb20OapgHsZZtMw6zR3DwcwTuE1b6yQA9GOOsdvNQLdb25uYlutxsOAnBs6By8Wq3W7talTGq1GsbjMcbjcYj4b7fbwa4ILvNuXeqk3+/jxRdfxDPPPBN0qeOStgWsH+AhL/rMsy5oWY7vUqmEM2fO4P3vfz8eeeQRAMcp7pmRgHMPMxGwHoL9/X4/2AlwDAYzypv/KGO1ieFwiJdffjkcjND1gGNXgRj2Xe9UvhsUA6GA9fkodtgqK8rTgbbY+qP1xPYqWeViwKEfKuNPn1f1ue6p/FlsbT9p/XVZOhgX+/6k/Y3X5zzF9OPrjK7dDhpqvS672LpEUrBQ9eDzj/7tgL73NzZ/aRsuz1gErNuhy1X3sTF9Ok/63nUVW5t1H+o2q3vprLaA9ewVLn8/6KP94vvbyUuzxbBuHWs+RmPj3fWUU0455ZRTTjm9Q4hg8N2IDCYlv/3vvqD7hpGc7hKdP/84vuu7/mP8jt/xe9Fq9d5yPfP5FD/2Y38cn/3sPzw95nLKKaec3oH0wAPCTPuo4Ine9Rs7We/RtQS16HR3Z7V+r84XBSc1pSf5yooAUYo5MZVXgkbaX3Ui6e8KCmr9/p6Atkec0Qmn4JSmx/YILv1WnV3kwZ3SsehYl4HLnfL1/iloq/LTNhV8cGdyDED0QwCxNvlMgeoYmOzRxi6vGK9uJ+7QzHKyxr5xImDBCFWm4KUNj8djjEajAMReuHABjzzyCM6ePYtWq4VOp4NerxdAXoJrGpXJ+4f39vYwmUzCvaMEp8iHgpr1ej1EVio4qncRe7/UPgheMSXsSeRAhMrsJDnG5KoO9ljUXRZpezquaU8EKCmHcrkc2tKDILS7crkcIleXyyVarRa2trZCqublconRaBRskbKi7Dm/NJtNzOdzVKvVcD9stVoFAEyn0wAsUubUea1WCyAc+VcwslQqoVqtYjweByd3mqa3pNbNAgqTJAkAMwFnRuHSRrrdLur1+tqBnjQ9vod3sVjg+vXraDQa6Ha7GI1GGA6HAUSfz+eoVCro9XohBTajTwGs2S7v4a3X6wH8ZXQtcBOQJZ8EsoFjQF0j5kmqV49KYznaeLvdxuXLl9HpdEIfCbKzDgLa/JtRwozaLhQKqNfrQd9Xr17Fyy+/jEKhgGazia2tLfR6vQBwc6zzLnEC/mrzGhmqc56CKqxHD1apDNhvguxnz57F448/jgsXLiBJknBIhSnCNb2sAiV6UIDtpekxYKs2zO+SJAk23O/3wz3plDttjP3Rw0bAzcwSBNzfDp0ERjrPWSCPz296aC22Vvn+w9fsGNikpDJWW1bS5zqXsi9ZwJbPzd5nX5N1bWV5379p37V//j0PZsQAVm1TAT7tk8voJPLysb0m7Uz77WVdh1llnd/Y3jO2Jmb1x3Wua6PuoxTkZTnfb+lz/q51qP3H9qLaZz8IqXYYA6G97yrP2F5QyceLfxOrQ/+fovV4v7R/bt9Z84C3FTvMmVNOOeWUU0453cf0xFfdXTAYAEplYPM88PqLd7fd+4zexpW1Ob1JKhbLePjhJ/GhD30Dvu3b/n089ND739aeNU1T/MZv/O/43Of+0SlymVNOOeX0zqQHHhAGbjq63LESc+gBWAPz3BGlTlONUPC6PJoVQLiD058raKlgqDrIvaxGBzjoq3/H7jqNAdHqRFNHmacJJdDC72MOXrbr/Gc5E5XUae7lshyEnurOndYxxyXLUJ9uIw7CxhyE6lDTdmJ8er9ifSTgoVGEbhMOrsfaVEDUHbpZxLSzTC3L7/g7o0lXqxU2NzfxxBNPYHt7G9VqFa1WC41GA+VyOdzbSTCZaYoZwUnAb29vDzs7O9jc3ESSJBgMBkjTNACDlAXbJQisdwszIi9Jjg8m6F191COjbm8HCGc5aGnLMTtX/WU5j9U+skgjmfm3/1S9E1jTtLbarmZDYBQn78xlumDKcTgcYjqdrh1gIdBHAJfRsuPxGOVyGY1GI0SBVqvVMK8RACbguFwuMRgMUKvVwt2+5JPtFAqFcIiA/CuQw78d6NL7Zyk/n9f4Ta/XQ7VaRZIkIaW1zk/FYhH9fj/cs0u7a7VaIYp0OBwiTY/TaCsvBCcJujNN+Xg8DnIibwTaCcqyz+wfUzoriFQoFALgzHoIBmt0+IULF3D58uW1O3p1DgGwdv8zU2JXq9UwNlgX+1etVpGmxxHfV69exYsvvogXXngBvV4vjFvOo0zTTJCUtqmAoM/DfrCHeo3pnIcHGo0Gzp8/j/Pnz2NzcxNHR0c4ODgI8w7Te+vcTtkdHR3h8PBwbW6n/vXAE9c33ovdbDaRpilGoxFeeuklDIfDcMhLv9WU0HzONfOktPVvlLLmGn+vvytgFquPdVAfPg8C6wfnVHbe3klgV6wPsfexQ2DKhz/3SEr/Jva3kgN9+jxLziSNRPa2fA8Qq/ckPm8H6mpdWXKPtaEHLtxGYn2N2YgezvJ9ksuUffHnfogvVlbb159Za7HzHbN7/z+AH47M+ul9VHJ5x/YQvg/TvYrv75Q37a8f9nTyfbaW1bZ8nQXydNE55ZRTTjnl9I6izgawefbut1soAvW7lJ76PqbHf0cDr/yL/N7ZO0mFQhFf93X/Fr792/8DPPzwB9BsdjP9x2+W/sE/+KuY3+O05znllFNO9wO9KwBhBZjUGeNOK3UiaaQCHS2aupbOmSxnkTukPCpBv0vTm6lAWY9Hqrojy0EjvWdRSaOXXA7qVHXAhc8VnARujXwkGMe/WUblymcOjJJvlbfWr/3kM5WH90H5Vmee64nyZr3qiNP7k71dBzdOcrY7mOXRKFomVo+DWm5f6jCNRaRkAdtZRB7p7KUsPKV5o9HAhQsX0Gq1UKlU0Gg0UK/XUalUMJ/P14AzypYgM+/rbLfbmE6nODg4wOHhIZIkCSlYCYwSAGJUMgGzUqm0lhKZ/feIQL0/9HZpox28cGd5rJzrWXUGrKecvB0RiFP7jumTutBDDCqbmHOfEdjT6TSkE67X60FGPAQAIAD4hcJxiu/VaoVGo4HhcIhisRgAX0YGk89GoxFSHy8WCzQajbW5IU3TcHDg4OAAg8EA4/EYxWIxgIiaZl9lSbukPn2eABCATZ/PmAqadyYzOpTAHeur1WqYzWbhIMN8Pg9Rx7z/ejAY4Nq1ayEdM+0qSRK02+3Ad7PZDO9UrowkLpfLIeq4WCxiMpmEvjtowL4Q9Od4Yn0EXTudDjY3N8MYYxQ22yao7OsO6yJYqrbM+57r9Tp6vR56vR663S6+/OUvY2dnB4eHhyGVsuvH7dlBPV3X2CbXP/bddVkul9FsNnH58uUASJdKJQwGgwCQsz+Ul897tEXaAOXENNiUzWQyQbVaRaPRQLvdDmD/9evX8eKLL659G+uPgm7U+9uNDia5LN1WTvpOD0nFgDWuiyzjEZMaSen8OMDk65rKww/AxeZcXxOzwFWlWD3KX6y/Dv7p776HU55i+z197ut3TOa+bni7KscYqZ5UbrFyWesUv/fyfqBO+36SMyar/Vg9/s7XNW3LbVf76wBorN2Y3mJ7rBivsTnZ95Mua+ffZesy8wMX3l8gDtp6n2JjQuvwvsf2jjnllFNOOeWU031OD733OFr3XtD2BeDLTwO4vY/jTlG9W8C92r4kSYJKMw8RvpOUJAX8G//G9+KP/JH/G6rV+qnWfe3ai3j22c+fap055ZRTTu9UeuABYXXYKJAZ+1sdgFmOI3UGqSPNnfr+j05vOr75N52uDoawLbbh9/3q/WQkfaeO6RggmuXUUmDa37tjlKCE8k8wj/WrsykWKRyrX3XjOok5WB0cXq1Wa1GuWh//kWevL+Zwjzn3XBZqJ16/f+O2pHy4A9JtTSO+lU+WU6cheY6BETGnMNsmwK99oYxrtVpI9cx0xI1GA6VSKUSbKuAGAPV6fQ0YWS6XqNVq2N7extHRUQDgWD8jf3mHK6P+aG+MGmbEZAyoUIDRIy9PkoWDCPrsJMd81vsYeOBEHnXsqlNZHciahp5RiQq+6eEMjeZltGO1Wg0ypdyTJAlRwkwFTGCNUbOj0SgAueVyOaQAn06naLfbAYxklOxiscBsNgttTKfTMC41GjNJbqY61fug1Z6pRx2nTBdOeZVKJSwWizXgs9FoYGtrC83mcTotRgdTZgS/er1euFOZd8m2Wq1Qvt1uhwj0wWCAJDm+/5r8sE/KN++w7XQ6IYo6SRIsFovwjncLl0olzGazW8AIPUySJMnanc8s1263QwpwBaD9wBOBX0YD875ljjGNYqbeOcbS9PiAxxNPPIFGo4Fnn30Wo9EopEGmDekhG5232FedE7LWBpbV8Vcul9HtdvHII4+g2+0GIHw2m2E8HodyaudM780IX8pa54v5fI4kScIdyjyUQvtkGvFKpYK9vT28/PLL2N3dXZsPaY/kXTNq0H65dp8mxYAeBcpi605s/dT3mvlDy2TNa9qul4utq6pz2jftNAvsAm49/OW2o+tnbF0+SU7eB9an9cQotk7r784v3+nBAZeZHu7zCNqTDhT4nk7l52uP6177Sn503+n8xfY6sX2Rk9ulA5HatvfF934uXz8sqbzyG28va53P2oN5v7JsROuNAb98zu+5Bvma789iFONf+VN9ZR2kvJ2d55RTTjnllFNO9xmVysD5y8C9WrubXSDBvcSD8fBH6yg88F7sdy997GPfin/v3/shVCq12xd+EzSbTfB3/+6fx8HBtVOtN6eccsrpnUoP/FLqzi6PbtEIWIIoBCHcmebAjDv01KGjJ/75jvXScez3n7Iuts30m6xLedey3l8HXvWZRyIw9aqCySofddo66KbtKADqUb8Oxqoz2EF07YfrTp1t6nQjCK0pVB1UcIeXghUaFeWyVR61PzHZsF53Zmpdqmt3+vGdAmMOAKnDks+Vf5db7PuYg3G1WoXIOL/HT+XNlLjtdjtEB6tsFahJ0zSAjyQFIhmx2e/3A+ijqZMZ0af88ztNLes27fZBAOl2aVtjIILrKzZWtbw7ud8IaUQ6xw0jLj3qUUFubVMPjAAIABhBwKOjIzSbzZA6OU2P79BNkuM7UgkGdjod7OzshHuF2edisYhGo4HJZBL0QLBwNpsFoJH3BZMf5Zu2kyRJAOCYVpoAnt5vq0C59t31UCgUwh205XIZ0+kU8/kcjUYDnU4nRPQSMCSvjA6mvU+n0wAipmmKfr8fbGe1WqHVaoU5+ejoCLVaLaTIJq1WK4zH4yALRkwTKBwOh2upm7nm8E5h6lr16nM37YKHMQjY0sYJ1vucRGCb9zczpbhGRStoT5CYoHihUMBDDz2ENE3x7LPPhpTf1BPHl2YV0LmK//ywD/vG/lM+rKfX6+Hy5cvodrvhQMN8Pg82pPdRcy0gH5VKBbu7u+HAQ7lcRqvVWjuIQplQTsxUUK1W0el0AACDwQCvvfYalsvlLXcHO2jEdT5JksDbnSAHykhZ4GnsMJGvu/xGf6ruTlqTtU5+nwUienlvU/sWAw9jgJbrwQEy4FaQTtf42J7DgcjYe98DKvCn7cT2QCqb2Lqs4KzLytt8I7p1G4jJTPvoUejaJut38FW/88Mh/r3/7f1wPcfW1CwdxexTD+EpX3rIg+uBXivgsr8dH3q4Qvdp/r3vt7WvWfal5f0gqctAdRPbZ5Mv7jlyyimnnHLKKaf7nJIEqFRvX+4BpvnodDIvvRVK0xTXnjn5KrKc3h596lN//NTB4DRN8ZnP/DR+8Rf/p1OtN6eccsrpnUwPPCAMrEdceEpEjYRIkpuRKnQsK7DEcjHgSR2OBFndYcYyGoUUc9w60KXfsE11uNEppGmm6RzSiCuPGKDDNgYyxhx2Hn1KXjxC0x2AWrdG0pHcaezApzslNXLO+6t8x6I4HFRSB5o7N7MczBrhqPIoFAoBxNQDA94fd7TzW+1/TM76N3Wr8vB+x5yWsYMOJEZP6l11SgQPCTQyVfB4PA7RlMViMUSOzmYzDAaDAPhtbGwE+VcqFYxGoxAtSXBZ7ZVOSkY3FovFANwAN4EXd3LSJqifQqGAarWK6XQa7XsWyOFjnL/fzknuv59ESZKE9MEK5nr7tKskuQnGUv+a2lvnlVKpFNLjtlotbGxsoFKpYDabYTqdYjgchpTDbIsyIui2s7ODQqGAXq8X2idoulgsAgBcLBaxt7eHJEmwtbUV2q/Xj9P8DAYD9Hq9kJqXUbPsq0YOc45wAF/1qoc5eF81ZaYgMoBwV+/R0VG4P5iplXlH8nQ6DQAfgBDtTtAXANrtNiqVSkghzDE4mUyCHgjEEnikXjQ7hIL1lB3nHZ2n0jQN0cxqFwBCCmV+w9/ZP019zwMyBMnTNA0RybRTguPlchmHh4fhkIDaEsf/hQsXsLOzE6JlaY+UB4EFHU8OagHrayr1o8B+uVzGxsYGHn/8cXQ6HYzH4xAFznt8GaWcpilarRbG43E4tEAA+ODgIKR5JqCrEeIcB5zbAIT7sZlOfGdnB1evXl3rlx4m03lD36nOTpuy5nKVb2xuO4nUBmNAntbv4GYMLI19x2/5TOfUWN98X6L25Gss3/mhuFgUKd/HDto5b74GxMrznR5WioGU7J/LyG1H38fWf33mh0ZUVjF++VP3MK6Hk2wlBiw60Kp91+tWlHQP57Ly/ViMvI8xu2MZ3SOrjGP9Ujn5vk/50Yjm2KECHQu+r4y1z+9iz50n/7+L7499LeR84DZ+0n4xp5xyyimnnHLKaY3SewfGkl76/AQf/X09lCr3pv29l04OMrjbVE4SrNIUd+YI8t2ls2cfwVNPfc2p1/vss5/Hf/Pf/AksFvndwTnllFNOpAceEKYjSMGEGBipDkiPxPL7FQHcAkqQYoCeOshYbxYPWj+wHtHhDiFPDU1nJMvEAGc6/DyFrtbljl13iLK8tktQIeYsjjnE/M5k15k7z9RZmQXYKbCibcQAZXe4uRMzVpb1ELTQO6mVVO7u6HZ5xpyX2q7qzQEA59WdlG+WFMBQkF3ToROQ4d/j8TgAjASEqYdGoxHAOAIuvGt2NpuhWCyi3W4HGY5GoxCdx3TD6pRXuwRu6tuduw4gsM6sKBgHMHy8ue6ynO5ZOj2JNNo3xjt1oQc49LAIwT7tA/vM9M+z2Qy1Wg3NZjNE+RJ0WywWGI1GwXFMgLLVaqHf74cUvIVCAcPhMICGxWIxAGmFQgG1Wg31ej0AyuRBxwfBTUZ5DgaD0NdqtYrRaLQ27mmTlAttS2VPuTDCWMc+0/3SjmazGfr9fgCBR6MR5vN5sEUeSNjb2wv3VdPGV6tVACGbzSbG4zE6nU4oo3ohEN9sNkO0KwHGarWKer0eIuk1MpbRqgS0+Ezv16W9t1otAMcgNO+FJvC5XC5DxDBBgUqlEuSUJAkODg7Cd5PJZC1KWXlSQJrjuNls4vz58xgMBsEGdb3ywwvz+TwcliEgTj5Yhs+p90qlgkuXLuHChQvodDphfikUCmtponWsMJr54OAgHFhhmnRGQ/NQCQ+hjEaj0B5TndOmq9UqCoUCptMpXnvtNYxGozUZEvymjH0+ZhTzaZDvKbJAvhgw5vMaKQtwU8CKIBrtWOeZWNSt7nOy1iMHC12HMTDO11MFQLOASZIfevMDYc6T72FUdt6PWBTwSeTzmus11obvHWP7upPsw3nzPelJslB+/ADESfxzDtZ2smwtJh/9W/d/ymcMYM7qv8oBiEf/6gE7rUevYYjZg9qkr8Mq75PsWWUW2+epPNSe3d5cJro+6t9qA1kZkXLKKaeccsopp/uQjo6A/h5Qa9yb9l97AbjHe4b7AJO+L6heKOCj7Ta+ZXMTu4sFfnZ3F89PJu9oYHhj4zxarc1TrXM4PMDf/Jv/Icbj/qnWm1NOOeX0TqcHHhAGboKr6px1J00s2pIABJ1F6tCJRbR4ne6UVRCR5M5UdTrFnDmx+yH5u0bJxdpgH9XppI5f/vP+KCDudbuMYzzxb3V+UResi6CjRnBoVEnMmekgoAO/+sy/izldWc4d6FlOXP07FtHkzj7qIubEc3vxd/yWDjzW4+BkLErF3+lzb0vTMasjl4ANnaP8fTweB1CEkZIEXwiqEYxi1CJByDQ9vjN4d3c3AFsExBwA5XOOSUYGJkmyFi3L9jW6kWMoCxB252rM4R1zYmfp7HaggBIBF3fG65jXdtWGWYaAGm1CD30wLS51wKhJRrguFgscHh6i0+mE1M8E3ghWs17WwXtvCVgSiGX6cEaLjkajIG9GkpdKJbRarQBC0950/iWfnAtYB+tV5z3HA98RLGSfW61WiIpeLpeo1+uYz+dBNgRBAYRIdx74ICA4Ho+D3ACE/rI+plxOkiQcitA7rBUc4QEJpuReLBZhLtSDQTp3sP/sOyNZJ5MJtra2cPbs2TAeisUiJpNJAGmHw2H4VlMxMzq62WyGtMZMpc0yi8ViLc23Rht3Op1gR6vVai3iWP9xbuAY1nEVy4pA3i5duoRLly6hUChgMpmENNxM+91utwPQrKmymaK7VquFyOV6vb52HzlthNHrBOo5TzM1OPU9Go1w5cqVtajr2MEqXR+5xmWBVm+GfE3KAnr1p5dRUiDXQTySr6+xyFFf451frzu2XunaqvOp20YMBMwCbh1Mi+1ZsuTj+ycHIWP7Ki8b65+Drr5GxNYM16/238FAl1NsXdK6lB99pnOPlov1IYtf/vR9hPflpLU1Fjms38TW3iy96z6C72IR4zEQlnufk8afv4vpRskPlWXtH3w+ybKZrAhf/c5lwe+8vZxyyimnnHLK6T6n1RHQ3wfOPnRv2l/eX9Gx94IiW+y7StUkwcfabXxqawuP1GooJgneW6/jI60W/sVggL93/Tp2TulQ8t2mr/3a70SxeHoQRZqm+OVf/il86Uu/dGp15pRTTjk9KPTAA8LqlI85c2LO3Nj9X/q3g2VeZ9Yzjexzp7+DIPqt867PWJc72mIOKX7j9x8rIEzQGbjp7KYjnECBO6g0YkHbU/nGwFEvF3Pm0omsMo05sOg8VFl5RIpHF7EMo9f0mTvXPOrX22a0qsrW23eHW8z5ybrZ75iTj/xr1CCJdWkfYvafRdPpFJVKJYAlGjGn9c5mMwyHQ6RpGtLvMvp3Mpng8PAQANDtdkN64dlshmazGYCa8XiMRqOBzc3NkKaWUZjsK0EzB5kIVlHufEfgGsAakAbcvN/YKUs2WQ7W2PiOOW3fiLwrlcoauK9jSiOT+EyjrjRKWOcPAoOsr1QqodfrodFoBHkCCJGzi8UCw+EwAOYE2pLkOLVzuVxGv98PaZUZ1c0+8i7hNE0DeFipVNButzEYDDCZTMJzPzhTq9XWwMhYxJTeD6s6ZXpz3pEM3Jxv2u02NjePT5cy/bNGvRK0VR1S3o1GI8x75I13W6tcyBMjexUAqVQqa2sJ5cr7tTnWybuC+w7S+P3QlUoF0+lxuqMzZ86gUqlgf38/2L8fgKJsZrNZ0E2jcXyq/ODgIMwz7B8Bf8qIfWVaeALqjDBXnShwzn771Qs6f/qaQzD4scceC2N9OBzeAlSxbh2T5KVWq6Hb7eLo6Ag7OzvBLvme37E9pu6m7tl3po8+ODjA7u4u0vRmJDDl7OsS+6r3aJ8mxYAhlY0DoLpXcXA3FrGpdervOg9pfbEDK0ox0Nfb1PnMo3m1jLZDih3MY5kY6OcApZLLLXZwzMufBHjGQD/Xhdcb2zvpoYPY3knr9X6QJ33nAHCsnL7XNS8LkNXvsuSu71UOsbVU1wmvL3ZQgX1mHXrIygFW5V9tUuXiOsjaf/u673bn8jxpP+AZdrRdbT92F3gMyHc9+36aa2tsLOeUU0455ZRTTjnldCsNrh/hxvPze9J2rVDAx9ptfHJzE4/WaijYfrBaKOCrOx28t9HA//v6dfzzfh/z2/ii7icql6u4fPkDp3pIcbGY4Wd+5r/BavVOjpvOKaeccroz9MADwu4kUtBQnS4aUUhnLx3VBFX4d5ZTTkEzkjrU3OmiIBZ58rR16gykM92dp9qeghJKHh3qziF1jqmTyB157qxVUFLBYnWUOS9aB3n3tHz6T2Wo+nIduBNUo5PZD5cl+6AONHcqexuxKFy951bLxpydJzn+3D5PcvLFyJ2AWUBlVh2MECUgrPeRViqVEA14cHAQwKJCoRDSPastjUYjrFarABwNBgNUq1V0u100Go2QcpiAcbVaDTwvl8sAYCnflAmBGe2nRxWrvJW3WL9PcqjfjlyXWXbvxHnFQSUFanRMsN9uj4vFInyjdy4TOCfARwCUUZ4Ejufz+dr9rJoyt9VqYTKZYDabhWjNer0eIjVZB22DNqR3zhKIm06naDQa4a7q1WoVwFSOHY4ljj1GhvO5z596eId8kHcCkxr5DtxMNc4oYqauVpCB0dI8vKD1U96LxQL9fj/MXbPZbC3SlNHG7Dvvc6atL5dLjEajAFATAFUwg/MUZcJ025PJBL1eDxcuXAjvyVen00GxWMT169dRLpdRrVbR7/eRpimazWaYUxhVu7GxgSRJQiQ004qr/IvFIsbjcSgzHo/X9MSftE+NCFagmLar84TyvrGxgcuXL6/dMU2b5fherVYhNTnnl1qtFu4tJx0dHaHf74eDEAT2S6VSSP+8tbWFJEnCoQXaL3leLBbY29sL/T5pTOucQ7m9GfI5483M9ScBjLcrF2tT19os0M3BWG3D9wlZAOKb4emkvz3aUfdJvteL8eN8at0xUNPf6Z7M64utvzE5eDntR6yOk9YrlT/HJtfFWDtZe4usfYi3o/s0l7Xz4e/079hejz/9cKHy7fqM1a31+tjU/aBmMoj9X8FlkxX17t/G+u12q3sHP+hx0vyj/KsctS1tTw+NaR055ZRTTjnllFNOmbRaAfNbD9e/m2i1SLGc3d1DdASCv3VzE4/UaijZPl4pSRJsl8v4Yxcu4KPtNv7Ha9dw7R0SLby5eRFPPvnVp1rnCy/8Oq5cefZU68wpp5xyelDogQeENRomFuVJIFgdLhrBoEAwAQh1sLBevVdQnZAxAFl/OniU5fhT4IvP9XcFgt3xpVFZLOtRYewDgFsinxSg0CjnmPPN++DyUr4dJI+BaLFoCwfNVU8xZ6bWraBCzAHvenBnLMEX9k376JHaLg/WpxHXKjv91gETlnOHs9pqzPnv/N8OZADWHaIAQkQgAZLVaoX9/X10Op3AH+9hbbVa6PV64Z5UAo3lchnNZjOkouWdwkzl2uv11lIEz+dzTCYTzOfzNZCScqb+yRsBJODmHc+0c0YEMuLxpHs9TwIiVJYxB38W+HKSE9fHCb/TAxb8Ww+tpGkawC0fm0mSBED46OgI3W4X3W43yEQjOwnEUc5MfVwsFteAtCQ5BnfZPgFiRsKmaRqicLvdLpbLZUhd3Gw21+ZVBXb7/T4GgwFardZadDfJ5169E1yjS1nvZDJBu91Gu90O4CTBwtFoFMDxxWIRUmNTbpoWfTKZIElupskmeEobJk/L5fKWqN5CoRBSZKud8F7so6MjTKfTkL6YEdAOKCpwz+eNRiPoaGNjA51OB0dHR2g2m9jf3w/ji2NmPB6HtNm0M+qOAGqlUgn3KTebzWA7AG6J0Ffwh//Ujqmz2Lyu1wJwPqE8qKfLly+j2+1iPB6HAyPlcjnYIeef5XKJarUagGvOxZR9uVzG4eFhmEtoswCwsbER5Kvpw3mQgIcUqHOmtPeDJb6GUDZ6j/KbIS8f+15tLBb1FwO9VHe61ui+JQsk1GhEbzsGuP3/2fuzXkmXLDsQW5/78dnPEOOdMm9WViVrQBUHFIcGe3iQVGqoIYkNQdOD9NAQBAj9oH+g94a6HwiIkCDopSUCLahBQS01AaopqptsoFiciixWUcWhqrIy82beISLO5LN/Pn16OHdZLF+xP4+Ie09E3IhrCwicc9y/z2zbtm1D7GV7Wx0x52uQ1uV1ezm+1kU68v1QVI8+53sxr5/16b6B37kcagtel38XrQ+OqB+4Bvi72hbKrM8oGUvZdQ8X6aUuwhWoj/KOxoLLEb2ndUf2qm30dnMe9j17VHZUt/a9rqH6fwG3ISfV68ZW1AbtnwhRtK4euKRsnOv4XN3Y9Tb5WNHMDlpuRkZGRkZGxjccux1QVUDNXvKVYbMCnnz2euv8lqIA8LDdxm/cuYNfGwzwnU7nmYjgQ2g1GvgLx8f4lX4f/9XVFf76xQWW3/BsML/+6/9tHB/fu7XyqqrCX//rfwWLxeTWyszIyMh4l/DOE8KRQ0edSiT41PGppIM6Z6I7hSMHk5+6VyKHZXrkhzrFopP+7mDjc1HkL9vgpJU7jTRiWut2p5VGfanT0J1OUWSFt5EOc9WZ16eEg+vKnW583x1zSrCp0yxyeqlj3Z2P+hkjLN2Z6k5zb7fagvad302nP+v6Te3No5HVmagOSLehyGnv7SFJRUKK5fDuU+AmFe/x8XGKcKQ9kURjamG+z3SsJF801TCjjFerVSIyx+MxWq3WXlSpykcdUj90EKs+2Ab2/SFC+HkEjvaFO+Sjdw85/dk3TjApmaP2q05cJaa0DBLhGlG83W7R7XZx586dRPbNZrNEjk2nU7TbbaxWN6mPSPryTt7r62sUxc19q7vdLv3sdDp744ljotvtoqpu7pNWB7+mdGY6XUajM1W1jkMlXZS88oMf/I6pzpU8YWQwI4Wrqkq2yfuueYcwdU0SmzZHglEjkUmYMvp2sVig3++j2WxiMpmg1+ul7zqdDrbbbUpbTQKUZCMJSbUntWG1JZLZo9EIR0dH+OCDD9Dr9VK6b9o20yyzrzlWSHw2m010u12UZYnhcJja1m63cXJyktK+DwYDLBYLbDYbTCaTNH4pv2ZgoHxOjOnBIxKt/F3fbzabePDgAT744AO02+0UeU2bXy6X6Q7qXq+XSPWqqhLhSz3QNmm3jMqmjrrdLobDIabTKUajUYr6Hg6H6Pf7aSzRPq6urpJ+OC4iwor2/irSRdetD9H+o26e9zVNy4zWq6g+L8frjsgxX1N1Pa+rX8v3ddznBpc1ar9/53N23RrrMmr7IwLQP3ed6R6rrn6XAcDeuqDl+fduA/qdy+pyOnEd7XOft0bqvrmuP/m37gO1b90e6iKPuSZwj3LInnXPpntOtU21CX/ebVF/9/9P1NlYVG7UZte16lSf43u+BuseXuvTvnfyPZPBGRkZGRlfFT/X6OLnmj38bLfEH20Xb1qcbwc++xHwgz/5+glhAMDLHXh9FVhOdhh/scbdj9uvve7VfPfKVfC9Tgf/zTt38OdPTnAifoKXRVEUODk6wn///n386eEQf+PiAn9vPP4G9OCz6HT6+I3f+Pe+clsjbDYrfPHFj26tvIyMjIx3De88IRxBHSfqbPKIVUKJKzpi/F5Eda5FDjiNKlXnJvDU8UNih44ujzbW8iLHkToclUTRNlN+tomRcRr5WhRFInc1jas6lLR9bAvrU4eb6tLJAiVtXV9ehzonXSfukKe+lWhhG/k3f3enJKF9rZ/pu65Tb6NHz/mdv+6k1mfqnLbuYHTnZ/R9dHDgeY7dyPFJG5lMJjg7O8NsNkOv19u7/1TvYuZdxIxI7PV6iZhixCLvEi6KYo+c0/4hCUryh/2q93Xyd9WDOz41Uv557Ve9RQRDFHUT9c+hepjGudVqPTPnuD3rePQydEyQbFO7ZcrnXq+X5GQ06Gq1wnQ6TemRT09P0W63MZ/PUx9qf+qcROKQpCfvXgWQxh8JOkarDgaDROiTlFbCn+3RqG53Wuv3/Defz9Fut1M07Ha7xWg02rtnerfbJT0wmni9Xie7ZCQsI0Vpb+12+5msCcPhMPWbzkuMeC+Km/toW60WJpMJrq+vU1p14Gm6ZvYXdUw5+beOPabfrqoKDx48wP3797FcLtM9zUVRpChvyk/dsa2dTgdnZ2coipt7kO/fv59snGPt8vIyRVWTGGbELNuph6j0AIGuB2rH/Mn28pAR3xkOh/j444/RbrdRlmV6ngcV1us1Tk5O9sY0SVuSQpvNBmdnZ6iqCtfX12g2mxgMBjg/P8d2u019RrsriiLZLEniVquF6XSKXq+XIsVHo9HeOs7x5dF7nIvYR68CEVH4PGKzbl0A4jtSdQ/ja0VdmS5DJJOvUXVrmcPn3AhOkEZt5XN1+zxtq5OPUX1qv9H3esCnrjwtI2q7t6tOfxEJGqEukrluH6Tt0/ZE9fha6zI6wRkR+4f2KK5v70PXU2SHvnd2vUX3NWs50SE+16X3D21O69V6dP2O2hmV7VHKftCV0L0f9z9ar+o2IyMjIyPjZXGEAv9G+wzfaXbxC7seLpZrXFW3eygyI8B2g28CMfumsJrtMH2yxd2PX3/dP/6Hc7zK62gLAP+9+/fxr5+e3lqZzaLA93s9/C8//BB/5vgYf+PiAj9eLm+t/NvAz//8n8Yv/uKfv9UyP//8j/GHf/jbt1pmRkZGxruEd54Qjsib5zl31Dni5KOmqFMHjEYqRinlouhSrVOJBTqW6bxxJ5z+c5lJXKisHg3gTnslSf05Ogvrovf4npKidJYrIa0EnUYw8PPnEXVOBrMcJ/7UUam/1zkRtS9UN+o81PKiaI7oM9cP9eiR29oGJYOjCGz9PHIIqh24XWgbDjnWWZemwgWepg3f7XYYjUZ48OBBuj+YjlT+znS1wI0NzudzNJtN3L9/P33WaDQwGAwwnU5T+l6mJmY9R0dH6S5XRmWSRNOxodGn1AXJ6UPtPAQdN9Sf9uvz5o0Xgd45raQH266gjvme2icJOrUVRnF2Oh10u9307Hq9TsR7Udykgd5ut+nuXZbBFMTU52q1Ss/quGDEK0lQkqhsW1mW2G63iaDk/beMBAeQ7tJlf6meqQeOD7Zb7bHVamG1WmE2m+HOnTvo9Xrprl2m1SaZSTKQRDUJVEYpc67m/djz+fyZ6GWSvlVVpfaRzD47O0Oj0cB0OsWDBw/QbDaxWCywXC6TLhldy3doy7Q3jm2mSiYx3u12cX19jd1uh+9///s4OTnB5eVlSqVcFDcprtlu6n273aY0yavVKqWJZh9x/FVVlUjrXq+Hy8tLdDodDAYDAEhp2dnHbvcaFavpv32uJBnMgxzNZhPvvfcehsNh6sfJZJIie0na6l3O2qeMcO92uynal/VTr/1+P6W4p+2R+Ne7p/kubZL/gP0oTZ2n+J3W9zqg41DnJR9D+ixRt07q93Xf+d5DD/Hw7zp59WcdAat1K5kWleUkpB9A02ej8oFn7+mN5NN210Xpus6ety/xPYPrNuoDJfj0Xde57mMcUbSs9w2f0351Par9uc1Fdej8xv7yPY+XDewfovT2eR/oe65HttPt1/eV0b7PER0U5O/+fqSzQ/p0Ilo/5+9OMOtBPH0mGnOuR91TZmRkZGRkvAx+odnDB40OAOB+o41/rXWKv7W6wCvkyzLeJCYj4JazIL1teNVn6L7f7eLXj49fSdmdRgP/xukp/uRggP/jZ5/hd6fTV1LPy6LRaOA3fuPfQ6Nxuxlr/viPfwfb7dtxf3JGRkbGm0D9hVbvCOqcL0pkefSX3leqDi7+rQSUOuz1Oa1LnV0uizvdnCDVuxHVmUW5Sdqp04tkA+tSApG/6x2HkZNUo7i8Teo8UsKQ0Z8qe+R8ZbujiNyIUFVo+/09hRJGqlt3GGsUr+rIHZ76vt/rqe9oP6mjTR2f/q5HqkdOcXWAe1tZh5ahUaJuj9SNOgwVTDlLIowytlotNBoNTCaTRN6S2KmqG7KRUcEshxFzSkCSpGPE6mw2S6lpWWZZlnukHqM7SRLps9pukkxsq6d/Z0RunW25XqPP+dkhe43eUZDgiqLkdWywjzi2dK4iccW7aVU//I4EHPuAUH33+/29PuJ3u90ukW5VdUMWdrvdlLaZTmhGETcajUTa6/3PSlhW1dPU6ySmKb+mwe50OnupntUJTjk1TTkAjEYjnJ+fJ5mOj49TimsSi4wMZrsZscyUwrRZEsLUHe9U7na7AG7uPuZdvmxHp9PByckJGo0GTk5OcHp6ivV6jclkktJDUy+TyWTPaa/R1fo3bZip1gHg448/xvvvv590SBvXyFeOocVikSKz79y5kw5ZTCYTfPbZZzg/P8dkMkGr1cLx8THm83nS5Xa7xYMHDzAYDLDb3aSCJ4HK9SU6KMRDBzrn09418nq1WmG3u0lD/sEHH6DRaKS5QMcebfH8/DwdUiCpS5KbEdTL5RLT6RS8K5vzAX+nPZZlicFgkO7JVhJZ1z3ega7jUEkWne8B7K0NXxdOXNUhmj+ody9L15a6SMEXXYP5PMditJ48bw6ta5+Ob5U9IlH5fKT3qB2+xkfEnLdR341ItkO64pwW7SejOtSGonXfdRDJf0gP2va69+r2zc+T2etxOXXN1r2ZZu9wXdfp29vpe7OoH7Vub7vuoVQGlY2/+wHGqJ1RW1yPOne6rHpwMuojnXP9e5eN60i0/1X5MzIyMjIyXgZ/6ugYTVmb/uTRED/f7L9Bib4lqPBmAoQnV19GJ2e8CjQB/Hfu3UPnBf7/93VwcnSE/+nDh/imXBjyve/9Sfxb/9b/+IX+3/sy+MM//O184DEjIyPjAN75COG6NGn+mRJH6simk4Xkhzp+1THnDh0n6DSy2ElSlclTBkdOMI2w4DOa2tmJTpVJ64scg3SYebSPl0WoDtQJpe9rtKs781R/Xp7KRye9k6/anihKxh3FUYQt31X9uZPfy3QZtOyobyOHqDvmXQfqrPPv1HmqNqN96LLo789z/i2Xy2cIQNZRliUuLy9TelaNRF+v1zg9PcV4PEZR3BDAjUYDp6eniRQiEdfv93F5eZne6/V6GA6HGI/H6e5b2g8jNdlWysTvVT7tGx27jUYjkZcawei68c8ih7S/U0eE1OHo6OiZqFxtA9vmJAhlV7KE9ZFs1fdJhpHIm81mKSqbd9Heu3cvRWiT0GMEt841ADCZTFJqXRJ3Wh/lYprl4XCI5XKJTqeT7qvVsaBRuJz/1NFdVVUirkks8jNNtcy2Xl5eot1u75F97Hs+xwMMx8fHSV7gaRrtRqORZO50OimdNaNtebcwCVJG4vLO3s1mg+9+97totVoYjUYpJfpyuUzkI5/TNN60Ab+rnvayWCxwfHyMH/zgB+j1epjNZpjP55hOp6ld7XYb3W4Xg8EA19fXafzxgEBVVamNVVWlgx29Xi8d0mg2mxiNRgCQUixrNC7nAE3DTztTshh4ms7ZyXz2CQnYwWCQ7jgGkNJ+s3853jnWaV88hMLDI4vFIqU2J8FPlGWZshVQL2wPiWKmp1f9UP9cgzhGff3Xgz+3AV+f6/6mPPzMofrWZ6KIZz4frWOHyD092BIRi94m1q9lurx1BG9dedFepI5QjBwOns3ESVwtQ/cWvvdxOVzvh5wdh57x8UNEZLP2j7ZJ9xLaDs9cUtcfvvZ5W13XLm/0Pn+P/mYZqlffz/n6GEH3Zt4fdf2m5atMkc2qLonIfl1W143vSd3etC1aDtdGzYrCsnTeimzfr1PJyMjIyMh4EdwvWviwuX+HawHgN9p38cWyxKTKccKvDPMJMDoH7r73piX5VqGqKmzXr46J7zeb+JODwWvZk33QbuPnej38cPFm7/1uNlv49//9v4LB4OxWy12vS3z22R/dapkZGRkZ7xreeUJY09QBz6bhU6eKkhuEO2/0HSXy1FlX56RVR447e1xGLVPJQHWO0Xmt9dKxpxHLTmJqnSqf682d3bvdLjnm1XmlOlZHqtajzjx9LpKPZfrvlNX17O1iWerk1AgPjXrlc3yG0PL8Odel24nr00lLd6g7IieryutOQ5W3zlGpcmmf1kGj5ZiqlVF0VVWlO1Hb7XZyQnY6nUQOdDodLBYLDIfDRCZ5pB2ARJYxCrDRaGA4HGKxWCTSVKNOPdqK+tHoSrZRUwy7DX2VjXadbiMi5HmICDLvby1bnbp8lj91fmCqYAApXbQSXIzMbDQauLq6SiQ8I2mn02kidNnnjGplpPZkMkkEGfWukXwknykPiVAdlzwEsNlssFwukzObdqdzCPA0/b1GEZNcVb2tVit88cUXePjwIR48eJCi2vv9PjabTbJR1kvCD0AiB3V+4CGGonhKgu52u3TXMvuHY6PVauHk5AT37t3DbDbDeDx+5q5hEqw6//kcxHbpHcZHR0f43ve+h+Pj43QHc1VVWC6Xz5D/JId3ux2Wy2Wyi+Vymco8PT1NxDrb2+12033Dg8Egzfenp6cpylbXmU6ns9evjEjn9/wsiqpTu9Vod/5UopEHRvS+bR2Pmo2i3++nO6upB6YV51jSNpAMB5DS3dPOF4vFMyQ27YNy6MGM2zyF7GtERFDyuejdiHyLIlN97a2bJ3XedsKQz7qM/pzKoz9V3mgujdZJJw19znAd1K3X2qa6Z1zW6G/XHeF7T63L16cX0Ve0xzy0/rts/nldnSq/RvL6+qR24fL6oT3fp7pOtD/1ubo10vfhbkf8GY0dl1H1oeVHOj3Ul5FufR9cZ2eRTfhPrVN/+kFOfuZ7B/8/hT6fkZGRkZHxovjVoyE6lmywKAoco4k/dXSMv7u+fjOCfRuw2wLz6eslhPM+AetFhZ/+k1dHoP5ct4uu7alfFVpF8drqOoSiKHBycu8r+eYOYbmc4Q/+4B/dapkZGRkZ7xre/CrwiqHRqR5V59EFmkItcty4I4pQglRT55FQiFK/UQ6NSlGZNNoocgLydxIldMpFi2nkcHpe5IPqjM9QJnfcsVyV3Z/hZxqRp/rm3xrh7P9Ud3V9HenJHeDqLHPntZNv6kyMnG0RXK/uLI36IXL+RrpnO1X3WifLjKKS9N/znH9FUaTo4Kp6et8n+3A2m+Hq6ioRS3w+igZnmt7pdLpHspDQo7yz2QxlWaa00q1WK5FujNJUcompp9Xm+FPva1ZZ+K7ej/yiqCMlDn0fgfOC2ibl9btXi+LpnbaMwFTb0f7d7XaJ9GLbd7ubtLckEEnuVtXTO2rH43FKqcz+raqbFNGj0ShFoOp8xmhSkoRsFw8RrNfrPQJOCVEAKd0yDwKwDQTtQ+1O5xE+z/Gj98DO53NcXFykyNNOp4Pj4+NkT/1+H81mE+PxON1VW1VVSkOs5CSjsUlEklwuiiLZMetcLBbodru4d+8eNpsNLi4ukr5JcFZVhdFotJdyXftbiXISohwP9+7dw/3795POr6+vcXl5mXS53W4xmUzw+eef45NPPsHnn3+O6+trVFWF6XSaCOSquiFYz8/Psd1u06ENplS+uLjAbDZDq9XCfD7HcrnExx9/jDt37qQxzihgjkO9u17Hma677Fc9EHR0dJTScGt0cFXdRDKfnp6mSG2WSwKXcwLlKIoiHV6h7k5OTjAcDpM8rJv3TDMynRkMmJXgyZMnGI/HmH55t5KvJb5WMlX7bRLCOgeoPl0eX7O9D3RsResMP/d10J+P/va1zUlyr8/JPS03IvSiMe/1e3lOxEVztO+ZdCzqftD3haof6lgJOd+r1JGZ0T+XSfvB95CR/qJ+8P6P9KCyHiqPsml/qF1636n+63QZ2Yjvu/VZJ6Sjd103Kr/Dx06kp+fZKZ/T/qcdqQ5UD/65/4vKUX1FduLlR3Von/khuoyMjIyMjJfBUbBuAjfryi8f9b8x6WjfWfzw/wdcn79eovbzn7y+ur6BqCrgVV5J+7DdRvs1krTf6XReW1112O12+PTTP3hhP9qL4vd//zcxmVzeapkZGRkZ7xre+QhhYD8CRB0/6kThcxp9yvc0fac7zUgIaMppfnd0dLRHljgpEslFWegIIsnBdz2aRcvTSFR3qrFNTsC6HCRA+HcUOeBOWCWnIrJRnVhKluv3kaO2rr88SrTuPUL7WJ+J9ES59P5SkhrUWeT81PZEDno64Fxe1YGT+9pH7lhWMludvtomJ+jrnP4RlEDhu4wSZfrazz77DB9++CG+//3vp2heRiXSlhgtOB6PcXx8nMgkpm7u9/uYzWaJRFwsFrhz5w7Ozs5QFEWKaCRZ5GQFZWRdHIuuFwB79+SSwHrRFK8vskmNbD8CyV0dt3xPHebuaNf5RvuV77ItzWYTZVmmqEi971UPFjx48ACj0Qjr9RrL5RLdbhedL/9joHoiyUYdk0wnkVpVT6Muq6pK9wEz8pfE/2AwwNnZGZ48eZIiwDXqXPXDv5kBQetgf5AE1naRUH306BFms1mKVt7tdri4uEgEICNuOW+TTCeBTPJU7XK3e5qqeLvdplTFLIf3FhdFkfTaarWSfmn71IvP35RTsz7w8263iwcPHqT6d7sdxuMxnjx5kuSZTCa4e/duinputVoYj8fPkDAk6hm53e120e/3UVVViuovyxL9fh/n5+coigIffPBBskGSx7pucH70lN+U1ddVnR8HkhqL9nb37t1E5AI3d16zzzgnsP+ZKpp2yjuTmTqbbQaQ0p2vVqsU5V2WJZbLJYqiwMnJCSaTSVq/eaey3/XthOCLjv06RO/7Gl9XhxNM/B14Nt2uzosRSVZHpEVEG9+NCE8noLQNWq+vk1E7nfTT9uhaqWtcHcGqdXjb6upxuXxvUSe/P+f2D8TXPWhZdUSm6kD3hbo2RHst70PXm5ZdZ0+RLWj/ehu1bfqs7+/q5NE1T9c9bS/roa1pWZ5+X/eq0d5TP1Pb1Tboc16ufx+9q39TD3pYVZ9znejezL9Tnbrda1t8HogOLWZkZGRkZBxCWT3rRyHyUaPXgKsnwN///wA/+FPA938FqAmYuD1UwHL+iut4cTz+wxLf/fVu7T454/n4mWRKe1PY7Tb4K3/lf4V2u4df//V/+1b6s6oq/PZv/w1sNqtbkDAjIyPj3cU77wVQJ4k7fNRZ6tF37mj06FCNVCRxou+Q4FNyjO+5I5N3O2rZjKrSCDkAz7yjTjB1Ajp5qE43J5z4DMkI/5x1KFHs5aoTUKNsVBaVjzIwVacSUJGDVf9pFLE65b3f63ThTjv/XZ8l0aT1E9r/kaPenY2sW1P4unNVo0LURlgef6r9RQ5e9oMTAnUORwffV8KMJBB1fn19jZ/+9KdYrVbo9/vp7lYSZRoZSKKH0X9s49nZWSLfG43GXsSeRgKuVqs98pYRlBwHOlZZluqcbWea48hmDukigpfxIoRQUdzcw0pyUx3dUYRlVT2NzvYoq2g8OdHCQym855akWlHcREnynmDWo2OQ9/D2ej1U1U3EMJ9dLpdYLpdYLBZ7qYirqtojoCeTCaqqSqmpu91u6rvdbofRaLQXtaxpqKljj2jSVPA6t6xWq2QT5+fn+Pzzz3F0dISTk5N0F+5oNMJ4PAYAdLvdlFKbB3c8BbauC5SNBw/a7TbW6zXKskS73Uav10NZlpjNZskWer1eijYmccl5lnMf2+EHNzhXtNttnJycpEhhljmbzdJ9xJqOnTINh0NUVZWiXEmOcow1GjfRztPpFJeXlzg6OsJwOMSdO3fw/vvvYzgcpvHFQxnsexKsKj/bwL99zfX1Q9/hfdQ8WELdNJtN3L9/H/fu3cPp6WlKXa13kfd6vXS4YzKZoCzLZ1KB8zk+yzTSjUYDZVliOp3upbznPctlWaLRaDwzb/hnX5dQqVs/nveZ7wt8nY/2P3yuTmZf63xuUfj8yv70TCJ1Ea5q705g6r7K2xatZdE67OtrnS794JXvDZ63Xhwi+7Q+bWd02E7ndG+zEp3ehoiU1O9db04u8t26/XH0Pv/2PZb+I7Qe160/77p2vel6qXuhqE+8rqhvdO/qOo7WaN1Lef11+wEtI9pLctxEY1bLoYw6vqI9oh+adB3UzSMZGRkZGRkvij/YznC7eXEyXhrLOfD7/wD4h/9fYHL9rUrrfP6j10/2LUfbV3qH8OvGN2X/d339GP/Rf/Q/x1/9q/8brNdfn6Seza7xe7/3d76+YBkZGRnvOL4VEcJ0mqgDiKQUI97oCNLoLI/c00WTjkoSCXRgq7PJSWB3uNHZzufVac5nSQR5hARlcqJP63TnnjqBNJrQnZnqXHQ96nPaRpJMJE6USHZiVvvAHV4qgzp4nXxWR7I7g915p45mj3DRqInoe43C0Hf0WW2DOuQip7BGsKpeKb+SJkoMex9oO9Vx69FS+o46O91xHDmmGcmrOtKxslwu8ZOf/AQ/93M/h9PTUxwfH6Pb7SYSiimJ3V6Oj49TBCtTt5Iw5LP9fj/d57lYLLDZbNDtdp/RhR9U4BjyMaIHOkiSMrLzRTbDEdkQOehfpBy3fY/4icYL20cZNCW2On5JdhVFkcisxWKB+XyO+/fvo9/vYzQapTTG1GlZlknfLIsO6s1mg5OTE0yn06Q3kvh8r9Fo4OTkBL1eD9PpNN0bTTlJvC4WixSBOR6PE5nJ6M6ieHoPss6P1IuSqUri6pxHIu+TTz7BZrNJBwuoZ7aTBC5TJWskLSOPmeqZ8jFdM8tiZCr1eH5+jjt37qQU1VVVpXuy1+s1rq6u0nypUcIk4/kc7ZTk6PHxMXq9HrrdLtbrNcbjcRpDOgfQNsqyxHw+R7vdxnA4xHa7Tem/OVczDTbvAh+Px2kOeu+9mzupOp1Ouku4LMsUjUy9axr5aC50IoRt5fu6zqltcV0mgXt2dpbSRpOsXa/XGI1GKIqbdPWM8iXxrXecsz9JejNqnetrt9tNBxtIFK9WqxTZTfvztYbtZrrx24KvlRz/PqcTvreJ5r1oPvH51Nexuvoj0lD3KVqWrj9+EMplV7jM1L1ndfC6Ijn1WZcxmmu1vUpG1ulM91/elmh/Ee2ltI0R2RfpS/dLXF+1Tt9Pabu0rGgf5vtFPczobYzK0M/8sIvqRp/VPZvrQ2VzuWlbdSS7vuu/e3n6ne8F9bCSjzmvV3XItnu/uD3qT90TsB2qH98Pe5v9cKrX4Xr5KvuZjIyMjIxvL3YH/vvcLZo4Lo5wXd3e3jijBlUFPPrpzZ3Cf+G/BRyfvWmJ3lk8+sMS5fTd2C89Wq3wo+XyTYuRMB6f4z/7z/4yfuVX/iL+/J//74b/N3tR/PCHv4NPP/2DW5QuIyMj493EOx8h7KShOqbUEeNOxui0PvCs89HJHL6rjkF3PqpTjZFGGqHgUX+Rk10jlNQpH0Uz8DklPFgmndhOJmpkHsvR6EItPyKz9D13iul3Wrc7pdxJp7JpZJYTZer0Up2yLr87LXJgq8Pfv1cnrUen1DkFVU+MkFTdOPmrdqK26w5PdzD7O6pvJ2eeF9W2WCxSelhvN+u8vLzEJ598gul0iqIoErE7HA7R7/f3niX50uv10hgpimLveRJc6sjWaD/tTz6jqaJVBx7VxzqV3K67j9rh/fpVQbJLo6dJmipxoiSCRpSrfbDvSZ55ykneAczUzkw9zKhfjXRlOc1mM0WC8t5nRhhrZDGJNt6FSx0zhXKj0UiEKNMv8+5p3s07Go32ymXbGQ3OsaLObB3zJBH1/loljZ48eYLJZJJk4WEFpsXne0zDrFke2AaWCSC1u6puIp4B7NVNQrLT6eyRz/zs+vp6L3pYDyHpWkR5KQdJYco3nU5xfX2d0nDfu3dvL/Ke5Y1GoySD1s00yL1eL5VzdnaG+XyO8Xi8lxGBY1OzDdA+SVzTfp0Q1blR1yiOAX5OvQ2HQ5ycnOD4+DhFA7fb7XRvMcnZe/fu4e7du7h//z5+/ud/Ht/97nf35hCuddQF7YFkr46TRuMmSvrk5CSRxJvNJqVO9zHn8/Rms0n3Zd8moVJHkro8Tgj53kb/+TtOjnlkZjTnRWtL9B92/Vz3MtH6HrVNP/N12ck6lsv5/xDpHLUp0vWLtN2fU91GZUf69v2ar0cRgay264Tr83SkZej7urfRvZXalu4doz2Et1GffZ5srn//zG1NSU3XkT5PuesO+qmMLoPuG/VZPyRIvfmYUN3xeZXZ/8/gtq71RP8X0L+fZ5tqM66TaD7IyMjIyMh4HibVFpdVfKFqHw3caXwr4k6+OZhcAf/8HwEveB3WS2M2ARbTV1N2xmvHpqqw+oYdBlytFvjLf/l/gd/5nb/1lX1vVVXhv/6v/9Nb891lZGRkvMt45wlhQqNe6UTxyELCnSyeFrIoikTqqdOM5AXwlPhRJ7+SjOpkc8euO38iwpVyuEOQpK06nJToqHP+uPNI61bnYERQubNZnV6e6pblRxEgUbv4t/ah1qnfuY7Uycl3lIikXkm+aZu9L9yJSrLK7cBtiL/7IQH/3vWi/arPKCHmTk4tx9vANh5KV+2IImvUpkiafPLJJ3jy5Em617Pb7SaChqlZSWj1+/1EBlG+Xq+XCDm98xXYJ0uVkOF3lJ/PKZFIffFdflbn0H4eDjms675XkOhj6mzvh8iBrGXr80pcKmlIO+O78/k8pW1uNpupX0huMpU0/+71eqmPttttSgnNe56VtFdyj5GmZVni6OgInU4HRVGkd5h2WqOWeb8t9aFjmu3yAxdK/uuY1nHLchaLBUajEXa7XUp/ze/4PqPaO50Out1ustNut5tSn3POow2xHqY5pgyMROW9wyQLuc5Mp9O9OVXHp84JGjmsBC/H23Q6xXw+T+vLfD5PxDojtzebDRaLRUrzPRgM9taoVquVImj1EMZ8Pk99wt+LokgkPqO29UCDr4FK0qu9MsqQcrKd4/EYn376acoqcHx8jHv37qUU45xHSOiTgOW91/fv38cv//Iv45d+6Zfw8ccfpyj3fr+fIrfZZgBpPPT7/b3DIkznzYwEjCB2gsWJHSAmj14WPn/4fODrnq6dKqOvm/68tkVlf957TuxFB4xcD/6+Pqv7Ke2HKMrT2xbpS9dGJ+R8vvc5t04HdfNx1Cd1chE6L0cEJOuIyD1/1uWODnwdklXHpe8DfF+huvXyfO98SBdO6EY2qbalB4VUFn3O+9XHoB8+dD1E48ZJ7kh+P/gY6STaU0flRuNDn4n2c4cOIfIz37O5Dl0XdfvAjIyMjIyMCCV2mFWviHzM+Gr44hPgJ//yJmr4tlEugNWbv3M243bw2WqFb+LObzR6gv/wP/yf4bd/+/+N9frl04JfXn6Gf/JP/uYrkCwjIyPj3cM7f3SvKJ6mIOXf7gwl6Hz390ky0QmuDuE6Z6k7P4H9e3+BZx1gShS7c8qjNSiXfsff3SmmhAOAvTawLNap79LZpcRbHYno5JZGcLpTr86xp0Qn3/N2qZ5ZhusmAt93MsZl5DPufFZETt2ofnVyazs9var3q0bVqez6rNqHtkMPHtQR8FE7DjngSQCxTLa31WqltK0//elP8cEHH+yltu33+4msms/nSbbVarWX/lnJzH6/n8hEputVMr2qqkRiqm7UfviMR+qoY1Uj/Z5nO64v1+OLQgk7HffqgKd9aiS+Qu2T5elY835iJC5TFff7ffT7fazXa6zX60R+kcRdfpk6iGTnYDBI8x7vG14ul4n81JTxR0dH6a5ZjXJltKeOsbIsU+QybUlTBvt40P4lqck5kyQxy9VI59FohM1mk0hpRpuqnpmymm3RyGR3vGtUbLPZTJHC7N9ut5vkoPydTgdXV1eYTqdoNBopfbbOYZwXSHbq3KKp1ZfLJWazWSJsJ5NJImCpC9oA62HE92QySf3IKGweJuAzjcZNRPHl5SXOz8/x4MEDDIdDzGYzAE+JdJ3bKCvTePthIJ+TKB/7ebfb4erqCqPRCE+ePMGHH36Ie/fuJTudz+fpfUZzU47ZbIbpdIrj42N0Oh3cv38/3W9dVTep61knxxRTbXPctdvtVA5JYu1nys3xqWO1KIpnUpt/VfjegP0frRE+F0WkjvaNz3W+9unaq5/7en9ozfC/I6LwReZNlVXfryOzovXYCTFf9/Q93Q9EddfJHfXVoee1fiJKMc1xyN8j2/K9pe+HtCzfZ/CZiLDUfYJ+73qJ9r86Rry9+p4fFHFdHdqL6P6pbk8TjQe1Fd0zuFyuh0N9UKfDQ3OB6ivSse/nCL9/HXj2ChB+pvs17RfXp2amcD1mZGRkZGRkvIWoKuAPfhe4/wFwcvdNS/NOoaoqPP5Xr//e4leBqqrwr+bzb+wd4OPxOf6D/+B/gj/35/4d/KW/9L/G8fGNLR8ddfDBB79Qu3etqh3+1t/6j/HkySevXeaMjIyMtxHvPCFMB4qeqlcSRh0pHv3K9+scX+pkiyJc3LHDcjXq6EUROdxURv9dCcIoMoXPkPxg29WpFTkT3WFMXXqK7Mhp57pyuZX0VMLE5db+0L/1fXUG8z3ta5IR3r7oHSU+NPV2URQp2lXvAHWnq+pJbUHLUR3pM9qPkUPcCUUiIhGi+rS9Do20Jdbr9d44Ion1s5/9DD/4wQ8SgdRut3F6eorxeJxS1JKEWq/XiTjjP0aJevp0dXrz2Xa7vWcLOnZph3yG35MQIgnJdxhNuFq9/Ab/ZUigRqOxFxWsUZQa1et2qnOO9qcSoVpHVd2Qlvp+WZb44osvMJ1OcXJygkbjJv0uo0zn8zmOj4/RbrexWCwSKcz+oN52u12KmiQx12jc3NdL4pgk4G63w507d/ZS0rMfdrvd3n3EtEONOuU7rMMP07A8zm86N7KcsixxdXWF1WqVUpkzCphjRlP9amQuCUXq1+2HOmDUKu2H40GjYbfbLR4/fpzuwVbnvtataZd1DOh8NZvNkmztdjvJs1gs0Gw2MZ/P0e/3sdlsUjT6brfDxcUFttsthsMhOp1OitRWAn+9XqPT6WC1WmE8Hicyv9PpYDqdYrVapXpoKx7lqXL7/O2pwXlogOOBEc2fffZZurt4MBjgzp076Ha7acyQ9D47O0vzyOXlZbLZBw8eYLlc4urqai+ie71ep/TltNtG4yZanQQ+I4lpA7qu6bqr8zz7+zZwiITTtcEPdUWkJD9nv3jkrs6Dvm+I9gtR+V6ek7DPK8/3Mr6G8hnft/hP/S6qp46A9Dlc5xX9zJ+PCD3XaZ2+VI5o3Y7a4vJ7X1Ln+jNqnz6vsvleIWoX8OzBPydAo/2U/+56dLncpl0/3nYnhuvqdzuq05HvwYBno+h9D6uHz1QPtIVoj+eH/PSzqtonbF3/3G9G4yAad7ofZTl+6KBuH5iRkZGRkZHxFmE5B/74nwN/+t8A8mGvW8XlT94NQvjz1Qq/O/1mp/9eLmf4zd/8v+O3fuv/mfa1nU4PP/jBn0VRNHD37vv4i3/xf4CiAH7xF/8Cjo/v4o/+6J/gr/21/+1L+egyMjIyvs341hDC7tTzqEISe3xeU5IC2CMmSGy4Y5jv6+l8dbREpCCAvXtN+Z4SqpRDSc/dbpdkdueURrpRRtZLAgyIHYhO8mqUnDtv+bvLrY4z14U6QiPnNeXxNmmZqg91cqnTXnXMMpxs0zojO3ECQG2H+i+KYo800Lo83aiTP3V1RwSvRwk7QeE61v5UB7XKz+/rQMejEpYktWhHJOQ+/fRTfP755/j444/3Ik5JKvLOWZZB4oskMdP0qq2RMFKS2Akldyy7vanuCG077dWfeR7qnNV1YLSs95sSndFY0nmGemUULdPuqrOaPzV99na7xcXFBT777DPcu3cPg8FgL509I4VJBHe73RRFWVVVitRW2yHZCSCRj0yPzAhU2goPATA6GUAio6kX7TuNeKVOdX6mHqMxpITharVKhHBV3URHD4fDlKqaelqv1yiKIqUrL8syEYe8a5kkKIBEBpMg1jtpSUCy7LIs8fjxY1xfXz9z4Eht7+joCMvlco/kBrBH7s/nc8zncxTFDck/m83SfdyMsOb3JH05V2w2G/R6vfQ8x6OObepBU1RXVYXr6+s0NlarVYqEJjmsRLBH1FI3fr81bVzHHfuQ9nh1dZXs8e7du4kA5vw5nU5TCnTtu16vh7t376aI5fl8nqK5l8tl6t9Wq4VOp5NSojMFeqvVQr/fT4Syz686t+tYuy3o3OVrbRTNWkdoRfpWeISj1qNlOMHoBKQTl3Vtoq05Wer7KN0jKJkWtUH3Xl6Gt1Pl1bWU5fC7iDT0Outk8XZ55Oah9xS+x6zrU9WB6q2uLq8zIgl1jiei9VHl1mcpu+tEx7mOfa3fZY4OhXmd3p/afq1P+z8aQ+wvHXv6/wDO176HjcpT+1U96KGo5409XdP0fdejjkf+7vtFLc/Xqqg/MzIyMjIyXgRfbFf4uWbv+Q9mvF6cf3GT3rnTfdOSZHzDUFUV/ublJT7/CsEQbwK73dPglPl8jd/7vb+d/v7bf/s/AQDcvfsB2u0uynKBRb7nOiMjI+OF8c4Twn5q3h1DhDuENNqN0Ptw6SxSh6VHyQL7jkC9f9Hrpwzq3FIHjZfpbeS7SpKwTAB7RASwn2r3kCPVoWmMvWxtP8smEaCRgqwrklN1GZG96hhTGdVBr06xiCRl30VOUSfinazjdx457M5w71slSLy9/F3tyQ8CeKSKysLytP7IGai275E+dWD0G9vMvlbnKHBzr+mPfvQj/Oqv/irKskwE2snJCcqyTHd+7nY7rFarRDJyTJBkYpQkI1BJeq7X60RCk1jo9XpJX7Qvttsdsf6Z6l3H1qtAUTyNjtR+4b25bA/HC9vRbDb37j0GkIh2jRBUMop1ESynLEuMx2PMZjPcu3cP7733XrrHl/pbLBY4Pj7GYDBI/aDEP22Gkc6qS9bDdjHCUoldkpCbzSaRz3zP5xon7RnRqfrzwx46VtimJ0+epLTlJISvr68TWcuoWa2HOlcSk/rnYQimWSZB6vfispzpdJqic6k39o9GyWq0LN9VQp9RzZqJgGRno3GThno2m2G9XqfU0OzTo6MjHB8fJwKbdyOT9Nxut2lskkjf7XbodDqJaOYY5HMcn74m6diiLWtKb53XlJQnOdFqtXB6eprsjoT9ZDLBYrHA6ekp7t27h6qqMBqNUlrwk5MTvP/++zg9PU2E8nA4xHvvvYfz8/NUFucf2iHtutPpoNPppL4h4a3zh44DP4RxW9F1TvxFBBfXeX8H2F+zI9m9rmiNj0i8QySpr906t6rsus5RVierXFYvR+twktXr0fXTbS6S33VIW9V1Ltqz1OlB2+prjP+uskey+vpU946v974v8fd9f6OyKpHudTnJHu2xIqLS9y1R21SXnEeoD7dX37cfKs/XCa8r2sO5Xv1d6sb3db7Pjt6NDhyyTN276v8H/HCc18d6uG64XCqP2rlGDGdkZGRkZLwoPt/lO2W/kZheA5/9CPj+r9xemYv57ZX1NqICnuM2eyvw+WqFvzcev2kxbhWXl5+/aREyMjIy3kq884QwsO80ihyKhxwrTqS5o0sdVnzHo4vd0aQOIic8NWJQv48iIyLSLyJJCI0cppyeorWq9qMW61I3UwYlet3JqOSWIoo4UlnVMeVl+jtaV13UK//W+y89qtf7RB1oJF8iR53WVUcmsxz9Tu3DHa5KCrtzXOv0CA8+445ebY/bqevZoc5hEsF6D25R3BCQi8UCn332GS4uLvD++++nSL7BYIDFYpHSsq7Xa/R6vWSL1AujTDXVc6Nxk2aZ97SSeOE/kmzUhcpP4oy659iqcwarTdw2lCTUaFh19lKPCj2Q0m63E5HHKFgl1NXWtGwl1mazGcbjMU5PT1Nk5fX19TO2yPoWiwUAJOKdhGG73U7kJceG3iVcFMVeNG2328XJyQmGwyEuLi5wfX2dSEYSrD5eqBeVn89EKfCpOyexptNpSv3L6E+9n7nVamE4HCZylXf4ampnkrgcl5qynPKQ3GebttttIuDH43EijN2h73dD+tzF9vO5TqeDyWSS+ojvkrx08oF6HAwG6W8eEOD7JHvb7TYGgwGmX6aQarVaScb1eo3xeJzWDJ0vOHZcfto8bUT7i3ZL+fr9Pu7fv4+7d+9iMBikMpjmmbbIv/v9fjq0pano79y5g5OTEzSbTSyXS/R6Pdy7dw8//elPsVwun1lX5/N5ivbm3HZ8fIzlcomLi4s9Xfp8wjTqddF+Xwe+L9G1z6+c8LXRSUvfF3ibIkIsWjP4u0eD6jMedRwRZHVtVZvVNVTb4OVGa73OAREJ7u1Q4tfXftd9tH5omapH37/VEW7eZ94vWo/bWSSTy+xwebWPeCitLnrcbcH3Xa6rOn1EhwH0UJHK5fusaH9TJ2c0fiJZXU4tR+uI5mjajj/renZE+1gfR97ntCPf5/kBCgDhPK269/3kbc9hGRkZGRkZGW8Qk+sbBrNmH/LS+OInt1POLWG3qVDtgKL5/GdvA1c/W+Pqp+vXU9krwq66iQ6evSKfV0ZGRkbG24VvBSGsUV8RaahRph6Zqk4qOmOUxHGnpTpX+C4d+urs9AgJjRqOnL9KThBOYLkM6uTk304QUsZIZ+o0cp1FBKqSfB65qmSVOrTU8cVylTjjd1qe1svPPGJS63O9qZ5dbn9P61Fy3B3pka4VmibwkEOZMujvTji4rPp5pHOXx53eKnNE3lMWkiZK/jA6stFoYDQa4fPPP8cv/MIvYDgcoqoqdLvdlKp2sVhgt9ule09JMLOeZrOZCE+NUjw9Pd27Y5VRp2yLRl9r3ysJH0U1a9+pvd8mGPX4PMeyR1syfS913O12U4rbyIHr8w7njKIosFqtsF6vcX19jcvLSwyHQ/T7/dQv/X4/RU0yirYoitRfeohBo8Q5/zDCdbvdJoKt0+mkZ4+Pj3H37t1kA0+ePEn31ioJQcLUD0046RbN3ZGcRVFgPp+nO3fZD3yv3+8nfWn0q8/t1KsSw+xL2hzv36U+5/M5yrLEkydPsFgsEsGsaWDZFh5uYD1a52q1SrosiiJFAjNqWA8EsF9UX9oGEvccW2w3SX5GBPPABqOgAeyNeR6OUTvWuaPVau0dvonWMR2X7733Hj788MO9O8QpLw8/DIdDAEj9VBQ3xDwjvXe7HRaLRWrfBx98kNJjM100SWJGBDuJ0m63cXZ2hna7jT/+4z9O9fjhFbUhjpvbRB1BVfe7QvtF1xJ9RwlQLysijt0mD82RdbJH5JjO3dE7/nnd2hs9S11o+72s562Rh+Sgfg8R4NE8FcF1UyeX693twUlF1WddnzmpqPK7TnR90vk52lv43ijSpdpgXRnRITs+rwf0Ip3wbx8H2gYt65AcCl2LdP3RdlF217XbZNQvL7IP8b0a1w+vUw+n+rqmeyXf92VkZGRkZGS85fjiE+BX/izQar9pSV4JHv/BCpPHG5x+0Hot9W3XFTart/fwXFVV+Kws37no4IyMjIyMr45vBSFMZ5c7PdwRR+eTksLuwFZnjqawVQdORDyxHnXKuLPMic3nEX/aNnWuRk44dZ4p0RiVHTnOnGBwB7ETKXSk699KAqguoohpd3Cy/1R2lVmfVfKCzynx7Q49l9V14f1OeTSC051uLFsjG9m/Wp/2c9S3LEfhfeH9H5WjfRjpuM4B6QcYPBKUBE6r1cJyucTPfvYzTCaTlKKWEZOMviOhw3cYWamRSYywpGzdbhdF8TTKkCQRsB8ZzOf5rtuFjldGVytx9SKO2JcFo1LZNvaD3jXLOqkDpvvl851OZ+/eZoXfU63zhdoN72RllDZt9/j4GABwdXWFbreb7nEm4agHYKqqSn3Gv9nHlJckZa/XS7rudrspGpVyLBaLFPmtRGZRPE3dzD7XcR3NHzo3a/rp3W6Hsiwxn8+T3igv7YE21Gq1MBgM0v2y1J8+q5GkRVGkgw0cHyRTWe50OsX5+TmKokg2oFFbetjC58/NZpOIW80EwM9JqDOVus+zOsc0m82UNptjiOQ7D1/oncKdTifpikQD02v7HKLzs447zSTAe5B9fm82m3j48CF+6Zd+KdXBNOWawaHf7yd9k1xnfSSzdX6az+e4uLjAw4cPU9/dv38/pZ3WQ0mtVivZB8fqZDLBo0eP9oiyiDChDGzfbaCO6FTUfed7kDrC0A8BAc8SZPypZdCmDslUR7T6HsLrIFzXusZpWXVXPkTyR3K5/ervdcRr9F1kF4d0qXOW6kjb7fVo+x115UX98aL94HuCyA68/b6Pcxm9HN+vugy+z6yTx9updUb2XieX2tch+9W11e3U+8QPXrgN6V7fD0B6H+qBQp0b9R1dF6M9ZbTXUzkPzTkZGRkZGRkZbxnWJbCYvbOE8G57EyH8ujD6bAO8vXwwHq/X+D989lmODs7IyMjISPhWEMIaPaZORP8O2Hc48m9NaaoRw+p08agsvqt/811Pb+vEKZ9XYlll8pSNlMvrdvLUSVB3orle+J1H3/lzhEYOkvxQ4kNJOtdPFHHMdzXVnX7Oz5Sw1D7k70oKu47dUewEm5JQLM+f03LU+aY6jZ5VQohl8nuNenW7dceuOgQpo5PVkWwuUwSPziRBBTwl19SeHj16hPF4jAcPHuxF5/V6PUyn09Q2t/n1er1HCjItcVEU6W5PkgD6rqZPZrSmt1H1wEMBzAagdqIO2tsAx4BHm3PeoB7VhrVfG40GBoMBBoMBOp1O+py60vYcing6OjrCcrnEZDLBbDZLd/iS/GOqZKYSZiSpRoRTXpLETsRTpxrpTLKu3+/vRXNOJpNUPlMpU2a2g32jBJQTCBp9qvJqeueyLDGdTrHb7dL9yyStKaP2ic6bjMYuiqeELv8mwb9erxO5yp9VdZMCnemiae98n8+o/jTiWu17Pp+nMgaDAWazWSKsO50Ottttiox1skcjGHkIQ8eK2mer1cJut8NsNtvrE9rCfD5Pvy+Xy1Sezgfa/x6prPbPvjg7O8P3v/99DIdDzGazVF+32006ZH8tl8tEyvNeYx4wUcJ8t9sl0peRxe12O91nff/+fSyXS0yn01QGI6Pv3LmDVquFTz/9FPP5PNkY4eSJkjO3DSe31O4jslDtySOZI7JPf9f3fS3R55zoimRy0lPLcCKq7t1DxF5EWjkpW3cw7hDhpTLrWkd9qpyR3HWf1a2xvp77HsllU5m0TO1rb5/aad2admjdV+j4itqq9UV7zjrZD8kRkaT8+3l9otDDA16e9rHbbF07fT/KZ9VWdQ2va5MfblIdqmx17dR2+JjXNc3t2Nun62hGRkZGRsbL4HK3xqLaohfk7f2o0cWPtss3IFUGAGC9AkYXwMmdNy3JO4HPf//tteVHqxX+dz/7GX6yfHvbkJGRkZFx+6jPY/eOwB0k/g/YT1PMz+jYdkcPnT1KuGkUWavV2iPJCCeMo3IjgiWKQtCyvEyPQKsj/+ocZ/pP33Nno5KWqj8+621SaNRpRDi6U47yeHuc+AKeknAsS53b6qxz2+C7+lkUSaP6UxKJiJxu3l+R89f7SR2FSvzqPdD6Of/RNrUMdear7g71r/bVarVKBE10x3Wj0UjRk6PRCBcXFykStaoqtNvtlPKY/Uk5GWHH6MXVarU3lvTfbrdL6WGpC5ZXVVUiAjVKVG3Cx5j2e/Te14WT5e4k1ohKAOngCe2D6Yf1vl53tmvZOk603dTler3GZDJBWZaoqiqVyz4l0TubzdBsNtM9rSRuSZBuNpuU0prRsD5GSR4Ph8MULc7ocJLPfJcEt0fKVtV+ylAdbzrfaSQzyVt+zhTCjDSmTpWUZR0kFvk+y2i323sp/xlFzDbT9nq9XkqXzDtoV6tV0p/afXSgRce+HqhZLBbYbDYYDoeJ9CbZ3u12UZZlSiPN79SWSQQDSOQx7wWmnbItJEmVlGVE8m63SwcLFovFHrmthDTr5E8lHZUMfvjwIe7cuYPpdJruCFbyhmOeMldVtReBrXMd+5KR0NvtFtPpFNPpFOv1Gv1+P6WJJqHMz5jS/PT0FLPZDF988UUizZWMpP3xd86Ht4HnkZX63KE53dcq/93JJ/+O9fkewEk5lU3f1X2Ay6Xv6NrPz3w/pG3XOU73Afp8RIhq2Yf0HBGn0ft+MIy24YdJVHaVk9B3XK46YvKQngDs7Qe0/ufpIdoja33R73U2ps+5Hfjc7XpU2aI5X+E24ns6LUd1FZUVtdvL0nKA/Swt2uao/sieXVc+NiO7rivDbddJ57p3IvkyMjIyMjJeBtfVBmUQplkUBR423s3I1LcK1Q4IfHEZL4ebPdWbluLlUVVVIoN/nMngjIyMjAzDtyJCmI5rJ1KA/dPx6ux1Bx6fYXn8qeml+RmdRUpMqsNcU6Tqu3VRGO745ed0rmsUgDqsWKaTjJ5ukeXVtd0jJ9Vh59FF7sBTZxMjnjUyQvUbyU/Sx/WiBIP2s+qM70SOxToHrDsHtRx9LyIONdonksftj3rwdNUqj9qlv3/IiRz97uW7/r0MgoSQOlW9v6mP+XyO8/NzzOfzRLyRLNbITdapbWe0IwlDEs3D4RBnZ2cpUlL7nNGSWoYeVFDbcyKuztb8UMJXgRKLETEQ/dOxp8SljlESm4QTqD4GNVq/LEs8fvw46UxTUDN983Q6xXa7TXc/8zAAiXslbUk8MsWw2geAdC8t27HdbjGZTLBarZJuqCuNvHQHuj+ncybbqnOLz58khHe7XSI7+RnJcEa/av0kToH9+9pJnOq44qGFori5s3k6neLJkyd7h2U0VXFVVXvjQeVVcontWiwWe7ZDMp+2S11X1U0EOSOX9WAT29PpdFJ7KffR0RHKskS320Wn08FgMEjRv1V1E2G8Wq0wn89ThDfTvft8pG1xcoeHBPr9Pj766CMASKmgtTy9P7iqKnQ6HaxWqyQzU10DSP0J3JDIl5eXWC6XKeKXbe50OijLEkVR4MGDBykymHc/z+dzfPrpp+nuYPYFgL3U5WwfDwV8XdSRYv49v6NNPK9MX7OjCE1fqyJijvAxqt/5mNR5IFqvIjJNy9J9itsTdRARlHVrmNpppGOtW9vqzzr5WEfw6Xzkdbme+Pshok/brc97H0SI2hnpPmqv77P8vWgfUadnnQuiPYjvw/jTn48OHNTtuaL26/jR7B3ci0V97gcNtW7aqpYd6VzL9f8zRHqNZFede1SwtxvYH+OqR/7fweeDjIyMjIyMjHcIn/4I+O6feNNSvPVYTnb47J+9fYTqFsB//PnnmQzOyMjIyAjxzhPCSpoCT+8cVUeKOnTovNdISIeTc3yXxK86FemcUQeQl+Oy0GmjUWksTx1imspaHWMedRNFoek7/J6kiUdHR446wkkAOtSUWGOklxOadMB5u1Um/dyjj1S2yOHt/Uwdqt49MrzOEarkgLc9cj6q3mlfLofbljvxKbtHt/p72k7+88g1JaL0Pa37RUgGHUtKwGm07pMnTxJ5o5F9TE+sdqpl7na7FEU6HA7TfbXD4RAPHz7Ez372s9QnPrbUZlkuSSV19Hr/umM6Iju+CpzIdZ1p5DDr4tgbDofo9Xp7Bwx0LPBwi9qj9oGXrY7g6+trjMdj3L9/H+12Oz3LO2QpL3VCUpi6od5IpKl9sk90TiMRx3TRjNjkvdIaPevppvV+1ohA4HzFiFF19KuTndGt7Ae1N20z51ONiKduuCbwnbIsU1Tw0dER+v0+er1eip4ej8cYj8dJP2wn+07tS++uJ8nOqHn2LWVptVp75DBl5VUE6/U63am7Wq0SWUp99Pt9dLtdXF9fAwD6/X6aA0kCk0AdjUYpYny9XmM2m2E0GqWUzN5fPgf72sZ7mnu9Ht577z3cu3cPFxcXyb45XnVNZV/pPK2HHNjuZrOZoppbrRY+++wzXFxc4KOPPsLDhw+x3W5T+nXqRfvl6uoKn3zyCX784x+n6HZfs9QOdW77qvDx72SXf6d1K1wGnRsigk3nvYhUjcrWOcVli/Ywz9s3ENG6pOvQIZKqbm+kbfP9ia9xdYQov4vWeH/X39M1hrrRNSDao0SRx95PPgf6eubtc2JQ39F+rSOto72lE5c6z+rftFMnO/19h9ZX14faF75/07UuskmXQ8v1w1WOqN/q9n3R9yqX6r3uICaha38ks1/NwjJVzshG1Ta9fRkZGRkZGV8XDxotDIoGZq/zoteMfaxXb1qCdwLVDlgv365I601V4f/x5Al+fzZ706JkZGRkZHxD8c4TwuooiZxF7oihc4TkAgkEOmSiSAB3uGgUG++2pBz8Hng2ukHr98gxJxEiJ6I6IPk331Xnj7edf9fdpxmlOGW97tSKCDUn8LQ9WreTw6xLIwRVR1qffu9Rt9pv/p62R/uGz0TEnerPI17daartI1SWyOmq0RvuWFQyUe0gks+jnOqc85GzW6FRjk5SUuckZ7bbLa6urrBcLlMUIttD4q6qnkYAsr9Uz4vFIhE2JKfu3LmD4+NjXF9fY7VaodFooNvt7snp8mlkNck86lz7wdv+dR2jSuy4M7xuzqGOer0eBoNB0pXaPOUnGcWDFvqd2rr2K8mvxWKB2Zf/MeDcxjt1mYbYZdZIYpatqfGViK6qKqU11udIojJCuNvt7tkP+0qJe/4ryxKtVmtPH+xPPYDCMjR1eFU9jZitqiodMtDoKOqQRCzHK+tiHbRnnV+ps8FgkORnpDujUfU5TR2tc62SGh7lzrp2u10qYz6fY7FYYLFYpJTgJLe73W7qU9oGo2OV7GYad2YAODk5wWq1Svc983O+t1gs0t26lM0JUz18xLZQn0x/3uv18OGHH6Z2Um7qSlOIsz/5GQ8o0IbZxxwLzWYTd+/exWQywfn5OcbjMT7//HN85zvfwYcffpjsiPIuFgs8fvwYP/3pT3F1dYX1er2XklrnTB23Op98VUTzMPUQzckRGeff173rZBDbp9+rLernESnu72nZ/pnvj+r2NZGM0UG6unJZnhOILquu/U6I+RpRp2vvK39HD55F7fC1PWqj7y2dUPS9S/S+E7KqJ8oVEa2cD5+nD9+71D3jOlRbjQjj6HuX08cm4ftfIsr+4fsk3RNG48/TqLMvvO5oT6+2onNelGXA7dTfd5uN1pGorXV98Lw9YEZGRkZGxstiWDTRRgMzZEI44+3G+Is1dpu3a5/048UCf/Py8psx+grcsA7rNy1IRkZGRobinSeE1VlDZ4mTmnSKkLwl1EGvJJM74UiYRA4udeZETlEtyx217thygs+jcSmf3n3I9+nEVoeQEx4kUuocleogVKenvqNRsZpiT52xTnIpKRQ54TXq2iNtXWfqPNTIWo+mpJ60vqh/vD8POeOjyCyXzftE61QnrbdPnYZKCrteo5SHLJPPah++iBNQCSp1VGrZTFe72+0wn8+x/DI1jeqfkZYkpPR7jfBar9coyzLdYdtut3F8fIx79+7h+vo6RUHS9ikPST+Scqo7yuCOU33O54ev6iBVmdhGnzNUJt7P2+v1Urv0UAmAdL8t+0D7RQlMfkYynX1MApRpm0kIdjqddH8r32EUt7epqm5SB+udu0qs8nMSwkxF3Gg0UvRqWZZ74511RlFqLJOpmNVelQCNxqXqf71e76V41rFHm+P8qHLpurDb7ZJ90e7Y9n6/j8FgkPpktVphNBolcpn9wwMTOg71+oAowkv7fLVaodls4uTkJNkHCWKS7iSDGVnN9NYanbzb7dDv9xPxCwCdTgfNZhMPHz7E2dkZZrMZjo6OcHFxgeVyifl8nsYe9cWy9bAL9e0HYAaDQbLt7373u7hz5046HEB93b9/P8l9enqKqqrSYQAS1RwLjPrmIQoAiRzf7XZ48OBBIrDPz88xnU4xGo3wve99D0Vxc8iA9zyzjSyP/eQkl65xtIvbgJOaOqfze36uBJa+H0HLjNYlJ4S0Dp0DdX7WZyLiT9eHQ2tlJKevK4fmX53bnTiLiLyI2NTIy2hdjKIsdS+mcup+ztf5qK2HdOF9r33j5KPuHfRZlz2Swe1O+93r1z73vYu3WWXwuVnHjxKZkW5UP3rg0O1Rv/f+UB343jLScbT38nY9T5++j/OxGo1tH4cqdzSe/IBBdJCDn7v8uq7V2WlGRkZGRsbXRQMFPmx2cGVZyzJeI+YTYDED+sM3Lclbi6qqcP7DFTbl20MI76oKf/PyEsuveXj5VnAM4FcA3AXwTwF88UalycjIyMgQvPOEsEa0RUSPOqg0KozkQF0EhjpX1CGmjkd1QkXOQka4qdOG7zqBp0Qv69Z79FiHPuMkHutUssOdihHh7Y5IlbXuHX3XHWDqoDrkxHXHs5LeqlN/NyKXtP0qV+RIrXP4UXf6mRJKroPISfq8NvvPyKnuDkK3H31OZfJ+Up24nAqNsGUZ7tTl+Gk2m1gul+l+TbV/EmisT991p/pqtUokUlmWGA6HePDgAT7//PM9ItCdo04MaLkk/XQ8aUSqPkty9atAy3CHu+uM6Ya73S7a7fZeVKseTtGx7X2tBDeJTyU1ASSirSxLXF9fYzabpTtUNTqfaX2Z8pvt0LrryCD9m0S33ve63W6xXC6TvBGRBDxNha9zlJOOfI4HCKK5ktG4JC4pl86bGomq0bM6TyphSxvnQQXekcyU2yS+p9MpqqpCu93eS82ta5DekVtnt8DTlNds82AwSAQmSV0StYxyZh0kqBmZW1VVujd4Npul705OTnB8fIyzszMAN+vfdDpN6aLPz88T4erEh88H2r9FUeyl0/7oo4/w3nvvpQwCs9kMm80Gp6ene4cYSHZTB8fHx0m/JG43mw2Wy2Va27vdLqbTKY6OjnB6eoq7d+9itVqlCPHPP/8c0+k0RUsvFot0wIEy0870EBKJfbUD2tXXRbTeAPvjiDbBn1HEIOHzjROs+lm0ZviBHX/u0Jrle6JIfpclmlN8jYzqYPl+p67rqq4+fadu/fa5VnWn+zOX39/3+ur6wefQSE796fsjykUbdVtxnej86uStvuPPu469/mhf4e9GZLDu61SHLEt/6vN1uvNDDZTB97/ap9wjsEy3L993EdEeKlqrVU7fR2u7XJeuZ+0T1a/ufSOSPNorqY4yMjIyMjJeBhUqjKoNztB65rtGUeD7zR7+xSbHCL8xLBfAapkJ4a+BxfUOf/Sb8+c/+A3CZLvFH3x54P+NooEbMvgj3EQJ/zkAnwD4fdxccJyRkZGR8UbxzhPCwFPnnUa2Kfmrjh8lqtRZcijigp/zpxJQdD6RXFGnTZ1zzp+LyBDgqSNeo860HpfTnT/qBFTHlzvmIiLDI3spjzpHNQJB9aLEpJNk6iRzJ6U7c925pXqJHLTefx6V5+V43yqR5PVERJmSiixXdaJtUQe6O08jO1K5vM46J6nq3A8LvIgzkCQJ+1uJRMreaDRQliXG43FKsbvZbFKqXpKentbYxwLvUG00Gum+2nv37uHu3bt49OhRIptJaOmYOzo6Sul6tW+iccJUs/rd14kAVILRI7m9vUw13Ov1njnswfaR7KL8hB6O4D89xKIOYEaPst8uLy9xfX2N4XCIdrudUm8z8lKjialPjvtut5vsUQlrkq8kJtkOlb+qqtQvPuaUvHZHPdukkZs6tiKnto43JUhJVKsdszwlNTm29S5otoUkN3XH+55JWPKuZNUTxxx1oZHROm+SwNU+ZxTtdrtN0fLj8TilTSbBW5Zlis5l5HdVVemwAWUnmarzcKvVwtnZGVqtFj799FNMp1OUZYlut4urq6t0bzDvjSZ03axb5zqdDjabDe7du4fvf//7KIoCo9EIVVWh3++jKIpEVhdFgfF4jNFohHv37uHo6Air1Qr9fh/X19eYz+dJp71eD8PhMPU5I6G73S6WyyXOzs5wdXUFAGi320lHJKMpv/a7rv/aLiWBSPrXHYJ6UTiZ4+tC3XiIxk9EWEVkHBHtV/Q7Xxf1WS/L69H9kn6vskdtUrm1L5SwrSPYHN6uiGyM2ur97eX7vbjavmj+ifpE265rcaSvurJcz5E9+OE1LUPldTmiQwqH9kU6frSOqB06tpTwjHTusnq9+l4kn4/j6Plo/0HU6dblrmu3lq3XLmgbonJ8H+cH+dyWtR7dBx3a0+n7mqEjIyMjIyPjZbAF8NNtie81e+H332t00S0amOd7hDPeUvzB357i/Idv113Mvzka4Xz9DcjP/F0AH+KGDAaANoBfANAD8IcArgDk84gZGRkZbwzvPCHsjk53tvBzj3SMnLORk9ijfvVdJXSVxFAnJ793542TOkpUqAxKimh7VGYlbxUaBaVRXioDnVFORml6bdWfkj/+mROoHsnrzj8njt3x6NG+3t/uSPPv3NFKaCppyq+R3E4ysv8ipx0/1zTCdY5plTFyymr5bhvu2I5INe2raFzUOfxVPq9XDyTw+7Is8ejRIywWixQ9WRRFSsdaFMUekRQ5oqvqJkUuU9l2Oh2cnZ3hww8/xMXFRUpzzLKLokj3gxIkvTQVuhKB1GlElPPvQ07VCCT6+D7bQiJBSdbhcIjhcJjGEUkmkneUT+cTOpZpd5oG2O0sim5qNBqYz+cpOrTX6+H4+DhFduvdqCyfUaibzSal7XU7azRu0ob7fek6NhitqTbFNPYklPWQifeXjjnVCX8nyaf3CxN6MIHvsW6N+NR7hPm92hV1SCKRqb61zbPZDFdXV3u2o+PE5zIdPyyXz1BOtrPRaKT7tVkGSVPqVA8LsA8Hg0HSHec2vXOYdyD/6Ec/wtXVVSKx1+s1Li4uUJZlInbZJz5f+/3P6/U6HSDodDr48MMP0e/30/3H2sdlWaZyNMqaNjefz1PK8VarlUjf3W6HXq+HXq+Xos+pU+qLabVpR5qunfaph6548MDv+dToaE1B/nXga3VEbB1aK5xI8/1NVKYfmIrWYye2fI1WOSIZtXwd175WOTno30VzcB1R5sSdy/E88pDP1BGcLkP0ubbTy3YZDxHBPnfoZ9E65brT7yI79f5XXT+vDB/3+owS5r6nqdOjk5jav6qn6ABgZNsqj8ui9Ubyq937Pl71rm2p+38Fn/f28B3Vs85FDs7nnLPqyudnekCM7fQ9nu/7MzIyMjIyXgUGRRPfa/TwL7azNy1KRsZLY3a5wb/8L6dvWoyXQlVV+ONvQnTwAwC/ipsoYUWBG5L4PdyQwj8CsHy9omVkZGRk3OBbQQjr6Xx15KpTSMkDdZCqk8oddkra0lmjBBM/Yx3q1Ik+d7lJTHqkIh066pDSCMOILInKd8eqO9DcORtF9lIWvbfVCTGv0x1ZqqdDTvY6h29dHQSJMgB7BBrJQkLbrH3j+q5zDvN3tx116LrTUx2CAJ7pR3XoaX16ECH63p3E/Nx1p+2M2sb3mJYXwB45zr5n1CG/Pz8/T4QNZWAf8F11Insfaqpbph7u9Xq4f/8+7t69iy+++CKRWyRKVX+8r1T7RyNMVR+uU8qgUagvAiXKNKLbx1Gz2USv10O3230mlb2SWSxT0wqzTPYBf2p6ZCWFNbWtEnWTyQTL5RL9fj/pl9G7dCYrocy7fBn1rWSez2vsa0auklxj9KwSrZqil7oAkCLElfhUHbiTnO2nrBqZ63Ol9rveFUvda1/poQLaoj7P+5+Z1nmz2WA0GmE2m6EoihRRy/nGD3B4v6qc1JmvWUVRYDAY7NkBDxNQdv5kWnCOD+qZ/d1qtXDv3j10u11cXFzg0aNHiXReLpfpYIePC9pkROiwXa1WC8fHx2i1Wvje976Hhw8fpvuAGanLuYOp4SnzcHiT2oxRv9rP/O7i4iJlHNjtdlgsFumASLvdxmg0esb22Q7qJFrb2U+MrFfCXg8PfF3UEXVqpz7H+2EWfSc6RKJl8XcdQ/pZnXxOqnk9Ps+qjeuaoXsalTsqS/XhY97nb1/X/Hdvt/7tc4vry9un5dPWnajUed/l1/0B4SSf110nT7TXifTC330f4rqq06vrsE6X0f4o0lmkVx+fkR3Uyajv8bM624h0p/bthwGiMv1wg7fZwf7W9dTbqsSs22I0Xupsg+/ovKflRTbP77zNGRkZGRkZXxdFUeDXjgb4V9ucNjrj7cMf/9Yc0/O3K7fx9WaDfzl/wymuewD+LIBuzfcFbliIXwbwPdykkX4E4BI5YjgjIyPjNeKdJ4SBp3cAKjHjp/GV7KyLxFSCVstxElgdtO4E02hZJRv5rpehpIc7hyMnZp2TSh2yShi4nE7cUS9KWKgMkaPTHVfu+NV2KrGod3cq0aTPRs40dzKr8x7AM9/zd5IRTuxH7YyidDSSWB1v7mhUZ5zfWat2xvYpMaRt0nJUL+5M9H5xRM5Rd+66bBpVyOd1DFEXtC+SYkzZq1HyqluNcNdIMk1frPe28i7hi4uLVC4jODUNNO+tjZzD2mYfZ+6sj0iKCO5Y9sMkSvgzIlPJLL37l2Ssko+0cyWcvf903FZVldrPeo+OjhIJNp/PU1Rmq9XCer1Gu91OxL/KrlGhfthDyT/at9+xSxlIbnIMcF5WwoT16CETtWs9CKGfK0mppCe/43yr/ax2qwdv9HCDEgQkVTXS2A/tbDYbnJ+fY71eo9PpPKMzjh+WSVvz+7XLskypo7vdbpqnNKp3vV5juVym75bLZSp3tVqlscE0yiTmOU7v3r2L09NTnJ2dYbPZYDweAwCGwyEajQZGoxEuLi7SmGKbtR06PthW6mIwGKRU72dnZyiKAovFAuPxOMnNqPLd7ibSl8Q265zP58n2SYKzD4+Pj1OZu90O0+kUDx8+3DtUoOuLrh+smzama1FERrEP2Qevgjypm2vq5mlfb55XZl3blAzz+jzq0WWKiLeIbOJ3HulYJ5PXE8nrzzqJ5mtaVFe0j6prl5PWrnNdO6K1xlF3UMX3cBHhF7WBZfra7etatI+o6zedb6N9g7cv+t33iHV7jLo+0Hd0j+R27+VpuXVjxGXh3Oi60vd1TxyNTa2/7gCQ7veiflccOjCgZdXZh7c/Snvu0fYZGRkZGRm3he81e/huo4uf7HIY4OtHBZx/Dpzdf9OCvHXYriv89HcWbx1Beb3ZYH4LB5e/MoYAfg03pPDzUADo44YY/gGAxwC+AHAO4O0KzM7IyMh4K/HOE8LuGHQijVCyCng2/SWdUHR6R85wJeaielkH6/P3gacRzE6AsBx3zmlbIrK7ztFW59TU7z2SQMkVtpF1arSVO9/UIeW/q8PQnYka7aZRWvp91B6tQ/tY04hqGUq4uU6cQI90F/2sc7Cyfne+6UGBqC/Ufvzgguua/zTC1e0tcspSDn6v8MMLWh8/49hoNptYLBaYTqeJGKPt6H2/2kdKMAFPyRwSqHx3MBjg/fffx+PHj/H48eO9KEngKbGmkadsC6NO9fvIhlQ/kY4isN0cizoPaHm8d5YpbEnA0sZddrUbTU/u9bAfnGB2m6FNTKfTlMJZ75dtt9uJkPYDGoSmvdfPSMRXVZXI5yiFtM6flJ26UpkZkazf8xCHRyE6yeSHNZSUUHLb50R1rvN3txUSrZ1OJ6VipoxlWeLi4mJvvtC1RfuQsrq87CfKrFHS/k6v10vR0UytrhkxeHcu+4yk9mAwwPHxMY6OjrBer1Ma516vh3a7jclkgsePH6eUzRy37AMnWHe7XUoHzr7jT0YGV1WVooNZbqPRwJMnT7BarXD37t10OEEJ/LIs0zjXdvR6Pcznc4zHY3S7Xdy9ezfZAO9XZrpz7X9GEVdVtZeO28l9tRXWzYMqt0meRGul9rM/42u6Ez4+9xxai/i8k3CaQlvr9TVY3zm0T/G9VtT+aJ5Vok7Lcx1FdUdzOuHkf7RfiPZsqgefJ3ytjtrl60kdCVinVy/f14GorEg3h56N2ked1RGLPtfWtYG/q15V54fspO4770MfQ1FZ+o4fYtTx73rysaJ9ELXXbUzLinSm+le5XH6F25SPay/LDw3oQb6MjIyMjIzbRgPAv925h/9k8TnmOU749WM6etMSvJWYPNng4sffgHt4XxK/N5th9QK+q1eChwD+HIAOgJfdVh7hJpX0BwDWAP4FgB/eqnQZGRkZGYZ3/vIodcarg88dMRo1CiCRGxGR5r+r00adXe4oU8eMf6bEpNahJHUUSewOYXeG8XNNYaskoZKtkfNTZdLoTkKjFt3Rx/fW63WKDnTSQyPwXCca3aXtoa74vpelTmR11unzlE/JACX762xI2+XOWXfmeT8pqarvKJnozki1K7cptwUnBrQfXSeRPlQvjvV6vRfR6X3mhwdWqxXm8/kzaXDVfpRkoY0o2b1arbBcLhNB1Ol00O12cXZ2lkgmJXAoA6NQ3Vnt+lTb8ra7nR+C26iPM46vdru9lyoaeBoJ7Wmivd9on9QRI2J1nGo/kGhWQpPR1lV1Q8wp4ctoZZap9z1TDtWzzxtsJ2UlaapzgZP32lYdA7QHnae0f7xeJZm1Hh+j+pwTwj7GVUYSotQzScnBYIB+v7/37GQywdXV1V6fsWx9l7+rnnwdUQKT65HeL602ysMS7OtOp5MitEkI87l2u53ugm40Gil9c1EUKer2/Pwcl5eXe7rgQQNGKbMd7HtN2d3tdlFVFe7cuZNk4EER2h3HKdPDX19foyzLvRTpvV4Pm80G8y9TX5GYLssSZVkmPfNe4aq6OYzAO7J1ftI1Qu1KiVPtAz6r8+5tpYuO5hddP/SZiPxiv/iaHBFDWnZUTkR8ad+6XP7TSSuXxfc0Wq/OzdE86odH+F4dgaYy65iK5Kgj6NRmnrcORHsu7RfVpT+n9aneIvmjciOd6ecqn+9RdE+kMuq7dQSs25LXo/16SMcqh489rV/L1j0H8OxezPexvh9S6J7Jy/TnKIfvJVRe70eXx2Xh3KJrhL4bje1oTPkeoK6d0ee6FkX7voyMjIyMjOfh812J7YE1pCgK3CmO8N/o3EXrpVmijIzXj82qwj/762OUk7frAENVVZi9qejgB7ghg7t4eTJYUQBoA/gl3BDMGRkZGRmvDO98hDCAZ8gWOlIighWI07/RGaTOf3XEsA4lvdzhRYIgij5WRxeJCiWy3YHrETNKoKq8fFbvL+Pzqo/orkV1ZKpTi+/pT4XqN3K0UVaPWvD2Rf2jBDLl9TrcGeoyUQaSF6pv1uuON3eI1jnYXAZ+pmkIVW61OXfmH3JM+jOR01Sf8ajVuvojxz3rJlFHMkl1o2lXgZtIydFotBcBS+enE8Ak50i2UBYSZvP5PJGo7XYb/X4fd+/eRbfbTQQT00fXpXD3aBzto7pDAi8KJ470Hl8SoEwTrel/2RdsK8c+5fAIH+Ap6aqELaM+i6JIkZgk4DSVN9tJsl7vveUduST+ddzzb7bVIymjAyEklwm1ScrljnCNYNW+0LmN0cF8ngShkrtMU67zn+qX7/hcqPZBnfGZbreLzWaT7tNlpHdVVSkytqoqXF5eYj6fJ/3zflz2D/tN9abRmGqfVXVDBh8fH6PT6eyl/da1RFN6cxx0u930PPXA6OHNZoPlcrk3HllXt9vF1dUVLi4usFqtUnS+2pfrykkPHla4c+cOPvjggyRzWZaYzWbJblerFdrtNj766COMx2NMp1Msl0sMh0PM5/Ok11arhdlsluzU18fj42P0ej00m02cnZ2luWS9Xqc2cFxolDHTaeu84wSJz98ksb8u6tYs6pk/fW+i61i0T9GfXkZEeNWRRYfmPydtdV3zcnXu8s9dbl+TdJw7cafrtLeXZR5ax/VvbYevFTpHRPsKbYPrMpKtri98zdW6ovWI402/q9sv6LjU9U316/tJ74uo/XV7ae8rbUfUT66buv1HdJgjgu/TVS6tx8l1l0fb6aDuFVE/6Nql87zOIWrTqlffy2ndKqPvo3WvoHsrrmlOqr/MXicjIyMjI8NxsVtjiwrNAyxQURT41eYAd7pH+K9WV/h8V75tmXgzviWoqgo/+90F/uDvzN60KC+NdVXhn0wmr7/iBwD+POrvDP4q6AL4Rdykkc7IyMjIeCV45wlhd7q6k4y/A08j+fyeVzpSlKjie3S6eMpk1s1nCP09ihpxJ6Y78dwh5o4l/V6d2pEDyiNL6ExS8k6dfhq9qnp1R586mNh+dbBpNJmTSiyD5bqz8ZCTkTp1okn7UOVXh5qT+u7U07sxqRd+p7p1R2vkgNY+cmLQ+0ih5Iv3teorwvP6us75qPJEjnfVA52PRXFzx+jFxUVK90odkhxjBGhVVYkE1JTOhN7lykhDkk3vvfcefvaznyXyZ7vdot1uP0MaNJvNvfpU72qvfl+tfl+nF9eP2w2AFBlM0orPkWBSvel487StJP8YUaokrdpyo9FAu93esz+mgObzZVliOp1isVjs3fVLEnE6nab26/yjxAHJNHdos0+VvCWBqXbnEcicD5R0pn1R9rrnCY0o9LsgVa+ch/iO97VGMysRyUjqTqeDXq+3Z0vL5RKPHz9OhybYT9F8TvmchOE44FhstVro9/vpWdUZ31WSkv3X6XT2+t4jttWWaBPNZhNlWeLx48cYj8fPRDn6nMr3dA5W0vq9997bI//Lskx9z/uPy7LEvXv39kh6EupcUxkJ3Ol0ANwcaOj3+6mf2CdlWaZDFzo/KanFf3rwQG1So5Yj8kgj178uDq1t+ox/7qSjy+mf63oXEYgqh9apB6RcTl8zojUJwDPfKyI5dF3WOdU/832d7wl0fHtdEXEX9Y2Wq+Srfu4HjViXr82+PkfPev38Xp/RvtJDWHX6iNYlPxjmeygtg+32fnAd+qEaPTCobdfv6uxB5dB/aru61tS95/p3vfMn96helve37tVcV/ruoTEY2W80PnW/5vsB3xfrmuJjjWuY9pmW6+M6IyMjIyPjVaEoCnzU7OJ/1H2If7Ae4x+sR29apIyMPVRVhU9/b4m/+3+6RPUGr+H9OnjtMc1dAL+O2yWDiXxmMSMjI+OV4p0nhAHsReRFpJbesUi4M5Ikh0Y1qrNOyRzee6lkiDqUlFwG9u9iixw6wL5jW507SpyoU0kJFHdQaXSNtlkjK1UPfEcJGpXPyVZ9V2VXHan+VfeqNyUbtG1Kmrkzzu8FdYJbv9P2q6Nbn6H87lyO7Mid2dpeTafK7zRNX51ztM5h7M5afYfl1UUGRfdDapRQBLcNJ/TYZ+12G0dHR1gulxiPx2m8sGzeUap9T6cl+0DvWWWUYFmWiSQ6OjrC8fExPvzwQ4xGo5TaVsep/h05q3WMuGNU26gk5iGHqbaHz1NW3vOqaZ+dqFJb93lBbYRlHB0dYbVa7TmWdaxwTlPb4H2xGiWq0b9aDn96OmaWxXZQTh0rLE8JSH1PCQb/Ppp/lMRjv1E2JYy1v5WA9qhxJwUITePN7zabTbrzttVqpbuDu91uIviZ8ngymeCzzz7DarVKhKzPvZRL26mHimgbAFKkb6/X2yMt1W6cMOG9wjwYsdlsEkHKvvTo1263i06ng+12i0ePHuHTTz9N403JciWpfZ5mX5IIPz4+xsnJSbormNG/bHe328V0OsV8Pk+HF4jFYpEie6+vr1P0+p07d3B9fY3tdouyLFP2gXa7vZdWnrqkzQNI0fA6nplS2g9WKCGs44vp3W8TThAREdHIfuDPaA3SMv07Lc/3Er7f0bF4iAj0tujzLq+SqtoGl89ljgg2f073IP6st8H/1rUH2CcxVYcR8eg69n6L1nfvn0PruM5Z0eEWn/e9f3Q+90Nh3uf6ns6l0d700H5FdRjB90u+B3Nb1vLq9kIKP1wI7B/20jZE7VR9H7K5qG7W4QdnIt0+j4ylXLp/1rlKv/eyvP/rSGGV69D+JiMjIyMj47bQK5r49aNj/P5miunbyrplvJMopzv8/f/LNRajtytVNDHbbrHavWbZ3wPQf71VZmRkZGTcDt55QtgJKwB792s6YaTvKGnBqCb+7afyNVLNSQr9p2QLCR46JZUs0mgEdVQ7tCzCidQoSkpl8Qg7bbu2V8vziA+NDFXnqOvEHXLaL6p7/Z1kUOSMVEdhFOXk9TnBrg43vud9q9FQhBNX/CxyHLNcbT/b585xt8WIFNAy3VHsNsbP1ZGo8qvOvN1eF21HbZK/azQmf59MJinVq98vy6hdLUMJJsqo/TqdTjEcDtHr9QAA9+/fx8OHD3F1dZVS5WpbSORrJDI/i1JL68+o7yK9aN/4+Gw0GildLclM/ceyKZPaofeL/k3dKOHpEbXqxHcShjrmQQySxHpvuuqHdbBsj6RXQjByhGsKar332J3V2jbOdz6mlaDUwx8R8exp2gE8YyNlWe7NkUVxQ6brPAZg7/BAv99Hr9dLd1iTXLy4uMD5+Xkqj/amc9Fms0ly61zrNsE0zuwX7RvKzghagocP2G7qyAkSn7eZ+no8HuP8/ByTyWQvGprtdz1pP2k7OBZJ0I7HY1xeXqLZbCYSloclaB8keAeDATqdTro3eLFYpM+qqkK328V2u00przUddFVVSVd6yIv95Osw9aFpoxU6D+lBhNtCHcmocurnTjTVje9o7mZ7IvJQ+9Dl8b2QrzG+dur87eu17gGiAzhep39/iDD0uurK8He0XH8mshX9Pvq8rt7omTpyVb9TWTS7RDSe6+SPPvM9VLR3qNt3ePtULkL3vtom2pp+57bAutW2nLyMdKltdHt1MtzXG33P39fxpfOf6yFqpx5UiPTP8nz8+WGfSG7fP0f25jYW/b9A92AZGRkZGRmvA4OiiUHRzIRwxjcG1a7CP/6/jXD9s/WbFuUr40fLJa6+9Fm8FjQAfBc5kjcjIyPjLcU7TwgDccSdOr2UrHLHiEdlRI4sOsGBp3d7aoSuE5PuQFcnT100ojpwWIY6u5yYUaeTOpvc+ebRBfrTnWbuII8c7P7+8xyzTjqpE0zb7nXp396f2g6PSlJntMqh5FEUhcHn3AEdRdC4Y1FtJXKyOhEYOfG8vU4CqEwenRM5B92p6Y7lyEmtpJATylo2yZ7FYoHJZJLILfazp9Il2cJnSBSRtOQhCUYGMmXvnTt38NFHH+HRo0cYjUaJ6N3YRrjRuIlcdEKHpLTqSNuicIc5ofbB55iel3ceM/K0LMs9ByyAROrRcawpHnVcKInItLzuKOYzTrCTkPexwahJkmGa7pcRpmrvlM/vi/bxxf6rmxNYJ+UnIcfvvVySoXqwgPLwkI6Ss7xTWg9/EDrfULdR2n29pzYi6nVuYJ1ffPEF5vN50iPtwNuufe316u9KuumaQ52pDbC9JHJ1rfADNdvtFq1WC8PhEKenpzg6OsJ4PMZ4PMbjx4+x3W5TpK3On9SX2j0PMfF7/uQY3O12OD8/x3w+Tym2q6rCbDZLkcnadiUpms0mBoMBGo0G5vM5Hj9+jLOzsyTbcrkEgESyd7tdtNvtZFtclznn+Hqo/alrKXWlba+qKtnabaGOoNN+pg59zYgIIv3O13BfA+qIKf3d17+68nTdiebJQ3OnE27+vRN10TPReqfyKeGn7+lP1TX/1oMV0aEwbQOheymfP1U2nf98TfX13+vxed/3mNouJ0K1P+vWereRyP5cB95Xrmevz+dY76MXrVv14fVH+qoj8dkHOmcqor2g/tQ+8IN1ut5ouVqWp3bWcrSOukNjKo/av6/TOk59XN/m3JaRkZGRkXEIDQC/2Ozj0e52M+9kvCLstsD63e6r60/X+OFvzd9Y/QWAX+6/ZaG2DwDcf9NCZGRkZGR8VXyrCGH+rs4QvZdLHXO8N5Koc7KoE4jlKMGjkWbqJHLnlTrV6px7TPmqdSqBwvrdwaryAM9G1bLNen9rVT2NUnMHlzt6I6erOt+d5Imi+dR5Fjnb1DGvKYW9ne74Zn1KMmjdqhtNp6p9SZ1pe7XdbiOubyKKCIycnh6dw+e1XoXaXwQlSNUJ6W2I9KcgGVh3v6b2J21/NBphuVyi1+ultLu8E9Wd00o2kvShnlgn7yElmXT37l18//vfx49//GNMJpMU7UrZNF17pEPKqwcS1EHtdl/nPOd7SqoydS/tT4lZJ3t8PuG8wfTaRfGUGFX9qvwRCRCNN84j8/l8j+RS2+VY0cMrUSpddTKrPep3+plGulIfjKSNZNYxW1U3pBzLcEe/6ph/K5nOtimxTBtRG6NNMrJbdatpy7W/VqsVnjx5gt1ul9Km0+Yiu/M+45xGebR9LE/HQ1U9Td3MNMbUld7H60Q754KTkxMcHx9jMBhgtVphtVrh8ePHuLi42GunHpRhGXr4Se2NMvIwAclZ9udqtcJoNEKn08FqtUoRw9vtFicnJzg9PU33CldVldJD93o9lGWJy8tL7HY73LlzJ5Hc3W4Xi8UCRVHg5ORkz27Zdh4o8bVS5wWdD/VzEsl66Ou2oPN4RGIRTiTpmNK5l59Fa4TW6Wum/tO9gcvkcrl8Pqf5PsHnGZVJ2xLtMaL1qk4231tF+vD1UtvgcwrL8L/5nq4lTubVkbxOYke6Vtm0LD6v81/Upqhc1aV+rrJFez3XKRHZk8rC9/yQj+93XMY6+fTZur2f1hvtTet0E40dX5dVh/z80KFKva5G69U1si7DB+t3Eln3KXrFgNcdva99cGjOycjIyMjIeJUoigI/aPbx99cjrJHXn288yiVw8cWbluKVodpV+P3/YorV7M2lii4AfNjpvLH6XxoNAH8COTo4IyMj4y3GO08I1zmw3MFX56iKiBYlHJw04vckuFiGOxDVwcXfnbDl7yyHjjW+7wQm2+uOXW2POi1VBpVVU7FquxiJ5WmlWbbK4LrUz5Rw0zrUaRc5hPUZd2o53FGremFbVBbtX+9Tf66OIDzkeNMDCO4M1ue1j+ho1MhWyhOlaFa7dienItJzncNXwftUlfQhXKZ2uw0AGI1GieAhQcV7WNV++T51pbao5B6/Xy6XiVz+6KOPsNls8JOf/ATT6TTJRTKW5amstPlIp+4Ir9OJ9yXJuHa7jcFgsHfYZLvdptTJ0b287GslIxitSALU7anOqd5qtVLEqJO7TANMeVT/APZIeRKLrhO9y5d18mc0prU9/X4/JDeVeNXydrsdyrJMZVBv/Md7d2kbdJAzCl2J14hoYB97X9P2OCewfEbWDgaDZM+73S5F17Ju7Xud15UwYj/4vKuEud9zq3ar7dB6WQ/tTQ/88G7gfr+fxqjef1yW5V50OPtIo751LOkhAUbWUmYAiUQdDAa4vr7eI8yZJno2m6U26HrE7AC8A3kwGCSSmVHM0+k0rZHT6RRnZ2fJxmkLnAeUMGNd1KUePPFDFFVVYblc3ur9wXUklK+bh+xV3/dDWxGhF9Xr8LXBCU7g2Xtto/UxqkP3Ly6Tj0HfL/A7n/dcT/pcnd60bNbFuUyJSy07ktUPuXm9EdEW6T1qk+vA/9a2+b4jsqG6PVZURx18L+MH+dRW9KCQ70lVD3X7k6gdun/zZ11v/qyOE+rseW31Mtlm/Yw60H2+6sPtQOXwvtTrEKKx63tOP7xY1+f82/9PoLIeOlCYkZGRkZHxKnDWOMLDRhuf7so3LUrGtxzXn27wo7/35qKDbwNVVWEWXC/4yvAAwD1kQjgjIyPjLcY7TwiTLFAnjDsL6fBW57Y61hkpq2U4GeYOJ0LrVqe+Ow6dYI4iLFSOyHmn8mnEmTp81AmuDiIl5LQsdQDyd3X6RQ5r14e2mz/dQa1yah8pgUtdkpBSEquuHHeAKtSZTbiDVNuj76hsfM+jOyLHvqYG9MgOj/bS75Qo0uc9+kW/i5yY3k533PK7yFkaOZSpD/YXyWuOm6urKyyXy1TParVKRI1Hr6jdcixqhA1/8o5S9vvJyQk+/vhjrFYr/PCHP9xLA61Rkeq49za6A/aQsxjAXiSw6q7T6aDX6yWikrI4kRYRB2oXjM7UMUS98jtgPx28EwScw/iM3qXMFNqLxSLpmul1o/nN26DzEP9WuAOac2y32019T2KcKbUbjUYi3SgPo72VfNdx7XOGOuEbjQY6nQ663e4eoUkCiPpwwkLbpHc785l+v5/uqKWsl5eXGI1GAJDShGtqdJWJMkTzIPXCcpfL5Z7jn7rQQxJ6wICkpkYYa/81Gjf37qreF4sFzs/PcX19ndYB2pgTprRNyqLzgfaH9mmn09nrj81mg86XJ6CZiWO1WqHVaqX5odlsot/vp5TRs9ks9cV4PE73Hs9ms0Rsd7tdrFYrdLvdpD+do31N8/WL/e33JW82GyyXy+fOCS8DHzu6nvq8pOtK3drv66V+rvO1X8ugY8kJP/88Iu/0u2gOeJHPfE2J5mUdJ74+63PRmhvhRWTQuvQ735tFsvv+Qecnrz9qk5erbYmeqWvXoX0BEGdsidrkexrXvcqpez9+Hh3IojxRuyhbXd0qo8+r+i8ifqM+qtNXtOeJdO7jSKFzziFbd7I6qofPaKaO6LoFllMnZ2RTtzm/ZWRkZGRkPA/tooG7jVYmhDPeOL74F0uU0zcXHXxb+Pvj8eupqAHgBwCaz3vwa+LzV1x+RkZGxrcc7zwh7A4edYLQeeKn9Z0A0EgudTTpeyTAorrUYUNHtDvIVCZNd+kEhzrm3QGpTjZ3wlEufq6OYY2eolNc5VHikPC/3RGmzicnGz3trDsX1SHNnx49qO1RHaozUR2xXpY7den4dx16H9Y507wfte0sTyMindyNiBUnCCKHdx0p7PZzyOae51SO9K0HD5TMUDKLUXvL5TIRcCS3SJoVRZHSx+q4UlmV7AJuIho1ypRRmx988AHG4zEePXqUdMKUyPxbDw9QXo1UdqKkDryrVVMgkyzjGNaIQ+2/QzrTu2f52Xq9RlEUYbSw/mNUpM5DnL+qqtq7c3a322G1WqUU3Npukp2R89p1yLZpimTVrc+rSibqOHRCTA8a8H3PiOBOccrbbDZTu6g3Rq/udrukI6+PP9lvJDbZbqZR1j7Y7W6i1T/77DMsFovUJtoDxzp1oWNJZdb+1HlZ5yONWCb08AD7gGXyUAJlIUHd6/VSW1arFZbLJUajEVarFRqNpxG1mglCda3rEXWvh2va7XZK+c7DB5PJJD2nMpLQ7Xa7Sb7VapX0oAcv+l/eq0TCmOV3Oh20Wi0MBoM0f2hacJ0P2S4+x7GlY13tluuCrom3AR1vvj76c06e6ZiqOxDE33Wuc9LK9wd1a7J+rz/5u6/Duu69CMGmz3s9OhdE70eHilx+n0dcv/63r7cu+yEdqJ69LbrniAg/l8H3eFoXEZHM0frla82htvhBFf3n79StlS4z8HS+1nd0P6HleVkug655One7zCzbx5e3J/qpc5rW6f2g+22dF6Oxoc/zc11LIt1FB5VcV5E9RvBrYVT3vrZkZGRkZGS8avxyc4B/tpm+aTEy3kIcPzhC5/h29i4//Z3lrZTzpnHId3Wr+D5uIoRfNRavoY6MjIyMbzHeeUKYDnolfIBnHU91jlV/h0QBnTTqLFJiyMlbLcudwBoZSoecRpIqecBIZnXSqyysR5/jMxoNyjYDeOY5lqH3k6kunfhRqDNKyZvIcUW4A0yJH9cf5VYCRb9z0iVyzB1ysHo/aL+pM1X1p9/xbyc23Zmq37kuIwe5Ek2uh0P6jBzxz9PDIYeiOovVbkj0kXijrNPpFIvFYu85t1NtA+2adZF4LYqnKXQ5Pnq9HgBgOp2i3+/jzp07+IVf+AVUVYXHjx8D2I+60XZpf5E0i5z2EUhC9Xq9RFh1Op005hjlGBEELJf2wX+cOxjNSj3SFvReWW0PP9PxoiDJzH7l/cFKrvvc6MQjCWbNOKDtYN+4g5pyqUwkuj3bAd9ptVrPHHoBkIh9/UwPCpDYYx86EU9Zo3leiSeXXQ9uMLq23W4nYnm1WmE6neLRo0dYr9fodDp7Y0TnTOo/ilpT0oTy6phhuzzrg5IhUdQYy+b7nU4H/X4fvV4PRXGTVrosS4zH4xS5q3cqk1SOZFWboLwkpzluSc6u1+ukt93uJg04D4q0220sFgtcX1+n9NCtVgvT6RTb7RZnZ2cYDodpXB0fH+/ppCzLdNiBke/L5XKPAKOdlGWZDk64HSuxTd3o4YHbhBNMlJHy+CG1aB7XfYg/B+wTyPqu733qCCeVy+Xm704e+ve+39I51seBr+Euh9fj9fv6GM0vUXn8LtqbaDufVxY/c1txou1F1lr/XJ+v+64OXr/aWNR3ag++3qh8z6u/rl1al9dD+DzN+U7f1/ndDwVEezqW4+2N7Kyun/0wI3+P1iwvU21fP+f+w5/xMa/yR2utttH3kno4yffDGRkZGRkZbwrvN9s4K45wXW2e/3BGhuD4/SN0b4EQnl9vcfnJ7V0L9M6jAeCjL39mZGRkZLzVeOcJYXfMa+TkIcenO6vc8eqOKXeyetSdO2rrnE4eZeCOP3VokRDwaFB3Aql8TlA4qagOcZIT6sTyyM3IUe1kkTqDlazwyA3qQetzR2id05bO/4gQU/Ivcm67A5t60eeV+FAbAJAINyVhtK8ipz2dgCxH9aVlU//eX96OuogstSEnR7XthxyqWg9JEk2lSxtUe2D61/l8jslkgrIsMRwOU/SgOj55725RFM+knGZdPCQwn88T8cR3q+rmjs9+v48HDx5gvV5jsVhgMpkku9BDBpSd5BwjcpVUqyOAiqJIbVAZhsNhsu1Go4HFYpHuTlbilwTZbndzlyrTSzPylISY2guJND2MonepkijUucqdympXbCPvlFXboq2rrWj6YZZJG9b5iuUzGpVjRsk3PdhAm9R7ybUMJbnVmc33qCemmabctNHdbpciYQmvS6EEMPXBcqgDRrLq2jAej3F5ebmXalkjxb0fIpKVbfL00Np3eoiA40P7JiKeqBPauP7b7W6imyeTCabT6d41CR6Vz/J83eOzjGTXSP9oHqFO5/N5svftdpvG62AwQLfbRa/Xw2AwSN8xan0+nz8zRoqiQFmW6Pf76XO1HW2P61PbSbvlWGPf3wYhfGhO9TXO39P3nRD0+d7fidaKaA31dSDae6i8ETlYR2BqedH66SRaHVFVR2Qd+lwR7bkiXfi+wJ/TuS4i8aJ6/XeWr3OEH3KL3tG/Iznr2ub24+U44eios5m6PnV7jPSkexuXu66PdV5xXeoaqPJ6doO6PtJ16ZAeCV1nff/FMuts0z/TvtA2+n5f3+H8xfp9z1d3uM0Phmr9GRkZGRkZrxM9NPCdZgfXwf+LMjJeB5bjLebXr/Hu3bcdPQB33rQQGRkZGRm3gXeeEFYnWx0JGzlD6pxAhxysHi2jDiV3/GnZ7rj1yN/on6a9VJKwzsHGzz1CQJ1aHm3DiMdDeuJ7UWRE5ODT8uuch0qkevQiP49IdXf6RX2m7VZ9av1KwNY5+LQORjuyTdSHvufkN6Eklteh/aIHDNSx63Ya2WedAz8iAbSMQwTGZrNJKZ81Ulhti2TdZDLZc0K22+1EgFLfbKumSyeh6qQXoxoBpPtQWX6328Xdu3fx3nvvYTaboSzL9IymfmX0u6capj7qbJ1povkcCUISvNoObbOmgeZhgG63m9LdKsHs+lS9Uhc+ftRmlSxVAroonpLs7J/FYrF357LOOzpvaWQSf+r8EN1Zq2NdHeYkZVkP2+ukNsvgvKXf6xhjdKiOMRKz7XY79Us0J7MsHcN6h7UTJUxrrOPh4uIC4/E42TQJY97JrCSr3oOu/aKktdpiURTpwIRGxbLN+g7l8sMr+o6OOx7YePLkCWazWSKxdY7TzBScG0icM9qccvCucODmXmL93ucappSm/bTb7XQ3c7PZTJkAGo0GptPpno7YZ/1+P0UEM+08bZL9qIQN+1tTsGv/UjaO206ng7Isb4UQVh1ERBD7UD/3ceBrj8ruc6+uo9GBNZ0ntG98jPCnlhe1LZI/IhH1ef0ZEWYugxNerj+vt26/p/C9UvRstKc4BJ2LIzlUl35gpO457Rcn+qK9or6vsjjh7/sFIprLXZdRv/mhNrXZKPLVZdfvVf/aNt8Lqsy+t9afde3yZ+p0pLrle5rJp65Mt0nft0WHt/xAqR/2qSvf9/9qA1qHrvGcZ+vGSEZGRkZGxqtCURT4hWYf/3wzw9t/g+s3GFUF5HU+xI//4QK79ZuW4nbwWo733QWQTSkjIyPjncA7Twhris7IMaWOEicE1JGq95+p00kd/lqWO1foVPJUnu4sVweZEsO73W7PKc/32cY6Z6U65fxeUP1enUtOjEVRtko41Tm+1DHq+vd2qHO7zhGuDiyVkT9VTtet9hfLVR1Gzj6F24oSXGoP7jT38iLHM23I31W7VXI4qidyKEdyaJ+xTUqm1TmktR7+c+cv28IIYBK3jBB28rXdbmM4HCYZFosFlsvlXj+s1+s90knH52azwWw2Q7fbTZGGzWYz3Sc8nU7xxRdf7N2bp3r1e0VJfNURHyTT2F9sA8cfoz45Vvv9/jPkelEUifQiCUxda3SlHorge54iWW1WiTu1Dz8AomNwtVolMpjRtO5w1zlJiWS1Adou69f+i4hktTvWwdTBLEuzE3haYr7HQwmMHtVDL9SDvs93NDqfdSkZRhvWu5qZFpy2TdtZr9c4Pz/HcrlMhwWUmFaZlLBUQoH1kLDlHboAnonq5TvUn9qJE+NO8PFQQrfbTeUsl0tcXl5ivV6nOtTm2I8kV6k71sVxxPHIgxYkfGljHMucB3q9HrrdLiaTSSJomQK+KIqU8rkoimf6mf1YliU6nc7eXd7NZhOTySTJzL7XyH8/aKKZCPxgEyOfbwsR2aXf+Vrqa0c0prSc5xGXTm56PTpH+L4kmu+9/jqSz9t3iFSMytfnnDiL9BjVoXsdfaau/mjv4aRftGZ6e/V9IjpAV/d33VrsdUbvHyIeI5l1X1en82j/eGgPVKcr/T7aq/l3fqjOZfFxEfWHom5tivaz/nc0NlUPekitTg4vX8t2G43AfYgeWHGb07nc7VjXYJ1XMjIyMjIyXie+3+zhvUYbn+9y2t5XgvPPgfUKaHfetCTfOFRVhfXym7H/+U6ng/e+/L/+V8HFZoMfL1/DXcjHeD3pojcA3o2rnTMyMjK+sXjnCWE6koB9RwwjBvmMOkPUcUWihM+pk9QdZ5EDSaOgVAaP8ohI6sgB7GQ0SRq2xx1argt1rnnkiDtvI2LIHYQe5adyRg5I1Tef0ahKfQZ4eict8GyK6rpICHUeqpNfdR31N+vhO6oX7VdPOauRpio7y9b6vd89gofvs29VFneKRs5p/+x5DtEoQsidhf6OEqkaXeLROnSKjkajdG8tiS8dU4yW5B2h/Jx3j1LnjEAkaTufz5PuleRstVo4OzvDd7/7XZRliaurq5RWmLKRVPP+IJGokbRqfxppqRGfam9qc05m0t41TbaSVn7AQv9phCQjpfWQCN+tS4uv5CTlWK/XKRpTx6TOC3xXIyw9ilnTteuBD03TrTbP9qp9q40q6a9zjUYz86ce4NE5mrZF2XUcagphn183m00igDUVMqNYaXPb7RbT6RTn5+coiqepxDVdNp8bDAbPzFHA04hj9hvJUfY3o2Y1cj6am5kmW0ljks0aXc12k1CdzWa4vr5ONkz96byrOtPDCtSx1rlerzEejwEAw+Ew3QPMsdtoNNL9wZ1OJ42zdrsNACmiX+2FKaLn83lKk83nfb5gm9h+2ocetqDdsi2eslf7g/J9XTiRFJE//D1aB9kPTlb5Oszv+JmvkYQfONF3NMVutLb4gSIdv/qe24nvn6J21e2norVIdaaEV6QD3y+4zL7O+17I63C96HobyRMdRKsj+ryNvv+oe47lsq3eh1oen1UdaDnRno3Qdd/nIrdnl8s/j9oWlcffI/vwOlwPul/TtU33/b6e+Dx3SGe+V/IxXjcGo/byed/r6eduE7ov9v2ck7y+d33eGMvIyMjIyHjV6BQNfL/Zy4Twq8JqCeRDXyE2ZYVP/vHiTYsBAOg1m+gGGWFeFKvdDvNX3c8NAKevtoqEGYDr11RXRkZGxrcU7zwh7A4fOrLUwa6kpDp39D5JdfJoRCHf4T+PAnMnVpRaNbpnknLpZ+6gohwaLaiONq3XHcskUEiuRQ5RlT0iMj1qUJ3shOqVOtSITb0XlXW500zJHi03cgSqk9DvVlaSQZ3lEcmqsms/a1tcT+7w8/5QvVEedepp++scye4QVahNakS721MU6aXj5FCkiBItqluFO0jH43G6+5dt4f21i8UiRRQyxSzJYxKVJD41ApEEEHU/mUz2InhbrRZOT0/xne98B2VZYjQaJXl1DPIno1M5HpQMIkHGqN5er5cIKbUbJz9VvyTneKctIygpjxIXAFIaarVT/q1pcQk/NMDn+Y7fNci6GMGpB1yUsFXyR2WkXtz573Mi69R5VAl8/qtzlGvEFfVCUlgPYvAfyViWOxwOU7SvysnvaV/8jHKsVqs0XzMK9fT0FO12O9W12WxwfX2N8/Pz1KdMx6xzp6ZG13bpd0oC6NpxenqaCFHqlRFhGi3LPtQMCUrMU4ftdhvNZhNlWaIsS1xcXGCxWOzZOP+pHfDAkUec82+1FR7s4J3hPk6o3+l0ikajkdI+U6dlWaIonmYYODk5SWVyzaqqm3vDW61WIulJNi8WN/+x18MArFPHgNuY47aIEieqWKb+rmtoNKf6uu5rpbdH54ZIBi1f90F1BFEkTx2p53sOXyv8cJmTft7murlB3/GyfM32NkWHsPw5l9vnOv+O73FsR/rTeVbLcb1FbfayfA1zeevuzq07BKb9qZ/rPKLfHdonuE5cp65HX0PUxikv5zdfZyL70ffq6o/k1D6ICO9Ih6p/LyPqN62rrh/dNtzmDo136i+at+raf8jeMjIyMjIyXjV+7WiIf7qeYJ4TR2e8RlQVsFm+GwfiXsvIKfDqCeEdbiKDfwdAvto5IyMj45XinSeEgadpowknGYBnIyzoEPIooucRkfxMCWI+S0eSE8rqWHeyT3/XaEMSAyzLI37oUFMCTR2EHuER1ekEhbZbCRXViz/j+tV3VIdOUrojTvvNidM657k76fhZnXzaXu1b1qd61vK1zkgOL8dtxR2aHt3jdVDGKMLVndbe7rpIJfbxIScvoRFzTubxgIKWTUJYSUjeXVtVT6NqW61WIm2Ywna9XmM2mz0juzqJgRuy5/r6GgBS6tlut4uHDx9itVqhLEvM5/O9+3r1jlcAibwiGV2WZSJxSdwNBoNn7grm3OA6dJ0zglR1VlVVItqqqtpLxau2oXMW5xZtQ6Qf7QPNIKAEM6N91dkfReFqFK3+zbI1GtPJKJLYJOj4mUZtKulAmZ2cJ3Q+1LmZ7zPqudFopPuj2Ra9G5gyUH7qhD/Zpk6ng5OTE5ycnOzZ93q9xuXlJebz+TN95CSDzydK5irp0m6398h02hvJWiWTtE/0EADXCbaNJDlTK9Pm5vP5XrpoPbBAuXVe1jWL7dA5RuXa7XbodDo4PT1Nz5HAPT09febAFG2Q5Df70COc2VaN2m42m1gsFuj1elitVhiNRolU1sMjnFuU3PL5jp9Fhzu+KnwO1t+d9Kl7V5+J1kbPJOF1RsRZRCz5ukhE64KXER00iuz/UDm+Znl5UfSkr8mHdOdrsLa7rk907tDvVeY6sq9ujGg5Lqd+Hu03o7Xe3/e+cfLSf3fbrGuX6kE/13ZFZPvz6vF9kOvZ3/Uy9Hu3kUgH0U8gPjTn9fjfvnbV9Z//PLQ3fZ7MbCef0QOdh+TWPaPrNdJvRkZGRkbG68BZcYQPmx380fabEa2Z8e3A5NEG68W7cQjht8djbL7m/1nfKCoAVwD+EMAlgDwVZGRkZLxyfCsIYeDpPbseUVZHSpAk4Dt0MGlkh5IU6jSMHCws36P3ACSSTKP4tCyPRlBnvZKjkUNWnWJKxtJxpO3RZ5RkUAexO+zc8ej3oLocCneAabv8OSdvSaTweZXXy1YiXPVf58h157A7yg85cA85IP15r6fOQaxtisgFvqOpit1ZXFe+2qWSgv63guSNHypQ4kj1ztS6ZVliOBwm8qkoir07V9Ux7+ORKWaBm7SyKiPrICGsRFGv18MHH3yAsizx05/+9JkxQ13qQYCieEpssqxGo5HuX3UdM0KTn6lcJENJtqk+ldDQu2Qpo97nqtBoVx2/qj/KwAMhBJ/XgyQkhdVOVDd6RzIjuFmnHp7Q9MdqK+48d3vUaDC1BerAx5XarjvAKeNisUgyMf0x51mP+iZRrWNfo8NbrRYGgwF6vd7eeFoul3jy5Ek6OKD3N+tBILaH5D1tgZ/Rfv2O4GazmQht/tN7qnnXMCNn/RCSRsiyDe12G9vtFqvVCuPxOKWLpp3roQjtG+qWbdT5cLVaJZmZuprjdjAYJL2SpGcdJNepD352dXWFqrpJFd3v99Fut1PENt/X9Qq4OQSimSR0nddU3Dov6jobrQVMbV03H78MvG5+Fj2n8DXd9xS6vlJuPlu33urcpc/rnKuoK1PH6/PWLiXLdNxHYzuSPYKTb/ypY8/bEJFx0YE5PuP7Ki03WlvrdBfp8BCB97Iknc6b0f6Cf/u+x/dN+qy3P9pTuN3pYRt9x9cV1UFUf6QbIL6f2G2njtRVHahsh/Z3qkvfw0Y2pPsm1aH3abQeRus4n9f267jzMR3ZqetN9x0q24vaWkZGRkZGhmKLCmW1Q7v4eheL/srRIBPCGa8VVz9bYzV/i0nUL7GtKjxavaUp1yvcRAX/EMAfId8bnJGRkfEa8c4TwiRFNDpNoUQa09K6owd4Gp2r0WhOsLojiUSKO5PcqcNn3MFLwobkgbbJ61KnlJapZTvhogQUCRIlRPh85EyijHSkUgcaeaVED/95NE/koFW9e9RFFI2hutY+deejOtxcDv1O26LvR05GJe0pn7dBHYN+H2VErKltKSmv0Yv8TPvCHfOUU3Wh71IWdQh6ORFIsJAodYevRhLSdieTyZ79dTodFEWBsiwxGAxQlmWKELy6ukoE63K5TPcHU/9MIa0RxCTIptNpSutMku709BTf+973sNls8MUXX6QIT+pDda0RqSQDGd2q9x7ThjRCmHolAacO3bpMAfyMP0ngkjTXKFkdl+7c5z2z3pd+H6KPhdVqhdlslkhhHWt+32CUcl3T6muqZuCGKGRUptqd2jnnZdZNwlH7xuXQlNE+r3m0s2de4HxFEtUP6ahjn2vCcDjE8fHxXurn7XaLyWSCx48fpztwnVCIiAWdP9hn+pnKVhRFIml1nGl/Rqmitf+pg+PjYwwGA+x2O5RlifV6jclkgul0mtJi0+ZoF5qBQtcG1a1Ghut9vhzbzWYTZ2dne6S1zjsk8BuNRors7/f7qU+bzSZWq1Ui71luv99PcwL7dTabpbmCBLLOr7QZQsex2p6SW6tb/M+1k0kqg37mz+ncrWtqHQFUV05EFDoxV7f+6nsReaWf1ZFm/Fv3Qt6+OjLOM7RofVHbX0QW75vo0JoTrA6dz13PdX3kpKwThnV1RfOKr+suW/ReRALqONB+jvYTLpPWo89EB/v4udcf6Un72dtRp1d9N9KVRzfXPe99Q/gY8TnR98qelSdqo+uhrs2sP9prer9Fuoh0Fuk5IyMjIyPjZTCttvhsV+KXGl/drVgUBT5udHFaHGFUbZ7/QkbG10RVVdit334yGABm2y1+78uMem8dZgD+CYAL3JDDGRkZGRmvDV/vKN9bACUEooheJUrqIiH8fT7rZING16hDR5346pTR9KXqwFeCjTIqeaT1qJPYHVuR80tJD0bBaX2RE47OLMqrUZZKwLiTlu/r7+7QVh1q+/TdyOkalV3nVFVCqc5JGb3nZJHqkzKrU5DQ/nDHap2NuL607SRePAJU9XfIseokCHUZkW3aNteLy6jt0T7V9pMomk6nydYZrdfr9TCbzTCdTgEA0+kUy+Vyb5zpYQ0SjLRd9sdsNsNyuUyk1fX1Na6vr/dIhDt37uDjjz/GnTt3EqnMfiFZxX6mPbfbbfT7ffR6vUQGk3gmYaYRURpxyv5i/TrO9dCE2ktVVSkSVPvCn1EHMD/TyFGOa20X+1rfo10tFou95zS9s8+Bajf6nN6dS8c7yU2fW9i3Oi9qW2k3OodR70p+anl6Bzd1QaJTD8GwjToWdL7R+Y0R5np3MIlzRtheXV2l6FrVmf7TiG4dn76eeN28H1dTY+ua4XXS/px4YJ/qPL5YLPD48eNEqjItutsZ9aQHqlRPms6ZfQ0gRXa3Wi2cnJzg6OgIg8EAx8fH6Pf7aTzz2aK4OdTAtNZFUSSS+ujoKN0zrGUz9Xun08FkMsFsNsNsNsPl5eUeOa3zn6dNV90rKah9fRuISLxDz/lY0e+dUGR/eHrraB6JytfvI5KoTo6ojENrUbTPqCvb3/HvfH8V6cfbVUeMRaRaXRvqdOj7L9dlpONor1nXJzoXu8x172m9dX2l9h+1TXXpc4LuQevs23UUtS2S0eU9pPtoPxWNMX/Ox5EebtB9gP7tB5sO9V9Uv+6Poj51+VyPWlf0brTP5LOe8l/L9UOSGRkZGRkZrxuDook/czR802JkfIvww9+av2kRbgX/fDbDaPMaDlK0ANzm+cEpgH8A4ByZDM7IyMh4A3jnI4TVwaOOFDpAlJBk2mZ3UimJ405YdbQoseHvsP46AlrvdtTnI0etEkEaMevEyqGoES9bCWsvQ51fSpw5ocJ2KTmodZEY84i8Oue09gHwNFUuy9bIV+qNf3skopIZdMapftgel137T6N1+Z3+POQcdPtQ56PL4AcTNCrUn+X77D8lsSMnouuZ+tC2eh/UORH9fYLOZSWn1L6q6ibyt9G4Sf86mUwwGAyeiTDc7Xbpzt/tdovlcon5fI6TkxO0223MZrNUFwmnRuPmftHpdIpGo4HT01MUxQ2hdefOnRQpfHl5udcGjWAsihsyqtvtotPppO/ZNvaHEn1KSNJG+AzJOP70SFz+vt1u99IXM5pT+5h61QhdHQ/+nI5fJchZj9dBOZ0I0z6lDnSu1HqjQxdsn37Gdzkn7Ha7dIeuEvZuj0pa8rsoVb+ng/ZDOX4IgPIxjbGmbKacLGe5XOLq6grz+TxFj1Mf6oynDajsOh+pPHpFwWazSWmqWX5RFHuHEFgu7bHT6ewRFySWNYU7DwpMJhNcXl6mNvqc5CQZbc2zCuhBCBLlu90uZWzgYQEeqGi32yjLMkUf9/t97HY7jMfjFA3P6N7VaoWTk5PULmYVYNkkm0ejEWazGQaDAcbjMRaLxV4/UD9My075lfRhX2jbleC+LahdqA37PMzxoHOyz7NRufzd5fa1ifVE5FkdSVW3TtcRcN4WLcfb7uPcicdI/ue1q05Hh+qP1sdIF3Vl6zgC9u95jXTlbfdxF8HrinSh41MPI+nnuhdVG+N30fPaH6qTQ/amuvA9oe4NvH1ebrQPjPaZrkOV0W0p6mPODZ7239vmezfVke8vtXy3Qx3ndRHwvufUdUQPguj+NZJR61X7qbO1jIyMjIyM14WiKPBrR0P80800RwlnvBZsyrefhayqCp+tVq+HT70HoHtLZW0B/EsAo1sqLyMjIyPjpfHOE8LuxKKzx4msyHFCQgXYj9Tk30puRg7NyMmjxCKfV8cMHTwOLSOqS0kGtiFyKrlzlu1UR61HJrCdUdRBFDWhemN79Q5ndbZpWf63Otcoizrx1envUSruVFPdO3EUOR3dHtRh6uSbRwc5keI682gcd/S7c5X9oul/WQf1qm11oj0q3x2nrr/nQaMZ2S7WrW3k54zsZZ2LxQLr9RqDwQDT6TRFqW42G9y5cwcXFxcAgE6nk1LcLpfLdD8sSaxWq4XNZpOI27Isk74nkwmOjo7Q7d7sXAeDAd577z2sViuUZYnRaLTnVKXM7XY7RR9GUTrAU6c0+09tTPvUHdD8qcSqElwke9UOorKdCFHHMmXzsazOedoTACyXy0TS8e5lJ01IrOl8puPH00UT+rnepUzd7nY3acLZRifmo4MTOu8osUpSl/rlYQKfF/k9y9H7glXXnU4HnU7nmUNCu90Oi8UCjx49wmKxSDrTe4RZZ5RVgH2iUaka3az9yKhdPXDAdzyNrv6td2Azkhu4IY8XiwWur6+xWCxSFDUjoBuNxl7acpWLqbqpP4Xqjmm2dc3gvcHT6RTT6RS73Q7Hx8c4OjrCaDRCVd1E5DLdOw9ncUwzSng+n6e7yE9PT1P2gcFggGaziYuLi3TYhO1l1gE90FN37zftTDMV3AZ8ra4jmXSv4gcLDpXn5Fv0jtqMzgNaTp2M0WExryci6FRe33foZy6njhOvIyIko/VXv/d9gpft70d7w7r9YqRn3avVkY7Ru9ov/ozP9/55RA7rO9qHUX/zGbdL7S/XncunuvY2+5oV7R8iO3b91JGtul6ozGrLai/8xzVDZdHf9Sfbovss/Uxl8YOiUX/WHTJUndXpUPeBug/XfvX1RdeK580XGRkZGRkZrxvDxhH+bOsEf2d1iZy3IiPj+VhXFf7xZPJ6KitwOxHCFYB/BeCnt1BWRkZGRsZXxjufMjoiv+iwcrJRSQJ/HtiPIgX2nVh0tmj56oBxJ6A7e+mkIdGm0Vz6nd7jqQ66yMHnUYuEtt2dYP6P5fl7rh9tjztd/Z5Vd5K5I5FlRASYvq+klsqlOtB+87SySlqrc8wjx57nFK1zpru+9W+3TY+SIaJoI63XSaCIbHA5IntUuVxGB/Xn952qLbIM/s3n+Q7vruVhg+12i06ng/l8jlarhTt37qDVamG5XGK5XCa7JwF8dHS0d68r7yqez+dYrVbYbrcoyxLT6RTz+TzJ0ev18P777+P9999Hu91O8gBIKYK73W4qlzomcegOWxKddCzXEch6p7CSpO5w9rGj8xLfU71q/bQD7Ted03Q8sVxNR85+4ntqczrWo4hVpk1mXYzyJPSwSORsL4oi3eHOflabVr2pffvhGZWb7VM963zhetW/adNMy6xkL++tHo/HaDQa6fCA3oes9uLRkWoXSnxr31RVle4PVp2xbCWytWy2UWWmLtfrdUp3fn19ncaR1qll6nzic4O2VQmS7XaLfr+P09PTvXWWz3NsUtayLLHdbvfuYGbUsqbq9vt8j4+PURRFIn97vR7G4zFGo1HS4263S+XrvKw242s96/Gx/HURkS+HCDAnfQg/lOUHMLwcXSOdYIqIM/7O/tQ1P5Kfzzshpe1zokxtP9LNocNJ0XO+j4qe1zU9Wvui931vws+iw2cuG//W+cqJQZfRn2e9daSkvl+3njtJzJ+qM7ehCHXlaHl1c4XOAy6392HUl/qerrOuI+1fJUG9PJXB96HRno918HmdT6Jn6/br2hYdW94f2i7vG1+Po/f1YJQfYtB5TXVVt2fMyMjIyMh43fj1o2N83LytMMSMjBjrZYX1/O0+drDe7fDXHj/GJ8vlmxbl5TAH8CMgp4nOyMjIeLN45yOECTqM6CShw9jJP+BpZLASXUq8uYPKo4vcOaSRAu5gJCGmTiJ1ZGnZ6nj3KD3W5QSJO4zcAc62aJu0DpahZdPhFDmjvQzXv0f1Rd/Tga1klsuqkQ6M/oqIfu+PqA8oL6G24cR4nRNS26+y8jmNBnTnHdsaOei0LHcCOnmoduEO0DpZI9ndsR+BNkCix21Y9e52SdtZrVaJ9CrLMpE/k8kEx8fHaDabKMsyRWkOBgNU1U3EoB4IaDabWH65ESYpzIhC3pFKwrLb7WIwGOCjjz7CYrHAJ598kuRptVro9XrP2Jfagju4SbwB2DtkwD5V/VOXfr8wdeV9VFVViqRlGXVRR+4EJknsd/gqIcZ2rFYrrNfrvfmQaaMpn/az9qFGlmp7WT5lVfl0TJPId+LDo8DUhrQtlEWzEtARz/to/dmIwCKoM0YMK7mq89ZsNsN8Pt+bQzwqnjagKadJ0FJ/GikNYO/e2sFgkGzf7cR/17lKv+e9vLyzd7vdYj6f4/LyEkXxNHJX7Wm9Xu8R5Bw/jUZjL309/2ka66Io0O/30e12U+S73jNM4lwPDZBo1896vR6q6mlmAcrfarUwHA7T3MB5YT6f47PPPsN6vU4EuK4nHuVNMlvHDuXVMfNVoPOewskw/93JHn2vrsyIhPU1w9cBLSeSsY4UO7QWeNlqH74uqNwKn1vqdKFyaj3R4TfHi7RHy9Hn/W+dx+r6yNdxf1bldp28DEkXPevzpMqvfXKoDt9v+b7U2+x7n0gebTewvx7q+15uVI7L7vsQ75do3+t6jOB7AF+boj22fk/ZvHzXYSSTjgVtnx908vdchmhOOaSLjIyMjIyMN4EGgH+nfR//efkEn+7KNy1OxjuKyRcbXP1s/abF+MrYVRX+2pMn+C8u37Jo+grAHwPIQzsjIyPjjeOdJ4Tp1FcHijvk+FPTShJKPKkTio4ZjxxRRxnr0ogoki3umHIizSP9+C6/97rVcaf3aboTy51AShJ526PU1ZHMUSpjdeo5wa2yqL5UVsqkzrIokkUJboWn9+YzHukR6VAdfu6kcye7ls1665yt+nfkmPY6VN9aRuT41s9Vb3Uyv6iju46IoE2TeHSHv0YPaj8xhSsjFXlX72w2Q6PRwGAwSGmfGfl3fHyc0gqPRqNETKnud7tdItCWy2UazySEJpPJXgrgs7MzfPDBB7i6usJE0uyQOKZ9aHupD43IZaTser3e0xfnDP5UXag+PfU0CUjtM/Yp73BVG+VdvmqvHEMeva3zC/VLXTJlN7/juyRUSZjrmCKhGTm6ndBVAljJZr2bWO1TyV21T9oQ26z2RUKRhJ5G7dJGokNALJvzP/tYyVTWt90+vcuaKck1upV2ovp28p5zphKS+j3/HgwGexHCJIupd8rMiF4ljQm2hTbE6GaOEfajrx3sA9o6+4c6IqmracdpN0y5rn2k6cIXi8VehDHL03HAthVFkQ4dMMVzt9tNWQN6vR4WiwXOz88xm81Sf1BWHY9qO/p5RIxEBN3XQR3B5euD71P4ua+50XdaZt364vVpvXpYy+dtrcvLAeL7jbXNLls0F2o7ov5w+4h0o/sgnT+97OfpJNojKvS9aC/mz0QH1FhHtHaq/iM5+J7uRX1d9zW4zj58P1hV1TP7XZfNy/TDaES099DvonZ5napLf0fr9D7xeviets3hY8B1pmPTSdmoPa6TyAYjvdTtwVQG1W+kQz10FrWFMug1CxkZGRkZGW8aRVHgpDjCX+o8wP+rfILPMimc8S3Ar/T7L/X8v5rP8Xeurt4uMhgAVgB+9qaFyMjIyMgAvgWEMPCUVFDnmTrx6AhhSkp3MimhoE5Zlhk5oegsZ/QDnS/qtHeHYuSQdmenEqpKKHhqVZZLhzvbwedVfncw0Tnk9QN4JmKR5anTifWQcPLoD36n+vPy3LlZ95lGp6pevcyov6grfVZTynr7vC2Oujo0AtAPEnhfeJSYOigjZ7aWq7JGTnItV8urc066o1qhRLzeNcryNJJQ+4j3AHNcrNdrdLvddI8pCZ5Wq5WiAXe7HdrtNi4vL3F1dQUAKRKQZZ2enqa6Op0O1ut1uneYhNNqtcJyuUxE38OHDzEajfCjH/0okdCqTyWE2AaOM41AVMIQwF7UsD5PxyvJXXdOuw3qXEDij5GMPp9U1VNyfrvdJuKV0Z4qr/c7CWElD5x4rjvsEtkW5yb2QafT2Rv37XY7EbfqhNYIV7c7vrfbPZsGmOQo9cF+6vV6e6R8s9lM9kJdqq2v1+u9+5w1HbnOr6vVCvP5HIvFAgD2onidPKFstAsd33qQhvrVSGymoubfnoJU9e1rGu2SEfjs5/V6jaurqxTdzHuW9aoCHdNui7Qrr5fzRqPRQLfbTRHCvJua7WffdjqdpHO1IY7NoihS1DrXMRLKnEcYJXx1dYVHjx6l/vM1N1p/2SbWwbIonx/geBlEhKDvJZyUiWxeSSGPOuT3vh74/kHtwSP4HS7PofYQdYQl36t7Vw9EaFl8Jlp7dP/mutR6nEzT9SfaE+jcpGsmP3MZovZybnQiUuVRXUYEsdtAnR3Vfefvadn6vD/juvYyfW5xPej70QE736P491qn9q2vv9rXvhc+NFa97RGeR9z6/vmQjp2Ij/aN2l49GKVQe+C+gGuFZm9QfXpbVEeRjj39dUZGRkZGxjcFx0UT/27nAf76l5HCX21XnpHxduAj8Zc8D8vdDv/p48eY3eLh5deGJwDesgzXGRkZGe8qvhV3CNPJp8Sw/s7F19NKqhPIyTV1TKkj3R0z6riJiDpNZ+nOHSWT+DO6JzaK5lCyW52S6nBVmZwUZoSgk1QkVCLntbZP9RRFEEYOSOpR0ytrn7jjqo48AvYjC6Pv6SRWXbkj2O8WjZyi+r7agzsoo0gWlc0jsfy+VNePRjnSnjXSI7KZ6P5WlVv/uY07one07fqO3jlLorDb7aLRaGA+n6Pf72M4HOLo6Cjd38vIzN1uh/F4jPPz85Qq+ujoKKWP3m636Z35fJ7uHF6v14lA1DtBGQ3carVwenqK73znO+h/eSJToyB9XCs5psSq6kLHJf+RFFUHsd7vyt+1LK2T9ZGgcycxQd2SOCbRpvA5Stupz7tt+lzg40kPnagdsCyPyFU7UfKY42S7vbn/eb1e79XNObHVau31A22C5Cn7kqQk+47ErsvKelXH7BOf76ir6XT6zLhWAlh15Yd11B50jJIkY7rr4+PjPfJVdbVarfb0qvXQNjnutA/LssT19XWSxedofZfjQckDykCd6+fsw9PTU3Q6nUSEUPeUlaRyp9NBr9dL449jg+OGdk0ddzqd1Bb292KxwPX1NWaz2V50vaZPZ7vY93pAh21XW3R7/TrQQw6KOlLyeeSfHljysvTv6F3tS10XfGxqOYcOaOic5WW47vRvnR/4dzSvebn+jH6u61rUlmhdivTsB6hUF7pPcXlUFv+7jkDUfUOkp7q53sHn/JlID1HZfCbqt2gOUzuq62v9zAn5F3nHEfWL20CkB9dhncxRX7LeOjkj8lvf8TUmar/bh5bp+tZ/rg//3uusa7fK4G3NyMjIyMh4kyiKAieNI/wPu+/h32ydvftOy4yMF8CuqvD3RyP88ZcH098qVAAeffkzIyMjI+ON452PENa0lXoSnwSKOsHp5FSyOHKSuFNGHeoaDaARgyRf+L47ZryeyDHE57Q9Tm4okRQ5huoib+hE93ZGf2vEh77rjk6NilRyq64OddhFkVEe6ag6pMMySlNc5zx2nWmknr6njmB93/uUznq+r5Gg2i/abtqSEkSRzO5cJDwqke3ie1qWt8XfqSMDoudJADH6T8k09gcJGqaRraoq3VdbVRVOTk4wGo0SScRoVv7OtLCUazAYAEBKFatRpnyO5GS3203RtEyHvFqtMBgMcHp6iuFwiKqqcOfOHXz00UdYrVahjXo6dOocQJKXP1VvJMz4rqa4pr5U52p3m80mEehVVT0Tpanzj/YtI4OLoti7B5ZEsds2ZWUabz6j85fbj9sbbdxtp6qqFKGqn5Ok5N3OHNM691J/TMOtOlC9+njh957OnPbL7ygH7VefJzRCVvW/2WywWq0wnU6xXq/3opAVakvaT/qd9il/J1k8GAxwcnKS0lGzf3nAQNtD3bJ/KbOm5+ZBgfF4jPF4nHSgcw/JUJK5Tq4oYaoHatSOm80mhsNhKlefpY55PzDtzMlwXYOpLxLIANLBkd1uh9FohIuLi9Qel4f2zf7U6GEdD+wHn9e+Lnwuj/o8ItrYp6p7JwedxPJDKlGZTnZFpJLr0G03IrW8Xt1r6f7I16qoTSq3j+9IRraP84bqzfXg70Vrpe97tJyINKQuXVdal/dDpOOIzIvq8z2hl1c3vwDPRjJH5fh872tN1Nc+lrT+aD91qF79W8vxz123lAV49qoB4NksM25jfN/3uSzHdRCtwXV9o+2L9oHR+hntDxR+qEXlVF1oud5+PUDjNp2RkZGRkfGi+OF2gV9s9mvXwK+DbtHAv9Y6BQD85vo6c0kZt4Lp+QZv29anqir85miEv/roEZ7NLfMa8HWHdwXg+hbkyMjIyMi4FbzzhDDwlNQBniXL+E8jIDTtJCOLdIMbOa7UIalOHNavzjJ1IqmTyu9vZBnqUFfCiXW7XO6A9X8AnpHHI36iqGUFnUkeWcD21N3Tpm2LnIPafne28R3XIfD07k6WoVGLSuRGxKaSTiyb5E/UdnWkq6Ndy9Y+08+0fG8zy9Nn1D5ZRh054E5Jd1CqTrTuOmekfuZw29UxwOc1GpPRurPZDKvVCovFAu12G4PBANPpFI1GA6vVKqXqJVFH0p1EJ8siEUxir6oqDAaDvXTAJLdIZJVliePj40Q2k1j67ne/i0ePHmE+n++NfZJrnl6YDlS1R5WR71D3EfnO/ohIHCevojpJfvF9tdVG4+buZQBJP+xHJwNIvjP6mt9pdCihNsk5VYmz3W6XIkGpB5KOJPUYETqdTvc+V4c26/aIbDqveWhAnfMa/cxyNAKb/5SA1kMg2gdaPnWhxPp8Psf19XWqQ8eNzpvusHeihvfxsq/Zx9vtdu++64gw1Tp0zuDvjcbTlNPUCwlhRjf7Pb6UnVHFrFftX8eHz/+73U1qd9737XOiplYnQc3+09TVVVWlccv7iCnffD7fS/M/Ho+xWq1S2TxEoNGvbIOTJrrGqw34mvZVobbo87U+43Owf+4Em/90gsmJLpVD31WoDBHhBsSpciPZI0IyWq8imQ7JH7Wfv/sYjvYU0VqsdeqeKpLPx53WU0emOQmpf/u+RtvuqOsfh+si+p5y+MEDnUe1TrcHPezC7/yggL7rbXTZvW9c1/q96491a7nRYSHdm2sf6v4l0pP3jfeZrsvaHv9b648O1BBuL/6e7/cInZ+1zDrbY5l+oCgjIyMjI+OrYLS7nYOUdWgWBX7taIh/sB5hlSnhjFvAz/7p8q2KVN1VFf7uaIT/8+efo6z5f8crx0df8/0RgMltCJKRkZGRcRv4VhDCdBA7weiOLv6u0VFK0rEsJ2PpWImINCeS+JPO9CiyVmVQqKNMSQB3IgH7UbwKJ5fVyes/WaZGwmpazkMOYk9ZS5kjR6wSKZRRHWBOgGtZGu3lDkq23e9OjJzvqid1kpEw4e/6PZ/RMpVkckI6ckx7H0eOZpXB31HSyR2kSuDp5+4Qdad9nRPewfdI0FAvSqxTbyRxNUKYhM9kMtkjbUgokRRim0lcdjqdpBeSXvyepHKv10NZlphOp6n/Ga08mUxQFEVKU318fIzBYJAiJ9km2hCdrIw2jA5pqI6pAycTGBXMKE/W5U5czgtO5rhTWvuOBKaOSSU+SSiSIHOnNNNqR4SNOqRVD5RdxyfJOycbaAudTgfdbncvlb2OaeqG/RtFRrkNKrGu6dHb7fYzJLCS1OwnAHuRwrzTmvXqfLfdbrFcLjEajVL7SZz6nOgpnHWeUZ2x3Wpbx8fHe1H3JFF1rJKM1zmQ7WIkthK4ZVliPB6nwxRqWzrH+Byk/aFzNWVi+dRdr9fbO1Sjc4HbqfYbdXJ0dPRMCvnJZILJZILVapX0fX19jfF4nNrLeQZ4Okdrdg7OLzp/0o5Zt6bFvi2oLp3QiT7nO9rXvs7onENCn9870aRzRbQm+YEuj/T0Ncrhh5R8X/I8Xajc+n30jOvC50XXoaLuXV1jvBwn/7z/6tZJX+cjHbzInq2ujEivnN+0P70N0ee63/IyvT4lNKPvoz0O36t73vXveyXdr3iZbh/6jNqUlq9jW3Wu48b3YJF8vgbrwR6OMz1cpvNqZNd1faTvKhmv0HnN11TOfVqv/x/AZcrIyMjIyMjIyHh9OLQLq6oKj1Yr/F8fPXpzZDAAtL7m+1sA+fxhRkZGxjcG7zwh7ESNO1KcHFOSls5vPqcOFnd8OfHGuiISzglOvl/nmOP37iiti2RS0kiJCo2sUieXp9UmlFCM2qQRi1oWgL3IQdex658/1Xnn9xtq/7jOVZfUrbZVSSnKp20EEBLzqnf+U3KYRIOSgE6Sq8ORn2vUHnWlcvqdo3VORP50Atj1echxWucEVnnrnNJKXLpMlIE/nRAryzLdH8xy2u12Io12u5voXka3djodlGWZojQ1TfRut0v3w5JcpQOUqWVJ8q1WK1xdXaEsSzQaDdy5cwf9fh/vvfcezs/PU3prjUD19M5aj45ptlPnDE3jrHpRW+Nz7HclBjnG6OxXvfLvyNY1BblGGtP2NDq12WxiuVyme2npNCfJxnIYbewELOWLHOLu7ObdvpSLfUmZI6IimpdUHrVjPsuDBUpM+xjTOYbjGUCyJeqLOmNk+3g8xnw+35NJ9e7lKNmpB1nYTu0r6pSEsEbU0tYYXatjTVNbM6qWxDvJ5slkspdemXZNPdNW9YCHEsV6kIA2xDWIv5+cnKS7j3V90vaxzziG2u02er1esrl+v49er5dshKnh1+t1IouXyyUeP36MxWKR5jrqgWNJD54omc1DB7QxtlP1WzfnvQh8rBNOiinUxiOCyAklL/sQfD3Tf07IaZ0ua0RCqrz6k89H+yRtr65FdbqJ5hF91gk7/13r072IfqaEnq6NTtj63K3rpx9c8f1atG+sIwZdz16Wluk2UUds1pXnB+ncPrxN+s/b4HpS+4r2VXXPqgx+uCCyJ+1HP0R0yK68LToW6uxO7cj/X1F3mILPRuRw9P8B3+9FsmnbfE/M3/2daB/pus/IyMjIyHhZzKotltihh+bzH/6K2KB6mwI6vznYboHZGOj23rQkGTU4bTbxS/1+7fej7Rb/+08/xfgWDyxnZGRkZGS884SwOjrotFZS0J08SoS5w49OcDq7WX7knNEyNEJV/wFPnWdKqKjTkjK4Q8ydSFFUkDvC1MnnzlBvh5PN6nzU1MORjty57T/VCajy8J9GsKnjlnVHDmvqT8vzqAjvJ4+s4jN6b2ydg9VJKtqZOwK9bSQlWF6j0dizJ20r7UPLU1kjRz9/dz1FtuAO2aivDxEjGsWqRBfLYPQgozV3u12K8iUZtFwuky11Op00RvXuYRKVHsHKiEDe/0uycblcppTQw+FwjzyezWaJaDo5OcHdu3dxfHyMDz/8ED/5yU9wfX39TF28/7iqqnSnq0ceUR/ULZ9TXSopqyQEfzLaVO/RpQ14n+thDR0jOk6UsONzeq+u9h2jq/k85WeUphIlbHPkKOeYo6zR3EhCk/UWRZHq80MVapeadYAkrdqzlt9ut/f0zPbzHl7VH/Wp7WJ7GIGu785ms71DCE5QaPSzEgFOMOnhGW3L0dERBoNBOiChfaqEA1NIswwSz7xvV+2eByHG4/GezbEP+BzvHmZ7aQuaNlrnTyVfjo6OcHJykoh4PTDCNpLc1T6ivngAQaPZ9b7kwWCA4XCITqeD8/NzXF9f783HdWQSy9cMBtSdrrmq568Dn8PVlpVgcrvV73ScR2SglhfN7fq9vldHeHkZvhfS8nwv4ogO3+n89CJwslNJNCXWtF99ronKi+TW+dvbq2XWkXCup0gfvndQnfBz7SO1A5/nlMCL+l51puU5Yerve/t8n+zP6f5B2+b7I7dTXxeiceKp8V0PlF9tw0lNtVUtO7KTaKy43lWP0bjUtqiOtLxDhwb4jPeVl8P2+0GiaD5gnXr9QmR/Pi9lZGRkZGS8DK6qNabVFr3i1RDCVVXhj7ZzrDMl/PLYboDrc+Dee29akowaHBUFejX/R6qqCr95fY0fLZevWapXgIs3LUBGRkZGhuKdJ4TVCaNRRPzOHShKBqrDRE/0q0NcneuaclMdNEpMRs7hiFwhMRk5b4BnU905IfG8qJvorkuVxR3CUdSF/nMClO+4Y9MdvNRfRCq7PuqcZ4T2kT7vMnlb+beW447gyDHnERUqjzth1ZGt0dMafaflRJFHbleuf/3pn6n8rreoPW4XkR3puNAoVcrMdnU6HfR6PUyn00SmAU/HWq/XS+/p/aOr1SqRYjyIMRwOMZ1O0el0ksybzSbdhUtCS/tPU+syCpEpgcuyRKvVwnA4xJ07d1LaaPYN7ZbRynonrjpk3W6U/KCeSK5pH2n/65gjkU69cA7xQyDUv6a11n51m9GIY5bBd1arVZKLRBqjoZXQVHvmu55Km/VTBtWNzq+qBx2jGvGqhLaXq2NEx3+r1UokM8snsU+yXO+ppj2qXmi3SiCuViuMRqN0by3TMut7JK59rvBob50LGO1MonQwGOyljNbIbBLTTlzquKJ9k1BdrVZ49OgRVqtVImydnDo6Oko6U50CSCQxCXztR6Yb7/V6uH//fpKbUb18TvuLUfitVmsv4pzP0eYYyUt99Ho9zOdzPH78OKWap2wAkny8B1kPdkR2HK07Pq9/Ffi+gp8R0Tysnzux5OX4/B0RQtHa5n8rIak4pAMt18ddtF5Ha2CdfqIyfC9Auet0pvLrOsDP+azuPV6kH7ys6HnXYbTO+t++J4zqiOzB39efkayqO7a/LsvLi9Tv/eL7QK+Tuo6ei+rx/lcdUU5fW/xQh5ehf0f7wkh2l8HXfJc/6hefbyPZIj1E/RLZu+4dVK7oYEqEQ99lZGRkZGQ8DxWA690GDxrtV1L+DsAfbuavpOyMjDeN+60WmsH/+QBgtNngv7y6es0S1eDrnh0c34oUGRkZGRm3hG8dIRw5WNWBo052d7qQdOF36lD2qBg6e5w0UkenOxnVUekOT08Lqw4xfqZRFV6fOgG1XI8YOBT943XyeRJndeS4Ro+6o1h1pfLx7yhKRZ2L7pBTR38UjeF3OpN4U9uoc3CrXNr/hxywSoS7041l6eGDyBlJKMEYwfXs33nd1JHLHDkT66CEHu1DnbMk5gCk6GC935URgrQZRjqqrZDcIqHHeo+OjjCdThP5s9vtsFgs0Ol0UlRjURRYLpfo9/sporPRaKDf7yfCikTocDjcI5dINrGNJJSUfKX98Hl+p3edank+DqlvkqBqd6wruouW7SVImBdFkeRUu9M05Rp9r45qRnHquCb5WJZlshufY/RwSZ2D222bdWv7CCUD1aY16lSf11TaJARpe04GKKgvP0CzWq3Q6/UwGAxSKmMSyLyHl7KTFFZyV+cI9mtRFHvy6LzMvi3LMh2QODk5Qa/XSzZLO+X6RJvRtY3kNMlWYr1eYz6f4+rqKvU/2673SmtKaO1PppLWtYf9wHav1+t0qKLf76e7izU1M+2XhyL0vmd+x/mCGQLUTnin+MXFBS4uLvYOWFAnfFaj4vSwgbaLf+s9w7SB24avvSqDygVgzx4JH/v6Hr/3tV3rqntHP4vIsmjfomtZtP56e3y95Pe+d9JyXTf+GZ934pfwfYT+7vsjR0S4eb0R0ab7Ex8rdfpjfYfmqUgO32fWkYpal6/zkYyHdOHyqx5Vbn1GdVLXnkNl+v7dDyVpvd5WPSzpduwy1O3zonXO39F+0LU7ek4RzQdcE563F6c8wNP5TW3Sx7FmR3C5Ir1nZGRkZGS8DCoA/2g9wkfNDvqvIEp4hR3G1eb5D2ZkvIX4pcEA7ZoI4X80meDJl/+ffqM4BnD2poXIyMjIyLhNvPOEcFEUiRhipBfwLKkYOSgjZ6ITge54UkdQFKXCz0j2aFlKBNPRrqSBO5uUJFJSScmCKCJG61QixGXwiGd38KnclFnrceLLnbD8qSS8kryU1VOTat+qw8wdfe50V535HcX8zqOGIgciP1N7cie66sf7PnK8u24jp6LaaKQD6rKqnkaM6oEEdwBGDntCHal1RIk7e9nfJMioA5JJ6/UavV4Pi8UiRUQy5TOJIkZedrvdFAVJchd4SrR2u10AT1NOk0ji++12G6PRKI2z1WqVntExQDKYEY4keVVuHRskAd0e9S5d4GkaYLVnnVfUziKboN0zohlAItaVtCNZqWOJ8vI7j85ifW7Ty+VyL30uZfdDH3rIQ+VRmVQuJaCU5FZ9sn06f2kaZH5O+VwetW+9C5fj1J3sLI99qX3CcnmIgPWu12ssl0vMZrMkL2Wh7ouieIZ8p370bl5PE886AKDf76f7f2lLer8zdaljrtvtJvslMaw2cXV1hfl8nnTCFO5q12y3zv+UiUS7k/8cL9vtFsPhECcnJ4mMVoJc9apjhjrhgQZG/i+Xy3R4hOmzG40GptMpPvvsM0yn0z39cE7XMaBR95oWm89TBiVNfN59WdSRc+wzn1ejtcCJWp+bndxyMi9ac1m/r8EsT+dEfhat5/quru8ubx3BVkc+RXqLDizpu64//cz3G88jBX2eVz1HOvf6XaeRrF5vna3oITJ/7tB+xN+Pyq+T1z/T8qJ+1HXAEdXpZUT7Sp0ndN10mThGtL8ie/JDSL6H5ed1duDl8afu4V1mbYse7ND3fHzqP7dDPzim+ozGpsqr666PVa0v0l9GRkZGRsbL4qe7Er+znuBfb53e+rry6bbEuMr3p2a8eygA3DmKXfLbqsI/nky+GYnSG1/+y8jIyMh4Z/DOE8LAU2eO3hsIxBEdwP7Je33XneHqDHLnmkaFeNSmk7CHIgHoWFJHkTqsNKrQIwO9zijKyB3G7pyrc6RG+iIB4I7MOiew6i1K/0cnv0aIsF3u7PO+dDlYhkd5qPM1cjxGTurIIa4kROS8i0g5d5JqHd636kxUh2RELHr93h7vU61f7TlyuEe6cH0qKQkgEauj0Qj9fh/b7RaLxQIAErGrbeC4K8sSRfGUvOIY7Pf7iWC7d+8eWq0Wut0uiuLp4YGqurnHl0TQer1Gp9PBcDhMKaYHg0Ei2lgGozG93bRFvYNX+8OfV7KL+tGDI2oT+i7HEqNJSew5+el2rKSmElv6k6COqFP+pC50vHC+ZMSn24rOPWwbI1kZ8cp+0Tb7fZ0EDwp4lLg6+D3yWm2Guu/1euh2u3v31GofNJvNlJ65qqoUyVpVT+/q5f3BTAG93W4xn8+xWCxS9LjrXkE51S4J9ovqnuT98fHxXvv4jNoW7UJ1T7tRO+ZY++KLL1CWZWoTbU3tRW2J9Xj9HsXOqOndboezszMMh8M0ptdymlkJHtezpiYviiKVybuUB4NBKm88HuPy8hKbzSa1UwkYPdBBwl/Hi6Ze10MFSkJFdvlV4HOCz72KqE4njpzk07nb12rffxya8/0zPzhC+CEEfe8QgVanTyfooohJl83b7OubzrH6ru/RVMZorfS6I5mi3708l9efj37qnF1HuEcyRXYV7bui9190r+d7pUO2qGVHdktdaTuj/anvH6PPvP26nwD2+9/H+KF+0TVI21d3aMT1EO0PXOeuF10zKTt/6h5ZZeLnStRHdwxr+dQJf37du9MzMjIyMjJ+dzPBnzoa4ri4PRdjVVX455vZrZWXkfFNQq/RwJ8ZDsPvVrsdHq9Wr1miV4QKQN5qZmRkZHyj8M4Twu6MIjmlDh2SHXTIu2NVnfosU4k4dQC6UzOK9ogcM/6ekkMekaeOI3c+upNXHVN6V6M6yfl9lJa6To+R8y1yAkfkpMrjz2tZWp5GQkTOK3dY1kU96L2w+j0daZ6OVuVSkoz6d2emt+WQo9z1qH1WRyBHbdXPPLpMbYY25G10uMP4EHjIwu/tZVReVVUpre5isUBZlqiqCmVZpohebbcS6u12ey8NOnBDIK9WK/T7fTx48CCNZ94HW5ZlquPk5ATT6RSbzQa9Xi9F2LozFMCeXhhh7M8yalXJT+9rd8R6lJ33p84vjIilPEr6cf6h7Wtdes+vRtPrmNZxxzIYqdrtdlGW5d7d1tQD62GkLEk2gnUoqaZEaURSkaB1ssad53pIRNNxs69Zt9sIgNRHepDCI0rZRtax2+1SVCptlmUySnc+n6dU1tQTZWW9ANIzSl67vfEn28N+ZepyyqH2pAQm9aYp77vdLgaDwR4hPJlMcHl5iaIo9u481r52/QJPD8+onbm+1Sbu3r2LXq+3R8DTJjkXqP1Qbo3E9/5m1DjLuLy8xHQ63Rt/HqlH29L7i3nIQ9dWXZtYfh3R81XgBJCSUkoqRXOsk0WKiOSJyDaibs1zUsoJSF8jor8jMs3Xjzpi0Em2SAe6JkTEYNT2SG++PkbrrMukZfphuog8dP06Iv27vrQO38NEpOuhug7JEO3x6lD3DMvheqN1RH2ua2Jd+ZrRQg8P+SHA6H3vQ60zIlf1fV2bta+9Pj80qdB+A56OO34XHezUfUO0d/Q5Tg+E8TmVV7NV1PWdH/jTeTcjIyMjI+PrYFJt8c82U/zFW4wSnlVbfLpb3kpZGRnfNPyJfh/35aonxQ8XCzz+JqSLvg0sATx500JkZGRkZCjeeUJYSQB3eBLqcAf2HXd+Oj9y4j3PWRiRtu5M1DtY1aEZEU/atrqIU3f68F0nhbw97ugnontJ1WGndToBrOSPlqlRn3WO5Yjs0Tq1TSzTnV2RE1r7o06fhOtR21lVVYo6c6diRBSrDTkprvpxW1HHn+oviqypc8zX9Yc7UCN56ogJLYMyOrHX7XZTxOVms0lpYauqwnw+T6l3+ZNldLvdRA4dHx8ncqjRaOD+/fs4Pj5Od6NOp9MkCwmjDz74IN0VzAMfi8UiyUD7Inm0XC73HNHuuFVykfeOknSj/O68doe+zkE+7/An7YmErEYF+UEUbQPfVTLYo41YNusj4VgUN/fvcp4kyQ8gEXM6R3laXo3GdJsguRc54ZWI1PsNvS3qBNcDGfq7jieSuUqcKunKftC5i4R/o9FItkbb4B3Cy+UytdtlZfpr6tiJOOqG/aJ35LINR0dH6Pf76HQ6qQ4nr5RcVdKdUctKcq/Xa1xdXWEymexFLBNK5pP0p+yM1KYt6fzG76nP09NTPHz4MB280PmR9ZAoZjs1+wMJW0LHCCPXZ7MZHj9+vCeXji3OFWpjqh+d2zRttxI3X5cUicjJqF113zvJ5t/7uuaf8/foe/0ZyexznBN5LmM0d/nvUb2+1/B1uE6+qK0uS7Tf0n9RuUrU+z4lap8fdPF1+lAb9BmfF3w9j971z7RNUd2R3rVu32t62XXyRu3xfabL4e3wsr1/onKjNtft83Qfouuut+dF+rLOfim3XrXg+09tXzTu/XCafu7v1ulLbdj14ojKysjIyMjIuC38zmaCn2v28GGzcyvlfb5bYZLTRWfcIqqqwnbzzdj//MWTEzRq/v9QVtU3I100AAwBfJ0zHtWX/zIyMjIyvjF45wlhJzH4O4kPOl+B/YgMddC4o8UdNO5MckcUgETuePSVE4jq6NcU1ZRRCWMSKUq+OMnrqUbVUcQoNk2dqQ7RKEJFnZckc1UvTuBSTiVvqJ/IKVVXnzv365x7Tlx7H6rTmMSOO5P5ucum9fOfE/Zah/aNRlVqnyrRo/1YFMXe3bAa+eZ98zzHLn+PHMLuQPf3XOYI1IFG99DOW60WOp3OHulIYop2wHdIPJZlieFwmAiuXq+Hs7OzJN96vcZ8Psd0OsVyuUxRxs1mM5HPq9UKy+USrVYr6aMsy6RHvaNVoyhpo2p7lJdEH9vK9rJfONZIfkZOWf3bUx/XEZ9uy0r26hym40Lr8/7V+vSu49VqlchGdUrvdruUfjuyBR+DfM/HqM5R2g6dMzUdsn+vEbderutbU0Vru33OJ2nK33lwodvtPhM9vNlsMJlMEpnIPnfC2+cw7W8AyXZ0PWD7er0e+v3+nuxFUaSIYdW7jiMdQ2o7jKqtqiqRxfq+znUsh2NUdcX+0WhfACnV9cnJCY6PjzEYDNBqtTCbzVJGAF13OTY1LTvHo97XrGTy0dER5vM5RqMRRqNROqzgc7dGOPNvyu+Hfdj/fId6uA34fKyomwt8Lo9sqI5I08+8bpeB48oJKievlFyP1hXfl/D7aC30tjvhpvPXIX153XXw7+rmYS3PZa9bA/nT11Jvq77j+5xD0bRAnHL6kC1FOvF3VedcE6J1QdcetzEnHV1ul8mh9sSx6Lrwvor2cS6Pjxe2RdfDur2tvuf27eOprk16YEvhbfGDkt7frFf/9j3B8+YG16lGFKuM0fwRHZbNyMjIyMh4WUyrLf7BeoR/t/Ggluh6UeyqCj/czjOPlHGrKKc7fPq7bz7q/KTZxC/2+7Xf/9Zo9BqleQ7u4+sRwhkZGRkZ3zh8KwhhdxyroztytLqT1D+j01qdOupoc4JCo6qU5HWHrKai1boip1dVVXtEBrAfzUzixR1p7gBTZ5GTJSQINLraUzWzvfqOOp+UJNEUuE5wRQ43lksyQtuuJFLk+NSynJx3x7e+y3q1/90JGTnto+hHjfBS/Ud1Uc6qekr0Rw46fbdOb4fs2u3ASZA6R3udQ1qJLRI+tPWqqhLRs1wukyy73Q6dTmcvKo/3AjO6sNVq4d69eyiKp5HDy+UypYOeTCZotVro9/vp3dlshmaziQ8//DDVNZ1OMZ1OUVVPU/HSjquqwmw2w2azSXeT7nY3KY8ZYaqEvr6nd8JqNCP1TL00m829tLf6vdsTcEOwafSjRuIqOM6Ap3e16riIHOiMBvaDFWzXcrl8Ji2+ErWtVivJ7fOaH/LwuYR/a7po7X91VmudLE+jqdmOKKsC5eZduREhoONBo4Y5Pw+Hw2RzOpfzDlvOSdSJlseocdqRjrGI5OBBg0bjJur85OQEg8Fgb/2gjKorRhfrXFsUxV765c1mg+l0mtJFR2Odcuj85lHOnLfVrjXSutVq4eHDh3sk+mw2Q1mWiTBWe1CSXse8to82TxJ7u91iOp1itVrtRRfrHKs2Sd2TvNa1i3XrGNR7h78unKDROtVOozXAbTQi9vQ57XuF/h3VpWPP1zJfL1RurTOKStTvX0RP+tN/j9rjZLYfjPLnfc2N9oEuR11dvva+KKL9Ql29qju3BbdNb4/uk7wt/rtCbeHQs4d0qDbme5LINiO56kh5Hwf8PdKVyhnp0fd7+tN1oOuX953KUDd+VL9ROVqvz2PR1SV1c4f3nz7jRLLL6pl2MjIyMjIybgM/2i7w6a7Edxqdr7y+VFWFi2qNP9jMb1m6jG87qh2wWb/5Ywb/5ukpHtSkiwZu7hDOyMjIyMh4VXjnCWF1AmkknzqZnMAg6cC/3enjzlR+RkeOO0wpg5M0mmpYHUxaB9vghIs6X5Vc0bsz3WlbFEUiH7RcldEdTJGzmu/ysyhySOslYURSRe+8jBzmhJI5dc5QJ+NI1msbo35mmdov7gz0Z71eJbK0zWoXTlS4E1DfV91r+yOSwKFErOrTHftuu1Hfu/OxzknP+rR/WSfHD6MYGa3LtLp0Vg4GAyyXS8xms0QUM10uiaL5fJ4IsKOjIwwGg0TYbbdbdDqdRAAxLTUdodPpNKX83W63OD4+BgAsFotkK7PZDJeXl3u2qU5pnz/YLtUBSah2u52ibd3+o3HHflD78jGt7+uhEupQoy39MIjWoYS2Eo7sD6bV1ihN9r8eVvFDGLQnnUu0TI3GbTQaKbqT9uJtcse/z63R+CiKIqUW1shZHQscrzoWWS/LVvvTcbLdbjGfzzEej/cc7ZTDSXEdDzo+dX7XcclxNBgMEpmt65USlvq39rtGzW63WywWC5yfn+P8/BwAau/F1mhn1Tt/1zlM+4IyHB8f4969e+h0OomsXq/XiQzW9Vbbz894yIPr03a7RbvdTvcRM1X3dDqtnSM9FTiJYJ2Xebipbo78uoSw6s3XyogU05+6v/DnncTRutzOtEyH7z88S4nP9RGpqO9H677Wo3JqGyKizQmxSI9Owjq5pr9HMke/e3tcRu+nuv2QttW/13lIy41sgD/dFqL9kcNt13XOdz2ry6E+dz0eIo2j/aHXUbfni9oe6UY/d7nrPotk9P1NpG+3QbXPqL2+b9A9nb6nhyoPjQs98OJrh+9lI51EBzNU9z4G6+aNjIyMjIyMl8UaFf7z8gn+9NEQf+roGMdF84XXmU21w6ja4A83C/z+ZooFMimW8e7htNnEb9y9WxtFP91u3537gzMyMjIyvpF45wlh4FkHJaOYlLjwuzXdCUMSQB0wUXSAR3YBzzqSSFhpymclGNxJpGQQ39X0oeqMUvJDnVKahpXvRA7wyFEUkYTqSOZnSiC5k48/NcUedaWphiOnshJKwH7qa3WMa7udWNdn1VHnzj4nadk36vzWflV4dI475LQ+JdD4nRKOWrfahddFaERJnROVdrSWzaXalzqqlSDWtOMR1CZUBj2csNvdpB1mSufFYoHZbIZ79+6lsXD37l2cnZ2lPub4WK1WGAwG6Pf7e7a8XC4TQcb7TEnItlotXF9fp4hbpqNmul7qqyxLjEYjLJfLNK40mld1q+mMqbfdbpcIZ02N7lGWao8kxTme2V5CU4N79Cqwfw8w69Kx6ocXdHyqXbAeTRFM3bB+JfD5LsvR+3q1XPaRtknHgpPC/Be1j/VrfUrsaepxEpHUsTrjacd6TzLrY181Go1ECLNM1f9isUgRqiRt+Qzb6IdqqHfaEOtWIkLn4W63mw448NCD6pByU3eacaLb7aZDFNvtFmVZ4uLiAqvVKo0L1f1qtUqHNNbrdbJt6tjJFerQDwycnp7i9PQ0ybter1GW5R6Brbqk7XFsUAe6rnW7XfR6PRRFgcVigf8/e38aa+mWXYWC49t9e5o4J5obt8vr7NPOxplusXHz5Ady1YMSCKGyC4EEwhSFBII/FkIg4A8IJBASeqCSCulRj/dAqleFrCzVq0zjDpN2GpdJ0ukHdpokb/rmzRs3utPtfp/91Y9zx4qxx5nfjnsjTjQ37ppS6Oy9v/WtNedcczUxx5pznZycYDQaraWLZp9r6nWdMzUduvLBMjoefL1/EIpAL/190xx6v+dVINUmwK6KF13fgPNXOER8+AEG1uUAqa7rvn/y/UM0p7i80eGTTTrzuqmT+zkhlRcHCfW5t/t2wbQqGaJ2ozb9wJDvVaO6ovLaB/6OP1Peo/7yQ2BR2xFvPk4cRHX9cu7R/ZkDm1U8+z6L7/hv3ke+l/U5PWrLdRXJpweGqspqW7o2RPbAzzqWfa5Q0v0B29J9Z6ZMmTJlynRRdFKe4t8tDvHl5QleqnfwsXofz9XbaKOGArIPwBmAfGM1x7dOZ/ja6QSvr2ZY5kTRmZ5h+sGdHVzZEB18cnqKG29di/bEqQHg0pNmIlOmTJkyXTQ984CwO7IclFSQV52YkXOXgEnk8IqiM9Tx4mlD1VHloB/5IRFsUqeRg3fu9CN/yreCjpFTSOvhX8rrkQsqszvq1LnJNumQVyeiOxVVh1FK3iqHmPfvpogJAGu6dKIs6jjziHKPWNZ+0DLap+50V74j2+Fz6kjlc5uL+iNygFIW/ub3BG5y3lYRZWc/8z21o9lsloBgAtKTyQTA2b2+u7u76Ha72NraSmCcgrgE6QCsgU6aynyxWKRyLDsej9O9pkVxBlJOp1OMx2M0m02Mx2PcvHkTx8fHSc9sW8EIAlAeQUZQl3rVKEUCogSt+B7vSXUHvEcRsQ91vBLI1wMJ5FWBZQVv1NbdNj0ilIAp69G7ZRUUV14oH+tUHWp6bgVW1XbUfkk+Pim/psiuOoyibXs7EThFHVJvBFU1QwQPEYzH4wR0Rv1MG9O21AY8UwL1SflbrRb6/f5aqmuC3Jp22QEF6nA4HCa7Xq1WmE6nuHnzZgL22TfaV7qmaXplHddq39p/tdpZuuft7e3EN8c0I+R56IGfOc5UT35YgIA4eZpMJrhz5w6Oj4/XxoqODe1D8uiAPdvzA060iSja9kGoal2JAKJNwJ3PBT4/aHv+Xcv4OqL7nEjeaA1jvfq7yuk86O9ej/N/v98cJPTnEagZRSlH7UT6jwC2aO5wOR0YjNqOnrlOdT+h7/iY9N+9fp0j3OajfYjrI+Jdf/f3o7pVTh17/lznaH0e7RF9j+m8u951jdByyovu3fRdPzS4Se9qN3xX9aL1+p5ZKQLb+c8PI0ZzhNbhgLjqwMfbwxyGyZQpU6ZMmarouDzFby1H+K3lCDtFA00UeKXexVatgVF5it9djrFEibvl8kmzminTY6Gteh0/trt7If/vfCxUA1B91fHbozcA5CGeKVOmTE8VPfOAMIBzjjD959EW+o47gzQqSlOeukOM77kzXZ3VkVMVWL/vlo5zBWMiR6FHNEYOR3eo8bl/V8BAQWOS3jesUcquV43cc0db5HgjqKRgq+qIzn11CPKZOre0z9wB53pWUF37uKoOjyiLHKHOl8qnjj3tYwVKtG81OjfSmYI3ag+RE7DKma7P3X5cpohUh2o3Wvd0OkW3210DxhaLRYrYHQwG2NnZSfUMBgOUZYlWq5XurVVACzgDz3q9HmazWYoOns1mAJDSKNdqNQwGAxwfH6+Vmc/n6W7V0Wi0FrFLHur1OjqdTgKa9E7hyWSSAFFGWCpoSn2yH9j35J925iARwUyWIZild+nq+Nf5S/tA709lOQJw7rTn++RHQWLKwfmLkaQe5aSAo44ZtX3as9peNBepjvx38sL5JQItOGcS1CUoTT7Yn3pAhmOeuudhBLXnxWKRIlT9bmK3Hdqgg1KfRkAAAQAASURBVDiqB+23ZrOJ2WyW0qETjGak7WQySam8tU3qhyAqU0Lz3cPDQxwfH6/dt0t9kDeOCfLrh6WKokiAOFNycxyvVmdR/zs7O2msFsVZ6m63b+pxuVyupeRWO2Q/UxbqbDwe49atWxiPx2uptBU4cTvQw16qJ12zdS3TteWiyMd3BMJ4e2r7rEPL6Vyhz72uCLhjGbWjTYAacD66Vj/7IScHtH3/oGs06/Z6fV7wZ1XrbmQDXsemNVD58v1StL/zNqJDBs6DllXyedz7LNrHuCzaBzo3+55B7dFlqao7asd/079RPS5PxJPLyzHKunwM+V5KdV9Vjv98vtZ31a59nor2YUA1mOo6cdm1LdYb2ZfuS3zfqnts3yf4ftF1qePU+zVTpkyZMmW6aDp4C/S9ucypcB8r3X4D+LaPAsX5Q5qZHj+90ulgf0N08DNJechnypQp01NHzzwgrI5tjSJTgI5OEf2rpE4jdUCrY1XBG4IqmpZSHUnqyFHQmI6aKJ0m62D77gBT3tXZ507IyAGtMhB0iSIJ2K4609z5F0WAVDls1YGpzmLKro7jyPGq4BHr15Ss3rca7aOAAX8nyBFFkqg9sR/Ugadtav8oqSPObcJ1qDrS8vrXU/0pQKdyOA/8yz53x2EEAEROUOqDz5mCVoFsAqi9Xg/9fj+BWZ1OB4PBAJcuXUKn00FRFOh0OunfaDTCfD5PoOZyuUzg8J07d3Djxg3cvXs3pfFVHiaTSYqSnM/nmE6na/fU6uEJAGvAIeUZDAbJGazjmVGRnEOoO71jl/yqs5XvEjykPjVNr84nGpGsACL5pY4JfGt5H7vtdjvJ7f3tTnKdN9TWWYaptR18iIAMnVv0d7VNd347wMR7aQn2U4c6f9dqtQT4l2WZwGB1ovv40bnFD1AQUFa5FosFxuMxAKxFjCtwoWPKASJdM2hDDr63Wq0UAc/3GR3sYDKjeSmDz2Gz2Qx37tzBcrlMaaS1ryiHjlUFGfXwhX73O6G3trZw6dKltfTws9ksHfzwdVXXN9UJx0FRFOmQRVmWSY7bt2+vHV7QceMHpXRe08h0/uU7HNvUMw87XBRFa0A0t/KzrxtqL9S31u1tkaoAS13PXFcOBvleKFrP/X0dX1GdfObjwuuPgGqvKwLSNv3u9ua8RIBa9Jvy6rbiuoz2Rz4Off3Xth1w9z6IyHnw/WAVcO086Lvapsrh+nBd+b7Y94b+ngPlLq/vt5zcVt0G/Lv2EftC11zXq5bX+nSdVF78Go8IrFd9sly0R/Q1ijz5gTC+51kS9B2vo8qWMmXKlClTpkzPCJ0cACWAfPbriVOzKPAH9/bu2xVvzudYPS17tB7OooQzZcqUKdMzRe94av+lX/ol/KE/9Idw/fp1FEWBf/2v/3V6tlgs8NM//dP4+Mc/jn6/j+vXr+NP/sk/iddff32tjve9733nnBh/9+/+3bUyX/7yl/H7f//vR6fTwYsvvoi/9/f+3gMJ6A5WBQcip5+CK5ucivpdnULuoFGwSZ1OdJSpA0gddqzfo+Y0kskdO1oXI+EUqIoiBvhPgVStU533fEdlB3DOaRnpW/nWcpFTVIEOLcM63UHuPLN+Bd5cbm1PgT2tP3IEs36P5Iwc+t5P7jh323QHrfMZ2TTbJ6kzOIoio036YQF3OEdO0yrHoepDeeU7i8UCd+/exXw+T+lgt7e3sbu7i+3t7TVZx+MxvvnNb+LmzZt48803cXR0hNlshtFohFdffRW/8Au/gH/+z/85/tk/+2f4V//qX+Gzn/0sfu7nfg6/+Iu/iH/37/4dfvVXfxX/8T/+R3z1q1/FN77xDdy+fRvj8RgnJyc4OTlJADIBROBeBD9wBhR1u90EoipAR+CxLM/uOFVnazRHEOAjgMjI1LJcjzyKounZr+SNoCDLM1JSI6f5rqYZpm1HoKLySwCUUaA6DjR9NN/XZ2qXbp98T9NAs36PVlU7VPDc21SbZXs6F9XrdfR6vXQHrd4xrWOgah7Xe3lVFt5ZTd74zwFIn9uqxiF5I3ja7/fR6XTQbDZTtK3e6ay65WEHpp4eDAbJHpfLJSaTCb71rW9hOp2mNYj8EqxQXdTr9RSZyzZOT0/XDmV4/9frdQwGgzQWqCNGCPucz7uXPRKb7RLIb7VaKcp/NBrhxo0bmM/nSe968IH2Tj0pEKLjg7rWNUnHlYLHD0vRekTy+n0NV9uIyvjaEa0fvmbovgE4n1bey0bt+dqlvEXt6ViO1lXXk8rj667z5HVoW/quzomqo0iHvtfzA1Wb9jh8rvyo/iJelHz9ZX/5fsz72//5YRoHrKO+VZ78MKTrxvvMy6vcvs9WmaJ6q+ZIXxOcL7dHr4N8qp59LXE9Vs0BVbxHutTy5MHXK51PyZfX7QendK/lBxt8HEb/h3E96QGxqEym9wa92/5fnylTpkyZMr1b6dPDIT7a69133/Wfx2OcbizxGGkXwHssoDlTpkyZ3gv0jiOER6MRPvnJT+JP/+k/jT/6R//o2rPxeIzf+I3fwF//638dn/zkJ3H37l38pb/0l/CH//Afxq//+q+vlf3bf/tv48/+2T+bvg+Hw/T56OgIf+AP/AH82I/9GP7pP/2n+M3f/E386T/9p7Gzs4Of+qmfekf8Esxwh4k70BQgixxxBHM0spTPPBpGgTB1BCr4UxT37kElORgR8UVnqztzWdYBKudTnWEa3QmsO/TU+ebArAKh2hYjyFQP6ohX3Tjf/O7Rx3y/yqml93K607Iq0kgjayMnq/a72oo7X7Xf+J6CDg5ceHmXR/l25647DFlWo9AVfPJ+VD4cBKj6rPZURQRhIiBN25/NZjg4OEC/30dZlmt3+xJAmk6nmM1m6c7hdrud7vx9/fXX8R/+w3/A1772tRSZuLW1hW63i1arlYDa+XyO2WyG8Xicokg1xa+CUdoHek93u91OwBkjLE9PT3FycpKiE4viDNCcz+cJrNIxR0BKx6X2G+1a36Pu9E5eHyuMjtX09R75pbai/aPyMpOBA2EETxeLRdKBAmjk2+8yjA6bsJzaHtvTecgBbeqPoGez2US73T4HVjNSlu2z7V6vl/pQx0MUFam2wPHj79A2p9Pp2hxAAFOBds4tmm2A9qLzjo5FgtXD4TBFyxNgZR+wHFOkK/+DwQCDwSDJtVwucXh4iLt3767NeboO+npE+yMAzN+4Rmk9lK1Wq2FnZwf9fj+lq6Ysame+RvKvR6BSbr0r+uTkBEdHR+cAXrUx9puum3pQQfn2d3XurAKCHoRcVn72Nnxd0Hd8bfK5PapX1zT2g673OgfoXBGtsb5+bdKPz1PKd9XaovOVr90ss6ntqM1Ne7job1Sn7538ucum7Ud8bJLR7cTb97mc/Xc//aoOnXffd1St976ndN4ie1T5N+1FfX1zffjhSCeXpUpvtB/NOKP9o8A5f9fxEvWp7gF1rqnaS7KOaP/qenEdsn7yqOuJ7y21Hd8TU65orxjNS5neW/Ru+399pkyZMmXKNNx/9yW63Gk08H+8cgWtiv/TPbX0sGcGSwDji2AkU6ZMmTJdJL3jlfTHf/zH8eM//uPhs+3tbXz+859f++0f/+N/jO/5nu/BN77xDbz00kvp9+FwiGvXroX1/It/8S8wn8/xz/7ZP0Or1cK3f/u340tf+hL+wT/4B+/4P47qhPGIUf6mTnEHWiJni9ZNR7O25eXUaUNHPwE0lleHjDp6FHx0x5regagOpAiUrYoEULn0s/KkjiR3MDr/5El1rZFJ/p47zhxsVmeeOvQip6YD/PzLyErXoTubXQ+Ul8AJ+837SO1EnXnuFPUUz9o3DiiqM1AjWb0ugjfqzKxyYFY59yOnKmX1upxURgWdSAqMT6dTHB8fo9VqJTD44OAglet0OpjNZlitzlIFl2WJw8NDvP766/jqV78KAPj0pz+Nvb099Ho9NJtNjMdjNJvN5CxnVOHx8TGOj49TRLCmryVwFwH1asd6t/N8Pl+bJ3gfraau9QMRPreos50AtPYRHb2cGxRMpf3zM21axwvnFuXFbYZ11+t1TKfTtbt0yXMECkRzmralDmYF11mWcwLB7AgwUz3pIQMSwVefG5y3TqezBjZrhLP2sTvTAaToXH2/LEuMx2McHx+fO1CjYDrrZ99o/zgoqeOK+trf30ev10sy1+v1tUhhBQUod7PZTGOB4C3TLPPOXaZoV/vxuZRt+F30CiQ42NDr9bC9vZ2i/oGzgx+cL7Xfy7Jcs8+qdYfyLhYLzOdzHBwcYDKZpHZJGomtUdrsC72CwfnWbBj+20WT6s0j+tjHLOfPSKqnCNx1OfmOR0FG8xBQDY76M+8zks5B2p9RvT7utVy0Dm6iaA8Q8Rzx7vsb1qf7nE1AnVIEXOrcF7W1aT31vUe0z4r2jD5uvb4qPfme1vvI9zdazvc7JF9DoraUP5bxPUe0T4nm7Uj+aEzoGuBzD9+J1hTVI/8qUOs6cdnId9W+Vecot08/rKFzn+tY55WiWP+/gM7n+t35zvTeo3fb/+szZcqUKVOmFz/dfVftXXYaDfyF55/H5Xfj3cHPP+T7KwA3L4KRTJkyZcp0kfTIjycdHh6iKArs7Oys/f53/+7fxd7eHr7zO78Tf//v//21SNlf+ZVfwQ/90A+lqCMA+IN/8A/it3/7t3H37t2wndlshqOjo7V/wPmIFXWiKGjhDmIFJdyZS3JnXZQ2l5/VOe6Ooch5qhFmDixqvZq2FFiPrHAHaFM2IOqgdIeQ8sk2HQhR8G+Ts1BJ5aBs6txzRxWfsS3XlTs7yaPqwMFxBUQJFikApMC5Al181yPd1BkegYvkQeupcuRX2cUmJ6P/7rpUPWsfeP9436mONznmHUTlbxwP2i+LxQKTyWQtHexkMsFkMsHx8TFu376N4+NjrFZnkaG3b9/Ga6+9huVyiY997GP47u/+bnz7t387nnvuuRSVSJ0y1SwBsuFwiP39fTz33HN4/vnnE9jG9M1ui6enpyk6eTabnbtzuNlsrtm996OTOrjr9XpKg0tb8PvF1W45nvmXcyMBXpZTPjQ1M+vWyFsHbVer1dpdrexHpkVm3/v4UZvlX42EZvsEy5XUDqKoWrVTBfDZlqbPVv3rcwAp7bLqlPJo6m22RSDUDzR4pOrx8XHqO76nh4HIG3VP/a5WqxR1rWNS5yiCq7Rh1s85XvnSeYRpmwmklmWJ0WiEb33rWwloZkpngt261kXAl0eEK0in4Fmv10t1c0wzQljXOxJlcVBG5x5GdnN+uHnzZgLRGZFNOdrtdkrvTlBagX9dO30uVntze3hQikAk/xzNF7qO+XqqoGD0j/bkYBf7yjOOOFimnyNefN9RtW5E+4Cq9Vzr9bUz2qdF86sfbNLPvgejHvU9t2uS/+Z8uL36Wn4/HW3Sm8rm+wlvT+f2aH/rfLnNKA/+2fmK9nJV/e5t8ne3uyp70r7TPtbv0dqrhx+cqvZPvk+NZIrWWuXJDzDoAbjoIJXbppfV8ef8R2Nc5wjlV9vwOrxvdB7MlOnt0JP+f32mTJkyZcr0biKCwW8nVfRTRwVyuuhMmTJlekbpkebamE6n+Omf/mn8xE/8BLa2ttLvf/Ev/kV8+tOfxqVLl/CFL3wBf/Wv/lV861vfwj/4B/8AAPDGG2/glVdeWavr6tWr6dnu7u65tv7O3/k7+Ft/62+d+12d75p+U4n/aVWAM3IskyLHvIMZLOegokZgAfeABAUDFbhhGXf66XNGRymQqWCXOq8i/jdFMUVRP0VRJFCGZbWtqt/4jkaqKUWOQ+1Hb4+ysL8UcKPz36M4XD7y46ltqR9tw51/2u/uvHc+9R2VTZ153rb2gfZbWZbnIg0jp6e+o5/dERpFm0V94PXxu9+bSpt25/pqtcJsNkOj0cBkMkmpeLvdboribbVamM/nqZ2tra3kZFWwk213Op1UvijuRRaSf4JFrVYLw+EwjfXZbIbJZJL6T0FKvk8gt1ar4eTkZE2ntDO+o+Cn6kIBGZZTcELBPpbhPa7Uod6lq05x8q7prYF7kclajk5tzjUEHVWvGhHtUaFFUaTDJwQfKWs0V2l6XwdhdF4kL3RIe9S12j//6jj3FNqNRmMN+Kfc8/k83a08nU4TYMwU2Q6uKAjBO3mZRps6KMuzFOXUox+AiEANlY19VZYlBoNB4luBc75DmQkqE1hlumjyvVwuMR6PU5plgqg63lk/bUDXLgcM+C77UW1ke3sbnU4nyT2ZTJINkhedG3V+VX1RxmaziVarlcbjwcEBjo6O0u9+dya/q77Zp6pjBae1TLRGPgz5/O7rlOpXbU11vgl8I6/8LVqPtLweOtC6dD7S33Sd9PUjAsv4PVr3VR5fd/jdUyA7aOVgdNWapDx7H7I+PSSncunfqF7nP2rH92PRHkD7WA9V6P4hmn98bt3UN7ouum1E+o/k8L+ul2iv4WUiPiNbj/q8SvZITiC+S97HQlV/KFXJ4M98H6q86j7c23I+1AaqbJLvaJYPPQjg5V0el0XnPl8PMmV6u/Q0/L8+U6ZMmTJlerfQdw4G+BPXruGq+E/uR2VZYvGQ/y+9MGoDaN231GZaAXhKxMmUKVOmTPfokQHCi8UCf/yP/3GUZYl/8k/+ydqzv/JX/kr6/IlPfAKtVgt/7s/9Ofydv/N30G63H6i9v/pX/+pavUdHR3jxxRfPOVvpaFfndOS4VedNlOJUHVckBztI6nxRAEXBSz6jIzRy1kSOay/rDndG1blDTPlSZ6ny584+/+6OYL//Vx2T6vgEzoPvAM6BzO5krXJakzSqUN/TKEity/Wnfaf6IDAXOd2rDg5oPQpkODiigHvk/NXv2r/aH2xPAQ/vX+qnyjkZ2Ye2XQWY0GGp0auR45f1MNqyVqslkI6gG++I7Xa76HQ6a7xp5CnbLIqzqHeCy/x9tTpLOc3o77Is0e12U393Op0EOjFtMtNM8zvvMSaoUhT3ANGiKBLv5NHHKYBzdscymjZeHb7qVCZQy3HMqOWyLNfa9QhM/e5ArDqqFQBme5oy2B3GCipHkXU6d3FM6LPofmny22q1UBT3Dpn4fOjjU8cs7ZpyMPW4jgHgXhSw6ohAu2YgcN4YBUywmjrQ9NvUkR8+YR9QDj3QwPTRlI+pl/UOXd5P7XMeeWw0GhgOh+j1egCQDkPcuXNnDfTWCDeC5vxNI6b5XLNTsO/YJn/v9/vY3d1Ft9tdA/TVRjXVKfuDvxOwp0y1Wi0dhOA94Hfu3MF8Pl/TidsrZVG7Yj18zjuXI2CM+nE9v12qAtXU9vy727g+9/WFvzlvETgGnE8zHLUTAUlezsedUvTM69cyur5UrSOR/FE51YXahF9VsGm/VgUGat2+f4l0Gu0HqkB1lc31sMkuIrC4ag+kc7z3kc6lum5Ee6pIPiU/AKfvuYwR2KhlvX0dk5t4cPuIdOJ9r3ri7/qO86U2ozqM5PO9jvKu+6yIH7fzqv2Z8heBzl531Bcqn9ZXNSYzZVJ6Wv5fnylTpkyZMr0bqFUU+EP7+7jWemeI6qws8RvHx4+Iq3dIfQDdh6zjDvIdwpkyZcr0FNIjAYT5n8ZXX30VP/dzP7d2ijii7/3e78VyucTXv/51fPjDH8a1a9dw48aNtTL8XnU/ESMBnSInozuzIlIHCgGcCHB0R1/02Z04/m4U/apOGo049nS37rjUyKcq5xZJQVkHxx1sYltet77L91y3UQQtnZcEWQhCOJikOnGZ1Vm6yanpsiugpX89UtYjrNyhHIFXejetO669DuWpKt242olGlip/Xk6fKTDmkUkRT14XEN9Zp6Sgl36OgJflcok33ngDd+7cQafTSe8sl0vs7+/jypUr6Pf7SUZGDLLf5vP5mo212230+/0ENPHu4clkgt3d3XT3b6fTWQM7+TtB23a7jV6vh6Ojo5TKmqD0bDY7l0a3KIoENJFXAmzUyXw+R7vdXgN1fQ5ygF/7GMDauGD92hd6mEKBSk1lzP7VdNM65zBydj6fJ0D89PR0DbguinXAVsex9j3njPl8jm63m/gkkE6QVecdjfb1gxcqo6bC1rGm83On00G73V4bMwT/GQWucx3rIXhKPTkQw2hd6ktTirssnt6ZvPv4oy4YbUsdEaznoQPanEYK1+t19Hq9FB3MVM3T6RS3bt3CdDpFv99Hr9dbS9GoQJAD5DqX65qlgDujqbe3t1PdGtHOcnzPD6HoAQslAsIcm+PxGIeHh+cOSfgcxXbJq+o7OkClMmnbXu7tUvROBLboeGEZlcHXLC3jYDb/km8/1ORzb1Sn7zu0nLbroBLtUw8MeNveZqQrf0958zVyE/keKqrT9wrR+1W/+RobyeNtVj3X3yP5ov0Wy0drttft82Ykn+9/I3vxevR5JId+Vhv3vV5VfW7DrsvIvimby6A6qeLZ9+HKs7fvMvEKgKrxUlW3zy8qQ9Rn2q7r08Fg1ZHPK36oMtKP/58mU6aInqb/12fKlClTpkzvBurUau8YDAbeihB+gIPKj4Seu4A6coRwpkyZMj2VdOGAMP/T+NWvfhU///M/j729vfu+86UvfQm1Wg1XrlwBAHz/938//tpf+2tYLBYpreXnP/95fPjDHw7TSm0idQgqsEBykBLAWrrb6FQ/naL6e+RcA9adWXSkempWPlcHL8lT0vI9j75S52Lk7HNnujvV+JkOItWXRkhrVI5GuvJ9rZuftQ+0TQVgWLc70x3odQevt+OORgV03TkWORJZv9516TKqk1h/dzBbZVcnrMrjfcD3XG79HkWBkXfVqcrtzlO1eQWHIgf6Jsd85KTUyD/2a71eR7vdxunpKcbjMUajUZJrMBjg5ZdfxvPPP49+v3+2CV4s1lJF0xGrNtrtdlEUBVqtFkajEWazGWq1GmazGXZ2djAYDHB0dJTS5iq/nU4npbjV9vr9frpP+O7du+j1emupo6fTKcqyXIvaJaiswJTq0e1b5w4FhYuiSOCzplvWPtcxokC9RkNzXokAI/5GuRUMLIoiAZBaB59Thqp+V740+wFlJu8EZtk2dehzlM9rPl48yhkA+v0+ut3ump50vOghDdqXRpuTf7Xv09PTlDK6VjvLMEGgX2UnuKvAPdcv1qM6oB4ajUaKaKeM4/E43eesALWmSe71euj3+2tjYjwe4+DgYM2GfA30+Yxpt4H1+0vZnv5GPvr9frq3l2NO7+JV+/M1lmNa+4gRw4vFArPZDAcHBylKn/2i44EycY/gY1D7xNc6tU21iwcFRXSOj+xVP0dgmNpQBHZV1eMHmHR9836v4pt1VcnufDo/kfz3q5e/61zidWqb3k7Vcy/j+tPPvn/w+nyuierg82i/UbVPqarf946+36yyE5XT61Z+fRz63iTizWXyMiq797nL5Tr2vzr3b7L5TfsoH3dVOnG9V9lr1O9V+yFdX30PwOc+Xjfp3O1A31Eb86jfqjojffj3yE4zZQKevv/XZ8qUKVOmTO8G+vZ+H0PxO7/rqAAweOtvpkyZMmV65ugdA8InJyf43d/93fT9v/7X/4ovfelLuHTpEp577jn8sT/2x/Abv/Eb+OxnP4vT01O88cYbAIBLly6h1WrhV37lV/DFL34RP/qjP4rhcIhf+ZVfwV/+y38Zf+JP/In0n8Kf/MmfxN/6W38Lf+bP/Bn89E//NL7yla/gH/2jf4R/+A//4TsWkA4td3ZotJs7m5UcmAPOO6+ilMzqYKmKVGL7nkKWziMFZNQJRke9gjoaORw5IzWSTn+L7hNTwNodVdo+y3tknQJRmi45ivCi0977yvXnDisHGzzq0cEqdaapzIxa5TOVVaOtNZo6cn6qvbCtqE9U/0pue64DTeuqcrBO1bvWGTlmoyiWyElZFVVVxbsetHCbpp0QbGQf7O3t4QMf+AD29/dTXzSbzZSGlsQIwtlshtXq7N5ZAn+887ff7+Po6AhFUSRwlEApo2YJLGvEJ/toNpsl3heLBcbjcQIrW61WijydzWaYTqfpPlfaOQ8REJh2vSsYpml5+Yy8KF8K2Go/aXpu8kw5VHbWX2UDCs4R7OR9zuw32rHzTx1S3yqDA7W0JaYDVpvlOFSdFUWR5jWS3ous84bW3+l00Ol0kj44l/oBHNc3QWzqDrg3TheLBSaTSdKXHuxREFfnb9br+vfo6KIosLW1ha2trQR8zudzTCYTTKfT9C71zfdrtRq63W6KnuHzu3fv4uDg4FyfUB7av0ZK6xjgOqHzDPkkiD0cDrG1tZXSRfNuYwWOdf7XtcoPFHBcM8p4Npvh5OQEN27cSFHmum5olg6uQzp3afp1BdH1sIaPMU1v/SCk9qL1OlimZaM6vHwEDCpFkYK69lMPus9x+9wEIkX1Oq/kQ9fuiN9I7ipQNgLyooN7kU6icRf9dWDO9ew2on+rQLgIAIz0pWUdcHSKAMSoL/QqBfLo+vF1XtvWvy6r7zWcf/98P3lU31X2VkWRzbvN6CErbccP8bEeX1P9wJ1nfdF1xceszutRn28ab94v3leR7vzAmO4DlUdfW1mPj+NM7016t/2/PlOmTO81quEsby1DFX8PwOTJsZMp09ugAsB3b22h9jb2t08ttQHsP2QdJYAb9y2VKVOmTJmeAL1jQPjXf/3X8aM/+qPpO+/3+VN/6k/hb/7Nv4mf+ZmfAQB86lOfWnvv53/+5/EjP/IjaLfb+Jf/8l/ib/7Nv4nZbIZXXnkFf/kv/+W1e4K2t7fxuc99Dn/hL/wFfOYzn8H+/j7+xt/4G/ipn/qpdyygAy5VERvqLKlydiooyDq1vDvH1OGiTkx1vHiEHX/zqE5NAevyqcPOgUF1KnmEgtbv+uE/OuAd+PDoYY2aZbsOsEbtUzfuxFXe2IaCv6ozdfTTqcd6FRggEKI8Kk+qN3d2ev+6s1CdiuRR5WedfvBAI/a0LZVR+8916rqOnJ3uuIwifrQfVB9sZxNYQqDHgQYH5SaTyVqk6P7+Pj7ykY9gd3c39c10OkVRFCli0scrxyBTybXbbXQ6nQQyFsUZoAYAnU4H/X4/AbjkiW1phKimLgeQopkJws3n8wSAjsfjtb7wAyIORnkf6EED7Uc9qKD27KAX9e19w3cJfLvjWAFRtRVPmax97QCft6/ZAzT1M/lQUFDnkFarlVJyk3dtw8eaAxwqF/uJduMHX/QeYMqm/a/3WFMfDhToXcPkhYcAKLtnltA+9LlEx/RwOMRgMEh9QOBV5y3WRTmbzSZ6vV66B5lj5+bNm5hOp0kPnMMV6ADupT7lPz884AcBdB0dDofo9/totVprhy1U52zT7wmOAPlms4lOp5P6YTQa4eDgIMml9sAxRfsmMWU27UVl94MJrn+O8YelCFDzvYGX0/I69+q6FIFg+p7Pu6QIrKLMEd/aJ0q+Xntbatu+xns70brmcvnBMT244LI5v7qncB4iXVatbT6vah0qqwOIrheX1fVXpYNortC/0Z6EcrtOou/OR2SbOu87n25rkZwqv64T/lf32F6Xz//KW2TrWp/L5uPK3/V7qP0Qgu+vfd2PxmekF2/XbVDXf/IaAf2uV/09+u52VDWeM7336N32//pMmTI961QHsA3gYzhDpD6BszDFnbee3wDw7wB8EcDD79/fE7QqgdUpYPupTI+WLr+VEeNdS1s4G44PQwsAty6Al0yZMmXKdOH0jgHhH/mRH7kvOLSJPv3pT+NXf/VX79vOJz7xCfzbf/tv3yl7G3lSx5YDa+5wpqPFozzdUUfnkEdwamQfsO50Au7dQ6lOHQduWL9GRTkorQ5/bd/TYqtjiCCKOw8JXrh+HJByXSpYoACLppd2h3LkxHbnlaYB1UgVj4ogH5reVJ116tDe1K4+4+/ugCNvTA/r9SrwETlune8qRzttzvlQ4NgdeBHvHkXM3yPHeBTxUgUqKBFUYYpagk0K5NO2Z7MZyrLElStX8NGPfhSXLl1KdWtqaEYOMk0v+7Zer6e7aRVgop0w/S6fK+jJtL+r1SrdV+oHPWjrvI+YaXvdVnQMRXamZd2Rz38Oaqm+tK/4lzJq/X7QRO2SdfIZI1DZNscSI5odRNa5TOcQ5cvlVMBUZVAbZZ36WcesH0qhrhXM03lc9UmgUuc2vbdYwUF9xrleI71Zlp9pRwp0UmZGtiuooGNKI7DZvwR3d3d30ev10Ol00Gq10t3BEbhSq9USgNrr9dIYZ1rrO3fuoNFopFTLOn8SvOW4IR/UgfOqqb/1YNDW1hY6nc5a+mufZ8ir8q8yKOjOCHUeujg8PEwHOHzN5m+e1cHHC+WiffH+bp1rWEbXvQehaE3x+V9BLZ2jdc2oArF0no/m/02f/RCR8sb6owNC+t2fbVojXGaXN1pHIt71mR+i8veq+Nbf9PCO8+V1Om/eju9nNh3C0jKb+q1KHi1Xte573S5DZHuuL63T7dP1puWj/t4kB59H9an96LhwcJT8UHbnsUq/HOPaPy6n8rAJ7Nf6Oc708IvW6fbiOvG+8zlN16xoLuBn51/r1rbu19eZ3nv0I+/C/9dnypTpWaQCwPsA/AiADwDovPWb0zUAfwTAEYDffEy8vctpdAgc3gb24jvb32s0O1mhPH20+54rrRb2HxAQHq9WWD4N+7KreHBAuARwCOCrOBuqmTJlypTpqaMLv0P4aSON0IsACnWqaEpSOsOrHCXugGGdCs6qY9wdO+6UVV4cyGMZB0k8Ok3rcj5ZJ99XWVUOrUPrZJvuWFSHmTu+CLSwvAM+6uj152xfAYrIuU7+tB53eCl/Cmy5s4/8R85CtkkeHJh3p6XqMgIOqxyG/F2BpSrHrDoOIztxYE31ETkG3d5cp1VOIU/jyuhL6lj5nM1mGAwGeP/734/d3d1zulf+eK8vQbLZbJbAOqaMrtVqGI/HCWRiWumTkxNMp9Nz6W95T+l8PsdoNEKtVkupp2u1GubzOebzeQLQNDpUD31QFwRZFaCic1gdvX5IQZ3N1DcBO+0XHW8OGlHveo+rA5q0Je1HApOR/So4q2C7Aprsc7UV51fr0bZdL5paXPWk84E7yXVu9nHAe6UVtNUyqjcHmnRMq10yHTPfIfCr+gHuRZXP5/O1+YUHHahH3rdLEHl7exutVivpjSnQeTBJZWBdTBdNnS2XSxwcHODw8BDNZjOlYNbIZp1zOTfrXMs1pSn/eVXA9PT0FJ1OJ/FLwFnvhCa4rIAzcC+luR7A4KEPpiBnlPPdu3exXC5TlgBdwzWNuNo229LU6Tz0oIcJODbYR9Fhp3dKOrduoujAja9jum/QMaDrms8DWp+Dgz7+tDz3Iwpk6T4pkinaL/C7rzGRnvxZFdDmV1loHZH8+q7qIpI/WuP1r/Ou70bAtMsXted60nJevupwgLe1Sd/a/1VgtO/3fL/hoGskj7/v/eg6032Y66WKIjA7sn3tV9VjVIf256Z9vu9JnE8/cKH7Lq9DefW1o+rQA/shOlTF95RH15vuV9imZh3RuSZTpkyZMmV6MlQH8DKAHwbwEZy5J++XtaLAGSj8ewAOHiVzzwaVJbBhD/teo9e/MsV8/Gj3Plv1+gPfH/w74zEOH+Kw8oVQA/eytL9TWgD4OoD/hBzEnylTpkxPMT3zgLA7wDTVaQTK0mHiQIlHH9BZrxG12pYDpaxbHTAKvLCsArcsFwEVfN8BoAj4cwco+VUnkgPEyo+DOdSLOtNcBk+/5581Qpn8sF7tD3534F516WX9jk/Vo7bj0SXOC2Vm9JzalDu3VXa1IeVNwUl3Em6KKKuiyJms+nDnq0aFuoNbo6v57H4OfuWD+lXgU22Bum40Gnj++edx9erVxA+B36Io0O12U8pcBfY4LqjDTqeDsixT1C/bq9frmE6nmM1mmEwm6HQ6a0AHAdT5fI7VaoX5fJ76eDweYzKZYDabJTBKDzVQJ41GA9PpdI2v1WqVoj/dhlSXmppXnxOodic2QTe3V7cb2pdG5fM561dQW538CqZTDgJ81Bfr5O8qC1NU61hjVCbHIO9l5n3MfLZcLhN4yX6kbDrvqV3p4QHqeT6fJyBU32f/qJ3q3M5yassKIFIOBXkdWKIutM8UiGFbfihguVyi3++j3++v9aPKrP1O+261Wuj3+2g2mwmsns1muHnzJkajEbrdbtKDRrxTLzpvEHyO5m0/TFSWJXZ3d9Hv9xNwzP5XvXnfqT3r/MtU5Tx4MZvNcHh4iKOjo/Q7AXDKoGumg+W1Wm0t8wb7QK810HXHdfug5Gvr2wXNdH1mGbWXqjqrwL/7AWz+nO942lmdv6M6I76dzwgE0/1EFW86/qP6qRsnBx69bm3b51/XxyZd+V8HTR24i+RyHfp+Qud53+dEgGvVOq17CgfYXadVewmWVbv1von2eVo+KhfJ5O94H3ib3lc65h0Adh51v+v9VDWequze1yjtQ93fux4jO+Tvuu8F1venWl7XeX8ejR+tz+eiTJkyZcqU6fFSDWcRwT8M4EM4Sw/9dqnAWVrp/w7A/wQgg52Z3gE95duep4K9awB6D/DeAsCXcHZWI1OmTJkyPdX0zAPCDrC5o57PPBoVOJ8W2UHfyJmlDjwFD+hQVyDGHUd692WVI8j5YmSiOt0JYiko5c5SllewTkFMOs3ceVXl7OczdYzxPQfF9Lv2jzuwIqeYO1yrnJXu7FPe3PGu+tB3VH/u8HMetG9UHw5qaX2RY9MdeWovyqf3Y6RH75/onkyVVQEvld+d6FEdCniRXwXwqPN+v4+XXnppDeAlX4xa1d9arVaKAO52uwkoUiBsMpmkNuv1OkajEYqiQK/Xw2KxSOmhl8slJpNJGmdsZ7FYYDKZYDqdpkhktqNy60EEjc7nWGEZnV8U0CZ4BmCtbnUAOxijkUOUjzZBIE0d4VX9TWDc7YOALSNgy7JMYLlHdlVF1vo41rTcOu8S4FMnuQKqDoaobj2tt0alE1zs9/vo9XpraZ3ZXzx4QCBa+4e6VFCb9kJw3J39GmXlEWaeClx15Xft7uzspPuD9V5f1bf2BdNBM6qdaZZHoxFu3bqFoihS5DCj12l3Pj5pN3qfMnnUNVEPUgyHQ/R6vbXoZJKuH3r4xOd11s87wGu1WpLj7t27mE6na+OAIK6DSCqf24y/o+ulrxmejeNBKJqHaV8kB5B0bXKgTtfHKIrY523lQ9d+H+/+18u6PFWRiXxWta4qudwRv1H9vm/wPYLag7cTfVd5fX3zfYLy52V1D+B1R23qsypw1w+EufxV635kL9E+wqlKR9Ez5a+Kon2i6izaK7NcdEBqkz5ZzuuJxruuG36gKJLB5+2IF+0r58PrVr79kFikZ44l3wco8Kv2qu87X1qfluHvkU4zZcqUKVOmx0cvAfgzqE4NfT8qAHwHgO8E8P+7QL4yvRuoeMqvQ37Q+4PLssTqIf9f+tBUx1nW9neq4xLA/4YMBmfKlCnTu4SeeUAYOO9Yo8PEnfp0jDgYS/BKHYmsz1NLu/NS7z4lL/pcefRoJYIa6lj3CIjIAeVRbFXOZ5avuj+xypEbpYtV55i24/f6VjlQlR93drkD1+tzp7kDr9qv5Cnq58jpGulNv0e6VuegOoKj+tm2ppVWO3A7ifTihwzUGeuykC+/61TrdXuoAhi0br1jlPIwIlXvGt3f38fOzk56tlgs0Ov1Up8y7XG73U532zJal+DVZDJJ6Z6bzWaKLCXvBJgYCQycAaIEAxmhOhqNMJvNsFgsMB6PcXx8nMAsBTEVsPYIYE0V7WOAtk/w153I2t8OOLCfWD9BaH9fncdq334QYz6fJ7kiIIV1EjhlJK/Kq7bujnifU3zcqH0xZTejWPWgjh5M0LoUJNW7jtVp3+1206EBAvYEQhmNrLbCvlZZNIWwtkF7jg6E0N617/SzRk6zLKPiL126hE6nk+Rm6uRondB06QSPWd/du3dx586dNV0ruKApo/VuXZ2rOL4c1FEAdzAYoNVqrY1f3iGsc340VzjARFCZa+h0OsXBwcFaXX74wA8jsQ8BrEVxk2/N4OHzsfIUAUQPQmpLStHBLm3XwSg+0/p8TCn4pfN+BJZ5OV8zfR2Nohfd7nUccf72tYf2oG1Hh4uq+PV2Va9evqpvo7nZ+0d15n1RxZfOBa5jjieOt6ifXZ9arx5siORzXnSc+/h3vbENP/AT7cf8XZUjsk1/FsnqdbtOor1WVIdfqxGV17nE5dUxo3tKt4WIT9eH62qTfQHrBxG9vegAmMoTted7RdeLH9DUdXPTYY5MmTJlypTp0dA+gJ8E0H3IeloA/lsAXwNw92GZyvQuocHlOq58sPWk2dhInxgMHnhv9atHT/jS3ecA7DzAezcAfONiWcmUKVOmTI+O3hOAsDpt1Cm0yaFH56g6E/2Uvkd7RNGwHn3Eelmnp7PU1KMkrVOdvhEIo+UiBx150mg04F4KbAcJ9bsCsw7wEgxUMMCjNRSQ8MgxbY9y+B2gVU5wyqblWUb7xoErd/i5fQD3otn0He3/yAGuwJzbl35WG6Be1W68bpVLdawyuPNdbU0PNni/uFNXZdE+iogAlx6w0KhOgl+np6fo9XoJmCyKIt0byrTEOu4IpDKtc61Ww8HBQbof+OrVq6l+An2np6fodrupzGAwwHg8Rq/XQ7fbxWQySf1aq9XQ6XQwnU4xnU7XIus5Hik7gbKyXL+3VO9GrbL5yKnv8w315hGMBIJ97OshAOpWbckzHWj2gWjOA9bThjtFKeVdHupAbVAd2GpLnC80akoBVwVV3JmvkbOM+i3LEsPhEJ1OJ93xS1kZscx2qE8FYLxf+NznDD8UpLqpAq50jBLkn06naLVa2N/fT1GyOp4VEFKb4mEJRuCW5VlE9+3btzEajZLseihA2ye/CpRqdLv2T1EUSXdFUWBrawvD4XDNHjn2fR4isK3zj+q00+mktO/sx8PDQxweHqJer6PX66U5gWNCU8z7GsjPnFs4bzuoprar9x5fBPla4uvVJrAo+u77Fo/w1vK+lvqYicZ6BGZ5X5G0Th2z0Z7HSdf6KjDUf2P90brj7Trp/i2aa/27v7upzqrfNtUZ2YXK65GdEVALnL+D2nUYzdvOg/Lo/Eey+7zEst6W61x/98/elu9X+Dw6IOnk9Xjb/sz3jK4HlVt5dt6B9TGkz6uuNPH6dM9VZbMRr+RP7UKJ7+gegb+rfqO6MmXKlClTpsdDPwBg74Lqugzg/wTg/wpgfkF1ZnqaqVYvUG895SHCD0HjDXv6R05dAB/EO48OngL4zzhLGZ0pU6ZMmd4V9J4AhB3IBNadcu5QccerO140TbMCSHQ+KxihxOca5abPHBBRoFAjnJSqHIjq5K5yjKmswPr9puo8UyeWg+IRcKLRQnxP+VWnV+S0jpxTGtFQ5dhSeYF7UTCa+jpyzlU5th2U4m+b2vQ63JGq5dX2qkBad/YraRtqN65z55Hvul14vW6fkdx8psCV9o9So9FIgLCClJPJZC0FNO/NJQBcFEW6txQ4s9Pt7e21AwCj0Qir1VmaYqYqPj09xWQyQb1ex8HBwdr9sp1OJ6WKBoB2u52A5bIsU2TxbDZLcjC1Msev9hvBdpYlWEynsWYRcHvyqDx3PjsY40561bfORfpM21Rb0THPcuRB+SU/btvKu9ajd8OqXTkvbmcaeeoAhNavcyQjmofDYUojTP3P5/M1YF/50HnK0z+7PnQe4Pua9lvBAe2jsrwHSBP45FgZDofY3d1duyea6wPLq+1ou4yunc/nmEwmuH37NoCzFOsExSmPH97R6FnnVedVBZwBYHd3N6W35jsKqOoczboI4jqQxehz8nh6eoqjoyOMx+O1qG2//1n7Tg+d+BzIflEglf80Cpr2c1Hka4/aHftTx5Mf8OC7LKey6HoQgUDavv4egT+uF5LOHREAVwUKRuCY6sT7j7/7PiNa+6N1U8kPXLjOq/Zi+jnaj0TltQ9UJn3mNqtyeF973WofVTrwPYGv475vdZv0dUV14LqJ9pbazxGvXp/Lob/ruNX5OHo32uNE7UTrXFWbrqdN+y3lg3O1tqH1+d6tSkdsR2WKxkJkZ86r6o769H7Vedv7bhOvmTJlypQp08XRZQCfAR4oTXREBYCXAfw3AD6HfJ9wpnczHZ+e4iC45u2xUIGzVNE77/C9EsCbAO5cNEOZMmXKlOlR0rN7tOotovPXnWDqWNKIqk1RFgosqvNco62i6FF1zGu6YnVGudOYYI07nNTh7REUZVlWphx1ZxXb9Og4flewTZ247uj29tWpp88c1KGsTgoaqeNUnakK8NzP6Uigjp9JkQM0csIp0OZONnfw6rPIcan9rPwo6OROZDrutD8cVHDHYxSRpWXdERg5uN1WtGxEzpOCQqvVKoFKg8Eg3d17fHyc0ryyXYKIvLtV7yUlWEvA8Pj4GIvFAtvb22i322g2m9je3ka/3wdwNl4JNs9ms7U7gnm/8NHRESaTCWq1e3cUa4QP26JcBIK1D3XMKKigfV6v19FsNtFqtRIAqDriX43S1BTPCoQpoOUHRer1OlqtFhqNRnqfkZZRxJLOFQpkuJ3zfbcht3P+9XlO+VRb1jnOx63Op7QRtQcde7xD2COsPBuBAp5FUazZmM7b0VgmyEob0DmYfUd+tV49GFCW9wDinZ0d9Hq9tTY4v6l9qG7r9XpKMc12xuMxTk5O0Gg0Unp1rjVqU34Xs65L/Kwy09aWyyXa7TaGw2GyLc6rlI8gLiNztQ/8QA75VF3rHcgagUzdsk3KrP2p/3Q+on2zPMe2ltWx9LCkc63P91Ugk66JPjZ83dgEVkXAXARWOS+6ZkeH5ficv/taxd99zXHQ02VwG4nadTmrACtfb/W9aC3zcg40RvOQ7o2isqpLvuf7LJXN3+Mz3w9Wlff+jOryfvbU1X4wR/deUV9o37re3R51HavS7SbZInuN+tzfVbmq+jva27iMVfxGey1fi3Vd8PXTdaVrf6T3aKxo/br2qxycS9wO9Zny4LaQKVOmTJkyPTr6FID+BddZxxkg/IELrjcTAKDZArYuPWku3hN0d7nEzfkTiHQvAHwYwPvxzs9qrAB8/aIZypQpU6ZMj5qeeUC4ytlEJwx/VyezO7CrnKn87o6/yKHpzioSwYIq4EWdQe7gcaeVR3spIOCOwKidyBFX5bitci5FjnoCBgq6VzmggfU0ze5803Yip53qwvlVGd1hzXcIPLiulM/oc1TWAR2CPVUAhOvZ+1oBY3XwujNa7VD15YcUIie6Oq713cjRquRRd3p/J8Hd4XCIfr+fIgFPTk5w586dNefmarXCdDrFeDxOQG1Zljg5OcHx8THKskS/38fp6SnG4zHG43G623S1WqHdbqPVaiUgV+8DBs7uEp5MJufskClsm80mOp0O2u120gGBMY3ULIoi2bTrr8reGB1KfXCMqpPZx55GrgJYA7S0fZbV8gQeCQp7imbVuwLH8/k89bmD3GzD57HIEa3tsR6CgWpH5JM2rbplemMejFCQXOfwXq+XDhvogRLqmXX4PcA6B+o41ncV5NTU2zo2OF75m5ZTW+D9ybVaDfv7+wkQ5hjSu8TdfoB7EcAsP5vNcHx8jPF4nKLj2dfUu96prPWqDqlvyu6RZIPBAN1uN9Wh9zhHIIsC26qvoijQ7XYTr7XaWcTunTt3UrpojfJWeye/jD7nesJ29CCGr8mcl/ywUgRcPgj5WPBDIWoLPsb1/Wge9/nB59/ooFPUhpZxnqM5XfmtOiwX9b2vhfqb2owDWtH+g+3qIYmI54gPLbNpX6B68b2Y6833UV7WdeTj33nyspsAxUhHVXxG7fieKmo/qr+qL/093X+yHc4l+k40V0QyOLiu9aod+FUnPg9E9hmtXVX7XW3PwXDXo/a3rgdqL85vle1GY051ER3wUh6V56oDqHy+aV+aKVOmTJkyXRy1AXwcFxcdrFQH8McBvPQI6n6PU6MJ9AZPmot3DQ3rdXy413ugd5cX8P/Sd0xdAN8B4CN4MHTgGMDtC+UoU6ZMmTI9BnrmU0bTyebOIAUf1FGl7wE45wiig4tER7W3pYCLOn0UMKVzyNt1B1jk6KbzUnlUEAfAGrgQRSewbgVB9LtHGPl7LnMEYCh/LBM5zVz/3qY7HDXikP80wlH/Or/aB94W04ErL3rnZuQgjfomcjiq7ehn162mQeXzyEHsNqp9rzbvNupO+UhfrjP2cxURBFY+F4tFAm7a7TZefvlldLtdjMdjTKfT9M5sNkO9Xsd0Ok3vESxaLBYpzfRyucTJyQkAYDqd4vj4GKPRCO12G91uF6enp7h79y52dnbQ6XRSumCO9U6nszYWtra2sFgscHJyguVyiV6vt3Yf73w+T2WZwphAmEfIsd5arZZ4d0BfASwAa+Aly3nEph/oYP/yXmW3EwdLaWPk28FNHbO0fY2oV6e99m0VMEN+NNKaPOjhENqKgo8K1mp7+lzn7aIo0j21W1tbqf90bo3AQnfQax8q+BiBOZSDYLXexe42ofOG6rAoCgwGA1y+fDlF3OqBA+VLgd1Go5HAXdrbdDrFzZs3MZvN0O1210AY/az9pAcBdK7Se6KZPp0gukYHE7BVW/b1VNc+nbOZbpo2woh9ytBqtdIztWfVLceR6lpTV7tsmoJaQUifP98p+XrGutTmfQ3Tz74WOsDkdhftYbRNrzcCt4B7UYlVMimvEYCk6wlwb59Rq9XWxqbuY/xvBKZFc0sVDxHo5mWA85lY9F3XXZUuVGe614j61tfnaE31vnJQUHnyOdjX6uhAg+okAsA11bHKGeldedO9oVK0L9EDRN5+tLeL9mSqP9WBr7dVRPldPs5VWi/bjg5yKF8+zqtsyW1O50TXU5Utqk7cfqvmM+1btSnVs+8Btd5MmTJlypTp0dLHAVx/RHUXAC4B+JMA/gcAv/eI2smUaTM1igID2QO/E/ri0dHjTXp+HWeRwTt48HMa3wTwBHDsTJkyZcr0cPSeAITp+OD9lA5W6nd1oNDBScdTBDgq6KJpoR3Aixy7GuEJnI9W03ZYpzsbtYwCAPo8clSpoy0CuJxfry8CC91xpaTOLQWa+Z4CGHQiKniqetHIkYhfvsNn2nf6vgIM2rfu9K1yJmtdWp874tzJqwB6FSAQ9Z9G2vhhA7WryDmuNhfVvckRr3VWAQkEdh2wItBFsG42m62l012tztLFMg3uZDJBWZYJvD04OEig8MnJCcqyTBGmW1tbWC6XmEwm6f7YO3fuoCgK7O3todls4vDwMPFHIjDZ6/UwmUzSPaytVgvtdhuz2SyBUAQc1SGu/ahRsLQlPue7SpFTWuvgWFf703rUFtzB7E5upvpVe+Q/gnGcEyMns9qBOpuVX+VDAU/KR122Wq0EojJdsN/dqsCSjlsdK9QHAUtGWw8GA7Tb7bVIV6YL9uh1l5V9u1gsUvQt5dZ5MTpUE4EfBFEd0GYbp6enuHz5Mra3t9fGHg8gcHz4VQRMB67Ru5PJBG+++WbSO9v0Ayw8fMFnCpZEB4g4Xlars6j7ra2tNZCfuqfs/KzryXK5PJceXA8hkNfj42PcvHkz8aJ3FOt4ID869/mhBh1jDoxoP/g69iBUNRfyWbRuRECTg2NReV8vfL3md00Jrs8iqlovIrl8zXBda98redvRvsIPK+n85u9G49blifjmO57NJJr3IjCNz6v6w/nz8s5jxGu0R4yAO69fn/kht2jvoc8je4v2Dfwc7Q1136Z16v6N802kl8i2XK+RXpQn/qb9pgd72L7bC9urOjTjPOvhFm3T+QTurcesz3mNDjM4v86rjhm3JQf5XZ98pofeXIZMmTJlypTp0VEHwA/j0Sco3AXwpwD8cwDfeMRtZcp0sTR7iP+bvmPax9l13s2HqGMJ4I2LYSdTpkyZMj1eek+kjFaHsqYEpiOLDnKNQAPOp1pz4IZl1Fmk4JGWU+DYP5NPLa/RlizvwJS+66CqOoHUeUSZ2JYCc+qMVZ5URyxDcEejFFXX7oiPHN8eHekgpzqxVGfat1pGnWCe+lmjqd3ZHgHtCnIRSIl0rPJETmSXgfqIAILI2aqfHeyJyrhjL3JKexvkZ5MTOgIBlGgjCmrxNwKDs9ksAWLUOVMzj8djFEWR0hYToO12u1itVinNblEUKW0uwSBGAl+9ehVFUWA6naLZbGJ/fx+tViul6Z1Op6m+yWSS7vRVHmazWYo41vShfv8qZdD02ATKHCD0Qw4EpBWo87HO93VsuFNXbUId3To/kNfFYoHZbJb4J+CnclHOyL597FF3fKb8sP9nsxnm83lKQV2r1VLfuVw6lh2UUZBSdUX912o17OzsJLBU7+wlPzrXsG21UZ0X2Lf8pymtKa8fGFCgoCjuRayybf5lO1evXsVwOFzT23w+T3ONAp/q8CdYSrs5OTnB4eFhWr/UdvzQjtqJ6knBYtcX72bu9/sppXpRnEXPKyivczdlp91xTlAZ6vV6evfw8DCNf5173I5ps7oeqp70fm/tR7VL6gO4l9XgYShag3we5Wd9HoFrPuf6+khS+9dx6wetIp74vvMRyROBdD7X6Bjld5U5Wiu0TQd9HWjTss6nthG1FR3gcD58rfP12Q+7OEVzr49dX0edImBQ7V73aa5DvatX+Vb5Il5dZ1G/Rd+r5FJ963uRblRWXc9cXn9X10fdC7sN6P7D29Lx5GPV91W+XvgYoh50bYz6QNvQ36rGhv512yBRVp2ndbz4+GdZPRChcmbKlClTpkyPni4BuPYY2tFI4cfRXqbHTZdeaqL2YAG4TzXNViu8Pps9nsZaOEsT/TBgMAAsAEwenp1MmTJlyvT46Zn3BETAnjppNMWoOgYjx5mXc8dh5FyJnK7q4FMHogNQLKvvEXwikKHP9P5FdxrrZ3Wq6T8FJ6L7ilU+dRC73siLyqnOKXfiKQih+tEoN6/Df/O21bHmfUk5tFzkwNN+4HcFeliPA9naljuUvU7Wu4lcVy6Lyq+HGbR+yqdOTgeKXHbVSQSoKRE4c4cr+RyPx6jVauj1emvjqV6vp7tJT09PU4Qxeer3+ynNNO8QJqA0mUwS0Hz37l30+3289NJL6Ha7CUBmtDLr5F2z8/kcRVFge3sbvV5vLd0w2+j3+2k86djgX4/wLcsygWPaT5oaWlMNU78OVHmfK7DsIKSPXQApglb7S+90dpBJx4P2mwOK7sR2p7zeW6yyzWaztejiwWCQUgNX8cR3o3Gvc+9qdZZeuPfWPT3Oi85TAFIUsc67Omb1Hl/VufYJP3sder+x6k4PRZRlicFggEuXLq0dWiE46uCPgxeMtCbgfnBwgOl0ujanUK+UW4Fvt60ImOPn09NTNBoN7O3todfrpZTRKntZlgnIdn20Wq01eThueZgDOEt9fvfu3RSlzjrVXhWsYdvUs881ukYxzTvLkkc+1zbeKfm64aCUlov2AFVrmNZ9v/bVRqMx4nxEvOt+qGqN9XeicajPItDN64nqinSle5ZNsqg+qmTVNqv2Lcobf4+A5bejj2gvUNXv/Oxp86v2JV43yUFQl19BV++fiP/IPpXc/iPbi3h2HfkhBX/X2/N7eFU2rjPRmqIybhpnUb9G+0Xy7vryPZPzz/dcF/ysY1v5idYgzo8ROO4yabuRfjNlypQpU6Znhy4B+DE8POKV6Wmj/fe3UKs/W/uXsixxa7HA16fTx9PgNs7SRD8svQlgfgH1ZMqUKVOmx07PfMpoYN3ZrSlD1VnsDi06ZHi/o4JYJDr7gXvppfk+Hed04mi0njtI/bu2RSe5pzRWviOnHknr1QhHlnNHU+Tgox7YJuUlKZCr77B+5cMdnerEVZ5ULpJGNXrfutNNf3fwVuX2OlRGlYOAAr9rWdV5JC8dg/q72pCXVV26jtxR6FFLKh+BfX2mtqL943ZN21Y9+WcnRv9qP7Cu+Xye7vtlxCijHYGziFPeK9xoNNaiTwnQMUqxVjuLNG21WgmwnUwmOD4+RrPZRLvdTtGTCpju7e2lKNLlconDw0NcvnwZW1tbmE6nmM1m6Y7UXq+HWq2Gw8NDTKfTtXFCipz/CtJS5/qOR+Synz2Nb3TYhPUxslNtnnrTwwq0fTrHV6tVAsL5Pm2a77Kspv1W+TT6U++M1YgutSvahY6TbrebQFkeYlEi7+TND/JQf+zX/f199Pv9pFseTlA+tW6dX7Reda5HIA/14nMf5W40GmvgN3VKgJ7tbm9vY3t7e+0O4slkUnm3Jz83m010Op1UD6NreZBCgRCfi1V28s3+ZBnqbrlcpgjgfr+fDk3QJhS85nvab2V57xADgXDqpyjuAcUAMBqNcOfOnTRvabpo7U+uqb62MO24zmnkEbg3j+rap4C3z58PQn74hu36muRrfTSH+j5g03OtL3pP7Vt5c3uPfleqOjDnslTxULV+RGu970GqdBrZsgJe+t4mPvyvftZ51/XgfClFfaNlqt6P+qTqgGFkc36oKyLfH/oz8lMFrlfZpLeroKv3h9cTlXObi/ZFzkNVG1FfOK/8jfOQ86h8VLUBnL8ORN/Vww0RH9FeLBpz3i++x/Dn/K6H2ShLZJ+ZMmXKlCnTs0OfBPCzyDltM5HKssTp4tHuez45GKBTsd+uojcXC/z33/wmxhfwf9O3RdeAB74zmFQCOLwAXjJlypQp0xOhZx4QLssyOd35XR05EVigEat0sjsQRKqK9lSnpkZtukNI6+QzdVSrk0qdbO5wU0e3yqKOIQWj9Y5LLU+eqQO/I1XlVycZ22a9DlZTrsgB7PqNImncwRU5WdWR56BPdIewAk2qI+1HfqbMEcitvykQovqI9OyRKg5G+zsOnruc2i9RHylYqPxHTv0qnjcRozJpZwQpi+IMEL516xYmkwmKosBsNkNR3EsRzcjgxWKRgCB+Ho1Ga5GD4/E49SmBzel0isPDQzSbTUwmE3S7XXS7XRRFgd3dXQBYSx/daDQwmUwwnU4xHA5xcnKCxWKRgDn2B6Mx2a8KLBGwZLQr5xoCW2p3ql+NQPXoYtqERji5jfCfR9/zM3WuB0q0z8lDFP1GmdnvCtZq2zovabsqUwTwlOXZHdA8GEA+2I7bNO86ZgSpys7fdnZ20Ol01qKvmaqaUaHqVNf5TQ8VuHz822g0zq0hmgKc/aV9RT02Gg1Mp9M0thuNBq5evYp+v782Nggk6524qnfqgnZVliUmkwnu3r2bDkg40MC5R+8G1ghegvG0ZYLB2v729nbilfVNp9NUjn3Od3jYQkFX6tDH1HK5xO3bt3F4eJh0TJ60n7QvdA1zIErXb+VJ5eXhDurlQYCQCGzR9vz3CPiLyA9SbAL2dG3bpAsvG9Xr80O0d+B7up5VrZG6xurhJB2DEV++nvpaq/J5v0Wy6jqpcvNZBKryufZl9Ezf032d6yTi0alKJqeoj6vK+edI17qviw5GRHqL+Kjan22qx9vzu529Dr6v7zn/Pv4j0NP3Scq324PLp/+ivor0EoHLXj+/+zh2PUTj0j9XRVpHY8fB6weZCzNlypQpU6a3T4cAbgO48pjb7T/m9jI9zVSugK/96viRttGv11Hb8P84p5PTU/zj1157fNHBBc5SRl9EkPXtC6gjU6ZMmTI9EXrmU0YD59PoqWOIziFN60rnCZ3GEZjgzhONMmYb7nRzJ42DJpEDCrgXVeiRA+64JB9ab+SQUseRpqbmuxGgQ10QNKiKvtO/yp+25wCXO4irnG5er9ezyfmr+ne++M8jYlXX7mSj7Jsc1WV5HhD0Mur8VoDOnYAqt4I2VY5G5Yn16vMIsPP+ixzqm5yGtAsto3fqHh8fYzQaodPprEXxTiaTBJa5vdFWCSIRRGOaaALLp6enOD4+TiDgwcEBjo+Pk/ytVivprd1uYzgcYnt7O91dur+/j+3t7ZQWl1GdBCo1GlYBBQfZXacEuTim+NfBR51zCJZpGkjWzTZpO/xLPnVMq016BDJl4Lyn86G2qXOlg9QO4iqYrDavd7XW63X0er0ECCsozLY4R6h+CIbWarV0H/RkMkGj0cDu7m5KQ6zR0DpH6eEPbUdBHB9ntF1NY057cgCV79FWtX2dXxqNBi5fvox2u510xch42pmOWQXWNDr59PQUo9EIBwcHayAHy6oeT0/X7/Yuy/W0+rQfn++bzSZ2dnbQ7XbXnivg64eFFovFuXt5mX6dkf9sYzab4ebNm2mcVUUFqk59TiKAXHXIivOFzsXUyYOmi47mXSffR/iY8vVYP+t3XzPUXlUfUeRitB/ReiPQS8eczsM+z7m+dS31vUnVOhXp1PdC0Tru61FUvgpg84MGOqdTp9G6ru1Gfa0go5bXcRLZaLQ3u189LBcdGHJ+HbzXenWtVh1E67zvi1QOv95k0z7NKeLL7Vnr1fkh6v/7jU23Mf+u+nW+/ACVg9rRGPS50g9UqO2ojCyvc6D2lQPdyoPLqoeAyMOm/XWmTJkyZcr0aGgE4L8+5jZrAD7+mNt8Rqn27LiNT+dPzyG4VVni/3P79uMDg4GzkLCLOJdx/Na/TJkyZcr0rqRnZ2WvIHXQRE5M/10jmtyRzHfoZNF7E9mGOl+A9ahcYD3dsKZ+Vb4ckNP7S8mDOnbcQQ6sp03U5+oIIzn4xn+R48mjKFyfCoC4047vRFFwkXPLnZURWKQAEPXi0ZeR09Sd3+oE94hu1ZM6+LRfIoey2p32a5Xe3ekaOVIjJ7zWp32sv1dFvzhfahtV7UfRRGyHgBD/anmmja7X6wl45Z2o7ItWq5XAXQJytVotRfYyKpT8nZycYDwepwhJRg8XRYGDgwMsl0u0223MZjOMRiMAQL/fx2AwwO7uLk5PT3F4eIjd3V28/PLLuHr1KprNZkpzS9tjmlwfzwDWolB1nCgQqmNBI+I5z3BcNJvNpBPqW9txIFIjjDWtu/ejjwWtvyjOAHamzVY70zHlgLaDEuxn6krTJOt7nU4H3W53zbGv5X1ck996vZ50Sr3u7u5iZ2cnRfr6ARO1SR07nHt13LpdR2NN+5W8sQ3eWct6dL6g/fZ6Pezs7Kyl5Na03WxL5znaHNOlE2g4OTlJ0escOwTGi6JYA8EVuOb409TljGZm2eVyiX6/j+FwuBYlrjJzrmd/afQ8nzUaDXS73dReu91O9ZycnODWrVtrkf4OluhaqwcHFGTxPvax4X0J4KEA4SrSseXArT73dSgC0JRUJyp7BFZGYz7iUfVBXj1rQATwVaVf93Wyal/C9nTcUSaVQW0o2rs4b6xXATR97mt5FYCofRIBZFVgpQPpyq+Wc54d6HP78ENDyq/rRv9qHd7mJtn0uQOGOl9H3zf1jdq26ySyY+pD31WdUH6XyQ9aORgb2Wwktz+PxrIeplI+XVYHfFUuH2uub7WN6HedJ10XWt73pVxnfa7NlClTpkyZHi399mNuLx92ujB6/tueNAcAgFoD2Hu59aTZuBAqyxK/O5ng83fu4DElir5HFzE0lm/9y5QpU6ZM70p6T6SMpnPET9s7uKXOzsgR6Y4WBXtI7kjzz84LHTMeWaOkKaTpdFfHvDqyqqJV3HGqdaiT03lQR5TeramgN+t355vr2h1u5EMd0iynwDx5YepT5UkddB7ZFJVR+VUfKhffd3CddUTO2Uiv7nDzPmQdGrmmNuKOVpfN61Eb2xS9Ql1GDn93YisP2v+RnZblPeAUOEulrLayXC4xmUxQlmWKEG232wmEIBjJiMRGo4F2u41Wq4XxeJyiAU9PTzEYDDCbzXDjxo0EPDF6tFarYWdnB8fHxzg+PkatVkOv18NkMsF4PEav10On00Gn08FoNMLv/d7vodvt4qWXXkKn08HXvvY1HB4epr5XME1tQMF8AjDUA9/V8eV2xD50+2HfLJfLFL3JcaDjPuprHQfUuQN6/OtAE++NJchHnqIDDcqnys5nOn7UTinPzs4OvvnNb64BhyxPuX28632xrPfSpUvo9XoJ0KSsEYhIXRGApHx+AMbnQp9bdB6JwBWVR/XJ6ODBYJAinvXebXfc8x3K2ul0UBRn4Pl0OsXR0VGKrlVAlgcymOaa/VOW5VqErqa3p60o/5cvX8ZwOFwD8ymPHnZgX+uhHOoHuJdSXQ8sTKdT3Lp1CycnJyldtM/r7K+q+VvHma5HWk4P8FAPavsPQlVrvIJGOk9GewfVj8+lPtf4+IuANudvE996YMLtugpY0jnGAS7vnwhIi36/H3ioexAfj1rW1ytfoyPd+17Hy7suXTYnPSgUrY/UUwQgOm/6XhX473JHuqzaT1T1T5WOlX/dt1XJsMlm/Dcdy5GO9bm+6zJssictv4lv13fVITrdK0Y6jdrlZz845jIob7qPZDn+rmNY9a3rsPPIMqov3bNnypQpU6ZMj55eA3ACYPAY29zCWQzMY4fcni1qNO9f5jFQvVFg96Wng5eHpXlZ4n+6cQOj1WO2zYs6J3HjgurJlClTpkxPhJ55QFgdICQH+hh5Ric5I47coahACbDueGNdTDcbOdwVFFKnkAOtDlzz3chRSEe71+cOMAU93AHqfKkjqgo4VKc7yykp2FvVBw5sqfNPAbAqh7uDzepIc+dblVNd5VDdM4IscpSp41wBJXfyRQ43d3RH9hA5cl337lhWWbVvtW3vO2/X24p076CBk0ZOUn8cXwBSJCpwNlbG4/G5lK8EuEajURqHjDAksFWr1dDv91O0pUYnTiYTbG1tod/vp3tKe70eBoNBGtsE2J5//nmMx2McHx/jzTffxO7uLi5dupR4553H7GM6XaknRmjyuwID6vCOnMsKZNHe+JmykgjE+e9aL4FU7WvlGTh/VyMBU01p7eCDjgPKFIHb/Ktgq/NCkHMwGKQ7o2ezWQIEFVgktVotzOdzFEWxFkWs9XA88J5Y3smroDXfU+Ce7ajc1IXOqyofP+u4I/hK/jzCmXJcv34d3W43zW9MF639ovePUyaOCT6fzWa4c+cOTk9P0W63E1ir0cIEpJU0Ip3tso8JJK9WqzReCFyTX43kdtCE6x7TS7tdaAT0dDrF3bt3UZZliu5Wveo8p2sWn/kazrp1XKlt6xh0UOWdUjT/6fpOHqODFPq+A4a6pnndqhMfn9qGz8/ehvOjfehrna4VmrLbQUEfI9pfzkMVEBfV6TpQnnxe8vqr5NDfNgHZXk/Vule15rqc/rvLFckb9WOVLMD5gxL8jeT97HYU7Y0iXahsfgjE+fZ+q9qXOEjp+5tINt8P+t5F5dbnUb/c7xCl2p2Pg0hm8hr9zjHi7fk6pc91D+Xv6/rOOd33+dF67QfCMmXKlClTpkdPRwAW9y11sfR+AB0Aj/be2EyZgDOs9YW3MmLdj750coL/Mpk8WoYiuoyzO4QflkYXUEemTJkyZXpi9MwDwgDWnN7umFKHkDtRorvRCALxdwfrPIpSHaRV0XnaziYHE9/1dj2ltTqyHHRUJ57Kr/VppGKVM83b8WcKoOm7Ufpt1Qnrcue6O0G1TY9+5e96h2bkMHcHojuI+Vx5cYqi06L67+c8937iOx51rM8UuH+7DkDtYwd8IyDCede+i2i5XKZ7fdvt9poje7lc4s6dOzg8PEwAGlM812o1DAaDdN8pgb1Op4PBYJCihGezGcqyTPcOM/Uw+xs4A4fm83m6I5jvdLtdFEWR3l0ul+h2u3jhhRdw9+5djMdjbG1todfrodfroSgKbG1tYWdnB2+++WaKtlUQUG1LwVKCc5oenf2iBw8iEJekoKLOHdpfausRiKxzEnkkrVZn98QykpbR1x615SCPjwmd88i3j2WdbxqNBnZ2dtDr9TAej9ds3Q/DUJeqG4KSvAea41xBWU2vrUCgRh6T3PnOyHbOzTqPqAOef3kggf3K9OUOPGxtbeHy5cvodrspenU+n6dyephC7YFjifIRED45OUltKoitkc6aZt0jzdWeWOd0Ol27O5gAsqbrps7URviZPHC88zvThLP/Tk5OcPfu3SSjHqSgjbgNsV3yUxRFmmuK4t5hAQBJr0oEzRkJfxEgiK+N+rtTBOr5Wu7ltV5fB6M12NeJ+/Hla06VjFqXry9AfMBr0x5hU1sReOjAmdajulQ7dIr48fd9fXb7dooOmvnnKhl83ne5q/hzeXTeVT71bySH7k+1HeA8iFp1AKiKz038Ru963VX9rTLob9Fey/sjap+/RyC07w8j+ava07qjw3tRZLTbjY5ntz89PBHtPzXrhNbpe3LNIpEpU6ZMmTI9eloC+DqA3SfMR6Z3Tk/HXqHVr6HeeDp4iaheFPjAW//n3USnZYn/eHLyZOLWG3j4iyPzWcJMmTJletfTM58nzJ1kdKREUbwsV+UgcefqpjvEAJwDI/x75Ayjw18dPH7/J+ums8kdgB6tQae8R995qmKtI3KAanRdlU4cbPF7DB2McAcW5VRHtYJdkRMvSk/twHrkRFTS1LLuEN7ktFc9sB0HaCOQX23E7ZPPqQcCRc6Lyu2AtfPrETPutHW+WYfyrjap4J3SanWWDpZt6N2qRVHg8PAQt2/fxsnJyVpE7GQySb8xglgBHNrIZDLBdDpNYFOv10tpcHn/brvdTmAbQdvpdIqyLMNI4Z2dHQyHw5S+mimIm81mukeVchEQI38+pvQeVrdp71/qS/WsQLHbsgIu3t8KRGp7fo+qRnfyn969W6vVEjDs4IjKoECp2q7OV5xffR5qtVoJ5Ndx6fpiO5RX7WW1WmFnZydFCLNdn7P83tn5fJ5AUurHQRIHQ6i/+XyedMQ0x81m89x6Qn5IHL9XrlxBv99PvxO41ohWzSZBvWmdlGU0GuH4+DiBvOwPBRo0xbbypDKxTUZqA2d3bG9vb6+By8qvXmGgcxx5pky1Wg3tdjulfWd/j8dj3Lp1C0dHR+leYa2D/c4+VT0o334vtIIxOmY4llWnOo4flPwgkgNsPs9Ga4u+6/uOqvHH8k5etgp0cyBK12SvS8ee/8a29DevxwEt3b9oxKqOw6q1MpJZdRWtSzr3RXucKn2qLqt+3wQIOrCo+xQt4wCi7yW9TV2ffa3WQ3i+74xsx/eS/BfZrduly+l1az+6TUQ2oHxqtoaqvte2Iz427X9U37q3dtvzPbAfrPQ9n+9DdS5wXvW7jh09oOPrp+o4ytwTHVr0tV7311V7kkyZMmXKlOnR0QrArcfcZg/ABx5zm88gbe0Cg+0nzQWufqSNzva734X9zdkMv3509KTZeHCa4/EP5UyZMmXKdKH0zEcI0xGi6TGjaBbgfMo9TeXpTjt1nvjdw+7sUcBDHTwaKVhVN+uM+FPQJ3LAKTgbOfUcZGYb1Iunj1VeImebg8VVjkwFuhgpp85cAg4OJKtTy52Xrnd9R51gWo86q1X36tDXelje29IIb3XOaX9UOZjVIRw5INX5q05Ldz4qTxrBqO2o7jeBBlVgQwR0RKTRd+rkrdfrKbJR71dlSuDpdJruDS7LMqUUZqQwwd3VapVS2TJycj6f4/T0FN1uF5PJBPP5HLPZLIFRJycn6Ha76Ha76PV6CVBarVbY2tpK769WK/T7fQwGA4xGo5R6mnItFotkp3rvrUbeqBOYwLVGkPqYOz09XUt5q0Cpk9oK9aD1qY26Yz1y/KsDnnzrXa8KCGkb5EVTyQJYS6HNOU+BTtZNUPjw8HBNr/yr41z1SVCy2Wxib28P3W43gY2c5zcdkPDxpime22+ld1osFimalQC5Rv36QQA/AMPo5LIs1yLmd3d3U+pnykLHvoKs7qgnaKFRX7PZ7Fw6aOp/tVqlyC/yR30q2B2BQLVaDbu7u+h0OmsAf1neu2Pa79TWzyobo4J5CIBtzmYz3L59G4vFAu12OwG2rEvtRNdJjazzPtZyKo/Wo/O4X3FwP4rW5Sod6Dzg834030Z1a50RMBiV84MnEX/e99q26q+K74iitUvXGH3fx2QkV9V6FM0/+jyq19ujjXsbkdxV86/Oqx7ZrjrWOl0flON+/eQyO7jqbWg9bidar5aL9qyRfaqdRPrWuSV6T3WqbWzi2/dUuqdT/tX2dX+nY0PrVDtQ0ro8Q47KGL3r6yrb9bnKeXMd6Hddh70/yCPLR4cp/bdoj8p23umcmClTpkyZMj0Y/R6AUwD1+xW8IKoDuH/EZqb7UKMB1J+867g9qIV73HcTlWWJ3xqNHv/dwaS9C6hjhcef/T1TpkyZMl0oPflV/TGQO7CAaierOvvVeeoOHf5GUse5PmMEmUZJah3Kh4Nu/N0dYe7U4/fIoaMAkUeqKi/uJNVUt5FzV3lUp5UD0GzbgTJ9Rn07YBs5DVVndMwSdIucj1VRrMqHyus6VH7cYa3yk6gL/67lXffUjac0d7lZXgENtVvVmTo8FVxXB6LzoPaife/AQeTcd/3OZrME2uqhisVigYODgxT12O/3Ua/XMRgMMJlMcHh4uPYe7bosS1y6dAkHBwc4PT1Fv99PAF5RFAkYbbVaWC6XmEwmKMsyRQwvFgscHx9jtVphOBwmgGo0GqHdbuPy5cuo1Wopkrjf72M+n6Pb7eL69ev4+te/jlu3bmG1WiVAUm3QgRU+U2DK7/pmP+iduw5ocV5hH2oZtk3ZFbTVSFN1Sqt9khe9a1dlIn86J3kkvTvn3c75u46rWq2GTqeDS5cu4fXXX09tVI0jt/3VaoXd3V0Mh8O1u48pNwFZRgI78KIgvgOM7rzXiFUCzwR9tW+pL7ar/TCdTrG9vY1Lly6lgw2r1Srx54AO+0XtQu8EXiwWGI1GKMty7f5tHbtMk+7AlB5cUF1wPPZ6Pezs7Kzd2d1qtVIqd94zTJvXqF3WoXdg+/w2mUxwcHCAg4ODtUMV1CPlJq8aNa5rmNq0pmfXtNtqw/zH/on2BJuoChz0Z75eRMBR1Xv3KxM9V11oeZ0/NsnjAFE0dnVcOl9qS14fyeebSBbfZ/geRev2Q3Q+biK+nZ9oH+b7G32m+yNv18E6/haNaX5WUHCTHajcvr677qO+1vK+byQpmBrtdzbV73u86LnvWXVu1XXJ+9r1Go0zLVvVj5FOqnSk66u+73f46lwL3Ivo9UMZ/Ms6FWR2Heo7vv+P9mr63dcxXfc941Ak+yZ9ZcqUKVOmTBdLb+AMTXpcgDAAXHqMbWV6lPRt39d7qPfvvrbA8Y2HzxRVRcN6HZ2K/4Mo/dqTjA7euoA6yrf+ZcqUKVOmdy0984BwdMJfnYUe4aGOc+Be9C2wObUagU13AKpzXEE7BXs0gk7rq3IUKljg4KOXdWdPVKcCRW/nXXfOq3PM7w91J11V21pWo2H0LkmPUPVIQm8vitDyPuMz9p+SOkarHNHuoFPARXl0h7DK6ZGQUYSJO5+jKBBt33XuDkX9pzy7o9qdtCQCPJGTvyzP7vjVNK18p1ar4e7du2i32xgOhwnYIujENLgAUtTm8fFx4r3b7SbQlimcOb663S62t7dT1DDHFe+qXSwWePPNNzEajfDcc8+lFNF3797F7u4utre3ExDGVLyMdHzuuedS5DFlUUc7iU5jT9/rDmztY4++VfsmGFkUxbk0t7z31/tADwC4TXK+4XOCfJri2u3W7Vdt122Zc4DakUZjU55ms4ler7fGp6coVsCAwB/H6e7uLgaDQbIxAOeiZl0nKpuDMyqHH8BZLpeYTqdJf7QL8sIMB2V5L00z61gul2g0Grh27Rp2d3dTpPFsNltLXa3tK7itqZPJ22w2w9HRURo3jJRnf1LPCtx6v3DM8B3aIO92Zl8wLTb7jzosy3Lt4IZGgnPeVhmAe/eLHx0dYTwep0MSuobpoSr2lR8oqtVqKY28g34KTmu/61+PcH5QitY1Hyc6PzsYz/LOu44nLaNrrY87Xfsop9q66iqSXddL12u0JlSBjFrG9xq+FyOpDPzn+yHXVRWop+Wcvyq+tH7fQ0RzoOo5Wmd9rY7KAeejuCMZfe+p+vK67idT1R7Mf2N/VwHqEZ+b5I7GQySX178JOAXiSHE/GOjP1b6r7ET3Nb4nclvwselrvo5HfVd5872B16/7W9WzHwIhacYa76uqNlxnmTJlypQp07NFHwHwvyIjWA9DBbCzDxzefmIc1BpAvf1wB9jmoxUW00dnBy+229htbHax310ucTvI9PVYqIaLuTTyBs6uBM+UKVOmTO9aeuYBYXcS0QHiThM6a/13L0MHTeSg0zY0upEAjDtb6ZwGsJbiEzjvnFTwU3nxOiNHnZajjAQ6gHvgljub1JFNUmetg5XqOPOIPHUKVjkiKQMd9pFTMAL43Qmoz1Q+BTE1qort81nkvIucyhr1oaCNAwBs1/teeVPbUZ26Yz5yMKoMzqvbhH6ODkOoHagckQNe+9ifLxYLTCaTBAwB6xGzb7zxBoqiwNbWVgKRhsNhSs98eHiI2WyGa9euYTAYYLFY4Pbt2+h0Ouh0OqnMfD5Hp9NBWZa4ffs2lssl9vb20Gq1cPv2bczn8wT8TiYTLJdLHBwcoNfrYXt7G2VZ4vj4GPP5HIPBIEUsE9g7OjrCZDLBYDDA7u4u3njjjQRCl+UZANhqtZLdEsSOgCx3UvM75wcfg/xdD6/wXQWECOjSBj1TAceTRmCyXr9j121HbV6d4rR7tz0FfckrwWbyUKudpWFmpDYBychRzb5gZCrTaxP4Z1sca+wHtlkUxbnIbM59auMqv4LCbHc+n69FYelf6pu6dKCVBwoUwGaKdNoZeXVgwXVJfY7H46Qf2p/aFudpHhggaeYHBfnKskS73U6HIoqiWEvJrmBvWZYpWnqTbav9E9AfjUY4ODjAarVKBz9oN/P5fC3imHXpmsy+4djQ+5WB9flSwXY+47sXQZvmW9dBdBeo6sq/s+9Vvw66Re3rmqBzegSAKc8qk695Djp7Wf3NAT6ty0GyKqDO1xQdD14f21RbjuRRXWjd/puDZ96W1qdgXaSXiKpAcbYT9V0Vv85fFfCn36t0UyWzl4naiOqL+ollHND28aJrIZ/reurziu7VNvGqdVXtifR71bh2GfW52oLO6Vq3yhjpyNtSmVXPKo/u5zfZguvV99eZMmXKlCnTo6cjAK8DePlJM5LpnVBRALuXgVd/+4mxsPtCE3vva92/4FNOd5dL3Fk+ITR1GxcTIZzB4EyZMmV619MzDwi7M5mAiUfh0TGvjkkt41GXnpKVVOW0VSdYVYSaR3qS1Pno0Zx06hDgUMezOn4IBCiv2p6nsmO9ESmQ4mVVXnU0Obhc1Q7BIgcrXOebHNMqv757P+ewy6v6coecRtBUOcw9EsaB1Qjc13r4XSP72JZGYivApe2xbudXeY6cuNpfLpeWrYpQIU2n0wQaaRrioigwm83w+uuvY7FY4MUXX0S73U7RvPV6PaWGJlBFEGy5XKZ00dpvZXl2x+k3vvENrFYr7O/vY2dnBzdv3sTp6SkGg8EaiHtwcICiKNJdsaPRKNlXr9dDURQp3TTB49FolO5AZpryojgD6DqdztphC+qcKePn8/laumHq0ecnt2+dG3hohL8pSAcgAYMc6xrVqX2ndsixxqhdjj/2lUcKqw1qveqcd1kIBs5ms7VUwrzTeTKZrN3964dfKA9wBvJ5umj2gR68OD09TRGy1B3Hh7elpACxz+0EphWA5zs+N6ltbm9v4+rVq+h2uwngZoQrZVIg3aP99DfyT4D69PQ03ZWtYCcBU72bVw8g8V3KUqvVcOnSpZQumjqiPik7+aSe1P603xQsZwTxbDbDeDxOY5tjgzbkAK5/VqJcq9W9LBKUT22QdWgaao+0fxDaNDdS36oTT/EfgXG63jlwo+1GwJDS/X6vijgkvy6DyrfpAIC26d+r+lHnMr5XBf7qX1/HN+lK56yqtUrfVbl9LEbt+Peqd6rAYJeHv0X7QW2fsm0CQJUiO92033Neff/k729Kh6x2p3pwO9L5M+r3SNc+7nxvR9mUlyr9VO0JtT+0Dd8DRmt4pLdNBwOifvLfXX86B/u+2e2ryj59LcyUKVOmTJkeDc0B/A6AlwA8rkNJAwBDnIHRmR6YnvBe4ZXv66H2ODONPwC9+Fbgwib6taOjJxurns8CZsqUKVMmXEzCiKea3OGiYIHemxlFaqojiXW5c1edXcB5cC+KdlDHPSPm+C4dO+poV77U6aaOMq2HcvJdvhNFCRFMdIeZRyepLhXIYD0KzpCi6AMHWtShGUWiuiPOnYEKgCtQQRBIo+uU3MGqfaVtK8/Ko0bwqWzuwPWoQndY8ne1Kdbpdbk+VBYFb1hG08LyuR9sUNnVViN59U5Q5a/KwbpanUXl6mELBYYnkwlee+01vPrqqzg8PARwlva3Vqthe3sbzz33XLp3tdvtpvS1GrHJ6MWiKDAYDAAABwcHODk5QaPRSEAZAAyHQ+zt7WF3dxfNZhOz2SyltK3VztL4EvQFgE6ng52dHWxvb2NrawtbW1u4dOkS+v1+0ifHgI4v7QPqj+NT5wWN1FXQT/uC7RBAI2jrfaukKZqV2La+R74JsOlnzh3q2HYAwsFb9q3PrfP5HCcnJ2tAZafTwXA4RFEUKUU3ZeaBB51j+O7e3h76/X56Rw/JaJ8QiORcr4cj9J/yqfVp/yhIruXVrmmf/I1Rynt7e9ja2kp9N5vNMJvNzrWt9emcyn+sczqdYjqdAri3fpA39i3v1SVv5N9lpj7q9TqGw+FaumjOS7PZbA1Ibrfbqb5ovSDvPFBBQHk+n2M8HmM8HofrLu2aFK1nlFn1TDkdiNGxxYMY1PvDkNpBtGZVgZZOEWgTlfExp/ahvDgQpPNPBNJF4KgDUCqL75G8nIJiXiYiLU9+lQcfZ5FOXGfR+sTPXo/K5Psp15Hrtoq0TQc7oz7W+r0/q+TyvuYznQf1PZdJ+aySO9Kzg5yqD7djB2pdn9HBgsiuIn352PI5Tevyww/6PDooUGVPPpZ1nYve070h51Gfl6r2Ua5T/+wyuk69n33P6IcEI/1lypQpU6ZMj5a+COD4Mba3g/f0PcK1OtBo3r/c/ejKC0Dr/oDno6CiBgyvNs7tuZ42+vBbgQWb6OSCslU9EO1fQB0lgNkF1JMpU6ZMmZ4oPfOAMMkjidT5oncKqqOVv3lkFMtVOc6AdXBR69b2I1BUnePqgFKntzqnWIc6nEjujNaIQt2o0MGu9dJB6RHHkbNJ23JQ1gEi1uWORgVAquSgXvWOTQWzvayDYgquaN0OaFQ51j0FoP71/tC+Voeb6idy6pJU1+q09IMHm5yKehBA+YrA/uiz8uD8vl2az+drd5QyWlQj+l577TX85//8n3FwcHAu8pnjs9lsYjAYnAN8CPo3Gg10u11cunQJzWYT8/kco9EIwFnkLFP/tlotbG1tpXTRTCPNPiG//G0wGGBnZwfNZhNbW1soiiIBew6AqK0rQKzjl+X8QILKpHMAcO/ghTqK1blL0sMo/F2BZkaDsg51VOuhArWxyE7Itzqbdc7wOZL8M00yn7Xbbezu7ibgNgJMOMYJ3rM/eHdurbZ+V64ejNA004vFItQfwV7aUlmegZd8j/UqYO36djCcss7nczSbTTz//PPodDooigKLxQLT6TTdR+1Rsd5/bJ+p18vy7O5sps7eNL/qPb4KOKntkAem8GYa7lqtliKFR6NRujubY80BDfLIz51OJ0XyEwyez+cpzXuz2UzZA6hHrje6TvtYZxvax/P5fM0O9ZoG/uO8o5HZD0pV71etC/6bl9P53eeBqt917Opc7RkKfE2pAmurQHKd+xVIcqBPdePfXXfavgNROr/7HKN7M18fozmxam2NADfnPdrb+OeoLj73Q3u+D1H98q/qJtJ11K7XpfrScn4gzdtUXnx+jN5zG9bffV9LOdRedT+kfeZ9y2cR/+Qvktfr0r7xvbIfSoz6JRqjJL0OxPXluibPvtdUGX0N9N98XnHb9nlT96L+vvdRpkyZMmXK9HjoDoDP4Sxa+HHRUx5a+ihpsAVs7z18PY0m0Bs8fD0PQN3tOp7/+JMBo98uFbi/lc1Xqyd3fzBwli76YTH1EsC3LoCXTJkyZcr0ROmZTxntThBGFAJYc0bT6UJQQB16jCJ0IEffdUemO4UYscXnCl5EwIIDlwDOOZQiMMjLumPNHWSa6lTf42cF5UjUCWVQp1PkRNVIBOqeYEPksIsczu7UUj257Ix487pdhwqg6F+3C3cyalRF5IB1sDDqQwVolP8o4kTtIurXKpmoy6pIO3VeqjPSnY/aN8qDkutR2xuPx8lGNNUr21oul7h58yam0yk+8pGP4IMf/CCGw2ECMGl/5IHgnEaAM8KRtqkgIFMpT6fTFFnMfwSIeCiCoFStVkt3Avf7/cRPp9PBG2+8kcYO+7rVap2zGYJb1INGMytA7H3DcaJ3EysIpDZH8EyBMgVPWK9nNdD5yp3FCvpRtz6/NRqNpF9Gwqq9eIQYy9EWCDhqxPVyuUS32w1tjrpltHa73UZRFBiPx+meXrbBgyBMrezRrDoP62fqkhGxbKNWO4uK5QEDlTUCBxjFO5vN8OKLL+LKlSvp3mumziZAyvlCI76rgBC2R0BY1xWdk5bLZUpPTp64hqnd8R/1zvuzdXyyb+fzebIzBQ94cMLnJUYlsx9XqxVOTk5wdHSEWq2GTqezdrczgDRWtG09AMQxRXCXdsT+YJ9rSnCfr6O560FI10a1cZ+Tddzq+qJlfP1xQMi/+zs61ny9idYM359onVG70RrodQPrUZ+uB5bn4Q9N4b2pff+tCgjTdyJd6jyyaQ2N+I7WtWhvEMkbyeEyV+nKD8epbM6X73+8fu93J4+k9Tr9u+rOdRyVj/QU9Z/y43v3CGytkkV1oWVVF1V8RDar76v8Di7rePQ+1PV203cl5Zf7AJ3Tqg4Isj7dh7r9eDsZEM6UKVOmTI+XfgXACMCPAHgRjz5O5TsB/JdH3MYzTo3mWZTwwa3H3vQLn+ygPXh4G6m3CtQawOoR3IG732zig73exjLj1Qpfm0wuvvG3QwUuxvufk8pkypQp0zNBzzwgXOUYJFWBh+pgVYeyP1enjjvU3JHo4LMCHayX5E4qd/JpnerMI9HxGjnmFFSijO4wcqcR26Au+J472qqc4vrMHXb8Tev2shEQ7849b6vKWejAnetPHez+G3AetHXbiZzsDu4rP5RP+VEHnUcdu0PfnbNu094/anOqD9eD2gmdn2oLKtsmoGW5XGIymaSoTtZNgIc8HB4e4stf/jLG4zE+8YlP4LnnnkvtjkYjHB0dJTCIOms0GgkE7HQ6aLVaCdgjMMhnnU4Ho9EI4/E4lSNwzLKtVgvdbncNwGNk6unpKV544QXcvn0bi8UC4/EY9Xod3W43jSEFc92JTL7d+a4HJTRNsEbzcpzTFrwv1FYIovF3jfol0T70zlm1G9qSOrfVnkk+F7pjWsE6AvD83Gg0MBgM0O12U+QoQX6dbxgd3Gg0sL+/n+6DZhQ45zrWr3rWyF5GiHsbTMfN9OK821bHiOpTDxQQONe+p803Gg28+OKL2N7eRrvdTvrgnclqHzq/awRuBLpMp9NzUdHkk+9r1LXen8x6GFnL6OC9vT10u100m801m+A/1h9FyukaqQcqeD81x6ACwgR/FezVetX21BapY50reThB69GMGlVg3INQFSi3qbzypOSHmXyd9vlVASCd131MOj9Vh9V8Dayqy9f0TUA4v6uuVB7XX/RetL9iOd0HeNno3Uieqv7SqHIH8VwXriuXo8pGXFeui2i8V8m7SYc6dpRP3WP5PnjTvqnKRl2Xm95l+2zP5Yv2jtqOjhU/jKnlIn2wbe+bqr7QOfV++7yqOpRU75H+Ip6i9SGyPX7WrBF+8EH/RntR1WOmTJkyZcr0eKgE8B8B/CcAPwrg9+Hsnt9HQQWAPZy5Ph8BEvheoudfAb76ZaB8fAfJihrwvu/toag9bGgrsPe+FravN3H3GxcfpbvfbKK94f+FT5zaAC4/aSYyZcqUKdPTQs88IAzci/4C7oEr7kQHkCIC+Y47BhVAUeeTO+s8usEBPnXqbHKmqjNIHWAuG8sRBFBeHKTRiAFNOUoHkjqfHRB08Fp5UYBPZaFjnrrmew5WR44v15V+1zJReQcuvD/9Pe+LyOEbOWLdqRo5fCm7kkZmO7DCsu5E1Oi9TXKwjJI7/NRp6JE4UXm1GweRWV7HlRPTBWtKWgUjGDE+mUzwm7/5m7h16xa+93u/Fx/96Eexu7uLfr8PABiPxzg6OsJsNkv3nZZlidlshpOTk3S3LOXTCB7eW8s+4n3ETGHNsr1eL6W8XSwWODk5QavVwt7eHhqNBt58802cnJysgciLxWJtjmH0LFMF6x3bPg/o7z6HMJpO9a135PIdApB6163bidoigV8ClbQtT4ftdqLpeHVMKJCqNsf2yDv13el0Un+0223MZrPUN3yX8wQPAezs7GB3dzdFEY9Go3MRUDo+CUoyilTnskajgVartQY2U04eBvB5V/tJAWU+Zzpo1rO/v4+XXnoJw+Ew1TUejzGbzVJfcM2hHVP2CLhi26yj1+ulKHLO+wom6/it1+vpbmz2I/8+99xzuHr1Knq9Hur1OqbT6do1CuSdNqIR2NomdU69qx3OZjMcHR1hMpms2aEeaKIu9LmvD/xH29d1S8eIguG1Wg2TyWTtLuQHJQeuHJTSNZJ8UxYnXXOivtb6/bPzo9+rAK8qkFPf8c8RQOiHPnyPoQckFMB2niMe9bu+z/IR2BbpSfUX7Z1cp9G+w/VEu+K85GuuthvN9d4HakeUNerjaE8Y9ZH3SVQ+OsTnfRj1m+8lna+qtSb67vsGL+PzID/rfKC6irLcVNmD16ttV/Gvv3t/an1vpw5v1/tB//r+T+0p4kfXpir52H+6T/c5LVOmTJkyZXq8NAfw/wXwuwD+BIDtR9TOSwD6AA4fUf3vERrsADt7wN2bj63Jax9tX1i66KI4+/co6DPDIRr3OWD3+myGRcX/Zx45DXExmdNXb/3LlClTpkzvanrmAWF3BqrzGECKElTntzp46SQhsKmRa+7U80geRnEpeKJOncjhpXWoE8wdRu6A8yjner2enN/uWI2cRVXtqt78buUqp7g6WBX0419NgespTKlH5TECGd15WKXTyBFc9TxyzqpuVO8qk7bvzsfIeas6U/vUaDmPHlOdug61D10OllewljaoAEoUvRI5jSMdOg9Rf5XlWeroRqOBfr+fgCwFQQnKTadTvPrqqxiNRjg+PsZ3f/d34/Lly+h0Olgul7hx4wZef/11lGWZ0jzTMcyU0EVRJKAWQAJoG40Ger1e0nGn00kRjGV5dqfwjRs3kgyDwQBbW1sJOCyKAu9///tx8+ZN3L59G7PZLEWeegrwoijWwEYfww6gqs3xHmSCtwTwSJ5y2iN+CQ6XZZnucOY7nJf4vt6B6HcA8zcAaT6JwC1Pqa92ovUVRbF273ez2cT29jZu3LiRwGZGlmqf1ut1XLt2Df1+H0VxdtczI7R5oEDTildFs3McKZDO36bTKRqNBqbTabId1Y/KQL482pj6bbVaeP/734+rV6+iVqulNM/j8TilYWZ6aT0sQJ49ko+AMWWnnvXAgN757uuYAuscdwCwu7uL5557Dt1uN0XasgzLKQhGHer8xHbZtgLC7Ov5fI7j4+O1/iXvnM84pymYrHbktqX9y77RdV3XWx5IqTqw8nZJ39e5UedSB4c2gWW6L/D518uqLrRutqvR+F7PJsDH13kHtR0wclnU9nXMazmvy+VTue4H3vn84/uqqjajecsBPq/D9zjKvx+wquor/ax9rXss1QnL+3qudUS25Qe4ovVc6wOwBmxrey6fz39at+9Tqvo00rHvg1zOqH3Xb1TOD7mpTFW68LHie59Ndub7V+cxklnnC80643tJ7YvocAPb2RR9rbzrHkDX+IedGzNlypQpU6aHo/8C4P8G4A8A+HbgoS86dWoBeB/OopIzPTDVasC1lx8bIFxrAB//77ZQaz6W5h6YOrUaPj28f4T7N6ZTzIP/Iz0W2sHFAMJ3cZbtPVOmTJkyvavpPQMIR5GM7gAD7oFtGrnEMgqOsG6PUGJ5BT1Yr/OhTppNji2PRPPoCuVf7zXVOlkmAqf0fechaiNybqsuPWLDIw49Tajy4s40AgfKl0bq0PHvAGkUyaIgijv89K+mSVVeHWDV39XB6zpkWXXmqf2xziqHML/7ncvaf5EMLreW0b7YBBawbXdgq3PRKXJYAkhpYwkeabrd+Xye+Gm1WpjP53jzzTfxy7/8y5hMJvj+7/9+XL9+Hb1eD8PhELVaDXfu3Fm7g5vAJ+2CkaQEMtmXBBCBe2kWdfzoXbFXrlzB7u5uAgpXqxWuXbuG973vfXj99dcxmUwwmUxSWwqqMjKS/HjkDu9IpT0TCNO+04MeVVFs2jfavuqGc5XeK6u2y7+8+1Xrox0SyCSArgcnoogv1ufzBttilO7Ozg7a7fbafONlL126hCtXrqT5azweJzna7TaazWbqnygqj7IrKMq03tQv7YSgaFmWKcW51sfP7qTXcXblyhW8+OKLaLfbKTqV/zinsX/VBsinRmKzLIm8EZButVrhXMH+4aEn2j55rtfruHLlCnZ2dtId2HzPwa8IsCPfCgg3Gg202+1zhzQmk0m6P1rvIdY1gqnXFcTmnODzk8qkqa1po3p4iXLN53NcBPm6sglAivTm4F/Vb+wn6kf7JTrooOV9TYjWcSdfB7Qtvzc7ApvYvq9tzofvqZznTaCd20GVLP7c18Zo7iT/vh/yvtHMDC4byUF15V/nCe1T30tp+5EOde+m//RAifLiewfVUdXYdjmiPnFeq8r4XKLkfe6yq/2zv3Rs6D5L34++b5rP3J7crvWud98HRbJH84DOeX6AzvvVD+5FY8THOuvTzCIun/7m4zBTpkyZMmV6cvQagP83zu4UvuhI4TqAjwD4MpAvQX1wKgrgfR8G3nwNuP3GI2/u+U90cP3jnY2+qqeBPtzrYa/5FKPWBYDnLqiuPHwyZcqU6ZmgZ/7SKAKGkaPHnUp0itDJrY4cLauOc3VSaepMbV+jlaoAD3V8KX9enzr0/Zk6m9wJ6CCwRo0q4OAOMgDnAAmt1514jLjzTZs6UKOIOJbZFLETOdcU9KL86shme5FjNQI0HdAqyzKBX9FBAo0QjHjS9vhcIy1VjwrcqWNXda59oM5J9qOmetWy6kT1O5ApZ+TkdqdsBIZ4f1c5ngGke195N6/qmjojyNVoNHBwcIBf+7Vfwy/90i/h61//OiaTCba2tvChD30IL774YgJiCTBSv8vlEtPpNOnJAQ3tO0b3qu1NJhPcuXMHb7zxBg4PDxPQ1W63MRwO8W3f9m144YUX0l22BIY1Kl8jVgGk/nEnM/nhfcbUjb6vfUjgrQr0URBMdco+ZNvz+TylEWY71IWPyfl8niJTdd5w8FDnLf3soDL10O120e/31+65ZTtss9FoYHd3N4GW1Eu328Xp6Sk6nQ5qtVpK/Q0gjQ3elav3KJflvWh82hpTmesz2hTtVvuh3W4nIJYgM3nrdrt4+eWXsb29nWSljVAmHkTodrtrgK4DIgo+eVvsV7Wv8Xi8Fgnr91Dzc61Ww3A4xKVLl9Dtdtfa0TmFPOjY17mAfetriwIli8UCR0dHGI/HqX6/49yvENA2dN71OYw8alS5AtUsT52/U6qaxzaBqtHc6HOt1+1A0CbSeUrBsAhQq+Jt01yu7yvIWDXH+7rt+5wILPN9ia83WjZ61ykC+3z+cQDQ91fOe7S/idZkLRf1ue+3qkDHqN9V965/50Hf8TLeF96+94frxUHzKpC5qn+q7J7PNvVTpCd/HunW103XjR+i8X6P9A3E9wq73fh6qLao/RAd8iA/+n8T5dHHWtRPOs5VxqhfOJ9WzXWZMmXKlCnT46UbAP5HPJrUzh8E0H0E9b7HqN0FPvgJoHi0ruTOsIbv+5O7aLSe/j3Kdw4GaNxnL3W//+M9UhoA2HpyzWfKlClTpqePnvkIYZI7T9Rxoo4bBX0VGKHDhNFl6mDSe4cJ7LC8R4OoU40OIHXaOEjkvG9ynOrvyrM7c91ZFDnLyIsDJO4002gHlnXnmDoPNTrH23EHt/ad6kEBPY8SiRxrCm65Q9D14sADgSuXU/Wh5TWSRWXQiDmNeFO7cweg6krJbUaJvEQAaAROqE4i53jkONXn+ltVpI7TdDrFeDxGUZzdYas60PFFkO7k5AS/8Ru/gel0iul0io985CPY2dnBiy++iBs3biSQUe1pOp1iNptha2srpZVW2+Bdpq4LAq2np6eYTqe4fft2soPd3d10J/C1a9fwqU99Cjdv3sSrr76K4+PjFOFLwIvRpZRLgTUFxNwZq2OIdwMT+NMMABFwMZ1OU/s6xvS79pc69+v1OjqdTmqPB1zKskypsdUZre1remXeB029FsW9CP7lcpkAb/LJO5uPjo7SvcLK9/b2NobD4Vpqa0YUr1YrdLvdlEK6LMvEtx+OIC96Z2+tdpbemMDwarVK/UYwd7FYpPtn+b460ZfLJWazWYpyv379Ol544QX0+/0EbutYZmpq2qUeRqC+tfx8Pk9AM9tvNptr9kW7oFwE9hXEd0Dn0qVL2NnZSaC36jeagzVzggKQCq7rASjqnIAw+1znD50LWV90YIV/qQudl3QNZx9qf3P8Pch/wiPwzMGiKLKQOlJZlSdfy1wOn2f1X7SORfsA339o+7qG+PzvPEQgp8uo5VxfmtnCx6OW09/41w97+Xqm73pdzlfV+xHAqPsJfV/ts0qOCEyM5FD9uU14HdFej2M06hflyfvZy3obamPKj5aL5PO2ozER7R9cdtWL88vPni3F1zXvE5Vn09jVdSeSwftf6+S8xDHpYz7Shfdx1div2ru5/PyuwLOS7/EeZE7MlClTpkyZHj39FwD/FsD/Dhcbv7IL4NMAfvkC63yP0uXrwEsfBF797UdSfXtQw+//85ew9dzT767+eL+P79++f0T7CsB/ODl59AxF9AEAFxXAnJPKZMqUKdMzQU//CnsBpGlS3QnlAJ07e1hW7xp2xykdK+rcY1SiOm74W+QcjaJx6VjSyCf+7g4idYJrGf1N21InGcEEthU5nT06NnJQ8neC6UoOQimP+ptHG2lbem+qOr5UX8qXO/qqHKHOH/lxWQmc8DN/j/6pLqK+jp45j5GzU22nKqpDo3ycJ9erktel9uaHFPi+flcbdOem8zcajZIdEpBT4Eyj/FarFU5OTvDlL38Zy+US7XYbH/7wh9Fut7G7u5tALwKNaq/L5RLNZjPdPcuISaaQZepo7VuVeT6f4+7duwk43N7eTvW89NJL+NjHPoYbN25gMpng5OQEZXkWucqoS4+YV4CkVqudA7LVPhyU8HdUXxwb7siOwDG2pyAz+4ERq2pnjJBnPWpXvIuQuid/eghDwWCNKubcyyhhvZeXEZ8A0O/30el01iLii6JIdwu3Wi2Mx2MsFov0G+2HUeB6t7Tet0yAkb/xjmk9ZKAgJOWmzTG6lzrZ3t7Gc889h62tLSyXS4xGoyQr31ssFinNtY496lajdWm/7IN6vb6Wkpn2Qr0STNc+oh0zRfnp6Sn6/T729vZSdDb1QXBbD2boM49A8xTkmgaekdGLxSKl+NY0pppaneNPdUHZqiJQFZzWCGBdj2njDwoIK+kY1jEWAVPeB0o6FnUtjtrQuWHTmu7rhtqq71e0XBUIRf3peni/dSTa13g5B/pcb7p2+HrOOlSuCHSL9E0dRgepXNdVdUR94CBdBNq5vJEOowOKm/Ti7ytv+jw6rBDV5XuGSAcsG+3t3IaiPafX6esRyfeyUb3+DmXxvoh0rfJ6nb7vUxn94J+u5ZzPdB+rOo7mL98nbZJN3930OTqw5X0Q6cPlzZQpU6ZMmZ48/RLOUjx/4ALrLAD8AIDfwtlFqJkemOoN4OPfd/b5gkHh9qCGH/rzl/DSZ7rn9itPG23V6/gjly9jUL//5bwlgIO3fFGPlbYAPA9c2LXcr11QPZkyZcqU6YnSewIQdgeeAi+RM0Z/UwcRHWb8zPr8Tlp3TrFtvddRHYEKHuvvHvWqpGk9Wb86LRU4cQej8uRyqsPeQaQo9Z4DRP67t6mfVYbIEerOSu07d+6SPwXgIke3OmijSEt3yjqw4g5Td+7pXZ1atwIckePWeY4crCqzO5qdpwgodyehAt9+53WVc1ptVW3IN+tVUXMkRnQSQGq32wCQolApLwHDsiwxHo/x5S9/Gc1mE61WC6+88gq2traSrAcHBxiNRiiKM2CPIBijbE9PTzGZTNbuPGXkLm2R5bVfTk9PcXJygsPDQwyHQ3S73fTsYx/7GH7nd34Hv/u7v5sAMNbFKFYH7lutFhaLRYoopm513LFfFBhlvxNI1Xt8l8vlWuphdQx7+1qGNsf3GVlKgI7P+E9BOP6ljIvFIt3Ly3d9jmUd7Jter4der4dLly4l4JPvFkWRIoY1XTTtoigKDIfDdL8zbYrgsdqfz2u823k6naLZbKZ6KBftiLZalmWyfdU7dVmv1zEYDHD9+nXs7u5isVhgNBole2A/MIq40+mg2WwmPRD0JO/8Xpblmuy0bQW8yadGdGsfaEQtwe+rV69ia2trzf400lnndT14QLtnfQom63xHkHY+n+Pk5ATHx8fpMAdtzOdLnbd0TdV1hyCyj1EFCUl6v7xHyr5TqppDI1DF58QoCtTnbG1Dy/r6/nb49PVWx7ke+vK1Unnx9qL9jMpfJY+vodG65nOTr9Fer+6hfN3zz6xD368C6iMQLSJvS/VVVafL6ut3BBjqX98XRfqMZFXe/O5b1xfrikDzqj0Sf9O/9ysX9a/fce51VsnrdfoelM+iceF6qtIff9eDWlrGdePk+6qofj6rmj9ULh0TUX3RHMPfdY723zNlypQpU6ani5YAfgHAy7i40EYAuALgvwXw/0AOdXxIajTvgcLf+B3gbeyjN1IBXP/2Nr7rJ3Zw+QOtcF/1sFTUzu4lvvPq4qHrGtbr+PPPP48PdZ/iNOQFgPfjYofQE8C0M2XKlCnTxdMzDwgzzaVGIerpfnWy8C83H+p0ZnRUrVZL0VMKugLnHWv8TZ3cHrGn0RYO8npUGh03GrXD9/SuSLbljj+PWiDvnubZHVKR84l1UL9lWaZoPHXEKdCsjigCHFH0kvLrkRzqKPfoEneC0hntDjT9XhUR44BmlUPSHZkeSRk5vdlnBFsUrCKPVTrQ6NKIX9WnAtiRw94PHaiM+izi3/UeOeYd1HCaTqcJVNKoVG2X0aYExabTKb70pS+lNMMvvfQStra2Unur1SqBfQSO5vM5er1eAuQIShVFke79ZaSwR8MywnA6neLOnTvo9/u4evUqOp0OVqsVrl+/jo997GN47bXXEnDGv+RdgUQ/tEAQV1NIc5yqc5wgcFmWaDab53QU9RPnk/ulJCavmppa5xsd4xqlr2PAIxwjm6NMrI9ydrvdFK06nU6Trk5PT7Gzs4PhcJgALEblAkhA7mKxwGQywXQ6TWNGbZyRw0VRJBCegCV5puwsO51O0e/3EwBJewGQok057/L9fr+PS5cuoV6v4/bt20leHgxg//d6vXQYQXnQ/uD8SL4UjGe66KIo0sECnd94wIG6ZN+wDy9duoRr166h2+2mNfH4+Bjj8XhtzdH05NSl2qdm1uAhAk9XvlgscHJygtlslsprZDB51nXL5/pms5nWXF3zNHJY7Z16J+BO0P1ByEEttXFSND/6+h6BeFHdvu76eh3xp/OFt+Pzr6+ZvrZ63cqHH2aLeI/AMfLA75sALddPlf6j9apqP+Brtv8e8RDpwdtXmaP+ifaC3i+6znqq9Ij8ANsm+4nedbDX+Xdbi+xxUxSxyg6sH4yL+oO/b6rPx4rvfTaBmW7f0TjWsVp10E552zQXuG37Xo38az9U8eTy+RjXPSHb9rHmelCZ/OBnVV9mypQpU6ZMT45+B8DXcXb370VRAeC7cXZH8eeRQeGHpEYT+MT3A1eeB77yRWAyerB6CuB7fnIHH/6xAdr9R3c3cVEUGF5+eBf41ltg8MffykL31NJ1nJ2peIpZzJQpU6ZMT4aeeUBYI4/cCaPOVGDdcel3jnqUkt/vqgCetxE5XBWU9vfpfFWnuzp2+VyJzqwqGZUi4ChyIrGsO17JvzrnFGTa5DB3B6474yJnmjorFSQjSBBFxWkdqlftZ3ewURfAOjDhDrPIYer6cb15P/A3Bdj4Tw8JqBOUsroulU+Pto4cmmzfHYDquKxyskZ278CxOzU96kv54X3CepeqRlTyfYJeZVni+PgYv/qrv4per4dms4nnn38eg8EAly9fxnK5xHg8TqmHmbKWKX45dmk7lKksyxRpStCSPC8WCyyXSxweHqLRaKDdbmNvbw+dTgdbW1v41Kc+hVdffRW/9Vu/le6cLYpiLX0v29UU9WVZJqBK7xx2ZzDHtYJhAM5FD2ufc77T9M0E+ygbI0qZorndbqc7nfXQCeslCEkQ0/tSI0l9PPmBED08wujabreL2Wy2lsJ+a2sLnU4ntUE9EcCu1WoJ1Gc0uYK+BIS1H1qtFubzeQL1OQ5pL7QFjbhVXbJtgspMtb29vZ34mc1mKbVzrVZLkcKdTifZHnXFiHHqR4HfojgDwqfTaTo8oNHb2lccI+70d9B0f38fg8EgyTgajTAajc4dgHIQZrFYnDtUpXanADFtYblcYjKZrB0M4hjgIQ8HjHy91TGhNsRxzHTlqhO9B/phAGGfI32Oc96i9c+Bpgh4oa71EI/WuYmfTbxT57q+R+ukg3UKICmPm9pyefQggV+x4HJHPLHeKhmj95w2reERz1VtVemI8kVrbdV+gb/5njGynUj/VWCf8uT6p22pHVS16/u1Kl68vUh+/71KRt9HaR2RHnW8bLLRqv5UnWh7Hr2s+xDlKZLFbVnbqXpnk71FfaBzpUdTa9mqceUHBoF7WRdylHCmTJkyZXr6aAng3+AM1epfYL11AD8GoATws3jmQeHWI45grTeA668Al64Av/FLwM3X33EV7X4N7/u+3iMFgy+KhvU6/s/vBjB4B8B34GKv4Z4COLrA+jJlypQp0xOjp3/FfUjSCAx3PiuAp0Sgxh1n6qhV5zffUaAncnrR8cLvUbSNO4i0nQhABO5F6GnUnQJ1bMedV/yuDi/VmbapDjjVCdties7IWUp9KkBIsEV5YrsOdKhz2kEIfe4RZ97nyo876CMnaFmupzKMopCcNwcu1L5UnggcVt4jGdVunDY5XSMnZdRO9G7kuHYdUa7Inj1y1On09BTj8Riz2SzpViNoCSqVZZnSBzebTRwdHeEXfuEX8Mu//Mv41re+hdVqhe3tbVy9ehX9fh/dbhe9Xi9Fl/KOWY1gBLAGPhNU00hG9hWjUO/evYvXX38do9EIrVYLvV4P169fxw/8wA/gypUrmM1mqS2mvy6KItVLwJi68bGsenRghuAOAS51aGsfKrjOSFO2QXDbQbd6vY5+v5/utuX41Ohg2p32ifOq85AC8bQDRrcSgKVu2F8sDwDb29sJZCWY3+12U1pl2iQjwlutFhqNRop8Zb/yWa/XS3fmtlotdLvdBIIT6GSfaX9Rhz5P0s5Xq1WKOmc9BFsZzaxzNecVjSDXKEH+zjpHoxGOjo4SEE9gWOdiBa/JJ/tc7wXe2trCzs5OAqsJNvv8R5vTzBPsWx3Xyqvfw812J5PJufWIc4Lav0fG87OvObQzT93N33logPxPJpNw7nlQiuZHn/f52TMO6Dtal+4xqtryw2K6bkXAm7bpa63zvumZf9c22YbPU0pVe5uIP9Wjt+XrbGSzXp5UdVDLD9D5/sP7y/UdgXb3kzvi3ct4f2obVfaj9UZ68DpV57pX0vm6aq8R2ZrWpTy5bfl+TGWq2if4PiTSl/eT7wddt1w7dV1TeSiL2o7WEe13nB9tR9dHn/MiG4v2uFW27ePPP0ftquyRTjNlypQpU6ang34HwK/h4kHbOs5SR3/6gut9Cum5l4GKPdaFUVEA3QHwmR8BesN3/Pre+5oYXrn/PbxPmrbqdfxfnn8en3jaweAagI8B6F1wvXMAF/tf60yZMmXK9ITomQeE1YmkUVjuFCEA5OCWOnIUDNQIQgVQ6ZB2x6E6XNRZpe0pz+pApzNHAV//p85ijc6KQD+PQFLQRx3tqj9+3gT6uTPQ32Fb6th0ihzcWj/lcjlI2pY7Sd3h5sAD23Knmb/nbamN6DM+j/qXQEcVYBo5rN25q+9scra7c5DP/LnyGjmT3THq/RPJETnvnebzeYry1PY5HtVm6vV6Ap/u3LmDf/Nv/g1++Zd/GW+++SbKssTly5dx+fLlBE51Op0UlblYLBLoy38EBCmPRv8T1CO4xIjEg4MDvPHGGyn99NbWFj74wQ/iu77ru9BsNjEejzEejzEajc4BaARqPdW6gkc6lmlLqmcdH1q/gr1q/3yf7SiITHC5KIoEtBKkZJvqSCYwSrBPxwh1xPqKokgAOPnmXcSaLrlWq631EwF13i9M/ofDIfr9/prjXseJ3hlLPqJ+oMwE+fkOcG9eZ59Pp9OUipr107aom1arha2tLfT7/TXQczweJ7CWdgWsR3Y7oKTRt7TRyWSCO3fupPoIVquuyZOObc5Ji8UiRb5fv34dW1tbCaieTCYpnbYDyr6m6JjW+YsHCNT2WI73OjtYpLarY4360LuCOW4p42KxSJHkPh70Pab+ftDo4Ig04s914+tWFWC4ad6P5nSdC5zU/pU37U+fr9lO1TrsoNomsGsTwOhrp/7ueyKVJzqspW14ZGS0dkZ6qiKdvyKdOA+RbBFI74cGyb+mNt/UFsev/ubAvpd3ch1v0lnVXsXLRDpTHnTf47JrPb7H0vp9TEW8+940ssmorNunrpH6nurE+dJ6tH7fU0Vjj+/5wZ2oH3U92LTnc/l9vlBd6yEkfbZpjGTKlClTpkxPlv5XAP8RZxG9F0l1AD8EoH3B9T6FVOGHuXBqd4EXvu2dv/cYsdVL72ui0X7nDRYA/g/7+09/ZDAAXAOwj4vX6+t45gPqM2XKlOm9Qu8JQFgdc5FjTcELB1P4nO8SBCCpc1KBFm0jcgop0MJn6hCj08bBvMgJ7u/QqRelHlai04jRZazXgVZ3jGlUg4Oq+q46/ZyHqF/UieW6jHTvfawgReTQYx3UjQJmXiZyPrq8Vfah+qHjzyNBone8Lv3rDj7tf7Uj7TMtFzm9gXsAGPnzQwce3eaf3Slb5VR0Z6bzOhqNNkbxql0RyK3Varhz5w4+//nP4wtf+AJu3bqFsixx9epVXL9+Ha1WC7PZDK1WC+12ey06V/kiGMXvGjXMVMQKwo3HY7zxxht44403UJYlOp0Odnd38ZnPfAaf+cxn0Gg0MJlMMJlMUsQpAa1Wq3Uuyt8jd8iHAjp6wIPArgLA3hdqM5SJchHkpp2zvzUymPOhgtQEWBltSlvRuUqJ40rvfyUYO51OMRqNko6azSb29vbQ7XZT3d1ud20OJDjKdM+1Wi3xQj7Kskw88juBZ6b7pszz+TwB85xXGDVLQJgR3zzoo7Yxm81QFAV2d3cxHA7RbDYxm82Snk5OTtJ7y+USJycnaQ4gSKwHlTwVtPYj+5r2z37SvlFbmU6na6mUOS4uX76Mbreb+oUpsn3eY7/rGqI8aRR9o9FYA6cVXNEU6gS4dX1UAJ2RzzruqSfarNon+0EPTuh6SDu7KEA4mr9U3k1zbfTM10rgPIgcAc6+NkVgU7TeR+942Wjvo+/4oaAqgGrTOhDV6wfFtI9VL1UAH1ANflbxoOT8Kri2SVb/TfmNwLkq3bpdeD2uC+e1ah+l5GCvvrsJzHedVMnh+xuvQ8e9k+suajeq34FNn1uUL7WxSBdRJLCOB+XR98D3k5nvsHzVobto7tcsNdq2j/GoP3wf6e+4nWXKlClTpkxPJy1wltr5Fi4eFH4ewB8F0Lzget+jVBTAtZeA2juL9n3pMxcdylpN2881UW+9c6T0U4MB/pvd3cr/Y9yP6gA+ORg80LvviDo4SxV90ZdDrgCcXHCdmTJlypTpidEzDwjT0VEFVkaOUI/m1fLq0FHnWBS9qw40d2gp2OPRV5EzkY5xB8vUgeSgZnTqX6NT3CmmPEaRIu4cU+DZHWPqyKZDX6P43MEWfVa5IqeoO86UT37ms6poX9W1ggtef+TsZb2sW8EKPvcIUbU1/a5yKMhQ5XiOnJH6LHIEairmKPLYwQ13Emt5P1Ch/V0FRGxyOBJonU6nawCdvqcHHngfa71ex61bt/C5z30O//7f/3vcvn0bZVlif38fL7zwAobDIcqyTJHFmv7cIyxpz0zVG0XSEAg8OjrCN7/5Tdy+fRu1Wg39fh/PPfccft/v+314//vfD+Be5PN8Pk+gpDuSCfaRF0a36ljTe4YdbHNAWKOO3YaoU7VTvU+ZoDfBUMqr/BDo1IhaB4ZZN/WowDLBW/JF4LJer2N3dxetVgunp6cYDAYpcpvvMDKUvDECdDKZpKhu6p1gZq/Xw/b2NjqdTkohrhGkGjnearWws7OTopXJCw8F0AZp62ov5LMoihQpzIMGBEUZAa/9QB2yfe1DytTr9dBut1OkL6OO1W6pT4Ikah+LxQKXLl3CK6+8ktJFEyylbar9+X9y3f4pe7PZTP07Ho+TXPqXUeQ+J6lN6mEUXxsV3KC+2baOBQWoXfYqgOydUrS2RIBM1RysRHmjdVzXh00Ak5Ku9dSfH+zxuT/6XXnwA21VIGUVYOe6cDBN63T5Ir6ifY3+5kCb9pv+7jqP7HITf7530Hb8c9SGHgByWb2Pq9qP9mnR3ihad6O+0fWbFIG+ug9mGd/3al2R3p2XTftAl13/+p6U7XlZ1YXKFtXte6OoL3xe8ufRu/6+rleRTL4f8zLejh5udL7UVqL5INJPpkyZMmXK9PTRtwD8D2/9vcgQxQLAdwL49gus8z1Owx1guP2OXhnsnT9c/rTRH7h0Ca3gYOPbpaIo8Fyr9WiDoRsAvgsXe+U2aQHgzUdQb6ZMmTJleiJ00eeGnkpS5xvBKwV0o+hYdw6640QdK+7o5HdNnar1EFRwRynL+F+CBAri6LsqT5VzTZ1L6jxSGdRJz7sw1RHvkage+esORNe7O48jB2HklKaDUcFkd5yxfYJSqkPl0cF05cUjTbR+6t/7ifoi7xrxFtmgOwJVN9o3+k6kI7cbtSngHkASHTbwepwP/411uzOdv0e8uY5dFxERQCXQRPl8rFK3LDMajfDGG2/gs5/9LNrtNr73e78X29vb2NvbQ1mW6R5TRlLycIXW3WzeOxUcgfLUJ6M5T09PU7udTielM37xxRfxgz/4gzg4OMCNGzdwcnKylkKeYFZRFAkgZL0Erf0AhNoGgMSrp3VWMIyApAKpap8EkgmI9vt99Pv9FMFMm2e9jKhlVCmjlN1GVXe9Xg+np6fnonqLokiAHsHwZrOJ7e1t7Ozs4Pbt2wnsp65rtbMUzJRBwXPK6+MYALrdbtIX+38+n6/pQ+eBfr+P5XKJbre7Bn7qWCNfPJTA/uTc02q1knyMKl+tVuh2uylqXedt1zftk21QfoK4ahMaRcv5uV6vp34tyxKDwQAf+MAHcOXKlTVgmUCwzuMKROq9xAS7OeZ47zPHn9sf+402w37hgQGNhqb+dA7R8cG6HfhygEejyWnjPIjxIBSBVfqXdL99gpbxOVT51/VZbbIKTPP2/T1gfT6OAD2twyOtyeOm36vWMn22aU+ivEUH9rxerUPljdZmX/+r9Ha/PvIDF1XOqqr2tLzP6fo84qPqd7edqP2qtd11cT879X2l71erAMUqW9d29KCe2prvAaP+84Mmm3hTfiJbij77Ho51RHs78qP1+MEL4N6VEVX26O1GOtS9nq5Pvg/WvXPV2N+0T8uUKVOmTJmePnodwD8G8EmcpXq+BlwIvNYA8McAnAL4Ci4+Cvk9Rs02sH8dOLzzpDkJqdYo0N2qYXb89g8WXGk28b5O56Hb/uRggG6thvEFHVheowLA+/BoUkWXAG4CmF5wvZkyZcqU6YnReyJC2B1hdHDTWaLRiCQ6oRR8dYdb5NihI0idM+q8AeL70bwOBZHo3Nb0n/zrzjr+rs5zbV+jVum417LqOPIoUJZz+SIHc+R0ooNK747UPvKITAc4I4eo9pE64BzEUYdzpH/q0SOTVDfqsCP4wToctCRfDharbiLnouqJ4I4C3KzXbcqBiMhB7v2sNu39qXpVm4541TTlVYCItltl92VZpvt3NQUu2yC4Sb0AQLvdRq/XQ6PRwDe/+U38zM/8DL785S9jNBqhVqthb28PV69eTeAVQUgHLBjBqlGICoTrbxyfy+USd+7cwe/93u9hNBqh2+1ib28PH/rQh/A93/M96PV6mEwmODk5ScCn65w2osCg6k4PIkQOXz/Mov0U2ajef0u5i6LA1tYWer0eWq1WAhiLokgplqfT6dqdwZ6iXcFPgoCnp6dot9vY3t5Gt9tNqYrLskS320Wv10O9Xk9ppDudDp5//nlsb2+vgYQ6vvy3Wu3s/mGN6gbuRRXTVhityrt0mT66Xq+n1NQaxcvPRVGspWfW+ago7kXvdrvdlBKcttRut9HpdNbSbs/n8wQal2WZ3gGA6XSKsixTH9RqtfRM5xfeoc3IZfYpy1D/q9UKW1tbeOWVVxIYvFwuMRqN1u7g1RTmANZSLPu8p5H0enew3jtMoJm8FEWRos/ZHwR6dV5yQNmvFOC8R9kIniuQxAMC5GM2m52bZ94uReusP1M96Tjz+dfXrgiUioC3CJiL1v1Nc7S2E0V9Kp9V67iDUhHYxj7xyGfn3cEpB+Fcdx4B6utotNZrexFwGIFfPgdH5aNnUX9G7UZrn++DVB7fh0TrputT29c2gXXA0g/7Rfqr4tltOHqu/HlUt5bTQ0oqb1SXf1fbV76r9jSRnlz3+r6P+0he1a3ux6KxquU28R7tQ73//H3d2+o+mGX0AJzzvWnuyJQpU6ZMmZ4+mgL4IoD/HsC/A/Dghz/XqQfgJ3AGDL8H7hR+1PTcy0+ag0pq9Qpc+9g7A3c/3OthWH9nabAjahQFmoH/76GpAPB+nAW6PwoP/wTA7z6CejNlypQp0xOjZz5CWKOL6OBXcNEdIVomciABmwE3BXEYmUZHttbljhh1akeORAcFlQ+PNlaQW0ER/a7OMnVy0UnIv+7wckeo/vXfXVfuWPPIFo+OVaCMROcigVK965Igg0atql7UweZ9BqwDIx5Z685Gd1p6FJXqNuIjsj936Klu3AHPPnbwfFNdVeSOb3cyurPW9eMOSpVTyUG1qMxqdZaWmBGWBMRoj4yw5tjifa/dbhdlWeLVV1/FZz/7WXQ6HXz0ox/F1tYWrl27hqIo8PrrrydA2aPOCVwRbDs9PU3gHvuX0cXkmXXdunUL9Xod73vf+9But3HlyhV8+tOfxsHBAb74xS+mtMacE/QuVNcN5ysdnzoOaC/kH1hPJc1xoxGj2pe8r5fP+ZnpmhmdTd3yPQKIrJ96p34YWUy9MG0zdaapexVEpnzT6RT1eh3Xrl3DycnJmj3pncer1SqVZdRqURQJ+NN5b7VapWhc6nM+n6NWO0vzzPtsOZcw9fT29nZaLxipXKud3VdMewHOUj73ej10u92k42azmSJmCYAThCZwykhpv0eY+up0OukZQXhGLLNPaO8Eb2kTlJH17O/v48qVKxi8dV/RyclJiprVe6B1ntE5RSPMCLhrZLbOHzquNKpc7Zv60/6ljRHg9sM/2vfkT0Fr5ZN2zah42sNFko61KiBMn+ucqOWiedPJ143off89Ag4d+PI5Pnqmbet3lokObqks0TzvfJA00tHr0barQFbXZxVF+4FIV5vkrtLVJlA0ktl16eW8zqgMf9f9pQOXvr5HOqlaryObrpKlCtyM6nBZdK8UHYCq4oPlor+RDVbtdaJ9sLfH8rrubpJR+8LnjLcznslXJEPVHlrb54EZ2gfriMbt/cZNpkyZMmXK9PTRCMD/C8ANAH8YF3MHcAfA9+LMRfq/4OLA5vcg1Rtn9wiv7v9/sfawhp0XHt8dzkVRvOMA2g/3eheyXxrU6/h4v49fPjx86LrW6EWcgcEPj1mfpxWA/wTg6Qz4zpQpU6ZMD0jPPCDs0UfqGPHIKJI6ptQJrWUJJGxyDEZOdnfu0IlNR4064AmAKQjndapDU2UlrxpZ5w6kqqhbkgI4rN+dtK6zyKnpZZRfjyZSUEBBLwViIgetO8uoQ3U0q8ONenfeIoocxOrQVN3qb5q2WQFUb091qjxtKq/tq074m/eV6knty53Pajcuk/OjY0n50PqUN68rqhc4Sx19fHycQLOiKNbGAZ2d5JH2UhRn6Wv/03/6T/jsZz+LbreLD37wg+j1erh27RoWiwXeeOONtUhdlYGAHOWPQO+yLBNgXJZliri8efNminDlfcI/8AM/gMlkgt/8zd/EZDIBgHS/rPKuelKglM5cpmj2Qyqatpl1aAphAOl+XGA9wkjB6Ha7jX6/vwYUE6jlmPQoUAdT9J5jPahBQHM0GiWb4928BIoJ5pKHF198EcfHx4kH3ud7fHycUmszilbHswLvjBgmOD4cDlOqZLVJppSu1Wo4OTlBWZbY3t5eA8wJxmq/rVYrNJtN9Pt9dLvdpBO2v7W1hXa7jVu3bmE2m6H31n8iqUPqhWm92TcEudkvs9ksgeuUCzhLl870zRqdRjC00+ngypUr2NnZSWD98fFxSmEOYO3+Zu133n3MfuVawTmZetc7jXmYgHaicimow7YZSaqp2jkO9TCDg0H87pGoBI3Vthlx/agpAi71dwd6orXGx/GmdbRq7dtUd8Sj/lYVlesHinSPwrK+t1GedO/C8e/rgs5pVQBm9LuuQSyj4KjSJtDNwUKVyfvQ+dY1VPdyWkcUMR21S/3qb36Q0GVS3VbxqLrh2lnVfkS+FrocUdlN/RjtId2Woz6hPu5HLndVGV831V6dT9/vud7dHnwf6nXqOuJ8alrpSF/ReK86fEje9XoKby8aE5kyZcqUKdO7g0oAX3jr8x8C0LqAOmsAPgPgqwB+/QLqewroUUSk3o+294DBNnB0fxSx1S0w2H8USObFUL9ex0d7vQupq1YUeKF9wRHoAwAfxqMBg0sA3wTwjUdQd6ZMmTJleqL0zAPCdIDR6aGp0/zkPH/XaIGoPtajEYsO4qqjxt/3yEBgPbKN9QDnwV0H8eisV7CB9ZJXTUvrka38S76dJ3VyRVEU7rhzx6vKrXzp96h/tF9Ul+qIjnSrDjd1kjkwoTxFTjY65ai/SHbVWeQcjpyg6gzU73r/J/XivKoT0VOKK2gfgQiuI30eOQPVcaztR/W6IzKqM3JQb3JAzmYzjMfjBHxF/atR87XaWepgRpt+5StfweXLl9HpdPDCCy+g0+ng2rVrmE6nuHnz5jmHrQJVHE8EORWgVaCEgOx8Pl8Dhff29jAcDvG+970PP/zDP4zZbIbf+Z3fwWw2SxHCOs6pV4KoPBShh0MUhFPwqyzLNTCW45yRsGr/CipPJhPMZjPMZjNsbW2h2+2i3W4nEJftLZfLFPE7mUxSRLCDJto/BJYnk0lKy0yQmDIrED6ZTJLt8z7jTqeTANr5fJ7+MfKVQC6jelutFhaLRZJD5xkFaZrNJqbTaQKaqUtGyxJE1oMo3W53LSKVMjNVNccf70luNBrodDooirMDCixP+2H/Ko/sR6Z1LopiLcqaoDKfMcIZQAJ12U9lWWI4HGJrayvxOJlMcHx8nCKma7Xa2j3DepcziaDwbDZbG9cEjFlHWZYJdGa6aALZABLgzndo2/yd64zbkY5Pjk2dSzg+OIZ0neIhhougKgBReVG++RmID5Xpc60vmkc38UGqmtO1Lt/P+Hzsa7nP3SQHqqK9gZKvS9EaUPWbyxjJrbz7Gq51RzqK3vM1N9rv6B5q06Eot18n/z3So+4RXAe+/1Fb0/pdDxHoGe1VNuld6/BnKp/rQttwXUV6ifZVlLXKTjgnKA9VY8ttr0pO3zdzjgHWD/G5jPpP21egWNvww4ORXUUHALS8/qZza9W41jk0U6ZMmTJlevcRQeEGziKFLyLrRQ1nAPN/BXD7Aup7gtRsAVdeePztFgWwe/ltAcJPOw3qdWw1Ls5t/qnBAP/Pmzcx3+ALe0f0fgDDi6nqHJ3i7GxEPjeYKVOmTM8cPfMegMgRyr90rlc5cRWwIUDmzlEF5BihFTlM3ZnojmRGdlU54hREcSeZ1uUOJQe83CEUycf39W5YvcvWgQzXN//yPQfAPYpGU6fy3chBqf2kuibvVRGdrg9tw6MnVQaPClFA1sFz7VfvA7UHT+8bgdzudFcdKBCo/en64mctv8kGI2dgJLv+i6K9nLy86rfKUc76JpMJJpNJSufs9khgnOAl74Xlva1f+MIX8HM/93P41re+hdlshm63i+vXr2Nra+scwK/1q/5p9wqm6phiv0ynUxweHuKb3/wmbt26laJEX3nlFfzQD/0QXnjhBZyenmI8Hq8BbGxPx/5yucR8Pk/Rl1E/8l0CwAQbgXugtkZOa58TCCRgNxwOU3pjjTJl9DMjSQmkqh2xDU2DzD5i/WVZJrBwNBphNBphPB5jPp+j1+uh3+8nkJF3Fvd6PQyHwxRFPB6PUZZlAnFpP3yv3++j1WphMBhga2sLp6enuH37NiaTCabTKe7evbsGhjJd9GKxAHDPKT4YDJLtFcUZuL27u4vhcLjWD+12O7UzHo/PpfVuNBqYTqcJEOahHEYuF0WRQFPaeKfTwXB49r85AteMigbOooIpA0F34F7qcoKgW1tbuHLlSkpnXavVki0tFou1tNEENhQ44BxE22M0ts8LOgdTRoL2BIYJ+vocwv7T+Yt2Qx4ol84zANLdwLpOKW9lee8e5YugCDTaNHepHP6OAzMRoKVzdRXQ6L9FgKeTrmvaF6pzB+Oi9T0Ct94Oz9Ez3WNFvPt+IgIvoz2czuFet/eLtunAWLQW+7sKwupn15keBIv48fq8b6J3XOe+X9Dyutdgef8e9W9kW1EEa7Rv872G1xO1pd+j/olk87Zd/6xH+zfah2kKff+nZXVv4O07v7qXcP69v7yffIxVyef7N9/3uh70WQaCM2XKlCnTu59KAL8G4M0LrHMA4I/g0YRdPkYqirP0zU+i3Z39x9/u26QXPtV522cHPtnvo3uB+6Xn22283HlndxhX0gBn6aIfFX0LwMEjrD9TpkyZMj0xeuYjhP30uwJB6nhxQJDgCL8D99KhKiDpjj6NmAHORzUpqOBRBwp08R11FPE3JXdCKaAVOWldJnXwqaOJetO00nwvck6p09J5U327A1ujXd3p6VGwLpM62lROOvUU7FYduANM06Vqu65TldMdkC6bpvPV/lVZPAqU9uI6dSe961Z17H0YOSv9YIE6dx2g0XYjgCBytrvzV3XqtrGJlssljo6OUBRFSrVMYM3HHmUgcHV6eoqTkxP84i/+IgaDAX7wB38QV69eRbfbxfPPP4/VaoWjo6NkI7RDdQjrWPZDEGpTjUYDy+UyRbqW5dkBhf39fWxvb+NDH/oQptPpGjitoKbqSlNhq/4ZwVmr3bs/Veccvk9wnH2vUZ6sR++O7fV66f5gRijXarX0nXak0VAaIar9yTGiqYwJNrLvyvIMhD06OsJ8Pker1UKn00mgs0aRMjKXdwiXZZkixnk/rOqP/TgajXB4eIjj4+MUqcv+m0wmaDQaaLVaqZ8JWjabzQTY8k7f+XyObreLF154Ad/4xjdSmwRaCVr2er2Uspp6X61WKSK8CnyivgCg1+sl+VqtFk5OTlK/AWcg8dHR0dr7PNQ0m81Qq9Wwu7ub7gzm/cfHx8cJtGYfj0ajFM3MiOWiKNY++xwxnU5TP1C+6XSKVquFsixT3bRj9h1BfQc3VPe6HtC2CfRSn7RZzc7h1x5QJxd9f7ADZWpTOgYcMNT3q0CsKHKS9d2PD21L16tonfW1gm2rDh3o43ywqU2fq6K1qYpX31tE3yMgWMtE+tLPvl/xvomeVQF80WfVlX5/O/K7DFq3y61/3eYjOSM5ovpcdrcBlr0fKB21q88c3HY96jygz/w3pchmqvYqWsb3NmzHx7T//0B5dZ78cKHrJJJFD2P6vlTXNtVb9P+GaF+yaY/lfeyHXTNlypQpU6Z3H00A/FsAfxQXE/NSAPgQgN8P4JdwdpFqpndEV54/i1BePH13MQ/2GygK4O1sf7qS2ewiqADwfVtb+OpbV4o9FL0fF3N9dkQrnKWLzpQpU6ZMzyQ984CwAj7AvQjaKgcny/A3j7Blak53+mgb7nSL0iATqHGHqr6n6Wuj53XbnKhDR9OzVjl59T3nQ8uqzqJIBHdWufOM9blDUvUS1eN6dEca34scjOoU8/ciR7y+x2fueI5+9z7xsmzT+arizcFHJ5WV72vkiT9z+VzuCNBw56KX1c9u8+4Id/1EDlwt48SoUtq6jyUAa6lhWQ+Brrt37+Jnf/Zn0ev18N3f/d3Y29vD9vY2AODrX/96AiUZEasyEPTinagEDV2//EygVVOMX7p0CTs7O/joRz+K5XKJn//5n8fBwUEq3+12EzDn99RGznwFcAjAlWW5FplLnagN6V3M1B8BxJ2dHXQ6nRTdSQCTTmLKzXeZHlhTDnOu4vNms4nZbIbpdIr5fI7hcJjA2W63C+AeuFwURYoA3traSmA05SLwyH7u9/sAsAaQE1gE7t2Ny3mL/DIVNgFYdYJTxqK4d2cyI3eXyyWGwyF6vR7G4zGazSaGwyEGg0ECPVutVmq33+8n+9zb21s7oEJ7Ir/kjxHbmnaZOqU9EHDWawrYP41GA8PhELu7u+h2u2sHARhlrPasUdw+59M2aWsKzPGgy3K5xHg8TiCx3/muczPr0T7z8UxSkJy8AljrT8qvvCnvejjjIqgKqPQyQHwwJnpOUiBKf+PfaB6I5vmoftcLcG//48BXFUX7jkg3m9qPKFp7It34/k3l2KQHlqGcDqJFslRRtFY7P066Hka6q1qro/2Pjr9o3xLttyJ9uB517tvEYxUwqfshfc/r872l69a/+/4j2nfo3pY6iA6W6H28qivdtyvfOq/6/q9q3+T8308Gl5196/sJrcejmlnOZdKDkPrM21N5vb5MmTJlypTp3UtfAvCDAK5dUH0NAD+OswjkX3rrb6a3Tc020O4+lYDw26U6gO8ZXmw+5qIo8O39Pvq1Gkarhzho0AbwPN52pPM7piNcbNB9pkyZMmV6qug9AQirU8QdJe58oTOIYIWCoQQ+FGTRurQ+tqVOKo9WdYetOtHdmRc5wxRgiOQmmEBwpco5pPwqaKQOyMjxqWX5nN8d7NX63ElNUt2rc0r1EUVmuOPYHZmR45PlNCI30oU6FjXFuDv7FGTXdtSx6/ypI1Advt4//E5+qpzQlEv7R+VS2auidciz6lzlU7kjZ3CV81btX/USHc5wmkwma1GjBE/V9rzfeY9rWZa4efMmPv/5z6PT6eA7v/M7Eyj88ssv4/XXX082x+hIACndLOvUe181modzAoFDTWVNwGp7exuXL1/Gd3zHd2AymeAXfuEXMJ1Oz6VJ98MbHqlJOQkc6nzBlNbKM2VwGySg1263sb+/j62trTQWtJ81hTz54T3CmmKa7zB6dDqdprTYBOZ59y+ABC6XZZlSFwNn4CVBcpXr5OQEd+/exWq1QrvdTjLO5/M1MJLRtAQ5eX8xI4rZNu9FVqBbbZXRtJSVAPBwOMR8Pke73U73FBPcZf90Oh20Wi3UarUEEgP3ooDLslyL1qX8vNOY/cDU0Dp+mTqdeqU+2+02er0eer1e0o9GY4/HY9TrdbTb7dQ2I5cpN22F+uEYou2XZbkWFc1U10VRJB2uVqtUDyPDuY4C9w4lUCad+xQw0nmHNsb6CAz7HKh3bDPV/EWQA08Azs01Trrm8LkD31o2Ahyr6uY7+jwCrnS+jfQV7TG0rqq52MFV5cXXHt/XVIFPvpZGfFXJrqT245k2qtp00sMLUdvR3kL3DC6rAqMuf7SP2QTQ+XqqclTprOqdyOaq2ve1/n59qesyy6lNetu+N4n2WCxHivYXykN06MH3g9HezQFjLcO61c4AnJM32k9qPVrOAV/g/CGMqt9dZv3/hu8jnG+Vm2X4f4VMmTJlypTp3UtjnAG3fxQX5+ZsAvjfA7gF4LcuqM73CDVbwP5zwMnhk+bkoaixwff2oHSp2UTrYQHh5wC0LoyldVoB+F0AeWuYKVOmTM8sPfOAsDpt1OnsZdQBrd/VoRI5gjVKCzgfmQucd9pVgXYK2CggxHa8LndqakQX+dFoKoI3fM8dau4oUgcUQTN32rruWHa5XJ5zSEcOPdd15KxS4EnLEbBnmw5uUm6CFVXgrzp0Va9VIICWVQBc32PbGnUaOVMjh7zrQ4HyyCnohxa837QNtQOCNXoXs4PS0WfW7VFXkbNVye11k+Pf3xuPxwn0YZSugvUsp5G2jJqdTqd47bXX8LnPfQ6DwSDdNTsYDHDp0iXcuXNnrS0CXASf1BYcwKZNEfCjnY3H4zVd7uzsYH9/H5/4xCdwdHSEX/u1X8NoNEKz2UygINtlRLKmj3Z9EiTTcap/aX/NZrNy7Ozv72N/fz9FpXI8ORDIf4vFIqW7pk5o/7zbd7Va4eTkBNPpNIGjBEzb7TZms1m6/1X7ktGqvKuYdl2r1dIhgLIsUzpqjut6vY7t7e2kC/7W7/fRbrdTtO1isVi7A528N5tNdDoddLvd9BvvSmZ6aQAJBG632ynCeblcJn5Go1E6tFCWZZKBUdzkj31CQJp9xgMEBHcPDw+T/flhhNlshu3tbVy9enUNjNf5eDabrUVaM60z9cgDBK1WK8lM+yKYzqhxzVRBoJXt9Hq9dGc3eeEBAEYl06700IACZSobf18sFqkNXbvV5nRe5ZghIPyw6aIjkMp/j8r6urJpfqNM/q7vCbR81bzqa4ofNIrmct/DROuS2oSW8c9VuvG6dA1mveShSraqA3dO0b5K39u09qquFSBU+VxWzlEuj9bjbUV7HdWxyuh9r5+rdO08Rp99f6V7DN8TKT/+2WXwPaDWq797/fo9sncH2h20pe6UF7+GxPcqVbZeBdhGNufzgo833Zuqrfi+NtKz95fqxf9voftj5UXHt/5l2xeZUj9TpkyZMmV6eujXAOwC+DFcXOhkA8AfAnAbwBsXVOd7gIoCaLWfNBfPJhUA3oeLyY4e0RHO7g/OlClTpkzPLD3zgLBGfKjDxx1XSnTGqAMlcsqwfgU+6dgH1lOSKujIsnTmOHCq0a7uxPN7dVm31q/8kj8HS9WZ5SCxAhV6byPLuuOJpHzRkQ+cT9unZZU3rc+d1kqa8tSjGTVK0h2HWh/fjRxvGkXp7/K5/6Z9G5VleS3j9hfpJ+pfdXK6vtxO3Qmp/eBRP2zXo2si4MCdyO4g3yRbFRCxyclNoJGgsI4zfifYoKAT+ZpMJvja176Gz33uc+h0Ovi2b/s29Pt9bG1tYbFY4O7du8lJenp6msA0TZusfaz9SzvXSMnpdLoGXgHA9vY2rly5gu/7vu/DbDbDF7/4Rdy5cwc7OztrtkHgkHKTdB5TPUZgEEkjfjh2T09PsbW1hRdeeAFbW1tr970C6/eeM/KWgFuv10O/30dZlilSVPuEwKLfq6y8MbU2gVi+VxRnoLEecOA7W1tbCahcrVYJyCWY3ul0cHJykvpO32c6cAApxXG/309R3cC9e4/5G2XziFumemaE9dbWFsry7MACI4Pb7XYCzxkxSx2wHY1GZ6TzarXCZDLBUNJSkZ9er4fFYoGTkxPM53Ncu3YNrVYLd+7cSfpqNBqpPG3o9PQ0AdlFcRbBrPahd/gyiprgsY5NAtOsT++Spp1x7OnBJNoFsJ5RQw9QqW1STw4Ckw+9S1jHBctNp1OcnJxUziNvl3Q+9DUOiPcE0T6CvPthpE0Hb7xM1TpYxbPXQeJcFQFqXr/P6/qbPvP11+us4jviLdrXODmAXtVP0d7E5XJedF9WpSPfq+i6ej89Vq3Nzr+v9ZFeos/Kp/LowCTr9vp1P+F7CQdKtYzz4LbNOUD5iPZKvnZV7ZGUr8iGvQ+ig4Js0/fB+tzJQW3yo+1EbStfCsJrm1GdVePZ/1/iOlew3/Wh+vf9b6ZMmTJlyvRs0ArAL+PsctVXcHGg8GUAfxDA/wggH6p623T9FeB3vgxsSLc9vrvCjd+e4/rH22/r/zyZAGwD2HpEdZcA/guAxSOqP1OmTJkyPRX0qM4UPTWkAJc68fivKgrXnZ0KhOp3B+sigE0dXXTGVJVTp44DbhpZ4E6xqB464tTxpzJqW/quOynVWUo5vQ530mp5/V15Yhl1FLqDTB1Y6sTTcvys0dGqcwUQ3TmrOnDdR85a5cmdtQ5UqNON5Pw56K9Oysg+2YbqRGXVd6L+VGegO77v55R3Z2Zk9/p75KDXgxSRE3TTfwJ4bylBNkYAq12pTVBWRkICwG/91m/hZ3/2Z/Haa69hOp2i1WqlO3QbjUZKmauAlDq1tU3tYx0TjAJdLpeYTqe4ffs2bty4gcPDQ7RaLVy/fh0/+IM/iE9+8pNYrVY4PDzEaDRaS8HL+mi3ageMuHS9qk0QpCVgyvcJHF65cgXb29tr0b68r5n39bINAritVisBwuwPRqaSX797ljrlfcPsQwVveT+vAo2MliUNBoMUYUzwuCzPQEzWRdn0oECv10Or1Upg6cnJCWazGQaDAba2thL/jFqm/rQ+2hLBToLZ1J3ei0sdAEgAK/uBIDHrZZ3NZnONv7t37yad61zAQwb9fh+9Xi8dDuI9zmybkcs8oOAHltrtdpoLCO63Wq0ULUwb0/mMgLCCTGqTOgfyu4K5OhczzbeuA7QbByw1Pbv+RiCZNgYgRU9rGvKLIl8vfO5yEM7XGF3/VB6dB9+OA0Trd4DO9xkR/5EsvrZFcjkPVbzpX1+rvYzvFaLvVQeofG7Wz7RPX2NIuhfS+nyPoHJEutGU+lV6jvrJ33Gduk0of76uR6Cer/f8zcdR1Tv+bvTc2/Dvzr/LQjl9rOhzJd8b6e9eJtp/eDnf4wHn92vUmY8pH+OuIx4q0/HucrOMA+2+H3W9RHusaM9Z1X9at9qD6yhTpkyZMmV6d9MxgP87gNcvsM4CwEcAfOgC63wPUK0OVFzHQjpdlPjNzx5h9R7C2eerFU4fZu91BWcXHD8KOgTwzUdUd6ZMmTJlemromY8QVqezRnwC5yMQ3CHkjkwFn9xJpJGRkeOGQJFGChFEiCIq3LHlETh0tmu7JAeq1anvTlYlBbmUBwXGCTTxuzv7FKhVcMXrIvl9rBFQ6fp0J50+1/6MnIysOwLVyQ91oDpxGVVXGnkVOWNJVY66yBHK9pUfB5zZ/263budapzui9Xe3LZefFDlGnW+3Yb4XjQ0fc27PSpPJJAFhTCUM3Ls3VgEI6oxjr9vtYjqd4ktf+hK2t7fR6XTw4osvotPpYH9/H7du3Uo2zbtfOWbLskzpjR0IYPQTU+sC9+40JdB69+5dLJfLdGfv9evX8cM//MMAgK985Ss4Pj5e4131x0hMd+DWarUEHhPM8IMrnPd4z/FqtcLe3h729vYSAMv2GF3KNMEqj/YhU/IWRZFSXp+cnCRwFcAa6EcwlLJ0u92UOpp3KTPdr84brVYrAYWMCL57927SPYHgxWKBo6OjVI4pkAl+MtqbkbZMD01eut1uioplmmOCo2qHBFL1gAHttV6vpzTQlIPR02V5lkJ6OBymSF3qSfU7m82SDWtf8O7mo6MjzOdz7OzspHmT8pFP6p02rKmXi6JI36kjyqlrhkc96kEb2pveD6z39xKQ1hTdtGOuddQPbZpjJ2qT6wz7gu1STp3jT09PMRqNLvQezGgepUxextc4B10iUI1lVRY+83kyatfLRcAeyQ+xbQLOdK729VX50wMAXlcEbG7iXXmI9mAOPJL0kJF+j8BJr0e/K0Ackesh0rfLGAGmVeVcFn8v2uNFdW2SlW247rX+KhuM9svev7p+cW9CfrXuKp16H3qZqC23UQdIvQ0fayqPjhE/jKJt8z39PwHb8T2w943rmO/5QTPf67mNqM70/xHeD64f58n/v5ApU6ZMmTI9G3QI4PMAfgLARaUtbuMsdfSrOLuvONN9abgNbF8C7ry5sdjrX5nijf9thuc/0XlMjD1Z+q3RCEcPen1HDcBVXFzwu9IKZ9HB+e7gTJkyZXrm6ZkHhIF70Rz6XUETAOccKg4m6u8aRaKgnION7qBxB6W+ow5kP8HvkRTquFe5NApQHYHqcHKgcRPg5+Chg7kO/nmb1IVHwSrPDj6zXXXqOjCvkWnKp+rXI4tYLnKQah9Fjs5IN6rPCGRle3pvKZ2MkUNan6ss3p90ZjovHu2ivCvAQ9BQy7jTPHIqb3IWe997Pc4reYoc5T7mnMqyTPe1EpQjIEVQSe2JgLHezzubzfCFL3wBg8EAvV4Ply5dQr/fR71ex8HBAVarVbor1Z2tqkN3yjOadLVaJeCNdTB18nw+x2w2w97eHl5++WX86I/+KBqNBr7yla/g5OQkvc8IVALSAM71feScV2e2AroE6rrdLvb391PqZYJ4tJFms5lAd72rmTLQfnmXblmeAcSa8pnRpaqXfr+fwNvhcIjJZIL5fI6jo6Okl/l8nurg2GKEMVMtDwYDHB8fJ5C70+kkHnlnMIm6pn729vbQ6/UwGo2SzARsy7JMUboEYdvt9poeFTwmmFwURYpK9ZTl7DOCxexLjXDvdDprNkV5xuPx2kEEzpvNZjPJyXlS7+/l2GaUtx+S8DluMpmkvl8ul+h0Omtgn8qhc7feEc/vjGD2AyabgBraqh6k8LWCwIyncGc7XAdHoxFGo9G5OeNBKJoD9Ts/R3NfFfkc+HafbWqnag6OwDx+dlAranvT3K1gvfPi7VSBb8D5/QVJDwh5ncqH6kWBRF9XfM2Jyuh8tUl2l9vXq00H2XQP6bJ4fVFbTlV2FNWteyp+d5vxNcTtzfdU0TpdtbeK+t/b832X91tkL9F49PZdp/zr0cA6T2m9emiKdUYHK6r04rrXPbGPjeggoutfZdM9uP9/RPWi+vU6qtrLlClTpkyZ3v30mwA+CuB7cHHo2VUAPwngfwZwMf/veLapALb37gsIr5bAf/hfDtHqFdh/f+tt/d/q3UplWWJa8f+gt0V9nF2T/ShojnxNdqZMmTK9R+iZB4TVSaNOJTpNIoelRit5hAHLKGirzzWCVh1C5EGjhCMHop/sV141YsHfU2dRFDnBZ0x7CuAcgKb6Yj0awcZyUURnlWOM7+n9kfzN5fTn6uytctR6SlR19FGf6uxlfzsfyq87h6N+pO14VKcD3O7sjBxv6oB0IEV/90MHqosqsEBtyu1Vn0dObqXIoaqO48gRqg7LCCBSvajO7ucIX61WGI/HCZTjmNO+00MbGtlLEPnk5AS/+Iu/iMFggO/6ru/C7u5uAjiZ1lgBNQAJbGRaYpWf8hDs0/cYsT2ZTNbS++7u7uKFF17AD//wD6PT6eBLX/pSuoPXda/9oQcqCDz7QQ/aZb1eX4vYvHTpErrdbgJfl8slRqMRWq0W+v0+lsslDg8P0ev1Up0EpkejUYpi7XQ66a5e6pRzG4FVve+cz09OTtDv9zEYDDAej1GW9w7YLJfLNSf5anUWxcs7efmd9XJOmc1miZ/x+Oy0dqvVwmQywWp1dgfyZDJZ61/ScDjEdDrF/P/P3p8Gy5pd12Hg+vLmnHnH9+rVDKAAECAIEiAITqBEigNEAqRJtaiwTYmWKZI227LY7rYi3N22IxzhdnerQ5ZlS+qwFO2wJLY5hCxZJiVrIMGpSYIAUSAJggMGYi7U+N6dc868+fWPxDpv5Xr7y/eq6j5U4dXZETcy8xvO2Wef8a519j6zGfb399HtdlGv1zEajVIZSCozT+rQbDaTZ7qPwaybsizR7/fR7/exWCwwnU6Tjtvb26l99vv9tKGAYdG3trZSKO2yLLG9vb1GGiv5u729jVqtljZLMG/dCMH+SM9i2kW9fPmdGwhYF7rZSNsl65xtm8R9WZYp7DXnLp5TzTbBc6adqGPZlIynHiS/dRwviiLZlf3vxYiTdyo6Rm0a052Yi+ZLFd/0BdzqJehjJNPW+56epuPjcfSez7Gen9smmjeqnvHxMhK3m5e96nfkCRo97+XTOvQ2VWXniJiLbKjzgpOZPm9En8zL8/dnnQzXsnt5IztWPcM27vbwdWZkA6bttqpaJ+p6zfuNznfM15/x9YiXs6outN75jEY2cD2iNZmnz7SitU1kK+9bTtwDcfvm+l31r+pbunZ1+2veWbJkyZIly70lJYCfA7CHVajnyyAZC6xI5j8P4KeRPYVvI0UBHNwPfPojt330mY9M8Yt/4wa+/T++imtvuLuk8Eu96nnf2dkLf/kh3J1w0SWA6wCmdyHtLFmyZMnyspN7nhAGbgIuSuApeBR54qpHkgN8BMEjsC5auCiI496sBHSqiFKSFw4oEYxywM09GPk8QS4CQxHoyftMg+lEwK/m4QChe+BEgCPLx3cUjFVvWeqp+qvOfsaugoPMT4H1CGynLp6H6us2UNBQiRavc353UDN6RvNSezjA6fbVutN3gZvnXZPA1rI4IOv2px0d2KQ4qB3d93LqdW2jm2wTyXw+x2AwSPagV6qW3YUkFNM/PDzEe97zHrRaLbztbW9LIX339/dRliVOTk4wm81S/TEfYD1MtIK/DMFbFDdDMNMrlF7N9Xodh4eHKMsS+/v7ePDBB/GOd7wDRVHg937v9zCbzVLI6qIo1jZx6LmxFBLOqifbp4aK3t7exu7ubtJ7Pp8nL929vb1b+g7HwWazicFgkPLmecuz2QyNRgO7u7soy1VY5PPzc+zu7iaymIQ1P8uyTO/R67bX66HRaODs7Ayj0SgRsKxP2lrDR/P8Yno0k5RUkJ5ENcnI4XCYyk77TCaT5IVcFEUKwcz64jnAJEzb7XbyElbvLIbB5rP0sgZWmw80hLieQ82wzePxGCcnJyk9jkEkZbWv+BnSLA/18/GQenBjhBN0bFe0F/OnDaLIE2ozHZcajUbyFl8ul6n/6Hym44vqwXKRSGaaHKfUC1vnsLIsEyFcNZ48H3EyzckiHyuj96OxWTdSebpROipKzN1u3cE5YBPJE81V0XytZfT1R5Q336kiv6J1QRVBprJpPtA5KnrO5yGdq6rs7zZRPT0Pn0f9XnRd0/ZP36BVBYY5YRmV3/WPNpJRdNOArok9/ar60bJW5et66nrbbeBrimiNEdlC83Fb6BrJ9VZbRmX340RUTz7HzS9uf10n6j3vU1Xl9fWhp13VpyIb6PhVpXeWLFmyZMly78gEwL8CcOULf5dJCv8VAP8cwB8DyPNopVx5AGi1genkto8Ojy7wy//tDXzb/+kK7n9jq3Id/GLls4+PUL74fxtfsCxug3VVSh0rQvhuceX57OAsWbJkecXIZhTyHhAlKRXoYhhY9YxSEo7EioM2BFCUPIzyU1HQy8FcBWIciPW0qLOHVPT7np+Dc5rHJgCR6WnZCUzTUysqZ2QfJyccKCXg5sCeEhL6VwXCKkmnaShxrtcVNNN6YLn9mQiMV4DcAcYIIHUQ1Num1k0VeOqLY69zEmneZtQOTqywfqK2pYCttwsvo4Of/l311d9qg6pyqpAEIiHKvuzl1T/2c3pCPv300/ilX/olfPzjH09hotvtNq5cubLmwake7tykofZUz2Tqoe1WPUtJZh8eHuLo6AjL5RJXr17FO97xDnz91389er0eRqMRzs/PMRgMkrcqyTL13HSba/1puOiyLFPYZuBmuOJWq4V2u53aSqPRSN7SW1tbyetSvUjpBcrw27rJhnZnmrrBhIShhkImQaqRFeglzXbDdOgtTG9gAvxFUSS7NJtNdDodtFqtRByT2NT+SmKSZDHP1D0/P0+eyxzr9Bxqpqvn6nLTBcNls87pdc3nSNYWRYFut5vORd7e3k5nKpP0JHnL8rPN0auW91qtVmqn9IDf3t5OJDvHkU6ng263uxb+vNFooNPprPUPlsX7km660Hri82yL3IBAG7sHO+2qobr5rm560PbIDVjsAywDP5fLZbLf3RKdQ7S8ETGq5aoicqI1gc8TnmY0Lvt47OOm6+Hzim+civJwL0VN15/VdFzPKG0nGL28bittv1VrGW1vnn9kD5+L/PlN+leVh89GxLvP637dpUoH1U/r9nb6V21c27RWdH031Y+/q2uhqG/o5hZ/tsobWNeS+i7LEJHqWn79rRsbeV3bvNon2hzh36tswDJF61Mtt+qu80xU/3rd/1xoTx2z1V6b1lpZsmTJkiXLl7Z8DsDfAfA7uDzf0ALAgwB+CMC/A+CBS0r3HpR2B9i//44fHx5d4L3/wzFmo7vnxzs5fenY4MPFAocvNKrVgwB2L1WdmzIGcHSX0s6SJUuWLC87uec9hAnAaGhKAiFVxGAEqjlwSXHwUT0yKREJ7ICYejY6kcLrSqo62BwRntRPwUJ/Vz2PNB2CRFqeCISMAEf3ZGIaLLsDuqwjB7iqyFfNk/l5HbmeEVioevA9gnVKcHl6ChiqDSPd1M5aJ6qXipehypNF69vTVV0j8NNBQ7evpu/gYkQEV5VLn3HgVJ93oT1dt0hICtdqK09W92pnWgSr6U3ZarWSbp/+9KfxC7/wC2g0Gnjd616XwvTu7u6m83FrtVo6b1dJV7YF9fx0OzsRDaxI2tFolN4/ODjAfffdh6/92q9Fu93G448/jqOjo5B8iDxEi6JIhB11Ua/aTqeD7e3t5JXLc3mXy1XIZ5LM9PxkP2UYYABotVro9XqYz+c4OztL59kul8tUB2W5IgKvXLmCsizTma4MQU2iE0Ai/OghOxqNEvmphCFJQQ9HzHNyWe9FsSJaSUTyfYZArtVWUR94bm6z2UwerWVZYjAYoNPpYGdnJ53hSxKXYyE9g2lvrRdtt9SVbUk3G9Fbm+kxhDQJ+6K4GXpcPb5brVYK9cx6b7fb6PV6OD4+Tm2P5VFSGQDOz88xm83Q7XZTG5xOpyjLlWf7dDpNOinRyf7UbrfXCHbqRM9c9WRn+qwDtn22Z/Ws1/FUPcIZMloJG/W05nOz2SxtCLhMicavaA6vGkt1rvGxsopI9ms+Vzpp5u/q3O3rAk23itCKyu/f+X4036leOkbp9Ygoc3tE85vfv1NxXTddd/tUlR24lVj1NU1U396mVPS3rinUHtrmquwfldHL6+lG5Y7q29c1XrdRe/d1mtYfr+laa5NdPH2d35mO109kK6+HqGxeX1Wi6w3fJFm1hvL0uNZTG/rzPt5EfdfbA9NT+zBNt0/2EM6SJUuWLPe2nAP4J1/4/jW4PBfLFoC3YMXU/RyAj+LySOd7RGpbwP0PA8989o5fOX5ijvf+D0f45v/gAI32veXDdLZY4OSF/N/aAPB63D2XrskX/rJkyZIlyytC7nlCWEEmBUkVnCYAo+GhSao4MKPvMD0CLn6mV0T2OfioIIx6rOk7vntfPRSjtBw8ZDoEgSKPH34qCK/XHaRjHkoo+z31GGRa+izvOzDFTyd6HQiLADy9rh5vmr7aVuvPy6dlpL4kN6rsoOCdg3ta9ogAj7yV3P5OyGrZnJhW3R0wVLtF+UV21XqtypeiBI8DopsIiE2/I1kulzg/PwewOpNVw/FqmZVAajQaa23o4uICH/vYx5Jn6aOPPpqIQQA4Pj5OBCHbE8+XVa/ysrzpecprek4qCTOSYTx/lvV0cHCAa9eu4e1vfzu2t7fxW7/1W3jyySdxfn6Oi4sLtFqtyv7C842ZHr0p2c663S6azeYaocn8OeacnZ2l6/QcZV2TOO50OhgMBqmsJLp51i6f07Nla7VaOsOXwnK0Wq1ERgNI71y5cgVFUSRCW8cv1idDC/PcX9qVdVKWKxKz0WhgNpthNpsl3fr9Pra3tzEcDm8hSfv9Pmq1WgoZrv0fQCLCaX89L3k2m6Vzlrl5oFarJe9fnv9LsnQ6neLo6Ch5HpflisglUcu6WS6XqQ7Vw4xpj0ajtdDdwIqU5vnDvK7hsmlLJax97OWYRDs3m82UjoaMJpHsZJOOmWxrahclgHXMYP2pBzdJZR9HNVLAZUgVSaQSjU065rj3YnTP5yVv456Pk0Gap4+xvObrCx/T+Wy0kcVtEtkpuhal4bbUNYGTb/pd5zkvO69FZF60XojmOv52z09NX+vB9XU7RuRj9J7qqCSip+FjT5RfpIuvdW63QcDXpsw7Ih836RC1W03T65NpOdHr6ztNw8sXbbaL2q/qVrXRTp/Xtbyn6esi7ctO/mu+0fytayevP77j9eP21vbha3y3gdq2qn6zZMmSJUuWe1OmWJHCTQBfdYnpFgCuAfhhAP8SwK8BeAnjEb8c5dqjQKMJzGd3/Mqnf2uER9/Wweu/pXtPrVMmyxfYNr4cq+Ow75Z8/i6mnSVLlixZXnbyiiCEFXhTgEQ9jzQUIUEePkNgCLgJUvOegjwK9jgoSIDGPSEUNFciw4F1B93cO8UJRgeIqIcCP+597GV326leDqoq+MxQrQpAKkBOUWDKAV8l3B3UigBF19EBQyU3+B7T1ZCbABIBUwWSKxCtdcA/J9xZdgdUI+LBAUbmx/p1UNzFiW1tU/qMkuURARCB3bphIgLGtdwRuOykcVR2TedO5eLiAqPRCPV6PXm/sj26jd0Tn16Uk8kEH/7wh9Fut/HOd74TjzzyCNrtNvb29lCv13Hjxg0sFovkIan9rSzLRFrRtupFrGQfQwKTCFssFpjNZsnDc29vD/v7+/jKr/xK7O7u4kMf+hA+/vGPJ2KUXqkkdnXM0nGJhDDbA4nyXq+XSES2ez17lffUM3YymaT+SKKXxNx0Ok3n+dITdzQaYTgcJm9kem/SRo1GA91uF+PxOJ1jvFwu0e/3U4jh2WyGoijSGbtaFm1L9JBlv9NQ0oPBYK39sx/u7+9jd3c3kc+dTgedTie9x7rRs599bCLhy/saGpnezMvlMtmB93n2clmWabMAieLlcrl2HjSJZveYVTsw7+3tbTQajeRlTZ3ZTkkOazhnPYeZ5137nMV2xv7Pumd9kwDXsNbsb2yrDI0NIJVJvZe5SYO66ZxMu7EN8zrb32g0St7llylO/vgYFZFx/K7ztXqGK7nDsm9Ki/k5WbOJUPRNaxFppmn499uJk2q+FmC+0XtqG03HCSonwqKyR9cjG0TPOtkYkY+RjX2ejIhC18XT8d+b5nNfc+g1XatVkYX6GYUxrrJLlf7RmkDFbaTvedre9rUM2la5TvE+GPWZCCj0dqabnKqe9zJEa0e3m2+8i9q4l1fTj/KNNilE4w/t5PaO6sP1vJ39smTJkiVLlntPpgB+EcCjuHx2rQ7g3Vh5CP8asqewSLcPPPga4HMfv+NXygvg8Z85wYNf0UL/vnsHtn7/2dnzbxn3A3gNLs+x3WUJYHiX0s6SJUuWLC9LuXdm1g3igJSSJwRzFPR2QFe9bBS80tCtzIcANt9Xj6wIWOb3iBx0oEbBQdXVwT4HCBWs5/uajl5XYlzTUh2rQCWmq8ShnncZkayaTuQpo2RqBPqqvRRs5rNaR2qnTXo4aBhdVy8vBQRVfy8XwU0lJhXwVDsqoBcByEr20D6ah4oS4mw3CpC6VAG+vEfdIo8z947Rd5TojshjL2sVsRDJbDbDYDBItnVCjHpqGyDRRk/V6XSK3/7t30a73ca3fdu34YEHHkhn1u7t7WE2myWCL9oMEoG7GiqX5KmSXGVZJjLs8PAQg8EAu7u76HQ6eOyxx3BwcIBXvepV+NjHPoann3567ZxUpukhiQEkz8qiWJGQ9O7l2b7aNql/URSJ4KzVaonQK4oihY0muUsyEEA6m5bhpMfjMYbDYRqfSPRpvhwXi6JIpCJJa+3H8/kc7XY76cM6rdfr6Ha76Y9hlLe3t1MoZIYS3trawsHBQSI9e71e8kwmmXzjxg0sl6tQzrRLu91OZLieEa39R3WivafTafKW5fv01GVY5slkksJo9/t9tFqt5E1dq9USgcr6YR7a5tTTXQlW6lCr1VJIbaZJ/QeDQdo4cXZ2tkYGsz1RWBaesd3tdtfmUN8ooOG+dZzUsVbfYVvwjT/alt1Dsl6vYzKZYDabXap3sOYBrM/BEWHi5FRE2HgaTjZFYyCwvpGLUkVOVc3L+p6XLfK69Xk1Gif4WzdbbCK33W4+tqsNozWPzo1V5XObOtHoBJqL68P5ym3r+vvmp6gdRHn7ejSylbcLXx9VbS7QZ1wv32zmz2wiSl28bqL1gD6n6w3vE3w32kym31U397CP+pFufuM7ug71Pql56pppk01Vr2jN4uvTaEOh6qxrK6336H8HFy0/52/PJ6oLbxdZsmTJkiXLvS1PAHgvgO/G5TNsDQDf84V0fxPAnXvE3tNSFMDr3gw8/Znn5SU8OrrAR39pgLf/27sb10BfSnJRgWdVShfAV2DVtO6WzADcuIvpZ8mSJUuWl528Yghh4NZQlCQklKxQMs1BKwcBFWxS0o0kAUEXJfwcgFJQSZ9VMFKBIicZq4BJBXgi4EnBUgfZHBR2srHKe1ZtqPejcjlorISWAoQOiLF+SPQq4a468jrTdM8/BVKVNOQ1Ja8c4FTvT73OZyOwT+2pJI/mEZECCh5q+1JCkvm7V7brr6C2bnzgda1bJzqc8KSeqkdkCy2PA6HMm/Wj73sbiWzqQhKM5Bd1Yn0psaQhctlfy3JF2P3mb/4mdnZ28E3f9E3JQ3h7extFUeCpp57C+fn5LaQKveLpXa4hcYGbIYJZTxoCl+WdTqc4OzvDyckJdnZ2sLe3h+3tbbztbW/DI488gj/+4z/GJz/5SZycnKx5JAMrEo/1RA9M6kKPZpKz9AqlTgz7TIKQ5/rW63W02+3Up/XMWZKG9Xo9kZ3L5SqsMb1HgZvhlWlzkous3/F4nNJqtVoYDocoivWw1SS91QPbwX/qqd7bvV4vhcEuigLn5+dot9uYz+c4Pz9fqysStbRHrVZLXtlsVyQ62UfokUuSvlZbhcYmAU7ynGf90huYntSnp6cpXd2YoKGjy3JFKpNk9nGSHtf0qKZXrc5J+lxRFCnkM88snkwm6Pf7qdzqxav9sVarodPpoF6vJ8K90+mszU1KLrBsGvZa+x3HafZx36RF++kcw/em0ykmk0k64/uyyYyIxHMyyMdIJ5IiojVKU8dUTUejEGzS7XbgiOqq6fsGKicdozJV5VlFGALrJJkTbPq+jgtVaxZNV5+PPHgjfXUuieZt1SUSXxPp3BfN4T5H+wa0SBfVN8rH9XRiz+uZ+fK5KtLV2/ftyuTvu/5ap9rmoo0IfEffi9ag+tymtqrX/Dldd0T5+ponWq9u8hjftE5R+6ltnaD2dWHVukifc328vH68hb7H61myZMmSJcsrRx4H8AYArwVwayS7Fyd1rMjmLwfw0wDOLjn95yHLEphPgXbn9s/ebenvAa3O8yKEAeDjvzLEY9/YxcGrG5eyXpmNl7jx6TvToQRwbs4WL0ZGFxf4zOR5HNRbAHgz7m6oaACYIzu0Z8mSJcsrTO55QljBal1A6FmjJDsU1AbWvTIUbHGSjoCfkjuap3ol0LtQvfcUrFFiWcvgICLz4bPqLazvK2Gsv52YI5mgejDdiGR0G/MdAvZMX8laB/ki4M4XeUpqR8Cyg+XUWZ+vAsq0POrJHNnby6jlVjvytxNWvM7653UNs6qfKsyT5IieIRp56t6JeNuOiHon5VXHTd5rDm4CNz1z3BNQy+f9NAKNbwe2TiYTNBqNRD7qGcYaglb7hQLqy+UqzO973/te7O7u4iu+4iuSB+fe3l7qHyRHtf5IgEVEr54jXBRFIhJ5jfXKdE9PT/Hcc89hd3cXBwcH2N7expvf/GY8/PDDePrpp/HUU0/h5OQkkZG0O8k82prpHR8fr3mUs+wsM4lK9+hk+fR8Xg0VS73H43FqR81mMxHy4/E4Pcf0GNZ5MBhgPB6nMNZKJHIsaLVaa+MCbcuzdFkfPAN4NBqlEMw7OzuJLOW5uiSrGTWB9cLNImVZJqKc3tKLxaKy3TabTUyn00Sy8/zfyWSSCF5tG/SqJsE9n89T+2G71bZJm/LMYoZ5JgFOr2KS7svlKvyybvLgHMM20ev1ACB52TYajUTadjqdtY02PLea/Yh16JtSWL8MH61zk26SUmGf1P6j85aOdboJgKG2R6NR8hK+G+JjahWBxWd5zdPQ8bCKAANunXt4P1pDeB5OEimpVaVrVEYtQ1R27wOqt6+xlOzUjUYRiRbN0VH+VbpFbcvtrfbQecrz8Pw8Dd+8pCShE21ap0raOSmn6TpR77pp+m4Lfd43BXo5omvaXiLyflPdRQSr67dpk2K0KSyqD9elaj0WpaF6+DpNdVd7eDvW+tQ0tH59ncu1H/PyTYj6nufnZY3qxevNbeQEtq/VfH2dJUuWLFmy3PtyBuD/A+BPA/gO3B1S+MsA/LsA/gWAT19y+ncoixlw/Ulge++lyf8SZHR8gV/8b27g639wD6/+ug5qWy+cFF5Ml/iDf3F+x4TwEsC/PjrCazsdtIL/g55X3mWJf3V4iM89H0K4hVW46Lu9b+85AJcbcCtLlixZsrzM5Z4nhIFbCTmSCEqiKvBMsEXDpzIdAidKdiowxHQjIEfTdi83fZZpuieFA7JKBlL0rFm9T9LZQSonAB1wi+6rHkqwOQGoOgJYIztIVBTFuucm84pAQb1P0fC9ShqpN4zWkQOS1Nu9eKre12fUJg6AKuDG9NXbzckOipKjSoSpjlpO5hWloxsctB4VlCapprbhdScWorQcRKyyB/Wl7UhOaVuJbOh1vokYYFrD4c0DUDqd1W5YbsBgXyfJp0SXeoAeHh7ive99LzqdDl7zmtekceLg4ABlWeLs7AxlWaa0qBsJX44P2i94j6QZPRuVOGRfWCwWOD8/x/HxMW7cuIGDg4NE+h0cHODq1auYTCY4OTlJxCrJX3pvstwAkufx9vZ2Iv2m02kiEMuyXCNIl8tlSm8+nycSl4SnEpysx8Vigclkgvl8jkajkbxHASTyk8SmEoW0C0lpEqsA0G63kw4kKHke7mQySV7M9HQdDocoyzKVkcQ8vXQvLi4wm82SHbQNa8hnng8cgeY895j1qqE5O51OKuNkMkn6kpwfjUapf9ELm+1UPfRJ0rO96rOsLwCJHNVNStSJ4bajcNW0M72J1fbswySodXxRT1+S62oTHUd5NjX1po0iz1Qdd3yTjI6jnLsZDpxncr9Y8XlvExGlZdHvHKOpc7TBaRPBpulEukRemTof6Dys87w+F42r0VwbkX2+ZtG5JCpDld7RO7oZJLKT6+U6uP5aXt+cpe1K7ezldcLR5zonAH3eU3EiUa9H60svt953G0bze9R+N9V75LHq7TD6HvUNXbtGGwh0DaTrndu1Wy9fdM1t5XasspPWd9U6z9PRPq/9Xdudb/CM2gafi9qGrtWYh0vVWsjXhFov+n2TblmyZMmSJcu9LRcA3oMV2/btuHxSuMDKA/mHAPwdAIeXnP4dyvF1oCyB4P+ZL6qc3ACmz4MMFTl/doFf+Vs38IZv6+PN7+5j75HN3sLT4RKTs9X/iNc/McPxE6tN2M98ZIrrn5iifB7/Pv72+Tl+8pln8N1XrmCnXkdv6/m3k0VZ4p/duIGfu3EDz2sL3gLAOYArzzvLO5cSwNFdTD9LlixZsrws5Z4nhJ1g0j8FQwhyc2Hh4dX4PK8z9KmnRSLNPUHdQ9f182tlWSaCimko8KMAlXrXOTDpoBBwq7cwhQS4exlT3ANEgUTe1/wj0F8JaiUveIZlFdnnpEFElrpt1JNC61a9rVQf6qxhTCMAOgLtHTT2OnevLtrGr+t9B0uVXFYvYV8MO8hcBWqyPqpAWS2TA5badygOlrINOTgaAbjURevM82Mem4B3YEXsjcfjRCA66UuSTdsvvXSLokghhD/3uc/hfe97XyLGimIVmvjKlSsoiiKdSVuW5drZ0LVaLZGtbh8SqUoAkyAm0cnzdDudDkajEa5fv55ITNq02Wyi3++j0+mksMTj8Rinp6c4Pz/H6ekpRqPRWsjqz372s9jf30ez2UxnAtNjlzamzeiBurW1hfF4vGYDlrnT6aR3fdwjOaznCXNMI7FYq930mC6KIp0F2+l0EjFJYpPthiQry9TpdNDtdnF4eIjr169jOp2i0+kkglxBew1pz/Ogtd2yXkajEc7OztI4o320KFaE8cnJCR588MFE5p+fn6f202g0sLe3l7ySa7Va0hVYEbrj8TiR8bR7Wd4k5Z2coS18Iw71Zvuj5zRDhnM8I5FLj2ZuCOh0OtjZ2UlnMKsXPW2zWCzWzngmCazjvW6c4j2fU1X8XHtNR/N3QoQ68ixuDcX+YsRJIM27ilDUuUU331Ci9DQNrV9/x+dAn5t4z8dqXXf4GidK29cVmq7qGo25EVGn6TDfTZumfJ2gYfA3EV1uL7e3z4tOZLvonOTjttqgao6L9Ine93nTyxh5m3q5o/WU6hfNq5ENddObvxutf31+9nddt6p2pn2a93XNErVfr2evD++z1M3XTlHdu43dFlXrLCXN9dnIJp62pqF5ePl0nazh9vUdfdaFdqnaOBnZIEuWLFmyZHllyQWAXwDweQDfD2D3LuSxDeDPAvgHX8jviyxPfxY4PQT2rn7x86bMZ8AffmAVvvoFyvIC+OgvDvCp9w1x/xtbeN2f7KHVvbn++ewHxxgerf6/HN64wOnT8/Re+SICoZQAfuXkBL9+eooHmk1caTTwWLuN13c6OGg08OAXNs7Xg/VUWZa4MZ/jJ599Fr97fv78a38B4BMADnD3vISneMn2KmTJkiVLlpdO7nlC2MFWgu1OeCkYqeQBRckkBzIjTyDmrWe1EixSgEi9ABywiQBdJe0UqFNCRtPSMjjIpXbx59TjQYE13vdyaVoKpOv1iKjUPLXMtJ8DkHrdbVYFlCng6ISjkw2qm76vz3r9aRldRz6r5FQEXnpdudeJ1pOTwVUgtQOzkbjODtp6Hg4uq+0c4NX0N3nYOACr6bjnEiUCV1VmsxlGo1EKX6ze/NoWVDeWn4TxdDrFRz/6UXS73bXw091uF9vb2xiPx4l0o3ck+2IUgp750qu1VqulkL1lufLgbLfbieAjeUdSWMlSXm82m4lA63a7aLVaSb/BYICzs7NEjp6enuJTn/oUOp1OsgfLrCHsldTudrtrfR0Atre3185BJjnNcMYkiU9PT1EUKxJ9MBig3W5jb28vkcwkhefzeTp7l5tq6LlalmUqHz1v2eZoX3ow7+zsJOKc3q8kXTW8ND1Wa7Uaut1u8qguiiKRwefn5yjLMoVnXi6XSefZbIazszMcHBwkW6pXtW444HnCrGedX2i7drudPKG97/B5el2rV31ZlslmbJ+0GcnodrudQmZz7FASnsT/aDRam0vYDkjuz2YzzGYzdLvddA4z+xnbN+1MYR1puOiINNZ5REkQPkd9eJ/thd7wL0Yi4sbHJn9eP/mejs1OFPn47Xn4GOYkk3+Pxkyfn13XaM0CrK+PqnSI9HE9/BrHUb6nc7+TazqX6fWqdZXqp6LrFV0beR6RDaM1levl9eFzXpVo+3IdNK2qduBrhKjNRvmpjTx9JRqjudffjfTXvCISnfd1rtX24faP9I+u856mGbWfKltFdRq146iOozaj7+ifb0iM1rieZrSx03V2ifJ0cv12fWnTGjFLlixZsmS59+UCwO8DuAbgXbg7nsJvAPDNAH4NeH4+oi9eFnPgDz4AfO23Au3uFzdvYMXIfvg3gaNnLyW52bDEE78zwRO/88K8jV+IlADmZYknplM8MZ3iQ4MBAKBbq2G3Xse1ZhNv6naxX6/jK3o99La2MFku8YnxGP/r9ev49PMJE+3yDFYRzu/GXgV8Ie3RXUo7S5YsWbK8bOWeJ4Qpeq5hBKJVgUkKKCoJ6UALvd4UUFOiTPONADsVBST5m/poSGgKQXPNU88C5rN6/icBWoK2mq4DXk6iUieS6+6hrHpRByd/mb/XRxXAqs97Gmpvfo/S1HsOhDvRouL5OpAY6RuBx1Xgo0ukYxVx4XlWAfy+2SCqZ81Dy+xe1O7B4/qqfhGBrLpW2TNqT88HhAeA6XSaPIWdKNBw3bqZgu2g2WwmMuzDH/5wInDVK3RnZyf1+aIoEonJvkRPVO0fer4wPVKpH8+iZXr0NF0ulzg+PsZ4PE5hj3n+K0lkhs/tdDrY3d1Fr9dDv9/H9vZ2Io95LvH999+fyNV2u42iKFJaeo4tIwb0+/3U31ge9QAdj8fo9/uJCOb7tGFRFMnruNFoYDQaYTgcot1uo9/vpzGJxCttSVvQ65U2Y6ht6kTiej6fo9/vo9frYTabJS9cJYWLokgEZaPRSN7GJHu1XPzOMNj0rKWthsNhCp/dbrcTSQ6sNoCQSNXzrJk2SWu+ox7rJNNoBxLXnU4nteHZbLZGZHPDCXW8uLhIZDXHfZaH4adZ73pWMoDkic7ren4082N/4Sf7IzcoqOe8eglr22Fb0fmKNtDztDnm8PpwOMRkMsFkMrm0cNERGVc1Zm8iiyg+Njq5qPlQfI7cNM75eKlzYeQNG5F6VWOvz/vR2O66+z1f+3iZNq3FeN/t7EShrsmi9zVPzcvnvmgu9PqM0ozK5BLZ39eIWqaqcvDd27W7TWuf6L6uc73NeDmi9hu1J2+3UbuI8uHY6Pb0591mUV1FuvgRFVF5/LqOc25DzTda42p59beue/RZHyv4vG6aoei47O1Iy+B1pO97/7ndeipLlixZsmS59+VXAewDeAcu3x2zDuDdWJHN7wcw3Pz4ZcuNp4AP/irw5W8DturA7gFQFACKL3zeJSlL4KnPrP7uQRktlxjNZnh6NsPvDQaoAWjVanh1u43r8zlOFwssXuwa6wIrUngHd8dL+PpdSDNLlixZsrzs5Z4nhBVo178IyCJ4rmELCZI7eeneKApoR0JA3kEcBXT5voI3SuxWAZEqCh45IOagrgNs6lXgYFlETjqgG4FiCtxq+ryu6VaBqw5c874DXvpe9D5BtDsBspmGhtVjPSvw7vkzDYKbEZCunnwanpr1pmRodM6uth2tJyVQqZOSNXzf60k3Cmge/K1tXz1QIi8jpu+6eQjKyCZRm4qIBS9rlZTlyvNRz16l3vROdZJYw+LyHNvxeIzf+Z3fWSNri6JAr9dLfZoEFtNtt9sAsEaMeX9nW6I9GR65KIq1kMpXrlxBrVbD+fk5JpNJSrvRaCQP4N3d1ZbRw8PDROIqkdpoNNDr9XB2dobj42McHByseZ/yTFbd9DKfzzEcDtcIa55LSyKY59LSe5mezbRBUay8ZOlpSxvRk7gsb5KYPKdYPalns1kir3XzCuuSpCG9uC8uLnBycpI8Ylmeer2O6XSKXq+HoiiSHsPhcI3ApHd2p9NJnrUk/WkTlnkwGCRCWccU32DATQDUn99pG5KzPJcXAFqtVvIg53nXrVYLy+USg8EAx8fHax64AFKZWd5Wq7V25i8Je+pWq9VwdnaWPKx1wwJtzPphW6Su1KPVaqWQ/+rJyzOstaw6/1EHnQciUqNer6/lyfDVDBn9QsVJQr2ucxZwa1heHZ99DvN5iuLvRCRMFXHp+vG9iBCrIu6iNID1DVDRnOkS6e7zvD/vZYnmaNVd7R3N+XrdvY6j+chJL9aFP1dFQEY29/Lfib2q6sPXonzWycSqNDa1J7d91Md43duz29jTVz31t8/9nm/UzqN1g48J7j2r6er6gTpz3vV27eWoKmfV+lLtpDZWUl3XKLqG83Wv5sPyReQ8+5Z7/uq7m9prVd+O6ipLlixZsmR55coFgF8H8FYAvbuQfgPAdwN4E4B/BeCTdyGPDXLjKeA3ngKKGrCzt/rcv7Yih7fqwLWHV+TwVgN4Aefk3iJlCTz1aeBDvwFcLG7//D0gSwDj5RIfHV2yy+2nAbwKQOdyk0WJlYdwlixZsmR5xck9TwhTlBxQ7zIFpdXjFbjVayMCswimKLkDrHvcVgHMDlJq3gp8bfIUZRoR8edgEkW9A9SzWIkCB8wUONRyOeCkAJN7LXkZNX2vJz7PNDVt18HrSwkZBRFZR0pqapoOSGsZIrDNiQKWU22mgCXP3vT24+A+yUO3kf+pjbT8RXEzNHoVKOpAoIO6/PTr7l2j+Xpdav1HaTvgr56Dmpb3Owe9HaRWmc/nGHwhpE9Zlol09HTZbjgmAEjkVq1Ww3A4xAc/+EF0Op3k6drv95NnKklFbiAhuUfP0cVikYgttk2SZgpuk/xTwrjZbGJ7extFsfLoJFlaliVarRYGgwFOT0+xt7eXngGQiGMSq0VRoN/v4+LiIqXD/kNSl/nXarU1L1WKbpDgs3qGLcMfs05ardZa+GSeu9xut9HpdJKHL+2g+bItkPxlmkoun52dYTAYpPOUz87ObulzZVmmOuNmDNqaZPh4PF4LC067kQQlUXt+fp5IVJ6NrB7FSlxsbW2l9lKv11P67BP0wFV7Rv2DeTFE8mAwSPVJD3PmTS9vkrQke1kHTJMbC1gPbP/clKAhrlutVjpjW9uEErUkpT1SBe3P+uB4pEJ7sZ2pnlpnHir6xRDCLptIu2h+0md9DI/GpKIobiGttI37e/7d8/Mx0ed/bYubyuxzgeutpJefux69r/pFtr2TMdy/+9xS5RXs7+u85Gsvt4Peq5orvT6q8o3e9TJovVQRkZ6GXvN3ojm9ag2naUTrj6r5tCr9263n+G40j/vaTec9t4Pba9O6IMrb13hRu4ps4eX0+qzaaOnPqM1842HV+5ybKbeLIhDpqu066qO3a9dZsmTJkiXLK0ueA/C7AP4E7o47ZgHgtQB+GMB7AfwSgNldyGeDlEvg9Gj1/eTGTb2arZV6e/cBvW1g/z5g58pNtXs7QE2I4k1rh1LI4MXl/c/2ipURgM8CeCMut1mOAdy47VNZsmTJkuUelFcEIUxwREFxAivuaUjgFlj3JlFSTcO4EYx1IIkgveahoI2DekzPyU4FpRS4ZDqUCGzX9xyAdOCReRP01/MjlXBw3dSeVWCf2sE9W2lzry+1Z+SBEv128E5BQLedk+EK1mtZPV397qQt73sb8/bA39qmIoBSv98OMHfAWsvvdnUg1gFltqPIG0VBzQgkVzJI7a/l83bOPCIwlqS3P6/1r7aOhB6OJOPoBUwSSvUkcUsiivUEACcnJ3j88cfR7/fT/W63i4ODg0S+kYjXfuTl4IYFEoD8TS/ZsiwTATcej9OYtL+/j8FgcEvY+L29vURK8xzdyWSC8/Pz5Nmp3p7aBgGkM4BZbvXw7XQ6GI/HGI1GGI/HiaDu9XrY2dlJRHJRrMg/nmM8Ho9Rr9eTR25Z3jxHd3t7O5GRPAOXXsR6hrGOzVtbW1gsFmg2m8kr9eLiAqPRCMvlKozz9vZ28qxlfbOut7a2Eqk6m80wHA5TeyPBSHsDQLfbRbfbRb/fT3VG+5DUJilLvdieSJryea1fXiPQT13pycs+R7sMBoP0p/XI/Hzzim5M4h/foZ7cIME2XBQrgrfVaqEsS5yfn6f+xk0FtNfOzk7yNma9Mw+WiWX132xzWj+6OUt11nbKTRbcyMD6ejHhop08cgLNyS8fSzUdJ8f0WR9fo/R9jvcx1sdJ3zTmYzm/u54RWeTPbrJLpK8+R3FPT8+ryja+JnB7RIRVFTkcXXO9IxtFc6neqyLR9B2P6qHp8x2vK19jaDk25RnpX5VnJNGc6veB9WMjvM60DOrVqzq5ztFz3k90fIv6ECXahOfrVBXWj7dFr69ofaprvypbR2XXyEDUyYnvaMNo1Gb0Xf1fJbLPprbiv/1alixZsmTJ8sqUEivv3dcCeOgu5tMF8E6sQlT/LwCmdzGvO5ESmH3hnNtnn7h5Oa0tipUncX21SRr79wF7V1ffG03g4P6b71xcAE9+EvijD2Yy+DLl0wBejcv1Eh5i5RifJUuWLFlecfKKIoQVjPLwc04gAjfPNNNrEUBFIEfPE9VQz/xUUMjJNt5Tnd2LwEErJc0UUHfy03WtAqGZj9qKhIHqrJ5sCsBRVM9Ipwjs5ne1mz7LPBTsY95qM6ajZ1NG4HUVwKZEhZKiWhYnCiKAXevPwd4IYKQObkdtk16v2jY1T/f6joDNKoJDdVTyQQFftWVUripQn/WobUb7h9ZnFUnhfTQCfCNRz8mI6OYn+ylJL5J1JCSffvppfOADH0Cv10senzy3dzweJ1JY26nWFz0ca7Wb4YDpQUqydTabpXbL771eD61WC71eD6PRCGVZotPpJCKTnr8sEz0zmVez2Uwhg0mm0ZOX/YXPkBRXT2T1dlYiSkNij8djDIfD5LXabrdT/hq+mGGgGQKZoaVJsnY6HXQ6neSVW5Zlqgv2SZLPembt1tYWDg4OUlhn6kWynKG9abNGo7FGLrKuWq0WOp0Out0uFotF8rhmyPAHH3wQnU4nXSd5S2FI7KIokh60L3Xg+cEsH3XQcW+xWOD09BRPPfUUDg8Psbe3h/vuuy+dDazey9xswzOmac+iKBJxvbW1lQj0brebzuNVr2jWJ23GOZBnRzMkOG2lZdWNP7S39lElQLR/+2YrPyaB/Zt1RVL/MiUiAVWnKvLQxyn2C91gVTWOR/OmrhOcDHKCK/r0+cU381AnzdPnKBVf++h7/HTySue96J3I01LFibDI7qq73ovS8bT0OV9jub30+dvZyp9Xgi+STfWm+XmdV815mkZkvypy0NthtD7zP13fuW1UovWyzouet69ZvY1ru6oiUKN+HK1vPU1vW9F9T0/f837iNonalIrXv64/NX/f0Kn9ym0dpe/jEDetbdpUlyVLlixZsryyZIxV6Oh/E0B1tJ0XLwWAr8GKhP5f8EX3FL4TSWuWUryJAdx4+ub3Wg1od2/+XpbA5It8RvIrQcYAPoeVl/BlyQ2s4lxnyZIlS5ZXnLwiCGH30FUPAQ3bSvBFw2FGgJfu6gewBqbQw43etRGg5ekQEFeCrwrU0bScdI1IWF53QlrL5p4KUf4OQimQpwAY31fi0L1K1A5aDk8jOl9XQXf1IFG7KPngaapdWOf628FDB/41P7ejk6Wev5IE2gYdyPN69rpnOjxn1oFBzUvtquWPAF2K6qf3FMTlu56We8ipXbw9R3aPwHt/twpM3fTMcrnEcDhM93n2K4A1Ys69uNWrmCTXE088gccffxytVgvNZjORk/fddx+WyyXOzs4SOav20PqiregJub+/n4g5EpVlWSaCmIR2t9tFURQ4PT0FgOQpS/JPwV16G1OPxWKRwlyTDOz1emi32xgOh0lHjn9luTqDeTQaod1uo9vtroVJJnlHL2sSvDzztyhWnqeNRiORrCSNh8NhahdMj0T8dDpFu91OpC1153hA8pdE/NHRESaTCY6PjxPJPR6PMZlMMJlM1sYqEsI6hrZaLbTbbbRarUSsMx8S8hybaddr166lfJ599lnMZrO1tkuSlGXUUNFqO473ShSzPsfjMT73uc/h+Pg42XFnZycRwmx/RVFgOByunf3LdHjerkZ5ILHPsrGu6XWs5x2zTXY6N7cis82yX+iYQL0nkwmK4mbI6GjOJFHtc4uOLZwfGcaaZ12/GO/gKtGxQ8d8vebPR+OOEtw+DwM3CRjPNxr/fOz0cdzHu6rfVXn4fOwkXLT+0PTUPpp+Fbmm6focxfK6+FiuNnVvaa2PaJ5Q/VUH39QVlbHqflQ3Ubmj+qvSS8cn3URRRQx6vTvRHdkuKiftEG3KiGzq/SSyl9aTXtP8ojan9ePrARXdgABgbezS9ZavN73eqnT0/KN+73ZQfSKdo7UQcHMtrm3SN7BRV7/uaXv+UVuMNq5lyZIlS5YsWQDg97AKG/0wcFdCR1NqAL72C3m8B8D1u5jXXZLlEhgNXmotXhlCL+H2JaR1gS/J5pYlS5YsWS5H7nlCmKCHAmsEu6LQpMA6meZAlIeTVpLPAZrIm9JBSwXNHVRyEN09I10/LzO/83xHvU+CmL9VLyfptEyap6enoHdkQwXe1OM3yrMKWFeQT/VWYEsBeAe99boTFQqgqf0joFfrlL+VWFSbuJ1IvPG36l9FjEQAopJ9Tow7aF4F9Hs6LHdEtGt9qR5VYK2CjArYF0WRvBpd34gc0naqOleRHVVkAEMM6xm57HtqJyUnee5zURTpHNrxeIyPf/zj6Ha76HQ6qNfr2Nvbw+7ubiKt6MVLL1d60JLsbDabmEwmKMsyna27vb2dbMIQyvQEZbhcblQpimLNk5f6sv4YJpjvKrlKm/NM1p2dHRwcHOD09HTNO3lrayt5wSrRR7vQ45hloMcqyVwde0gIk4jXtuAbJRj2mf29KG6ejavnHzO89enpKU5OTtIGHJ6zy1DXJDk1JPbOzg729/fR7/exs7OTQmbzHGUSvCRna7UaxuNxGpNIel+5cgX9fj+F6R6Px7ecDc05h79JCHK8KIoieeOSGJ5MJrhx4wYmk0kKX33ffffhypUr2N3dXbMZCXm2aRKo/GQ9FkWB7e1tlGWJ09NTlGWZiHDarlarJY/1VquF+XyedGX9sM+wbyjBXZYrktzPtNWxwqNncDzkd7Zl9kd6fHPM1I1WlyG+Kcg/N42tFCXcKTpnalo6/0Vjv89Zno6OVT62+xyrz/hYrWnezj5V3s1qB59LfT0TeSD6eidaC7intc8PTCca991GOufqtSgtX794qH4XzzuqG7dN1X2fe3lff1d5IHPc1Lyi96vaO23m+fr8zjqJ1jleLr/mG/aq1leR+Lyvdezim+20rbodVBeWSyP3ROsNlkXb1SZ9tf9631AdvV+prZ2gVuE6TtuGP+u/nTDPkiVLlixZsgDABMBPAvhLAB64y3kVAN6OVZjqn8LqsNjstpklEJ4l/Aa8+H0KF1iFjM6SJUuWLK9IuecJ4SqCDbgVUFOPUyUsnVgE1sP5OYjrnrgUgvXR+cJVZBsBIg3d7HqwDA4WM30HIhXgB3ALYaygvINEDqIyvciLw8E4JXOjd9yWWoYq0DECpl1X90JxME7fdb0iANrBU82Ldcz7/E2bMn/3UqFtqrw0lJzWencgUcvubUWBTqbJNPicnnlLvSNba1uPAHYtH/VVsFmBZNedzzM/9aiLQF8F8KN2oDKfz5OnMD0s6YWr+bFsqjfDKV9cXOD8/By///u/j/39ffR6vRRieG9vL5HCCiaT2OU9km4kjOmFy3ZAj2QNrbxcLnF0dIROp4Ner5fqnvYhWTedTteIYhJ70+k06UHP5uVyFcKZXs48h3cwGKyR0SRIeX5vURTodrtoNBrJe1QJTv4tFotE5rFcvV4vkawa2h1A8limVyvbE/Moy5sEIbA62/bGjRv4zGc+s3amrxKs1JVnIne7Xezu7mJnZyeVgWGInZyLxi6OlyTJi6JI7ajf72M8HuP69es4Pj5O7Zz3qAN7SMtkAAEAAElEQVRBeBKftEFZlhgMBphOp9jd3cX999+Pvb097OzsJAKeIblJ0Gv4b9qfaSlpyw0N6hmsZST5zRDe0+k0baBgWjqeKhHCMpyfn6d2VqvVMJ/P01hDwp3XeD6xzgk6tnCe4ud8Pk8ewpchEQHH35GHpc+FEXmmaegztIHP8z5Gez5OxPo4qKSlE0q6lnHSOyJ/Ip19feFl12eqvFKrRHX3+cPrg586fzm5FxGKmq5eq9Jf84zsHpVL86+ae7wemJ/rFW0m9M+oTbEdRmXw31E6Om97fTg5rM+73TQvPl8VASCa873/R5sgq9Y7+uk6ROKbQaO1lacVpevl0vciYt3twve0bWtf3dQW3IbR2qpq0wi/exvPkiVLlixZslCeA/ATWJHC13B3PYULAAcAfgzA/w/AbwDIXrdZAvk0gFfhxZ8lfAOrMNRZsmTJkuUVKfc8IeyAtZIWCqoqSQsgediRuKgCvZxEUiDRPQcUbIs8GhQMjYhIBbBIpCjQw+9Kaigo5N61tEsVMOUEJJ8hsO+6R6CTAtB6NqLaQEEwB0WBmyEAq7yUHbx0b2W3QxWY6ddVFweRI+8WtyV1VwKcpArz0zJ4Hu7loYBytOkgAlgj8sEJdrWBktJe/5qHgtDeDiNQ2evWP0k6aZru6VJV5gjIdFJBhd6cukFDxe3hxBk9Fc/OzvD4449jb28PvV4vkarXrl1LZ8Kq/XUcorcvQ/6SqO71eiiKm2Q1+/pyuUxnFtNeJJPH43HSkSGD1TaTySSFG55MJukMXZKhi8UincdLYnE0GiXdAKR3SG5ub28nQk89Ukkca6htfa4oVuQpzyTe2trCcDhM71A4vrAsHLdox+l0mspydnaGk5OT5F3cbreT12+n00G/38f29nYqr6bpulNHko48u5htjl7Q0+k02YabBNju1duVZyiXZZnqsyiKVPf83Wq1kncwPYL39vZw9erV5Dk+GAwwHA4xGAySJ2+3203lUPvSM1jPgNZ5hWdic7MBhX2C/YShqEl4kzSm7trH2IZ1nCN5TvKbRDTbg89ZDLVNAtj7EX+/GKki+dQ+fn3TNda1p+H5RMSOzy8RSVj1ro6F0TX9zbw8P9dZ84nGfk/LSaxozN80Rrv9onHbCXcn8rQNOTkcSaRfpKuTeVXrNtc7mo99vRK952vMqM5VF603f9dtE9VlZIPoHV6LyhD1DX2+qm3qGoTtztcqet83Dqk9vPzMRzcoRKJrkGi9HeXj6zTNQ9uwit7Xte+mZ6OyqY7sf742VD30Wde1aj2XJUuWLFmyZHF5FsA/BPAXsfIUvttHLLQA/GmsPIZ/HsBvA8hzdBaREYDPAPhyvPA9CiWAJy5LoSxZsmTJ8qUo9zwhDOAW4FIBLyX+HKhRAirysKkC19wLxL0++JsAvnvw8B6BdSesmIaCspo/SWwloPgeRQE3B5yUNFWASgFSfyYCmjXPCECLQFiCVw4Ce3hrL4/aTUPnet1EwKmSUVrfERgYCclKJ9Hpfcn0IsBTgT1eVxuofbQ8Wu9eJ/y+yaua4YZdHMTVTQRqC15TIjfS323tdei/FdR0INtt6/nSnlH7cz2UkPXzXtW+bHcM38z+RV2ee+45PP744zg4OEhp7ezs4OrVqylMNEkw9XZk32Z4ZD1zmDpq2ZfLVWhgEraLxSKRk0WxIphbrVbSE7hJuNETuVarpfzKchXat1arJX1oh7Issbe3l0JKkxxtNBrY399Hp9NJZdNIA/SYZTnYfnluMb2eaYt6vZ68ZVmnbAP0bNU2OJ/Pkw15NjBDPNfrdWxvb+PKlSu4cuVK8qLe3d1Fp9NJ3rFMh+frzufz5MnKuibp6SHg6bWsRKuGl9ZNRf1+P52HrPZn3TA/nXOYJr3Cd3Z2sLOzg1arhdFolMh4ErXj8Th5dZ+fn6c2tLW1lUhhtgF6gSupr2GltQ+x3NSDNtIoFawjErRlWeL8/Dx5tdM2HGOKokibBFgP2tfYT1nHTJPtjNcvwzs4ItdUNs1P+ruKVNG5RsdRJfBUF/aVaExnutFmKNevatxTPf2ZaJzR+9G7PlZrudUWVSSTzw061qtOEano9vZrVTZUfaM0dN5XQi0SnbdVT6/DaP71/DW9qjp0PXSs8XWrlsXrVtPyulMdq3SOpOp57ze8tqlN+O+ojqp0iNqerndUJ19Dahn5LMct7yO+UdDLXFUe11Pru6oN8rpGlvG8mB7HVt0so/pEY0a0ETRLlixZsmTJEsmzAP57AN+F1bnCd5sULgBcAfD9X/j9wbuc370r3a1d7DcfxBbq+IYrfxbdrR08MfoIfuvon2J4cfJSq/fC5WMAmlhFGa9awvlydIRVmOgBgGcAPH3XtMuSJUuWLF8Ccs8TwkqwKOmipI8CLRSC4urhyXcIjiuBRGCFoLuSjMxHva+AmyANn3OwhiCykqEEi5SUYvkizysHoRQ81N9VYa79/NYIOKoCaNWbYxPIrnWi6UTeUhEIz3quAreqSEW9r0BuBAq6vdzbg++yjbloGnrNwUkHCtVOVaCdbijQdxT0c5C7ivTXfCIyRNu8lqcKTOSzGro2Sq/K60sl6m9ROOkq4Fjl4uIieT8CSBsvtN16H6S+9NTd2trCYDDApz71Kbz//e9PIYF3d3exv7+P+XyO4+PjFEaXxNpsNkthlHd2dlAUxVrI33q9nkLjkjwriptekzy/lp6h/X4/hfbtdDoptG6j0UC3212zLUk9beP0uNVNEbTLYLAKVcUzdkly8nl60E6n0+TVTM9OBbVJepG0ZllIGu7t7a3pyHN4NfT2YDBYI25JjhZFgQcffBBXr17F3t5e8gze399Ht9tdK6+2f5aR4bP1vOJ6vb52/rC2NxL8Si4zD5LF3Gygm0WUCON8oJEo6L3carXQ6/Wwv7+fiPnlcpk8dLe2ttButzGdTnFycpI8n/W8Y+rDvs9Q39SZNqZ3ufZnHY/1HZbLx8lGo5HOcS6Klfezb3bSiBL0ZtYNELopgnak/gw7PplMbolM8Xykioxiu7iTcVefichHt43Pazou+5zjhJCKjrMejcTJKZ8DIuJJn9VrFB/nfa6qIr+8fEzLPXe1P/oYXrW+4HfaTcdAJwGZL/OqIkijsmvd6jW3udpIzwiPyNDIPlG78fqKNgixTGqzyHPZ9fe68/qNiHC1m9qlKIpb1oZq66gd65i0aQ2p46QSsFX1GpVZP9027kmr4kS76uf9yNetqoO/y3L5Brtorco+rm1dy+T/j+i7anOd97wtaXrUIbJHlixZsmTJkoUyAvDPsYrX+60AHsULd8+8U2kD+F6sDo29fpfzunekQA0Ptr8M3/XAf4Cv2vk2PNz5cgBAvVhFP1uWF/iGgz+Dv/6xP4cLvPD/LS9bal9oTss7cQhfAvh9AIcAXg9g9wvXh7gZaXwG4EncJIaPsSKES7mWJUuWLFlesXLPE8IqBJqqgDYlg/QZBSwVeHSQjSCZekj6swReFDiLAFsHdhU0ctBH89f7DrJpnhQCqu49rc+r54GX2b0ZIrBZba9liABCBf1IJHjZPGRo9K4CiXoWcgRSark3XXfwmmkpme725nP8jPIA1ol3z1ttrqSBgrJOANB2Chb7hgBNX+2iALvq6XUWeTBHfUsBcwXRI+C4irzwTyXWHID3NhoB88Bq08dwOFzbEKJthXqTOKR3IstKD9/BYIA//MM/xCOPPILd3d0Uenl7exvT6RTD4RBnZ2fpvFeSgCRueWar1pOGyOR1EtEM9Usv17Is05nEShoWRZEIPG3zSsbRyxhYka+0Bb2d5/M5JpNJ0uX8/Dy92+12k1cwwwgzz62tLUwmExwfH+O5555DrVbDzs4Orly5goODA/R6vUSK0470LtazkEn4OmE2m81SWe+///5E6jK0MUNGD4fDlAbP4GU9zOdzlGWZbEDvahLutLUSt51OJxHi8/kco9EoheRuNpvodDpp7FIv6ah/si3wO99vNpvodrs4ODhAt9vF9evXk4cvPaFHoxHq9Tomk0nylmY7ms1ma6HFSdzT25Ybilh2ku+9Xi/ZWDctsE4ApDpnPdPr++joKG1gYPnU8xW4Oddw/tNNCewPSrCxf7DvTSaTyr58p1I1HkRjiF73Mdk3kSlZxt/RHLiJPNI53fusz9n6nI+pVXNMlK+3S0+Pekfp6fWqZ6rs6u9U6XU7cZJL0+D1aI1Upa9uUlCJdPE5Wdc4vj6M1o96L1o/VNnM14PRdZ1PXSeVaG0a6VilU7R28zTcflpn0ea6qrrUfCPyUje5uU2iNU/UN7we/HpUpxHhrOutqnbgeajet2uDOka4Tbys0WZB1yki17NkyZIlS5YsLgsAHwLwcQD/JoCvANC4y3meY8XkZbm9FHio/Qa8+4H/EN989c9jp3Ff+FSt2MJb974Tr+l9NT45fOm9r2sF8IYrwL/15tUWg//v7wGfPrmDF5cAPo+Vt2/rC9dmAF58QK0sWbJkyfIKkFcEIaxAh3oHOMHlzyrA5UQgAWzeV7BFvUU2AYIRKKXgrIY+5j0l5xQgIqnjHhpO4FEHBeP4PL3L1G4EiyhKNinAr+SHgv0KPDkh6aS2glUOhjMNkq8UB3AduHQ76XUFQvVsaXp/kwTTNKs8XPR5J+w1HwcWq9qdtk8HXz0dFQUK1Zb6fETw66aAqI60frxcUdnU1i60T0QEOzjpoHQEUut3vXYnMplM1rxXKRoKW9ue9iuSh4vFAqPRCL/7u7+Lhx9+OHnT0tuz0+ng+vXrGI1GaLVa6bzeyWSC0WiExWKBdruNWq12yzmt9KQty5sheDV0sW92oEctyV6+R09XjikkQfXcWqbF9l+r1RLRTG9qJRNJqGv/pzcp02k2mzg6OsIzzzyDyWSCfr+Phx9+GI899hjuv/9+tNvtdB4t02B75Kd6vlLHbrcLYHW2MUlVtgOewTsej5N9td3rmcsa0YHhj1utFra2ttDv91N5ut1ual8kyvkuyVrtt2xDDItNe6j9tP5YfhL9lOl0isFggOPjY9TrdfR6vRRmmxsD5vN58kJnXbM+qY/akWVoNBprZaZnN+ufaaluOp7S0/vGjRsppDXtQNvqWKn6uDeiR+Jg2GiOqfz9YiQidXS80n7E53X893Et8rhzEkbz9nmLaVTNFRFppOXwecJ1cKnyeqRUrVl8vrvd+B7di+bMSC/PJxrTlQDz+cYJPX/Xn3GJ1k63K7PnF9kgIiZ9btY1mq6ZXDet4yqCcdN8GLWnSN9N9vH1hOrj61T2YdVV+39UH1Ue2nqvaiOEl/1O+qd7rKsNonUby8b/DdwGbkddZ1W1PyWStf6jfJmmk+DuuV5V/1Gfi0joLFmyZMmSJUskIwA/CeBPAvg+3D1P4RIrN9CXjxfry1EaRQuv7X0Nvunqv4U/dfUHsV2/WrnW13e+bv97XzJCuADQaQDf8mrg2x4D3v4g0P3C3oIvuwL8+L8ETiZ3mNgCuYlkyZIlS5bnLfc8IUzQxoktAiUawk2JTgfJHJjhn57vG3m0KiBDUoaAlBN1Sixrnvqsew86eKWAvZITkYcEgDVCwj2hPdyc5l0FfjlQTfHy0QZeVk1H04jAX9WXujYajZSfhy3lc0qiOZCoQCHBO4aJVd0ddIw+NRSr6hh5yaoNtb60zvy3lsvbptetyibgV0kZphl5L2s9KSjpunn74yaC2+ml4h5rnn8E3G5Kz4Vn6ap3qL6vpA2fo2iZn332WXzkIx/BtWvX0pm1LLN66tL7cblcJlJOCTqewUo7abjts7OzlFa/30ev11sb39gnlKwEkLw56eHJEMUKJBPYBpDIRpKAZ2dnyWMWQPLo5dnF6lFcq9VSWOKDgwO02230+3189rOfxdHREW7cuIFPfOITePDBB/Ga17wG999/P7a3txOBPR6PU8hpenCX5YqwpQftZDLBjRs31s5n7na76PV62NnZwWQySWQn2yi9lnVsZ32wjqfTaSo/bQAgeQSX5cobe2dnJ+lGEp+bY9STnGmTjKdHLQC02+2183JZD2xnFxcXyZuZYZMvLi7Q6/VQFEUi66nT0dERFosFjo+Pk+c59We/bjQaGI/Ht4yjHPfm83k6q5p1zzrnM9zoUJblWqhoJYhIJuvcwnt6ZjFty7OYaUO+r57Cd9qfN4mPEbSBjmVqr4hwizZo6XipY5LPt9GYr+OL6unnDqs+rhdFbR6N1fpbRediJSeryDc+5+XyMmj6Lk4a+jpN81B9nXyL7B7NL5pe5H2tZJrqVtXuvJ59/vX1AK+pjmojt1e0tvI1yKa5rsoGrFvVR9Oumuepl2+K8zYRbQaMNk9E66GqDRhajqhNqP3YZn1NeSdtw23ieVKYtodvV/tq/2Ea3te1LjSvyIZuK1/D+hyievtmTE2X64kXu+EmS5YsWbJkeWXJBYAPAHgdgDfj7pDCc6wI4SxV8i1XfxB/9uH/Cx5ufzm2ivot/49USVEUeMveO/GzT/3XmCwHt3/hkmS7CXzlNeAbHgG+8RHg0d2boaIpj+0DP/w24G+9/w7DR2fJkiVLliwvQO55QljJLAKODgoqUFJ1lq6CSephqeCMEoFKMiu4R+8wALeAM1XePiSZNT/eB5CIGgeX1AvWgTzm56Shgmp8T4F+Pufl0neYt3qCqu5V5B7TU8/ooihuKb/Wl9aNg3NRPk4wUxxcjcBmbTO3A1WdwNZ8PE8H97xcTvxGAK6XuQowdKBTbVYFlLqt+T7JLm9zLH+0scKBXT7r9qyyW5Weft3B801SlmXyGiXBp0ICy8/1U49aEn0f+9jH8PrXvx67u7vY29tDq9VKhHCr1UohpLWvt9vtNJ6QWFTgmOkz9DG9j+kZy1C9fH+5XGI8HievY4Y87na76HQ6GI1GSW+tf/5Wb3F6Kes4Ql1OT08BrEINk8ylbiQ6Gfp4d3cXu7u7eO6553D9+nWcnJzgj/7oj/CZz3wGDz/8MF71qleh1+ultNjvSRKwjZA4PD4+RlEUKVTzcrkKmby3t4dut4vDw8NEZHJMp2c165f1oHkyP55PPJlM1mykhBHzpxe3RxaYTCYpjDU3ANB2tJuOk6z7oihSm5tOpxiNRimc93K5TGXvdDro9/spRHmj0cDR0RHOzs4wGAxwcnKSzlEuyzLpwDbNzVDcLFCWZTrLmm2b5yDr/MHQ5YPBADdu3Eie606YqCe7vu8bgbhxQTc90RYeOvrFSrSxiKJzMEXn0GjsiUg74NY5XYkclpP21/nF84jy8ueijVbqcU3x+mH5tKxRHire/t22dyL+no/RUb6aP9PgWFU113ldeZ1HzziJqDr5/OR2iOZXL++meaqq7D7Ha3uK6mkTaajrGJ8Xozr19hqVraq8bA9Oirot9bqvQ/2+9kcnTaM1suoUXaNwbo+OjNGxqio9H1e8vFX5qvg51NE70dig1/T/GH/f14G+0e5266QsWbJkyZIli8sYwP8K4BEAe3cp/S8eWfmlJtdaj+H7H/6/4lXdr3xB77+q+5Xo1/cxmd1dGz+8A9zXBb7jMeAbH119b21A4WsF8N1fBrz3c8AHnryrqmXJkiVLllewvCIIYYI9BEAico0kr4MkSv4qYeCelA5kOVmoZBKwTvIpsUagk/mQFCGJoeQodWOZlFAgOePAu4NqDoLps1pmJ1AdgGJ53OujCpRVcSDPwSoHHZVc4PskYZhO5MVSBehuAsScrIzAXX1OvUc9PQcqtR7dayTSw4kDba/6nurk+mmero8CknxH7evljQgJfUd10ntR3gp4OnjJ605YRISztzfvh1VycXGBwWCQnic57MC6tnPNiwTMjRs38NGPfhQPPPBACh3Nvsv6onduvV5P3sk7OzvpHFxeI8mpnsKdTif9NRoNDIfD1OY0jPFwOAQAbG9vJ49S6kryc2trC/P5PJGsPEOXY0etVkueuiQD2u02ZrMZBoMBiqLA9vZ2GoMajQaWy2XyHuVZtltbW7hy5Qo6nQ7uv/9+jMdj3LhxA08//TSuX7+O69evYz6f44EHHsDe3h62t7cTEa1tghtfxuPxWkhnhjzudDrY29tLttLwx2x/1I3v8ft4PE7vt9tttNttzOdzXL9+HVtbW9je3k71rF7GLJ+etatetQDSd3r56qYDDVPONsXzcrVvHBwcoCxLjEaj9CwJ7U6ng3q9jv39/UTUnpycYDgc4vT0FIPBAP1+P5H5nE8YMly9n2lrho+mTv1+f22ePDs7w9HRUbIx/5TcVbtrCHbtLyyfjt1K4JMQV3u+WNE5huOIjlfRGFZFWPG+p69159fULrwXjVNONnq+Lu7dqjp4WapIT7VHRNxF5XNSKbJNtP7y9ZOS09TjdvlUzceRjpFXsKbrafn1KP3bEXWalqetpGOVROuWTff9Oe2HqlNk02jNpOsOt+GmunAdfc3F/H2zm3t/87q+oxsNo/bs+aiuvr7xtYbWSVRmiq+h1dZqb980qfpE7dfTZ7r+ntspIqSj+vA+5Ou3LFmyZMmSJcvzlWMAvwXgO3G5XsIlgE8AOLvENO8daRZt/B9e/w/xaOfNLziNVq2Lt+59J37puf/xEjVbSa0AvuwA+MtfB3z5VaDfXF3b8K/cmvSbwH/4dcBHbwBn00tXL0uWLFmyZLn3CWEHRRxEioAnep7oebkO7kXh4Egy0EOHzwM3d+xHXrUEkZSgUOJOdVdPNl6LQEIC6pqHgocsk3osKwnm+mm51V4RmOShtxX4c4KyLG96nkTApIOpLJ8SsFVA8SawlWn4MxGoq7p5ffO7A9DuqeGeyU6senoUJS20Phx0VFKF16rATLdpBB5W2d8JFD9XV/PXvNR+Xp/MPyIG9H6ki3/XNuT3q9oThWfi+rm8CsBqmbXuNLTwpz71KbzpTW/C1atXE/G7XK5CCTebzXRmLnCTGON40+l0UJZlOrOX9tja2kKn01nTj96rrHvtNzxrtl6vo9/vYz6fJ72LokgexVon6mnMcMlFUeD09DSFIL64uMBwOExhg7e3tzEajbBcLtfCtWvf4rscv3Z2dvDwww/jy7/8y3H9+nU888wzOD4+TiGPAWBnZyed5ct2PB6PUZYldnZ2ks58vtlspvLSo7QoikR0drvd5AnbarUwGo3SOcT0cG21Wils93K5xGQyWetXDKGsZ0ePx+PkDa1nNKu3uZPPRbEiWOlBS0KW9mEoaLaPdrudys95h569FxcXiTBtNBrY399HrVbDU089hevXr2MwGKR2zXDbzEfHBnri6rnSbHtKjCyXSxwdHeH09HTNy1g3DWi79rFOzyVmvpPJJN3zMWs2m12ad7BKNDbodSeUfA1AiZ6LxlYf230cdb10HNN0qvSK9I8ITKZZNXZGpKmnFc0VkZ38WZ9bfRyu2sCkc4iOxfps5N2s+aruVXM7RdP3+VPnKF0TaV4RWVi11lT7RrZ1O0UEoNspag9qY0+zqp27nbW83o439YNo/eSbMCKP56iv+HrCyxLZTesjWnv5mtvXt1X1ovlE6wstD/VgWlFobN9opnO/bojxdby30Wi97OJrriobZsmSJUuWLFnuRH4LwDcC2L3kdH/3ktO7d+Rt++/GG/vv2LhGu51sFXU82H49VkT+5a6F/ndfDvzY24Hd9gtP4w1XgB96K/D//sBla5clS5YsWbK8QghhJRUUrHFg1Ik2fUav6TMKzCmo5d7GEWgXkXtMU4ko6sZ31KNYy+TPUbfIMycich0QJrkRgcokM9w2mhbfjbyf3CZ+3z1yHfjk9cgWDpI78RsBtQ5cOykZeZOoRMCylkPLpSF5/V5kPycFHHi9E9BS71eBztomWW9sR1F70brVdDWtCHjeRBpExAmvR0B+ZHcH5VU2EeXAioDi2bAkMZkfiUHqQtJP+3+tVsPp6SmeeuopvPrVr0a/30/hfnnWLPUjWUsCjs8xvDPP7SVBqJ7GAHB+fo5ms4nt7e1ElgJIHsH01jw5OUGn00Gv10skJ0lqeuIqoVkUK8LYycaiKDAYrEIqMUzx1tYWer0e6vV6shfLw7NhScaWZZm8eRuNRgqr/dBDD+Hw8BCf//zncXR0hMPDQ5Rlid3dXRRFgfF4nEhlejyXZYnJZJJ043nHk8kkkbTNZhPD4RCz2SwRxSRSaaflcplCX5OQn0wmODs7S6GjAaTQ1JRms4nz8/M1IpTtgWXkmc0kPGkXhpBmPQ4Gg3Ru8vb2Nl73uteluhuNRrhx40Zq62wPDPtdr9cxHA6xWCxweHiIZrOJnZ0djEYjjEYjbG1tYTweYzQaYT6fJ5vqvMDw2Lo5gQS/Psv6Pzs7S+QtQ4XrmFaWZfLiBpDqnkQ7cDMMO6Ng6IYXJYdns9mleQdXkWO+ScqJIx3PnESMxjGf56vIviqP3ohQcrJUx2cti6ehv6n7pvnidsSXPqN56lrH53S3mW8UiHT2edzTVhIt0s0/q9YmPveqraO0fK3lZKhu/Ipsqs/6WkJ15XORt2lEXvrmtGh94hsNfW5W3TT/qL6iutLfnOOiPuN6cfzw4yu8jPzUM9dVdN7396rWCm5DtUM0Pni5/f8CtX+VXfRatD50m1b1Id8sSjt6vamtvdzex7JkyZIlS5YsL0ROADwO4J2XmOb0C+lmcWnVuvi+B/8q6rXG7R++jXzDwZ/F//z5/xtmy/ElaLaS1x8Af+GrXhwZDKy8if/sm4DPnAL//GOXo1uWLFmyZMlCuecJYWA9zCtBGwW0FZRyUISgioLb6mWhgIqTTYvFIpFEfF4BRPUiJaCu1x34I1juokCTA0WRZ66SIiTLvbwO5vn76g1G3fiOhrV2gM2BVv0j8B8RvFpGB7aUfI/AYwf2IqJey88yqf4qDvxp+g748tPDMRNAdNEzEas8dNwOVYB5pLfm7WC2tze1gacbebdp24wAY7V7Vb1pX/Q6836nZ0g6IaH21/YXgasqZVkmz1sSjf48N0PQDvTgIclbliWuX7+O8/NztFqtFJ631Wolkpdn/DIUMIk49oF2u53K3ev10Gw2MRgMUr+dzWa4uLhIZG+n00nesBTanHamVyjPgCURzP5Kb9aiKDCdTnF2dpbCI5N4pU4kqYtiFTZaQzFr/W9vb+Pg4AC1Wi0RxGW58oC+uLhAu93G/v4+er0eDg4OcH5+jmeffTZ5JWtY7KtXr2Jvbw8XFxepbmh3lo3EKschEvHqSTydTpO3Let5uVym+qJtaGuG1V4ub4ZnZn2xb/uxAiTwmUdRFMlzebFYYDKZpDIwfabHc4lp+3q9jvPz8/SdnzxbularJc/y6XSKfr+PVquFbreb6mw8HqdQz/QYZ3hr6kiSVvsN65ievNSfc4ie9853lZSoOmueGxCKoljzSmYb1rq8LKLCSRftJ5G3YEQE6rin44KSYJpuRMJQB8/X+y6fd3JMx2tNV5/xDVVVeqtOEemn+voGHy+Xj70RqeXpOjnG35EdN5GeTnz5vB7l7ffULpuIzMh+Xv6q9UPVJoCojv2ZyI5VOuoazedrr2O1retZZVstB+/rGjZaI2i9RYS02o1lUD3109+P0vB1a2TXqJ1E7dP7utrJ343ueRmi9uv9WtPzOo9Ias71PnZVrTujvpAlS5YsWbJkeaHycQDfAqB5uwfvUI4APHNJad1b8ra9d+EN299wKWnd33oMb+x/I37/7FcuJb1OHfjPv2V1bvClpNcAfvirgd99Gvh8jh6eJUuWLFkuUe55Qpigh3r3KUlL0Eo9bQii6HmwTEuBXCWFqnbkV4GECnKWZblGsFJIPPDPwSDqrGGTFYgjscH0/axg1Um/KzHn5YuAZwfFvRxKhiqxp8SvlovC/NQL0/OpAk4jIL6KAFTvCvfQ0Pei8jlAWQUos3ysC9eBRIo/qx7QHjbQQWTajM9r+1K7OFgblcnbhQLH+ts9XCIbR3Wr9VqVbxWYznv6yfejvuDp3Q4EJRnVaDQSoah1oOmwn7GMJBcPDw9x/fr1RJzSG/X8/Bzj8WoHKsPh0vt0NpthMpmkZ7WOSE4OBgM0m81E9A0GAzz77LO4cuVK8tYkMMz39vb20Gg0kqdso9FAr9fDeDzG2dkZ5vM5er1eKjuJQ9qc3rVbW1vY2dlBWZZot9vpzOFOp5NIbq2TbreLfr+P7e3tVBdKOvKM2GazmcIx7+zsYGdnB8888wyeffbZ5KFMb1ttRyQ2SRyShCXRvLW1hdFolEIOz2YzlGWZ7EyimOfgzmYz3LhxA+PxGPV6Hdvb28lTV8d8hndWUpNl4lm69Jjm9aIo0qYAHSuGwyFOTk7SWD8ajRIBrl7kwM3wymwDPEMZQLIxvabb7XYimemFPh6P09nATrJpn2FdsS2QYCcBrO1dy61e0CSq+Yx7+dJmvK6kOq+zXi9DquY8/b1pjtg0ZvhY5ISSrwk2EauaZzS3ORHpxNwm0sv19A06VeST6++6VNls03tepuh9fkZz3fPNW5+NNo+5RJu7dA5kP/A5xuvey+c68L7PKZonRdeK/q6fye392W1xp2up262tquZ9fSZa77Ht+vO+pvC61LWT2lDTUzvoOBet8aNyRGuVKjv4Gt/7oLcH1zGym7cFT1/fj8Zi7Se64UTX6pqOt7MsWbJkyZIlywuRzwD4YwBfAVzKWcKfABBHNHtBUhTobm9jPBigDBxMvlSkWevgex78j7BVvHjvYACo15pobfUvJa3WFvDj37AK9XyZ8kAf+L9/O/Cf/xLw5Pnlpp0lS5YsWV658ooghPmp4JB77TpA556yCiapJwSfJ6ii54vyHj/VS1l1izyWXB8CRATEFITksxHh6ICYEof6DPXhffVqcxLXbes6qL2VnNJrWh963qTqFwHXVYBdWd70nlMb8Hkn2Py72op6qL0ijxT97cCr6qr2rbJhFTiszyoQTLs64OhAutrONz84aKt1UUUS8BkSo5GnT0SIVBHkWi+eB/tTVBbNl89GpEMVwK1gaySLxQLn5+drHpTuDcnQutS3Xq9jsVhgPp9jMBjg+vXr6Pf7iewliTefzxPBylC9DGfMtHkmMQnPra0tdLvdNPZ0u92UD8/D7XQ66R2GN2ZIZy0/wxmzXnhuLr1mee5xu91Gq9XCcrnEcDgEsAqzzJDIDE1dq9WSl6vmQZ2m0ylGo9GaJyq9TFkHk8kkkYi7u7vJc/eZZ55Zsy37NgnyWq2WiHX1egaQCGKGyXaCgLqyHuktPZ1OE2m+tbWFwWCQnptOp2sEMUNr833WHZ/lvclksjZvkPClV+xgMEC320VZlsnWDDd9enqKbrebvHw1xHJRrLy5j46OUsjup59+Gnt7e4n0Z9vj2dUknkmcs//T+5d9iwQ+Q5mrzfmnm1hY/0pmaD9lHVI0HHRZlsmWs9ksEdfuufhCxEkaStUY53PRnZI2mq4TiH6vioz0udjbqs8dvrHHr1flp9edWNMyal7RHKg6R3q4rau8JrXMTEvn/MgubtPb5RPND75e0XVONO/wTyNTeD68ruSnlssJadXJy+/6qK7aXpXs4/tR+v6+vxOl72lE6VYRi1XpRN99Pvd03I6bdPV1kK4ponYQ9QfvL6yHqj4XlZN5RBsqKb4xQ8sTbTRlu4i8hH2NpaIkNHXy/4OyZMmSJUuWLC9UFgB+FcAbALxYsrLEZXoH9/Z28V0/8hdx7VWP4LnPfR6/+BM/jbPDo0tL/4spb9t7F97Yf8elpvmOgz+HDx7/8xedzr/1lauzg2uXsR9ApChWJPO/81bgb/4mMM9LtixZsmTJcglyzxPCFAV06C3rHopKmBFwIcGr4B+BFKap3sL6jIJMzJMEgXsyOllRBTSpdwpBSQ117aEBFSCKvDmVOOU7FAXRVBcF55g3PdwU1NN01Z5Mm+9rviReaEMH3p3YVXDLy+n28HyYh4p7zLEsThpr3g7cen4OLmo6CgbyWdYtbeFnNatdKb4pwEmETWCq6+qgrxPITja47TQ9B6sjwD+SKvBUddB6coDc235kuyoAlzKfz5O3Jr1gfeOD9zWOL8vlEtevX0/kJoHd7e1tAEier+wDms5oNEJZlinc9Hw+x/HxcSJoqVe328W1a9dw48aNRBwDK+Kt0+mshXFut9spD14nMX1+fo7z83N0u13s7e0lT1CSgQASUUyvWno+05Oa7ZbjRbfbTXneuHEDJycn6Pf7a2MQNxXQc5Xhmq9evYput4udnZ3kwQwA0+kUV69eXRtLASQikUR2WZaJPK3VaolcZz8qihVhvbu7i+l0ms5F7nQ66Yzf2WyG4+Pj5I1Nz2MPy61Av0c0GI/Habwiucnxm1Kv11Gv1zGdTtFqtVL7UHKWei8Wi0R4k8BlWYFVmHFeB4CdnR1Mp9NUz+12G+12G8PhMD23tbWViOLZbHbLOOYbWvhH8p79zUPi00uY7ZvpUH8Sv2o3DRs9nU4vzTsYqO7rPnZomX3s4X2fQzQtJ5Mib+AqwqaKbIsIMn3fx21dv+i8EpFlPv/xejS3ReJ24rsRyax6V425qqtuRNN0oveVOHOdq+pS9YkItyp7aD1F81REFvIZr0td77keOnf7mjCq/2iNEq1V9Lff03d1vabinsib8mQ6mr6PFVE/4ntedtrLn9e2ousAJU5V5+iTeaoO+l2fq9pQqX2O17j5yvthVF/AzYg6LKvb09uF66vtzNc6Kqxbrle4oSpLlixZsmTJ8kLl0wB+H8BbAGzhhXkKlwDGAD56KRoVtRr+5J/7PnzZ278aRVFg976reOCxV+NXfvof449/+3exmM0vJZ8vhlxpPoK/+Kr/F+q1ywrLvZL724+hXjSxKGcvOI13PAL8+a+8fDKYUhTAv/EG4Jlz4Cd+7+7kkSVLlixZXllyzxPCSupRiqJYC68K4Bbgi6CLhmbTM08d8CWYrR68BPKXy2UifxRQ8jBvBIw0DwVrWJ7oT/XWskekWxVRpuKAl4NqvK92cwDRQegIlIzATSXX1MNGvdQioFrTVSBNz7T08vv7ej0idzfp6eC/PqukstuZ+UREppPBEXi7CWx1MFqJgshuKkzHyX0H+7Vc7rnLdBzAdKJe81O9FdhU+yuI7u3JyxIBzg7iVwk9V/W8VW3/CiBzfODmiOPjY5yfn+Pi4gK7u7vJBu12G2VZrnkHkzwj8Ur9SN7y/F3mS+/TWm0VZpnp0CO41+slj2H14qSH6Xw+x3PPPYcnnngC4/EY/X4fe3t72NvbS2Upy3Lt7F16C/NMY0YPYL0uFosU1pnhqZk/xwZeJ7E8n8/XCMJarZbIXBLxJycnKeRxs9lEu93GeDzGZDJJxDRDYfM8WrYdtvnlcpmAedqJbUc3tbC90DtYyVx609JDmHVFb1sSo/Sg5rOs38FgkMpGornX66HRaCTynHXHc6rpFU5bjUajVAe1Wi2dxUxvcwAprDdDLrMfsg2xPtmParVa+s3xw6MR0GMbuDX8s48FUVQC5hWRb/QY5x+91S+DnHAyRa/rnODjRTQ+6Hoh8tx0gs7JKyfg/P2q8TcidZzQ8ud87vL3NQ2+q/XtEo2VVUSeri2q5toojWheit73KBZq56iOXL9IVycz/bnINpHdozmM71HPKO/IPlG70veqzoutIgKjeVTL5G3VSXH3ptb0tL3putnXLVF5fD52YtefUxtE36PyRWlyXuAzOod73Th5W5U3P6P69rWsvuvr5qjMWjeul+frazWvB9XtTtdCWbJkyZIlS5bbyRLAzwD4DQBXAbwZwIMADnDnsOsZgH8K4HJiA7/h674GX/Utf2JtnbJz5QDf+x/+e/iDX/9NvOcnfgbzS9qE26gD3/wm4KNPAk/dBQfkL+t/PR5ov+7S090qGqgVWysu/gVIvwn8la8H9juXq5dLvQb82TcB/9vHgcPx3c0rS5YsWbLc+3LPE8JOUJGYBda9MxxY4TUH7JzI0rMTNS8CM0oUexhC5kVR4obgFMklzU9DogK4pUyuh3rcujeKerVFniokoxUwU701tK+CUfT+47NK1ETAuQOtaqfIXlVAqoPInhef0ef9Gn87+cc6ikBB2kJtyu9aNgVfFSxUzxLfnKB5OuDrRL0DwOo5pe3abe/Ao97nd68j90BzEiKys2+o8PLQjl6X6qlPce+ZKvDTP6N2swmUH41G6TxhngHLNg1g7VzcorhJpvE82G63i7OzM1y5ciX1CxK2JAiBmyQd9SDJOZ1O12zLcWGxWKDRaGB/f3/tLEF64vJ+URTJ27IoVufWfuxjH8MzzzyTPKDvu+8+7O3trbW3Wq2WzuItipshgReLBXq9HlqtFo6OjlJIa57Nq5toGL56e3sbg8EgeasyrDLttVyuwhMXRZFIeGB1RjJDHrO+SZ6qlzBJ18lkgrOzs0QAMwyz1ruGIZ9MJokoLcsSOzs7WCwW6HQ66T7z0fbOc6GLosDp6elaGqzDVquV6kw9q3WM7HQ6aYyn/UjA7uzsrI1B3JhQluWahzb7C4nj2WyWvMw57rI90M7aNkjENxqNVAc6PxRFkchg9jPdHEFb6oYF1ZU2dw9q9mFuJpjP55hMJonsvwypImx0rHRCxH9XjY981se5qjnKCS6ViECL0tMxW9vxprKoHTzvaN7bREBtKp+XU5+pGl81D/8e2dzLoc/otShN9+b1z2gt4PXn85WvXdxOvh50YtLfq7JTZJ+oDWv5dH7cZP/IflXeqyyLvqPjj6+XVDe1F3XzTSJ+3c9Ldhvcrk96P9ZxTcW9y6u8iqvIZS+rXovqwdc+/OO46hLVkY+/mt8mO/Fd/98iewdnyZIlS5YslyEXWJ0n/BkAHwTQA/AwgDdhRRBvAdjDrd7DJYDrAP4xgE9eiiZFUeDtf/rbUW/cGsK6trWFr/qWP4EbTz6ND/yLn7+U/LpN4MseWn1/+hjYsPR/3tKqdfFvPPh/XBG3lyzDxQlmyxfOsL7+AHjN3uXps0nOpsD01gA+WbJkyZIly/OWW5GH28iv/dqv4Xu/93vx0EMPoSgK/OzP/uza/b/0l/7SGuBaFAXe9a53rT1zdHSEH/zBH8TOzg729vbwoz/6oylsJ+XDH/4wvvmbvxntdhuPPvoo/vpf/+vPv3S4CQ4RCOc1BaD0WQdmSYYq8BcBN/pMRAwyrwgMBm6eR+rgkaatZF4EjjIPfUY9G/mnnpsM/ekgOe8rORcBTWoXJYuV+NSQ1loGfZZ6OaCm7/K3E+ARSKugXeRRVPWn9al15t6u/CMREoGt7j3OskehDSMg0cFoJwRUFFDUMmo+Zbl+vrR7k1SRpH6f5fG6iYBJ/3PxfsXfahv1Ro8A4Cqpuq9kVgR4u1xcXOD8/DyFNlYvSN1sQRJT9T0+PkZRrEg3hvYl+Tcej1ObYFhiholeLBY4OzvDYDBIbYzkJL1OW60WdnZ2sL+/j/39/XRuLEnA0WiE0WiUQvAyr8985jP4/Oc/j+FwiFptdR7xgw8+iG63m7xMqQ+9eUmEN5vNFFqZabNOtre3U/jjWq2W7rHPtlqt5InMdsizbfv9fiLdaY/xeIyTkxNMJpNEXDspTI9Zju8kFelpyno7PT3FjRs3cHp6isFgkM5epk3okco2RlKS3sR67jK9ldvtNnq9HsqyxGAwwHA4TF6uk8lkbZ5YLlfhwq9evYr7778fOzs7aDabGI/HOD9f7QCfzWZ45pln8Oyzz6558tIjejqdol6vY2dnB41GA41GA/1+P5HXRVGke/TW1lDn9Oz2/kUSX8cDrVeOy3xGSRpuGIqiCJDopW5sBzrX8buGw74s72DqwzFFiRe9H417+qlj0KaxWud+/+7erxT1UKyak6r01k+XiKxyb2gnmarmUn/Wx0ud06NNQT6HRLaLxmDXw9c5mlbkuatldjv7hgbdoOX1t6kufH72/HUdU0UG+ztuF9VR869auzgJ7flFz1bVq+ul9atra19Hex1oGXQt5OtCfo/ITrWx2tLrXtONdPBntDxcO/r/AdpeojbkaUR2UP1dOIZu6u9V67uq9KM2qmt1buC503VQlntXvtT+r8+SJUuWLy0ZAvg4gJ8D8F8D+G8A/EMAHwLwWQAnX7j/swD+Di6LDAYAFAWa3Xb17VoNb3vnt6K7s30p2Z2OgH/2AeA3PnK5ZDAAtGo9PNL5istN9AtyOPv8i3r/2x+7e6GiVcZz4B9+CBi88MjWWbJkyZIlS5Ln7SE8HA7x1re+FT/yIz+C7//+7w+fede73oV/8A/+QfrN8JmUH/zBH8TTTz+N97znPZjP5/jhH/5h/NiP/Rh++qd/GgBwdnaG7/zO78Q73/lO/L2/9/fw+7//+/iRH/kR7O3t4cd+7Meel75leTMUqIIqTrAB68CogoFV4JKCfPo+sH5+Gb161fOA5JyGN40AWg1DTV00fyUd6AmmJISSVwraetkVGPJQchEozN9VYKTairpo+Famo0Ah9VJC3fPTZ12PCHR2nfW+k74RMKg2Yb4M58q6JemxWCxS6F8tfxVQ7OWqAuQcZNc0+BmBmJvqj+1G25Om5zZ0AJrpVW1+iOog8rTz3yT2IlBdJapDBZXdzlG71Pe03JHw3F7fQMG0tPzabkg8tlotjEYj9Hq9FHKYHpkcHz10cVmWODk5SSGFOYYURYGzszN0u92UD0M4F0WRzv4lKco2SeLz05/+NE5OTtDtdrG7u4sHH3wQjzzyCIB1IljbNts+yerRaJRIcNYhPU7pvcqxi4Q6Scx2u42zszNMJpPkRdzv99NZtt1uF8BqHphOp5jNZuk9PddZv49GI4zHY+zu7ibPXHpRk/Smt3JZlilUNfWkfgzRPRgMktcsiddWq5W8ePV8X5bx6OgI9913X6orEu7NZjMR2yTAWVd61jE3HOzu7ibv33a7neqDtiYZTrvR45dtczKZoNFopDOSGRK8VqulM4WLokikNdstrwM3SWDdUKTHIeg8pm2fpLn2Z/Yt3UShpBDPDaZ3Mzdu3U1R0sXHkqr7EVlTRaT59Wgc0vGa46jnzd9MQ+/rNX6P5hjdJKZlrSIoo7Lpe1V6qfic4/pF911HnY+q2pvrrPbReQm4Ndyzz5+al68pNpVFP/ld12xaz1EdUTfVwduclsXLob+9vPp+NM9tmls9UkeUXlU7rWpDej0qj9slspmmpXXoIbR9E4avj6I1oq/no3x5zzeZeDurIp01b42iEK0Bfc2lekVnMVf1b32O97SO3Ss6yytLvtT+r8+SJUuWL12Zf+Hv97/wV8fKg/j0ruR27VWP4MqDD258Zu/affjKb/6mS/MSfvr4UpK5RR7qfBmatWpy+8XI48f/7AW/WwDoNIAKGO/SZFkCv/xp4Fc/c3fzyZIlS5Ysrxx53oTwu9/9brz73e/e+Eyr1cIDDzwQ3vvIRz6Cf/2v/zUef/xxfO3Xfi0A4O/8nb+D7/7u78bf+Bt/Aw899BB+6qd+CrPZDH//7/99NJtNvPnNb8aHPvQh/M2/+Tef9z+OBJwJlkfehgRkI4BLQST+0XuJBI2CuRQnx5QYjcA/fldxYF3DMivoRXGwVgljpuE6qocjsB4CWgEnB5ecANNy8ruWw8E5BzkVENMzR0lIaN6qL9N0QJfPeZhqF61vtaGS60r8a1mVYFcwm3ooqOueGBGQ6s/rPT2DeFPbcbBWn6tqZ6q71pMD7w6WRnWq5XQwVZ/T+qsiN6Jr6unFvPQ51anKK091c+9x7ZsuJANJfGq7VBJBdR0Oh3jqqafw2te+Fv1+H8vlco0sBYDxeJyu0ZOWslwuMRgM0G63k24HBwdJH9p6MBikcNRaD7zGtE9OTnB4eJjCBLfbbTz22GPY39/HaDTC9vY2ptNp8igmSUjyl16tekZwu93G6ekpiqJAp9NJxGqz2Uzn6xZFsRYqmmRkUayIcZ5RWxSrc5OHwyFarVY6T1dDELM/bm9vJ6/g/f19LBYLbG9vo9PpJEKchC3LyrGaRCvPXL64uMD29nayFcljkuLtdhutVivZkwT1dDpNJO/5+XnKk+Mq557xeIwnnngihYLudDrJrvv7+5hOp5hMJkn/8/Pz5LHd6XSwv7+f6pik72g0Su2s2WymDQIkwDXMdlmWKfw227m2VRLkbE/athuNxpo3L+dS3texg799fmWe/H1xcZHOwWb/IyF8N0KXOsl4p895f+I14CaJEnkfK8FSRbpRorFXpSrfKC0fr6vIOX9P8/KxW+dmJz/d89bT9TL5vBjZxZ/x+UttEb3r66YqwjFKU+tb8/G2rGm4Ppqf29PT1Xbl6URrBC2fr2u0/FX6+jV9T+s5aivueRvZO1r/qHj5dd72tbbrqusGvVe1KVOf83pyW+j1aA2mZDif02MsIlto2arGAq8fjcbAsnH+ijZqen35pju1kT7n7e9242KWe1u+1P6vz5IlS5Z7Rxa4W2QwAOxcvYJ689Zw0SpFUeCrv+NP4Q9+/TcxOrucc4vvhjzWfRvaW/1LT3e2nGC0OHvB7++0gG94+BIVqpCnz4G/+/iKGM6SJUuWLFkuQ+7KlvBf/dVfxbVr1/DGN74Rf/kv/2UcHh6me+973/uwt7eX/mkEgHe+852o1Wr4rd/6rfTMt3zLt6QzNQHgu77ru/Cxj30Mx8fxtrPpdIqzs7O1P+BW4JtAT3SNQIyCMQ70OeCtYSH5jl6PQDTe528nOhTk4XMkIpimhimmzgpKMxycgksMycpyq74RWRzZTu2iZXBAXG2pfwDWCHTaLvJadoArAhv1GsmfKuDQvb49bB6wHtpRhboowaT2Y/5aFgedtY48bW1DDkg7GKhpbCJWHdR04FDF7aXnU6qOagcH67V9artXQNP7lOYZAdHabpivl12fUR0jIsB18zan9oveHY1GichSEkcJEs27LEucnZ3hmWeewXQ6Td7CJA1brRba7XZKvyzLFB6YoZen0ymGw2EiTpfLZSKXz87OUuhj5kUyd7FYYDgc4ujoKIXjPTo6wmAwQLfbxQMPPIA3v/nNePjhhzEej5OHKs9xJflYlmUaO0hCbm9vp/SV0NPQxvQU5j2GmKY3LknW7e1ttNttdDod9Pv9dHbywcFB8srVcMMkL/k3m80wm82wXC7XzmTudDprIZOZZ7/fR6/XS335vvvuw8MPP7x29nK9Xker1UrvTyaTlEdRFGvEdlEU6axnEtSz2WxtHmBajUYj6czzjkejEYCb4aHLcnX+9I0bNzCdTtFut1MIbbYp4KY3d7/fR7/fR7fbTWG5e70ennjiCTzxxBN47rnn1sjksiwxnU4Tubu1tZXsRtuzLSuxy3L6MQT6LP90jNS5gN+1DpUAZtu9LHECCFgfM32s8Of1fnRP+62PKU5wVZEvHDPZbiOCqWosVomIPb5Dz21e801FqqP/1vRVT9+cVmXzTfXpc7iTi65TVB+b8tZ0NC3P29cyaifPy9coXkbNx9dmXqeuq6bh5fI5TevTr1W11+i+ryG07N5vNT2tf18bqK7R/OztSsvg87bPz2qPqn7t70dzvM/T2r6ickZ9PKoLPdue79KGTizr+1pWfSbaXKObEb1dUAcnyqvGIdc5S5ZIXk7/12fJkiVLljuTN37d2+/ouf1r9+Edf+Z7XrbRQmqo4esOvu+upH04fQKfGHzgBb//4DbQ28y5v2gpS+BnPwocvvBjjrNkyZIlS5Zb5Hl7CN9O3vWud+H7v//78dhjj+GTn/wk/rP/7D/Du9/9brzvfe/D1tYWnnnmGVy7dm1diXodBwcHeOaZZwAAzzzzDB577LG1Z+6///50b39//5Z8/9pf+2v4L//L/3Kjbgo8RwBUlXejgzjqOauAeAQMA+tAZwTwOhDF5/R+BIJqnhGwpTo6yKVgp5aVgG9EQjohrrZ0L2kti54trOV1W0TAmb7r6atufoalAl8O/CkB74CmA+9VdRg9F5HXWncKDqodqaOXnem5DdRO/F11TjLr1AkCXo/0p329vtR7xcuuIK+fO+3kivcPhvalRICptiO1q/edKnKmCtCP+usmmc/n6Vw09fKMvJS0jq9fv45ms4mHH34Yy+UyEYP0AKJOJEBJfrbbbVy5cgWdTid5Ds/n8wS8j8djbG1tod/vJ1B3uVymsMbUi0QbgbdHHnkEb3zjG/Hoo49iNpslr2GG655MJomQvu+++9I5wiRfFXAmQc5NK81mE5PJBMCKtKSXr3o5M/xzWZaJiKZHK21DUpltpCiKRDovl0t0Oh3UajUMh0PM53M0Go1Uj7PZLHkpl2WZ0iZpPBqNkvet9luGZyZxzHrk2cjj8Tjlc3Jykmyxs7OTwkzz3OeiKBKZ2+v18MADD2A2myViXIH++++/P4UVZ12dnJyg3+8nz2XdOMAznQEkcn4ymaDX66FWq+H09BSf/exnU5hzPTt8Op2iKG6GLD8/P0/2Z/psw/Ta1jqgTbgpiSQ62zttruOPRtVQz2DKcrm8NO/gaO6MxoHoef5WvbyPR2l4Hkqq6biteUTjcbTZqmrsivStIhlVl02EWdU6xdcePjdq3p5u5D3sBKGm4xuydI7xa07Medkd2Irm7tvlE43t0RpG7/tzbh+/rmWP2peLPhfNxV5Ove7txdcMVesbn7/12ajPVK2DVHffKOZrnGjD2+3E7eLzs+rvGzZV16iN+tqnKl+3neoSvc+8qvoF+y/TcLvr+o7P0nYa/ShqX0rYZ8kSycv5//osWbJkyRJLq9PB1UceuqN1ZVGr4S1/6k/ik7/7YXzmD/7oi6Dd85NmrYf7Wq+6K2kPL06wxAtfB33Dw0C3efvnXow8MwD+1R/f3TyyZMmSJcsrTy6dEP6BH/iB9P2rvuqr8Ja3vAWve93r8Ku/+qv4ju/4jsvOLsl/+p/+p/irf/Wvpt9nZ2d49NFHbwFy3HtTAaoI9IqAYgWI+Rd5AngaZblOXJLgUmLWCVoFVB3UVlAtArccyGJ6kecA70UgawQiOuiqoJV6hEbliQg5/tZwq5qXk7t8jx6IWn4HxDQvJz0VIHOC1D281OtNz9tUYFRDVOt9JUu9TTpoGrVBTU/L7+WMFv1MV397fahd/V0HE32zgJYlAjn9O38r+Kuev1WgNkVtHYGy3u+0nkmca91E5/hFxAllMpmsgdskatn2daMBvTIXiwWeffZZ1Go1dDqdFL5Y+whJzFqtls6G5Zm2i8UikYhaNp5tSwKZnqsk1tg/GLZ4Mpng/vvvx7Vr19BoNFKYXhK46hVKT87z83Msl6uwxDs7Ozg9PcXJyQmWy2XytO31ejg7O0O9Xk8hmBk+ebFYrJHnJC8ZingymSTP2EajsUY6k0S+uLhY82KlnbvdLvb29jCZTJK9aHN6ujJMMu2tttSxf7lcplDL/KRHd7fbTV61y+USx8fH6Qzker2Ovb29tfZRr9dT3bJ9kYgtiiKFo+50Onjta1+LTqeDZ555BoeHh2g2m4mIZZ2RWL64uECv18N0Ok3euhTmORqNbvEcV1KWdXJ2dobhcIiiKNaIX+2rOp7pWKGbkTzUNPPzPsc6IvGr4ys90y+DmPC5xccaJVb0Ob7rhI2PQdE8q+/ebu5U8bz9HvPblI6Puz5+RRtWqvLVZ3U81LQi8bR0fVW1LvJ3ozUXx1ndPOF28zE7Gr+j+rpdeTQ9bfvRWsjbFnAruavzjNdn9P1O6jtqG56Or+8iQlDLUGWLSA+9z3ralD+v65qO33295u9H/fF2deH5ROsD7/PetvRP9dc1YmRfva/X9N2orlWqrmt+Oo7xu9rSn9O0ow0vWbK4vNz+r8+SJUuWLLeXVq+L/Qeu3f5BPt/t4Nv+wr+Jn/l//A1MhsO7qNnzl8d6X40H22+4K2l/4OjnsChnL+jdeg349sdu/9yLkTJ7B2fJkiVLlrskl04Iu7z2ta/F1atX8YlPfALf8R3fgQceeADPPffc2jOLxQJHR0fpfKIHHngAzz777Noz/F11hlGr1Vo7e5NCAo6EXgS8KWjjYKgC3Ap8KeBN0J9eUnzfARiC5+rNCNzqNaCgkoKp/K7nybpsIrO8DAqyOgGpZVcQS4kmtVfkPRUBygo6Kknq3g/6O/LucPDLAV8F7fms2l31Zf6RR4rWt19ze3n5+N1DgXq70DwjEp35qR7eBlQ/tWEEeCtYr+9FYK6mr/VD/bQNkYDTNh4Btg5oK/HhQObtvmu6bnsFXTcBrhFQXtWHmB/Pji2KYs0DU21Pj13aZLlc4sknn0S9XsdrXvMa1Ov1FIJZ2yAADAaD1HZI3DYajUT6MTwxCVCeCaxjE8vBa8Mv/HPHc4LH43EicUnUFUWB6XSK2WyWwjhfXFzg8PAQy+USe3t7a32Ff+12ey0ksYZxns/n6dxcXlsulyks897eXjo7udvtoixLdLtdXFxcoN/vp3DMp6en2N/fT2PPbDbD7u5u8kBmmGuOkWovehCznhiuWglqhn8eDocYj8fo9XoYjUbJE7ssS/R6Pczn80TAs20xHLQS8xqin4RrURSJxB+Px6jVasnrnJ7F9Nalh/JkMsH+/j76/T7Oz89Tu6MHN8n65XKZQnZz0wL7F8n5oihwdnaG8/PzRBiTbObz2m69r2g7ZdvSdqabEXyM0D+1Hb2GuSnhxYoTcdE9v6/jpJOnLIsTeTrX6hyg70ZrAP/u45hLNB/o865D1RzseUbpaB46VuunlzPSjd+93p1E3DTGRuuzqNyb7Bdd83xd/yobRmnqXOpl9nL6mi2y452swVwP3zDoeUd5UVctZ0TWu100T2D9yJHI9ppPVFe+/lSSUtPwkN6qV7TBo+od3QCk7Uvn7SqbRf1fP70/u52j/qPl1/WwbyzU9yPb+pjF/0d0U47roOnmcNFZno+81P/XZ8mSJUuW28vrvvotaD7PMfTaqx/Fn/j+78Uv/+Q/qlwTvhTy+v7XosDtPZ1fiLwY7+A3XAFec2uAi0uV4wnwL7N3cJYsWbJkuQty1w+K+PznP4/Dw0M8+OCDAIB3vOMdODk5wW//9m+nZ375l38Zy+US3/AN35Ce+bVf+zXM5/P0zHve8x688Y1vDMNKbRIFrwhcOWimoXBJ7hI4IcCvoLZ7QyoxyT8l8SIh2EfQSokbBaoI0DtBquCfe70qQKUEYwREKVBGUeJE81A9mbYSCA6sKTHleWqZtMxquwi4j4hnB8Pci1htoec0qy5sBwBCME7rwz3EtH04WeDP6nclVRS0c2BRwVemqWdIa36aB8uzqR5uJ06IePvnH8kgJ6b5roPWrrfXp7dxt4e3jwio1fQ0P3p6a/rabjYRFRQSkKofvXH1XT9jfLFY4IknnsDnPve5dNYqwzu3Wq1ENi6XqxC6PBO4KIo0FpE8K8synS88HA7TucMct/RM2+l0ms58q9VqKTw0vYPr9TpqtdraGbzehweDAZ577jkcHR2ldJhXrVZLBCvJ17Isk57NZjMRzQzLrB5lW1tbKWRxvV5PBCv7JXU7Pz9P6QyHw5R2vV5Hv99Pv8vypmcwy8hQz7QXzwrmMzoubW1tJdsBN88Wbzaba+2a9geQPHiBFZC5s7ODnZ2dZCven8/nidQ/PT3F9evXcXx8nNrJ8fExzs/PUZarcNonJyc4PT1NHsVs32wnzWZzLaw8yXjamHU5n89x/fp1HB4epnbihJDOfzqO6pijmxy4+YOe0u5hyjbr8y7zoI1pk8sQHQe0rjYRMzoOO7HE+/6Mj39V4zfF5wEnp6MxPLrm85rPO56XjmtuJ39e6y56xtuM2zoqs5+B6vZRgs7t7GXxMkZ1qORiVJbIfj4XqP76vuvuc5RvHKuakyJ7RLZw/SPRMTqaZ51U9PJ5WaJ+GM3JVZtGvJ1H9vY24f3O/6L1gIuXz9c5vlHK9fIxym0V9R99z+9F72javknR9fU1jusV/X/h/dg3qEV145t7smS5nbzU/9dnyZIlS5bbSFHg4IFrKJ7n3F4UBd76bd+Mr/pTfwJ3iX993tIoWnjb3rsr18EvRmbLMT5y9hsv+P1vfjXQuIvLp7IEfvsp4ORy9kxnyZIlS5Ysa/K8p7DBYIAPfehD+NCHPgQA+PSnP40PfehD+NznPofBYID/5D/5T/D+978fn/nMZ/BLv/RL+DN/5s/g9a9/Pb7ru74LAPCmN70J73rXu/Dv//v/Pj7wgQ/gve99L378x38cP/ADP4CHHnoIAPAX/sJfQLPZxI/+6I/iD//wD/GP/tE/wt/6W39rLXTUnYrujAdiwM7BSHqvKaDOe9FOewcRmY8SZ2V5k7ildxQ93RwkciCMBIWCdREorYAXSRQFeRwwi4gvB8CcjIxAKCUS+KyGnXVCPSL/FIhW23n4aP3U6wquO/mpdtVrETEQgceqWwQcuq0cHKZ9SD4pWOceQNrOqggGBQ+9PTuoGnm7RUC7punldnBebeNEiNvK60rryf/Uy1bzdaLAy6Oejd5vojbv7V6f8b64Sehlq5sbtI8wf26woO2WyyWeeuopfPazn8XFxcUaycjQyezzp6eniXheLBYYDofpnpLw/JzP5xiPVzGFWC9KPgJI4YrpEay2ZZQDnq17dnaG5XKJ7e3t5LVLQpr2ptdvs9lEu91O4ZZbrRZ2d3fTGcQkppfLZfJKBVYEML/TA5UhhOkhTX2Pj49xenqaCF2ep8y6G41GAJAIZZ4VDCCdVcww3Kw/2rPdbqdz7+677z4cHBzg6tWr2NnZSfdJFNMTlufhMv96vZ7qs9PpoNPpYLlcroUZ53jY7XbR7/fTXMByjkajVHZ6D5MIZz3Qe7vT6aQ2z3oh0c82SQ/yk5MTjEajpEez2Uy6sm443mo5dHzQc345dnETAwljJ/QoLDfLyXbJjQuXJVWEESUa1/iez6vUG4ijXziByueqPBpvd003SemYrPOuz5E+f6ge0bit6Vd5BnLc8LlVy+rzZkSo6SY5XZPo/MHyaZo+ZqsNInJTx+6qeTqaM7W8UZlUl01rhWiTlKZdtU70ecd1c9v7e6q31qdGw4namuYZ2dXL7n9alqr+Hq0ttS41nWgDoddpRLy6zbU/eFuM9IzWeREx7e9Wbfb0dYaWw9dYwK0e1rSF9hdvW15+1bvKTlUkf9WaOssrS77U/q/PkiVLliybpdlq4vVf89Uv7N12G3/6h/4C3vKn/uQt646XQr5i51vwFTvffFfSXpRzXJ9+5gW9e6UDfM+XAXfTRIsl8I//cPWZJUuWLFmyXLY875DRH/zgB/Ft3/Zt6Tf/mfuhH/oh/N2/+3fx4Q9/GD/xEz+Bk5MTPPTQQ/jO7/xO/Ff/1X+1Fvbpp37qp/DjP/7j+I7v+A7UajX8uT/35/C3//bfTvd3d3fxC7/wC/grf+Wv4O1vfzuuXr2K/+K/+C/wYz/2Y8+7gB6i2UG8COxUEi8i1EjuELRx0NEJJ15XglCfdwBKPVxIMkT6+fmOLO+dgpIReUU9FaiNwE4HG/m8g+f6Hp8h0EVigXmrPSIiWPVWAk7z13J6udSu1EcBNX/fRQFAtY+SuppOBMhSJ4Zw1fsRWOgkhBKw3s78eW9HtGkV+O6Atdovsk/UztWmEWCq7YVpex/UPPWa28qJF/f+iQiRCACtqvPbgaRlWaaQwr1eD8CtYSo5Pqh3DsnNp556ChcXF3jggQeS3RqNRjq7FliRzsDKg5UkGp8bj8dpbFgsFunsWYZJpk3m8zlGoxFGo1E6k5d9bDKZYGdnB/1+H1tbWxgOh5hMJimtyWSSwmOTtCTJOZ1OMRqNUuhrbqIBkPShh6iS1JPJBOPxOIVi7vV62N7eTnZTUrIoCnS73VSPJMUPDw+xvb2diOjlcpk8gWu1GnZ2dtbGTa2HoijWQjir3krCMqw0ddWzmvk+22q9XsdgMMB0OkW73U66koReLpfY3d1NJLSG3C/LMhHbe3t7qNfrqb5pE/Z7hhPtdDppwwDJY7aX09NTjEajtY04DCXNtk5SlukpyUuhxzaJb99cRY94ept7/9Q2Ty9g2l83MFw2IUxxYkv102e0HvV5JWr0WkQkMm0nDCMiz/N2XVUiItHfA9aJwyqSR8sSbRTzZ90WnobazsvsJJeLzyM+/3i9ad6ah78XrdeYXjR/R7pHdtH1Q9VcH63lbpeuP+v16vq6RHaK6k3Fn/WNi66Hr1/UJlUbIqK6jPpDVBa3B9dq3kc932j+93rQ97yMukaN1g/6rBOsmp/3LbeF61S1ztDQ+77u1rQ1z6gdRHbe1M+yvPLkS+3/+ixZsmTJslke+rLXYfe+qy/4/UarhXf+u38e48EQf/zB371EzZ6fFCjwtr13oVlr350MXsR+uLc+AOx3Lk+VSD57Cnz65O7mkSVLlixZXrnyvAnhb/3Wb91IlPz8z//8bdM4ODjAT//0T2985i1veQt+/dd//fmqd4soSEQgmkSNEgJ8Tj1b6dWpaSggqiGGCSYpGKSgT0SQOVAVEYdKfKknoD6rYTsjYNQJPAe/WC73/GI6+p4S4AoIE5RyACwCxxTEol34rns7aJ05GKbeMFXkvqfpttd8I3DYQTcF0KJ3tFxqQ7V1FQGpojZV8l/L7+loWRS0dIDewdYqMoDtzutb7aO29Lr3NP17VfuPgFj/XqUv3/d2F3niRH2Fz98uT8piscBoNEoEG/Omzbzc6tk3n8/x3HPP4eLiAlevXkWv10tkY6/XS0Tk6elp8uotiiKFaK7X6ynsNL1Xa7VaChms4xLJuOVymc48LssSg8EAANDtdhMJTbKXZOt0OsXR0RGKYkXO7u7upjODy7JMxCDJ2ouLi0Twqvdou91OZad3L8dQhsyeTqcJZGQd7ezsYHt7ey188zPPPIOTkxNcu3YNe3t7ydbtdhsXFxc4OjrCzs4OWq1WCmdMQrvZbKLb7aYw2zs7O+h2u8kT9/T0FL1eD3t7ewBWnsXdbjeF9mZ/pj05FrGPMv2Tk5NEHJflijgdDAa4uLhI3tkMob21tYWDgwP0+32cnZ1hMBik6+pZSQL34uIieRLTA5r1RoK2KIpkf9qObajVaiW9lWxWb/vl8qYnOs8YZv7ajmkDvksvauDW89HZZrXvqTfzZUlEsqn42Ol9XseIaKyuItt8c1A071b99vT1uz7jZGa0bvB5yZ9zfd12mk80Z0TriMhOVWVUu+i70eYqn2ui+tx0nXpHttB3dHNcNBf5+i+ao3yjmuuhv9X2vknL26DOcbpR0eueOuiGOq8vL7/fi+zp+vua2NcgKlXrAtVB146+zuHY4WsQF53bnSD1/uRpu/2q+mrUt7Us0XpF1wQuPs5wbony9PWdb9jzfur9Ujdr6rqyagzK8sqRb/0S+78+S5YsWbJsli//hq9DUXtxm72a7Ta+/nu+C5/+8B9gMbv8jbt3Ive1Xo1vvvrn71r6Hxu8Dyfz5573e60t4Ae+Eqjf5dM2fvdpYDC7u3lkyZIlS5ZXrjxvQvhLUeiNqeAJwWn18HSySIEoD4vr3qUkZhTEURCK9/hJHSLCUokS97zVclAH9SRwQCoCtniP6TvJ7aCTvsfrXs4IcGN6er5wBBpTorSV5NbnqoBBrz/3iiVpo2Q0iRG1qXvGqqhOmp6CkRpGmM8p8a2fWh98tmoDQfTngDHtoECi6hyBpFpm2sA9qkg0kCSKwOWqDRERgaDgdgQC67sOGHub9PJoOtqumGZV3aptqsggl9lslkLxkpiN2oeGVCcBV5YlDg8PMZvN8Mgjj6TQya1WC9vb2yjLMp1RO5/P0ev10iYVEnXz+RzNZhNFUaTwwEq0kSRtNBpot9spXPPFxQUODw8xmUxw9erVFJq61+ulMYXnAg+Hw3SfXsi1Wi2FX26322g2mynEtXqV8q/VaqW66vf7mM/naLfbybuaaQFIoYQXi0UKQb1cLjEcDnF2dobz83OcnJzg8PAQ+/v7t4TIPzs7WyMo6RlN/QHg6OgoeT+zzDyXGFidCXx+fp7ON57NZilEuBMxPIO42+2uhYkmIc1wzCTySS4vFgscHBzg4OAghWPu9XqJjGfboT3Z1q5fv46TkxNcXFyg3W6n9sqQ341GI9mQ+VIXegT7WdpsYwwX7e1fSSjOd9xI5OOaHnEQ9W2d6+gF/2JFyTMnOaK5yscNvafvue7RGBu9H93X9932Tj5GY1Y0/lE8HSesIoLPx0FfD2jZ9b1Nefpz+oyuKzwdzVM3hFWlBdxah1X1pvZwm2v+VXbhM0oauj0jXb2u3Z5RObwd6zu65oz0o0Rr2ao1muareuva1NP18U/f0Q0fvO/tOrKVrsciUZvoOk3bbFSfUbk3tRe1R7S2iJ71/y9UtM50jehjo5aRbU3XPRSNFKJ5e9uI+pPaw+vpduucLFmyZMmSJcuXhjRazcr11POR/fuvobe7g9Prh5eg1fOXV3ffgv3mg3ct/cHiEIvy+f8f+tYHgDfddxcUEjmdAP/0I3c3jyxZsmTJ8sqWVwQhrMCQE6zq6eRglV5XMFxBKGDdQ1WfIzFE8LwKVHJwNAKtFHCjRx71UJLZ02IZFbCqAoF84ahlcQBN82S+9J5zYlwJhSqisQoYVyLZQS0HcBn2lb8dOFfwzL1BlPDX59w2Tkwq6FpFAPA9bQ+0pYNynp7WGQlFrQfXxe9Fv7VOIztFHjIsQ5RvVRuJbBcBtNoGmCdJJi+vgsZeP9E/PqqTe8ywDJu85BxUrgKzR6NRaoPqKcw0tF8sl8vkccn7w+EQTz31FO6///7Uv2u1Gvb399HtdpO3MNOnB2+9Xker1UqeoADSOb9sMyTdSCCzn/C84clkAgBrHrwXFxcYDAbJe3Y+n6eyTyaTRBpeXFwkgpNtnMQtw0xvb2+j3+9jNpuhXq8nz2ISs9FmCeqzs7ODsizX+vZgMEg2G41GiTztdruJRG6329je3sZ0Ok31zfN1l8sl+v3+WpsiWc2xmmG9FZjvdFZxoUajUQqJTW/d6XSKRqOBfr+fNgWUZZnCIQ+Hw1Sera2tRDaTuF8sFjg5OcFsNsP+/v4aUV2WZSJwJ5MJDg8Pcf36dQArEp3evmdnZ+lsZYb61o0D6hUWkS/caKD9Xjc06JzDkNccOyOijJ/0Vtdxhl7Sk8nk0ryDq/ow9YpEdfWx1MeraFzn9Soiy4kwPu/jq4+zEdEZkVR6Hbi5rtFy+1n0qls0X/k8oWOnz4v6bkRgbiLltP9Fc4eSZ1Ganp6X29cRXm5PU8ur9ebrvE3EmeuibaNqHq56z23mOkdtU72cq97XNVWUrz7va7KoD0TzeSRRnVVtOKxap+ocrmuiTe1H09frmp7mo+tDJ26jTRzUO2rrLroBlWOx6uX16GsznZ90Y5K/63bT9hyNVZs2QGbJkiVLlixZvrTkd97zK3j917wVrc4Lj2m8XC5x/YnP4/zo5PIUu0ekUQO27uKyaX4B/KM/AD53evfyyJIlS5YsWV4RhLCCSAT1CH5H4KaC5U4cOsDo5KcSjgRyFLTiew7IEyR3D13eY/rqTczfCtg7sKngkJ8ByWfU6yIiCDYRZgqgqgek2ykqg6aj4oSCA2fupRIBk05kbAKAlZTUPBzMpe5ev9pOtJzMQ0Oxug5VwLafjasepup97ISGl0u/RyCutie2O9rX65Hvk6z1duGEhrZxB3eVwND7TnJUAePaVt222vYj8Fbrl++r/tr/vG71U2W5XGI8Hq+FKC6Km5sUSDZqfWqoZWDl1TqbzXDlyhXcd999KTxzt9tFt9tN4XaZB0lJpk8SkJ6kDI/M38DqXFh6lJIknk6nOD4+xtWrV9fqeblc4vz8PJHdu7u7a+Qtz67d3t5GURQpTHGttgpRzXNwSSAvl0scHx+n8M20Ab2WO50O6vU65vN58iDe2dlJec7n8+RFTO/bZrOJ8XiMoiiSF+9iscDe3h52dnZwcnKSPKxJlNIzdzabrdUtyVkSusCKcGUbZeQG5kubkzhutVrodDrpfGfWc7PZxPb2Nvb29lLoaRL8TJflGY/HODs7S4Q+w0bTNqPRKNm10+kk252fn2MymWA4HKZzoBuNxlqoZ84xHKu9jZOonkwmt8wR2s6VYCzLMnmb80/nOaahUSyWy+XaZoRNBNsLESc2orE2Is2qyC9ec1I5ImMiMovXnWjUT31/0/wYzY1aRz7nOzlURepF+emGFbWBk2baFnwspzhB62O6X1Nd1PbRpp6oHFVkaGRvtZnPQ9GagPd1fqqax6vKFc3T/o63q6r242vFyE6e9ybisoqYjDZV+Joj2kQX9THNx21aRQprWmoPbYtRWV3UBt6GojU08/UNcb7epL28f7lOrpevVVwfpuvlp1R5BUfPermi9VuWLFmyZMmS5Utbnvz4J/Dz/+P/hO/6kb+IVvf5kcKzyRSn16/jd97zK/jI+x/H0jabfjHluelnMFgco1/ff8l0iOT3n1ud7/uavctNd1kCnz0B/uc/BP75x1a/s2TJkiVLlrsl9zwhrERXRNypkCh2kInpeNhmfc+JM+BWcFEBL+rgeaiO7lWlZJg+r0CcEsNKlDnQ5V4i7s1IIJDCd/isg6BOBjoIqx5GEXDsQKCCZJqulyMiHNVzQssf1VkEWivppYBxBA4rcKfeOQzRG4GL7pWiOro9NQ+SLQ7cReCvg4FVoGzUDry8bkNNi54q3g4jILsKjPfw6KqvtkeGw1UyJCJ1tL152bX/ReTI7QiTTbJYLDAYDJI3KclEjQ7AemQIYJKifH80GmE8HuP09BQHBwdYLBa4du0aDg4OEjnIcMD0Cj49PcVgMEjesSzfxcUFhsMhzs/PE4nP94GVB67aX8tNoplkJ72SW63W2oYAEuFFUaRyXrlyBYvFAuPxGMBNj9pOp5Pqhd62PKuXZaWncbPZXDv3WM9F5t/Vq1fRbDZxcnKCfr+PXq+XPIa9vouiSPUBIJHnJHBpF5K9tEWj0UhkJsltkqKcK0iE0wbL5TKR9d1uN3n3Ml/drEJb0JYkV0n2UgfqMZ1Ok9d1u91Gv9/HyckJnnrqKQwGA4xGo+QFzbYXeeFpv9C5i7Zne3ASSvujj9WcP/UevcGB1QYjhrDmhgHa9rKkilyjaH+ONntF45TPu7ynv6s2l0Xkjs87bmcn3iISLBrXo2c8b3/PSccorYgQ9IgaOo5Eenn6Sua5zXVej+zh+nuaes3baWQD1y2aI6J5wNOtEl+PRSSj5xltwov042+1n7Y516+KKN7UDqps5NcjW1S106r0vL9E9VeVRqSH9y3vt5To/wO/rnr5upH5Vq1/ozHASeSqdkbRNqHtiPp6G4jGAr6rfTV7B2fJkiVLliz3nvzR+z4AoMS7/r0fQvML/1NWSVmWWMzn+NTv/QEe/5e/gGc/8znML+lInxcjT44/iifHH8Ebt7/ppVZlTc6mwD/5I+A//kZg60WeI1yWwOwC+OMj4F//MfCeT63Sz5IlS5YsWe623POEsHt6EoAmuUQpy3INzOY1BSwdUAeQyAmGciUIQ5JMCSEHiHhfyVDmS7AoAvSqCFESEXxPiSj1aHZi0Qlqva5EuNqBpGkERtIODiQrOa+eoRHo6gDx7YA9vqsgv+Z3O5JPiQkFZCMwehOwTx0UGNQ2FHlzaNn4LkkjfUaJmE1l8TarOjiY6Wlo/fo1BUw1L33OgV2tW83H39O+FgHYAG4hLjcB197m9J6mG5ExvhmAbS1qCy7T6TR5f6pnptt8Pp8DQDqrVccmADg5OUlnxR4cHODq1as4ODjAzs5O8uo9OzvDYDBIoYKLYnV2rJafY0KtVktnB7N8PBuX7Y2E3mw2SyGigRUpXBQFxuMxtre3UavV0lm7e3t7ieAjocqya2j0s7MzlGWJBx54IIU4pncrydVOp4OiKBJpeHp6iqOjo+TNO5vNMJ1O8eyzz2J7exsPPfQQAOD4+Bjn5+cp3DbJa5K3DJM9mUxSuE0fh1j+brebwlvTg3g+n+Pk5CR5Oev4R29gANjb21s7M1nJ+clkgtFolLy9+/0+JpNJ8pAlqUwP6G63i/39ffR6PVxcXCRvWnrvMgz3jRs38NGPfhTHx8eJjNaQoovFYm38pld61Oapb6vVuqU/aZ/jOcMc6+nxy37F/sJQ2tyoANzcrEPdbkemPV/xjVzUmaLjupOKTsJF5FHV2FOWNwlR37ikY5GT8UrgebpVBJTf8/nDn4nIHtfNCUnqUrUWUdtFpK6P6b4pgXl7XloP0WafaI3A71XzodshWkOoDSNv5GgNGOXnOnnafl/biq+9XCJv78j20XNRmptIZ7cNn/cNX1oe3q/ahBit6dyGVd9d36hPu40okd2jfqbvR5sPtWy6ntO0o7L72kGv+9p3U5umDt6Wtd/75lSOS1G6quedrm+yZMmSJUuWLF8iUpb4o/c9jse+6ivxld/8TShq8eav+XSKT334D/H4v/wFPPnHn0T5MloPLMoZfvv4X73sCGEAeM8nge99A/CGK0Dwr9YdyWQB/NbngZ/5A+APngUuskdwlixZsmT5IsorghB2YpQEgHra8p6CVRGRGwF7CoQRiNdd+BF4p+COEpYOKCkhFZFrJDQcLFOdlQyPPBZdH80vAouqyFz+0eMxArBUJ9fXAVl9nnZmOdyzxt9VHQCseUR42rcD5SKQssqblWV2QlGJCn9Xy+KgtQP1EWlRRWLwu+bv7zN9bV9VOri3DPNwQNXbueZfBV5vAn+BW8FsJ0r0TGvvT9pWnYTwevXf+m5EariU5eo8Ydqa3p3UdbFYJNJSyUUlkBuNRvKOHQwGOD8/x1NPPYVut5tCFes5sPSc5Zm9JHZJDNK7lKQdRcm5i4sLjEYjbG1tYTgcYmtrCwcHByjLMnml0iuZJO50OsX5+Tl2dnaSNzzfJ7lIe/d6PfT7fVy5cgWNRiOFPaZX8MXFBfb29lCWJU5OTnBycoJnnnkGh4eHiQidzWaJGH300UfR6/XSWHBxcYHj42P0er1EotbrdXS7XRRFgdlshsPDwxQymyQ0vaVPTk7Sub08G5hkbVEUieQHsBbummUpimLtfGb1sKadW60Wer1e6gf9fj+F9fY+Q7IeQKo3kvQMuX18fIyPfOQjeO6555JeetYy6556Mx0fl/gsn2G7ZX2yjXDe9DHR+zbJXrY59YRjPiT5N/WlO5GIlIvG8du9s4ksjNLW8dqJVB8DfX7R93389Lkk0tnHptuV38e7iEhUvf39aE6IrimRqm3L51N9P/JY9fYU1aevKTx9X+/xHd9Q5XbxecXrjc9sahvR/OI60z7eNqL+oHbQ8vl6wTd9RWuaqA2obtquvW16Hbj9NTKLtqVNeW/qB55+pId7yupzqov2U21n+qltlu/52jYqi+oUrdV0Xe3vepuOSPrb5et5u42itLysWbJkyZIlS5Z7UMoSv/g//Qz6+3t4zVd9xS3rjsOnnsYv/+Q/wmf/8CO4WLx0oaE3yScGH8B8OUGjttnL+YstZ1Pgv3s/8N+9C2g9T0S9LFchp//2+4EPPgXM85IsS5YsWbK8BHLPE8IkWoB1wIWEAK+pt5gDavSeUoCJaQO3higmkK7AmhLGTrCpZxHzUkDJCVmWiQQB9XFAzQlqB7O1LE5EK8mt5XDvE83PPUTcO4iizzId1YXPsz74jhN7fj0CzjQN9+bQMng5mJaeCe2eXlqm24HpEdBX5QEV2UrT9PIzD/fkqgIEXQdt5yoOkCtI7wBrFbDtdQsgnYWr+buttT95H3CSpUpvLbODoBGgHtlM24LbLroGYI1cpX7qUcln1K5K1rPNcnxiCGB6yDJvhnxW4pl9nt8V4Ke+GrJY63Q8HqPX66Hb7WI4HGI0GqHRaKDb7a6FHtYNIaPRCL1eD1tbW8mrlp6+9Xo9Ebb7+/vodDrpvFzfxDEcDjGbzXB2dobPfvazODo6wmAwSOftcjNLURR49NFHsb+/j+Vy5f3caDQwHA4xGAzQ6XRw9erVtXDcZVliOBzi4uIikbfNZhP7+/spLPNoNAKA5EU9m83S2b+1Wg1HR0e4uLhAu92+ZbMMw0OTKJ7P5ynsNNt5p9NJ7Xs6naZzmff29gAgbRSgTUgSn5+f30JGl2WJ8XiMJ598EoeHh2kzAIBEaJMc5u/lchXaezqdYjAY3LL5iWMR+6aStxpCn7rS41f7B/saSWCdb3W+YZ37BoXnK9H4RvFxeNOzFCUi+Y6Of1VEjpbRN2jpRiAfX5wU4zPRGLqJ5PP5NJqjfQzw6/6ddafkXZV9XS+3o4vP0fweeYC6XlU6RGPznYoTfzq/Va1fXH9f6/n8759Vukb32K6qNk9pPm4XlkPvR/rxj3OWe7RuKoO3R373c8q1fToxH3m48reWNzreoMqm3r5cD9fX50btX5tsF9UFP/V/i6pNnaoD7eNrY31e+6X3E7W5l7EqP18LZcmSJUuWLFnuHZmOxviN/+XncPWRh7B9sI+yXBHBv/MLv4w/+s0PYDIcvtQqbpTPjz+C2cuQEAaADz8LvP/zwJ96zZ2/M56vwkL/9x8ATnNo6CxZsmTJ8hLKPU8IE9zy0K0KJCkZHIkCYkrSKgijaSnRU5ZlOkNSPXOr8nKSWEEgB0s9RLXq6h4anqZe53vNZjMR3xHwTHGC2gk5B6lIMjgwSc8+B+AUmPP0laBWgFF/8zn3SI2APQfAFQxlmmpnB/edLHASwEFAJVk8b/cooZ5R/TsYHbVtrQ8SPFo+tW8VWBmRIE6ORAB19K63C/dQ0c0EtJW3gQjsdL3U/k60ROD7pj7pNvfyVpWfnq/s93xWvQf5nNeHfyfBp2mQYC7LMpGUOh7pJwk8ksoM76xtkgRwWZbp/GOeA9zpdBIpzLGSHsjz+TydEUwi8OLiAjs7OyiKVQjkbrebyODZbJbqp1ZbnVc7m80wGAxwenqK69ev4/j4OIXApkcv67PdbqPT6aT+w00xi8UC5+fnayT2cDhM/Xe5XCaPYhLHDF1dFAW63W7ypqXtO50O+v0+Li4u0Ov1EsnswPtkMgGA5O2rdctw2gybTEKXRPnu7i7a7TbOzs7StWazmbyceaa09k2GYn7uueeSNzi9j/f29tDv9xMxrRsvarVV2PBms4nxeJxsrGVmveq86P1Jy08vX/VOVrKXm5u0X5ZlmbzNX6hUkXL66ff9ntoFuDW8vL6zacMPf/u6ICJ+qog7/vYxMrqvaatEawR/L7JfZEvdAMB7Om5FY9mmclQRcVVjuc4NVePiJnJNf3ta1CXSw0nX6Dm3o84BUTvhOsfz0jWIlsfboK811E5uj4i8V8JP11pqu2gto7qpHrp+8zWdjhtsQz6v+xqwav3A+76pT23lbVZt4/l5vflGAH/X62DTdV9Dqq66btR8ow2XWj/eb3ydqHXmaVSNYxTfqKL6ZsmSJUuWLFnuLXnyjz+J//W/++/xjd/33Rifn+M3f+5f4PS5Gy+1WnckR7On8Ednv4avO/i+l1qVW2RZAj/z+8Bb7gf2O7d/fjwH/tv3A//bx4Dq1W+WLFmyZMnyxZF7nhAGsEZkROCYgiokRBWUIZhHLzkFchzwVOBUQS9gHTxyIKgKBARiLxwFsBSU0zIR4NFwyaqresA4YOV6q90I8tP7WAElBdmoj55r7Pk6WUAAUH9XAXzMM/KG5LNKxvFzE4ngoLbXlXsNRWBcZL8IwNN2pp6wwE0iJQJoFWCNwGgAKXSwe+VUAbNVALzbi/fV48WB1SqQvwos5n0FzV0Pb+P6jIKbKpFnXhVhovXBdyOyQfvXJiC7LFdenDwbV0lcEmHUScNIaz9k2bR9axh7BYfLskSj0VgjANlXtbyz2Qyj0Sh5xlKHra0ttNttLBYLnJycrJ3ve35+juFwiH6/j36/n0hukossU1EUKdz1ZDLB7u5uCqs8HA7TM/QoJil4eHiYbDUej9Fut9FqtVLZSKryXRKd1EN14NnDPE/47Ows2Z4kN23Mc415ZjDzmM/nyct3PB4nopyEL8lvEsicI6gPCVzdgDGdTlEUKy/sslyFj240GphMJonwZ8hqnsN8dnaWzuulTmwHJM7LssT29jauXr2KK1euoNlsJjvMZrO0EUBDSWvIbJaZJDP7p7YNHZ/YhhkWWtsZ7cyQ2/Ts9nGNob839Z/bib+r47CGqPa+72OSb0SKxkSfhzVPHwc8Lx2XfKzWPL1MmhfHy2j8i3SIyC0f33Xu9fyqCCKfj3wjSxUJ5aScz4eql9pfNwH5miqy4+0IZx3PPa0qD1VNQ9Ou0r/qmWidV5VPpGNVufw5t08k3g6r2lVUdn1O10ZReas2C2yyVyROGlfp5LpoWd2O0To1ejayWdTevQ40vagNqh5VHr+uK39H3tt8x9+PNolE/Tha52XJkiVLlixZ7h156hOfws/+rb+7Wi98CW0CW+ICT03+uHKN9lLL7z0L/JM/An70a4CKY5oBAGUJ/P3fzWRwlixZsmR5+cg9TwiTUHAij+CHEgRKaPK3EooRcMw0Hajh+yoRKKnpKLmgz6kHF8FLJ3sJmvKeknWat95jeqqvgqMRKBUBkA6kObBEXZ1Ep+0jclW9rh3ocpBLSa87Aae1zqJ6r7K13tM6V/La61ltGgG++qmAdkRka/5ODGoIYmA9jHlEcET1TOJB6ykCU6P61fbq5Kz2J7WF11fUltxerr/rqfWh6Udtwb8zfyWfI5LhTsHTslyRwjwrVvuNbk6ZTCYoipU3LaVWq631ASVF1OvS09U60L7BtOjRWxQ3Q1IPBoNbwlIPBgMcHBxge3sbZbk6F5mkaa22ClHd6XTQ6/USyVyWZQoTvVwu0e12AQDT6XQtfDbJyvPzc5ydneHk5ASNRgPXrl3DtWvXkt4kKTU0Pjf3MDwzw1OXZYn77rsP0+kU169fx87OTrL/crlMBDPJd5LWRVEkz2GGfqZ3N4n4s7OzFIa7qp0qyU9imF66W1tbyUuahCgAtFotLJdLnJ6eoihWZDrtc3JyknRnfiRhGS56Npthb28PDz30EK5cuYKyXIXGZljx5XKZyGs9S5r2Y93yuU6ng+l0mohhjjE+Pus5wDr/RMQH60vHIHqKX7Y4UaTXvN6eD6hQRaD5fR/b2G/d0zbSy3Vyr2zfQOZjtz4X6ed/VbpEtnSbVo2/0Xuett7XNhVtanPiS9/T+qB4O9W5ICLBXAe3ZVUb0U1Wtyuz20b7k+flc47e97Sq1mDRfdXb843mDrdLJFoWJ9GjzVms06p7nqevD6hvtDnP70W/VTZtxtD2F9nT125R+1GbRPXifUfL599VP/0fRu8xLT3WRq/7uq9K96husmTJkiVLliz3jiwvXp7nBN9OHj/6Z/i+B//qS61GpfzUh4Gvewj46gfj+2UJ/MbngH+WyeAsWbJkyfIyknueECbg4eHklJAhaBh5KEaAkKfnwJWSjUxTQSAKAR4F6iKgiO/zvpKB7gFKvVg+J3k1LXq16TUSD6qrgquuO9918I2EQmRD9cJ04JX5OBjrQHIEZnkdepkj0D2qX32X+m7ymtP0ma5+UjcCdg7EOuHsgLPWJ/PQelPyoAoQ9Poi4Bl5Det5sVEZvf4caPa6ibyUNa0IkNxEnESkhm+CUHt7utoG/bq3Ef/0NuM2d5nP5zg5OUlhhxmmeGtra609kLTzOiJp6zZQmzqgX5ZlIlHZn/lXFAWOj4+TFyfJS5Kv9G4tiiJ9J/lL79t+v59+z+fzRDrTO5Qhm0m4cuNHu91O+ty4cQNHR0cYjUbpPN9OZxVrid60ABJJqgA9z8vVUKI895dnBdMLmgS3EtI8e5mk6P7+Pmq11TnBJLvVXjre0ovX64LtQu2h7YUeuWz/k8lkrT/wrN+iKJIHLb11ScKX5Wpz0+HhIRaLBfb29vDqV78a+/v7ichlnhF50G63184p5sYCXms0Gmi32xiPx6n9aPvk3MP09KxqjhncNMA/n8/Kskyey3dDIoIGuHV8p53c+87T4nN634kyHU/1vo65TiRH3pNRuj7ueVmi8t7uHbWJ5uNztetB0TWN569pqbiHr4/lmn7kEVp1X9ceXn+atqfhz6i4jaq8k6vyjeYo10XT1+++WcrXjZFtfc2ia1sXt6uWIapzn/OdrK6aN6O5XNd1UZ76vLfDTWQoRUPd812vs016ajvxDQm+QUM/dX7ydTLF1/5VZd3UB6PvqpvqXFWfnqePXVmyZMmSJUuWLC83mSwHmC1HaG31XmpVQpleAP/N+4D/53cAj+7eev9wDPy37wPO8pnBWbJkyZLlZST3PCEMrJN3Sno5QFlFICoI5cSakjPAuveBek8pSAzcDGPt3piaruvn5wQ7oKeeCSRANIQs09Y0SDooYK2gkpJ/Gjpb7cln+cnzSR1QU2JFwwY78O4kpafPZx1UZ7m9rvW+2pffvcxeB9oGtB3QFvo+7zmZ523EwWJNuwqsc68TJb/vFFj1tKN2X5WW29rBx+iZyKZqB37ezmPLyxnZzevQvRM1zyqSwduF20brrgr8dRmPx2vtodForOXJtPQ8VtqEJKqTSwoA875eo8eqjjPU9ejoCP1+P5HT7Xb7lo0jLOf5+TmWy2U6c7dWq2E4HGIymWBnZyd5uZblyhv34uICV65cSeMPQzqz7CcnJzg6OsJkMsF0OsX29jYeeOCBpAOJQt3gwTFluVwPn12rrTxw6SU8HA5Rq63O4J1Op8nWRVEkmwJIHsIM5a2hmNmn+v3+mh15v9lsJluqB62SwlqXDCs9mUwwHo+xt7eHZrO5tnmHdc5Qz9zMwLSL4maYcZ6BfHBwgIcffhjb29sYj8fpjGKdE3TzEG3JvGhXXmeI+YuLixRCm/WpfUXbofY3ln02myVSeLFYpLYOIJHbtPdlSUT8UJSo8TFJCThNy8vGdHj9dmOU6+Tfo7Gr6jm9X0WS+b0oPd0wo3Ojl0PHuIiEuh2RF9mgykY+x0Y6b5pHtP/4eotl8LK5faP5wElDnwei8nsb4u+qTYBeHq2XiHz19si0o/VjtNHO01adfV5meTk2+IYcLaN++iarqB4i21atU3Rt5e2c46+K6qj9m2OYjrm6aS+qB7X3pjaqtozaWVSHTEPnDLedphOR0x41yMdTL1O0YZDPefpZsmTJkiVLliwvJ/nM8MN4evIJvKb31pdalUr5xBHwEx8C/s9/EmjKEvViufIMfnrwkqmWJUuWLFmyhPKKIITdA1NBTQd2CLYo0UJQjAAUf3t6FA35rCAU31MwXoEngvIOnLmHiBPDej0Cm92bVK9HZKOHAeVvJVspEXgZAXJKOKseShLzXaZbBd45MUY7O4DmIHcEOmo7cODPQTpPg+VwUsGBSQX9FKzVsy7VdhQFK+nFyfpR70j/dHvzmurugKKWyUFkJQnUnvyuBFRk64jwVZs4IO06RV6GbitP2/u4tgnNP6pnLW/kHaZA/CbCQ9Mbj8fY2trC9vb2GunKeuY4w5DLjUYjkZ+0Ea/zvGF6sSrozrqm0EtTy7hcrsIU7+zspDN/gZshjBlWeDwep+fn8zlarRZ6vR7a7TYGgwGGwyGuXr2K7e3tlG9RFJhOp2i327i4uEjetsPhECcnJ7h+/Tpms1nyzO33+yl0McMI6+YThnju9XrJq5biY4yOi/RC7Xa7qX0xXDOJ03q9jslkgmeffRZbW1vo9/uYTCY4Pj5Gp9NBt9tN6fOsXWD9THb1kmVfIPnNdzSNyWSCer2ezvFVsl4J24hkLssyneX8yCOPpFDX2gf1/PWLi4t0HrOeSQ4gnak8mUwS0c4xiaGzLy4u0n3e0/L5uOybhKLxgGners/cTpwg4jUnm/STz0fzvo7nVSSkPuskF5/xuchtExGzrkdEzvgYpDq7njo/6jXNS+cjn9NdRxVfX7Csuiaq0m2TzppelI/XF4Bbxr7ILqp3JF6vVXnfjgz0PKO0ImLR2yuvOdkb5alp+JznZfO0vK3q2kn7qz7vc3mVPm43L5/2i6r+q2tmFS+ft2nXwQl4X0foWqbKnppWpItvEtnUv92evmnNba91w2teZ5qP172PR2oLTzdLlixZsmTJkuXlKV8a65R//Qlgrw38778WaHwBLvj8GfCTv/fS6pUlS5YsWbJEcs8Twgq8OHhE4FuBbAWMlBQC1s/pJZDiQJwDSQoWaR5KMms4YOqqvx2wpThwVvU8dVZSLkqDv6mneyI4QFYFcCrQVKV7RCh6mVX/KvBQ01A91DPM89Q0HTAsy5vnXkY2qcq/CgxmvvyuBJ+3mwg8Vq9s5unEv9pQwz2rPtoHaB8SPGoT97pS/R3cVT217lge7xsK4G8i7SNgdxPx4XpGoGi0YSFq59TDbRaBu1U6RkJSlB6jBN7dg4ykr4aP5jhBHUjuKZlYr9cTqcezXUn0kbCcTCaJOGU46L29vdTG6E07mUwwGo0SEVur1dbCOJflirQcDAZ49tln0Wg00Ov10Gw20Wq1UK/XExHLMh0eHuL09BQXFxfp7GE+O5/Pk/5KRjOMNsvNM5bn8zmGwyFarRa63W4iemezGer1evL8LYqVZ/FkMsHJyQnq9XrSnyGcdfylZzHDefP9Wm09jLSeWc4+Q9uxTWxtbSVvWNbhcrlMZyLTg7jdbqfw29RDiX7dPMC28fDDD6PX66Esy+RprWNzrbYKi+3vazuu1VbhnbkJodFoJBKYZW+1WmvEvPbnKGxwND/6XLdcLi/9/GDvt37P561NonOHE096z8dvHU98vtS0VKcob09bxzZ/t4qsisg/z1/T841XOp9Eevmz0brAy6T3fJz0jTqUiNCOxnafe3xNwk8n7qK2UlUGvxaJrxMiXbQdqT3crlH0D58fI7v6es43a0U6uw187tY5Up/zd6P2WkWWMg+3W7Su0rVB1fyvmxv0fmR7HcO83er45esTbTPejn3Doz8f3Vf76z21nZdB20nVWODi6fh69E7HxixZsmTJkiVLlpdClljid07+1cvaQxgALkrgZ/4AmC2Bf/vNwLND4Jc+BUzuzklJWbJkyZIly4uSVwQhrECWAl3qhaUkmQNnDgIp8KbAEvNRUE6BPXr/KejnnpfAOnjk4Bmf43UlURzodKKX77pHJNNWbwUHaJVYoLdbRJQ5gFclTrZHQDEBOuqmtlFAy0GtCCR2vXhPvac1f/eGLssynblKvdUrysHTKiAeWD/jT/8UJPY6i8BLJ1WdBFAbuj30mhLBDkxrG3fgWutQ274CvXxW+4vq6t6yUdmrAHAVb9MRceDtYlMfU/F+6c9VeU25LBYLDIfDNdKSxKG3dbYtEpLaPngmr7Z7JfuZJgnQxWKBxWKR2hCJ07IsE+nL9HmmMNMlKdtut7FYLDCfzzGdTlGr1dDtdjGbzfDcc8/hypUraLfb6Ha7Kb3pdIrJZILhcIizszPM53M0m00cHBxga2sLvV5vLaRwvV5HURQYDAaYTqdr42S73V47O5h1QcK1Xq9jb28veTCTVOWZvyRIOQYXRbHmwcu2yBDXi8UikeZMX/MryzLZlSQnN1gslzfPBK7VaphMJsmTWNsCn+NYwvGchDFJZvb/Wq2WvLpns1mar1R/ehczvLfqxnpVvXUMYDuijdlOASQdI7KNz5NM5phEeyrBwTb0YiUiaFyqiI6ILNR7TtxE8xvL4+Ol6hZt/vE0Io9ATUPH+CqCUcurv3Vcj+57GSg6F1TZKtq8UzX/RPXg9vC5Qm2p+d4JCaZ1qNeidRFw65m7Pjdomqq/lyOaA3xDYJS/28X19XJV2TjqA5G3r+ej87OveXSO1rqICEm3u44Dmr/bydcyugkIuDkm6brC7bSpL+t1zztq4zp2+QaF27XtqrJp2aNxy+vJxf9v8Xe0LFH/8Q2Okc53sobJkiVLlixZsmT54kuJD538Ar7ngf8Ira3uS63MRlmWwD/+Q+AXPwkMZsA8L6+yZMmSJcvLVO55QpigSRSeV78rCaNEsYZ3duBNAUaGe+ZfBNQ4gKZklD7HMKAKQLkHIz3GtFxOEhH8VzJOw5JSFKyKAGD3ztgEzPG7k+tOPERgN98FbpLnage1vYLtDpZvAh29vO4BqnWluiqxoSCe5kV99FPzd/A8IhI1bbeNSgQg0iZezggEdiC4ylYRqMtPPZsvIjW0f7iNvM42tROKEl8Oflb1zwjEV9tEuuj96D2KbmbQ/KrAeQApZDC9U/V5EmasE3qqqn5sizwjt91uJxJQN6Y4sE8ykt+5qeP8/BxFsTpHWMvU7d78Z4skKe0+nU4BIIU+XiwWuHHjBvb391GWK6/VbreL6XSK09NTDAYDXL9+Hd1uF9vb22g0GulMYj3rnITy6elpsoGGkea1Wq2G3d1dLBYLTCYTNJvNNYJdgfzxeIxer4f7778fo9Eo6U8SXkNLk9Sk7XTTA+cH1sV8Pk+ELUMyL5fL5PHM/JvNZqoHeivrmb3AzbN1aX/qwDOFZ7MZWq1WqkPqSZJZozjU63U0m01sbW2lstEbmuM/SWjdYMBPksAkbpvNZjoP2MeAqn4UkRAkpieTScrvxUpVH1Xxvuh9KSJhNhEzEZmi46OP6dH4rXOqztc+Dmod+fhaRRxGJKJ+d4Kr6nc0dqp++o7mS31Ub50jfG5w0XqJPEg9fV9raR4+/1XZxNce3jai777Oclu5vaq+Px/xucrL4nbfJFXrtqr0fG3na0L/7hvKXB+1heehaeicGm1wjHSvqt8of/az260bvP16WmoX91IGbo0kFInb0teiurajbdXWPjZo3p6mtmNdX2fJkiVLlixZsrwc5WPnv4k/OPsVvH3/e15qVe5IjicvtQZZsmTJkiXLZql2VbjHxAE6Bd4VdAFuglH6vIfXddBIQRcFWPS7A9FKpDmwpZ6rDvjS08sBXc1Pn1H9FEBVksXzILmidlMPMNc3AigJYClApYCle0tEQL2DYFonThJFwHv0qXo6yKdtQQm46Fm3WdU9J9DdY442rapL2pekjutIstrfUcI2skEEqmr7iEjZiJzXMNVV4LzagoSW6uh66HUlA1R3tk8noSJwXgHQyM6eR9Seo764CeyOpCxXhOlsNkvEobcVksAk5RgOWfse+6faVNuSetRrG2F9kZReLBY4OztLxCvPeB2Px2nMm81mOD09TSQo26GShp1OJ4WnpofucDjEdDrFeDxOOvX7/RQmmV6/Gka72Wzi6tWr2NvbQ7vdTs+wvAxtzDGS5C9JRm500Y05RVGg2+2ubdSo1Wro9/uJdC7Lm+Qw7ave0bVabY18ZZ3Rlgxb7aH7T05OUnsYj8cYj8cp3DXDPjNPtg2S42W58khut9vY2dlJnsskniksO3Vj2dnGarUaer0eer0eut0utra2EsHc6XRSqGj18uUZw1pu5skyav8viiKR2iSu2T/YXhjq+zI90bTf+jjrfTkiBn3MY9vZNIbodbZBF3/e8/G5Ra/pGB4RtE4cbRrffQyN5kgf9/wZn1t8Hovs6tejMTJ6ztcKSmr5WF21mUrTqBqbfR2heUXzGCUiOqM1ic4zvp7x+VYlqkcdu6N1WrSuiNLS+cI3Lajt1B7RvOttJbJdFQHpbTAijD19nx81D69f1UPXsLzm83q0xojWgF5n7lWr7dTtGNV51D6izaRqM+/nUfk9Pbej29PbTJYsWbJkyZIly8tR5uUUv3vy8yjLvGbJkiVLlixZLkPueQ9hYB0A0/M1FRihN5aDSOpZpUCLg0Qa/tkBUiAG0hwwq/JCcMDMAT0+w+sOgOm7eo6mhkqMAHAnQhUEY34O2uozCm5pqGW3gxIoCtDRK4+/1WMqsrMDj8BNwEuJIop7xjIN3tO01LaqdwSyRyC0Am/ukaIkVVQ3Wv6orA78ksjbBNRTdwf5tS7ohajvOjAfeQppHn7NP7U/MX3WfURuULeIbPD6iIB6Baq9DjeBq/o7esbLv0nomeukrZaPIYFpCyVBAayFktYoBrqJg17IJJgBrEUyYHjixWKBwWCQ8tSNBiQ7SY6S+NTxdLlchT4uiiKRi88++2wKjw0AV69exQMPPIBut4tms7lGaJIsVs/hsiyTV6qfPV2r1RJpqeXs9/tYLpcYjUZrpOpoNErEL4lqACm0dlHc9BpeLBZot9uYTqcYDAaJ3CbZTr10zOf5woPB4Ja+vVyuzkOmLiTUWX5tT7Sr9pd+v48rV65gsVjg/Pw8lZUewOyj7Iu9Xi/NWQztTa9h2pDkP9ttq9VCs9nEaDRK7ZN21bGp1WphMpmkPsPyLxYLTKfTWyIG+GYPhhC/DNnU39T2PidX9XUfa3y+riKsImLJx7noWbbtKC++pxvGonK7TlVjmIqTU/qOhmJXvTgHV60TfD7x8VjzVkJPy+rrFrdfdD26H8297s3r7/n9Ki/pqMxqR31Gx9GoHvVZt7fn7cdFROtEr1OXKN2qdqdpaJ1Vpav1qYQ4bevPqw19Do76oevqdvd2p+sKJ5z1Ga0j1y1qn56m2j2yp9qHaUVrbk3D1zbUU9P3OqNO/Iz6QUS8a7p6tE2WLFmyZMmSJcvLUX7v5D0YX5yjW999qVXJkiVLlixZvuTlnieENYybehRqCFXgJhhKkMTBSz7rgL+Kg06arwMuDn4p2dhoNNbyIini4Y2ZhwNe7kHmIJACvQoq0T6qq4NXSlo6iRl5/7JsBAYd0KoipfmegnAR2KgkmoKDmpcCaRFgDNwkykj2OLFBgszbQwQOq+0ArJGqGt5V60PTiwgNErQKECpQrHZgunptEwjsILjXgXvAqV3523XT+qgC+DVvbV9RWTz/CJzWNLUu2IY0rQjMd09hB4Q1Dy2fg8i3I2UAJM9Zbk5RL2s965WkHP9IJJGsrTpbmul4n+G7+h7vj0aj5K1K0lbfY/hieqoy1DLTY9jpJ554AkdHRym0dK/XwyOPPJKITW5YcAKK5Z1Op+h2u5jP5xgMBqnsJExJZpMEplcyQ1dPJhP0+330ej2cn59jsVhgNBphNBqhLFdeuCQy9cxhkqyNRgPL5RKtVmuN5JhOp2sbanidZxvT05jkuXtfkSwn+UxylSQx64Z10Ol00O/3UZZl8rKOSBS1YafTSSGpd3d3sVwu0W630Wg0Usjs7e3ttT7B9re1tZXaADclcAwiEc1zlTm3kSynPvzNZ+bzeSLaWe4XIz6263X97bahRIRPVX9VYikaI32c8rw1nSht1V3nMie4mGb0ro6f0Vzkafhmtmjs2kSy+bhYpZ+PhW5Lf8/HbC+jjsORPb2cOme4bdzWOp57m6ki7yKb+zzl7SRqb27LaB1RZRcvH7Ae9tvLELVT/+1zu77r68CqtY6v9arm78ge2u68H1WtUaI1C3WM7K2iY6fbPhobquqwaiOE6szvflSEzhPRJkXVW8dtX7/5eOT9OFq36th/WaH8s2TJkiVLliyvXClQoIY6lrhAicv15n1y8jG8/+if4tuv/fClppslS5YsWbK8EuWeJ4QVBFFvUweq6OWloJh7OJGUVLDHCTB+j8Ah9bRR78uIpIrILCfOKEpckwjiM5H3i97XvBw4JAnkhGwEEuszWlbNw4FW9fyLCDa1kYKMTrREAF5EClZdZ14UT1/1qiIYNA0lTChaPxFYrvkpaazPqAeIi9ax1r2Cqt6utJyeZrQhQu95u9G24QB1FcitOmnfupP6jMoe/XadvB4iQJj5OIBeBfB7v4zs6UIClue9apth3vQC9rRINpJcLYoiEZVKRJKYY5qsIxJ8LLMSv8x7PB4nYpMkLJ/d2dlJIZgBJEIWAJ588kk8+eSTODs7w2KxQKvVwv7+fiJD6ZU7HA7RbDaTZ7GGfG40GmthkOk9TFtwwww/GVb6ueeew2w2Q7fbxe7uLhqNBobDIXq9XgqFTS9abv7odrvpLGI+x3DZwOrMZ4ZtZhlrtRomk0mq/whQZyQKbde0o4aXLooikaZlWaLT6aQwziTez8/PU77cIDAej9PmAJ5hTGKaIaH7/X7y3B0MBsnjudvtoixLdLvdlD/JYpK3Ok8URZFIcpLmHO+0b0+n07QZiWMVNxGUZbl25v0LlWgscWKF96KNLFWEqZNdEfFG0bFd54SIxPL8lADcNB76Rg8Vz9u9HH1t42SSzi9OSLoe0Zju+VQRdV5+zc/nlWiOdR193PXxWj0ePV1/dpOe/r6+E80BPq/+/9n70yhbs6s6FJzf6buIuE2mMpXqG0QvoQaBAWPDkyWEQWAYGNsY+xlssP3K2GbYVY8qv6oyfsMw4Jkfbp5dVTZl7DK4A4ONANOaRmBANBICIQlIkVK2ysx7I07fxPnqR7y5Y5551z73Zt5IJbq51xgxzjnft5u1125jzr32jmwZ/c55c3reTuZG6Xk9Rm0st+GJZYjq0dcf+2wb2dq9W718bjvfdKd6cC7Krb8iu3m5vJ9oWN24mVtT6KfP/Z4u0/TnvrZwHd2e+n9GNEb5mkZ19A121Mk3RRQpUqRIkSJFityuVGjg4/A5eD4+CY/gt/F+/CxqXOQpJDV+/fqPFUK4SJEiRYoUuQB5ThDCemRq5PWiRDGF4D1BomjnvgM2Dp4ShIm8E9ULmHFJjDgRFYmDQerhQoJIgSQl6NQO+8BMtZmSGg64qSgxrDopKeXkq3sQaxkVCNZyuB2UtHIPZ82LuqgdVA/1AFS9ma6SDCyftw0nxm9mNwXXc+Cqg3sRGJ17pp9eXxGJzXSc1M6B8SxzpEvUBrx8ESkRgf0O7Kq+DK/6RkCwph1tquDzCGyNyAEnBtTWkb1VVqtVOlaZpCfHK+0PtF10Z3Cj0Uik8unp6Y53alWdk3b0PtU02U61rfoGF7Zdxjk9PcW1a9cwnU5xdHSUyNBut4sPfehDeOyxx3Y8X69evYrnPe956ehp9QwmOcyjjZfLZRq7er1e8orlaQ4AEulI4oDk5HK5xHg8xna7TccjMz3qTa/fo6Mj1HWN6XSajjCm5y7HYHogd7vdnesEWC/dbvcGYo6kLo/ibrVaycN3tVrtbACYzWbJK5je1r1eD91uF/1+P+lPm2kbJKk8m81SnQ6HQ4xGo3T3L4Adb9x+v79z9Dh1Jek8n893NgyQsOc8onNZNL+pVzCFYwJtc5GEcETsRPPErRJ12me1H5BA0bEt2iikfc118Tx8zMuNpf49l4bqxTpg3WicaP5xMknXIhpW9cmRckxPx2D3WI08WDUN143l8ru7XeeoHqN1lM+fPn+4XtHY7+XVNZjqEc3BOe9Oj6Npux2jdHxTgK9Jov4RtRHX1+N4WX2uizYtRmviqD9q+Kjv+PpG57GcvXx8cFL7ZnUb1RPfafndHr72Vj29vtUe0TrDbeTPo/HDdYzKqZ9FihQpUqRIkSK3K1fwYrwUn44Gmngp3gCgwgfwM9heICn8O9Nfxsn6Izhs331haRYpUqRIkSLPRbnjCWEH7YFdwEQ98hyIUoCcIJsCc7rjXvPSY15VHIxTcE2JGdehrndJa9UjIvEUNMqBTU44uUepp+Xgkn6PbEPhOwXm1F4kiLxeHCx2YNYBWSXxIs/OCIR0sNtBbZaJZAewe0yzA3dKbivRnyufkuzUW4FH9wzJgZpqZ9VHy+lpsCyeRqSf21HLGoGaenw0P09PT3eIFj8qXPP2Nq11r7bxdh31Ve/bEcGjZXcyxIH3qD3rpz+/mSwWC/R6veQZq+AzSV96ZfZ6vWQbeqPWdZ2OZqbXL+2r5E6kpwPW+pxEpG80aTTO7uKdTCZoNBo4PDzEcrnEo48+iieeeGKnj45GI7zkJS/Z8cgFkI56Zj2SlKTOvNeXxOh6vU5tyI9srus63X08Go3Q7XbRarVwfHycjj+mTkyP+ZCQJRFPD+JWq4V+v5+I4KqqUjpKOLOOSMCvVissl0v0er2dDTC0BctLkrmu63RMNj2Q2+12Im2pE4UbB6hDp9PBarVKafCUCx5Fvlgskncu2yLvEyZBDpwdZX3lypVESs/n8zSHrddrzOdzDIfDlA7rgO2TdmLdsq/zruSqOveCvpXNTk9FdJNMtKGGbUXDUnw+Yv1oHCf5NF5E3HieTrRxTI/m0EhnJ700TkTMRmOT66vi86qX099Fm9uicTyyk+sfSTR3RWmrRPN9NJ7n8onm4rq+8R577c9MO7c5gM80r8g20TOWSdPxOTJXZ9o2VNcojuuwb53leXk8zcNt7PNPtNaM4kfrZIbVPpSzBb97WC+7ltnXDV4OT1/fR2Gitqdli3Tx+JxnOFZ5PVHfaBxzHdSOEblcpEiRIkWKFCnydOQyXohPxVvRwP9xwhQaeClejw56+F38d8xw7ULyub56GOPNk4UQLlKkSJEiRW5T7nhC2L39CIbw/k0FfRyQ0T+G0Xsv9wFqCuAAN3rvODimnmARqOj3Ciuw5QQ0iRemrfe6UZ/IK1oBzggsUvCdcSOAkekoYU57O1Glcfx4WreD2lsJWycJFTRkWTU/B7Wrape09TI60cpPP8LQ7cW4tAd/Rx4ckUQbBDQtbyPaNtxuaitNg+VwwFnbK0W9iT1NBSD1qFltF1rvETnDMmif1XQciHbSmOkoWRIBsxG54OB5RFp4Girsc05A7CM/AKSjjLvd7s4RvLSt2ov5brfbRLRpXdJbt67r5B2q4DbJUBLPWibfrEAClOSftivmvVqtcHJykjxZSQK2220Mh0O85CUvweHhIdbrdbonl8cub7db9Pt9HB8fJyKSHqlVVSXClDZguiRLr1+/nsaSbre7Q0TqJhNtg51OZ+d4ZAA4ODjY8bamlzDLqncjk5imjVhHStTS27euz8lcJaJ5XPR2e+b5TO/nfr+PbrebwtFGPFqaBDDrmiQ6bXpwcIB+v4/r169juVwme/CuatoOQKqvuq5xcnKSbM72s1gs0G63dzyUtS1SB9pa5zzaRY81Z5mXy+UzTkD4OObtW/umP/PNH05cReSRjxXROJL7rc9VD83D58iI6HHdXBdPX0lptwf7jrdzH8dUR6YZzWc5D1SmyzSijTf7iDbqy7nd6+ZWCDdfu2l4/VTx8uTq0+vO0/W68+d6rDff6ZzpG/WUyPQNB7qJze0U6e3l97WX1y/bGT/dW5miZY5I2qgfeZvep6vbPQrr6zGvR1075GyuEnkca1misZPvfR1KUR3dbl6XOoZFfUbXdj4WarhnelwuUqRIkSJFity5cgn34TX4YvRwsPO8QgP34VNwiHvwW/gxXMNDAG5vzbHYTvHOa/8FL+h//G2lU9c13n38k7eVRpEiRYoUKfKxLHc8IewAIoEWJ4IVYPNd+EwnAqb4TvNRcsgB6gi0URBLARzNW/V1Us89WQgceb4AbgCo+EwJXAX2HHCKgFvVS0F0tb97fbKcmp57rEZAr79j2lpOB/xy4Kd7gPjmAS2z6h15uUXAspJwaoscUeBgf5QmcE64OsgXgaNaFwoa7wPW+c6PTo3AUyfSI4CU/csBVSXztf1oHkpyOwAe1b+L9i+Sfu4B5Db3enBA3OtHy+Pi8SJZLpdYLpfodrupjal9aWPqTwISON+UwOOio/plnyZRp3HZ70jusb2o3f0u1qqqkvdnXdfJC5Xk9uHhIV70ohfh3nvvRbPZRK/XS0Q07+mdTqcpfSUd67pO3rm8y5flJ2HMY6JJoNb1uZc0CWOWi8cnz2YzDAYD9Pt9TCaT5A3c6/VS2/Dxi+XjkdadTgeLxQLT6RTtdjsR0ew/vC93OBzuHFfN+uGmHqbHjTLUW8eX5XKJyWSSvJ+rqkrHgTMsbX7XXXfhnnvuSeQySXY97rnZbGIwGNxwRzLrnG2LefN5o9HAYDBIx3vrvdW6ycX7hbYpehHrEdYXIRFJRB10rNJ6UGKIcXQO0j7MzVTRWBHN5b7pJjeGOxHG91FazMPH1Yj48jkuRxLpXO82dB2j367/rYyPOZv4GB6VJUont1nK5xHPx+ewnI00b4+zj7zOzX3RJrdoHaFpRDrvy9PXO9Hax+c+J5a9DKqH6qtrGl2DaHiPH9k0tx5mfgzr85rnGW2U1DSjdq5hNQ+1lYfX99H6S23kYTWcjkHUX8vla2gdt3Qscz1UX77TtLV/6NrLx74iRYoUKVKkSJGbSYUm7sMn4uPwh9HFKBOmwgh34w34k7gfv4QP4d1YYnxb+T4w+02c1hs0q9uDsh+av++24hcpUqRIkSIfy3LHE8L0pnMQjOLgsQI2EXjoxDHTdZDLQT313lCSg8Cve4ZFAJGmreCUesAyTnTcIUkS/tZyevpKDDFNLbPaLvKiImkU2U/LQ50c5HVyWAEsLaumr+/Ua1r1ou5KcpH4ZB6sCwXgHHTTtLXunBCP2pGGi0hJr7McmBm1M33vojppPUT3CDtgGZXbdYzA1ByQGpWXvz1OlOe+NJmOH03uom1Z27TagHao6/oGENzDRO3MdYqe8w7XTqeDXq+3A9pWVZVIwW63m7x7SQ6qTfQOU7ZJpkMCknrrmMj+p0Qfj0JmGrz7lmmQDCVpph7J9913H1784henPJrNZvIUPj4+xmAwSB6uJBurqkr32PIe3NFolMjm5XK541E7HA7TXcWsDx53zCOPDw8P0Wq10l3EJCZ5fy+P4GYe2m5Y5larhel0utOuaWseba0eyuPxGIeHh6m98VhqHpfcaJwdba2emCSKWQd1XSedWY/r9RqHh4epHiaTCQAkW85ms3SUN3B2x3Fd1xgOh2g0GonI5fH3bDck0PmcdlksFqkdRRuk6PVLnZVQ181IzLeu6wsnhCk5wsnHyWis8rmEz4DzcSM31/ic6d9VNx1HKO5560SPbyTSMC4RiRfZRcvsNsmJE1i6pons4XkpGRytqSL9c+XMlTGqo2hu5HOfU/xaB8bztKhTNG/n2pG+z21e29devUyuu+qjz/SkGM0zt25wm3mZva1G/cr7hNvF59uor+bsGcXXNqh9J1qzeboeRvNXm2n6/l718j6es3FUJt/EoPHdFkp+67uoXfh4r+lGaRcpUqRIkSJFityKdDDAS/EGvBRvRAP7N5VVqNBEG6/AZ+EF+FR8GO/Gh/FuLDF5Wnn/9vgdF0IIFylSpEiRIs9lueNnUQIkvIdTjyyu63MvMCUlnYiiKFngxA/TU4CK6SlhqCCvA76ahoOEDsZp+KjMPKLZgVUF7RQIyh0bDOySewqIOrGuR03yGXXkEbDuAe2AVgR8aVrUQe2j9lJ9qqpKoChtr/kpSe/5K8DpxKLXu96f6WAd89HjstWeSnSrPpFHlXuMqY2iOPvATa0D1os/JzmnRKPbKKo7Jzr21au2Q2/juXbhfS7ydKEOtHuuL+XAWwdcI9A1B86rRHlFwmOj6XHq5eaxy7xTWMlglpWfHKdYfuarbVPbosZh3iQpmY7eb8zjh3nsMGWz2eCee+7By1/+cvT7fSyXy+TNvFgsMJ/P032zh4eHuHLlCur67Nhi6rlarZLnbKvVSsRkXdeYTqfodrvp6GMtB48k5nHJ9PxlG+Zx0bxf98qVK8njl/c4c5ziuNFsNpPnLD2NmZam3ev1MBgMMJ1OMZlMbugLeo8xj2dWu7MNa1nW6zU6nQ4GgwHG4zF6vR663S76/T4WiwW227Mjt0ejUbLbtWvXMJvNMBqNUptnm1kul8lLmfXcarWwXq8TIU4v6Lo+O+6aY0Kr1Uq2jcYBbatKhOv8w7uOL1J8rgZiYjAimqJ+72Xy+dX7uJ8koHq4TrrxwtcZDJsbEzWt3FgT6R2RVzcj9HJ58tPHdrVdTp8of0/X53oVn5OickR20flA54hIdIyP6tLTvNVnbt9c/r4Wcjv4mjR6p+nsa8+RLv5MNxK5Xm4zrT8dAyL9oj65T+/IXl5Xvj7y59G6J0o7V4+R/bQs0TihdlB9lVTWTYm6JvR0tQ27p3nUD6Mxzp/r+j2qsyJFihQpUqRIkUgqNPACfApehs/AAJdQ4dY3llWo0MchXonPxgvxalzHQ3gAv4JjPIotbv3/xMXpBMfrx3B398VPpwhFihQpUqRIETwHCGHfda9ecgqEKFHnQmCFd2QSoKE4AOSeMw7mOXFFsLjdbicCQb2PCeJEwCoJbWCXHHSA3u0RAYYEiUgEKRkYkY0KGmpcB20dyHIyWQlzjaeigDHzcWKR9av6MU997vq5fdSzxusgIgGi766rkrkkmbQdUh/GzQHIUbsiwRPZxMuuOjlw6DYGENaL2iBnS2/nWicR2OsAqqahRATLGwHH6lWrbc69d9UT38kZtVGufhXU1bBOqDiAHNlJ05zNZjtHEfM5xwVtyxFIvN1ud+7eJXHM43o1ruvhfZR9nwQi7wDWcZPpAWftpN/v4yUveQkGgwEWiwVOT08xGAwAIJG+i8UiHatc12dEZq/XS167jcb5Pb4koakric3RaJSOTma5tN6azWY6Fnk4HAJA0p1exmrDuq7R6/XQarUwHo/TeKzpM23dUMS5oN/vp2OuZ7NZuqOYfYPe3wzPtHhvNMlZhqcnLdvr3XffncZ5ekWTMOcpDO12GwcHB6msOp+wfjlWa5/lWMfjyml3hidp/Pjjj2O9Xic91COcNqdwzmBbWq1WO8dUX4T4+BK91899hJxvMNJ4npbPN/vINX4HbrwywfOIdM2RWj4+RhtwdM7R/uqkm69JIr2i8Yxpelyf9yL758ZEf+bjlG+icJu7/lFdR2Of25Npqf0iHXNpeFpRvbouXvZcfWhcbyeRbtHaIiqH683vuq7zdKM0dD3obVfnLBcnKDWe5hnp6WtxX0dp+482QzIN70+Rx7u+i9b50Ua+qH6i/uFpaLk4RjGuzv25Or7Vtce+/lKkSJEiRYoUKUJpo49PxltwN16O5m3AyCSG+zjE3Xg55riOd+EHMcHjtxT/2vph/Pb453B39888bR029Qrr7fJpxy9SpEiRIkU+1uWOvzSKAIsenUYwh0SaAn/AruchgX8H0oFdgNIBOgApX969SJDHwzMtxuGnAqgksniEK4BEBjjAxnwdmHegSD0LWW7G9+cO6NImDrA6uMqyqZ3VhiwXySUN5wRYBACrDpq3ewM7GK/tQ/P2PAi80cuP4en56F4WbDdMJ+dVHJEBETi4DyjW9qx/+8gDT8eBR76PvOC9bCTI3ENX61fj0dtaPVxzbTIiD7yvOcDN+A5IRzbWOGqn6JnXi5IeDgpHEvWxSFarFRaLxY7nLdskj+ilvRV8p47a55mPknBqMx1vtH6Zj26K8HtUGYckIMe3S5cuJa9fHn/NY5TVw5SE5ZNPPonHHnssHad8cnKSys8jiHlPMI9NvnbtGk5OTtLR0Lw3udPpJHuQmJ3P5zvjL3B2xDLzImHdbrcxnU4xn88BIKVPMlj7trZNevK22+3kYUwvYQ3X6XQSIaz3P/PIZdp5tVphOp2m47qZb7/fDzd8TCYTTKdTTKdTPPbYY+n+5sPDQwyHw6RDt9tNx40zr6qqknc0dQSQNiWQXF6tVjg5OUlexNx0wDbKetIxlHW1WCywXC7T94skHHJjeY642keGqU30ey6Oho3mSddJ4zFcjoRRIiqaV/W5j7fReK3hfN3h83NubHWdfd2i5dJxxQm1nBeizwVRftE46/OH68AyKpEW2T0336ruTvbdrO1FdtQ1geob1UnURnLpeRl8vmLZ9b2nGc2zqofXZ85GkQ21bG5D6hWdUBLZ0e3kayt/7l66vmZlm4iug1Dx/qHtMWpTUZ9j+k70uo28Lml73TjENLnJiOsBpqn/47j++tvXgkWKFClSpEiRIjn5JLwJ9+DjbosMdmmhgwM8D6/AZ6GJ9i3H+5FH/inmp0/vLuK6rvH2h/8hfm/6q08rfpEiRYoUKXInyB3vIayAjN8L66SR3q/rwI0+c2IN2L1P0IHQHKlFUaJF82J4PlM93fOL4Ui68XsE5DrYGIFWXjYFynKgqQO6rl8EdjnQFwHwWi/uEaH29rI50Ov5R7rqOwcvPQ2Nr3GVlNT0HdRneySxnztOm79Z53oEbVWdewD7d4rqFrVjSkTGuv5OQjowGgH/UfkdCOV3t5FKDgB3T67I7mpLfeZAPsU3FGj+Ebiea99RuJzU9dlduSTP6CHLPsTjffX4Zt1EoeOb2ni73SYgOTq21j3vSITqZggSluoRSpKVBObh4eFO/VZVhZOTE2w2G7RarXQM9Xa7xWOPPZa8WEejUTqqmHlQeEQzCV+Sx0o+VtXZPb7D4RBPPvlkuouYnr4kaxmW9xGfnp4m4ni9XmM0Gu3ULe1Lmc/n6ZluBmm1WskTervdYrFY4OjoaGcjEj2a1Ta0CYnayWSSjrzu9/s7Xtk8dpvHWzO+HuusxBrvENYNG2wfPIabRLHeE837gHks+PHxcSK4qTvbtZLBfKebkBqN8+Oyn653sPbZ3Hv1vuUzj+vjaET6aDly7zW9yDNZ0/HxyjdUeH5OKAE3HoOr4f235uU6RL8j2/ragHrm1iY+fvocGo3t0Rjoa4tozPSx2Ocqnf+iuT5ac2gabhNfT2haqk80R2t6bhuff/V3zoM1qi8luj39m9nJw0Vt2evWy+51G7VHDad6ev/xdqpxfSOmhuP4x/yjcUDT8jqJyuYbnnL9Dzhfm+oVDh7H1yUq3hajTRRcI/o4yvC5NZ3+5hpiX7mLFClSpEiRIkX2yRabp3RE9FORe/BxuB+/iBM8ekvh3zt+B/7x7/wFfMl9fwvP6770lvM5Xn8Ev3L9h/D2h/8htri406uKFClSpEiRjzW54wlhgioK7Osxp06SqYfdPkIvImBIOHicHBDK3w4OKhGh5C/D6nFx7g2p3rWM50Ccek84kaXAlHoJuv4aTj14FaT0/CKPRgUsWVYF1xTw528FFBW8jbyAGVcBV7UH7cyyen1p3qp7BOJrfTIc03NwLgJAGcfTi8K5zbVsSvA5AUhxjxiKE7WaZqSne24pYOnt1sFHB5xzJEakn7dJB74j0XrQfu9Erbc3JxQi8fA5cPhmwuN1SSASmNYjjrW8tLeTu1rvShpTlNBUL6u6rm84aljv01Vgmnnyvlsem0yCk96+y+USs9kMR0dH6PV6mM/n6e7dbrebfjcaZ8cok1jkEf28S3e1WqX7e9UjeLs9u6OW9tM60pMZ6E3c6/XQbrcTwc46o+7D4TCNQz4f8LmOHTxemoQqSWsnStgG9Chspnd8fIzlcpnI2GazidFolOpGvwNAp9PBpUuXkjc071amF3a/30ez2cT169fT3ck8jpxkMdPRu4Rpq6o6I84nk0kqj7YJJZppGz7ncdJqn6d7f3BEWPp378dO8mmYKC0dE6IxRNOIxjB/H41j7Ic6N9+MjPFy6DpFx3dfv1C0znQMcztG5fCy+1yn4nlE6TDcPnup3t5vnJyN1lkRYeZtItrk5/k4Cerl8TTdVm4D7ec6zmpZoralayddc+h7JxJ1Xo7qImdXl2jcisob1fnNdABunMdzaXJc8XmYcXUOjNYy2j74XfuFtkldW2o4X1ur7dyO3ieZlurI+SNaI7g9GNY3kWg8XVeqjv7/iI4Tau+oPEWKFClSpEiRIi4fxDtxBS9GH0cXnnaFBu7Fx98yIQzU+IUnvxe/ev1H0K46t5zPKTZP27O4SJEiRYoUuZPkjieEFVBRrzFgF5RSMFEJSRIKTuapt496afGZ3hMLnHsyRuStAoI5cNvJBf0kcaFgj+rlIB5tovdhRiSWAqhK/DIdtQPBTo2reTtpHgFiBE3Vw5nehxQFvVgOB1bVVlouJ6mZr9vV6zsCZv1eXtXH7931endg2j18IvBbvSGVDPa2o3ZQHdw+Tix6vTmI65sjFHRUuzm5EoGsfgR4jiBwEFfL4CS/tveobXmf2+fFpIREjkhx+0d9M1cf+6Suz7yEebQxvUSV8GDZ2Te0TeoRkWyL9B7lkdKangLu2k/4SYLVwX2Ob9Tp3nvvxQte8ALUdY2jo6NEClZVlY6hXi6X2G7PPGg7nQ7a7TbG43EieY+OjtDv95OtlFjkMdOLxSKRxHonb6vVSjqR4Gw0Gumoanrn1nW9cycz70dmmfiMpKl6aPV6vUSOsg6qqkpevSSzSa6StFYyn3mxL9d1nY7Kbjab6PV66PV6qR57vV7KZzAYoKoqPProo1gul7h8+XK6q5ntgm3i+Pg41TdtqJuY6IWsYwftcnp6muzGtH0c940/zEfD0nY86vwiJCLRdLzXdhyNJzqOs04igkzTyHl23qxP6zjrY4nrxU8luDSsh/O5V8uuc02UBvOONm/5nKK2icZLf+82icbCnK1UT3/n8VzXSK8oT08/2vizb+zPzSsuvn672Tyb8x7lmsLL4XXhfUHH7Fw/idYImi+AsN+6HXQu3dfGc2Vmm8/Vc6Sfl5nzELDf2zmapzWMb1rw8YLh/I5219nXJ9TLN3NqO2aYaA3ka0df83ndRGvJaD3leRcpUqRIkSJFiuRkjI/gg3gnPgGff+GewhUqNHHrxC5luZ1iiemF6lKkSJEiRYo8F+SOJ4SBGz1wCZ476KvgvYOqkRcsgTN9TtBFj+5lekroERRiOuoB4EAidXRAW4mdCPRU8lrLr4SP2oA6K8nHdBRcVCIosglw41F6DMdjRpm/frJcJOE1bwXKHcxSfZR4ZjyWX4klLx/to6SikiBaRk3fSeacrZifg7ZaHq1ztY2Sdm4T193bCEXBR/e48XSieE6SOsHvoqAlReMpeZUD4iOSICI6HOzMAZtKhmm5vF4jcU8hrQ/3OtunewTGu6xWK6xWq0QAqn1J0LGd6mYQ1ZXvgPO2TDKT5CiPZyaRTE9gtpHVapXKyeONq6pKxOl6vUZdn90/+7KXvQzPf/7zb+gL/D0cDtOR0SSaAex45TIeCV2WhfWlRzWvVit0u93U/7UOSAwDwHQ63fHqZflZXhK/foel2pgkL722WW7ayzdBbDYbjMdjXLp0ace7W+uPxPZyucR8Pke/30/3/PKYaNqq1Wql+4pXqxWOj4+x3W4xHA6x3Z7dMTwajZJePAp7sVjseAVTh/V6ne4Bbrfb6e5i2p356nGsFJ3z1DYsu983TXL5oghh1Wdff1IiJIobzbPROON5edyIYM7N4zkCR/NzYjAihCLdWGdOWEfhvT4jPXLP3ba+9vDx2+vAx0cvU5ReLs0caRatF7Q+NM9o7tK8fXNRzib6PJpfIxvpfBxtTPB0o3duB92o5iR/VHaW0dNz+0T9K/rtbV5183x9U5qHcRv4+iRaL+laKmp/Wke+oVDTUbu43YAbr9fQ9LVsFC1r1Kb8mW9E1DR1Pap6+Dra7ebvvA6jTQlFihQpUqRIkSIqD+G38GK8FkNcufC078bL8QF0sMHqwtMuUqRIkSJFiuzKHU8IK+ihAIoSUU7MMowSFAQYIw/TiAzVtPSdAnSuj4PLEVAF3Oil5QQp01bvEiU8COBHevk9yg5y6nfG0bT5nXk4WEbSgQDXdrtNBFN0lJ16B/u7fURABM466KZEDuvCwWMH+z0P1h3rXesuAkH52+9AdeA2AlO1/EqmKhHh7TEC2rVd6juWXT2atW4dwHYb+gYDB8ZpIy+fkihOJOfIhIj45zu1s+ql/WUf+JwTpqH91IFhtRGF9nLiMJdnXdeYz+cYDAaJHNTwPIKXRGHUVquq2umD1JmnGCiI7G3GxzqOI1pPunmk3W7jypUraLfb6Yhobvwg8Xjp0qUUvt/vpyOEOR6s12ssl0ucnJzg7rvvTvW5XC6T7VqtFvr9fiKqV6vVjn3Uq1bz4vfIk431Q2KVYz3J4qqqkodrt9vdsZEepbxYLJKNT09P01HNh4eH6Pf76Pf7KV8StkyLxz0zP9pRj6ymjU5PT3H33XdjuVwmb2LgbJxkW2i327h8+TImk0ki3hmGBC3bD8vS7Xax2WySV7Hed8w5kOMC7cG5gnXJsrGPMz3fXHVRouO8z7MaJhoDI8Iql4d/1w1NOm5qWM3Ty54jblzHnB76TDcO+FjpY6LrFumqnzlbRXE9XjS+5WzsRJvP4ZFeOkfxmY75uTE2mksjHaP1l9vBvTmjvLWuc/nos8izM2cz6qCfPrdGbSJqG17nSkSqftrePf2oXWve/tzz9b4cld3nOhXvAyxHpEeUhpdV12dsb5GNtAwexiVaE6kuehWDl9nTcA9j5s/50tdaWm86z99sDCxSpEiRIkWKFKGsMccD+HV8Aj7vwr2Em2ijwo3YX5EiRYoUKVLk4uWOJ4QpBFiUzPLd9w74EkRRz1MlgpRsVYBOQSQH4XJEl5LDJEiZtpO0TpgpuEO9STi6pytJDP7mpxKzfkQzP1kmho8AJ9qGRI3aUvVz27j9nbxVUFYBrBzZkAOMldDz+3WVHNsHqPpzz1dJOC9DBMCqbmobxlEQM7KJtmP9UxtpXvpM9XaweN8mBC/DPgBZgUclsRVQ1XbmR0prWXNkgLa9CGT3sLrpIwKF1eY5MsA9qzSelt/rWcPnZLFYYDqdpuOUeewzCTn1xKQ3p9cfj1Gm7UkGq+7s891ud4dUoGcr02M6Sr7WdZ08V+u6Tp63dV1jOj0/uqnX66X4BwcHqKpzMrXdbicvVXoFj8djHB0dJcK30WgkwnS73aajp6fTaSJxlbTm2FTXdSLNmVdVVTg4OMB8Psd6vU5HMvd6PfT7/XSk83Q6xXK53LEj70pWUp33856cnCSbkuQ+OTlJcZg+2x/LPxqNkg7UD0DSQ+saONto0+12sV6vsVgsMBqN0O12cf369XRPMDeLqLfxZDJJx3RXVZW8tU9OTlJ9ksz3PsNxu9vt7hC+OnbqyQ9sl7SZbkC6CMmNhZTIY18lIsV8jPVxAcAN/d3HXU+f4Xxc1HBaHk9L520nslx3J7DcFq6Hb2zLkUKqg9pJn/v46jZz8krTjeYLz1v19+86Z+fSjmzqebttfV3h9s/ppTZn+V28DvWZ/vb1QK5N+XfXT3XyNYjXp7+L9HW9NUyuDMzb11m+AU+F6fm6T/ON2rTrEdnf1y9aBt+UoGsS3QQS9W39n8Dbkdve1yLRJr3I/vpMx1xvw76Z0jc8+lruIsfoIkWKFClSpMidKw/jt/AyfDp6OLjQdDvo4ypejEfwvgtNt0iRIkWKFClyozxnCGEHXhSoUlDTiUkHyNwjkhIBVEq8OADEZ8xH09RjYHkXpoNP1EsBYHpyaZgIENbnqp/aSkE6BcoiWymZF9mQcdyzinmS/FD7uL5qQyUqHNjzo5yBcy9jLbuT2RFgr6IkrQJ9GtfBPr/DmbZRmytop+1J6yzajKCEpou2vwg4dq9QB4U1zwg41U0Kmq6X1XVSYNXTZZr7SHQFQV3/m5VDbahHAXsekf01bK7NaHmi9hsRA/ukrut0lDA3WOj45WOIH++rNvIyUz/fTMB+4YRiVVU7d8pq+U5PT3FycoIPf/jDePnLX45Wq5Xu210sFhiPx2g0Gjg8PES73d4ha0mu8thkxiOZuFqtsNlskqc0Cdtms4nr16+no5m73W46Ppk6Ug/2c5LC2i6YFnVh+4vqXO8obrfb6Pf7iegcj8c4Pj7eIQxoe92Aw/HZgXrv48yPurBMi8UCx8fHyVOZZaQ3L72Gt9stxuMxqqpK9zTTprTNarXCbDbbIWVI6nY6ndRmfLzXjQHAubc6vZN1AwKPuCbRf7vi/c3HHH6PxqCI5IqeaRo+HmuaPn55ulE8H/e8H3lajOdEdJS+E1TRpiLXX/NzW/p7TSea9yh+ZDj10HVKNKbn5ngvb0SOU1wfj+tjY3RPbjS+R3O9lzESJ/h8TozmOi2jP4/mxaiOvX34esvbebR+8fYa2drt6+n5d23rUZ6ejq+5PP/Idio6x0X9Mnrnmxj1udvZbZH77eVk/8yl4X046gs6D+t6j2NwtIEvWut72yhSpEiRIkWKFLmZrDHHE/h9vACfcqHpVmg8rXuEixQpUqRIkSJPXe54QjgiN/WIYgVD3JvBCYQcgMfvCnKR/AJ2j7WtqnNP2VartQMCMmwO7MoRUMzbSSE/GlqBJgc+FTBS8lzLH4GrSn4wHEk/9azWsA6eOfFOe0SgmtZrpCfTU50dXNsHmjvIqV4nXm6mofkxDb3LT8MznB4rHgHZUZtSYFbbkpMXDlw7sMh3SkxFwKyK2tr7geseAfbqMeOksKbN31G79DYf5a8bLnK21PDA7nGbXj5tj05Eu93cq0yfR3a6mZBcYzyWjbbyO8l9gwZwTnZwzCPZp+3K7w7vdDro9/u4cuUKhsNhOo745OQEjz76KBaLRernPN74wx/+MCaTCa5evQoAmM1mmE6n6T5wEoez2Sx5qZ6enqa7gA8PD28gJnk8NIBErPZ6PQyHw3TP8nw+Tzq32+1UlywTvYvruk4e18vlMnkmNxoNLJfLnbvFeaQ9PYHpTcvv3W43edQSfNf5gcdkk1Dt9XrpOwlhbVfz+TylV1VVKgv7Eb2Q5/M56rre8Rom0d1sNtNR3PTM5fjEI52V2AKQ7k9erVY7pDOPx9ZxhkQ+PZMpLCvLyzLUdb1zZPRFio/3PldG46mOD9F46f2WYXXM9j7L577Jh5/R/HozD0P/7Rs//Lvr6xLNp/rp83okubVIbu6LxlovU5Snrg98vnNdo7lV4+TssM823m68vFFdqU6uf7RuyNnV42u5IuLZ7zzXTT76XG3D595OfE5y2/NdNCd6v/H52nWM1hhqKw3LdZK322hDTZSW14uG9zr3sTHSx+vT51q1dWS76LnrFK0Joz7B99omfD3sfdPju51uZU1SpEiRIkWKFClSo8bjuB/PxyehgXhj5NOVe/EqPIjfuNA0ixQpUqRIkSI3yh1PCAPnXoFOhDnoFXlUKlHrAI+DVwwXAW7q3UfwXN8reRwdo+deKgwTeZPwz49ojoAfB3AVVHJCW8O79wbtp8CkAsY5EExt4OSmg/HuYewAGv80HepAoiIH7Cop5gDgPqCM7yIPkn0gcM6DKwLuKUo8eDoR0Oj1rYRi5Bnq+t4MRHfw0vN2YJzfI9Bay6XtKPKO8/pjufTO1RyRso88Ub3V5l4m13sfEB8RFLcKvG42m3SX8HZ7fuSxEs8Rqa/1rmOOl4l3xepY0el0cHBwgIODg3SnLY89ftGLXoTBYIAHHngA8/k8ka3b7RaPPfYYfv/3fx+Hh4eJUB4Oh+nY5MlkkohRvbuWR1NvNhtMJhNUVYXhcJjuy1Vb0MO20+lgNBqle3sZl0cys7zMh6RyVVXJm5VHZNd1vXMHLolV2pDErB67XddnJO14PMZms0nez8fHx8kjlnVPwrbVaqHdbqPT6exsSOLpCMAZid5sNtMR2/TgXSwWO7aiXaj/ZDIBcH538nq9RqvVwmg0QqPRQLfbxWKxQF2f3yG93W5v8Oolkcx2peWmffTIaPX29vFS/26XEPb2zO9RuIj80T7j44b+jsZrYJd0cV2crInIKSe8VP9I55wuEanj400U18ez3MaVHFmlaXqYHBHOvHJzwL65JVdOTT8izLx9+HrByxqVR8saeYq6zX3zkbZ1PY3B7eh5q+hmwlzZIn0iewO4oQ+r7PNG1vVG1Aci26utIpvezAb6Pef1Hm1Ii9L2NHXNHLUp11XXWK5brq/t0ynXF6J1hOcR1V+01qC+vk50PX1d5WNCkSJFihQpUqTIPrmOh1DjFLhgQriNAYAKQFmXFClSpEiRIs+k3PGEsINkBELoVUdCwIHbyCNSSRgFX4DdYwdJLPC5AkAkAQimqx77wFj1llDPVy0jddEyKriqdxtTPxItaictN/OMvBzdxgzPMG5P/nYvKU3XwUTNN/LSigB3ByZZx3qcNkFXB7cVRFVikvHYVrSevE7Upg4aa1txMtfBZSfGtS0p2eKAoxO+Kg5+uhc822NUvpwXGPXUcusR0E4uOTkPYCdfz9tBzQhkdiBZ24bakPbXdqh14seHMm0tB22hY4PHcYBWbf5UZLFYJA9WHuHMzS2qj+qq+ZKwJelK25Akpa60Sa/XS16/JAd5V22z2cQ999yD2WyGD33oQ6jrc4Lx+vXr+LVf+zVcuXIFL3vZyzAcDnF0dISTk5NEHmtdMW3attVqpTtqGbbZbCZvWR7vTIK22Wzi8PAQVVVhOp2irmtcu3YttRclnXncdqvVSncHA2cEKr2FdWylnfWYafXYnc/nmE6nWCwW6X5g6jmZTJJnNNPksf9sKySBSfB2Op0dEH+5XCYSnZ7RJO6139JbV8mjRqOBfr+fdKYufE+7zOfz1A/pHaxkOPsj3zFPtiuO9TypgWkxHsuqc8LTFe3vOYJDf/tc5X0vIlqYT25s0Tlc1wfMz8f4KL6vAzQ9L6f+dvHxxtcBufjRHBmVL7JjTr+I7PI0c0Sb20fzyM1d0VjL79H8we86BkfziY+fPj/5vOk6efvKreVyZfMyeXmA3bna1y6ehufh9eDtMQrjJ01ouSJ7UfR0FF33AbtrRX+maUf90DdFall0HozWAr5G27cZxDeBqS28r+h4F40BuT6gawrNk2Mlv/tdxL4mjEhurV/qxnna15DMW+efIkWKFClSpEiRm8kSExzjYVzBiy803SGuYIgrmOKJC023SJEiRYoUKbIrdzwhTICEgI3fuRt5+DkwwndKAvmxbg5MMX2mqSQgReOTPCC4ExF6EXnsAJG+Iwnk9lDi08urxF0OaHPgN9LPATfVU9OOiFkH79RWXka1kRPGes8a01C9qCuPc90HjCu5mwOW1Q5OgHkdqQ0UBFTx8kcgqd4Nq7bMedFofet3BRC1HarNlQx38DMCyyOgUssZtSv3YNN2w3fajyNwe583k9pIxwYth4dlfPeW0jS0XfhGB/8ejRE5IenX6/XS/a8kA9W+VVWlkwf4W/ujCkm6RqORyNHT01McHh7i4OBgp27oYUqC9NKlS7j33nvx8MMPYz6fo6rOCNfFYoH7778f73rXuzAajXBwcIBms4krV64kfbUvLpdLAOdEK0lSErIkblkmEq7NZhPj8RgAcHh4mPQkcX58fIxGo4GDgwMMBgMsl8tUDpLpi8UCq9UKw+EwkbHz+Ty851Q3SSyXSywWC0yn00ROdzqdZHum1ev1UFVnnsnT6RTT6RSDwQAHBwc76ZFI5hHcrDeWe7s9uwtYj5uuqnNCmUR9t9vFdDpNdT0YDJJXML2Yed8w72vebDaJ0OaR1PQw5jHYk8lkhxTnkdH0Lqa9lBjWjSOnp6dYLpcXSjToGJ4jMbQOfRz2+tUx2b2c3TMwIv2cMNK5BUA6itz7Yc4jzwktTRO4kTzzsSUi6nzOiog3n/M870gv3yjn8aMx0NPhd19PeVjtH77BYJ+Xq47JfOfjN8P6nB/NVxo2mmf32cPLFYWL6sN18/Bax667E7C+TvR09U/rN9qMp31P10gaTm3t6x/NV9fh+9q/21j7nfcL/e2bplSnqF5yOqqdNL6vDzRd3SSpn7phM8ontx70cnlYtbWvfyPSOtf3ixQpUqRIkSJFcrLFKeY4Ro0aFS5uHdFCB61yj3CRIkWKFCnyjMtzhhBWEEhJVQeNCebo0c9OSkXHZCrYo96OERmmAI2SM07qRIAWdXOwR4F8BaIcnIqAacanJ53aTstNgkyJdKaRAxb32YFkkgKWDuhpXBUH79QDT49Vpe1IUGh9RuChA2N+X52mGelCQoTpRnXltqedHGCNwF6GV/0jPaI60LrROtA01R76O6pfls0B4IjE9TrU8rH+HaxU0X6r+jvQ6/byPu4AqZZnH5Dt3yNvPCUeInBZCaxbBWDruk5emgqa6x21+l311qOJHaxmOB4v3O12MRqNkrcs62yz2aDdbmO9XifCkOGOj4+Thyxw5iH+0EMP4YEHHsDly5ex3W5xcHCAuq4xm80AnG9SaTabWK/XaLfbGAwG6Shp3jvL9lVVVdLx4OAA6/Uaq9Uq2Xo4HCbysqrOvIXn8zm2223yniWhrd6sPC6Zx3F3Oh1MJpMbjtbudrsAgPF4jCeeeCIRsxwv6XlF0pqkMctFGy+XS3S7XXQ65//gsoytVgvT6RStVisdq631pl5kzIve1Eoud7tdLJfLZO/xeIz1ep1sq4Q2SfrpdJry1DureSS2jpnL5TKlT+ER0toP2Z/Uy/zpSER8aZ9TL2TtY0pmUXcnrKL1APP0sU/10TEnGl+9j+v8mhtHc2sRJ6o0nX2kWTR+62dkAye5PH+dN9weOp74mO5hfez1dHI6+pyndcHf0SYll2jzmZcrN19Gto3mjiiO12E0T7kOnk5kM33uc1EU1+3oc54/j9YSUV247dwuufbj9onqO9JdN3W5Dpr+reSR00nt7GuIyPPYx5JcutGYErVf2jsi2jWMbvhgWtF6OrInn+vaoUiRIkWKFClS5FbkYbwX9+FTLjzdu/FyHOPhC08XOFv/tJs3QuB1DaxPn/7/rUWKFClSpMjHmtzxhLDuwlfQRcFaBUaUmFNwmUIwqqp2iV++U/DIj89kHpEnmh/v7KCNglvuQeBANcEdJbWdiFKwPCLVlJCp63MyVcn0CCR0O2tejK/AmoNeDE8POb37WUGtCITLgcN854SdAqDR3c9OHEeAtRISmqcfna15qRed20fbVM6TST8VHHXPWgf61W4aRtu+t7cIBGZeXi9a396H+D1KS/Nx0bBed/pc03BA3PX1dL2OaQuKth23VUR+eJpaF94vb0VIrJGs1A0jEWmgOqkHOfOmty5tyHuD6dla1zU6nQ6azSZms1m6b5feopcvX8YLXvCCRKC2Wi30+30sFgucnJzgscceS2Xs9/vo9/vJdhxTRqMR1us1BoMBjo6OsF6vUdc1Tk5OACB595LYJWlKYrmqqnTcc6/XQ7/fR7vdTncWV9UZOXx6eorBYJDIzslkkjyuSXKTzOX9vvRe5h3OLDvLdPXq1eQl22w2k5cuvWxbrRZmsxlWq9XOUd/r9RonJyeJROfcoPfTa3/rdDq4evUqJpMJTk5OcOnSpWTnRqORyHA9Cp8kL4B0RzS/+6YZtk0+r+s6eT0rse7EAtuSbwzSOUPD3o7o2JIji5z40Xk0R8jmxl++0xM7cuSQkzSatp5g4GNPLl8f2zW/nB2dYPJ5KPK8pY5aXxF5psRXTnwc3Rfe1wGeX7Qeizb3aFo522q71jxUF60btmlvP0xLy+bzmItv4Iq8ON0WqpOW1edWLb+uK7RfalifI3Qu9Pnf25GvHfxdblNcbg0b6aLi9szNo76B0+OqLXRtzPARaevrBdXTyfncxr2oH+kJI9G6xOfvyC7+m898g4un5/aPNq5oPeY2PxYpUqRIkSJFikRyDQ/hYbwXz8cnXpiXcIUKfRxeSFouL7vnJfi6L/gf8SWf8YU3vJst5/jen//PWG3Or9WazKf4oXf+GFabFR47/ki4JitSpEiRIkU+VuWOJ4QVANtut8m7SwHICJykVFW14zXHOJGnrIIx6mWn4HnkBRABtXzHZwpYEnDW+zY1vOqlpKqCRu656WCR6uZAqRNwDKvgmIO7EahOQFqfax1ERJyWUQlwtaEfKam66JG6nr/bUoFiBUfd3g5Genk9HsNRNz2yWvXUsE6GRgQk03CvZK0zB3ojfSJ7AEie10qKqDjQq+0gskUEhHof2UdMRJ4xwO6GC/dcU70c8PeyeNpK9ESAvdtW+1gEmN+q0GuWY4qOA9qPuDFA72yOvJl49LKSgzzatqqq5PnK7wqi01v3la98JZ544gk89NBDyROXxOnjjz+O0WgEAJhMJhgMBhiNRul+4qo6O0650Wgkshk4H4c7nQ6Gw2G6O5hj3Xg8xmQy2SFDx+NxCt/r9XD58uXkAdxoNBKJPp/PMZ/Pce3aNVy/fj2RqiwPw/IoZdp1s9mke3Xp7dzv9zEYDNKx0wcHB6iqCrPZDPP5HIPBANeuXcPx8TEmkwmWy+WOly49t3lnL+uH9wTTo7jZbOLg4GCnT7RaLQwGg0Tsn5ycYDgcpnuDWSYSxXrEM4/n1nGP5Wdc2oLexdvtNt15r5stfExlHbGPcQPD7d4fvG/sjMYb/+26ejpOmvC3epJqvGhcjvL1cS6ac6Ky6rgbEXUalhKRgFpuHSdcdANSRJS5Hk445eY+nTNZZh2zNHyuXiJi223i87HWudZVROb5Oiiyq+saEZDR70jnSBdvfzp+e7qqi47pDOfkY0Raex06KRzZwfOJ+qOmqfW/b96ObLevzTNstIaI5mH97vNuVF+ej2+qi+wQpe3rW5/7aRddm0cb6DQfz5P5eDvQNNyWvo7SdKL1XJEiRYoUKVKkyD45xQq/hR8FgAsjhWvUeAIP3HY6Lp/+ca/FD/yd78G9l+/JrgNf/8pP2/l9ut1iMp9gsVrgq7/j6/Fjv/5TF65XkSJFihQp8mzJHU8Ik9RQLyzgxiPkFMAEcAP54gCVevkpSKOksQK8OU8VhqPovZ8OVq5Wq53wSvQ6ORaBqtFv6uwAmpJDWnYlM5REZDw/ys+9VzWO6u7gvd+N60Cl6+vku9qf+ZL4YL1GAJjq7+Ab01Q9NR8HyrUOtPwRkeC2zJGU+hfVt9dZ5AmndxZrm3CS2T1jNJ2oHfE901ewk59uVyeqo3pxWytBFukSgb8OjkY21PpnGN+woOXRsns9ej1pG3ByIgLZvfx6THIEmutYQRKU+bMv8fhn3kGr/YLjDj3zGZdes0pezmYzXLlyBR//8R+P2WyG4+PjVK71eo1HHnkEBwcHODo6Sp64JycnmM1miZCu63NiVY+L7vV6ieDkvcmTyQTb7TZ9Z72QFN5uz+73bTQauHz5Muq6xnw+x3K5xGw2Q7PZ3KnX5XKJ6XSK8XiMbreb7txtt9s4ODjAaDTCfD5PXsHAmcdyVVXo9XrpeOajo6OU7mKxwOnpKfr9PkajEYbDIS5duoTxeIzxeIzFYoHFYoHBYJAIXxLQw+EQVVWlO33b7XY6mrnb7eLuu+9Oxz2zLdEL+eTkBHVdo9frpee9Xi+R9K1WK90ZPJvNUFVVIuWjNldVZ57V6v1d1/XOkeXaZ/nHdsN6rOvzo86fruzrEz7eehx9r2Gc/NC+5OuB6OSFXH5OHjrppWOWEk3R2Kt6all87ozWETo+5YjFfbZV3dQWvm6JxtNo7FPbenwnv3Ll9zx9XHXd3HNy33pLf/t87/Z0vaKNSr4W8TJEc47bKrpz1ud4T8/LEtWB25Bt2zcMRvrnyEK3sbfT3BxMO6lOUZ3syzOyh9tFNxWqDlHby7Xx6H8AX9Pl9FcP/Eh/Dat6qm2iDZ0R2e8bq/bZz/XMlaNIkSJFihQpcufI4aVDDEdDPPzhizuOeYMVfhP/FU/gg/gEfD7a6N1WeivMcA0PXpB2Z9KoGvibX/I/4flX7n1K8ZqNBo6GhzgaHuLv/dm/g3fd/x48dvyRC9WtSJEiRYoUebbkjieEgXNwjF5MBLl9J72SPg6mOVFHoMa9Bp0Ics9bBx013yhNPUpaAUgF69TL1I+DvZl3lIJQqgvjRsSfA1ZOwjmQ7ECbeiSxXJH3JeOot4l6RbvOXgfUj2mTsAB2Pbi1PArgRSBqJA50smzqXewgpnqYM88IZHQAU+tLdY8AUn1H0Q0Hnod6iTIftbWWKRL1XI1IeQfYFbRV+0UgtraFnESeRw6iahqavrdfLa/awtuVtgFvM96+IjJA9chJXdfJ45LtxTdeuE0B7Hj+AkhEoHvr0RuYbZDp9/v9dPxyt9tNea5WK8znc9x777141atehfe85z2JqG00GpjP53jkkUdQVRWuXLmC4XCI09NTrFar5DXK9E5OTnbyJaE4Ho9TWN73y7uF+/1+Ijh5Ly+PZ2aeq9UK0+l0J13G5XftWzoG8fjoxWKRiOLDw0O0Wi10Op10BPVyucTx8XEi2tmv5/M56rrGYDBIxPB0OsXjjz+ePHJPT0+xWCxw/fp1bLdbXLp0aWeco35MiyQr7wRerVaYTCZYrVZYLBYYj8cpDgkEHmmt7WWz2aQjq+v6nLTVdj+dTpOejMMw2u7Yz3Uc513EfB55CD5V0fGMnzom+2/91DCqTzT2s69FhI2OQRHJw7hsTxHBkhubqI+PnTni1+dVtYGPSxHBxe8eV8NH9ozGfl2bRHNzRHz5Z24s1DFKy6P60h4aJxpj9Z3O0ZEnq6+JGFbz1809UTuJ5mNfV+U2fWl+mqfPo14ef+59xG2h7dnnYLWX1oXaJdpIqPZSvXVN4Xl4+T19n6+juS7SX3/r2kTzcl20jXub8PW7x482ZaoO3lb8ZJh99cX0ow2D0biS27TmbVTf32wdUqRIkSJFihT52JVWu4Vv/F++AS962QvxH/7V9+HnfuIdmIynF5L2KdZ4EO/BAhO8Ep+NS7jvaXkL16jxMN6LOa5fiF6U17/y0/DFn/HW20rjja96Hb76874S/+D7//EFaVWkSJEiRYo8u/KcIITdq87BEgcG3XPBwSAC40xbPwn0kHjhOweEmKeCuHV97h3ioLvq60C8gzwkiBU4Yjg/8ldBMD1qlukpCUjvPuDcUxjYPdJabaxe12ofDc+6UU8y2pY6OsgZgbURwOXep8CuZ3cEsnp7iY609rhaHyoRMRCBg1F9ut0iINJBca0zrTttx14GbYuqg+vrgKoD3vpdvY6icnmaagPN92ZEgJZXw2jda9q+icLtwHboAGoOfM6B794GvB2yH0bEdE7Y33hUcLfbBbBLTvHP+zzjcTPEZrNBo9FIn/TSZZxms4l2u52OVT49PU1ex7z7djabYTgc4gUveAHm8zne9773YTqdpiOHP/KRj6R0ut0uhsMhWq0WJpMJ1us12u02Go0GHn/88UTC6jHVdV2ne3hJ0Nb1uTczdSX5yGONq+rMSxkAhsMhut1u2gg0n89x6dIlPP7444nkJMlL4ne1WqHb7WI0GiWvX5Zju92i0+kkcp6k+Xg8Tu2Lx1XTXiSKASTvXdqzqipMJhNcu3YNq9UKV69eTXcrkzS+du0aer0ejo6O0Ol00qYf6km9rl+/jn6/f0Mb5yaY6XSawi6Xy507k0mcs2y8g1jbk7Zrksy825p50fObbfR2j4tWcXIjGgOpm471Hi4iP3LjtM8rahM+Uy9iihNlnq+m4XpEY5zrGKXlG388jMaN0lDJkYKum4oT7DmSS9OI8nZSLZr/onko0s/TjnTISRRXy+PfozrR57n3npbXT1RGzzsKdyvp6nMlXz0/LYPXj67norqN4qtu0VoD2H96Btei1DtaE0a6e5n1JBNNW3XR/ufrvFwd6dpa68A3eERrFbe7rkm0f/kahGOH1kVkO81/Xz8sUqRIkSJFitxZ8po3vBqf/jlvQLfbwTf+378BX/5nvxT/6d/8AH76x38O0wsihp/ABzHGY3gBPgUvwmvQxQhAhQaat0QQrzDDA/i1C9GF0m628De/5K9i2B3cVjpVVeEtr/sf8E/e/v/BYr28IO2KFClSpEiRZ0/ueEJYiRe9YxPYPepYiV0FfhhXCWMnPpkHiQwFWiJPDwcFGUcJ0gjg0rBOqDGOk0wqmjaAnaNl9VO9EFxHJ51IbGhYJfec+NL8FdhTL1mGVW9uB9I1PQcfnVjMgaxKEjpgqOEobm+SZxpf4ypoqXE0XW9fTMPL5mXxTQIKxHvb0Ph6dHqr1bph84PqTZ2URFe78E8JfK1bb/9+53Ukke3VDr55w0FkBUY1TQdHvd59g4b2SY3LOme/93apdaRxnLRWz91bEZJvuslEbcPyappVVSXykrooMbzdbtNRwyRemRYJT95lS8K2ruvkEcsjnl/2spdhu93i/e9/f/I4PT09xZNPPonhcLhDODMPeviuVqt0Vy3tf3h4mDxNSTgyDu8c5uaU5XKJqjo7yplpAti5K77f76e2N5lMkn3a7TaOjo5wcHCQjtLm3cedTid5Itd1nUhYEr6dTid5A3MM3G63WK/XmM/nOwQJSXfan2mwDq9du4ZHH30Uq9UKly9fxqVLlzAYDDCdTpPdeSeykrpMdzabpXZAXaiPthPWd1VVWC6XWC6XafNGr9dDs9lMBD3bgI4ZTIPl1DJ4H+Wx2BchOn5HhImK92NNQz81DX2XG+c03M08CKO5V/Xz8Un1isqp42hE5nAcjOY6t5F/z817bgO3t4fNrVf8mcf3eYyf2n59Q4LGczt5XXleXh4nsvk+IudzdsmVV73pda7ScvpGQE3H1wEex9dC/tvT2qe3ltvt5GlG66mcHXJ9MYof2ShK3+tETz1x8XYWrRNdj33ljQht1dfj+lolWhfo2LGvD7nu3j4iElrF6zdKp0iRIkWKFClyZ8qXfOUXodvtADhbn7zslS/F3/hf/hq+9E+/Df/pe34Av/zzv4onHnvittcDK8xwP34JD+I9aKKNNvq4Gy9HhQpX8BL0MEIDLXQx3CGJa9R4CL+F2QV7B7/2Fa/BH//0t2T/z3kq8hkf/wa86O4X4gMP/e4FaFakSJEiRYo8u3LHE8LA7lFrlMiLxck3FYLkBE/oJQXcCCxHpK6Cfu4BSzDGCSYH/hxM1E8HmhRQVGIVOD8aOEegOVGmAKETvEpoMqwehedAk4NoBKVypLHWk9tBAS19r+WKwFS3lx+jrLbjEbYRIB6RiBFwH4GhTNs9ThjWPc5UvL3m2oun6Rsh6P2oXulan04yRGSA6+wku4b1ckZl9PI72BrZSHXdR5RrH9ZyRHWbqzdtJ9EGDAVl9bm3Va3DHBCsQhIwKp8TDwDSvbkMQxKY+qnHr5Kn6/U6kZAMS2/hVquViE0eJc17d1/1qldhtVrhd3/3dzGfzxNZ+vDDD6c7d9vtdiIeSRr6EeUsy3K5TN61VXV2lzHHMR6Fvd2e3a1MnebzeSKXeQcvxyLWFT2T+e7g4CAdMa1jno7FABIRXVVnx2dvt2de0sxzPB6j1Wqh3W6nY67ruk5lPDg4wMHBASaTSep3tP12e3Z3M4/d3m63uHz5Mo6OjhK5TG9uHhk9Go0SmU6CerFYYDQapX5YVVW6d7nb7aKqqnQvcFWdHSlN+zUaDUynU1y7di15huvGkPV6ndqN9gG/Z5fjEG14EeL9MPKAi8iQaL70MczTzo2dkS78rX1Q01LxcWwf2MI0c+SxjtPRnBiNLTqmuV0i20RjUs4W+2y7r5xua30WzTVR2m7z3IY4n4tcXx1XnYCO9PTnUbrROyfO/bh2T8MJPC97NG9Ec6+vGXxNpO99M5eXmXpF+UZtjPF0Pepp7Fu3+KkHrC++U69Yhon0jryfWQe5PqDxtT/6Rs/cxgWO21p+tYM/559eaeIbVDUPJ8Nz6yavJ1/nub2KFClSpEiRIneOPO/5d+MTPuVVNzxvNBp4+atehr/xd/4aJicTvPtX34Of+pGfxnt/43148iNP3tb/ciucbdKe4xgneOQsP/x3VKjQQg+XcB8u44U4xPNwiHvxJB7A7+EXAFzcBrVGVeGvv+0v43BwcCHpHfRH+Itv/nP4n7/r/7n3f5wiRYoUKVLkY0GeE4QwEAOO6uVKUVBbQaQIlHMQlsShEmwRMOOgW+Rl5SAuhQCQCt/78ZW6+58ef0rWKVDlf3qsqeejYJbmp3mq7k4SEyRTW+hv1oc/V/s4GBoBeg68aX7UlWHpkehpMHzUbjQNtZES/g4OOwiq9a3ElbcRTccJb9+Y4GXQ365rREYrIUE9FICNgFttU1rn2u8iklnbqNZnRKx6HejvHPiu7UeB5H0SEdqqK4llB6MjYNXtQr1uBurn6kqPjHbP7O12mwhTbSdqf+bPY5pJpjJOq9VCt9vdIXzZJ1lukouqz8HBAV7zmtdguVzi/vvvT3eZn5yc4P3vfz8A4PnPf/4NbaXdbmO9Xicit9frpTtx6/rsHt5+v49+v79jZ+pHPebzORaLRfKAXa1WiUDmncf0TiZJu92eHQFNAvn09DR53vb7/VR+3k/carVwcnKSPGeffPJJzOfz5Em8WCzS8dKNRmPnqGq1JYl9EshHR0dot9t46KGH8MQTT2C1WmG5XOLy5cvo9/tJJ+D8RIZms4lut5s8pFn/HH9YZ4vFIpW50+mgqna9xlmX6/Uax8fHiYDWsRtA2hijd5/7WMr2uNlsEnH8dCQaq3P9RftV5I3o47Wmz/f73vn47SSRjm8ez8lJHbfUxpEuEYHka5hIf9dF9YnGYL7XOUbXBUwv2lQXPVP9orWSl9nD+sagaEzlbyflXP9obvD243Ow203zcfvn6t7TUB35LCJUKU4C61+0kdHbWa7+1S771sN87v3J52QNq+tGXQPsm8cBpHWX2zKaE6M25fWnYXRu9vYQlU1tGG3eUj34qetxj6ttWjeMaD1pGJ2jtQ24Tf29t33dnKOfup5+umNzkSJFihQpUuRjT4ajIQ4vHWbfN5tNHF0+wud8/mfhcz7/s/DER57AtSeu42d+7OfwS+94J+7/wAcvZO2wxRlmdYoJHsX78SjeD6DCEJexxAQbrG47D5XXv/K1eNsbv/DC0quqCl/6h74If+/ffhsmi4s5ZrtIkSJFihR5tuSOJ4Td+yEChCLgmYC+At0KyCjIBNx4JJ2SMg7M+BGc0S79CPhyDwEHPN1riLrTa03jUMeICFT99bsfR6ufHt/JOPVIpj0joIugmOar6TvZ6qRdVVXJu1G9JdVWDvBF3iUAklel56FtIfL21jpQctfrU9PTO3e1LjWMk45RW2FZIqBS686BYG0zWh9qL9ajEr0axoF415nl8jareWsf0vqI6lr1cqIjl2YODI/IEa837V9eZ54nwzlZrHUQSRSWohtXOIZoH1GyST2HfOMHpd1uo9lsYrVaJa9bHr2sfbPf7ydCUL1Hq6pKnrXL5RKXLl3C6173OjQaDTzwwAOpz3/kIx9Jxz/ffffd6ZhqEspsUySzSebSM5UE5HA4xHa7TXcVs3/WdY2Tk5NUXt6lS5J3u93uEKPMk+MZw9Fjlvcda/+fz+cYj8eJqCa5SrKXtptMJpjP5zg6OkKjcXbsMo/dnk6nmE6niYhWAuXg4AD33XcfPvjBD+KRRx7BbDZLNj04OEjENu8RZrtiviSZx+MxBoMBlsslxuMxGo3Gjhcy6591z9/j8TgdPR2RFHzunsAcE9gmWHe3Qwh7/4gImRx554SIh/HvUT63QgRRIm9lj6/2jLwIGcbHTB9PfJzyuNH8sG88idKJyhrNV1F5Na6P1xHJGdVRZLdItK5zNtU0VKeozNF8pmO+ljmaZyL99TPKU9tqtGkhp5PWrYaJ1igeRt+77roWjdZVubJqPUZrAF+Da1rqCet56BoyEq3PSDdf06udvIycg5iv96MoD1/TqW2jtbqv2bz9cz7MrUs0nqan61f2Cw9L0c2DuXZbpEiRIkWKFLmz5FNf+yl711QUrifuet5duOt5d+HjPvGV+Mq/8BX4nu/8d/jh7/uvODkePwPa1ZjiyQtPtdVs4W98yV/BsHd7dwe7vOKel+KL3vgF+Lc/870Xmm6RIkWKFCny0ZY7nhBWkCsHEhPMVvJEj2hzL0AFukgc89OJPfeeZTzgHLxRsNSBHiVmvFxMw0Em1VcXf56WenEq4OV/TMdt56Sve5JGpJrm6XfT1nW9c7S12lzL47ZyEk5t50Cj66ReGK6rA9NuT7WDHqUdgcyqm+tLYNTBSdXZidS6rm8gujU991LJiYOOERDuZYk88Rg/Sp/x6Rkegc6ervZFht1HKCjp4p5j2kdVJ8/D7cv0PI/II0vHjH1hnSRQvXM2pCjRxo0VTJ/kpR71rOXTP7YtHhVMPb0t6jjX6ZzdOcQ7cpl/t9tNZPF4PMZdd92F173udRgMBnjkkUcwmUywXC4xmUzwoQ99CHVd43nPex663S4AYLU62wncbrcxGAxQ1zUeeeQRbLdb9Pt9nJycJC9Z5tdonHnwsrwkOxuNRjp2meXhPba885fPtttt8pSl/enZSruNx2Ncu3Yt3RP8xBNPYL1eo9frYTgcYjgcot1uYzabod/vo9ls4vDwMBG+PAb69PR0h0gn8UDP37qu09HbL3nJS/CBD3wADz30EGazGRaLBebzOUajUSKRSVj4Hb4ch65du5YI+Lo+I8h9jKAe6/Uak8kEx8fH6Zhr7xck0XmHsvYVtRfbJvV4uhLN1dGYpOLEmI6ZmkY0V1J8A0U0J+r8k0vXx3jgxo0v/IzGEreDl9vHzmgc9g1FEaGl71T3XJpqt312dz2dONM8dENYFM6JZODWCDsdt1U/DROtBX3N4+Xxsvo4eSt2con0YBlccmtZfeZ1Eumvz5yU9HfR/Mi0ozWxbySJ2leks66f3EPX500nmSPxNhDZjd99c6Tro7r4mjKyb0SMM59c+/O25N7AUX/I9Y3ofwavw4jQLlKkSJEiRYrcefKyj3vpLRHCkYwOhviLf+0v4C1v+2P4gX/7X/Cj/+UnMJ/NL1jDi5fXv+LT8LY3vvXC1zjNZhN/80v+Kt7+y/8V4/nkQtMuUqRIkSJFPppyxxPCTsy4l6uCNg5iK0FHkEXvlNVwBPmdHFJgbLvdJs8sJXY0nnpM8HlEBtZ1nUigyPtXRQFGBYsVaGI41dXTUFspYMa0lHxS0CnylMgBt07mKblAYs/rT8M6qcU0tcwORLL+buZZpu8iIJN2i55H4KWXW9NWDxPa0O2jd+Lq/dSMrx6OqoPbg8/qevcIRK/7HNjswK3WbwSwat9wm3h63kcjglWJFm8THk+9shwg1by8PWifiIBerUM9VjdHQDwdEFa9WtWm3ERxenqajpJmv6HOfMbwVVWlT34nSchjlFnGyWSS0lACVsnIRqORjhu+evUqPvmTPxm9Xg+PP/44RqMRlsslVqsVjo+P0e12MRgMdo5Wns/nKZ1Go5G8iFkeeidPJpN0nPN0OsXBwdmdQPQeJrl5eHiYCNmDg4N0XDPtNp/Pcf36dYzHY/T7/R27PvHEE6ksi8UCp6enaLfbGI1GmE6nWK/XmE6n6T7k+Xy+0y4ODg5wenqK2WyGRqOBw8PDRM4eHh5iuVxisVhgs9mg1+vttNter4eXvOQl+OAHP4jHH38cJycnGI1GuOuuu3DPPfdgNBphs9nskLc6z1y/fj3d4dzr9dBut3d00z5I+1AXnUfYXhaLRdKX8yDbtvdPtjfflPF0JRorWQbvV05aqV1YXvecY3oRcZJ757r4WOCkkOuoY4hv+skRT5pnRHS6rZnPPkLc8/C5zcvi5db53cfQSDzvaAOc6pFLR8clbwc6v7n+uTrLkXq+bnPZV2/63r+rHfb1kZztozkz136jjQ187m07WrfpqS7U19tKpNs+/SKCnxIRuJHk6kw3mvF59Nvtw3yjTZbeTqI+oDr4Osnj0J6+3vL+4+ulfesFX2vqWOP2jNp8boNfkSJFihQpUuRjX0aHI3z6Z7/+ttKoGhVe/LIX4X/6v/xlvOGzXo9//13fi99693txunn6G4CfSWk0GviGt309Rv3RM5L+617xGvzxN7wZ//Znv+8ZSb9IkSJFihT5aMgdTwjzHkkgBlnb7faOh6cScYyjxIoCPg58t1qtBJoDu3fgujcu04pILwX4o53+SsQynOqouupz3xmowBTLqp96bLSKA1lKtjsArzaJAOcIkHaSXOtLvX69rFpvDOMbARxM1mdqk6ieciCa5uPAqoKQfves1iH/3IZOdGhZnfTwcE58al5en07E6zv/HW2cUKDX25HalP2GbUjLqXbV/FhXejx3VAavey2btg8NdzNyIQob2TLajODAq+rpIOytgLLqIcw7gNmW1OvQdWd96X3AnU4H3W43jWEkgzlecONKXdfpKOVut4vNZoPBYIBer4dOp5OISY6z2+3ZfbxXr15N+TKf5XKZSMpms4nhcIhOp4PFYoH1ep2I7atXr6LZbGKxWGAwGOycGsAjmjebDWazGXq9XkqfRDLz3Ww2aLfbKT49ajlezmaz5IHM9zwWut/v48qVK2n8on16vV7SpdPpYDQapWOtAWCxWKR7eenRTK9mzjer1Qrtdhvtdjv1h/V6DeBsDjk4OMBLX/pSnJ6e4vj4OJHhi8UCd9111w6JTLuqNzH71mazScdfOxHMe5t5FzM3OimRyLZEz+lc3/G2H40RtypOpOQIGJWoz2qf1jnZx3XNV8dNH0ucSPE5O6e76+zp6pivYSPSy22SI7DcLlF6OXLJ7ZiTiERzAk719riRTW4lX76Pwvg6ItLHw2h6/jzyxHTizcdwJ/j0nZfdbeN2i8qai+/hovrgs2hTQa4N+dwezXkqUV/0/D1fH298M5yW1TeEebncjlx3e36RDrrx0/uy2zKyq48Pvj5mGN3k6Gl5mbT90JbRWivaSKl15PWu61W3Z5EiRYoUKVLkzpFWs4ler3shaTUaDXzm574Rr//M1+K33v3b+NmfeAd+8of/G8bPyFHST19e/4pPwxe/8a3PWPqtZgt//Uv+Cv7LL/0IpsvZM5ZPkSJFihQp8kzKHU8I81hVAq8UAiARgatgjoJTSmop6K3vmbYCLEqIOvkWkV9+d25EbilAyXgKOioBqmRXRHSpXkoI5IBTeipG79wri59RmaL4UXlVZ01HP/1eYvXSZBgHPd3jxcFOpstyKUHv9ab2iPLw5znPKgVINY/IO0fbAYBEfOXqXCUCkyObKDiqNlebah1Gwry0D7j3C+NHQLumrd4yDKNHJ/vmA68jtYsTqVH9q20c3Fe9I2+yXPpe57cKxtb1GWm5XC4xHA5vKKeDvCwH+8Jms0lewf1+P90XTLuR9CPhSA9Y9Trnccndbhd1XSdv1FarhU6nk45yXq1WuO+++7DdbvHggw9ivV4nIpj9iKQ2iVEeYcy0mWajcX4f8HA4RL/fx2w2Q1VVidCcz+eJ+KyqaucUh8VikezXaDQSMb5arfDkk0/i7rvvTscir9fr5DE7GAx2xjvavt/vJ0KXR0YvFotEpLPete+fnp4me/KYZZaNRzFXVYVOp4PT01OMRiO84hWvwP3335/uHT4+PsZsNktkPu+GZ3z12mYeJLS1f7EvaN+jrrqBR/uA3iOv/UI3W/C7XwXwVMTHF23P2l8iYsnHRt2Y4RsnNI6mEeULYKd/KznjG5SieU3Lo6QQ043GVx1rfJwBbiSA1P6RLXNlUxtEJF7OFi7R+kbbiObl41ZEuvmYG82VUdk0rei9pq1jvYfJzW25tsd3vonP25zX57527OF0bt83D0dzZ2TfKCy/65gR5RPZydcQbr9oPaTjjK7tdJ6O5vzI7m4v7w/abtmPGV43z/G9l1/Xgbn1rBO1PnblTiHyOqU+etWF11Hut+vudewkO8PynvoiRYoUKVKkyJ0jr/vM1+Lg6ODC0quqCp1uB5/26a/Ga97wqfiSr/wi/NSP/DTe8VO/gA/+zu8/7f8BL1L+yhd+LUa94TOax+tf8Wn44s94a7lLuEiRIkWKfMzKHU8IO8kDnJOGeqeuAncKdDuxqAAPgRX3wIoILicHFGRXUC0C+zxdLVsEsnlc5qXHUSvAqJ7AjK9eeUzLATmKkqUU2hdAImsjzwZN2wFSB1Ud4HNSXJ/ru8g+EeEfPdf0HEyOwHuvA7XHzcBfBf/cVjkyWsFM1dFJCtVV2563K9fR60jzjcrqgHHkWaQ6ORiv+UXgt+fpoL62FW1XOXCYcdg3Wq3Wjrekx3Ggnnm7jbRdOWiu5fNy5ezPOEq66ZjFjQvUW48KJinMsazZbKb3DK/vSU46ud1sNtHv99FqtTCbzVIZW61W8oIdDAbYbDaYz+dot9u45557UNc1nnzyyVSG5XKJuj73PO33+4ngXq/XqT78PuRer5fI2PV6jUuXLqHVaiUyV8cc2kjHV93Ist1uk4fwYrFIgDiAZIvlconBYICrV69itVqluL1eL+VL27TbbfT7/XQP8nK5xHK5xGg0QrfbxXg83rEziV0SugCSpzHDHB4e4r777sODDz6YiHumvVqtUn2xDbOO2C7Yx/U4aIoS/UxbveQ0HZ0rtJ06KaR1cTt3CEfjp/YBbZO5vqVpRWOPp+dhKGrfaHzS30oU6+YqDR+Rd0o0ReXUenad/dPnJi+Tz7Wuk9tDN3VFY73nF+UZ6RPZ2tdAPr6q/lGZcul6mb2ufVz3NCMCkqJrOGD3lBQvV7QujObEaH7RuU31Zp65+nZ9IzvovOIbIt0W3g51fPa5XtPR+dbtEZGovrbSNDWer3fUfr6Jw9PmGKnPcpsh3bYaRteJmqfa08dQHSs0ff8/Q09F4VidazdaDr/ywu3u9enzfZEiRYoUKVLkzpD+oL9zWspFSlWdHSX95/7yV+HL/+yfwM/++M/hR//zj+MD7/0dLBbLZyTPW5HpYvqM59FutfG1f+yrCyFcpEiRIkU+ZuWOJ4SBXQ9OJ8AI3CrwqSDMvgUUQRW9O9GPnYuAUgenNpvNDhis6bpnk3oxU0eGVeBNwUKGU+DNATAVBaUc5HKgNCKwFBCLwDAlklQ/ja9AoHtoR6JAbC4tBZo1PbUxRY8z1nZA3RWEdTBObeYAoOsVgeVuVxI9DKNkZQTgut21rA4OOjAe1aGWsaqqnY0U+kzTi+rLveu0DBpG9XYQ2AHXyJ6Ufbb1dq+ksNvDwWnXLfJK1o0IEQAfAbBRX3Jh3XPc4JH3zJtewLz3lu2FbZzx6Sms6dBDSMdD6rVarXb6LI895p244/EYw+EwxWe4ZrOJF77whTg8PMRjjz2Gk5MTTCYTrFar5IHbbreTFy8ALJfL5HXcaDR2yFQAOD4+BoB0lzCPwGZZ1uv1jrczcD5G0/Y8JprevbRft9tNHrdsrzyWerFYoK7P725frVaoqioR4vSs5p27bHck35988knUdY1+v588o6kvPYjZnqjv0dERVqsVHn/88WQT1ht/k0TXvuREBT9ZTnprq2c47aTjGEl7emKz7+jmIh3rWAe3Qy5E47g+V8lt0lCJiC0VJW+1PJ6ejyE+/jAtzzOnj5fTxwWvEx+3NV6UX5ReziNZy6gboPbNKcCNG5dyBF70PWd/1ye3ESonOq9G6fm6TNNz+0XvlUzzMd7DeD5R/ajtojVjZFeNH5XJ89c2EM2vvnkhmi9dXBfNN9dvojkyt2mCn75hz9Plc29jXn7t1xz7VG+SqNTN89E+oXpGJHJuLo/WjPpMN7RRj2gschtpf3RdWDaumyK9Pf0iRYoUKVKkSJFblaqqMDoY4gu+9M14y9v+GN7/Wx/Aj739J/HL73gnHn/0caxW64+qPn/nX/+vuPfyPfiyz/piNKob17AXJe9/8HeesbSLFClSpEiRZ1rueEJYj0kliA7ceMxcRIwyHIVgDYkOJQZyYDNBJvVEBs6JPfWsjcBCB54i3dwj0gEfgvebzSZ5RERALdOi3moXB2RVIsCW4JMS2HzmgLCCWV4erRc9EpnxIq8ZJyMiIk7TUEA6ahNKgLIMGicCuT2NCMhUm7gHTQ7gVztFAKHG92PDIz1zcV1XPTpbn7sdvR9ofk4yUtiftP60XzB8lHYEfmraSuRrWkqOaZ4RCaL1xDSVBNE2420zAvK9PBEom+trvM/X+4f+Zl1pPnpPKY86Vm/iZrOZvGC97qrq7Chj5rFerzGbzTAajXa8Zk9PT9M9wdvtNt073Gg0cOnSpWQTHrM8nU7TUc8kfHlHrx5RzHebzQZPPPEElstlOvZZPXWrqkrE9mQyQbvdTiTrYrFInrg8irqu63R/MY+p3m63WCwWO6R3p9NJJPVwOExE+2QySfahVzl14F2+y+UyPaNnMI/Gns1m6X5g1oeStGyPly9fxmw2SwS0z1V6DLe20ZyHHNs82wdtq6S5bm7STRo+p9Ce7GP75olblahPOeGh7VMlmoM9HR0rIlJL04rGGE9H+7GmE+mSI9Z8TNL03FN73+aim9lC81DvVh9DtVyuT3SySbSW0Lag3514jOZN1VfzitYNUZvbN9fpOsDL5usnzcuJeffy5HfdHBVtYtN1oP7WtUWOuN/XzqL1hIfTNL0v7dtk5XXN+Gqfm9WlPtN2HK1xcnGiNUAUN5pTb5a+1yPf+cY1L7+vV73tqPh62nWONonl+mW0MTTaXAecby71dGn/3P8/RYoUKVKkSJEitypVVaFqVviET/14fPynvAqTkwne+5734Z0//6v45Xe8Ex/+/Qc/KuuN49kJvu4f/3X86u++C1//BX8BL777heH/RbcjT46v4X//oX9xoWkWKVKkSJEiH0254wlhgi56LLJ7OFEUbFeAS+8KBnbv99I4SnZ6WCeVVD8FZfg98mDQ8lTV+THQJCQYX70IFfQhMe7ALfVkPvxTj4hcmfYBcqqvlk3zV7Ar8ipzANftobZXst/TVI/NyDPV03CwTOP5nZxuT32uNvEwqp+SyzkA1+0etQknErxe1HaRZyvDRiRSrqyeroaNAOWI+HDvYS2z3tOpOjjwvc/uDpx6edmfVLeoDec8rZz4dz0jQF/Hmlv950i9h/TYX9WRYxP1oGcvj1rm9+Xy7Cgnkp6r1SodmU2Ckd6nvV4P4/EY0+k05bFer/Hkk09is9ng0qVLiXydTCaYTqcYjUbpvt+6rtHtdvH85z8fs9kMx8fHidyl5+1gMEjlI0ncaDR27hGu6zqRpzw62W3aarUwGAySPiTQKXpU8nq9TqQ07w/udruJgF0ul5hOp7h+/Xq6t5f1ScKY9ULbsS3RU3m9XmM4HOKee+5JtgDO7jZmm+IR0NSZ3txsM0dHRzg+Pt6ZtzgWebv0tuJXFADnXtg+J/nYsl6v0/3PEUGsxIS25dv9Z9/HJT7zucjHy2gMjsYPzSNHPvv853OkE1Ta13PkS1RGfx+NyT5Xu44aP5pbgRtPgMiRTZSbPdM0orkhGgs9zj7ROtH8o/nM13I+9/mY67q5R3TUhqN5JZrLtG6iMkaeuJpnNL9H4u3Jn7v3dmSHqA14WtEc73H1WZRWNMZ4P1G7qUR1Eq1ZNK6XKVqbMLyOg66D2svr1W2XGxe0HagHcBRf10HRJkJ9Fv3/Eq3jVbxN6Jq+SJEiRYoUKVLkoqSqKhwcHeCNn/0GfPofej3+x7/61fjAez+An/qRn8a73vkb+Mijj2MxX9w8oacp1ybX8S3/4Tvw3T/9H/Hdf+uf442veh1azYuBvk9PT/EP/tM/wm9/+H0Xkl6RIkWKFCnybMgdTwi32+1wZ38EBDuJEwFE6kWqnqPAjd6IJDUURFeSLQLy+Ts6klhFwTH1wmW6SloS8OJzxlVi1EFKB7E0XwWx1BYOCCuwFYG7npeCaQ4WKmCr6W42m524EQir+jmpkAMbFTRzANnvdVMd2Q4iHbz8Lk64uygYq0SAts2qqnbumXNPFcbVO0LpoevtxgkOJz40HNP2DRV1fX7vndtdP73tADFh7d9ZPu0vfjeqA/fa7xhX+5DbOgJdHZiOAFXtX05AaH3k6imS7fbs7tv5fI7BYIDhcAgAO16yTgqTrGRf4XHJJFi1T9B2JGHp/el9stfrod1uYzweYzabYblc4vDwEP1+H/1+H4vFIpG9g8FgxxP38uXLifCkh+zJyQm22y0Gg0Eiruu6TmQ1bdZutzGdThMZzhMgttttIi55ny89kSeTCZbL5U59tFqttKGGuq/XazSbTRwcHKDb7Sad2C5J2rbbbUwmk5QGbddqtZJHsLal+XyOqqpw6dIlAMDJyUnyAh6NRhgMBolo593J6/Uay+UytR0Sz97mojbL/On1S1sxjm580fuFte3wGGvg/Mh6ji0UJxPY59gWn45EhEr0nuLjqr7nmKLXPvg87+0/8qxkWvo9Irh0DPL4Kj5f6T2mPh+xTUTjns4B+/LgnKVl1jFRx+LIxpqev9M2qHXmdaDfcxvKfD52+0ZEm+er4mN1VCceL0qP9cR+4LpF7SQi6rVO+NvXeN4O3AZeNs1zX3+J1o8+d2k6UdvVdZ2Solov2m69vUVtwvXxsEqgqg6Rnt4uPR995jbxdY6uFaI1nrdpr1cdSzSME+BRm4/6lG8e8/7g7Y7p68ZS3UCndVG8g4sUKVKkSJEiz6RUjQqDYR+vecOr8Zo3vBrH108wPh7jF376v2M2nePnf+q/48EPPfSMEMS//9gD+ON/9yvw19/2l/HXvvjrcfXgym2n+Vsffh/+6Q9/J07LhroiRYoUKfIxLHc8IRwBJQ5MESwhcaIeA/S29WNilShUUFeBJOYbAWYEn9Qr0UkmBXPdo0AJHweHIkBdAescqEtx8EiFRIMffafEBPNz27jtPCzBKSWXFUT29EkIOVCm+ag9KX78sRPXCkCqfTWtHBhJO+9ra2pft10OlNejfN0jXQE9J3cc6HS7MJzaOAIOvU7Vpnq8rebrgLi3YdVfhXpGQKXHVaJfbcF+E7U1tZ3/zgGjDvpGdRoB3Toe6F2t+4iJqI+q8I7buq4TIcrxQDesePokQnu9XjrmHsDOGKd2XywWaDabyXt4s9mku3L7/X7Kr9fr4fDwEK1WC9evX8dwOMSVK1d2xpx+v4/VaoX1eo1+v4/RaJR+k3Q+PT3FbDZDo9FIRywD50fFkyjVNrPdblNZeBfwfD5PQPh8Pk/lU3KIR06fnp5iOp2i2+0mr1neScwy+UYaxqWeJFXn8znW63XqP4x3enqK69evYzAYJNuqdzJJb7/H2cc0lpk6kujVsYvhdV7RPq7kAHWgTbUd1nWdnvM+aH53woPx6L2sY9VTlVybd0LEN2D43BARUE4S6diQm+s8bZ2//Fhu1VPje3/W99Gcr3GcgPI0nNTy+Unnm8jGnp7G1fRz815Ot8j2viahzv7d1xT7iGKW2b3d3RaRnlEZXHSTVDR3qU28r3pd+ncVL5e/y809uXJwbPN1lK8Bc+u8SBedW11v7XNu52g+8vbNZ/s2Ofh8m9PT1wH7bKTpORns+moc14fi/ZXftS/6msjXapqf5h+tZdxeus7zdNx2UZpFihQpUqRIkSLPtBxdOsTRpUN8xZ/7ctR1jT/9NX8Sv/O+38Wv/MKv4Ye//0fxkUcew0UuT65Pj/H3/u2344d/5cfxPX/7X+Cl97z4ad8tvK1r/OMf/H/j2uT6xSlYpEiRIkWKPAtyxxPCDowpkKfgmN7DSOF3HgOqoKYTUU566Z1dmrfr5gCUhiVBTbBK720kMaHgewTEuq7UUUEzBa4VLHIyl+lG5KISIFo2B0q97O6tqbpTN/cOcVIgAjQdmNWweldmDuB20knL7KCf2smJRiVb/X5WByIVoPMyOXmt9og8nZUYjEhhJbj21a9613mcHJHr9o4A+aitaf9Tnb3uFTjVfBwMpThI7eVyj29vt9RD+7Xq6UC1A9KMr95lHi+yT05IcOrxwbppxNsoN7nwjx611IMkZrvdTkcwk7zWe2vVk1Hr5/DwEEdHRzg9PcV4PMZkMsGlS5fwvOc9D3fddReAs+OR+/1+0qnX66HVauHJJ59MJDW9ikkKMwxJ1aqqdo5cXi6XiVDlvb7AGWFOr2LqqmO4EtCaTl3XmE6nmM1m6Ha7WCwWKR3v+0ocr1ardPwzPacBJN1Jvk6nU/T7/USyNxqNdGw3n9f1uUe9elaTzKfntNcH27TqyXuhOZdwLN1sNuj3+zsECNsQ656e0F7XPo5ofPaP2xUfL/YRNDq+avyIOFJS2TesqCeizskRSeV92Mdh78c+JvkaI8pDRccn/Z6bU2kDnx/9fWTziLTKlVXnZe8fWjfRXOfPIv0i26hOEemVixONWxrPw2uZojxVXx/H3Z5uVw8TfY/S8t9appwHqYbzeYZ93u2Ym5eiTZVuC7drtOkhsqWv1/he12nedr19u277+h3f6+a1SK9IT9/Mp/p6nVRVdcMaXdcGuk5zvb2faBvyuvATery9+W/9pH6cF4sUKVKkSJEiRT5aUlUVOt0OPunVn4hP/NRPwBd+2Vvw4z/4k/jlX/hV/Oav/dZtnTylsq23+KX3/wr+yP/8hfiLb/nz+OrP+0r0Oz3cfXQ3WoIL3Uz+yy/+EL7np7/3QnQqUqRIkSJFnk15TiEADlY7COdkVAT+MSzBE/UqdS9Akg961zDBHKat9zsqSRORx3r8m4JdSgIpsc0wCno5ocX4agfmpToo4EQdFbhSolXtqkSVpu8ArHu0qW4OtDlJzWf8DtwI/kXAnYJl7u3GTwXYHFRWMsHtpWC52zradBCRAhGZ7WBoBB47Oah5R4RAVM4IUI509rQi20bty/OI+oaCpkrCqM4OaGt+OeJF83IQWYF1B975XsnhCKx3QFnTZ5hog4GHywnvz1VAmXrQW5u24qYRkr4HBwfJu5jvlOjXMZK21ffMk2lSf5KMvIe3rut05HK3202fJFIXiwW22y2Ojo5SeegVTP0mk8kNbYXlYz12Oh10Oh0AQKfTSXrRlkrgUnd6N6tnNNsDCVQ+I+E8GAySx2yz2cRgMMDJyQnq+txzmTo4UQacge3T6TS1ueFwmMqpJDXvHWY+1Evvhdd2qu1dN/oASJ7TWq/0eGZ+tF3kXc72EXlo6lzH9hARIE9FcmOTli0ac3Ljj8+Rrr/GdxLFx022nYi429fffc7UeKqvp5EjoaOx1PONbONElUpkp5x4uRhXx8KI1NN3+3T1OcfHcx/r1bY+v+lc63bTT3/u/SnKM2pz+t3nc7evzoNRGk6sut29/VB8rZUru+vgc1Au/aj8npfrF21MyMXTZ9HaK9o8wLR9LuXY5O1IN1XQXvpMJaoX31inYXPrSN+U6mX3ccnDRrbWclN8s6fG0X7o63cvS5EiRYoUKVKkyEdbqqrC1buv4iv/wlfgS//02/Dr73w3fvkd78Sv/eK78MD9H7olnORm8uEnHsLf/e5vxXd8/z9Gp9XG57/6j+DjX/BKfOEb3oyX3/tS3HV0Nes9PF3M8O3f9w8xno9vW48iRYoUKVLk2ZY7nhDmHYoAdo5XpURAqQJ56l0FxMQw45MQVSBf7/HMgXeRly/JX/f+UGDMQTvmqZ5itAFwTmbRHgqWObGttnCPMAf7lAxWicBwEtZ8xvqJFniaJwkItZGCaATdNLx7THoYL5+T19SB5SPpoUQZ81e9tH753MlcJxc0vttM09vnhRbVqdpHbeNtxkFfB6Md3I5AUj/WWt8zDQUslTxyoJvPmIa2Bw3vxIEDyFoGzVf10nbkGxUiYl2BWh8zvB3nSB0Np21Vw+Wkrs+OR3aP7WazicXi7O4dHkGsfaHT6WAwGKRwVVWlMHr8M3/r3bytVuuG4/TH4/GOR7EeK9xsNjGfzxMpDQCHh4fodDrodruo6zrdwzsajdKRy6vVKh1pfXJykj6rqkKn00m2abVaSfdWq4XFYpEI1tVqdQNpTAKYhG+73U5lHQwGO2MZvYkHgwFms1my5Xq9xmQy2RkPtD1wXK2qKt1dPBqNUv2zbobD4Y6HGclk6sjxm/f4bjYbTCaTVD7Wd7vdvmHsZXtjWB3blOD1/qrtkmnoOEF76lihm490/ng6/6x7X6Y+2hf96oQcaQUgG07HDw0bpeNhI9LK+2zU/z0tHVci4kbLrXE8/Wiucru5DV23aGx3fSM7RzZ3vSMyK5rD3EtTx9KbEZWRXbR8OscwXLQhKHe9QG4+0HnE84/mHtVHw/G9rjF1fsnNgVE71nksJxrP531PT+PkbB2tG7QtReNBbp70NNQerr+XM7IHn0dtSOtSy8jvOj5rvFx/9/bgayvvNxx/NY6v6XMbULR9RP0wCh+NXdG4WqRIkSJFihQp8gdBur0uPuNzac2y4AABAABJREFUPh1v/Ow3YDad4Xff93v4b//1Z/Hghx7E+37zA5jP5jjdPL3NbDVqnMzOSN1//3P/CQDwv/77/w0vu+cl+OxP/Ex88Ru/AJ//ms/FpeERmo3zTYNvf+d/xS+9/1cvpoBFihQpUqTIsyx3PCEM7HqLOLCnYKGClcCZh5QD3fxzQigi+BwcJTikd34ybl3X6bmCaqqnexgpoKrh3StOy67lU++viKSi3g5EOSjqoJfrp/ZQoN4BaeBGwFvjKVGh72kfpktCR8OwTOqRHRHx7o3qIB/DujdeBJK614kTkF7XbgMtM0E79/BmeXwjgtYD83bbMw+tRxdtGw6OuqeM6u1hve1F4KPq5vdje5p8521O+5U+8zLerA5p233EhwPvDtRrXg48qy0isuZm4OxyuUweulrWKG5d1+h2u8kDV/thr9cDcEaw0oOX+q5Wq3TEdLfbTV6qy+US3W43bY5QgnG5XGK5XN5AUI5Go0SE6vHVJJy73S46nQ7W63XKV204m80Swcyjp1lHPFK52Wwm8rqqzo+93m63mM1mibxWALzT6ewQuUqka5uj5+58Pk95bbfbRD53u9109DXHluPjY6xWKxwcHOz0UXruciyl9zZt2el0EsFOEnuxWCRSnu1HiTWS9+ohHm0eYTn13mD2Ddpey62bktjGVqvVDZtv2O8Y/6lKRHI5ieJ90YkiH0O9j0UbL3Qe0vbqc2HUp3zMzxFfubkhiu9zKbA7nka6OeHlG4CYRtQOmKceoR/ZRON5+SN9dY3kabtN3G46rmpfjdYZkd19/aR55zw4fS729UCubfrayOdctx918CtHIhLX22lUNi+PrlOj+TI3B0drtdx6zT8ju6s9Pd3c3Eaddc2r6eU23mkeXj63BXDjBhC3PfvmzcYGTVfrXje75cat3Fih9RJtPvD2lbOnlk315qZKbU/eXosUKVKkSJEiRf6gSFVVGI6GePXrPxWvfv2nYrlcYTqe4N2/+h788jt+Be9657vxyIOP3nY+dV3j9x75IH7vkQ/ie376P+Cey8/DW1//x/Cln/nH8Uc+5XPwq7/7Lvxfv+ubsT69mCOsixQpUqRIkWdbnhOEMEFyeqqRCFByk0AJcH4/5D5PlYhE4jN6ZylYw3x4VKeCPwTzlcjiO807AqYjUI7PCRgqWe3EmZO6JByc4POyR6CrkpJ6hLMD0wqyapkIlNKOeoy028VtoPZRwI/vlUTlO+ofAZgOcmtYlolldZDbwXEtt5KQOWBTy8NP5qN1GZEgEVgc1ZeDpA5Ue1uJQHrmGQHgas8c4J/TKSKyvE84senArRIlDhjnvK9UB91YEemteUbAvacfgemat/bBfaA5Zb1eY7lc7ow19AJV26gHJ8cY9RZ1AHs6naLb7SYdut1uut92PB4nArbX6yXicrFYoN1uYzQaodfrYbPZJK/X6XSK+Xx+9s/ccIher5f0JQF8cnKC09NT9Pv9lA5JWZKlnU4n3fNLUpblWS6XiWCmfjyGervdpvJw7NVxjh7TzWYT0+kUzWZzh5xut9tYLBbJm7jT6SQPaHrw8hjm4XCYnjUa5/cJb7fbVB6mS09ghtN+R+KZRPB8Pt9p1/rpG15oF22r7E/MkxL1UR/TfBxkOB6TrX1QPdafityMIInGfZ879FlUPk03925fejebezQO08q9i8Lyd0Sg+bvoezTPRvnqmOVxnOiKxjm3caSrku5u76ht+NrA5w8n9jU9fRatE6K69/QjW/kn4+XagbcVH9ej9L18/s7JPK+D3HykuubqOGqb3td9Y1muDjytnL3Y5rQeuOZwu+V00zla9XHdfCPAregXreVUdw0XrWm4LmE4J2y9jfhaLkrbj7dmXL02Rd9peT1fxtPTI2grb6dFihQpUqRIkTtD7n3BPc+2Chcq3W4H3e4V/NE3fy4+93/4HIxPxnjvb7wPb//eH8av/eKvY7FcArd56Mlme4oHn3gY//xH/xX+5U98N17zsk/Bbz7w21isFhdTiCJFihQpUuQPgNzxhHBEThFAUaLV7yIFzglOB9gVSIoAJCUmSUIQ+NJnJCY8XwW+VC8ljKi/E0wOiLtnkIdVsCiKE5FqCuRF4Jl6eSjoSnu6DRUYZZ5eDrVtdNeZlkXtpH8Mp7bLAd9qLy2/g7iM496maisFyBuNxo6HuIOQ/K16KnjnpLfXv0oEPns+WueuNz/1CHK3pwKY2m40Db7jM9fDwzrY6vnp8d1RPUVkMf+iTReqtwO2rvPNSKhInyiO90slwiNQ3OX09DTdw8v4BHs1TT3mWe3TaDSSF2qz2UwbZEiu0nOW5V4sFpjNZsnu7Ps8upnHF9d1ne7bZZj1eo3ZbIblcolGo4HlconhcJhsc+nSJWw2m0Qk93o9XLp0CYPBAOPxGLPZLOXFO4rVttvtNtlCwW3Nv91uJ9vQc5gbcTgmdzqdHQ/Xuq4TWcu7dpmubqChxy9wRoD3+/2UXlWdeyrTlvTEZp3R05gewSSzj4+PU37RhhY94YFp6z3zOrcwPx1bfT7R/uj9hHqohxnz0nng6XoHU9ROfKe/tY+4p180njnB6HneLKzmq+NHdM1B1G+Zlq4xoqO6vWy0hdvAx3qfv1mXPi+ofTRtnU+iDVO5MjGNnF1pIw8fpePxNU2fy3P20Pc+r0bl93bq43g0H6lt3TaevpdF40RzkOfpc4OXIzd3R/Oyl+NmBLtKbj5XW+iaLDe3RetI7wtuT32e28il66+cuJ01rj6P2qHbm+npmOmbQ7XPe1/08QS40WPZ15G5tZ2WwcO7Llx7872Odbp5s0iRIkWKFCly50ij0cAb/tDrnm01njFpNBs4unyEz/zcN+L1f+i1ePShx/ATb/8p/MQP/RQee+QxbJ7mkdIqm9MNfuV3fv32lS1SpEiRIkX+gMlzghBWoFABEiV53BsVOD/mGbjxODUFfRx8UbBNwUkFkRhe9VRASHfxR54nEYmk4LCSiRpWyRwnvbQMqp8CmQoeKcGggLKCg5q/1oeSxg7wab24XdwOGt6BM4+rXs+0Eb874e8Aqdeh2ljtp+JtTAHAfSCw2kXBYwUYGU4B6lz9AbtEuEsOWPQwmpeHY7oRMe7gsMfzNsv4OaKEaaptnXDWcN5HHIhlOKav9+R6+RzwjoiBfQCzjjXaPjzszcjhuq4TyUovXiV5GV8JLNp4uVwmAlf1WK1WibzUsYIeviQrq6pKxzTT+xZAOtK5rmssl0u0Wi30+33M53NsNhtMp1McHx9jPB7jBS94QbpfdzAYJD0Wi0U6MppHLXc6nURG845hHqVcVRV6vV467piELvsOy+r9nZ/Mq91uo9Vq3XDMJ/On5/B2u8V8Pk/2JCFaVRWWy+UN8bTNk5QlgU4bEpSv6zrdU3xycpJsSGLX+6jeaU5Pap0T2G75nHYAzk+x0KOmleSmh7f2P5IKJMCZh15noGPsRYiTKRGRo3WqY4YSsDo/ed/NpbePXPM5KJo3fEyO1gd8r2sDnWt8PHcy37/f7DP33T99DNKNBj7XRnOfp6dliwhJFScU1cZRfant3XYqke09HV9raN46H3jaPsdoXLUFxwyvX7eL16/Wg5fJbah9IBIvZ5SG6hu1fZ179+niz2+2TtK5V8NG6/CoHWhb8A1jDO935no/1fWIloFho00K/J7bqOe2ztWB9jvgfIz3/wH2rR81jtpG5wsls72sRYoUKVKkSJEiH2vSbrfxwpe8AF/9l/8MvuLPfzne8+u/if/+07+Id73zN/DA/R+60P9PixQpUqRIkTtB7nhC2L0FgV2iFjgHUIAbvTU8DkF0fuenH+FG4EUJPb2fk396RDPDOSkWAUgRYOn6RmEUgFICATj3iI6AbuDcq8EJOCdTaWsFL92LSXVU4DNHsDsQpnk7ya716mBXDjyNyurAW13XiRAjuaO6uf0U2HQgX8vhxLe/03jaLtxeXv7cdwWm9bcToNFzB0/1+T7SRI+Z9vg5D919dZV7rnWv7ZH5eJzoN/u1/o7AZ5ZLyQIFlSNxm0X2ULtFdqUsFovUHlVPtk/2Cx6Zz+/UlWNPt9tNpBnv0FVAuq5r9Pt9DAaDRMJqW2e69EaezWYYj8e4dOlS6ier1QrHx8fYbDa4du1aOjqanrQkSfVuYR75fHBwgOFwiNVqheVyidPTU4zH4x1SVu8NJ8nb6/XScc60F4ld1jHvJt5sNhgOh8kWJHd5mgPbKG3Do6DpCU27tlotLJfLVA/9fn+nr7KeeP8zCXzg7J7k69evYzKZAEDyMFbSWIk1vX5A0/bNANRf+/twOEzz2GQySZ6/elQ3gEQk63xJT3QnLpzEeTri/SAiPHLvtW9GXpX8TvupnW5GiLlefr+4Xr/geunc52NDNB9E45yOlfrb9WV+0brB7XszW7oe/qlhtQxqB1+3aNqqF9PdN8Zrml5mDeNrCBX3hKa++j03r7m+mp6StqpXNCdGOusahs91XaC66JymbZ3vIyJUbeMbkXJzjacTic6pOh8wPV8n6lzpfUXXgVoOtc++NYevMbXetP1o/t4e1IZeHq0brz8vl4bzMBGp7/OD6+M2842AmpaH9/apaega8nbH7iJFihQpUqRIkWdbGo0GBsM+3vjZb8Cnf9brMRlP8bM//nP4/u/5z/jg7z5QNsEVKVKkSJEi/4fc8YSwAmEKcpOsVRDK709kfAIsfK5edxHZFAHQqo+CNev1egcgUrCH6apO+l6BHvcE1Lyje8go6qHpwJyC/fRUU2KBtlSSQgFKB2j550CnljMC8SJATnVVgto9mCNAN/K4joDCnER2pC34XsFJ6hPZ1kFQbwuapnovOsgepeEAvOvk5dTwCtay/tSeCv7T1hEpQls5QK86Uag3vRejY9wjUsHJ68hG/Iu8450U8bp1kiDnDaZlUr3UvtTB+1tECtxM6BFLnTwNJx5IYJJIVDKb9xGThJxOpzg4ONhpd91u94ayjkYjrFar5C2s3sYkbyMSg/cRb7dbHB8fo91uJ+KX6Xa7XYzH45TnYDBIRziTZKZ3K+/Z1fdVVWE+n6d7hXVsoM15N/Bms8H169fRarVwcHCQiNF+v5+8j3u9XjrumelE7ZJ9gXZQz1vflMD7hKfTKa5fv47FYrFDYkceZzpGcA7So6vpUcwjurWNVVWF0WiEK1eupLZIm3F+JMldVVU6apt9Uj2LlVRgWaLj/G8mPsZ7v4gIEic2cuOC1kluznBiKurX0Tyiurr3McPpd9Vb9QB226SKj03+O8pHP3V9EhFfrrPG0TT3kV0sv45takMfV6Ox3+syN8aqTmoTtavqG5GaPs95XC1TZO/I1jpHRmFUfE7wZ2pPTYO/ff4AkPq8r6mc7HN9fL70srptNZ6X0TeieFvPzZluQ/7pRk0vr4bjpkZdS2kYt2+0ftJw2n48Lt9H7dPHEV0XazvztUg0nlCcwNd8fA2m80PUb7RsufGjSJEiRYoUKXLnyHa7xbt/5T34uE985bOtyrMiVVXh4HCEt/6Jt+Bz3/Q5+KV3vBM//vafwi/93C8/26oVKVKkSJEiz7o8ZwhhB7UIiDi4HwHoDqxFHhZ8TjAsIkH53EXBWgV2KEpwuKeEg1LuuXQrADnjuGeNA64u0TF2DrS5py3L6HbSMjJN/SQJQVKC77QuIhtGukf68Lm/j7yHHGR04s/JAQW5+VvT4nvaRdurewPnPIIZlp++2cF1c0A/Ao0dyNQ8I6BdNx7kAHZ/pmXUvubAqKbruucAfu0TtJ2Dp1rGiAjJbR5QgoNl8Pg5sDn6TvtEbTEn9HDVMYbHB2uZHQgGzvtgq9VK3q1KIFIPHi3td8WqHejtyntwG41G8s4l8L3dbtFutwGcEdnr9ToRwUx7NpvhvvvuS8T0cDjElStXsFqtsFgsUl6bzQa9Xg+DwQB1fXZ0Njf8MK/BYJA8ltfrNabTKabTadJViQsSoZvNJnkRj0YjHBwcoNvtpvGGRC3LRK9mAOmoa6bLPHi3MYB09DTrhXcrHx8fYzabpSOkFdDXMV/7hW68UKJZP7XOmd5gMMDh4WHKv91u4+joCFVV4cknn0zHfvtpFkzTSbtoHn2qEhEqPhbnNm9EY0COENH8vJ/5JiaPGxFEPsbpXBHlHc0dnp6OK9G8FY2L0VjrdtIyRCRdTnzcj2zDtNW7f5+OkQczxec3fR7Na2qTqD14HhFBmptPfTOG20PbpLcPr0OtB9ff7RGN1yre1jQft+XN6ljz9Lyivrav/+Xan9pZ+7iGU1tGdccxxucw1VXDe9n3zcX87f2DefgagDr4OOPjVNR3vI78mbYH152bPTnGcf6KNrbovOHtmbbR00WKFClSpEiRInemPHD/h55tFZ51qaoKo8MRPv+tfxRv/JxPx4//4E/gn//Df4nFfPFsq1akSJEiRYo8a3LHE8JAfNeqEqcK5DiQrkSSA2d8zuMzFdxRYk+9dvmeaSnYpKQLiQEFfZRwYxkoei+pgmEkURkmBzI7wKfiACbL7uVQEIt6OFHB9AhQkZRyoDYCGCNAXe3FPNSzRPNTYsOBSyU3tK04mKx5a/q59Dz/HBGgIJ3WjYOCLt4m6/qcMHd7erra/pQEUhKJYRzgdnIoAoBvBmarXXJEkgKb0WYK1dP7Ry68ksL+LvrO8iqR32g0EhGn/UeP5VVdmIa3Z28XEbCfk7qucXJygsVigW63m+6spS4sP8cn4Izg7XQ6yWO20+ns2KWqqnT3L9Mi8Uldl8sl1ut1erfZbNIdtv1+Px3J3Ov1EmHKe3rH4/GOHeiR3Ol0kkcw28NkMkG/30en00kEM4+RJjEMnHkFdzodLBaLHUKadqBHtB7/TJ15xDW/K4HcbDaxWCwwn8/RarV27lLWtsVjr3l0NEXHFG3nJIJPTk5wcnKCzWaDZrOZxkHOKZw7tM1pf+aRzzqX+XGkJNG227PjwPv9fmq3zOf09BTdbhdHR0dp/FAiW9tbROZcFKng42g0ZmpYfe/jmabh31V3H88iXSLdXA9/zneeXxQOuPF0CSVvfB50gofhdKyM0o1083L6933jkttUPUO9DGonnzMiHaO5Xuuaz5280+c6l+XKF33X/KP503XJeU/rs5wdo/aqZVd78nl0DYoS5TfrL7SVr3E0n0hf3/QUrc90bRzZyG3oHrDRuiNX/7p5wMuhekXrXoqvY6N1H8Pl+qTWha77/Z3+H6H/Z2j/0Hdef7r+yOnubZbrFk1H61XvWS9SpEiRIkWKFLnTZXQwxNu+8ovQ6/fwj771n2K5WD7bKhUpUqRIkSLPitzxhLADPQrqRF5BDgbxk7vp9R3JBwdV3JNB0+F3JUwJ5KsHjJJmSuoyLMlUJ5uVDHaSlvHVLkqOOehMwoDxFLBSINMBXgfnI7DSQeDIc9XBPr8Tk7ZnfL3HUgku94RwIFK/O8DsJLC2kwg4jNoRw/qdvQrOet0ocKh1GoXhnwKJCr67x6HqoPUV3aXtntveX7yfuI5RH9BNAu6R6gS1erk4AEz9ovTZT+r6/JjbCCxWPZUQd3vl2k600SGqS4Zz0t3Tfqoyn8+TZ6mCzNRBxweSoMPhMJGfKj4OMF32Xz8CmkdW08O43+8nArjVaiUimffyjsdjLBYLDAaDdNR0XZ/fpzufz3FycoKqqtIxxgcHB7h69epOW2+1Wrh06VLKv67rHd3Uxv1+P206YV6NRmPnTmTeOUwvaYYn2U4b8h3vS2bba7fb6PV6aDQamE6n6Z5ltg/2FT1Ge7PZJN3b7fbOMd4+JkWExna7TfnQLnrlgfYX2qLVaqHX66X49BJm3+dx2fQS1k1JEXHohI+PhU9VfOzXcY/t2cNRIjJEP1lmPtP+so9w0nwYh7bMkVO6ecbvGHdSzcuvY4qXT8mliAhSO6nurr/Pq2oftZeTTB5ew7mN3a46bnha0XzpeWob5NpNy5dL23X0NhytR9Q+2lY0npZVN2xoGJ2j9+XncXxu9jLsa+Ouo9vB+6jOxT5eRf0p2kzla4Mo35yu2uZz+bH/6FpI4/r4kFt/uG329ZuobLqm0vWS2yLqv1zfaxhfc+pnlIaOI/rMy+916mOjphGRz0WKFClSpEiRIneyNBoNvPltb0Kj0cB3/4t/hw///oPPtkpFihQpUqTIR13ueEIYOCdG/O5bAuIK8CggrwCKk0kOaPpOfBJaDu4o0OXAbVWdH//poDTDqI4ORitx4PoowOckp5bN9Yq8Q2krBRCVwGMYBaLcfgruKWmp9ohIdQfISGpFgDPJLKalQHJUJ6o3vztQ7GVRu2nZbwZGKtEaAdoksNwLjLo7EK5hHIj2PBzEVN3U5gpcsn4iIJ/h2TY1Pa8/LcM+vRUk5vuI9NfyeTvlZ3QXcY4QcsJE84ju+vaNHfsIBLXJPs8912mf0EMUwI7Xrt4Dq+1eiVPeG0vydrvdJnJ3sVik9NjfuTlExyQe/8y7dReLBZbLJbrd7g75SB273S4ajUbyOCZZv1gs0gaU5XKJuj67Z5j3EzP/7fbM0/Xuu+9ONh8MBuh0OphMJqjrOhHQy+USs9ks3S9Mgpr17ER2o9HAfD7HYnF2fBQJdNYLbce7lDudDpbLZfL0ZfxHH310565mekyzH7Fv80jraGMEw/Noaj0BQsd/1o+Ob+qRpv2F3uD0SGYe1LPROLsHejAYpDqgN7SO1douqZN6Kj9V0fHJCRm+j0jC3Nyguvo86uRNRMhE+avonKP6a5q0k58Y4KTTPuIvIgg9Py+/5u/hct89XyfoItt73rk5bx/Z53F9rRPp5u9zdtBx1sn4iETz9KMNYl7PN9PF40U20vFVf6vtfI3oaz+3Y65+1Aaqi6/ZVDfG8XuLIzu4vhQf2/T5vnYY6eSb1rQP5/oLw0Zji+an6x8vX7Smch18Y59v2PN2wnUebeN9zddLukknWiP4elDX8Gp/1cXXe0WKFClSpEiRIs8FISn8qa/7FHzz3/77+MB7f+fZVqlIkSJFihT5qModTwiT+HDAWQkkBWkdDHISzcFNpuWAEbALBiugr+9JUKh3mx5Fq0CRkrAAdo5aph6enwOkqnfkEaRl82O1GUbL7KC6eqM6OBh59bjHh8bJEdean3pDeP2pTR1wc528fjUtBZWjfLR9ODjn5VAQ1klhJxH9zlYHNJ3Uph7RndCRzXLeMGw/DKPtyAkhrT9Nj8SVllEJowh49t+ah4OYTFPJXtU/AneZpgOqahetHyVSVZ+crt4P9dPzikgWD3MzogE4I4EnkwlWq1UiWzudzo5XtLbtzWaTPFxJDGr9kODtdDrYbrfo9XopHT0BgR6lTPPSpUs4OjrCdDrFfD5PaXe7XcxmM1RVlTyTeeyzHhdNElnbDO/vfeyxxxKZO51O03HLJGevXr2KwWCAwWCwc3x/VVVYLBbJa1nbDo9OZnmrqkrew71eL5HFJG1PT08xn8/TUdq0Q6fTwWAwQFVVmM/n6Ha7mM/nePjhh7FcLtHpdFI7UvCfXsH0NNY6p+cvdVVyP2pTwPnGAPZbeoArIcf8mbfWoY4PPJ6bntveXt1LMNfXblWiPFyijTEUzVc3aPgco3Onkyf7iK5o7vQxxecDnX/5LCJ8fIyL8tSy3cxOqtvNxisvp9ol8pjVOtAx00kzDxudmBKN+dFYrXZ3Eiwi5bReozk1ZysnK/ku2pTm+fv8pOsBL28UX+N6GA+runpZqYuXxW3rd9/qJqxce1A9OB76cx0fdI2n7cJty/xVfHNYtOb28GovzcP7j48D+tvXDd5Hc+uIaP3hdte68vWS20rHLK+DqJwquh7SOUPjRG0zd/d3kSJFihQpUqTInSzPf+G9+H/8g/8bvvf/9/34z//uB8s1GkWKFClS5DkjdzwhTFGvKeCccKMQFKFnl3q1RYRRBOhqOCUBHXwi+cJPioJkOeJRwSoHPfW3e5Hpb/cQyZFV6k3i7x2sigBYDaPEoJIK6nmi5IWTFA5gufevpkuvOCX03CuL3ogRiKwAIAl7r0u+d7DVgVuP4/rQzgrIKQiq9lbgNgI5HfiL0tK2pfp7ft439Lu3QSc6NB9vb16P3v60XA6Yqsdr1GZoV69LBZe1rpm220vF68Q3OCio7fXlZImXMbKvhvW6jqSua8xms0Q+VtX5EemMq+D9drtN9+XqnZ/sn+v1GvP5HIPBIJWP7ZMkIknnuq4T4dnpdNLdw8PhMN272+v1kocscH6XsI5HfD+fzxMh22q10O12sV6vcf36dQyHQ1y9ejWRqPT8HQ6HaLfb+MhHPgIAODw8xHA4TJ69fNZoNLBYLJKtWB4Sw91uNx0DPJlMEhnKe4lJuLfb7USksj1Gx1FPJhOcnJyk9qHl1jbqmy3Uo5dtg57cJHm1Tr2/kKDn2MdjqumxTYKbc532J3pEk+xYLpc39CP9I2GuGzT2tdV94uNHlJaPefqMcfje57Z9OmpaGl77pc8LPu55fM65Ov6QtHcdtFw+hlB8nPGxNrKhP9cxUvP28JFdNG99p205+u72iog31TGyh8/d0VwbrWV8jeJrCrcN89L1SfQ8yv9WbB+N804mK6Hu87rPIT4/+PrL25K+1/YXkchRuXw+Uf2j8kZpRf3cJRobo3qlRH01WjtqOlrmaC3l+vC9E7UexscE5qNrdK+jyB4cgzWMrieVLNeyqR4ehrrrOkb1ynlQFylSpEiRIkWK3Mly73334Ov+5tfi3vvuwX/819+Hjzz6+LOtUpEiRYoUKfKMyx1PCNMzKyJaSYoQaCHxwXAkPxzcVNBFQUsFfgEkzzSCaPzOTycBHbR0EMnB0RzIpOk5QBcRvFoe9Vaj/TSsSgQiOoCoYJQDu/pewb8oPS2LlsEB1MjrRMFL/tZ8HQhTsky9slkGJTpJ8EREuIPHWgY9+lBt6WRBBOzxGb0Y2Wa9zeSA9YiQiABVfmdZmL7mp+HUvjlySN85+Eq76L23+sk6yXkURWXx/pUrb7RxwEF5LwfFiScns12fHGCuwL+mt0/q+owQXiwW6Pf7qW0o+cLvJApJaDK+epTTI5hj12q1wmAwSETobDZL4+lyuUxpbrdbzGYz1PUZSUxCVgmi5XKJ9Xqd7gdm3vSIJYG8XC5TWB5TzU8ee8yj/nk3sR6FzWOnOfZ3u91ULyRG6/qcwK2qs/uQSQ6z/ui5TIKY79gHODbQI3s2m6Hf7+Po6Air1Qr3338/JpMJNptN0sGJDh83lDCjZ7DOL71eL/UFbffsk4yjbYD1zXKvVqtUDo1POzSbTQwGAywWi0R86z3sfq8w83q6R0Zr+SNPWYqTofzTMTlHakTzoRN6Ts7xucfxMcFJGp+PnbRzvXJkooZ3/X388nz429MA4jvro7x1DHIyXTfnqH6qyz77u+4Rqaf14XWvzyPiUOsqp5P/1jWK56k67mujWv8eP4oT6e3hcu0xKk+0XuI4621cNyxEawede71+3X4+n2v9qOTacJSXhlfxOVHHw5xE87g/U7JXNypGmwmjNZKnx/Hd19w8nYP28fak5dT1pRLL2ic1X53z9f+LaB3EMqvdixQpUqRIkSJFnovSbrfwZV/1JfjU130yvvtf/Dv83E/+PFCWRkWKFClS5A6WO54QVrCIZIh7qqqnqJN5DsD5XcQMq+CQHtXpIJ0TrApoA+fHTNPrzAGyfQAW32sZqmrXYzDyklIAS22j+SrwqralfZ0oJAipIKuSU5qfxlEPOveucA8Hvtd01atC60cJ/hzo6iCo1rvXl8dTANk/3VaeluqjnpMOBDK8puttz70/FBhU0tNBcuqmNnECPQJmtb0oUKskNtOJjk3XNp4j+nMSERBMR0nlSNw7SOtZ26/rsA/Ij9JzkNVBdG0nDuYz/M2A2tVqhc1mk45QbjTOvGE3m83OphTWEeuE9aEeoxR6tK5Wq+QF7GA+idCqqtK9u8x/tVrh2rVradMCPY5ZFt4ZTN2ZHoWEcFQfzId/jUYDh4eH6c7hdrud7sBtNBrJm7jT6aRy8e/w8DAdG02idDAYoK5r9Pt99Pt99Ho9NBpnR1hTL97TXFVVulOYx3GTWD86OsK1a9dw/fp1LBYLTKfTRH7TxiSt6bHMPz2WlaQs9aRNeU+yzmFsBxxLmR+P62Zb1ruMAex4QZP45qYBPWKdeumRyPy8XUIY2CUroz4Q9WnPM0ewReN8TjS+zpmeloeN+rDPIZouy6wkjusXbXKK8tUwufEpIsZy+vmaIiIFdZNOlI7q73p7uGht4xvpPI3I29Lf59pDNKdrXlH9apm8XWp53M46R0a2V91y7XPfWm9fv4vKG733svuc6GHcZt6uckSnt6EoD623aH2hz9hvov6wb45WifqqryO8/Wv+ubWgn2rCdPxIeaanayZdE3l78rbI62P81ByVqO15vRQpUqRIkSJFijxXpaoqvOqTPg7/52/+Rnzm574R3/dvfgC/9/77n221ihQpUqRIkWdE7nhCmEKQhN8VWFGiUckSBXwoEcin4RS0i45tBm488lLTU/DZ4zOug77AuYcYn1MHj8t0HWyLALnIhm5Lkhpqmwj4Vu84J8od7HOvXU0v8hJzIF7fu5eF6qf3rTlJHQHbagPq4jp6vTrIHXnrsq7UDoyrtnPbeL05yaA2cvA2AiIdLFQvGaap9o4Ib/eM0o0YtAHTcF3dpl7PTogoeaR9OAeSRwC6bsbw+vLvGkbrRm2tNons7DbXsvO9gsd8vo8YVy9SetKqTuzzesdslLfWB48ZbjQaO963mgeJYpKsSjDyuGcdT3kkMQlrPiOpWdd1OlaZXlS9Xi+RubTJcrlMeZHEBJDijMfjnXZAYnM+n6OqqnSvcavVSiR0o9HAZDJBVVXpmHgS6uv1OuXRbrfR7XaxWq0SAU+78O7hfr+PdruNRqOB0WiEq1evYjqd4kMf+hAef/xxNJtNjEYjHBwc4PDwEP1+H51OB91uN5HWtC3LSdstFgssFgtMJpPkGU1PbfZZ2pbewr1eD8PhcMf7ud/vJ4KZ4yDbshL0y+USwDmBTKJd2zrJ6X1tNBLvXxFxGI3D+szH/1w+bPN+x73O81FfBG4+F3p4/r4ZOat21LnM1wRaPp9z9hE8mofm5fHZblTffSRa5PXpemgakZ6al4fxvH1u9TA693i4aPzNjcm6rlHR/J2U26e/b37y+J6Hzkleb55Gzra5culGMvcadfuq/ho/euebGrwtqA78vJW+62GiuVk/cxsWNe9bFdUxOslFx5Fos0bUd6K1QFVVaU7WMvp6Wtt4ZBfVORqHIttGdorWu0WKFClSpEiRIs81GQwH+IIveTNe/5mvw7//l/8RP/HD/w0n10+ebbWKFClSpEiRC5U7nhBWr1Hfra+AipJfCuAo0UrAxO9xVKJXw0cEDMkJPwqU3zW+AnfUTY85ZboqSoxRPIx7eCnYpsQty6ykGZ85eOQeMxpWbaygp9vb64G2VhAuR+qzDLmjmN2jWHVWT9fojsfoLmkAiWDR9qLAnYNu7gHrgKK2Awfx2d6oo+oTAYNeD0qAeJ1HwKWSe17vEYjuttU8vE152b1eFRB1W3gdOPGidqT+2n/43b24I3uprt6n3CaRJ48fvx6RK15XvnHhVki29Xqdjo0+ODhIhKKS82z/ANJdufRw7fV6qR5IyPKIZN4VzHGHBGm73Uav18N0OkVd18lzlkcTNxqNdB8tj1OmnemdS1stl0tst9t07DXt0mq1MBqN0jPagoR0v99P+VBXjqGLxSLZvtvtJqKY5VytVrh+/Tomk0kqd13XGAwGKX3ePcy7hnu9XiIQWR4S5HoE93a7xXw+x3w+T2N+v9/Hfffdh06ng06ng0uXLiUP5Ebj7HhqPaabnr6sq7o+u2uZnr70AN9sNlitVphOpxiPx7h+/TrG43Hy+G00GhgOhzvHYfP4b73TluXUY7FpEx2TtC3r3PB0yBclXrR/+9iU80Rk//D27WlSfLzTsV9Fx5loDNkXVtOO8td51uOr7m4TisaLSKZo3nadfPyNyuX65OYCJxVdP6/Tfbby9pCrPyXy97XPKE/fsKR2i+YILXtEnEVzbS6O28N1cFu7PSi+6Siqq6hN+ZymErUnt7mWJdI1ys/nYy+/6+J1kZNoDlU9taze7jVOznYa3m2TaxeuF/sf5yTdIMB1mJ9oo2se3yTJeJq+joPcyOMbUXzMVPENhkWKFClSpEiRIkXO5O577sJf+dtfhze/7U345r/99/Hwhx95tlUqUqRIkSJFLkzueEKYnlMR2KEEm5KCCqC45wPBSD3SMwLg3LuXcekNp6KADgmACKyN8qHOLCeJGw3r3qKet4NjqjN/R+CtlpHhFARzjw3N81bAYBUFrnKgLnCjp4YDa36vmnrORCAjiVHXp65374WO7KVkiYOhTqLk3jkRnyM/NV8HbhnOwUcH893z2MFEL6u3zZyXjOrBZ9o2+J3l9qPGtQ0wHSU63eb6m+Vi+lo+1T8ihtTmTDt3LK6DxJqP6qP2cPJE4ygoHuXndpnP51gul4nErKrzuwqVrFytVjeMSTrmKOFLz3p68pIoZdtvtVrpWGmWf71eJ2L28PBwh2BkXnxG797hcJh0IsG62WwwGAzQ6/WwWCxS+221Wjg8PERVVckLdz6fp+OcedwybXlwcJDsxyOu5/N5GgfW6zWWy2Wy9Xw+x2QySWGvXbuGXq+HK1eu4MqVK2i321gsFliv1+j3+wnYZ958Rju12+1Ul6PRCIeHh5hOpzvjtrZPbRfL5TLV1+npKUajERqNs6OrqS9tdPnyZaxWKywWCzzxxBM4Pj7GarUCABwcHCRinzam97bmp/2KHsvUn+1Mxx3dYEJ7P1XJzQO5th+RcjovaFr8rgQPx2zdGONhXTcf21yX3HsfMzm25YgkLVu0ZomIOP/uae6rG+qt73Rjzj57ROnlnul87elEZfP5R+dDTTMaW4FdosztoGF8Q1xuHeTzsrcvL4v+9nkmqivVKdp8FpXHdYyI1chOUT35fEPRtnGzdueb1nLzoYbX5zp/R/3A529NO9fOo3WKt4l9/T2ao3395d68blfdNBj1M6bF+HqljeuiNlDR8djHocj+UXsBzjc+FilSpEiRIkXuHHnwgQexmC/Q6/eebVU+JqXRaOCVn/AK/Mk//+X4J9/2/8JmvXm2VSpSpEiRIkUuRO54QpiEhgLCfpdsVVU7AHEEwDgoqMC4Hg8NnAM8Dt74eyAmJZkm4zgAGYHY7qGo5Sf4SUJG4zvIRv1U5whsjQBeEkgKbjkolgNSqbcCWm5rB/gcOKzrOuXltvE8csCsx3EvjRy4S9vwOd+1Wq0b7kJVHRzUzIHc3ITggHZuI4O2QQfUvdwR8Ol23QdGe5okPtwb1/uQ2lTz02PIPd2cxyzfKZns/VfrPSKHVQe1g5aTdncbqk0oDno7WO7imwc0fW9rHo/eQSQQdSxTfdlWTk9P03HJp6enyRuU5C49gHknL8cNkrL0Iq6qKnn7Mlyr1cJqtcLBwUE6VlnvvSWh6t6d1O3w8BAA0r2IvV4vkbdVVSWPYRKvrVYL8/kc0+kUnU4Hw+Fw55jr+XyOxWKRvKbX6zV6vd4O+N7pdBKBymOg6eVLD+bZbJbuWW61WhgOh+k4ZnpDkyBvt9vo9/s74dmH6V1MG+gd35yLaCvgzGN4NpvtkMh8R8/ww8NDnJ6eot/v4+rVq+ke5Ha7jeFwmMhi1sN8Pt+pa7YN/pHs9/lET8fQ/vxU7w/OESjRmOPi/TI3DmnYaOx3wk/D+3vXy+fvqOw+p/vYF8XxOSFHyjnx5fbQcrvXpK55VI9oQ0805/nc5POP6u721O++sUvH2H1tQ+dZnRd83IzamBPgbnu1g9tdddO0o6snIlvye7QZLJpTIjt4XUZ25We0LvDwmp+3q4i0jdKJ1g83m8Nyc6zXp8b3dZP3TdfZ+xLbfG6c8rWY66XlA7Azf0Tjzb5Nfzn759Y9mi43YwG4YQ7VNY/nGXkZe70UKVKkSJEiRe4s+b3334/5rBDCtyNVVeGtf+It+JHv/zG87zff/2yrU6RIkSJFilyIPCcIYQdmlZwBbvSccBBZAZPo+OnomDoFgP3uYBIrBPUJ6pB0IdCkXsPUK7orOCKuHCx1QJflI0me85bVMGqHCLij7g6Kuj0dUHcA0cFmvfNYQWwFU/14XqatALAeP60Ap4PoDgyy/BEwHIm2BfWWdq8QTV/tpekoqerxVdg2IjDT4zhQG5EiWkcOwEftyUHNCKyNbKQAu9tU78COCB3XIUeyO4is4LWCpE5ic/MI33u/0D7gdaLhcuOL14/a5qlIXdfpPliCxSyPbsbQvlTXdSJq5/N5Ihnr+oxEJHnKo5dJIFdVtUMs8rhl3XhQ1zUWi0XyaKUtqctyuUzEMr1Vq+rsbl8edcz7g3nygXonMw7v8+WxySTFF4sFptMpFotF8rLlWMqyeVtar9eJyO31ekm3w8NDbLdbdLvddBTz4eEh1us1JpPJzrUAVVWlo7OvXbuG2WyG2WyWPJBZnna7jc1mg8VikbyKG41GqkP2Hx6FvVqtUFVnx1QD53cokwjnqRNMs9vt4vnPfz6uXr0KAInY/shHPoLr16+ntGgDrUvWAXB+tLj2JT8VgW3Kx9BbabO30u6jeVXf+VikJJjqTS93jmW+sUT7oo5JXi4dFxlWy6PpRHNSRL5FRJS2z2gc3UcwAdiZJ/WeZM3LNzD5xhGvT50zVaINR5GnopNqPg/pO/0ekeLRxhxPx9PWucAlGq+1fPrO7aJrCl/bRGvKaA5TG/k8xXDRJiZvx5q2zp858l3jOZGo12/4xqrIW5frM21nURhveyp+Wo/a2Dddanlz/dPz1TK6Lbx9enwPpxvyGM7XSqpr1H9y/cD/b9Dy6oYF7y8+Xvn6yudp1aNIkSJFihQpUqRILM1mE3/kzZ9TCOEiRYoUKXLHyB1PCDtorGQPgRIeraoerVVVJRKCIJcCOg4K+2/G1TjqXQvkj7pTPRWEJ/hETzPmwfAKBkXAmAOIHlZJN7//WEHjCLhm2g4q89NB433gvANmSmipHiSYSAQ5SBsBnKq3ej+pLu4VtY+M1TpyjxzPg98VRGR9Ajfesey68rsDq1E9E5ylrZWYJkmgYTUuiVAnKnIEJu3mZdejiLVcaruI5NHv3j/UjpFODj67HTW8nwqg5YyO7vQ24e10H/Cr4mSOp+PfbwWsXa/XyeNU9dN+xjpdLpcYDofYbDYpHmUwGKDb7e4QygoqMz09FYEEJwnJ4XCYvIWpG488pgcz49JLmTryft/pdJruRlaycrvdJoKUaenxxySUSfpSB9513Gg0MBqNdo7nJ7lLYflYl/QE5jPeuUz7nZycpHt6SdA+8sgjydabzQaHh4c7xCltzn46n89TPeu9wZvNJh1fzXpYLBbpHuDJZJIIcnr2Mj49scfjcfJy1rlJNwO5btSLda5zD/szP1m/FyXa5/g7R/I4UeN9S597+lH/ynl2RmNENH7p2OzpRCSrh8+RUj5Havzo977TBjx91y83XkfjUJSOlzGnczQ+RmsSzwc4J9ujvF23fWOqk6T6Ga2lPL9oXo7WCjk9vW6ieYTPdV7XOUrF11naVnN9KNrAp+0mN8/m6jny4o36S0Qq87eXwe2t5dU0dGOjx43yyNWPf6realPVI9oE4RKt1Ziejq3sh96Hc/WS22TAcLo29bZzs/5apEiRIkWKFClSBGg273jovEiRIkWKPIfkjp/VSNTRi03JjQhkYxzgHDBXAIakWgQcu7er50HCQgEy/a5AkHv1OCipnrgOnrqozpqWH7OoJLCTvASdFEBULwZNV8EpJVMjck6/O3itOgLYITJ4xK2DnaqD5qsbALzOmI+nwd96D7WDovxUHbz8rFONA2DH44X1qUCjg8EOECrBqxKByCy/6ukkZwTIOjjuZXC7RCC2l13rxr11Hfikvkw32jwQkQEOcuaAWOoQ5R1917Qd/I8ICtUx8s7J9dunCtLSQ1bHMAfh2Vb4jgA0+3Fd14kMpnS73USqkmhtt9tYLpfJm5TpknTsdrsAkLxh2V87nU46ylnvHW42m+h0OmkjgvZJprVarZIHLQlWErLz+XxHD5ZNPZAbjbO7dweDwY5tdGMN29rp6Sk2m026q5fjB4+Spl4kV1erVTp2++DgIJG7Gq6qzryHASSv4Xa7nY6YXiwWidDVumdZov7YbDbR6/V2+gptOplMsFwukzc370pmObvdbjrmWtsh46tHtj7n5in3qKfdnopExIW/176fG++j8dLnI7Vdbp504VztY0w0JkR92sc24Mx+evJAbvxl2/J613HSxx9dR0Rz6r653/V3kjBns4iojja8eRlcx8gT1evc0/K5hp86nqltNK6X2Ylvn4ejtpMbwxnWSTjXg98jT1DqpM+iOteyeJ3u003j7itL1L6j+JSIDNdxwd/fij7eryPRNQ3D6XpK10C6EczXFrny62/1DPZ2yfJqGhpOy6P28P7q6x7N34nnaG2j6fu6yeNHaRQpUqRIkSJFihQ5l7oGfubHfvbZVqNIkSJFihS5MLnjCWECHfR64rMcwOeAKcEUJ2wJ2qzX6x3yVvMgQaOkqd5frISM66yenAoUaf5avggEdpBMnylYTnBfPeMcNFKywYE296rV8rgnAj+dnCZIzuNuc543WkYldjSPCEDWstGukceWA4SqJ22g3nq0h9eH16eT4Wr/CHx3gFztG6XDMjsoHBHR3gZcd283rpPb2uvJ33vbdD1Ylznb8VPtFAHPaiMnG1zPiCjRcvpmC227mofaPkcOqS1z9RARKw4G75PtdvfYdM3HvToBJFJW+9ZqtUKz2cRoNEKz2UxHEVdVteMpTMKFadHbttPpJNtuNhvMZrOd45e32y06nU4icRmHXsFKNPK45Ha7vXM/L71VqTc9kTnezmYzdDqdRKyyrPSc1dMWACRP3YODA9R1vePBrHbtdrtJR24u4lHUDNdqtdDtdtFut9NdwY1GI9mAJCvHS9qNxC7tzbGQ8abTaQrDI7o3mw36/T4Gg0HKm/XPY8D1zuS6PvekHgwGiYQmkU3dSIID5wQ55wjdWMP3tCHLczvifcv7pc8f+tx10vFb01eJ+qJv2Mjp5u9y44uPeX5KhZPZ0VzhunoZog03ag8dh13fqOw+ht9sbPPnkZ29Ln2OVxu7vVXnm+Wj6xEl1TS8j/++dovmz1y78HUW68/noGjs97WTvvO1SbS2874RtWcts25G1LaybzOU9rV9bTJnHw8XtR21h/cbrydNJxobvL17/4hsxHiRRH2G7dfXiL5G041V0TpfN7YwD207urZg3Git5P1C7RDprmthba8XecpDkSJFihQpUqTInSSb9RrL5eqZy6DTBl7wPOBNbwS6bWAyB37yl4HVGnj0yTNGukiRIkWKFLlAueMJYQIhCuA4IOkAooYFbgSi1PNDP9X7hyQI4ytg5YAXdWBYvUs4B/IRMFJyWXVTAEqBPU2DtlAgaB9I6oSTpqHAIsllfbav3EzT76LUvGgX96Jx++biK7CpdanArOblXji+QSACzvU7SeMcean14kCjkysO0npcBz61fin7vEqUaFVwOwKl1Q6qTwS887m2gwhUjurMCQAHWx0Ap/4ODGt70U8lzzUf7yNRm/PvWrYIuNfw0UYHFbc3n+XAdorevUu96UWv5SS5t91uMZ/PkwcvSUMfN0j28Z5b9W5kP6eN+J0ev4zPTRTqwXzp0iVUVZXCzefzVBYePc30eOwyj22mVy7bI49UVkJUvX9JZlZVle7YHQwGOx6zTHs8Hu8Q2Nr+6GnLo6tpX5K9POKa3s+dTieRwhQS08yX9URSezQapfuMSQKvViscHBykcmr7Xa/X6PV66Pf7yS7eXulZzTZFD2HWp5L+3W4Xw+Ew3YXMNkwi2o/q1T7wVMXnz2g8jeYBT8P7l445SgpHZAg/aVP33PWxxjedRORM1Pd1LNX4GsfHdo/v+fv6xG0TzYv6zushmquiuVBtrW1b11C5OdJtoHFVT28XrB9fL0VzelR2zT/67naj+Djgc1y0PvP0XQf+1vVbNI8y/L66icoRldtFbetl1DS1Pt1GXr5obo/yVNtGcyDDRmtHJzo9L4aJ8vdnkZ2jNqL5e1qRXr6hzNtCVNaof0d6+7HSOg6pzrqW9vR8XaH2LlKkSJEiRYoUKXKj/P7vPYD7P/DBi020UQGXD4Ev/aPAH3kd8GkfD/S7QFUB2y3wjV8FLFfAO38L+O3fB37xN4D3PQCcTIDTsm4rUqRIkSK3J3c8IUzwncAScE5uRgCskl7624EsB3qURHGQyEFhep2pqG7Ml8SwAk8Ozumxlg7yMT3gHEjSsikgpOCcgkMRIE571vU58an2Uc+ICPzWcmo49VRQvVwPJbkUVFWJgGEFPp0kU2DZbaJgnddzVL6IhFASx9uC6ql6+bHhDu45eKlHyzIO9XCQkmGcAFUPdsZzAiVn68jri3lEpLDa0esrB6Y7AEz76hHqUV+iHb1d5wBpJZQikN49xxSodaBfy+abRCKiQcuWIy1c6FVLD1oSt0xDj8tcLBaJ4OX3TqeT6on92tsZN7pQ9Fjhdrud7MTjmkkOk3CldzAA9Pv9dKzxdrvFbDZLnrX0lGXavOd4Op2m46G73e7OEc4kQpk/7VHXdSobdaGHr/aZTqezcyQ29WTb5zHQ3PTDdPUe5Uajgfl8juPjY4zH40RSA8BisUBVVem4aPZNEuEkY3Ucpj3YzhaLBbbbbbIZCWKSx7x3mZuD2B6qqkp5VlWF8XiMbrebjun2cUXvqNe5TI/11r6g/fGpSkQqRWOChvH5WcP4HOhpRP1L51XPNxprVfccwZQrUy7NiHDSNCNSVnX2cdzTiGwWhWNekT2j8Swak71OdcyNbOd2i55rfeoc4x6umn7OlipO8Ef6+/HTPi5Hc4zbT/u1zx3RZi1dR+TaSKSH66On00Ti7cr7i6+fojzdDp6ez2G5vq06al6+Yc3nU0/f9fL1Ya4Ne7/08riO3m48jG8k0Dag9e7jTWQfLRPbvHsORzppG9J27Gv0m60vihQpUqRIkSJFnssyny0ubvPcqA+84oXAn/si4A2fCNx39xkJrNJoAIPe2d8f+0zgTZ8B/J/+JPDhx4CPXAN+6B3Af/sV4NoJcDy5GL2KFClSpMhzSu54QljJGgpBIvc42W63iYRVUM/BUJIjDjoB557Ini6BQObr4ZkPPen0iNaIHFPiztNnOAWMFWhy0I7PWSYnLR2cUtuoJ4ICXO7R4sSDk7O0g4JeTgy4DdSWSoA5oOykpKfrnk4al+9VJ5bRbahp8ZmSqawzxs95RdF+Wg4HBpXcjN5HQKLrrXXloCXLEoHbWm73EIvyY724jXP6KwCt7yOy2QFj/s6RSa5DBHKr/b38Wj4nkNwLkHEc0NbNKKobsDseOAFzM1FSXNsH3zF9epnqvbskdLXv0l7NZjN5CvPe4Kqqkvdvo9FAv99Pd+n2er0byAjeIdxoNDCbzbBer5MdmDZ1mkwmqKoK/X4/kbgkOpkex2nmeXp6ik6nAwDJc5f60X70CGZ+i8UCdV2j1+sl7156ItN+TIvjXL/fx3K5TG2DZCznGL2rl2XU8Wo2m91w0gLHe3oZTyaTRHo3Go10jzPvG95utzue4CSWF4tF8jbebs88wDmnkcwl+b5YLHB0dJS8gE9PT3f0JtnPNqD9T4UbEFgvFyHRGKL9ycP6RhTv8/zUvu392PutihM0Gs/fR+WICLFovFN9nbCK5uFcXk5o6Rzv5fRx1csa2RvY9VjO1U9ke8b1MdTH+GjtE9lAy63tVOf0iEzn94gsjAhmt4eXN1c30XrkZvF8E1Iu36h9RXr7vOltw4lLjeN9ft+c5JugOHZH6wLf6JfT39cjvr7xud7zyNW9lsfr29PRNYy+j/qV6hetEW+l3nJpeHitT910qHF1Q6CuHfett4oUKVKkSJEiRYrsyn/70Z+5/f91R33gzZ8JfPUfB17+AmDYv/W4XCu+6J6zv9d+PPANfwp48hj4mm8GHnjk9nQrUqRIkSLPObnjCWGduOnx5EQTwykwrPEdeFEhgUOyj95pwDmYRq86BwGZJ8EaAvZKfDiAo6Rio9HYAe5JXkTEaASSMw8Fyh08ZBkjwNc9HBzs0vz9vl8SRgpG6jsH/yLSV0l9X6Cp3dS++t7BxghkdrDOAVSP6+WKPI9Z77ShgpKse7WBp8tn7v3j4R1AJFDO+nRQPrKTpq/ErrYZL1PU1hwczYGlal8nEiKw3cFTftcNCFpGPmNbj2zoeUTtxO2rnvI5gkTrgvbUNuCSIx8iIcHJe2FJvtJTVj2CgHMv0Lqud8YnHb8Yh0cFdzqddJQwj0Mm+Tufz9O9wJ4nPXzpzcoxq9VqodfrATg71pgkrx/T3e12MZmc7XwdjUaJkG2328l+9NAFzr1xqfdsNktxt9tz72nqy/RmsxmqqkrHTGsabCtsHzwWm7/pWbxYLLBcLhPZPBgM0p29q9UqlZv2J0nM+4E3mw0Gg0EihOu6xnK5xGq1SsdJ0+OantRMY7lcJq/idruN+Xye2paGbTQaiUimZ/Rqtdq5P1jHIbYN34TSarXS0d3uRflUxMkVJTVUnMgCzjc+5MY9to/c3K75R+RXNMb42KWfrqcLx1cly6INSRqe73Rd4d6GTlo54aa/XVd+atvWd+qNmCtXNKbz0+cFja8btSKCPRrzVTfq52WL6svnrdw6T9NXW2g8L6/GyXn1+jrS5/jIppq3z70+N3p5fP7PtX1dh/p8F4V3e/n6z/tfzsa5uty3Gc43dmo6Pi5E/Tb67ZuwonbgbVfrQefxqI37d6bpd677xkWVfWufyE766WNBRAhz7i1SpEiRIkWKFCmyK8vFEg8+8ODTi9yogJfeB/yZLwA+69XAK1905v17u1JVwOEQOBgAf+otwLd91+2nWaRIkSJFnlNyxxPCSm5FBGZEEgG7HnsOkDnxowCfP3PQWb0DnRhSYNpBYiW01JPXPQAUvFVdNA8F7ZS81LKROFEAy715+Ew/I8BNwdQIfI9IXdU/AiiZv95LSrLcvR01P6/7CERzb2YSZVrOCPR34JXAP/Onrd2bw0lG92ZWG7sdnKxknSrYHAF9DiZG6UfAqObpbdlt6+Vj+rSlg9sKSHudUNQD3+uO/Ut11/y9zvxecbWh1ofaQzch5GwakQYRUeGnCTANt3XOFi70MHVPYZKPJCTpDdrv93fGJbbN9Xqd+hDj845blo1HHJOUXS6XyYvV2w09Z+ndSi9W6kKCkqQ6PXT7/bNds4eHh+kIZyWyN5sNut1uak+LxSLd2TscDlM+8/l8h3DmmNFsNtPR2QCSPWi3wWCQPKKn0+kOOaR38rbb7USMK0G6XC4xGAxSfZMk5xhFUpZHWLNtReM7ywEg6aRkMNs971/WExe0vbOcJO71LmGOG91uN51Uwbr3I9nprcwNBJHX+1MRJ2z4LAqnfcjHHY/n86P2L++fTrow/YhAicbGiKSN5kFNx8cHzTfnXenjktshskU0rrrtonw0Pfes1u+Rnhw7Ii9PL4uvu3Ikec6e++on0ld19LE+GvtvVpc+l7ouHkfrIdItsrOuY3K/PV0+jwjwyO5Rv4rsH9kp2sgV2SbX/6L0tZ5ya5ObCePq+j4aazhua7xcfr5uUHtoGfWd2iRay0XtRMeWXLm0Hfj/HFo2Tc9tv29jQpEiRYoUKVKkyHNZppMp3v+bH3jqERsV8Ke/APjrfwq4cnTxigFnxPBL7gWajXKvcJEiRYoUeUpyxxPCFPU+5d2S+sy9atUjhoAKCQUlndSz0+9XBHZB5SgP4EailcCMe2QqaaNxFdhz7+cI5Mm9c9BJPR4cCM0BxwouKQAdeSw5CBUBpp4n7eEgY2QXSuRt4aCZ1mGkk96pqs8VYIz0Z3vIAfNa716nLhE54Z7ITpaouPdxZGdtb+75rGS2EwTarvnp91trOjcDwF2cUHAQWvOlbg6CO4AbgfNaFgePc+C+tkemofZzGzixEIHhbpNcX1bh8b3aLtUjXG3EsOv1GovFAp1OZ6feSBDSQ1Y9WkkUdjqdRC6SCGV8HSvpgcv0WDYe3UyClnnRQxjAztHSvDPX60vJI+pFj+Fms5m8acfjcSoDyWySuSRSdTPJer1OZKjWIb2a2c7oZcyNPOxn/KSXsh4v3el0Uj25jZmWHukNIOVLIpl22W7PjoUm6c67kBl2s9mke5G73W6qf9q61Wql47nrut4ZB/0KBe37LDu9vp8OoZAjhXw80uf87oSNzqtOSGmfjvp99EznQ8/bxwDvn74Bycc2HYsi72qWLxpD/JP16Pry0+3gYaK5XMvrRLCG9XHuVuzq+fr87DaPyhJtyonGdw/jY7G3LQ3PdWFuA5DH07rVDYI+jms8t6WH8byidqjvWSa3+z7PWs/TvWsju2ndRfNULnzUR1QH3zzgbSSyWdQePD+vCz/O2vPztZX3uWj9A+ye4ON14WuMXD1pGXUs83hROv4Z9c1c+k9n/C5SpEiRIkWKFLnT5d2/8h7MZvOnHvFlLwD+xp8GLh9evFIqn/mpwNUj4LFrz2w+RYoUKVLkjpI7nhB2YM6BVAVj+RvYJfxy4IuTZU5OObnmgJADXh5Xj0hmOZTcoZ6qSw7sy4GHNyPnnACLwEL18FNQ0gFBB18VkPNj+wDseGs4MJYD5Viv7pXKsjJPJUcd0GXeCqQ6qaCi5XH7RsC4psl2o3XhALy2uRzAqOXUvNTGEaivdnG7Mm0FUTUPbQM5nZws5TsPC+wSyBHZED2LNjFoG63r3SORvX60Ll3XCEzWMviGCW+fOdvkwFffNOH9xwkLFyWh1Ltf+y09W+lJu9lsMBwOU7tSz1LamaRut9tNRCaPhSahWNf1DiFN4lGPf6aXMcvKI5Lpcco09L5bEpOr1Qq9Xi951upYyCOiefxxVVXpOGiOSSQ8ldhuNBrpmOVGo5EIW75brVapL9CTtqqqlD+JcYbnM94jzHFxvV5jPp9juVyi2Wzu3AlMz+3pdIr1eo2Dg4PUXkna0tYkjklcqx3b7Xa6A5k6khTm0dbUifaqqiod/93v97FYLHbaqW+qqKrzY7rZ1tRz+OlIbu7RMYiSe67vmYbPCT6O+KYlzV/TiMY133yj4XWe0vBqU4bXeYjPojkkIo+0bDqnRfpGuvq8F5UlIsGisdw9j1X/iIj0/Lz+fez0MTCygabNdutrG09LP339pnroZjv9Hemv4TS+ryOiunQ76Xv99PeR5zaf+4Y1HX/5XI/Cj8R19n4UtbFIzyg+kD9dJtIxN99qHppuTie2zZzHNZ95Hjqv6jigcXTtqfXjYbV+NLz2D+alV65wfvD8dZxjG9Q1CjcReV2o7kWKFClSpEiRIkXOpa5rPPjAQzjdnN48sMvnfNozTwYDQK8DfNyLCyFcpEiRIkWektzxhLCCctF3BS0VMIx25gPYAXtIiAC4AWgBdj1o9nnBaPjo/lkFelRPhldyy0klLyfBUr2PkEATyRnqQlHPUAc7XRygdX38HlwnOFlu95RQcE/TjwhqB7Eje+wjBPjeNwc4oKk2ZbjIg9b1iTYZeDn1t5bdQUaChU5EOLEQebNoeSNw24/JdoIgl462aW/f/t1BTG/L+wgIB6ldcno4mBuB5A6wa/93wFZJsRzg723R9dU25m3W9c8JCVRgdzMFPUTZ90gOkuDt9Xrp1AQdp1gHJCXpicgjhRuNRiIdq6pKxCO9jenNOxgMdtoniVwlmqkbj0/2e3CVPOYdu3oXNn+zLdEzeDabYb1eYzAYJG9fkrMkQxlfj2rWY7PdO5oEsZ4KQZKX8wHT0eOgvY75nETvarVKx1vTi5htkvFJeK/X65CkAM7vM6bt+v0+2u02Dg4OUl2TzKad9Q5s1r0ei+2kGPsh27573j4Vudlc4nnre/2M0osInmgeYdp+97jaPhpPcnNEtFHJv+c28bgNIl2jeU/LqGWI5lgfn25GnuV0yImPnW6DfeOkzgX6nn3B50iPr/Xh+eTmfNWZ310Ht52WwyVa/3gZPV9fm+qVAt4m3XaRfhFxfSvxGN43xVGi9c7N2qnPp/rbP10P/e3XLPgYkasH3egU9QHVi+XSNh6RtdG45XUUEea5cUfbkuumpH1unReV2+2k730MyqVVpEiRIkWKFCnyXJWT4zF+7Ad/4qlHPBgAX/Gmi1cokm4H+KSXA+9410cnvyJFihQpckfIU0YAfuZnfgZf/MVfjPvuuw9VVeH7v//7d9474Me/b//2b09hXvrSl97w/lu/9Vt30nn3u9+NP/yH/zB6vR5e9KIX4du+7dueXglxDtIQ5AHOj91UECYCmAkM+jN9rgC/e6Q64Kn5KSnlXgR8pn91Xe+QMzxOVYFs/mb+roMeO+2gk8aLQFJgF2xXcNU9LWkPB6b9SGYHwBjHSXS1Q65uoroimQSc3wfNZzlA2vXScvp7J+21/lh2kkTUQW2j4VWHiJSI9MyJArGqN79retoPFBSNvKYifZ1I1bJqnqq/5qvCOgJ279b29KmfxndQWEFPB1MdkHXgXfuCHs0b2XcfCRGRB5FHXQTORnaNyAfViWQf2x29WWlLtn32xV6vl0hJetHSrq1WK3m09vt91HWd7gHm86qqsFwuEylKD161zWazSR6x8/kc0+kUi8UijUOMx/KT9GQ5hsMhRqNRIq3b7XbyVF4sFlgul5hMJgCA0WiEXq+H0WgE4OzIaY6Ti8UCi8UC0+kU8/k8veMz3SzT7XaTbVj3JFC1Dl04BrPdbLdbzGazZE+2Nx7tzDD9fh+j0SjZiV7GepS037e82WywXC6TJ/FwOES/30e/309ps35YF/SI7na7O/MJxyWmv91uMZ/PUxrUQcdntkV6Rd9sTMrJPk87fa9zRI5M9TmCafk44XMF0/M7b6Ox1uPp0d5OQAM3jmOus471EbEVjSM5clzDRGOTj9G+JvHNcrk8aEMfNzWsj2GqV5S/1xPfa5243TSvfes2tVtkF+C87fgazef43Lopqi997/N5br3FP38ehXE7+mbCnF4+x0d1EZUjmrs8Dy+rz6kU30ziukT5RBuyfL2sefI753Atv7aRyAa6dtR1YLR+9P7raWv5onVDtIbN9V+exMEwTrrrVQW+7lE7qW63sqYscufKx+L/9UWKFClSpMhHQ9777t/Gh3//wace8ZUvAl714otXKCdveiPQat48XJEiRYoUKfJ/yFP2EJ5Op3jNa16Dr/mar8GXfdmX3fD+4Ycf3vn9wz/8w/jar/1afPmXf/nO82/+5m/GX/pLfyn9Pjg4SN9PTk7w5je/GW9605vwz/7ZP8Nv/MZv4Gu+5mtw6dIlfN3Xfd1TVXnH25CgjoOeulNfgWgHniNSx8HOyINRASQn2fS7Aj0KMilACdx4P6vqqoSOgtR+7J6DUMxL01e7KaCq5VMgz23NtNSTNgKf1MZ6D5vmEZHm+t0JQs2HpCxtpCS7A9tKPERAn5InDpg6YK158Fl0XHUEtnsdOIjs9e+AtdrHgWIPEwG5/t6BWJVoEwCB0xxpoOE8D90AoTZ3vbwfeR5afi+fg7eql8ZVfdy+aldttzmSxO3pBJDb18uyT0hO8U/7po4H/COZSH1OT0/R7/dTOehFSg9SeszqscGTyQR1XWM0GqVNKupRS5Jajzyu6zqRo7zDl2VeLpeJEG42m4nQZr/ZbDYYj8eoqirlxTKQOKYHML2A6YXMu3nVi5dHVW+3W/R6veT9TDKd4Xm3L4nr6XSa4pOc1TGaJCCPi2Y6nU4neVI3GmdHVtNzmXYlEQ0geQvz+2q1St7IrCvqwrgkDEgMr9fr9L3RaKS7mKkz5wVuJuCdyCyLj1/63AmVpyrat6Kx08PuG6+coNG+qYSOiufp8/u+/qd9NFoHePqah+efG3c9DvspsDsH5LxB+T2ygdtcy6LjUDTuUrzuorKpDr5GcVv5+BiNofqdZXfbR898PnT7anh/53ZVPbUsnLc1fmRzJ+Hchj7P59qNhve1TCS597l2ENkduPE0DS1jtGbSeDqGuE1zeWo8DZOr51x/clt6W/dwzNvbi9dhFM/XNh4/ZyMvQzS2aNvXcLpO8jbkaxnOw7kNokWeO/Kx+H99kSJFihQp8kxKXZ8dFf3//Sf/6uklcOkAwK3jOLctlw6Ap4AbFSlSpEiRIk+ZEH7rW9+Kt771rdn39957787vH/iBH8Dnfd7n4eUvf/nO84ODgxvCUv7Nv/k3WK1W+M7v/E50Oh188id/Mn79138d3/Ed3/GU/3EkgErgX5/rMZkOFBNYITkSAYXAjQCbg5L8i+7+VfJ0vV4nktJJS82PogSug1margKxkbdABGpTHECll5q+YzosnxNm6pnhQKADUdTTic+cKGHq5XYyQG1FvbXOmXdEADgQlyP0o/bhaXpbUEBZSRYV2t0JzByh6BsZFKT0thEB2jmyhfXsIHauHam9tF50w4W3NwXzPT0H0L2/eDqRfSMPPtrXxwevByfHdBNEpKvGdxJiHzAd2VXzycl2u8ViscB6vU537upRyJomScvJZILhcJjusiXxCyClQaKZRxhrW+h0OomcrOs6kZYkPgHsEMUEoJ2InUwmWCwWSUemUVVVet7v93FycoKqqjAajRJRqnptt2eerbPZLJHSJG1JiPd6vUSO0lOW74AzYrmqzo+8pg1IVm+323TXsR6ZTfJVrw/g3cDMl/cVaztXLzTWoxLmJKNZVt0w0mw2k+1pS9qL+vJ4abb/6B5JjknMV8dghiPRr6S/9qNbFSd+vO86+ePESkSGRPPwzbwkXRfPIyLOcvNDpIM+87E00ieKr2OWh/U0fCOW20vL6POdEo9ur6i8Ps57ef1ZblxzW2vdanoM62Oq1x3LovZQ0lDtGo2xak/XJSK/VXddS/q6wO2oc66n7W04KrfOBRGhl2tzN2u/Gt+fqY65ednXEBxL9Ch27ROuc5S2biqL5suoXFHa3r+jdhGNI1F6LlG71ufM3zfMeRjfuOfvVSdt54yn6fsmOgrDqE2e7oaeIneGfKz9X1+kSJEiRW5damBns2KRm0tdn5HB3/y3/j5+7wP3P71E3vQZH1U+uEiRIkWKFHmq8oxeGvXoo4/i7W9/O772a7/2hnff+q3fiqtXr+K1r30tvv3bvz2B7wDwC7/wC/jcz/3cBLYDwFve8ha8733vw7Vr18K8lsslTk5Odv5UCIRvNpsEwtPbi0AOdVBQSI/49T8FgQjiKCDkgJMTXgr80JtSAUIFIpX0YhkcDNP0CA7lgFWKgkuan5JkESDrRFUEoikRGBEMFE1TQW0n0PS9ph0B4g5Ye10Bu0d55kgNLZd6X/IvsrunqXWtR87mgHwvK8NFbY6i+jjwyjy0DhguAkVZJ1F7res6JJScxFCg0QleFW/DERCb2xTB9NVjTvPX8jrQq+8jwDUiHhzA1++uu9c9n/v44X3L643v9oHRKvSK5RhBb1i2Pded5Kke9czyqBdpXZ+RvdSDRz7rcca8Y7jX66V23ul0MBgM0jPeJ0ziUY9yns/nKT+Wg0IymUc5DwaDdDcu6342m+H69eu4fv06Tk5OsFwu0e/3cXBwsFPf1JlHHZPQ1ruRedcw7/Rl2dTL1++zBIDZbJaOWh6Px8mDmsL+QxuQ9OZcxHuVSeby92w22/Hm3m636T3bP8vDegOQCGUlCOixXFVnpPJsNktzHedBvmc7UlKS7ylPlUyI5gntD070+linNtd4OUImNw/zu29WcYJI8/QxWN95/3fd+V3nZH9/MzIqt97QccPLm5ub1X4R4ZSrO7ZTJ/n43u0Xzef6TusrsoGP1bmxMSLadO6JyqdzsYfxcd3na5+7aJecbjo/RTbSNZjH19/efjimRPOEhqGO+lzfRe2Y+vo6al8eWqe0ifbTqEwq2h59bIjal56+s2+e1LaqG/N8PLnZWt/LHJVf246v2bxN69pR25K236hcbIvRZhmta7VdZE9KIYWL3Ir8Qfq/vkiRIkWK3FwmJxP88jve+Wyr8TElm/UG/+hb/+nTJ4MB4IffccbGFylSpEiRIn9A5Sl7CD8V+a7v+i4cHBzccATVN3zDN+B1r3sdrly5gp//+Z/HN33TN+Hhhx/Gd3zHdwAAHnnkEbzsZS/biXPPPfekd5cvX74hr2/5lm/B3/27fzfUQ0EZAvsUvW+L4AxBrIiscmCHYJeTQ5q3gvH8TU85TV/BSQVs3evVwSjm6wCPg1Q8GlR1U9CIedEG6rnmoGnklRKVWXVjebSsGt4BKfe0cUDUQX7VzQmECPxUe0Z1EYHEno6G1fbjoKcCkNp2FPzUuE6ga72oHVUvvQ808jBRLxJvG9o/tMxuz4j8dHDRvYJ0U0W0McDtyrIxnte/ks0KgFLUht4+3S7a79W+JEe1f5PEVLBWy5Hz8vL8faOGSkR2eHu7mTBtP1Ze9eR7EpeXL19Gt9tNurVaLQwGg1ROJSzpMVvX9c495nVdJ0KYaTMcPXTp4VrXdfJmPjk5SUdK6xGWSrzyOeuK9dFutzGbzbBYLLDZbJIXLnDmTdvv91FVZ967rFP1gmV7Hw6HWK1WiYilffQ4Zyckms0mFovFTjgSytvtFteuXUNVVbjrrrtSGjwiutPp7BylX1VVshH1ZR6r1Wrn3mT2C+ZJ+/Oo5/l8vhPONweQMOYR4EpG0duax0pH7db7r493tyJRm1ZiRPsPbcQ8tc/7OOzpR/OUz+FaDid9tOzaL/eRZPvGV48TjRmqo9rX56bIyzU317l3p9pW8/Oy+Pi7z+7RnBjNDa6jj3M+/ikBG5G3tJF+Rusw1zXSy8vpZXFb+7NobRB913w4z3g9+G/vL56nj++uvxPSkW7RvB5tyLpZXrn27um4vaL2GfV/t2P0CSBc86reOp/wfTSf67op0tnF7RvVsYf3tPT7PjvrGkbHMsaLxgO1Kcv2VMfwIs9N+YPyf32RIkWKFLk1Ofufe/lsq/ExI6vVGt/1v/9r/Nov/frtJTSdX4g+RYoUKVKkyDMlzygh/J3f+Z34qq/6KvR6vZ3n3/iN35i+v/rVr0an08HXf/3X41u+5VvQ7XafVl7f9E3ftJPuyckJXvSiF+2Aqu4RyHd6LLQDtRQHzxSgioAVBY9I0NHjTY/azIFnDlwpKax6+J1hSmSrRORYBI6SQMjZy8kw1U3ziUAqfa9gW0R0M2xEjGs6Dr675ICunNeRthevHwUXI+Ig8iiJ6tQ3H/C7EkQsm9atEnnuVZJrM3rUNMN7m1NbUdS2WkZtc05U6Hu1Uw6wdS9ct6sD9E70exj3lvHyqC60oR6DrqSXtxv1/tK0ve2qHSPiQG3idovKTdG+sA+4je6v1DKrrfhsMplgNpvh6tWrqKoqjcEkEtfrdSKH9X5gEozNZhPdbjd5rE6n0xS20+lgPp9jsVgkUpmerABweHiIzWaTiOZLly5hOp1isVgkQpf2GY/HmM/n6Xe320Wn08FoNEJd18kLmc9pZz7TDSoA0t3AjUbj/8/e38VKuqX3fdiqvXdV7d3dh0MOZ4aUBOvDUUI4CGyYtKw4AQTRBgQEBAJBzkVsCNCFBd3wxrwwfBGEsK8EOFAE3xhIEMGjGFAk0VFiUVZEURY/RuQMZX6MZJISOaRmxCFn5pw5p8/pr713Ve1dlYvG/+1f/fazqrvPzJme3r0eoLGr3nrftZ71rGc9a/X/v571Tkcrx85nZ2d75PXV1dX0buOUuds9PRL65ORk+j2x8/Hjx22z2bTz8/PWWpvI3BDTyVAO2c4jq3N/dAvJnb4gUZJr6au0j+2K3U9OTtrFxcXUTr7LOPNTyPxkgzMmMVZxnKT/Xkaq+BMxWVHFQhMnHB/0/dzv8nvEW6Wb7+H4r/R33PIcUM3PFaFYxZYqdlrHF7lWzR/PI6n4LNtVkUuVHV2Wn/Oc6ud6hCKFfkp9Kpt6nu6122JbsYyK7IudKnLOdvE6z/1Tbciwf3oeqjJQ3T7q502CXHtQF44x28LtrOxbtSP/uHnObfTak7bznGnbt9ZubOL02pL6ezOcN3BU83quef3ssec45HVaZVdudrN4XFIn25CbPVN2XgcwZMgh+Xb4f/2QIUOGDBnyUchut2v/8O/+VPux/+Zvte31ODllyJAhQ4bcbvnICOHPfOYz7Td+4zfa3/gbf+O59/7xP/7H29XVVfvSl77Uvu/7vq997/d+b3v77bf37sn33vuJlstl+Z/OCjwJ0B0AhQANQbscX1q9N5XAlbOHWtsnHAPKkKDrEWB832Pq4FGhfq4HJBlACwnpLKjolDoJFBnYM4GV501umAgjsGgdDR4T9OqRBjxa2/emfOtr0C99Rz0IpIVAmc2ekewG+nONvlS1kzZz3/pekpoGbw3yGWRNe6J/L6vNwDvrIKhoXyDZyvp7QCcz65xhyN9JgtPnDE631m4QZ7QjxxkJIhLYPZCZfeeMKN/P/gvx5uzJqvzW2h75zL5inKrGdm8sWDabTVutVtM7bqNrvieucVPKZrNpX//619vHP/7x6X200TWEOTeJhPzc7XZThu5qtdoj2XO0c2JD3kHMfp/P5+3evXt7RCqPO05sTdbtbrebSMyQl7H5nTt3pvfzetzzaOb4UIjZ5XLZjo6O2uPHj9tqtWpHR0fTUdQsJzbjBoInT5606+vrdufOnb0jri8vL6ejonMU9p07d/Z04qaOxBm2N9nO0SlxKOTxo0ePJnvcuXOnbbfbKTM45SdukYjfbrcTYR5d4iexcbKeU04kvztTnr7+stIjmEgWMq5wDFbEMeMcn63GpeccxnDPqSZ7GCusO8d9pbvby/hAH3Hd1T0mjQ/pEnvERxK7qrLdn+xvzzvsL883FSHFOq2rY6g/Wy+SWewznk7BOq2H+6Oqk3p63qZe9j/XV5XPsjzH+xm2j896Y5V1NAlebS6s9Peawj5Uzb22dc93q+v0l0PkaO6lfSpb8oQMrw/Y1tjIcwf9ymvTF+07+wE3YtE/eT/71L7EtlfjxP2Y+SrjnesJj/0PG8OHvDny7fL/+iFDhgwZMuSjkPMn5+1v/bX/bpDBQ4YMGTLkjZCP7B3Cf+Wv/JX2Az/wA+3f+Df+jefe+/nPf74dHR21T33qU6211v6df+ffaT/7sz+7t1v9J3/yJ9v3fd/3lcdKPU8qMIyEGN+Hx88k50igEBgNeJVrIQ0qgJUgmwGcKpOTwDOfIwnF5ypwOmXlb5VZQKAv9yT7jwQD378cHUi8mejsgZvWgcA6gXbqwzLcRvZp/jH7j31S9VtFABCoqwBQ+4ABULfNoK0/E1glkMt7KgKgApl5L+1o8NR19gjg/E5i0Fk6qbPyv3w3+Okjsytf4PUKGHbb3dYeueDsHdraMaK1Z6QywVYSdSRAqjHGstN+2zHX+ZdEndtQCWMR/SVEeshGHl/Z2lNy8/z8fI/4YXy5urqaSM/r6+vpb8jZ2GU+n7ezs7PpvcG73dPM3U9+8pPtE5/4RDs9PW2z2WzvfcR5drVatXfffbedn59P/pgs4xwPfXp62s7Ozqb2rNfr6T3IFxcX7ejoaO+Y6dSRzOXLy8tJz9PT08m2OZLZ44tZ4dk8c3R01JbLZZvP5+3u3bttu91OJGprrT1+/LjNZrPpCO7z8/O9dyonA/fy8rK19pRsfvLkyZSBTFI9x1+vVk+P+iLxnfEYQjnvQT49PZ2O2E7f5Hjr9DGP5o5t+X7kEOIcxyZB4zvxhZcVzweO4fRnzwN+Ln/5jnbOTyZlqvjkuEWdKuKr0rlqQ+8z54WKnKON+HxlF89RvfjRi4tV23l/Req5/Sa0/BvbzntdHutlnDVJXunvetL31MW6VZvBen1Q9W/0tO787rj/vH44ZOvKTm5LZWu2r1c3y6LtWQ7LsH6Vr1XrUc/3Hl/uf9ufYptSoqfn2uetK1ym250Y7bZ7LPI3b0zj5oyej1Vtq9YYXE9RfC1l+v8oXqMOGVLJt9P/64cMGTJkyJBvtnzmf/i59i9+84uvWo0hQ4YMGTLkWyIvnSH8+PHj9lu/9VvT9y9+8Yvt85//fPv4xz/e/uAf/IOttafHOv3Yj/1Y+0t/6S/deP6zn/1s+4Vf+IX2gz/4g+2tt95qn/3sZ9uP/MiPtD/7Z//s9J/C//A//A/bf/6f/+ftP/qP/qP2n/6n/2n71V/91fZf/pf/ZfvLf/kvv3QDA3pwR76JSwNjBH0I2hh4JIBi0K0CmZJxx3tIlhnsTf3Z2W8gj6AZ6zOIS/ApdVXgGZ+NEFCvAEn+xjorXWhfgnzUv8oeciYD7cOyq6ytQ3pQf4PZhwD06nt8JHrx3dQkE/m8gWvam5lS0akCBumv1INgJX/L8yR/+TflVt/pPz0bMCsn7XHf8p8zc5jBwr6vwHpnePmdqazT/tIDYLnBoqcD9bBtK3C7ktzjujyOngdcV+Xalwwwt9b23g+73W7ber1u7733XvvUpz41HYGc7N7d7impe+fOnYmgXSwW7e7du621Z8dvr9fribxNPTnOODqFCE5ma9p9enrazs/Pp6Ojcxwh7RoidD6f3zh2Pe/Ejd2iR46xZkYsx1LeG5xsZcbHEN8hmFkv36WcOlpr0/HY6bPtdtsePnzYPvGJT7Szs7PpXceJEfEXZnHNZk+zejebzXSMZ37L52T9Hh8ft4uLi7ZardpyuZxsxfcukxiOTZPlvVgs2unp6d4pFLHdbDabNg/Yl3N/FWs/jDjWuTwTUIz1FZl6iLxjrKjGMMXjMuK5J+VyvPXmkNznbNiKLMr1lGfCzDqwfv5W6VWtJypbUayHpbpe2YjxmzGzt8ax/RwrGSdYPkk11u+29eb5Ku5XNnKbqzm0F8+r+cL91esbllf1R+Wnlf/YNys/871uB/WonvdaxfOfN7z53sqO/q3SkX7BMqo1pv2Az7gPqr9e6/C6fcf+W5HJ1scbC3wt8xdjP+tnWz0Ov9EYPuT1ldft//VDhgwZMmTIN1uePHrS/r//rx9/1Wp8ePknv9nayGweMmTIkCEvIS9NCP/iL/5i+8Ef/MHpe97v8+f+3J9rn/70p1trrf31v/7X2263a//Bf/Af3Hh+uVy2v/7X/3r7z/6z/6ytVqv2R/7IH2k/8iM/sveeoI997GPt7//9v99++Id/uP3AD/xA+8QnPtF+9Ed/tP2Fv/AXXlbdCcgh0BIgvQKP81uIg9zDY4FbqwlGgj4RfzfQFSKBGaz5SyCeIBGz1kxCMWuR7e+BcRXgTfI5AFOVNWOy3GCWybFDmT4GNnm0bgB8ApV5hoAW25TvVR+ljc6eon1MVFYgXfqN+hpsdNZF/KjaTEDw2mD2IaC9B1pTxwqQzLPpG5OTEbeB9/qoTtq38vvKT9gWk/+0jcFQj9vK90wE9MiPyra9MU67sq0mvFmPy3LWk8FbA+ovAv5Hl81ms5e1yUxsZ32lHZvNpr333nvt8ePH7ROf+MR0VHGOc75z506bzWbt8vJyet9uiN/85SaI9Xq9t1kkGa55N/Bbb73VWmsTOZrs1JCgx8fH0/t5W2sT+bpardp2u52OgE6bQmymfclU3m630/HKIWCTJf3WW2+13W63R9CGAHe5IYRzNHZibAjl2P7hw4ft8vJyj/B98uRJu3//fvtDf+gPtbOzs+kdyzx6OfZMlvPZ2VmbzWbTEeA58eD8/Lw9fvx4ysA+OjqaSOL4V7K51+v1pENI8fl8vjdmuREpZXETS+LVdrvdi3EcX9yA8TLiDR0Uz0eOT44tEc9n/FzFFtfp+FHFKIvnG7bvefHb80BFHlWkUEVeue7n6dfazXmu0of3Om5SH9dXffZ3zy0kyxxLHRertY37L5/ZB71NV66DOlXkW2XTqu15vlpP9Ort+TTLcv8csjs3m1T2tr7VHFbp7nHmzRmsw+O30pHrykMb83pj3GuRav1WzdWH/OnQutXrH9ZlHelvLNNrI/pmLzZmPqtimP3aukcqHxryZsrr9v/6IUOGDBnycrIFFjDkpux2u/aP/uHPt3/xhdc4O/g3f6e17SCEhwwZMmTIi8tLE8J/8k/+yeeCv3/hL/yF7n/yvv/7v7997nOfe249//q//q+3z3zmMy+r3g0x4Jd39BqQMjhiQDI77kME+JkKgCHIFNLDR0N7t76BWf6W7wGOogvryWcCVQaJKKnn+vp6Inbyz0BxjtNmOw26kSTLNWYC5VkfwRv9DYaZ2KYNbHP+ZkDXv/kv+yKfKzDRZfI56mUyn8/RRwySmpTO92TsVQA7fYw62F6xeS9j2e2i3WMPg9YG66m7gVT7Q2V3A7fWkc+wba21yeYBvv2+7qoPWKbHoP27ylKkT8d/o58JeJJwtltF8phQqPrckjGz2+0mcpV2TxZtsohit+vr63ZxcdHef//99gf+wB9os9lTMvLs7GyKmTnmOPYN6ZvsXL53l0RvSMlcPz4+bqvVampLSMqzs7PWWpu+X1xcTMcZh+TOe92TDZv3AMeOq9VqIm0TA2Pv6Ex/SNnr9bqt1+uJjI3dQgTH3peXl9NRzjl+On3z8OHD9vDhwxu23mw27cGDB221WrV79+61q6urdnFxMZUfsv3o6GjvXcxpYzJ2c0R03l1MgoexJkcy8p3RJHZzPcR7/DQZ0NvtdsoSj/3iI3yvNInoDyMGJjxOuWmH9/A+j93EHGaKsi6PU5bJ3w/FIBJyvJb6bRMSXB7X0a0ibNhGx6Xq3p7+XC+wPPcD47VJJa9ZWGekIsaqOZDxr4phfqY3//AeEmkpo5dt6bhsW5j8ZVm0RdUPtCXXidGt2mjQI/j93fav5gfazv1kn67WTf6tWvdwDWGdehsR+d0bCKgHTx9xP1ft4rgwYVv1L++13aqx7jVwz6dZJqW39rOtKvtVMSH+6Th4SBx7uG6hDauxOOTNkD/5mv2/fsiQIUOGvJz87D/4ufan/4//+3Z8cvMEuSFP8Ym//Tf/znh38JAhQ4YMeaPkpQnh100MthjIbe0Z2RmQhYB4wBKSuRWZFCFwRTKGGYwE00jCRie/35P1mDxzhkIPeCXoWGVXGqx2BgPBuJAJzG7mO5grsm63293IJDPRxf4gyE670h4ExZylSdsZeCcg5qwngsHW1YBygN6QFvSvHrAfYcZdBfCybIqBPPcr7Wdhn1kf+qUJAPq0s92qTLbW2rSBgv6Uug2c0rfc3xy/FUDu+vnPz1IXZoOSPCIBZYL4UH3smwr0ttC/DaybrKpA6ENl73a76Z2wzAxLbPG19P16vW5f+9rX2r/6r/6r7a233tqzy263a+fn53vvrE1m62q1mkhL6pYMWNo49Wy32+n9uMnY5THniYuXl5ft9PR0evcu+/Ti4mIiNxeLRVutVtORzBxfOV6ZPpys6NlsNt2fDNmQ2Lk/JPDR0dFEfue+3Lter9uDBw8m+4TUTqy8uLho9+/fb3fv3p1idvpoNptNGdDb7dMjqFtr01HUd+7caYvFou12u7ZcLtt3fMd3TL+l/87Oztr19fWUrczjs9P2kPfJ/g65HkKcx0PHvunL/MYY4znjZYXjNOLY0CN1PM7tyyzf81CPfO3FbesSPT0+Ypf83qvDbeB3t7Eq45BuJMwcLxzvK9LMdZoscp9zHuA6wnqzHM4hPTtVPtD7XtnA4vr92gPGqHzv+WLsZhKa9fLdrZ4P6Kus3/5nH3DfVH3Bec/+VdnG3z238Rqf6Y3Has3aGwMRk7JcX3G94nFue3EjWKVLz9fts17/uO/Y/kPkrDd1sl/4/438ntiV6zyZx+sJbjiLHtUavrW2Z0P2R7VuGTJkyJAhQ4bcPjl/ct52bWz86skXv/Cl9jtf/N1vbqFf+mprX/5aa3/o931zyx0yZMiQIUO+SXLrCeHdbrf3vkwCKAHzQwyQbGM2X8ohIFVlX5DY4m8GaQgaG7zKMxUwaYAo9zLLy4SnwUICWczmNZnDzGUCWQTMKoCKRyKHcHB2o4k/g+FVRjG/065VVif7vgKhCe4R0K9AP4OszsShzWLLCkClPWN79hvLYXsJFrrtFWhvX6pIgbTBmVD2k2yCyL0VeEwhCM02039MNFdt7WVApcyK/Mj1EFfeDOFNABUIbPKdbc49IVlJBrEvON45JnwPda761z5DexyS3W43ZdOa2LR/EYROXffv329f//rX2/d+7/e22WzWzs/P98ZriNEcRxxbHB8ft7t377bLy8sp+zfvAb68vJzI29PT0yk7Nu8EPj8/b7vd00xYEsh3796dsnZns1k7OzubSPzYJHVdXFxMcZ5HO9+5c6cdHR1N/RbCdrFYtOVy2Vp7dmrEcrlsq9Vq6isefX3nzp2JtGa7Qw7fv3+/PXr0qLXW9uwZYvby8rK9//777Xu+53v2sq5DQue56LRYLCYCPnWnDcvlcqqDG5c2m82NzQ7z+XwvW/vs7KxdXFxM5G7smHbGZx4/fjyR68zyjh9l7uD7oT+sVKSY43buM7ljISnCexhTTK5UJFlFzDnmOz7w/syBvQ0k3pRlPV3382xW/e7YVc0hPaLL6wDqWZG4WYfkGW4scH20ZZ5zjKItOF9VawfGS8fTfOfczcz6yk/cPyYs6ZueByq9bD+Ky66kmturudi+yLFqu1cENdthvat6fa91qcatf3d5Xiv6ufRx9HVd7HuTpCyrt2mRfsDrVYyjPpUwXla+ZPu737jpxvGDNuN9aXdrz+ah/Ov1KZ8ZMmTIkCFDhgx50+RXfuHz7eL84ptb6INHrT14/M0tc8iQIUOGDPkmytHzb3m9heAKgbxktyUbKwRAADRnlIVgMAhmgInASo74dMZvBUDn2R74lu+8h4STCR8TkJVdqG/uMznF414JjDmDwuStgb38FnLBpBjtX+lNkL0Cpg1ks68NBj7vXXq0RwW+JfOR7302AM4ymS3EsgKGs897wHx+M4FtcN7gdpUJFX1zvaq/qtv9bDDVZG9FuoRQs74cR1Vf8zf7M/vastvt9jKBvcEjZVInks/ONoweaYsJAv41QO/yTSi7bVXWHfusJzzON8+SADT4T90uLy/bO++809br9R4RGBI12bZXV1d78ZP2rEi8vJs2R0snM5bvu93tdlMm8Gq12suy3W6fZdS21qZyEmMTZ1l2CNbZbDaRm7FHMpozFvJe5Hzn2E+GcmttIq2T3bzZbNrjx4/bO++8s/cuYYP9Ib4fPHgwHY+d2M2j3GlzxvEQu5eXl1MGMt9lnLadnZ1N7x/OnLVYLKYM46OjoykbObZiJvd8Pm/L5XLK/ObYi+3TH/nHDVcvK/a/5/m2N0d4HvY4dVmcbyj0X9/DcWLhusJ6OA6kfZw72HbbpPperQ0OzV0V+eO5gOU5vnPNQVtVf1l/VXbGJDfxcG1BfWlDjievWygec54T3IaeDdNHVduop+dRk4jVHNjbRMC6K/v2bEN7uL/py/Rp1sGyqj5m2faRyuaer72Jj89w7eJxx/Uh11m0B4U6sqxqXeBYU41ZtiF/accqzvif11gss9dOto/rhEObDrw2o1RjMPHb/28YMmTIkCFDhgx502S327X/6Vd+7VWrMWTIkCFDhnzL5dZnCLfW9gAlZsUGbHFWSGv7730jqFLttCf458zD3JeymalCAijgUQUWsi6SwAa9ArZWQDRBuLwX05k81TMkZFxWAF7azsf2RQyAEagLMcN7o6vBN9uVOsX+1LHSwXZlndSLwHCvLLadfe0MlNid7+Ns7WamCsmWHnBYAcbVO4tJduY+Znyx3bR3PnOTA/Xg97TH5Lxt7Yyr2Wx2Iyud45P9YJKUvwdIJcBZjbvWnh0Z774kUco2HGqHfcJ293hnjKhImNTp/q0Ik+dJyNfYk+9Np8QnSZi31trbb7/dHjx40H7f7/t97erqqp2fn0+EbTbSnJyc7L2jOPrnmOHEBZL4R0dHbbFYtO32WSYq/Xa9Xk/vEc74IHFsu85msyljOe8X5rHoIW9Dbub52Pji4mIigkOQpj15b/DR0VG7c+fOZKvoN5vN2pMnT9qjR4/a7/7u77b3339/b5zbhxJrv/71r7dPfOITE6HMPj07O9sj2EMQpx051jm+3lqbyNijo6O9I58zvkg4n5+ft+vr63b37t3p2OnZbDaVS/IlR1LziPH0R/on7fpGCAXPd84AjJ86XvVitHWr5gjXXenT22hDvThmOBd4nPrEAtfNZxxffLpARfCwTBJcjt+OVVVMYFnVXEN5kVjE+1xGdPCGuYxRrzlMhtEGtF+v/l78Yx2956pyK93ynesxE4zW3WVVv0UHziG9dZBfXeG+rsaEfcHrBK8BHNu40ch28RxGHawj19dsO+t0m3u+UF1n/6Sd1N/Z6owHickej15XuP7evO21ndcPEdue7eH6k/9XiT4eW94Q53XmkCFDhgwZMmTImyTvvv1u+41f+8JHU/jmw2+aHjJkyJAhQz5qufUZwgTRAnok28nv6zIYZIAs5RlsyrMkpwLo9Hb9G/QKMBWAKc8Q2LZeJAYC7nDXv0EkZ4xWoHdFgJF0qIA1Z2fke5X1QTukTpLHyXYjYGf7kShw/SnT2awv4h+RClBM3dE1xBhJL9adZ/2uuEq/XDP43utH3kPd2Ie0zyEglc+bRDGJS+LX46kCNlk/n6t8h77Ad3WzTQbsCeYaQGWfOmOoNw7dJoP5JiJYV+pJTDHRzzZWvkKbMK5QhyrjsZL4qEmB1JmMWvtNMk8fPXrU3nvvvXZ2djZlol5fX7flcrl3bPFyuZyyZ+Prjx49aufn51Om6VtvvdWWy+VUV454ZmYq43B+T5ZzMoGTIcv3ujNuh0il7ySWRJfUG9KY70Q+Ozvbe1dxjnFOtnLI6nv37rWzs7N2cnLSVqtVe+edd9p77703AetpV4jsXAupGxI5dR0fH7fLy8sp85fjzuPv+Pi4nZ6eTv2RvuQYSBYxSXceo95a2yOAZ7PZnh1OTk7aer1uDx8+nDKEPR/QN79REqGKaxUhlL/OLvUJFiyHc0g171QkGccfYyZJWx7Faj1NJlFnl8nv1tvPVgRZReIwbrK9bJd1tW60RyVV/WyX50Q+x7rzHOO7yXbP47y3mhd6n61Da/vZ0LYP+9AkPfWmXp7fe+spr1sq3Xytakv1O7/zMzdLeby5D6u1ac/fqj61Hh57vMfrwmpN6Y1elopk55zfs7ftVvWx7VG94sVyaJ3mdqR9XFuxDfzudYtjFucbb5KhXV0PdRkyZMiQIUOG3D65/+777e2vvPOq1fi2lPfvf9AeP3z0zS94u2vt7/7cN7/cIUOGDBky5Jskt54QNtBk0CoAiTN0eU9r+zvuTW6xLhKyJA8JOjprzsBixISawWxnSe12uwn8Z8YDgVVmUxok6wHYBOENTPl4VRM2tFMFIlNIrBtwr8izCszbbrd7x7+yDwnmVVkRFWDO3wxeRmeSWgY1WX5F/PUAThId9jcTBfyez96IYILCIG9VHn2/Avjt79G1Ahjdl9SVz5qkqcBr25G2JlHF/jIBTxLSZTrjmW3hX4KyJpypswHkyq60DeuoCKxDYLTbkPEYktO6RIeQwbPZ08zXL3/5y+3i4qLdu3dvIlN9zG0I3tnsGZmc9wavVqv25MmTiZxMhuvDhw+nbN5cb+1p5umdO3emkwuiN+2QOpLxG/Iz77+lb+eI59Qf0jp+Fp8IyZ3Y09qz9+ImlsxmT99f/B3f8R1tuVy2+Xzezs/P21e/+tX2ta99rV1dXbXT09O9o6V58gKzb9frdXvnnXfadrttp6ene3XmiOf0WzK7o/N8Pm93796d3n8cHRkrZrPZ9HuIhmRAn56eTn355MmTieSPT8X2FxcX7f79+1PbGZejX8Z9dRz+hxHHjZ7fcz7yfbnG+YOx0JtMTDR6Lva7Zk28VGQWhWPfelKHai563jinX9iGJo2qsv25R3JVcwXbxrZ6rWS7WB/Pl26XNwvZtv5MHTyX23YmzLwRqvJpx23bj/8yr3nurjYZ+XPPLp4bPSc/75rnIve5+5TPmGDlOKzaUl3vbdDzGMu9HDcsx3pm7e57qjEXqTZ1eNMb173Z4HOonamL5eafN25WY92+VOnB36rx5PY6FrI/bX8T9kOGDBkyZMiQ2yEP3n/Q3v7q269ajW9L+bmf+mzbfFSZvI/PW/sm/D95yJAhQ4YM+Sjk1h8ZTSDbIJ2JrgAlPs6XR5u+CCBKgMoZOwa6+ByB6RAwrIv35Tvv8XHNPDY2uph0OyQG5KpsxdiTIDDtlXJYJjMYeT1trzJCCMYyS822pF0MdFXgXzIeCfQTFCRpn7qpm8Fo+5DB5wo4r+ze2jMiqSJrK2C38sfoTIDd4KHbUhEIBpXZ7tyTzzkC3M/5eHIDxPbfyk/ZBpOAHK8Rjvno52OODd667dTVmwrorxTbxX1l0oT9QL+wv7HsnlQ+6f5h2fP5/Ea97733Xrt//377g3/wD7a33nqrXV5eTsc92y55F+1ut2v37t2bfO7y8nLSg0dBezMKN1TENjnqOu+/DUG82Wza+fn5ZM8cWx1iM32ZvyGLky0cPRnHNpvNjU0vIceXy2X7+Mc/3u7du9fu3LnTzs/P2/3799tv//Zvty984QvTu5ZDKqfuELWpJz5ydXXV7t+/387Pz9vHP/7xtt1uJ+I3WcknJyft6uqqLRaLNps9O9I5cXW32+0Rz9E7hLl9mb6WdqVvQkqnnJDRORWCY5d1kbD/RoiEioCqYhLjvp/zXOrfqvmVdbou12HSzNcYh3rt89zt36q5spr73PbUX5FuiZHVGsR291zes4XLpp95DrFUJJ9j7SGhjSpC61Bc7MXCjFPH55Rr0s3jiuvJqvxKp968/zy9rUvqPHR8u0lRr6nYj736q+/2f16LTSo7ch7l92pN43p6a5BqjvW6jWPB7fKYc9s8Jip/SHu9nuDY9RrEvsSx4THLOlmvN2tEF/8fhzpWa7/Kd4YMGTJkyJAht0d++ic+077/j/+br1qNbyvZbrft4snFR1fBz//T1t5/1NrHv+Ojq6O11rbb1i5WH20dQ4YMGTLk1smtJ4Rbe5YxRwkYQvIy2bMhjEjqBawJ8J+sq1wPiUGSoyLOXF6+V1k1zB4LKESSwQBx/ub9lCSxmT1kMJWkE6+nDhKwEQJYJNUJwhnMN0DGrFqD19HVR3A7M4vkctUug68GGK1TyiZgSdCSfVRl+6QsHz9ePZu20ddaqwmWtJWEV8pMOysfz1/2iQnH2MrAKPuenysA1TYkWWDAnHagVOQN6yEga6LcJJjLN6BLPSoCmuWwTRwDtBvJMvpnynOfVuCrsyRtg+cRDSw7BGhIUJbF44Pp27l3Pp+3hw8ftvfee6/94T/8h9vp6emUPZqjj1NP+iHvnJ3NZtOxy8lSPT4+bm+99dbkv1dXV3tjLITq5eVle/z48fSO291uN8W+9Xo9be7Je4NJWqa8HDNN8qC1Nh23nOzi/MZjuUPIRqflctnu3r3bPvGJT7R79+611WrVHj9+3L7whS+0X/u1X2uXl5ft3r177fT0dLIx+5B+T/+4uLho7777bvvkJz/ZTk9P28XFRTs6Omqr1WrKMs5nEu7r9Xo6GtvjmWP64uKiXV1dtfV6PR2XTR8PuWxSPlnUfKd07JjyOE/aZz+MUG+Tvh6PucfkSkXU9H7Pd8eaiOdpb1qhxJ7ZYMHnOI85FuRZx+I8W+ltQqfK0qyIHj5L6b0rtZrTevpxDZNnq01HbE9vLnCcZF9WtnB7TfSZOOvZhn3Be6p+83qu8p9Dfcjvh8hx+o7r5XqrKrvyK/Zh5ZfRp7IFn8t9Xtu6PdWzVZ29PnK7bB9v4GL91NW2cBvz2aSqbVbZxOSq/bNaB5ooruzsNQfL5pq02ozBmEe7Vj7GvqrWS0OGDBkyZMiQ2yX/5Bf/aXvw/oP2se/62KtW5dtGLi9W7bM/+wsfXQUPn7T27vsfPSH85LK1n/7Fj7aOIUOGDBly6+TWHxkdAJukCI8HJaBE0J7/ch/B2Nb2j50jwONsN2cqUK+IgSvu6icRY8DawJUJTJMjblsF6AcccmYxiQKDeiYoYycfsU0dCFg5e8MkR+p6HhHA8iqgl21n+wwwUl/XRaK5Im+rOkLQuc0EFf289TtEXOS5Cjh3mbRXBdBap91ut/deZ4P2FXFBANsAZ9Xm1MNNGAaJPdZyneOSR5jbLyPeYMAMMdrWmeK5zo0M1IlH65p4qMggA8zsS+vKcmjLSpLNmftCyhoQD1jNLKiU++TJk/Z7v/d77erqqt25c6ednp629XrdVqtV22w27eLiol1eXu4RwpvNZiJRY9eQtNHhzp077c6dO22xWLTNZjMRvdFltVpN5SbmPHnyZLpvu316/HPKyRHV2+12qifvNua7g2ezp8c+L5fLyU5nZ2eTPVtrE+l5fX3d1ut1WywW7ZOf/GT7zu/8ztZaaw8fPmxf+tKX2m/8xm+0hw8ftvl8vkeQR46Ojvay5Pm+5LyT+e23394jv6NL2pdy0y7688nJyTRO0h/px5DayZpm1nL64+LiYvLX3W7XLi4u9rKkz8/P2/n5+RSfGDPsk9/okdEcx70xEJs63vDe2CblVEQN4xOfrUi+Q/pW8wKfp608xhkXrZPJraqdjh2OxfnM+6hDjxQ71Ie9ebbXXpOR1LWaZ62j+yD382SB6j5fOzTPZK5g+dXa6nkkYK9NbDvt5b5mu3iPbet67Ue8bht4XnKbWTY3QFD3avzRRraFfcJjz+1w21kHxzVjTtUWjiHXc8jnesK1auWjLLNam3J+ZQy3r8QfHZ+qWOJNFbQ76+acX7XZfvwi9hgyZMiQIUOGvJ7yzlffab/1z3/7VavxbSWbzaZt1puProInF0+zhD9y2bV2df3824YMGTJkyBDIrSeETaYEdA950NpTYCRkXe5PFhuJuQD0BiRDIOT9vQTbCc5UmUQEC6MTQSGSUwbifLR1/hJgjE75nWBzBRinTgKm1T0ECPMM31fJNqYuE1kGvUmcs90mrZ0JYaCSuvlZAnQkZStSP3qEYCNB6P7rgZMEA/MMj0aOnQ3EEoj0dX6PXhU4X2UJUbeQvCy38r2MAWfLVeCugU8TBLQX2+nPLNcbKuyLzlIzQUcQ2RsRaF/bieOMfln5In83YN0jHgx8518AfI+PFxXqwO/JGHZsqIi/7Xbb3n777fbBBx+0e/futY9//OPTUcY5hrm1Z+/9Jgkd+yfmpa7Ly8uJvKyOum+tTScwJB6H2M198/l874SGvNM3mbXux9PT00nXxWIxEa85jp0+k7EYUvl7vud72nd913e13W7XHjx40H7v936vfeELX2jvvPPORLjmCOb0fzbg0GejM/v8wYMH7d13323z+by99dZb7ezsbCJrvSmCpHrmpZDMrbUp4zd1JtN3t9tNBHj6IGOA81r6KrbLe5dDyHNzwdHR0XTN8fAbkYr0ilTkTp7hXxMiFYHFvqqIp6osz12cO/ndG5F6JIvnl0qqGGEyl3Zhe/yviqvVhinaiN+reYRif7cNe9+rcrz5gP3FuYPx23N8NT95TrFPPE+8VuNzh4hu9xHn9YrM7z3vvuI6tNrU57nDelfrMN5Du3pdVmWnspxqfcb2V2PdY9NrWUviooVrl0P9Gv28MbTqF/cj7Wn7eb1XbeZzX9O3qT/7uNKdtuIazWu5apOdSeRDsWjIkCFDhgwZ8vrLZnPV/vHP/eI37f9ut0H+yS/+0/beu/c/2kp++Z+3VqxZhwwZMmTIkFctbwQhbICKoElFCjlbjuBrgBcD/LkWAIbvWMx9JIZM0ubZHIPKd9uSuIx+biPrqf4R0LNdSDxUoBCBMYN4KcvvBSbIF+KiAk0NgrGPmMXpf7luoDLXIwTKCNpVdjN4SYAt+ri+gPu0qUls+hz7k6SagTwSdRWYTZvnH4ka2tZgcNqWrMWKyDDhUPWVbdAjYylVNgt9z2ClwVVn1tGuR0dHeycB9HzaxEWlK+3Eunt+Q3+1ffJMxoLJfvuebWv9COL2hMStxyRjFQH/XA+Je//+/fbOO++0+Xzevuu7vqvdu3dvqvdjH/tYu3Pnzp4ftfY0s/ji4mIiTPOP7/uObx8dHe1l7B4fH7fFYjEdH513656dnbWjo6Ppe57nBpy0ZbPZtMvLy7Zardr5+XlrrU1ZxNm0s91up+OXE6uTIbtYLNpbb73VPvnJT7a33nqr7Xa79ujRo/bOO++0L33pS+1rX/taOzk5aXfu3JmI3pDC9JvWnh7dn984b+SdyO+88067uLjYsxEJV2/miW+HDF6tVpMOeW63e/aeYJLGnHMyt/C+O3futKOjp6dk5B3NIbf5LGMp7f4ywnhon6ef5rM3dXHMpTzb33Mf6zDZyN9YNttnnSvCrSK4HAcolS4mkFiHNzHRnrYf66g2/Xg+Z+z2b1Ufse5KD8e0ah6r4u+hmEzizL/3+tJlsK0+LaOqsyqv0sPS6wvaip9tJ36v7E4/NCHv+v2P0ht/+a3aOOF76Ltua88HSID21oO8z/ayDa1vFTOsQ9UXJqx78YH1MbYn3nrtWvmXN1qwTm7QcdurcUwdvb5h3zCWRwYwPGTIkCFDhrwZ8lN/72fa7335Ky/9f7fbKLvdrl1eXLbd9iO2xU/9Ymt/77MfbR1DhgwZMmTIh5BbTwiTIDpEAvl6CB4f50ciLs9XGTLOMggQYxI2QH/+5n2REepOCchbgXV8jtfyjDNaKhCJpKttRbtUtgugFUIh5ZBknc1mN8g6A+oE50JgmUSonmlt/7g8guK0p7ORQqYyizLP81hbAo4E5XpAnbOb2N6U1cts4cYFEwwVAZ5yK6LGZRhUNnhKP7WkT0KYEsSM/iaPcx/HS8YF6/Cxy84Eo9+ZGK+Oee4ByNajN37YHtuftmfbSLIm69U26YHO+Ww9+Dzvsex2z7JBnWFlgsWbGHjt8ePH7Z133mmbzaZ97GMfa2+99dbUjhzXnDbmiONks85msz2idTZ7mrna2rN3Ibb2jJwMeb3b7faOW062at4bnDYF1KbO2UzDOJ333m6323Z+ft5Wq1U7OTmZdEl96afT09P23d/93e27v/u7J2L60aNH7e23325f+cpXJgI3JDP7vneaQTJsSfy21toHH3zQPvjgg3ZyctLOzs7a6enp9N7gHAvN9yynHr97PXZfrVZ7fZy5L75wdnY29U1smszqZFdfXl62hw8fTu8qJhFNH/U89zLS83PHaf+e71Wciq6OnSZGqljpseY5ibo5ljlmWGfX3dPV+lTxwTrZbrav50rPWbyf4rhdkYv2B5N71bzhjVpVm60j63fbaHPOvX6e7Wf9lf1ZpuvmXFHNZ1xTWB/rRj/gHFrNCZ5TrKdfPWIbVf5d6VitIyv7U2ff7/md9VOqOr3mop9V6122ybpWdvRmCutgXav1A+3nuSjPJ0YfarPjWC8m+rnq/xW99Tg3gnC89PyoNx6GDBkyZMiQIbdD7r/7fvuv/ov/+/R/5jddfvonfvajr+Ri1dp/9WOtPXj80dc1ZMiQIUOGvITcekKYwBuJhwoorkBVA38GcSK5zmNNA9SEYCRpTECdx/621iYixXpUJKAB7ZRNIDH3G3gkodfa/rGhLo+S56sjpSvwk0AVQTSSZhFmQfnYZhIG1MuEqu1VZYkaHGSWY0U+tFYfX80MGmaKEOA0CWC7sOzcZ/A89u4Bnuxj6+8+CnmW/wyQgK3ASPs+bcjynJVTAcKVT1XEia953FXEiYkOE9bUxSCogf30H/vEWTuV3qmDflwR9xXRw99sL/aFgWNLxkv8m1mk1sNxJGTpyclJ22w27Wtf+1p79OhRWy6X7c6dO5Pem81mjwQOmblcLttisZiOfb68vNw7qjh12t7Rmb/P5/PJdnkXcHTlWEjsTh3ZVJMMWJ7mkLgSEjS+u9s9zaw9OztrH//4x9vdu3dba61dXFy0Dz74oL377rvtwYMHE3nL9/OmLdwQwczpZOry1QPHx8ftyZMn7Stf+Uq7vLxsd+/ebXfv3p2I5tnsWYZvYlhrbapzvV5PJHPKTX/waPC8fzl65r3KeY9zJLY4Pz+f3jFcjYfYOP7yYQEFxj/2I8d+jyBr7ebJHtV8zL/53NtgU83zqc+6mnDLc88b04xPHrupg+1rrZXxvNdebrhyHSzfc0+ExJLXQqnXc5jnW89P7KtqfnM86+nMchg/Kh25brBObKvjs+/hZ45z/tbrc4+dyrcjJhTdVymvJz4pxPrZntadNrcteA/XXi7TRGU+V75mX+qNderT+z06VOXHbu5T2ol2rmxd+Y/XhbZzr+5IZb9c78Va2isnR1Bvx7ZqfPfWVfbpIUOGDBkyZMjtlV/+3C+3H/+bf7eLI7xJcv7k4ltT0Re+/DRLeNh8yJAhQ4Z8G8mtJ4T5Tt/W2o2d+yaGW3tGcLV2M2Mg10jOEEjNNYPKBslyzYSwgTcDYT3wvAI9I73fQzpUAFsIhQpYMoFo8iB2N3naA6JN5PE6CSPq5TYZ6IruPfDOz/DIa7ePfZL7mTHM444NLhrkpp1sQ4OvFVBJWzsziO3zMdl53vZt7eYxzpW/uE28L3o7m562rsBq+g6BZY8H2vZ5Nn0ewEwdSIyzntjEGWU9AoI2ZPtyHzcz0CdfZKNFZece0ExhTNrtdnu+ys0QFXkUQni327X33nuvffDBB22327Xv+q7vat/5nd85kb15d/D5+flUZojYnA5wfHzc1uv1lOnbWpuyXVM3ydXFYtFOT08nfUKQ7na7tlqt2m63m+po7ekx0Ml6DdGbzTghYWez2V7WMt/dHZ3ybuMQs3lP8aNHj9r9+/fb17/+9b3jnUMep74QrdFtsVhMxDQ3myTGhOh999132wcffNCOj4/bW2+9NR0nfX19vWdDbm5I/5Po3W63U72xUTK4kwW8Wq3abPb0CO4c9513EscXVqtVu7q62jtu2v7i8fxhhHHskC9Xc6jnkSpmRhwzSIh5LqriC23juFdtICOBxbjm9lBXximSM4551uVQH3gu4tzm95P7M+c/6ux+4tyc7yawbVv/5uuO2Sa5PB/1NjI5/j9vs59t5bnHPu/rucY1Ym/uZLneFGa72Gd7v7NMz/us13MWbeW1VmVH+341x1qqdVm+V2uhSl+PP5ObnFvZ5mqTGsv05j373aExkLHSeyWK1wHue9vedec5j4fE5ujtdaHr5oYpS29NNWTIkCFDhgy5nXJ9vW3/3d/48fbB+w9etSqvVK6urtvV5luUKb3dtvb//DutPXryralvyJAhQ4YMeQG59YRwQHSC57vds8wmAlwEQ0m6VcAOj1gl0bDZbPaykA0QVoAayQKCTAE8W3uWRRIgiDrkGYOWyU5mNmjqbK3dAOcMVlXZQq6bIKTBsuhPO1YkNu1qkDl1mXAOMUwbGphk3a7X4JcBVQJo9I8KNDMh4fLyG30mzxmoq8gG9oEBYZMqFZBLO1agcOWPBiqrTK2UW/Wnwe7Kdqm3R8zYHhXA38u6MqGecmyTCsB1eWy/yRhn3Vkvt8lZfLRxpYd9geUdAuI9fhKbEhNiI5PPHgdPnjxp9+/fbxcXF+3evXvtU5/6VDs5OZlOMdhut+3y8rJdXFzs+VdIUBNEjglpX0h5xjFmzuXeq6urPaKUfpLrPJGhtXajbBL0idXHx8ft7Oys3b17d8qWffLkSfvggw/agwcP2gcffLBXx2w2m7KM09bEYbYrfZQ+T2zPv8ePH7d33323XV9ft7feeqvduXNnalP6jPErRzvHniG66UeZI/x+5dVqNb2buTqCurU2vVeZPkT7+ch/v4/yZcQxjNcrAsPEToR97bIpHKucc3mvN0p4XiQx4zFrvTw2HQ9cnq8zrrAO1lnFymouNGFUzYE9/asYl/K4XmC5XCe5/KpNvbmT48eb+awr5zKvSzhm3MeUilx1u9jWtMPzTWIV7cN5qJp3WC7/pvzWbh6NnefZt/lcrS1Ybm/DH+/3M7RLtQGrqse60a9I5FZjltf9mVKtPzlXuy3+7Pa4HVXfczx4fZb2VX1UrRs81tkO+43bnd/d32xTzx/cxiFDhgwZMmTI7ZevfPmr7R/8nX/4Rs/9X/7Sl9tv/8a/+NZV+Ju/09ov/NrIEh4yZMiQId82cusJYZMeAT5IPBhAJPDNDBUCTjwutAf4tXaTlCRAxSNSmalAotdgq4kx3uPnDB5XBHCVjWjgvwLCSHLkXZ3Okq4APwLgJnWcpUGCKboRICO4FlKJxF31rs0K2KtAY9rEoLf7Mf5QAeomF6rf2A5mKlsXt4E+SeA8/Ur/9HHHlVT+xvb3sk8I9qb+fLd+7GcD7xUAb8CS9xrYNjhbgZ0mNfgvZCk3IFQ6206pyzrTRhXo73/VmK76xeUcuu5+Y/8wJtDv6JcXFxftK1/5Snvy5Ek7OjpqH//4x9vZ2dmUHUyQOb65Xq/3sq4Tb4+OjqbM2WSzMruqtafkY971m9gUIjvZr/TtZL9WYymZwnmPcY7OZswPSbpYLNrHPvaxdufOnbZcLttms2mPHz9uFxcX7dGjR22z2bTT09O947cZ1/muaMfGxKZkITNWnJ+ft7fffrudn5+3o6Oj6dhtHg2d9/mSfAqR7ZMN8nm5XE7HdSfG8gju6Jfjo09PT9t2+/S90XzHM+cDZijTzt+IOLPPft8jgejX+c1xiM84xvc2ZLG8ahxWeqV81+1NZmzzi45z28VzekWkc06v5jbHUf7OttneFs9N1W+HYl91b1VHzyeq2FfFX9vJcw3LrdYBvU0+bIvXeN4Mxee8IYhlWG/r4nki+vXmnkrvaqz5e+YGj79qLch1G9tTbTb0eE+buRbOMz7+3Oufaj6ufvMYoc1YV8/OvT5JOf7/Q57vrX35u+3jNZptyTWO7V35ZrWBw2t+fx4yZMiQIUOG3G7Z7Xbtb//Nv9M+uP/mZglvr7ff0Mbml5bdrrX/7meeZgsPGTJkyJAh3wZy6wnhkAIk1KpskxchlAxAEmgiyB/ghaTBbDbby6rjfRWJy2wXg7cmTkkMGLzLcwSKDYax3IhJugpQrkgsg2+sk4QxswL9TGVng9MGs5zhkbppG95PG7J/STaSzEobXF9lR/cpweK00cCffZH3VX2Qv7y3Igr83uHc6/dJHwIyDV76nawVeWCSgf5wCJCuxsIh8qKyk21Mm+U5+1jPh+gLbNuL9CHtzGdtZxOrVX3290N1t/bsPeQhuaMLN57wHwH5ZMG21tpqtWrvvvtue/ToUbu6ump3795t9+7dm3y6dyzyZrOZ6s1mkfy7urqaMopD6JIcJgFDEDvHSed+xtX1ej35Jsd+a23vSGm+352bfUJU54jqJ0+eTITwkydPpuOo817i2exZhmxsGH05VnkP/TD3XF9ftw8++KDdv3+/XV5eTkdH50hpHh9NG/O9xHm/cmx9eXk5vdO5tTYdZX1ycrJ35HXsFN+/urpqjx8/nmzJ8RRiPVnL6d+X+Y905asVqcP7PJ4Zm7xJqyqXdXtMsQ7Pb3yuutfxo5q3PC/zHmfrVUSb+8Dxztd83XGUcZzt419eNxFK/67acIjct40qEp7t5dzq5w711aF2VTbpPcO5jfYzIVnNySmjaiPLZxuqON9rE9vidqUfemVWG5sq37W/2la8r9KP48RrCetf1esxRv/1eshj23rlu+3iNU9vjLht1N9+mrZTL//u9rvfqvFTlWMfrGzvtlXr2954HTJkyJAhQ4bcXvnq736t/Z3/9u/unSI45COWn/7F1v7pb71qLYYMGTJkyJDW2htACLe2/85bAvWz2ezG0ZmRaud/BUQy48rHIrd284g/EsT+XGVaViSSQTMDqSYfaIO0Pbqw3IDABIpC6kQqYIltdtsM3LG+CHW3jfPP2b4kBw6Vw/JMXphgSHtD7rg+AnfuFx/LXQGFbrtJTtqW/mBfc2YT7WCQj/U6U8i+R31YNwF6g9BVXxEIpo7W18ArdfYYIhlG/dyfvfKop+3ATRPU0f1RtbuyB79XGbRVXHF7DQazfT2QmZKs/WSSstyeXaNfsl1ns6fv3n3//ffbgwcP2uXlZZvP5+2tt97ae2Y2m011xV7b7dOjpBNjr6+v28XFxaRvYkOyiWnPELPR4c6dO+3s7KxLEKxWq7Zer28cxxwyNoT0brebiOfYJHXlqOjj4+O2Wq3a48eP2+XlZbu8vGzn5+eTXnk3L0nzkNwmK0LWcmNQ7J0s6ePj4/bgwYN2//79tlqt2mKxaN/xHd/Rlstla61NurL+lM2M5LR3vV638/Pzdn5+PukYQnm5XE5kevp6s9lM9ky2dGtPY42P72Yc4hHkLyrVePSYJdlbxTHGql6cY9keS/yNcbe1Z2uA5823lR9W303cMA6YWPRvFB5xzuxtb16jPblRwTaqyOhqzUDbOYZYP2+6ipjYY9m0KdvjDXmHiEjH8YoMc5n8nXWwXzw3kwS3fRyXe4SjbVn5jjf7UaqxUa152FcZu9Wc0yMSE6to53w2mVjp5/7gs9w4yb5nm3vrN0rPN3ple3xxfea2eU3o8WjfqOb96h/bUa23HF+4UcuvrqEubgPlUH847lVrqiFDhgwZMmTI7ZW/+Vf/3+03f+0LXTzhNsvXvvL2t77dl+vWfvxnn2YLDxkyZMiQIa9Ybj0CEACV2aI8xtNga2v72VsG+Vrbz57Ndy4ocp3vud1ut+3k5GQPjDcQa2AxxEraUJGiBIAMpJrIIgBFUK/K6jlEdEUMIPkZA4u2kUlTP0+AjsBY2lr1Q/rcx027fRXIRz14PGqVUd1rM5/Ps1XGickA92cF2rtf6XckNSui3P1sIme32+35qwFtk/W+XoGv+e7s4pBa1I8299jwOEv78p0AL/2CdjEBEBuzfva1CbA87xhB/ah3Bcyyb6r+pLjP2KYXkcpfk9lpIDhxiXWwnx48eNAePnw4ka737t2byNPW2kRUmqhI29566622XC5vZGiRKL6+vt4jodP2q6urqW9Xq1VbrVZtt9tNZGSO9z47O9vLVJ7P51MWa05l2O12e5m219fX07uDQ/Ludk+zbFP+xcVFOz8/v/HO+Iw19r8zhne73ZSVnD6Jjjwye7fbtQ8++KBdXFy07Xbb7t69O2UJR9fK35OtfHFxceMd8RcXF221Wk122O1203HYIXND+qb89XrdLi4ubvhz/IGblEJGf9j/SHsu4HinTR3fqnjjubmai/25Ig97ZInvc93UrbVnRE6umbShno6V1XzAuZSbrCpi6pCOvX7gvbxOe/A642+lQ28NUdnB/cKYa/1y3T6XdpP4pB2rOM7v1buJ3TbbK+OffcX5kGsB+yx/r8rtbaSjfXyN81VFVOdv1RbakH1c9RH733qwTG+E4txaxZdINRfSZlwfuQzW67bSLlV7emstt41zuNcPnrO98bJqh33C/cN1Xe7jZgrOPdww4P+7cP2Sa9mQRF8eMmTIkCFDhrw5cnF+0f7i/+n/0r7y5a++alW+5fJLn/3lV7P2+elfau3R+be+3iFDhgwZMkRy6wlhZgQwg4zgTUB7gjkBfEIAEdxqrd34rQItSV4SRGQ5BNACIue+ZOdW5FmkAigJdhuYc2aZAWeS1QZGI24XyUUDTwT6SU67LrYz9xMAZ/sNorHs6r4KIK3e09zLnKFu+Ztjagni8v2kKa8CY+0r7CNmmlN/A889PSvA2GICtQJSK4A49vL7pa1PNVZ6pAHv3+12EwFWkRAGqOk7zlDr2bsiWlJWxgafr2zqunrAcD67P0mOmLDw5oEe0XOof1PW0dHRXqzb7Z5l/DN+pa8Yc0KcHh8ft0ePHrX33ntvImPv3bu3d0xxyE0e5bzbPSVtV6vVtBnGsY2bcXIkc3SNHqvVahprIX/5PuIc/5z3465Wq+mI6GThhjglQZNrIZw5JnjU9vn5edtsNhOJm36L/hXoX2V75W9I6NyTMh8+fDiR7icnJ+3s7Gx6lzBPLTg6OppscXp62u7cuTOR22xHMpPjf2lPdIkeadfJyUm7urpqq9Wqtdb2jpSOr6SN7Ldv9D/SJsvi2z6WnnGyRw5XwjnIY4mkLdcD0SttNVFtYqmKaVUsoE6pw7rTphWhw+usx9Kbu3vP9OaTnj0r0s7ksO3gMrk+6cXkqn8ZU/Od49dzWLU5KM/R5of82e2pYj7b6Dmpsgv92GQ5Y7TXED3bup8873LNST+nrQ4RqlUf0Tb2NdvZevjZPEPS0ms4zoOVX7Be68D+5rjmejnzi/ui6t8In6ls5PjhdaL7zXb1+KAPes1f6et6qr4dhPCQIUOGDBnyZspXf/dr7W//zf9+rAO+VfK191r7ld941VoMGTJkyJAht58QDrmw3T57B2JAk+o9ql4MhaAiuHIoi4GfCc4QBDJIFVKDJM1sNpvqNkhF8MegkXVxdoZBJOrBe3g95bNsAogGBCs9/Lf63dmQBiYNRBOYM/gam7E9sS+P3Uw57Bf3AzMpCL7Rfmx/yjB4zjJZTvRl5myvnbPZ7AZJwf4KiVc928ts8aYBAq4GOCsg1kQFnzXZwveOxvfTTwaQTea47h5BQjCZWZC97DqWybFB36nsYVC3B87TNyqQl+SUx1/Pzofqyj087j2+ESLUZEH8gjbKO3NXq1V7//33J3J0sVi0e/fuTVnBzJp2uT7ykjHIm3RyHPPp6en0LO2R0xVs64yj6+vrdnl5ubd5Ie0g4U1CgO8GDtl6eXk5ZRavVqs2m83a6enp9O5dEq1pAze4mDCp+j9xJe/3vbi4aI8ePZo2mczn83Z2dtbOzs4m3dOvyQhOu1PO0dFRu3fvXrtz5047PT2dxlWI+svLy+n9wPHnxWLRzs7Opjlot3u2KcP9xnHVOyK4J724b3LHNqqIoPiOx4VjhAkUit/b3RtrjCeHCJYqa5LPsj18riJ6SI711g62Ib9XxFylX6Ray6Sd1bzv+Z362i494svlWV9fr/yD7TKx3CN/7W/W9dA8xPk8ddh2nGt7fcW+rPqdNmCbuYnP9nb5tjPtlWu02/P8qvqX3+hvzrZmOV5/Vu1mfVyTVOVZR7eB372usV4sr4oh3jzoeyubOHa2tr851OVQb8Y4rznig9VahjblP9oj8SSvaxjvDhwyZMiQIUPebPkH//0/bL/35a+8ajXeDFlvWvvMr7T2Ev+PHjJkyJAhQz4KeSMI4QrkMyCTaxVAV5EnrT07VjUgGIk6AjAGgwwWkiBj2SR+fSSgwbVcrwi/tJX1mKjjcwSR/FyIGraxAl+pN+8N0FUBtz1gjISgs0d6BEDawSNXfS19U4HPJI9DIvWAPN5v4LbKpDFQ6Sxot5lEhMnRHrh5CMA1AGqQOH1Ov2W99BXWZb+pfMl9at35XlIfnRlbvAg4S1tyEwjby/HN+0LwZSNARf4bBOY9GRPWjfaqSBr6QQ/Yr8D6Sui/9MuUy3EUMvDq6qqMgVdXV+2dd95pDx8+bJvNps3n83b37t29d/WmHGb+krDMscmx63a7nTJ8Ly4u2uXl5TQ2eQIBCedcD2nKOkLuhvTmO26z0SLvyGWcvnv37kSepq0hgi8vL6esaPdl2kF9OfbZz6wv90fv2HC1WrVHjx5NhHbKT/Y1/TOkdAh/ZrbfuXOn3bt3r81ms+mI8GQdHx8fT0dFz2azieBOfyTzeL1et9VqVcZIblx5mayyinCi79pmvt/km8lcx0KOE/cf28K4wPuqeTTXq7b1yqF+niPZNuvNsnt2dpupm+1nkq3SM+IYbjKK5Xu9UunoMj0mejpXhD3n4Z5tqhhf1ZFyqz5x+f5nm1TrA8fr3Of5mO2yXtU6tdcez1GVLtxg6FjlNUu1NrNN+JmnELivI7Zn5ZvVZo/eZ5ZXtSn30NdMlNJGvE4b0B+rzV3sP9rDbWut7c297Gv3ndcYz4u1bmd1v9cpvNZbSwwZMmTIkCFDbrc8eP9B+/G/+Xe7mzhvm1xdXbdHDx+/OgX+0edbe3L56uofMmTIkCFD2htACAfU8TsQK1CoItEMeJHUNdCTMgj+E3TugYAEmgLWkIQkwLnb7fZAt7TN4DiBJGYqMBugBziRWPZ7+fw7nyMJRZ0rMLkCCkmAR2+/i5dHl0YXA4i0K+9h31egbH73e27dx3zXLsE1A3IkPVlPdGCbUiYBY2aZ2Dbur9RHHQw+s930SYKorDN1VMAp/6Yu+nDGAcFPg82xgcFS2s2kIOurbOo+oc2oj/2bxAbvTdk9QqgC/Q14V6QE9ebxuCzzeWW7Dywh+Xj0PPuHxx5zA4fj4263a/fv358yhGez2ZQhPJs9y+SlnvGjZOdyTIWEDIgf8jaEdN7nGz1SHt8FnN9ChNKWs9lseg/wer2e/Intubq6asfHx1OGLuNMjqgOUc2xEdv52HS/i57+yU0fVbwNUfvgwYMpOzlEev6mP/PO4xwnfXR01E5PT6fyqEcI8c1m0y4vL9vZ2Vm7d+/eZLeUH3ucn59PfRDduemIY7Ui9F5Enkc6eK6hvehfzyM/OebTdya9+Owhwo+/V3GwN249Vk1mulzbm+V4gxbvcyxgHdbB97lfKxvyXt9T1WN9GOd75JN/p32qfvZx3xWpZt17/VfZxPV7fVWNCa+nep+9nqjqrHy+WkPZ/m7HofrYdvZVpXvlt/RZPsO58tA45DxsezLGWrxBy7bxpqrKh3x/NZbz3bHcZdF33Tf0UdqbZTuOch3NNYufbe1mLEh7qHcV47iuZNwZMmTIkCFDhryZ8pl/8I/a+ZM34922jx8+ar/yj//Jq1Pgt3+3tS/8zqurf8iQIUOGDGlvACHsd9lWIFRr+0A0CSmCbAaUA8AbHA8AGjERReCm2rHPugxEGizMb2xDa206Ci4ZbyRL2P6K/HFmDtva2rMsN2baVu9wtW65TpK5ek9y7jORleu+Flv63cYpI0QKbUibtvbsGD3+4/umcw/9guC26+f7pbl5oAJDqTP7xtk0Ic0rf6RNDO6aRCOQa+A3bTAYazLa393P/GxQtxpbBlErf7D+/t22TF0Ej+nLBrVDzPs42ZRPm/taj3TgfbGFwX77B+8lyc1+ep64bdxMkY0WER75nJgRIjJj/OHDh+3+/fvt4uJiOjY67xHm+PA4DSG8Xq+nDOL1et1aa+3Jkydtu91O7yQOgXt1dTVlxkbPxDFuHOF4YL9Vdl8sFhPR7HFxcnIyvb84JGqI4evr672MXG82id1SX3zIY8Pvbc8zzO598OBBOz8/38uwns1me8d8pw9zzDVjCd/7G32Wy2U7OzubylksFnsx3iR5a20ii70ZgwR49DHZ9CJikiY26s15jhcmFR0DK+KtIng477F+xvPYphefqrmI4jjJ654HKgLJsYX3VSRTZUvOvb1n2C/2P5fJdYI3IXmDlKUXw90XvXVORbBVsdnl93zBazH/XtVJgs36sTzbvLK9T1Po6ctnOZ9TTPzZDypikOvfal3ca4P/9sZI5ZfcnOlNY732eH3psrye4bzpI/05Hqr1Ltts33Z8yuYa2throIowP+QnXld6LDsWUDymfI16RD/aesiQIUOGDBnyZsq777zX/qdf/tVXrca3TF7p2me3a+3z4z3CQ4YMGTLk1cqtJ4QNrAR4MXBe3dfaPgkYgKi1/tF3AXN4jGi+sz7/q4DMKqvGgFAFaBmMC2ESYtTAWMpnJppBdoPSEQOLtCdtWoHuBJVJ0lAIBBLYq+o3UGowtwLnmRkYWxjwZYYTn3HdtFtFTkcMKlYALAFJ+k30cduraxXo7r8VyMh+YL+RVI8dXAftTv+xT7KvWLYB08pn2D7bxH1O29MvqvsJVNPHOA4NOLt810vbGtSn3pVUhEMFyNv+fD7HXsePvBGEtuUGiLQ35OD5+fkeIXx8fDwRuXl/rU8fILmQo5u32+30Xt4cUcx32ObI4sQqnrKQtrTWpvs2m82eH8XWGaNsT8jaEKqJSyGEQwJHx5CvFQGZPky9IY15L49nNrGf/meWcjKSN5tNa62109PTdvfu3T1iPIR17JWyYpvYI/6cz9vtdjpCOm1rbf8Ui2Rp00d4vDXt5az2FxGPZZIvvTHEOjjmXLfnYD/vjUe9zWAsz/p4IwHb1SOUWG41D/Tmsmo+ow96biWhaHs6Vjje9rLXq5hV6dcjSyubuN8s3tThNlZzQ6UTdSW5T39m2/KMda2kt8bimqZ63nMh56BDayjXWfmH/Y26tHbzqGASlSmfm4RsB9uLelK/ilj3vJm6uZ7z2sTzh22fe7wOYL2z2bPTK6q1jctiH/k++hjv90Y+tsFkLsvKs/ajigj2+jM6ety7LveRxw//n8L7hgwZMmTIkCFvnmy32/aZf/BzYz3wrZJf/+Kr1mDIkCFDhrzh8kYQwq09A49MguQ33pPPJsy22+1eppeBpoifMWnj7wY8/S8AUIjTHnjoDFYCbiYxmBFLoCzEUL4HjKI+znogeGlQMvcYJHRfEDDz+01tM/Zla8+Oj2RfkohJG6mDSXb+3gOLWbbvqwD46h6Dwgaq+TfPhagjeFcB+NaXxyyHFDERa6KLzzFDkH/dxwQlWR/9yz5kIJvCMcv2VSS1wVOPZRMCJlLSboPhHtMG+3v1VuA0xwX/2scM1lIMOHusV7Ldbqf37XLsRvh+YYPFiR0hhDebTfvggw/axcXFdKww37/LrNjdbrd3tPtu9zQLN+8dji8RkGY8oP8xg87vA49P3blzZy8Lljbc7XZ779LNM8muTRvThvyL7UK+VsS9+5XHYtvH+D5JxmCWtVqtpmObW2tTdm/6gv0R30p702a+N7q1fQKZ4zdxPpnRJMPZ/+lLj4Ee6XVIOIYrEqRHZFTfTchUhE01TzIjjr9X/dtbJzi+uzzOd461Jrwc/zxHuQ2eS3rtj23cFj7LNQH7obe2cfs9jzq2sy4+VxHw1aakQzpTX28UoH3j23meBCGlWk/19K3mO9v50BrC6wn+rdps8VrLfWbbUTf+xucrIpZtsX9X/mZ7sX7Pnxb7gv3OaxT6iG3oEz56axWvYxifbcdqrvb3Xjyr/IG6sxxuSqAtaB+uaat1Cj+zjXnObXCdQ4YMGTJkyJA3U37187/ePnj/watW4yOXL3/pd9v6cvVqlfjSV1p7cvFqdRgyZMiQIW+03HpCuLWbGUat3cwMzH0EwA3mklAJuFKBgwSeDmVWVCSqgT7eb8CbAFTVLoJIJLLTvio7gMCbywxpkmsBqkgeRHiEKwEtE5AheAwqV8B9RQL0gM9DoCV1MhBckQYEzCoAmjoYzK36k31EmxzSx0dQsxyDjyyb7Xa5fM7ZvgQa00fOVLY+L/Ld/WCgnHq77yvwlzbj8ZGV36Rdfp7itqX91ql6b671pJ+E0KRN2Z4KHI6+rpufK9vmd24I4Fhju0wEZjzTNzO2nzx50i4uLiZi9ezsrL311lt7Ppc4w80rIUNjBx6rTFB7t3uaBbxcLqcji/1OXPp+4lfI3dVqtdc/9itugom+zHAOkUoSnf3lzQRVHMlv7Kf85dzBf2nj1dXVlIGdsr2hhzGcJHPePZyjvLfbp1nOscnJyclEwucdxCGXd7tdW61W7fHjx3ubDSqShnp8WDEZVRFPlT/7ftqjN8/G3o6TFWmTeqpYnN98b2/erOa71tqeX7J+rzVSFmMIN28w3qRvTOxUpCXjrdvA9pq8dhtpU8/xVcaxbRh5EbLMc39+r+Z2luc1RZ43Ud5bR3hMez1X+UFlr0Mxulo7uN8dI1032+F+Y/mHfM2+fGgNWrXDflhtEKv0rq47hvbIam6K6r0SJM9WxKpjHMuv+tS68jfajP3tjXl5viJh7S8936h+q/rcpDnXW2znof+nDBkyZMiQIUPeHHn7K++0++++/6rV+MjlX3zhi+3yVRPCv/Xl1h69Ge9sHjJkyJAh355y6wlhAl8EUpkB0drNY5IJ2uYf32cZkJ0gf8TAFUGrHkBFgJigsYHrXnYIy2TbW2t770aNEPiPXUgMGSD30dkGCg2um5B2+90HbG8yAdlvBHj9Djq2l/fSZrzXAGZIMGYj24fc1nz2+zUNwJo4TD9VwFz6gBl59kf+M5ie+yrg2rawT1RgavU8bWFinkL97MOWCmxlmQY8qVNFtpAoM9mef9Xx7ew//iMxWWWjWa9edlhF2ti+vu5xUJFmFZkRe7Acj+G0OT7DeEDJuHjw4EF78uTJ9J7f2expdi7rCMHZ2v4mlNVq1Z48eXJjDKQcEhocU7Rf+jeEMzOG6ffU//j4uM3n8+n9ueyb+XzeTk9Pp+OiOSbyruPo57hE/Uzapn94bDz9KXbJMycnJ+309LQdHR1NxC7jFYn7xL+8DzlHTGezQezLTOnj4+O2WCwmnyBxn7JDHue32Wz/uFXGsYr4eBlxPOPYSPlsS65VMcplOrvP/WLx/J/7DsVDP+uy7YPWieVxIw7b4HsqwodzYS8G2H69WOp2VLZiLHd9XrtUczvt6Vh2KF57XUNdaU/+9RzIeh0D2VfWuVrreH3oMt3mXO+t3bx2tF3tl4zj1t32oTg++R/19JrCtqjs7HUP9fM4si7sD6/peuuASjeur6v+tl3ct4nHbpOfdYygf7nslFWRsIf6qRpflV95swDbX5WZZ6oYNGTIkCFDhgx5c2W727bf+eKXX7UaH6nsdru2Xm1etRqt7Xatbb4N9BgyZMiQIW+s3HpCuLX97CyCaa3dPN4uQL5JydxrUMfZMCSanCVr0MWgjUEzAj0ElU3YVG0g2FqBoGyDQVnqk38hKUjEUn+TcCFi/C5dE2u5n8ecEpRk2/y+3wpczHXbOO3mcxW4bUDX/VMBqKzLQDGfpX/kOZIus9mzd5HGVj0AvgccE4xlXxh8jI+T/PHvAS0rwNA+Q1vxt8pX2X72K+usyJiKuEh5FZHieykE5qu+NvBcAf/8y/Yxq5V1+TmWbVKRejMWuE6WY8lRydEnsShjmfGEm0HyDlvqtVgs2nq9nt4/y2ONeYRxiNrT09MbxGeOLg55OZs9fbf55eXldM9ms5lI0ZOTk3Z2dtbm83l5VH/qS8YyCV9+ZqwhMM/jolt7dqoBY17l/yZj+NvzSE0SClUcfPLkSbu8vNyLp4vFYi+7nDF1tVpNtiJBfnJy0pbLZTs+Pm7r9bqt1+vpHcOttb33El9fX++973i5XE724xwR3+Hx4B9GHCt6JBHjtK9VMZ+xstqIUpEe1XMplxt3LBV5Qh9gP/v+nu6ewxl34oMVWUZip0dEs0z+c30R+yXL5OaA3OuxlmcZp1mHP1cbZRyjPMb82f3tOjhX+Z9jNf2C5XCOr4h+i/u6IlcZMw6tb2iXihis6uzNoz07eLzYjr3xx8041eYYb6ShLz9vvvZawvNkr70R+2fVdrfFpLvL8KtM+JoT6l21m/f19KFf2saVf7tvHddsL56W4ferDxkyZMiQIUPeTNltd+1Xf/lXX7UaH6lst9v2sz/5mVetxtPjon/qF1+1FkOGDBky5A2Wk+ff8noL35/YWg2i8N2qJycn0+8hBAhymrhJlrABax6pmTJN1AUEzV8CPSFJmUHX2k1glWRGyk5dBMoI6rNtJCVIshDIM2BqQLbKEmF5eS6gmd9/SrAv/ZXPtL2Pge0RCLEBwTYeW5u/fkdmJO3pEQE9wNTgM/snfUwgjmUQbCRozPtMbpsc4L2VTaIb66UYNKfPVZkvh4BJZ61EX/oJ/Z9+6PoqoJU+Q33tL/m92tRBAsVjkgB++sw25neWQ3LDmYcRXjcgbJvyu+NA1bd8ppf5GJ19jfaP7+Zds+v1up2fn0+kcGtPM1Hv3r3b1uv1lJV6dHQ0EdHp7xCTtHkyc9mOo6On79Jl5mNix2w223uHbnRer9dtNntKnIZgrkiPxHmf1EDwPaRnYk3aGFtVx+wzlqSc1MEYzs00zM7nmMiR0ev1ui0Wi+ndyI8fP558hf6aOqlv5rTFYjEdvb3ZbCZ9Wmt7BGNsQwLcfhQ9M5dVxOCLCscayzdp4RjlMVARVo4zJlgc26p2WtfenMbv3kBiPT1WXZ9jd6QigNnGai5xPKwIq2ruPNQ++kqvLs/3Vds9R1ftr+r1nOa+si14X/WMCXb/7T3rjVW5h/HEtrNOVbyn/o79la1Yhv2dmw+rOYF/WUdvPui1oRrD7kPahvc57tNv+FxvvqV4jqvGvsVtYH3VBsvKP6sx7o0N3iCUZ7nGoa6OI9VmGK/bM7d4DPZsX60XenYaMmTIkCFDhrxZ8vW3322b9abNF/NXrcpHItvrbbu8uHzVarS2a609uXyaKVz8v3TIkCFDhgz5qOXWE8IGhwgytXaTNCKokvcuhqQkyFqB4QTTnK0S6RFBrbWJuM7zBNwI5hv4P1RmhO0ywUV9nXFTZS4R3CIhbhDOIFiOeqV+vcwgg3S2SwVYsky+b9Fgr8tkvaw/99qOsRPBUBM0JhINhBsoT93V++aoewXaVeBkDxCtNh+wnkMgofuTzxr4JNDqo7jd5/aFHjDpsWewmH1Rgbqt7b+DtWoTn2VGkrPtoguzaa1rnnWbDpH+9m2Dwbb1IXuxDBMd3NTid4qHrAxhGyLw8vKy3b9/f8pgbe3Zsct5j+9ms7kRO0MMs83RhxnqaU/eb8txRdKDfWW7ezOJM/7oE9zck5iReJq/ySB2nHO89dHX+a16b3FFGrEdzNYmQeDMtdiZ97XW2mq1apeXl1OmbzLFT05OJn8N4R6yOFnEmVNIMqR8++A3QiDYx92PvIcEV3WPyZJINWZpK8dg62Xdqt/4uwnTas5kGxije8RvvnuO5zWPKbc3bT5E+lRt4W+0W7URqZoDXXdVj9toAizPs51VG932Q2szz33VeqWqo5pjPc9W6yg/47J7cy9/P0TsuQ+qsnvPem3Qm9Ptg15Lef5n3fZd28/x33bzOO6R/9Ylv3Eutx/YDi6XupustU353eOz52Nep9g29quq/xKzc181xrnhkjGHGxG/kXg+ZMiQIUOGDLkd8uv/5J+18/OL9rFbSgj/1j//7fblf/l7r1qNp/L3P9fan//Trc1vPSQ/ZMiQIUO+DeXWzz4BVkIwEPgIqUfwO8SAy4j4yGMf6xsisMoMzH18LyXLyjUDofkcnfkcQStnmVQAW0WspNweKEpA0iSoQckqq5b3mrAxeGcSfLfbJ4OjCzPiKLSFQbmUycxUZ6HwPtqSOube3B/iKfWzztThTC2TVSTKbRf2fw9srwDZQ1lTziri73meWef8yzayrlx/XraT+yt1Z9xUpILBWYOkvG4CwyA2/dH2t0+7vdyQUAHNziCjva0j7WZb+V5frzLVLBk7jGexL0H2EL7OnGVdu92ubTab9v77709ZrCEZc2w0fTZELyVHGsce6/W6LZfLaVykjLzvlwSljykmWZ82Js7Hj1hnYk/I7ujMDH6+uzftYx8eItUS96NDFa9TTrJ17buttXZ5edkuLy8nn0u8ODk5mY6HzjuEMz5TH7N86dshgmezp0fSL5fLdnR0NP2lnzhehJzmsePJ/v6wUsUDx17PT7SRY3SP+HI9HK+MBY57+ctxz3+VXo4bnk/dzmo892Kxr3F+cCzjXMC5xPOV41IVv9xezlskldh+xqtqMxnHgcX9WNnYv/lzVWb13f7BTUv+rcryZHleE9geXoO5/62/TxHhaS8u1zav+ov3WXc+X82JvfZFDo1l3+95mD7o+7mWcL9z/dZrQ8qgPSpdqH91ogjv760J2Wcp1wR3taGDetkvPD+wHLfF440bWHvr+syHtGG1nh4yZMiQIUOGDLktstvt2j/6hz/frjZXr1qVp/LuB6198Ki1T37Xq9ZkyJAhQ4a8gXLrCWHKbrebSAZnnZmwMwhbZfS1tv8+tAqACkCTa7zfpE4kZbX2DLgK+J9rJDKTOUadCApXQvCHZBdtVWVb5S+P4W6tTeASCXLbMGQGQeUQOiRVCZBVx0xT9zxPMdhqkI0gvEl1A6C2UdpvoDLC93iyjgpIJTlhn/NvEYPO0f15gGOup1z6k4F7PmeSgc9EP5NQPj63AjWreiriwnbhMybb8hu/m5gzgO420fbOIvZYrvqf4zbjoQfGmpA5pJNjj0ndCvA3aZMs19baNBZJOoQ0jISAnM1mEyH5wQcftPPz84lYnc2eZvSenZ218/Pzyc48DjnlV20MiRkf4rtrTfrQprE1xw7fhRiCtCJBjo6O2unpaVssFm2xWExxn6Twer3eO1Y/MYrZwoz7JIGZcc1YXpE0yaTmUdjMrA6xzhgSHaJX9M+Y9vvb837g7XY7vTuYxE9syRMTkvEdu/II8Bwh7qOlX1Z6hBGl2jR0iNjpjcvc61jE2OOxVsVDx5eIN2VRL85r1Rh3vHa891ycMenYztgQnTjmXL/b6vHJOMW4xznQZVU2d1ui44uQUZW9KwLNNqQdbHvGRc6JjJXsM8d8rrds2+p5x3gfV91bc7hvHeN7Y6HnS4w/9h3b3J/9+g7LoTFUjc2qP2kTbjCjHrzuMWo7eD1Z+Vv6s1rXVWuiSnf7k5/h+K3ma+vXW/Pwfq9lHM/oj9X4Yjs9boYMGTJkyJAhQ26b7Ha79guf+cft//f/+YlXrcoz+eq7rf2zLw5CeMiQIUOGvBK59YQwiVeKARaKszdb29/xXwGbAe9zjeCgiWLWSSCIulknHoFs/Z25ECA3ded5A838ndcrAI+AWQgcAptpgwlRk1IEyAyepl7bq5clQh0JXLvOCix2f7PsisDtgY+0u/uhAo0NopvUc/96Y0DV5+6r1moy04C/yzN5y+OVSUywbanLhCvbUmWzOfvHpI/19H09giBlV+Cpy678w/3l+mlXH7Vs/Uh6eOMBbV+ROs7s8VHXlB6Qy2zOjFf2A4kN6kcAO7/lPbqXl5cTIZz78q7by8vLG8cNZ0xut9sbR4dHQnqm7sTS2C+ZvSGhQzh7k4Y3ivA0gmRN8Qjo/KOPh+zdbDaTn/fAfvej5wjGpbQrcwsJ2NlsNhHhqdttWSwW7c6dO5OOyTJeLBZ7beR776N/vueY6N1udyNbO6QvbblcLvfGCseVx+fLShWPewQV76NvkkDJb70yGB+qskmupK/yHIkuzxWOKxVZxDVItUGGwuz2np62g+3D+rk5w31n4svrG9rB/l+thapNN73nKhKLBKDr8PzAvyZ+2caeXTg/pQy21zaiHblueZ7vVf3MuP+8+byaq+3zlV3tH15n9taSPX/2Gs3tbK3d2CDC2FyNi2r8VOXmd2+sqO6p7GA/9zMsqyKcbW//f6LX7xkLXP9Ua8vMcVwzPK991J1t9bqqN4Zcbu+3IUOGDBkyZMiQ1112u137x//oF9t/8aN/uT188OhVq7Mvn/2fWvsT3/+qtRgyZMiQIW+g3HpCOCCMyRuC5iEECOgbzKl21BMsS0ZVAH2WT+Aw9xtsOwQiUq/qKDjqGUCIwD/vr8SAN49zJggXe1JHAsC5n2RRZS/2jUFK/otu+UvQ2Fk2zkCk/Vm2bWEwrAJa2We0lYFJZmQZSGY/VXaILQ+Ryvzr59g22oW/RyoigEJwPOX6Hdppl/vZNqlIA5bBNhkYNThuILYCkKMPQVj6sclrjiOD8+xXkrut7RM3HOMsx0RIyq7GbgX2u7/4uwmPSna73V52qP3PPsZM79Q1n8/3jiZerVbtyZMnUwZt3h+c9/6GcA2JS7/h8c3JzE09fOdwrueabcBrsUeI3cSexGPGo9g5eiSTtrWnWbQhnHl8MvvXdac/c4/nD5IKHtv2m1y7urqaiHX2d0js1EHSmPGGmcUm5z2GYhv6R8q4urpqy+Vy72SG1vYziT8sicB+dzx0bPL86RhQzc8mbUyaVPM4+8Dzlu9lmSbVvCnGsZXlOf5UY9/6OUb1SDTq4vjoeN6LIY4v1XrFdvX8R/HcxjnVdjeR2Bs71LO3hvImIsfi1uoNVLad7VjFbdqWfZBnos/z+q8i+329tzmqEq9benMP66NP0haM0T0/r3yW7anmu6qMqh22A/s5bcoGIOpbzcfU50Xqpw6OBdGrile9k0Wok/9fwLVS7vUYYj+yLI9brqHsu0OGDBkyZMiQIZH1et3e/srb7WPf+R2vWpVvmvzuv/y99l/8n/9Se/jBw1etyk35zX/Z2vW2teP+STxDhgwZMmTIRyG3nhDuZUHsdruJAOHRqSSPA65XQFrEpBlJQUsPgDYgZcKK7TChY51MAJNgY9sIEvmdlwZM850ZINGZRKyJQfaBwd+00cdFEzTldwpJCv6ezyZA0k6Tzxb3B22SZwxEkrCtQDn3M+smEeP+dl2s022pgOWKyK/A/Xzm7xV4afKA73Cm/rGDSdUeScJxZ2CUQK4JqBxZ7rZnDGYcuO3205TTI5bYNrbJmbT208oP+Jnt4u/MBPZmCNrMZE81ThwfDFTHj0gc+r2CISHTHw8fPmwffPBBW6/Xe30dMjhHFdNXQion5iZrlaRxa0/J0PV6vTe+83c+n08bbRiHWE/aZb9JHNtsNhMJXPXb1dVVW61WbbVaTRnCKZNktsnd3pg04RKfJBlm4mi73baLi4tp7skmCWcaxy+Y/e2y+E7j3B8fi47MCKa/M/aQPOQc1yNMXkTcv1VMiM7sSz9DPfjd49MkXK889mE+e1NOxmfsZLLNZTJ+VXGd47gXU6s4yTmyIpqq39hu6mS7V2sR94c3BFT1V2sG9m210crrtErse5Wd/JmbcahDz79sR/tbz86H/Mvrm2qNUdXj+ZTP0r6W3jiNvp73qrFt/+C9XrdYvypecE5K220j25Jzdm88UA+v0yo7sGzOcdSRcaSaz3Od8YBxmCd6+HmvL3q2r9YJbFc+09be9OiyrM83EsuHDBkyZMiQIbdHzp9ctN/89S+0/8X/8n/+qlX5pshqtWr/t//r/6M9+HYkg1tr7Zf/eWtf+Xpr/8r3vGpNhgwZMmTIGya3nhCuQJ0QcQYhCcjkdwIwBE5IBLR2812fFcDF5wmgmUg0sUzygkCc22eQjQBXdDTJmzKSUWZiwAAnyQzbxyRV6iHwaEDPmb7UPfdTeBR2niHRYhtVADjLpd1chsmetJG+0wPyDLhWIFxsSRLfvhY9KuCYZYTYTPk5+tYAJ/uc/mP/or/wnZUE79nnFI4J+18F/rK8tLEaJ/RL2tOgtoFPkjU+5px6pE7qbBDWtmPfsC4/Qx/c7XZ7xK/7h3qZ3Kz80cCv62Qf+b22rbW9jNnUyyPY89tsNmvn5+ft8ePH0xHOm81m7+jl6LzbPTudINms7hsTaRx/jmd8dy83fDjD1SRKSOT4TUjr+Xx+I26k7cnS3e12bbFYTPd6fLOfsgmBfeNYF51M9uf6crncG2vMwGfsps8x+zl1MkalrMVisTcGvKlms9m0zWbTFovF3jHa0SEZ12xvRUD1pIrDjrss33MCxz3b77HOuipixc9QF85rVSzPuG2t3SCJXYfHu687hkS4Saq1m/HeNj0kJqkr8to24li0nrRHjwCMzm63y/DnQyQ5Y4X96BAp6njKtQvvNenNONUrk/bq2akquxKvCXLNGwioh/uV7cznXp2MC/Rpk6nVuq21tjcGHO+oZ+xd2TLt8qkKHH/0UT8fu/KZyKE5sbI521yNsyomOO5UvmI727bUtRqLFse/3JONrbyPNqridlX+8+LJkCFDhgwZMmTI6yS73a798uc+337ps7/yqlXpy3rTWvFKsCFDhgwZMuSjlltPCLd2k8glgESw0BlUBLMM8LJcEy8Ej/juX74zkr8TFDLQahIo96dM1tfTi0AQ7zk+Pp4InQq4pk0qYJntMojodpp4MQhOkqgiB2ifyub5HLKlKiv9bfCMfWMwkWWzTBMSbJPb7N/9Pmhm/FUEGfvfAGOej24metLP9gECrQZAmeGZe03mWq+0m9dz7G3s5awdHstrMqIqkxs5mNVfAZ62kTeDuI/tI7aLCRHqVmUluT9ph+hBko++5A0R7KdKtx7o3VrbI/XiZ5vNprXWJnJ0t3uauZvsXh61medyFHRrrT1+/HjKoo3u8/l873221DE258aH4+PjKRt4vV5P79C1D1xeXk46zefz6SjQxMLo5zHpDTOMl8fHx225XE6ZwnnPsvVNJjPtnw0S+Zx7qs1Dfk0B/SQZyHnWJLFjF/3FYzBEedpLu7Dv2FfMGk7dqZOEMdvAmODx9SJSEQ4V6ZPrtJ3Heq5ZD8aLqm7ONX7Wz1Vx2GOfuvEz/bF3vdI9OtIX8xtjLdtBoojzIp/j9Urv3OeYHB0q4spzUUUSV7HSfX3I/i63qtPEd65Xc1U1r9ke7CPX3VsL2i5eV/I3tq963nbzNdvLc5ltbj/mfOwNa7vdbi82VOR+tWEi8ZL2q9ZObJPb7pjXWwf4mcrvXD7b581Jh57z2ryKL+zHQ7biM4nZub9aqx7yM+qeeZUbAqt44TFc2XvIkCFDhgwZMuS2yGa9af/tf/O3Juzj21Kutq39sy+19od//4cvYzZr7ez0m6bSkCFDhgx5M+TWE8IGDgOGMMMxQEmOR/W9BOorADt1BEwlMFaB1bmHYBzBr1xzOQSzDCKR8IguBq/Yjtlsn7DrgYl+NqBxyiDZ4cxK6mGw2QQys/5y/RDxZRDYwC3vZ50kJivi2GBxRW4TbHedtJsB6Kod9jETCSbXKkDezwUcpJ3sXxG2j9mjJMpzH9tTbVyoQHiDzswKqtpbkRG8j8Cns216wH70TvYl/5lg5TiqANIKLE4ZJm9ohwgzb00iRqgX+y/lsUyOqUrX6+vr6f24Afo55gio85p1DyE7m83aw4cP28XFxd598/m8nZ6etsVi0TabzR7gbH/P35CpuWe5XE6ZquljHl+ecvKuXx5He3R0NL2X2PagD4TsJMG83W6nOh3Hchxz9T7K2Cx1cNxlPuF1g/Pp32Q55/Nqtdrzj9zPvkmf5nqOjk7709c5Ajv3kfRPW1NXSArPf+kv+tzLisc1/eFQDOezFZlIQq+adxk3WBbnBJM3HHc9PRnf3E7HSddvW7B9VTmMq441KafaWOJxwH61DrnW2xD1PLKoN0exPdSVtvD91ZrDfV4RaLQT40plD/s111jUNzbjtWqtwHJ7BKX1b23fZ2lrl+v5vfJZiu1A/f3ZBC/n154uVbsd671RimPCa5eqDWxHbx5xH1d6UAf2Z6WD153cZMi6qzFU2cn106+ip9ey9sVqXeXP1Tjw2ovrrirWPM9vhwwZMmTIkCFDXif5pc/9SvvVX/n1V63GYbm+bu3Xfru1/93/5sOXcfestT/5A619+ivfPL2GDBkyZMitl1tPCLd28/1rBndNEuV6jwAmeMr71+v1VJ8zZ1trNwAg6lYRDAREnbXGrNbcn+d3u/0jaZ3Z4M9sh4FOZ4bafq4/v0dIurouAmr83aQL7cfned02tuQZZpZWx+eG7HAGB23GfurZpPI5Ejpuf+/907QJ763am37nNfqJCQyDgBXQXNm9ysjKtfhLCCYDpN4E4exlt4N9500a1tH9YALHAC3HFNtvEpbjv9r0EJA5Oue7Cb0IY4tB94okZr0ep7xW+T2zRXPsMm1AkjAEIcdi4g2JzkePHrXz8/OJmE2m7XK5bGdnZ3uxkP7D+GebXF9ft9PT072xmfqjWwjTZL3O5/OJzDXhk3v4DuS0c7lctuVyuddfsVGI1WRMp9zNZtPm8/nUf8msNiGcuqs4wfFW+Vjavdvtps066Yf4vt8VHL+J3jymO89cXV21s7OzvTmBGb/MIndmcEUcsW9eVl6E1Knur4iPKraY1GHMY+zh3Jq/3mDAMq17Fac5j1XzYu5zXOG9vc1JlY2qWBCp5mzr/zzp2Zxx2jrxGp+t1iksj7Y4NH9HON6qsqrY7fWUyTX2OeMQbWohwV7Nh5Xu1JW2pC5ek9J3WYbXcz17Me70YhPjVzaZVDHKdXjcug+r+cx9xc8VYevx2vM9l89rvt/re495r5UYd93+Q+uP2DzzaxVPUiZjgO3suiq75i///+ANGJZDfjpkyJAhQ4YMGfI6yuXFZftv/5u/9aE2Mn/LZb1pbbd7mun7YWQ2a+3k5f9fPmTIkCFD3mw5ev4tr7cYQApwnmsEKEPgEpwx0JW/JJMCngUkNzCYZypwOjr6ORIy+Wwgj22LPv6N4JWJhWSwbbfbKUuttTYdMWqgK8/MZrOJWMpzuUaSgWQwbU1izyCWQUaCdWxLADZnEZEk4T0mfmmj6GSy2oArfcA60dYs/3mgL/uP/et+pH8QMLTv+Dnaxr5EvXxUqIFytsWkKIkiCsdayuPx1qy7Aqdpf5O2PhrboDTtZMCThCyvs40EU12X227fqYD5lMf+yfgzgG2fq7737rWkD0j2sY0+frm1NsW0jCXreX5+PmUI05YnJydtsVhMz4a05Zg0MZR7N5tNu7y8nI6R5vuMY2O+ozffGdPpS7ZJ+ihl+FjkZAgn89a2dzw0CWW/JOHrtkeftCXfYy++yz3PMsamDrbBmyVWq9VenyyXy+k98RXhFB3SX56P4u98Z3HG9otIFY9YblUXY7rHX0WG0BdN/lFvx0heo705Z3Eei+25CcYZgOxbz530IbanImbct+yrfOdpEJUdM/ZJeFlX61CV4fnQxJnnlqrPGGdo00Ptpw7VGox1eU73nFnVl+e4RquOSLdtq36x3zKOVbZk+dyY4Wf4/dC8V80VvM7PLi8625fZTs510dvzX3zN/sM6LPSnygdZt/288l+PK97vNSP9mWVwg1S1dnNsdpziPEvf6o3RylZVeV4Hs29if9qA8YpxMnr7+SFDhgwZMmTImy0P3n/YxRZeF3n7q++0L/yz33rVaryY/A//Y2vnl69aiyFDhgwZ8obJG4MAmOjNXwLfBkcMwBugaa1NREIAfe/GZ2Yfswj9G/8SaDbglPtC5vAYWJNVPSC3Alf5u0Hb6G3gnGLC1QAg210RdX7/HMXAPYFT6x27VKS+wTBn4dFXWDfBNJZLcN0bCgxYm4wwUMjv9kWSE24XQVsTadTZfmnQ2O1P3c7yJZDIskwO2mb0adqWvxnctq/2AHPqUvkNgWT3I/3d9qbP8Cj5igCmTd2HvkbyP/7ldnvMsj8PgfsW91HIRh4VbD0M9CerKUdCb7fbdnFxMb1DmGC+wfNk4y4Wi713lceXcuxxa20i7Xa7XVutVlM2cO6Zz+fT+293u91E3rrPqItjWbJ81+v1VP96vZ7a4s0CPsq+Ij6cScf4QyLOcYpjN/ptt9tJt91ut3ecNP07esQ+BPfz+3w+b/fu3ds7Gjt6xLa0Wergu6FZZu4hwfoyUvltjwDpkTWVf/fGRXT2znCOJcZm2sj/TOZU5I7nB/pO1cbobxKLv6WsxOEeSXQo/tGG9AGWU9nI7XI/2B5um/uX6xn22/PakX7stcGxz/NZZV+2qbK35zy2MfdWax7+HqFPVHa0vfPdPkkd6Jcpu/KxylbVfMlx0JtL2K6Uw40v3mhB/VwG1yQsi31nX6rWO9V4pG3cHxwL7BvX73LsE/ap583X7gfHLcYg9kcVH+w3tnf8slq3cw1DnenHQ4YMGTJkyJA3W/7RP/z513ptsNvt2i985n9s508uXrUqLybrTWuvN/8+ZMiQIUNeQ7n1R0ZXACMzyzabzR6Jtts9e78vQVICbK3tH/lJIKkCbfie3Xw3KFqBpHx/awVy9cBdA1CsI20xQesySNBWQB/rDahGspAkB4E0HgVsANXkgAFb3kfSJUfGEmhzHxn4Yl8QVKUfkFhi+11u7k3baH/qbTCZGwiYZW6Q234VIod2p+/aN21f6l2B1DyyuwK5DWTa9+hf3kBgsDXXeJRx7EG/9xG2bAPHA0nN9IM3VqQu+mLsxCMd6Seuk/7Q63PeYzs4O8f3Gij2OMv9PQKF+pukDam32WzacrncA+d9L9t4cnLSlstlW6/X7cmTJ3vE5Ww22yNsGQvynWM6x5KG0E1m8WazuRGTQkByAwzJ7RwFzTabrGCsItnKTTm73VMydL1e34hhjvVV3+c6dQxhbJ1SJ/2J/UgQP88dHR3tZQ+nL0NoJ56EDG6tTZtecnx2ykq8oW5sEze3pM3JNs4YeZkjo3skBmOXxzOfcxx2LPc86HFqW7vOSI8k9DjObxzPvN9xyqSL5/6eH1RzJcd9tdkn7bCdaX/HjKoMx/2eTSu78F7alHNNynFco06ee6t5sQdYVXMTbdCzh0lRkoGOzdU1xm2WX82TbGe1vrIvuH9cV+6r2mXbMnZVtsjvFble1U2d7a/VOqqKO5TKBv79eb7amyMrf3DcqeKJ+5nzSVVupXNip+3njUMuz/7BZ3p1cyMFhe14ns5DhgwZMmTIkDdLDmELr4NcX1+3n/3Jz7xqNYYMGTJkyJBva7n1hHBr+wRnlTFkgo1AGUm+EBYpx4AkySQCpgSsc7+B2wq0qsDH6EfdW9t/5y0BTLYpeuV79CdxYnCJGQYV8Z17DfgTzDUp4/oNntK+VZsNsBrM433sa4KuBv/cJybhY2uTTJEA8wY5acvKv9hO+kuVfVX1j3+PD5LgpL1py4pQZpkGitk+g/UkKGhTPh8CML/z3bAmJCub2YfYBvoRSW4TFvZz2rIHjFbgqzP/WUf8zqA/73/e+xmtW/rD8aBqT6U7+zUZowb3e4B9rpFIffTo0Y2jjU9OTtqdO3fakydPJt/OPSFJl8vlng1DDDO7ndlfIXtjU8aEPB/fcnwOQRq/zLMmR5ll21qb3iHMI5krMif24eYa+iHjvckHlpVnjo+P22Kx2POP3Dufz9tqtdorgz7OuvLu481m0zabzfRuZpK8lc7ui6Ojo+kEjNiTxxNz7nqeVKQPdT/0OzfN0F8Zi6kTx1Y1D1e2dyzkZ5M+bLPnQj7ro1spngv4zlaTWdk0wbJZZo84pQ9aB/tgPldrkF4f+rvjs4lu1+/7GYM4zns6V+sOztV8pirTY4d69GJzb/7vCX3VxF9Vp22aOTLXDs2D1TrO16o2ec1l/6O9bJ+qTG+OqHygWhu6X1hGpcOha7Y/y0xfcO3lNTqfdxs55g+ND7bN/eh1Yu9v+sPrifxGe3rcPa9s+ki1mW3IkCFDhgwZMuR1lC9+4UvtX/6LL79qNV5cdrvWdq9vRvaQIUOGDHk95dYTwtfX122xWEwgDAFgAiHM1iHQH8nvBHZyPcASyQ+CKymPQE0A4ByHWoFtFVBu4oaAOe+tMgf4L0CziVcCgiHPQ1awLSyTRAMzEiowL+A2pQL/eI/JaP/urOOAZwS88teETnSvMijS7pRpEJT9ZLLVYqAxfkRbWo+A2mxf7iOBFj0MONPuvM86GSjMvSYZ7Bu8j+OnqoMEd9pEYNYApu3L8ujDtEtFwFQkADML8yw3c1TjhZmUtLHJFIPktrlJ9NjCelftc1mxa5UdxvpIzKaujMOjo6O9Y+fZnpCi7u/NZtMeP37cVqvVZBcSMCnD7yJOJn+OnU5ma2I0nzs9PW2Xl0/fpZN4yvFa+YjJW/ZfiMLWWlssFtO7ckMqs09JYNv/vOHBPh1bVz5vfz5EECT2JCua5GT0qMZNYgMJjqOjo8nmsROJYbabz7E/eE/KrAiYnnhM0Z7sT8+FFZnk+dFxg7Gbz+Se2N5zCscs6+dzbIuJPcbGQ/3uvovPRGwjk9GVbdn+PMPy8vfQO2qjG8uyv3sd0tOril2O29Srt5HKNq/6wbHRcayaM3r1sO/cfrezso3n6t7cRdtVY7+KHY5rjn/UwxsOKltSL98XHatNSH6W5XK+TRmUKh57DPVI1qrP+EzlHyZ8q37x/Olx4fjD9a5PWKAde/7JNvs1Cr1nI721Kk+6qXy85xdsv9s5ZMiQIUOGDBnyOsov/8Ln28X5a3JcdGutff2D1v7xr7X27/3br1qTIUOGDBnyBsmtJ4R7GQAEdQkWkQAJION3ZaZckmAkOitiLs/6nZIRg4UBrHtAap4l+UzQPve5nNQVnQj69wBcA1DUNyCoAUTeR8CpAhYPgcAmvyuwyyRxdSQ3yyaQmt8NaPMduM66pW7RJQQSgXQDzf6dOlGPCqylP9rPqDNtxf4wiZE6mbGbZyvdWYZtSUKz0o1j0IQDbemj2+kvbLvBc9vRz0bHKvPSILH7z+VW9q+A1GrzgQmAiMc1AW4eLenMpB4BQvEY2u3235lMMrS1p0Sx34Xe2v67dHe7XTs/P2+Xl5d7795NOTzOPc+s1+vpfb273W4iZKlPjqDOM8fHx221Wu3pGh9Kli/JV9ry+vq6LZfLG5uA6BPZkBPZbrfTe4lZVgXQkzylbUgKJ+O2ird5LvagLRiLTex6k0YVS/0M5yrGMZaR9vCdpbHD0dHRdIw22/2yBEIV/3ukajUmKt9mux0nq+xI+4HtWulTkTK2vfurNzZ74zR+7dhLnbwpgO2xOOY4jh7qP7bbWfmH1gaeH+nHvJ5y2A+xgf3Y9VTt4fdq047nGdvdcz/b05tPuBHQ7XO/8D6vG9gO68q/+Ux79DZ+sT0muGl36lv5hX3fawrrX8UmP1/Z2tfsR1X7ev5Ln2D77Ue8p+rDSm/3j3+nL7JtvpebUWwr+ifXXR7z+Vxt0HG8sN2qNZhtPWTIkCFDhgwZ8jrKbrdrv/5P/tmrVuPl5Pq6tfPV8+8bMmTIkCFDvonyRhDCBuNM+kYq4CrAZmvPMjZ5T5V5QMKh0iVgOwEakssVqUryxhlgPcKjAiRTHutIRlzK7L1DNm3ogVz5nceRVkfdVc8ZkA+pYjKDZVC3Hhht/VOnge48k3p5nPFstn/cMbP0qAuPFzfIabCbfUo/IkhHkLBHMPs9nlWbWadtYN3cZvp3RYhX4KevBTyvAH6PNY431pv6qsxEltUjW30fx1vqqGxPPViux7b1jK4VIM/6mLHH9lbl06Y8YpZttZCAuL6+bvP5vO12u+loYh4Jz77Ibxzry+VyInIfP37cLi8vp+OVcwTzbDabCOWQi2y7Nw/kOcbLZA0vl8u9UwxC/noDz3q9btfX1+3k5GSyC/07PpXfOW5JgO52u+mY5ejmviGZnvHOuJ7nHM8Sb6qjxE1irtfrvf7jWMs9jFf2T46jHB/N2OK5xr7d2v6cEdI611nny4rJp4qgc6zkc4fKzf1pYy9GeVz79AtvErOOHBNVvGM9jmH+m3upr3VlXIuv9YijF+2X3vxU2afnI2kX7/X1Q/W4z6r7Yt+K/KStK3LOfcP+8hxEu1T6VPpV/V/p2JuP7Csuw/3fsxXnbn52WRXR6jWH9eB3zxEcqzyev2pjVRavub+r+irbs025P2t8+wftZr0qX+RcVa0rqjUMbc/PjvnUnbGwih+O62yP2++4xDojXI/5tyFDhgwZMmTIkNdZ3vv6e+3X/+k/f9VqDBkyZMiQId/2cusJYYLxBoQMtAaUYcZra/VRoq3V7x42UM+sxNbalGlF0IngD8szAUlgiKRTBRg5syUSosSAO4lJ10VgMveQqGBmJ8F0ZwnS9ik77fTvIXacRUjiLrryPcqz2WyPtKnAxejJv7Enj6SlDxmkJWnn/qd+JI/tfySDCAjGhwz+Vn1LsX/YXvRP6uOjp1lX5d9pFzcc2NYVyGj9K0KqIoloL47ZCjBmG9h2b+YwUeO+MTGTsvk94vHJv2xjrvndyfQjA+WxJ/VmvOBY7sn19fX0LtlkoJ6cnLT5fN4Wi8VEfJJA3W63bblc7sUF6rFardrFxcUeSTubzdpyuWzL5bItFotpXJu4NpnCmJL4ul6vJ5KBMTR10Dcd9+wnuR4ym+/HTRnpk2Q8z+fzqU9IwlUbEkzCtNb25hCT4hxPJs+vrq6mLGWSLfaRlJF3JnMDjPXIffP5fC/7O7rnX3RmbOQrA2jrlyURbDPGI5OKjiW0Z4+IManD8no65J6qj/ycY2mkyrbzZ45b+yrb6PhRtaGKjdW8UBFrPZt5rqz6oRLHTm+uaa3d2ADh8hk7aCvW7zbTZzgmHcdtuyp+V886rnj+51/W4deJRLw+yzUS+16Tef1Qze0mKam757je3GLpbWCKDlVbejZnn7J8tt/rNcdz/qWY3HabspnQbanmHLfxeW2yn7As3+9yKdUaoxqHrPeQfT3Oe3bkO8lZ1yCGhwwZMmTIkCGvu9x/9/325NHjV63GkCFDhgwZ8m0vbwQhXJFnBkG9u761m1mDAdNJNhAESpkkmX0vgWCKSUxnK4XQyL0hCgyiEiA10GzANnX4PaEs0+ByADwTG86KYMYcwU2DvM6QSx0GVklgsj6SCtUz7GuDrARV2Sbq4Xa4LSyfoCB/z/18b3CuV++pNlDJtruNJspJMFI361+BrfYl2rC1NmVOe8OEwVMTzBVAyvry2e9+Nqlhmx6yW0ie6MuyTEIQLDfIa3/N73yvq21Y/Y2eJncpjj2H7Edf87NVmdFzPp9PmaPJFs5Gl+hKwjT976Ppr66u2vn5+Y1s1mTh8jjnxBj6XbJOY0/6WbJao0syhvM9EqI0Yyt2cWzKvyrzPJtAQsSu1+up/XwHckX2MHZSSKxzQ0h+47HcjEvUzeV5Q0M2zITANuGTMnkShU8TSLnMqM5GAc4J3JTjuPsy4jFI+1TEDfvNhEhFhLV2My6kDRzXtGOe4Tj2GPVYNBFX2aHaqFDpTl/ks3xnfa55jqnsYH3Yrt5GJxNZ1LOa63obkqwT4061pujp7DK8VnO/mTitYm+18ajSp1qjeF2Q++ILmWfYRpfNdYT90jZ3GYfWQp6n2L78XtnahKptnHp4H+OLxwbnbuvBtlfjmHZhuZ5/HW97Y7s3z1cbLxzj0u70q8dXrntDgtcOec6vAGDd1IllRTwGopuvMS5U80Dud3s5p9NnhgwZMmTIkCFDXlf53M/+47Zeb161GkOGDBkyZMi3vdx6Qpggk8Fggok5JpSEWsBoZrnkcwBAAuqss7WbgKXBM4JDFfFoAthZTBWYmO/MdO0RRSZpU1cFhJkUIABbAXcEn/ibj1UmYJjyCKyZsK3AYdqBehF4tX38XJ5lJp6PtyXYxufYFmZL0wdYX9pjIjzPh+jqkaAVGUgA1YQAfd9AddXPPjKcZfEvbUA9bBf2KdvJLEjbKvamUF8TSSbRmclvINRjqZeVVJF97oeefXvkE+1MEpr3GYw2eFxt3DgkJJd2u2dZuIxPjj0hQHnEcmtPydrlctl2u11brVZ7zwT8jj0NlC+Xy70jnkOOzmazKda19jSbdbFYTLqSdGZ7SdpWcYt2ydHWy+VyKifvIc69Kfvq6mqq3zGDZftYUmbyMv4yIzy/sa9TZ69/+Y+ZwDlBohqnjH2ej3gPJbEnOvI96o7FjkHPExMT6b/nxRe2pSIvOAZsK95TxZLYhHMzdaRv+7r1zD2HjvGuNjX4voz9CGNmNU9SJ8aTaq6rfqMeFWntcqrY79jG+cMbb1y325PPnsuq/uhtEKricbVeiKRsn8hSiX2T7fFcxnFnfas1BJ+rCEdKtdmtGgush3pU47HqC8+LlX09f7ofPDfz90Mxm/3t9h7qF1/vrSPcf609812upw6VWY0r68oyvC63f1a+zfWL+6Kav1m/bcpNabSb486QIUOGDBkyZMjrJtvttj15fP6q1RgyZMiQIUNeC7n1hHCEwFJA7UjAfIJvFaCWf1U2l8FUEqj5ndlrBIqYYZLv0dEgKIFSXqeuJJSiqzPo/FwPBIxtCHgT4CIxnvIMTDoTzr8ZOHO7eiCuwfA863IqoJllBoD1EdDOFEtbs3nAWYMV4Gmgnb7gtuQZk84VcBnb03dMXuSvgWgDopU/Vf1QAZ0GNaN/BWKzHmbEU0/2R2v75ELPvvytB/zbLuxj6mtQ1G1j9hDtkt8cB+JzLrfKDvMmCP5WjQ/bw34VcSZoiNzFYrHXJ8laDSloMmo2m03HLiejNm1jP7D/7P/ROVmoqZ/kZp5LdjB9iuQq/dMbQaiLx0bs5M08uZaYl/sYo/I8+4qxg33FTHrOHcmijl6Mna3dPIki11ar1VR/sqZJXuQ3Eu2tPXv1QAjf2Ww2EeQc93zncCSxn/5ezX8vKh7HzojzOE6/mITKXxLkFRniuukD9Mne6QSOMdXYZtnU0wRhj6yJ7R1X+Dv9qCIDqzjhdldt6cVVXmNso04kPa1/JTwW2fOh67WPUHfPX+7PXt9XMZXPum+8Dqjmxqq/Pd/al1N3z6e9lvFc5nrsS253T/eenb0mcL1e91RrB9fL8Wk7P8+HPUasM09J8ek1tLnr8rrPY46fKz9zvHJf5a/nKz+fMrhRhD7Fstgu96FjF23kPkjcrPQaMmTIkCFDhgx5HWW9WrfP/sznXrUaQ4YMGTJkyGshbwQhbIDHpCRBdWdo+P2XFcljYJJAf5WJGADKYI/veV6mSkB/kr0kK6JP7s/vJIkJ9vNzhIAbyyNpTaCJQJRJkQqczH0G4CoChs8ZXDZwSXCTbaZ+zlYmScOynRnHrEK3waCcwXbaLs9E3+p7SIBkQlZZIiS42G9uA9ufZ1yfScWKAIk+9E++79n9XBE6KSP103/4nDdLuL+r/rIY5Caw7ThgXQm+h0Cs/N1jpwfOs220K+tjP1ckiMcs+7USgt9pB4HgAMTUMeXa9oyNT548aavV6gZIzzYx1jLuZRzN5/M9Mjjvftztnh4rvd1uJ/Iy5GQ278Qmld0ZB2nzEKnJAObGGR7BbNuzLtqx927q6r3cHHM+aSG68qhtl0m/CSHPGJf22Db0mYzb3Jd282j13Jf5JWVHt1yzfZ8nPR/tkWcVKWUCjf1dzdNVTHaZeb56zv5TxfVe/CFpFzE5YxKJOnjeZL2OC5VNqzhJnemX+Z36ctOKNwRYd88Tbp+v2e5uR+VT9EXax222Pao+r+o8tJngkLzoOqDny/bhqq/y1+uEajz0/IljxCS773X7PM/0+rSyDdcV9hO3kWW6zsp/SW5Wa0yWwRhZ6e5nq/nWaz/f6/u5OYnxvlob8C+F60X2bc+vrBftRZ24hnb8HDJkyJAhQ4YMed1kvd60zet6XPTlqrXdrrUDmM6QIUOGDBnyzZQ3ghAOGEWAlRktBNFb2wdRTEoZfCHwb4IrdQd8ITiU3yqQmkdWVwBigCUei2sSo5eJ4kzefDZhaBDP33k0LNvQA72qOnx/rtE+vJ9Sgb78XAF9rbW9I1ENklbgeUBHZg9WwraSNDLZyWwWAuIG5PhMlcHkjQv0lWQB9giMCInHClyubEqCoHo3Xo7vNRmQe9g3BinZNvpKxg79hJ9DEOaZQ1nFPWD1EFjP/jAB8Twyhv3qjSgu33apQONDseoQoGtd+C7o2IxgdwVCs0+vrq7aw4cP23q93mtTYuvJyUm7uLi40b7U7Y02JKSPjp5mIPN9vq09OyLa5Cn14yYPbl5xf/C3jKWrq6t2eXk5vUs42dC0QZVtVdUT8prt5N/4ETcchAjm5o6KpIi+fr+ySZSQ6YkHjCckifj+04y3+Xx+Y3ME3zVMv3pZqfw/wjjk+O8j3Dmn2L70RZ78wBhsfdinrINlOyM55XJsV+3NfVWMSbtzzXGS9zp2VTb0ePRvft5zcFVfa/ubfvKb5xiXXdnE7bPtXI4JPLbb6xy3yfGR9uitU6q5oLJnry+rOc/PUT/3kfWMrt6sZ/3Ydj5XlUed2TbGQ+pazQXV3F2VX9nhUNygX3lDRaW72xobcA0WvbmRivOE/cRzE+M1daj8sWon4zzr6Nk09aYer5HdZ6wrca+1/Q2tbKvnJNp0yJAhQ4YMGTLkdZRf/eVfbe++896rVuPDyd/5TGv/h3/vVWsxZMiQIUPeILn1hHBF5hIAzz0BUUiQtfaMbGrtGembZwgSt9b2sr5Sdp43wO/fSbARAOL7g02M5GhQlmei0EQ4QSQCbiQ8TILls4F11hvgzZmHzAZMORQSIAbHUn4FnrksA3AG+aPjIVC5Kiu/myhwOSSYCeRZr9iuIopNyuSaCRj2GcFqkh/UPQQdAUvrR5+zDSuyorJt/I3trPqR9ZHgjN+6vwjGVoSRj5+23d1ObgYx6VSR8D0A1+VXoDP1OUQ4VaC1bW49Dvk/JcTg1dXVXqzabDbT95CRJgdjL2atJk5dXFxM775lm+fz+XQktN/LyQxrxlD2X8pnPE15uXe3203ZvLRFxl9FFKVt8bO8Q5inGIRgpn/yeE3+NpvNbhCy9DOSAGk7CZrExJTD50wQ2Icjfl8r41DKTEZ0iGH6eerabDZttVq1xWKxZ2vOMfGP2OwQqWNhnKK+nHd8v8dwpPJ/Ppe+pv0Ylw6Nm948Utm+qpftTL2ur/L5iOMNY2BvDmKfem6zPVkfY7vnwGr+rHSu+sHzLGMsn+e4rAj1ap6krTkXUDjmUg/XZexTjp9qg1sV23l/zybcDEZdPX9wzeQ2VDE/9dEm3rjRI/ep6yFbuy9djtuXuOA6WRbXpYntrMNtdAx2+0n2sg7rzfHjMXrIx1mGx79jAu3K9jt+eWwzDrBd8cv4Jv//Yv1ba9O76yt/dV/Tj923vdg2ZMiQIUOGDBnyOsjV1fWNtexrI69rZvOQIUOGDHlt5dYTwpGQZQHFCaAQYGrtGXAfkIwgjTNiTAARBCKBQcCN4KABrQow9TO5Fp1ZFgE6tsMgV2v7wJKBS4NV+S1lGED3Zz9r3Z2hTSFQSwKlOpaYfw36HR09Ox43epsoMrjKdpt4cDk9cNhgqYHD2NLZLwaNbfcK6LN9K0CVZRh87AHgPrLcY8RlsZwK9HZ/7Xa7PaKJuhp8rQDzatxVftEjSFxe+ouEqP3XtjaoW9mSwLfrrt7rTV9jv1N6Y9jPuT6Cy5FkkFaZZPQhx50c9bzZbNpms2l37tyZjh4+Ojpqy+WyzefziZTc7XY3Ym/qyHtrPSZCxtIGfL6XjeUYYDKJ8YV10XetBzPNTFIwzkdMdpq4rTba2Dbu79izigPpv5DwIapzjQSKYy5jH+dFvq85uvFI6w9DILCPqs1HjpVV7GQZHqeMv7yWf9UGAhNCKbuqx2PL9bI+Psvrld0ca7jJwPdVsTbCeO95zfOddecawuOdNmF5rj/P2D89tisdUofXF47trtf9w/t6m9gqv6nKNnFW9SN1dTnsU3/2/GVbVrZmP1c+6va47kpcftUvbF9FJnoTU8rxPG2/8fjvtdv+ZN1ss57dbAv3RW/9YP/ifdUapdKxWp/25h9uuOGYdQzicf+sz/HPurDPqvXVkCFDhgwZMmTI6yS73a49evT4VasxZMiQIUOGvDbyRhDCIRYM0gQk9+76ZG4xe7ECpAz0sr7WnmXDOfuVwI8zdAzsGGw7BII5K6UCCGezZ+8ejhgozT25VpFMBvRMkvg6SYiKfM31fCeRQ/smy7ECBitgmgCayQC2zX2U36uymV3q9vLeyha5zqNvU2aPgMj9kQowr95lSvuahONnvle0Am1zndmTvO4+4PO5XgGc6Q9mhB4dPcvwJLhZEQWVX9LO7C+TTdSjApCrzD6OE74f3GAuxwF1d79Qr2rcmjCrCAwD1BUBzTbEvik/15KRFIKYbWZ8ZIbv5eVlW6/Xkz5px/HxcZvP53sEsDdILBaLSf/W9k9KiL+zz0ncVeB7Rejw/oDmKddHOce/Q7jSBlUssn/EZ+kX8cNkUT/Pr6px6vtSj9+7vFwu28nJyV7WdMoM4W8/Stv4OT7AmM2y1uv1Xh2OfT2x7/Y2iVRt5nOMF44zFcHmeSh9xb702GJ9PV3ZJo599x3/mmxlO70xzG13+T6un2SR5zxnJjIu5Z/HVBWLvFbhfZXtaEP3Fb/bThzjnndtN9ZlUpLPe7Of58fcy3FOmzt2u19Yv9tlv+B8zU1m0Y9lOPZ5rLj83jqE46Ca293eai1ZxVbqaRvZz71eoL2pu2OK+9Jj1jZ030bc716Hsgw/eyhWMB5xvveGTOuVeSWfXa/nBtojfedY4ZMRKJlfev3i60OGDBkyZMiQIa+T/MxP/OyrVmHIkCFDhgx5beSNIIQJsHhXvIGjEBMhv/he4IA7s9mzIz5NYrbWboDlBsFMHkUq4PDo6OgGgcs6CAyTqKwASYOvzIogMZByqb/vMfBHEDGkEMFG9oUBa+pjgLqX6eXjYw1oVXUQCKcd7QPsn9ZuvoetAl0D8tJGAXer906yzQT5qQd9qgLr3BYD4AQoK/LAZbFN9GterwBxS+zMsZP3nTK7yBlBJOYrnSoQmWPI/h179zYgsI85disg1+OtslFFYvAduGxn7jWRn/tiswj9x/VW4DclwDMJYD5zdXW1l6VKP8z7ZPMcs03X63Vbr9d7RChjAccRCdPYpbX9TTO0HbOneWx+a60tl8u9PicJxviXcpllTBsaCN/tnh53Tb0YA9i/PXKMejF+8z7GSZICJycnbbFY3IjV7i9e8z9vboktYgf6CPsrJ0qkr0I4RwfHQG9oeZ54bMYOnhsqAsRiIsh1eLwdiqHUy/NNVUeumShn3Y631Xqg1076PwnGKmbx+UP3eg6vCCPO1Zy7HUurcqmH5zfbzM9Xr4rwOHU9Js8q21Q+Qn93v7s9LI9zVu51Pezn5+lX+bbtRlt47FR1V+2u2kSbVHpV/c37HV/dJ/ZvxjqK12A9n+qtV6xrpbfnYvofdZ7NZjdeDeN+TVvis71NG1zzeI3H74d+o316to1dvEbK315mfNWnPT8ZMmTIkCFDhgx5nWS7fUPXMtttaxerV63FkCFDhgx5zeSNIIQNoJpEChjCo0gJlDwPGGSZAfhZH+8neN9an5gmIMWM5YgzXUi8RBfqGwCpIhKq9rC+/EZi0wAi760AvgBUBGUNypngpN4kOkgaVnY0SJe/fMduBZRHPx8zfXT09H2czq5JOQTx6UcUt5d2D+F/CPhju9J+68/sIpKAtg0B2tTBf/mNdvaGAQOXtHcF0CaTlM9GTK44S4p9wzLpHxaDoPHLjA9vpHB/ZcyFGKvI99iFNmU52+2zd2e3dpPk6QHg9mHb1qSF7dHzPWcv0U7xkc1mM70jltfzdz6f7x29zyOhY18eV586SCSQILW+Advn8/mkJ8eXM/18T8rykflVdhhJsCouu7/zz+9ZTl+nPR7jPJ2Cc4vjLceqy+d3zy/OqKd98gyzhCl+PYLnvvQzxz3fB/8yJILbQ+FYNNHieSZ9500HLId19K5xrFUbBFrb3yhyaAOIx3Ce8XrDxCjHbbXJwfrSRj0bU2/qy3ayPzyPmER9kVib8e+6rRPnQAuJP4+T/O7MfvquxybHLO2YjS0e85VvsH1sm32rWrdVZfc2L7X2bBOKNxF5k599xuuoiNtXXaetqjHn+1xv9Vv+eu1Jvd0/bF81Dqkj5yPPH+43XrduaQfvo797vFfka2XP6hUC1Tqq8plD7alI9d4mHz/veS3zI8d9L6YMGTJkyJAhQ4YM+TaWJ5et/dQvvmothgwZMmTIaya3nhAOEMKjTgkqGQxmxp6Beb9fkeVXwLjBPxIxfEdua+0GQEMQMM/luGQDtCTQkulAsIhEUP4yw5kgEUkBkjw9gLUiyf1uVBMZBKEMRhuEjA4suyLwaGf3XQ8Y9b0E/w3mGvBku3PdZB9/JyBa6WLAOu02QGlA3WBhbG5fsk0re7XWboCE1Jd9ZiA59fh9qBUYzLK4cWE+n+/ZxuRAle3FumlL9x991gQG28hxWD3fA/xNOtg+BmUrXZ3xY/34LH0t5fTGhf2OoDFJyMvLy9Zaa6enp9PR0SFmk0Uc25ycnLTr6+u2Wq32NntwnJK8pR+QxA2BTB9ZrVZtvV634+PjqZ4Q8yE2N5tNu7q62tu4wY0zedbjOv/SHhIu8V/qFNsyBjK+5ff8rYgcxxX3Z0jw/B497NNpIzdXkCTL98Visecf1CG/0x6x68nJyZ5eJsypS0XcHpIe+WH7Vc/kM+e0SqcqTnk+5e/OAve4zTWP85TlTRUcx9X8UcVdzidsa7V2qITP237pw5eZFx1L3ZbIoQ1n9j33I2OiY2Gy05053Nso4bZWxD0/u6+rzVt8ptrA5nVV5ceOs70+6m3M8j2MO25Tr+xqznFf98ZvtTbw59b2TzXxMz0C1eOFYyO/e81T6ern2CbPp1X/p++53mIZ3jyRv94kYh+1Lair10tVe12u1zoejxxjXiPaJyOeiw5tMhkyZMiQIUOGDPl2l+31du+EqzdLdq0deG3YkCFDhgwZUsmtJ4RbuwnGBIgh+UuQz5kueTaAucFdgikEonx0Z5XhEhCUGXUEH1t7Br76vZr5jXqEJCEQlAxUg6XRyeAT7WYgke0mAEbwuSLAeoBgDzAO8ctMjpA0fk9aBaAbKHeGDUmBSOxsYJZEBIE2k3cVKGhfMRBo+1TgPUFX1mNynO2r2uH3x1Vg7IsSPwYwnRHK8in239lstpdxyHv8nP2GbSUQGr1tF9rb2Tb2YZJFbEflx/nPB0nDlOmYYptWJEBFItif+NdtsbBPk93L9kbP+Xw++VreAxwdco0+eH19Pb1HOEQqdQ/JzyPv028hnBl3SDazHo5fbqCJzgT2K7/J3+hMYps+RQkhaxKG4L+vsc9se9qQxDOzAkleeBNHhP3DsWOf5mkItF2OpObmDeoZGyXuXF1d7cXa+Xy+t+HoZcSxhX8pJl/o57S/iSWOX8d2zkkVYZIx7PmIwo0NFSHK/usRVfRpzlH2RY6XXny2b3CssB9pN99L/+wR2WyTj2/vzXWO0W6f11hVWbRPVU5lX9oz5Xtt4nIrG/Zibp6j/v6d+nj+529ew/T6xjGKdmCfxa6ch6r5l7bozS+sy/emHPs+bet1jttS3W+/5/UqdvTmPc/XPE2H97he1sW403svL+3CfuG6NW2pxkDVN1Uf217VuqQXF/JMdYqG+7UaV0OGDBkyZMiQIa+D/O7v/F77wq9/4VWrMWTIkCFDhrw2cusJYQJBAcpCUATgJChJYJ0gKUm5gM08tpSgXGv7x9LlOYLV/Gewi4C3M5EIBhFwC6FQAZ7OUDOIyfYSBOtlLBtINLhFgIz3OpukAkRpR4KqBOGpc0W0VyBzxKSdn2U/OAOMv6WstDf2Sd081jn10I7MSjFB0AO+aYfUy3d/OuPFgDQJHNqQNjOxRNKQPsP3sjpLxn5K4TigLvYD9zPL5Jgx+BnbUze3mYQXiTf7dA90Z1+67go8NwDrseLjfQ1MeyOHCccKNLfNSejEX0PKpo5kju52u71s2/wecjAk7GazaRcXF3snFOQUg/yjz+Y4araTx6wzPkZyVDvvi634Pmf6B/uftvP74FNn4rs3ruReZs4y9lJX+/VsNrvxHH2Bdmc8SVY2bUd/sr6eQ1gebUXhPBCdaP/FYnGDzMtzruNlxXGusg37MzHO7av04zimvvnNtiDhTxsyNnMOdqzhmGX7Ip6HbDMT1rYNiRzHBs7HlR0ZvxhLKFwvVBsfHNNoRx9V6/hTfWdZPVLL83pF+nFM085eF7i/bCf3He/zWqJad5m0rAjQno/3YgjvpU5ud57jusg2ODQveNxUG1wOzVv2r8rGuZ9lm5h3PdSn+s1zdLXG7rXJY6vSvTe+PH4rm1S/VesU1s/+iq38vnbbuvK7yk/9N+V7rWP7DBkyZMiQIUOGvG7yNEN4ZMkOGTJkyJAhLyq3nhA2KFJlkxlEMylRlVdlHBDg6YHJBpVColRgU4Abk0vVkbb8a8CHpEFFZBsc4jWTLrQV6ydxaDDNQJ+Ben8m+WPA1IB76uuBqbS/M217/dvLvGWf0Wbsn14GmEmUql9pS95D8JN2pY72gwq8dVuqLByD1H5fcVWGgfdct40N5lK/iuCwXWw76+/2cowapO2RCmyTbVv5X09vZ15RN9uoAuMzzir/sG34rAFm2oN1VsQGdbdOKSdjaLlctidPnrTz8/N2dXXVrq6u2nw+32tbSE+STR77+S0Zmmw340zIuxDLqSNtC/lKYjO6bDabPcKXZHDu8xG1nAdoc8cGbqSg7ezTHMe5fzabTUf8k5xmX3rzg8vxWE+56/X6BjHKMcqyjo6eZnKHrM/4ShbzZrPZ8xmSEhXZdEh6xIyv5bPHFuszEV4RNyyTNvNpCc/TlXEr5ZEUrep13SaJ3HbWw9jv5ypyynVVBJLbxvs8Bzi2Mm68SJ/TbvQ/lss6D5FvPHnAfUA7u177jGOpfYnjjzr1Nv64DM8t1TxT+XnVJ9X8xU1/uV6tLe3vh9parRM8P1U28TxTxRZed/k9f851b4TgffnuVw24PursuGsf4O/0cc8lla86jlXjNs/7/xkZE56TqaNfE+O5sfrL+hwrbOvKl4cMGTJkyJAhb6689/X77Z2vfb39vj/wva9alSFDhgwZMmTIRyQ163mLxEBQQHiDIQTfK/DP4FrIDGaBsT4f20fwqLU2vReTRAhJNJKiKfcQ0J3PAfLzO8F9glkEO0n+sn0VqesMHBMZJycnU9v5Lk6DWCY3Kxv2iICU7b7zu455ne1yXxjEZPuTKcn2V8BZpQ/1ZbkkVQjQxZbOTK4Ae5OFJgHZpooUOATuk9yiP3sTQe7JJoN8j197LDFzlLoRfKV+FZFF+/ZA0Kq/KiKh2lhRAdq0Ad8t674liVPZOjZw9hvH4yHCwHpV46dH/mQcLJfLvTHt7PjcV4H9GQ9sa46LrnRPLMizHpOMCeynfOZ45rHc7BcTFoxlznqMvRK3fVpAyJs8R5/O8/YLbqDgvzzno8fzDAlp6u6jPU0Seyzz/cqsx5t9Qs4zNuU+ZnPz/a20UWttylz2O5RfRqqxVs2tvoftN4lRfTZp77HEfnK9Vcw0+eSYbv0cA0yg+/dDNrD+/Ox5sbKJf2Mdz1tTcH73vNYTkl2H5vqU6fju/rdNerazDW0nkmnu72r+zHNus/vZNmb73e/VPb3yDs1rLotEu+3FZ+zz+euNOrYZ2x2foF968xqfrfqruo/t6vl8b07srWO8lnH8dt298duzs3Wlv3Atx98OrRmqcUo/oe7VGsVjn2vFzPe9dlZtHjJkyJAhQ4a8efL+e++3d99571Wr8WbJdtfaWIsNGTJkyJBvobwRGcIEAQmshPhI9llrN0GbiDNkSIgGFDLYwnoIojs7yWRB6ku5JmwJ2BMsIonsI0d5naCvQck8Y7KjB8KSDDHQSlvGzgbpqHdVtkHklOXsQJJ7bgP7kAAiAWtnbqQ/q74ycUyd40tV3SyD36kX+4h9YOCy8j+DgSYqct2+XZF/7gOXQTERVtnNY68CfOkH6RPakn3ja2yH28DP9BuCt88DgtPvJjq8+YKEsfuAQO7zxhMzwehz7qd87vWNy7efmvxt7dn7fVk3+/fk5KRtNpu22Wzaer0ubR79TXo6JkUWi0W7uroqx1ZiR7KQTdhW/VGNsSp+kwDnEdrpxxyBnY0hbCvbQjuFMGE76P+xLdtPe1gHxmzez/GQ9tFv+Hx+X61We3NM7Os+jJ5pEzd4ZGOA3xl9SHqxnD5T2YJ/Pf6qGMVnTH5xPPE+z3+Oh/5uv65053O85pjj9jtOVnOf9XBso9dFV68AAIYuSURBVD284cNzZGv777d2vdSl+q1qv9vE+dq/HSq3955v6pM50DHFcaiqm+W4jw7d576v7qXtrDfjeyVcf9jfq3LTTj5rf7df0l4Vye+1A+dNt7XafNGL45XuXtvQfryv0tNEtteSVWzwxrNqjWObu80kej3fsy3eROK2VvapCGWWe3V1dXCDn21ZbWQhse3fhgwZMmTIkCFDhnyL5Z99sbV/8Xut/dF/5VVrMmTIkCFD3hC59YRwa/vkWUDPgKUBUvheUQJBFTDdWtsDWk1atfYMBA1ARsKSvznbgu/udXZdQHkSAAGQCMC1dhMwNkDHo4AJPFYEWQW+M8OPtoy+EQOVzEQzsWsAkCRPPhO0CqllooSgWHR0VltFIKQs9hXrdJnUk33IjCMDfAaMqz4j6EjgrgIuDextt9uJvCIQyLoNqBPwTb0GUAlSU2dKBVi7HF6Lrv6tR5zYdt6IQLDb7bOtQnZRd/Yf7+0RGiQf6YPV+6x7gLMB/+fZNHaLxF+p6yEhEZxxbH2Sdcrsfsem2DDZ4CRtTWJut0+PeeZR9a09ez8w+8MkCDfqJH47ZlD3+Xx+A8AnoWufiu+wXI5Ztp9xwjqkLvY16+oRQN7IktgYG4YAd2ylnnmnc35nXdE18TnHP5ssZT/E1izr5ORk2nhDm7yoVH7P8WQft9Cm1XzEcny9+k4bch6jjlUGHttC2+Uzy3lR0qaaN7m5pooN9lM+47VAfvMmE9rGcxbbZvt4fLk/bUfag31ezTFsB/unt4mutZtH6rpf2cZq/uUcz7nQZRyK12xbT2gn+1Blp179fCZtq8aN1x6HSN1qbNCevVjXszkJ52otcGhOi1RrFtsy9rJN3Bf0Y9Zvn7SNvIGsp4PrSVlcv1qvak1A29mGh+Z3+nfu8YZE+1+1MWvIkCFDhgwZMuR1lNd+PbNat7bevGothgwZMmTIGyRvBCFscCugdgVK+RpBpAivmTAh2JTPIXLzrAk7lhN9DUwREGXZBtbze8SEFH8n6UJgm4QBySaSMxUwyt9ZvnUheVG1MUQTrxk4zHPsBxLH1JPtp22q7MgA4wHzSDiyTOrOY6WjB7MAKwCWbajAadZDnQx68p2mBPZ5XC6ziA3q0z/op7aZwVk+lzroB95YwbZVYLFtkrLZv7SF+7IizKKLbdwjNNg22rgiUtg/BIA9jgy8sk8rkNu2iD9xvBmMN7lnyTPcuBJ/ImFCn2HfkcjlpgBm1lbtoB9wMwj18eYW6xjd6NvcPONYyPGajF/GOT7T26STDF3aIM+bmHJfU8/EBc8HtKf9NqQ4N2HYTzJOTeCxPOqUeEBShM/R57MRwP6V39i/PSLK4pjnz1Vsrsp1zPFYpLhsXq+e928mkEzuVnp77DkWed50OX6ez0WfbIpwnKc/eD3AzQ3VnFStI9gmrmMqkruyQbUWyXeO1UNlVHGO46tn9ypWVnOwCXS3yW1p7eY6LPcdiue2pdtm/61O14i+1RzEe9iXXp9ZN9qj11+0iTe9cTNR4lnlW5H87o1YjNvUoRrXXouzDeyPnk9UxH11rVoXeB0UHXvxsIqzvbUHfZFzodcire2vszl38R76uDc6cV7geH6RWD5kyJAhQ4YMGfLtKD/3U5/dO8FlyJAhQ4YMGXJYbj0hTODUhCRJHEsF2uc+gvX5vtvt9rIdWbeBnJRvsojAaMp3BlkIhYA3AfBNXlDfCMEitjtlVSBrBYhFh4oUt66+RnvwOdqYhJPrddaDwV8SWwbB/Lmyh4E9Hn9cZS7Rz2iLQ9L7nf6ZdlSkS+o3cVMRBBXxwCwZ24rEGHU9RCC4TQYaCSSzPSG/WC5ta1DT11JG5W+8hz5YjYmKIPKY6I0Zfq8IH/51+7zRoLIl29wD+unTPQJkNpvt2Zq+w2x/HsscMpU+7ffLrtfrKeuUfZVnkrEbX4sv+P3ikcQ8jneOPetwdHS0l2k8n8/barW6YTf2d4+YqO7lRgzGPr47vhprbFtFipDUdtb9fD6/sZEnNss7mznH5LdkYXNcpd+Pjo7aYrG4ER9i3+vr67bZbG7EmpTNvuCYexGpfNsxgr95XqbP9zY/eIzw2d4rCTh+vEmD49WbgugPJlvY31V5Jpp4nTp5TFR683naiXaoiCKXTeKKZXBO7JG3Vb3W3zr7uudf2s0ktmMjy3D/ON57HPbszTKqNVHl+/bF3r3VXJO/XldUba7syHUNf+eaipvfPMdWc5rXZdU6y/2e+/k77cfTJWj/ygeq9RV1s85c01VxoYrB7qNqE1Jl9yq2kMT1Gif3mtD3/OONY7Zlb5znuZyyYSKaOngDUrUWGTJkyJAhQ4YMed3kwQcPX7UKQ4YMGTJkyGslt54QJkhDovHo6Ol7EQmmmfAL+E/wieBoyiRATkDn+Ph4r44KUAu5QNAswJGJAoODAXdCkDirzOA9AdM83wP0KiA8YmKM7y4mgWGixOROBYYa+IoeIYoI8KXPfBQ462XZbBvBfLaJIJozpytw2sCzAUmD6qmb7ySNnatsVmZTs9+rPmQ/Ui/6E0Febjiosu94rDj7NPdWGdbs/9baXvYoAf8q24nH0fJ3jhWO16petqEHolakUgWK2zc4Huw7VXZ6bMRxSHA+OjsDmHJoXFSZbfa/3G/Aerd7dnIB9SZ5X5XBf7vdrq3X6+nIaPt4SN/5fN6urq6mWMnj4g1Q57NjZWxJG7KvGCNizxCgBvPjS9VJBbkWspn+RvKU/W6/8eaHgPU88p8x0/0WG3G+ymdm8RP497ti2a6UMZ/P23K53NM7uszn83Z6ejqVmb6LHiRznLn2MpK+o83o/xWp47jcI7EYpzw2WGZ1j+P6oboqgsVzswkzxy62z232/FuRtpVt+NdzLsd4pSPHmuNVtUbg9+o5z0HVs56b0x7r6X7Od68nTFZXOtBv3Y9V/GWfMv5EqvjF53obq543L7kNVd8yFlbP9a55jVbNW4nfVRyu5iOTuWwbxzXL8fwenRgnqVPq5uaNKrazjYlhHteVj7Guah1QrTkOPc/2Zc7jda/dTAD7mtdK1eseYh+XYztVdbp9Q4YMGTJkyJAhQ4YMGTJkyJDbKbeeEGa2Wg+sqcBhgl/MbDOoW4HPJF8ClBFcC9iWewmS+ghg6pj706Z8jxgQ4nX+tVAv1+dMLduBZRIYJBEeAIuEAsVtjYS0MDjtOglE+13BtCtJlp4tKrI19iGJUtmM5RoYpZ1ns9mNsgwGm3DMX77bk/ezfJNSVXtDBHHTQQXW0h8r0sPAI3UnWF75a5XJTdCWQnKM/WRw2ASDbWsgOHWS5LStCLxz7Nsn7Zv+zvKq/jVxcoi4Zh3R4xCgS/uenJy01Wq1p6NjocF1Zq3H7mnDarXaG6skQThWsvGFdqli1Wz2NNO3IsHSTm5WyFG21N2APgmCCmCnP+RfSOHW2l785qYd+4jJmuhaZW5Rt8TL3J/xyTaRSKxIBs8dyeLOX/aJ+yp1bTabG7Z2OzhmXlYcMyqizhtP2P/Ry/HS47Y6sp73p570S0XG+WjWKobmd/twrpmg4vjmOK8IHOpOws3rk6oek03RlacEeB7lfS9CXFdtrX6jnTk3pV4TZdVcSv+w75nE83zFDRBsI7/35jjWYXLOMZl2oI8ditmui2VXY4Xt5LNVX1XlWd9e37mMKtb1Yjifd4xxO6hftTGE97HuymYk+Nkf1Ju2sm04nj2PeUxVm0J4j2MXY5w3CVQ2Tp3e6JPPnI9cBu1Nv6jiKzc6VX04ZMiQIUOGDBkyZMiQIUOGDLl9cusJ4QiBJAPZzCCoADkClgb284+gGEmF1B2Qn98D1jNjLkC+iboAQCE/AlYT6DWhZkDYoKGzJyrALqQhMzcMwLG+CtROOSbuolfu8fv5CIJXpJ/vJdmb9jI73GBcsnQrkJx1GfivgGCTmxGCnC+S3UbihWWkfSRZ6ZMGjg9lPJHQcWaPQcLoQ19jn7ts9qNBfIPP1KEC/O3L7If4qt9ryecqEDll73a7vffLsi+rTR4pO8RZbMJxV20Mcdt74DXrtu4k5ez3LMPf3TfUgeOO9o4fX19fT0dHc3wlHjBe0QYG43P8cdqV78wYNuDvY8TZNrcnZdOm3IhTHVNaxXk+wzhe3V+RQ+xzE78UngZBu6bc/JvP53sZztvt9kamW+5NBq/fZW6Si1nR1Jf1Jls4cw3jZnxiu316wgFPOXgRsX86vuZaj2ilRNe0i+XSBq21vXmB7a42U5HgcUyKcBOKdbYe1bi37zD+eeNL5fc9O3pe7D1vMqyar9nuqkzGUc6vVX2xGfuFdua9nI9M0jMuV/NFNdd5PmfcslRtp515H6+ZRK/KrXS27VlWxJtPqJP9lTHcba3ilE9cqeaHiqyv5hfbyZtX0pbKlzjHtbb/OgPP3bFxtXEp9qM/0F8ObcixPvYPbhyJjbnBwX3ndQ7Xh702OlZUurEMzx+OZ55TWEbK8WaJIUOGDBkyZMiQIUOGDBkyZMjtl1tPCBtsIlBGIMdgYI+oIThHQChAeYDq1tre+xxJrLIOgtX57uOPnd2SaxXAReDLv5OEItgUost2yz3O7CHYlndpmsgisGUQkOCnM7QqYqq1tvd+NBJYFB4PS0IgBFQ+R0yG9MinQ9fdPoLk1e+s2yRa6uBR49SZvlWBsraLQWOC7fndpLsz2Vl3le2U30jaVpk1BsINnLMM658y3G7eWx273CNqDSZ7zHNsGJg1cG/g1+U4+68iVirbkzyq2uvnIxUhQRsnvjCG5TvbErKPY661/THWI8fTHh4XnvpJ2jKOcSzkfbh8jptg8t50/mbSJGWRtGSbaceUHb9gTM4/XuP76O0rvY0b+cwYHf284Sh1MqOa7U9d3DjE65wz6Oepn8dOp3wS/xURvt1u23w+b/P5fOrnHrHWkyqu2Ib5nn9us+OD/TPiOtg/bHueNalcxQ3qxnKqzTnVfOZY4/js2OKYx3joa/lb+Rjvt/1s+9Trdrh+94fXE63VRyy7L7l28L3+TD3dv9aJfWdS0PNaL2Z6rrG9bdvU4TnPtvG6yPNwb/6p5plqrqxszuv04TzrjWH2sbTNPusxVfUJ76Ufsm/cTtrTeuTZxL9qDVWtdWhT1ss5i+PH48KnS1TjkPN2b8xxXFfzCPvBY4PlV+ssx54qRrm+Q2vKIUOGDBkyZMiQIUOGDBkyZMjtkzeGEA4oS5C0Aohau5lta3KE2a4EugzssvzWnh3h5mPgSDoYNHOmcOqvMk8N+BgkrkCwvCvSILLBx5C/1NMgLPW0TXzEXQ8EJnBFuxn0ph7pMz/H6xX5aiKBQCfbRRCuAmPZB84aoR+6TNdrkNXgJOugvViHAdrcb8KehBzLsg78yw0Pla8b3PRmhwpstn5VWbQn/dFANv2H/WtgmL6Q61WGd0VQVyCvN2C4X9nXHAsGifMbiQuXx/t9vUcGRJKdS0KPfpeyl8vl5BspO4Tker3ee0/v1dVVu7i4mI4app+kX3kKQgX4237UZ7FY7N1TPesxGUI2RyWnjfP5fLrWsyVjoInP/GM86vWF37NbxZ/UQSJkNpu15XK5l+2bfznCmnU6Y41+ReKahO5ms5k28lCX3e7pO6HX6/Vkq1z38cms+8PK8wiIatNFhD5v29IHqR99mnaif3kTictlna3VpG1iTMZMLy5U9UX8SgHPF9XGI2/YMfnD2J5y3D6X53bTLtUzbHs2Ynl9Uung8t2Gyta9/uH9zLROm+wbVXu9BqpieTUXmdjNfdyc5vnQbanGBf3T99J+uad3EoDnRPZbZXPaqBo7KZt1c61SzZlV2zmeKr9LXKd9OT/ZtpVQR7edYyV/7R/VNZZt//P9fqa1ttcG26fqC9q62lzAuh2raQM+X/nAkCFDhgwZMmTIkCFDhgwZMuT2yq0nhFu7mXETgI7gepXBEEAzQAyzifJcgEADmQTlSHYxI84AIoH9AF45pjNi8qbKsCAwa9LL2T8mcaKTgaroHh3dLtZNwCq/kfyIGIQyIEZAvcpG4fPsh3x2G3NfxIQw28K+YTkVMGswjnWz33ONtjVYTuCTdif5xX7lO3UrALLygUPkDvuxIpYrYsJH9BLUrTJ1+Cz7gn1KPehfJiTs22wP35HMvjUQXBEp7j/6WtpnYJ339uqryrP9PfY8rp195pjlNpvQZxvZHgPsua+KVzmq++rqql1eXpbHvZPMurq6mgjN9Xq9Z8PY2Ue390D0+LAzpUiYsl+zCSdHIVNH9503QZhQrTYucOODN1PQju5P91X6Pq8SoP0rIoHjx0d5+8SHjFMS5J4rmIFNuzNbuyr7RcVjN597RMqh6xwLHiu8v3rW/W5C3/1O8ZxTzV9V/d5kVBE+vpe/+z72j+Ok56xqjvPcXdnN5JTb7z5wrEs7fHKH63CbD+ngdvvZyia2TTXvuWyW5zK95qCdD9kx0ttYlu/e2GH/zlj2GGbMs04ss5qTez7ksXro/kNtruzKNvM597l91Z8T+zyePWass+f9KrbbZ6p20g/9uwly6p7vXLt4LuccV8WCPJMNULnfvuE6PWZ6cWLIkCFDhgwZMmTIkCFDhgwZcvvk1hPCBEX4Hl8TcQZi+N3ZFSZpCKpTcqSdMygIJBogZRZmyuZ7BUOuRDfWm3qc7UgwmmA+3w/J6wbuSWaaeDTAVIH+1K2ycUUs53Pszoy/q6ur6dhY25L3sw6/k5F2q0Bu2i1yiGQ0YcvfWH/KManPbL4KmDMgmWs+6tQgZ+qmLSvdCFyayLce9n/6XeUbvI/3MFPT48xjifpal9jcwKuP+U3ZPfCewCl/I6FB/UxA90DjfK4AZmf5VH3ZI3vYRoo3qLDd6YNkf9pGkTzP0xFS53w+b8vlcrrn8vJyz6ZsV+5ZLBZTO3LscAWmsz9D5DrOum/d9gDjzqh1TOfY4ZhfLBZlNi5tzRhbkcDUmbExm3sSexNP+C92t4/md/bNarXasxfrTH/ZL6tNP5VfZZ6JTovF4sZ9HpOV2K97xEOPMInOvfFZieOH59/Kr/jPZJh9oUc60S6Mk445h8gZ24w65TfPWT07WkcTfNbLG114r49SZ5x5kXhq4sltzOfo4COnvfaq7M/fe4R41a+V7vaB1m6+B9e6tXYzc9P2cf9RL/sPn+1tFLB/uC1Vu93+ns9Uc73LddmV7RyDPOZIrLMMr5U8N1KXamOHdbbPe85hHV6zWqq4Qf+lbj2fSizy2o//b2Dsol5sm9cjrMtxy3HIm5eGDBkyZMiQIUOGDBkyZMiQIbdbbj0h3FoNoBDINPDS2j7Z5vvz14BsQBySPwaufCSs399FUMrAq0EzPhd9+a5i/k6w0uQpwTce8WgCmDY0kVC1wTZjGyImZQ1kua0EwAya8jeWS/KHJLLtY0CPvmLQ1WSLyYUQLtGlIpUi9B/axkeT9/o9dnGWrO9nOWwfbXuorfQZg43sG7+jlpmiKacCuStSwYB05WsVaFsRCW5/D8RO+6qM1bSP1ytwn/pU4H4+V0f9cnxxYwNjC3Xvtds6Xl1dtdPT06lttsHJyUmbz+ft6upq71hhblaIL+e+i4uLdnl5eSMm9Ej9lJHxQf9NBu/19fV0zHQ2YbD9GSfz+fxGH19dXe0dHx896JOxK59Lv+aIavdbnvHx9XnOQDzHY/6ZQDBZQZ8OsR1CnkSw28y4xfdqxo7M4Hf93hQUn5zP53vvck7W8Onpaeljh8Qx3WICzff05gSPmR6p5Lo8Z/Xmm9SR+zgvPs8GVWzrzWmMOZ6vPU/x+UPzmONkpZ83ZdE3qvv9lzryGdZt+3o8uc2Ok1Xs9LzgbFi3gZsl+LoN6lj5iiV19ezp59k2z4dVu7wWY0xlmZ4HK9/gvbRNT/fK/hG/auV5fV35SE8PryUO6em6uI5m/Vzfcq70BiOvK7wu8DitNkBUPlr5MfX33F3FPc631bxlf+Fzbgf1t//6/yFDhgwZMmTIkCFDhgwZMmTIkNsvbwQhXIGDre0f8Zb7AhoGACexS0CRx0FXxJ3JPetSgaMsy7rlngoMTD0G/lnnbrfbA/ytE4/cIyG62+2mbDXakAAnQa3ozjbShqmbGXJsH38jkWPQ02UTPD1E9tqe1WYAt5PAPu1F8NF9WoGLBCNNsBk4jh0IIqYuZrnxeGn7lt/bTF9prd3wAx4Jzv5lu6NLr40W9g19ymQEbUKigMSi/ZL3EkSnjtaB44NtY+ZygNPZbLY3LqID9TShx3amrGyy4PHe9lG/rzbXM/YIeqcetp16Vv3AsqNDjsNfLBbTccI8NthH3jO2xWaz2ayt1+spm9QxL4Rk7k/maWKVM145ThaLxV5fp62xSeoKcZzymHkee1TEiv+m/emvZAkTZLcfmbCmvdO2jFO+t9ebTqjD2dnZ3pHRvI/vRTa5tNvtpj6t+qEikdhnHPtHR0dtsVi0zWazt6GjOpXhRYRjyzpUG0Zau/neVP7GciuyxiQLxzPJnx4pSp1tp9RREUpVmzl++VxVThVTD/muyz7UBhNRjMWxX7VRhH7v2Gk/8m+9dQPJPNuV9dD3nzf/8Pnqd8do2sn+540F7CtvkLItTaDaH0z00gZuj/WzT1cb5Kr1n/uf9nKssH1Srte01sc6clzyezV2oqfnb7bDflgR5uwXPl+t/2jDynaVXarND4fGK+cL/r+D5dvWbr9P/GF7Kv9yedSBfuLM5Mo+Q4YMGTJkyJAhQ4YMGTJkyJDbJ28EIdzaPpFogoOAaC9jkYBRfmttHzQyuFkBvbze2jMSLmQBiZXNZnOD8Ev9BHlyv0kJAuAGfAwsklzk7xX4RTHAFHv2QEgDerRFgFQ+7/fpGrjl886sZN05RpZ1s5/SlgpMPASQ5760xe9LDBF4CPQmSUEdemAvyUPa2OS5dSMgmN8MPMYXqCvvJcBoUNLvRvbzFdhZkUq0FYkz+oaJHR/JbR/rkQkmDbzBgGQV+4vESxU/3EZuPuCYja0I3vJY8h44bf91bKNU/uhn3X+ttT3i0SB3COWrq6uJEA7pSRLn6OioLZfLdnFxMT3DjQexLX28B5DT5lUsJ/Ce+pNFXBEq9Pmjo6MbBLABdPY9bUdfi31pN+vud/W6jdYlv1Vjm/5KfUh00N9DdKc/Sa7z6PjdbjeRwbnGukIYV/52SHpj37GW/Vv1m+cB/qV9fC/18DxQ6Zp/JHNYVtX++Ha1qcu6VnOPx1xVRhV/q3sPxYNem3OPY2HPli6P93m+ob5VnzAOe31AHWgnz63uU3533PQ48TrJ64tenZU/HSJPPdfz/t44p35V31djwv7qmFn1ndcV3jTHNYLXSt7ARXE/uo2eo6vrtqPLzjO2NdtV1R0xMV9tPstnt6kqrxqnmQNsu0p3XvccWdXnOdT/P3H7Kz8cMmTIkCFDhgwZ8i2WP/L7W/sDn3rVWgwZMmTIkDdIbj0hHEDE2ZkhQAmCO3uVwFcF7DvbMWDMyclJW6/XN4iO3OP3F6b8HlBjqQCmXmaKQeVkAYUoYUZdDxg16JgMP9/D46oDDBpMjX1M/lLfCuTsEQcEv2zPtClAmI/6jQ4k5XuZlodIBYP6AQ6ZTV6BtfG1HhHNbPGeD3gjAMFe1mW7+N3Wu92zTHDa0/VZZ9oipDv1oDgTioSXiQcDuHkm9/C4YAL17Iscd8tj2isgPb/FLtSPOpEor8aJxyTtbd9yv/CUgQoor4B+1u/rlAqAD3EZm6RPYzPWZ3I87yBOHKCeJiDS9sTSfI8OrL8iLziuD41l2sH9xjHiPsgz9FuSkKmLWdE8xjnlRp9s7OFYae3Ze5MdL6hzrue4ZmZsMz5vt9tps1B+D3lLkj3EQ+5Zr9cTQU/9OZ44RnkKAsctT5qo5qdD0ssAtM9UG24ovTjFZzw/0Bd4b0WGkNg3KUWCjHN7Fb+8NqjaSp29VqAOjEPUudpEVNmj2nRB36ct2B6OKduNfZhrjgks1/3BTUi2p8XlVe18EaHd3Ob83otD/G57Z/7g2OA91RrAdVc+UunR27joWF2tE/OMTwjhpofW9mMsN0HFdu536mAS2fOJ22j/oHAMVXas/IpzBtvk8u1vh8aq5ye/7sVzbDX2vcaz3rQHbU99U3cvllLiC/mdJ0h4rB/aHDNkyJAhQ4YMGTLkI5Tv+o7WvuPuq9ZiyJAhQ4a8QXLrCeFkRLX2DIwKsD6fz6f7DPbxGkEVEkYpn6AOj0KuAC4DViw3ZYdAyf1HR0cTkJNrqZvtam0fqGO2cQWmGfikLXhcbO4h0ULbGHSyXiYUTGZRD+qafjL5nN+qI7JNsDjjg+KMkR7hx2sph4BclTHEMigG93mMsOuo/Mfgrm1NEqRqb+7j8ybuaRv3WX4jKeaNFXzGRIRtmd85fkzg5n6WZ7LYZaYvqyOEe/3kulIGbWIdHFN6QD9tSkIhdbnNHGsp333i8g8JiXTaqsqs9vfEysSh2PXk5KQtl8vJ3jxlYLt9mg2czR8hxHt2YHtIPDOGJSM545uZaOwTbviJfaML+6cXo3nUM3X12DOhxL7J75vN5kYc6/Xf9fV1W61We6RO+o7xiK8ziPB47fzj+4OrmMQySRzHZuwHkpu8Vo0rC+MZr/FvLwZ5XLk8+7/nQpfh+afSn+OS45DEJcsnoVK9jsF1VYSWCT5e55iwjbgBwH7C8qlLtR7oxRH/7rjEuviM+5rzmYmnioCjfibtOG94vcH7K9IywnUD+/GQTqwjfWAfqkhAtseSsew6enqzHpdt//KayOst+xLL4lj3XM3Y4A1orqu3CaHSu9pEVgnnwsw9bM+h9aA3WNivKNV1+683ufXWFF6X0W85his9TO5Tf5LUlY39O4nfF4mFQ4YMGTJkyJAhQ4YMGTJkyJDbJ28EIWzw0ABUMq4MfJOkCfBDgIekUMojOOsMIYL4+c5sZN5LspHgVci4lE/SI+LMM4N20Y/H/hmUirA9AS9jQ2Y9EsCsQCgCiD0QrwdiVxmpqSc6HDrKldfoBwZp3Wc9X+J7NNmnBuEIoFbAIzcD0N8ouc7v1ZHO1Lkir/h8BRT798p+LI8kSEUqVCREbBO9DWiaiJnNnr3njuRffNfjzgB2/M0gLo9rpB2rDN4eoJvfTMLYz1IfAXOW73HsutyXFTFSETO9vrCPp55sQvGYpu0z/n2qwtXVVdtsNlM93iBwcnLSTk5O9shR95MJMYLlji+0j8dxdGU8y3uLvWGB1xmfKhK4itsUj3nHhpzKYN+KTdlPy+XyRoYhTxrgkdOO6d4Y1CNy7RPpV/oH576KsCAhdEgqv3TcNOnicWSCyv5NgiT3OyaxjzwvURxPTPKxXPqf29MjkmwPx0DbgNcduxxXed3rgkh8nv3g8cX+qeYv63vot2pTWH4/NFdTH84VXifQnt5A0CMsaXfHkmodUc3LlY2pizeYVeOg588W2zRtY5Y/bdVb43g+qeqgTp5XfZ/bXMV1r0dbu0lCuw/d5sQuzpP8rYoRvXFtXXvt6805rtNrdK8/2B7GCo4PxvtevRSOKY6N6v85bFNvrDtWDhkyZMiQIUOGvC6yWW/aO19951WrMWTIkCFDhrxWcusJ4YpkJbnU2k1AJuCJydZ8DthiEKciZZ3dR2CsBxCbLE2WnAlDZjDlWf7lfT2wx6Bz2sNM6GTWEcBlmw2cEizjsaYhQHrgctpo0C92rrKWCYga7K/ayvd2sh/ZV5UN2U9sf66bMDhkY+ufNrFvaX8TIe5nEhvUgzobtKY/RtJ+EyEsh0CvySceMct702aDlwSLbQcDpyyXJHvaYLKAz9PW1L+1Z75loroic3rEhe3FTR6838Bx1dfsc+qT+xxn+NwhsJ92YtlHR0d7GxyOjo7a5eXltNmC7aTO6YMcjb9er2/URRvM5/MpjlFXk23evBCdHAN7gDefjcTPeJyzM6Wip4kh+qMJpPQJCTPHUvoW/YDty3PHx8dtsVhM2brV2OQYi6/N5/O9+Jj+iW6Z39KWbCgyoZw6fWx+jqNOe6qjpA+JNwh53FRznvvUMc2/cY4hCc++te8zPrHveicKxI6cY+jj9gFfc5ymL7Df0g63h/pXc4LHU29M0X62g+3qWMc+pNi+h8pifVw/WD/WUcU2j1+Oad6Xe/jX6wTHIc4fVTtJwFGXiji23tUc476q7Es7tXZzjUD9qBPL5txsv6du7vdqXve8VD3fG+/uk6q9XLtU86ZjrOvu2bLyH9dr36CetKX9iHp5vrUeXl+xvR7LvO4x4v72qR+0/aH4+iKxfMiQIUOGDBky5NtNLi4u2q//03/+qtUYMmTIkCFDXit5IwjhCMHb1m4CrNvtdu/dugSZnDlmcIvgfso24GMAK6QLiTiXw3pDCPBekjnMIDMIxyzFlLvb7fayftOO6Ev70QYGpmhft9GAY9rBsg2gEQxzthbB2NjD7ywkCcD6K8LSvhL7ttb2CP9IBWi6j52F4bp4TwVeRkceWczfnT1oENN+6fqpdwVosx20q9tT/V6NDV6vgGKOR45X6tkjFAhy9jZHkLCZzWYlqUadKkDYdZu8N9FDG3ksunyTMiFA6Rv2K9qN9mPbqUeObabvs33Hx8dTBivJ29iH71en3UKyctzEL0lgVnGBOjhztQLfCcBHemOfcWI2m01EK3Xic2k/iVj7tYlQ13eI1OiB8XzvNvs/R3STdKGNOWe4n9nutDeberipyGMnxDL/Vf5FwrTaeNMTj8Vcs834l3p6DHk8sR5+9zxuAr8Xq6hfNcb4jDfcOGaRDDYxzTayrJ7PsH325cq21s027tnXbXE/OSZzLumtDzhuHNN6Onie8LzN/qtihDc9ePOQbec51e3vzT2xgTepVTb2/J/fTFL2Nrb1SH62qdrkcsiuHgMpg9d8fxWvaSfq16vD66DKZ1x/6vOmj9isWkewbym96yZTXR7bTT/2u4UrO1Qb2Ko1QnSzPSp7up9tY+tU9d+QIUOGDBkyZMiQIUOGDBky5PbLrSeECXKYJJzNZnvv5m3tGeHBrLAqI2+32+1lvPE3Akw90sdEZu5h3bnGe5ydUoFHIZr9W8BQEhnJAgyAxiNUaUMSJwSjDVCZdK6AZX82aWab5LttyN8I9KZuA40uO2LAmKSB/eZ5gH6lpzNVUl/e8cksPv6e55yhmPamffaxHkjPe9i3JoF7xAJ9geSG+5jiMmibigSPrvleZb9UBG7uITmbfjLA7/b3/MNkDnV1u7kBxLar/IgZkQaivZHCfVf5U8+3IyF9M7aTHcrxymOVcz/rS7yoCBMS2G5Dnru6uto7+pixzO1IW0iCzufzvXdWV/Gg8luOa+tX9btjqwnb1treWK0IKMYf15F2cVxnTIeY5ZHb7PeUx/FQESD0yYrkZjv4nmfajsQW9fNGiudJ1Sce677f47aaG/LZ80nKoLAv/L2K1xWJ+qJzkvWoxqTnr9i3eubQXEMd/SzfwV3ZKPbvrTXsv6yX/eY+5e/VvMPrbiN1rfzCzzjecnOG+6S1tvdO8vyt/Imf7Q95jj5sfd0fjNW9ebU3fztj32sz1lfdxzZUsTF/+Zmbaqo6OQcyNrHNtkU1DioC33qxzqrdXgfl98rfWT7XCL15m77qGNRrb9XuKo5Rj+eNr0M+c6hebxjhOtP1v8zmniFDhgwZMmTIkCFDhgwZMmTI6ytvHCHc2j4oF4KJxFxrNYjdIx0qoIqEwHa73SNMTKQQVDM5kmd8HGiAfoL2BEMD4plMpI4GICtQk6CS9SVBacDRtmcdISpI/LHuCtA9RCoQtHP2RJ6LrSqyke2t9CIBSXCQ5BptcCgzpwKHTdqmrtRDHVJW3nlNu7DPCPxVGZH8F3Ed1POQ9DY9uE9pl6ps91tFrJCgyL3se2dv5rp90SC3204izX7JMp2NmXLZTvqP21OBxGyj7WTSxTaif1Jor6urq72NH4l7rpMbPkguRqLLYrHYy2ClT+92z7JvN5vNng2sq8Fx+pXH7W63m8ojiZ12VTG72uSReJZnvMknfcdj87PxwD7Bo+ftl2kHNwLEtrGb3ydPG+b7arWa2uF3mVPYV+k7HjnOurk5gH6cjPLMX1Uc4BjqSc+3e2QIy+5tzHF7GePS5vRJ+tk6uf5cr+ZKxjPPPyzLNql0ZYyivowltp03gXAcWE/ez7HI+mmj3JdrbnuP1GUMdSys5iSvL2g728jSW1e47VXdvIdjuKdra21vzeN+OjS39+xL/SJVnyZGUF+/R91zOfViOX6GenE+9oYS2sK2zQZC+w77t4rr1XfbvYr5VfmOEbxe9Suf8fOZn/g8536Twe5rrzPYTuroI/E9B1bjymOMOldxi/f21rmOTd7UMGTIkCFDhgwZMmTIkCFDhgy5/XLrCeHWaoAshBnJn4BxPubUJKOBYBMBBGIMApFEzTUTKASbvKM/urM9zvIhQMWMOt5HIIpkuIEmAkskzfJsa23veWbqhqCJ+D2PJkdYNu1YZVPaxiav+Dm/G0B3pqFtWRGkBi6rDLdI+odgHQE5ZqdXfZzrJJ/YbpJ6sZNJN9uVxJ91t59XAH5FVPVIXT/H+k0yOBOJddNvPH5Y56HfWBev94jXCmw3kGw9q3HONvO5ns84NrCOQ6A2gXFnbnqMxYeiEz/T5/Mv1w4dp0wfN9idZ0M+Rk5OTvayhW1bkyzOWA1BwU0wISxoh7RhNnu2kYKZzrnn+Pi4LZfLtlqtpnjBEwN67XAMYTy3fUxQJv6u1+u22Wzaer2e5iOSetQz9Tvmsz0kb9g3VZw3kZS+4djwHBK9X1ZsG48D+zave26ieBMG4zPt2NPJtnQbOab4u+NWj4jJvbSxhT5y6Pd8rmxQjUmTZNTb7TcB5fmA9XrzB5/xWsfrJ4/nqgy22589JhgDe/MW9ef6iWs89oFjvHWyLmwPNyhwrqvmN5fJmFetwyohuVvZLfVX5C+ve+5xX1Zxg7pX81fVdvYZda38m+VxE6THkuuwbXv6VvOp+8Lts++5Htug6h/alWsc97M30FS2T3mMWx7jrbXumruKJ0OGDBkyZMiQIUO+RfI/+1detQZDhgwZMuQNk1tPCJM0CKjrDI4ALgGaCDYZuCQxwDJCIKTsZFSxnOhTAbEEmPIcAbp8NkhoUIfAHTPPUkZFBvQIjHxOXQYzDcASyLbeVTtpT2fbmIhhHdSNRwS73/O3+sw+JBBc9ct8Pr9Bnh4CPr0RgDawrgSyTRikfSmXGxjSvxFnFeVa/MjERUXo0BfY7z3/rYhg24JCgo6ZOJXYviaQDd7TFh4Ttin/2n+Oj4/bZrMp+yr1G6xNeRVg7hjgOJEy2H/Ry77L9kU/E7iVVOB4/nIMtLbf33k/8G63m4585iaEkIZXV1dts9nsZZ71+pFt4r0k9BhvWY71o/25wcdxkPe19ux9xcyM5aYg3hPhxpzd7mkmMY91zr2xmW0dvUy6VCS7j2auspY59q6vr6djpvPbycnJHlnOucLvrc8cmTjHDSjceOKxGh94EeF8UBGUucff+XzanGxtktsmOOg7jlOMh97sUZFU0dt9WZGqJN3t9xX5xfmu6isSlSkrff68dpu46q17PPexLb268nzVT/HhXOdn3sP68pl9ZT09N1X9UpVhX3M89JrI9uyReZ4ben1lnfMbj43n7x4DvTZ4zqnswXmM+rPfWB7LYf2H/Id68zrXyl4z9MZ8ZSvapPKB3lzhcco6PUcnvnv80U6MyZX+Vdzyb7R1Yir1sW0q8Xjh2sK+VK3RvRHKOg4ZMmTIkCFDhgz5Fssf/1+1NtZiQ4YMGTLkWyi3nhAO2GNQy7+TkCAAl8/MGg6ZUAGQBtAIIFVAdQCagIMkHSqAnOCWf887Awn0ETwnUEswkrrnuUgFwrGsfDcxVoGcBtJa2yeCKgCTYLRJ4+dlrZhM5r1pf4SkOcup+pb9Q9LMJBUBZbbZtjVIzXY6u8igM6XK/ElmH4kYAroGBtlvVZs4XthPbqvJGurEv2yf667+Up+KpPf1Cii3jWhrt5mbEnrijRap12OrskdrbY/0px1NBPhdkmwXfdP+wX6h/ekv6/W6zefzkjynvrFJa0+Pil4ul+3i4mIihP1cPoegZPxhP9EvDZCbLDdRH6A7NuhlYYW8DMHqegjSk1ymr+YZvnPX/UmfiW7sPxNYjK+xE8tm/IjtQgJzbjORxT7IcyZFqjlmt3t6HPdyudybP+w/L0siVHNARUxU85vnvfSHy6b9HWtYj23FNlaEYjWuq/Jpm2r8UKivsx5tA+sd3aqxwPnIm8boy54v3CavVxiXUr7LrmKs52HHhypueO1UPceyKxuwL1i+60rfs232y6rNtPXzNoxV/dgjkHmP5wDHddvCG7fso1X8sf1a2z8yO/3h+t3X/q3yP+puvSJeL3mO8xhgH3pzjzfO2JZVH7l+z1Fc43jTkG1KH+4R6R7DqZu+XcUsxu/q/wWMA+4Xfn/ZOD5kyJAhQ4YMGTJkyJAhQ4YMeb3l1hPCJkIIMuU7Aa+IQcwqk5GATJV1lGsGGpmRkLoCEpEcyl8CXQbASPi19pSkSeabAda0+xAQH/0NdOVZEn2HwGoSNAShebwqbTyfz/cy36yHdeR3Z3gYCAuBQ2GmBAExA7/sB4P2zKSjnuxLZ+fYL+hLFThs0J2+YsCevkg9Db7mGjMF2c8ErKMr+8a28VjI9eqoZ9vatstf+5xBS5MI6U/qk+dzP+v3OyLze/XuQNql147cyzFCUoM6GayvAF4fhdwjFyqiu/ed7TPpEFKKWegcR8k+pU/x6OTKLrnfG0hSfjbVnJycTISyfSA6+whW61cRVY5njiEmbukH3qDDfkpmdGXriONh9Ga9HFusO8R57JS+yRikn6etPIKaY4ZjK886FjnuxPc2m82eD1P/isR4nngOrmzkOcXxn/cxzrk8x1jGlCoDnc9XMcnxtiJSHGdNHlKHijxiOYdiHcXlVJtXPJdXBJ370+ST7WObuf2VfSv9OR7ZdrefcTz3eR1VxcneNdqkd28laZeze91/3GB2KB7zmcoX+L2ah6i/28T6vB6s7vN3k+20T36j7V1OtbnI47t6NuVXY7sXbz0eq76s/Luql+O01/6eVGvTnr39W29zF8vl/zFol9b2Ty3q2Z2/U0+3eciQIUOGDBkyZMi3SO7dae2P/P4P//xs1tqd02+ePkOGDBky5I2QW08I5z2VJsgIchso4nUCQBWA3dozMNUEH4khg0kB/VvbfwelgSRnyRj04/fNZjNdjw4GfJjZTLCfQCfBUZMxIQxoD4J1tFtFyFiv2I9EA/urtX1g0sApwVGDpNYrdZsodd2pswISmX3CZ/NMiC7aJyCej95MGblOEoPtsY0NXvO9egQNWSZ9xj7ZI/gJElZkCO1qP+LxtSmHGxd4L3X055RVjceK2OgBzj0iID7vfqns4Hpom4wV+onrsL49wLoiJwzW0hbswwo453h3rIs/Jx756O3cw7r8LvDtdtsuLy/3xjNjYvqQ9ec7yVBvQGD7SSbnSO/8nlMR0g6On+12u5fpSqmIGhLTHmsmGStfZGYaxzz94ujoqM3n8xt9ET9nG1yPs5LZ1hzdbV0ZN5P97LGQ+5KdTKI496UtOT786OjFj4x2vOX3Sqwfr5vkMHnE9jgeVOUyVljHSn/eZz34W0UYpm76UNXPlX4cD94QEenF46qOnv0de3LtEGFUxWaX4U1Y1qWK4ybAXD7bwLZbNz7He2yjas6v+oXzs+/NWPZz3qhSxVavIatxQl0rO7TWbqzZvFbKdcZejg/aie2o5vHKLi+6EYrtzm+eK6l/1WaPD68bUzftmvvYh5V/24aeW92+fKf+lT9wA1PK5asBct1ru94JQr21g/3JbXleHB4yZMiQIUOGDBnyEctbd1r7w98AIXz3rLU/+W+19sW//c3TaciQIUOG3Hq59YQwMwFbu5mJ0SNPkrFKwMakUK67DpIXzqxkHcwAjK4EgEgYkzwJgGZik0APyZUIj2slUBUChoAhswajX8oKCeCsExMpJCB4P21p/at3p+Z+A4kkOUiC9MgH96eByuga0pzHSttWzoyxzmwfj6g1KBpwn8/7eHICds46I2Ef3UngUH+SEQEgK9+vbB7bGuw1gB5CkaQ5yT6DotSJ4D+ftY7OcHG/5jkelW3/JhBegbOs37axTlWGGm3icivwloA4x4fBftu9ygSlHSjRnfblO4Gpz2w2m45Dv7q6msY86z85OWmLxaKdn5+3i4uLtl6v97J+K59hzKT+bB+zz1gG4xLHfTbCMEs8/scyQn4zBsYGLJfjm22lVOOJ/mLymL7G9z6nfMZjkufuT47HxWIxEdj5fblc7sUPbjbx+KO9aSseh11lFpqgeRFhv9Kula+agKKN7Pd+viL6WBfJY4831u9su946gf3eI2nYhmrji+OC28wNU9b5eeR2RUrTTrR35We87n6q5lrbrPIPtreK7Zy/oqvr5rzpdnDe9PqEJyRUwjI8n3ve81xp21axu3qGvuZNBbSjSdjeHJzfuCaqyiBB3+tLz0+0v/2Z1yv7Jr54fFv/np3cR247x1N04pyW+ij0oV4s8nxYxZZDOlV9aZ25lqnifuXTfM52yW+9OFf185AhQ4YMGTJkyOsos9lRWywXr1qNDy/LRWvfyP682ay145sbqYcMGTJkyJBDcutnDoIvAXRae3ZsJDOuAqDz2GYTSnwXZoA8HuVp0MVZSwT8A9T4qGNmYKRuA0ckVVg+gR6CPAb+IyFDSOSRqGOdBJWsEwFHHrvbA7FMfKStJDyiXwVE01bWgX1hUCygW+ogkFkdJeqyKnKb9iZYWGX5mcg3YMl3l8a3TMr3gOCUU2XM2cbJ7gtxl36jv7jf/c/EKP2fY8jEhAFftt9HpldCEDSfSUDTvwhom2SriAbbmLbO8ymL3zk2bKMqc83gPO/xeKFPujyTAH7fboTxxBmg6S+TISQw4zf0l9R9fX3dVqvVHhEZ8qXqx8SclJe+Yiy2v9Im8VUSZREfDe/4zfbYH0mI2k9IQlekB32GfubnomP6KrpdX19P2b32pfQ3YxF9OyQ87eg+p54s14S8/ZExM/dXm3leVPyMyZXK72lP+wjHZxVPqnk9ZbNck/DULeVwvrDe3qTiOEfbMz5z/uG837ObjxLnXMw2cS5je6p56VBc90aZyhbUj3HFcZpSxUbr6vazDawvYnKvWndEttunGfW948O9cYhlVboxRtBOh9YJlZ/5vnyOrlXssi7UJz7hNkY3PhPdfcKJn6tsWs05laRebhSyj7gNnrd5b9UPnivsWy6XfdzbfJAxxXVv2s3v9rFqTES8SYe+nXmKm0MZz6sYxzJ8nW1mfx0ac0OGDBkyZMiQIa+D3Lt3t/3b/9t/61Wr8eHl3/tj48jnIUOGDBnyLZdbnyFcAawV2UOQvQJcTDAF2CJIy+OpCahGDwPIrT0jMALCETxidgfLyfUK6K2yYFMWf0sGNDMEKRXxyHL9t6qztf1s14BqBKxMRvfIARKlBtgJhNMWrj/2C8lMsNQ2JjFJ0qkCQ6tMFPZH+stZsxWp0gMXU3fIH4KD9MWKBGbf9YDU3GNCxvowOzzXDIKzvlyjv7Pc3MdsJdZf6emsJ/pdynVGq4Fe9hnLjy65pzpCmffvdrsbvmKb2Db8vZfFZHLHYHhFYlQ60hZ8Nu1zJi9/D2DvTReJldwks1qt2nq93tM7/shNJvSPq6urNp/P9/rOcYSEGX9zXOVf97X9PrE87Z3P51OmLWN69OX1Q2MstpjP53tEHTOXGSu5QWk2m5XHMKdNPIp6Pp9Pz6S9i8Vij7RlPOQR/PYFxlyTxRwL9reU64y7npDQcXyvyC3Ol+x7Z7hVscvjyCds9NrTG7cmTxxzWts/xcPj0nHkUBnV2qHX5gj7imOG9XGMuJ3Ve2BdB/vNsZ/9VRHj8UfasbIpy/FYr+aYSpdeLHF/+Jrnbh+fz3qrTSpVvEpdlc65l3r6vkr3ymdTJteG1oVHFkd3tsPXe+uwan63DWkL6sex0ZsbGbc4DlhX2ujPVfY321np5DbRV+l/3miU+1k/y4w+re2f1MJnKdUcn7J7JDXb4nZ4fejMYz7jsocMGTJkyJAhQ14nmR3N2sn8NYa175w+zfIdMmTIkCFDvoXyGs+cLyabzeYG4WkylWRCazffA1nt8A+hQWCfZZk8bu0Z6RsShGUalN3tdnvvg2ztGeDDbLcK4E17eUxu2mVCNnWZcMn9AcNMXFVgHXUPkBWpAF2Dd36Xa5VtZOCW5fRAN4J26RtLdWwjpQKeCbARRCV5bBCuB5hTX4OCIV4OkV35d3JycoOM8j0G2ivb0m4ksNznBvCpv/vIYGxFspMEtT3dr9SZfk6C83k+RB1JarjPTTi57yqg1TrbDyo7s6xq04CzhKxPJSZH+M5dj1ETW+wjkx/Uge0kqegsLB+h3+tj+pLrzW+JT9V4c1/a5iZ53Tf8PXXZT9h3qT/PUw+3g2A+N3jM5/N2dnbWFovFHglP26aPSG5ywwn9kUfc536/u9ikAjfosJ9JJDv79GVIhSpW8HNvU4jnKEsVZ3wvfcI+4/qeRzLRVzKWGDcYq3ux0WVxbuXag2PD+nHtwPIcaz0WrBeFmwQqstjfq1hV9WOv7b050HMF66z0dz+xPN+btrkcz22Oca6vNy9Xa4hKX/d/z1a9+FjZhPHb48A+4DalLsYWn9pRrf2s24vE76rt1tHjpiJX/VzP7ypdqWMVv/M72+rrvTptg/RNyqo2A9hHHZ89x+Ua5xnbnBtGevHVcWTIkCFDhgwZMmTIt0AW89b+1P/6VWsxZMiQIUPeQHmpI6P/4l/8i+2P/bE/1t566632qU99qv3pP/2n22/8xm/s3XN5edl++Id/uH33d393u3fvXvv3//1/v7399tt79/zO7/xO+6Ef+qF2586d9qlPfar9J//JfzKRpZGf/umfbt///d/flstl+6N/9I+2T3/60x+qgQG4N5vNVEeOneQ9V1dXE3mcayRIeK+JIAIyBKyczZn7A6jn6NSKmEvdfBcmATWCNwT9mdVGMoNZegaVCMqRrPFvvE7xvZTdbneDhGb9PlbWwHXKz29+lkdoknQ6RIjahgSAY09+Z/kE7EOs9TKmKqC1B8aRxKgkNma2YCQ+yfIIblJvg58WHgmcerlBgrZ5HllCsJM+wn4weZPvJjkoPMKYtoxO+U59KzCb49Z9wu/+R1+uCBvfy3ZbNxMgFUBc9VcPcO5J9PSRu9RvsVjsEYaMZbw/9qNP8pnW2g0fpb2iQ56zDf3dvpJ72G6D7LmHuhKUv7q62jspgHGlIhHik/P5fC/7nOSoXyEQkpe24NzD0yQSs1iHgX+KxyKPRGZcTHtiH9s1NjNxz/bRb9kPHG+HpJoX6Ef0jUo/3ms/r3zecwzvY98yFngs9qSamzj3pHzHnmoOin1b29+QVLXHz/I3j0OuUap+N3nLMg/Fkmpups70H69VqvVEL6b1YqDnD5bj/rberCsno9gOiU3UkycF8Lr18FjzPMD5quo/6175pNcP/OxXTVCXap5x7GT/Uj9vXHJcZF/xOmOLfa1qL+vn89QjPpC441dcuB7PB14TOObFV60ny2dZFLab45Cba+hHtF3lK9XmJb7qpKqb85Ht0Rs77qshb6a8jv+3HzJkyJAhH61sdVLOkI9Ijo/GcdFDhgwZMuSVyEsRwj/zMz/TfviHf7h97nOfaz/5kz/ZNptN+1N/6k+1J0+eTPf8yI/8SPvxH//x9mM/9mPtZ37mZ9pXvvKV9mf+zJ+Zfr++vm4/9EM/1Nbrdfv5n//59lf/6l9tn/70p9uP/uiPTvd88YtfbD/0Qz/UfvAHf7B9/vOfb//xf/wftz//5/98+4mf+ImXb6CyHfzuWoJMBHJ75ArLqoDCgDIkG1p7CrosFou9bGKWyX/VMbUGtKnnbvc0m5jPVWRYazeBZxJ+tkeeJbjlem2XPGOAMnW5XbQl28c2meQxkGfitgdq04ZsC9/lScCO11M3+9Nkc8omCMq6bFtmoRHopL4knJgVyPp5PzPWQkYRaLRdqCOlKtfvBSaIaKDY2S8mK5IpQyIvdRio7BFa9iOTEFUGLPsqdaZsjzGD2CyvAlr5HMmmfHbbqK9JHZZbEYLRk59p657Q3wk++12aaS/He95jSb3m8/leX7JtFBKdPXKIflZlZLX2bMNCRbJkk0ZFxsXnnEVLEoJ9bFtwbKYO+5xtle/MyGa/8W9iHeOxCZuKTKG+Ofa6ii8ZE7Y9pZor+Z5VPt8jdQ6JY48J4FxzzGA/HiKT0scWx2E+Y/KOz3BOchxhfOtt+OD9lS2qTS0e8ya0HJtYvuNmRWzZdmy3bcHv9kFuEnLd/MvnPI9X47u1/feA2x69vqIwFkeqjS1ed9kebjftz3u5AaTagMZNA711ick4PnfoHs9xnMs917D9vs467SOph/dY7LNea3h8OAY5ptin3S+99cehZzxfcg5kffnMo/Z7pD0/u63Ve7w5v1XtpXCsuI/d9tzrNaH9yH3ANcAghN9ceR3/bz9kyJAhQz5a+emf+MyrVuHNkH/z+1r7/Z981VoMGTJkyJA3UF7qyOi/9/f+3t73T3/60+1Tn/pU+6Vf+qX2J/7En2gPHjxof+Wv/JX21/7aX2v/7r/777bWWvuv/+v/uv1r/9q/1j73uc+1/3975x5cV3Xd/6XXlW2C/MD4hbExJOURDAm0cfRLQ2nx2DBMQxumpZRJoCFJoSYNISUeOk2gdKYwMA3Th0PSaQKZSRuazIQwBZLUYAwlGAjGDjFQ/YA4mCR+tBDZxpZ0r3T37w9+6/h7vlrnyjaydHT1/cxoJJ2zz36stffa56y19znvf//77T//8z/thRdesIceesjmzp1r73nPe+xv/uZvbPXq1XbTTTdZpVKxL3/5y7ZkyRL7u7/7OzMzO/XUU+3xxx+3O+64w1auXHnIjcQAsNmBVzej4xF3faGj1yz//TPPB533nsYdZ7gzGAOUGJhA5zs6oTA4hc59z8fzxmO+swzrzwFW/9t/Yx2LnKtRUMudV1gPvg7LLfrtQSQuKwq6elrMA9vqaVkHXnd0hmEe7LTnIBR+7xYdeBwwwvpgP0NdRs5XdkLy/+hEZhmhM48dnRzAQFl7nbw+rsfIuYpjgL+NHbWfxwzWZ3BwMCdPHhvYBpQbygadt9wvUIccNIn6GTtiuW9yUIH/r9frucUdft3Bfk+Y80ZZ4Tncdeppox33mDfD/d3zcFm6/fB+jgFJ/65tSgdegx+9UrZarVq1Ws2ViW3CXascmEN7hgH6aByhTUKHehSs536I/Q/L5XSels/zd2AZtAtoPzgQhHYC82xra7P29vbwm8Per2u1mlWr1WF9FHXCtgH17HmifUS74n3a68ILYnA8tbe3ZzuZi/qel4fjIOrnbKdRJzhv4v8od0zvZfqxooUwqAuubzSvc15RkBLHbWR7eO5w8Fv3LqsoiINtZznhMZ6beUxxe6O+WTRvOZHtdX1gv+P6Rbrg8iL7iHlHefnv9vb23HyF9xvYz/CaIl1GthXL9XyL7hv4PgzP83FsI8ojmtOitnGbWH5en+g834+iXlBufK2nx/se/DQJ39egjLFfolyxz+CiFoflgdfyIgvsM9GYxbbjPT4vKGI9FpWPMuH249iP5jFsX6STaPzzuI7GK7bN53fM08uJAv1icjBRn+2FEEIcOfa9uW/kROLtM22K2UT+/rEQQogJy9vyAOzevdvMzGbNmmVmZhs3brRarWbLly/P0pxyyim2aNEi27Bhg5mZbdiwwZYuXWpz587N0qxcudL27Nljzz//fJYG8/A0nkfEwMCA7dmzJ/djlt/1givh8bXC/j/vskWnXqMAADplcJcZpnNnDL/SDeuEDkTc4enBat5RgA6maOcWOw8d/l6uO4OwnuiI8nrh604jx7DnwbuJuK5+TeQoRFni7jfPD9sSOdvxb5azO8VYptguzxudg9EuHA6UoH64Tdx3ipzqeB23K3IcoyyioAYGhLxc1D0HH9gBjv0Sy4mc0uiQ9YBKUUAjcspiHRzsO5ETNgo0ROMO02BZ2OdZ/jwmuK7YJnYes0Md64syYLmhE5wDGkg0Bln3nN5353rAEX/wONbHg8H+GmmUL9oKDIBETnEPEOA30bEP4DjCslCGXkcfjx645HYWBV1QjxjERPuGQWu2RZ4P649/e704CMF9A530eH1nZ+ew17Z7f8D+w33Br+d2Y7/i4AL/jYEB7BudnZ258Yz1OJTvTkbBITzHfQhtBfYnlgHPV3gtL6rBOQoXGmAw0yy/m5/ri/LEPoJl8uIDB+cgrjvnyzLydmFAh+87PJ9I79z/OF/scygLDsxj2bhwAm0p2k6USdF5DmShDPBvvreJfnDxTKPFAnwvwf0K64P2AuXpbfHxHC0+iHRYFHxjGXNZWDce35g33ys4UZ/g/Lj+PH9FAdnoGp6no7SN5nO894raU3QPw/cnbFNw/sT/0V74/43uHziwisfxbQpcX+xnOOegXtgmoPxw3PkxfJ5B2NZ7njj2hGDK8mxf9FwvhBBCIPV63WrV2nhX4/C44P+Mdw2EEEJMUg7bG1Cv1+3aa6+1D3zgA3b66aebmdmOHTusUqnYjBkzcmnnzp1rO3bsyNLgA6Of93ON0uzZs8f6+vrC+txyyy02ffr07Of4449/q4GtB3ZisfOXvykcOXEQd664w5GdMP6qaHaUefrIAc0OrMgpjI42DFhEO9bY+eVgQDQKSnE9UDYePMX2RA5FlAU7iTFojPXxa71tkRNupGNRwIbbz85kdOZH8sJgZlGwwtuBcsc+EgUV0ImLdS0KkKD+uG/gdRwsYQco9yfu5yg7rF+9Xs9eRct9EcvC+rCjnR2PUZu9XCQKUPgriiOHOAYrUSd4DGWCdS/qt9h38W+UFy+U4Os4SMVOaG4rBlF8LLJcsY+MtKgAg6noyHb427MeDHabiHl4/p7G6+bfYMfXZGLQN9Jr9HpLPI/nMCCJsufxjmnQcY7HXGfYR9DB7kFp1gnrFfsdpucgpMvP8+FXN/Nr8fmVuT5eo8AHfy+Y7YS31YO7GBD1dmPgBe2Jj12fN9rb27Pxh2kOhqK02K9RlzzOioI7Ud7YBpYdypDnEB5P+JsD8tg3uR1RGby4JPoOOtef7STbMA7qsB2M5o9G80x0XTRHscyKArpsqyIbyUE1nqe53Zif92m+z0H9c/u5LKwv90+uB7Y9ahfLge8zsKwoP7yW9YTX4twa2X+vC14T2bNG5XBfwHJHqhvrkPtGdI8dzZFRW1FOeM51x4slME+0b6g3PoZjFfPgurIcuP08h3FZ/j9+/x3P4f0pthnvlVjefL/BuuCAN89vQpTp2b7ouV4IIYRA9r25z57+4TPjXY3D46XXxrsGQgghJimHHRBetWqVbdmyxe65557RrM9hc8MNN9ju3buzn9dee2tyxRX7ZnnnEO4GQue6gztt2EnjeeFvs9hxxo5NduJyOr+Wg6mRI5CDs+j4RYdVkQzQeYUBWdxFheWh440dd5HjFAOmHkRyWbAzGh2ojn+LE/WFARcMeLjcojqybl2+CDrV2Lnm5fI1uFMRg1yo82g3hv+Pr4j115CzIxn7nC86iL4XzXrnABgH4FxG7MR2eRXJAvON+hSmx/+5bA9Q4fUuM9SRB6UwMIPl+attiwIpqA+Xk8uxXj+ww5XrEQUNsC+gcxYXOGDgCJ3EGHTjccEBQbYFmC5aDNHIoYvpsZ/5/9gXMEDowT+2Dxykb21ttYGBARsYGAid1+70Rr0UBWQ4sOfH/ZXUbu+wH+DYd3D3LX5LG/WLx/B6zBvtLOvL83Kbhv0H645jJdrxhsemTJlSGABzW4OLjrz+rK+UUi4Q7GONx46PH2+36xnbPTg4aP39/TYwMJALdKBOR4Lnhkb9tSjAUZSXX8PjHevK8xXbuaKFBJHdisC88bvLUTu5rlguzxHY9mj8YEAQ+ymWW5QHt4/HXlGwn20/zgs8R0T1xTrzXBeVxe3xumI+3E6z4fdbbLtYFmaW69PRPIK2NAoAYt2wH0Z9IQq6Yt1wDo0Ww3B+PhfxmMF+xHrAdrJcItlxvyqSPevhYOarRvM2X8f1wH6EMsJx7PNGJIdGY8WP8yIVbxsH33GhaDS+uF+gjDiI7HYb61e0uINlyWMMy+Xx4/1MiDI92xc91wshhBBISmni7hD+v9vGuwZCCCEmKYf1wYJrrrnG7r//fnvsscds4cKF2fF58+ZZtVq13t7e3ErinTt32rx587I0Tz/9dC6/nTt3Zuf8tx/DNF1dXTZ16tSwTp2dndbZ2TnsODqGMBhpZlkgDgM7ZsWvaUPHDH6nziz/imF0QKETyo+7k4qDo+gI4h1E7rBB5w06bdlJh84mzzvakYu7f6PdlujMYodWtOMCdyFjWShHd8777kJ2/ruM0PmFMmJnZuSY5G84uq4wgOnnPVCCsi1yTnpa7F/eH4rkwrrC67C/jeRA5v/RmRjVHR2HLncPgHKwAfPEhQgYMOX07MjnQEvklC5y8uJvzAsDWCkd2LmO483byosMsA6YvsiR6gGxRgFh1H9RcAHHTjRuo7GJ5WF/5DY6nCc6iKM+ioEFdJ5jOwYHB3M77vC11VEwurX1rR3blUrF+vv7w0UKWF/WM449DFLz2MPjGMRlxzzaOOw7mAcHYTit23V+dTUG6XEM4bhiG9Yo0ODyqdVqmR3EdvD1/Hp6tF/4P8oH5ev5+re8ccEP19vby+V5oANlGgV2GoHjL7Jx0TiOxhnKkeuJQXjWAY9/nku5f3BdeL7yOrM95fRFeXmdI1uJ8JwXzfeYFvsq2hCuN8uU7x94TirSCcuZZcG2j2XIc0aR3cN6+HEsi+devI7f2MF1x34TtYOPYb/BxWa8uIDl423j+0K89+F8IvB+g9uD/3N6zNPrz/NDUX5RX+NjeK7RddHfmBbzRnvG7eNAJvaLRmOJ+yDOtzyX8j0O6gv7KY47vz6ax9AuY725PWzfOU+WKd67YTtxfsT+jtcWLQARk4eyPdsXPdcLIYQQAqjXzfbFb9EUQgghijikJeEpJbvmmmvs3nvvtXXr1tmSJUty588++2zr6Oiwhx9+ODvW09Nj27Zts+7ubjMz6+7utp/85Ce2a9euLM3atWutq6vLTjvttCwN5uFpPI9DrbP/RockBjv8PDtdOQhalA6dRLzSP3I++3W+cwuvdTgo5XXGc767CwN2vsMLHbkoh0Z5oxML/0bHv5eJzlB0JkavfUb41aS+a47/x50RXi4GwVDG/qpad7Dx62XRCRY5qzlQHjlNI71zAMvTumMPA7LsaPe/+TuivLvI7EBwDXWK/S7arY1Oc8/Hd8R6Ot6dis7QkZybUbv5eoTHggcB2TEd5Y3/s8MU+yCm5VeRchk8RjlYGgUOot2E7sBHfbCDHuse9V/s354vO7m9fP5OaCQjPu46wQAEpvMxjTLHhRQcxIkCJ9iXsR0e7GTbwE54HntseyuVShakNXvLTlQqlVwdvS1eN3ylLDrt8dvxOA5Qxo12c0VOeDzOb21w2eOr17EuaHvdnqNjH3ez43jHOtRqNavVarljOIZZVzwesf/V6/Xca8o98O/lokyjgMtIsB3DH5w7cD7lazHA1CjY5O2JAt8oX1wMVjRG2cZg+WjH/Zgf5/7GgSSXP7aB7yO8TNdTkVywDigPnr+wXXwN3l9Ec6G3BReAeB1QH1E9OLiGssY8WI94TWT3WEbRvMDywOuxDvi5h6I5juXG9eIy2NazfPCcWT6oGf1g2yI5cV/D+mPa6J4N0/OiIB53KL9IT0X2E+01z308P+Bvvkfg9mC7sG54r8Tn3Q54fVD2/GYLLIv7VtE9MOqK+xO/Ktqvi74Tzp8/KOrbOEfwPMHlYL87VDsumoeUJt6zvRBCCNEUvLjVbOcbby+PfX1m6zeOTn2EEEJMGg5ph/CqVavs3/7t3+y+++6zo48+Ovsu0PTp023q1Kk2ffp0u/LKK+26666zWbNmWVdXl33qU5+y7u5ue//7329mZitWrLDTTjvNPvKRj9htt91mO3bssL/6q7+yVatWZSuBr7rqKvunf/on+9znPmcf+9jHbN26dfatb33LHnjggcNqZJEjFwMkuBMgcpCws7PIuYsOKPxOJV4T7VbEstm57ODOLnfUcQDPd574jjt2bqODjduHO0J5p0FLS0v2at6hoaEsaOLl+jHME4PFKJuiwB8e5yAlyhX1WJQOA1HoAETnJh43G+4kx/R4jh2jGHDz80XBjSgAFh3DckYKxGL9sV9w/VD2UQCCHaDe56KdIxhYaOSoxnYV7ZZB3XLAmvUQ6RL7NsuGj+HiCa4Xyr3I2Yw64p3TmAemw3GC6Zyi15QWBQdYB2i/IniBhOfpNgrHAC8Q8LGE6er1embbPMg5NDRkAwMD2Q5ubA8HXKIgAQdJ0N5gO6rVapYe37TAMkBbGu0ixTw4YMCyxTp4MBTtq6fDbzF7HhyU5WBuW1tbbudtpVIJgzP+d1Ew0PVSq9VyuxUx4MCLcTgI4zL0NP67s7Mz28k8NDSUW8gUzVNFuH3h+rv8+RXe3Ea0X9ynWM48r2B/YNvtcvB+hPgiI7w/cLnyt56xD0a2hWWBbYxkGM0JPFY5j2hej+SFdYjKxX7v1/LrdzE9t5N3zfN4Zz1zP+e5Hs9hX/AxHAV/IzvOi65YFjxnsP3y+yOeo3gRUNROlgfmz21v1J9RJlxftO+84AnlirYE68n2bqS5zGVa1OfM4rd5RH07khnWochOoJ75fojrE9UTZchzH/7mOZaDrTy/ozwjHXmeUdu5rMgORPcCqHteKIq/UR5sR8TkY6I+2wshhBATnjd2m/X1v/18CvxAQgghRBGHFBC+8847zczs3HPPzR2/66677IorrjAzszvuuMNaW1vt4osvtoGBAVu5cqV96UtfytK2tbXZ/fffb1dffbV1d3fbUUcdZZdffrndfPPNWZolS5bYAw88YJ/5zGfs7//+723hwoX2L//yL7Zy5crDbGY+KOtOlUqlkjmpOSjATibffcWOUT/Gu2U4KIiOaNyBg86iyLHlAQN03GE63oXh+UZOVQ72+Gu0OWDL5aFM0GHJji92rLGDCYPM6BzjoC07JSPHIToX2fGH10XOeHa2RY5alDM7wrENno4XF7CDOQoAYBquC77KO4Jl7u3C81h+keMRHZaRsxTrin2MdVKUd+TYZMcz58n69Prz95k96I+7Or08/M4q0sghjPXDHZuod3amjiR/DNJzediPseyobmg7Il1FOozwNN6/MNjlvzmo6n/765QxONba+taO0f379+cCahwA6OjoyB3HhQZYH+yrrG+vI8oJ35rgaT2AHbWpo6NjWPAI/8ZdxXiOv5Xt8Hd9WW5eLgetUPfeno6ODuvs7My9gcHlgHVxe4O233dP80IdLhflxnYY0/kYwn6KC1R4QcdIcL+M7B/bGD/GQRK2PZxvNEa8TZEd879RVjwnMpFNLDqHY5h3+Ef2iRd2cH9im8DporYV1Y2DVTxuWd/cjzBfPF+kN54rPC0uRECixT+N5MX3UCPJrUhX2Caep4qCgljP6H4N07B9L7pXQh15HYrmY5y38J4lkiG3JZrjuM2oI7TTLHu8v0V74nYV+z6ej8YSLrpA24ZE83ikD56v/droeJQ36gPnTC4b51SuN+oO68WLlvBcS8uBxUZF9yMI6pT1ENlWlL+YnEzkZ3shhBBHivgeVYwy9WT2+m6zExaMd02EEEJMMg4pIDxSsMHMbMqUKbZmzRpbs2ZNYZrFixfbgw8+2DCfc8891zZt2nQo1QvBwBQ7nltbW4c58v08OsHxXOTQ5XRYDgaKORDiaZDIiY3Ho2AI5h/VP3KyYTn+zUzcfRY5GtEJhUEuDqBzvfA6DuCygwodd7wbh52huBsW82V5ceAFZcA3up4X7mTjHTPsNMf8sC+N9F3UyKEfOcWxT3l+3g/5u62YHne++XF+FSHLnB3lHtBkRyXKJXLyc7/Fv9lxzM5KHJ/8ykZ04Ppxdkyz05X7Du6e8vpgeh7DeBwduFGg2+FAAfc3Dk5EQYkiRzG3M3L2chrPwx3KuEDGzHIBYpYT2gS0X9HiEg4Ue539Gn/9MdY3Ck65jfG8cDy5DnxnrZfh9tV3snLduM/gtV52R0dHFkxGG+S4bUgpZbJEnXPgAevPfYd/WltbrbOzMwwAc//Gvut1xEAE99koAIltRDvm34X2snzXca1Wy9n3SqVy0E6CojnW21I0PjENE8mF5wFvk58rGuMoV9ZVtLuu0bUOzp3cdr6Wx7X3fe4LnC6qg4NyaGSP2dahzcG+jGmwzjxn8FhGu8GyxHzdLmA5Re3msYT2PJIH1pnnWJ7ji+SDckWdRvLC+T3SL9t+3kXLth11iK8O5jyxjl53lA/WHe+jPF/UH8oU7T7f00Tt4vFtZrl7qmihmMuN762iOZLhce1twHkuunfwtqHd5L7d0tIybM5imUfzNts3LwvTR6+a97ZjO6I5km051hfTFwV7+X7jYG25aD7YxkWU7dleCCHEkeUnm16w3jd6beYxM8e7Ks1NbfCt1z2fferh5/GL/zHrGxi9OgkhhJgUHFJAeCLCDhUMbrAjzEHHlzuDihwwno53W2EgE4N2Ra969uvYicvBt8hx5mndYR+106/B8+zgwzazQ9CD5xwYQ+cdOr2wnlFQm3eIYNAInfq8cwQDtpwOX5fqjjP+7io666KgA9YD5c2OM9YvOy+x7/FuHz/H/SdyVLJzMQrCYoCMz2E9sH4cYER9YTq8LgocR6/JjpyL2Od4kQQ7Ldk5hccxsOjlDA4O5oI+kXx5jGE/Z2c61x/7DcsKHcDs0PdruR3Rb7ZJODajYA7Wgx3hnNbHAPYnb5Ofxx21HBT2BSNsR9Eu1ut1GxgYyOWLcvJgseuO9RsF2FH+qK/29vZhAV7s+zg23dmPr7n3dLiQBMv38VypVIZ94xzr5u3zNJHs0bbiwhl/8wMGLDyI7v3A8+Rdchhox/7sskf5sP0o6lvcrlqtltt1XK1Wh8kA57kiouAKloXjnoMteD32PcyjUUCDAx6sGz7HdobLa7TQCee6ItmwTWK5IxyQRt35tZiG6+P/F9mGaHxhfTCPaK6JbFEUYEL54TjCeuGcw/cXrEeet3C+4Xpxu3kcY9tZN9wv/H9cOIPl4LXYBzBtI/lFYyiyJ5yO9ejtxP+5Df4/3lNFOudAZFE9cbywjlGnaGPZLvAbI1Bu0RyK+Tca52wv+F4dr8U68eKPaIxGdeIy+Xq0FThnRfYpmkf4mQXncLZj0UIUtnH4TWVeSCOEEEKIycu+vW/aYG1w5ITi7ZPSWz8Nnqkb8uJWsz37RrdOQgghmp5J4wHgXR1m+R0I+OrR6DgGENyx4jvE8LuK6Aw2yweAPR90sCHooGPHJ+4s8OPo1GKnMTpWcfcYO4WjXW3smPU8/Xp+lSu2j+WDTmF2ahcFC4rk4cEpdgR6fribCh3yvisRg1XooIz03d7ennuFKActOAjBzjgMnKGMOU1RmzxYxPLBwBgGM6O0nga/Ce2wA5eDbpFTn52JiLcR642BNnb2chs42MyBDpQ5jlUHHbno5EV5c+Dey8LADS+a4DzYYYt9AGXP9UGwbdzvi5zDqBNeyMG6YrC/YV/B3VpDQ0PZd2IxgOJvDsBrOzo6snOezvuR92XWC347F9vIizT4FdB+zs/77l8MEOHYx52VqAsvH4O3HPSIghmYh48RlwnqJpI32kW0qzwPVSoVmzJlilUqlZy8uX+gfLFfViqVYUHiqG95kNhfSc19nedIl9fg4GD27WbUt9v4kQIJPCbwGNsk7B9sHxwO0HBQh49xMCcaj/47sh1s+6MysF5FNoHnaywfg7xYF24vyxGvwbTcb7jeOP75/qDI5vHvyCZ6ufjac+zzvPiHxwruUuX6MJHNQ9lG53mOKcqfA75F90lm+R27qDecTyP549jD73uz/URZ8PzPfSMCx2iRHeJr/X+8r+AycFFekQ1gWaN++LqoT/C9YtF9Fv5dNJd7njhn4NyDusP5CHXAfZLLKLIHqHcuC/PCPoBzptcJ/45k4dfjm1UcPOf/e16NxpkQQgghRJkZGqq/FVCdqDzxY7P+6sjphBBCiFGk6XcIewDDnZQYsHIHiDt90BmJDmnfuYU7adhRh2AgCXc+8OumPT93UqGjDl9jh7vYPH88h05YDzCyo42dUujcam3N7+BjJ5zLy+UYOZB4Z0zkjI6c3P6DO31cTo1206DjDo+h3L0c3FXhRAEfzwf7ju9I5AADOt8wz8i5yo70KC0GudhRHZXH9WWnKTopMajNryDF/Ec67noq2i0UOX29bpEjkuXM7cJdNOgIL3JgR7Lj7/dhv2EHNDtIuf9x4AHbi68P9jHDQRnUgadFWWIwleXHC1PMDvQZHqfReOFrHHxFsssLbURHR4ellLJvjbs8I0f5wMBA7tWnXA8PJLo99eCuy8rtHtpAfsW+L7zB3ZqNAlMeBMVgNJ43OxAo9TK9zdgXeJcaLoBwuL089vA8B/iHhoZs2rRp2auaMcDOO7m8PfwqawzyROPFdxfzOZwHOAhTr9ezucHtvy+w8TyLAlGRTNCmYN/F3zw2i+YTzI+DdTwv41jlwAymwWPYB3hew7y5b2F7+O9oDud6Yl5R0Ih1jbIskjvPa1gflzkvpkG7EY0bnoO5XMwf6811inTBCztQ9tzHi+byqBwOYLJeWZ7cX/jVzp5HNDcg/j++ph7tSnQNz7O8QCman3leQtmy/KI5CH9jPbgfor5Qrzx/cR2jv6M6YN9hnXB7eMxE/SPSBbfNz6EdNMvPs5wW7SvaHpSN9zfMF+9Lor7L9iW6z8U+hPbEj+OnDXhMo52N+r8QQgghxETh2Sc32Z7de8e7GofP//SaDQ3fLHRQpGT2Zt+oVkcIIcTkYNLsEMaAFDtxMDjKO9bwlcNmw1fjs9MQAy9RMGtwcDBzprPz2n+i3R+YDzrb/DfXAZ2I6HxCx3nkkMVXko7kvI4CEhiowB2ZGJTlABc78DA//h8da6hbdpBHzjbUbeTgY9Bhho46P+Y65j6EOuF6cBqUJQYkWfdeJu50LgpQcFCDnbVeDw/s8E4mbDsSOSsxfaQv7IfR3/i9V3ZQs+68bP7mH7cTd4Rj/ihH1pHLhHct8TjhvhPJF/UYyZEd8pgWr/cyOPAROaKL9ILt4jTedh+LHPBDG+i7UH3xSH9/v9Vqtazefg3LC3fjum2IHNzebn77AL8GHQOaaGt5fPFO4Khf4GuVva5Tp061zs7O3AIVzAOPucw8wM2vpvfjLGdsr9taDqSz7UEbw8GsoaEhq1ar2ViO7LfLDncScx+Mxg/KEs/zmDoUOEDDQQonmg88vf8d7e7HMnic4jzBczjTSO9FY6+RLLid2GdZz5hfZF+wHA7I4Q9ez3lE9caxiv9jPXk+xX6IeReVyzqK5g0/zgHTojmG+xTKnMe4WX688f2X583XRv0E+xTWm+XH9cVFbyh/PsZBTQ60Rv+jLtlWRIsIovZze/F/lxkG6/lehGXGefFYZrm6jHw+4nmF88D+wn0C5xu+z8J+7Gn5Ponnc6wj6jXSI+6+x+t4XjPL77jGBUFF+sX8WJ6N+geXe6j2WwghhBCiTPT3D+Tu0SYcv9pjtuXlw7s2mdmDj49qdYQQQkwOmn6HMO9MQUcuOnrwb7MDOwv9et41ZXYgEIHBGbM4MIROa3Y6cR0ih14jh5KXmVLKdvuhU6ylpSXb9caONf+NTt4ip7rXg53N6FDytLjTz4MR7FBD/eA3M3FXH8sHnWRFgXpMH+3g8HI9sMEOS0/Lu2nZ0eg7PbBM7DuRwzJy7jtRYNzLw7K8Hhj4QT2gE7AosMs7L6N6YjtxzLDjO3J4MyiLqH/yDheUN8oH+3g0ljCIVeRIdzCwGDl3OTDPYyPaQZRSyvovU+Qo9zbwdwGxvMi5j3mgbjhAgq8jxXNuEzgft2u4O9UXing5/OaD1tZWq1arOQc26tDb5nmgjLzt3tYo0IBpOfDEYz8KUPhvtJ3cL3BhAsoPxwkHDnhnv5frtgUDOhxc8T7k+fsro6MgC/ZHbAPvlMbgDs9p2Nd4vnId+Q5lbyMvePH+gPU82IAC9lNuY/T9c5wT+RzbdMwbdeLX4byIeozmOrQpbDewX0TzKeoA7S/21Wge4Hwj+xDZhijo43aQxwfrPWpfNP+j/PF3lGd0L+D15rmD5zjvgzjfcDleR7+O7724rmw/OF/WB+oVxwrXgf/m/3FRCMqC/0YdMDwWsE9wOZhPJG+UCfaR6LznER1H2K5EaVFHfE3UV7B81pXDc76Xgf+zLFierI9oIRjrJaqfH2d7EumO2xL1Sb8e7ym8bVFfx/sgvv/COmB6bp+XMaEdqUIIIYQQE5X+6lu7hA+HwUGzvoFRrY4QQojJQdMHhM3ib2Sxs9LxwAU61tEhYxY7k9GRw47ZRs4gLN93DqPDq62tLQvMYFAaA6jozImcelHgj53SGOyOnLuermjHgueHQSJuowd+UjrwGjszG+Yo9rKLnNMcaI8cd7g7w/XieWLdWF4c4EAHIjrQ+FXELG90BHLdIjmz49LbyUEdbB/3M8wfHb4sJ9Qjl8GOZHbSc3CYy0b9OCwjdEayU9LbhOXwbwwecUCIZeBBOWw7vnKY7QC2H3eRsYOf24vyxWAMjwkOMnPQwcGxwq95LgpyRM5zB3cfeTvQhni9eUcv9rGUUu4NB/j66Oib1xzA4vrhzi1sV9GYdn2i3DBPlNPg4OCwBSO4OzkKlmIfYD1gYNz75+DgoJlZ7pXbnt7hxQ+od2wD7grz894mduhzH8JyUMc4jlpbW7NgPPcdtGNsN80OBPzxvLf7YL4hzOCY4CAMj+nIXkZzRDSnYUAG9cblurxwfo2CKLyoAtOxfea/cYxH9xfRPYJfzzYT5+BobkJ5Yr0jufG8yzrCxTJR/my3orJ5NznqhQPSeE8R9XOUCV7HfSaqD+qN527uwyxbHHcoE56zI31huuieBcvhscE2ictje4syKpIVyw3Lweui+ZfL5HOso6jsIv1xvfkegPXDCyG4P0XyiMYYyrjReODyHLS5LBd+S1AkA64j/8991fPzc3g/xjrmvsj3YWgTG90/CCGEEEKIEvLUFrOeV8e7FkIIISYgTR8QjhxN6BA0G+4wxaAJ/o6CnR4QYWcPvj7U//ZyMUiFwWZPiwEpLw/LYMdX5EiKAicYhMNyse38umd3+OO3PtHhFQWtvI2oA6wnBkNYfixrx3cocoAEA0WRAxAdsKwjbAdS5NzH/oDp0LnvbeVvf7ocMI/Iuc6BolqtlqsH14EdwuhI5SAmyrZRUMXlzTrDPNnx7n9jv0NHY6SbIidqS0tL9spaDt77WEgpvxue28COZF7IwE5pD+7xeMF8UObskEV5cADLzIbtUMT+ibC9aeSkxvJRtpjO+1NLS/4b4+xAxiAN26mOjo7cbnn8FjuWOzQ0ZLVaLbc71uvv8mUdIuhExwAk9zWUBwd1Inn4bw7soD68v3ng1PPz8YtB0ig4gXMKj2Fuo//Gfujl8u5o7IscJMb+wQEm7Odo61G2qA9sn+8A9v/b29utr++tbxNVKhVrbW21Wq02rF5FsP44aIOyYLsWyQ37Itu8osBNZCfxN57jBSTY36LxhXLnurrcsS7RvQiPcS4f7T7eW7i+OEDF9cXy8d4H28zjhuXIdjGSMfd5v0fgMvE3/83jm8vz+5EoD7bLUf48fovGKsqH57xoPuN5Da/D8coLC7DdPB4cvo/w8jgPTBPJgHWFssV7pWiOx3x43mObhTbQy0PdRPXjPHlRYZEeUXfRvQzWDRczeR1QXpiexymWgXOBL7Rx0CZgHpF9KAomu63G+YfbzHVjeWJdI5vHY/pQF/YIIYQQQohx5ntPmNUGx7sWQgghJiCTIiCMzhsPChQFI/BvD2Lw61H9enRKukMFHbe8k9HLxtcno9Pdy0PHju90w4AcOu3YCcsOfw4KYlovkx3G7Ohjhynv3PB2tLW15b6PbDZ8Jxa/Xtcdxi5bT4fXR05ZdmxFjmB25KOD051sHgjyIFDUJ6IgtV+DeePucP6GqV/r8vZAOzv2MPCOwTx03NVqtWEyxPqirDDAj98L5usiOeEiBU/rwTyWCTrDUd9eThSYx36J9cdgYdR3i8pm/SIso5aWltyOfHYCR2MCy+C+5X3Cf7Msub9iXbjPFQXdMbDCdcXrGrUbnb/sBMYFKa2trbkdsH6+Xq9bR0dH+F1mDnpgMJed/JFcMT+vi5eHeXvf4sAX2gFuH6fhxQo8DjlA5nl6v+E6RwEL7h8saw5M+47b6Lu4XkcM5qOtw+9t8hyAgfBofsB00XffMTiBgT2U20jwfMHjDOe3oiArj3kei1wW6xXnCNQH2me0ydFijagsnCdQpiONdcw3CoRzYA5tEtuHKLCEbYuO41jgfhvZOZYpy5oDSnyPg+1lu8g2FPsEy4/Lx/OcZzQfoF65TZGOeP7iPolyxgUdPLbQLvL8wfcXLDPu0ywbbEskC5wzuXysH46F6N6C5RL9XZSGxwXqB+d11BX+Hdlpz9flEb3Vg9uI+oqeB/CaKHCM9UW9mFn25hu30/zZEdYX96GiPh7ZF9QV29UimY4kYyGEEEIIMYE4yGdxIYQQgmn6gLDZAWcwBsTQUYq7odBB7w4dDMBgYNjzRgcP/vbzZgec8hhcZqdxW1ub1Wq1nBMVX1eKDiGsE+aBjkuz/GtU0RFXr9ezgJjnga869eAD1hWdW1FQHINBXkd24HsdzSz3LVi8PnL6pZQy/WG7I4dmUdCHZe7BYHaisQMe82eHeKMyo9/YHl4wgI5b7GsuM3QqNwoIsIMeA0GoS5S31z0KavC4YUck9gd0eLPc2RnOAV2U9UjBgigQwG3gPPl/1Bc6hjlIjXXA+nJgFsc6ygj1yPaAYdvk7eIyovpwn0HwNb+4G9rrhzajaPxwv8Ry29vbrVqt5oKl3A9wkQTaF/52Mo5vXCSC+sN8PWCNix98gQo6yl2mvMAHgwOtra3DXoPMdcQ8fQx70Jp3LhYFbdCGe/Cgs7NzWDDYr8EdzLhAA3cLR32Y//Z88Q0ODo5jrLO339Pgmyvw1f+NQNnxmGw0vv18ZHf9HNsCtukcCMb+iP+zLeR5lRezRPMKts11zAE5PI/1w74VBYQ4YIR6x/axbeYyWC8sz0hXnm90r8MB1qIgF+sE5zIe/5gX1xttlf9fNB9Eb1Ypsp1cBv6NC8Z4zkd94II3njeiYDL348gGet15PuB7FbRLOAexfqLd1Ty+WCZYHx6HPE+zrKP+yGlRXtwPWD7R/QLWA+Gx7vXh+yFuM9eF64D313xvhN+ixzHDbY7uYzCgHckLZYX1RJmM1JdxDsQ8iu4dhBBCCCGEEEII0VxMioAw7/5hRxy/Xhl3YTmezgMGHBB12LHszpjoNa3scDaz0EmNadhxis4oDI5wYACDJB5g8PLcAYU7xHiXJsoBg4WeluXHjqrIIY1OVJQHOh6jH3TE+o44dnqxDtl5jkGxyLkcOVKj+uMrs/36qC3+N+5K9XqzIxZfCYrtxcUBvNsm+j5qFKhhJyI6RrEt/M1Nz8t3OHMQgx21GFThna0YkGP58qIEHh8YnIsCStE1DgZlGvVRXgQR6QjlxjLy4y6DIkc2HufACwdcsM+wI5nHC7fZr3NbgccwHQf+KpVKbic7O7n9uAcFOSCMYylyinOQAV8ljf/7WxLYpnl9sc9gW4aGhqxSqeTGDObhQVz/H4N4Pg4ixzyOZS/f80ebjzbdF+CgDlAuvjuY7VT0lgkP6nu7fUx6Pv432mX/n4OUvgjJy0DZuX7RHkWLUSI7g/Bc2CgAEwViuP9ErxznOmBQBe0YB414TnH5czo8z7LCdmCdsQysY1Q+5unHo8VceH10HxHVhXXF9YlseJQXyhTbiHKLZI7zqY8zrg/2EdRB1Aa2cVhvfMMG6hzneb4+kmEk52i+QblxYJJtIPYfLBPvP/w4yjK67+H7Ea4D6gfli2lR1kXB0WjOiuRW1P+iMc0LC0eC+wrPR9H8zH0nmjNdL1F/4MUfRe3mBQZuO1mmPB5YZp4n38+zreCAfzQfF8me5Y39mNshhBBCCCGEEEKI5qXpA8Lo9MCdVRwA9eMe0EDY0YKr9KNV9ngeX/lc5MSKHDO8O9eDdPi/mWXOfA5cYQCNHT2eFwYO2Lnk7WZnG+4Ow11ykbMag4oYnMBj7GxGB2WRUx4DyOxQRNlg3qjjyHGLgaLIoY4y9Tz4bw5YIegMjXaQ4DXsZMVglZ/ntrHTnZ2Z0S7MKLCDASCsHzvFnWjHCgdO2AEaBRLQoY95sFzwd+Rkx/PYJm4H94UoGMB19utRf5GesX0YGOeAvafxscDfAkXdsjObiRzveM6/74u69fqhrFEubIdwQQratGq1mrMluNgCg6IoPww44t/oOOdAOwdEsN/wmIiOcVk+XqIFMPid96jvDg4O2tDQUBYMx7FZFAzs6OjI5gTs224TsGwOImDZLlu3/bxYBAMG3gZ8GwQHjbC/YJ/A9vCr/lEukb1j0M410hvaPBxHmJb7KMua9cznvSxsM+ZdFHyLgimR3cC2RG9m4LpgGz0djrPoPoHtcRS8iuYzHg9cp6KAE/eJInvJ5XJgi8eR6yrSC9s9Lo9tCy6M4LmoyDZEdpllyIuRUI48l7EdxnmD64C6Q3sQLZBDnThF/ZLtRhSE5zyieRHzRFmhTnkexDrjWEIZIVF/jcYGy4jLjOrAdhjbyG984LbjmInm1KgOPK/zfIwy5FdRc5/g+yruO0XjHeWPdee80D7inCOEEEIIIYQQQojmp2kDwugsw8CDfzc2pTRspy86P/Fas7yjzZ0o6JjFoKr/xm8Cex6Dg4O51w96nryDCR2V6DDlXSn+G4MTuEOBg4hcT5cFOtDQcYROK88Pd3hGQUqsr8sY24rp2dHneaITzYPA6GRF5x0HLByXCQd7MRAUOW7ZAcrnvY7oIMY6+jl3PPoxvh71w/0Ey/cAGvYZ71/scMfjTpEjFo95v+F+5flEu7AxLw7McwDV0/lvHEuR49O/k8wLGtCZyU5fLINlxW3wstAxGzl+0T40Cr6wTHH8RE53DrxEYw4DyqgTHteYZ1H7vQ/09/ebmQ0bCxi4xrFhZtbf35+dd71UKpVc0MsXvvT19dm+ffuyb+GavWUDBgYGrKOjw/r6+qy/vz8LTtfrdRsYGMgFw73/dnR0DLM9aCur1ap1dHRkgVZ2+Pt5l0O9fuA1+RgE9voPDg7awMCA1Wq1bLezywHHMY/ZarWa6QX7vtfF8/Z64CKkarVqtVrNBgYGbHBw0Pr6+qyvry/La2BgwKrVqvX19dnAwEA4j7W1tWXX+47uyLZUKhXr7+/P6lOtVm1oaMiq1Wp23OvmcvJ8vY942X6d73oeCbR7PN9g0DOyP9jPGo1V7O9YLi6S4TmqKDiGYxvtMuqY7YmDcwb2PQzS8HXYbrSXI9ltrCcHdKJ5J4KDXyg3rE/RQgKed/EaswNvU2C7xbYY/0Z5YFu4vlF/4PNFv9Eu4r0R1wvvTzhQh30zkjmXgfcheO/h8mV4/kM7gjrhtnNZ2Haea/l67Pd4DscQz1MsU9Z9NJ6QaN5lGfEx1AnKxMt1eL6O7vn4euz/kT1tVE/Wi9tNtntcB9YBj3OsP+oG7wl4vorsE1/LMmtkK4QYT9Q3hRBi7Egp2f59fbbvzf3jXZURGRgYGO8qvH36B8z2Hoasa8M3MwkhhBBmIz8/taQmfcL66U9/aieddNJ4V0MIIYQQQgghSs1rr71mCxcuHO9qCDGMn//853b88cePdzWEEEIIIYQQovSM9GzftAHh3t5emzlzpm3bts2mT58+3tURwJ49e+z444+31157zbq6usa7OgKQbsqN9FNepJvyIt2UF+mmvEg35WY09ZNSsr1799qCBQsO6q0PQow19Xrdenp67LTTTpNNKiGaL8qLdFNepJvyIt2UG+mnvEg35UW6KS+jrZuDfbZv2ldGe6OnT5+uzl5Surq6pJuSIt2UG+mnvEg35UW6KS/STXmRbsrNaOlHi2dFmWltbbXjjjvOzGSTyox0U16km/Ii3ZQX6abcSD/lRbopL9JNeRlN3RzMs72WgQshhBBCCCGEEEIIIYQQQgghRJOigLAQQgghhBBCCCGEEEIIIYQQQjQpTRsQ7uzstBtvvNE6OzvHuyqCkG7Ki3RTbqSf8iLdlBfpprxIN+VFuik30o+YbKjPlxfpprxIN+VFuikv0k25kX7Ki3RTXqSb8jJeumlJKaUxLVEIIYQQQgghhBBCCCGEEEIIIcSY0LQ7hIUQQgghhBBCCCGEEEIIIYQQYrKjgLAQQgghhBBCCCGEEEIIIYQQQjQpCggLIYQQQgghhBBCCCGEEEIIIUSTooCwEEIIIYQQQgghhBBCCCGEEEI0KU0bEF6zZo2dcMIJNmXKFFu2bJk9/fTT412lpuaWW26x3/iN37Cjjz7a5syZY7/3e79nPT09uTTnnnuutbS05H6uuuqqXJpt27bZhRdeaNOmTbM5c+bY9ddfb4ODg2PZlKbjpptuGib3U045JTvf399vq1atsmOOOcbe8Y532MUXX2w7d+7M5SG9HDlOOOGEYfppaWmxVatWmZnGzVjy2GOP2e/+7u/aggULrKWlxb773e/mzqeU7Atf+ILNnz/fpk6dasuXL7eXXnopl+aNN96wyy67zLq6umzGjBl25ZVX2ptvvplL89xzz9kHP/hBmzJlih1//PF22223HemmTXga6aZWq9nq1att6dKldtRRR9mCBQvsox/9qP3yl7/M5RGNtVtvvTWXRro5dEYaN1dcccUwuZ9//vm5NBo3R4aRdBPNPS0tLXb77bdnaTRujgwHc988Wvdn69evt7POOss6Ozvtne98p919991HunlCjCp6rh979GxfXvRsX170XF8e9FxfbvRsX170bF9e9GxfXibis31TBoT//d//3a677jq78cYb7dlnn7UzzzzTVq5cabt27RrvqjUtjz76qK1atcqefPJJW7t2rdVqNVuxYoXt27cvl+4Tn/iEbd++PftBwzI0NGQXXnihVatVe+KJJ+zrX/+63X333faFL3xhrJvTdLz73e/Oyf3xxx/Pzn3mM5+x//iP/7Bvf/vb9uijj9ovf/lL+/CHP5ydl16OLD/60Y9yulm7dq2Zmf3BH/xBlkbjZmzYt2+fnXnmmbZmzZrw/G233Wb/8A//YF/+8pftqaeesqOOOspWrlxp/f39WZrLLrvMnn/+eVu7dq3df//99thjj9knP/nJ7PyePXtsxYoVtnjxYtu4caPdfvvtdtNNN9k///M/H/H2TWQa6Wb//v327LPP2uc//3l79tln7Tvf+Y719PTYhz70oWFpb7755txY+tSnPpWdk24Oj5HGjZnZ+eefn5P7N7/5zdx5jZsjw0i6QZ1s377dvva1r1lLS4tdfPHFuXQaN6PPwdw3j8b92datW+3CCy+03/7t37bNmzfbtddeax//+MftBz/4wZi2V4jDRc/144Oe7cuNnu3LiZ7ry4Oe68uNnu3Li57ty4ue7cvLhHy2T03I+973vrRq1ars/6GhobRgwYJ0yy23jGOtJhe7du1KZpYeffTR7Nhv/dZvpU9/+tOF1zz44IOptbU17dixIzt25513pq6urjQwMHAkq9vU3HjjjenMM88Mz/X29qaOjo707W9/Ozv24osvJjNLGzZsSClJL2PNpz/96XTSSSeler2eUtK4GS/MLN17773Z//V6Pc2bNy/dfvvt2bHe3t7U2dmZvvnNb6aUUnrhhReSmaUf/ehHWZrvfe97qaWlJf3iF79IKaX0pS99Kc2cOTOnm9WrV6eTTz75CLeoeWDdRDz99NPJzNKrr76aHVu8eHG64447Cq+Rbt4+kW4uv/zydNFFFxVeo3EzNhzMuLnooovS7/zO7+SOadyMDXzfPFr3Z5/73OfSu9/97lxZl1xySVq5cuWRbpIQo4Ke68uBnu3Lg57tJw56ri8Heq4vN3q2Ly96ti8verYvNxPh2b7pdghXq1XbuHGjLV++PDvW2tpqy5cvtw0bNoxjzSYXu3fvNjOzWbNm5Y7/67/+q82ePdtOP/10u+GGG2z//v3ZuQ0bNtjSpUtt7ty52bGVK1fanj177Pnnnx+bijcpL730ki1YsMBOPPFEu+yyy2zbtm1mZrZx40ar1Wq58XLKKafYokWLsvEivYwd1WrVvvGNb9jHPvYxa2lpyY5r3Iw/W7dutR07duTGyvTp023ZsmW5sTJjxgz79V//9SzN8uXLrbW11Z566qkszTnnnGOVSiVLs3LlSuvp6bFf/epXY9Sa5mf37t3W0tJiM2bMyB2/9dZb7ZhjjrH3vve9dvvtt+devyLdHDnWr19vc+bMsZNPPtmuvvpqe/3117NzGjflYOfOnfbAAw/YlVdeOeycxs2Rh++bR+v+bMOGDbk8PI2eicREQM/15UHP9uVCz/blR8/15UXP9RMPPduXCz3blx89248vE+HZvv2Qryg5//u//2tDQ0M5AZqZzZ071/77v/97nGo1uajX63bttdfaBz7wATv99NOz43/8x39sixcvtgULFthzzz1nq1evtp6eHvvOd75jZmY7duwI9ebnxOGxbNkyu/vuu+3kk0+27du321//9V/bBz/4QduyZYvt2LHDKpXKsBuruXPnZjKXXsaO7373u9bb22tXXHFFdkzjphy4LCNZ41iZM2dO7nx7e7vNmjUrl2bJkiXD8vBzM2fOPCL1n0z09/fb6tWr7dJLL7Wurq7s+J//+Z/bWWedZbNmzbInnnjCbrjhBtu+fbt98YtfNDPp5khx/vnn24c//GFbsmSJvfLKK/aXf/mXdsEFF9iGDRusra1N46YkfP3rX7ejjz4699oiM42bsSC6bx6t+7OiNHv27LG+vj6bOnXqkWiSEKOCnuvLgZ7ty4We7ScGeq4vL3qun1jo2b5c6Nl+YqBn+/FjojzbN11AWIw/q1atsi1btuS+ZWNmuW8GLF261ObPn2/nnXeevfLKK3bSSSeNdTUnDRdccEH29xlnnGHLli2zxYsX27e+9S05AkvGV7/6VbvgggtswYIF2TGNGyEOnlqtZn/4h39oKSW78847c+euu+667O8zzjjDKpWK/emf/qndcsst1tnZOdZVnTT80R/9Ufb30qVL7YwzzrCTTjrJ1q9fb+edd9441kwgX/va1+yyyy6zKVOm5I5r3Bx5iu6bhRCiDOjZvlzo2X5ioOd6Id4+erYvH3q2nxjo2X78mCjP9k33yujZs2dbW1ub7dy5M3d8586dNm/evHGq1eThmmuusfvvv98eeeQRW7hwYcO0y5YtMzOzl19+2czM5s2bF+rNz4nRYcaMGfZrv/Zr9vLLL9u8efOsWq1ab29vLg2OF+llbHj11VftoYceso9//OMN02ncjA8uy0Zzy7x582zXrl2584ODg/bGG29oPI0B/sD46quv2tq1a3MriCOWLVtmg4OD9rOf/czMpJux4sQTT7TZs2fnbJjGzfjyX//1X9bT0zPi/GOmcTPaFN03j9b9WVGarq4uBQ5E6dFz/fijZ/vyo2f78qHn+nKj5/qJgZ7tJwZ6ti8ferYfPybSs33TBYQrlYqdffbZ9vDDD2fH6vW6Pfzww9bd3T2ONWtuUkp2zTXX2L333mvr1q0b9oqBiM2bN5uZ2fz5883MrLu7237yk5/kJg+f+E877bQjUu/JyJtvvmmvvPKKzZ8/384++2zr6OjIjZeenh7btm1bNl6kl7Hhrrvusjlz5tiFF17YMJ3GzfiwZMkSmzdvXm6s7Nmzx5566qncWOnt7bWNGzdmadatW2f1ej174O/u7rbHHnvMarValmbt2rV28skn6/UrbwN/YHzppZfsoYcesmOOOWbEazZv3mytra3ZK42km7Hh5z//ub3++us5G6ZxM7589atftbPPPtvOPPPMEdNq3IwOI903j9b9WXd3dy4PT6NnIjER0HP9+KFn+4mDnu3Lh57ry42e68uPnu0nDnq2Lx96th97JuSzfWpC7rnnntTZ2Znuvvvu9MILL6RPfvKTacaMGWnHjh3jXbWm5eqrr07Tp09P69evT9u3b89+9u/fn1JK6eWXX04333xzeuaZZ9LWrVvTfffdl0488cR0zjnnZHkMDg6m008/Pa1YsSJt3rw5ff/730/HHntsuuGGG8arWU3BZz/72bR+/fq0devW9MMf/jAtX748zZ49O+3atSullNJVV12VFi1alNatW5eeeeaZ1N3dnbq7u7PrpZcjz9DQUFq0aFFavXp17rjGzdiyd+/etGnTprRp06ZkZumLX/xi2rRpU3r11VdTSindeuutacaMGem+++5Lzz33XLrooovSkiVLUl9fX5bH+eefn9773vemp556Kj3++OPpXe96V7r00kuz8729vWnu3LnpIx/5SNqyZUu655570rRp09JXvvKVMW/vRKKRbqrVavrQhz6UFi5cmDZv3pybgwYGBlJKKT3xxBPpjjvuSJs3b06vvPJK+sY3vpGOPfbY9NGPfjQrQ7o5PBrpZu/evekv/uIv0oYNG9LWrVvTQw89lM4666z0rne9K/X392d5aNwcGUayaSmltHv37jRt2rR05513Drte4+bIMdJ9c0qjc3/205/+NE2bNi1df/316cUXX0xr1qxJbW1t6fvf//6YtleIw0XP9eODnu3Li57ty42e68uBnuvLjZ7ty4ue7cuLnu3Ly0R8tm/KgHBKKf3jP/5jWrRoUapUKul973tfevLJJ8e7Sk2NmYU/d911V0oppW3btqVzzjknzZo1K3V2dqZ3vvOd6frrr0+7d+/O5fOzn/0sXXDBBWnq1Klp9uzZ6bOf/Wyq1Wrj0KLm4ZJLLknz589PlUolHXfccemSSy5JL7/8cna+r68v/dmf/VmaOXNmmjZtWvr93//9tH379lwe0suR5Qc/+EEys9TT05M7rnEztjzyyCOhHbv88stTSinV6/X0+c9/Ps2dOzd1dnam8847b5jOXn/99XTppZemd7zjHamrqyv9yZ/8Sdq7d28uzY9//OP0m7/5m6mzszMdd9xx6dZbbx2rJk5YGulm69athXPQI488klJKaePGjWnZsmVp+vTpacqUKenUU09Nf/u3f5t7cElJujkcGulm//79acWKFenYY49NHR0dafHixekTn/jEMEe+xs2RYSSbllJKX/nKV9LUqVNTb2/vsOs1bo4cI903pzR692ePPPJIes973pMqlUo68cQTc2UIMRHQc/3Yo2f78qJn+3Kj5/pyoOf6cqNn+/KiZ/vyomf78jIRn+1b/n/FhRBCCCGEEEIIIYQQQgghhBBCNBlN9w1hIYQQQgghhBBCCCGEEEIIIYQQb6GAsBBCCCGEEEIIIYQQQgghhBBCNCkKCAshhBBCCCGEEEIIIYQQQgghRJOigLAQQgghhBBCCCGEEEIIIYQQQjQpCggLIYQQQgghhBBCCCGEEEIIIUSTooCwEEIIIYQQQgghhBBCCCGEEEI0KQoICyGEEEIIIYQQQgghhBBCCCFEk6KAsBBCCCGEEEIIIYQQQgghhBBCNCkKCAshhBBCCCGEEEIIIYQQQgghRJOigLAQQgghhBBCCCGEEEIIIYQQQjQpCggLIYQQQgghhBBCCCGEEEIIIUSTooCwEEIIIYQQQgghhBBCCCGEEEI0Kf8PGWPQvnouL68AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots(1, 2, figsize=(24, 12))\n", "ax[0].imshow(image) # remove channel dimension\n", @@ -1216,289 +1171,7 @@ "execution_count": null, "id": "9b8ddbe2", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_nameclassrle
0image1661319116107.pngfinger-11954318 1 1956365 3 1958412 5 1960459 7 196250...
1image1661319116107.pngfinger-22169391 5 2171439 5 2173486 7 2175534 8 217758...
2image1661319116107.pngfinger-32587244 6 2589288 12 2591331 19 2593376 23 259...
3image1661319116107.pngfinger-4
4image1661319116107.pngfinger-51141486 4 1143533 6 1145580 7 1147628 8 114967...
5image1661319116107.pngfinger-61450764 6 1452807 14 1454849 22 1456892 29 145...
6image1661319116107.pngfinger-72050885 12 2052919 27 2054959 37 2057005 39 20...
7image1661319116107.pngfinger-8
8image1661319116107.pngfinger-9979923 1 981971 2 984018 5 986066 7 988114 8 9...
9image1661319116107.pngfinger-101344463 32 1346509 35 1348556 37 1350604 37 13...
10image1661319116107.pngfinger-112032592 32 2034637 36 2036683 38 2038728 42 20...
11image1661319116107.pngfinger-12
12image1661319116107.pngfinger-131127599 4 1129646 6 1131693 8 1133741 8 113578...
13image1661319116107.pngfinger-141526924 4 1528963 15 1531003 25 1533044 33 153...
14image1661319116107.pngfinger-152143311 3 2145357 7 2147403 11 2149449 15 2151...
15image1661319116107.pngfinger-16
16image1661319116107.pngfinger-17
17image1661319116107.pngfinger-181852717 5 1854764 7 1856810 10 1858856 12 1860...
18image1661319116107.pngfinger-192286769 3 2288815 6 2290862 8 2292910 10 22949...
19image1661319116107.pngTrapezium3033906 1 3035951 6 3037998 8 3040045 11 30420...
20image1661319116107.pngTrapezoid3046254 2 3048301 4 3050349 5 3052397 4 3054446 2
21image1661319116107.pngCapitate2982860 6 2984902 14 2986947 18 2988993 20 299...
22image1661319116107.pngHamate2991150 2 2993196 6 2995242 9 2997287 13 29993...
23image1661319116107.pngScaphoid3203951 4 3205998 6 3208045 8 3210093 9 321214...
24image1661319116107.pngLunate3308496 15 3310542 29 3312588 36 3314635 38 33...
25image1661319116107.pngTriquetrum
26image1661319116107.pngPisiform
27image1661319116107.pngRadius3320627 1 3322674 3 3324721 6 3326769 8 332881...
28image1661319116107.pngUlna3523631 7 3525676 15 3527721 22 3529767 28 353...
29image1661319145363.pngfinger-11799602 1 1801649 2 1803695 5 1805743 5 180779...
\n", - "
" - ], - "text/plain": [ - " image_name class \\\n", - "0 image1661319116107.png finger-1 \n", - "1 image1661319116107.png finger-2 \n", - "2 image1661319116107.png finger-3 \n", - "3 image1661319116107.png finger-4 \n", - "4 image1661319116107.png finger-5 \n", - "5 image1661319116107.png finger-6 \n", - "6 image1661319116107.png finger-7 \n", - "7 image1661319116107.png finger-8 \n", - "8 image1661319116107.png finger-9 \n", - "9 image1661319116107.png finger-10 \n", - "10 image1661319116107.png finger-11 \n", - "11 image1661319116107.png finger-12 \n", - "12 image1661319116107.png finger-13 \n", - "13 image1661319116107.png finger-14 \n", - "14 image1661319116107.png finger-15 \n", - "15 image1661319116107.png finger-16 \n", - "16 image1661319116107.png finger-17 \n", - "17 image1661319116107.png finger-18 \n", - "18 image1661319116107.png finger-19 \n", - "19 image1661319116107.png Trapezium \n", - "20 image1661319116107.png Trapezoid \n", - "21 image1661319116107.png Capitate \n", - "22 image1661319116107.png Hamate \n", - "23 image1661319116107.png Scaphoid \n", - "24 image1661319116107.png Lunate \n", - "25 image1661319116107.png Triquetrum \n", - "26 image1661319116107.png Pisiform \n", - "27 image1661319116107.png Radius \n", - "28 image1661319116107.png Ulna \n", - "29 image1661319145363.png finger-1 \n", - "\n", - " rle \n", - "0 1954318 1 1956365 3 1958412 5 1960459 7 196250... \n", - "1 2169391 5 2171439 5 2173486 7 2175534 8 217758... \n", - "2 2587244 6 2589288 12 2591331 19 2593376 23 259... \n", - "3 \n", - "4 1141486 4 1143533 6 1145580 7 1147628 8 114967... \n", - "5 1450764 6 1452807 14 1454849 22 1456892 29 145... \n", - "6 2050885 12 2052919 27 2054959 37 2057005 39 20... \n", - "7 \n", - "8 979923 1 981971 2 984018 5 986066 7 988114 8 9... \n", - "9 1344463 32 1346509 35 1348556 37 1350604 37 13... \n", - "10 2032592 32 2034637 36 2036683 38 2038728 42 20... \n", - "11 \n", - "12 1127599 4 1129646 6 1131693 8 1133741 8 113578... \n", - "13 1526924 4 1528963 15 1531003 25 1533044 33 153... \n", - "14 2143311 3 2145357 7 2147403 11 2149449 15 2151... \n", - "15 \n", - "16 \n", - "17 1852717 5 1854764 7 1856810 10 1858856 12 1860... \n", - "18 2286769 3 2288815 6 2290862 8 2292910 10 22949... \n", - "19 3033906 1 3035951 6 3037998 8 3040045 11 30420... \n", - "20 3046254 2 3048301 4 3050349 5 3052397 4 3054446 2 \n", - "21 2982860 6 2984902 14 2986947 18 2988993 20 299... \n", - "22 2991150 2 2993196 6 2995242 9 2997287 13 29993... \n", - "23 3203951 4 3205998 6 3208045 8 3210093 9 321214... \n", - "24 3308496 15 3310542 29 3312588 36 3314635 38 33... \n", - "25 \n", - "26 \n", - "27 3320627 1 3322674 3 3324721 6 3326769 8 332881... \n", - "28 3523631 7 3525676 15 3527721 22 3529767 28 353... \n", - "29 1799602 1 1801649 2 1803695 5 1805743 5 180779... " - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.head(30)" ] @@ -1510,7 +1183,7 @@ "metadata": {}, "outputs": [], "source": [ - "df.to_csv(\"output.csv\", index=False)" + "df.to_csv(\"smp_Unet_efficient-b0.csv\", index=False)" ] } ], diff --git a/module_base/train.py b/module_base/train.py index 8d6434b..5a5760d 100644 --- a/module_base/train.py +++ b/module_base/train.py @@ -118,6 +118,9 @@ def train(model, train_loader, valid_loader, criterion, optimizer, save_dir, ran n_class = len(CLASSES) best_dice = 0. + + # GradScaler๋ฅผ ์‚ฌ์šฉํ•ด Mixed Precision Training์„ ์„ค์ • + scaler = torch.cuda.amp.GradScaler() for epoch in range(max_epoch): model.train() @@ -127,13 +130,25 @@ def train(model, train_loader, valid_loader, criterion, optimizer, save_dir, ran images, masks = images.cuda(), masks.cuda() model = model.cuda() - outputs = model(images)['out'] + # outputs = model(images)['out'] + # outputs = model(images) # loss๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. - loss = criterion(outputs, masks) + # loss = criterion(outputs, masks) + # optimizer.zero_grad() + # loss.backward() + # optimizer.step() + + # Mixed Precision Training ์ ์šฉ + with torch.cuda.amp.autocast(): + outputs = model(images) + loss = criterion(outputs, masks) + + # ์Šค์ผ€์ผ๋œ loss๋ฅผ ์‚ฌ์šฉํ•ด backward ๋ฐ optimizer step optimizer.zero_grad() - loss.backward() - optimizer.step() + scaler.scale(loss).backward() + scaler.step(optimizer) + scaler.update() # step ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. if (step + 1) % 25 == 0: @@ -146,6 +161,8 @@ def train(model, train_loader, valid_loader, criterion, optimizer, save_dir, ran # validation ์ฃผ๊ธฐ์— ๋”ฐ๋ผ loss๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  best model์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. if (epoch + 1) % val_every == 0: + # ์บ์‹œ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์—ฌ PyTorch์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ + torch.cuda.empty_cache() dice = validation(epoch + 1, model, valid_loader, criterion) if best_dice < dice: From a7b662cbb76f6ed1b30b830b501f3060d8045da4 Mon Sep 17 00:00:00 2001 From: wonjeongjeong Date: Thu, 14 Nov 2024 12:39:09 +0000 Subject: [PATCH 014/106] =?UTF-8?q?[Feature]=20:=20streamlit=20CSV=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=81=ED=99=94=20=EC=98=B5=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- copy_all_png.py | 25 +++++++++++++++ streamlit/main.py | 51 ++++++++++++++++++++++++++++-- streamlit/visualize_rle.py | 64 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 copy_all_png.py create mode 100644 streamlit/visualize_rle.py diff --git a/copy_all_png.py b/copy_all_png.py new file mode 100644 index 0000000..864fce4 --- /dev/null +++ b/copy_all_png.py @@ -0,0 +1,25 @@ +import os +import shutil + +# ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ์™€ ์ƒˆ ํด๋” ์ •์˜ +base_dir = 'data/test/DCM' +new_folder = os.path.join(base_dir, 'all_pngs') + +# ์ƒˆ ํด๋”๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ +if not os.path.exists(new_folder): + os.makedirs(new_folder) + +# ID*** ํด๋”๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ PNG ํŒŒ์ผ์„ ์ƒˆ ํด๋”๋กœ ๋ณต์‚ฌ +for subdir, dirs, files in os.walk(base_dir): + if os.path.basename(subdir) == 'all_pngs': + continue # ์ƒˆ ํด๋”๋Š” ๊ฑด๋„ˆ๋›ฐ๊ธฐ + for file in files: + if file.endswith('.png'): + src_path = os.path.join(subdir, file) + dst_path = os.path.join(new_folder, file) + shutil.copy(src_path, dst_path) + print(f'๋ณต์‚ฌ๋จ: {src_path} -> {dst_path}') + +# ๊ฒฐ๊ณผ ํ™•์ธ +png_files = [f for f in os.listdir(new_folder) if f.endswith('.png')] +print(f'๋ณต์‚ฌ๋œ PNG ํŒŒ์ผ ์ˆ˜: {len(png_files)}') \ No newline at end of file diff --git a/streamlit/main.py b/streamlit/main.py index 89beb52..c915f8c 100644 --- a/streamlit/main.py +++ b/streamlit/main.py @@ -1,8 +1,14 @@ import streamlit as st -import load, visualize_v1, visualize_v2 +import load, visualize_v1, visualize_v2, visualize_rle +import pandas as pd + +''' +streamlit ์‹คํ–‰ํ•˜๊ธฐ ์ „์— del_ID_dir.py ์‹คํ–‰ !! +''' info = { 'image_root': "../../data/train/DCM", + 'all_image_root': "../../data/test/DCM/all_pngs", 'label_root': "../../data/train/outputs_json", 'classes': [ 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', @@ -26,6 +32,12 @@ 'Pisiform': (145,42,177), 'Radius': (210,71,77), 'Ulna': (210,71,77), + 'Trapezium': (0,85,0), + 'Capitate': (230,114,61), + 'Hamate': (196,183,59), + 'Scaphoid': (120,240,50), + 'Lunate': (107,102,255), + 'Triquetrum': (116,116,116), 'wrist': (193,223,159) } } @@ -38,7 +50,7 @@ if "labels" not in st.session_state: st.session_state.labels = [] -option = st.sidebar.radio("option", ["train", "validation", "test"]) +option = st.sidebar.radio("option", ["train", "validation", "test", "RLE Visualization"]) if option == "train": st.session_state.images, st.session_state.labels = load.load(info) with st.sidebar.form(key="form"): @@ -54,4 +66,37 @@ if option == "validation": st.write("๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค...") if option == "test": - st.write("๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค...") \ No newline at end of file + st.write("๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค...") +if option == "RLE Visualization": + csv_file = st.sidebar.file_uploader("Upload RLE CSV file", type="csv") + if csv_file is not None: + df = pd.read_csv(csv_file) + df['rle'] = df['rle'].fillna('') # NaN ๊ฐ’์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒด + # ์ด๋ฏธ์ง€ ์ด๋ฆ„ ๋ชฉ๋ก ์ƒ์„ฑ + image_names = df['image_name'].unique() + + # ํ˜„์žฌ ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค๋ฅผ ์„ธ์…˜ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ + if 'current_image_index' not in st.session_state: + st.session_state.current_image_index = 0 + + # ์ด์ „ ๋ฒ„ํŠผ + if st.sidebar.button('Previous Image'): + st.session_state.current_image_index = max(0, st.session_state.current_image_index - 1) + + # ๋‹ค์Œ ๋ฒ„ํŠผ + if st.sidebar.button('Next Image'): + st.session_state.current_image_index = min(len(image_names) - 1, st.session_state.current_image_index + 1) + + # ํ˜„์žฌ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ํ‘œ์‹œ + current_image = image_names[st.session_state.current_image_index] + st.sidebar.write(f"Current Image: {current_image}") + + # ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค ์Šฌ๋ผ์ด๋” (์˜ต์…˜) + image_index = st.sidebar.slider('Select image index', 0, len(image_names)-1, st.session_state.current_image_index) + st.session_state.current_image_index = image_index + + # ํ˜„์žฌ ์„ ํƒ๋œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ + current_df = df[df['image_name'] == current_image] + + # ์‹œ๊ฐํ™” ํ•จ์ˆ˜ ํ˜ธ์ถœ + visualize_rle.show(info, current_df, 0) \ No newline at end of file diff --git a/streamlit/visualize_rle.py b/streamlit/visualize_rle.py new file mode 100644 index 0000000..e582f65 --- /dev/null +++ b/streamlit/visualize_rle.py @@ -0,0 +1,64 @@ +import streamlit as st +import numpy as np +import cv2 +import matplotlib.pyplot as plt +from PIL import Image +import os +import pandas as pd + +def rle2mask(rle, shape): + if pd.isna(rle): + return np.zeros(shape, dtype=np.uint8) + try: + s = np.array(rle.split(), dtype=int) + starts, lengths = s[0::2] - 1, s[1::2] + ends = starts + lengths + img = np.zeros(shape[0]*shape[1], dtype=np.uint8) + for lo, hi in zip(starts, ends): + img[lo:hi] = 1 + return img.reshape(shape) + except AttributeError: + # RLE๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ˜•์‹์ผ ๊ฒฝ์šฐ ๋นˆ ๋งˆ์Šคํฌ ๋ฐ˜ํ™˜ + return np.zeros(shape, dtype=np.uint8) + +def show(info, df, image_index): + if image_index >= len(df): + st.error("Index out of bounds for the current DataFrame.") + return + + image_name = df.iloc[image_index]['image_name'] + image_path = os.path.join(info['all_image_root'], image_name) + image = Image.open(image_path).convert("RGB") + image_np = np.array(image) + + # Create a mask for the segmentation + mask = np.zeros((*image.size[::-1], 3), dtype=np.uint8) + contour_mask = np.zeros((*image.size[::-1], 3), dtype=np.uint8) + + for _, row in df[df['image_name'] == image_name].iterrows(): + class_mask = rle2mask(row['rle'], image.size[::-1]) + class_name = row['class'] + + # ์ƒ‰์ƒ ์„ ํƒ ๋กœ์ง + if class_name.startswith('finger'): + color = info['color']['finger'] + elif class_name in ['Trapezoid', 'Pisiform', 'Radius', 'Ulna', 'Trapezium', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', 'Triquetrum']: + color = info['color'][class_name] # ํŠน์ • ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ๊ฐœ๋ณ„ ์ƒ‰์ƒ ์ ์šฉ + + mask[class_mask == 1] = color + + # Find contours + contours, _ = cv2.findContours(class_mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # Draw contours on the contour mask + cv2.drawContours(contour_mask, contours, -1, color, 2) + + # Overlay the mask on the original image + overlay_image = cv2.addWeighted(np.array(image), 0.5, mask, 0.5, 0) + + # Add contours to the overlayed image + final_image = cv2.addWeighted(overlay_image, 1, contour_mask, 1, 0) + + # Display the overlayed image + st.image(final_image, caption=image_name, use_container_width=True) + From 0ed75567cf1fd46ac575be6760b21051f13e79d3 Mon Sep 17 00:00:00 2001 From: wonjeongjeong Date: Thu, 14 Nov 2024 12:43:04 +0000 Subject: [PATCH 015/106] =?UTF-8?q?[Comment]=20:=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- streamlit/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/streamlit/main.py b/streamlit/main.py index c915f8c..d1b8c61 100644 --- a/streamlit/main.py +++ b/streamlit/main.py @@ -2,9 +2,9 @@ import load, visualize_v1, visualize_v2, visualize_rle import pandas as pd -''' -streamlit ์‹คํ–‰ํ•˜๊ธฐ ์ „์— del_ID_dir.py ์‹คํ–‰ !! -''' + +#streamlit ์‹คํ–‰ํ•˜๊ธฐ ์ „์— del_ID_dir.py ์‹คํ–‰ !! + info = { 'image_root': "../../data/train/DCM", From bed0e9c736b9f7c139485041ff151849fcd53a72 Mon Sep 17 00:00:00 2001 From: parkjunil Date: Thu, 14 Nov 2024 21:55:14 +0900 Subject: [PATCH 016/106] [Feature]:add code for mmsegmentation and util function for mmseg dataset --- mmsegmentation/.circleci/config.yml | 34 + mmsegmentation/.circleci/docker/Dockerfile | 12 + mmsegmentation/.circleci/test.yml | 196 ++ .../.dev_scripts/batch_test_list.py | 133 + .../.dev_scripts/batch_train_list.txt | 19 + .../.dev_scripts/benchmark_evaluation.sh | 41 + .../.dev_scripts/benchmark_full_models.txt | 57 + .../.dev_scripts/benchmark_inference.py | 149 + .../.dev_scripts/benchmark_options.py | 10 + .../.dev_scripts/benchmark_train.sh | 40 + .../.dev_scripts/benchmark_train_models.txt | 26 + mmsegmentation/.dev_scripts/check_urls.py | 100 + .../gather_benchmark_evaluation_results.py | 91 + .../gather_benchmark_train_results.py | 100 + mmsegmentation/.dev_scripts/gather_models.py | 213 ++ .../generate_benchmark_evaluation_script.py | 114 + .../generate_benchmark_train_script.py | 91 + .../log_collector/example_config.py | 18 + .../log_collector/log_collector.py | 143 + .../.dev_scripts/log_collector/readme.md | 144 + .../.dev_scripts/log_collector/utils.py | 20 + .../.dev_scripts/update_model_index.py | 301 ++ .../.dev_scripts/upload_modelzoo.py | 45 + mmsegmentation/.github/CODE_OF_CONDUCT.md | 76 + mmsegmentation/.github/CONTRIBUTING.md | 59 + .../.github/ISSUE_TEMPLATE/config.yml | 6 + .../.github/ISSUE_TEMPLATE/error-report.md | 48 + .../.github/ISSUE_TEMPLATE/feature_request.md | 21 + .../ISSUE_TEMPLATE/general_questions.md | 7 + .../reimplementation_questions.md | 69 + .../.github/pull_request_template.md | 25 + mmsegmentation/.github/workflows/deploy.yml | 26 + mmsegmentation/.gitignore | 120 + mmsegmentation/.owners.yml | 7 + mmsegmentation/.pre-commit-config.yaml | 67 + mmsegmentation/CITATION.cff | 8 + mmsegmentation/LICENSE | 203 ++ mmsegmentation/MANIFEST.in | 5 + mmsegmentation/README.md | 420 +++ mmsegmentation/README_zh-CN.md | 426 +++ .../configs/_base_/datasets/ade20k.py | 68 + .../configs/_base_/datasets/ade20k_640x640.py | 68 + .../configs/_base_/datasets/bdd100k.py | 70 + .../configs/_base_/datasets/chase_db1.py | 75 + .../configs/_base_/datasets/cityscapes.py | 67 + .../_base_/datasets/cityscapes_1024x1024.py | 29 + .../_base_/datasets/cityscapes_768x768.py | 29 + .../_base_/datasets/cityscapes_769x769.py | 29 + .../_base_/datasets/cityscapes_832x832.py | 29 + .../configs/_base_/datasets/coco-stuff10k.py | 69 + .../configs/_base_/datasets/coco-stuff164k.py | 67 + .../configs/_base_/datasets/drive.py | 73 + mmsegmentation/configs/_base_/datasets/hrf.py | 73 + .../configs/_base_/datasets/hsi_drive.py | 53 + .../configs/_base_/datasets/isaid.py | 73 + .../configs/_base_/datasets/levir_256x256.py | 68 + .../configs/_base_/datasets/loveda.py | 66 + .../configs/_base_/datasets/mapillary_v1.py | 68 + .../_base_/datasets/mapillary_v1_65.py | 37 + .../configs/_base_/datasets/mapillary_v2.py | 68 + mmsegmentation/configs/_base_/datasets/nyu.py | 67 + .../configs/_base_/datasets/nyu_512x512.py | 72 + .../configs/_base_/datasets/pascal_context.py | 56 + .../_base_/datasets/pascal_context_59.py | 72 + .../configs/_base_/datasets/pascal_voc12.py | 69 + .../_base_/datasets/pascal_voc12_aug.py | 81 + .../configs/_base_/datasets/potsdam.py | 66 + .../configs/_base_/datasets/refuge.py | 90 + .../configs/_base_/datasets/stare.py | 73 + .../configs/_base_/datasets/synapse.py | 41 + .../configs/_base_/datasets/vaihingen.py | 66 + .../configs/_base_/default_runtime.py | 15 + .../configs/_base_/models/ann_r50-d8.py | 54 + .../configs/_base_/models/apcnet_r50-d8.py | 52 + .../_base_/models/bisenetv1_r18-d32.py | 76 + .../configs/_base_/models/bisenetv2.py | 88 + .../configs/_base_/models/ccnet_r50-d8.py | 52 + mmsegmentation/configs/_base_/models/cgnet.py | 43 + .../configs/_base_/models/danet_r50-d8.py | 52 + .../configs/_base_/models/deeplabv3_r50-d8.py | 52 + .../_base_/models/deeplabv3_unet_s5-d16.py | 58 + .../_base_/models/deeplabv3plus_r50-d8.py | 54 + .../configs/_base_/models/dmnet_r50-d8.py | 52 + .../configs/_base_/models/dnl_r50-d8.py | 54 + .../configs/_base_/models/dpt_vit-b16.py | 39 + .../configs/_base_/models/emanet_r50-d8.py | 55 + .../configs/_base_/models/encnet_r50-d8.py | 56 + .../configs/_base_/models/erfnet_fcn.py | 40 + .../configs/_base_/models/fast_scnn.py | 65 + .../_base_/models/fastfcn_r50-d32_jpu_psp.py | 61 + .../configs/_base_/models/fcn_hr18.py | 60 + .../configs/_base_/models/fcn_r50-d8.py | 53 + .../configs/_base_/models/fcn_unet_s5-d16.py | 59 + .../_base_/models/fpn_poolformer_s12.py | 54 + .../configs/_base_/models/fpn_r50.py | 44 + .../configs/_base_/models/gcnet_r50-d8.py | 54 + .../configs/_base_/models/icnet_r50-d8.py | 82 + .../configs/_base_/models/isanet_r50-d8.py | 53 + .../configs/_base_/models/lraspp_m-v3-d8.py | 33 + .../configs/_base_/models/nonlocal_r50-d8.py | 54 + .../configs/_base_/models/ocrnet_hr18.py | 76 + .../configs/_base_/models/ocrnet_r50-d8.py | 55 + .../configs/_base_/models/pointrend_r50.py | 64 + .../configs/_base_/models/psanet_r50-d8.py | 57 + .../configs/_base_/models/pspnet_r50-d8.py | 52 + .../_base_/models/pspnet_unet_s5-d16.py | 58 + .../configs/_base_/models/san_vit-b16.py | 137 + .../configs/_base_/models/segformer_mit-b0.py | 42 + .../_base_/models/segmenter_vit-b16_mask.py | 44 + .../configs/_base_/models/setr_mla.py | 103 + .../configs/_base_/models/setr_naive.py | 88 + .../configs/_base_/models/setr_pup.py | 88 + mmsegmentation/configs/_base_/models/stdc.py | 91 + .../_base_/models/twins_pcpvt-s_fpn.py | 53 + .../_base_/models/twins_pcpvt-s_upernet.py | 61 + .../configs/_base_/models/upernet_beit.py | 58 + .../configs/_base_/models/upernet_convnext.py | 52 + .../configs/_base_/models/upernet_mae.py | 57 + .../configs/_base_/models/upernet_r50.py | 52 + .../configs/_base_/models/upernet_swin.py | 62 + .../_base_/models/upernet_vit-b16_ln_mln.py | 65 + .../configs/_base_/models/vpd_sd.py | 86 + .../configs/_base_/schedules/schedule_160k.py | 25 + .../configs/_base_/schedules/schedule_20k.py | 24 + .../configs/_base_/schedules/schedule_240k.py | 25 + .../configs/_base_/schedules/schedule_25k.py | 28 + .../configs/_base_/schedules/schedule_320k.py | 25 + .../configs/_base_/schedules/schedule_40k.py | 24 + .../configs/_base_/schedules/schedule_80k.py | 24 + mmsegmentation/configs/ann/README.md | 68 + ...nn_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...ann_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...nn_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...ann_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../ann_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + .../ann_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + .../ann_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../ann_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...ann_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + .../ann_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...ann_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + .../ann_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../ann_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../ann_r50-d8_4xb4-20k_voc12aug-512x512.py | 10 + .../ann_r50-d8_4xb4-40k_voc12aug-512x512.py | 10 + .../ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/ann/metafile.yaml | 391 +++ mmsegmentation/configs/apcnet/README.md | 59 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...apcnet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + .../apcnet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../apcnet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../apcnet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/apcnet/metafile.yaml | 296 ++ mmsegmentation/configs/beit/README.md | 85 + ...t-base_upernet_8xb2-160k_ade20k-640x640.py | 36 + ...ase_upernet_8xb2-160k_ade20k-640x640_ms.py | 16 + ...ge_upernet_8xb1-amp-160k_ade20k-640x640.py | 50 + ...upernet_8xb1-amp-160k_ade20k-640x640_ms.py | 16 + mmsegmentation/configs/beit/metafile.yaml | 49 + mmsegmentation/configs/bisenetv1/README.md | 64 + ...1k-pre_4xb4-160k_coco-stuff164k-512x512.py | 6 + ...01-d32_4xb4-160k_coco-stuff164k-512x512.py | 58 + ...in1k-pre_4xb4-160k_cityscapes-1024x1024.py | 29 + ...1k-pre_4xb4-160k_coco-stuff164k-512x512.py | 10 + ...in1k-pre_4xb8-160k_cityscapes-1024x1024.py | 4 + ..._r18-d32_4xb4-160k_cityscapes-1024x1024.py | 24 + ...18-d32_4xb4-160k_coco-stuff164k-512x512.py | 53 + ...in1k-pre_4xb4-160k_cityscapes-1024x1024.py | 7 + ...1k-pre_4xb4-160k_coco-stuff164k-512x512.py | 7 + ..._r50-d32_4xb4-160k_cityscapes-1024x1024.py | 55 + ...50-d32_4xb4-160k_coco-stuff164k-512x512.py | 58 + .../configs/bisenetv1/metafile.yaml | 275 ++ mmsegmentation/configs/bisenetv2/README.md | 53 + ...etv2_fcn_4xb4-160k_cityscapes-1024x1024.py | 24 + ..._fcn_4xb4-amp-160k_cityscapes-1024x1024.py | 6 + ...fcn_4xb4-ohem-160k_cityscapes-1024x1024.py | 83 + ...etv2_fcn_4xb8-160k_cityscapes-1024x1024.py | 24 + .../configs/bisenetv2/metafile.yaml | 114 + mmsegmentation/configs/ccnet/README.md | 67 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../ccnet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../ccnet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../ccnet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + .../ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../ccnet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/ccnet/metafile.yaml | 391 +++ mmsegmentation/configs/cgnet/README.md | 46 + .../cgnet_fcn_4xb4-60k_cityscapes-680x680.py | 59 + .../cgnet_fcn_4xb8-60k_cityscapes-512x1024.py | 38 + mmsegmentation/configs/cgnet/metafile.yaml | 61 + mmsegmentation/configs/convnext/README.md | 74 + ...se_upernet_8xb2-amp-160k_ade20k-512x512.py | 43 + ...se_upernet_8xb2-amp-160k_ade20k-640x640.py | 58 + ...ge_upernet_8xb2-amp-160k_ade20k-640x640.py | 58 + ...ll_upernet_8xb2-amp-160k_ade20k-512x512.py | 57 + ...ny_upernet_8xb2-amp-160k_ade20k-512x512.py | 57 + ...ge_upernet_8xb2-amp-160k_ade20k-640x640.py | 58 + mmsegmentation/configs/convnext/metafile.yaml | 145 + mmsegmentation/configs/danet/README.md | 67 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../danet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...danet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...danet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../danet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../danet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../danet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + .../danet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../danet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/danet/metafile.yaml | 387 +++ mmsegmentation/configs/ddrnet/README.md | 46 + ...in1k-pre_2xb6-120k_cityscapes-1024x1024.py | 93 + ...in1k-pre_2xb6-120k_cityscapes-1024x1024.py | 93 + mmsegmentation/configs/ddrnet/metafile.yaml | 64 + mmsegmentation/configs/deeplabv3/README.md | 118 + ...-d16-mg124_4xb2-40k_cityscapes-512x1024.py | 11 + ...-d16-mg124_4xb2-80k_cityscapes-512x1024.py | 11 + ...v3_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...bv3_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...v3_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...bv3_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...101-d8_4xb2-amp-80k_cityscapes-512x1024.py | 7 + ...plabv3_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...101-d8_4xb4-160k_coco-stuff164k-512x512.py | 2 + ..._r101-d8_4xb4-20k_coco-stuff10k-512x512.py | 2 + ...labv3_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...101-d8_4xb4-320k_coco-stuff164k-512x512.py | 2 + ..._r101-d8_4xb4-40k_coco-stuff10k-512x512.py | 2 + ...r101-d8_4xb4-40k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-40k_pascal-context-59-480x480.py | 2 + ...labv3_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + ...eplabv3_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...r101-d8_4xb4-80k_coco-stuff164k-512x512.py | 2 + ...r101-d8_4xb4-80k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-80k_pascal-context-59-480x480.py | 2 + ...3_r101b-d8_4xb2-80k_cityscapes-512x1024.py | 4 + ...v3_r101b-d8_4xb2-80k_cityscapes-769x769.py | 4 + ...bv3_r18-d8_4xb2-80k_cityscapes-512x1024.py | 9 + ...abv3_r18-d8_4xb2-80k_cityscapes-769x769.py | 9 + ...v3_r18b-d8_4xb2-80k_cityscapes-512x1024.py | 9 + ...bv3_r18b-d8_4xb2-80k_cityscapes-769x769.py | 9 + ...bv3_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...abv3_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...bv3_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...abv3_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + ...eplabv3_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...r50-d8_4xb4-160k_coco-stuff164k-512x512.py | 11 + ...3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py | 11 + ...plabv3_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ...r50-d8_4xb4-320k_coco-stuff164k-512x512.py | 11 + ...3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py | 11 + ..._r50-d8_4xb4-40k_pascal-context-480x480.py | 14 + ...0-d8_4xb4-40k_pascal-context-59-480x480.py | 14 + ...plabv3_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + ...eeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + ..._r50-d8_4xb4-80k_coco-stuff164k-512x512.py | 11 + ..._r50-d8_4xb4-80k_pascal-context-480x480.py | 14 + ...0-d8_4xb4-80k_pascal-context-59-480x480.py | 14 + ...v3_r50b-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...bv3_r50b-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../configs/deeplabv3/metafile.yaml | 985 +++++++ .../configs/deeplabv3plus/README.md | 138 + ...-d16-mg124_4xb2-40k_cityscapes-512x1024.py | 11 + ...-d16-mg124_4xb2-80k_cityscapes-512x1024.py | 11 + ...us_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...lus_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...us_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...lus_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...101-d8_4xb2-amp-80k_cityscapes-512x1024.py | 7 + ...v3plus_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...3plus_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...r101-d8_4xb4-40k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-40k_pascal-context-59-480x480.py | 2 + ...3plus_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + ...bv3plus_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...bv3plus_r101-d8_4xb4-80k_loveda-512x512.py | 2 + ...r101-d8_4xb4-80k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-80k_pascal-context-59-480x480.py | 2 + ...v3plus_r101-d8_4xb4-80k_potsdam-512x512.py | 2 + ...plus_r101-d8_4xb4-80k_vaihingen-512x512.py | 2 + ...s_r101b-d8_4xb2-80k_cityscapes-512x1024.py | 4 + ...us_r101b-d8_4xb2-80k_cityscapes-769x769.py | 4 + ...lus_r18-d8_4xb2-80k_cityscapes-512x1024.py | 11 + ...plus_r18-d8_4xb2-80k_cityscapes-769x769.py | 11 + ...labv3plus_r18-d8_4xb4-80k_isaid-896x896.py | 11 + ...abv3plus_r18-d8_4xb4-80k_loveda-512x512.py | 11 + ...bv3plus_r18-d8_4xb4-80k_potsdam-512x512.py | 11 + ...3plus_r18-d8_4xb4-80k_vaihingen-512x512.py | 11 + ...us_r18b-d8_4xb2-80k_cityscapes-512x1024.py | 11 + ...lus_r18b-d8_4xb2-80k_cityscapes-769x769.py | 11 + ...0-d8_4xb2-300k_mapillay_v1_65-1280x1280.py | 58 + ...lus_r50-d8_4xb2-40k_cityscapes-512x1024.py | 8 + ...plus_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...lus_r50-d8_4xb2-80k_cityscapes-512x1024.py | 8 + ...plus_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + ...bv3plus_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...v3plus_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ..._r50-d8_4xb4-40k_pascal-context-480x480.py | 14 + ...0-d8_4xb4-40k_pascal-context-59-480x480.py | 14 + ...v3plus_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + ...abv3plus_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + ...labv3plus_r50-d8_4xb4-80k_isaid-896x896.py | 10 + ...abv3plus_r50-d8_4xb4-80k_loveda-512x512.py | 10 + ..._r50-d8_4xb4-80k_pascal-context-480x480.py | 14 + ...0-d8_4xb4-80k_pascal-context-59-480x480.py | 14 + ...bv3plus_r50-d8_4xb4-80k_potsdam-512x512.py | 11 + ...3plus_r50-d8_4xb4-80k_vaihingen-512x512.py | 11 + ...us_r50b-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...lus_r50b-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../configs/deeplabv3plus/metafile.yaml | 1041 +++++++ mmsegmentation/configs/dmnet/README.md | 59 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../dmnet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + .../dmnet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...mnet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...mnet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../dmnet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../dmnet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/dmnet/metafile.yaml | 296 ++ mmsegmentation/configs/dnlnet/README.md | 62 + ...nl_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...dnl_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...nl_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...dnl_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../dnl_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + .../dnl_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + .../dnl_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + .../dnl_r50-d8_4xb2-80k_cityscapes-769x769.py | 16 + .../dnl_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../dnl_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/dnlnet/metafile.yaml | 292 ++ mmsegmentation/configs/dpt/README.md | 67 + .../dpt_vit-b16_8xb2-160k_ade20k-512x512.py | 39 + mmsegmentation/configs/dpt/metafile.yaml | 37 + mmsegmentation/configs/dsdl/README.md | 103 + mmsegmentation/configs/dsdl/cityscapes.py | 70 + mmsegmentation/configs/dsdl/voc.py | 65 + mmsegmentation/configs/emanet/README.md | 46 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + mmsegmentation/configs/emanet/metafile.yaml | 109 + mmsegmentation/configs/encnet/README.md | 59 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...encnet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...ncnet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...ncnet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../encnet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../encnet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...encnet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ...encnet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../encnet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + .../encnet_r50s-d8_4xb4-80k_ade20k-512x512.py | 11 + mmsegmentation/configs/encnet/metafile.yaml | 296 ++ mmsegmentation/configs/erfnet/README.md | 54 + ...rfnet_fcn_4xb4-160k_cityscapes-512x1024.py | 10 + mmsegmentation/configs/erfnet/metafile.yaml | 37 + mmsegmentation/configs/fastfcn/README.md | 63 + ...2_jpu_aspp_4xb2-80k_cityscapes-512x1024.py | 20 + ...0-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py | 20 + ...50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py | 20 + ...2_jpu_aspp_4xb4-80k_cityscapes-512x1024.py | 5 + ...32_jpu_enc_4xb2-80k_cityscapes-512x1024.py | 24 + ...50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py | 24 + ...r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py | 24 + ...32_jpu_enc_4xb4-80k_cityscapes-512x1024.py | 5 + ...32_jpu_psp_4xb2-80k_cityscapes-512x1024.py | 8 + ...50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py | 11 + ...r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py | 11 + ...32_jpu_psp_4xb4-80k_cityscapes-512x1024.py | 11 + mmsegmentation/configs/fastfcn/metafile.yaml | 311 ++ mmsegmentation/configs/fastscnn/README.md | 42 + ...fast_scnn_8xb4-160k_cityscapes-512x1024.py | 15 + mmsegmentation/configs/fastscnn/metafile.yaml | 37 + mmsegmentation/configs/fcn/README.md | 111 + ...6_r101-d16_4xb2-40k_cityscapes-512x1024.py | 2 + ...d6_r101-d16_4xb2-40k_cityscapes-769x769.py | 2 + ...6_r101-d16_4xb2-80k_cityscapes-512x1024.py | 2 + ...d6_r101-d16_4xb2-80k_cityscapes-769x769.py | 2 + ..._r101b-d16_4xb2-80k_cityscapes-512x1024.py | 4 + ...6_r101b-d16_4xb2-80k_cityscapes-769x769.py | 4 + ...d6_r50-d16_4xb2-40k_cityscapes-512x1024.py | 11 + ...-d6_r50-d16_4xb2-40k_cityscapes-769x769.py | 13 + ...d6_r50-d16_4xb2-80k_cityscapes-512x1024.py | 11 + ...-d6_r50-d16_4xb2-80k_cityscapes-769x769.py | 13 + ...6_r50b-d16_4xb2-80k_cityscapes-512x1024.py | 2 + ...d6_r50b-d16_4xb2-80k_cityscapes-769x769.py | 2 + ...cn_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...fcn_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...cn_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...fcn_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...101-d8_4xb2-amp-80k_cityscapes-512x1024.py | 6 + .../fcn_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + .../fcn_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...r101-d8_4xb4-40k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-40k_pascal-context-59-480x480.py | 2 + .../fcn_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../fcn_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...r101-d8_4xb4-80k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-80k_pascal-context-59-480x480.py | 2 + ...n_r101b-d8_4xb2-80k_cityscapes-512x1024.py | 4 + ...cn_r101b-d8_4xb2-80k_cityscapes-769x769.py | 4 + ...fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py | 9 + .../fcn_r18-d8_4xb2-80k_cityscapes-769x769.py | 9 + ...cn_r18b-d8_4xb2-80k_cityscapes-512x1024.py | 9 + ...fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py | 9 + ...fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + .../fcn_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + .../fcn_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../fcn_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../fcn_r50-d8_4xb4-20k_voc12aug-512x512.py | 10 + ..._r50-d8_4xb4-40k_pascal-context-480x480.py | 13 + ...0-d8_4xb4-40k_pascal-context-59-480x480.py | 14 + .../fcn_r50-d8_4xb4-40k_voc12aug-512x512.py | 10 + .../fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + ..._r50-d8_4xb4-80k_pascal-context-480x480.py | 13 + ...0-d8_4xb4-80k_pascal-context-59-480x480.py | 14 + ...cn_r50b-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py | 2 + mmsegmentation/configs/fcn/metafile.yaml | 997 +++++++ mmsegmentation/configs/gcnet/README.md | 68 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + .../gcnet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../gcnet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...cnet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../gcnet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + .../gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + .../gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../gcnet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/gcnet/metafile.yaml | 391 +++ mmsegmentation/configs/hrnet/README.md | 122 + .../fcn_hr18_4xb2-160k_cityscapes-512x1024.py | 7 + .../fcn_hr18_4xb2-40k_cityscapes-512x1024.py | 7 + .../fcn_hr18_4xb2-80k_cityscapes-512x1024.py | 7 + .../fcn_hr18_4xb4-160k_ade20k-512x512.py | 8 + .../fcn_hr18_4xb4-20k_voc12aug-512x512.py | 8 + ...cn_hr18_4xb4-40k_pascal-context-480x480.py | 12 + ...hr18_4xb4-40k_pascal-context-59-480x480.py | 12 + .../fcn_hr18_4xb4-40k_voc12aug-512x512.py | 8 + .../hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py | 8 + .../hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py | 8 + .../hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py | 8 + ...cn_hr18_4xb4-80k_pascal-context-480x480.py | 12 + ...hr18_4xb4-80k_pascal-context-59-480x480.py | 12 + .../fcn_hr18_4xb4-80k_potsdam-512x512.py | 8 + .../fcn_hr18_4xb4-80k_vaihingen-512x512.py | 8 + ...fcn_hr18s_4xb2-160k_cityscapes-512x1024.py | 9 + .../fcn_hr18s_4xb2-40k_cityscapes-512x1024.py | 9 + .../fcn_hr18s_4xb2-80k_cityscapes-512x1024.py | 9 + .../fcn_hr18s_4xb4-160k_ade20k-512x512.py | 9 + .../fcn_hr18s_4xb4-20k_voc12aug-512x512.py | 9 + ...n_hr18s_4xb4-40k_pascal-context-480x480.py | 9 + ...r18s_4xb4-40k_pascal-context-59-480x480.py | 9 + .../fcn_hr18s_4xb4-40k_voc12aug-512x512.py | 9 + .../fcn_hr18s_4xb4-80k_ade20k-512x512.py | 9 + .../hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py | 9 + .../fcn_hr18s_4xb4-80k_loveda-512x512.py | 9 + ...n_hr18s_4xb4-80k_pascal-context-480x480.py | 9 + ...r18s_4xb4-80k_pascal-context-59-480x480.py | 9 + .../fcn_hr18s_4xb4-80k_potsdam-512x512.py | 9 + .../fcn_hr18s_4xb4-80k_vaihingen-512x512.py | 9 + .../fcn_hr48_4xb2-160k_cityscapes-512x1024.py | 10 + .../fcn_hr48_4xb2-40k_cityscapes-512x1024.py | 10 + .../fcn_hr48_4xb2-80k_cityscapes-512x1024.py | 10 + .../fcn_hr48_4xb4-160k_ade20k-512x512.py | 10 + .../fcn_hr48_4xb4-20k_voc12aug-512x512.py | 10 + ...cn_hr48_4xb4-40k_pascal-context-480x480.py | 10 + ...hr48_4xb4-40k_pascal-context-59-480x480.py | 10 + .../fcn_hr48_4xb4-40k_voc12aug-512x512.py | 10 + .../hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py | 10 + .../hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py | 10 + .../hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py | 10 + ...cn_hr48_4xb4-80k_pascal-context-480x480.py | 10 + ...hr48_4xb4-80k_pascal-context-59-480x480.py | 10 + .../fcn_hr48_4xb4-80k_potsdam-512x512.py | 10 + .../fcn_hr48_4xb4-80k_vaihingen-512x512.py | 10 + mmsegmentation/configs/hrnet/metafile.yaml | 874 ++++++ mmsegmentation/configs/icnet/README.md | 56 + ...8-in1k-pre_4xb2-160k_cityscapes-832x832.py | 7 + ...d8-in1k-pre_4xb2-80k_cityscapes-832x832.py | 7 + ...et_r101-d8_4xb2-160k_cityscapes-832x832.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-832x832.py | 2 + ...8-in1k-pre_4xb2-160k_cityscapes-832x832.py | 8 + ...d8-in1k-pre_4xb2-80k_cityscapes-832x832.py | 8 + ...net_r18-d8_4xb2-160k_cityscapes-832x832.py | 3 + ...cnet_r18-d8_4xb2-80k_cityscapes-832x832.py | 3 + ...8-in1k-pre_4xb2-160k_cityscapes-832x832.py | 6 + ...d8-in1k-pre_4xb2-80k_cityscapes-832x832.py | 6 + ...net_r50-d8_4xb2-160k_cityscapes-832x832.py | 8 + ...cnet_r50-d8_4xb2-80k_cityscapes-832x832.py | 8 + mmsegmentation/configs/icnet/metafile.yaml | 298 ++ mmsegmentation/configs/isanet/README.md | 80 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...isanet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...sanet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...sanet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../isanet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../isanet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...isanet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ...isanet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../isanet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/isanet/metafile.yaml | 399 +++ mmsegmentation/configs/knet/README.md | 52 + ...deeplabv3_8xb2-adamw-80k_ade20k-512x512.py | 111 + ...50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py | 112 + ...d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py | 110 + ...8_upernet_8xb2-adamw-80k_ade20k-512x512.py | 111 + ...l_upernet_8xb2-adamw-80k_ade20k-512x512.py | 21 + ...l_upernet_8xb2-adamw-80k_ade20k-640x640.py | 57 + ...t_upernet_8xb2-adamw-80k_ade20k-512x512.py | 63 + mmsegmentation/configs/knet/metafile.yaml | 188 ++ mmsegmentation/configs/mae/README.md | 82 + ...upernet_8xb2-amp-160k_ade20k-512x512-ms.py | 16 + ...se_upernet_8xb2-amp-160k_ade20k-512x512.py | 54 + mmsegmentation/configs/mae/metafile.yaml | 25 + mmsegmentation/configs/mask2former/README.md | 74 + ...sk2former_r101_8xb2-160k_ade20k-512x512.py | 7 + ...ormer_r101_8xb2-90k_cityscapes-512x1024.py | 7 + ...ask2former_r50_8xb2-160k_ade20k-512x512.py | 200 ++ ...former_r50_8xb2-90k_cityscapes-512x1024.py | 197 ++ ...1k-384x384-pre_8xb2-160k_ade20k-640x640.py | 229 ++ ...2k-384x384-pre_8xb2-160k_ade20k-640x640.py | 5 + ...84x384-pre_8xb2-90k_cityscapes-512x1024.py | 42 + ...2k-384x384-pre_8xb2-160k_ade20k-640x640.py | 9 + ...84x384-pre_8xb2-90k_cityscapes-512x1024.py | 42 + ...2former_swin-s_8xb2-160k_ade20k-512x512.py | 37 + ...mer_swin-s_8xb2-90k_cityscapes-512x1024.py | 37 + ...2former_swin-t_8xb2-160k_ade20k-512x512.py | 52 + ...mer_swin-t_8xb2-90k_cityscapes-512x1024.py | 52 + .../configs/mask2former/metafile.yaml | 314 ++ mmsegmentation/configs/maskformer/README.md | 62 + ...ormer_r101-d32_8xb2-160k_ade20k-512x512.py | 7 + ...former_r50-d32_8xb2-160k_ade20k-512x512.py | 141 + ...swin-s_upernet_8xb2-160k_ade20k-512x512.py | 79 + ...swin-t_upernet_8xb2-160k_ade20k-512x512.py | 81 + .../configs/maskformer/metafile.yaml | 111 + mmsegmentation/configs/mobilenet_v2/README.md | 56 + .../configs/mobilenet_v2/metafile.yaml | 186 ++ ..._deeplabv3_4xb2-80k_cityscapes-512x1024.py | 13 + ...2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py | 13 + ...plabv3plus_4xb2-80k_cityscapes-512x1024.py | 15 + ..._deeplabv3plus_4xb4-160k_ade20k-512x512.py | 13 + ...-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py | 13 + ...enet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py | 13 + ...-d8_pspnet_4xb2-80k_cityscapes-512x1024.py | 13 + ...t-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py | 13 + mmsegmentation/configs/mobilenet_v3/README.md | 50 + .../configs/mobilenet_v3/metafile.yaml | 109 + ...-s_lraspp_4xb4-320k_cityscapes-512x1024.py | 23 + ...-s_lraspp_4xb4-320k_cityscapes-512x1024.py | 22 + ...ch_lraspp_4xb4-320k_cityscapes-512x1024.py | 13 + ...d8_lraspp_4xb4-320k_cityscapes-512x1024.py | 16 + mmsegmentation/configs/nonlocal_net/README.md | 68 + .../configs/nonlocal_net/metafile.yaml | 387 +++ ...al_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...cal_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...al_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...cal_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...nlocal_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...local_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...local_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + ...onlocal_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...cal_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...ocal_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...cal_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...ocal_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + ...onlocal_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...nlocal_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ...nlocal_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + ...nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/ocrnet/README.md | 89 + mmsegmentation/configs/ocrnet/metafile.yaml | 577 ++++ ...rnet_hr18_4xb2-160k_cityscapes-512x1024.py | 7 + ...crnet_hr18_4xb2-40k_cityscapes-512x1024.py | 7 + ...crnet_hr18_4xb2-80k_cityscapes-512x1024.py | 7 + .../ocrnet_hr18_4xb4-160k_ade20k-512x512.py | 39 + .../ocrnet_hr18_4xb4-20k_voc12aug-512x512.py | 40 + .../ocrnet_hr18_4xb4-40k_voc12aug-512x512.py | 40 + .../ocrnet_hr18_4xb4-80k_ade20k-512x512.py | 39 + ...net_hr18s_4xb2-160k_cityscapes-512x1024.py | 9 + ...rnet_hr18s_4xb2-40k_cityscapes-512x1024.py | 9 + ...rnet_hr18s_4xb2-80k_cityscapes-512x1024.py | 9 + .../ocrnet_hr18s_4xb4-160k_ade20k-512x512.py | 9 + .../ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py | 9 + .../ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py | 9 + .../ocrnet_hr18s_4xb4-80k_ade20k-512x512.py | 9 + ...rnet_hr48_4xb2-160k_cityscapes-512x1024.py | 39 + ...crnet_hr48_4xb2-40k_cityscapes-512x1024.py | 39 + ...crnet_hr48_4xb2-80k_cityscapes-512x1024.py | 39 + .../ocrnet_hr48_4xb4-160k_ade20k-512x512.py | 39 + .../ocrnet_hr48_4xb4-20k_voc12aug-512x512.py | 39 + .../ocrnet_hr48_4xb4-40k_voc12aug-512x512.py | 39 + .../ocrnet_hr48_4xb4-80k_ade20k-512x512.py | 39 + ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 10 + ...et_r101-d8_8xb2-40k_cityscapes-512x1024.py | 21 + ...et_r101-d8_8xb2-80k_cityscapes-512x1024.py | 21 + mmsegmentation/configs/pidnet/README.md | 50 + mmsegmentation/configs/pidnet/metafile.yaml | 85 + ...pidnet-l_2xb6-120k_1024x1024-cityscapes.py | 10 + ...pidnet-m_2xb6-120k_1024x1024-cityscapes.py | 5 + ...pidnet-s_2xb6-120k_1024x1024-cityscapes.py | 113 + mmsegmentation/configs/point_rend/README.md | 51 + .../configs/point_rend/metafile.yaml | 110 + ...trend_r101_4xb2-80k_cityscapes-512x1024.py | 2 + ...pointrend_r101_4xb4-160k_ade20k-512x512.py | 2 + ...ntrend_r50_4xb2-80k_cityscapes-512x1024.py | 18 + .../pointrend_r50_4xb4-160k_ade20k-512x512.py | 46 + mmsegmentation/configs/poolformer/README.md | 65 + ..._poolformer_m36_8xb4-40k_ade20k-512x512.py | 11 + ..._poolformer_m48_8xb4-40k_ade20k-512x512.py | 11 + ..._poolformer_s12_8xb4-40k_ade20k-512x512.py | 91 + ..._poolformer_s24_8xb4-40k_ade20k-512x512.py | 9 + ...n_poolformer_s36_8x4_512x512_40k_ade20k.py | 10 + .../configs/poolformer/metafile.yaml | 116 + mmsegmentation/configs/psanet/README.md | 68 + mmsegmentation/configs/psanet/metafile.yaml | 391 +++ ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...psanet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...sanet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...sanet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../psanet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...anet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../psanet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...psanet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ...psanet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../psanet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/pspnet/README.md | 182 ++ mmsegmentation/configs/pspnet/metafile.yaml | 1303 +++++++++ ...et_r101-d8_4xb2-40k_cityscapes-512x1024.py | 2 + ...tyscapes-512x1024_dark-zurich-1920x1080.py | 2 + ...scapes-512x1024_night-driving-1920x1080.py | 2 + ...net_r101-d8_4xb2-40k_cityscapes-769x769.py | 2 + ...et_r101-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r101-d8_4xb2-80k_cityscapes-769x769.py | 2 + ...101-d8_4xb2-amp-80k_cityscapes-512x1024.py | 6 + ...pspnet_r101-d8_4xb4-160k_ade20k-512x512.py | 2 + ...101-d8_4xb4-160k_coco-stuff164k-512x512.py | 2 + ..._r101-d8_4xb4-20k_coco-stuff10k-512x512.py | 2 + ...spnet_r101-d8_4xb4-20k_voc12aug-512x512.py | 2 + ...101-d8_4xb4-320k_coco-stuff164k-512x512.py | 2 + ..._r101-d8_4xb4-40k_coco-stuff10k-512x512.py | 2 + ...r101-d8_4xb4-40k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-40k_pascal-context-59-480x480.py | 2 + ...spnet_r101-d8_4xb4-40k_voc12aug-512x512.py | 2 + .../pspnet_r101-d8_4xb4-80k_ade20k-512x512.py | 2 + ...r101-d8_4xb4-80k_coco-stuff164k-512x512.py | 2 + .../pspnet_r101-d8_4xb4-80k_loveda-512x512.py | 2 + ...r101-d8_4xb4-80k_pascal-context-480x480.py | 2 + ...1-d8_4xb4-80k_pascal-context-59-480x480.py | 2 + ...pspnet_r101-d8_4xb4-80k_potsdam-512x512.py | 2 + ...pnet_r101-d8_4xb4-80k_vaihingen-512x512.py | 2 + ...t_r101b-d8_4xb2-80k_cityscapes-512x1024.py | 4 + ...tyscapes-512x1024_dark-zurich-1920x1080.py | 4 + ...scapes-512x1024_night-driving-1920x1080.py | 4 + ...et_r101b-d8_4xb2-80k_cityscapes-769x769.py | 4 + ...net_r18-d8_4xb2-80k_cityscapes-512x1024.py | 9 + ...pnet_r18-d8_4xb2-80k_cityscapes-769x769.py | 9 + .../pspnet_r18-d8_4xb4-80k_isaid-896x896.py | 9 + .../pspnet_r18-d8_4xb4-80k_loveda-512x512.py | 9 + .../pspnet_r18-d8_4xb4-80k_potsdam-512x512.py | 9 + ...spnet_r18-d8_4xb4-80k_vaihingen-512x512.py | 9 + ...et_r18b-d8_4xb2-80k_cityscapes-512x1024.py | 9 + ...net_r18b-d8_4xb2-80k_cityscapes-769x769.py | 9 + ...et_r50-d32_4xb2-80k_cityscapes-512x1024.py | 9 + ..._rsb_4xb2-adamw-80k_cityscapes-512x1024.py | 35 + ...-rsb_4xb2-adamw-80k_cityscapes-512x1024.py | 33 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 7 + ...tyscapes-512x1024_dark-zurich-1920x1080.py | 24 + ...scapes-512x1024_night-driving-1920x1080.py | 25 + ...pnet_r50-d8_4xb2-40k_cityscapes-769x769.py | 12 + ...net_r50-d8_4xb2-80k_cityscapes-512x1024.py | 7 + ...tyscapes-512x1024_dark-zurich-1920x1080.py | 25 + ...scapes-512x1024_night-driving-1920x1080.py | 25 + ...pnet_r50-d8_4xb2-80k_cityscapes-769x769.py | 12 + .../pspnet_r50-d8_4xb4-160k_ade20k-512x512.py | 10 + ...r50-d8_4xb4-160k_coco-stuff164k-512x512.py | 11 + ...t_r50-d8_4xb4-20k_coco-stuff10k-512x512.py | 10 + ...pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py | 11 + ...r50-d8_4xb4-320k_coco-stuff164k-512x512.py | 11 + ...t_r50-d8_4xb4-40k_coco-stuff10k-512x512.py | 10 + ..._r50-d8_4xb4-40k_pascal-context-480x480.py | 14 + ...0-d8_4xb4-40k_pascal-context-59-480x480.py | 14 + ...pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py | 11 + .../pspnet_r50-d8_4xb4-80k_ade20k-512x512.py | 10 + ..._r50-d8_4xb4-80k_coco-stuff164k-512x512.py | 11 + .../pspnet_r50-d8_4xb4-80k_isaid-896x896.py | 10 + .../pspnet_r50-d8_4xb4-80k_loveda-512x512.py | 10 + ..._r50-d8_4xb4-80k_pascal-context-480x480.py | 14 + ...0-d8_4xb4-80k_pascal-context-59-480x480.py | 14 + .../pspnet_r50-d8_4xb4-80k_potsdam-512x512.py | 10 + ...spnet_r50-d8_4xb4-80k_vaihingen-512x512.py | 10 + ...t_r50b-d32_4xb2-80k_cityscapes-512x1024.py | 10 + ...et_r50b-d8_4xb2-80k_cityscapes-512x1024.py | 2 + ...net_r50b-d8_4xb2-80k_cityscapes-769x769.py | 2 + mmsegmentation/configs/resnest/README.md | 54 + mmsegmentation/configs/resnest/metafile.yaml | 193 ++ ..._deeplabv3_4xb2-80k_cityscapes-512x1024.py | 9 + ...1-d8_deeplabv3_4xb4-160k_ade20k-512x512.py | 9 + ...plabv3plus_4xb2-80k_cityscapes-512x1024.py | 9 + ..._deeplabv3plus_4xb4-160k_ade20k-512x512.py | 9 + ...101-d8_fcn_4xb2-80k_cityscapes-512x1024.py | 9 + ...st_s101-d8_fcn_4xb4-160k_ade20k-512x512.py | 9 + ...1-d8_pspnet_4xb2-80k_cityscapes512x1024.py | 9 + ...s101-d8_pspnet_4xb4-160k_ade20k-512x512.py | 9 + mmsegmentation/configs/san/README.md | 47 + mmsegmentation/configs/san/metafile.yaml | 61 + .../san/san-vit-b16_coco-stuff164k-640x640.py | 82 + .../san/san-vit-b16_pascal_context-640x640.py | 56 + .../san/san-vit-b16_voc12aug-640x640.py | 65 + .../san/san-vit-l14_coco-stuff164k-640x640.py | 36 + .../san/san-vit-l14_pascal_context-640x640.py | 32 + .../san/san-vit-l14_voc12aug-640x640.py | 32 + mmsegmentation/configs/segformer/README.md | 101 + .../configs/segformer/metafile.yaml | 340 +++ ...r_mit-b0_8xb1-160k_cityscapes-1024x1024.py | 41 + ...gformer_mit-b0_8xb2-160k_ade20k-512x512.py | 39 + ...r_mit-b1_8xb1-160k_cityscapes-1024x1024.py | 9 + ...gformer_mit-b1_8xb2-160k_ade20k-512x512.py | 12 + ...r_mit-b2_8xb1-160k_cityscapes-1024x1024.py | 10 + ...gformer_mit-b2_8xb2-160k_ade20k-512x512.py | 12 + ...r_mit-b3_8xb1-160k_cityscapes-1024x1024.py | 10 + ...gformer_mit-b3_8xb2-160k_ade20k-512x512.py | 12 + ...r_mit-b4_8xb1-160k_cityscapes-1024x1024.py | 10 + ...gformer_mit-b4_8xb2-160k_ade20k-512x512.py | 12 + ...r_mit-b5_8xb1-160k_cityscapes-1024x1024.py | 10 + ...gformer_mit-b5_8xb2-160k_ade20k-512x512.py | 12 + ...gformer_mit-b5_8xb2-160k_ade20k-640x640.py | 41 + mmsegmentation/configs/segmenter/README.md | 76 + .../configs/segmenter/metafile.yaml | 138 + ...ter_vit-b_mask_8xb1-160k_ade20k-512x512.py | 14 + ...ter_vit-l_mask_8xb1-160k_ade20k-512x512.py | 32 + ...nter_vit-s_fcn_8xb1-160k_ade20k-512x512.py | 14 + ...ter_vit-s_mask_8xb1-160k_ade20k-512x512.py | 36 + ...ter_vit-t_mask_8xb1-160k_ade20k-512x512.py | 26 + mmsegmentation/configs/segnext/README.md | 63 + mmsegmentation/configs/segnext/metafile.yaml | 109 + ...mscan-b_1xb16-adamw-160k_ade20k-512x512.py | 28 + ...mscan-l_1xb16-adamw-160k_ade20k-512x512.py | 27 + ...mscan-s_1xb16-adamw-160k_ade20k-512x512.py | 27 + ...mscan-t_1xb16-adamw-160k_ade20k-512x512.py | 84 + mmsegmentation/configs/sem_fpn/README.md | 51 + .../fpn_r101_4xb2-80k_cityscapes-512x1024.py | 2 + .../fpn_r101_4xb4-160k_ade20k-512x512.py | 5 + .../fpn_r50_4xb2-80k_cityscapes-512x1024.py | 7 + .../fpn_r50_4xb4-160k_ade20k-512x512.py | 8 + mmsegmentation/configs/sem_fpn/metafile.yaml | 110 + mmsegmentation/configs/setr/README.md | 74 + mmsegmentation/configs/setr/metafile.yaml | 197 ++ ...setr_vit-l-mla_8xb1-160k_ade20k-512x512.py | 90 + ...r_vit-l_mla_8xb1-80k_cityscapes-768x768.py | 23 + ...setr_vit-l_mla_8xb2-160k_ade20k-512x512.py | 6 + ...vit-l_naive_8xb1-80k_cityscapes-768x768.py | 24 + ...tr_vit-l_naive_8xb2-160k_ade20k-512x512.py | 72 + ...r_vit-l_pup_8xb1-80k_cityscapes-768x768.py | 70 + ...setr_vit-l_pup_8xb2-160k_ade20k-512x512.py | 72 + mmsegmentation/configs/stdc/README.md | 73 + mmsegmentation/configs/stdc/metafile.yaml | 107 + .../stdc1_4xb12-80k_cityscapes-512x1024.py | 21 + ..._in1k-pre_4xb12-80k_cityscapes-512x1024.py | 6 + .../stdc2_4xb12-80k_cityscapes-512x1024.py | 2 + ..._in1k-pre_4xb12-80k_cityscapes-512x1024.py | 6 + mmsegmentation/configs/swin/README.md | 76 + mmsegmentation/configs/swin/metafile.yaml | 143 + ...84-pre_upernet_8xb2-160k_ade20k-512x512.py | 14 + ...84-pre_upernet_8xb2-160k_ade20k-512x512.py | 7 + ...1k-pre_upernet_8xb2-160k_ade20k-512x512.py | 12 + ...2k-pre_upernet_8xb2-160k_ade20k-512x512.py | 7 + ...84-pre_upernet_8xb2-160k_ade20k-512x512.py | 10 + ...2k-pre_upernet_8xb2-160k_ade20k-512x512.py | 15 + ...1k-pre_upernet_8xb2-160k_ade20k-512x512.py | 10 + ...1k-pre_upernet_8xb2-160k_ade20k-512x512.py | 52 + ...-window7_upernet_1xb8-20k_levir-256x256.py | 57 + mmsegmentation/configs/twins/README.md | 76 + mmsegmentation/configs/twins/metafile.yaml | 289 ++ ...t-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py | 8 + ...pvt-b_uperhead_8xb2-160k_ade20k-512x512.py | 13 + ...t-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py | 8 + ...pvt-l_uperhead_8xb2-160k_ade20k-512x512.py | 13 + ...t-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py | 12 + ...pvt-s_uperhead_8xb4-160k_ade20k-512x512.py | 31 + ...t-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py | 12 + ...svt-b_uperhead_8xb2-160k_ade20k-512x512.py | 12 + ...t-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py | 13 + ...svt-l_uperhead_8xb2-160k_ade20k-512x512.py | 13 + ...t-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py | 28 + ...svt-s_uperhead_8xb2-160k_ade20k-512x512.py | 49 + mmsegmentation/configs/unet/README.md | 92 + mmsegmentation/configs/unet/metafile.yaml | 642 +++++ ...t-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py | 9 + ...t-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py | 9 + ...s5-d16_deeplabv3_4xb4-40k_stare-128x128.py | 9 + ...4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py | 6 + ...v3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py | 6 + ...v3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py | 6 + ..._4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py | 6 + ...5-d16_fcn_4xb4-160k_cityscapes-512x1024.py | 16 + ...t-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py | 36 + ...t-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py | 9 + .../unet-s5-d16_fcn_4xb4-40k_drive-64x64.py | 9 + .../unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py | 9 + .../unet-s5-d16_fcn_4xb4-40k_stare-128x128.py | 9 + ...4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py | 6 + ...cn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py | 6 + ...cn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py | 6 + ..._4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py | 6 + ...5-d16_pspnet_4xb4-40k_chase-db1-128x128.py | 10 + ...unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py | 9 + ...unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py | 9 + ...et-s5-d16_pspnet_4xb4-40k_stare-128x128.py | 9 + ...4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py | 6 + ...et_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py | 6 + ...et_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py | 6 + ..._4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py | 6 + ...16_deeplabv3_4xb4-40k_chase-db1-128x128.py | 10 + mmsegmentation/configs/upernet/README.md | 68 + mmsegmentation/configs/upernet/metafile.yaml | 391 +++ ...ernet_r101_4xb2-40k_cityscapes-512x1024.py | 2 + ...pernet_r101_4xb2-40k_cityscapes-769x769.py | 2 + ...ernet_r101_4xb2-80k_cityscapes-512x1024.py | 2 + ...pernet_r101_4xb2-80k_cityscapes-769x769.py | 2 + .../upernet_r101_4xb4-160k_ade20k-512x512.py | 2 + .../upernet_r101_4xb4-20k_voc12aug-512x512.py | 2 + .../upernet_r101_4xb4-40k_voc12aug-512x512.py | 2 + .../upernet_r101_4xb4-80k_ade20k-512x512.py | 2 + ...pernet_r18_4xb2-40k_cityscapes-512x1024.py | 6 + ...pernet_r18_4xb2-80k_cityscapes-512x1024.py | 6 + .../upernet_r18_4xb4-160k_ade20k-512x512.py | 9 + .../upernet_r18_4xb4-20k_voc12aug-512x512.py | 10 + .../upernet_r18_4xb4-40k_voc12aug-512x512.py | 10 + .../upernet_r18_4xb4-80k_ade20k-512x512.py | 9 + ...pernet_r50_4xb2-40k_cityscapes-512x1024.py | 7 + ...upernet_r50_4xb2-40k_cityscapes-769x769.py | 12 + ...pernet_r50_4xb2-80k_cityscapes-512x1024.py | 7 + ...upernet_r50_4xb2-80k_cityscapes-769x769.py | 12 + .../upernet_r50_4xb4-160k_ade20k-512x512.py | 10 + .../upernet_r50_4xb4-20k_voc12aug-512x512.py | 11 + .../upernet_r50_4xb4-40k_voc12aug-512x512.py | 11 + .../upernet_r50_4xb4-80k_ade20k-512x512.py | 10 + mmsegmentation/configs/vit/README.md | 70 + mmsegmentation/configs/vit/metafile.yaml | 265 ++ ...ln_mln_upernet_8xb2-160k_ade20k-512x512.py | 5 + ...16_mln_upernet_8xb2-160k_ade20k-512x512.py | 6 + ...it-b16_upernet_8xb2-160k_ade20k-512x512.py | 6 + ...eit-b16_upernet_8xb2-80k_ade20k-512x512.py | 6 + ...ln_mln_upernet_8xb2-160k_ade20k-512x512.py | 9 + ...16_mln_upernet_8xb2-160k_ade20k-512x512.py | 8 + ...it-s16_upernet_8xb2-160k_ade20k-512x512.py | 8 + ...eit-s16_upernet_8xb2-80k_ade20k-512x512.py | 8 + ...ln_mln_upernet_8xb2-160k_ade20k-512x512.py | 45 + ...16_mln_upernet_8xb2-160k_ade20k-512x512.py | 44 + ...b16_mln_upernet_8xb2-80k_ade20k-512x512.py | 44 + mmsegmentation/configs/vpd/README.md | 50 + mmsegmentation/configs/vpd/metafile.yaml | 56 + .../vpd/vpd_sd_4xb8-25k_nyu-480x480.py | 38 + .../vpd/vpd_sd_4xb8-25k_nyu-512x512.py | 37 + mmsegmentation/dataset-index.yml | 80 + .../demo/MMSegmentation_Tutorial.ipynb | 555 ++++ mmsegmentation/demo/image_demo.py | 51 + .../demo/image_demo_with_inferencer.py | 54 + mmsegmentation/demo/inference_demo.ipynb | 120 + mmsegmentation/demo/rs_image_inference.py | 50 + mmsegmentation/demo/video_demo.py | 112 + mmsegmentation/docker/Dockerfile | 35 + mmsegmentation/docker/serve/Dockerfile | 51 + mmsegmentation/docker/serve/config.properties | 5 + mmsegmentation/docker/serve/entrypoint.sh | 12 + mmsegmentation/docs/en/.readthedocs.yaml | 17 + mmsegmentation/docs/en/Makefile | 20 + .../docs/en/_static/css/readthedocs.css | 6 + .../docs/en/advanced_guides/add_datasets.md | 199 ++ .../docs/en/advanced_guides/add_metrics.md | 81 + .../docs/en/advanced_guides/add_models.md | 260 ++ .../docs/en/advanced_guides/add_transforms.md | 52 + .../en/advanced_guides/customize_runtime.md | 168 ++ .../docs/en/advanced_guides/data_flow.md | 87 + .../docs/en/advanced_guides/datasets.md | 386 +++ .../docs/en/advanced_guides/engine.md | 279 ++ .../docs/en/advanced_guides/evaluation.md | 155 + .../docs/en/advanced_guides/index.rst | 26 + .../docs/en/advanced_guides/models.md | 164 ++ .../docs/en/advanced_guides/structures.md | 104 + .../en/advanced_guides/training_tricks.md | 75 + .../docs/en/advanced_guides/transforms.md | 119 + mmsegmentation/docs/en/api.rst | 95 + mmsegmentation/docs/en/conf.py | 133 + mmsegmentation/docs/en/device/npu.md | 39 + mmsegmentation/docs/en/get_started.md | 211 ++ mmsegmentation/docs/en/index.rst | 63 + mmsegmentation/docs/en/make.bat | 35 + mmsegmentation/docs/en/migration/index.rst | 8 + mmsegmentation/docs/en/migration/interface.md | 525 ++++ mmsegmentation/docs/en/migration/package.md | 113 + mmsegmentation/docs/en/model_zoo.md | 186 ++ mmsegmentation/docs/en/modelzoo_statistics.md | 102 + mmsegmentation/docs/en/notes/changelog.md | 506 ++++ .../docs/en/notes/changelog_v0.x.md | 720 +++++ mmsegmentation/docs/en/notes/faq.md | 132 + mmsegmentation/docs/en/overview.md | 85 + mmsegmentation/docs/en/stat.py | 67 + mmsegmentation/docs/en/switch_language.md | 3 + .../docs/en/user_guides/1_config.md | 588 ++++ .../docs/en/user_guides/2_dataset_prepare.md | 806 ++++++ .../docs/en/user_guides/3_inference.md | 244 ++ .../docs/en/user_guides/4_train_test.md | 315 ++ .../docs/en/user_guides/5_deployment.md | 255 ++ mmsegmentation/docs/en/user_guides/index.rst | 21 + .../docs/en/user_guides/useful_tools.md | 245 ++ .../docs/en/user_guides/visualization.md | 174 ++ .../user_guides/visualization_feature_map.md | 201 ++ mmsegmentation/docs/zh_cn/.readthedocs.yaml | 17 + mmsegmentation/docs/zh_cn/Makefile | 20 + .../docs/zh_cn/_static/css/readthedocs.css | 6 + .../zh_cn/advanced_guides/add_datasets.md | 199 ++ .../docs/zh_cn/advanced_guides/add_metrics.md | 81 + .../docs/zh_cn/advanced_guides/add_models.md | 260 ++ .../zh_cn/advanced_guides/add_transforms.md | 51 + .../advanced_guides/contribute_dataset.md | 461 +++ .../advanced_guides/customize_runtime.md | 162 ++ .../docs/zh_cn/advanced_guides/data_flow.md | 90 + .../docs/zh_cn/advanced_guides/datasets.md | 363 +++ .../docs/zh_cn/advanced_guides/engine.md | 281 ++ .../docs/zh_cn/advanced_guides/evaluation.md | 158 + .../docs/zh_cn/advanced_guides/index.rst | 26 + .../docs/zh_cn/advanced_guides/models.md | 177 ++ .../docs/zh_cn/advanced_guides/structures.md | 102 + .../zh_cn/advanced_guides/training_tricks.md | 74 + .../docs/zh_cn/advanced_guides/transforms.md | 119 + mmsegmentation/docs/zh_cn/api.rst | 95 + mmsegmentation/docs/zh_cn/conf.py | 133 + mmsegmentation/docs/zh_cn/device/npu.md | 39 + mmsegmentation/docs/zh_cn/get_started.md | 209 ++ mmsegmentation/docs/zh_cn/index.rst | 57 + mmsegmentation/docs/zh_cn/make.bat | 35 + mmsegmentation/docs/zh_cn/migration/index.rst | 8 + .../docs/zh_cn/migration/interface.md | 523 ++++ .../docs/zh_cn/migration/package.md | 113 + mmsegmentation/docs/zh_cn/model_zoo.md | 152 + .../docs/zh_cn/modelzoo_statistics.md | 102 + mmsegmentation/docs/zh_cn/notes/faq.md | 125 + mmsegmentation/docs/zh_cn/overview.md | 75 + mmsegmentation/docs/zh_cn/stat.py | 67 + mmsegmentation/docs/zh_cn/switch_language.md | 3 + .../docs/zh_cn/user_guides/1_config.md | 577 ++++ .../zh_cn/user_guides/2_dataset_prepare.md | 802 ++++++ .../docs/zh_cn/user_guides/3_inference.md | 244 ++ .../docs/zh_cn/user_guides/4_train_test.md | 317 ++ .../docs/zh_cn/user_guides/5_deployment.md | 243 ++ .../docs/zh_cn/user_guides/deploy_jetson.md | 372 +++ .../docs/zh_cn/user_guides/index.rst | 21 + .../docs/zh_cn/user_guides/useful_tools.md | 368 +++ .../docs/zh_cn/user_guides/visualization.md | 173 ++ .../user_guides/visualization_feature_map.md | 201 ++ mmsegmentation/mmseg/__init__.py | 74 + mmsegmentation/mmseg/apis/__init__.py | 9 + mmsegmentation/mmseg/apis/inference.py | 189 ++ mmsegmentation/mmseg/apis/mmseg_inferencer.py | 382 +++ .../mmseg/apis/remote_sense_inferencer.py | 279 ++ mmsegmentation/mmseg/apis/utils.py | 41 + .../mmseg/configs/_base_/datasets/loveda.py | 79 + .../mmseg/configs/_base_/datasets/potsdam.py | 81 + .../mmseg/configs/_base_/default_runtime.py | 22 + .../configs/_base_/schedules/schedule_160k.py | 43 + .../configs/_base_/schedules/schedule_20k.py | 36 + .../configs/_base_/schedules/schedule_240k.py | 34 + .../configs/_base_/schedules/schedule_25k.py | 43 + .../configs/_base_/schedules/schedule_320k.py | 36 + .../configs/_base_/schedules/schedule_40k.py | 34 + .../configs/_base_/schedules/schedule_80k.py | 42 + mmsegmentation/mmseg/datasets/__init__.py | 69 + mmsegmentation/mmseg/datasets/ade.py | 92 + .../mmseg/datasets/basesegdataset.py | 552 ++++ mmsegmentation/mmseg/datasets/bdd100k.py | 30 + mmsegmentation/mmseg/datasets/chase_db1.py | 32 + mmsegmentation/mmseg/datasets/cityscapes.py | 30 + mmsegmentation/mmseg/datasets/coco_stuff.py | 99 + mmsegmentation/mmseg/datasets/dark_zurich.py | 15 + .../mmseg/datasets/dataset_wrappers.py | 136 + mmsegmentation/mmseg/datasets/decathlon.py | 96 + mmsegmentation/mmseg/datasets/drive.py | 32 + mmsegmentation/mmseg/datasets/dsdl.py | 116 + mmsegmentation/mmseg/datasets/hrf.py | 32 + mmsegmentation/mmseg/datasets/hsi_drive.py | 42 + mmsegmentation/mmseg/datasets/isaid.py | 39 + mmsegmentation/mmseg/datasets/isprs.py | 29 + mmsegmentation/mmseg/datasets/levir.py | 31 + mmsegmentation/mmseg/datasets/lip.py | 47 + mmsegmentation/mmseg/datasets/loveda.py | 29 + mmsegmentation/mmseg/datasets/mapillary.py | 176 ++ .../mmseg/datasets/night_driving.py | 15 + mmsegmentation/mmseg/datasets/nyu.py | 123 + .../mmseg/datasets/pascal_context.py | 116 + mmsegmentation/mmseg/datasets/potsdam.py | 29 + mmsegmentation/mmseg/datasets/refuge.py | 28 + mmsegmentation/mmseg/datasets/stare.py | 32 + mmsegmentation/mmseg/datasets/synapse.py | 28 + .../mmseg/datasets/transforms/__init__.py | 30 + .../mmseg/datasets/transforms/formatting.py | 112 + .../mmseg/datasets/transforms/loading.py | 771 +++++ .../mmseg/datasets/transforms/transforms.py | 2537 +++++++++++++++++ mmsegmentation/mmseg/datasets/voc.py | 40 + mmsegmentation/mmseg/datasets/xray.py | 29 + mmsegmentation/mmseg/datasets/xray2.py | 141 + mmsegmentation/mmseg/engine/__init__.py | 12 + mmsegmentation/mmseg/engine/hooks/__init__.py | 4 + .../mmseg/engine/hooks/visualization_hook.py | 129 + .../mmseg/engine/optimizers/__init__.py | 9 + .../optimizers/force_default_constructor.py | 255 ++ .../layer_decay_optimizer_constructor.py | 207 ++ .../mmseg/engine/schedulers/__init__.py | 4 + .../engine/schedulers/poly_ratio_scheduler.py | 62 + mmsegmentation/mmseg/evaluation/__init__.py | 4 + .../mmseg/evaluation/metrics/__init__.py | 8 + .../mmseg/evaluation/metrics/citys_metric.py | 158 + .../mmseg/evaluation/metrics/depth_metric.py | 212 ++ .../mmseg/evaluation/metrics/dice_metric.py | 119 + .../mmseg/evaluation/metrics/iou_metric.py | 286 ++ .../evaluation/metrics/submission_metric.py | 131 + mmsegmentation/mmseg/models/__init__.py | 16 + .../mmseg/models/assigners/__init__.py | 12 + .../mmseg/models/assigners/base_assigner.py | 18 + .../models/assigners/hungarian_assigner.py | 86 + .../mmseg/models/assigners/match_cost.py | 231 ++ .../mmseg/models/backbones/__init__.py | 35 + mmsegmentation/mmseg/models/backbones/beit.py | 554 ++++ .../mmseg/models/backbones/bisenetv1.py | 332 +++ .../mmseg/models/backbones/bisenetv2.py | 622 ++++ .../mmseg/models/backbones/cgnet.py | 372 +++ .../mmseg/models/backbones/ddrnet.py | 222 ++ .../mmseg/models/backbones/erfnet.py | 329 +++ .../mmseg/models/backbones/fast_scnn.py | 408 +++ .../mmseg/models/backbones/hrnet.py | 642 +++++ .../mmseg/models/backbones/icnet.py | 166 ++ mmsegmentation/mmseg/models/backbones/mae.py | 260 ++ mmsegmentation/mmseg/models/backbones/mit.py | 450 +++ .../mmseg/models/backbones/mobilenet_v2.py | 197 ++ .../mmseg/models/backbones/mobilenet_v3.py | 267 ++ .../mmseg/models/backbones/mscan.py | 467 +++ .../mmseg/models/backbones/pidnet.py | 522 ++++ .../mmseg/models/backbones/resnest.py | 318 +++ .../mmseg/models/backbones/resnet.py | 712 +++++ .../mmseg/models/backbones/resnext.py | 150 + mmsegmentation/mmseg/models/backbones/stdc.py | 422 +++ mmsegmentation/mmseg/models/backbones/swin.py | 757 +++++ .../mmseg/models/backbones/timm_backbone.py | 63 + .../mmseg/models/backbones/twins.py | 588 ++++ mmsegmentation/mmseg/models/backbones/unet.py | 436 +++ mmsegmentation/mmseg/models/backbones/vit.py | 501 ++++ mmsegmentation/mmseg/models/backbones/vpd.py | 395 +++ mmsegmentation/mmseg/models/builder.py | 52 + .../mmseg/models/data_preprocessor.py | 151 + .../mmseg/models/decode_heads/__init__.py | 57 + .../mmseg/models/decode_heads/ann_head.py | 245 ++ .../mmseg/models/decode_heads/apc_head.py | 159 ++ .../mmseg/models/decode_heads/aspp_head.py | 122 + .../decode_heads/cascade_decode_head.py | 62 + .../mmseg/models/decode_heads/cc_head.py | 43 + .../mmseg/models/decode_heads/custom.py | 74 + .../mmseg/models/decode_heads/da_head.py | 184 ++ .../mmseg/models/decode_heads/ddr_head.py | 116 + .../mmseg/models/decode_heads/decode_head.py | 366 +++ .../mmseg/models/decode_heads/dm_head.py | 141 + .../mmseg/models/decode_heads/dnl_head.py | 137 + .../mmseg/models/decode_heads/dpt_head.py | 294 ++ .../mmseg/models/decode_heads/ema_head.py | 169 ++ .../mmseg/models/decode_heads/enc_head.py | 196 ++ .../mmseg/models/decode_heads/fcn_head.py | 96 + .../mmseg/models/decode_heads/fpn_head.py | 68 + .../mmseg/models/decode_heads/gc_head.py | 48 + .../mmseg/models/decode_heads/ham_head.py | 255 ++ .../mmseg/models/decode_heads/isa_head.py | 143 + .../mmseg/models/decode_heads/knet_head.py | 461 +++ .../mmseg/models/decode_heads/lraspp_head.py | 91 + .../models/decode_heads/mask2former_head.py | 163 ++ .../models/decode_heads/maskformer_head.py | 174 ++ .../mmseg/models/decode_heads/nl_head.py | 50 + .../mmseg/models/decode_heads/ocr_head.py | 127 + .../mmseg/models/decode_heads/pid_head.py | 183 ++ .../mmseg/models/decode_heads/point_head.py | 367 +++ .../mmseg/models/decode_heads/psa_head.py | 197 ++ .../mmseg/models/decode_heads/psp_head.py | 117 + .../mmseg/models/decode_heads/san_head.py | 736 +++++ .../models/decode_heads/segformer_head.py | 66 + .../decode_heads/segmenter_mask_head.py | 132 + .../models/decode_heads/sep_aspp_head.py | 102 + .../mmseg/models/decode_heads/sep_fcn_head.py | 60 + .../models/decode_heads/setr_mla_head.py | 62 + .../mmseg/models/decode_heads/setr_up_head.py | 81 + .../mmseg/models/decode_heads/stdc_head.py | 97 + .../mmseg/models/decode_heads/uper_head.py | 139 + .../models/decode_heads/vpd_depth_head.py | 253 ++ .../mmseg/models/losses/__init__.py | 21 + .../mmseg/models/losses/accuracy.py | 92 + .../mmseg/models/losses/boundary_loss.py | 62 + .../mmseg/models/losses/cross_entropy_loss.py | 311 ++ .../mmseg/models/losses/dice_loss.py | 202 ++ .../mmseg/models/losses/focal_loss.py | 337 +++ .../models/losses/huasdorff_distance_loss.py | 160 ++ .../mmseg/models/losses/kldiv_loss.py | 99 + .../mmseg/models/losses/lovasz_loss.py | 323 +++ .../models/losses/ohem_cross_entropy_loss.py | 94 + .../mmseg/models/losses/silog_loss.py | 122 + .../mmseg/models/losses/tversky_loss.py | 137 + mmsegmentation/mmseg/models/losses/utils.py | 129 + mmsegmentation/mmseg/models/necks/__init__.py | 11 + .../mmseg/models/necks/featurepyramid.py | 67 + mmsegmentation/mmseg/models/necks/fpn.py | 212 ++ mmsegmentation/mmseg/models/necks/ic_neck.py | 148 + mmsegmentation/mmseg/models/necks/jpu.py | 131 + mmsegmentation/mmseg/models/necks/mla_neck.py | 118 + .../mmseg/models/necks/multilevel_neck.py | 79 + .../mmseg/models/segmentors/__init__.py | 13 + .../mmseg/models/segmentors/base.py | 200 ++ .../segmentors/cascade_encoder_decoder.py | 138 + .../mmseg/models/segmentors/custom.py | 86 + .../models/segmentors/depth_estimator.py | 392 +++ .../models/segmentors/encoder_decoder.py | 364 +++ .../segmentors/multimodal_encoder_decoder.py | 350 +++ .../mmseg/models/segmentors/seg_tta.py | 47 + .../mmseg/models/text_encoder/__init__.py | 4 + .../models/text_encoder/clip_text_encoder.py | 229 ++ mmsegmentation/mmseg/models/utils/__init__.py | 27 + .../mmseg/models/utils/basic_block.py | 143 + mmsegmentation/mmseg/models/utils/embed.py | 330 +++ mmsegmentation/mmseg/models/utils/encoding.py | 75 + .../mmseg/models/utils/inverted_residual.py | 213 ++ .../mmseg/models/utils/make_divisible.py | 28 + .../mmseg/models/utils/point_sample.py | 88 + mmsegmentation/mmseg/models/utils/ppm.py | 193 ++ .../mmseg/models/utils/res_layer.py | 96 + .../mmseg/models/utils/san_layers.py | 418 +++ mmsegmentation/mmseg/models/utils/se_layer.py | 58 + .../models/utils/self_attention_block.py | 161 ++ .../mmseg/models/utils/shape_convert.py | 107 + .../mmseg/models/utils/up_conv_block.py | 102 + mmsegmentation/mmseg/models/utils/wrappers.py | 51 + mmsegmentation/mmseg/registry/__init__.py | 15 + mmsegmentation/mmseg/registry/registry.py | 118 + mmsegmentation/mmseg/structures/__init__.py | 8 + .../mmseg/structures/sampler/__init__.py | 6 + .../structures/sampler/base_pixel_sampler.py | 13 + .../mmseg/structures/sampler/builder.py | 14 + .../structures/sampler/ohem_pixel_sampler.py | 85 + .../mmseg/structures/seg_data_sample.py | 92 + mmsegmentation/mmseg/utils/__init__.py | 72 + .../mmseg/utils/bpe_simple_vocab_16e6.txt.gz | Bin 0 -> 1356917 bytes mmsegmentation/mmseg/utils/class_names.py | 570 ++++ mmsegmentation/mmseg/utils/collect_env.py | 18 + mmsegmentation/mmseg/utils/get_templates.py | 109 + mmsegmentation/mmseg/utils/io.py | 42 + .../mmseg/utils/mask_classification.py | 205 ++ mmsegmentation/mmseg/utils/misc.py | 128 + mmsegmentation/mmseg/utils/set_env.py | 40 + mmsegmentation/mmseg/utils/tokenizer.py | 240 ++ mmsegmentation/mmseg/utils/typing_utils.py | 25 + mmsegmentation/mmseg/version.py | 18 + .../mmseg/visualization/__init__.py | 4 + .../mmseg/visualization/local_visualizer.py | 349 +++ mmsegmentation/model-index.yml | 53 + mmsegmentation/nohup.out | 2216 ++++++++++++++ mmsegmentation/projects/Adabins/README.md | 46 + .../projects/Adabins/backbones/__init__.py | 4 + .../Adabins/backbones/adabins_backbone.py | 141 + .../Adabins/configs/_base_/datasets/nyu.py | 32 + .../Adabins/configs/_base_/default_runtime.py | 15 + .../Adabins/configs/_base_/models/Adabins.py | 35 + ...abins_efficient_b5_4x16_25e_NYU_416x544.py | 15 + ...ins_efficient_b5_4x16_25e_kitti_352x704.py | 12 + .../projects/Adabins/decode_head/__init__.py | 4 + .../Adabins/decode_head/adabins_head.py | 179 ++ mmsegmentation/projects/CAT-Seg/README.md | 92 + .../projects/CAT-Seg/cat_seg/__init__.py | 2 + .../CAT-Seg/cat_seg/models/__init__.py | 10 + .../CAT-Seg/cat_seg/models/cat_aggregator.py | 763 +++++ .../CAT-Seg/cat_seg/models/cat_head.py | 116 + .../CAT-Seg/cat_seg/models/clip_ovseg.py | 293 ++ .../CAT-Seg/cat_seg/utils/__init__.py | 10 + .../bpe_vocab/bpe_simple_vocab_16e6.txt.gz | Bin 0 -> 1356917 bytes .../CAT-Seg/cat_seg/utils/clip_model.py | 651 +++++ .../CAT-Seg/cat_seg/utils/clip_templates.py | 204 ++ .../CAT-Seg/cat_seg/utils/clip_wrapper.py | 275 ++ .../cat_seg/utils/self_attention_block.py | 79 + .../CAT-Seg/cat_seg/utils/tokenizer.py | 160 ++ .../configs/_base_/datasets/ade20k_384x384.py | 68 + .../_base_/datasets/coco-stuff164k_384x384.py | 62 + .../datasets/pascal_context_59_384x384.py | 72 + .../CAT-Seg/configs/_base_/default_runtime.py | 15 + .../configs/_base_/schedules/schedule_80k.py | 24 + ...-warmcoslr2e-4-adamw-80k_ade20k-384x384.py | 103 + ...e-4-adamw-80k_pascal-context-59-384x384.py | 103 + ...lr2e-4-adamw-80k_coco-stuff164k-384x384.py | 102 + ...lr2e-4_adamw-80k_coco-stuff164k_384x384.py | 11 + ...lr2e-4_adamw-80k_coco-stuff164k_384x384.py | 11 + ...lr2e-4_adamw-80k_coco-stuff164k_384x384.py | 72 + .../projects/CAT-Seg/utils/__init__.py | 7 + mmsegmentation/projects/README.md | 19 + mmsegmentation/projects/XDecoder/README.md | 17 + .../projects/bdd100k_dataset/README.md | 50 + .../configs/_base_/datasets/bdd100k.py | 70 + ...pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py | 11 + .../docs/en/user_guides/2_dataset_prepare.md | 40 + .../zh_cn/user_guides/2_dataset_prepare.md | 42 + .../bdd100k_dataset/mmseg/datasets/bdd100k.py | 31 + .../projects/example_project/README.md | 134 + ...mmy-r50-d8_4xb2-40k_cityscapes-512x1024.py | 8 + .../example_project/dummy/__init__.py | 3 + .../example_project/dummy/dummy_resnet.py | 14 + mmsegmentation/projects/faq.md | 19 + .../configs/_base_/datasets/gid.py | 67 + ...labv3plus_r101-d8_4xb2-240k_gid-256x256.py | 15 + .../gid_dataset/mmseg/datasets/gid.py | 55 + .../tools/dataset_converters/gid.py | 181 ++ .../gid_select15imgFromAll.py | 75 + .../user_guides/2_dataset_prepare.md | 53 + .../projects/hsidrive20_dataset/README.md | 34 + .../configs/_base_/datasets/hsi_drive.py | 50 + ...t-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py | 58 + .../docs/en/user_guides/2_dataset_prepare.md | 42 + .../zh_cn/user_guides/2_dataset_prepare.md | 42 + .../mmseg/datasets/hsi_drive.py | 23 + mmsegmentation/projects/hssn/README.md | 91 + .../configs/_base_/datasets/cityscapes.py | 67 + .../hssn/configs/_base_/default_runtime.py | 15 + .../deeplabv3plus_r50-d8_vd_contrast.py | 55 + .../configs/_base_/schedules/schedule_80k.py | 24 + ...us_r101-d8_4xb2-80l_cityscapes-512x1024.py | 21 + .../projects/hssn/decode_head/__init__.py | 4 + .../decode_head/sep_aspp_contrast_head.py | 193 ++ .../projects/hssn/losses/__init__.py | 4 + .../losses/hiera_triplet_loss_cityscape.py | 218 ++ .../projects/hssn/losses/tree_triplet_loss.py | 86 + mmsegmentation/projects/isnet/README.md | 117 + ...et_r50-d8_8xb2-160k_cityscapes-512x1024.py | 80 + .../projects/isnet/decode_heads/__init__.py | 3 + .../projects/isnet/decode_heads/isnet_head.py | 337 +++ .../projects/mapillary_dataset/README.md | 86 + .../configs/_base_/datasets/mapillary_v1.py | 68 + .../_base_/datasets/mapillary_v1_65.py | 37 + .../configs/_base_/datasets/mapillary_v2.py | 68 + ..._r101-d8_4xb2-240k_mapillay_v1-512x1024.py | 17 + ..._r101-d8_4xb2-240k_mapillay_v2-512x1024.py | 16 + ..._r101-d8_4xb2-240k_mapillay_v1-512x1024.py | 16 + ..._r101-d8_4xb2-240k_mapillay_v2-512x1024.py | 16 + .../docs/en/user_guides/2_dataset_prepare.md | 255 ++ .../mmseg/datasets/mapillary.py | 177 ++ .../medical/2d_image/ct/cranium/README.md | 142 + .../ct/cranium/configs/cranium_512x512.py | 42 + ...sigmoid}_1xb16-0.01-20k_cranium-512x512.py | 18 + ...6_unet_1xb16-0.0001-20k_cranium-512x512.py | 17 + ...16_unet_1xb16-0.001-20k_cranium-512x512.py | 17 + ...d16_unet_1xb16-0.01-20k_cranium-512x512.py | 17 + .../ct/cranium/datasets/cranium_dataset.py | 31 + .../ct/cranium/tools/prepare_dataset.py | 66 + .../dermoscopy/isic2016_task1/README.md | 149 + ...1xb16-0.0001-20k_isic2016-task1-512x512.py | 17 + ..._1xb16-0.001-20k_isic2016-task1-512x512.py | 17 + ...t_1xb16-0.01-20k_isic2016-task1-512x512.py | 17 + .../configs/isic2016-task1_512x512.py | 42 + .../datasets/isic2016-task1_dataset.py | 30 + .../isic2016_task1/tools/prepare_dataset.py | 120 + .../dermoscopy/isic2017_task1/README.md | 158 + ...1xb16-0.0001-20k_isic2017-task1-512x512.py | 17 + ..._1xb16-0.001-20k_isic2017-task1-512x512.py | 17 + ...t_1xb16-0.01-20k_isic2017-task1-512x512.py | 17 + .../configs/isic2017-task1_512x512.py | 41 + .../datasets/isic2017-task1_dataset.py | 30 + .../isic2017_task1/tools/prepare_dataset.py | 127 + .../2d_image/endoscopy/kvasir_seg/README.md | 145 + ...moid}_1xb16-0.01-20k_kvasir-seg-512x512.py | 18 + ...net_1xb16-0.0001-20k_kvasir-seg-512x512.py | 17 + ...unet_1xb16-0.001-20k_kvasir-seg-512x512.py | 17 + ..._unet_1xb16-0.01-20k_kvasir-seg-512x512.py | 17 + .../kvasir_seg/configs/kvasir-seg_512x512.py | 42 + .../kvasir_seg/datasets/kvasir-seg_dataset.py | 30 + .../kvasir_seg/tools/prepare_dataset.py | 87 + .../endoscopy/kvasir_seg_aliyun/README.md | 145 + ...16-0.0001-20k_kvasir-seg-aliyun-512x512.py | 17 + ...b16-0.001-20k_kvasir-seg-aliyun-512x512.py | 17 + ...xb16-0.01-20k_kvasir-seg-aliyun-512x512.py | 17 + ...r-sigmoid-20k_kvasir-seg-aliyun-512x512.py | 18 + .../configs/kvasir-seg-aliyun_512x512.py | 42 + .../datasets/kvasir-seg-aliyun_dataset.py | 30 + .../tools/prepare_dataset.py | 86 + .../fluorescein_angriogram/vampire/README.md | 158 + ...6_unet_1xb16-0.0001-20k_vampire-512x512.py | 19 + ...16_unet_1xb16-0.001-20k_vampire-512x512.py | 19 + ...d16_unet_1xb16-0.01-20k_vampire-512x512.py | 22 + .../vampire/configs/vampire_512x512.py | 42 + .../vampire/datasets/__init__.py | 3 + .../vampire/datasets/vampire_dataset.py | 28 + .../vampire/tools/prepare_dataset.py | 44 + .../fundus_photography/dr_hagis/README.md | 155 + .../dr_hagis/configs/dr-hagis_512x512.py | 42 + ..._unet_1xb16-0.0001-20k_dr-hagis-512x512.py | 17 + ...6_unet_1xb16-0.001-20k_dr-hagis-512x512.py | 17 + ...16_unet_1xb16-0.01-20k_dr-hagis-512x512.py | 17 + .../dr_hagis/datasets/dr-hagis_dataset.py | 27 + .../dr_hagis/tools/prepare_dataset.py | 41 + .../fundus_photography/gamma3/README.md | 167 ++ ...16_unet_1xb16-0.0001-20k_gamma3-512x512.py | 17 + ...d16_unet_1xb16-0.001-20k_gamma3-512x512.py | 17 + ...-d16_unet_1xb16-0.01-20k_gamma3-512x512.py | 17 + .../gamma3/configs/gamma3_512x512.py | 42 + .../gamma3/datasets/gamma3_dataset.py | 30 + .../gamma3/tools/prepare_dataset.py | 107 + .../fundus_photography/orvs/README.md | 140 + ...-d16_unet_1xb16-0.0001-20k_orvs-512x512.py | 17 + ...5-d16_unet_1xb16-0.001-20k_orvs-512x512.py | 17 + ...s5-d16_unet_1xb16-0.01-20k_orvs-512x512.py | 17 + .../orvs/configs/orvs_512x512.py | 42 + .../orvs/datasets/orvs_dataset.py | 27 + .../orvs/tools/prepare_dataset.py | 55 + .../fundus_photography/rite/README.md | 135 + ...-d16_unet_1xb16-0.0001-20k_rite-512x512.py | 17 + ...5-d16_unet_1xb16-0.001-20k_rite-512x512.py | 17 + ...s5-d16_unet_1xb16-0.01-20k_rite-512x512.py | 17 + ...t_1xb16-0.01lr-sigmoid-20k_rite-512x512.py | 18 + .../rite/configs/rite_512x512.py | 42 + .../rite/datasets/rite_dataset.py | 31 + .../rite/tools/prepare_dataset.py | 98 + .../breastCancerCellSegmentation/README.md | 123 + .../breastCancerCellSegmentation_512x512.py | 42 + ...0k_breastCancerCellSegmentation-512x512.py | 18 + ...0k_breastCancerCellSegmentation-512x512.py | 18 + ...0k_breastCancerCellSegmentation-512x512.py | 18 + .../breastCancerCellSegmentation_dataset.py | 30 + .../tools/prepare_dataset.py | 36 + .../breast_cancer_cell_seg/README.md | 147 + .../configs/breast-cancer-cell-seg_512x512.py | 42 + ...0001-20k_breast-cancer-cell-seg-512x512.py | 18 + ....001-20k_breast-cancer-cell-seg-512x512.py | 18 + ...0.01-20k_breast-cancer-cell-seg-512x512.py | 18 + .../breast-cancer-cell-seg_dataset.py | 29 + .../tools/prepare_dataset.py | 47 + .../histopathology/conic2022_seg/README.md | 207 ++ .../configs/conic2022-seg_512x512.py | 42 + ...unet_1xb16-0.0001-20k_conic2022-512x512.py | 17 + ..._unet_1xb16-0.001-20k_conic2022-512x512.py | 17 + ...6_unet_1xb16-0.01-20k_conic2022-512x512.py | 17 + .../datasets/conic2022-seg_dataset.py | 29 + .../conic2022_seg/tools/prepare_dataset.py | 65 + .../2d_image/histopathology/consep/README.md | 147 + .../consep/configs/consep_512x512.py | 42 + ...16_unet_1xb16-0.0001-20k_consep-512x512.py | 17 + ...d16_unet_1xb16-0.001-20k_consep-512x512.py | 17 + ...-d16_unet_1xb16-0.01-20k_consep-512x512.py | 17 + .../consep/datasets/consep_dataset.py | 30 + .../consep/tools/prepare_dataset.py | 54 + .../histopathology/fusc2021/README.md | 136 + ..._unet_1xb16-0.0001-20k_fusc2021-512x512.py | 17 + ...6_unet_1xb16-0.001-20k_fusc2021-512x512.py | 17 + ...16_unet_1xb16-0.01-20k_fusc2021-512x512.py | 17 + ...b16-0.01lr-sigmoid-20k_fusc2021-512x512.py | 18 + .../fusc2021/configs/fusc2021_512x512.py | 42 + .../fusc2021/datasets/fusc2021_dataset.py | 30 + .../fusc2021/tools/prepare_dataset.py | 114 + .../2d_image/histopathology/pannuke/README.md | 146 + ...16-0.01-20k_bactteria-detection-512x512.py | 18 + ...6_unet_1xb16-0.0001-20k_pannuke-512x512.py | 17 + ...16_unet_1xb16-0.001-20k_pannuke-512x512.py | 17 + ...d16_unet_1xb16-0.01-20k_pannuke-512x512.py | 17 + .../pannuke/configs/pannuke_512x512.py | 42 + .../pannuke/datasets/pannuke_dataset.py | 33 + .../pannuke/tools/prepare_dataset.py | 49 + .../2d_image/histopathology/pcam/README.md | 153 + ...-d16_unet_1xb16-0.0001-20k_pcam-512x512.py | 17 + ...5-d16_unet_1xb16-0.001-20k_pcam-512x512.py | 17 + ...s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py | 17 + ...t_1xb16-0.01lr-sigmoid-20k_pcam-512x512.py | 18 + .../pcam/configs/pcam_512x512.py | 42 + .../pcam/datasets/pcam_dataset.py | 31 + .../pcam/tools/prepare_dataset.py | 49 + .../ravir/README.md | 167 ++ ...d16_unet_1xb16-0.0001-20k_ravir-512x512.py | 19 + ...-d16_unet_1xb16-0.001-20k_ravir-512x512.py | 19 + ...5-d16_unet_1xb16-0.01-20k_ravir-512x512.py | 19 + .../ravir/configs/ravir_512x512.py | 42 + .../ravir/datasets/__init__.py | 3 + .../ravir/datasets/ravir_dataset.py | 28 + .../ravir/tools/prepare_dataset.py | 33 + .../microscopy_images/2pm_vessel/README.md | 153 + .../2pm_vessel/configs/2pm-vessel_512x512.py | 42 + ...net_1xb16-0.0001-20k_2pm-vessel-512x512.py | 17 + ...unet_1xb16-0.001-20k_2pm-vessel-512x512.py | 17 + ..._unet_1xb16-0.01-20k_2pm-vessel-512x512.py | 17 + ...sigmoid-20k_bactteria-detection-512x512.py | 18 + .../2pm_vessel/datasets/2pm-vessel_dataset.py | 31 + .../2pm_vessel/tools/prepare_dataset.py | 46 + .../bactteria_detection/README.md | 160 ++ .../configs/bactteria-detection_512x512.py | 42 + ...-0.0001-20k_bactteria-detection-512x512.py | 18 + ...6-0.001-20k_bactteria-detection-512x512.py | 18 + ...16-0.01-20k_bactteria-detection-512x512.py | 18 + .../datasets/bactteria-detection_dataset.py | 27 + .../tools/prepare_dataset.py | 33 + .../2d_image/tools/split_seg_dataset.py | 42 + .../x_ray/chest_image_pneum/README.md | 147 + .../configs/chest-image-pneum_512x512.py | 42 + ...16-0.0001-20k_chest-image-pneum-512x512.py | 18 + ...b16-0.001-20k_chest-image-pneum-512x512.py | 18 + ...xb16-0.01-20k_chest-image-pneum-512x512.py | 18 + .../datasets/chest-image-pneum_dataset.py | 27 + .../tools/prepare_dataset.py | 73 + .../README.md | 119 + ...-images-with-pneumothorax-masks_512x512.py | 42 + ...-images-with-pneumothorax-masks-512x512.py | 20 + ...-images-with-pneumothorax-masks-512x512.py | 19 + ...-images-with-pneumothorax-masks-512x512.py | 19 + ...-images-with-pneumothorax-masks-512x512.py | 19 + ...-images-with-pneumothorax-masks_dataset.py | 31 + .../tools/prepare_dataset.py | 36 + .../2d_image/x_ray/covid_19_ct_cxr/README.md | 158 + .../configs/covid-19-ct-cxr_512x512.py | 42 + ..._1xb16-0.01-20k_covid-19-ct-cxr-512x512.py | 18 + ...xb16-0.0001-20k_covid-19-ct-cxr-512x512.py | 17 + ...1xb16-0.001-20k_covid-19-ct-cxr-512x512.py | 17 + ..._1xb16-0.01-20k_covid-19-ct-cxr-512x512.py | 17 + .../datasets/covid-19-ct-cxr_dataset.py | 31 + .../covid_19_ct_cxr/tools/prepare_dataset.py | 52 + .../medical/2d_image/x_ray/crass/README.md | 144 + .../x_ray/crass/configs/crass_512x512.py | 42 + ...d16_unet_1xb16-0.0001-20k_crass-512x512.py | 17 + ...-d16_unet_1xb16-0.001-20k_crass-512x512.py | 17 + ...5-d16_unet_1xb16-0.01-20k_crass-512x512.py | 17 + ..._1xb16-lr0.01-sigmoid-20k_crass-512x512.py | 18 + .../x_ray/crass/datasets/crass_dataset.py | 30 + .../x_ray/crass/tools/prepare_dataset.py | 84 + .../projects/nvidia_jetson/README.md | 372 +++ .../projects/pp_mobileseg/README.md | 123 + .../pp_mobileseg/backbones/__init__.py | 4 + .../pp_mobileseg/backbones/strideformer.py | 958 +++++++ .../configs/_base_/datasets/ade20k.py | 68 + .../configs/_base_/default_runtime.py | 15 + .../configs/_base_/models/pp_mobile.py | 47 + .../configs/_base_/schedules/schedule_80k.py | 24 + ...obilenetv3_2x16_80k_ade20k_512x512_base.py | 18 + ...obilenetv3_2x16_80k_ade20k_512x512_tiny.py | 45 + .../pp_mobileseg/decode_head/__init__.py | 6 + .../decode_head/pp_mobileseg_head.py | 94 + .../projects/pp_mobileseg/inference_onnx.py | 203 ++ .../projects/sam_inference_demo/README.md | 40 + .../sam_inference_demo/sam/__init__.py | 2 + .../sam/modeling/__init__.py | 12 + .../sam_inference_demo/sam/modeling/common.py | 45 + .../sam/modeling/mask_decoder.py | 196 ++ .../sam/modeling/prompt_encoder.py | 227 ++ .../sam_inference_demo/sam/modeling/sam.py | 188 ++ .../sam/modeling/transformer.py | 241 ++ .../sam_inference_demo/sam/sam_inferencer.py | 688 +++++ .../sam_inference_demo/sam/utils/__init__.py | 2 + .../sam_inference_demo/sam/utils/amg.py | 355 +++ .../sam/utils/transforms.py | 110 + .../sam_inference_demo/sam_image_demo.ipynb | 122 + mmsegmentation/projects/van/README.md | 101 + .../projects/van/backbones/__init__.py | 4 + mmsegmentation/projects/van/backbones/van.py | 124 + .../van/configs/_base_/datasets/ade20k.py | 14 + .../van/configs/_base_/models/van_fpn.py | 43 + .../van/configs/_base_/models/van_upernet.py | 51 + .../van/van-b0_fpn_8xb4-40k_ade20k-512x512.py | 8 + .../van/van-b1_fpn_8xb4-40k_ade20k-512x512.py | 6 + .../van/van-b2_fpn_8xb4-40k_ade20k-512x512.py | 53 + ...van-b2_upernet_4xb2-160k_ade20k-512x512.py | 46 + .../van/van-b3_fpn_8xb4-40k_ade20k-512x512.py | 11 + ...van-b3_upernet_4xb2-160k_ade20k-512x512.py | 8 + ...22kpre_upernet_4xb4-160k_ade20k-512x512.py | 10 + ...van-b4_upernet_4xb4-160k_ade20k-512x512.py | 10 + ...22kpre_upernet_4xb2-160k_ade20k-512x512.py | 10 + ...22kpre_upernet_4xb2-160k_ade20k-512x512.py | 10 + ...net_r50-d8_4xb2-40k_cityscapes-512x1024.py | 292 ++ mmsegmentation/requirements.txt | 4 + mmsegmentation/requirements/albu.txt | 1 + mmsegmentation/requirements/docs.txt | 7 + mmsegmentation/requirements/mminstall.txt | 2 + mmsegmentation/requirements/multimodal.txt | 2 + mmsegmentation/requirements/optional.txt | 22 + mmsegmentation/requirements/readthedocs.txt | 6 + mmsegmentation/requirements/runtime.txt | 5 + mmsegmentation/requirements/tests.txt | 8 + mmsegmentation/resources/seg_demo.gif | Bin 0 -> 951973 bytes mmsegmentation/setup.cfg | 19 + mmsegmentation/setup.py | 200 ++ mmsegmentation/test.ipynb | 194 ++ mmsegmentation/tests/__init__.py | 1 + .../tests/test_apis/test_inferencer.py | 60 + .../tests/test_apis/test_rs_inferencer.py | 73 + mmsegmentation/tests/test_apis/utils.py | 38 + mmsegmentation/tests/test_config.py | 175 ++ .../tests/test_datasets/test_dataset.py | 475 +++ .../test_datasets/test_dataset_builder.py | 152 + .../tests/test_datasets/test_formatting.py | 61 + .../tests/test_datasets/test_loading.py | 295 ++ .../tests/test_datasets/test_transform.py | 1273 +++++++++ .../tests/test_datasets/test_tta.py | 131 + mmsegmentation/tests/test_digit_version.py | 21 + .../test_layer_decay_optimizer_constructor.py | 300 ++ .../tests/test_engine/test_optimizer.py | 33 + .../test_engine/test_visualization_hook.py | 64 + .../test_metrics/test_citys_metric.py | 119 + .../test_metrics/test_depth_metric.py | 85 + .../test_metrics/test_iou_metric.py | 104 + mmsegmentation/tests/test_models/__init__.py | 1 + .../test_assigners/test_hungarian_assigner.py | 77 + .../test_models/test_backbones/__init__.py | 1 + .../test_models/test_backbones/test_beit.py | 185 ++ .../test_backbones/test_bisenetv1.py | 109 + .../test_backbones/test_bisenetv2.py | 57 + .../test_models/test_backbones/test_blocks.py | 187 ++ .../test_models/test_backbones/test_cgnet.py | 151 + .../test_backbones/test_clip_text_encoder.py | 43 + .../test_models/test_backbones/test_erfnet.py | 146 + .../test_backbones/test_fast_scnn.py | 42 + .../test_models/test_backbones/test_hrnet.py | 144 + .../test_models/test_backbones/test_icnet.py | 50 + .../test_models/test_backbones/test_mae.py | 186 ++ .../test_models/test_backbones/test_mit.py | 122 + .../test_backbones/test_mobilenet_v3.py | 67 + .../test_models/test_backbones/test_mscan.py | 69 + .../test_models/test_backbones/test_pidnet.py | 87 + .../test_backbones/test_resnest.py | 44 + .../test_models/test_backbones/test_resnet.py | 575 ++++ .../test_backbones/test_resnext.py | 62 + .../test_models/test_backbones/test_stdc.py | 131 + .../test_models/test_backbones/test_swin.py | 100 + .../test_backbones/test_timm_backbone.py | 133 + .../test_models/test_backbones/test_twins.py | 171 ++ .../test_models/test_backbones/test_unet.py | 825 ++++++ .../test_models/test_backbones/test_vit.py | 185 ++ .../test_models/test_backbones/test_vpd.py | 51 + .../tests/test_models/test_backbones/utils.py | 43 + .../test_models/test_data_preprocessor.py | 64 + .../tests/test_models/test_forward.py | 229 ++ .../tests/test_models/test_heads/__init__.py | 1 + .../test_models/test_heads/test_ann_head.py | 20 + .../test_models/test_heads/test_apc_head.py | 59 + .../test_models/test_heads/test_aspp_head.py | 76 + .../test_models/test_heads/test_cc_head.py | 18 + .../test_heads/test_decode_head.py | 193 ++ .../test_models/test_heads/test_dm_head.py | 59 + .../test_models/test_heads/test_dnl_head.py | 44 + .../test_models/test_heads/test_dpt_head.py | 49 + .../test_models/test_heads/test_ema_head.py | 23 + .../test_models/test_heads/test_fcn_head.py | 131 + .../test_models/test_heads/test_gc_head.py | 16 + .../test_models/test_heads/test_ham_head.py | 44 + .../test_models/test_heads/test_isa_head.py | 20 + .../test_heads/test_lraspp_head.py | 68 + .../test_heads/test_mask2former_head.py | 153 + .../test_heads/test_maskformer_head.py | 54 + .../test_models/test_heads/test_nl_head.py | 16 + .../test_models/test_heads/test_ocr_head.py | 19 + .../test_heads/test_pidnet_head.py | 89 + .../test_models/test_heads/test_psa_head.py | 122 + .../test_models/test_heads/test_psp_head.py | 36 + .../test_models/test_heads/test_san_head.py | 126 + .../test_heads/test_segformer_head.py | 40 + .../test_heads/test_segmenter_mask_head.py | 24 + .../test_heads/test_setr_mla_head.py | 63 + .../test_heads/test_setr_up_head.py | 56 + .../test_models/test_heads/test_uper_head.py | 35 + .../test_heads/test_vpd_depth_head.py | 50 + .../tests/test_models/test_heads/utils.py | 31 + .../test_losses/test_cross_entropy_loss.py | 28 + .../test_models/test_losses/test_dice_loss.py | 96 + .../test_huasdorff_distance_loss.py | 29 + .../test_losses/test_kldiv_loss.py | 40 + .../test_losses/test_silog_loss.py | 20 + .../test_losses/test_tversky_loss.py | 77 + .../tests/test_models/test_necks/__init__.py | 1 + .../test_necks/test_feature2pyramid.py | 38 + .../tests/test_models/test_necks/test_fpn.py | 30 + .../test_models/test_necks/test_ic_neck.py | 53 + .../tests/test_models/test_necks/test_jpu.py | 46 + .../test_models/test_necks/test_mla_neck.py | 16 + .../test_necks/test_multilevel_neck.py | 32 + .../test_models/test_segmentors/__init__.py | 1 + .../test_cascade_encoder_decoder.py | 57 + .../test_segmentors/test_depth_estimator.py | 64 + .../test_segmentors/test_encoder_decoder.py | 100 + .../test_multimodal_encoder_decoder.py | 24 + .../test_segmentors/test_seg_tta_model.py | 63 + .../test_models/test_segmentors/utils.py | 182 ++ .../tests/test_models/test_utils/__init__.py | 1 + .../test_models/test_utils/test_embed.py | 461 +++ .../test_utils/test_shape_convert.py | 89 + mmsegmentation/tests/test_sampler.py | 78 + .../test_structures/test_seg_data_sample.py | 77 + mmsegmentation/tests/test_utils/test_io.py | 33 + .../tests/test_utils/test_set_env.py | 39 + .../test_local_visualizer.py | 213 ++ .../tools/analysis_tools/analyze_logs.py | 130 + .../tools/analysis_tools/benchmark.py | 121 + .../tools/analysis_tools/browse_dataset.py | 77 + .../tools/analysis_tools/confusion_matrix.py | 197 ++ .../tools/analysis_tools/get_flops.py | 124 + .../tools/analysis_tools/visualization_cam.py | 127 + .../tools/dataset_converters/chase_db1.py | 89 + .../tools/dataset_converters/cityscapes.py | 56 + .../tools/dataset_converters/coco_stuff10k.py | 308 ++ .../dataset_converters/coco_stuff164k.py | 265 ++ .../tools/dataset_converters/drive.py | 114 + .../tools/dataset_converters/hrf.py | 112 + .../tools/dataset_converters/isaid.py | 246 ++ .../tools/dataset_converters/levircd.py | 99 + .../tools/dataset_converters/loveda.py | 73 + .../tools/dataset_converters/nyu.py | 89 + .../dataset_converters/pascal_context.py | 87 + .../tools/dataset_converters/potsdam.py | 158 + .../tools/dataset_converters/refuge.py | 110 + .../tools/dataset_converters/stare.py | 167 ++ .../tools/dataset_converters/synapse.py | 155 + .../tools/dataset_converters/vaihingen.py | 156 + .../tools/dataset_converters/voc_aug.py | 92 + .../tools/deployment/pytorch2torchscript.py | 185 ++ mmsegmentation/tools/dist_test.sh | 20 + mmsegmentation/tools/dist_train.sh | 17 + mmsegmentation/tools/misc/browse_dataset.py | 73 + mmsegmentation/tools/misc/print_config.py | 69 + mmsegmentation/tools/misc/publish_model.py | 50 + .../tools/model_converters/beit2mmseg.py | 56 + .../tools/model_converters/clip2mmseg.py | 163 ++ .../tools/model_converters/mit2mmseg.py | 82 + .../tools/model_converters/san2mmseg.py | 220 ++ .../tools/model_converters/stdc2mmseg.py | 71 + .../tools/model_converters/swin2mmseg.py | 87 + .../tools/model_converters/twins2mmseg.py | 87 + .../tools/model_converters/vit2mmseg.py | 70 + .../tools/model_converters/vitjax2mmseg.py | 123 + mmsegmentation/tools/slurm_test.sh | 24 + mmsegmentation/tools/slurm_train.sh | 23 + mmsegmentation/tools/test.py | 123 + .../tools/torchserve/mmseg2torchserve.py | 112 + .../tools/torchserve/mmseg_handler.py | 56 + .../tools/torchserve/test_torchserve.py | 58 + mmsegmentation/tools/train.py | 104 + utils/ufo_to_cityscapes.py | 168 ++ 1696 files changed, 129968 insertions(+) create mode 100644 mmsegmentation/.circleci/config.yml create mode 100644 mmsegmentation/.circleci/docker/Dockerfile create mode 100644 mmsegmentation/.circleci/test.yml create mode 100644 mmsegmentation/.dev_scripts/batch_test_list.py create mode 100644 mmsegmentation/.dev_scripts/batch_train_list.txt create mode 100755 mmsegmentation/.dev_scripts/benchmark_evaluation.sh create mode 100644 mmsegmentation/.dev_scripts/benchmark_full_models.txt create mode 100644 mmsegmentation/.dev_scripts/benchmark_inference.py create mode 100644 mmsegmentation/.dev_scripts/benchmark_options.py create mode 100755 mmsegmentation/.dev_scripts/benchmark_train.sh create mode 100644 mmsegmentation/.dev_scripts/benchmark_train_models.txt create mode 100644 mmsegmentation/.dev_scripts/check_urls.py create mode 100644 mmsegmentation/.dev_scripts/gather_benchmark_evaluation_results.py create mode 100644 mmsegmentation/.dev_scripts/gather_benchmark_train_results.py create mode 100644 mmsegmentation/.dev_scripts/gather_models.py create mode 100644 mmsegmentation/.dev_scripts/generate_benchmark_evaluation_script.py create mode 100644 mmsegmentation/.dev_scripts/generate_benchmark_train_script.py create mode 100644 mmsegmentation/.dev_scripts/log_collector/example_config.py create mode 100644 mmsegmentation/.dev_scripts/log_collector/log_collector.py create mode 100644 mmsegmentation/.dev_scripts/log_collector/readme.md create mode 100644 mmsegmentation/.dev_scripts/log_collector/utils.py create mode 100755 mmsegmentation/.dev_scripts/update_model_index.py create mode 100644 mmsegmentation/.dev_scripts/upload_modelzoo.py create mode 100644 mmsegmentation/.github/CODE_OF_CONDUCT.md create mode 100644 mmsegmentation/.github/CONTRIBUTING.md create mode 100644 mmsegmentation/.github/ISSUE_TEMPLATE/config.yml create mode 100644 mmsegmentation/.github/ISSUE_TEMPLATE/error-report.md create mode 100644 mmsegmentation/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 mmsegmentation/.github/ISSUE_TEMPLATE/general_questions.md create mode 100644 mmsegmentation/.github/ISSUE_TEMPLATE/reimplementation_questions.md create mode 100644 mmsegmentation/.github/pull_request_template.md create mode 100644 mmsegmentation/.github/workflows/deploy.yml create mode 100644 mmsegmentation/.gitignore create mode 100644 mmsegmentation/.owners.yml create mode 100644 mmsegmentation/.pre-commit-config.yaml create mode 100644 mmsegmentation/CITATION.cff create mode 100644 mmsegmentation/LICENSE create mode 100644 mmsegmentation/MANIFEST.in create mode 100644 mmsegmentation/README.md create mode 100644 mmsegmentation/README_zh-CN.md create mode 100644 mmsegmentation/configs/_base_/datasets/ade20k.py create mode 100644 mmsegmentation/configs/_base_/datasets/ade20k_640x640.py create mode 100644 mmsegmentation/configs/_base_/datasets/bdd100k.py create mode 100644 mmsegmentation/configs/_base_/datasets/chase_db1.py create mode 100644 mmsegmentation/configs/_base_/datasets/cityscapes.py create mode 100644 mmsegmentation/configs/_base_/datasets/cityscapes_1024x1024.py create mode 100644 mmsegmentation/configs/_base_/datasets/cityscapes_768x768.py create mode 100644 mmsegmentation/configs/_base_/datasets/cityscapes_769x769.py create mode 100644 mmsegmentation/configs/_base_/datasets/cityscapes_832x832.py create mode 100644 mmsegmentation/configs/_base_/datasets/coco-stuff10k.py create mode 100644 mmsegmentation/configs/_base_/datasets/coco-stuff164k.py create mode 100644 mmsegmentation/configs/_base_/datasets/drive.py create mode 100644 mmsegmentation/configs/_base_/datasets/hrf.py create mode 100644 mmsegmentation/configs/_base_/datasets/hsi_drive.py create mode 100644 mmsegmentation/configs/_base_/datasets/isaid.py create mode 100644 mmsegmentation/configs/_base_/datasets/levir_256x256.py create mode 100644 mmsegmentation/configs/_base_/datasets/loveda.py create mode 100644 mmsegmentation/configs/_base_/datasets/mapillary_v1.py create mode 100644 mmsegmentation/configs/_base_/datasets/mapillary_v1_65.py create mode 100644 mmsegmentation/configs/_base_/datasets/mapillary_v2.py create mode 100644 mmsegmentation/configs/_base_/datasets/nyu.py create mode 100644 mmsegmentation/configs/_base_/datasets/nyu_512x512.py create mode 100644 mmsegmentation/configs/_base_/datasets/pascal_context.py create mode 100644 mmsegmentation/configs/_base_/datasets/pascal_context_59.py create mode 100644 mmsegmentation/configs/_base_/datasets/pascal_voc12.py create mode 100644 mmsegmentation/configs/_base_/datasets/pascal_voc12_aug.py create mode 100644 mmsegmentation/configs/_base_/datasets/potsdam.py create mode 100644 mmsegmentation/configs/_base_/datasets/refuge.py create mode 100644 mmsegmentation/configs/_base_/datasets/stare.py create mode 100644 mmsegmentation/configs/_base_/datasets/synapse.py create mode 100644 mmsegmentation/configs/_base_/datasets/vaihingen.py create mode 100644 mmsegmentation/configs/_base_/default_runtime.py create mode 100644 mmsegmentation/configs/_base_/models/ann_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/apcnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/bisenetv1_r18-d32.py create mode 100644 mmsegmentation/configs/_base_/models/bisenetv2.py create mode 100644 mmsegmentation/configs/_base_/models/ccnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/cgnet.py create mode 100644 mmsegmentation/configs/_base_/models/danet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/deeplabv3_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/deeplabv3_unet_s5-d16.py create mode 100644 mmsegmentation/configs/_base_/models/deeplabv3plus_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/dmnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/dnl_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/dpt_vit-b16.py create mode 100644 mmsegmentation/configs/_base_/models/emanet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/encnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/erfnet_fcn.py create mode 100644 mmsegmentation/configs/_base_/models/fast_scnn.py create mode 100644 mmsegmentation/configs/_base_/models/fastfcn_r50-d32_jpu_psp.py create mode 100644 mmsegmentation/configs/_base_/models/fcn_hr18.py create mode 100644 mmsegmentation/configs/_base_/models/fcn_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/fcn_unet_s5-d16.py create mode 100644 mmsegmentation/configs/_base_/models/fpn_poolformer_s12.py create mode 100644 mmsegmentation/configs/_base_/models/fpn_r50.py create mode 100644 mmsegmentation/configs/_base_/models/gcnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/icnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/isanet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/lraspp_m-v3-d8.py create mode 100644 mmsegmentation/configs/_base_/models/nonlocal_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/ocrnet_hr18.py create mode 100644 mmsegmentation/configs/_base_/models/ocrnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/pointrend_r50.py create mode 100644 mmsegmentation/configs/_base_/models/psanet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/pspnet_r50-d8.py create mode 100644 mmsegmentation/configs/_base_/models/pspnet_unet_s5-d16.py create mode 100644 mmsegmentation/configs/_base_/models/san_vit-b16.py create mode 100644 mmsegmentation/configs/_base_/models/segformer_mit-b0.py create mode 100644 mmsegmentation/configs/_base_/models/segmenter_vit-b16_mask.py create mode 100644 mmsegmentation/configs/_base_/models/setr_mla.py create mode 100644 mmsegmentation/configs/_base_/models/setr_naive.py create mode 100644 mmsegmentation/configs/_base_/models/setr_pup.py create mode 100644 mmsegmentation/configs/_base_/models/stdc.py create mode 100644 mmsegmentation/configs/_base_/models/twins_pcpvt-s_fpn.py create mode 100644 mmsegmentation/configs/_base_/models/twins_pcpvt-s_upernet.py create mode 100644 mmsegmentation/configs/_base_/models/upernet_beit.py create mode 100644 mmsegmentation/configs/_base_/models/upernet_convnext.py create mode 100644 mmsegmentation/configs/_base_/models/upernet_mae.py create mode 100644 mmsegmentation/configs/_base_/models/upernet_r50.py create mode 100644 mmsegmentation/configs/_base_/models/upernet_swin.py create mode 100644 mmsegmentation/configs/_base_/models/upernet_vit-b16_ln_mln.py create mode 100644 mmsegmentation/configs/_base_/models/vpd_sd.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_160k.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_20k.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_240k.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_25k.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_320k.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_40k.py create mode 100644 mmsegmentation/configs/_base_/schedules/schedule_80k.py create mode 100644 mmsegmentation/configs/ann/README.md create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ann/metafile.yaml create mode 100644 mmsegmentation/configs/apcnet/README.md create mode 100644 mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/apcnet/metafile.yaml create mode 100644 mmsegmentation/configs/beit/README.md create mode 100644 mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640_ms.py create mode 100644 mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640_ms.py create mode 100644 mmsegmentation/configs/beit/metafile.yaml create mode 100644 mmsegmentation/configs/bisenetv1/README.md create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/bisenetv1/metafile.yaml create mode 100644 mmsegmentation/configs/bisenetv2/README.md create mode 100644 mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/bisenetv2/metafile.yaml create mode 100644 mmsegmentation/configs/ccnet/README.md create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ccnet/metafile.yaml create mode 100644 mmsegmentation/configs/cgnet/README.md create mode 100644 mmsegmentation/configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py create mode 100644 mmsegmentation/configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/cgnet/metafile.yaml create mode 100644 mmsegmentation/configs/convnext/README.md create mode 100644 mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/convnext/convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/convnext/convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/convnext/convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/convnext/metafile.yaml create mode 100644 mmsegmentation/configs/danet/README.md create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/danet/danet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/danet/metafile.yaml create mode 100644 mmsegmentation/configs/ddrnet/README.md create mode 100644 mmsegmentation/configs/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/ddrnet/metafile.yaml create mode 100644 mmsegmentation/configs/deeplabv3/README.md create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3/metafile.yaml create mode 100644 mmsegmentation/configs/deeplabv3plus/README.md create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/deeplabv3plus/metafile.yaml create mode 100644 mmsegmentation/configs/dmnet/README.md create mode 100644 mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dmnet/metafile.yaml create mode 100644 mmsegmentation/configs/dnlnet/README.md create mode 100644 mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dnlnet/metafile.yaml create mode 100644 mmsegmentation/configs/dpt/README.md create mode 100644 mmsegmentation/configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/dpt/metafile.yaml create mode 100644 mmsegmentation/configs/dsdl/README.md create mode 100644 mmsegmentation/configs/dsdl/cityscapes.py create mode 100644 mmsegmentation/configs/dsdl/voc.py create mode 100644 mmsegmentation/configs/emanet/README.md create mode 100644 mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/emanet/metafile.yaml create mode 100644 mmsegmentation/configs/encnet/README.md create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/encnet/encnet_r50s-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/encnet/metafile.yaml create mode 100644 mmsegmentation/configs/erfnet/README.md create mode 100644 mmsegmentation/configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/erfnet/metafile.yaml create mode 100644 mmsegmentation/configs/fastfcn/README.md create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastfcn/metafile.yaml create mode 100644 mmsegmentation/configs/fastscnn/README.md create mode 100644 mmsegmentation/configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fastscnn/metafile.yaml create mode 100644 mmsegmentation/configs/fcn/README.md create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/fcn/metafile.yaml create mode 100644 mmsegmentation/configs/gcnet/README.md create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/gcnet/metafile.yaml create mode 100644 mmsegmentation/configs/hrnet/README.md create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/hrnet/metafile.yaml create mode 100644 mmsegmentation/configs/icnet/README.md create mode 100644 mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-160k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-80k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-160k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-80k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-160k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py create mode 100644 mmsegmentation/configs/icnet/metafile.yaml create mode 100644 mmsegmentation/configs/isanet/README.md create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/isanet/metafile.yaml create mode 100644 mmsegmentation/configs/knet/README.md create mode 100644 mmsegmentation/configs/knet/knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/knet/knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/knet/knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/knet/metafile.yaml create mode 100644 mmsegmentation/configs/mae/README.md create mode 100644 mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512-ms.py create mode 100644 mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mae/metafile.yaml create mode 100644 mmsegmentation/configs/mask2former/README.md create mode 100644 mmsegmentation/configs/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mask2former/metafile.yaml create mode 100644 mmsegmentation/configs/maskformer/README.md create mode 100644 mmsegmentation/configs/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/maskformer/metafile.yaml create mode 100644 mmsegmentation/configs/mobilenet_v2/README.md create mode 100644 mmsegmentation/configs/mobilenet_v2/metafile.yaml create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/mobilenet_v3/README.md create mode 100644 mmsegmentation/configs/mobilenet_v3/metafile.yaml create mode 100644 mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/nonlocal_net/README.md create mode 100644 mmsegmentation/configs/nonlocal_net/metafile.yaml create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/README.md create mode 100644 mmsegmentation/configs/ocrnet/metafile.yaml create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pidnet/README.md create mode 100644 mmsegmentation/configs/pidnet/metafile.yaml create mode 100644 mmsegmentation/configs/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py create mode 100644 mmsegmentation/configs/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py create mode 100644 mmsegmentation/configs/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes.py create mode 100644 mmsegmentation/configs/point_rend/README.md create mode 100644 mmsegmentation/configs/point_rend/metafile.yaml create mode 100644 mmsegmentation/configs/point_rend/pointrend_r101_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/point_rend/pointrend_r101_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/point_rend/pointrend_r50_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/poolformer/README.md create mode 100644 mmsegmentation/configs/poolformer/fpn_poolformer_m36_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/poolformer/fpn_poolformer_s24_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k.py create mode 100644 mmsegmentation/configs/poolformer/metafile.yaml create mode 100644 mmsegmentation/configs/psanet/README.md create mode 100644 mmsegmentation/configs/psanet/metafile.yaml create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/README.md create mode 100644 mmsegmentation/configs/pspnet/metafile.yaml create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d32_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_isaid-896x896.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-59-480x480.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_potsdam-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/resnest/README.md create mode 100644 mmsegmentation/configs/resnest/metafile.yaml create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py create mode 100644 mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/san/README.md create mode 100644 mmsegmentation/configs/san/metafile.yaml create mode 100644 mmsegmentation/configs/san/san-vit-b16_coco-stuff164k-640x640.py create mode 100644 mmsegmentation/configs/san/san-vit-b16_pascal_context-640x640.py create mode 100644 mmsegmentation/configs/san/san-vit-b16_voc12aug-640x640.py create mode 100644 mmsegmentation/configs/san/san-vit-l14_coco-stuff164k-640x640.py create mode 100644 mmsegmentation/configs/san/san-vit-l14_pascal_context-640x640.py create mode 100644 mmsegmentation/configs/san/san-vit-l14_voc12aug-640x640.py create mode 100644 mmsegmentation/configs/segformer/README.md create mode 100644 mmsegmentation/configs/segformer/metafile.yaml create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b0_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b1_8xb1-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b1_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b2_8xb1-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b2_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b3_8xb1-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b3_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b4_8xb1-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b4_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-640x640.py create mode 100644 mmsegmentation/configs/segmenter/README.md create mode 100644 mmsegmentation/configs/segmenter/metafile.yaml create mode 100644 mmsegmentation/configs/segmenter/segmenter_vit-b_mask_8xb1-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segmenter/segmenter_vit-l_mask_8xb1-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segmenter/segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segmenter/segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segnext/README.md create mode 100644 mmsegmentation/configs/segnext/metafile.yaml create mode 100644 mmsegmentation/configs/segnext/segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segnext/segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segnext/segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/sem_fpn/README.md create mode 100644 mmsegmentation/configs/sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/sem_fpn/fpn_r101_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/sem_fpn/fpn_r50_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/sem_fpn/fpn_r50_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/sem_fpn/metafile.yaml create mode 100644 mmsegmentation/configs/setr/README.md create mode 100644 mmsegmentation/configs/setr/metafile.yaml create mode 100644 mmsegmentation/configs/setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/setr/setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py create mode 100644 mmsegmentation/configs/setr/setr_vit-l_mla_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/setr/setr_vit-l_naive_8xb1-80k_cityscapes-768x768.py create mode 100644 mmsegmentation/configs/setr/setr_vit-l_naive_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/setr/setr_vit-l_pup_8xb1-80k_cityscapes-768x768.py create mode 100644 mmsegmentation/configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/stdc/README.md create mode 100644 mmsegmentation/configs/stdc/metafile.yaml create mode 100644 mmsegmentation/configs/stdc/stdc1_4xb12-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/stdc/stdc2_4xb12-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/stdc/stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/swin/README.md create mode 100644 mmsegmentation/configs/swin/metafile.yaml create mode 100644 mmsegmentation/configs/swin/swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-large-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-large-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/swin/swin-tiny-patch4-window7_upernet_1xb8-20k_levir-256x256.py create mode 100644 mmsegmentation/configs/twins/README.md create mode 100644 mmsegmentation/configs/twins/metafile.yaml create mode 100644 mmsegmentation/configs/twins/twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_svt-b_uperhead_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_svt-l_uperhead_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/twins/twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/unet/README.md create mode 100644 mmsegmentation/configs/unet/metafile.yaml create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_drive-64x64.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_stare-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py create mode 100644 mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py create mode 100644 mmsegmentation/configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py create mode 100644 mmsegmentation/configs/upernet/README.md create mode 100644 mmsegmentation/configs/upernet/metafile.yaml create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r101_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r18_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/upernet/upernet_r18_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/upernet/upernet_r18_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r18_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r18_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r18_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-512x1024.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-769x769.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb4-20k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb4-40k_voc12aug-512x512.py create mode 100644 mmsegmentation/configs/upernet/upernet_r50_4xb4-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/README.md create mode 100644 mmsegmentation/configs/vit/metafile.yaml create mode 100644 mmsegmentation/configs/vit/vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py create mode 100644 mmsegmentation/configs/vpd/README.md create mode 100644 mmsegmentation/configs/vpd/metafile.yaml create mode 100644 mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py create mode 100644 mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py create mode 100644 mmsegmentation/dataset-index.yml create mode 100644 mmsegmentation/demo/MMSegmentation_Tutorial.ipynb create mode 100644 mmsegmentation/demo/image_demo.py create mode 100644 mmsegmentation/demo/image_demo_with_inferencer.py create mode 100644 mmsegmentation/demo/inference_demo.ipynb create mode 100644 mmsegmentation/demo/rs_image_inference.py create mode 100644 mmsegmentation/demo/video_demo.py create mode 100644 mmsegmentation/docker/Dockerfile create mode 100644 mmsegmentation/docker/serve/Dockerfile create mode 100644 mmsegmentation/docker/serve/config.properties create mode 100644 mmsegmentation/docker/serve/entrypoint.sh create mode 100644 mmsegmentation/docs/en/.readthedocs.yaml create mode 100644 mmsegmentation/docs/en/Makefile create mode 100644 mmsegmentation/docs/en/_static/css/readthedocs.css create mode 100644 mmsegmentation/docs/en/advanced_guides/add_datasets.md create mode 100644 mmsegmentation/docs/en/advanced_guides/add_metrics.md create mode 100644 mmsegmentation/docs/en/advanced_guides/add_models.md create mode 100644 mmsegmentation/docs/en/advanced_guides/add_transforms.md create mode 100644 mmsegmentation/docs/en/advanced_guides/customize_runtime.md create mode 100644 mmsegmentation/docs/en/advanced_guides/data_flow.md create mode 100644 mmsegmentation/docs/en/advanced_guides/datasets.md create mode 100644 mmsegmentation/docs/en/advanced_guides/engine.md create mode 100644 mmsegmentation/docs/en/advanced_guides/evaluation.md create mode 100644 mmsegmentation/docs/en/advanced_guides/index.rst create mode 100644 mmsegmentation/docs/en/advanced_guides/models.md create mode 100644 mmsegmentation/docs/en/advanced_guides/structures.md create mode 100644 mmsegmentation/docs/en/advanced_guides/training_tricks.md create mode 100644 mmsegmentation/docs/en/advanced_guides/transforms.md create mode 100644 mmsegmentation/docs/en/api.rst create mode 100644 mmsegmentation/docs/en/conf.py create mode 100644 mmsegmentation/docs/en/device/npu.md create mode 100644 mmsegmentation/docs/en/get_started.md create mode 100644 mmsegmentation/docs/en/index.rst create mode 100644 mmsegmentation/docs/en/make.bat create mode 100644 mmsegmentation/docs/en/migration/index.rst create mode 100644 mmsegmentation/docs/en/migration/interface.md create mode 100644 mmsegmentation/docs/en/migration/package.md create mode 100644 mmsegmentation/docs/en/model_zoo.md create mode 100644 mmsegmentation/docs/en/modelzoo_statistics.md create mode 100644 mmsegmentation/docs/en/notes/changelog.md create mode 100644 mmsegmentation/docs/en/notes/changelog_v0.x.md create mode 100644 mmsegmentation/docs/en/notes/faq.md create mode 100644 mmsegmentation/docs/en/overview.md create mode 100755 mmsegmentation/docs/en/stat.py create mode 100644 mmsegmentation/docs/en/switch_language.md create mode 100644 mmsegmentation/docs/en/user_guides/1_config.md create mode 100644 mmsegmentation/docs/en/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/docs/en/user_guides/3_inference.md create mode 100644 mmsegmentation/docs/en/user_guides/4_train_test.md create mode 100644 mmsegmentation/docs/en/user_guides/5_deployment.md create mode 100644 mmsegmentation/docs/en/user_guides/index.rst create mode 100644 mmsegmentation/docs/en/user_guides/useful_tools.md create mode 100644 mmsegmentation/docs/en/user_guides/visualization.md create mode 100644 mmsegmentation/docs/en/user_guides/visualization_feature_map.md create mode 100644 mmsegmentation/docs/zh_cn/.readthedocs.yaml create mode 100644 mmsegmentation/docs/zh_cn/Makefile create mode 100644 mmsegmentation/docs/zh_cn/_static/css/readthedocs.css create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/add_datasets.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/add_metrics.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/add_models.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/add_transforms.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/contribute_dataset.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/customize_runtime.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/data_flow.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/datasets.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/engine.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/evaluation.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/index.rst create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/models.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/structures.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/training_tricks.md create mode 100644 mmsegmentation/docs/zh_cn/advanced_guides/transforms.md create mode 100644 mmsegmentation/docs/zh_cn/api.rst create mode 100644 mmsegmentation/docs/zh_cn/conf.py create mode 100644 mmsegmentation/docs/zh_cn/device/npu.md create mode 100644 mmsegmentation/docs/zh_cn/get_started.md create mode 100644 mmsegmentation/docs/zh_cn/index.rst create mode 100644 mmsegmentation/docs/zh_cn/make.bat create mode 100644 mmsegmentation/docs/zh_cn/migration/index.rst create mode 100644 mmsegmentation/docs/zh_cn/migration/interface.md create mode 100644 mmsegmentation/docs/zh_cn/migration/package.md create mode 100644 mmsegmentation/docs/zh_cn/model_zoo.md create mode 100644 mmsegmentation/docs/zh_cn/modelzoo_statistics.md create mode 100644 mmsegmentation/docs/zh_cn/notes/faq.md create mode 100644 mmsegmentation/docs/zh_cn/overview.md create mode 100755 mmsegmentation/docs/zh_cn/stat.py create mode 100644 mmsegmentation/docs/zh_cn/switch_language.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/1_config.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/3_inference.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/4_train_test.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/5_deployment.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/deploy_jetson.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/index.rst create mode 100644 mmsegmentation/docs/zh_cn/user_guides/useful_tools.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/visualization.md create mode 100644 mmsegmentation/docs/zh_cn/user_guides/visualization_feature_map.md create mode 100644 mmsegmentation/mmseg/__init__.py create mode 100644 mmsegmentation/mmseg/apis/__init__.py create mode 100644 mmsegmentation/mmseg/apis/inference.py create mode 100644 mmsegmentation/mmseg/apis/mmseg_inferencer.py create mode 100644 mmsegmentation/mmseg/apis/remote_sense_inferencer.py create mode 100644 mmsegmentation/mmseg/apis/utils.py create mode 100644 mmsegmentation/mmseg/configs/_base_/datasets/loveda.py create mode 100644 mmsegmentation/mmseg/configs/_base_/datasets/potsdam.py create mode 100644 mmsegmentation/mmseg/configs/_base_/default_runtime.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_160k.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_20k.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_240k.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_25k.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_320k.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_40k.py create mode 100644 mmsegmentation/mmseg/configs/_base_/schedules/schedule_80k.py create mode 100644 mmsegmentation/mmseg/datasets/__init__.py create mode 100644 mmsegmentation/mmseg/datasets/ade.py create mode 100644 mmsegmentation/mmseg/datasets/basesegdataset.py create mode 100644 mmsegmentation/mmseg/datasets/bdd100k.py create mode 100644 mmsegmentation/mmseg/datasets/chase_db1.py create mode 100644 mmsegmentation/mmseg/datasets/cityscapes.py create mode 100644 mmsegmentation/mmseg/datasets/coco_stuff.py create mode 100644 mmsegmentation/mmseg/datasets/dark_zurich.py create mode 100644 mmsegmentation/mmseg/datasets/dataset_wrappers.py create mode 100644 mmsegmentation/mmseg/datasets/decathlon.py create mode 100644 mmsegmentation/mmseg/datasets/drive.py create mode 100644 mmsegmentation/mmseg/datasets/dsdl.py create mode 100644 mmsegmentation/mmseg/datasets/hrf.py create mode 100644 mmsegmentation/mmseg/datasets/hsi_drive.py create mode 100644 mmsegmentation/mmseg/datasets/isaid.py create mode 100644 mmsegmentation/mmseg/datasets/isprs.py create mode 100644 mmsegmentation/mmseg/datasets/levir.py create mode 100644 mmsegmentation/mmseg/datasets/lip.py create mode 100644 mmsegmentation/mmseg/datasets/loveda.py create mode 100644 mmsegmentation/mmseg/datasets/mapillary.py create mode 100644 mmsegmentation/mmseg/datasets/night_driving.py create mode 100644 mmsegmentation/mmseg/datasets/nyu.py create mode 100644 mmsegmentation/mmseg/datasets/pascal_context.py create mode 100644 mmsegmentation/mmseg/datasets/potsdam.py create mode 100644 mmsegmentation/mmseg/datasets/refuge.py create mode 100644 mmsegmentation/mmseg/datasets/stare.py create mode 100644 mmsegmentation/mmseg/datasets/synapse.py create mode 100644 mmsegmentation/mmseg/datasets/transforms/__init__.py create mode 100644 mmsegmentation/mmseg/datasets/transforms/formatting.py create mode 100644 mmsegmentation/mmseg/datasets/transforms/loading.py create mode 100644 mmsegmentation/mmseg/datasets/transforms/transforms.py create mode 100644 mmsegmentation/mmseg/datasets/voc.py create mode 100644 mmsegmentation/mmseg/datasets/xray.py create mode 100644 mmsegmentation/mmseg/datasets/xray2.py create mode 100644 mmsegmentation/mmseg/engine/__init__.py create mode 100644 mmsegmentation/mmseg/engine/hooks/__init__.py create mode 100644 mmsegmentation/mmseg/engine/hooks/visualization_hook.py create mode 100644 mmsegmentation/mmseg/engine/optimizers/__init__.py create mode 100644 mmsegmentation/mmseg/engine/optimizers/force_default_constructor.py create mode 100644 mmsegmentation/mmseg/engine/optimizers/layer_decay_optimizer_constructor.py create mode 100644 mmsegmentation/mmseg/engine/schedulers/__init__.py create mode 100644 mmsegmentation/mmseg/engine/schedulers/poly_ratio_scheduler.py create mode 100644 mmsegmentation/mmseg/evaluation/__init__.py create mode 100644 mmsegmentation/mmseg/evaluation/metrics/__init__.py create mode 100644 mmsegmentation/mmseg/evaluation/metrics/citys_metric.py create mode 100644 mmsegmentation/mmseg/evaluation/metrics/depth_metric.py create mode 100644 mmsegmentation/mmseg/evaluation/metrics/dice_metric.py create mode 100644 mmsegmentation/mmseg/evaluation/metrics/iou_metric.py create mode 100644 mmsegmentation/mmseg/evaluation/metrics/submission_metric.py create mode 100644 mmsegmentation/mmseg/models/__init__.py create mode 100644 mmsegmentation/mmseg/models/assigners/__init__.py create mode 100644 mmsegmentation/mmseg/models/assigners/base_assigner.py create mode 100644 mmsegmentation/mmseg/models/assigners/hungarian_assigner.py create mode 100644 mmsegmentation/mmseg/models/assigners/match_cost.py create mode 100644 mmsegmentation/mmseg/models/backbones/__init__.py create mode 100644 mmsegmentation/mmseg/models/backbones/beit.py create mode 100644 mmsegmentation/mmseg/models/backbones/bisenetv1.py create mode 100644 mmsegmentation/mmseg/models/backbones/bisenetv2.py create mode 100644 mmsegmentation/mmseg/models/backbones/cgnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/ddrnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/erfnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/fast_scnn.py create mode 100644 mmsegmentation/mmseg/models/backbones/hrnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/icnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/mae.py create mode 100644 mmsegmentation/mmseg/models/backbones/mit.py create mode 100644 mmsegmentation/mmseg/models/backbones/mobilenet_v2.py create mode 100644 mmsegmentation/mmseg/models/backbones/mobilenet_v3.py create mode 100644 mmsegmentation/mmseg/models/backbones/mscan.py create mode 100644 mmsegmentation/mmseg/models/backbones/pidnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/resnest.py create mode 100644 mmsegmentation/mmseg/models/backbones/resnet.py create mode 100644 mmsegmentation/mmseg/models/backbones/resnext.py create mode 100644 mmsegmentation/mmseg/models/backbones/stdc.py create mode 100644 mmsegmentation/mmseg/models/backbones/swin.py create mode 100644 mmsegmentation/mmseg/models/backbones/timm_backbone.py create mode 100644 mmsegmentation/mmseg/models/backbones/twins.py create mode 100644 mmsegmentation/mmseg/models/backbones/unet.py create mode 100644 mmsegmentation/mmseg/models/backbones/vit.py create mode 100644 mmsegmentation/mmseg/models/backbones/vpd.py create mode 100644 mmsegmentation/mmseg/models/builder.py create mode 100644 mmsegmentation/mmseg/models/data_preprocessor.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/__init__.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/ann_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/apc_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/aspp_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/cascade_decode_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/cc_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/custom.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/da_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/ddr_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/decode_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/dm_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/dnl_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/dpt_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/ema_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/enc_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/fcn_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/fpn_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/gc_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/ham_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/isa_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/knet_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/lraspp_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/mask2former_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/maskformer_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/nl_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/ocr_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/pid_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/point_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/psa_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/psp_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/san_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/segformer_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/segmenter_mask_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/sep_aspp_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/sep_fcn_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/setr_mla_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/setr_up_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/stdc_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/uper_head.py create mode 100644 mmsegmentation/mmseg/models/decode_heads/vpd_depth_head.py create mode 100644 mmsegmentation/mmseg/models/losses/__init__.py create mode 100644 mmsegmentation/mmseg/models/losses/accuracy.py create mode 100644 mmsegmentation/mmseg/models/losses/boundary_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/cross_entropy_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/dice_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/focal_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/huasdorff_distance_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/kldiv_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/lovasz_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/ohem_cross_entropy_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/silog_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/tversky_loss.py create mode 100644 mmsegmentation/mmseg/models/losses/utils.py create mode 100644 mmsegmentation/mmseg/models/necks/__init__.py create mode 100644 mmsegmentation/mmseg/models/necks/featurepyramid.py create mode 100644 mmsegmentation/mmseg/models/necks/fpn.py create mode 100644 mmsegmentation/mmseg/models/necks/ic_neck.py create mode 100644 mmsegmentation/mmseg/models/necks/jpu.py create mode 100644 mmsegmentation/mmseg/models/necks/mla_neck.py create mode 100644 mmsegmentation/mmseg/models/necks/multilevel_neck.py create mode 100644 mmsegmentation/mmseg/models/segmentors/__init__.py create mode 100644 mmsegmentation/mmseg/models/segmentors/base.py create mode 100644 mmsegmentation/mmseg/models/segmentors/cascade_encoder_decoder.py create mode 100644 mmsegmentation/mmseg/models/segmentors/custom.py create mode 100644 mmsegmentation/mmseg/models/segmentors/depth_estimator.py create mode 100644 mmsegmentation/mmseg/models/segmentors/encoder_decoder.py create mode 100644 mmsegmentation/mmseg/models/segmentors/multimodal_encoder_decoder.py create mode 100644 mmsegmentation/mmseg/models/segmentors/seg_tta.py create mode 100644 mmsegmentation/mmseg/models/text_encoder/__init__.py create mode 100644 mmsegmentation/mmseg/models/text_encoder/clip_text_encoder.py create mode 100644 mmsegmentation/mmseg/models/utils/__init__.py create mode 100644 mmsegmentation/mmseg/models/utils/basic_block.py create mode 100644 mmsegmentation/mmseg/models/utils/embed.py create mode 100644 mmsegmentation/mmseg/models/utils/encoding.py create mode 100644 mmsegmentation/mmseg/models/utils/inverted_residual.py create mode 100644 mmsegmentation/mmseg/models/utils/make_divisible.py create mode 100644 mmsegmentation/mmseg/models/utils/point_sample.py create mode 100644 mmsegmentation/mmseg/models/utils/ppm.py create mode 100644 mmsegmentation/mmseg/models/utils/res_layer.py create mode 100644 mmsegmentation/mmseg/models/utils/san_layers.py create mode 100644 mmsegmentation/mmseg/models/utils/se_layer.py create mode 100644 mmsegmentation/mmseg/models/utils/self_attention_block.py create mode 100644 mmsegmentation/mmseg/models/utils/shape_convert.py create mode 100644 mmsegmentation/mmseg/models/utils/up_conv_block.py create mode 100644 mmsegmentation/mmseg/models/utils/wrappers.py create mode 100644 mmsegmentation/mmseg/registry/__init__.py create mode 100644 mmsegmentation/mmseg/registry/registry.py create mode 100644 mmsegmentation/mmseg/structures/__init__.py create mode 100644 mmsegmentation/mmseg/structures/sampler/__init__.py create mode 100644 mmsegmentation/mmseg/structures/sampler/base_pixel_sampler.py create mode 100644 mmsegmentation/mmseg/structures/sampler/builder.py create mode 100644 mmsegmentation/mmseg/structures/sampler/ohem_pixel_sampler.py create mode 100644 mmsegmentation/mmseg/structures/seg_data_sample.py create mode 100644 mmsegmentation/mmseg/utils/__init__.py create mode 100644 mmsegmentation/mmseg/utils/bpe_simple_vocab_16e6.txt.gz create mode 100644 mmsegmentation/mmseg/utils/class_names.py create mode 100644 mmsegmentation/mmseg/utils/collect_env.py create mode 100644 mmsegmentation/mmseg/utils/get_templates.py create mode 100644 mmsegmentation/mmseg/utils/io.py create mode 100644 mmsegmentation/mmseg/utils/mask_classification.py create mode 100644 mmsegmentation/mmseg/utils/misc.py create mode 100644 mmsegmentation/mmseg/utils/set_env.py create mode 100644 mmsegmentation/mmseg/utils/tokenizer.py create mode 100644 mmsegmentation/mmseg/utils/typing_utils.py create mode 100644 mmsegmentation/mmseg/version.py create mode 100644 mmsegmentation/mmseg/visualization/__init__.py create mode 100644 mmsegmentation/mmseg/visualization/local_visualizer.py create mode 100644 mmsegmentation/model-index.yml create mode 100644 mmsegmentation/nohup.out create mode 100644 mmsegmentation/projects/Adabins/README.md create mode 100644 mmsegmentation/projects/Adabins/backbones/__init__.py create mode 100644 mmsegmentation/projects/Adabins/backbones/adabins_backbone.py create mode 100644 mmsegmentation/projects/Adabins/configs/_base_/datasets/nyu.py create mode 100644 mmsegmentation/projects/Adabins/configs/_base_/default_runtime.py create mode 100644 mmsegmentation/projects/Adabins/configs/_base_/models/Adabins.py create mode 100644 mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_NYU_416x544.py create mode 100644 mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_kitti_352x704.py create mode 100644 mmsegmentation/projects/Adabins/decode_head/__init__.py create mode 100644 mmsegmentation/projects/Adabins/decode_head/adabins_head.py create mode 100644 mmsegmentation/projects/CAT-Seg/README.md create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/__init__.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/models/__init__.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_aggregator.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_head.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/models/clip_ovseg.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/__init__.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/bpe_vocab/bpe_simple_vocab_16e6.txt.gz create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_model.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_templates.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_wrapper.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/self_attention_block.py create mode 100644 mmsegmentation/projects/CAT-Seg/cat_seg/utils/tokenizer.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/ade20k_384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/coco-stuff164k_384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/pascal_context_59_384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/_base_/default_runtime.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/_base_/schedules/schedule_80k.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_ade20k-384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_pascal-context-59-384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb2-warmcoslr2e-4-adamw-80k_coco-stuff164k-384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitg-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vith-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitl-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py create mode 100644 mmsegmentation/projects/CAT-Seg/utils/__init__.py create mode 100644 mmsegmentation/projects/README.md create mode 100644 mmsegmentation/projects/XDecoder/README.md create mode 100644 mmsegmentation/projects/bdd100k_dataset/README.md create mode 100644 mmsegmentation/projects/bdd100k_dataset/configs/_base_/datasets/bdd100k.py create mode 100644 mmsegmentation/projects/bdd100k_dataset/configs/pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py create mode 100644 mmsegmentation/projects/bdd100k_dataset/docs/en/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/projects/bdd100k_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/projects/bdd100k_dataset/mmseg/datasets/bdd100k.py create mode 100644 mmsegmentation/projects/example_project/README.md create mode 100644 mmsegmentation/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/projects/example_project/dummy/__init__.py create mode 100644 mmsegmentation/projects/example_project/dummy/dummy_resnet.py create mode 100644 mmsegmentation/projects/faq.md create mode 100644 mmsegmentation/projects/gid_dataset/configs/_base_/datasets/gid.py create mode 100644 mmsegmentation/projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py create mode 100644 mmsegmentation/projects/gid_dataset/mmseg/datasets/gid.py create mode 100644 mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid.py create mode 100644 mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py create mode 100644 mmsegmentation/projects/gid_dataset/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/projects/hsidrive20_dataset/README.md create mode 100644 mmsegmentation/projects/hsidrive20_dataset/configs/_base_/datasets/hsi_drive.py create mode 100644 mmsegmentation/projects/hsidrive20_dataset/configs/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py create mode 100644 mmsegmentation/projects/hsidrive20_dataset/docs/en/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/projects/hsidrive20_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/projects/hsidrive20_dataset/mmseg/datasets/hsi_drive.py create mode 100644 mmsegmentation/projects/hssn/README.md create mode 100644 mmsegmentation/projects/hssn/configs/_base_/datasets/cityscapes.py create mode 100644 mmsegmentation/projects/hssn/configs/_base_/default_runtime.py create mode 100644 mmsegmentation/projects/hssn/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py create mode 100644 mmsegmentation/projects/hssn/configs/_base_/schedules/schedule_80k.py create mode 100644 mmsegmentation/projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py create mode 100644 mmsegmentation/projects/hssn/decode_head/__init__.py create mode 100644 mmsegmentation/projects/hssn/decode_head/sep_aspp_contrast_head.py create mode 100644 mmsegmentation/projects/hssn/losses/__init__.py create mode 100644 mmsegmentation/projects/hssn/losses/hiera_triplet_loss_cityscape.py create mode 100644 mmsegmentation/projects/hssn/losses/tree_triplet_loss.py create mode 100644 mmsegmentation/projects/isnet/README.md create mode 100644 mmsegmentation/projects/isnet/configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py create mode 100644 mmsegmentation/projects/isnet/decode_heads/__init__.py create mode 100644 mmsegmentation/projects/isnet/decode_heads/isnet_head.py create mode 100644 mmsegmentation/projects/mapillary_dataset/README.md create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1.py create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1_65.py create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v2.py create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v1-512x1024.py create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v2-512x1024.py create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v1-512x1024.py create mode 100644 mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v2-512x1024.py create mode 100644 mmsegmentation/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md create mode 100644 mmsegmentation/projects/mapillary_dataset/mmseg/datasets/mapillary.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/configs/cranium_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_cranium-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_cranium-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_cranium-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_cranium-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/datasets/cranium_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/ct/cranium/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2016-task1-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2016-task1-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2016-task1-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/isic2016-task1_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/datasets/isic2016-task1_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2017-task1-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2017-task1-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2017-task1-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/isic2017-task1_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/datasets/isic2017-task1_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_kvasir-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/kvasir-seg_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/datasets/kvasir-seg_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-aliyun-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-aliyun-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-aliyun-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_kvasir-seg-aliyun-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/kvasir-seg-aliyun_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/datasets/kvasir-seg-aliyun_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/README.md create mode 100755 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py create mode 100755 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/dr-hagis_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_dr-hagis-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_dr-hagis-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_dr-hagis-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/datasets/dr-hagis_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_gamma3-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_gamma3-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_gamma3-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/gamma3_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/datasets/gamma3_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_orvs-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_orvs-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_orvs-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/orvs_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/datasets/orvs_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_rite-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_rite-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_rite-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_rite-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/rite_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/datasets/rite_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/fundus_photography/rite/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/breastCancerCellSegmentation_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breastCancerCellSegmentation-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breastCancerCellSegmentation-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breastCancerCellSegmentation-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/datasets/breastCancerCellSegmentation_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/breast-cancer-cell-seg_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breast-cancer-cell-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breast-cancer-cell-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breast-cancer-cell-seg-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/datasets/breast-cancer-cell-seg_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/conic2022-seg_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_conic2022-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_conic2022-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_conic2022-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/datasets/conic2022-seg_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/consep/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/consep_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_consep-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_consep-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_consep-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/consep/datasets/consep_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_fusc2021-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_fusc2021-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_fusc2021-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_fusc2021-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fusc2021_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/datasets/fusc2021_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_bactteria-detection-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pannuke-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pannuke-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pannuke-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/pannuke_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/datasets/pannuke_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pannuke/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pcam-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pcam-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_pcam-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/pcam_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/datasets/pcam_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/histopathology/pcam/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/README.md create mode 100755 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py create mode 100755 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py create mode 100755 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/2pm-vessel_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_2pm-vessel-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_2pm-vessel-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_2pm-vessel-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_bactteria-detection-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/datasets/2pm-vessel_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/bactteria-detection_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_bactteria-detection-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_bactteria-detection-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_bactteria-detection-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/datasets/bactteria-detection_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/tools/split_seg_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/chest-image-pneum_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-image-pneum-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-image-pneum-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-image-pneum-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/datasets/chest-image-pneum_dataset.py create mode 100755 mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/chest-x-ray-images-with-pneumothorax-masks_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/datasets/chest-x-ray-images-with-pneumothorax-masks_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/covid-19-ct-cxr_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_covid-19-ct-cxr-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_covid-19-ct-cxr-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/datasets/covid-19-ct-cxr_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/README.md create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/crass_512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_crass-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_crass-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_crass-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-lr0.01-sigmoid-20k_crass-512x512.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/datasets/crass_dataset.py create mode 100644 mmsegmentation/projects/medical/2d_image/x_ray/crass/tools/prepare_dataset.py create mode 100644 mmsegmentation/projects/nvidia_jetson/README.md create mode 100644 mmsegmentation/projects/pp_mobileseg/README.md create mode 100644 mmsegmentation/projects/pp_mobileseg/backbones/__init__.py create mode 100644 mmsegmentation/projects/pp_mobileseg/backbones/strideformer.py create mode 100644 mmsegmentation/projects/pp_mobileseg/configs/_base_/datasets/ade20k.py create mode 100644 mmsegmentation/projects/pp_mobileseg/configs/_base_/default_runtime.py create mode 100644 mmsegmentation/projects/pp_mobileseg/configs/_base_/models/pp_mobile.py create mode 100644 mmsegmentation/projects/pp_mobileseg/configs/_base_/schedules/schedule_80k.py create mode 100644 mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_base.py create mode 100644 mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_tiny.py create mode 100644 mmsegmentation/projects/pp_mobileseg/decode_head/__init__.py create mode 100644 mmsegmentation/projects/pp_mobileseg/decode_head/pp_mobileseg_head.py create mode 100644 mmsegmentation/projects/pp_mobileseg/inference_onnx.py create mode 100644 mmsegmentation/projects/sam_inference_demo/README.md create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/__init__.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/modeling/__init__.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/modeling/common.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/modeling/mask_decoder.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/modeling/prompt_encoder.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/modeling/sam.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/modeling/transformer.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/sam_inferencer.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/utils/__init__.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/utils/amg.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam/utils/transforms.py create mode 100644 mmsegmentation/projects/sam_inference_demo/sam_image_demo.ipynb create mode 100644 mmsegmentation/projects/van/README.md create mode 100644 mmsegmentation/projects/van/backbones/__init__.py create mode 100644 mmsegmentation/projects/van/backbones/van.py create mode 100644 mmsegmentation/projects/van/configs/_base_/datasets/ade20k.py create mode 100644 mmsegmentation/projects/van/configs/_base_/models/van_fpn.py create mode 100644 mmsegmentation/projects/van/configs/_base_/models/van_upernet.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b0_fpn_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b1_fpn_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b2_fpn_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b2_upernet_4xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b3_fpn_8xb4-40k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b3_upernet_4xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b4-in22kpre_upernet_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b4_upernet_4xb4-160k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b5-in22kpre_upernet_4xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/projects/van/configs/van/van-b6-in22kpre_upernet_4xb2-160k_ade20k-512x512.py create mode 100644 mmsegmentation/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py create mode 100644 mmsegmentation/requirements.txt create mode 100644 mmsegmentation/requirements/albu.txt create mode 100644 mmsegmentation/requirements/docs.txt create mode 100644 mmsegmentation/requirements/mminstall.txt create mode 100644 mmsegmentation/requirements/multimodal.txt create mode 100644 mmsegmentation/requirements/optional.txt create mode 100644 mmsegmentation/requirements/readthedocs.txt create mode 100644 mmsegmentation/requirements/runtime.txt create mode 100644 mmsegmentation/requirements/tests.txt create mode 100644 mmsegmentation/resources/seg_demo.gif create mode 100644 mmsegmentation/setup.cfg create mode 100755 mmsegmentation/setup.py create mode 100644 mmsegmentation/test.ipynb create mode 100644 mmsegmentation/tests/__init__.py create mode 100644 mmsegmentation/tests/test_apis/test_inferencer.py create mode 100644 mmsegmentation/tests/test_apis/test_rs_inferencer.py create mode 100644 mmsegmentation/tests/test_apis/utils.py create mode 100644 mmsegmentation/tests/test_config.py create mode 100644 mmsegmentation/tests/test_datasets/test_dataset.py create mode 100644 mmsegmentation/tests/test_datasets/test_dataset_builder.py create mode 100644 mmsegmentation/tests/test_datasets/test_formatting.py create mode 100644 mmsegmentation/tests/test_datasets/test_loading.py create mode 100644 mmsegmentation/tests/test_datasets/test_transform.py create mode 100644 mmsegmentation/tests/test_datasets/test_tta.py create mode 100644 mmsegmentation/tests/test_digit_version.py create mode 100644 mmsegmentation/tests/test_engine/test_layer_decay_optimizer_constructor.py create mode 100644 mmsegmentation/tests/test_engine/test_optimizer.py create mode 100644 mmsegmentation/tests/test_engine/test_visualization_hook.py create mode 100644 mmsegmentation/tests/test_evaluation/test_metrics/test_citys_metric.py create mode 100644 mmsegmentation/tests/test_evaluation/test_metrics/test_depth_metric.py create mode 100644 mmsegmentation/tests/test_evaluation/test_metrics/test_iou_metric.py create mode 100644 mmsegmentation/tests/test_models/__init__.py create mode 100644 mmsegmentation/tests/test_models/test_assigners/test_hungarian_assigner.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/__init__.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_beit.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_bisenetv1.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_bisenetv2.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_blocks.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_cgnet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_clip_text_encoder.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_erfnet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_fast_scnn.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_hrnet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_icnet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_mae.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_mit.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_mobilenet_v3.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_mscan.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_pidnet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_resnest.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_resnet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_resnext.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_stdc.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_swin.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_timm_backbone.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_twins.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_unet.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_vit.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/test_vpd.py create mode 100644 mmsegmentation/tests/test_models/test_backbones/utils.py create mode 100644 mmsegmentation/tests/test_models/test_data_preprocessor.py create mode 100644 mmsegmentation/tests/test_models/test_forward.py create mode 100644 mmsegmentation/tests/test_models/test_heads/__init__.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_ann_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_apc_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_aspp_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_cc_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_decode_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_dm_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_dnl_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_dpt_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_ema_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_fcn_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_gc_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_ham_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_isa_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_lraspp_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_mask2former_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_maskformer_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_nl_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_ocr_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_pidnet_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_psa_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_psp_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_san_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_segformer_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_segmenter_mask_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_setr_mla_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_setr_up_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_uper_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/test_vpd_depth_head.py create mode 100644 mmsegmentation/tests/test_models/test_heads/utils.py create mode 100644 mmsegmentation/tests/test_models/test_losses/test_cross_entropy_loss.py create mode 100644 mmsegmentation/tests/test_models/test_losses/test_dice_loss.py create mode 100644 mmsegmentation/tests/test_models/test_losses/test_huasdorff_distance_loss.py create mode 100644 mmsegmentation/tests/test_models/test_losses/test_kldiv_loss.py create mode 100644 mmsegmentation/tests/test_models/test_losses/test_silog_loss.py create mode 100644 mmsegmentation/tests/test_models/test_losses/test_tversky_loss.py create mode 100644 mmsegmentation/tests/test_models/test_necks/__init__.py create mode 100644 mmsegmentation/tests/test_models/test_necks/test_feature2pyramid.py create mode 100644 mmsegmentation/tests/test_models/test_necks/test_fpn.py create mode 100644 mmsegmentation/tests/test_models/test_necks/test_ic_neck.py create mode 100644 mmsegmentation/tests/test_models/test_necks/test_jpu.py create mode 100644 mmsegmentation/tests/test_models/test_necks/test_mla_neck.py create mode 100644 mmsegmentation/tests/test_models/test_necks/test_multilevel_neck.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/__init__.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/test_cascade_encoder_decoder.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/test_depth_estimator.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/test_encoder_decoder.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/test_multimodal_encoder_decoder.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/test_seg_tta_model.py create mode 100644 mmsegmentation/tests/test_models/test_segmentors/utils.py create mode 100644 mmsegmentation/tests/test_models/test_utils/__init__.py create mode 100644 mmsegmentation/tests/test_models/test_utils/test_embed.py create mode 100644 mmsegmentation/tests/test_models/test_utils/test_shape_convert.py create mode 100644 mmsegmentation/tests/test_sampler.py create mode 100644 mmsegmentation/tests/test_structures/test_seg_data_sample.py create mode 100644 mmsegmentation/tests/test_utils/test_io.py create mode 100644 mmsegmentation/tests/test_utils/test_set_env.py create mode 100644 mmsegmentation/tests/test_visualization/test_local_visualizer.py create mode 100644 mmsegmentation/tools/analysis_tools/analyze_logs.py create mode 100644 mmsegmentation/tools/analysis_tools/benchmark.py create mode 100644 mmsegmentation/tools/analysis_tools/browse_dataset.py create mode 100644 mmsegmentation/tools/analysis_tools/confusion_matrix.py create mode 100644 mmsegmentation/tools/analysis_tools/get_flops.py create mode 100644 mmsegmentation/tools/analysis_tools/visualization_cam.py create mode 100644 mmsegmentation/tools/dataset_converters/chase_db1.py create mode 100644 mmsegmentation/tools/dataset_converters/cityscapes.py create mode 100644 mmsegmentation/tools/dataset_converters/coco_stuff10k.py create mode 100644 mmsegmentation/tools/dataset_converters/coco_stuff164k.py create mode 100644 mmsegmentation/tools/dataset_converters/drive.py create mode 100644 mmsegmentation/tools/dataset_converters/hrf.py create mode 100644 mmsegmentation/tools/dataset_converters/isaid.py create mode 100644 mmsegmentation/tools/dataset_converters/levircd.py create mode 100644 mmsegmentation/tools/dataset_converters/loveda.py create mode 100644 mmsegmentation/tools/dataset_converters/nyu.py create mode 100644 mmsegmentation/tools/dataset_converters/pascal_context.py create mode 100644 mmsegmentation/tools/dataset_converters/potsdam.py create mode 100644 mmsegmentation/tools/dataset_converters/refuge.py create mode 100644 mmsegmentation/tools/dataset_converters/stare.py create mode 100644 mmsegmentation/tools/dataset_converters/synapse.py create mode 100644 mmsegmentation/tools/dataset_converters/vaihingen.py create mode 100644 mmsegmentation/tools/dataset_converters/voc_aug.py create mode 100644 mmsegmentation/tools/deployment/pytorch2torchscript.py create mode 100755 mmsegmentation/tools/dist_test.sh create mode 100755 mmsegmentation/tools/dist_train.sh create mode 100644 mmsegmentation/tools/misc/browse_dataset.py create mode 100644 mmsegmentation/tools/misc/print_config.py create mode 100644 mmsegmentation/tools/misc/publish_model.py create mode 100644 mmsegmentation/tools/model_converters/beit2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/clip2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/mit2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/san2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/stdc2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/swin2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/twins2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/vit2mmseg.py create mode 100644 mmsegmentation/tools/model_converters/vitjax2mmseg.py create mode 100755 mmsegmentation/tools/slurm_test.sh create mode 100755 mmsegmentation/tools/slurm_train.sh create mode 100644 mmsegmentation/tools/test.py create mode 100644 mmsegmentation/tools/torchserve/mmseg2torchserve.py create mode 100644 mmsegmentation/tools/torchserve/mmseg_handler.py create mode 100644 mmsegmentation/tools/torchserve/test_torchserve.py create mode 100644 mmsegmentation/tools/train.py create mode 100644 utils/ufo_to_cityscapes.py diff --git a/mmsegmentation/.circleci/config.yml b/mmsegmentation/.circleci/config.yml new file mode 100644 index 0000000..635a984 --- /dev/null +++ b/mmsegmentation/.circleci/config.yml @@ -0,0 +1,34 @@ +version: 2.1 + +# this allows you to use CircleCI's dynamic configuration feature +setup: true + +# the path-filtering orb is required to continue a pipeline based on +# the path of an updated fileset +orbs: + path-filtering: circleci/path-filtering@0.1.2 + +workflows: + # the always-run workflow is always triggered, regardless of the pipeline parameters. + always-run: + jobs: + # the path-filtering/filter job determines which pipeline + # parameters to update. + - path-filtering/filter: + name: check-updated-files + # 3-column, whitespace-delimited mapping. One mapping per + # line: + # + mapping: | + mmseg/.* lint_only false + requirements/.* lint_only false + tests/.* lint_only false + tools/.* lint_only false + configs/.* lint_only false + .circleci/.* lint_only false + base-revision: main + # this is the path of the configuration we should trigger once + # path filtering and pipeline parameter value updates are + # complete. In this case, we are using the parent dynamic + # configuration itself. + config-path: .circleci/test.yml diff --git a/mmsegmentation/.circleci/docker/Dockerfile b/mmsegmentation/.circleci/docker/Dockerfile new file mode 100644 index 0000000..b1d40e0 --- /dev/null +++ b/mmsegmentation/.circleci/docker/Dockerfile @@ -0,0 +1,12 @@ + +ARG PYTORCH="1.8.1" +ARG CUDA="10.2" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +# To fix GPG key error when running apt-get update +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +RUN apt-get update && apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx diff --git a/mmsegmentation/.circleci/test.yml b/mmsegmentation/.circleci/test.yml new file mode 100644 index 0000000..622cdf9 --- /dev/null +++ b/mmsegmentation/.circleci/test.yml @@ -0,0 +1,196 @@ +version: 2.1 + +# the default pipeline parameters, which will be updated according to +# the results of the path-filtering orb +parameters: + lint_only: + type: boolean + default: true + +jobs: + lint: + docker: + - image: cimg/python:3.7.4 + steps: + - checkout + - run: + name: Install pre-commit hook + command: | + pip install pre-commit + pre-commit install + - run: + name: Linting + command: pre-commit run --all-files + - run: + name: Check docstring coverage + command: | + pip install interrogate + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-magic --ignore-regex "__repr__" --fail-under 75 mmseg + build_cpu: + parameters: + # The python version must match available image tags in + # https://circleci.com/developer/images/image/cimg/python + python: + type: string + torch: + type: string + torchvision: + type: string + docker: + - image: cimg/python:<< parameters.python >> + resource_class: large + steps: + - checkout + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5 + - run: + name: Configure Python & pip + command: | + pip install --upgrade pip + pip install wheel + - run: + name: Install PyTorch + command: | + python -V + pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html + - run: + name: Install mmseg dependencies + command: | + pip install git+https://github.com/open-mmlab/mmengine.git@main + pip install -U openmim + mim install mmcv>=2.0.0 + pip install mmpretrain>=1.0.0rc7 + pip install mmdet>=3.0.0 + pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary qudida,albumentations + - run: + name: Build and install + command: | + pip install -e . + - run: + name: Skip timm unittests and generate coverage report + command: | + python -m coverage run --branch --source mmseg -m pytest tests/ --ignore tests/test_models/test_backbones/test_timm_backbone.py --ignore tests/test_apis/test_rs_inferencer.py + python -m coverage xml + python -m coverage report -m + build_cuda: + parameters: + torch: + type: string + cuda: + type: enum + enum: ["10.1", "10.2", "11.1"] + cudnn: + type: integer + default: 7 + machine: + image: linux-cuda-11:default + docker_layer_caching: true + resource_class: gpu.nvidia.small.multi + steps: + - checkout + - run: + name: Install nvidia-container-toolkit and Restart Docker + command: | + sudo apt-get update + sudo apt-get install -y nvidia-container-toolkit + sudo systemctl restart docker + - run: + # Cloning repos in VM since Docker doesn't have access to the private key + name: Clone Repos + command: | + git clone -b main --depth 1 https://github.com/open-mmlab/mmengine.git /home/circleci/mmengine + - run: + name: Build Docker image + command: | + docker build .circleci/docker -t mmseg:gpu --build-arg PYTORCH=<< parameters.torch >> --build-arg CUDA=<< parameters.cuda >> --build-arg CUDNN=<< parameters.cudnn >> + docker run --gpus all -t -d -v /home/circleci/project:/mmseg -v /home/circleci/mmengine:/mmengine -v /home/circleci/mmpretrain:/mmpretrain -v /home/circleci/mmdetection:/mmdetection -w /mmseg --name mmseg mmseg:gpu + - run: + name: Install mmseg dependencies + command: | + docker exec mmseg pip install -e /mmengine + docker exec mmseg pip install -U openmim + docker exec mmseg mim install mmcv>=2.0.0 + docker exec mmseg pip install mmpretrain>=1.0.0rc7 + docker exec mmseg mim install mmdet>=3.0.0 + docker exec mmseg apt-get update + docker exec mmseg apt-get install -y git + docker exec mmseg pip install -r requirements/tests.txt -r requirements/optional.txt + docker exec mmseg python -m pip install albumentations>=0.3.2 --no-binary qudida,albumentations + - run: + name: Build and install + command: | + docker exec mmseg pip install -e . + - run: + name: Run unittests but skip timm unittests + command: | + docker exec mmseg pytest tests/ --ignore tests/test_models/test_backbones/test_timm_backbone.py --ignore tests/test_models/test_backbones/test_timm_backbone.py --ignore tests/test_apis/test_rs_inferencer.py +workflows: + pr_stage_lint: + when: << pipeline.parameters.lint_only >> + jobs: + - lint: + name: lint + filters: + branches: + ignore: + - dev-1.x + - main + pr_stage_test: + when: + not: + << pipeline.parameters.lint_only >> + jobs: + - lint: + name: lint + filters: + branches: + ignore: + - dev-1.x + - main + - build_cpu: + name: minimum_version_cpu + torch: 1.8.1 + torchvision: 0.9.1 + python: "3.7" + requires: + - lint + - build_cpu: + name: maximum_version_cpu + # TODO: Fix torch 1.13 forward crush + torch: 1.12.0 + torchvision: 0.13.0 + python: 3.9.0 + requires: + - minimum_version_cpu + - hold: + type: approval + requires: + - maximum_version_cpu + - build_cuda: + name: mainstream_version_gpu + torch: 1.8.1 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "10.2" + requires: + - hold + merge_stage_test: + when: + not: + << pipeline.parameters.lint_only >> + jobs: + - build_cuda: + name: minimum_version_gpu + torch: 1.8.1 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "10.2" + filters: + branches: + only: + - dev-1.x + - main diff --git a/mmsegmentation/.dev_scripts/batch_test_list.py b/mmsegmentation/.dev_scripts/batch_test_list.py new file mode 100644 index 0000000..0d096ed --- /dev/null +++ b/mmsegmentation/.dev_scripts/batch_test_list.py @@ -0,0 +1,133 @@ +# yapf: disable +# Inference Speed is tested on NVIDIA V100 +hrnet = [ + dict( + config='configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py', + checkpoint='fcn_hr18s_512x512_160k_ade20k_20200614_214413-870f65ac.pth', # noqa + eval='mIoU', + metric=dict(mIoU=33.0), + ), + dict( + config='configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py', + checkpoint='fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth', # noqa + eval='mIoU', + metric=dict(mIoU=76.31), + ), + dict( + config='configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py', + checkpoint='fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth', + eval='mIoU', + metric=dict(mIoU=42.02), + ), + dict( + config='configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py', + checkpoint='fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth', # noqa + eval='mIoU', + metric=dict(mIoU=80.65), + ), +] +pspnet = [ + dict( + config='configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py', + checkpoint='pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth', # noqa + eval='mIoU', + metric=dict(mIoU=78.55), + ), + dict( + config='configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py', + checkpoint='pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth', # noqa + eval='mIoU', + metric=dict(mIoU=79.76), + ), + dict( + config='configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py', + checkpoint='pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth', # noqa + eval='mIoU', + metric=dict(mIoU=44.39), + ), + dict( + config='configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py', + checkpoint='pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth', # noqa + eval='mIoU', + metric=dict(mIoU=42.48), + ), +] +resnest = [ + dict( + config='configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py', # noqa + checkpoint='pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth', # noqa + eval='mIoU', + metric=dict(mIoU=45.44), + ), + dict( + config='configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py', # noqa + checkpoint='pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth', # noqa + eval='mIoU', + metric=dict(mIoU=78.57), + ), +] +fastscnn = [ + dict( + config='configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py', + checkpoint='fast_scnn_8x4_160k_lr0.12_cityscapes-0cec9937.pth', + eval='mIoU', + metric=dict(mIoU=70.96), + ) +] +deeplabv3plus = [ + dict( + config='configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py', # noqa + checkpoint='deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405-a7573d20.pth', # noqa + eval='mIoU', + metric=dict(mIoU=80.98), + ), + dict( + config='configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py', # noqa + checkpoint='deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth', # noqa + eval='mIoU', + metric=dict(mIoU=80.97), + ), + dict( + config='configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py', # noqa + checkpoint='deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth', # noqa + eval='mIoU', + metric=dict(mIoU=80.09), + ), + dict( + config='configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py', # noqa + checkpoint='deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth', # noqa + eval='mIoU', + metric=dict(mIoU=79.83), + ), +] +vit = [ + dict( + config='configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py', # noqa + checkpoint='upernet_vit-b16_ln_mln_512x512_160k_ade20k-f444c077.pth', + eval='mIoU', + metric=dict(mIoU=47.73), + ), + dict( + config='configs/vit/vit_deit-s16-ln_mln_upernet_512x512_160k_ade20k-512x512.py', # noqa + checkpoint='upernet_deit-s16_ln_mln_512x512_160k_ade20k-c0cd652f.pth', + eval='mIoU', + metric=dict(mIoU=43.52), + ), +] +fp16 = [ + dict( + config='configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py', # noqa + checkpoint='deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920-f1104f4b.pth', # noqa + eval='mIoU', + metric=dict(mIoU=80.46), + ) +] +swin = [ + dict( + config='configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py', # noqa + checkpoint='upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542-e380ad3e.pth', # noqa + eval='mIoU', + metric=dict(mIoU=44.41), + ) +] +# yapf: enable diff --git a/mmsegmentation/.dev_scripts/batch_train_list.txt b/mmsegmentation/.dev_scripts/batch_train_list.txt new file mode 100644 index 0000000..6c1a122 --- /dev/null +++ b/mmsegmentation/.dev_scripts/batch_train_list.txt @@ -0,0 +1,19 @@ +configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py +configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py +configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py +configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py +configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py +configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py +configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py +configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py +configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py +configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py +configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py +configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py +configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py +configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py +configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py +configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py +configs/vit/vit_deit-s16-ln_mln_upernet_512x512_160k_ade20k-512x512.py +configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py +configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py diff --git a/mmsegmentation/.dev_scripts/benchmark_evaluation.sh b/mmsegmentation/.dev_scripts/benchmark_evaluation.sh new file mode 100755 index 0000000..68dc272 --- /dev/null +++ b/mmsegmentation/.dev_scripts/benchmark_evaluation.sh @@ -0,0 +1,41 @@ +PARTITION=$1 +CHECKPOINT_DIR=$2 + +echo 'configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fcn_hr18s_512x512_160k_ade20k configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py $CHECKPOINT_DIR/fcn_hr18s_512x512_160k_ade20k_20200614_214413-870f65ac.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/fcn_hr18s_512x512_160k_ade20k --cfg-options dist_params.port=28171 & +echo 'configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fcn_hr18s_512x1024_160k_cityscapes configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py $CHECKPOINT_DIR/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/fcn_hr18s_512x1024_160k_cityscapes --cfg-options dist_params.port=28172 & +echo 'configs/hrnet/fcn_hr48_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fcn_hr48_512x512_160k_ade20k configs/hrnet/fcn_hr48_512x512_160k_ade20k.py $CHECKPOINT_DIR/fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/fcn_hr48_512x512_160k_ade20k --cfg-options dist_params.port=28173 & +echo 'configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fcn_hr48_512x1024_160k_cityscapes configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py $CHECKPOINT_DIR/fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/fcn_hr48_512x1024_160k_cityscapes --cfg-options dist_params.port=28174 & +echo 'configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pspnet_r50-d8_512x1024_80k_cityscapes configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py $CHECKPOINT_DIR/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/pspnet_r50-d8_512x1024_80k_cityscapes --cfg-options dist_params.port=28175 & +echo 'configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pspnet_r101-d8_512x1024_80k_cityscapes configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py $CHECKPOINT_DIR/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/pspnet_r101-d8_512x1024_80k_cityscapes --cfg-options dist_params.port=28176 & +echo 'configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pspnet_r101-d8_512x512_160k_ade20k configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py $CHECKPOINT_DIR/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/pspnet_r101-d8_512x512_160k_ade20k --cfg-options dist_params.port=28177 & +echo 'configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pspnet_r50-d8_512x512_160k_ade20k configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py $CHECKPOINT_DIR/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/pspnet_r50-d8_512x512_160k_ade20k --cfg-options dist_params.port=28178 & +echo 'configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pspnet_s101-d8_512x512_160k_ade20k configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py $CHECKPOINT_DIR/pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/pspnet_s101-d8_512x512_160k_ade20k --cfg-options dist_params.port=28179 & +echo 'configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pspnet_s101-d8_512x1024_80k_cityscapes configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py $CHECKPOINT_DIR/pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/pspnet_s101-d8_512x1024_80k_cityscapes --cfg-options dist_params.port=28180 & +echo 'configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fast_scnn_lr0.12_8x4_160k_cityscapes configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py $CHECKPOINT_DIR/fast_scnn_8x4_160k_lr0.12_cityscapes-0cec9937.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/fast_scnn_lr0.12_8x4_160k_cityscapes --cfg-options dist_params.port=28181 & +echo 'configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deeplabv3plus_r101-d8_769x769_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py $CHECKPOINT_DIR/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405-a7573d20.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/deeplabv3plus_r101-d8_769x769_80k_cityscapes --cfg-options dist_params.port=28182 & +echo 'configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deeplabv3plus_r101-d8_512x1024_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py $CHECKPOINT_DIR/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/deeplabv3plus_r101-d8_512x1024_80k_cityscapes --cfg-options dist_params.port=28183 & +echo 'configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deeplabv3plus_r50-d8_512x1024_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py $CHECKPOINT_DIR/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/deeplabv3plus_r50-d8_512x1024_80k_cityscapes --cfg-options dist_params.port=28184 & +echo 'configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deeplabv3plus_r50-d8_769x769_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py $CHECKPOINT_DIR/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/deeplabv3plus_r50-d8_769x769_80k_cityscapes --cfg-options dist_params.port=28185 & +echo 'configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION upernet_vit-b16_ln_mln_512x512_160k_ade20k configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py $CHECKPOINT_DIR/upernet_vit-b16_ln_mln_512x512_160k_ade20k-f444c077.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/upernet_vit-b16_ln_mln_512x512_160k_ade20k --cfg-options dist_params.port=28186 & +echo 'configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION upernet_deit-s16_ln_mln_512x512_160k_ade20k configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py $CHECKPOINT_DIR/upernet_deit-s16_ln_mln_512x512_160k_ade20k-c0cd652f.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/upernet_deit-s16_ln_mln_512x512_160k_ade20k --cfg-options dist_params.port=28187 & +echo 'configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py $CHECKPOINT_DIR/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes-cc58bc8d.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes --cfg-options dist_params.port=28188 & +echo 'configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py $CHECKPOINT_DIR/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542-e380ad3e.pth --eval mIoU --work-dir work_dirs/benchmark_evaluation/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K --cfg-options dist_params.port=28189 & diff --git a/mmsegmentation/.dev_scripts/benchmark_full_models.txt b/mmsegmentation/.dev_scripts/benchmark_full_models.txt new file mode 100644 index 0000000..64b968d --- /dev/null +++ b/mmsegmentation/.dev_scripts/benchmark_full_models.txt @@ -0,0 +1,57 @@ +ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py +apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py +beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py +bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py +bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py +ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py +cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py +convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py +danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py +deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py +deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py +dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py +dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py +dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py +emanet/eemanet_r50-d8_4xb2-80k_cityscapes-512x1024.py +encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py +erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py +fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py +fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py +fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py +gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py +hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py +icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py +isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py +knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py +mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py +mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py +mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py +mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py +mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py +maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py +maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py +maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py +maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py +mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py +mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py +nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py +ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py +pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py +point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py +poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py +psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py +pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py +resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py +segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py +segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py +segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py +segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py +sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py +setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py +stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py +swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py +twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py +unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py +upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py +vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py +san/san-vit-b16_coco-stuff164k-640x640.py diff --git a/mmsegmentation/.dev_scripts/benchmark_inference.py b/mmsegmentation/.dev_scripts/benchmark_inference.py new file mode 100644 index 0000000..b17c144 --- /dev/null +++ b/mmsegmentation/.dev_scripts/benchmark_inference.py @@ -0,0 +1,149 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import hashlib +import logging +import os +import os.path as osp +import warnings +from argparse import ArgumentParser + +import requests +from mmengine import Config + +from mmseg.apis import inference_model, init_model, show_result_pyplot +from mmseg.utils import get_root_logger + +# ignore warnings when segmentors inference +warnings.filterwarnings('ignore') + + +def download_checkpoint(checkpoint_name, model_name, config_name, collect_dir): + """Download checkpoint and check if hash code is true.""" + url = f'https://download.openmmlab.com/mmsegmentation/v0.5/{model_name}/{config_name}/{checkpoint_name}' # noqa + + r = requests.get(url) + assert r.status_code != 403, f'{url} Access denied.' + + with open(osp.join(collect_dir, checkpoint_name), 'wb') as code: + code.write(r.content) + + true_hash_code = osp.splitext(checkpoint_name)[0].split('-')[1] + + # check hash code + with open(osp.join(collect_dir, checkpoint_name), 'rb') as fp: + sha256_cal = hashlib.sha256() + sha256_cal.update(fp.read()) + cur_hash_code = sha256_cal.hexdigest()[:8] + + assert true_hash_code == cur_hash_code, f'{url} download failed, ' + 'incomplete downloaded file or url invalid.' + + if cur_hash_code != true_hash_code: + os.remove(osp.join(collect_dir, checkpoint_name)) + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint_root', help='Checkpoint file root path') + parser.add_argument( + '-i', '--img', default='demo/demo.png', help='Image file') + parser.add_argument('-a', '--aug', action='store_true', help='aug test') + parser.add_argument('-m', '--model-name', help='model name to inference') + parser.add_argument( + '-s', '--show', action='store_true', help='show results') + parser.add_argument( + '-d', '--device', default='cuda:0', help='Device used for inference') + args = parser.parse_args() + return args + + +def inference(config_name, checkpoint, args, logger=None): + cfg = Config.fromfile(config_name) + if args.aug: + if 'flip' in cfg.data.test.pipeline[ + 1] and 'img_scale' in cfg.data.test.pipeline[1]: + cfg.data.test.pipeline[1].img_ratios = [ + 0.5, 0.75, 1.0, 1.25, 1.5, 1.75 + ] + cfg.data.test.pipeline[1].flip = True + else: + if logger is not None: + logger.error(f'{config_name}: unable to start aug test') + else: + print(f'{config_name}: unable to start aug test', flush=True) + + model = init_model(cfg, checkpoint, device=args.device) + # test a single image + result = inference_model(model, args.img) + + # show the results + if args.show: + show_result_pyplot(model, args.img, result) + return result + + +# Sample test whether the inference code is correct +def main(args): + config = Config.fromfile(args.config) + + if not os.path.exists(args.checkpoint_root): + os.makedirs(args.checkpoint_root, 0o775) + + # test single model + if args.model_name: + if args.model_name in config: + model_infos = config[args.model_name] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + config_name = model_info['config'].strip() + print(f'processing: {config_name}', flush=True) + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + try: + # build the model from a config file and a checkpoint file + inference(config_name, checkpoint, args) + except Exception: + print(f'{config_name} test failed!') + continue + return + else: + raise RuntimeError('model name input error.') + + # test all model + logger = get_root_logger( + log_file='benchmark_inference_image.log', log_level=logging.ERROR) + + for model_name in config: + model_infos = config[model_name] + + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + print('processing: ', model_info['config'], flush=True) + config_path = model_info['config'].strip() + config_name = osp.splitext(osp.basename(config_path))[0] + checkpoint_name = model_info['checkpoint'].strip() + checkpoint = osp.join(args.checkpoint_root, checkpoint_name) + + # ensure checkpoint exists + try: + if not osp.exists(checkpoint): + download_checkpoint(checkpoint_name, model_name, + config_name.rstrip('.py'), + args.checkpoint_root) + except Exception: + logger.error(f'{checkpoint_name} download error') + continue + + # test model inference with checkpoint + try: + # build the model from a config file and a checkpoint file + inference(config_path, checkpoint, args, logger) + except Exception as e: + logger.error(f'{config_path} " : {repr(e)}') + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/mmsegmentation/.dev_scripts/benchmark_options.py b/mmsegmentation/.dev_scripts/benchmark_options.py new file mode 100644 index 0000000..51909a0 --- /dev/null +++ b/mmsegmentation/.dev_scripts/benchmark_options.py @@ -0,0 +1,10 @@ +third_part_libs = [ + 'pip install mmengine', + 'pip install mmcv>=2.0.0', + 'pip install mmcls==1.0.0rc6', + 'pip install mmdet==3.0.0', + 'pip install -r requirements.txt', + 'pip install timm', +] + +default_floating_range = 0.5 diff --git a/mmsegmentation/.dev_scripts/benchmark_train.sh b/mmsegmentation/.dev_scripts/benchmark_train.sh new file mode 100755 index 0000000..cde47a0 --- /dev/null +++ b/mmsegmentation/.dev_scripts/benchmark_train.sh @@ -0,0 +1,40 @@ +PARTITION=$1 + +echo 'configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION fcn_hr18s_512x512_160k_ade20k configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24727 --work-dir work_dirs/hrnet/fcn_hr18s_512x512_160k_ade20k >/dev/null & +echo 'configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION fcn_hr18s_512x1024_160k_cityscapes configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24728 --work-dir work_dirs/hrnet/fcn_hr18s_512x1024_160k_cityscapes >/dev/null & +echo 'configs/hrnet/fcn_hr48_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION fcn_hr48_512x512_160k_ade20k configs/hrnet/fcn_hr48_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24729 --work-dir work_dirs/hrnet/fcn_hr48_512x512_160k_ade20k >/dev/null & +echo 'configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION fcn_hr48_512x1024_160k_cityscapes configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24730 --work-dir work_dirs/hrnet/fcn_hr48_512x1024_160k_cityscapes >/dev/null & +echo 'configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION pspnet_r50-d8_512x1024_80k_cityscapes configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24731 --work-dir work_dirs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes >/dev/null & +echo 'configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION pspnet_r101-d8_512x1024_80k_cityscapes configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24732 --work-dir work_dirs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes >/dev/null & +echo 'configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION pspnet_r101-d8_512x512_160k_ade20k configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24733 --work-dir work_dirs/pspnet/pspnet_r101-d8_512x512_160k_ade20k >/dev/null & +echo 'configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION pspnet_r50-d8_512x512_160k_ade20k configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24734 --work-dir work_dirs/pspnet/pspnet_r50-d8_512x512_160k_ade20k >/dev/null & +echo 'configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION pspnet_s101-d8_512x512_160k_ade20k configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24735 --work-dir work_dirs/resnest/pspnet_s101-d8_512x512_160k_ade20k >/dev/null & +echo 'configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION pspnet_s101-d8_512x1024_80k_cityscapes configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24736 --work-dir work_dirs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes >/dev/null & +echo 'configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION fast_scnn_lr0.12_8x4_160k_cityscapes configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24737 --work-dir work_dirs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes >/dev/null & +echo 'configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION deeplabv3plus_r101-d8_769x769_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24738 --work-dir work_dirs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes >/dev/null & +echo 'configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION deeplabv3plus_r101-d8_512x1024_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24739 --work-dir work_dirs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes >/dev/null & +echo 'configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION deeplabv3plus_r50-d8_512x1024_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24740 --work-dir work_dirs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes >/dev/null & +echo 'configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION deeplabv3plus_r50-d8_769x769_80k_cityscapes configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24741 --work-dir work_dirs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes >/dev/null & +echo 'configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION upernet_vit-b16_ln_mln_512x512_160k_ade20k configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24742 --work-dir work_dirs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k >/dev/null & +echo 'configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION upernet_deit-s16_ln_mln_512x512_160k_ade20k configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24743 --work-dir work_dirs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k >/dev/null & +echo 'configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24744 --work-dir work_dirs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes >/dev/null & +echo 'configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh $PARTITION upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py --cfg-options checkpoint_config.max_keep_ckpts=1 dist_params.port=24745 --work-dir work_dirs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K >/dev/null & diff --git a/mmsegmentation/.dev_scripts/benchmark_train_models.txt b/mmsegmentation/.dev_scripts/benchmark_train_models.txt new file mode 100644 index 0000000..01f279d --- /dev/null +++ b/mmsegmentation/.dev_scripts/benchmark_train_models.txt @@ -0,0 +1,26 @@ +bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py +bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py +deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py +deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py +deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py +deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py +hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py +hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py +knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py +knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py +mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py +mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py +maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py +mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py +ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py +pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py +pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py +pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py +segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py +segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py +segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py +swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py +twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py +unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py +upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py +san/san-vit-b16_coco-stuff164k-640x640.py diff --git a/mmsegmentation/.dev_scripts/check_urls.py b/mmsegmentation/.dev_scripts/check_urls.py new file mode 100644 index 0000000..58a1354 --- /dev/null +++ b/mmsegmentation/.dev_scripts/check_urls.py @@ -0,0 +1,100 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +import os +from argparse import ArgumentParser + +import requests +import yaml as yml + +from mmseg.utils import get_root_logger + + +def check_url(url): + """Check url response status. + + Args: + url (str): url needed to check. + + Returns: + int, bool: status code and check flag. + """ + flag = True + r = requests.head(url) + status_code = r.status_code + if status_code == 403 or status_code == 404: + flag = False + + return status_code, flag + + +def parse_args(): + parser = ArgumentParser('url valid check.') + parser.add_argument( + '-m', + '--model-name', + type=str, + help='Select the model needed to check') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + model_name = args.model_name + + # yml path generate. + # If model_name is not set, script will check all of the models. + if model_name is not None: + yml_list = [(model_name, f'configs/{model_name}/{model_name}.yml')] + else: + # check all + yml_list = [(x, f'configs/{x}/{x}.yml') for x in os.listdir('configs/') + if x != '_base_'] + + logger = get_root_logger(log_file='url_check.log', log_level=logging.ERROR) + + for model_name, yml_path in yml_list: + # Default yaml loader unsafe. + model_infos = yml.load(open(yml_path), Loader=yml.CLoader)['Models'] + for model_info in model_infos: + config_name = model_info['Name'] + checkpoint_url = model_info['Weights'] + # checkpoint url check + status_code, flag = check_url(checkpoint_url) + if flag: + logger.info(f'checkpoint | {config_name} | {checkpoint_url} | ' + f'{status_code} valid') + else: + logger.error( + f'checkpoint | {config_name} | {checkpoint_url} | ' + f'{status_code} | error') + # log_json check + checkpoint_name = checkpoint_url.split('/')[-1] + model_time = '-'.join(checkpoint_name.split('-')[:-1]).replace( + f'{config_name}_', '') + # two style of log_json name + # use '_' to link model_time (will be deprecated) + log_json_url_1 = f'https://download.openmmlab.com/mmsegmentation/v0.5/{model_name}/{config_name}/{config_name}_{model_time}.log.json' # noqa + status_code_1, flag_1 = check_url(log_json_url_1) + # use '-' to link model_time + log_json_url_2 = f'https://download.openmmlab.com/mmsegmentation/v0.5/{model_name}/{config_name}/{config_name}-{model_time}.log.json' # noqa + status_code_2, flag_2 = check_url(log_json_url_2) + if flag_1 or flag_2: + if flag_1: + logger.info( + f'log.json | {config_name} | {log_json_url_1} | ' + f'{status_code_1} | valid') + else: + logger.info( + f'log.json | {config_name} | {log_json_url_2} | ' + f'{status_code_2} | valid') + else: + logger.error( + f'log.json | {config_name} | {log_json_url_1} & ' + f'{log_json_url_2} | {status_code_1} & {status_code_2} | ' + 'error') + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/.dev_scripts/gather_benchmark_evaluation_results.py b/mmsegmentation/.dev_scripts/gather_benchmark_evaluation_results.py new file mode 100644 index 0000000..fec83f1 --- /dev/null +++ b/mmsegmentation/.dev_scripts/gather_benchmark_evaluation_results.py @@ -0,0 +1,91 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import os.path as osp + +from mmengine import Config +from mmengine.fileio import dump, load + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Gather benchmarked model evaluation results') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + '--out', + type=str, + default='benchmark_evaluation_info.json', + help='output path of gathered metrics and compared ' + 'results to be stored') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + root_path = args.root + metrics_out = args.out + result_dict = {} + + cfg = Config.fromfile(args.config) + + for model_key in cfg: + model_infos = cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + previous_metrics = model_info['metric'] + config = model_info['config'].strip() + fname, _ = osp.splitext(osp.basename(config)) + + # Load benchmark evaluation json + metric_json_dir = osp.join(root_path, fname) + if not osp.exists(metric_json_dir): + print(f'{metric_json_dir} not existed.') + continue + + json_list = glob.glob(osp.join(metric_json_dir, '*.json')) + if len(json_list) == 0: + print(f'There is no eval json in {metric_json_dir}.') + continue + + log_json_path = list(sorted(json_list))[-1] + metric = load(log_json_path) + if config not in metric.get('config', {}): + print(f'{config} not included in {log_json_path}') + continue + + # Compare between new benchmark results and previous metrics + differential_results = dict() + new_metrics = dict() + for record_metric_key in previous_metrics: + if record_metric_key not in metric['metric']: + raise KeyError('record_metric_key not exist, please ' + 'check your config') + old_metric = previous_metrics[record_metric_key] + new_metric = round(metric['metric'][record_metric_key] * 100, + 2) + + differential = new_metric - old_metric + flag = '+' if differential > 0 else '-' + differential_results[ + record_metric_key] = f'{flag}{abs(differential):.2f}' + new_metrics[record_metric_key] = new_metric + + result_dict[config] = dict( + differential=differential_results, + previous=previous_metrics, + new=new_metrics) + + if metrics_out: + dump(result_dict, metrics_out, indent=4) + print('===================================') + for config_name, metrics in result_dict.items(): + print(config_name, metrics) + print('===================================') diff --git a/mmsegmentation/.dev_scripts/gather_benchmark_train_results.py b/mmsegmentation/.dev_scripts/gather_benchmark_train_results.py new file mode 100644 index 0000000..f801a0d --- /dev/null +++ b/mmsegmentation/.dev_scripts/gather_benchmark_train_results.py @@ -0,0 +1,100 @@ +import argparse +import glob +import os.path as osp + +from gather_models import get_final_results +from mmengine import Config +from mmengine.fileio import dump + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Gather benchmarked models train results') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + '--out', + type=str, + default='benchmark_train_info.json', + help='output path of gathered metrics to be stored') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + root_path = args.root + metrics_out = args.out + + evaluation_cfg = Config.fromfile(args.config) + + result_dict = {} + for model_key in evaluation_cfg: + model_infos = evaluation_cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + config = model_info['config'] + + # benchmark train dir + model_name = osp.split(osp.dirname(config))[1] + config_name = osp.splitext(osp.basename(config))[0] + exp_dir = osp.join(root_path, model_name, config_name) + if not osp.exists(exp_dir): + print(f'{config} hasn\'t {exp_dir}') + continue + + # parse config + cfg = Config.fromfile(config) + total_iters = cfg.runner.max_iters + exp_metric = cfg.evaluation.metric + if not isinstance(exp_metric, list): + exp_metrics = [exp_metric] + + # determine whether total_iters ckpt exists + ckpt_path = f'iter_{total_iters}.pth' + if not osp.exists(osp.join(exp_dir, ckpt_path)): + print(f'{config} hasn\'t {ckpt_path}') + continue + + # only the last log json counts + log_json_path = list( + sorted(glob.glob(osp.join(exp_dir, '*.log.json'))))[-1] + + # extract metric value + model_performance = get_final_results(log_json_path, total_iters) + if model_performance is None: + print(f'log file error: {log_json_path}') + continue + + differential_results = dict() + old_results = dict() + new_results = dict() + for metric_key in model_performance: + if metric_key in ['mIoU']: + metric = round(model_performance[metric_key] * 100, 2) + old_metric = model_info['metric'][metric_key] + old_results[metric_key] = old_metric + new_results[metric_key] = metric + differential = metric - old_metric + flag = '+' if differential > 0 else '-' + differential_results[ + metric_key] = f'{flag}{abs(differential):.2f}' + result_dict[config] = dict( + differential_results=differential_results, + old_results=old_results, + new_results=new_results, + ) + + # 4 save or print results + if metrics_out: + dump(result_dict, metrics_out, indent=4) + print('===================================') + for config_name, metrics in result_dict.items(): + print(config_name, metrics) + print('===================================') diff --git a/mmsegmentation/.dev_scripts/gather_models.py b/mmsegmentation/.dev_scripts/gather_models.py new file mode 100644 index 0000000..fe6c390 --- /dev/null +++ b/mmsegmentation/.dev_scripts/gather_models.py @@ -0,0 +1,213 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import hashlib +import json +import os +import os.path as osp +import shutil + +import torch +from mmengine import Config +from mmengine.fileio import dump +from mmengine.utils import mkdir_or_exist, scandir + +# build schedule look-up table to automatically find the final model +RESULTS_LUT = ['mIoU', 'mAcc', 'aAcc'] + + +def calculate_file_sha256(file_path): + """calculate file sha256 hash code.""" + with open(file_path, 'rb') as fp: + sha256_cal = hashlib.sha256() + sha256_cal.update(fp.read()) + return sha256_cal.hexdigest() + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + torch.save(checkpoint, out_file) + # The hash code calculation and rename command differ on different system + # platform. + sha = calculate_file_sha256(out_file) + final_file = out_file.rstrip('.pth') + f'-{sha[:8]}.pth' + os.rename(out_file, final_file) + + # Remove prefix and suffix + final_file_name = osp.split(final_file)[1] + final_file_name = osp.splitext(final_file_name)[0] + + return final_file_name + + +def get_final_iter(config): + iter_num = config.split('_')[-2] + assert iter_num.endswith('k') + return int(iter_num[:-1]) * 1000 + + +def get_final_results(log_json_path, iter_num): + result_dict = dict() + last_iter = 0 + with open(log_json_path) as f: + for line in f.readlines(): + log_line = json.loads(line) + if 'mode' not in log_line.keys(): + continue + + # When evaluation, the 'iter' of new log json is the evaluation + # steps on single gpu. + flag1 = ('aAcc' in log_line) or (log_line['mode'] == 'val') + flag2 = (last_iter == iter_num - 50) or (last_iter == iter_num) + if flag1 and flag2: + result_dict.update({ + key: log_line[key] + for key in RESULTS_LUT if key in log_line + }) + return result_dict + + last_iter = log_line['iter'] + + +def parse_args(): + parser = argparse.ArgumentParser(description='Gather benchmarked models') + parser.add_argument( + '-f', '--config-name', type=str, help='Process the selected config.') + parser.add_argument( + '-w', + '--work-dir', + default='work_dirs/', + type=str, + help='Ckpt storage root folder of benchmarked models to be gathered.') + parser.add_argument( + '-c', + '--collect-dir', + default='work_dirs/gather', + type=str, + help='Ckpt collect root folder of gathered models.') + parser.add_argument( + '--all', action='store_true', help='whether include .py and .log') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + work_dir = args.work_dir + collect_dir = args.collect_dir + selected_config_name = args.config_name + mkdir_or_exist(collect_dir) + + # find all models in the root directory to be gathered + raw_configs = list(scandir('./configs', '.py', recursive=True)) + + # filter configs that is not trained in the experiments dir + used_configs = [] + for raw_config in raw_configs: + config_name = osp.splitext(osp.basename(raw_config))[0] + if osp.exists(osp.join(work_dir, config_name)): + if (selected_config_name is None + or selected_config_name == config_name): + used_configs.append(raw_config) + print(f'Find {len(used_configs)} models to be gathered') + + # find final_ckpt and log file for trained each config + # and parse the best performance + model_infos = [] + for used_config in used_configs: + config_name = osp.splitext(osp.basename(used_config))[0] + exp_dir = osp.join(work_dir, config_name) + # check whether the exps is finished + final_iter = get_final_iter(used_config) + final_model = f'iter_{final_iter}.pth' + model_path = osp.join(exp_dir, final_model) + + # skip if the model is still training + if not osp.exists(model_path): + print(f'{used_config} train not finished yet') + continue + + # get logs + log_json_paths = glob.glob(osp.join(exp_dir, '*.log.json')) + log_json_path = log_json_paths[0] + model_performance = None + for idx, _log_json_path in enumerate(log_json_paths): + model_performance = get_final_results(_log_json_path, final_iter) + if model_performance is not None: + log_json_path = _log_json_path + break + + if model_performance is None: + print(f'{used_config} model_performance is None') + continue + + model_time = osp.split(log_json_path)[-1].split('.')[0] + model_infos.append( + dict( + config_name=config_name, + results=model_performance, + iters=final_iter, + model_time=model_time, + log_json_path=osp.split(log_json_path)[-1])) + + # publish model for each checkpoint + publish_model_infos = [] + for model in model_infos: + config_name = model['config_name'] + model_publish_dir = osp.join(collect_dir, config_name) + + publish_model_path = osp.join(model_publish_dir, + config_name + '_' + model['model_time']) + trained_model_path = osp.join(work_dir, config_name, + 'iter_{}.pth'.format(model['iters'])) + if osp.exists(model_publish_dir): + for file in os.listdir(model_publish_dir): + if file.endswith('.pth'): + print(f'model {file} found') + model['model_path'] = osp.abspath( + osp.join(model_publish_dir, file)) + break + if 'model_path' not in model: + print(f'dir {model_publish_dir} exists, no model found') + + else: + mkdir_or_exist(model_publish_dir) + + # convert model + final_model_path = process_checkpoint(trained_model_path, + publish_model_path) + model['model_path'] = final_model_path + + new_json_path = f'{config_name}_{model["log_json_path"]}' + # copy log + shutil.copy( + osp.join(work_dir, config_name, model['log_json_path']), + osp.join(model_publish_dir, new_json_path)) + + if args.all: + new_txt_path = new_json_path.rstrip('.json') + shutil.copy( + osp.join(work_dir, config_name, + model['log_json_path'].rstrip('.json')), + osp.join(model_publish_dir, new_txt_path)) + + if args.all: + # copy config to guarantee reproducibility + raw_config = osp.join('./configs', f'{config_name}.py') + Config.fromfile(raw_config).dump( + osp.join(model_publish_dir, osp.basename(raw_config))) + + publish_model_infos.append(model) + + models = dict(models=publish_model_infos) + dump(models, osp.join(collect_dir, 'model_infos.json'), indent=4) + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/.dev_scripts/generate_benchmark_evaluation_script.py b/mmsegmentation/.dev_scripts/generate_benchmark_evaluation_script.py new file mode 100644 index 0000000..4c48f85 --- /dev/null +++ b/mmsegmentation/.dev_scripts/generate_benchmark_evaluation_script.py @@ -0,0 +1,114 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp + +from mmengine import Config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert benchmark test model list to script') + parser.add_argument('config', help='test config file path') + parser.add_argument('--port', type=int, default=28171, help='dist port') + parser.add_argument( + '--work-dir', + default='work_dirs/benchmark_evaluation', + help='the dir to save metric') + parser.add_argument( + '--out', + type=str, + default='.dev_scripts/benchmark_evaluation.sh', + help='path to save model benchmark script') + + args = parser.parse_args() + return args + + +def process_model_info(model_info, work_dir): + config = model_info['config'].strip() + fname, _ = osp.splitext(osp.basename(config)) + job_name = fname + checkpoint = model_info['checkpoint'].strip() + work_dir = osp.join(work_dir, fname) + if not isinstance(model_info['eval'], list): + evals = [model_info['eval']] + else: + evals = model_info['eval'] + eval = ' '.join(evals) + return dict( + config=config, + job_name=job_name, + checkpoint=checkpoint, + work_dir=work_dir, + eval=eval) + + +def create_test_bash_info(commands, model_test_dict, port, script_name, + partition): + config = model_test_dict['config'] + job_name = model_test_dict['job_name'] + checkpoint = model_test_dict['checkpoint'] + work_dir = model_test_dict['work_dir'] + eval = model_test_dict['eval'] + + echo_info = f'\necho \'{config}\' &' + commands.append(echo_info) + commands.append('\n') + + command_info = f'GPUS=4 GPUS_PER_NODE=4 ' \ + f'CPUS_PER_TASK=2 {script_name} ' + + command_info += f'{partition} ' + command_info += f'{job_name} ' + command_info += f'{config} ' + command_info += f'$CHECKPOINT_DIR/{checkpoint} ' + + command_info += f'--eval {eval} ' + command_info += f'--work-dir {work_dir} ' + command_info += f'--cfg-options dist_params.port={port} ' + command_info += '&' + + commands.append(command_info) + + +def main(): + args = parse_args() + if args.out: + out_suffix = args.out.split('.')[-1] + assert args.out.endswith('.sh'), \ + f'Expected out file path suffix is .sh, but get .{out_suffix}' + + commands = [] + partition_name = 'PARTITION=$1' + commands.append(partition_name) + commands.append('\n') + + checkpoint_root = 'CHECKPOINT_DIR=$2' + commands.append(checkpoint_root) + commands.append('\n') + + script_name = osp.join('tools', 'slurm_test.sh') + port = args.port + work_dir = args.work_dir + + cfg = Config.fromfile(args.config) + + for model_key in cfg: + model_infos = cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + print('processing: ', model_info['config']) + model_test_dict = process_model_info(model_info, work_dir) + create_test_bash_info(commands, model_test_dict, port, script_name, + '$PARTITION') + port += 1 + + command_str = ''.join(commands) + if args.out: + with open(args.out, 'w') as f: + f.write(command_str + '\n') + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/.dev_scripts/generate_benchmark_train_script.py b/mmsegmentation/.dev_scripts/generate_benchmark_train_script.py new file mode 100644 index 0000000..4bfdfbf --- /dev/null +++ b/mmsegmentation/.dev_scripts/generate_benchmark_train_script.py @@ -0,0 +1,91 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp + +# Default using 4 gpu when training +config_8gpu_list = [ + 'configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py', # noqa + 'configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py', + 'configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py', +] + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert benchmark model json to script') + parser.add_argument( + 'txt_path', type=str, help='txt path output by benchmark_filter') + parser.add_argument('--port', type=int, default=24727, help='dist port') + parser.add_argument( + '--out', + type=str, + default='.dev_scripts/benchmark_train.sh', + help='path to save model benchmark script') + + args = parser.parse_args() + return args + + +def create_train_bash_info(commands, config, script_name, partition, port): + cfg = config.strip() + + # print cfg name + echo_info = f'echo \'{cfg}\' &' + commands.append(echo_info) + commands.append('\n') + + _, model_name = osp.split(osp.dirname(cfg)) + config_name, _ = osp.splitext(osp.basename(cfg)) + # default setting + if cfg in config_8gpu_list: + command_info = f'GPUS=8 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {script_name} ' + else: + command_info = f'GPUS=4 GPUS_PER_NODE=4 ' \ + f'CPUS_PER_TASK=2 {script_name} ' + command_info += f'{partition} ' + command_info += f'{config_name} ' + command_info += f'{cfg} ' + command_info += f'--cfg-options ' \ + f'checkpoint_config.max_keep_ckpts=1 ' \ + f'dist_params.port={port} ' + command_info += f'--work-dir work_dirs/{model_name}/{config_name} ' + # Let the script shut up + command_info += '>/dev/null &' + + commands.append(command_info) + commands.append('\n') + + +def main(): + args = parse_args() + if args.out: + out_suffix = args.out.split('.')[-1] + assert args.out.endswith('.sh'), \ + f'Expected out file path suffix is .sh, but get .{out_suffix}' + + root_name = './tools' + script_name = osp.join(root_name, 'slurm_train.sh') + port = args.port + partition_name = 'PARTITION=$1' + + commands = [] + commands.append(partition_name) + commands.append('\n') + commands.append('\n') + + with open(args.txt_path) as f: + model_cfgs = f.readlines() + for i, cfg in enumerate(model_cfgs): + create_train_bash_info(commands, cfg, script_name, '$PARTITION', + port) + port += 1 + + command_str = ''.join(commands) + if args.out: + with open(args.out, 'w') as f: + f.write(command_str) + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/.dev_scripts/log_collector/example_config.py b/mmsegmentation/.dev_scripts/log_collector/example_config.py new file mode 100644 index 0000000..bc2b4d6 --- /dev/null +++ b/mmsegmentation/.dev_scripts/log_collector/example_config.py @@ -0,0 +1,18 @@ +work_dir = '../../work_dirs' +metric = 'mIoU' + +# specify the log files we would like to collect in `log_items` +log_items = [ + 'segformer_mit-b5_512x512_160k_ade20k_cnn_lr_with_warmup', + 'segformer_mit-b5_512x512_160k_ade20k_cnn_no_warmup_lr', + 'segformer_mit-b5_512x512_160k_ade20k_mit_trans_lr', + 'segformer_mit-b5_512x512_160k_ade20k_swin_trans_lr' +] +# or specify ignore_keywords, then the folders whose name contain +# `'segformer'` won't be collected +# ignore_keywords = ['segformer'] + +# should not include metric +other_info_keys = ['mAcc'] +markdown_file = 'markdowns/lr_in_trans.json.md' +json_file = 'jsons/trans_in_cnn.json' diff --git a/mmsegmentation/.dev_scripts/log_collector/log_collector.py b/mmsegmentation/.dev_scripts/log_collector/log_collector.py new file mode 100644 index 0000000..0c2ff61 --- /dev/null +++ b/mmsegmentation/.dev_scripts/log_collector/log_collector.py @@ -0,0 +1,143 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import datetime +import json +import os +import os.path as osp +from collections import OrderedDict + +from utils import load_config + +# automatically collect all the results + +# The structure of the directory: +# โ”œโ”€โ”€ work-dir +# โ”‚ โ”œโ”€โ”€ config_1 +# โ”‚ โ”‚ โ”œโ”€โ”€ time1.log.json +# โ”‚ โ”‚ โ”œโ”€โ”€ time2.log.json +# โ”‚ โ”‚ โ”œโ”€โ”€ time3.log.json +# โ”‚ โ”‚ โ”œโ”€โ”€ time4.log.json +# โ”‚ โ”œโ”€โ”€ config_2 +# โ”‚ โ”‚ โ”œโ”€โ”€ time5.log.json +# โ”‚ โ”‚ โ”œโ”€โ”€ time6.log.json +# โ”‚ โ”‚ โ”œโ”€โ”€ time7.log.json +# โ”‚ โ”‚ โ”œโ”€โ”€ time8.log.json + + +def parse_args(): + parser = argparse.ArgumentParser(description='extract info from log.json') + parser.add_argument('config_dir') + args = parser.parse_args() + return args + + +def has_keyword(name: str, keywords: list): + for a_keyword in keywords: + if a_keyword in name: + return True + return False + + +def main(): + args = parse_args() + cfg = load_config(args.config_dir) + work_dir = cfg['work_dir'] + metric = cfg['metric'] + log_items = cfg.get('log_items', []) + ignore_keywords = cfg.get('ignore_keywords', []) + other_info_keys = cfg.get('other_info_keys', []) + markdown_file = cfg.get('markdown_file', None) + json_file = cfg.get('json_file', None) + + if json_file and osp.split(json_file)[0] != '': + os.makedirs(osp.split(json_file)[0], exist_ok=True) + if markdown_file and osp.split(markdown_file)[0] != '': + os.makedirs(osp.split(markdown_file)[0], exist_ok=True) + + assert not (log_items and ignore_keywords), \ + 'log_items and ignore_keywords cannot be specified at the same time' + assert metric not in other_info_keys, \ + 'other_info_keys should not contain metric' + + if ignore_keywords and isinstance(ignore_keywords, str): + ignore_keywords = [ignore_keywords] + if other_info_keys and isinstance(other_info_keys, str): + other_info_keys = [other_info_keys] + if log_items and isinstance(log_items, str): + log_items = [log_items] + + if not log_items: + log_items = [ + item for item in sorted(os.listdir(work_dir)) + if not has_keyword(item, ignore_keywords) + ] + + experiment_info_list = [] + for config_dir in log_items: + preceding_path = os.path.join(work_dir, config_dir) + log_list = [ + item for item in os.listdir(preceding_path) + if item.endswith('.log.json') + ] + log_list = sorted( + log_list, + key=lambda time_str: datetime.datetime.strptime( + time_str, '%Y%m%d_%H%M%S.log.json')) + val_list = [] + last_iter = 0 + for log_name in log_list: + with open(os.path.join(preceding_path, log_name)) as f: + # ignore the info line + f.readline() + all_lines = f.readlines() + val_list.extend([ + json.loads(line) for line in all_lines + if json.loads(line)['mode'] == 'val' + ]) + for index in range(len(all_lines) - 1, -1, -1): + line_dict = json.loads(all_lines[index]) + if line_dict['mode'] == 'train': + last_iter = max(last_iter, line_dict['iter']) + break + + new_log_dict = dict( + method=config_dir, metric_used=metric, last_iter=last_iter) + for index, log in enumerate(val_list, 1): + new_ordered_dict = OrderedDict() + new_ordered_dict['eval_index'] = index + new_ordered_dict[metric] = log[metric] + for key in other_info_keys: + if key in log: + new_ordered_dict[key] = log[key] + val_list[index - 1] = new_ordered_dict + + assert len(val_list) >= 1, \ + f"work dir {config_dir} doesn't contain any evaluation." + new_log_dict['last eval'] = val_list[-1] + new_log_dict['best eval'] = max(val_list, key=lambda x: x[metric]) + experiment_info_list.append(new_log_dict) + print(f'{config_dir} is processed') + + if json_file: + with open(json_file, 'w') as f: + json.dump(experiment_info_list, f, indent=4) + + if markdown_file: + lines_to_write = [] + for index, log in enumerate(experiment_info_list, 1): + lines_to_write.append( + f"|{index}|{log['method']}|{log['best eval'][metric]}" + f"|{log['best eval']['eval_index']}|" + f"{log['last eval'][metric]}|" + f"{log['last eval']['eval_index']}|{log['last_iter']}|\n") + with open(markdown_file, 'w') as f: + f.write(f'|exp_num|method|{metric} best|best index|' + f'{metric} last|last index|last iter num|\n') + f.write('|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n') + f.writelines(lines_to_write) + + print('processed successfully') + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/.dev_scripts/log_collector/readme.md b/mmsegmentation/.dev_scripts/log_collector/readme.md new file mode 100644 index 0000000..4a8b9b6 --- /dev/null +++ b/mmsegmentation/.dev_scripts/log_collector/readme.md @@ -0,0 +1,144 @@ +# Log Collector + +## Function + +Automatically collect logs and write the result in a json file or markdown file. + +If there are several `.log.json` files in one folder, Log Collector assumes that the `.log.json` files other than the first one are resume from the preceding `.log.json` file. Log Collector returns the result considering all `.log.json` files. + +## Usage: + +To use log collector, you need to write a config file to configure the log collector first. + +For example: + +example_config.py: + +```python +# The work directory that contains folders that contains .log.json files. +work_dir = '../../work_dirs' +# The metric used to find the best evaluation. +metric = 'mIoU' + +# **Don't specify the log_items and ignore_keywords at the same time.** +# Specify the log files we would like to collect in `log_items`. +# The folders specified should be the subdirectories of `work_dir`. +log_items = [ + 'segformer_mit-b5_512x512_160k_ade20k_cnn_lr_with_warmup', + 'segformer_mit-b5_512x512_160k_ade20k_cnn_no_warmup_lr', + 'segformer_mit-b5_512x512_160k_ade20k_mit_trans_lr', + 'segformer_mit-b5_512x512_160k_ade20k_swin_trans_lr' +] +# Or specify `ignore_keywords`. The folders whose name contain one +# of the keywords in the `ignore_keywords` list(e.g., `'segformer'`) +# won't be collected. +# ignore_keywords = ['segformer'] + +# Other log items in .log.json that you want to collect. +# should not include metric. +other_info_keys = ["mAcc"] +# The output markdown file's name. +markdown_file ='markdowns/lr_in_trans.json.md' +# The output json file's name. (optional) +json_file = 'jsons/trans_in_cnn.json' +``` + +The structure of the work-dir directory should be like๏ผš + +```text +โ”œโ”€โ”€ work-dir +โ”‚ โ”œโ”€โ”€ folder1 +โ”‚ โ”‚ โ”œโ”€โ”€ time1.log.json +โ”‚ โ”‚ โ”œโ”€โ”€ time2.log.json +โ”‚ โ”‚ โ”œโ”€โ”€ time3.log.json +โ”‚ โ”‚ โ”œโ”€โ”€ time4.log.json +โ”‚ โ”œโ”€โ”€ folder2 +โ”‚ โ”‚ โ”œโ”€โ”€ time5.log.json +โ”‚ โ”‚ โ”œโ”€โ”€ time6.log.json +โ”‚ โ”‚ โ”œโ”€โ”€ time7.log.json +โ”‚ โ”‚ โ”œโ”€โ”€ time8.log.json +``` + +Then , cd to the log collector folder. + +Now you can run log_collector.py by using command: + +```bash +python log_collector.py ./example_config.py +``` + +The output markdown file is like: + +| exp_num | method | mIoU best | best index | mIoU last | last index | last iter num | +| :-----: | :-----------------------------------------------------: | :-------: | :--------: | :-------: | :--------: | :-----------: | +| 1 | segformer_mit-b5_512x512_160k_ade20k_cnn_lr_with_warmup | 0.2776 | 10 | 0.2776 | 10 | 160000 | +| 2 | segformer_mit-b5_512x512_160k_ade20k_cnn_no_warmup_lr | 0.2802 | 10 | 0.2802 | 10 | 160000 | +| 3 | segformer_mit-b5_512x512_160k_ade20k_mit_trans_lr | 0.4943 | 11 | 0.4943 | 11 | 160000 | +| 4 | segformer_mit-b5_512x512_160k_ade20k_swin_trans_lr | 0.4883 | 11 | 0.4883 | 11 | 160000 | + +The output json file is like: + +```json +[ + { + "method": "segformer_mit-b5_512x512_160k_ade20k_cnn_lr_with_warmup", + "metric_used": "mIoU", + "last_iter": 160000, + "last eval": { + "eval_index": 10, + "mIoU": 0.2776, + "mAcc": 0.3779 + }, + "best eval": { + "eval_index": 10, + "mIoU": 0.2776, + "mAcc": 0.3779 + } + }, + { + "method": "segformer_mit-b5_512x512_160k_ade20k_cnn_no_warmup_lr", + "metric_used": "mIoU", + "last_iter": 160000, + "last eval": { + "eval_index": 10, + "mIoU": 0.2802, + "mAcc": 0.3764 + }, + "best eval": { + "eval_index": 10, + "mIoU": 0.2802, + "mAcc": 0.3764 + } + }, + { + "method": "segformer_mit-b5_512x512_160k_ade20k_mit_trans_lr", + "metric_used": "mIoU", + "last_iter": 160000, + "last eval": { + "eval_index": 11, + "mIoU": 0.4943, + "mAcc": 0.6097 + }, + "best eval": { + "eval_index": 11, + "mIoU": 0.4943, + "mAcc": 0.6097 + } + }, + { + "method": "segformer_mit-b5_512x512_160k_ade20k_swin_trans_lr", + "metric_used": "mIoU", + "last_iter": 160000, + "last eval": { + "eval_index": 11, + "mIoU": 0.4883, + "mAcc": 0.6061 + }, + "best eval": { + "eval_index": 11, + "mIoU": 0.4883, + "mAcc": 0.6061 + } + } +] +``` diff --git a/mmsegmentation/.dev_scripts/log_collector/utils.py b/mmsegmentation/.dev_scripts/log_collector/utils.py new file mode 100644 index 0000000..848516a --- /dev/null +++ b/mmsegmentation/.dev_scripts/log_collector/utils.py @@ -0,0 +1,20 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# modified from https://github.dev/open-mmlab/mmcv +import os.path as osp +import sys +from importlib import import_module + + +def load_config(cfg_dir: str) -> dict: + assert cfg_dir.endswith('.py') + root_path, file_name = osp.split(cfg_dir) + temp_module = osp.splitext(file_name)[0] + sys.path.insert(0, root_path) + mod = import_module(temp_module) + sys.path.pop(0) + cfg_dict = { + k: v + for k, v in mod.__dict__.items() if not k.startswith('__') + } + del sys.modules[temp_module] + return cfg_dict diff --git a/mmsegmentation/.dev_scripts/update_model_index.py b/mmsegmentation/.dev_scripts/update_model_index.py new file mode 100755 index 0000000..eb87c02 --- /dev/null +++ b/mmsegmentation/.dev_scripts/update_model_index.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python + +# Copyright (c) OpenMMLab. All rights reserved. +# This tool is used to update model-index.yml which is required by MIM, and +# will be automatically called as a pre-commit hook. The updating will be +# triggered if any change of model information (.md files in configs/) has been +# detected before a commit. + +import os +import os.path as osp +import re +import sys +from typing import List, Tuple + +import yaml + +MMSEG_ROOT = osp.abspath(osp.join(osp.dirname(__file__), '..')) + + +def get_collection_name_list(md_file_list: List[str]) -> List[str]: + """Get the list of collection names.""" + collection_name_list: List[str] = [] + for md_file in md_file_list: + with open(md_file) as f: + lines = f.readlines() + collection_name = lines[0].split('#')[1].strip() + collection_name_list.append(collection_name) + return collection_name_list + + +def get_md_file_list() -> Tuple[List[str], List[str]]: + """Get the list of md files.""" + md_file_list: List[str] = [] + md_dir_list: List[str] = [] + for root, _, files in os.walk(osp.join(MMSEG_ROOT, 'configs')): + for file in files: + if file.endswith('.md'): + md_file_list.append(osp.join(root, file)) + md_dir_list.append(root) + break + return md_file_list, md_dir_list + + +def get_model_info(md_file: str, config_dir: str, + collection_name_list: List[str]) -> Tuple[dict, str]: + """Get model information from md file.""" + datasets: List[str] = [] + models: List[dict] = [] + current_dataset: str = '' + paper_name: str = '' + paper_url: str = '' + code_url: str = '' + is_backbone: bool = False + is_dataset: bool = False + collection_name: str = '' + with open(md_file) as f: + lines: List[str] = f.readlines() + i: int = 0 + + while i < len(lines): + line: str = lines[i].strip() + if len(line) == 0: + i += 1 + continue + # get paper name and url + if re.match(r'> \[.*\]+\([a-zA-Z]+://[^\s]*\)', line): + paper_info = line.split('](') + paper_name = paper_info[0][paper_info[0].index('[') + 1:] + paper_url = paper_info[1][:len(paper_info[1]) - 1] + + # get code info + if 'Code Snippet' in line: + code_url = line.split('"')[1].split('"')[0] + + if line.startswith('' in line: + return None, None + + # get dataset names + if line.startswith('###'): + current_dataset = line.split('###')[1].strip() + datasets.append(current_dataset) + + # get model info key id + if (line[0] == '|' and (i + 1) < len(lines) + and lines[i + 1][:3] == '| -' and 'Method' in line + and 'Crop Size' in line and 'Mem (GB)' in line): + keys: List[str] = [key.strip() for key in line.split('|')] + crop_size_idx: int = keys.index('Crop Size') + mem_idx: int = keys.index('Mem (GB)') + assert 'Device' in keys, f'No Device in {md_file}' + device_idx: int = keys.index('Device') + + if 'mIoU' in keys: + ss_idx = keys.index('mIoU') + elif 'mDice' in keys: + ss_idx = keys.index('mDice') + else: + raise ValueError(f'No mIoU or mDice in {md_file}') + if 'mIoU(ms+flip)' in keys: + ms_idx = keys.index('mIoU(ms+flip)') + elif 'Dice' in keys: + ms_idx = keys.index('Dice') + else: + ms_idx = -1 + config_idx = keys.index('config') + download_idx = keys.index('download') + j: int = i + 2 + while j < len(lines) and lines[j][0] == '|': + values = [value.strip() for value in lines[j].split('|')] + # get config name + try: + config_url = re.findall(r'[a-zA-Z]+://[^\s]*py', + values[config_idx])[0] + config_name = config_url.split('/')[-1] + model_name = config_name.replace('.py', '') + except IndexError: + raise ValueError( + f'config url is not found in {md_file}') + + # get model name + try: + weight_url = re.findall(r'[a-zA-Z]+://[^\s]*pth', + values[download_idx])[0] + log_url = re.findall(r'[a-zA-Z]+://[^\s]*.json', + values[download_idx + 1])[0] + except IndexError: + raise ValueError( + f'url is not found in {values[download_idx]}') + + # get batch size + bs = re.findall(r'[0-9]*xb[0-9]*', + config_name)[0].split('xb') + batch_size = int(bs[0]) * int(bs[1]) + + # get crop size + crop_size = values[crop_size_idx].split('x') + crop_size = [int(crop_size[0]), int(crop_size[1])] + + mem = values[mem_idx].split('\\')[0] if values[ + mem_idx] != '-' and values[mem_idx] != '' else -1 + + method = values[keys.index('Method')].strip() + # method = [method.strip()] if '+' not in method else [ + # m.strip() for m in method.split('+') + # ] + # split method name: + if ' + ' in method: + method = [m.strip() for m in method.split(' + ')] + elif ' ' in method: + method = [m for m in method.split(' ')] + else: + method = [method] + backone: str = re.findall( + r'[^\s]*', values[keys.index('Backbone')].strip())[0] + archs = [backone] + method + collection_name = method[0] + config_path = osp.join('configs', + config_dir.split('/')[-1], + config_name) + model = { + 'Name': model_name, + 'In Collection': collection_name, + 'Results': { + 'Task': 'Semantic Segmentation', + 'Dataset': current_dataset, + 'Metrics': { + keys[ss_idx]: float(values[ss_idx]) + } + }, + 'Config': config_path, + 'Metadata': { + 'Training Data': + current_dataset, + 'Batch Size': + batch_size, + 'Architecture': + archs, + 'Training Resources': + f'{bs[0]}x {values[device_idx]} GPUS', + }, + 'Weights': weight_url, + 'Training log': log_url, + 'Paper': { + 'Title': paper_name, + 'URL': paper_url + }, + 'Code': code_url, + 'Framework': 'PyTorch' + } + if ms_idx != -1 and values[ms_idx] != '-' and values[ + ms_idx] != '': + model['Results']['Metrics'].update( + {keys[ms_idx]: float(values[ms_idx])}) + if mem != -1: + model['Metadata']['Memory (GB)'] = float(mem) + models.append(model) + j += 1 + i = j + i += 1 + + if not (is_dataset + or is_backbone) or collection_name not in collection_name_list: + collection = { + 'Name': collection_name, + 'License': 'Apache License 2.0', + 'Metadata': { + 'Training Data': datasets + }, + 'Paper': { + 'Title': paper_name, + 'URL': paper_url, + }, + 'README': osp.join('configs', + config_dir.split('/')[-1], 'README.md'), + 'Frameworks': ['PyTorch'], + } + results = { + 'Collections': [collection], + 'Models': models + }, collection_name + else: + results = {'Models': models}, '' + + return results + + +def dump_yaml_and_check_difference(model_info: dict, filename: str) -> bool: + """dump yaml file and check difference with the original file. + + Args: + model_info (dict): model info dict. + filename (str): filename to save. + """ + str_dump = yaml.dump(model_info, sort_keys=False) + if osp.isfile(filename): + file_exist = True + with open(filename, encoding='utf-8') as f: + str_orig = f.read() + else: + str_orig = None + file_exist = False + + if file_exist and str_orig == str_dump: + is_different = False + else: + is_different = True + with open(filename, 'w', encoding='utf-8') as f: + f.write(str_dump) + + return is_different + + +def update_model_index(config_dir_list: List[str]) -> bool: + """update model index.""" + yml_files = [ + osp.join('configs', + dir_name.split('/')[-1], 'metafile.yaml') + for dir_name in config_dir_list + ] + yml_files.sort() + + model_index = { + 'Import': [ + osp.relpath(yml_file, MMSEG_ROOT).replace('\\', '/') + for yml_file in yml_files + ] + } + model_index_file = osp.join(MMSEG_ROOT, 'model-index.yml') + return dump_yaml_and_check_difference(model_index, model_index_file) + + +if __name__ == '__main__': + # get md file list + md_file_list, config_dir_list = get_md_file_list() + file_modified = False + collection_name_list: List[str] = get_collection_name_list(md_file_list) + # hard code to add 'FPN' + collection_name_list.append('FPN') + remove_config_dir_list = [] + # parse md file + for md_file, config_dir in zip(md_file_list, config_dir_list): + results, collection_name = get_model_info(md_file, config_dir, + collection_name_list) + if results is None: + remove_config_dir_list.append(config_dir) + continue + filename = osp.join(config_dir, 'metafile.yaml') + file_modified |= dump_yaml_and_check_difference(results, filename) + if collection_name != '': + collection_name_list.append(collection_name) + # remove config dir + for config_dir in remove_config_dir_list: + config_dir_list.remove(config_dir) + file_modified |= update_model_index(config_dir_list) + sys.exit(1 if file_modified else 0) diff --git a/mmsegmentation/.dev_scripts/upload_modelzoo.py b/mmsegmentation/.dev_scripts/upload_modelzoo.py new file mode 100644 index 0000000..303c80d --- /dev/null +++ b/mmsegmentation/.dev_scripts/upload_modelzoo.py @@ -0,0 +1,45 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + +import oss2 + +ACCESS_KEY_ID = os.getenv('OSS_ACCESS_KEY_ID', None) +ACCESS_KEY_SECRET = os.getenv('OSS_ACCESS_KEY_SECRET', None) +BUCKET_NAME = 'openmmlab' +ENDPOINT = 'https://oss-accelerate.aliyuncs.com' + + +def parse_args(): + parser = argparse.ArgumentParser(description='Upload models to OSS') + parser.add_argument('model_zoo', type=str, help='model_zoo input') + parser.add_argument( + '--dst-folder', + type=str, + default='mmsegmentation/v0.5', + help='destination folder') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + model_zoo = args.model_zoo + dst_folder = args.dst_folder + bucket = oss2.Bucket( + oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET), ENDPOINT, BUCKET_NAME) + + for root, dirs, files in os.walk(model_zoo): + for file in files: + file_path = osp.relpath(osp.join(root, file), model_zoo) + print(f'Uploading {file_path}') + + oss2.resumable_upload(bucket, osp.join(dst_folder, file_path), + osp.join(model_zoo, file_path)) + bucket.put_object_acl( + osp.join(dst_folder, file_path), oss2.OBJECT_ACL_PUBLIC_READ) + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/.github/CODE_OF_CONDUCT.md b/mmsegmentation/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..92afad1 --- /dev/null +++ b/mmsegmentation/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at chenkaidev@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq + +[homepage]: https://www.contributor-covenant.org diff --git a/mmsegmentation/.github/CONTRIBUTING.md b/mmsegmentation/.github/CONTRIBUTING.md new file mode 100644 index 0000000..8865fa8 --- /dev/null +++ b/mmsegmentation/.github/CONTRIBUTING.md @@ -0,0 +1,59 @@ +# Contributing to MMSegmentation 1.x + +All kinds of contributions are welcome, including but not limited to the following. + +- Fix typo or bugs +- Add documentation or translate the documentation into other languages +- Add new features and components + +## Workflow + +1. fork and pull the latest MMSegmentation repository +2. checkout a new branch from 'dev-1.x' (do not use master branch for PRs) +3. commit your changes +4. create a PR + +```{note} +If you plan to add some new features that involve large changes, it is encouraged to open an issue for discussion first. +``` + +## Code style + +### Python + +We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. + +We use the following tools for linting and formatting: + +- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools. +- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports. +- [yapf](https://github.com/google/yapf): A formatter for Python files. +- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files. +- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files. +- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring. + +Style configurations of yapf and isort can be found in [setup.cfg](./setup.cfg). + +We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, +fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit. +The config for a pre-commit hook is stored in [.pre-commit-config](./.pre-commit-config.yaml). + +After you clone the repository, you will need to install initialize pre-commit hook. + +```shell +pip install -U pre-commit +``` + +From the repository folder + +```shell +pre-commit install +``` + +After this on every commit check code linters and formatter will be enforced. + +> Before you create a PR, make sure that your code lints and is formatted by yapf. + +### C++ and CUDA + +We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). diff --git a/mmsegmentation/.github/ISSUE_TEMPLATE/config.yml b/mmsegmentation/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..aa982e5 --- /dev/null +++ b/mmsegmentation/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +blank_issues_enabled: false + +contact_links: + - name: MMSegmentation Documentation + url: https://mmsegmentation.readthedocs.io + about: Check the docs and FAQ to see if you question is already answered. diff --git a/mmsegmentation/.github/ISSUE_TEMPLATE/error-report.md b/mmsegmentation/.github/ISSUE_TEMPLATE/error-report.md new file mode 100644 index 0000000..807781c --- /dev/null +++ b/mmsegmentation/.github/ISSUE_TEMPLATE/error-report.md @@ -0,0 +1,48 @@ +--- +name: Error report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' +--- + +Thanks for your error report and we appreciate it a lot. + +**Checklist** + +1. I have searched related issues but cannot get the expected help. +2. The bug has not been fixed in the latest version. + +**Describe the bug** +A clear and concise description of what the bug is. + +**Reproduction** + +1. What command or script did you run? + + ```none + A placeholder for the command. + ``` + +2. Did you make any modifications on the code or config? Did you understand what you have modified? + +3. What dataset did you use? + +**Environment** + +1. Please run `python mmseg/utils/collect_env.py` to collect necessary environment information and paste it here. +2. You may add addition that may be helpful for locating the problem, such as + - How you installed PyTorch \[e.g., pip, conda, source\] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + +**Error traceback** + +If applicable, paste the error trackback here. + +```none +A placeholder for trackback. +``` + +**Bug fix** + +If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/mmsegmentation/.github/ISSUE_TEMPLATE/feature_request.md b/mmsegmentation/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..7e3b855 --- /dev/null +++ b/mmsegmentation/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' +--- + +# Describe the feature + +**Motivation** +A clear and concise description of the motivation of the feature. +Ex1. It is inconvenient when \[....\]. +Ex2. There is a recent paper \[....\], which is very helpful for \[....\]. + +**Related resources** +If there is an official code release or third-party implementations, please also provide the information here, which would be very helpful. + +**Additional context** +Add any other context or screenshots about the feature request here. +If you would like to implement the feature and create a PR, please leave a comment here and that would be much appreciated. diff --git a/mmsegmentation/.github/ISSUE_TEMPLATE/general_questions.md b/mmsegmentation/.github/ISSUE_TEMPLATE/general_questions.md new file mode 100644 index 0000000..f02dd63 --- /dev/null +++ b/mmsegmentation/.github/ISSUE_TEMPLATE/general_questions.md @@ -0,0 +1,7 @@ +--- +name: General questions +about: Ask general questions to get help +title: '' +labels: '' +assignees: '' +--- diff --git a/mmsegmentation/.github/ISSUE_TEMPLATE/reimplementation_questions.md b/mmsegmentation/.github/ISSUE_TEMPLATE/reimplementation_questions.md new file mode 100644 index 0000000..63e4c3b --- /dev/null +++ b/mmsegmentation/.github/ISSUE_TEMPLATE/reimplementation_questions.md @@ -0,0 +1,69 @@ +--- +name: Reimplementation Questions +about: Ask about questions during model reimplementation +title: '' +labels: reimplementation +assignees: '' +--- + +If you feel we have helped you, give us a STAR! :satisfied: + +**Notice** + +There are several common situations in the reimplementation issues as below + +1. Reimplement a model in the model zoo using the provided configs +2. Reimplement a model in the model zoo on other datasets (e.g., custom datasets) +3. Reimplement a custom model but all the components are implemented in MMSegmentation +4. Reimplement a custom model with new modules implemented by yourself + +There are several things to do for different cases as below. + +- For cases 1 & 3, please follow the steps in the following sections thus we could help to quickly identify the issue. +- For cases 2 & 4, please understand that we are not able to do much help here because we usually do not know the full code, and the users should be responsible for the code they write. +- One suggestion for cases 2 & 4 is that the users should first check whether the bug lies in the self-implemented code or the original code. For example, users can first make sure that the same model runs well on supported datasets. If you still need help, please describe what you have done and what you obtain in the issue, and follow the steps in the following sections, and try as clear as possible so that we can better help you. + +**Checklist** + +1. I have searched related issues but cannot get the expected help. +2. The issue has not been fixed in the latest version. + +**Describe the issue** + +A clear and concise description of the problem you meet and what you have done. + +**Reproduction** + +1. What command or script did you run? + +``` +A placeholder for the command. +``` + +2. What config dir you run? + +``` +A placeholder for the config. +``` + +3. Did you make any modifications to the code or config? Did you understand what you have modified? +4. What dataset did you use? + +**Environment** + +1. Please run `PYTHONPATH=${PWD}:$PYTHONPATH python mmseg/utils/collect_env.py` to collect the necessary environment information and paste it here. +2. You may add an addition that may be helpful for locating the problem, such as + 1. How you installed PyTorch \[e.g., pip, conda, source\] + 2. Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + +**Results** + +If applicable, paste the related results here, e.g., what you expect and what you get. + +``` +A placeholder for results comparison +``` + +**Issue fix** + +If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/mmsegmentation/.github/pull_request_template.md b/mmsegmentation/.github/pull_request_template.md new file mode 100644 index 0000000..09d5305 --- /dev/null +++ b/mmsegmentation/.github/pull_request_template.md @@ -0,0 +1,25 @@ +Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers. + +## Motivation + +Please describe the motivation of this PR and the goal you want to achieve through this PR. + +## Modification + +Please briefly describe what modification is made in this PR. + +## BC-breaking (Optional) + +Does the modification introduce changes that break the backward-compatibility of the downstream repos? +If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR. + +## Use cases (Optional) + +If this PR introduces a new feature, it is better to list some use cases here, and update the documentation. + +## Checklist + +1. Pre-commit or other linting tools are used to fix the potential lint issues. +2. The modification is covered by complete unit tests. If not, please add more unit test to ensure the correctness. +3. If the modification has potential influence on downstream projects, this PR should be tested with downstream projects, like MMDet or MMDet3D. +4. The documentation has been modified accordingly, like docstring or example tutorials. diff --git a/mmsegmentation/.github/workflows/deploy.yml b/mmsegmentation/.github/workflows/deploy.yml new file mode 100644 index 0000000..0e0c6c9 --- /dev/null +++ b/mmsegmentation/.github/workflows/deploy.yml @@ -0,0 +1,26 @@ +name: deploy + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-n-publish: + runs-on: ubuntu-22.04 + if: startsWith(github.event.ref, 'refs/tags') + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.7 + uses: actions/setup-python@v4 + with: + python-version: 3.7 + - name: Build MMSegmentation + run: | + pip install wheel + python setup.py sdist bdist_wheel + - name: Publish distribution to PyPI + run: | + pip install twine + twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} diff --git a/mmsegmentation/.gitignore b/mmsegmentation/.gitignore new file mode 100644 index 0000000..787d13e --- /dev/null +++ b/mmsegmentation/.gitignore @@ -0,0 +1,120 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/en/_build/ +docs/zh_cn/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +.DS_Store + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +data +.vscode +.idea + +# custom +*.pkl +*.pkl.json +*.log.json +work_dirs/ +mmseg/.mim + +# Pytorch +*.pth diff --git a/mmsegmentation/.owners.yml b/mmsegmentation/.owners.yml new file mode 100644 index 0000000..20f2070 --- /dev/null +++ b/mmsegmentation/.owners.yml @@ -0,0 +1,7 @@ +assign: + strategy: + # random + # round-robin + daily-shift-based + assignees: + - xiexinch diff --git a/mmsegmentation/.pre-commit-config.yaml b/mmsegmentation/.pre-commit-config.yaml new file mode 100644 index 0000000..337e90c --- /dev/null +++ b/mmsegmentation/.pre-commit-config.yaml @@ -0,0 +1,67 @@ +repos: + - repo: https://github.com/PyCQA/flake8 + rev: 5.0.4 + hooks: + - id: flake8 + - repo: https://github.com/zhouzaida/isort + rev: 5.12.1 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-yapf + rev: v0.32.0 + hooks: + - id: yapf + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: end-of-file-fixer + - id: requirements-txt-fixer + - id: double-quote-string-fixer + - id: check-merge-conflict + - id: fix-encoding-pragma + args: ["--remove"] + - id: mixed-line-ending + args: ["--fix=lf"] + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.9 + hooks: + - id: mdformat + args: ["--number"] + additional_dependencies: + - mdformat-openmmlab + - mdformat_frontmatter + - linkify-it-py + - repo: https://github.com/codespell-project/codespell + rev: v2.2.1 + hooks: + - id: codespell + args: [--ignore-words-list=hsi] + - repo: https://github.com/myint/docformatter + rev: v1.3.1 + hooks: + - id: docformatter + args: ["--in-place", "--wrap-descriptions", "79"] + # temporarily remove update-model-index to avoid conflict raised + # by depth estimator models + # - repo: local + # hooks: + # - id: update-model-index + # name: update-model-index + # description: Collect model information and update model-index.yml + # entry: .dev_scripts/update_model_index.py + # additional_dependencies: [pyyaml] + # language: python + # require_serial: true + - repo: https://github.com/asottile/pyupgrade + rev: v3.0.0 + hooks: + - id: pyupgrade + args: ["--py36-plus"] + - repo: https://github.com/open-mmlab/pre-commit-hooks + rev: v0.2.0 # Use the rev to fix revision + hooks: + - id: check-algo-readme + - id: check-copyright + args: ["mmseg", "tools", "tests", "demo"] # the dir_to_check with expected directory to check diff --git a/mmsegmentation/CITATION.cff b/mmsegmentation/CITATION.cff new file mode 100644 index 0000000..cfd7cab --- /dev/null +++ b/mmsegmentation/CITATION.cff @@ -0,0 +1,8 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: + - name: "MMSegmentation Contributors" +title: "OpenMMLab Semantic Segmentation Toolbox and Benchmark" +date-released: 2020-07-10 +url: "https://github.com/open-mmlab/mmsegmentation" +license: Apache-2.0 diff --git a/mmsegmentation/LICENSE b/mmsegmentation/LICENSE new file mode 100644 index 0000000..38e625b --- /dev/null +++ b/mmsegmentation/LICENSE @@ -0,0 +1,203 @@ +Copyright 2020 The MMSegmentation Authors. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 The MMSegmentation Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/mmsegmentation/MANIFEST.in b/mmsegmentation/MANIFEST.in new file mode 100644 index 0000000..94a0fc1 --- /dev/null +++ b/mmsegmentation/MANIFEST.in @@ -0,0 +1,5 @@ +include requirements/*.txt +include mmseg/.mim/model-index.yml +include mmseg/utils/bpe_simple_vocab_16e6.txt.gz +recursive-include mmseg/.mim/configs *.py *.yaml +recursive-include mmseg/.mim/tools *.py *.sh diff --git a/mmsegmentation/README.md b/mmsegmentation/README.md new file mode 100644 index 0000000..79ecdb7 --- /dev/null +++ b/mmsegmentation/README.md @@ -0,0 +1,420 @@ +
+ +
 
+
+ OpenMMLab website + + + HOT + + +      + OpenMMLab platform + + + TRY IT OUT + + +
+
 
+ +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mmsegmentation)](https://pypi.org/project/mmsegmentation/) +[![PyPI](https://img.shields.io/pypi/v/mmsegmentation)](https://pypi.org/project/mmsegmentation) +[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmsegmentation.readthedocs.io/en/latest/) +[![badge](https://github.com/open-mmlab/mmsegmentation/workflows/build/badge.svg)](https://github.com/open-mmlab/mmsegmentation/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmsegmentation/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmsegmentation) +[![license](https://img.shields.io/github/license/open-mmlab/mmsegmentation.svg)](https://github.com/open-mmlab/mmsegmentation/blob/main/LICENSE) +[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmsegmentation.svg)](https://github.com/open-mmlab/mmsegmentation/issues) +[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmsegmentation.svg)](https://github.com/open-mmlab/mmsegmentation/issues) +[![Open in OpenXLab](https://cdn-static.openxlab.org.cn/app-center/openxlab_demo.svg)](https://openxlab.org.cn/apps?search=mmseg) + +Documentation: + +English | [็ฎ€ไฝ“ไธญๆ–‡](README_zh-CN.md) + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +## Introduction + +MMSegmentation is an open source semantic segmentation toolbox based on PyTorch. +It is a part of the OpenMMLab project. + +The [main](https://github.com/open-mmlab/mmsegmentation/tree/main) branch works with PyTorch 1.6+. + +### ๐ŸŽ‰ Introducing MMSegmentation v1.0.0 ๐ŸŽ‰ + +We are thrilled to announce the official release of MMSegmentation's latest version! For this new release, the [main](https://github.com/open-mmlab/mmsegmentation/tree/main) branch serves as the primary branch, while the development branch is [dev-1.x](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x). The stable branch for the previous release remains as the [0.x](https://github.com/open-mmlab/mmsegmentation/tree/0.x) branch. Please note that the [master](https://github.com/open-mmlab/mmsegmentation/tree/master) branch will only be maintained for a limited time before being removed. We encourage you to be mindful of branch selection and updates during use. Thank you for your unwavering support and enthusiasm, and let's work together to make MMSegmentation even more robust and powerful! ๐Ÿ’ช + +MMSegmentation v1.x brings remarkable improvements over the 0.x release, offering a more flexible and feature-packed experience. To utilize the new features in v1.x, we kindly invite you to consult our detailed [๐Ÿ“š migration guide](https://mmsegmentation.readthedocs.io/en/latest/migration/interface.html), which will help you seamlessly transition your projects. Your support is invaluable, and we eagerly await your feedback! + +![demo image](resources/seg_demo.gif) + +### Major features + +- **Unified Benchmark** + + We provide a unified benchmark toolbox for various semantic segmentation methods. + +- **Modular Design** + + We decompose the semantic segmentation framework into different components and one can easily construct a customized semantic segmentation framework by combining different modules. + +- **Support of multiple methods out of box** + + The toolbox directly supports popular and contemporary semantic segmentation frameworks, *e.g.* PSPNet, DeepLabV3, PSANet, DeepLabV3+, etc. + +- **High efficiency** + + The training speed is faster than or comparable to other codebases. + +## What's New + +v1.2.0 was released on 10/12/2023, from 1.1.0 to 1.2.0, we have added or updated the following features: + +### Highlights + +- Support for the open-vocabulary semantic segmentation algorithm [SAN](configs/san/README.md) + +- Support monocular depth estimation task, please refer to [VPD](configs/vpd/README.md) and [Adabins](projects/Adabins/README.md) for more details. + + ![depth estimation](https://github.com/open-mmlab/mmsegmentation/assets/15952744/07afd0e9-8ace-4a00-aa1e-5bf0ca92dcbc) + +- Add new projects: open-vocabulary semantic segmentation algorithm [CAT-Seg](projects/CAT-Seg/README.md), real-time semantic segmentation algofithm [PP-MobileSeg](projects/pp_mobileseg/README.md) + +## Installation + +Please refer to [get_started.md](docs/en/get_started.md#installation) for installation and [dataset_prepare.md](docs/en/user_guides/2_dataset_prepare.md#prepare-datasets) for dataset preparation. + +## Get Started + +Please see [Overview](docs/en/overview.md) for the general introduction of MMSegmentation. + +Please see [user guides](https://mmsegmentation.readthedocs.io/en/latest/user_guides/index.html#) for the basic usage of MMSegmentation. +There are also [advanced tutorials](https://mmsegmentation.readthedocs.io/en/latest/advanced_guides/index.html) for in-depth understanding of mmseg design and implementation . + +A Colab tutorial is also provided. You may preview the notebook [here](demo/MMSegmentation_Tutorial.ipynb) or directly [run](https://colab.research.google.com/github/open-mmlab/mmsegmentation/blob/main/demo/MMSegmentation_Tutorial.ipynb) on Colab. + +To migrate from MMSegmentation 0.x, please refer to [migration](docs/en/migration). + +## Tutorial + +
+ MMSegmentation Tutorials +
+ + + + + + + + + + + + + + + +
+ Get Started + + MMSeg Basic Tutorial + + MMSeg Detail Tutorial + + MMSeg Development Tutorial +
+ + + + + + + +
+ +## Benchmark and model zoo + +Results and models are available in the [model zoo](docs/en/model_zoo.md). + +
+ Overview +
+ + + + + + + + + + + + + + + + +
+ Supported backbones + + Supported methods + + Supported Head + + Supported datasets + + Other +
+ + + + + + + + + +
+ +Please refer to [FAQ](docs/en/notes/faq.md) for frequently asked questions. + +## Projects + +[Here](projects/README.md) are some implementations of SOTA models and solutions built on MMSegmentation, which are supported and maintained by community users. These projects demonstrate the best practices based on MMSegmentation for research and product development. We welcome and appreciate all the contributions to OpenMMLab ecosystem. + +## Contributing + +We appreciate all contributions to improve MMSegmentation. Please refer to [CONTRIBUTING.md](.github/CONTRIBUTING.md) for the contributing guideline. + +## Acknowledgement + +MMSegmentation is an open source project that welcome any contribution and feedback. +We wish that the toolbox and benchmark could serve the growing research +community by providing a flexible as well as standardized toolkit to reimplement existing methods +and develop their own new semantic segmentation methods. + +## Citation + +If you find this project useful in your research, please consider cite: + +```bibtex +@misc{mmseg2020, + title={{MMSegmentation}: OpenMMLab Semantic Segmentation Toolbox and Benchmark}, + author={MMSegmentation Contributors}, + howpublished = {\url{https://github.com/open-mmlab/mmsegmentation}}, + year={2020} +} +``` + +## License + +This project is released under the [Apache 2.0 license](LICENSE). + +## OpenMMLab Family + +- [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab foundational library for training deep learning models. +- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab foundational library for computer vision. +- [MMPreTrain](https://github.com/open-mmlab/mmpretrain): OpenMMLab pre-training toolbox and benchmark. +- [MMagic](https://github.com/open-mmlab/mmagic): Open**MM**Lab **A**dvanced, **G**enerative and **I**ntelligent **C**reation toolbox. +- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab detection toolbox and benchmark. +- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO series toolbox and benchmark. +- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection. +- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab rotated object detection toolbox and benchmark. +- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark. +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab semantic segmentation toolbox and benchmark. +- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab text detection, recognition, and understanding toolbox. +- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab pose estimation toolbox and benchmark. +- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 3D human parametric model toolbox and benchmark. +- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab fewshot learning toolbox and benchmark. +- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark. +- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark. +- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab Model Deployment Framework. +- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab model compression toolbox and benchmark. +- [MIM](https://github.com/open-mmlab/mim): MIM installs OpenMMLab packages. +- [Playground](https://github.com/open-mmlab/playground): A central hub for gathering and showcasing amazing projects built upon OpenMMLab. diff --git a/mmsegmentation/README_zh-CN.md b/mmsegmentation/README_zh-CN.md new file mode 100644 index 0000000..e047759 --- /dev/null +++ b/mmsegmentation/README_zh-CN.md @@ -0,0 +1,426 @@ +
+ +
 
+
+ OpenMMLab ๅฎ˜็ฝ‘ + + + HOT + + +      + OpenMMLab ๅผ€ๆ”พๅนณๅฐ + + + TRY IT OUT + + +
+
 
+ +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mmsegmentation)](https://pypi.org/project/mmsegmentation/) +[![PyPI](https://img.shields.io/pypi/v/mmsegmentation)](https://pypi.org/project/mmsegmentation) +[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmsegmentation.readthedocs.io/zh_CN/latest/) +[![badge](https://github.com/open-mmlab/mmsegmentation/workflows/build/badge.svg)](https://github.com/open-mmlab/mmsegmentation/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmsegmentation/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmsegmentation) +[![license](https://img.shields.io/github/license/open-mmlab/mmsegmentation.svg)](https://github.com/open-mmlab/mmsegmentation/blob/main/LICENSE) +[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmsegmentation.svg)](https://github.com/open-mmlab/mmsegmentation/issues) +[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmsegmentation.svg)](https://github.com/open-mmlab/mmsegmentation/issues) +[![Open in OpenXLab](https://cdn-static.openxlab.org.cn/app-center/openxlab_demo.svg)](https://openxlab.org.cn/apps?search=mmseg) + +ๆ–‡ๆกฃ: + +[English](README.md) | ็ฎ€ไฝ“ไธญๆ–‡ + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +## ็ฎ€ไป‹ + +MMSegmentation ๆ˜ฏไธ€ไธชๅŸบไบŽ PyTorch ็š„่ฏญไน‰ๅˆ†ๅ‰ฒๅผ€ๆบๅทฅๅ…ท็ฎฑใ€‚ๅฎƒๆ˜ฏ OpenMMLab ้กน็›ฎ็š„ไธ€้ƒจๅˆ†ใ€‚ + +[main](https://github.com/open-mmlab/mmsegmentation/tree/main) ๅˆ†ๆ”ฏไปฃ็ ็›ฎๅ‰ๆ”ฏๆŒ PyTorch 1.6 ไปฅไธŠ็š„็‰ˆๆœฌใ€‚ + +### ๐ŸŽ‰ MMSegmentation v1.0.0 ็ฎ€ไป‹ ๐ŸŽ‰ + +ๆˆ‘ไปฌ้žๅธธ้ซ˜ๅ…ดๅœฐๅฎฃๅธƒ MMSegmentation ๆœ€ๆ–ฐ็‰ˆๆœฌ็š„ๆญฃๅผๅ‘ๅธƒ๏ผๅœจ่ฟ™ไธชๆ–ฐ็‰ˆๆœฌไธญ๏ผŒไธป่ฆๅˆ†ๆ”ฏๆ˜ฏ [main](https://github.com/open-mmlab/mmsegmentation/tree/main) ๅˆ†ๆ”ฏ๏ผŒๅผ€ๅ‘ๅˆ†ๆ”ฏๆ˜ฏ [dev-1.x](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x)ใ€‚่€Œไน‹ๅ‰็‰ˆๆœฌ็š„็จณๅฎšๅˆ†ๆ”ฏไฟ็•™ไธบ [0.x](https://github.com/open-mmlab/mmsegmentation/tree/0.x) ๅˆ†ๆ”ฏใ€‚่ฏทๆณจๆ„๏ผŒ[master](https://github.com/open-mmlab/mmsegmentation/tree/master) ๅˆ†ๆ”ฏๅฐ†ๅชๅœจๆœ‰้™็š„ๆ—ถ้—ดๅ†…็ปดๆŠค๏ผŒ็„ถๅŽๅฐ†่ขซๅˆ ้™คใ€‚ๆˆ‘ไปฌ้ผ“ๅŠฑๆ‚จๅœจไฝฟ็”จ่ฟ‡็จ‹ไธญๆณจๆ„ๅˆ†ๆ”ฏ้€‰ๆ‹ฉๅ’Œๆ›ดๆ–ฐใ€‚ๆ„Ÿ่ฐขๆ‚จไธ€ๅฆ‚ๆ—ขๅพ€็š„ๆ”ฏๆŒๅ’Œ็ƒญๆƒ…๏ผŒ่ฎฉๆˆ‘ไปฌๅ…ฑๅŒๅŠชๅŠ›๏ผŒไฝฟ MMSegmentation ๅ˜ๅพ—ๆ›ดๅŠ ๅฅๅฃฎๅ’Œๅผบๅคง๏ผ๐Ÿ’ช + +MMSegmentation v1.x ๅœจ 0.x ็‰ˆๆœฌ็š„ๅŸบ็ก€ไธŠๆœ‰ไบ†ๆ˜พ่‘—็š„ๆๅ‡๏ผŒๆไพ›ไบ†ๆ›ดๅŠ ็ตๆดปๅ’ŒๅŠŸ่ƒฝไธฐๅฏŒ็š„ไฝ“้ชŒใ€‚ไธบไบ†ๆ›ดๅฅฝไฝฟ็”จ v1.x ไธญ็š„ๆ–ฐๅŠŸ่ƒฝ๏ผŒๆˆ‘ไปฌ่ฏšๆŒš้‚€่ฏทๆ‚จๆŸฅ้˜…ๆˆ‘ไปฌ่ฏฆ็ป†็š„ [๐Ÿ“š ่ฟ็งปๆŒ‡ๅ—](https://mmsegmentation.readthedocs.io/zh_CN/latest/migration/interface.html)๏ผŒไปฅๅธฎๅŠฉๆ‚จๆ— ็ผๅœฐ่ฟ‡ๆธกๆ‚จ็š„้กน็›ฎใ€‚ๆ‚จ็š„ๆ”ฏๆŒๅฏนๆˆ‘ไปฌๆฅ่ฏด้žๅธธๅฎ่ดต๏ผŒๆˆ‘ไปฌ็ƒญๅˆ‡ๆœŸๅพ…ๆ‚จ็š„ๅ้ฆˆ๏ผ + +![็คบไพ‹ๅ›พ็‰‡](resources/seg_demo.gif) + +### ไธป่ฆ็‰นๆ€ง + +- **็ปŸไธ€็š„ๅŸบๅ‡†ๅนณๅฐ** + + ๆˆ‘ไปฌๅฐ†ๅ„็งๅ„ๆ ท็š„่ฏญไน‰ๅˆ†ๅ‰ฒ็ฎ—ๆณ•้›†ๆˆๅˆฐไบ†ไธ€ไธช็ปŸไธ€็š„ๅทฅๅ…ท็ฎฑ๏ผŒ่ฟ›่กŒๅŸบๅ‡†ๆต‹่ฏ•ใ€‚ + +- **ๆจกๅ—ๅŒ–่ฎพ่ฎก** + + MMSegmentation ๅฐ†ๅˆ†ๅ‰ฒๆก†ๆžถ่งฃ่€ฆๆˆไธๅŒ็š„ๆจกๅ—็ป„ไปถ๏ผŒ้€š่ฟ‡็ป„ๅˆไธๅŒ็š„ๆจกๅ—็ป„ไปถ๏ผŒ็”จๆˆทๅฏไปฅไพฟๆทๅœฐๆž„ๅปบ่‡ชๅฎšไน‰็š„ๅˆ†ๅ‰ฒๆจกๅž‹ใ€‚ + +- **ไธฐๅฏŒ็š„ๅณๆ’ๅณ็”จ็š„็ฎ—ๆณ•ๅ’Œๆจกๅž‹** + + MMSegmentation ๆ”ฏๆŒไบ†ไผ—ๅคšไธปๆต็š„ๅ’Œๆœ€ๆ–ฐ็š„ๆฃ€ๆต‹็ฎ—ๆณ•๏ผŒไพ‹ๅฆ‚ PSPNet๏ผŒDeepLabV3๏ผŒPSANet๏ผŒDeepLabV3+ ็ญ‰. + +- **้€Ÿๅบฆๅฟซ** + + ่ฎญ็ปƒ้€Ÿๅบฆๆฏ”ๅ…ถไป–่ฏญไน‰ๅˆ†ๅ‰ฒไปฃ็ ๅบ“ๆ›ดๅฟซๆˆ–่€…็›ธๅฝ“ใ€‚ + +## ๆ›ดๆ–ฐๆ—ฅๅฟ— + +ๆœ€ๆ–ฐ็‰ˆๆœฌ v1.2.0 ๅœจ 2023.10.12 ๅ‘ๅธƒใ€‚ +ๅฆ‚ๆžœๆƒณไบ†่งฃๆ›ดๅคš็‰ˆๆœฌๆ›ดๆ–ฐ็ป†่Š‚ๅ’ŒๅŽ†ๅฒไฟกๆฏ๏ผŒ่ฏท้˜…่ฏป[ๆ›ดๆ–ฐๆ—ฅๅฟ—](docs/en/notes/changelog.md)ใ€‚ + +## ๅฎ‰่ฃ… + +่ฏทๅ‚่€ƒ[ๅฟซ้€Ÿๅ…ฅ้—จๆ–‡ๆกฃ](docs/zh_cn/get_started.md#installation)่ฟ›่กŒๅฎ‰่ฃ…๏ผŒๅ‚่€ƒ[ๆ•ฐๆฎ้›†ๅ‡†ๅค‡](docs/zh_cn/user_guides/2_dataset_prepare.md)ๅค„็†ๆ•ฐๆฎใ€‚ + +## ๅฟซ้€Ÿๅ…ฅ้—จ + +่ฏทๅ‚่€ƒ[ๆฆ‚่ฟฐ](docs/zh_cn/overview.md)ๅฏน MMSegmetation ่ฟ›่กŒๅˆๆญฅไบ†่งฃ + +่ฏทๅ‚่€ƒ[็”จๆˆทๆŒ‡ๅ—](https://mmsegmentation.readthedocs.io/zh_CN/latest/user_guides/index.html)ไบ†่งฃ mmseg ็š„ๅŸบๆœฌไฝฟ็”จ๏ผŒไปฅๅŠ[่ฟ›้˜ถๆŒ‡ๅ—](https://mmsegmentation.readthedocs.io/zh_CN/latest/advanced_guides/index.html)ๆทฑๅ…ฅไบ†่งฃ mmseg ่ฎพ่ฎกๅ’Œไปฃ็ ๅฎž็Žฐใ€‚ + +ๅŒๆ—ถ๏ผŒๆˆ‘ไปฌๆไพ›ไบ† Colab ๆ•™็จ‹ใ€‚ไฝ ๅฏไปฅๅœจ[่ฟ™้‡Œ](demo/MMSegmentation_Tutorial.ipynb)ๆต่งˆๆ•™็จ‹๏ผŒๆˆ–่€…็›ดๆŽฅๅœจ Colab ไธŠ[่ฟ่กŒ](https://colab.research.google.com/github/open-mmlab/mmsegmentation/blob/main/demo/MMSegmentation_Tutorial.ipynb)ใ€‚ + +่‹ฅ้œ€่ฆๅฐ† 0.x ็‰ˆๆœฌ็š„ไปฃ็ ่ฟ็งป่‡ณๆ–ฐ็‰ˆ๏ผŒ่ฏทๅ‚่€ƒ[่ฟ็งปๆ–‡ๆกฃ](docs/zh_cn/migration)ใ€‚ + +## ๆ•™็จ‹ๆ–‡ๆกฃ + +
+ mmsegmentation ๆ•™็จ‹ๆ–‡ๆกฃ +
+ + + + + + + + + + + + + + + +
+ ๅผ€ๅฏ MMSeg ไน‹ๆ—… + + MMSeg ๅฟซ้€Ÿๅ…ฅ้—จๆ•™็จ‹ + + MMSeg ็ป†่Š‚ไป‹็ป + + MMSeg ๅผ€ๅ‘ๆ•™็จ‹ +
+ + + + + + + +
+ +## ๅŸบๅ‡†ๆต‹่ฏ•ๅ’Œๆจกๅž‹ๅบ“ + +ๆต‹่ฏ•็ป“ๆžœๅ’Œๆจกๅž‹ๅฏไปฅๅœจ[ๆจกๅž‹ๅบ“](docs/zh_cn/model_zoo.md)ไธญๆ‰พๅˆฐใ€‚ + +
+ ๆฆ‚่งˆ +
+ + + + + + + + + + + + + + + + +
+ ๅทฒๆ”ฏๆŒ็š„ไธปๅนฒ็ฝ‘็ปœ + + ๅทฒๆ”ฏๆŒ็š„็ฎ—ๆณ•ๆžถๆž„ + + ๅทฒๆ”ฏๆŒ็š„ๅˆ†ๅ‰ฒๅคด + + ๅทฒๆ”ฏๆŒ็š„ๆ•ฐๆฎ้›† + + ๅ…ถไป– +
+ + + + + + + + + +
+ +ๅฆ‚ๆžœ้‡ๅˆฐ้—ฎ้ข˜๏ผŒ่ฏทๅ‚่€ƒ [ๅธธ่ง้—ฎ้ข˜่งฃ็ญ”](docs/zh_cn/notes/faq.md)ใ€‚ + +## ็คพๅŒบ้กน็›ฎ + +[่ฟ™้‡Œ](projects/README.md)ๆœ‰ไธ€ไบ›็”ฑ็คพๅŒบ็”จๆˆทๆ”ฏๆŒๅ’Œ็ปดๆŠค็š„ๅŸบไบŽ MMSegmentation ็š„ SOTA ๆจกๅž‹ๅ’Œ่งฃๅ†ณๆ–นๆกˆ็š„ๅฎž็Žฐใ€‚่ฟ™ไบ›้กน็›ฎๅฑ•็คบไบ†ๅŸบไบŽ MMSegmentation ็š„็ ”็ฉถๅ’Œไบงๅ“ๅผ€ๅ‘็š„ๆœ€ไฝณๅฎž่ทตใ€‚ +ๆˆ‘ไปฌๆฌข่ฟŽๅนถๆ„Ÿ่ฐขๅฏน OpenMMLab ็”Ÿๆ€็ณป็ปŸ็š„ๆ‰€ๆœ‰่ดก็Œฎใ€‚ + +## ่ดก็ŒฎๆŒ‡ๅ— + +ๆˆ‘ไปฌๆ„Ÿ่ฐขๆ‰€ๆœ‰็š„่ดก็Œฎ่€…ไธบๆ”น่ฟ›ๅ’Œๆๅ‡ MMSegmentation ๆ‰€ไฝœๅ‡บ็š„ๅŠชๅŠ›ใ€‚่ฏทๅ‚่€ƒ[่ดก็ŒฎๆŒ‡ๅ—](.github/CONTRIBUTING.md)ๆฅไบ†่งฃๅ‚ไธŽ้กน็›ฎ่ดก็Œฎ็š„็›ธๅ…ณๆŒ‡ๅผ•ใ€‚ + +## ่‡ด่ฐข + +MMSegmentation ๆ˜ฏไธ€ไธช็”ฑๆฅ่‡ชไธๅŒ้ซ˜ๆ กๅ’Œไผไธš็š„็ ”ๅ‘ไบบๅ‘˜ๅ…ฑๅŒๅ‚ไธŽ่ดก็Œฎ็š„ๅผ€ๆบ้กน็›ฎใ€‚ๆˆ‘ไปฌๆ„Ÿ่ฐขๆ‰€ๆœ‰ไธบ้กน็›ฎๆไพ›็ฎ—ๆณ•ๅค็Žฐๅ’Œๆ–ฐๅŠŸ่ƒฝๆ”ฏๆŒ็š„่ดก็Œฎ่€…๏ผŒไปฅๅŠๆไพ›ๅฎ่ดตๅ้ฆˆ็š„็”จๆˆทใ€‚ๆˆ‘ไปฌๅธŒๆœ›่ฟ™ไธชๅทฅๅ…ท็ฎฑๅ’ŒๅŸบๅ‡†ๆต‹่ฏ•ๅฏไปฅไธบ็คพๅŒบๆไพ›็ตๆดป็š„ไปฃ็ ๅทฅๅ…ท๏ผŒไพ›็”จๆˆทๅค็Žฐๅทฒๆœ‰็ฎ—ๆณ•ๅนถๅผ€ๅ‘่‡ชๅทฑ็š„ๆ–ฐๆจกๅž‹๏ผŒไปŽ่€Œไธๆ–ญไธบๅผ€ๆบ็คพๅŒบๆไพ›่ดก็Œฎใ€‚ + +## ๅผ•็”จ + +ๅฆ‚ๆžœไฝ ่ง‰ๅพ—ๆœฌ้กน็›ฎๅฏนไฝ ็š„็ ”็ฉถๅทฅไฝœๆœ‰ๆ‰€ๅธฎๅŠฉ๏ผŒ่ฏทๅ‚่€ƒๅฆ‚ไธ‹ bibtex ๅผ•็”จ MMSegmentationใ€‚ + +```bibtex +@misc{mmseg2020, + title={{MMSegmentation}: OpenMMLab Semantic Segmentation Toolbox and Benchmark}, + author={MMSegmentation Contributors}, + howpublished = {\url{https://github.com/open-mmlab/mmsegmentation}}, + year={2020} +} +``` + +## ๅผ€ๆบ่ฎธๅฏ่ฏ + +่ฏฅ้กน็›ฎ้‡‡็”จ [Apache 2.0 ๅผ€ๆบ่ฎธๅฏ่ฏ](LICENSE)ใ€‚ + +## OpenMMLab ็š„ๅ…ถไป–้กน็›ฎ + +- [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab ๆทฑๅบฆๅญฆไน ๆจกๅž‹่ฎญ็ปƒๅŸบ็ก€ๅบ“ +- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab ่ฎก็ฎ—ๆœบ่ง†่ง‰ๅŸบ็ก€ๅบ“ +- [MMPreTrain](https://github.com/open-mmlab/mmpretrain): OpenMMLab ๆทฑๅบฆๅญฆไน ้ข„่ฎญ็ปƒๅทฅๅ…ท็ฎฑ +- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab ๆ–ฐไธ€ไปฃไบบๅทฅๆ™บ่ƒฝๅ†…ๅฎน็”Ÿๆˆ๏ผˆAIGC๏ผ‰ๅทฅๅ…ท็ฎฑ +- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab ็›ฎๆ ‡ๆฃ€ๆต‹ๅทฅๅ…ท็ฎฑ +- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO ็ณปๅˆ—ๅทฅๅ…ท็ฎฑไธŽๆต‹่ฏ•ๅŸบๅ‡† +- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab ๆ–ฐไธ€ไปฃ้€š็”จ 3D ็›ฎๆ ‡ๆฃ€ๆต‹ๅนณๅฐ +- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab ๆ—‹่ฝฌๆก†ๆฃ€ๆต‹ๅทฅๅ…ท็ฎฑไธŽๆต‹่ฏ•ๅŸบๅ‡† +- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab ไธ€ไฝ“ๅŒ–่ง†้ข‘็›ฎๆ ‡ๆ„Ÿ็Ÿฅๅนณๅฐ +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab ่ฏญไน‰ๅˆ†ๅ‰ฒๅทฅๅ…ท็ฎฑ +- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab ๅ…จๆต็จ‹ๆ–‡ๅญ—ๆฃ€ๆต‹่ฏ†ๅˆซ็†่งฃๅทฅๅ…ทๅŒ… +- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab ๅงฟๆ€ไผฐ่ฎกๅทฅๅ…ท็ฎฑ +- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab ไบบไฝ“ๅ‚ๆ•ฐๅŒ–ๆจกๅž‹ๅทฅๅ…ท็ฎฑไธŽๆต‹่ฏ•ๅŸบๅ‡† +- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab ๅฐ‘ๆ ทๆœฌๅญฆไน ๅทฅๅ…ท็ฎฑไธŽๆต‹่ฏ•ๅŸบๅ‡† +- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab ๆ–ฐไธ€ไปฃ่ง†้ข‘็†่งฃๅทฅๅ…ท็ฎฑ +- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab ๅ…‰ๆตไผฐ่ฎกๅทฅๅ…ท็ฎฑไธŽๆต‹่ฏ•ๅŸบๅ‡† +- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab ๆจกๅž‹้ƒจ็ฝฒๆก†ๆžถ +- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab ๆจกๅž‹ๅŽ‹็ผฉๅทฅๅ…ท็ฎฑไธŽๆต‹่ฏ•ๅŸบๅ‡† +- [MIM](https://github.com/open-mmlab/mim): OpenMMLab ้กน็›ฎใ€็ฎ—ๆณ•ใ€ๆจกๅž‹็š„็ปŸไธ€ๅ…ฅๅฃ +- [Playground](https://github.com/open-mmlab/playground): ๆ”ถ้›†ๅ’Œๅฑ•็คบ OpenMMLab ็›ธๅ…ณ็š„ๅ‰ๆฒฟใ€ๆœ‰่ถฃ็š„็คพๅŒบ้กน็›ฎ + +## ๆฌข่ฟŽๅŠ ๅ…ฅ OpenMMLab ็คพๅŒบ + +ๆ‰ซๆไธ‹ๆ–น็š„ไบŒ็ปด็ ๅฏๅ…ณๆณจ OpenMMLab ๅ›ข้˜Ÿ็š„ [็ŸฅไนŽๅฎ˜ๆ–น่ดฆๅท](https://www.zhihu.com/people/openmmlab)๏ผŒๆ‰ซๆไธ‹ๆ–นๅพฎไฟกไบŒ็ปด็ ๆทปๅŠ ๅ–ตๅ–ตๅฅฝๅ‹๏ผŒ่ฟ›ๅ…ฅ MMSegmentation ๅพฎไฟกไบคๆต็คพ็พคใ€‚ใ€ๅŠ ๅฅฝๅ‹็”ณ่ฏทๆ ผๅผ๏ผš็ ”็ฉถๆ–นๅ‘+ๅœฐๅŒบ+ๅญฆๆ ก/ๅ…ฌๅธ+ๅง“ๅใ€‘ + +
+ +
+ +ๆˆ‘ไปฌไผšๅœจ OpenMMLab ็คพๅŒบไธบๅคงๅฎถ + +- ๐Ÿ“ข ๅˆ†ไบซ AI ๆก†ๆžถ็š„ๅ‰ๆฒฟๆ ธๅฟƒๆŠ€ๆœฏ +- ๐Ÿ’ป ่งฃ่ฏป PyTorch ๅธธ็”จๆจกๅ—ๆบ็  +- ๐Ÿ“ฐ ๅ‘ๅธƒ OpenMMLab ็š„็›ธๅ…ณๆ–ฐ้—ป +- ๐Ÿš€ ไป‹็ป OpenMMLab ๅผ€ๅ‘็š„ๅ‰ๆฒฟ็ฎ—ๆณ• +- ๐Ÿƒ ่Žทๅ–ๆ›ด้ซ˜ๆ•ˆ็š„้—ฎ้ข˜็ญ”็–‘ๅ’Œๆ„่งๅ้ฆˆ +- ๐Ÿ”ฅ ๆไพ›ไธŽๅ„่กŒๅ„ไธšๅผ€ๅ‘่€…ๅ……ๅˆ†ไบคๆต็š„ๅนณๅฐ + +ๅนฒ่ดงๆปกๆปก ๐Ÿ“˜๏ผŒ็ญ‰ไฝ ๆฅๆ’ฉ ๐Ÿ’—๏ผŒOpenMMLab ็คพๅŒบๆœŸๅพ…ๆ‚จ็š„ๅŠ ๅ…ฅ ๐Ÿ‘ฌ diff --git a/mmsegmentation/configs/_base_/datasets/ade20k.py b/mmsegmentation/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000..48340d1 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/ade20k.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/ade20k_640x640.py b/mmsegmentation/configs/_base_/datasets/ade20k_640x640.py new file mode 100644 index 0000000..c1f642d --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/ade20k_640x640.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +crop_size = (640, 640) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2560, 640), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2560, 640), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/bdd100k.py b/mmsegmentation/configs/_base_/datasets/bdd100k.py new file mode 100644 index 0000000..24cec69 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/bdd100k.py @@ -0,0 +1,70 @@ +# dataset settings +dataset_type = 'BDD100KDataset' +data_root = 'data/bdd100k/' + +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=2, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/10k/train', + seg_map_path='labels/sem_seg/masks/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/10k/val', + seg_map_path='labels/sem_seg/masks/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/chase_db1.py b/mmsegmentation/configs/_base_/datasets/chase_db1.py new file mode 100644 index 0000000..ed47c2d --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/chase_db1.py @@ -0,0 +1,75 @@ +# dataset settings +dataset_type = 'ChaseDB1Dataset' +data_root = 'data/CHASE_DB1' +img_scale = (960, 999) +crop_size = (128, 128) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] + +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', + seg_map_path='annotations/training'), + pipeline=train_pipeline))) + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/cityscapes.py b/mmsegmentation/configs/_base_/datasets/cityscapes.py new file mode 100644 index 0000000..b63a4cd --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/cityscapes.py @@ -0,0 +1,67 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=2, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/cityscapes_1024x1024.py b/mmsegmentation/configs/_base_/datasets/cityscapes_1024x1024.py new file mode 100644 index 0000000..72be307 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/cityscapes_1024x1024.py @@ -0,0 +1,29 @@ +_base_ = './cityscapes.py' +crop_size = (1024, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/cityscapes_768x768.py b/mmsegmentation/configs/_base_/datasets/cityscapes_768x768.py new file mode 100644 index 0000000..fcee014 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/cityscapes_768x768.py @@ -0,0 +1,29 @@ +_base_ = './cityscapes.py' +crop_size = (768, 768) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2049, 1025), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2049, 1025), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/cityscapes_769x769.py b/mmsegmentation/configs/_base_/datasets/cityscapes_769x769.py new file mode 100644 index 0000000..ae40ac8 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/cityscapes_769x769.py @@ -0,0 +1,29 @@ +_base_ = './cityscapes.py' +crop_size = (769, 769) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2049, 1025), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2049, 1025), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/cityscapes_832x832.py b/mmsegmentation/configs/_base_/datasets/cityscapes_832x832.py new file mode 100644 index 0000000..0254580 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/cityscapes_832x832.py @@ -0,0 +1,29 @@ +_base_ = './cityscapes.py' +crop_size = (832, 832) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/coco-stuff10k.py b/mmsegmentation/configs/_base_/datasets/coco-stuff10k.py new file mode 100644 index 0000000..5d6bb12 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/coco-stuff10k.py @@ -0,0 +1,69 @@ +# dataset settings +dataset_type = 'COCOStuffDataset' +data_root = 'data/coco_stuff10k' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + reduce_zero_label=True, + data_prefix=dict( + img_path='images/train2014', seg_map_path='annotations/train2014'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + reduce_zero_label=True, + data_prefix=dict( + img_path='images/test2014', seg_map_path='annotations/test2014'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/coco-stuff164k.py b/mmsegmentation/configs/_base_/datasets/coco-stuff164k.py new file mode 100644 index 0000000..a9b9d90 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/coco-stuff164k.py @@ -0,0 +1,67 @@ +# dataset settings +dataset_type = 'COCOStuffDataset' +data_root = 'data/coco_stuff164k' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/train2017', seg_map_path='annotations/train2017'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/val2017', seg_map_path='annotations/val2017'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/drive.py b/mmsegmentation/configs/_base_/datasets/drive.py new file mode 100644 index 0000000..6a3dd82 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/drive.py @@ -0,0 +1,73 @@ +# dataset settings +dataset_type = 'DRIVEDataset' +data_root = 'data/DRIVE' +img_scale = (584, 565) +crop_size = (64, 64) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', + seg_map_path='annotations/training'), + pipeline=train_pipeline))) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/hrf.py b/mmsegmentation/configs/_base_/datasets/hrf.py new file mode 100644 index 0000000..353d070 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/hrf.py @@ -0,0 +1,73 @@ +# dataset settings +dataset_type = 'HRFDataset' +data_root = 'data/HRF' +img_scale = (2336, 3504) +crop_size = (256, 256) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', + seg_map_path='annotations/training'), + pipeline=train_pipeline))) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/hsi_drive.py b/mmsegmentation/configs/_base_/datasets/hsi_drive.py new file mode 100644 index 0000000..2d08e2d --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/hsi_drive.py @@ -0,0 +1,53 @@ +train_pipeline = [ + dict(type='LoadImageFromNpyFile'), + dict(type='LoadAnnotations'), + dict(type='RandomCrop', crop_size=(192, 384)), + dict(type='PackSegInputs') +] + +test_pipeline = [ + dict(type='LoadImageFromNpyFile'), + dict(type='RandomCrop', crop_size=(192, 384)), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] + +train_dataloader = dict( + batch_size=4, + num_workers=1, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='HSIDrive20Dataset', + data_root='data/HSIDrive20', + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) + +val_dataloader = dict( + batch_size=1, + num_workers=1, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='HSIDrive20Dataset', + data_root='data/HSIDrive20', + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) + +test_dataloader = dict( + batch_size=1, + num_workers=1, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='HSIDrive20Dataset', + data_root='data/HSIDrive20', + data_prefix=dict( + img_path='images/test', seg_map_path='annotations/test'), + pipeline=test_pipeline)) + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'], ignore_index=0) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/isaid.py b/mmsegmentation/configs/_base_/datasets/isaid.py new file mode 100644 index 0000000..5cd4309 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/isaid.py @@ -0,0 +1,73 @@ +# dataset settings +dataset_type = 'iSAIDDataset' +data_root = 'data/iSAID' +""" +This crop_size setting is followed by the implementation of +`PointFlow: Flowing Semantics Through Points for Aerial Image +Segmentation `_. +""" + +crop_size = (896, 896) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(896, 896), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(896, 896), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/levir_256x256.py b/mmsegmentation/configs/_base_/datasets/levir_256x256.py new file mode 100644 index 0000000..6e018a5 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/levir_256x256.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'LEVIRCDDataset' +data_root = r'data/LEVIRCD' + +albu_train_transforms = [ + dict(type='RandomBrightnessContrast', p=0.2), + dict(type='HorizontalFlip', p=0.5), + dict(type='VerticalFlip', p=0.5) +] + +train_pipeline = [ + dict(type='LoadMultipleRSImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='Albu', + keymap={ + 'img': 'image', + 'img2': 'image2', + 'gt_seg_map': 'mask' + }, + transforms=albu_train_transforms, + additional_targets={'image2': 'image'}, + bgr_to_rgb=False), + dict(type='ConcatCDInput'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadMultipleRSImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='ConcatCDInput'), + dict(type='PackSegInputs') +] + +tta_pipeline = [ + dict(type='LoadMultipleRSImageFromFile'), + dict( + type='TestTimeAug', + transforms=[[dict(type='LoadAnnotations')], + [dict(type='ConcatCDInput')], + [dict(type='PackSegInputs')]]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='train/A', + img_path2='train/B', + seg_map_path='train/label'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='test/A', img_path2='test/B', seg_map_path='test/label'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/loveda.py b/mmsegmentation/configs/_base_/datasets/loveda.py new file mode 100644 index 0000000..b93bc74 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/loveda.py @@ -0,0 +1,66 @@ +# dataset settings +dataset_type = 'LoveDADataset' +data_root = 'data/loveDA' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(1024, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/mapillary_v1.py b/mmsegmentation/configs/_base_/datasets/mapillary_v1.py new file mode 100644 index 0000000..611aa47 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/mapillary_v1.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'MapillaryDataset_v1' +data_root = 'data/mapillary/' +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='training/images', seg_map_path='training/v1.2/labels'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='validation/images', + seg_map_path='validation/v1.2/labels'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/mapillary_v1_65.py b/mmsegmentation/configs/_base_/datasets/mapillary_v1_65.py new file mode 100644 index 0000000..f594f37 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/mapillary_v1_65.py @@ -0,0 +1,37 @@ +# dataset settings +_base_ = './mapillary_v1.py' +metainfo = dict( + classes=('Bird', 'Ground Animal', 'Curb', 'Fence', 'Guard Rail', 'Barrier', + 'Wall', 'Bike Lane', 'Crosswalk - Plain', 'Curb Cut', 'Parking', + 'Pedestrian Area', 'Rail Track', 'Road', 'Service Lane', + 'Sidewalk', 'Bridge', 'Building', 'Tunnel', 'Person', 'Bicyclist', + 'Motorcyclist', 'Other Rider', 'Lane Marking - Crosswalk', + 'Lane Marking - General', 'Mountain', 'Sand', 'Sky', 'Snow', + 'Terrain', 'Vegetation', 'Water', 'Banner', 'Bench', 'Bike Rack', + 'Billboard', 'Catch Basin', 'CCTV Camera', 'Fire Hydrant', + 'Junction Box', 'Mailbox', 'Manhole', 'Phone Booth', 'Pothole', + 'Street Light', 'Pole', 'Traffic Sign Frame', 'Utility Pole', + 'Traffic Light', 'Traffic Sign (Back)', 'Traffic Sign (Front)', + 'Trash Can', 'Bicycle', 'Boat', 'Bus', 'Car', 'Caravan', + 'Motorcycle', 'On Rails', 'Other Vehicle', 'Trailer', 'Truck', + 'Wheeled Slow', 'Car Mount', 'Ego Vehicle'), + palette=[[165, 42, 42], [0, 192, 0], [196, 196, 196], [190, 153, 153], + [180, 165, 180], [90, 120, 150], [102, 102, 156], [128, 64, 255], + [140, 140, 200], [170, 170, 170], [250, 170, 160], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], [244, 35, 232], + [150, 100, 100], [70, 70, 70], [150, 120, 90], [220, 20, 60], + [255, 0, 0], [255, 0, 100], [255, 0, 200], [200, 128, 128], + [255, 255, 255], [64, 170, 64], [230, 160, 50], [70, 130, 180], + [190, 255, 255], [152, 251, 152], [107, 142, 35], [0, 170, 30], + [255, 255, 128], [250, 0, 30], [100, 140, 180], [220, 220, 220], + [220, 128, 128], [222, 40, 40], [100, 170, 30], [40, 40, 40], + [33, 33, 33], [100, 128, 160], [142, 0, 0], [70, 100, 150], + [210, 170, 100], [153, 153, 153], [128, 128, 128], [0, 0, 80], + [250, 170, 30], [192, 192, 192], [220, 220, 0], [140, 140, 20], + [119, 11, 32], [150, 0, 255], [0, 60, 100], [0, 0, 142], + [0, 0, 90], [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 192], [32, 32, 32], [120, 10, 10]]) + +train_dataloader = dict(dataset=dict(metainfo=metainfo)) +val_dataloader = dict(dataset=dict(metainfo=metainfo)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/_base_/datasets/mapillary_v2.py b/mmsegmentation/configs/_base_/datasets/mapillary_v2.py new file mode 100644 index 0000000..7cb7a95 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/mapillary_v2.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'MapillaryDataset_v2' +data_root = 'data/mapillary/' +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='training/images', seg_map_path='training/v2.0/labels'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='validation/images', + seg_map_path='validation/v2.0/labels'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/nyu.py b/mmsegmentation/configs/_base_/datasets/nyu.py new file mode 100644 index 0000000..74d57c5 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/nyu.py @@ -0,0 +1,67 @@ +# dataset settings +dataset_type = 'NYUDataset' +data_root = 'data/nyu' + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadDepthAnnotation', depth_rescale_factor=1e-3), + dict(type='RandomDepthMix', prob=0.25), + dict(type='RandomFlip', prob=0.5), + dict(type='RandomCrop', crop_size=(480, 480)), + dict( + type='Albu', + transforms=[ + dict(type='RandomBrightnessContrast'), + dict(type='RandomGamma'), + dict(type='HueSaturationValue'), + ]), + dict( + type='PackSegInputs', + meta_keys=('img_path', 'depth_map_path', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'category_id')), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2000, 480), keep_ratio=True), + dict(dict(type='LoadDepthAnnotation', depth_rescale_factor=1e-3)), + dict( + type='PackSegInputs', + meta_keys=('img_path', 'depth_map_path', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'category_id')) +] + +train_dataloader = dict( + batch_size=8, + num_workers=8, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/train', depth_map_path='annotations/train'), + pipeline=train_pipeline)) + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + test_mode=True, + data_prefix=dict( + img_path='images/test', depth_map_path='annotations/test'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict( + type='DepthMetric', + min_depth_eval=0.001, + max_depth_eval=10.0, + crop_type='nyu_crop') +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/nyu_512x512.py b/mmsegmentation/configs/_base_/datasets/nyu_512x512.py new file mode 100644 index 0000000..88e3878 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/nyu_512x512.py @@ -0,0 +1,72 @@ +# dataset settings +dataset_type = 'NYUDataset' +data_root = 'data/nyu' + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadDepthAnnotation', depth_rescale_factor=1e-3), + dict(type='RandomDepthMix', prob=0.25), + dict(type='RandomFlip', prob=0.5), + dict( + type='RandomResize', + scale=(768, 512), + ratio_range=(0.8, 1.5), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(512, 512)), + dict( + type='Albu', + transforms=[ + dict(type='RandomBrightnessContrast'), + dict(type='RandomGamma'), + dict(type='HueSaturationValue'), + ]), + dict( + type='PackSegInputs', + meta_keys=('img_path', 'depth_map_path', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'category_id')), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + dict(dict(type='LoadDepthAnnotation', depth_rescale_factor=1e-3)), + dict( + type='PackSegInputs', + meta_keys=('img_path', 'depth_map_path', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'category_id')) +] + +train_dataloader = dict( + batch_size=8, + num_workers=8, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/train', depth_map_path='annotations/train'), + pipeline=train_pipeline)) + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + test_mode=True, + data_prefix=dict( + img_path='images/test', depth_map_path='annotations/test'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict( + type='DepthMetric', + min_depth_eval=0.001, + max_depth_eval=10.0, + crop_type='nyu_crop') +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/pascal_context.py b/mmsegmentation/configs/_base_/datasets/pascal_context.py new file mode 100644 index 0000000..dfb1f85 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/pascal_context.py @@ -0,0 +1,56 @@ +# dataset settings +dataset_type = 'PascalContextDataset' +data_root = 'data/VOCdevkit/VOC2010/' + +img_scale = (520, 520) +crop_size = (480, 480) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/train.txt', + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/pascal_context_59.py b/mmsegmentation/configs/_base_/datasets/pascal_context_59.py new file mode 100644 index 0000000..7f31043 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/pascal_context_59.py @@ -0,0 +1,72 @@ +# dataset settings +dataset_type = 'PascalContextDataset59' +data_root = 'data/VOCdevkit/VOC2010/' + +img_scale = (520, 520) +crop_size = (480, 480) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/train.txt', + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/pascal_voc12.py b/mmsegmentation/configs/_base_/datasets/pascal_voc12.py new file mode 100644 index 0000000..5235ca9 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/pascal_voc12.py @@ -0,0 +1,69 @@ +# dataset settings +dataset_type = 'PascalVOCDataset' +data_root = 'data/VOCdevkit/VOC2012' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClass'), + ann_file='ImageSets/Segmentation/train.txt', + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClass'), + ann_file='ImageSets/Segmentation/val.txt', + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/pascal_voc12_aug.py b/mmsegmentation/configs/_base_/datasets/pascal_voc12_aug.py new file mode 100644 index 0000000..69c3654 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/pascal_voc12_aug.py @@ -0,0 +1,81 @@ +# dataset settings +dataset_type = 'PascalVOCDataset' +data_root = 'data/VOCdevkit/VOC2012' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Pad', size=crop_size), + dict(type='PackSegInputs') +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +dataset_train = dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='JPEGImages', seg_map_path='SegmentationClass'), + ann_file='ImageSets/Segmentation/train.txt', + pipeline=train_pipeline) + +dataset_aug = dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassAug'), + ann_file='ImageSets/Segmentation/aug.txt', + pipeline=train_pipeline) + +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict(type='ConcatDataset', datasets=[dataset_train, dataset_aug])) + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClass'), + ann_file='ImageSets/Segmentation/val.txt', + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/potsdam.py b/mmsegmentation/configs/_base_/datasets/potsdam.py new file mode 100644 index 0000000..95f6039 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/potsdam.py @@ -0,0 +1,66 @@ +# dataset settings +dataset_type = 'PotsdamDataset' +data_root = 'data/potsdam' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(512, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(512, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/refuge.py b/mmsegmentation/configs/_base_/datasets/refuge.py new file mode 100644 index 0000000..79bb4d4 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/refuge.py @@ -0,0 +1,90 @@ +# dataset settings +dataset_type = 'REFUGEDataset' +data_root = 'data/REFUGE' +train_img_scale = (2056, 2124) +val_img_scale = (1634, 1634) +test_img_scale = (1634, 1634) +crop_size = (512, 512) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=False), + dict( + type='RandomResize', + scale=train_img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +val_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=val_img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=False), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=test_img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=False), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=val_pipeline)) +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/test', seg_map_path='annotations/test'), + pipeline=val_pipeline)) + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/stare.py b/mmsegmentation/configs/_base_/datasets/stare.py new file mode 100644 index 0000000..b7545dc --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/stare.py @@ -0,0 +1,73 @@ +# dataset settings +dataset_type = 'STAREDataset' +data_root = 'data/STARE' +img_scale = (605, 700) +crop_size = (128, 128) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', + seg_map_path='annotations/training'), + pipeline=train_pipeline))) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/synapse.py b/mmsegmentation/configs/_base_/datasets/synapse.py new file mode 100644 index 0000000..8685291 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/synapse.py @@ -0,0 +1,41 @@ +dataset_type = 'SynapseDataset' +data_root = 'data/synapse/' +img_scale = (224, 224) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + dict(type='RandomRotFlip', rotate_prob=0.5, flip_prob=0.5, degree=20), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=6, + num_workers=2, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/datasets/vaihingen.py b/mmsegmentation/configs/_base_/datasets/vaihingen.py new file mode 100644 index 0000000..6c78994 --- /dev/null +++ b/mmsegmentation/configs/_base_/datasets/vaihingen.py @@ -0,0 +1,66 @@ +# dataset settings +dataset_type = 'ISPRSDataset' +data_root = 'data/vaihingen' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(512, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(512, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/_base_/default_runtime.py b/mmsegmentation/configs/_base_/default_runtime.py new file mode 100644 index 0000000..272b4d2 --- /dev/null +++ b/mmsegmentation/configs/_base_/default_runtime.py @@ -0,0 +1,15 @@ +default_scope = 'mmseg' +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +vis_backends = [dict(type='LocalVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +log_processor = dict(by_epoch=False) +log_level = 'INFO' +load_from = None +resume = False + +tta_model = dict(type='SegTTAModel') diff --git a/mmsegmentation/configs/_base_/models/ann_r50-d8.py b/mmsegmentation/configs/_base_/models/ann_r50-d8.py new file mode 100644 index 0000000..a1ef956 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/ann_r50-d8.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ANNHead', + in_channels=[1024, 2048], + in_index=[2, 3], + channels=512, + project_channels=256, + query_scales=(1, ), + key_pool_scales=(1, 3, 6, 8), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/apcnet_r50-d8.py b/mmsegmentation/configs/_base_/models/apcnet_r50-d8.py new file mode 100644 index 0000000..63269f9 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/apcnet_r50-d8.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='APCHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/bisenetv1_r18-d32.py b/mmsegmentation/configs/_base_/models/bisenetv1_r18-d32.py new file mode 100644 index 0000000..2aecb9e --- /dev/null +++ b/mmsegmentation/configs/_base_/models/bisenetv1_r18-d32.py @@ -0,0 +1,76 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='BiSeNetV1', + in_channels=3, + context_channels=(128, 256, 512), + spatial_channels=(64, 64, 64, 128), + out_indices=(0, 1, 2), + out_channels=256, + backbone_cfg=dict( + type='ResNet', + in_channels=3, + depth=18, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + norm_cfg=norm_cfg, + align_corners=False, + init_cfg=None), + decode_head=dict( + type='FCNHead', + in_channels=256, + in_index=0, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=64, + num_convs=1, + num_classes=19, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=128, + channels=64, + num_convs=1, + num_classes=19, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/bisenetv2.py b/mmsegmentation/configs/_base_/models/bisenetv2.py new file mode 100644 index 0000000..ae84512 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/bisenetv2.py @@ -0,0 +1,88 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='BiSeNetV2', + detail_channels=(64, 64, 128), + semantic_channels=(16, 32, 64, 128), + semantic_expansion_ratio=6, + bga_channels=128, + out_indices=(0, 1, 2, 3, 4), + init_cfg=None, + align_corners=False), + decode_head=dict( + type='FCNHead', + in_channels=128, + in_index=0, + channels=1024, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=16, + channels=16, + num_convs=2, + num_classes=19, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=32, + channels=64, + num_convs=2, + num_classes=19, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=64, + channels=256, + num_convs=2, + num_classes=19, + in_index=3, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=128, + channels=1024, + num_convs=2, + num_classes=19, + in_index=4, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/ccnet_r50-d8.py b/mmsegmentation/configs/_base_/models/ccnet_r50-d8.py new file mode 100644 index 0000000..575d8eb --- /dev/null +++ b/mmsegmentation/configs/_base_/models/ccnet_r50-d8.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='CCHead', + in_channels=2048, + in_index=3, + channels=512, + recurrence=2, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/cgnet.py b/mmsegmentation/configs/_base_/models/cgnet.py new file mode 100644 index 0000000..93c6f5b --- /dev/null +++ b/mmsegmentation/configs/_base_/models/cgnet.py @@ -0,0 +1,43 @@ +# model settings +norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[72.39239876, 82.90891754, 73.15835921], + std=[1, 1, 1], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='CGNet', + norm_cfg=norm_cfg, + in_channels=3, + num_channels=(32, 64, 128), + num_blocks=(3, 21), + dilations=(2, 4), + reductions=(8, 16)), + decode_head=dict( + type='FCNHead', + in_channels=256, + in_index=2, + channels=256, + num_convs=0, + concat_input=False, + dropout_ratio=0, + num_classes=19, + norm_cfg=norm_cfg, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + class_weight=[ + 2.5959933, 6.7415504, 3.5354059, 9.8663225, 9.690899, 9.369352, + 10.289121, 9.953208, 4.3097677, 9.490387, 7.674431, 9.396905, + 10.347791, 6.3927646, 10.226669, 10.241062, 10.280587, + 10.396974, 10.055647 + ])), + # model training and testing settings + train_cfg=dict(sampler=None), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/danet_r50-d8.py b/mmsegmentation/configs/_base_/models/danet_r50-d8.py new file mode 100644 index 0000000..8163b3d --- /dev/null +++ b/mmsegmentation/configs/_base_/models/danet_r50-d8.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DAHead', + in_channels=2048, + in_index=3, + channels=512, + pam_channels=64, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/deeplabv3_r50-d8.py b/mmsegmentation/configs/_base_/models/deeplabv3_r50-d8.py new file mode 100644 index 0000000..22efe9a --- /dev/null +++ b/mmsegmentation/configs/_base_/models/deeplabv3_r50-d8.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/deeplabv3_unet_s5-d16.py b/mmsegmentation/configs/_base_/models/deeplabv3_unet_s5-d16.py new file mode 100644 index 0000000..92df52c --- /dev/null +++ b/mmsegmentation/configs/_base_/models/deeplabv3_unet_s5-d16.py @@ -0,0 +1,58 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='ASPPHead', + in_channels=64, + in_index=4, + channels=16, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/mmsegmentation/configs/_base_/models/deeplabv3plus_r50-d8.py b/mmsegmentation/configs/_base_/models/deeplabv3plus_r50-d8.py new file mode 100644 index 0000000..74dbed5 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/deeplabv3plus_r50-d8.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DepthwiseSeparableASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + c1_in_channels=256, + c1_channels=48, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/dmnet_r50-d8.py b/mmsegmentation/configs/_base_/models/dmnet_r50-d8.py new file mode 100644 index 0000000..f66a042 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/dmnet_r50-d8.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DMHead', + in_channels=2048, + in_index=3, + channels=512, + filter_sizes=(1, 3, 5, 7), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/dnl_r50-d8.py b/mmsegmentation/configs/_base_/models/dnl_r50-d8.py new file mode 100644 index 0000000..ee64056 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/dnl_r50-d8.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DNLHead', + in_channels=2048, + in_index=3, + channels=512, + dropout_ratio=0.1, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/dpt_vit-b16.py b/mmsegmentation/configs/_base_/models/dpt_vit-b16.py new file mode 100644 index 0000000..90845b3 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/dpt_vit-b16.py @@ -0,0 +1,39 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='pretrain/vit-b16_p16_224-80ecf9dd.pth', # noqa + backbone=dict( + type='VisionTransformer', + img_size=224, + embed_dims=768, + num_layers=12, + num_heads=12, + out_indices=(2, 5, 8, 11), + final_norm=False, + with_cls_token=True, + output_cls_token=True), + decode_head=dict( + type='DPTHead', + in_channels=(768, 768, 768, 768), + channels=256, + embed_dims=768, + post_process_channels=[96, 192, 384, 768], + num_classes=150, + readout_type='project', + input_transform='multiple_select', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=None, + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) # yapf: disable diff --git a/mmsegmentation/configs/_base_/models/emanet_r50-d8.py b/mmsegmentation/configs/_base_/models/emanet_r50-d8.py new file mode 100644 index 0000000..c55af4f --- /dev/null +++ b/mmsegmentation/configs/_base_/models/emanet_r50-d8.py @@ -0,0 +1,55 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='EMAHead', + in_channels=2048, + in_index=3, + channels=256, + ema_channels=512, + num_bases=64, + num_stages=3, + momentum=0.1, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/encnet_r50-d8.py b/mmsegmentation/configs/_base_/models/encnet_r50-d8.py new file mode 100644 index 0000000..63cec9e --- /dev/null +++ b/mmsegmentation/configs/_base_/models/encnet_r50-d8.py @@ -0,0 +1,56 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='EncHead', + in_channels=[512, 1024, 2048], + in_index=(1, 2, 3), + channels=512, + num_codes=32, + use_se_loss=True, + add_lateral=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_se_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.2)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/erfnet_fcn.py b/mmsegmentation/configs/_base_/models/erfnet_fcn.py new file mode 100644 index 0000000..4d68a72 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/erfnet_fcn.py @@ -0,0 +1,40 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='ERFNet', + in_channels=3, + enc_downsample_channels=(16, 64, 128), + enc_stage_non_bottlenecks=(5, 8), + enc_non_bottleneck_dilations=(2, 4, 8, 16), + enc_non_bottleneck_channels=(64, 128), + dec_upsample_channels=(64, 16), + dec_stages_non_bottleneck=(2, 2), + dec_non_bottleneck_channels=(64, 16), + dropout_ratio=0.1, + init_cfg=None), + decode_head=dict( + type='FCNHead', + in_channels=16, + channels=128, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/fast_scnn.py b/mmsegmentation/configs/_base_/models/fast_scnn.py new file mode 100644 index 0000000..11127b0 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fast_scnn.py @@ -0,0 +1,65 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True, momentum=0.01) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='FastSCNN', + downsample_dw_channels=(32, 48), + global_in_channels=64, + global_block_channels=(64, 96, 128), + global_block_strides=(2, 2, 1), + global_out_channels=128, + higher_in_channels=64, + lower_in_channels=128, + fusion_out_channels=128, + out_indices=(0, 1, 2), + norm_cfg=norm_cfg, + align_corners=False), + decode_head=dict( + type='DepthwiseSeparableFCNHead', + in_channels=128, + channels=128, + concat_input=False, + num_classes=19, + in_index=-1, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=32, + num_convs=1, + num_classes=19, + in_index=-2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=64, + channels=32, + num_convs=1, + num_classes=19, + in_index=-3, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/fastfcn_r50-d32_jpu_psp.py b/mmsegmentation/configs/_base_/models/fastfcn_r50-d32_jpu_psp.py new file mode 100644 index 0000000..a200b4b --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fastfcn_r50-d32_jpu_psp.py @@ -0,0 +1,61 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + dilations=(1, 1, 2, 4), + strides=(1, 2, 2, 2), + out_indices=(1, 2, 3), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='JPU', + in_channels=(512, 1024, 2048), + mid_channels=512, + start_level=0, + end_level=-1, + dilations=(1, 2, 4, 8), + align_corners=False, + norm_cfg=norm_cfg), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=2, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=1, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/fcn_hr18.py b/mmsegmentation/configs/_base_/models/fcn_hr18.py new file mode 100644 index 0000000..01a447a --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fcn_hr18.py @@ -0,0 +1,60 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + channels=sum([18, 36, 72, 144]), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/fcn_r50-d8.py b/mmsegmentation/configs/_base_/models/fcn_r50-d8.py new file mode 100644 index 0000000..9a76a6c --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fcn_r50-d8.py @@ -0,0 +1,53 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='FCNHead', + in_channels=2048, + in_index=3, + channels=512, + num_convs=2, + concat_input=True, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/fcn_unet_s5-d16.py b/mmsegmentation/configs/_base_/models/fcn_unet_s5-d16.py new file mode 100644 index 0000000..9f880d2 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fcn_unet_s5-d16.py @@ -0,0 +1,59 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='FCNHead', + in_channels=64, + in_index=4, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/mmsegmentation/configs/_base_/models/fpn_poolformer_s12.py b/mmsegmentation/configs/_base_/models/fpn_poolformer_s12.py new file mode 100644 index 0000000..086c804 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fpn_poolformer_s12.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s12_3rdparty_32xb128_in1k_20220414-f8d83051.pth' # noqa +# TODO: delete custom_imports after mmpretrain supports auto import +# please install mmpretrain >= 1.0.0rc7 +# import mmpretrain.models to trigger register_module in mmpretrain +custom_imports = dict( + imports=['mmpretrain.models'], allow_failed_imports=False) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='mmpretrain.PoolFormer', + arch='s12', + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, prefix='backbone.'), + in_patch_size=7, + in_stride=4, + in_pad=2, + down_patch_size=3, + down_stride=2, + down_pad=1, + drop_rate=0., + drop_path_rate=0., + out_indices=(0, 2, 4, 6), + frozen_stages=0, + ), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/fpn_r50.py b/mmsegmentation/configs/_base_/models/fpn_r50.py new file mode 100644 index 0000000..3baa097 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/fpn_r50.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/gcnet_r50-d8.py b/mmsegmentation/configs/_base_/models/gcnet_r50-d8.py new file mode 100644 index 0000000..8238d4b --- /dev/null +++ b/mmsegmentation/configs/_base_/models/gcnet_r50-d8.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='GCHead', + in_channels=2048, + in_index=3, + channels=512, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/icnet_r50-d8.py b/mmsegmentation/configs/_base_/models/icnet_r50-d8.py new file mode 100644 index 0000000..4377053 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/icnet_r50-d8.py @@ -0,0 +1,82 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='ICNet', + backbone_cfg=dict( + type='ResNetV1c', + in_channels=3, + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + in_channels=3, + layer_channels=(512, 2048), + light_branch_middle_channels=32, + psp_out_channels=512, + out_channels=(64, 256, 256), + norm_cfg=norm_cfg, + align_corners=False, + ), + neck=dict( + type='ICNeck', + in_channels=(64, 256, 256), + out_channels=128, + norm_cfg=norm_cfg, + align_corners=False), + decode_head=dict( + type='FCNHead', + in_channels=128, + channels=128, + num_convs=1, + in_index=2, + dropout_ratio=0, + num_classes=19, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=128, + num_convs=1, + num_classes=19, + in_index=0, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=128, + channels=128, + num_convs=1, + num_classes=19, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/isanet_r50-d8.py b/mmsegmentation/configs/_base_/models/isanet_r50-d8.py new file mode 100644 index 0000000..e028ba8 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/isanet_r50-d8.py @@ -0,0 +1,53 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ISAHead', + in_channels=2048, + in_index=3, + channels=512, + isa_channels=256, + down_factor=(8, 8), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/lraspp_m-v3-d8.py b/mmsegmentation/configs/_base_/models/lraspp_m-v3-d8.py new file mode 100644 index 0000000..acf70e7 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/lraspp_m-v3-d8.py @@ -0,0 +1,33 @@ +# model settings +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='MobileNetV3', + arch='large', + out_indices=(1, 3, 16), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 24, 960), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/nonlocal_r50-d8.py b/mmsegmentation/configs/_base_/models/nonlocal_r50-d8.py new file mode 100644 index 0000000..7d73a84 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/nonlocal_r50-d8.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='NLHead', + in_channels=2048, + in_index=3, + channels=512, + dropout_ratio=0.1, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/ocrnet_hr18.py b/mmsegmentation/configs/_base_/models/ocrnet_hr18.py new file mode 100644 index 0000000..6c7fcfe --- /dev/null +++ b/mmsegmentation/configs/_base_/models/ocrnet_hr18.py @@ -0,0 +1,76 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='CascadeEncoderDecoder', + data_preprocessor=data_preprocessor, + num_stages=2, + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/ocrnet_r50-d8.py b/mmsegmentation/configs/_base_/models/ocrnet_r50-d8.py new file mode 100644 index 0000000..0a2588f --- /dev/null +++ b/mmsegmentation/configs/_base_/models/ocrnet_r50-d8.py @@ -0,0 +1,55 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='CascadeEncoderDecoder', + data_preprocessor=data_preprocessor, + num_stages=2, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=[ + dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=2048, + in_index=3, + channels=512, + ocr_channels=256, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/pointrend_r50.py b/mmsegmentation/configs/_base_/models/pointrend_r50.py new file mode 100644 index 0000000..8a27e85 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/pointrend_r50.py @@ -0,0 +1,64 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='CascadeEncoderDecoder', + data_preprocessor=data_preprocessor, + num_stages=2, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=[ + dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='PointHead', + in_channels=[256], + in_index=[0], + channels=256, + num_fcs=3, + coarse_pred_each_layer=True, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ], + # model training and testing settings + train_cfg=dict( + num_points=2048, oversample_ratio=3, importance_sample_ratio=0.75), + test_cfg=dict( + mode='whole', + subdivision_steps=2, + subdivision_num_points=8196, + scale_factor=2)) diff --git a/mmsegmentation/configs/_base_/models/psanet_r50-d8.py b/mmsegmentation/configs/_base_/models/psanet_r50-d8.py new file mode 100644 index 0000000..40fd5a9 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/psanet_r50-d8.py @@ -0,0 +1,57 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSAHead', + in_channels=2048, + in_index=3, + channels=512, + mask_size=(97, 97), + psa_type='bi-direction', + compact=False, + shrink_factor=2, + normalization_factor=1.0, + psa_softmax=True, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/pspnet_r50-d8.py b/mmsegmentation/configs/_base_/models/pspnet_r50-d8.py new file mode 100644 index 0000000..c257b8b --- /dev/null +++ b/mmsegmentation/configs/_base_/models/pspnet_r50-d8.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/pspnet_unet_s5-d16.py b/mmsegmentation/configs/_base_/models/pspnet_unet_s5-d16.py new file mode 100644 index 0000000..834a22a --- /dev/null +++ b/mmsegmentation/configs/_base_/models/pspnet_unet_s5-d16.py @@ -0,0 +1,58 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + channels=16, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/mmsegmentation/configs/_base_/models/san_vit-b16.py b/mmsegmentation/configs/_base_/models/san_vit-b16.py new file mode 100644 index 0000000..96ac41b --- /dev/null +++ b/mmsegmentation/configs/_base_/models/san_vit-b16.py @@ -0,0 +1,137 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) + +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[122.7709, 116.7460, 104.0937], + std=[68.5005, 66.6322, 70.3232], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size_divisor=640, + test_cfg=dict(size_divisor=32)) + +num_classes = 171 +model = dict( + type='MultimodalEncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='pretrain/clip_vit_base_patch16_224.pth', + asymetric_input=True, + encoder_resolution=0.5, + image_encoder=dict( + type='VisionTransformer', + img_size=(224, 224), + patch_size=16, + patch_pad=0, + in_channels=3, + embed_dims=768, + num_layers=9, + num_heads=12, + mlp_ratio=4, + out_origin=True, + out_indices=(2, 5, 8), + qkv_bias=True, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.0, + with_cls_token=True, + output_cls_token=True, + patch_bias=False, + pre_norm=True, + norm_cfg=dict(type='LN', eps=1e-5), + act_cfg=dict(type='QuickGELU'), + norm_eval=False, + interpolate_mode='bicubic', + frozen_exclude=['pos_embed']), + text_encoder=dict( + type='CLIPTextEncoder', + dataset_name=None, + templates='vild', + embed_dims=512, + num_layers=12, + num_heads=8, + mlp_ratio=4, + output_dims=512, + cache_feature=True, + cat_bg=True, + norm_cfg=dict(type='LN', eps=1e-5) + ), + decode_head=dict( + type='SideAdapterCLIPHead', + num_classes=num_classes, + deep_supervision_idxs=[7], + san_cfg=dict( + in_channels=3, + clip_channels=768, + embed_dims=240, + patch_size=16, + patch_bias=True, + num_queries=100, + cfg_encoder=dict( + num_encode_layer=8, + num_heads=6, + mlp_ratio=4 + ), + fusion_index=[0, 1, 2, 3], + cfg_decoder=dict( + num_heads=12, + num_layers=1, + embed_channels=256, + mlp_channels=256, + num_mlp=3, + rescale=True), + norm_cfg=dict(type='LN', eps=1e-6), + ), + maskgen_cfg=dict( + sos_token_format='cls_token', + sos_token_num=100, + cross_attn=False, + num_layers=3, + embed_dims=768, + num_heads=12, + mlp_ratio=4, + qkv_bias=True, + out_dims=512, + final_norm=True, + act_cfg=dict(type='QuickGELU'), + norm_cfg=dict(type='LN', eps=1e-5), + frozen_exclude=[] + ), + align_corners=False, + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='HungarianAssigner', + match_costs=[ + dict(type='ClassificationCost', weight=2.0), + dict( + type='CrossEntropyLossCost', + weight=5.0, + use_sigmoid=True), + dict( + type='DiceCost', + weight=5.0, + pred_act=True, + eps=1.0) + ])), + loss_decode=[dict(type='CrossEntropyLoss', + loss_name='loss_cls_ce', + loss_weight=2.0, + class_weight=[1.0] * num_classes + [0.1]), + dict(type='CrossEntropyLoss', + use_sigmoid=True, + loss_name='loss_mask_ce', + loss_weight=5.0), + dict(type='DiceLoss', + ignore_index=None, + naive_dice=True, + eps=1, + loss_name='loss_mask_dice', + loss_weight=5.0) + ]), + + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) # yapf: disable diff --git a/mmsegmentation/configs/_base_/models/segformer_mit-b0.py b/mmsegmentation/configs/_base_/models/segformer_mit-b0.py new file mode 100644 index 0000000..46841ad --- /dev/null +++ b/mmsegmentation/configs/_base_/models/segformer_mit-b0.py @@ -0,0 +1,42 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='MixVisionTransformer', + in_channels=3, + embed_dims=32, + num_stages=4, + num_layers=[2, 2, 2, 2], + num_heads=[1, 2, 5, 8], + patch_sizes=[7, 3, 3, 3], + sr_ratios=[8, 4, 2, 1], + out_indices=(0, 1, 2, 3), + mlp_ratio=4, + qkv_bias=True, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.1), + decode_head=dict( + type='SegformerHead', + in_channels=[32, 64, 160, 256], + in_index=[0, 1, 2, 3], + channels=256, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/segmenter_vit-b16_mask.py b/mmsegmentation/configs/_base_/models/segmenter_vit-b16_mask.py new file mode 100644 index 0000000..8f3dad1 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/segmenter_vit-b16_mask.py @@ -0,0 +1,44 @@ +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segmenter/vit_base_p16_384_20220308-96dfe169.pth' # noqa +# model settings +backbone_norm_cfg = dict(type='LN', eps=1e-6, requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[127.5, 127.5, 127.5], + std=[127.5, 127.5, 127.5], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=checkpoint, + backbone=dict( + type='VisionTransformer', + img_size=(512, 512), + patch_size=16, + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + drop_path_rate=0.1, + attn_drop_rate=0.0, + drop_rate=0.0, + final_norm=True, + norm_cfg=backbone_norm_cfg, + with_cls_token=True, + interpolate_mode='bicubic', + ), + decode_head=dict( + type='SegmenterMaskTransformerHead', + in_channels=768, + channels=768, + num_classes=150, + num_layers=2, + num_heads=12, + embed_dims=768, + dropout_ratio=0.0, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + ), + test_cfg=dict(mode='slide', crop_size=(512, 512), stride=(480, 480)), +) diff --git a/mmsegmentation/configs/_base_/models/setr_mla.py b/mmsegmentation/configs/_base_/models/setr_mla.py new file mode 100644 index 0000000..dedf169 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/setr_mla.py @@ -0,0 +1,103 @@ +# model settings +backbone_norm_cfg = dict(type='LN', eps=1e-6, requires_grad=True) +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='pretrain/jx_vit_large_p16_384-b3be5167.pth', + backbone=dict( + type='VisionTransformer', + img_size=(768, 768), + patch_size=16, + in_channels=3, + embed_dims=1024, + num_layers=24, + num_heads=16, + out_indices=(5, 11, 17, 23), + drop_rate=0.1, + norm_cfg=backbone_norm_cfg, + with_cls_token=False, + interpolate_mode='bilinear', + ), + neck=dict( + type='MLANeck', + in_channels=[1024, 1024, 1024, 1024], + out_channels=256, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + ), + decode_head=dict( + type='SETRMLAHead', + in_channels=(256, 256, 256, 256), + channels=512, + in_index=(0, 1, 2, 3), + dropout_ratio=0, + mla_channels=128, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=0, + dropout_ratio=0, + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=1, + dropout_ratio=0, + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=2, + dropout_ratio=0, + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=3, + dropout_ratio=0, + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ], + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/setr_naive.py b/mmsegmentation/configs/_base_/models/setr_naive.py new file mode 100644 index 0000000..ccf5b33 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/setr_naive.py @@ -0,0 +1,88 @@ +# model settings +backbone_norm_cfg = dict(type='LN', eps=1e-6, requires_grad=True) +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='pretrain/jx_vit_large_p16_384-b3be5167.pth', + backbone=dict( + type='VisionTransformer', + img_size=(768, 768), + patch_size=16, + in_channels=3, + embed_dims=1024, + num_layers=24, + num_heads=16, + out_indices=(9, 14, 19, 23), + drop_rate=0.1, + norm_cfg=backbone_norm_cfg, + with_cls_token=True, + interpolate_mode='bilinear', + ), + decode_head=dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=3, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=0, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=1, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=2, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)) + ], + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/setr_pup.py b/mmsegmentation/configs/_base_/models/setr_pup.py new file mode 100644 index 0000000..df1bc18 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/setr_pup.py @@ -0,0 +1,88 @@ +# model settings +backbone_norm_cfg = dict(type='LN', eps=1e-6, requires_grad=True) +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='pretrain/jx_vit_large_p16_384-b3be5167.pth', + backbone=dict( + type='VisionTransformer', + img_size=(768, 768), + patch_size=16, + in_channels=3, + embed_dims=1024, + num_layers=24, + num_heads=16, + out_indices=(9, 14, 19, 23), + drop_rate=0.1, + norm_cfg=backbone_norm_cfg, + with_cls_token=True, + interpolate_mode='bilinear', + ), + decode_head=dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=3, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=4, + up_scale=2, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=0, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=1, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=2, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=1, + up_scale=4, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ], + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/stdc.py b/mmsegmentation/configs/_base_/models/stdc.py new file mode 100644 index 0000000..01bf2b9 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/stdc.py @@ -0,0 +1,91 @@ +norm_cfg = dict(type='BN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='STDCContextPathNet', + backbone_cfg=dict( + type='STDCNet', + stdc_type='STDCNet1', + in_channels=3, + channels=(32, 64, 256, 512, 1024), + bottleneck_type='cat', + num_convs=4, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + with_final_conv=False), + last_in_channels=(1024, 512), + out_channels=128, + ffm_cfg=dict(in_channels=384, out_channels=256, scale_factor=4)), + decode_head=dict( + type='FCNHead', + in_channels=256, + channels=256, + num_convs=1, + num_classes=19, + in_index=3, + concat_input=False, + dropout_ratio=0.1, + norm_cfg=norm_cfg, + align_corners=True, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=64, + num_convs=1, + num_classes=19, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=128, + channels=64, + num_convs=1, + num_classes=19, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='STDCHead', + in_channels=256, + channels=64, + num_convs=1, + num_classes=2, + boundary_threshold=0.1, + in_index=0, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=True, + loss_decode=[ + dict( + type='CrossEntropyLoss', + loss_name='loss_ce', + use_sigmoid=True, + loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=1.0) + ]), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/twins_pcpvt-s_fpn.py b/mmsegmentation/configs/_base_/models/twins_pcpvt-s_fpn.py new file mode 100644 index 0000000..059210b --- /dev/null +++ b/mmsegmentation/configs/_base_/models/twins_pcpvt-s_fpn.py @@ -0,0 +1,53 @@ +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/pcpvt_small_20220308-e638c41c.pth' # noqa + +# model settings +backbone_norm_cfg = dict(type='LN') +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='PCPVT', + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + in_channels=3, + embed_dims=[64, 128, 320, 512], + num_heads=[1, 2, 5, 8], + patch_sizes=[4, 2, 2, 2], + strides=[4, 2, 2, 2], + mlp_ratios=[8, 8, 4, 4], + out_indices=(0, 1, 2, 3), + qkv_bias=True, + norm_cfg=backbone_norm_cfg, + depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], + norm_after_stage=False, + drop_rate=0.0, + attn_drop_rate=0., + drop_path_rate=0.2), + neck=dict( + type='FPN', + in_channels=[64, 128, 320, 512], + out_channels=256, + num_outs=4), + decode_head=dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/twins_pcpvt-s_upernet.py b/mmsegmentation/configs/_base_/models/twins_pcpvt-s_upernet.py new file mode 100644 index 0000000..585a76f --- /dev/null +++ b/mmsegmentation/configs/_base_/models/twins_pcpvt-s_upernet.py @@ -0,0 +1,61 @@ +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/pcpvt_small_20220308-e638c41c.pth' # noqa + +# model settings +backbone_norm_cfg = dict(type='LN') +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='PCPVT', + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + in_channels=3, + embed_dims=[64, 128, 320, 512], + num_heads=[1, 2, 5, 8], + patch_sizes=[4, 2, 2, 2], + strides=[4, 2, 2, 2], + mlp_ratios=[8, 8, 4, 4], + out_indices=(0, 1, 2, 3), + qkv_bias=True, + norm_cfg=backbone_norm_cfg, + depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], + norm_after_stage=False, + drop_rate=0.0, + attn_drop_rate=0., + drop_path_rate=0.2), + decode_head=dict( + type='UPerHead', + in_channels=[64, 128, 320, 512], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=320, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/upernet_beit.py b/mmsegmentation/configs/_base_/models/upernet_beit.py new file mode 100644 index 0000000..691e288 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/upernet_beit.py @@ -0,0 +1,58 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='BEiT', + img_size=(640, 640), + patch_size=16, + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + out_indices=(3, 5, 7, 11), + qv_bias=True, + attn_drop_rate=0.0, + drop_path_rate=0.1, + norm_cfg=dict(type='LN', eps=1e-6), + act_cfg=dict(type='GELU'), + norm_eval=False, + init_values=0.1), + neck=dict(type='Feature2Pyramid', embed_dim=768, rescales=[4, 2, 1, 0.5]), + decode_head=dict( + type='UPerHead', + in_channels=[768, 768, 768, 768], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=768, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=768, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/upernet_convnext.py b/mmsegmentation/configs/_base_/models/upernet_convnext.py new file mode 100644 index 0000000..958994c --- /dev/null +++ b/mmsegmentation/configs/_base_/models/upernet_convnext.py @@ -0,0 +1,52 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +custom_imports = dict(imports='mmpretrain.models', allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-base_3rdparty_32xb128-noema_in1k_20220301-2a0ee547.pth' # noqa +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='mmpretrain.ConvNeXt', + arch='base', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + decode_head=dict( + type='UPerHead', + in_channels=[128, 256, 512, 1024], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=384, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/upernet_mae.py b/mmsegmentation/configs/_base_/models/upernet_mae.py new file mode 100644 index 0000000..b833b67 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/upernet_mae.py @@ -0,0 +1,57 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='MAE', + img_size=(640, 640), + patch_size=16, + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + out_indices=(3, 5, 7, 11), + attn_drop_rate=0.0, + drop_path_rate=0.1, + norm_cfg=dict(type='LN', eps=1e-6), + act_cfg=dict(type='GELU'), + norm_eval=False, + init_values=0.1), + neck=dict(type='Feature2Pyramid', embed_dim=768, rescales=[4, 2, 1, 0.5]), + decode_head=dict( + type='UPerHead', + in_channels=[384, 384, 384, 384], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=384, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/upernet_r50.py b/mmsegmentation/configs/_base_/models/upernet_r50.py new file mode 100644 index 0000000..97f2eb8 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/upernet_r50.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='UPerHead', + in_channels=[256, 512, 1024, 2048], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/upernet_swin.py b/mmsegmentation/configs/_base_/models/upernet_swin.py new file mode 100644 index 0000000..61cfce0 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/upernet_swin.py @@ -0,0 +1,62 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +backbone_norm_cfg = dict(type='LN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='SwinTransformer', + pretrain_img_size=224, + embed_dims=96, + patch_size=4, + window_size=7, + mlp_ratio=4, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + strides=(4, 2, 2, 2), + out_indices=(0, 1, 2, 3), + qkv_bias=True, + qk_scale=None, + patch_norm=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + use_abs_pos_embed=False, + act_cfg=dict(type='GELU'), + norm_cfg=backbone_norm_cfg), + decode_head=dict( + type='UPerHead', + in_channels=[96, 192, 384, 768], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=384, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/_base_/models/upernet_vit-b16_ln_mln.py b/mmsegmentation/configs/_base_/models/upernet_vit-b16_ln_mln.py new file mode 100644 index 0000000..776525a --- /dev/null +++ b/mmsegmentation/configs/_base_/models/upernet_vit-b16_ln_mln.py @@ -0,0 +1,65 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='pretrain/jx_vit_base_p16_224-80ecf9dd.pth', + backbone=dict( + type='VisionTransformer', + img_size=(512, 512), + patch_size=16, + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + out_indices=(2, 5, 8, 11), + qkv_bias=True, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.0, + with_cls_token=True, + norm_cfg=dict(type='LN', eps=1e-6), + act_cfg=dict(type='GELU'), + norm_eval=False, + interpolate_mode='bicubic'), + neck=dict( + type='MultiLevelNeck', + in_channels=[768, 768, 768, 768], + out_channels=768, + scales=[4, 2, 1, 0.5]), + decode_head=dict( + type='UPerHead', + in_channels=[768, 768, 768, 768], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=768, + in_index=3, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) # yapf: disable diff --git a/mmsegmentation/configs/_base_/models/vpd_sd.py b/mmsegmentation/configs/_base_/models/vpd_sd.py new file mode 100644 index 0000000..87321e7 --- /dev/null +++ b/mmsegmentation/configs/_base_/models/vpd_sd.py @@ -0,0 +1,86 @@ +# model settings +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[127.5, 127.5, 127.5], + std=[127.5, 127.5, 127.5], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=0) + +# adapted from stable-diffusion/configs/stable-diffusion/v1-inference.yaml +stable_diffusion_cfg = dict( + base_learning_rate=0.0001, + target='ldm.models.diffusion.ddpm.LatentDiffusion', + checkpoint='https://download.openmmlab.com/mmsegmentation/v0.5/' + 'vpd/stable_diffusion_v1-5_pretrain_third_party.pth', + params=dict( + linear_start=0.00085, + linear_end=0.012, + num_timesteps_cond=1, + log_every_t=200, + timesteps=1000, + first_stage_key='jpg', + cond_stage_key='txt', + image_size=64, + channels=4, + cond_stage_trainable=False, + conditioning_key='crossattn', + monitor='val/loss_simple_ema', + scale_factor=0.18215, + use_ema=False, + scheduler_config=dict( + target='ldm.lr_scheduler.LambdaLinearScheduler', + params=dict( + warm_up_steps=[10000], + cycle_lengths=[10000000000000], + f_start=[1e-06], + f_max=[1.0], + f_min=[1.0])), + unet_config=dict( + target='ldm.modules.diffusionmodules.openaimodel.UNetModel', + params=dict( + image_size=32, + in_channels=4, + out_channels=4, + model_channels=320, + attention_resolutions=[4, 2, 1], + num_res_blocks=2, + channel_mult=[1, 2, 4, 4], + num_heads=8, + use_spatial_transformer=True, + transformer_depth=1, + context_dim=768, + use_checkpoint=True, + legacy=False)), + first_stage_config=dict( + target='ldm.models.autoencoder.AutoencoderKL', + params=dict( + embed_dim=4, + monitor='val/rec_loss', + ddconfig=dict( + double_z=True, + z_channels=4, + resolution=256, + in_channels=3, + out_ch=3, + ch=128, + ch_mult=[1, 2, 4, 4], + num_res_blocks=2, + attn_resolutions=[], + dropout=0.0), + lossconfig=dict(target='torch.nn.Identity'))), + cond_stage_config=dict( + target='ldm.modules.encoders.modules.AbstractEncoder'))) + +model = dict( + type='DepthEstimator', + data_preprocessor=data_preprocessor, + backbone=dict( + type='VPD', + diffusion_cfg=stable_diffusion_cfg, + ), +) + +# some of the parameters in stable-diffusion model will not be updated +# during training +find_unused_parameters = True diff --git a/mmsegmentation/configs/_base_/schedules/schedule_160k.py b/mmsegmentation/configs/_base_/schedules/schedule_160k.py new file mode 100644 index 0000000..60d7bec --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_160k.py @@ -0,0 +1,25 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=160000, + by_epoch=False) +] +# training schedule for 160k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=160000, val_interval=16000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=16000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/_base_/schedules/schedule_20k.py b/mmsegmentation/configs/_base_/schedules/schedule_20k.py new file mode 100644 index 0000000..e809e3e --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_20k.py @@ -0,0 +1,24 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=20000, + by_epoch=False) +] +# training schedule for 20k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=20000, val_interval=2000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/_base_/schedules/schedule_240k.py b/mmsegmentation/configs/_base_/schedules/schedule_240k.py new file mode 100644 index 0000000..feb2ce9 --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_240k.py @@ -0,0 +1,25 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=240000, + by_epoch=False) +] +# training schedule for 240k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=240000, val_interval=24000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=24000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/_base_/schedules/schedule_25k.py b/mmsegmentation/configs/_base_/schedules/schedule_25k.py new file mode 100644 index 0000000..825e141 --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_25k.py @@ -0,0 +1,28 @@ +# optimizer +optimizer = dict(type='AdamW', lr=0.001, weight_decay=0.1) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=3e-2, begin=0, end=12000, + by_epoch=False), + dict( + type='PolyLRRatio', + eta_min_ratio=3e-2, + power=0.9, + begin=12000, + end=24000, + by_epoch=False), + dict(type='ConstantLR', by_epoch=False, factor=1, begin=24000, end=25000) +] +# training schedule for 25k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=25000, val_interval=1000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/_base_/schedules/schedule_320k.py b/mmsegmentation/configs/_base_/schedules/schedule_320k.py new file mode 100644 index 0000000..70b063a --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_320k.py @@ -0,0 +1,25 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=320000, + by_epoch=False) +] +# training schedule for 320k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=320000, val_interval=32000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=32000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/_base_/schedules/schedule_40k.py b/mmsegmentation/configs/_base_/schedules/schedule_40k.py new file mode 100644 index 0000000..4b82333 --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_40k.py @@ -0,0 +1,24 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=40000, + by_epoch=False) +] +# training schedule for 40k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/_base_/schedules/schedule_80k.py b/mmsegmentation/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000..0dcd6c4 --- /dev/null +++ b/mmsegmentation/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,24 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=80000, + by_epoch=False) +] +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=8000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=8000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/configs/ann/README.md b/mmsegmentation/configs/ann/README.md new file mode 100644 index 0000000..1281a9e --- /dev/null +++ b/mmsegmentation/configs/ann/README.md @@ -0,0 +1,68 @@ +# ANN + +> [Asymmetric Non-local Neural Networks for Semantic Segmentation](https://arxiv.org/abs/1908.07678) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The non-local module works as a particularly useful technique for semantic segmentation while criticized for its prohibitive computation and GPU memory occupation. In this paper, we present Asymmetric Non-local Neural Network to semantic segmentation, which has two prominent components: Asymmetric Pyramid Non-local Block (APNB) and Asymmetric Fusion Non-local Block (AFNB). APNB leverages a pyramid sampling module into the non-local block to largely reduce the computation and memory consumption without sacrificing the performance. AFNB is adapted from APNB to fuse the features of different levels under a sufficient consideration of long range dependencies and thus considerably improves the performance. Extensive experiments on semantic segmentation benchmarks demonstrate the effectiveness and efficiency of our work. In particular, we report the state-of-the-art performance of 81.3 mIoU on the Cityscapes test set. For a 256x128 input, APNB is around 6 times faster than a non-local block on GPU while 28 times smaller in GPU running memory occupation. Code is available at: [this https URL](https://github.com/MendelXu/ANN). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ANN | R-50-D8 | 512x1024 | 40000 | 6 | 3.71 | V100 | 77.40 | 78.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211.log.json) | +| ANN | R-101-D8 | 512x1024 | 40000 | 9.5 | 2.55 | V100 | 76.55 | 78.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243-adf6eece.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243.log.json) | +| ANN | R-50-D8 | 769x769 | 40000 | 6.8 | 1.70 | V100 | 78.89 | 80.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712-2b46b04d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712.log.json) | +| ANN | R-101-D8 | 769x769 | 40000 | 10.7 | 1.15 | V100 | 79.32 | 80.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720-059bff28.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720.log.json) | +| ANN | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 77.34 | 78.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911-5a9ad545.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911.log.json) | +| ANN | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 77.14 | 78.81 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728-aceccc6e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728.log.json) | +| ANN | R-50-D8 | 769x769 | 80000 | - | - | V100 | 78.88 | 80.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426-cc7ff323.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426.log.json) | +| ANN | R-101-D8 | 769x769 | 80000 | - | - | V100 | 78.80 | 80.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713-a9d4be8d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ANN | R-50-D8 | 512x512 | 80000 | 9.1 | 21.01 | V100 | 41.01 | 42.30 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818-26f75e11.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818.log.json) | +| ANN | R-101-D8 | 512x512 | 80000 | 12.5 | 14.12 | V100 | 42.94 | 44.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818-c0153543.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818.log.json) | +| ANN | R-50-D8 | 512x512 | 160000 | - | - | V100 | 41.74 | 42.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733-892247bc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733.log.json) | +| ANN | R-101-D8 | 512x512 | 160000 | - | - | V100 | 42.94 | 44.06 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733-955eb1ec.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ANN | R-50-D8 | 512x512 | 20000 | 6 | 20.92 | V100 | 74.86 | 76.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246-dfcb1c62.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246.log.json) | +| ANN | R-101-D8 | 512x512 | 20000 | 9.5 | 13.94 | V100 | 77.47 | 78.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246-2fad0042.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246.log.json) | +| ANN | R-50-D8 | 512x512 | 40000 | - | - | V100 | 76.56 | 77.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314-b5dac322.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314.log.json) | +| ANN | R-101-D8 | 512x512 | 40000 | - | - | V100 | 76.70 | 78.06 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann/ann_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314-bd205bbe.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314.log.json) | + +## Citation + +```bibtex +@inproceedings{zhu2019asymmetric, + title={Asymmetric non-local neural networks for semantic segmentation}, + author={Zhu, Zhen and Xu, Mengde and Bai, Song and Huang, Tengteng and Bai, Xiang}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={593--602}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..0da7e0b --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..08459c0 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..46781fa --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..c951d87 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..9f14327 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..c3c1a3f --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..c3c1a3f --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..3cc5b8e --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..119eb76 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..3152b92 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..793437f --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..4e392ca --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..900381d --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..6921218 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..e1c2360 --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..9fb26ef --- /dev/null +++ b/mmsegmentation/configs/ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/ann/metafile.yaml b/mmsegmentation/configs/ann/metafile.yaml new file mode 100644 index 0000000..0d11868 --- /dev/null +++ b/mmsegmentation/configs/ann/metafile.yaml @@ -0,0 +1,391 @@ +Collections: +- Name: ANN + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + README: configs/ann/README.md + Frameworks: + - PyTorch +Models: +- Name: ann_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.4 + mIoU(ms+flip): 78.57 + Config: configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 6.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.55 + mIoU(ms+flip): 78.85 + Config: configs/ann/ann_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 9.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243-adf6eece.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.89 + mIoU(ms+flip): 80.46 + Config: configs/ann/ann_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 6.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712-2b46b04d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.32 + mIoU(ms+flip): 80.94 + Config: configs/ann/ann_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 10.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720-059bff28.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.34 + mIoU(ms+flip): 78.65 + Config: configs/ann/ann_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911-5a9ad545.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.14 + mIoU(ms+flip): 78.81 + Config: configs/ann/ann_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728-aceccc6e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.88 + mIoU(ms+flip): 80.57 + Config: configs/ann/ann_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426-cc7ff323.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.8 + mIoU(ms+flip): 80.34 + Config: configs/ann/ann_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713-a9d4be8d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.01 + mIoU(ms+flip): 42.3 + Config: configs/ann/ann_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 9.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818-26f75e11.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.94 + mIoU(ms+flip): 44.18 + Config: configs/ann/ann_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 12.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818-c0153543.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.74 + mIoU(ms+flip): 42.62 + Config: configs/ann/ann_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733-892247bc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.94 + mIoU(ms+flip): 44.06 + Config: configs/ann/ann_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733-955eb1ec.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 74.86 + mIoU(ms+flip): 76.13 + Config: configs/ann/ann_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 6.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246-dfcb1c62.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.47 + mIoU(ms+flip): 78.7 + Config: configs/ann/ann_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Memory (GB): 9.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246-2fad0042.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.56 + mIoU(ms+flip): 77.51 + Config: configs/ann/ann_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314-b5dac322.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch +- Name: ann_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: ANN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.7 + mIoU(ms+flip): 78.06 + Config: configs/ann/ann_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - ANN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314-bd205bbe.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314.log.json + Paper: + Title: Asymmetric Non-local Neural Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1908.07678 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ann_head.py#L185 + Framework: PyTorch diff --git a/mmsegmentation/configs/apcnet/README.md b/mmsegmentation/configs/apcnet/README.md new file mode 100644 index 0000000..9104f3c --- /dev/null +++ b/mmsegmentation/configs/apcnet/README.md @@ -0,0 +1,59 @@ +# APCNet + +> [Adaptive Pyramid Context Network for Semantic Segmentation](https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Recent studies witnessed that context features can significantly improve the performance of deep semantic segmentation networks. Current context based segmentation methods differ with each other in how to construct context features and perform differently in practice. This paper firstly introduces three desirable properties of context features in segmentation task. Specially, we find that Global-guided Local Affinity (GLA) can play a vital role in constructing effective context features, while this property has been largely ignored in previous works. Based on this analysis, this paper proposes Adaptive Pyramid Context Network (APCNet)for semantic segmentation. APCNet adaptively constructs multi-scale contextual representations with multiple welldesigned Adaptive Context Modules (ACMs). Specifically, each ACM leverages a global image representation as a guidance to estimate the local affinity coefficients for each sub-region, and then calculates a context vector with these affinities. We empirically evaluate our APCNet on three semantic segmentation and scene parsing datasets, including PASCAL VOC 2012, Pascal-Context, and ADE20K dataset. Experimental results show that APCNet achieves state-ofthe-art performance on all three benchmarks, and obtains a new record 84.2% on PASCAL VOC 2012 test set without MS COCO pre-trained and any post-processing. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| APCNet | R-50-D8 | 512x1024 | 40000 | 7.7 | 3.57 | V100 | 78.02 | 79.26 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes_20201214_115717-5e88fa33.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes-20201214_115717.log.json) | +| APCNet | R-101-D8 | 512x1024 | 40000 | 11.2 | 2.15 | V100 | 79.08 | 80.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes_20201214_115716-abc9d111.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes-20201214_115716.log.json) | +| APCNet | R-50-D8 | 769x769 | 40000 | 8.7 | 1.52 | V100 | 77.89 | 79.75 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes_20201214_115717-2a2628d7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes-20201214_115717.log.json) | +| APCNet | R-101-D8 | 769x769 | 40000 | 12.7 | 1.03 | V100 | 77.96 | 79.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes_20201214_115718-b650de90.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes-20201214_115718.log.json) | +| APCNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 78.96 | 79.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes_20201214_115716-987f51e3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes-20201214_115716.log.json) | +| APCNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 79.64 | 80.61 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes_20201214_115705-b1ff208a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes-20201214_115705.log.json) | +| APCNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 78.79 | 80.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes_20201214_115718-7ea9fa12.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes-20201214_115718.log.json) | +| APCNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 78.45 | 79.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes_20201214_115716-a7fbc2ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes-20201214_115716.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| APCNet | R-50-D8 | 512x512 | 80000 | 10.1 | 19.61 | V100 | 42.20 | 43.30 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k_20201214_115705-a8626293.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k-20201214_115705.log.json) | +| APCNet | R-101-D8 | 512x512 | 80000 | 13.6 | 13.10 | V100 | 45.54 | 46.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k_20201214_115704-c656c3fb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k-20201214_115704.log.json) | +| APCNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 43.40 | 43.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k_20201214_115706-25fb92c2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k-20201214_115706.log.json) | +| APCNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 45.41 | 46.63 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet/apcnet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k_20201214_115705-73f9a8d7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k-20201214_115705.log.json) | + +## Citation + +```bibtex +@InProceedings{He_2019_CVPR, +author = {He, Junjun and Deng, Zhongying and Zhou, Lei and Wang, Yali and Qiao, Yu}, +title = {Adaptive Pyramid Context Network for Semantic Segmentation}, +booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2019} +} +``` diff --git a/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..754b2d1 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..d2b5fe1 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..03b018d --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..0cbbfad --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..f0aacc0 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..219d07a --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..b440771 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..9ff897c --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..6de1033 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..d6ec898 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..37b23d1 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..b0fbe27 --- /dev/null +++ b/mmsegmentation/configs/apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/apcnet/metafile.yaml b/mmsegmentation/configs/apcnet/metafile.yaml new file mode 100644 index 0000000..3f4072c --- /dev/null +++ b/mmsegmentation/configs/apcnet/metafile.yaml @@ -0,0 +1,296 @@ +Collections: +- Name: APCNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + README: configs/apcnet/README.md + Frameworks: + - PyTorch +Models: +- Name: apcnet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.02 + mIoU(ms+flip): 79.26 + Config: configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - APCNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes_20201214_115717-5e88fa33.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes-20201214_115717.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.08 + mIoU(ms+flip): 80.34 + Config: configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - APCNet + Training Resources: 4x V100 GPUS + Memory (GB): 11.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes_20201214_115716-abc9d111.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes-20201214_115716.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.89 + mIoU(ms+flip): 79.75 + Config: configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - APCNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes_20201214_115717-2a2628d7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes-20201214_115717.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.96 + mIoU(ms+flip): 79.24 + Config: configs/apcnet/apcnet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - APCNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes_20201214_115718-b650de90.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes-20201214_115718.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.96 + mIoU(ms+flip): 79.94 + Config: configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - APCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes_20201214_115716-987f51e3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes-20201214_115716.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.64 + mIoU(ms+flip): 80.61 + Config: configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - APCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes_20201214_115705-b1ff208a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes-20201214_115705.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.79 + mIoU(ms+flip): 80.35 + Config: configs/apcnet/apcnet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - APCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes_20201214_115718-7ea9fa12.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes-20201214_115718.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.45 + mIoU(ms+flip): 79.91 + Config: configs/apcnet/apcnet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - APCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes_20201214_115716-a7fbc2ab.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes-20201214_115716.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.2 + mIoU(ms+flip): 43.3 + Config: configs/apcnet/apcnet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - APCNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k_20201214_115705-a8626293.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k-20201214_115705.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.54 + mIoU(ms+flip): 46.65 + Config: configs/apcnet/apcnet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - APCNet + Training Resources: 4x V100 GPUS + Memory (GB): 13.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k_20201214_115704-c656c3fb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k-20201214_115704.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.4 + mIoU(ms+flip): 43.94 + Config: configs/apcnet/apcnet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - APCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k_20201214_115706-25fb92c2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k-20201214_115706.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: apcnet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: APCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.41 + mIoU(ms+flip): 46.63 + Config: configs/apcnet/apcnet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - APCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k_20201214_115705-73f9a8d7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k-20201214_115705.log.json + Paper: + Title: Adaptive Pyramid Context Network for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_CVPR_2019/html/He_Adaptive_Pyramid_Context_Network_for_Semantic_Segmentation_CVPR_2019_paper.html + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch diff --git a/mmsegmentation/configs/beit/README.md b/mmsegmentation/configs/beit/README.md new file mode 100644 index 0000000..b005c88 --- /dev/null +++ b/mmsegmentation/configs/beit/README.md @@ -0,0 +1,85 @@ +# BEiT + +> [BEiT: BERT Pre-Training of Image Transformers](https://arxiv.org/abs/2106.08254) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We introduce a self-supervised vision representation model BEiT, which stands for Bidirectional Encoder representation from Image Transformers. Following BERT developed in the natural language processing area, we propose a masked image modeling task to pretrain vision Transformers. Specifically, each image has two views in our pre-training, i.e, image patches (such as 16x16 pixels), and visual tokens (i.e., discrete tokens). We first "tokenize" the original image into visual tokens. Then we randomly mask some image patches and fed them into the backbone Transformer. The pre-training objective is to recover the original visual tokens based on the corrupted image patches. After pre-training BEiT, we directly fine-tune the model parameters on downstream tasks by appending task layers upon the pretrained encoder. Experimental results on image classification and semantic segmentation show that our model achieves competitive results with previous pre-training methods. For example, base-size BEiT achieves 83.2% top-1 accuracy on ImageNet-1K, significantly outperforming from-scratch DeiT training (81.8%) with the same setup. Moreover, large-size BEiT obtains 86.3% only using ImageNet-1K, even outperforming ViT-L with supervised pre-training on ImageNet-22K (85.2%). The code and pretrained models are available at [this https URL](https://github.com/microsoft/unilm/tree/master/beit). + + + +
+ +
+ +## Usage + +To use other repositories' pre-trained models, it is necessary to convert keys. + +We provide a script [`beit2mmseg.py`](../../tools/model_converters/beit2mmseg.py) in the tools directory to convert the key of models from [the official repo](https://github.com/microsoft/unilm/tree/master/beit/semantic_segmentation) to MMSegmentation style. + +```shell +python tools/model_converters/beit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/beit2mmseg.py https://conversationhub.blob.core.windows.net/beit-share-public/beit/beit_base_patch16_224_pt22k_ft22k.pth pretrain/beit_base_patch16_224_pt22k_ft22k.pth +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +In our default setting, pretrained models could be defined below: + +| pretrained models | original models | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------- | +| BEiT_base.pth | ['BEiT_base'](https://conversationhub.blob.core.windows.net/beit-share-public/beit/beit_base_patch16_224_pt22k_ft22k.pth) | +| BEiT_large.pth | ['BEiT_large'](https://conversationhub.blob.core.windows.net/beit-share-public/beit/beit_large_patch16_224_pt22k_ft22k.pth) | + +Verify the single-scale results of the model: + +```shell +sh tools/dist_test.sh \ +configs/beit/upernet_beit-large_fp16_8x1_640x640_160k_ade20k.py \ +upernet_beit-large_fp16_8x1_640x640_160k_ade20k-8fc0dd5d.pth $GPUS --eval mIoU +``` + +Since relative position embedding requires the input length and width to be equal, the sliding window is adopted for multi-scale inference. So we set min_size=640, that is, the shortest edge is 640. So the multi-scale inference of config is performed separately, instead of '--aug-test'. For multi-scale inference: + +```shell +sh tools/dist_test.sh \ +configs/beit/upernet_beit-large_fp16_640x640_160k_ade20k_ms.py \ +upernet_beit-large_fp16_8x1_640x640_160k_ade20k-8fc0dd5d.pth $GPUS --eval mIoU +``` + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | pretrain | pretrain img size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ------------ | ----------------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | BEiT-B | 640x640 | ImageNet-22K | 224x224 | 16 | 160000 | 15.88 | 2.00 | V100 | 53.08 | 53.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-base_8x2_640x640_160k_ade20k/upernet_beit-base_8x2_640x640_160k_ade20k-eead221d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-base_8x2_640x640_160k_ade20k/upernet_beit-base_8x2_640x640_160k_ade20k.log.json) | +| UPerNet | BEiT-L | 640x640 | ImageNet-22K | 224x224 | 8 | 320000 | 22.64 | 0.96 | V100 | 56.33 | 56.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-large_fp16_8x1_640x640_160k_ade20k/upernet_beit-large_fp16_8x1_640x640_160k_ade20k-8fc0dd5d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-large_fp16_8x1_640x640_160k_ade20k/upernet_beit-large_fp16_8x1_640x640_160k_ade20k.log.json) | + +## Citation + +```bibtex +@inproceedings{beit, + title={{BEiT}: {BERT} Pre-Training of Image Transformers}, + author={Hangbo Bao and Li Dong and Songhao Piao and Furu Wei}, + booktitle={International Conference on Learning Representations}, + year={2022}, + url={https://openreview.net/forum?id=p-BhZSz59o4} +} +``` diff --git a/mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640.py b/mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640.py new file mode 100644 index 0000000..1cd7d0e --- /dev/null +++ b/mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/upernet_beit.py', '../_base_/datasets/ade20k_640x640.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/beit_base_patch16_224_pt22k_ft22k.pth', + test_cfg=dict(mode='slide', crop_size=(640, 640), stride=(426, 426))) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=3e-5, betas=(0.9, 0.999), weight_decay=0.05), + constructor='LayerDecayOptimizerConstructor', + paramwise_cfg=dict(num_layers=12, layer_decay_rate=0.9)) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640_ms.py b/mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640_ms.py new file mode 100644 index 0000000..0248022 --- /dev/null +++ b/mmsegmentation/configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640_ms.py @@ -0,0 +1,16 @@ +_base_ = './beit-base_upernet_8xb2-160k_ade20k-640x640.py' + +test_pipeline = [ + dict(type='LoadImageFromFile'), + # TODO: Refactor 'MultiScaleFlipAug' which supports + # `min_size` feature in `Resize` class + # img_ratios is [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] + # original image scale is (2560, 640) + dict(type='Resize', scale=(2560, 640), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs'), +] +val_dataloader = dict(batch_size=1, dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py b/mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py new file mode 100644 index 0000000..4fd5cd2 --- /dev/null +++ b/mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py @@ -0,0 +1,50 @@ +_base_ = [ + '../_base_/models/upernet_beit.py', '../_base_/datasets/ade20k_640x640.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_320k.py' +] +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/beit_large_patch16_224_pt22k_ft22k.pth', + backbone=dict( + type='BEiT', + embed_dims=1024, + num_layers=24, + num_heads=16, + mlp_ratio=4, + qv_bias=True, + init_values=1e-6, + drop_path_rate=0.2, + out_indices=[7, 11, 15, 23]), + neck=dict(embed_dim=1024, rescales=[4, 2, 1, 0.5]), + decode_head=dict( + in_channels=[1024, 1024, 1024, 1024], num_classes=150, channels=1024), + auxiliary_head=dict(in_channels=1024, num_classes=150), + test_cfg=dict(mode='slide', crop_size=(640, 640), stride=(426, 426))) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=2e-5, betas=(0.9, 0.999), weight_decay=0.05), + constructor='LayerDecayOptimizerConstructor', + paramwise_cfg=dict(num_layers=24, layer_decay_rate=0.95), + accumulative_counts=2) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=3000), + dict( + type='PolyLR', + power=1.0, + begin=3000, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +train_dataloader = dict(batch_size=1) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640_ms.py b/mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640_ms.py new file mode 100644 index 0000000..fc6f049 --- /dev/null +++ b/mmsegmentation/configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640_ms.py @@ -0,0 +1,16 @@ +_base_ = './beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py' + +test_pipeline = [ + dict(type='LoadImageFromFile'), + # TODO: Refactor 'MultiScaleFlipAug' which supports + # `min_size` feature in `Resize` class + # img_ratios is [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] + # original image scale is (2560, 640) + dict(type='Resize', scale=(2560, 640), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs'), +] +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/beit/metafile.yaml b/mmsegmentation/configs/beit/metafile.yaml new file mode 100644 index 0000000..ef6124e --- /dev/null +++ b/mmsegmentation/configs/beit/metafile.yaml @@ -0,0 +1,49 @@ +Models: +- Name: beit-base_upernet_8xb2-160k_ade20k-640x640 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 53.08 + mIoU(ms+flip): 53.84 + Config: configs/beit/beit-base_upernet_8xb2-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - BEiT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 15.88 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-base_8x2_640x640_160k_ade20k/upernet_beit-base_8x2_640x640_160k_ade20k-eead221d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-base_8x2_640x640_160k_ade20k/upernet_beit-base_8x2_640x640_160k_ade20k.log.json + Paper: + Title: 'BEiT: BERT Pre-Training of Image Transformers' + URL: https://arxiv.org/abs/2106.08254 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/backbones/beit.py#1404 + Framework: PyTorch +- Name: beit-large_upernet_8xb1-amp-160k_ade20k-640x640 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 56.33 + mIoU(ms+flip): 56.84 + Config: configs/beit/beit-large_upernet_8xb1-amp-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - BEiT-L + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 22.64 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-large_fp16_8x1_640x640_160k_ade20k/upernet_beit-large_fp16_8x1_640x640_160k_ade20k-8fc0dd5d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/beit/upernet_beit-large_fp16_8x1_640x640_160k_ade20k/upernet_beit-large_fp16_8x1_640x640_160k_ade20k.log.json + Paper: + Title: 'BEiT: BERT Pre-Training of Image Transformers' + URL: https://arxiv.org/abs/2106.08254 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/backbones/beit.py#1404 + Framework: PyTorch diff --git a/mmsegmentation/configs/bisenetv1/README.md b/mmsegmentation/configs/bisenetv1/README.md new file mode 100644 index 0000000..a505895 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/README.md @@ -0,0 +1,64 @@ +# BiSeNetV1 + +> [BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation](https://arxiv.org/abs/1808.00897) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Semantic segmentation requires both rich spatial information and sizeable receptive field. However, modern approaches usually compromise spatial resolution to achieve real-time inference speed, which leads to poor performance. In this paper, we address this dilemma with a novel Bilateral Segmentation Network (BiSeNet). We first design a Spatial Path with a small stride to preserve the spatial information and generate high-resolution features. Meanwhile, a Context Path with a fast downsampling strategy is employed to obtain sufficient receptive field. On top of the two paths, we introduce a new Feature Fusion Module to combine features efficiently. The proposed architecture makes a right balance between the speed and segmentation performance on Cityscapes, CamVid, and COCO-Stuff datasets. Specifically, for a 2048x1024 input, we achieve 68.4% Mean IOU on the Cityscapes test dataset with speed of 105 FPS on one NVIDIA Titan XP card, which is significantly faster than the existing methods with comparable performance. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | ---------------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| BiSeNetV1 | R-18-D32 (No Pretrain) | 1024x1024 | 160000 | 5.69 | 31.77 | V100 | 74.44 | 77.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes_20210922_172239-c55e78e2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes_20210922_172239.log.json) | +| BiSeNetV1 | R-18-D32 | 1024x1024 | 160000 | 5.69 | 31.77 | V100 | 74.37 | 76.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210905_220251-8ba80eff.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210905_220251.log.json) | +| BiSeNetV1 | R-18-D32 (4x8) | 1024x1024 | 160000 | 11.17 | 31.77 | V100 | 75.16 | 77.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes_20210905_220322-bb8db75f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes_20210905_220322.log.json) | +| BiSeNetV1 | R-50-D32 (No Pretrain) | 1024x1024 | 160000 | 15.39 | 7.71 | V100 | 76.92 | 78.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes_20210923_222639-7b28a2a6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes_20210923_222639.log.json) | +| BiSeNetV1 | R-50-D32 | 1024x1024 | 160000 | 15.39 | 7.71 | V100 | 77.68 | 79.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210917_234628-8b304447.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210917_234628.log.json) | + +### COCO-Stuff 164k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | ----------------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| BiSeNetV1 | R-18-D32 (No Pretrain) | 512x512 | 160000 | - | - | V100 | 25.45 | 26.15 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211022_054328-046aa2f2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211022_054328.log.json) | +| BiSeNetV1 | R-18-D32 | 512x512 | 160000 | 6.33 | 74.24 | V100 | 28.55 | 29.26 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211023_013100-f700dbf7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211023_013100.log.json) | +| BiSeNetV1 | R-50-D32 (No Pretrain) | 512x512 | 160000 | - | - | V100 | 29.82 | 30.33 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_040616-d2bb0df4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_040616.log.json) | +| BiSeNetV1 | R-50-D32 | 512x512 | 160000 | 9.28 | 32.60 | V100 | 34.88 | 35.37 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_181932-66747911.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_181932.log.json) | +| BiSeNetV1 | R-101-D32 (No Pretrain) | 512x512 | 160000 | - | - | V100 | 31.14 | 31.76 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211102_164147-c6b32c3b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211102_164147.log.json) | +| BiSeNetV1 | R-101-D32 | 512x512 | 160000 | 10.36 | 25.25 | V100 | 37.38 | 37.99 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1/bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_225220-28c8f092.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_225220.log.json) | + +Note: + +- `4x8`: Using 4 GPUs with 8 samples per GPU in training. +- For BiSeNetV1 on Cityscapes dataset, default setting is 4 GPUs with 4 samples per GPU in training. +- `No Pretrain` means the model is trained from scratch. + +## Citation + +```bibtex +@inproceedings{yu2018bisenet, + title={Bisenet: Bilateral segmentation network for real-time semantic segmentation}, + author={Yu, Changqian and Wang, Jingbo and Peng, Chao and Gao, Changxin and Yu, Gang and Sang, Nong}, + booktitle={Proceedings of the European conference on computer vision (ECCV)}, + pages={325--341}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..ac63447 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,6 @@ +_base_ = './bisenetv1_r101-d32_4xb4-160k_coco-stuff164k-512x512.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet101_v1c')))) diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..02e4e9b --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/bisenetv1_r18-d32.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + context_channels=(512, 1024, 2048), + spatial_channels=(256, 256, 256, 512), + out_channels=1024, + backbone_cfg=dict(type='ResNet', depth=101)), + decode_head=dict(in_channels=1024, channels=1024, num_classes=171), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=512, + channels=256, + num_convs=1, + num_classes=171, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=512, + channels=256, + num_convs=1, + num_classes=171, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..da3e598 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/models/bisenetv1_r18-d32.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet18_v1c')))) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.025, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..9de889f --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py' +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet18_v1c'))), +) diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..0580ce1 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024.py @@ -0,0 +1,4 @@ +_base_ = './bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py' +train_dataloader = dict(batch_size=8, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..6c3e12b --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/bisenetv1_r18-d32.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.025, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..2109d68 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,53 @@ +_base_ = [ + '../_base_/models/bisenetv1_r18-d32.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=64, + num_convs=1, + num_classes=171, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=128, + channels=64, + num_convs=1, + num_classes=171, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..013c4ff --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py @@ -0,0 +1,7 @@ +_base_ = './bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py' +model = dict( + type='EncoderDecoder', + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet50_v1c')))) diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..b35259c --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,7 @@ +_base_ = './bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py' + +model = dict( + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet50_v1c')))) diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..9753c10 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py @@ -0,0 +1,55 @@ +_base_ = [ + '../_base_/models/bisenetv1_r18-d32.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='BiSeNetV1', + context_channels=(512, 1024, 2048), + spatial_channels=(256, 256, 256, 512), + out_channels=1024, + backbone_cfg=dict(type='ResNet', depth=50)), + decode_head=dict( + type='FCNHead', in_channels=1024, in_index=0, channels=1024), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=512, + channels=256, + num_convs=1, + num_classes=19, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False), + dict( + type='FCNHead', + in_channels=512, + channels=256, + num_convs=1, + num_classes=19, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False), + ]) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.05, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..8b6ef74 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/bisenetv1_r18-d32.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + context_channels=(512, 1024, 2048), + spatial_channels=(256, 256, 256, 512), + out_channels=1024, + backbone_cfg=dict(type='ResNet', depth=50)), + decode_head=dict(in_channels=1024, channels=1024, num_classes=171), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=512, + channels=256, + num_convs=1, + num_classes=171, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=512, + channels=256, + num_convs=1, + num_classes=171, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv1/metafile.yaml b/mmsegmentation/configs/bisenetv1/metafile.yaml new file mode 100644 index 0000000..e37f632 --- /dev/null +++ b/mmsegmentation/configs/bisenetv1/metafile.yaml @@ -0,0 +1,275 @@ +Collections: +- Name: BiSeNetV1 + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - COCO-Stuff 164k + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + README: configs/bisenetv1/README.md + Frameworks: + - PyTorch +Models: +- Name: bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.44 + mIoU(ms+flip): 77.05 + Config: configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - R-18-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 5.69 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes_20210922_172239-c55e78e2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes_20210922_172239.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.37 + mIoU(ms+flip): 76.91 + Config: configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - R-18-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 5.69 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210905_220251-8ba80eff.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210905_220251.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.16 + mIoU(ms+flip): 77.24 + Config: configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb8-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 32 + Architecture: + - R-18-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 11.17 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes_20210905_220322-bb8db75f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes_20210905_220322.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.92 + mIoU(ms+flip): 78.87 + Config: configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - R-50-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 15.39 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes_20210923_222639-7b28a2a6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes_20210923_222639.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.68 + mIoU(ms+flip): 79.57 + Config: configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - R-50-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 15.39 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210917_234628-8b304447.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes_20210917_234628.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 25.45 + mIoU(ms+flip): 26.15 + Config: configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-18-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211022_054328-046aa2f2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211022_054328.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 28.55 + mIoU(ms+flip): 29.26 + Config: configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-18-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 6.33 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211023_013100-f700dbf7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211023_013100.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 29.82 + mIoU(ms+flip): 30.33 + Config: configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_040616-d2bb0df4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_040616.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 34.88 + mIoU(ms+flip): 35.37 + Config: configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 9.28 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_181932-66747911.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_181932.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 31.14 + mIoU(ms+flip): 31.76 + Config: configs/bisenetv1/bisenetv1_r50-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211102_164147-c6b32c3b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211102_164147.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch +- Name: bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512 + In Collection: BiSeNetV1 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 37.38 + mIoU(ms+flip): 37.99 + Config: configs/bisenetv1/bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D32 + - BiSeNetV1 + Training Resources: 4x V100 GPUS + Memory (GB): 10.36 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_225220-28c8f092.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv1/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k_20211101_225220.log.json + Paper: + Title: 'BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation' + URL: https://arxiv.org/abs/1808.00897 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv1.py#L266 + Framework: PyTorch diff --git a/mmsegmentation/configs/bisenetv2/README.md b/mmsegmentation/configs/bisenetv2/README.md new file mode 100644 index 0000000..a5871df --- /dev/null +++ b/mmsegmentation/configs/bisenetv2/README.md @@ -0,0 +1,53 @@ +# BiSeNetV2 + +> [Bisenet v2: Bilateral Network with Guided Aggregation for Real-time Semantic Segmentation](https://arxiv.org/abs/2004.02147) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The low-level details and high-level semantics are both essential to the semantic segmentation task. However, to speed up the model inference, current approaches almost always sacrifice the low-level details, which leads to a considerable accuracy decrease. We propose to treat these spatial details and categorical semantics separately to achieve high accuracy and high efficiency for realtime semantic segmentation. To this end, we propose an efficient and effective architecture with a good trade-off between speed and accuracy, termed Bilateral Segmentation Network (BiSeNet V2). This architecture involves: (i) a Detail Branch, with wide channels and shallow layers to capture low-level details and generate high-resolution feature representation; (ii) a Semantic Branch, with narrow channels and deep layers to obtain high-level semantic context. The Semantic Branch is lightweight due to reducing the channel capacity and a fast-downsampling strategy. Furthermore, we design a Guided Aggregation Layer to enhance mutual connections and fuse both types of feature representation. Besides, a booster training strategy is designed to improve the segmentation performance without any extra inference cost. Extensive quantitative and qualitative evaluations demonstrate that the proposed architecture performs favourably against a few state-of-the-art real-time semantic segmentation approaches. Specifically, for a 2,048x1,024 input, we achieve 72.6% Mean IoU on the Cityscapes test set with a speed of 156 FPS on one NVIDIA GeForce GTX 1080 Ti card, which is significantly faster than existing methods, yet we achieve better segmentation accuracy. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | ---------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| BiSeNetV2 | BiSeNetV2 | 1024x1024 | 160000 | 7.64 | 31.77 | V100 | 73.21 | 75.74 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes_20210902_015551-bcf10f09.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes_20210902_015551.log.json) | +| BiSeNetV2 | BiSeNetV2 (OHEM) | 1024x1024 | 160000 | 7.64 | - | V100 | 73.57 | 75.80 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes_20210902_112947-5f8103b4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes_20210902_112947.log.json) | +| BiSeNetV2 | BiSeNetV2 (4x8) | 1024x1024 | 160000 | 15.05 | - | V100 | 75.76 | 77.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes_20210903_000032-e1a2eed6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes_20210903_000032.log.json) | +| BiSeNetV2 | BiSeNetV2 (FP16) | 1024x1024 | 160000 | 5.77 | 36.65 | V100 | 73.07 | 75.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes_20210902_045942-b979777b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes_20210902_045942.log.json) | + +Note: + +- `OHEM` means Online Hard Example Mining (OHEM) is adopted in training. +- `FP16` means Mixed Precision (FP16) is adopted in training. +- `4x8` means 4 GPUs with 8 samples per GPU in training. + +## Citation + +```bibtex +@article{yu2021bisenet, + title={Bisenet v2: Bilateral network with guided aggregation for real-time semantic segmentation}, + author={Yu, Changqian and Gao, Changxin and Wang, Jingbo and Yu, Gang and Shen, Chunhua and Sang, Nong}, + journal={International Journal of Computer Vision}, + pages={1--18}, + year={2021}, + publisher={Springer} +} +``` diff --git a/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..6462ce7 --- /dev/null +++ b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/bisenetv2.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.05, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..8ed338c --- /dev/null +++ b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py @@ -0,0 +1,6 @@ +_base_ = './bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py' +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict(type='SGD', lr=0.05, momentum=0.9, weight_decay=0.0005), + loss_scale=512.) diff --git a/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..8d5cbcb --- /dev/null +++ b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py @@ -0,0 +1,83 @@ +_base_ = [ + '../_base_/models/bisenetv2.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +models = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=16, + channels=16, + num_convs=2, + num_classes=19, + in_index=1, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=32, + channels=64, + num_convs=2, + num_classes=19, + in_index=2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=64, + channels=256, + num_convs=2, + num_classes=19, + in_index=3, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='FCNHead', + in_channels=128, + channels=1024, + num_convs=2, + num_classes=19, + in_index=4, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=10000), + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ], +) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.05, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..8fcba64 --- /dev/null +++ b/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/bisenetv2.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +optimizer = dict(type='SGD', lr=0.05, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict(batch_size=8, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/bisenetv2/metafile.yaml b/mmsegmentation/configs/bisenetv2/metafile.yaml new file mode 100644 index 0000000..5430ec3 --- /dev/null +++ b/mmsegmentation/configs/bisenetv2/metafile.yaml @@ -0,0 +1,114 @@ +Collections: +- Name: BiSeNetV2 + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: 'Bisenet v2: Bilateral Network with Guided Aggregation for Real-time Semantic + Segmentation' + URL: https://arxiv.org/abs/2004.02147 + README: configs/bisenetv2/README.md + Frameworks: + - PyTorch +Models: +- Name: bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024 + In Collection: BiSeNetV2 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.21 + mIoU(ms+flip): 75.74 + Config: configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - BiSeNetV2 + - BiSeNetV2 + Training Resources: 4x V100 GPUS + Memory (GB): 7.64 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes_20210902_015551-bcf10f09.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes_20210902_015551.log.json + Paper: + Title: 'Bisenet v2: Bilateral Network with Guided Aggregation for Real-time Semantic + Segmentation' + URL: https://arxiv.org/abs/2004.02147 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv2.py#L545 + Framework: PyTorch +- Name: bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024 + In Collection: BiSeNetV2 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.57 + mIoU(ms+flip): 75.8 + Config: configs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - BiSeNetV2 + - BiSeNetV2 + Training Resources: 4x V100 GPUS + Memory (GB): 7.64 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes_20210902_112947-5f8103b4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes_20210902_112947.log.json + Paper: + Title: 'Bisenet v2: Bilateral Network with Guided Aggregation for Real-time Semantic + Segmentation' + URL: https://arxiv.org/abs/2004.02147 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv2.py#L545 + Framework: PyTorch +- Name: bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024 + In Collection: BiSeNetV2 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.76 + mIoU(ms+flip): 77.79 + Config: configs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 32 + Architecture: + - BiSeNetV2 + - BiSeNetV2 + Training Resources: 4x V100 GPUS + Memory (GB): 15.05 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes_20210903_000032-e1a2eed6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes_20210903_000032.log.json + Paper: + Title: 'Bisenet v2: Bilateral Network with Guided Aggregation for Real-time Semantic + Segmentation' + URL: https://arxiv.org/abs/2004.02147 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv2.py#L545 + Framework: PyTorch +- Name: bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024 + In Collection: BiSeNetV2 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.07 + mIoU(ms+flip): 75.13 + Config: configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - BiSeNetV2 + - BiSeNetV2 + Training Resources: 4x V100 GPUS + Memory (GB): 5.77 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes_20210902_045942-b979777b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/bisenetv2/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes_20210902_045942.log.json + Paper: + Title: 'Bisenet v2: Bilateral Network with Guided Aggregation for Real-time Semantic + Segmentation' + URL: https://arxiv.org/abs/2004.02147 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/backbones/bisenetv2.py#L545 + Framework: PyTorch diff --git a/mmsegmentation/configs/ccnet/README.md b/mmsegmentation/configs/ccnet/README.md new file mode 100644 index 0000000..64dd5f0 --- /dev/null +++ b/mmsegmentation/configs/ccnet/README.md @@ -0,0 +1,67 @@ +# CCNet + +> [CCNet: Criss-Cross Attention for Semantic Segmentation](https://arxiv.org/abs/1811.11721) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Contextual information is vital in visual understanding problems, such as semantic segmentation and object detection. We propose a Criss-Cross Network (CCNet) for obtaining full-image contextual information in a very effective and efficient way. Concretely, for each pixel, a novel criss-cross attention module harvests the contextual information of all the pixels on its criss-cross path. By taking a further recurrent operation, each pixel can finally capture the full-image dependencies. Besides, a category consistent loss is proposed to enforce the criss-cross attention module to produce more discriminative features. Overall, CCNet is with the following merits: 1) GPU memory friendly. Compared with the non-local block, the proposed recurrent criss-cross attention module requires 11x less GPU memory usage. 2) High computational efficiency. The recurrent criss-cross attention significantly reduces FLOPs by about 85% of the non-local block. 3) The state-of-the-art performance. We conduct extensive experiments on semantic segmentation benchmarks including Cityscapes, ADE20K, human parsing benchmark LIP, instance segmentation benchmark COCO, video segmentation benchmark CamVid. In particular, our CCNet achieves the mIoU scores of 81.9%, 45.76% and 55.47% on the Cityscapes test set, the ADE20K validation set and the LIP validation set respectively, which are the new state-of-the-art results. The source codes are available at [this https URL](https://github.com/speedinghzl/CCNet). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CCNet | R-50-D8 | 512x1024 | 40000 | 6 | 3.32 | V100 | 77.76 | 78.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517-4123f401.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517.log.json) | +| CCNet | R-101-D8 | 512x1024 | 40000 | 9.5 | 2.31 | V100 | 76.35 | 78.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540-a3b84ba6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540.log.json) | +| CCNet | R-50-D8 | 769x769 | 40000 | 6.8 | 1.43 | V100 | 78.46 | 79.93 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125-76d11884.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125.log.json) | +| CCNet | R-101-D8 | 769x769 | 40000 | 10.7 | 1.01 | V100 | 76.94 | 78.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428-4f57c8d0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428.log.json) | +| CCNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 79.03 | 80.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421-869a3423.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421.log.json) | +| CCNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 78.87 | 79.90 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935-ffae8917.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935.log.json) | +| CCNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.29 | 81.08 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421-73eed8ca.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421.log.json) | +| CCNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.45 | 80.66 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502-ad3cd481.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CCNet | R-50-D8 | 512x512 | 80000 | 8.8 | 20.89 | V100 | 41.78 | 42.98 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848-aa37f61e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848.log.json) | +| CCNet | R-101-D8 | 512x512 | 80000 | 12.2 | 14.11 | V100 | 43.97 | 45.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848-1f4929a3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848.log.json) | +| CCNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 42.08 | 43.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435-7c97193b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435.log.json) | +| CCNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 43.71 | 45.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644-e849e007.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CCNet | R-50-D8 | 512x512 | 20000 | 6 | 20.45 | V100 | 76.17 | 77.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212-fad81784.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212.log.json) | +| CCNet | R-101-D8 | 512x512 | 20000 | 9.5 | 13.64 | V100 | 77.27 | 79.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212-0007b61d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212.log.json) | +| CCNet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 75.96 | 77.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127-c2a15f02.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127.log.json) | +| CCNet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 77.87 | 78.90 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet/ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127-c30da577.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127.log.json) | + +## Citation + +```bibtex +@article{huang2018ccnet, + title={CCNet: Criss-Cross Attention for Semantic Segmentation}, + author={Huang, Zilong and Wang, Xinggang and Huang, Lichao and Huang, Chang and Wei, Yunchao and Liu, Wenyu}, + booktitle={ICCV}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..0c49e1e --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..f24f5a7 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..b358e12 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..7575076 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..a29d118 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..fd421a2 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..425dfcf --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..f6dcb9c --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..84fc51a --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..a930794 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..89bfe81 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..5f7c954 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..cee810c --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..76a90d9 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..a8aeb85 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..f7fced0 --- /dev/null +++ b/mmsegmentation/configs/ccnet/ccnet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/ccnet/metafile.yaml b/mmsegmentation/configs/ccnet/metafile.yaml new file mode 100644 index 0000000..62e5694 --- /dev/null +++ b/mmsegmentation/configs/ccnet/metafile.yaml @@ -0,0 +1,391 @@ +Collections: +- Name: CCNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + README: configs/ccnet/README.md + Frameworks: + - PyTorch +Models: +- Name: ccnet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.76 + mIoU(ms+flip): 78.87 + Config: configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517-4123f401.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.35 + mIoU(ms+flip): 78.19 + Config: configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540-a3b84ba6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.46 + mIoU(ms+flip): 79.93 + Config: configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125-76d11884.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.94 + mIoU(ms+flip): 78.62 + Config: configs/ccnet/ccnet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428-4f57c8d0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.03 + mIoU(ms+flip): 80.16 + Config: configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421-869a3423.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.87 + mIoU(ms+flip): 79.9 + Config: configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935-ffae8917.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.29 + mIoU(ms+flip): 81.08 + Config: configs/ccnet/ccnet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421-73eed8ca.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.45 + mIoU(ms+flip): 80.66 + Config: configs/ccnet/ccnet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502-ad3cd481.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.78 + mIoU(ms+flip): 42.98 + Config: configs/ccnet/ccnet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848-aa37f61e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.97 + mIoU(ms+flip): 45.13 + Config: configs/ccnet/ccnet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848-1f4929a3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.08 + mIoU(ms+flip): 43.13 + Config: configs/ccnet/ccnet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435-7c97193b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.71 + mIoU(ms+flip): 45.04 + Config: configs/ccnet/ccnet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644-e849e007.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.17 + mIoU(ms+flip): 77.51 + Config: configs/ccnet/ccnet_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212-fad81784.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.27 + mIoU(ms+flip): 79.02 + Config: configs/ccnet/ccnet_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212-0007b61d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 75.96 + mIoU(ms+flip): 77.04 + Config: configs/ccnet/ccnet_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127-c2a15f02.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch +- Name: ccnet_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: CCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.87 + mIoU(ms+flip): 78.9 + Config: configs/ccnet/ccnet_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - CCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127-c30da577.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127.log.json + Paper: + Title: 'CCNet: Criss-Cross Attention for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.11721 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/apc_head.py#L111 + Framework: PyTorch diff --git a/mmsegmentation/configs/cgnet/README.md b/mmsegmentation/configs/cgnet/README.md new file mode 100644 index 0000000..96c9fcf --- /dev/null +++ b/mmsegmentation/configs/cgnet/README.md @@ -0,0 +1,46 @@ +# CGNet + +> [CGNet: A Light-weight Context Guided Network for Semantic Segmentation](https://arxiv.org/abs/1811.08201) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The demand of applying semantic segmentation model on mobile devices has been increasing rapidly. Current state-of-the-art networks have enormous amount of parameters hence unsuitable for mobile devices, while other small memory footprint models follow the spirit of classification network and ignore the inherent characteristic of semantic segmentation. To tackle this problem, we propose a novel Context Guided Network (CGNet), which is a light-weight and efficient network for semantic segmentation. We first propose the Context Guided (CG) block, which learns the joint feature of both local feature and surrounding context, and further improves the joint feature with the global context. Based on the CG block, we develop CGNet which captures contextual information in all stages of the network and is specially tailored for increasing segmentation accuracy. CGNet is also elaborately designed to reduce the number of parameters and save memory footprint. Under an equivalent number of parameters, the proposed CGNet significantly outperforms existing segmentation networks. Extensive experiments on Cityscapes and CamVid datasets verify the effectiveness of the proposed approach. Specifically, without any post-processing and multi-scale testing, the proposed CGNet achieves 64.8% mean IoU on Cityscapes with less than 0.5 M parameters. The source code for the complete system can be found at [this https URL](https://github.com/wutianyiRosun/CGNet). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CGNet | M3N21 | 680x680 | 60000 | 7.5 | 30.51 | V100 | 65.63 | 68.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes_20201101_110253-4c0b2f2d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes-20201101_110253.log.json) | +| CGNet | M3N21 | 512x1024 | 60000 | 8.3 | 31.14 | V100 | 68.27 | 70.33 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes_20201101_110254-124ea03b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes-20201101_110254.log.json) | + +## Citation + +```bibtext +@article{wu2020cgnet, + title={Cgnet: A light-weight context guided network for semantic segmentation}, + author={Wu, Tianyi and Tang, Sheng and Zhang, Rui and Cao, Juan and Zhang, Yongdong}, + journal={IEEE Transactions on Image Processing}, + volume={30}, + pages={1169--1179}, + year={2020}, + publisher={IEEE} +} +``` diff --git a/mmsegmentation/configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py b/mmsegmentation/configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py new file mode 100644 index 0000000..6a2c0ed --- /dev/null +++ b/mmsegmentation/configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py @@ -0,0 +1,59 @@ +_base_ = [ + '../_base_/models/cgnet.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py' +] + +# optimizer +optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + by_epoch=False, + begin=0, + end=60000) +] +# runtime settings +total_iters = 60000 +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=total_iters, val_interval=4000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), + sampler_seed=dict(type='DistSamplerSeedHook')) + +crop_size = (680, 680) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size), + dict(type='RandomFlip', prob=0.5), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=8, num_workers=4, dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, num_workers=4, dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py b/mmsegmentation/configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py new file mode 100644 index 0000000..8be29de --- /dev/null +++ b/mmsegmentation/configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/cgnet.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py' +] + +# optimizer +optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + by_epoch=False, + begin=0, + end=60000) +] +# runtime settings +total_iters = 60000 +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=total_iters, val_interval=4000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), + sampler_seed=dict(type='DistSamplerSeedHook')) + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) + +train_dataloader = dict(batch_size=8) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/cgnet/metafile.yaml b/mmsegmentation/configs/cgnet/metafile.yaml new file mode 100644 index 0000000..063fc8b --- /dev/null +++ b/mmsegmentation/configs/cgnet/metafile.yaml @@ -0,0 +1,61 @@ +Collections: +- Name: CGNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: 'CGNet: A Light-weight Context Guided Network for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.08201 + README: configs/cgnet/README.md + Frameworks: + - PyTorch +Models: +- Name: cgnet_fcn_4xb4-60k_cityscapes-680x680 + In Collection: CGNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 65.63 + mIoU(ms+flip): 68.04 + Config: configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - M3N21 + - CGNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes_20201101_110253-4c0b2f2d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes-20201101_110253.log.json + Paper: + Title: 'CGNet: A Light-weight Context Guided Network for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.08201 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/cgnet.py#L187 + Framework: PyTorch +- Name: cgnet_fcn_4xb8-60k_cityscapes-512x1024 + In Collection: CGNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 68.27 + mIoU(ms+flip): 70.33 + Config: configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 32 + Architecture: + - M3N21 + - CGNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes_20201101_110254-124ea03b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes-20201101_110254.log.json + Paper: + Title: 'CGNet: A Light-weight Context Guided Network for Semantic Segmentation' + URL: https://arxiv.org/abs/1811.08201 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/cgnet.py#L187 + Framework: PyTorch diff --git a/mmsegmentation/configs/convnext/README.md b/mmsegmentation/configs/convnext/README.md new file mode 100644 index 0000000..d78fe6e --- /dev/null +++ b/mmsegmentation/configs/convnext/README.md @@ -0,0 +1,74 @@ +# ConvNeXt + +> [A ConvNet for the 2020s](https://arxiv.org/abs/2201.03545) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The "Roaring 20s" of visual recognition began with the introduction of Vision Transformers (ViTs), which quickly superseded ConvNets as the state-of-the-art image classification model. A vanilla ViT, on the other hand, faces difficulties when applied to general computer vision tasks such as object detection and semantic segmentation. It is the hierarchical Transformers (e.g., Swin Transformers) that reintroduced several ConvNet priors, making Transformers practically viable as a generic vision backbone and demonstrating remarkable performance on a wide variety of vision tasks. However, the effectiveness of such hybrid approaches is still largely credited to the intrinsic superiority of Transformers, rather than the inherent inductive biases of convolutions. In this work, we reexamine the design spaces and test the limits of what a pure ConvNet can achieve. We gradually "modernize" a standard ResNet toward the design of a vision Transformer, and discover several key components that contribute to the performance difference along the way. The outcome of this exploration is a family of pure ConvNet models dubbed ConvNeXt. Constructed entirely from standard ConvNet modules, ConvNeXts compete favorably with Transformers in terms of accuracy and scalability, achieving 87.8% ImageNet top-1 accuracy and outperforming Swin Transformers on COCO detection and ADE20K segmentation, while maintaining the simplicity and efficiency of standard ConvNets. + + + +
+ +
+ +### Usage + +- ConvNeXt backbone needs to install [MMClassification](https://github.com/open-mmlab/mmclassification) first, which has abundant backbones for downstream tasks. + +```shell +pip install mmpretrain>=1.0.0rc7 +``` + +### Pre-trained Models + +The pre-trained models on ImageNet-1k or ImageNet-21k are used to fine-tune on the downstream tasks. + +| Model | Training Data | Params(M) | Flops(G) | Download | +| :-----------: | :-----------: | :-------: | :------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | +| ConvNeXt-T\* | ImageNet-1k | 28.59 | 4.46 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth) | +| ConvNeXt-S\* | ImageNet-1k | 50.22 | 8.69 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-small_3rdparty_32xb128-noema_in1k_20220301-303e75e3.pth) | +| ConvNeXt-B\* | ImageNet-1k | 88.59 | 15.36 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-base_3rdparty_32xb128-noema_in1k_20220301-2a0ee547.pth) | +| ConvNeXt-B\* | ImageNet-21k | 88.59 | 15.36 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-base_3rdparty_in21k_20220301-262fd037.pth) | +| ConvNeXt-L\* | ImageNet-21k | 197.77 | 34.37 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-large_3rdparty_in21k_20220301-e6e0ea0a.pth) | +| ConvNeXt-XL\* | ImageNet-21k | 350.20 | 60.93 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-xlarge_3rdparty_in21k_20220301-08aa5ddc.pth) | + +*Models with* are converted from the [official repo](https://github.com/facebookresearch/ConvNeXt/tree/main/semantic_segmentation#results-and-fine-tuned-models).\* + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | ----------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | ConvNeXt-T | 512x512 | 160000 | 4.23 | 19.90 | V100 | 46.11 | 46.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_tiny_fp16_512x512_160k_ade20k/upernet_convnext_tiny_fp16_512x512_160k_ade20k_20220227_124553-cad485de.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_tiny_fp16_512x512_160k_ade20k/upernet_convnext_tiny_fp16_512x512_160k_ade20k_20220227_124553.log.json) | +| UPerNet | ConvNeXt-S | 512x512 | 160000 | 5.16 | 15.18 | V100 | 48.56 | 49.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext/convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_small_fp16_512x512_160k_ade20k/upernet_convnext_small_fp16_512x512_160k_ade20k_20220227_131208-1b1e394f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_small_fp16_512x512_160k_ade20k/upernet_convnext_small_fp16_512x512_160k_ade20k_20220227_131208.log.json) | +| UPerNet | ConvNeXt-B | 512x512 | 160000 | 6.33 | 14.41 | V100 | 48.71 | 49.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_512x512_160k_ade20k/upernet_convnext_base_fp16_512x512_160k_ade20k_20220227_181227-02a24fc6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_512x512_160k_ade20k/upernet_convnext_base_fp16_512x512_160k_ade20k_20220227_181227.log.json) | +| UPerNet | ConvNeXt-B | 640x640 | 160000 | 8.53 | 10.88 | V100 | 52.13 | 52.66 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_640x640_160k_ade20k/upernet_convnext_base_fp16_640x640_160k_ade20k_20220227_182859-9280e39b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_640x640_160k_ade20k/upernet_convnext_base_fp16_640x640_160k_ade20k_20220227_182859.log.json) | +| UPerNet | ConvNeXt-L | 640x640 | 160000 | 12.08 | 7.69 | V100 | 53.16 | 53.38 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext/convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_large_fp16_640x640_160k_ade20k/upernet_convnext_large_fp16_640x640_160k_ade20k_20220226_040532-e57aa54d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_large_fp16_640x640_160k_ade20k/upernet_convnext_large_fp16_640x640_160k_ade20k_20220226_040532.log.json) | +| UPerNet | ConvNeXt-XL | 640x640 | 160000 | 26.16\* | 6.33 | V100 | 53.58 | 54.11 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext/convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_xlarge_fp16_640x640_160k_ade20k/upernet_convnext_xlarge_fp16_640x640_160k_ade20k_20220226_080344-95fc38c2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_xlarge_fp16_640x640_160k_ade20k/upernet_convnext_xlarge_fp16_640x640_160k_ade20k_20220226_080344.log.json) | + +Note: + +- `Mem (GB)` with * is collected when `cudnn_benchmark=True`, and hardware is V100. + +## Citation + +```bibtex +@article{liu2022convnet, + title={A ConvNet for the 2020s}, + author={Liu, Zhuang and Mao, Hanzi and Wu, Chao-Yuan and Feichtenhofer, Christoph and Darrell, Trevor and Xie, Saining}, + journal={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2022} +} +``` diff --git a/mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py b/mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py new file mode 100644 index 0000000..09c2aa6 --- /dev/null +++ b/mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py @@ -0,0 +1,43 @@ +_base_ = [ + '../_base_/models/upernet_convnext.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(in_channels=[128, 256, 512, 1024], num_classes=150), + auxiliary_head=dict(in_channels=512, num_classes=150), + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(341, 341)), +) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py b/mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py new file mode 100644 index 0000000..06a8643 --- /dev/null +++ b/mmsegmentation/configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/upernet_convnext.py', + '../_base_/datasets/ade20k_640x640.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-base_3rdparty_in21k_20220301-262fd037.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='mmpretrain.ConvNeXt', + arch='base', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + decode_head=dict( + in_channels=[128, 256, 512, 1024], + num_classes=150, + ), + auxiliary_head=dict(in_channels=512, num_classes=150), + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(426, 426)), +) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/convnext/convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.py b/mmsegmentation/configs/convnext/convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.py new file mode 100644 index 0000000..2956e86 --- /dev/null +++ b/mmsegmentation/configs/convnext/convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/upernet_convnext.py', + '../_base_/datasets/ade20k_640x640.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-large_3rdparty_in21k_20220301-e6e0ea0a.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='mmpretrain.ConvNeXt', + arch='large', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + decode_head=dict( + in_channels=[192, 384, 768, 1536], + num_classes=150, + ), + auxiliary_head=dict(in_channels=768, num_classes=150), + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(426, 426)), +) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/convnext/convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.py b/mmsegmentation/configs/convnext/convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.py new file mode 100644 index 0000000..dbe45f1 --- /dev/null +++ b/mmsegmentation/configs/convnext/convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/models/upernet_convnext.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-small_3rdparty_32xb128-noema_in1k_20220301-303e75e3.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='mmpretrain.ConvNeXt', + arch='small', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.3, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + decode_head=dict( + in_channels=[96, 192, 384, 768], + num_classes=150, + ), + auxiliary_head=dict(in_channels=384, num_classes=150), + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(341, 341)), +) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py b/mmsegmentation/configs/convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py new file mode 100644 index 0000000..d2e545a --- /dev/null +++ b/mmsegmentation/configs/convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/models/upernet_convnext.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='mmpretrain.ConvNeXt', + arch='tiny', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + decode_head=dict( + in_channels=[96, 192, 384, 768], + num_classes=150, + ), + auxiliary_head=dict(in_channels=384, num_classes=150), + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(341, 341)), +) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 6 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/convnext/convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py b/mmsegmentation/configs/convnext/convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py new file mode 100644 index 0000000..dfad734 --- /dev/null +++ b/mmsegmentation/configs/convnext/convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/upernet_convnext.py', + '../_base_/datasets/ade20k_640x640.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-xlarge_3rdparty_in21k_20220301-08aa5ddc.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='mmpretrain.ConvNeXt', + arch='xlarge', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + decode_head=dict( + in_channels=[256, 512, 1024, 2048], + num_classes=150, + ), + auxiliary_head=dict(in_channels=1024, num_classes=150), + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(426, 426)), +) + +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00008, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/convnext/metafile.yaml b/mmsegmentation/configs/convnext/metafile.yaml new file mode 100644 index 0000000..8340a37 --- /dev/null +++ b/mmsegmentation/configs/convnext/metafile.yaml @@ -0,0 +1,145 @@ +Models: +- Name: convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.11 + mIoU(ms+flip): 46.62 + Config: configs/convnext/convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ConvNeXt-T + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 4.23 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_tiny_fp16_512x512_160k_ade20k/upernet_convnext_tiny_fp16_512x512_160k_ade20k_20220227_124553-cad485de.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_tiny_fp16_512x512_160k_ade20k/upernet_convnext_tiny_fp16_512x512_160k_ade20k_20220227_124553.log.json + Paper: + Title: A ConvNet for the 2020s + URL: https://arxiv.org/abs/2201.03545 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py#L133 + Framework: PyTorch +- Name: convnext-small_upernet_8xb2-amp-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.56 + mIoU(ms+flip): 49.02 + Config: configs/convnext/convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ConvNeXt-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 5.16 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_small_fp16_512x512_160k_ade20k/upernet_convnext_small_fp16_512x512_160k_ade20k_20220227_131208-1b1e394f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_small_fp16_512x512_160k_ade20k/upernet_convnext_small_fp16_512x512_160k_ade20k_20220227_131208.log.json + Paper: + Title: A ConvNet for the 2020s + URL: https://arxiv.org/abs/2201.03545 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py#L133 + Framework: PyTorch +- Name: convnext-base_upernet_8xb2-amp-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.71 + mIoU(ms+flip): 49.54 + Config: configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ConvNeXt-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 6.33 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_512x512_160k_ade20k/upernet_convnext_base_fp16_512x512_160k_ade20k_20220227_181227-02a24fc6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_512x512_160k_ade20k/upernet_convnext_base_fp16_512x512_160k_ade20k_20220227_181227.log.json + Paper: + Title: A ConvNet for the 2020s + URL: https://arxiv.org/abs/2201.03545 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py#L133 + Framework: PyTorch +- Name: convnext-base_upernet_8xb2-amp-160k_ade20k-640x640 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 52.13 + mIoU(ms+flip): 52.66 + Config: configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ConvNeXt-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 8.53 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_640x640_160k_ade20k/upernet_convnext_base_fp16_640x640_160k_ade20k_20220227_182859-9280e39b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_base_fp16_640x640_160k_ade20k/upernet_convnext_base_fp16_640x640_160k_ade20k_20220227_182859.log.json + Paper: + Title: A ConvNet for the 2020s + URL: https://arxiv.org/abs/2201.03545 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py#L133 + Framework: PyTorch +- Name: convnext-large_upernet_8xb2-amp-160k_ade20k-640x640 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 53.16 + mIoU(ms+flip): 53.38 + Config: configs/convnext/convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ConvNeXt-L + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 12.08 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_large_fp16_640x640_160k_ade20k/upernet_convnext_large_fp16_640x640_160k_ade20k_20220226_040532-e57aa54d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_large_fp16_640x640_160k_ade20k/upernet_convnext_large_fp16_640x640_160k_ade20k_20220226_040532.log.json + Paper: + Title: A ConvNet for the 2020s + URL: https://arxiv.org/abs/2201.03545 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py#L133 + Framework: PyTorch +- Name: convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 53.58 + mIoU(ms+flip): 54.11 + Config: configs/convnext/convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ConvNeXt-XL + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 26.16 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_xlarge_fp16_640x640_160k_ade20k/upernet_convnext_xlarge_fp16_640x640_160k_ade20k_20220226_080344-95fc38c2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/convnext/upernet_convnext_xlarge_fp16_640x640_160k_ade20k/upernet_convnext_xlarge_fp16_640x640_160k_ade20k_20220226_080344.log.json + Paper: + Title: A ConvNet for the 2020s + URL: https://arxiv.org/abs/2201.03545 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py#L133 + Framework: PyTorch diff --git a/mmsegmentation/configs/danet/README.md b/mmsegmentation/configs/danet/README.md new file mode 100644 index 0000000..90194f3 --- /dev/null +++ b/mmsegmentation/configs/danet/README.md @@ -0,0 +1,67 @@ +# DANet + +> [Dual Attention Network for Scene Segmentation](https://arxiv.org/abs/1809.02983) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +In this paper, we address the scene segmentation task by capturing rich contextual dependencies based on the selfattention mechanism. Unlike previous works that capture contexts by multi-scale features fusion, we propose a Dual Attention Networks (DANet) to adaptively integrate local features with their global dependencies. Specifically, we append two types of attention modules on top of traditional dilated FCN, which model the semantic interdependencies in spatial and channel dimensions respectively. The position attention module selectively aggregates the features at each position by a weighted sum of the features at all positions. Similar features would be related to each other regardless of their distances. Meanwhile, the channel attention module selectively emphasizes interdependent channel maps by integrating associated features among all channel maps. We sum the outputs of the two attention modules to further improve feature representation which contributes to more precise segmentation results. We achieve new state-of-the-art segmentation performance on three challenging scene segmentation datasets, i.e., Cityscapes, PASCAL Context and COCO Stuff dataset. In particular, a Mean IoU score of 81.5% on Cityscapes test set is achieved without using coarse data. We make the code and trained model publicly available at [this https URL](https://github.com/junfu1115/DANet). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DANet | R-50-D8 | 512x1024 | 40000 | 7.4 | 2.66 | V100 | 78.74 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324-c0dbfa5f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324.log.json) | +| DANet | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.99 | V100 | 80.52 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831-c57a7157.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831.log.json) | +| DANet | R-50-D8 | 769x769 | 40000 | 8.8 | 1.56 | V100 | 78.88 | 80.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703-76681c60.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703.log.json) | +| DANet | R-101-D8 | 769x769 | 40000 | 12.8 | 1.07 | V100 | 79.88 | 81.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717-dcb7fd4e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717.log.json) | +| DANet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 79.34 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029-2bfa2293.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029.log.json) | +| DANet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 80.41 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918-955e6350.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918.log.json) | +| DANet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.27 | 80.96 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954-495689b4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954.log.json) | +| DANet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 80.47 | 82.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918-f3a929e7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DANet | R-50-D8 | 512x512 | 80000 | 11.5 | 21.20 | V100 | 41.66 | 42.90 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125-edb18e08.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125.log.json) | +| DANet | R-101-D8 | 512x512 | 80000 | 15 | 14.18 | V100 | 43.64 | 45.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126-d0357c73.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126.log.json) | +| DANet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 42.45 | 43.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340-9cb35dcd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340.log.json) | +| DANet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 44.17 | 45.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348-23bf12f9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DANet | R-50-D8 | 512x512 | 20000 | 6.5 | 20.94 | V100 | 74.45 | 75.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026-9e9e3ab3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026.log.json) | +| DANet | R-101-D8 | 512x512 | 20000 | 9.9 | 13.76 | V100 | 76.02 | 77.23 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026-d48d23b2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026.log.json) | +| DANet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 76.37 | 77.29 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526-426e3a64.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526.log.json) | +| DANet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 76.51 | 77.32 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet/danet_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031-788e232a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031.log.json) | + +## Citation + +```bibtex +@article{fu2018dual, + title={Dual Attention Network for Scene Segmentation}, + author={Jun Fu, Jing Liu, Haijie Tian, Yong Li, Yongjun Bao, Zhiwei Fang,and Hanqing Lu}, + booktitle={The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..4602f33 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..a08c18e --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..98b1c64 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..9affe30 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..0079ad6 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..4844451 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..2f2df7a --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..dd75bc1 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..3bc2a77 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..3a01fb9 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..95d5df0 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..4255716 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..a8f082d --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..fab574f --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..148fa39 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/danet/danet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..efbd908 --- /dev/null +++ b/mmsegmentation/configs/danet/danet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/danet/metafile.yaml b/mmsegmentation/configs/danet/metafile.yaml new file mode 100644 index 0000000..daff925 --- /dev/null +++ b/mmsegmentation/configs/danet/metafile.yaml @@ -0,0 +1,387 @@ +Collections: +- Name: DANet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + README: configs/danet/README.md + Frameworks: + - PyTorch +Models: +- Name: danet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.74 + Config: configs/danet/danet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 7.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324-c0dbfa5f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.52 + Config: configs/danet/danet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 10.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831-c57a7157.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.88 + mIoU(ms+flip): 80.62 + Config: configs/danet/danet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 8.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703-76681c60.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.88 + mIoU(ms+flip): 81.47 + Config: configs/danet/danet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 12.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717-dcb7fd4e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.34 + Config: configs/danet/danet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029-2bfa2293.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.41 + Config: configs/danet/danet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918-955e6350.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.27 + mIoU(ms+flip): 80.96 + Config: configs/danet/danet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954-495689b4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.47 + mIoU(ms+flip): 82.02 + Config: configs/danet/danet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918-f3a929e7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.66 + mIoU(ms+flip): 42.9 + Config: configs/danet/danet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 11.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125-edb18e08.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.64 + mIoU(ms+flip): 45.19 + Config: configs/danet/danet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 15.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126-d0357c73.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.45 + mIoU(ms+flip): 43.25 + Config: configs/danet/danet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340-9cb35dcd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.17 + mIoU(ms+flip): 45.02 + Config: configs/danet/danet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348-23bf12f9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 74.45 + mIoU(ms+flip): 75.69 + Config: configs/danet/danet_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 6.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026-9e9e3ab3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.02 + mIoU(ms+flip): 77.23 + Config: configs/danet/danet_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026-d48d23b2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.37 + mIoU(ms+flip): 77.29 + Config: configs/danet/danet_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526-426e3a64.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch +- Name: danet_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: DANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.51 + mIoU(ms+flip): 77.32 + Config: configs/danet/danet_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - DANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031-788e232a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031.log.json + Paper: + Title: Dual Attention Network for Scene Segmentation + URL: https://arxiv.org/abs/1809.02983 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/da_head.py#L76 + Framework: PyTorch diff --git a/mmsegmentation/configs/ddrnet/README.md b/mmsegmentation/configs/ddrnet/README.md new file mode 100644 index 0000000..ccbfcdf --- /dev/null +++ b/mmsegmentation/configs/ddrnet/README.md @@ -0,0 +1,46 @@ +# DDRNet + +> [Deep Dual-resolution Networks for Real-time and Accurate Semantic Segmentation of Road Scenes](http://arxiv.org/abs/2101.06085) + +## Introduction + + + +Official Repo + +## Abstract + + + +Semantic segmentation is a key technology for autonomous vehicles to understand the surrounding scenes. The appealing performances of contemporary models usually come at the expense of heavy computations and lengthy inference time, which is intolerable for self-driving. Using light-weight architectures (encoder-decoder or two-pathway) or reasoning on low-resolution images, recent methods realize very fast scene parsing, even running at more than 100 FPS on a single 1080Ti GPU. However, there is still a signi๏ฌcant gap in performance between these real-time methods and the models based on dilation backbones. To tackle this problem, we proposed a family of ef๏ฌcient backbones specially designed for real-time semantic segmentation. The proposed deep dual-resolution networks (DDRNets) are composed of two deep branches between which multiple bilateral fusions are performed. Additionally, we design a new contextual information extractor named Deep Aggregation Pyramid Pooling Module (DAPPM) to enlarge effective receptive ๏ฌelds and fuse multi-scale context based on low-resolution feature maps. Our method achieves a new state-of-the-art trade-off between accuracy and speed on both Cityscapes and CamVid dataset. In particular, on a single 2080Ti GPU, DDRNet-23-slim yields 77.4% mIoU at 102 FPS on Cityscapes test set and 74.7% mIoU at 230 FPS on CamVid test set. With widely used test augmentation, our method is superior to most state-of-the-art models and requires much less computation. Codes and trained models are available online. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DDRNet | DDRNet23-slim | 1024x1024 | 120000 | 1.70 | 85.85 | A100 | 77.84 | 80.15 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230426_145312-6a5e5174.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230426_145312.json) | +| DDRNet | DDRNet23 | 1024x1024 | 120000 | 7.26 | 33.41 | A100 | 79.99 | 81.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230425_162633-81601db0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230425_162633.json) | + +## Notes + +The pretrained weights in config files are converted from [the official repo](https://github.com/ydhongHIT/DDRNet#pretrained-models). + +## Citation + +```bibtex +@article{pan2022deep, + title={Deep Dual-Resolution Networks for Real-Time and Accurate Semantic Segmentation of Traffic Scenes}, + author={Pan, Huihui and Hong, Yuanduo and Sun, Weichao and Jia, Yisong}, + journal={IEEE Transactions on Intelligent Transportation Systems}, + year={2022}, + publisher={IEEE} +} +``` diff --git a/mmsegmentation/configs/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024.py b/mmsegmentation/configs/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024.py new file mode 100644 index 0000000..65b0ead --- /dev/null +++ b/mmsegmentation/configs/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024.py @@ -0,0 +1,93 @@ +_base_ = [ + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', +] + +# The class_weight is borrowed from https://github.com/openseg-group/OCNet.pytorch/issues/14 # noqa +# Licensed under the MIT License +class_weight = [ + 0.8373, 0.918, 0.866, 1.0345, 1.0166, 0.9969, 0.9754, 1.0489, 0.8786, + 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, 1.0865, 1.0955, 1.0865, 1.1529, + 1.0507 +] +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/pretrain/ddrnet23s-in1kpre_3rdparty-1ccac5b1.pth' # noqa +crop_size = (1024, 1024) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='DDRNet', + in_channels=3, + channels=32, + ppm_channels=128, + norm_cfg=norm_cfg, + align_corners=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), + decode_head=dict( + type='DDRHead', + in_channels=32 * 4, + channels=64, + dropout_ratio=0., + num_classes=19, + align_corners=False, + norm_cfg=norm_cfg, + loss_decode=[ + dict( + type='OhemCrossEntropy', + thres=0.9, + min_kept=131072, + class_weight=class_weight, + loss_weight=1.0), + dict( + type='OhemCrossEntropy', + thres=0.9, + min_kept=131072, + class_weight=class_weight, + loss_weight=0.4), + ]), + + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +train_dataloader = dict(batch_size=6, num_workers=4) + +iters = 120000 +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=iters, + by_epoch=False) +] + +# training schedule for 120k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=iters, val_interval=iters // 10) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=iters // 10), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +randomness = dict(seed=304) diff --git a/mmsegmentation/configs/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024.py b/mmsegmentation/configs/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024.py new file mode 100644 index 0000000..444efe2 --- /dev/null +++ b/mmsegmentation/configs/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024.py @@ -0,0 +1,93 @@ +_base_ = [ + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', +] + +# The class_weight is borrowed from https://github.com/openseg-group/OCNet.pytorch/issues/14 # noqa +# Licensed under the MIT License +class_weight = [ + 0.8373, 0.918, 0.866, 1.0345, 1.0166, 0.9969, 0.9754, 1.0489, 0.8786, + 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, 1.0865, 1.0955, 1.0865, 1.1529, + 1.0507 +] +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/pretrain/ddrnet23-in1kpre_3rdparty-9ca29f62.pth' # noqa +crop_size = (1024, 1024) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='DDRNet', + in_channels=3, + channels=64, + ppm_channels=128, + norm_cfg=norm_cfg, + align_corners=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), + decode_head=dict( + type='DDRHead', + in_channels=64 * 4, + channels=128, + dropout_ratio=0., + num_classes=19, + align_corners=False, + norm_cfg=norm_cfg, + loss_decode=[ + dict( + type='OhemCrossEntropy', + thres=0.9, + min_kept=131072, + class_weight=class_weight, + loss_weight=1.0), + dict( + type='OhemCrossEntropy', + thres=0.9, + min_kept=131072, + class_weight=class_weight, + loss_weight=0.4), + ]), + + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +train_dataloader = dict(batch_size=6, num_workers=4) + +iters = 120000 +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=iters, + by_epoch=False) +] + +# training schedule for 120k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=iters, val_interval=iters // 10) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=iters // 10), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +randomness = dict(seed=304) diff --git a/mmsegmentation/configs/ddrnet/metafile.yaml b/mmsegmentation/configs/ddrnet/metafile.yaml new file mode 100644 index 0000000..0707470 --- /dev/null +++ b/mmsegmentation/configs/ddrnet/metafile.yaml @@ -0,0 +1,64 @@ +Collections: +- Name: DDRNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: Deep Dual-resolution Networks for Real-time and Accurate Semantic Segmentation + of Road Scenes + URL: http://arxiv.org/abs/2101.06085 + README: configs/ddrnet/README.md + Frameworks: + - PyTorch +Models: +- Name: ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024 + In Collection: DDRNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.84 + mIoU(ms+flip): 80.15 + Config: configs/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 12 + Architecture: + - DDRNet23-slim + - DDRNet + Training Resources: 2x A100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230426_145312-6a5e5174.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23-slim_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230426_145312.json + Paper: + Title: Deep Dual-resolution Networks for Real-time and Accurate Semantic Segmentation + of Road Scenes + URL: http://arxiv.org/abs/2101.06085 + Code: '' + Framework: PyTorch +- Name: ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024 + In Collection: DDRNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.99 + mIoU(ms+flip): 81.71 + Config: configs/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 12 + Architecture: + - DDRNet23 + - DDRNet + Training Resources: 2x A100 GPUS + Memory (GB): 7.26 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230425_162633-81601db0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ddrnet/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024/ddrnet_23_in1k-pre_2xb6-120k_cityscapes-1024x1024_20230425_162633.json + Paper: + Title: Deep Dual-resolution Networks for Real-time and Accurate Semantic Segmentation + of Road Scenes + URL: http://arxiv.org/abs/2101.06085 + Code: '' + Framework: PyTorch diff --git a/mmsegmentation/configs/deeplabv3/README.md b/mmsegmentation/configs/deeplabv3/README.md new file mode 100644 index 0000000..df50b7f --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/README.md @@ -0,0 +1,118 @@ +# DeepLabV3 + +> [Rethinking atrous convolution for semantic image segmentation](https://arxiv.org/abs/1706.05587) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +In this work, we revisit atrous convolution, a powerful tool to explicitly adjust filter's field-of-view as well as control the resolution of feature responses computed by Deep Convolutional Neural Networks, in the application of semantic image segmentation. To handle the problem of segmenting objects at multiple scales, we design modules which employ atrous convolution in cascade or in parallel to capture multi-scale context by adopting multiple atrous rates. Furthermore, we propose to augment our previously proposed Atrous Spatial Pyramid Pooling module, which probes convolutional features at multiple scales, with image-level features encoding global context and further boost performance. We also elaborate on implementation details and share our experience on training our system. The proposed \`DeepLabv3' system significantly improves over our previous DeepLab versions without DenseCRF post-processing and attains comparable performance with other state-of-art models on the PASCAL VOC 2012 semantic image segmentation benchmark. + + + +
+DEEPLABv3_ResNet-D8 +DEEPLABv3_ResNet-D8 model structure +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------------- | --------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| DeepLabV3 | R-50-D8 | 512x1024 | 40000 | 6.1 | 2.57 | V100 | 79.09 | 80.45 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449-acadc2f8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 40000 | 9.6 | 1.92 | V100 | 77.12 | 79.61 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241-7fd3f799.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241.log.json) | +| DeepLabV3 | R-50-D8 | 769x769 | 40000 | 6.9 | 1.11 | V100 | 78.58 | 79.89 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723-7eda553c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723.log.json) | +| DeepLabV3 | R-101-D8 | 769x769 | 40000 | 10.9 | 0.83 | V100 | 79.27 | 80.11 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809-c64f889f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809.log.json) | +| DeepLabV3 | R-18-D8 | 512x1024 | 80000 | 1.7 | 13.78 | V100 | 76.70 | 78.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes_20201225_021506-23dffbe2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes-20201225_021506.log.json) | +| DeepLabV3 | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 79.32 | 80.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404-b92cfdd4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 80.20 | 81.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503-9e428899.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503.log.json) | +| DeepLabV3 (FP16) | R-101-D8 | 512x1024 | 80000 | 5.75 | 3.86 | V100 | 80.48 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920-774d9cec.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920.log.json) | +| DeepLabV3 | R-18-D8 | 769x769 | 80000 | 1.9 | 5.55 | V100 | 76.60 | 78.26 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes_20201225_021506-6452126a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes-20201225_021506.log.json) | +| DeepLabV3 | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.89 | 81.06 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338-788d6228.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338.log.json) | +| DeepLabV3 | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.67 | 80.81 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353-60e95418.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353.log.json) | +| DeepLabV3 | R-101-D16-MG124 | 512x1024 | 40000 | 4.7 | 6.96 | V100 | 76.71 | 78.63 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-67b0c992.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json) | +| DeepLabV3 | R-101-D16-MG124 | 512x1024 | 80000 | - | - | V100 | 78.36 | 79.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-57bb8425.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json) | +| DeepLabV3 | R-18b-D8 | 512x1024 | 80000 | 1.6 | 13.93 | V100 | 76.26 | 77.88 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes_20201225_094144-46040cef.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes-20201225_094144.log.json) | +| DeepLabV3 | R-50b-D8 | 512x1024 | 80000 | 6.0 | 2.74 | V100 | 79.63 | 80.98 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes_20201225_155148-ec368954.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes-20201225_155148.log.json) | +| DeepLabV3 | R-101b-D8 | 512x1024 | 80000 | 9.5 | 1.81 | V100 | 80.01 | 81.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes_20201226_171821-8fd49503.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes-20201226_171821.log.json) | +| DeepLabV3 | R-18b-D8 | 769x769 | 80000 | 1.8 | 5.79 | V100 | 75.63 | 77.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes_20201225_094144-fdc985d9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes-20201225_094144.log.json) | +| DeepLabV3 | R-50b-D8 | 769x769 | 80000 | 6.8 | 1.16 | V100 | 78.80 | 80.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes_20201225_155404-87fb0cf4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes-20201225_155404.log.json) | +| DeepLabV3 | R-101b-D8 | 769x769 | 80000 | 10.7 | 0.82 | V100 | 79.41 | 80.73 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes_20201226_190843-9142ee57.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes-20201226_190843.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3 | R-50-D8 | 512x512 | 80000 | 8.9 | 14.76 | V100 | 42.42 | 43.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028-0bb3f844.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 80000 | 12.4 | 10.14 | V100 | 44.08 | 45.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256-d89c7fa4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 160000 | - | - | V100 | 42.66 | 44.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227-5d0ee427.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 160000 | - | - | V100 | 45.00 | 46.66 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816-b1f72b3b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3 | R-50-D8 | 512x512 | 20000 | 6.1 | 13.88 | V100 | 76.17 | 77.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906-596905ef.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 20000 | 9.6 | 9.81 | V100 | 78.70 | 79.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932-8d13832f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 40000 | - | - | V100 | 77.68 | 78.78 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546-2ae96e7e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 40000 | - | - | V100 | 77.92 | 79.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432-0017d784.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3 | R-101-D8 | 480x480 | 40000 | 9.2 | 7.09 | V100 | 46.55 | 47.81 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context_20200911_204118-1aa27336.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context-20200911_204118.log.json) | +| DeepLabV3 | R-101-D8 | 480x480 | 80000 | - | - | V100 | 46.42 | 47.53 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context_20200911_170155-2a21fff3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context-20200911_170155.log.json) | + +### Pascal Context 59 + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3 | R-101-D8 | 480x480 | 40000 | - | - | V100 | 52.61 | 54.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context_59/deeplabv3_r101-d8_480x480_40k_pascal_context_59_20210416_110332-cb08ea46.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context_59/deeplabv3_r101-d8_480x480_40k_pascal_context_59-20210416_110332.log.json) | +| DeepLabV3 | R-101-D8 | 480x480 | 80000 | - | - | V100 | 52.46 | 54.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context_59/deeplabv3_r101-d8_480x480_80k_pascal_context_59_20210416_113002-26303993.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context_59/deeplabv3_r101-d8_480x480_80k_pascal_context_59-20210416_113002.log.json) | + +### COCO-Stuff 10k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3 | R-50-D8 | 512x512 | 20000 | 9.6 | 10.8 | V100 | 34.66 | 36.08 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025-b35f789d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 20000 | 13.2 | 8.7 | V100 | 37.30 | 38.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025-c49752cb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 40000 | - | - | V100 | 35.73 | 37.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305-dc76f3ff.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 40000 | - | - | V100 | 37.81 | 38.80 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305-636cb433.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305.log.json) | + +### COCO-Stuff 164k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3 | R-50-D8 | 512x512 | 80000 | 9.6 | 10.8 | V100 | 39.38 | 40.03 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k_20210709_163016-88675c24.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k_20210709_163016.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 80000 | 13.2 | 8.7 | V100 | 40.87 | 41.50 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k_20210709_201252-13600dc2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k_20210709_201252.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 160000 | - | - | V100 | 41.09 | 41.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k_20210709_163016-49f2812b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k_20210709_163016.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 160000 | - | - | V100 | 41.82 | 42.49 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k_20210709_155402-f035acfd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k_20210709_155402.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 320000 | - | - | V100 | 41.37 | 42.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k_20210709_155403-51b21115.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k_20210709_155403.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 320000 | - | - | V100 | 42.61 | 43.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3/deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k_20210709_155402-3cbca14d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k_20210709_155402.log.json) | + +Note: + +- `D-8` here corresponding to the output stride 8 setting for DeepLab series. +- `FP16` means Mixed Precision (FP16) is adopted in training. + +## Citation + +```bibtext +@article{chen2017rethinking, + title={Rethinking atrous convolution for semantic image segmentation}, + author={Chen, Liang-Chieh and Papandreou, George and Schroff, Florian and Adam, Hartwig}, + journal={arXiv preprint arXiv:1706.05587}, + year={2017} +} +``` diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..b9f3c17 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..da3a88f --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..d01803c --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..7964b51 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..1d1a620 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..7820546 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..8417416 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = './deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py' +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=optimizer, + loss_scale=512.) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..0ed6eee --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..add0083 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..349cc88 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..1c527e0 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..ea27bed --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..a43a786 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..8879d53 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-40k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..54671d4 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-40k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..1b2635d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..b7bb0b6 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..2d4f6f7 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..9d64ca2 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-80k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..54671d4 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb4-40k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..708932d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..a0f634d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..bc353bb --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..021c98c --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..c747cd7 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..6506abf --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..4a2a971 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..a52f29e --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..1bd29b9 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..27f0fc4 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..04e15f0 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..ba76a59 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..d0559c8 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/coco-stuff10k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..c5458d9 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..c3b4f94 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_320k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..40dbffa --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/coco-stuff10k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..3c4e753 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..e3b6c36 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..8333cc6 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..0bcdab5 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..519df5a --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..ba8c7de --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..d34bd89 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..818519f --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..07a234b --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/deeplabv3/metafile.yaml b/mmsegmentation/configs/deeplabv3/metafile.yaml new file mode 100644 index 0000000..650f7d6 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3/metafile.yaml @@ -0,0 +1,985 @@ +Collections: +- Name: DeepLabV3 + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + - Pascal Context + - Pascal Context 59 + - COCO-Stuff 10k + - COCO-Stuff 164k + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + README: configs/deeplabv3/README.md + Frameworks: + - PyTorch +Models: +- Name: deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.09 + mIoU(ms+flip): 80.45 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449-acadc2f8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.12 + mIoU(ms+flip): 79.61 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241-7fd3f799.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.58 + mIoU(ms+flip): 79.89 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 6.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723-7eda553c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.27 + mIoU(ms+flip): 80.11 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 10.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809-c64f889f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.7 + mIoU(ms+flip): 78.27 + Config: configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes_20201225_021506-23dffbe2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes-20201225_021506.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.32 + mIoU(ms+flip): 80.57 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404-b92cfdd4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.2 + mIoU(ms+flip): 81.21 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503-9e428899.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.48 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3 + - (FP16) + Training Resources: 4x V100 GPUS + Memory (GB): 5.75 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920-774d9cec.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.6 + mIoU(ms+flip): 78.26 + Config: configs/deeplabv3/deeplabv3_r18-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 1.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes_20201225_021506-6452126a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes-20201225_021506.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.89 + mIoU(ms+flip): 81.06 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338-788d6228.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.67 + mIoU(ms+flip): 80.81 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353-60e95418.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.71 + mIoU(ms+flip): 78.63 + Config: configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16-MG124 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 4.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-67b0c992.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.36 + mIoU(ms+flip): 79.84 + Config: configs/deeplabv3/deeplabv3_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16-MG124 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-57bb8425.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.26 + mIoU(ms+flip): 77.88 + Config: configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 1.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes_20201225_094144-46040cef.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes-20201225_094144.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.63 + mIoU(ms+flip): 80.98 + Config: configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 6.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes_20201225_155148-ec368954.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes-20201225_155148.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.01 + mIoU(ms+flip): 81.21 + Config: configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes_20201226_171821-8fd49503.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes-20201226_171821.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.63 + mIoU(ms+flip): 77.51 + Config: configs/deeplabv3/deeplabv3_r18b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 1.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes_20201225_094144-fdc985d9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes-20201225_094144.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.8 + mIoU(ms+flip): 80.27 + Config: configs/deeplabv3/deeplabv3_r50b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 6.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes_20201225_155404-87fb0cf4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes-20201225_155404.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.41 + mIoU(ms+flip): 80.73 + Config: configs/deeplabv3/deeplabv3_r101b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 10.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes_20201226_190843-9142ee57.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes-20201226_190843.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.42 + mIoU(ms+flip): 43.28 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 8.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028-0bb3f844.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.08 + mIoU(ms+flip): 45.19 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 12.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256-d89c7fa4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.66 + mIoU(ms+flip): 44.09 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227-5d0ee427.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.0 + mIoU(ms+flip): 46.66 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816-b1f72b3b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.17 + mIoU(ms+flip): 77.42 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906-596905ef.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.7 + mIoU(ms+flip): 79.95 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932-8d13832f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.68 + mIoU(ms+flip): 78.78 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546-2ae96e7e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.92 + mIoU(ms+flip): 79.18 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432-0017d784.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 46.55 + mIoU(ms+flip): 47.81 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context_20200911_204118-1aa27336.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context-20200911_204118.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 46.42 + mIoU(ms+flip): 47.53 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context_20200911_170155-2a21fff3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context-20200911_170155.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 52.61 + mIoU(ms+flip): 54.28 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context_59/deeplabv3_r101-d8_480x480_40k_pascal_context_59_20210416_110332-cb08ea46.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context_59/deeplabv3_r101-d8_480x480_40k_pascal_context_59-20210416_110332.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 52.46 + mIoU(ms+flip): 54.09 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context_59/deeplabv3_r101-d8_480x480_80k_pascal_context_59_20210416_113002-26303993.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context_59/deeplabv3_r101-d8_480x480_80k_pascal_context_59-20210416_113002.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 34.66 + mIoU(ms+flip): 36.08 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-20k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025-b35f789d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 37.3 + mIoU(ms+flip): 38.42 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-20k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 13.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025-c49752cb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k_20210821_043025.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 35.73 + mIoU(ms+flip): 37.09 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-40k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305-dc76f3ff.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 37.81 + mIoU(ms+flip): 38.8 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-40k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305-636cb433.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_043305.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 39.38 + mIoU(ms+flip): 40.03 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-80k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k_20210709_163016-88675c24.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k_20210709_163016.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 40.87 + mIoU(ms+flip): 41.5 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-80k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 13.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k_20210709_201252-13600dc2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k_20210709_201252.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 41.09 + mIoU(ms+flip): 41.69 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k_20210709_163016-49f2812b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k_20210709_163016.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 41.82 + mIoU(ms+flip): 42.49 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k_20210709_155402-f035acfd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k_20210709_155402.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 41.37 + mIoU(ms+flip): 42.22 + Config: configs/deeplabv3/deeplabv3_r50-d8_4xb4-320k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k_20210709_155403-51b21115.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k_20210709_155403.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch +- Name: deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 42.61 + mIoU(ms+flip): 43.42 + Config: configs/deeplabv3/deeplabv3_r101-d8_4xb4-320k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k_20210709_155402-3cbca14d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k_20210709_155402.log.json + Paper: + Title: Rethinking atrous convolution for semantic image segmentation + URL: https://arxiv.org/abs/1706.05587 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/aspp_head.py#L54 + Framework: PyTorch diff --git a/mmsegmentation/configs/deeplabv3plus/README.md b/mmsegmentation/configs/deeplabv3plus/README.md new file mode 100644 index 0000000..04d01fa --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/README.md @@ -0,0 +1,138 @@ +# DeepLabV3+ + +> [Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation](https://arxiv.org/abs/1802.02611) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Spatial pyramid pooling module or encode-decoder structure are used in deep neural networks for semantic segmentation task. The former networks are able to encode multi-scale contextual information by probing the incoming features with filters or pooling operations at multiple rates and multiple effective fields-of-view, while the latter networks can capture sharper object boundaries by gradually recovering the spatial information. In this work, we propose to combine the advantages from both methods. Specifically, our proposed model, DeepLabv3+, extends DeepLabv3 by adding a simple yet effective decoder module to refine the segmentation results especially along object boundaries. We further explore the Xception model and apply the depthwise separable convolution to both Atrous Spatial Pyramid Pooling and decoder modules, resulting in a faster and stronger encoder-decoder network. We demonstrate the effectiveness of the proposed model on PASCAL VOC 2012 and Cityscapes datasets, achieving the test set performance of 89.0% and 82.1% without any post-processing. Our paper is accompanied with a publicly available reference implementation of the proposed models in Tensorflow at [this https URL](https://github.com/tensorflow/models/tree/master/research/deeplab). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ----------------- | --------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| DeepLabV3+ | R-50-D8 | 512x1024 | 40000 | 7.5 | 3.94 | V100 | 79.61 | 81.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610-d222ffcd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 40000 | 11 | 2.60 | V100 | 80.21 | 81.82 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614-3769eecf.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614.log.json) | +| DeepLabV3+ | R-50-D8 | 769x769 | 40000 | 8.5 | 1.72 | V100 | 78.97 | 80.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143-1dcb0e3c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143.log.json) | +| DeepLabV3+ | R-101-D8 | 769x769 | 40000 | 12.5 | 1.15 | V100 | 79.46 | 80.50 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304-ff414b9e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304.log.json) | +| DeepLabV3+ | R-18-D8 | 512x1024 | 80000 | 2.2 | 14.27 | V100 | 76.89 | 78.76 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes_20201226_080942-cff257fe.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes-20201226_080942.log.json) | +| DeepLabV3+ | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 80.09 | 81.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 80.97 | 82.03 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143.log.json) | +| DeepLabV3+ (FP16) | R-101-D8 | 512x1024 | 80000 | 6.35 | 7.87 | V100 | 80.46 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920-f1104f4b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920.log.json) | +| DeepLabV3+ | R-18-D8 | 769x769 | 80000 | 2.5 | 5.74 | V100 | 76.26 | 77.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes_20201226_083346-f326e06a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes-20201226_083346.log.json) | +| DeepLabV3+ | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.83 | 81.48 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233.log.json) | +| DeepLabV3+ | R-101-D8 | 769x769 | 80000 | - | - | V100 | 80.65 | 81.47 | [config\[1\]](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20220406_154720-dfcc0b68.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20220406_154720.log.json) | +| DeepLabV3+ | R-101-D16-MG124 | 512x1024 | 40000 | 5.8 | 7.48 | V100 | 79.09 | 80.36 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/ddeeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-cf9ce186.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json) | +| DeepLabV3+ | R-101-D16-MG124 | 512x1024 | 80000 | 9.9 | - | V100 | 79.90 | 81.33 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-ee6158e0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json) | +| DeepLabV3+ | R-18b-D8 | 512x1024 | 80000 | 2.1 | 14.95 | V100 | 75.87 | 77.52 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes_20201226_090828-e451abd9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes-20201226_090828.log.json) | +| DeepLabV3+ | R-50b-D8 | 512x1024 | 80000 | 7.4 | 3.94 | V100 | 80.28 | 81.44 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes_20201225_213645-a97e4e43.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes-20201225_213645.log.json) | +| DeepLabV3+ | R-101b-D8 | 512x1024 | 80000 | 10.9 | 2.60 | V100 | 80.16 | 81.41 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes_20201226_190843-9c3c93a4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes-20201226_190843.log.json) | +| DeepLabV3+ | R-18b-D8 | 769x769 | 80000 | 2.4 | 5.96 | V100 | 76.36 | 78.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes_20201226_151312-2c868aff.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes-20201226_151312.log.json) | +| DeepLabV3+ | R-50b-D8 | 769x769 | 80000 | 8.4 | 1.72 | V100 | 79.41 | 80.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes_20201225_224655-8b596d1c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes-20201225_224655.log.json) | +| DeepLabV3+ | R-101b-D8 | 769x769 | 80000 | 12.3 | 1.10 | V100 | 79.88 | 81.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes_20201226_205041-227cdf7c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes-20201226_205041.log.json) | + +\[1\] The training of the model is sensitive to random seed, and the seed to train it is 1111. + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-50-D8 | 512x512 | 80000 | 10.6 | 21.01 | V100 | 42.72 | 43.75 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028-bf1400d8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 80000 | 14.1 | 14.16 | V100 | 44.60 | 46.06 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139-d5730af7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 160000 | - | - | V100 | 43.95 | 44.93 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504-6135c7e0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 160000 | - | - | V100 | 45.47 | 46.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232-38ed86bb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-50-D8 | 512x512 | 20000 | 7.6 | 21 | V100 | 75.93 | 77.50 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323-aad58ef1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 20000 | 11 | 13.88 | V100 | 77.22 | 78.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345-c7ff3d56.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 40000 | - | - | V100 | 76.81 | 77.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759-e1b43aa9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 40000 | - | - | V100 | 78.62 | 79.53 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333-faf03387.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-101-D8 | 480x480 | 40000 | - | 9.09 | V100 | 47.30 | 48.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context_20200911_165459-d3c8a29e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context-20200911_165459.log.json) | +| DeepLabV3+ | R-101-D8 | 480x480 | 80000 | - | - | V100 | 47.23 | 48.26 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context_20200911_155322-145d3ee8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context-20200911_155322.log.json) | + +### Pascal Context 59 + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-101-D8 | 480x480 | 40000 | - | - | V100 | 52.86 | 54.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59_20210416_111233-ed937f15.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59-20210416_111233.log.json) | +| DeepLabV3+ | R-101-D8 | 480x480 | 80000 | - | - | V100 | 53.2 | 54.67 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59_20210416_111127-7ca0331d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59-20210416_111127.log.json) | + +### LoveDA + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| DeepLabV3+ | R-18-D8 | 512x512 | 80000 | 1.93 | 25.57 | V100 | 50.28 | 50.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_loveda/deeplabv3plus_r18-d8_512x512_80k_loveda_20211104_132800-ce0fa0ca.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_loveda/deeplabv3plus_r18-d8_512x512_80k_loveda_20211104_132800.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 80000 | 7.37 | 6.00 | V100 | 50.99 | 50.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_loveda/deeplabv3plus_r50-d8_512x512_80k_loveda_20211105_080442-f0720392.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_loveda/deeplabv3plus_r50-d8_512x512_80k_loveda_20211105_080442.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 80000 | 10.84 | 4.33 | V100 | 51.47 | 51.32 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_loveda/deeplabv3plus_r101-d8_512x512_80k_loveda_20211105_110759-4c1f297e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_loveda/deeplabv3plus_r101-d8_512x512_80k_loveda_20211105_110759.log.json) | + +### Potsdam + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-18-D8 | 512x512 | 80000 | 1.91 | 81.68 | V100 | 77.09 | 78.44 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_potsdam/deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_potsdam/deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 80000 | 7.36 | 26.44 | V100 | 78.33 | 79.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_potsdam/deeplabv3plus_r50-d8_512x512_80k_potsdam_20211219_031508-7e7a2b24.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_potsdam/deeplabv3plus_r50-d8_512x512_80k_potsdam_20211219_031508.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 80000 | 10.83 | 17.56 | V100 | 78.7 | 79.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_potsdam/deeplabv3plus_r101-d8_512x512_80k_potsdam_20211219_031508-8b112708.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_potsdam/deeplabv3plus_r101-d8_512x512_80k_potsdam_20211219_031508.log.json) | + +### Vaihingen + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-18-D8 | 512x512 | 80000 | 1.91 | 72.79 | V100 | 72.50 | 74.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen_20211231_230805-7626a263.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen_20211231_230805.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 80000 | 7.36 | 26.91 | V100 | 73.97 | 75.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen_20211231_230816-5040938d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen_20211231_230816.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 80000 | 10.83 | 18.59 | V100 | 73.06 | 74.14 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen_20211231_230816-8a095afa.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen_20211231_230816.log.json) | + +### iSAID + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-18-D8 | 896x896 | 80000 | 6.19 | 24.81 | V100 | 61.35 | 62.61 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid_20220110_180526-7059991d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid_20220110_180526.log.json) | +| DeepLabV3+ | R-50-D8 | 896x896 | 80000 | 21.45 | 8.42 | V100 | 67.06 | 68.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid_20220110_180526-598be439.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid_20220110_180526.log.json) | + +### Mapillary Vistas v1.2 + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DeepLabV3+ | R-50-D8 | 1280x1280 | 300000 | 24.04 | 17.92 | A100 | 47.35 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280_20230301_110504-655f8e43.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280_20230301_110504.json) | + +Note: + +- `D-8`/`D-16` here corresponding to the output stride 8/16 setting for DeepLab series. +- `MG-124` stands for multi-grid dilation in the last stage of ResNet. +- `FP16` means Mixed Precision (FP16) is adopted in training. +- `896x896` is the Crop Size of iSAID dataset, which is followed by the implementation of [PointFlow: Flowing Semantics Through Points for Aerial Image Segmentation](https://arxiv.org/pdf/2103.06564.pdf) + +## Citation + +```bibtex +@inproceedings{deeplabv3plus2018, + title={Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation}, + author={Liang-Chieh Chen and Yukun Zhu and George Papandreou and Florian Schroff and Hartwig Adam}, + booktitle={ECCV}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..71c9118 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..7d1ccf0 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..884b526 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..debb025 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..bc9334e --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..4af9aa2 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..9c9883d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = './deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py' +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=optimizer, + loss_scale=512.) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..c38a802 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..97bb827 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..e4b4011 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..eeefae4 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-40k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..0755c53 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..844ac96 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..87c6da9 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..115b1c9 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..9aaa653 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..5063b13 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..b99c2c7 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..d1bcb09 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..c78fc1e --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5f54913 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..1b361d6 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..3a1a753 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..01bbf9b --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..134f2cf --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..2194838 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..ea86219 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..34ee7ed --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280.py new file mode 100644 index 0000000..133c45a --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/mapillary_v1_65.py', + '../_base_/default_runtime.py', +] + +crop_size = (1280, 1280) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict(depth=50), + decode_head=dict(num_classes=65), + auxiliary_head=dict(num_classes=65)) + +iters = 300000 +# optimizer +optimizer = dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.0001) +# optimizer +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict( + custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)})) +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=iters, + by_epoch=False) +] + +# training schedule for 300k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=iters, val_interval=iters // 10) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') + +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=iters // 10), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +train_dataloader = dict(batch_size=2) + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (4 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=8) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..32f994d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..8cdf534 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..0d249b0 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..863a46e --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..9a899fb --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..1876d0c --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..95b56d0 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..459c62d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..0d61b50 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..6f872ca --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..7edec14 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/isaid.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (896, 896) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=16), + auxiliary_head=dict(num_classes=16)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..64e262c --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/loveda.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=7), + auxiliary_head=dict(num_classes=7)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..5ff7fcb --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..84aaf25 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..5810d6b --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/potsdam.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=dict(num_classes=6)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..a7f4b2d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/vaihingen.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=dict(num_classes=6)) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..3e28135 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..6366bd4 --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/deeplabv3plus/metafile.yaml b/mmsegmentation/configs/deeplabv3plus/metafile.yaml new file mode 100644 index 0000000..b41de4d --- /dev/null +++ b/mmsegmentation/configs/deeplabv3plus/metafile.yaml @@ -0,0 +1,1041 @@ +Collections: +- Name: DeepLabV3+ + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + - Pascal Context + - Pascal Context 59 + - LoveDA + - Potsdam + - Vaihingen + - iSAID + - Mapillary Vistas v1.2 + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + README: configs/deeplabv3plus/README.md + Frameworks: + - PyTorch +Models: +- Name: deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.61 + mIoU(ms+flip): 81.01 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 7.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610-d222ffcd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.21 + mIoU(ms+flip): 81.82 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 11.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614-3769eecf.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.97 + mIoU(ms+flip): 80.46 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 8.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143-1dcb0e3c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.46 + mIoU(ms+flip): 80.5 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 12.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304-ff414b9e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.89 + mIoU(ms+flip): 78.76 + Config: configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 2.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes_20201226_080942-cff257fe.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes-20201226_080942.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.09 + mIoU(ms+flip): 81.13 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.97 + mIoU(ms+flip): 82.03 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.46 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3+ + - (FP16) + Training Resources: 4x V100 GPUS + Memory (GB): 6.35 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920-f1104f4b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.26 + mIoU(ms+flip): 77.91 + Config: configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 2.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes_20201226_083346-f326e06a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes-20201226_083346.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.83 + mIoU(ms+flip): 81.48 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.65 + mIoU(ms+flip): 81.47 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20220406_154720-dfcc0b68.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20220406_154720.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: ddeeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.09 + mIoU(ms+flip): 80.36 + Config: configs/deeplabv3plus/ddeeplabv3plus_r101-d16-mg124_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16-MG124 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 5.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-cf9ce186.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.9 + mIoU(ms+flip): 81.33 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16-MG124 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 9.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-ee6158e0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.87 + mIoU(ms+flip): 77.52 + Config: configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 2.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes_20201226_090828-e451abd9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes-20201226_090828.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.28 + mIoU(ms+flip): 81.44 + Config: configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 7.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes_20201225_213645-a97e4e43.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes-20201225_213645.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.16 + mIoU(ms+flip): 81.41 + Config: configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 10.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes_20201226_190843-9c3c93a4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes-20201226_190843.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.36 + mIoU(ms+flip): 78.24 + Config: configs/deeplabv3plus/deeplabv3plus_r18b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 2.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes_20201226_151312-2c868aff.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes-20201226_151312.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.41 + mIoU(ms+flip): 80.56 + Config: configs/deeplabv3plus/deeplabv3plus_r50b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 8.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes_20201225_224655-8b596d1c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes-20201225_224655.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.88 + mIoU(ms+flip): 81.46 + Config: configs/deeplabv3plus/deeplabv3plus_r101b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 12.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes_20201226_205041-227cdf7c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes-20201226_205041.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.72 + mIoU(ms+flip): 43.75 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 10.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028-bf1400d8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.6 + mIoU(ms+flip): 46.06 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 14.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139-d5730af7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.95 + mIoU(ms+flip): 44.93 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504-6135c7e0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.47 + mIoU(ms+flip): 46.35 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232-38ed86bb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 75.93 + mIoU(ms+flip): 77.5 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 7.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323-aad58ef1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.22 + mIoU(ms+flip): 78.59 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 11.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345-c7ff3d56.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.81 + mIoU(ms+flip): 77.57 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759-e1b43aa9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.62 + mIoU(ms+flip): 79.53 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333-faf03387.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 47.3 + mIoU(ms+flip): 48.47 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-40k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context_20200911_165459-d3c8a29e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context-20200911_165459.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 47.23 + mIoU(ms+flip): 48.26 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context_20200911_155322-145d3ee8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context-20200911_155322.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 52.86 + mIoU(ms+flip): 54.54 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-40k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59_20210416_111233-ed937f15.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59-20210416_111233.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 53.2 + mIoU(ms+flip): 54.67 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59_20210416_111127-7ca0331d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59-20210416_111127.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 50.28 + mIoU(ms+flip): 50.47 + Config: configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - R-18-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 1.93 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_loveda/deeplabv3plus_r18-d8_512x512_80k_loveda_20211104_132800-ce0fa0ca.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_loveda/deeplabv3plus_r18-d8_512x512_80k_loveda_20211104_132800.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 50.99 + mIoU(ms+flip): 50.65 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 7.37 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_loveda/deeplabv3plus_r50-d8_512x512_80k_loveda_20211105_080442-f0720392.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_loveda/deeplabv3plus_r50-d8_512x512_80k_loveda_20211105_080442.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 51.47 + mIoU(ms+flip): 51.32 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 10.84 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_loveda/deeplabv3plus_r101-d8_512x512_80k_loveda_20211105_110759-4c1f297e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_loveda/deeplabv3plus_r101-d8_512x512_80k_loveda_20211105_110759.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 77.09 + mIoU(ms+flip): 78.44 + Config: configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - R-18-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 1.91 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_potsdam/deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_potsdam/deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 78.33 + mIoU(ms+flip): 79.27 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 7.36 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_potsdam/deeplabv3plus_r50-d8_512x512_80k_potsdam_20211219_031508-7e7a2b24.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_potsdam/deeplabv3plus_r50-d8_512x512_80k_potsdam_20211219_031508.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 78.7 + mIoU(ms+flip): 79.47 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 10.83 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_potsdam/deeplabv3plus_r101-d8_512x512_80k_potsdam_20211219_031508-8b112708.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_potsdam/deeplabv3plus_r101-d8_512x512_80k_potsdam_20211219_031508.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 72.5 + mIoU(ms+flip): 74.13 + Config: configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - R-18-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 1.91 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen_20211231_230805-7626a263.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen_20211231_230805.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 73.97 + mIoU(ms+flip): 75.05 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 7.36 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen_20211231_230816-5040938d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen_20211231_230816.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 73.06 + mIoU(ms+flip): 74.14 + Config: configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - R-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 10.83 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen_20211231_230816-8a095afa.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen_20211231_230816.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 61.35 + mIoU(ms+flip): 62.61 + Config: configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - R-18-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 6.19 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid_20220110_180526-7059991d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid_20220110_180526.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 67.06 + mIoU(ms+flip): 68.02 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 21.45 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid_20220110_180526-598be439.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid_20220110_180526.log.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch +- Name: deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Mapillary Vistas v1.2 + Metrics: + mIoU: 47.35 + Config: configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280.py + Metadata: + Training Data: Mapillary Vistas v1.2 + Batch Size: 8 + Architecture: + - R-50-D8 + - DeepLabV3+ + Training Resources: 4x A100 GPUS + Memory (GB): 24.04 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280_20230301_110504-655f8e43.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280/deeplabv3plus_r50-d8_4xb2-300k_mapillay_v1_65-1280x1280_20230301_110504.json + Paper: + Title: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + URL: https://arxiv.org/abs/1802.02611 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/sep_aspp_head.py#L30 + Framework: PyTorch diff --git a/mmsegmentation/configs/dmnet/README.md b/mmsegmentation/configs/dmnet/README.md new file mode 100644 index 0000000..b0cf944 --- /dev/null +++ b/mmsegmentation/configs/dmnet/README.md @@ -0,0 +1,59 @@ +# DMNet + +> [Dynamic Multi-scale Filters for Semantic Segmentation](https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Multi-scale representation provides an effective way toaddress scale variation of objects and stuff in semantic seg-mentation. Previous works construct multi-scale represen-tation by utilizing different filter sizes, expanding filter sizeswith dilated filters or pooling grids, and the parameters ofthese filters are fixed after training. These methods oftensuffer from heavy computational cost or have more param-eters, and are not adaptive to the input image during in-ference. To address these problems, this paper proposes aDynamic Multi-scale Network (DMNet) to adaptively cap-ture multi-scale contents for predicting pixel-level semanticlabels. DMNet is composed of multiple Dynamic Convolu-tional Modules (DCMs) arranged in parallel, each of whichexploits context-aware filters to estimate semantic represen-tation for a specific scale. The outputs of multiple DCMsare further integrated for final segmentation. We conductextensive experiments to evaluate our DMNet on three chal-lenging semantic segmentation and scene parsing datasets,PASCAL VOC 2012, Pascal-Context, and ADE20K. DMNetachieves a new record 84.4% mIoU on PASCAL VOC 2012test set without MS COCO pre-trained and post-processing,and also obtains state-of-the-art performance on Pascal-Context and ADE20K. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DMNet | R-50-D8 | 512x1024 | 40000 | 7.0 | 3.66 | V100 | 77.78 | 79.14 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes_20201215_042326-615373cf.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes-20201215_042326.log.json) | +| DMNet | R-101-D8 | 512x1024 | 40000 | 10.6 | 2.54 | V100 | 78.37 | 79.72 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes_20201215_043100-8291e976.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes-20201215_043100.log.json) | +| DMNet | R-50-D8 | 769x769 | 40000 | 7.9 | 1.57 | V100 | 78.49 | 80.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes_20201215_093706-e7f0e23e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes-20201215_093706.log.json) | +| DMNet | R-101-D8 | 769x769 | 40000 | 12.0 | 1.01 | V100 | 77.62 | 78.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes_20201215_081348-a74261f6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes-20201215_081348.log.json) | +| DMNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 79.07 | 80.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes_20201215_053728-3c8893b9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes-20201215_053728.log.json) | +| DMNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 79.64 | 80.67 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes_20201215_031718-fa081cb8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes-20201215_031718.log.json) | +| DMNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.22 | 80.55 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes_20201215_034006-6060840e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes-20201215_034006.log.json) | +| DMNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.19 | 80.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes_20201215_082810-7f0de59a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes-20201215_082810.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DMNet | R-50-D8 | 512x512 | 80000 | 9.4 | 20.95 | V100 | 42.37 | 43.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k_20201215_144744-f89092a6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k-20201215_144744.log.json) | +| DMNet | R-101-D8 | 512x512 | 80000 | 13.0 | 13.88 | V100 | 45.34 | 46.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k_20201215_104812-bfa45311.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k-20201215_104812.log.json) | +| DMNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 43.15 | 44.17 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k_20201215_115313-025ab3f9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k-20201215_115313.log.json) | +| DMNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 45.42 | 46.76 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet/dmnet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k_20201215_111145-a0bc02ef.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k-20201215_111145.log.json) | + +## Citation + +```bibtex +@InProceedings{He_2019_ICCV, +author = {He, Junjun and Deng, Zhongying and Qiao, Yu}, +title = {Dynamic Multi-Scale Filters for Semantic Segmentation}, +booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, +month = {October}, +year = {2019} +} +``` diff --git a/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..9832b62 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..03346c5 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..fd7e9ac --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..2205e60 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..23e215b --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..5c25587 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..aa86b01 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..8c2dbf3 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..bc21606 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..e32ae71 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..71d0a04 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..727bed0 --- /dev/null +++ b/mmsegmentation/configs/dmnet/dmnet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/dmnet/metafile.yaml b/mmsegmentation/configs/dmnet/metafile.yaml new file mode 100644 index 0000000..7f5e536 --- /dev/null +++ b/mmsegmentation/configs/dmnet/metafile.yaml @@ -0,0 +1,296 @@ +Collections: +- Name: DMNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + README: configs/dmnet/README.md + Frameworks: + - PyTorch +Models: +- Name: dmnet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.78 + mIoU(ms+flip): 79.14 + Config: configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DMNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes_20201215_042326-615373cf.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes-20201215_042326.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.37 + mIoU(ms+flip): 79.72 + Config: configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DMNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes_20201215_043100-8291e976.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes-20201215_043100.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.49 + mIoU(ms+flip): 80.27 + Config: configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DMNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes_20201215_093706-e7f0e23e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes-20201215_093706.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.62 + mIoU(ms+flip): 78.94 + Config: configs/dmnet/dmnet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DMNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes_20201215_081348-a74261f6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes-20201215_081348.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.07 + mIoU(ms+flip): 80.22 + Config: configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DMNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes_20201215_053728-3c8893b9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes-20201215_053728.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.64 + mIoU(ms+flip): 80.67 + Config: configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DMNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes_20201215_031718-fa081cb8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes-20201215_031718.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.22 + mIoU(ms+flip): 80.55 + Config: configs/dmnet/dmnet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DMNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes_20201215_034006-6060840e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes-20201215_034006.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.19 + mIoU(ms+flip): 80.65 + Config: configs/dmnet/dmnet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DMNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes_20201215_082810-7f0de59a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes-20201215_082810.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.37 + mIoU(ms+flip): 43.62 + Config: configs/dmnet/dmnet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DMNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k_20201215_144744-f89092a6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k-20201215_144744.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.34 + mIoU(ms+flip): 46.13 + Config: configs/dmnet/dmnet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DMNet + Training Resources: 4x V100 GPUS + Memory (GB): 13.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k_20201215_104812-bfa45311.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k-20201215_104812.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.15 + mIoU(ms+flip): 44.17 + Config: configs/dmnet/dmnet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DMNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k_20201215_115313-025ab3f9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k-20201215_115313.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch +- Name: dmnet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: DMNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.42 + mIoU(ms+flip): 46.76 + Config: configs/dmnet/dmnet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DMNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k_20201215_111145-a0bc02ef.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k-20201215_111145.log.json + Paper: + Title: Dynamic Multi-scale Filters for Semantic Segmentation + URL: https://openaccess.thecvf.com/content_ICCV_2019/papers/He_Dynamic_Multi-Scale_Filters_for_Semantic_Segmentation_ICCV_2019_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dm_head.py#L93 + Framework: PyTorch diff --git a/mmsegmentation/configs/dnlnet/README.md b/mmsegmentation/configs/dnlnet/README.md new file mode 100644 index 0000000..6835ffd --- /dev/null +++ b/mmsegmentation/configs/dnlnet/README.md @@ -0,0 +1,62 @@ +# DNLNet + +> [Disentangled Non-Local Neural Networks](https://arxiv.org/abs/2006.06668) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The non-local block is a popular module for strengthening the context modeling ability of a regular convolutional neural network. This paper first studies the non-local block in depth, where we find that its attention computation can be split into two terms, a whitened pairwise term accounting for the relationship between two pixels and a unary term representing the saliency of every pixel. We also observe that the two terms trained alone tend to model different visual clues, e.g. the whitened pairwise term learns within-region relationships while the unary term learns salient boundaries. However, the two terms are tightly coupled in the non-local block, which hinders the learning of each. Based on these findings, we present the disentangled non-local block, where the two terms are decoupled to facilitate learning for both terms. We demonstrate the effectiveness of the decoupled design on various tasks, such as semantic segmentation on Cityscapes, ADE20K and PASCAL Context, object detection on COCO, and action recognition on Kinetics. + + + +
+ +
+ +## Results and models (in progress) + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DNLNet | R-50-D8 | 512x1024 | 40000 | 7.3 | 2.56 | V100 | 78.61 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes_20200904_233629-53d4ea93.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes-20200904_233629.log.json) | +| DNLNet | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.96 | V100 | 78.31 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes_20200904_233629-9928ffef.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes-20200904_233629.log.json) | +| DNLNet | R-50-D8 | 769x769 | 40000 | 9.2 | 1.50 | V100 | 78.44 | 80.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes_20200820_232206-0f283785.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes-20200820_232206.log.json) | +| DNLNet | R-101-D8 | 769x769 | 40000 | 12.6 | 1.02 | V100 | 76.39 | 77.77 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes_20200820_171256-76c596df.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes-20200820_171256.log.json) | +| DNLNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 79.33 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes_20200904_233629-58b2f778.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes-20200904_233629.log.json) | +| DNLNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 80.41 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes_20200904_233629-758e2dd4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes-20200904_233629.log.json) | +| DNLNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.36 | 80.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes_20200820_011925-366bc4c7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes-20200820_011925.log.json) | +| DNLNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.41 | 80.68 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes_20200821_051111-95ff84ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes-20200821_051111.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DNLNet | R-50-D8 | 512x512 | 80000 | 8.8 | 20.66 | V100 | 41.76 | 42.99 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k_20200826_183354-1cf6e0c1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k-20200826_183354.log.json) | +| DNLNet | R-101-D8 | 512x512 | 80000 | 12.8 | 12.54 | V100 | 43.76 | 44.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k_20200826_183354-d820d6ea.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k-20200826_183354.log.json) | +| DNLNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 41.87 | 43.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k_20200826_183350-37837798.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k-20200826_183350.log.json) | +| DNLNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 44.25 | 45.78 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet/dnl_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k_20200826_183350-ed522c61.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k-20200826_183350.log.json) | + +## Notes + +This example is to reproduce ["Disentangled Non-Local Neural Networks"](https://arxiv.org/abs/2006.06668) for semantic segmentation. It is still in progress. + +## Citation + +```bibtex +@misc{yin2020disentangled, + title={Disentangled Non-Local Neural Networks}, + author={Minghao Yin and Zhuliang Yao and Yue Cao and Xiu Li and Zheng Zhang and Stephen Lin and Han Hu}, + year={2020}, + booktitle={ECCV} +} +``` diff --git a/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..310d84e --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..a94dbb8 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..f9b6d5e --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..9c7d557 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..1edc26f --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..d29c17e --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..be38992 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..9eaaa63 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..2e43178 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..cb379c1 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,16 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) + +optim_wrapper = dict( + paramwise_cfg=dict( + custom_keys=dict(theta=dict(wd_mult=0.), phi=dict(wd_mult=0.)))) diff --git a/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..b2ae2a8 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..f310a4e --- /dev/null +++ b/mmsegmentation/configs/dnlnet/dnl_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/dnlnet/metafile.yaml b/mmsegmentation/configs/dnlnet/metafile.yaml new file mode 100644 index 0000000..22e48d3 --- /dev/null +++ b/mmsegmentation/configs/dnlnet/metafile.yaml @@ -0,0 +1,292 @@ +Collections: +- Name: DNLNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + README: configs/dnlnet/README.md + Frameworks: + - PyTorch +Models: +- Name: dnl_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.61 + Config: configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes_20200904_233629-53d4ea93.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes-20200904_233629.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.31 + Config: configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes_20200904_233629-9928ffef.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes-20200904_233629.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.44 + mIoU(ms+flip): 80.27 + Config: configs/dnlnet/dnl_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes_20200820_232206-0f283785.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes-20200820_232206.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.39 + mIoU(ms+flip): 77.77 + Config: configs/dnlnet/dnl_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes_20200820_171256-76c596df.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes-20200820_171256.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.33 + Config: configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes_20200904_233629-58b2f778.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes-20200904_233629.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.41 + Config: configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes_20200904_233629-758e2dd4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes-20200904_233629.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.36 + mIoU(ms+flip): 80.7 + Config: configs/dnlnet/dnl_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes_20200820_011925-366bc4c7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes-20200820_011925.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.41 + mIoU(ms+flip): 80.68 + Config: configs/dnlnet/dnl_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes_20200821_051111-95ff84ab.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes-20200821_051111.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.76 + mIoU(ms+flip): 42.99 + Config: configs/dnlnet/dnl_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k_20200826_183354-1cf6e0c1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k-20200826_183354.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.76 + mIoU(ms+flip): 44.91 + Config: configs/dnlnet/dnl_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k_20200826_183354-d820d6ea.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k-20200826_183354.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.87 + mIoU(ms+flip): 43.01 + Config: configs/dnlnet/dnl_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k_20200826_183350-37837798.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k-20200826_183350.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch +- Name: dnl_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: DNLNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.25 + mIoU(ms+flip): 45.78 + Config: configs/dnlnet/dnl_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - DNLNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k_20200826_183350-ed522c61.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k-20200826_183350.log.json + Paper: + Title: Disentangled Non-Local Neural Networks + URL: https://arxiv.org/abs/2006.06668 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dnl_head.py#L88 + Framework: PyTorch diff --git a/mmsegmentation/configs/dpt/README.md b/mmsegmentation/configs/dpt/README.md new file mode 100644 index 0000000..b3a5573 --- /dev/null +++ b/mmsegmentation/configs/dpt/README.md @@ -0,0 +1,67 @@ +# DPT + +> [Vision Transformer for Dense Prediction](https://arxiv.org/abs/2103.13413) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We introduce dense vision transformers, an architecture that leverages vision transformers in place of convolutional networks as a backbone for dense prediction tasks. We assemble tokens from various stages of the vision transformer into image-like representations at various resolutions and progressively combine them into full-resolution predictions using a convolutional decoder. The transformer backbone processes representations at a constant and relatively high resolution and has a global receptive field at every stage. These properties allow the dense vision transformer to provide finer-grained and more globally coherent predictions when compared to fully-convolutional networks. Our experiments show that this architecture yields substantial improvements on dense prediction tasks, especially when a large amount of training data is available. For monocular depth estimation, we observe an improvement of up to 28% in relative performance when compared to a state-of-the-art fully-convolutional network. When applied to semantic segmentation, dense vision transformers set a new state of the art on ADE20K with 49.02% mIoU. We further show that the architecture can be fine-tuned on smaller datasets such as NYUv2, KITTI, and Pascal Context where it also sets the new state of the art. Our models are available at [this https URL](https://github.com/isl-org/DPT). + + + +
+ +
+ +## Usage + +To use other repositories' pre-trained models, it is necessary to convert keys. + +We provide a script [`vit2mmseg.py`](../../tools/model_converters/vit2mmseg.py) in the tools directory to convert the key of models from [timm](https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py) to MMSegmentation style. + +```shell +python tools/model_converters/vit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/vit2mmseg.py https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth pretrain/jx_vit_base_p16_224-80ecf9dd.pth +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| DPT | ViT-B | 512x512 | 160000 | 8.09 | 10.41 | V100 | 46.97 | 48.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dpt/dpt_vit-b16_512x512_160k_ade20k/dpt_vit-b16_512x512_160k_ade20k-db31cf52.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/dpt/dpt_vit-b16_512x512_160k_ade20k/dpt_vit-b16_512x512_160k_ade20k-20210809_172025.log.json) | + +## Citation + +```bibtex +@article{dosoViTskiy2020, + title={An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}, + author={DosoViTskiy, Alexey and Beyer, Lucas and Kolesnikov, Alexander and Weissenborn, Dirk and Zhai, Xiaohua and Unterthiner, Thomas and Dehghani, Mostafa and Minderer, Matthias and Heigold, Georg and Gelly, Sylvain and Uszkoreit, Jakob and Houlsby, Neil}, + journal={arXiv preprint arXiv:2010.11929}, + year={2020} +} + +@article{Ranftl2021, + author = {Ren\'{e} Ranftl and Alexey Bochkovskiy and Vladlen Koltun}, + title = {Vision Transformers for Dense Prediction}, + journal = {ArXiv preprint}, + year = {2021}, +} +``` diff --git a/mmsegmentation/configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..56b33d9 --- /dev/null +++ b/mmsegmentation/configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/dpt_vit-b16.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/dpt/metafile.yaml b/mmsegmentation/configs/dpt/metafile.yaml new file mode 100644 index 0000000..b721e04 --- /dev/null +++ b/mmsegmentation/configs/dpt/metafile.yaml @@ -0,0 +1,37 @@ +Collections: +- Name: DPT + License: Apache License 2.0 + Metadata: + Training Data: + - ADE20K + Paper: + Title: Vision Transformer for Dense Prediction + URL: https://arxiv.org/abs/2103.13413 + README: configs/dpt/README.md + Frameworks: + - PyTorch +Models: +- Name: dpt_vit-b16_8xb2-160k_ade20k-512x512 + In Collection: DPT + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.97 + mIoU(ms+flip): 48.34 + Config: configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-B + - DPT + Training Resources: 8x V100 GPUS + Memory (GB): 8.09 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/dpt/dpt_vit-b16_512x512_160k_ade20k/dpt_vit-b16_512x512_160k_ade20k-db31cf52.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/dpt/dpt_vit-b16_512x512_160k_ade20k/dpt_vit-b16_512x512_160k_ade20k-20210809_172025.log.json + Paper: + Title: Vision Transformer for Dense Prediction + URL: https://arxiv.org/abs/2103.13413 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/dpt_head.py#L215 + Framework: PyTorch diff --git a/mmsegmentation/configs/dsdl/README.md b/mmsegmentation/configs/dsdl/README.md new file mode 100644 index 0000000..e564cff --- /dev/null +++ b/mmsegmentation/configs/dsdl/README.md @@ -0,0 +1,103 @@ +# DSDL: Standard Description Language for DataSet + + + +## Abstract + + + +Data is the cornerstone of artificial intelligence. The efficiency of data acquisition, exchange, and application directly impacts the advances in technologies and applications. Over the long history of AI, a vast quantity of data sets have been developed and distributed. However, these datasets are defined in very different forms, which incurs significant overhead when it comes to exchange, integration, and utilization -- it is often the case that one needs to develop a new customized tool or script in order to incorporate a new dataset into a workflow. + +To overcome such difficulties, we develop **Data Set Description Language (DSDL)**. More details please visit our [official documents](https://opendatalab.github.io/dsdl-docs/getting_started/overview/), dsdl datasets can be downloaded from our platform [OpenDataLab](https://opendatalab.com/). + + + +## Steps + +- install dsdl and opendatalab: + + ``` + pip install dsdl + pip install opendatalab + ``` + +- install mmseg and pytorch: + please refer this [installation documents](https://mmsegmentation.readthedocs.io/en/latest/get_started.html). + +- prepare dsdl dataset (take voc2012 as an example) + + - dowaload dsdl dataset (you will need an opendatalab account to do so. [register one now](https://opendatalab.com/)) + + ``` + cd data + + odl login + odl get PASCAL_VOC2012 + ``` + + usually, dataset is compressed on opendatalab platform, the downloaded voc 2012 dataset should be like this: + + ``` + data/ + โ”œโ”€โ”€ PASCAL_VOC2012 + โ”‚ย ย  โ”œโ”€โ”€ dsdl + โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ dsdl_Det_full.zip + โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dsdl_SemSeg_full.zip + โ”‚ย ย  โ”œโ”€โ”€ raw + โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VOC2012test.tar + โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VOCdevkit_18-May-2011.tar + โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VOCtrainval_11-May-2012.tar + โ”‚ย ย  โ””โ”€โ”€ README.md + โ””โ”€โ”€ ... + ``` + + - decompress dataset + + ``` + cd dsdl + unzip dsdl_SemSeg_full.zip + ``` + + as we do not need detection dsdl files, we only decompress the semantic segmentation files here. + + ``` + cd ../raw + tar -xvf VOCtrainval_11-May-2012.tar + tar -xvf VOC2012test.tar + + cd ../../ + ``` + +- change traning config + + open the [voc config file](voc.py) and set some file paths as below: + + ``` + data_root = 'data/PASCAL_VOC2012' + img_prefix = 'raw/VOCdevkit/VOC2012' + train_ann = 'dsdl/dsdl_SemSeg_full/set-train/train.yaml' + val_ann = 'dsdl/dsdl_SemSeg_full/set-val/val.yaml' + ``` + + as dsdl datasets with one task using one dataloader, we can simplly change these file paths to train a model on a different dataset. + +- train: + + - using single gpu: + + ``` + python tools/train.py {config_file} + ``` + + - using slrum: + + ``` + ./tools/slurm_train.sh {partition} {job_name} {config_file} {work_dir} {gpu_nums} + ``` + +## Test Results + +| Datasets | Model | mIoU(%) | Config | +| :--------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----: | :-----------------------: | +| voc2012 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906-596905ef.pth) | 76.73 | [config](./voc.py) | +| cityscapes | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449-acadc2f8.pth) | 79.01 | [config](./cityscapes.py) | diff --git a/mmsegmentation/configs/dsdl/cityscapes.py b/mmsegmentation/configs/dsdl/cityscapes.py new file mode 100644 index 0000000..94ccc06 --- /dev/null +++ b/mmsegmentation/configs/dsdl/cityscapes.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +# dataset settings +dataset_type = 'DSDLSegDataset' +data_root = 'data/CityScapes' +img_prefix = 'raw/CityScapes' +train_ann = 'dsdl/dsdl_SemSeg_full/set-train/train.yaml' +val_ann = 'dsdl/dsdl_SemSeg_full/set-val/val.yaml' + +used_labels = [ + 'road', 'sidewalk', 'building', 'wall', 'fence', 'pole', 'traffic_light', + 'traffic_sign', 'vegetation', 'terrain', 'sky', 'person', 'rider', 'car', + 'truck', 'bus', 'train', 'motorcycle', 'bicycle' +] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=2, + num_workers=2, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path=img_prefix, seg_map_path=img_prefix), + ann_file=train_ann, + used_labels=used_labels, + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path=img_prefix, seg_map_path=img_prefix), + ann_file=val_ann, + used_labels=used_labels, + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/configs/dsdl/voc.py b/mmsegmentation/configs/dsdl/voc.py new file mode 100644 index 0000000..c1895f7 --- /dev/null +++ b/mmsegmentation/configs/dsdl/voc.py @@ -0,0 +1,65 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] + +# dataset settings +dataset_type = 'DSDLSegDataset' +data_root = 'data/PASCAL_VOC2012' +img_prefix = 'raw/VOCdevkit/VOC2012' +train_ann = 'dsdl/dsdl_SemSeg_full/set-train/train.yaml' +val_ann = 'dsdl/dsdl_SemSeg_full/set-val/val.yaml' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path=img_prefix, seg_map_path=img_prefix), + ann_file=train_ann, + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path=img_prefix, seg_map_path=img_prefix), + ann_file=val_ann, + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator + +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/emanet/README.md b/mmsegmentation/configs/emanet/README.md new file mode 100644 index 0000000..8ffaf47 --- /dev/null +++ b/mmsegmentation/configs/emanet/README.md @@ -0,0 +1,46 @@ +# EMANet + +> [Expectation-Maximization Attention Networks for Semantic Segmentation](https://arxiv.org/abs/1907.13426) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Self-attention mechanism has been widely used for various tasks. It is designed to compute the representation of each position by a weighted sum of the features at all positions. Thus, it can capture long-range relations for computer vision tasks. However, it is computationally consuming. Since the attention maps are computed w.r.t all other positions. In this paper, we formulate the attention mechanism into an expectation-maximization manner and iteratively estimate a much more compact set of bases upon which the attention maps are computed. By a weighted summation upon these bases, the resulting representation is low-rank and deprecates noisy information from the input. The proposed Expectation-Maximization Attention (EMA) module is robust to the variance of input and is also friendly in memory and computation. Moreover, we set up the bases maintenance and normalization methods to stabilize its training procedure. We conduct extensive experiments on popular semantic segmentation benchmarks including PASCAL VOC, PASCAL Context and COCO Stuff, on which we set new records. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| EMANet | R-50-D8 | 512x1024 | 80000 | 5.4 | 4.58 | V100 | 77.59 | 79.44 | [config](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet/eemanet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes_20200901_100301-c43fcef1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-101-D8 | 512x1024 | 80000 | 6.2 | 2.87 | V100 | 79.10 | 81.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes_20200901_100301-2d970745.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-50-D8 | 769x769 | 80000 | 8.9 | 1.97 | V100 | 79.33 | 80.49 | [config](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes_20200901_100301-16f8de52.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-101-D8 | 769x769 | 80000 | 10.1 | 1.22 | V100 | 79.62 | 81.00 | [config](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes_20200901_100301-47a324ce.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes-20200901_100301.log.json) | + +## Citation + +```bibtex +@inproceedings{li2019expectation, + title={Expectation-maximization attention networks for semantic segmentation}, + author={Li, Xia and Zhong, Zhisheng and Wu, Jianlong and Yang, Yibo and Lin, Zhouchen and Liu, Hong}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision}, + pages={9167--9176}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..ee3a3b5 --- /dev/null +++ b/mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './emanet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..7319a3e --- /dev/null +++ b/mmsegmentation/configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './emanet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..6198e1f --- /dev/null +++ b/mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/emanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..a8e4521 --- /dev/null +++ b/mmsegmentation/configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/emanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/emanet/metafile.yaml b/mmsegmentation/configs/emanet/metafile.yaml new file mode 100644 index 0000000..b2a6b09 --- /dev/null +++ b/mmsegmentation/configs/emanet/metafile.yaml @@ -0,0 +1,109 @@ +Collections: +- Name: EMANet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: Expectation-Maximization Attention Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1907.13426 + README: configs/emanet/README.md + Frameworks: + - PyTorch +Models: +- Name: eemanet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: EMANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.59 + mIoU(ms+flip): 79.44 + Config: configs/emanet/eemanet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - EMANet + Training Resources: 4x V100 GPUS + Memory (GB): 5.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes_20200901_100301-c43fcef1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes-20200901_100301.log.json + Paper: + Title: Expectation-Maximization Attention Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1907.13426 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ema_head.py#L80 + Framework: PyTorch +- Name: emanet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: EMANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.1 + mIoU(ms+flip): 81.21 + Config: configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - EMANet + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes_20200901_100301-2d970745.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes-20200901_100301.log.json + Paper: + Title: Expectation-Maximization Attention Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1907.13426 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ema_head.py#L80 + Framework: PyTorch +- Name: emanet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: EMANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.33 + mIoU(ms+flip): 80.49 + Config: configs/emanet/emanet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - EMANet + Training Resources: 4x V100 GPUS + Memory (GB): 8.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes_20200901_100301-16f8de52.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes-20200901_100301.log.json + Paper: + Title: Expectation-Maximization Attention Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1907.13426 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ema_head.py#L80 + Framework: PyTorch +- Name: emanet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: EMANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.62 + mIoU(ms+flip): 81.0 + Config: configs/emanet/emanet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - EMANet + Training Resources: 4x V100 GPUS + Memory (GB): 10.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes_20200901_100301-47a324ce.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes-20200901_100301.log.json + Paper: + Title: Expectation-Maximization Attention Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1907.13426 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ema_head.py#L80 + Framework: PyTorch diff --git a/mmsegmentation/configs/encnet/README.md b/mmsegmentation/configs/encnet/README.md new file mode 100644 index 0000000..ff09bc3 --- /dev/null +++ b/mmsegmentation/configs/encnet/README.md @@ -0,0 +1,59 @@ +# EncNet + +> [Context Encoding for Semantic Segmentation](https://arxiv.org/abs/1803.08904) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Recent work has made significant progress in improving spatial resolution for pixelwise labeling with Fully Convolutional Network (FCN) framework by employing Dilated/Atrous convolution, utilizing multi-scale features and refining boundaries. In this paper, we explore the impact of global contextual information in semantic segmentation by introducing the Context Encoding Module, which captures the semantic context of scenes and selectively highlights class-dependent featuremaps. The proposed Context Encoding Module significantly improves semantic segmentation results with only marginal extra computation cost over FCN. Our approach has achieved new state-of-the-art results 51.7% mIoU on PASCAL-Context, 85.9% mIoU on PASCAL VOC 2012. Our single model achieves a final score of 0.5567 on ADE20K test set, which surpass the winning entry of COCO-Place Challenge in 2017. In addition, we also explore how the Context Encoding Module can improve the feature representation of relatively shallow networks for the image classification on CIFAR-10 dataset. Our 14 layer network has achieved an error rate of 3.45%, which is comparable with state-of-the-art approaches with over 10 times more layers. The source code for the complete system are publicly available. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| EncNet | R-50-D8 | 512x1024 | 40000 | 8.6 | 4.58 | V100 | 75.67 | 77.08 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes_20200621_220958-68638a47.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes-20200621_220958.log.json) | +| EncNet | R-101-D8 | 512x1024 | 40000 | 12.1 | 2.66 | V100 | 75.81 | 77.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes_20200621_220933-35e0a3e8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes-20200621_220933.log.json) | +| EncNet | R-50-D8 | 769x769 | 40000 | 9.8 | 1.82 | V100 | 76.24 | 77.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes_20200621_220958-3bcd2884.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes-20200621_220958.log.json) | +| EncNet | R-101-D8 | 769x769 | 40000 | 13.7 | 1.26 | V100 | 74.25 | 76.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes_20200621_220933-2fafed55.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes-20200621_220933.log.json) | +| EncNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 77.94 | 79.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes_20200622_003554-fc5c5624.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes-20200622_003554.log.json) | +| EncNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 78.55 | 79.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes_20200622_003555-1de64bec.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes-20200622_003555.log.json) | +| EncNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 77.44 | 78.72 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes_20200622_003554-55096dcb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes-20200622_003554.log.json) | +| EncNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 76.10 | 76.97 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes_20200622_003555-470ef79d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes-20200622_003555.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| EncNet | R-50-D8 | 512x512 | 80000 | 10.1 | 22.81 | V100 | 39.53 | 41.17 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k_20200622_042412-44b46b04.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k-20200622_042412.log.json) | +| EncNet | R-101-D8 | 512x512 | 80000 | 13.6 | 14.87 | V100 | 42.11 | 43.61 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k_20200622_101128-dd35e237.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k-20200622_101128.log.json) | +| EncNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 40.10 | 41.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k_20200622_101059-b2db95e0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k-20200622_101059.log.json) | +| EncNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 42.61 | 44.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet/encnet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k_20200622_073348-7989641f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k-20200622_073348.log.json) | + +## Citation + +```bibtex +@InProceedings{Zhang_2018_CVPR, +author = {Zhang, Hang and Dana, Kristin and Shi, Jianping and Zhang, Zhongyue and Wang, Xiaogang and Tyagi, Ambrish and Agrawal, Amit}, +title = {Context Encoding for Semantic Segmentation}, +booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2018} +} +``` diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..13ab367 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..7810ac4 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..bec6bd9 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..e1f6409 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..9599f9c --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..a9edfc2 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..d2fbab5 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..debe8c8 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..d5c3027 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..045d0fe --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..4dafcd5 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..e4d0b80 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..b916798 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..e5c9171 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..8ca126a --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..931d6c0 --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/encnet/encnet_r50s-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/encnet/encnet_r50s-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..e98104d --- /dev/null +++ b/mmsegmentation/configs/encnet/encnet_r50s-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(stem_channels=128), + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/encnet/metafile.yaml b/mmsegmentation/configs/encnet/metafile.yaml new file mode 100644 index 0000000..0dbdcfa --- /dev/null +++ b/mmsegmentation/configs/encnet/metafile.yaml @@ -0,0 +1,296 @@ +Collections: +- Name: EncNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + README: configs/encnet/README.md + Frameworks: + - PyTorch +Models: +- Name: encnet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.67 + mIoU(ms+flip): 77.08 + Config: configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes_20200621_220958-68638a47.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes-20200621_220958.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.81 + mIoU(ms+flip): 77.21 + Config: configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes_20200621_220933-35e0a3e8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes-20200621_220933.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.24 + mIoU(ms+flip): 77.85 + Config: configs/encnet/encnet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes_20200621_220958-3bcd2884.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes-20200621_220958.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.25 + mIoU(ms+flip): 76.25 + Config: configs/encnet/encnet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 13.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes_20200621_220933-2fafed55.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes-20200621_220933.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.94 + mIoU(ms+flip): 79.13 + Config: configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes_20200622_003554-fc5c5624.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes-20200622_003554.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.55 + mIoU(ms+flip): 79.47 + Config: configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes_20200622_003555-1de64bec.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes-20200622_003555.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.44 + mIoU(ms+flip): 78.72 + Config: configs/encnet/encnet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes_20200622_003554-55096dcb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes-20200622_003554.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.1 + mIoU(ms+flip): 76.97 + Config: configs/encnet/encnet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes_20200622_003555-470ef79d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes-20200622_003555.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 39.53 + mIoU(ms+flip): 41.17 + Config: configs/encnet/encnet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k_20200622_042412-44b46b04.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k-20200622_042412.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.11 + mIoU(ms+flip): 43.61 + Config: configs/encnet/encnet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 13.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k_20200622_101128-dd35e237.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k-20200622_101128.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.1 + mIoU(ms+flip): 41.71 + Config: configs/encnet/encnet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k_20200622_101059-b2db95e0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k-20200622_101059.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch +- Name: encnet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: EncNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.61 + mIoU(ms+flip): 44.01 + Config: configs/encnet/encnet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k_20200622_073348-7989641f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k-20200622_073348.log.json + Paper: + Title: Context Encoding for Semantic Segmentation + URL: https://arxiv.org/abs/1803.08904 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/enc_head.py#L63 + Framework: PyTorch diff --git a/mmsegmentation/configs/erfnet/README.md b/mmsegmentation/configs/erfnet/README.md new file mode 100644 index 0000000..55d7197 --- /dev/null +++ b/mmsegmentation/configs/erfnet/README.md @@ -0,0 +1,54 @@ +# ERFNet + +> [ERFNet: Efficient Residual Factorized ConvNet for Real-time Semantic Segmentation](http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17tits.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Semantic segmentation is a challenging task that addresses most of the perception needs of intelligent vehicles (IVs) in an unified way. Deep neural networks excel at this task, as they can be trained end-to-end to accurately classify multiple object categories in an image at pixel level. However, a good tradeoff between high quality and computational resources is yet not present in the state-of-the-art semantic segmentation approaches, limiting their application in real vehicles. In this paper, we propose a deep architecture that is able to run in real time while providing accurate semantic segmentation. The core of our architecture is a novel layer that uses residual connections and factorized convolutions in order to remain efficient while retaining remarkable accuracy. Our approach is able to run at over 83 FPS in a single Titan X, and 7 FPS in a Jetson TX1 (embedded device). A comprehensive set of experiments on the publicly available Cityscapes data set demonstrates that our system achieves an accuracy that is similar to the state of the art, while being orders of magnitude faster to compute than other architectures that achieve top precision. The resulting tradeoff makes our model an ideal approach for scene understanding in IV applications. The code is publicly available at: https://github.com/Eromera/erfnet. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ---: | ------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ERFNet | ERFNet | 512x1024 | 160000 | 6.04 | 15.26 | V100 | 72.5 | 74.75 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/erfnet/erfnet_fcn_4x4_512x1024_160k_cityscapes/erfnet_fcn_4x4_512x1024_160k_cityscapes_20220704_162145-dc90157a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/erfnet/erfnet_fcn_4x4_512x1024_160k_cityscapes/erfnet_fcn_4x4_512x1024_160k_cityscapes_20220704_162145.log.json) | + +Note: + +- The model is trained from scratch. + +- Last deconvolution layer in the [original paper](https://github.com/Eromera/erfnet_pytorch/blob/master/train/erfnet.py#L123) is replaced by a naive `FCNHead` decoder head and a bilinear upsampling layer, found more effective and efficient. + +- This model performance is sensitive to the seed values used, please refer to the log file for the specific settings of the seed. If you choose a different seed, the results might differ from the table results. + +## Citation + +```bibtex +@article{romera2017erfnet, + title={Erfnet: Efficient residual factorized convnet for real-time semantic segmentation}, + author={Romera, Eduardo and Alvarez, Jos{\'e} M and Bergasa, Luis M and Arroyo, Roberto}, + journal={IEEE Transactions on Intelligent Transportation Systems}, + volume={19}, + number={1}, + pages={263--272}, + year={2017}, + publisher={IEEE} +} +``` diff --git a/mmsegmentation/configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py b/mmsegmentation/configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..7d65582 --- /dev/null +++ b/mmsegmentation/configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/erfnet_fcn.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/erfnet/metafile.yaml b/mmsegmentation/configs/erfnet/metafile.yaml new file mode 100644 index 0000000..bf51412 --- /dev/null +++ b/mmsegmentation/configs/erfnet/metafile.yaml @@ -0,0 +1,37 @@ +Collections: +- Name: ERFNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: 'ERFNet: Efficient Residual Factorized ConvNet for Real-time Semantic Segmentation' + URL: http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17tits.pdf + README: configs/erfnet/README.md + Frameworks: + - PyTorch +Models: +- Name: erfnet_fcn_4xb4-160k_cityscapes-512x1024 + In Collection: ERFNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 72.5 + mIoU(ms+flip): 74.75 + Config: configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - ERFNet + - ERFNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.04 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/erfnet/erfnet_fcn_4x4_512x1024_160k_cityscapes/erfnet_fcn_4x4_512x1024_160k_cityscapes_20220704_162145-dc90157a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/erfnet/erfnet_fcn_4x4_512x1024_160k_cityscapes/erfnet_fcn_4x4_512x1024_160k_cityscapes_20220704_162145.log.json + Paper: + Title: 'ERFNet: Efficient Residual Factorized ConvNet for Real-time Semantic Segmentation' + URL: http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17tits.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/erfnet.py#L321 + Framework: PyTorch diff --git a/mmsegmentation/configs/fastfcn/README.md b/mmsegmentation/configs/fastfcn/README.md new file mode 100644 index 0000000..48644e5 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/README.md @@ -0,0 +1,63 @@ +# FastFCN + +> [FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation](https://arxiv.org/abs/1903.11816) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Modern approaches for semantic segmentation usually employ dilated convolutions in the backbone to extract high-resolution feature maps, which brings heavy computation complexity and memory footprint. To replace the time and memory consuming dilated convolutions, we propose a novel joint upsampling module named Joint Pyramid Upsampling (JPU) by formulating the task of extracting high-resolution feature maps into a joint upsampling problem. With the proposed JPU, our method reduces the computation complexity by more than three times without performance loss. Experiments show that JPU is superior to other upsampling modules, which can be plugged into many existing approaches to reduce computation complexity and improve performance. By replacing dilated convolutions with the proposed JPU module, our method achieves the state-of-the-art performance in Pascal Context dataset (mIoU of 53.13%) and ADE20K dataset (final score of 0.5584) while running 3 times faster. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------------------- | -------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FastFCN + DeepLabV3 | R-50-D32 | 512x1024 | 80000 | 5.67 | 2.64 | V100 | 79.12 | 80.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes_20210928_053722-5d1a2648.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes_20210928_053722.log.json) | +| FastFCN + DeepLabV3 | R-50-D32 (4x4) | 512x1024 | 80000 | 9.79 | - | V100 | 79.52 | 80.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes_20210924_214357-72220849.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes_20210924_214357.log.json) | +| FastFCN + PSPNet | R-50-D32 | 512x1024 | 80000 | 5.67 | 4.40 | V100 | 79.26 | 80.86 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes_20210928_053722-57749bed.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes_20210928_053722.log.json) | +| FastFCN + PSPNet | R-50-D32 (4x4) | 512x1024 | 80000 | 9.94 | - | V100 | 78.76 | 80.03 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes_20210925_061841-77e87b0a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes_20210925_061841.log.json) | +| FastFCN + EncNet | R-50-D32 | 512x1024 | 80000 | 8.15 | 4.77 | V100 | 77.97 | 79.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes_20210928_030036-78da5046.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes_20210928_030036.log.json) | +| FastFCN + EncNet | R-50-D32 (4x4) | 512x1024 | 80000 | 15.45 | - | V100 | 78.6 | 80.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes_20210926_093217-e1eb6dbb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes_20210926_093217.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------------------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FastFCN + DeepLabV3 | R-50-D32 | 512x1024 | 80000 | 8.46 | 12.06 | V100 | 41.88 | 42.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k_20211013_190619-3aa40f2d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k_20211013_190619.log.json) | +| FastFCN + DeepLabV3 | R-50-D32 | 512x1024 | 160000 | - | - | V100 | 43.58 | 44.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k_20211008_152246-27036aee.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k_20211008_152246.log.json) | +| FastFCN + PSPNet | R-50-D32 | 512x1024 | 80000 | 8.02 | 19.21 | V100 | 41.40 | 42.12 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k_20210930_225137-993d07c8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k_20210930_225137.log.json) | +| FastFCN + PSPNet | R-50-D32 | 512x1024 | 160000 | - | - | V100 | 42.63 | 43.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k_20211008_105455-e8f5a2fd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k_20211008_105455.log.json) | +| FastFCN + EncNet | R-50-D32 | 512x1024 | 80000 | 9.67 | 17.23 | V100 | 40.88 | 42.36 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k_20210930_225214-65aef6dd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k_20210930_225214.log.json) | +| FastFCN + EncNet | R-50-D32 | 512x1024 | 160000 | - | - | V100 | 42.50 | 44.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k_20211008_105456-d875ce3c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k_20211008_105456.log.json) | + +Note: + +- `4x4` means 4 GPUs with 4 samples per GPU in training, default setting is 4 GPUs with 2 samples per GPU in training. +- Results of [DeepLabV3 (mIoU: 79.32)](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3), [PSPNet (mIoU: 78.55)](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet) and [ENCNet (mIoU: 77.94)](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet) can be found in each original repository. + +## Citation + +```bibtex +@article{wu2019fastfcn, +title={Fastfcn: Rethinking dilated convolution in the backbone for semantic segmentation}, +author={Wu, Huikai and Zhang, Junge and Huang, Kaiqi and Liang, Kongming and Yu, Yizhou}, +journal={arXiv preprint arXiv:1903.11816}, +year={2019} +} +``` diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..39e6e23 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,20 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + decode_head=dict( + _delete_=True, + type='ASPPHead', + in_channels=2048, + in_index=2, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..1913544 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,20 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + decode_head=dict( + _delete_=True, + type='ASPPHead', + in_channels=2048, + in_index=2, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..7516895 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,20 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + decode_head=dict( + _delete_=True, + type='ASPPHead', + in_channels=2048, + in_index=2, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..a8c5dc3 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_cityscapes-512x1024.py @@ -0,0 +1,5 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py' +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..4840dd0 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,24 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + decode_head=dict( + _delete_=True, + type='EncHead', + in_channels=[512, 1024, 2048], + in_index=(0, 1, 2), + channels=512, + num_codes=32, + use_se_loss=True, + add_lateral=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_se_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.2)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..619d086 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,24 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + decode_head=dict( + _delete_=True, + type='EncHead', + in_channels=[512, 1024, 2048], + in_index=(0, 1, 2), + channels=512, + num_codes=32, + use_se_loss=True, + add_lateral=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_se_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.2)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..a76b026 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,24 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + decode_head=dict( + _delete_=True, + type='EncHead', + in_channels=[512, 1024, 2048], + in_index=(0, 1, 2), + channels=512, + num_codes=32, + use_se_loss=True, + add_lateral=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_se_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.2)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..6df1527 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_cityscapes-512x1024.py @@ -0,0 +1,5 @@ +# model settings +_base_ = './fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py' +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..dc5c54d --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fastfcn_r50-d32_jpu_psp.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..887ace1 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/fastfcn_r50-d32_jpu_psp.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..3981e20 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/fastfcn_r50-d32_jpu_psp.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..2c7d504 --- /dev/null +++ b/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/fastfcn_r50-d32_jpu_psp.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/fastfcn/metafile.yaml b/mmsegmentation/configs/fastfcn/metafile.yaml new file mode 100644 index 0000000..f5fe03c --- /dev/null +++ b/mmsegmentation/configs/fastfcn/metafile.yaml @@ -0,0 +1,311 @@ +Collections: +- Name: FastFCN + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + README: configs/fastfcn/README.md + Frameworks: + - PyTorch +Models: +- Name: fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.12 + mIoU(ms+flip): 80.58 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - FastFCN + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 5.67 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes_20210928_053722-5d1a2648.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes_20210928_053722.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.52 + mIoU(ms+flip): 80.91 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - FastFCN + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 9.79 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes_20210924_214357-72220849.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes_20210924_214357.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.26 + mIoU(ms+flip): 80.86 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - FastFCN + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 5.67 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes_20210928_053722-57749bed.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes_20210928_053722.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.76 + mIoU(ms+flip): 80.03 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - FastFCN + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.94 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes_20210925_061841-77e87b0a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes_20210925_061841.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.97 + mIoU(ms+flip): 79.92 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - FastFCN + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.15 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes_20210928_030036-78da5046.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes_20210928_030036.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.6 + mIoU(ms+flip): 80.25 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - FastFCN + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 15.45 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes_20210926_093217-e1eb6dbb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes_20210926_093217.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.88 + mIoU(ms+flip): 42.91 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - FastFCN + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 8.46 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k_20211013_190619-3aa40f2d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k_20211013_190619.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.58 + mIoU(ms+flip): 44.92 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - FastFCN + - DeepLabV3 + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k_20211008_152246-27036aee.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k_20211008_152246.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.4 + mIoU(ms+flip): 42.12 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - FastFCN + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.02 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k_20210930_225137-993d07c8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k_20210930_225137.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.63 + mIoU(ms+flip): 43.71 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_psp_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - FastFCN + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k_20211008_105455-e8f5a2fd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k_20211008_105455.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.88 + mIoU(ms+flip): 42.36 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - FastFCN + - EncNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.67 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k_20210930_225214-65aef6dd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k_20210930_225214.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch +- Name: fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512 + In Collection: FastFCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.5 + mIoU(ms+flip): 44.21 + Config: configs/fastfcn/fastfcn_r50-d32_jpu_enc_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - FastFCN + - EncNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k_20211008_105456-d875ce3c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k_20211008_105456.log.json + Paper: + Title: 'FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation' + URL: https://arxiv.org/abs/1903.11816 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/jpu.py#L12 + Framework: PyTorch diff --git a/mmsegmentation/configs/fastscnn/README.md b/mmsegmentation/configs/fastscnn/README.md new file mode 100644 index 0000000..6be9814 --- /dev/null +++ b/mmsegmentation/configs/fastscnn/README.md @@ -0,0 +1,42 @@ +# Fast-SCNN + +> [Fast-SCNN for Semantic Segmentation](https://arxiv.org/abs/1902.04502) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The encoder-decoder framework is state-of-the-art for offline semantic image segmentation. Since the rise in autonomous systems, real-time computation is increasingly desirable. In this paper, we introduce fast segmentation convolutional neural network (Fast-SCNN), an above real-time semantic segmentation model on high resolution image data (1024x2048px) suited to efficient computation on embedded devices with low memory. Building on existing two-branch methods for fast segmentation, we introduce our \`learning to downsample' module which computes low-level features for multiple resolution branches simultaneously. Our network combines spatial detail at high resolution with deep features extracted at lower resolution, yielding an accuracy of 68.0% mean intersection over union at 123.5 frames per second on Cityscapes. We also show that large scale pre-training is unnecessary. We thoroughly validate our metric in experiments with ImageNet pre-training and the coarse labeled data of Cityscapes. Finally, we show even faster computation with competitive results on subsampled inputs, without any network modifications. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| -------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FastSCNN | FastSCNN | 512x1024 | 160000 | 3.3 | 56.45 | V100 | 70.96 | 72.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_lr0.12_8x4_160k_cityscapes/fast_scnn_lr0.12_8x4_160k_cityscapes_20210630_164853-0cec9937.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_lr0.12_8x4_160k_cityscapes/fast_scnn_lr0.12_8x4_160k_cityscapes_20210630_164853.log.json) | + +## Citation + +```bibtex +@article{poudel2019fast, + title={Fast-scnn: Fast semantic segmentation network}, + author={Poudel, Rudra PK and Liwicki, Stephan and Cipolla, Roberto}, + journal={arXiv preprint arXiv:1902.04502}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py b/mmsegmentation/configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..e7f68bf --- /dev/null +++ b/mmsegmentation/configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py @@ -0,0 +1,15 @@ +_base_ = [ + '../_base_/models/fast_scnn.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +# Re-config the data sampler. +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader + +# Re-config the optimizer. +optimizer = dict(type='SGD', lr=0.12, momentum=0.9, weight_decay=4e-5) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/fastscnn/metafile.yaml b/mmsegmentation/configs/fastscnn/metafile.yaml new file mode 100644 index 0000000..9e33c90 --- /dev/null +++ b/mmsegmentation/configs/fastscnn/metafile.yaml @@ -0,0 +1,37 @@ +Collections: +- Name: FastSCNN + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: Fast-SCNN for Semantic Segmentation + URL: https://arxiv.org/abs/1902.04502 + README: configs/fastscnn/README.md + Frameworks: + - PyTorch +Models: +- Name: fast_scnn_8xb4-160k_cityscapes-512x1024 + In Collection: FastSCNN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 70.96 + mIoU(ms+flip): 72.65 + Config: configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 32 + Architecture: + - FastSCNN + - FastSCNN + Training Resources: 8x V100 GPUS + Memory (GB): 3.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_lr0.12_8x4_160k_cityscapes/fast_scnn_lr0.12_8x4_160k_cityscapes_20210630_164853-0cec9937.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_lr0.12_8x4_160k_cityscapes/fast_scnn_lr0.12_8x4_160k_cityscapes_20210630_164853.log.json + Paper: + Title: Fast-SCNN for Semantic Segmentation + URL: https://arxiv.org/abs/1902.04502 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/fast_scnn.py#L272 + Framework: PyTorch diff --git a/mmsegmentation/configs/fcn/README.md b/mmsegmentation/configs/fcn/README.md new file mode 100644 index 0000000..cf7379f --- /dev/null +++ b/mmsegmentation/configs/fcn/README.md @@ -0,0 +1,111 @@ +# FCN + +> [Fully Convolutional Networks for Semantic Segmentation](https://arxiv.org/abs/1411.4038) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Convolutional networks are powerful visual models that yield hierarchies of features. We show that convolutional networks by themselves, trained end-to-end, pixels-to-pixels, exceed the state-of-the-art in semantic segmentation. Our key insight is to build "fully convolutional" networks that take input of arbitrary size and produce correspondingly-sized output with efficient inference and learning. We define and detail the space of fully convolutional networks, explain their application to spatially dense prediction tasks, and draw connections to prior models. We adapt contemporary classification networks (AlexNet, the VGG net, and GoogLeNet) into fully convolutional networks and transfer their learned representations by fine-tuning to the segmentation task. We then define a novel architecture that combines semantic information from a deep, coarse layer with appearance information from a shallow, fine layer to produce accurate and detailed segmentations. Our fully convolutional network achieves state-of-the-art segmentation of PASCAL VOC (20% relative improvement to 62.2% mean IU on 2012), NYUDv2, and SIFT Flow, while inference takes one third of a second for a typical image. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | ---------- | --------- | ------: | -------- | -------------- | -------- | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | R-50-D8 | 512x1024 | 40000 | 5.7 | 4.17 | V100 | 72.25 | 73.36 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608.log.json) | +| FCN | R-101-D8 | 512x1024 | 40000 | 9.2 | 2.66 | V100 | 75.45 | 76.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852-a883d3a1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852.log.json) | +| FCN | R-50-D8 | 769x769 | 40000 | 6.5 | 1.80 | V100 | 71.47 | 72.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104-977b5d02.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104.log.json) | +| FCN | R-101-D8 | 769x769 | 40000 | 10.4 | 1.19 | V100 | 73.93 | 75.14 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208-7d4ab69c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208.log.json) | +| FCN | R-18-D8 | 512x1024 | 80000 | 1.7 | 14.65 | V100 | 71.11 | 72.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes_20201225_021327-6c50f8b4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes-20201225_021327.log.json) | +| FCN | R-50-D8 | 512x1024 | 80000 | - | | V100 | 73.61 | 74.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019-03aa804d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019.log.json) | +| FCN | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 75.13 | 75.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038-3fb937eb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038.log.json) | +| FCN (FP16) | R-101-D8 | 512x1024 | 80000 | 5.37 | 8.64 | V100 | 76.80 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_fp16_512x1024_80k_cityscapes/fcn_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230921-fb13e883.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_fp16_512x1024_80k_cityscapes/fcn_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230921.log.json) | +| FCN | R-18-D8 | 769x769 | 80000 | 1.9 | 6.40 | V100 | 70.80 | 73.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes_20201225_021451-9739d1b8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes-20201225_021451.log.json) | +| FCN | R-50-D8 | 769x769 | 80000 | - | - | V100 | 72.64 | 73.32 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749-f5caeabc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749.log.json) | +| FCN | R-101-D8 | 769x769 | 80000 | - | - | V100 | 75.52 | 76.61 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354-45cbac68.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354.log.json) | +| FCN | R-18b-D8 | 512x1024 | 80000 | 1.6 | 16.74 | V100 | 70.24 | 72.77 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes_20201225_230143-92c0f445.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes-20201225_230143.log.json) | +| FCN | R-50b-D8 | 512x1024 | 80000 | 5.6 | 4.20 | V100 | 75.65 | 77.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes_20201225_094221-82957416.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes-20201225_094221.log.json) | +| FCN | R-101b-D8 | 512x1024 | 80000 | 9.1 | 2.73 | V100 | 77.37 | 78.77 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes_20201226_160213-4543858f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes-20201226_160213.log.json) | +| FCN | R-18b-D8 | 769x769 | 80000 | 1.7 | 6.70 | V100 | 69.66 | 72.07 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes_20201226_004430-32d504e5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes-20201226_004430.log.json) | +| FCN | R-50b-D8 | 769x769 | 80000 | 6.3 | 1.82 | V100 | 73.83 | 76.60 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes_20201225_094223-94552d38.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes-20201225_094223.log.json) | +| FCN | R-101b-D8 | 769x769 | 80000 | 10.3 | 1.15 | V100 | 77.02 | 78.67 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes_20201226_170012-82be37e2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes-20201226_170012.log.json) | +| FCN (D6) | R-50-D16 | 512x1024 | 40000 | 3.4 | 10.22 | TITAN Xp | 77.06 | 78.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_40k_cityscapes/fcn_d6_r50-d16_512x1024_40k_cityscapes_20210305_130133-98d5d1bc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_40k_cityscapes/fcn_d6_r50-d16_512x1024_40k_cityscapes-20210305_130133.log.json) | +| FCN (D6) | R-50-D16 | 512x1024 | 80000 | - | 10.35 | TITAN Xp | 77.27 | 78.88 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_80k_cityscapes/fcn_d6_r50-d16_512x1024_80k_cityscapes_20210306_115604-133c292f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_80k_cityscapes/fcn_d6_r50-d16_512x1024_80k_cityscapes-20210306_115604.log.json) | +| FCN (D6) | R-50-D16 | 769x769 | 40000 | 3.7 | 4.17 | TITAN Xp | 76.82 | 78.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_40k_cityscapes/fcn_d6_r50-d16_769x769_40k_cityscapes_20210305_185744-1aab18ed.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_40k_cityscapes/fcn_d6_r50-d16_769x769_40k_cityscapes-20210305_185744.log.json) | +| FCN (D6) | R-50-D16 | 769x769 | 80000 | - | 4.15 | TITAN Xp | 77.04 | 78.40 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_80k_cityscapes/fcn_d6_r50-d16_769x769_80k_cityscapes_20210305_200413-109d88eb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_80k_cityscapes/fcn_d6_r50-d16_769x769_80k_cityscapes-20210305_200413.log.json) | +| FCN (D6) | R-101-D16 | 512x1024 | 40000 | 4.5 | 8.04 | TITAN Xp | 77.36 | 79.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_40k_cityscapes/fcn_d6_r101-d16_512x1024_40k_cityscapes_20210305_130337-9cf2b450.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_40k_cityscapes/fcn_d6_r101-d16_512x1024_40k_cityscapes-20210305_130337.log.json) | +| FCN (D6) | R-101-D16 | 512x1024 | 80000 | - | 8.26 | TITAN Xp | 78.46 | 80.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_80k_cityscapes/fcn_d6_r101-d16_512x1024_80k_cityscapes_20210308_102747-cb336445.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_80k_cityscapes/fcn_d6_r101-d16_512x1024_80k_cityscapes-20210308_102747.log.json) | +| FCN (D6) | R-101-D16 | 769x769 | 40000 | 5.0 | 3.12 | TITAN Xp | 77.28 | 78.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_40k_cityscapes/fcn_d6_r101-d16_769x769_40k_cityscapes_20210308_102453-60b114e9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_40k_cityscapes/fcn_d6_r101-d16_769x769_40k_cityscapes-20210308_102453.log.json) | +| FCN (D6) | R-101-D16 | 769x769 | 80000 | - | 3.21 | TITAN Xp | 78.06 | 79.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_80k_cityscapes/fcn_d6_r101-d16_769x769_80k_cityscapes_20210306_120016-e33adc4f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_80k_cityscapes/fcn_d6_r101-d16_769x769_80k_cityscapes-20210306_120016.log.json) | +| FCN (D6) | R-50b-D16 | 512x1024 | 80000 | 3.2 | 10.16 | TITAN Xp | 76.99 | 79.03 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b-d16_512x1024_80k_cityscapes/fcn_d6_r50b-d16_512x1024_80k_cityscapes_20210311_125550-6a0b62e9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b_d16_512x1024_80k_cityscapes/fcn_d6_r50b_d16_512x1024_80k_cityscapes-20210311_125550.log.json) | +| FCN (D6) | R-50b-D16 | 769x769 | 80000 | 3.6 | 4.17 | TITAN Xp | 76.86 | 78.52 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b-d16_769x769_80k_cityscapes/fcn_d6_r50b-d16_769x769_80k_cityscapes_20210311_131012-d665f231.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b_d16_769x769_80k_cityscapes/fcn_d6_r50b_d16_769x769_80k_cityscapes-20210311_131012.log.json) | +| FCN (D6) | R-101b-D16 | 512x1024 | 80000 | 4.3 | 8.46 | TITAN Xp | 77.72 | 79.53 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b-d16_512x1024_80k_cityscapes/fcn_d6_r101b-d16_512x1024_80k_cityscapes_20210311_144305-3f2eb5b4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b_d16_512x1024_80k_cityscapes/fcn_d6_r101b_d16_512x1024_80k_cityscapes-20210311_144305.log.json) | +| FCN (D6) | R-101b-D16 | 769x769 | 80000 | 4.8 | 3.32 | TITAN Xp | 77.34 | 78.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b-d16_769x769_80k_cityscapes/fcn_d6_r101b-d16_769x769_80k_cityscapes_20210311_154527-c4d8bfbc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b_d16_769x769_80k_cityscapes/fcn_d6_r101b_d16_769x769_80k_cityscapes-20210311_154527.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | R-50-D8 | 512x512 | 80000 | 8.5 | 23.49 | V100 | 35.94 | 37.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016.log.json) | +| FCN | R-101-D8 | 512x512 | 80000 | 12 | 14.78 | V100 | 39.61 | 40.83 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-80k_ade20k-512x512.pyy) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143-bc1809f7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143.log.json) | +| FCN | R-50-D8 | 512x512 | 160000 | - | - | V100 | 36.10 | 38.08 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713-4edbc3b4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713.log.json) | +| FCN | R-101-D8 | 512x512 | 160000 | - | - | V100 | 39.91 | 41.40 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816-fd192bd5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | R-50-D8 | 512x512 | 20000 | 5.7 | 23.28 | V100 | 67.08 | 69.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715-52dc5306.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715.log.json) | +| FCN | R-101-D8 | 512x512 | 20000 | 9.2 | 14.81 | V100 | 71.16 | 73.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842-0bb4e798.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842.log.json) | +| FCN | R-50-D8 | 512x512 | 40000 | - | - | V100 | 66.97 | 69.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222-5e2dbf40.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json) | +| FCN | R-101-D8 | 512x512 | 40000 | - | - | V100 | 69.91 | 72.38 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240-4c8bcefd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | R-101-D8 | 480x480 | 40000 | - | 9.93 | V100 | 44.43 | 45.63 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context_20210421_154757-b5e97937.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context-20210421_154757.log.json) | +| FCN | R-101-D8 | 480x480 | 80000 | - | - | V100 | 44.13 | 45.26 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context_20210421_163310-4711813f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context-20210421_163310.log.json) | + +### Pascal Context 59 + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | R-101-D8 | 480x480 | 40000 | - | - | V100 | 48.42 | 50.4 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context_59/fcn_r101-d8_480x480_40k_pascal_context_59_20210415_230724-8cf83682.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context_59/fcn_r101-d8_480x480_40k_pascal_context_59-20210415_230724.log.json) | +| FCN | R-101-D8 | 480x480 | 80000 | - | - | V100 | 49.35 | 51.38 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context_59/fcn_r101-d8_480x480_80k_pascal_context_59_20210416_110804-9a6f2c94.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context_59/fcn_r101-d8_480x480_80k_pascal_context_59-20210416_110804.log.json) | + +Note: + +- `FP16` means Mixed Precision (FP16) is adopted in training. +- `FCN D6` means dilation rate of convolution operator in FCN is 6. + +## Citation + +```bibtex +@article{shelhamer2017fully, + title={Fully convolutional networks for semantic segmentation}, + author={Shelhamer, Evan and Long, Jonathan and Darrell, Trevor}, + journal={IEEE transactions on pattern analysis and machine intelligence}, + volume={39}, + number={4}, + pages={640--651}, + year={2017}, + publisher={IEEE Trans Pattern Anal Mach Intell} +} +``` diff --git a/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..8f2cd02 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..4782b30 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5f654b4 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..91eca1c --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..62e6127 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,4 @@ +_base_ = './fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..1b8d247 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,4 @@ +_base_ = './fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..9a1efb4 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), + decode_head=dict(dilation=6), + auxiliary_head=dict(dilation=6)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..2b2a6f4 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), + decode_head=dict(align_corners=True, dilation=6), + auxiliary_head=dict(align_corners=True, dilation=6), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..e6cca00 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), + decode_head=dict(dilation=6), + auxiliary_head=dict(dilation=6)) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..990ff9c --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), + decode_head=dict(align_corners=True, dilation=6), + auxiliary_head=dict(align_corners=True, dilation=6), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..7d470a5 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..e9093ea --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..b3ec0a7 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..1f83fe2 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..4527b3b --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..6ce1124 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..b4d9487 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py @@ -0,0 +1,6 @@ +_base_ = './fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py' +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005), + loss_scale=512.) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..b1f5c5c --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..61ee96f --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..1161193 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-40k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..f3a6dbc --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-40k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..b68b6e0 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..3facce3 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..1161193 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-40k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..cebe330 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb4-80k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..e53751b --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,4 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..daa6502 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,4 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..4073148 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..2c1d2b6 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..08ab467 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..c591ebe --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..4fba723 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..d57afe1 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..6b1fdae --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..8a713fd --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..258b9fb --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..eac86d5 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..d99cb0d --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..64c9410 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..42edb46 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..099f6af --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..1eeafb8 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..c11a9bb --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..44821fd --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..a85b391 --- /dev/null +++ b/mmsegmentation/configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/fcn/metafile.yaml b/mmsegmentation/configs/fcn/metafile.yaml new file mode 100644 index 0000000..f3d80f6 --- /dev/null +++ b/mmsegmentation/configs/fcn/metafile.yaml @@ -0,0 +1,997 @@ +Collections: +- Name: FCN + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + - Pascal Context + - Pascal Context 59 + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + README: configs/fcn/README.md + Frameworks: + - PyTorch +Models: +- Name: fcn_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 72.25 + mIoU(ms+flip): 73.36 + Config: configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 5.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.45 + mIoU(ms+flip): 76.58 + Config: configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852-a883d3a1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 71.47 + mIoU(ms+flip): 72.54 + Config: configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104-977b5d02.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.93 + mIoU(ms+flip): 75.14 + Config: configs/fcn/fcn_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 10.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208-7d4ab69c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r18-d8_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 71.11 + mIoU(ms+flip): 72.91 + Config: configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes_20201225_021327-6c50f8b4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes-20201225_021327.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.61 + mIoU(ms+flip): 74.24 + Config: configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019-03aa804d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.13 + mIoU(ms+flip): 75.94 + Config: configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038-3fb937eb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.8 + Config: configs/fcn/fcn_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - FCN + - (FP16) + Training Resources: 4x V100 GPUS + Memory (GB): 5.37 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_fp16_512x1024_80k_cityscapes/fcn_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230921-fb13e883.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_fp16_512x1024_80k_cityscapes/fcn_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230921.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r18-d8_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 70.8 + mIoU(ms+flip): 73.16 + Config: configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes_20201225_021451-9739d1b8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes-20201225_021451.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 72.64 + mIoU(ms+flip): 73.32 + Config: configs/fcn/fcn_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749-f5caeabc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.52 + mIoU(ms+flip): 76.61 + Config: configs/fcn/fcn_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354-45cbac68.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r18b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 70.24 + mIoU(ms+flip): 72.77 + Config: configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes_20201225_230143-92c0f445.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes-20201225_230143.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.65 + mIoU(ms+flip): 77.59 + Config: configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 5.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes_20201225_094221-82957416.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes-20201225_094221.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.37 + mIoU(ms+flip): 78.77 + Config: configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 9.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes_20201226_160213-4543858f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes-20201226_160213.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r18b-d8_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 69.66 + mIoU(ms+flip): 72.07 + Config: configs/fcn/fcn_r18b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes_20201226_004430-32d504e5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes-20201226_004430.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50b-d8_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.83 + mIoU(ms+flip): 76.6 + Config: configs/fcn/fcn_r50b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes_20201225_094223-94552d38.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes-20201225_094223.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101b-d8_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.02 + mIoU(ms+flip): 78.67 + Config: configs/fcn/fcn_r101b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 10.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes_20201226_170012-82be37e2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes-20201226_170012.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.06 + mIoU(ms+flip): 78.85 + Config: configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 3.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_40k_cityscapes/fcn_d6_r50-d16_512x1024_40k_cityscapes_20210305_130133-98d5d1bc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_40k_cityscapes/fcn_d6_r50-d16_512x1024_40k_cityscapes-20210305_130133.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.27 + mIoU(ms+flip): 78.88 + Config: configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_80k_cityscapes/fcn_d6_r50-d16_512x1024_80k_cityscapes_20210306_115604-133c292f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_512x1024_80k_cityscapes/fcn_d6_r50-d16_512x1024_80k_cityscapes-20210306_115604.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.82 + mIoU(ms+flip): 78.22 + Config: configs/fcn/fcn-d6_r50-d16_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 3.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_40k_cityscapes/fcn_d6_r50-d16_769x769_40k_cityscapes_20210305_185744-1aab18ed.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_40k_cityscapes/fcn_d6_r50-d16_769x769_40k_cityscapes-20210305_185744.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.04 + mIoU(ms+flip): 78.4 + Config: configs/fcn/fcn-d6_r50-d16_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_80k_cityscapes/fcn_d6_r50-d16_769x769_80k_cityscapes_20210305_200413-109d88eb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50-d16_769x769_80k_cityscapes/fcn_d6_r50-d16_769x769_80k_cityscapes-20210305_200413.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.36 + mIoU(ms+flip): 79.18 + Config: configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 4.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_40k_cityscapes/fcn_d6_r101-d16_512x1024_40k_cityscapes_20210305_130337-9cf2b450.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_40k_cityscapes/fcn_d6_r101-d16_512x1024_40k_cityscapes-20210305_130337.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.46 + mIoU(ms+flip): 80.42 + Config: configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_80k_cityscapes/fcn_d6_r101-d16_512x1024_80k_cityscapes_20210308_102747-cb336445.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_512x1024_80k_cityscapes/fcn_d6_r101-d16_512x1024_80k_cityscapes-20210308_102747.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.28 + mIoU(ms+flip): 78.95 + Config: configs/fcn/fcn-d6_r101-d16_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 5.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_40k_cityscapes/fcn_d6_r101-d16_769x769_40k_cityscapes_20210308_102453-60b114e9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_40k_cityscapes/fcn_d6_r101-d16_769x769_40k_cityscapes-20210308_102453.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.06 + mIoU(ms+flip): 79.58 + Config: configs/fcn/fcn-d6_r101-d16_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_80k_cityscapes/fcn_d6_r101-d16_769x769_80k_cityscapes_20210306_120016-e33adc4f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101-d16_769x769_80k_cityscapes/fcn_d6_r101-d16_769x769_80k_cityscapes-20210306_120016.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.99 + mIoU(ms+flip): 79.03 + Config: configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 3.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b-d16_512x1024_80k_cityscapes/fcn_d6_r50b-d16_512x1024_80k_cityscapes_20210311_125550-6a0b62e9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b_d16_512x1024_80k_cityscapes/fcn_d6_r50b_d16_512x1024_80k_cityscapes-20210311_125550.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.86 + mIoU(ms+flip): 78.52 + Config: configs/fcn/fcn-d6_r50b-d16_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 3.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b-d16_769x769_80k_cityscapes/fcn_d6_r50b-d16_769x769_80k_cityscapes_20210311_131012-d665f231.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r50b_d16_769x769_80k_cityscapes/fcn_d6_r50b_d16_769x769_80k_cityscapes-20210311_131012.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.72 + mIoU(ms+flip): 79.53 + Config: configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 4.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b-d16_512x1024_80k_cityscapes/fcn_d6_r101b-d16_512x1024_80k_cityscapes_20210311_144305-3f2eb5b4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b_d16_512x1024_80k_cityscapes/fcn_d6_r101b_d16_512x1024_80k_cityscapes-20210311_144305.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.34 + mIoU(ms+flip): 78.91 + Config: configs/fcn/fcn-d6_r101b-d16_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D16 + - FCN + - (D6) + Training Resources: 4x TITAN Xp GPUS + Memory (GB): 4.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b-d16_769x769_80k_cityscapes/fcn_d6_r101b-d16_769x769_80k_cityscapes_20210311_154527-c4d8bfbc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_d6_r101b_d16_769x769_80k_cityscapes/fcn_d6_r101b_d16_769x769_80k_cityscapes-20210311_154527.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 35.94 + mIoU(ms+flip): 37.94 + Config: configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 8.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 39.61 + mIoU(ms+flip): 40.83 + Config: configs/fcn/fcn_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 12.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143-bc1809f7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 36.1 + mIoU(ms+flip): 38.08 + Config: configs/fcn/fcn_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713-4edbc3b4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 39.91 + mIoU(ms+flip): 41.4 + Config: configs/fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816-fd192bd5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 67.08 + mIoU(ms+flip): 69.94 + Config: configs/fcn/fcn_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 5.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715-52dc5306.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 71.16 + mIoU(ms+flip): 73.57 + Config: configs/fcn/fcn_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842-0bb4e798.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 66.97 + mIoU(ms+flip): 69.04 + Config: configs/fcn/fcn_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222-5e2dbf40.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 69.91 + mIoU(ms+flip): 72.38 + Config: configs/fcn/fcn_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240-4c8bcefd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-40k_pascal-context-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 44.43 + mIoU(ms+flip): 45.63 + Config: configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context_20210421_154757-b5e97937.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context-20210421_154757.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-80k_pascal-context-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 44.13 + mIoU(ms+flip): 45.26 + Config: configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context_20210421_163310-4711813f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context-20210421_163310.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-40k_pascal-context-59-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 48.42 + mIoU(ms+flip): 50.4 + Config: configs/fcn/fcn_r101-d8_4xb4-40k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context_59/fcn_r101-d8_480x480_40k_pascal_context_59_20210415_230724-8cf83682.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context_59/fcn_r101-d8_480x480_40k_pascal_context_59-20210415_230724.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch +- Name: fcn_r101-d8_4xb4-80k_pascal-context-59-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 49.35 + mIoU(ms+flip): 51.38 + Config: configs/fcn/fcn_r101-d8_4xb4-80k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context_59/fcn_r101-d8_480x480_80k_pascal_context_59_20210416_110804-9a6f2c94.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context_59/fcn_r101-d8_480x480_80k_pascal_context_59-20210416_110804.log.json + Paper: + Title: Fully Convolutional Networks for Semantic Segmentation + URL: https://arxiv.org/abs/1411.4038 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fcn_head.py#L11 + Framework: PyTorch diff --git a/mmsegmentation/configs/gcnet/README.md b/mmsegmentation/configs/gcnet/README.md new file mode 100644 index 0000000..ba1a21e --- /dev/null +++ b/mmsegmentation/configs/gcnet/README.md @@ -0,0 +1,68 @@ +# GCNet + +> [GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond](https://arxiv.org/abs/1904.11492) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The Non-Local Network (NLNet) presents a pioneering approach for capturing long-range dependencies, via aggregating query-specific global context to each query position. However, through a rigorous empirical analysis, we have found that the global contexts modeled by non-local network are almost the same for different query positions within an image. In this paper, we take advantage of this finding to create a simplified network based on a query-independent formulation, which maintains the accuracy of NLNet but with significantly less computation. We further observe that this simplified design shares similar structure with Squeeze-Excitation Network (SENet). Hence we unify them into a three-step general framework for global context modeling. Within the general framework, we design a better instantiation, called the global context (GC) block, which is lightweight and can effectively model the global context. The lightweight property allows us to apply it for multiple layers in a backbone network to construct a global context network (GCNet), which generally outperforms both simplified NLNet and SENet on major benchmarks for various recognition tasks. The code and configurations are released at [this https URL](https://github.com/xvjiarui/GCNet). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| GCNet | R-50-D8 | 512x1024 | 40000 | 5.8 | 3.93 | V100 | 77.69 | 78.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436-4b0fd17b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436.log.json) | +| GCNet | R-101-D8 | 512x1024 | 40000 | 9.2 | 2.61 | V100 | 78.28 | 79.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436-5e62567f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436.log.json) | +| GCNet | R-50-D8 | 769x769 | 40000 | 6.5 | 1.67 | V100 | 78.12 | 80.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814-a26f4471.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814.log.json) | +| GCNet | R-101-D8 | 769x769 | 40000 | 10.5 | 1.13 | V100 | 78.95 | 80.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550-ca4f0a84.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550.log.json) | +| GCNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 78.48 | 80.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450-ef8f069b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450.log.json) | +| GCNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 79.03 | 79.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-512x1024.pyy) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450-778ebf69.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450.log.json) | +| GCNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 78.68 | 80.66 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516-4839565b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516.log.json) | +| GCNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.18 | 80.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628-8e043423.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| GCNet | R-50-D8 | 512x512 | 80000 | 8.5 | 23.38 | V100 | 41.47 | 42.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146-91a6da41.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146.log.json) | +| GCNet | R-101-D8 | 512x512 | 80000 | 12 | 15.20 | V100 | 42.82 | 44.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811-c3fcb6dd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811.log.json) | +| GCNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 42.37 | 43.52 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122-d95f3e1f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122.log.json) | +| GCNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 43.69 | 45.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406-615528d7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| GCNet | R-50-D8 | 512x512 | 20000 | 5.8 | 23.35 | V100 | 76.42 | 77.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701-3cbfdab1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701.log.json) | +| GCNet | R-101-D8 | 512x512 | 20000 | 9.2 | 14.80 | V100 | 77.41 | 78.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713-6c720aa9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713.log.json) | +| GCNet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 76.24 | 77.63 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105-9797336d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105.log.json) | +| GCNet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 77.84 | 78.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet/gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806-1e38208d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806.log.json) | + +## Citation + +```bibtex +@inproceedings{cao2019gcnet, + title={Gcnet: Non-local networks meet squeeze-excitation networks and beyond}, + author={Cao, Yue and Xu, Jiarui and Lin, Stephen and Wei, Fangyun and Hu, Han}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision Workshops}, + pages={0--0}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..e8f7c55 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..887d17b --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..aa47578 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..ddf4ad7 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..45285c0 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..b466c40 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..9c7f741 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..61337db --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..f976bd9 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..34ce822 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5088929 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..f886f17 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..d3f5631 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..356b088 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..802b766 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..7327934 --- /dev/null +++ b/mmsegmentation/configs/gcnet/gcnet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/gcnet/metafile.yaml b/mmsegmentation/configs/gcnet/metafile.yaml new file mode 100644 index 0000000..1f3c462 --- /dev/null +++ b/mmsegmentation/configs/gcnet/metafile.yaml @@ -0,0 +1,391 @@ +Collections: +- Name: GCNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + README: configs/gcnet/README.md + Frameworks: + - PyTorch +Models: +- Name: gcnet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.69 + mIoU(ms+flip): 78.56 + Config: configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 5.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436-4b0fd17b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.28 + mIoU(ms+flip): 79.34 + Config: configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436-5e62567f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.12 + mIoU(ms+flip): 80.09 + Config: configs/gcnet/gcnet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814-a26f4471.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.95 + mIoU(ms+flip): 80.71 + Config: configs/gcnet/gcnet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550-ca4f0a84.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.48 + mIoU(ms+flip): 80.01 + Config: configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450-ef8f069b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.03 + mIoU(ms+flip): 79.84 + Config: configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450-778ebf69.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.68 + mIoU(ms+flip): 80.66 + Config: configs/gcnet/gcnet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516-4839565b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.18 + mIoU(ms+flip): 80.71 + Config: configs/gcnet/gcnet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628-8e043423.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.47 + mIoU(ms+flip): 42.85 + Config: configs/gcnet/gcnet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146-91a6da41.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.82 + mIoU(ms+flip): 44.54 + Config: configs/gcnet/gcnet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811-c3fcb6dd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.37 + mIoU(ms+flip): 43.52 + Config: configs/gcnet/gcnet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122-d95f3e1f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.69 + mIoU(ms+flip): 45.21 + Config: configs/gcnet/gcnet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406-615528d7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.42 + mIoU(ms+flip): 77.51 + Config: configs/gcnet/gcnet_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 5.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701-3cbfdab1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.41 + mIoU(ms+flip): 78.56 + Config: configs/gcnet/gcnet_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713-6c720aa9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.24 + mIoU(ms+flip): 77.63 + Config: configs/gcnet/gcnet_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105-9797336d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch +- Name: gcnet_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: GCNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.84 + mIoU(ms+flip): 78.59 + Config: configs/gcnet/gcnet_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - GCNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806-1e38208d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806.log.json + Paper: + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + URL: https://arxiv.org/abs/1904.11492 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/gc_head.py#L10 + Framework: PyTorch diff --git a/mmsegmentation/configs/hrnet/README.md b/mmsegmentation/configs/hrnet/README.md new file mode 100644 index 0000000..b529fc8 --- /dev/null +++ b/mmsegmentation/configs/hrnet/README.md @@ -0,0 +1,122 @@ +# HRNet + +> [Deep High-Resolution Representation Learning for Human Pose Estimation](https://arxiv.org/abs/1908.07919) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +High-resolution representations are essential for position-sensitive vision problems, such as human pose estimation, semantic segmentation, and object detection. Existing state-of-the-art frameworks first encode the input image as a low-resolution representation through a subnetwork that is formed by connecting high-to-low resolution convolutions \\emph{in series} (e.g., ResNet, VGGNet), and then recover the high-resolution representation from the encoded low-resolution representation. Instead, our proposed network, named as High-Resolution Network (HRNet), maintains high-resolution representations through the whole process. There are two key characteristics: (i) Connect the high-to-low resolution convolution streams \\emph{in parallel}; (ii) Repeatedly exchange the information across resolutions. The benefit is that the resulting representation is semantically richer and spatially more precise. We show the superiority of the proposed HRNet in a wide range of applications, including human pose estimation, semantic segmentation, and object detection, suggesting that the HRNet is a stronger backbone for computer vision problems. All the codes are available at [this https URL](https://github.com/HRNet). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | HRNetV2p-W18-Small | 512x1024 | 40000 | 1.7 | 23.74 | V100 | 73.86 | 75.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216-93db27d0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 40000 | 2.9 | 12.97 | V100 | 77.19 | 78.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216-f196fb4e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 40000 | 6.2 | 6.42 | V100 | 78.48 | 79.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240-a989b146.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240.log.json) | +| FCN | HRNetV2p-W18-Small | 512x1024 | 80000 | - | - | V100 | 75.31 | 77.48 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700-1462b75d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 80000 | - | - | V100 | 78.65 | 80.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255-4e7b345e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 80000 | - | - | V100 | 79.93 | 80.72 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606-58ea95d6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606.log.json) | +| FCN | HRNetV2p-W18-Small | 512x1024 | 160000 | - | - | V100 | 76.31 | 78.31 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 160000 | - | - | V100 | 78.80 | 80.74 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822-221e4a4f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 160000 | - | - | V100 | 80.65 | 81.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FCN | HRNetV2p-W18-Small | 512x512 | 80000 | 3.8 | 38.66 | V100 | 31.38 | 32.45 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345-77fc814a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 80000 | 4.9 | 22.57 | V100 | 36.27 | 37.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20210827_114910-6c9382c0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20210827_114910.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 80000 | 8.2 | 21.23 | V100 | 41.90 | 43.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946-7ba5258d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946.log.json) | +| FCN | HRNetV2p-W18-Small | 512x512 | 160000 | - | - | V100 | 33.07 | 34.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20210829_174739-f1e7c2e7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20210829_174739.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 160000 | - | - | V100 | 36.79 | 38.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426-ca961836.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 160000 | - | - | V100 | 42.02 | 43.86 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | HRNetV2p-W18-Small | 512x512 | 20000 | 1.8 | 43.36 | V100 | 65.5 | 68.89 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20210829_174910-0aceadb4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20210829_174910.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 20000 | 2.9 | 23.48 | V100 | 72.30 | 74.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503-488d45f7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 20000 | 6.2 | 22.05 | V100 | 75.87 | 78.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419-89de05cd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419.log.json) | +| FCN | HRNetV2p-W18-Small | 512x512 | 40000 | - | - | V100 | 66.61 | 70.00 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648-4f8d6e7f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 40000 | - | - | V100 | 72.90 | 75.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401-1b4b76cd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 40000 | - | - | V100 | 76.24 | 78.49 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111-1b0f18bc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FCN | HRNetV2p-W48 | 480x480 | 40000 | 6.1 | 8.86 | V100 | 45.14 | 47.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context_20200911_164852-667d00b0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context-20200911_164852.log.json) | +| FCN | HRNetV2p-W48 | 480x480 | 80000 | - | - | V100 | 45.84 | 47.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context_20200911_155322-847a6711.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context-20200911_155322.log.json) | + +### Pascal Context 59 + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FCN | HRNetV2p-W48 | 480x480 | 40000 | - | - | V100 | 50.33 | 52.83 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context_59/fcn_hr48_480x480_40k_pascal_context_59_20210410_122738-b808b8b2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context_59/fcn_hr48_480x480_40k_pascal_context_59-20210410_122738.log.json) | +| FCN | HRNetV2p-W48 | 480x480 | 80000 | - | - | V100 | 51.12 | 53.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context_59/fcn_hr48_480x480_80k_pascal_context_59_20210411_003240-3ae7081e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context_59/fcn_hr48_480x480_80k_pascal_context_59-20210411_003240.log.json) | + +### LoveDA + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | HRNetV2p-W18-Small | 512x512 | 80000 | 1.59 | 24.87 | V100 | 49.28 | 49.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-80k_loveda-512x512.pyy) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_loveda/fcn_hr18s_512x512_80k_loveda_20211210_203228-60a86a7a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_loveda/fcn_hr18s_512x512_80k_loveda_20211210_203228.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 80000 | 2.76 | 12.92 | V100 | 50.81 | 50.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_loveda/fcn_hr18_512x512_80k_loveda_20211210_203952-93d9c3b3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_loveda/fcn_hr18_512x512_80k_loveda_20211210_203952.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 80000 | 6.20 | 9.61 | V100 | 51.42 | 51.64 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_loveda/fcn_hr48_512x512_80k_loveda_20211211_044756-67072f55.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_loveda/fcn_hr48_512x512_80k_loveda_20211211_044756.log.json) | + +### Potsdam + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FCN | HRNetV2p-W18-Small | 512x512 | 80000 | 1.58 | 36.00 | V100 | 77.64 | 78.8 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_potsdam/fcn_hr18s_512x512_80k_potsdam_20211218_205517-ba32af63.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_potsdam/fcn_hr18s_512x512_80k_potsdam_20211218_205517.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 80000 | 2.76 | 19.25 | V100 | 78.26 | 79.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_potsdam/fcn_hr18_512x512_80k_potsdam_20211218_205517-5d0387ad.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_potsdam/fcn_hr18_512x512_80k_potsdam_20211218_205517.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 80000 | 6.20 | 16.42 | V100 | 78.39 | 79.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_potsdam/fcn_hr48_512x512_80k_potsdam_20211219_020601-97434c78.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_potsdam/fcn_hr48_512x512_80k_potsdam_20211219_020601.log.json) | + +### Vaihingen + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FCN | HRNetV2p-W18-Small | 512x512 | 80000 | 1.58 | 38.11 | V100 | 71.81 | 73.1 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_512x512_80k_vaihingen/fcn_hr18s_4x4_512x512_80k_vaihingen_20211231_230909-b23aae02.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_512x512_80k_vaihingen/fcn_hr18s_4x4_512x512_80k_vaihingen_20211231_230909.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 80000 | 2.76 | 19.55 | V100 | 72.57 | 74.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_512x512_80k_vaihingen/fcn_hr18_4x4_512x512_80k_vaihingen_20211231_231216-2ec3ae8a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_512x512_80k_vaihingen/fcn_hr18_4x4_512x512_80k_vaihingen_20211231_231216.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 80000 | 6.20 | 17.25 | V100 | 72.50 | 73.52 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_512x512_80k_vaihingen/fcn_hr48_4x4_512x512_80k_vaihingen_20211231_231244-7133cb22.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_512x512_80k_vaihingen/fcn_hr48_4x4_512x512_80k_vaihingen_20211231_231244.log.json) | + +### iSAID + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | HRNetV2p-W18-Small | 896x896 | 80000 | 4.95 | 13.84 | V100 | 62.30 | 62.97 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_896x896_80k_isaid/fcn_hr18s_4x4_896x896_80k_isaid_20220118_001603-3cc0769b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_896x896_80k_isaid/fcn_hr18s_4x4_896x896_80k_isaid_20220118_001603.log.json) | +| FCN | HRNetV2p-W18 | 896x896 | 80000 | 8.30 | 7.71 | V100 | 65.06 | 65.60 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_896x896_80k_isaid/fcn_hr18_4x4_896x896_80k_isaid_20220110_182230-49bf752e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_896x896_80k_isaid/fcn_hr18_4x4_896x896_80k_isaid_20220110_182230.log.json) | +| FCN | HRNetV2p-W48 | 896x896 | 80000 | 16.89 | 7.34 | V100 | 67.80 | 68.53 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_896x896_80k_isaid/fcn_hr48_4x4_896x896_80k_isaid_20220114_174643-547fc420.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_896x896_80k_isaid/fcn_hr48_4x4_896x896_80k_isaid_20220114_174643.log.json) | + +Note: + +- `896x896` is the Crop Size of iSAID dataset, which is followed by the implementation of [PointFlow: Flowing Semantics Through Points for Aerial Image Segmentation](https://arxiv.org/pdf/2103.06564.pdf) + +## Citation + +```bibtext +@inproceedings{SunXLW19, + title={Deep High-Resolution Representation Learning for Human Pose Estimation}, + author={Ke Sun and Bin Xiao and Dong Liu and Jingdong Wang}, + booktitle={CVPR}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..0b37463 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..598b938 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..eb7da49 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..c4f732c --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..107df6b --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..f744bae --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..0daaa35 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context_59.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..2aa16b1 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..029b7d0 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..33a6ac7 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/isaid.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (896, 896) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=16)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..1a918b2 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/loveda.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=7)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..4f37e8a --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..2c35cb9 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context_59.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..181c03d --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/potsdam.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=6)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..6303bb6 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/vaihingen.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=6)) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..6ca631c --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb2-160k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..ba7e9c6 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb2-40k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..26ab621 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..29cbd10 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..9dd1933 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-20k_voc12aug-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..5f88f53 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-40k_pascal-context-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..b616fad --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-40k_pascal-context-59-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..b10b282 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-40k_voc12aug-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..f9f4936 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..ab2d241 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_isaid-896x896.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..dd17076 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_loveda-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_loveda-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..b7b5233 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_pascal-context-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..ccf1040 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_pascal-context-59-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..3a5726f --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_potsdam-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..720c173 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr18s_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_4xb4-80k_vaihingen-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..4aa5d94 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb2-160k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..7cb7952 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb2-40k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..3e2ce03 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..89b1f04 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..7ca38a9 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-20k_voc12aug-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..379be1d --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-40k_pascal-context-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..12730dd --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-40k_pascal-context-59-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..3e1b920 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-40k_voc12aug-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..14fd663 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..81815ef --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_isaid-896x896.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..34d23af --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_loveda-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..4d193d9 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_pascal-context-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..d8b4c4a --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_pascal-context-59-480x480.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..58a6500 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_potsdam-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..db91ed8 --- /dev/null +++ b/mmsegmentation/configs/hrnet/fcn_hr48_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_4xb4-80k_vaihingen-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/mmsegmentation/configs/hrnet/metafile.yaml b/mmsegmentation/configs/hrnet/metafile.yaml new file mode 100644 index 0000000..11c3016 --- /dev/null +++ b/mmsegmentation/configs/hrnet/metafile.yaml @@ -0,0 +1,874 @@ +Models: +- Name: fcn_hr18s_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.86 + mIoU(ms+flip): 75.91 + Config: configs/hrnet/fcn_hr18s_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216-93db27d0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.19 + mIoU(ms+flip): 78.92 + Config: configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216-f196fb4e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb2-40k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.48 + mIoU(ms+flip): 79.69 + Config: configs/hrnet/fcn_hr48_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240-a989b146.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.31 + mIoU(ms+flip): 77.48 + Config: configs/hrnet/fcn_hr18s_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700-1462b75d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.65 + mIoU(ms+flip): 80.35 + Config: configs/hrnet/fcn_hr18_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255-4e7b345e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.93 + mIoU(ms+flip): 80.72 + Config: configs/hrnet/fcn_hr48_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606-58ea95d6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb2-160k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.31 + mIoU(ms+flip): 78.31 + Config: configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb2-160k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.8 + mIoU(ms+flip): 80.74 + Config: configs/hrnet/fcn_hr18_4xb2-160k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822-221e4a4f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb2-160k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.65 + mIoU(ms+flip): 81.92 + Config: configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-80k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 31.38 + mIoU(ms+flip): 32.45 + Config: configs/hrnet/fcn_hr18s_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 3.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345-77fc814a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-80k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 36.27 + mIoU(ms+flip): 37.28 + Config: configs/hrnet/fcn_hr18_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 4.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20210827_114910-6c9382c0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20210827_114910.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.9 + mIoU(ms+flip): 43.27 + Config: configs/hrnet/fcn_hr48_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 8.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946-7ba5258d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 33.07 + mIoU(ms+flip): 34.56 + Config: configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20210829_174739-f1e7c2e7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20210829_174739.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 36.79 + mIoU(ms+flip): 38.58 + Config: configs/hrnet/fcn_hr18_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426-ca961836.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.02 + mIoU(ms+flip): 43.86 + Config: configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-20k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 65.5 + mIoU(ms+flip): 68.89 + Config: configs/hrnet/fcn_hr18s_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20210829_174910-0aceadb4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20210829_174910.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-20k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 72.3 + mIoU(ms+flip): 74.71 + Config: configs/hrnet/fcn_hr18_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503-488d45f7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-20k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 75.87 + mIoU(ms+flip): 78.58 + Config: configs/hrnet/fcn_hr48_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419-89de05cd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-40k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 66.61 + mIoU(ms+flip): 70.0 + Config: configs/hrnet/fcn_hr18s_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648-4f8d6e7f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-40k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 72.9 + mIoU(ms+flip): 75.59 + Config: configs/hrnet/fcn_hr18_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401-1b4b76cd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-40k_voc12aug-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.24 + mIoU(ms+flip): 78.49 + Config: configs/hrnet/fcn_hr48_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111-1b0f18bc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-40k_pascal-context-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 45.14 + mIoU(ms+flip): 47.42 + Config: configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context_20200911_164852-667d00b0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context-20200911_164852.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_pascal-context-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 45.84 + mIoU(ms+flip): 47.84 + Config: configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context_20200911_155322-847a6711.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context-20200911_155322.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-40k_pascal-context-59-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 50.33 + mIoU(ms+flip): 52.83 + Config: configs/hrnet/fcn_hr48_4xb4-40k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context_59/fcn_hr48_480x480_40k_pascal_context_59_20210410_122738-b808b8b2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context_59/fcn_hr48_480x480_40k_pascal_context_59-20210410_122738.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_pascal-context-59-480x480 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 51.12 + mIoU(ms+flip): 53.56 + Config: configs/hrnet/fcn_hr48_4xb4-80k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context_59/fcn_hr48_480x480_80k_pascal_context_59_20210411_003240-3ae7081e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context_59/fcn_hr48_480x480_80k_pascal_context_59-20210411_003240.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-80k_loveda-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 49.28 + mIoU(ms+flip): 49.42 + Config: configs/hrnet/fcn_hr18s_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.59 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_loveda/fcn_hr18s_512x512_80k_loveda_20211210_203228-60a86a7a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_loveda/fcn_hr18s_512x512_80k_loveda_20211210_203228.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-80k_loveda-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 50.81 + mIoU(ms+flip): 50.95 + Config: configs/hrnet/fcn_hr18_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.76 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_loveda/fcn_hr18_512x512_80k_loveda_20211210_203952-93d9c3b3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_loveda/fcn_hr18_512x512_80k_loveda_20211210_203952.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_loveda-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 51.42 + mIoU(ms+flip): 51.64 + Config: configs/hrnet/fcn_hr48_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_loveda/fcn_hr48_512x512_80k_loveda_20211211_044756-67072f55.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_loveda/fcn_hr48_512x512_80k_loveda_20211211_044756.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-80k_potsdam-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 77.64 + mIoU(ms+flip): 78.8 + Config: configs/hrnet/fcn_hr18s_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.58 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_potsdam/fcn_hr18s_512x512_80k_potsdam_20211218_205517-ba32af63.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_potsdam/fcn_hr18s_512x512_80k_potsdam_20211218_205517.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-80k_potsdam-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 78.26 + mIoU(ms+flip): 79.24 + Config: configs/hrnet/fcn_hr18_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.76 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_potsdam/fcn_hr18_512x512_80k_potsdam_20211218_205517-5d0387ad.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_potsdam/fcn_hr18_512x512_80k_potsdam_20211218_205517.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_potsdam-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 78.39 + mIoU(ms+flip): 79.34 + Config: configs/hrnet/fcn_hr48_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_potsdam/fcn_hr48_512x512_80k_potsdam_20211219_020601-97434c78.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_potsdam/fcn_hr48_512x512_80k_potsdam_20211219_020601.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-80k_vaihingen-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 71.81 + mIoU(ms+flip): 73.1 + Config: configs/hrnet/fcn_hr18s_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 1.58 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_512x512_80k_vaihingen/fcn_hr18s_4x4_512x512_80k_vaihingen_20211231_230909-b23aae02.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_512x512_80k_vaihingen/fcn_hr18s_4x4_512x512_80k_vaihingen_20211231_230909.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-80k_vaihingen-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 72.57 + mIoU(ms+flip): 74.09 + Config: configs/hrnet/fcn_hr18_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.76 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_512x512_80k_vaihingen/fcn_hr18_4x4_512x512_80k_vaihingen_20211231_231216-2ec3ae8a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_512x512_80k_vaihingen/fcn_hr18_4x4_512x512_80k_vaihingen_20211231_231216.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_vaihingen-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 72.5 + mIoU(ms+flip): 73.52 + Config: configs/hrnet/fcn_hr48_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_512x512_80k_vaihingen/fcn_hr48_4x4_512x512_80k_vaihingen_20211231_231244-7133cb22.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_512x512_80k_vaihingen/fcn_hr48_4x4_512x512_80k_vaihingen_20211231_231244.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18s_4xb4-80k_isaid-896x896 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 62.3 + mIoU(ms+flip): 62.97 + Config: configs/hrnet/fcn_hr18s_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 4.95 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_896x896_80k_isaid/fcn_hr18s_4x4_896x896_80k_isaid_20220118_001603-3cc0769b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_4x4_896x896_80k_isaid/fcn_hr18s_4x4_896x896_80k_isaid_20220118_001603.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr18_4xb4-80k_isaid-896x896 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 65.06 + mIoU(ms+flip): 65.6 + Config: configs/hrnet/fcn_hr18_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 8.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_896x896_80k_isaid/fcn_hr18_4x4_896x896_80k_isaid_20220110_182230-49bf752e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_4x4_896x896_80k_isaid/fcn_hr18_4x4_896x896_80k_isaid_20220110_182230.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch +- Name: fcn_hr48_4xb4-80k_isaid-896x896 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 67.8 + mIoU(ms+flip): 68.53 + Config: configs/hrnet/fcn_hr48_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 16.89 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_896x896_80k_isaid/fcn_hr48_4x4_896x896_80k_isaid_20220114_174643-547fc420.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_4x4_896x896_80k_isaid/fcn_hr48_4x4_896x896_80k_isaid_20220114_174643.log.json + Paper: + Title: Deep High-Resolution Representation Learning for Human Pose Estimation + URL: https://arxiv.org/abs/1908.07919 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/hrnet.py#L218 + Framework: PyTorch diff --git a/mmsegmentation/configs/icnet/README.md b/mmsegmentation/configs/icnet/README.md new file mode 100644 index 0000000..fa2327f --- /dev/null +++ b/mmsegmentation/configs/icnet/README.md @@ -0,0 +1,56 @@ +# ICNet + +> [ICNet for Real-time Semantic Segmentation on High-resolution Images](https://arxiv.org/abs/1704.08545) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We focus on the challenging task of real-time semantic segmentation in this paper. It finds many practical applications and yet is with fundamental difficulty of reducing a large portion of computation for pixel-wise label inference. We propose an image cascade network (ICNet) that incorporates multi-resolution branches under proper label guidance to address this challenge. We provide in-depth analysis of our framework and introduce the cascade feature fusion unit to quickly achieve high-quality segmentation. Our system yields real-time inference on a single GPU card with decent quality results evaluated on challenging datasets like Cityscapes, CamVid and COCO-Stuff. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ICNet | R-18-D8 | 832x832 | 80000 | 1.70 | 27.12 | V100 | 68.14 | 70.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r18-d8_4xb2-80k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_80k_cityscapes/icnet_r18-d8_832x832_80k_cityscapes_20210925_225521-2e36638d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_80k_cityscapes/icnet_r18-d8_832x832_80k_cityscapes_20210925_225521.log.json) | +| ICNet | R-18-D8 | 832x832 | 160000 | - | - | V100 | 71.64 | 74.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r18-d8_4xb2-160k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_160k_cityscapes/icnet_r18-d8_832x832_160k_cityscapes_20210925_230153-2c6eb6e0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_160k_cityscapes/icnet_r18-d8_832x832_160k_cityscapes_20210925_230153.log.json) | +| ICNet (in1k-pre) | R-18-D8 | 832x832 | 80000 | - | - | V100 | 72.51 | 74.78 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes_20210925_230354-1cbe3022.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes_20210925_230354.log.json) | +| ICNet (in1k-pre) | R-18-D8 | 832x832 | 160000 | - | - | V100 | 74.43 | 76.72 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes_20210926_052702-619c8ae1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes_20210926_052702.log.json) | +| ICNet | R-50-D8 | 832x832 | 80000 | 2.53 | 20.08 | V100 | 68.91 | 69.72 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_80k_cityscapes/icnet_r50-d8_832x832_80k_cityscapes_20210926_044625-c6407341.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_80k_cityscapes/icnet_r50-d8_832x832_80k_cityscapes_20210926_044625.log.json) | +| ICNet | R-50-D8 | 832x832 | 160000 | - | - | V100 | 73.82 | 75.67 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r50-d8_4xb2-160k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_160k_cityscapes/icnet_r50-d8_832x832_160k_cityscapes_20210925_232612-a95f0d4e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_160k_cityscapes/icnet_r50-d8_832x832_160k_cityscapes_20210925_232612.log.json) | +| ICNet (in1k-pre) | R-50-D8 | 832x832 | 80000 | - | - | V100 | 74.58 | 76.41 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes_20210926_032943-1743dc7b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes_20210926_032943.log.json) | +| ICNet (in1k-pre) | R-50-D8 | 832x832 | 160000 | - | - | V100 | 76.29 | 78.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes_20210926_042715-ce310aea.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes_20210926_042715.log.json) | +| ICNet | R-101-D8 | 832x832 | 80000 | 3.08 | 16.95 | V100 | 70.28 | 71.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r101-d8_4xb2-80k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_80k_cityscapes/icnet_r101-d8_832x832_80k_cityscapes_20210926_072447-b52f936e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_80k_cityscapes/icnet_r101-d8_832x832_80k_cityscapes_20210926_072447.log.json) | +| ICNet | R-101-D8 | 832x832 | 160000 | - | - | V100 | 73.80 | 76.10 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r101-d8_4xb2-160k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_160k_cityscapes/icnet_r101-d8_832x832_160k_cityscapes_20210926_092350-3a1ebf1a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_160k_cityscapes/icnet_r101-d8_832x832_160k_cityscapes_20210926_092350.log.json) | +| ICNet (in1k-pre) | R-101-D8 | 832x832 | 80000 | - | - | V100 | 75.57 | 77.86 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes_20210926_020414-7ceb12c5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes_20210926_020414.log.json) | +| ICNet (in1k-pre) | R-101-D8 | 832x832 | 160000 | - | - | V100 | 76.15 | 77.98 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes_20210925_232612-9484ae8a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes_20210925_232612.log.json) | + +Note: `in1k-pre` means pretrained model is used. + +## Citation + +```bibtext +@inproceedings{zhao2018icnet, + title={Icnet for real-time semantic segmentation on high-resolution images}, + author={Zhao, Hengshuang and Qi, Xiaojuan and Shen, Xiaoyong and Shi, Jianping and Jia, Jiaya}, + booktitle={Proceedings of the European conference on computer vision (ECCV)}, + pages={405--420}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py new file mode 100644 index 0000000..a6840a1 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py @@ -0,0 +1,7 @@ +_base_ = './icnet_r50-d8_4xb2-160k_cityscapes-832x832.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + depth=101, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet101_v1c')))) diff --git a/mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py new file mode 100644 index 0000000..ca81df8 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py @@ -0,0 +1,7 @@ +_base_ = './icnet_r50-d8_4xb2-80k_cityscapes-832x832.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + depth=101, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet101_v1c')))) diff --git a/mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-160k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-160k_cityscapes-832x832.py new file mode 100644 index 0000000..ef60446 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-160k_cityscapes-832x832.py @@ -0,0 +1,2 @@ +_base_ = './icnet_r50-d8_4xb2-160k_cityscapes-832x832.py' +model = dict(backbone=dict(backbone_cfg=dict(depth=101))) diff --git a/mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-80k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-80k_cityscapes-832x832.py new file mode 100644 index 0000000..5173d2d --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r101-d8_4xb2-80k_cityscapes-832x832.py @@ -0,0 +1,2 @@ +_base_ = './icnet_r50-d8_4xb2-80k_cityscapes-832x832.py' +model = dict(backbone=dict(backbone_cfg=dict(depth=101))) diff --git a/mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py new file mode 100644 index 0000000..5f72daa --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py @@ -0,0 +1,8 @@ +_base_ = './icnet_r50-d8_4xb2-160k_cityscapes-832x832.py' +model = dict( + backbone=dict( + layer_channels=(128, 512), + backbone_cfg=dict( + depth=18, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet18_v1c')))) diff --git a/mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py new file mode 100644 index 0000000..2fc79ab --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py @@ -0,0 +1,8 @@ +_base_ = './icnet_r50-d8_4xb2-80k_cityscapes-832x832.py' +model = dict( + backbone=dict( + layer_channels=(128, 512), + backbone_cfg=dict( + depth=18, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet18_v1c')))) diff --git a/mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-160k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-160k_cityscapes-832x832.py new file mode 100644 index 0000000..2c70e94 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-160k_cityscapes-832x832.py @@ -0,0 +1,3 @@ +_base_ = './icnet_r50-d8_4xb2-160k_cityscapes-832x832.py' +model = dict( + backbone=dict(layer_channels=(128, 512), backbone_cfg=dict(depth=18))) diff --git a/mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-80k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-80k_cityscapes-832x832.py new file mode 100644 index 0000000..23c7ac2 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r18-d8_4xb2-80k_cityscapes-832x832.py @@ -0,0 +1,3 @@ +_base_ = './icnet_r50-d8_4xb2-80k_cityscapes-832x832.py' +model = dict( + backbone=dict(layer_channels=(128, 512), backbone_cfg=dict(depth=18))) diff --git a/mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py new file mode 100644 index 0000000..f9ab863 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py @@ -0,0 +1,6 @@ +_base_ = './icnet_r50-d8_4xb2-160k_cityscapes-832x832.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet50_v1c')))) diff --git a/mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py new file mode 100644 index 0000000..9a085d4 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py @@ -0,0 +1,6 @@ +_base_ = './icnet_r50-d8_4xb2-80k_cityscapes-832x832.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnet50_v1c')))) diff --git a/mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-160k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-160k_cityscapes-832x832.py new file mode 100644 index 0000000..1b7b188 --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-160k_cityscapes-832x832.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/icnet_r50-d8.py', + '../_base_/datasets/cityscapes_832x832.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (832, 832) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py b/mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py new file mode 100644 index 0000000..001dbca --- /dev/null +++ b/mmsegmentation/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/icnet_r50-d8.py', + '../_base_/datasets/cityscapes_832x832.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (832, 832) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/icnet/metafile.yaml b/mmsegmentation/configs/icnet/metafile.yaml new file mode 100644 index 0000000..1d843ee --- /dev/null +++ b/mmsegmentation/configs/icnet/metafile.yaml @@ -0,0 +1,298 @@ +Collections: +- Name: ICNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + README: configs/icnet/README.md + Frameworks: + - PyTorch +Models: +- Name: icnet_r18-d8_4xb2-80k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 68.14 + mIoU(ms+flip): 70.16 + Config: configs/icnet/icnet_r18-d8_4xb2-80k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - ICNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_80k_cityscapes/icnet_r18-d8_832x832_80k_cityscapes_20210925_225521-2e36638d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_80k_cityscapes/icnet_r18-d8_832x832_80k_cityscapes_20210925_225521.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r18-d8_4xb2-160k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 71.64 + mIoU(ms+flip): 74.18 + Config: configs/icnet/icnet_r18-d8_4xb2-160k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - ICNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_160k_cityscapes/icnet_r18-d8_832x832_160k_cityscapes_20210925_230153-2c6eb6e0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_832x832_160k_cityscapes/icnet_r18-d8_832x832_160k_cityscapes_20210925_230153.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 72.51 + mIoU(ms+flip): 74.78 + Config: configs/icnet/icnet_r18-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - ICNet + - (in1k-pre) + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes_20210925_230354-1cbe3022.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes_20210925_230354.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.43 + mIoU(ms+flip): 76.72 + Config: configs/icnet/icnet_r18-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - ICNet + - (in1k-pre) + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes_20210926_052702-619c8ae1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes_20210926_052702.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r50-d8_4xb2-80k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 68.91 + mIoU(ms+flip): 69.72 + Config: configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ICNet + Training Resources: 4x V100 GPUS + Memory (GB): 2.53 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_80k_cityscapes/icnet_r50-d8_832x832_80k_cityscapes_20210926_044625-c6407341.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_80k_cityscapes/icnet_r50-d8_832x832_80k_cityscapes_20210926_044625.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r50-d8_4xb2-160k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.82 + mIoU(ms+flip): 75.67 + Config: configs/icnet/icnet_r50-d8_4xb2-160k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ICNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_160k_cityscapes/icnet_r50-d8_832x832_160k_cityscapes_20210925_232612-a95f0d4e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_832x832_160k_cityscapes/icnet_r50-d8_832x832_160k_cityscapes_20210925_232612.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.58 + mIoU(ms+flip): 76.41 + Config: configs/icnet/icnet_r50-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ICNet + - (in1k-pre) + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes_20210926_032943-1743dc7b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes_20210926_032943.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.29 + mIoU(ms+flip): 78.09 + Config: configs/icnet/icnet_r50-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ICNet + - (in1k-pre) + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes_20210926_042715-ce310aea.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes_20210926_042715.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r101-d8_4xb2-80k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 70.28 + mIoU(ms+flip): 71.95 + Config: configs/icnet/icnet_r101-d8_4xb2-80k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ICNet + Training Resources: 4x V100 GPUS + Memory (GB): 3.08 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_80k_cityscapes/icnet_r101-d8_832x832_80k_cityscapes_20210926_072447-b52f936e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_80k_cityscapes/icnet_r101-d8_832x832_80k_cityscapes_20210926_072447.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r101-d8_4xb2-160k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.8 + mIoU(ms+flip): 76.1 + Config: configs/icnet/icnet_r101-d8_4xb2-160k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ICNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_160k_cityscapes/icnet_r101-d8_832x832_160k_cityscapes_20210926_092350-3a1ebf1a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_832x832_160k_cityscapes/icnet_r101-d8_832x832_160k_cityscapes_20210926_092350.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.57 + mIoU(ms+flip): 77.86 + Config: configs/icnet/icnet_r101-d8-in1k-pre_4xb2-80k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ICNet + - (in1k-pre) + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes_20210926_020414-7ceb12c5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes_20210926_020414.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch +- Name: icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832 + In Collection: ICNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.15 + mIoU(ms+flip): 77.98 + Config: configs/icnet/icnet_r101-d8-in1k-pre_4xb2-160k_cityscapes-832x832.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ICNet + - (in1k-pre) + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes_20210925_232612-9484ae8a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/icnet/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes_20210925_232612.log.json + Paper: + Title: ICNet for Real-time Semantic Segmentation on High-resolution Images + URL: https://arxiv.org/abs/1704.08545 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/necks/ic_neck.py#L77 + Framework: PyTorch diff --git a/mmsegmentation/configs/isanet/README.md b/mmsegmentation/configs/isanet/README.md new file mode 100644 index 0000000..c11744f --- /dev/null +++ b/mmsegmentation/configs/isanet/README.md @@ -0,0 +1,80 @@ +# ISANet + +> [Interlaced Sparse Self-Attention for Semantic Segmentation](https://arxiv.org/abs/1907.12273) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +In this paper, we present a so-called interlaced sparse self-attention approach to improve the efficiency of the \\emph{self-attention} mechanism for semantic segmentation. The main idea is that we factorize the dense affinity matrix as the product of two sparse affinity matrices. There are two successive attention modules each estimating a sparse affinity matrix. The first attention module is used to estimate the affinities within a subset of positions that have long spatial interval distances and the second attention module is used to estimate the affinities within a subset of positions that have short spatial interval distances. These two attention modules are designed so that each position is able to receive the information from all the other positions. In contrast to the original self-attention module, our approach decreases the computation and memory complexity substantially especially when processing high-resolution feature maps. We empirically verify the effectiveness of our approach on six challenging semantic segmentation benchmarks. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------- | -------: | -------------- | ------ | ----- | ------------: | -----------------------------------------------------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ISANet | R-50-D8 | 512x1024 | 40000 | 5.869 | 2.91 | V100 | 78.49 | 79.44 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_40k_cityscapes/isanet_r50-d8_512x1024_40k_cityscapes_20210901_054739-981bd763.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_40k_cityscapes/isanet_r50-d8_512x1024_40k_cityscapes_20210901_054739.log.json) | +| ISANet | R-50-D8 | 512x1024 | 80000 | 5.869 | 2.91 | V100 | 78.68 | 80.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_80k_cityscapes/isanet_r50-d8_512x1024_80k_cityscapes_20210901_074202-89384497.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_80k_cityscapes/isanet_r50-d8_512x1024_80k_cityscapes_20210901_074202.log.json) | +| ISANet | R-50-D8 | 769x769 | 40000 | 6.759 | 1.54 | V100 | 78.70 | 80.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_40k_cityscapes/isanet_r50-d8_769x769_40k_cityscapes_20210903_050200-4ae7e65b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_40k_cityscapes/isanet_r50-d8_769x769_40k_cityscapes_20210903_050200.log.json) | +| ISANet | R-50-D8 | 769x769 | 80000 | 6.759 | 1.54 | V100 | 79.29 | 80.53 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_80k_cityscapes/isanet_r50-d8_769x769_80k_cityscapes_20210903_101126-99b54519.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_80k_cityscapes/isanet_r50-d8_769x769_80k_cityscapes_20210903_101126.log.json) | +| ISANet | R-101-D8 | 512x1024 | 40000 | 9.425 | 2.35 | V100 | 79.58 | 81.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_40k_cityscapes/isanet_r101-d8_512x1024_40k_cityscapes_20210901_145553-293e6bd6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_40k_cityscapes/isanet_r101-d8_512x1024_40k_cityscapes_20210901_145553.log.json) | +| ISANet | R-101-D8 | 512x1024 | 80000 | 9.425 | 2.35 | V100 | 80.32 | 81.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_80k_cityscapes/isanet_r101-d8_512x1024_80k_cityscapes_20210901_145243-5b99c9b2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_80k_cityscapes/isanet_r101-d8_512x1024_80k_cityscapes_20210901_145243.log.json) | +| ISANet | R-101-D8 | 769x769 | 40000 | 10.815 | 0.92 | V100 | 79.68 | 80.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_40k_cityscapes/isanet_r101-d8_769x769_40k_cityscapes_20210903_111320-509e7224.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_40k_cityscapes/isanet_r101-d8_769x769_40k_cityscapes_20210903_111320.log.json) | +| ISANet | R-101-D8 | 769x769 | 80000 | 10.815 | 0.92 | V100 | 80.61 | 81.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_80k_cityscapes/isanet_r101-d8_769x769_80k_cityscapes_20210903_111319-24f71dfa.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_80k_cityscapes/isanet_r101-d8_769x769_80k_cityscapes_20210903_111319.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------- | -------: | -------------- | ------ | ----- | ------------: | -------------------------------------------------------------------------------------------------------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ISANet | R-50-D8 | 512x512 | 80000 | 9.0 | 22.55 | V100 | 41.12 | 42.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_80k_ade20k/isanet_r50-d8_512x512_80k_ade20k_20210903_124557-6ed83a0c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_80k_ade20k/isanet_r50-d8_512x512_80k_ade20k_20210903_124557.log.json) | +| ISANet | R-50-D8 | 512x512 | 160000 | 9.0 | 22.55 | V100 | 42.59 | 43.07 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_160k_ade20k/isanet_r50-d8_512x512_160k_ade20k_20210903_104850-f752d0a3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_160k_ade20k/isanet_r50-d8_512x512_160k_ade20k_20210903_104850.log.json) | +| ISANet | R-101-D8 | 512x512 | 80000 | 12.562 | 10.56 | V100 | 43.51 | 44.38 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_80k_ade20k/isanet_r101-d8_512x512_80k_ade20k_20210903_162056-68b235c2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_80k_ade20k/isanet_r101-d8_512x512_80k_ade20k_20210903_162056.log.json) | +| ISANet | R-101-D8 | 512x512 | 160000 | 12.562 | 10.56 | V100 | 43.80 | 45.4 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_160k_ade20k/isanet_r101-d8_512x512_160k_ade20k_20210903_211431-a7879dcd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_160k_ade20k/isanet_r101-d8_512x512_160k_ade20k_20210903_211431.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------- | -------: | -------------- | ------ | ----- | ------------: | --------------------------------------------------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ISANet | R-50-D8 | 512x512 | 20000 | 5.9 | 23.08 | V100 | 76.78 | 77.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_20k_voc12aug/isanet_r50-d8_512x512_20k_voc12aug_20210901_164838-79d59b80.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_20k_voc12aug/isanet_r50-d8_512x512_20k_voc12aug_20210901_164838.log.json) | +| ISANet | R-50-D8 | 512x512 | 40000 | 5.9 | 23.08 | V100 | 76.20 | 77.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_40k_voc12aug/isanet_r50-d8_512x512_40k_voc12aug_20210901_151349-7d08a54e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_40k_voc12aug/isanet_r50-d8_512x512_40k_voc12aug_20210901_151349.log.json) | +| ISANet | R-101-D8 | 512x512 | 20000 | 9.465 | 7.42 | V100 | 78.46 | 79.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_20k_voc12aug/isanet_r101-d8_512x512_20k_voc12aug_20210901_115805-3ccbf355.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_20k_voc12aug/isanet_r101-d8_512x512_20k_voc12aug_20210901_115805.log.json) | +| ISANet | R-101-D8 | 512x512 | 40000 | 9.465 | 7.42 | V100 | 78.12 | 79.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet/isanet_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_40k_voc12aug/isanet_r101-d8_512x512_40k_voc12aug_20210901_145814-bc71233b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_40k_voc12aug/isanet_r101-d8_512x512_40k_voc12aug_20210901_145814.log.json) | + +## Citation + +```bibetex +@article{huang2019isa, + title={Interlaced Sparse Self-Attention for Semantic Segmentation}, + author={Huang, Lang and Yuan, Yuhui and Guo, Jianyuan and Zhang, Chao and Chen, Xilin and Wang, Jingdong}, + journal={arXiv preprint arXiv:1907.12273}, + year={2019} +} +``` + +The technical report above is also presented at: + +```bibetex +@article{yuan2021ocnet, + title={OCNet: Object Context for Semantic Segmentation}, + author={Yuan, Yuhui and Huang, Lang and Guo, Jianyuan and Zhang, Chao and Chen, Xilin and Wang, Jingdong}, + journal={International Journal of Computer Vision}, + pages={1--24}, + year={2021}, + publisher={Springer} +} +``` diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..6093aeb --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..dc14c76 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..1735f89 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..b1a6371 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..c2fb09e --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..7c225cf --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..5e86ee5 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..090e86f --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './isanet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..f03365e --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..f073a7b --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..4be445d --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..0278ad8 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..1f4af8d --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..591df42 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..a59879b --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..7df05c3 --- /dev/null +++ b/mmsegmentation/configs/isanet/isanet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/isanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/isanet/metafile.yaml b/mmsegmentation/configs/isanet/metafile.yaml new file mode 100644 index 0000000..ad394ea --- /dev/null +++ b/mmsegmentation/configs/isanet/metafile.yaml @@ -0,0 +1,399 @@ +Collections: +- Name: ISANet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + README: configs/isanet/README.md + Frameworks: + - PyTorch +Models: +- Name: isanet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.49 + mIoU(ms+flip): 79.44 + Config: configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 5.869 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_40k_cityscapes/isanet_r50-d8_512x1024_40k_cityscapes_20210901_054739-981bd763.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_40k_cityscapes/isanet_r50-d8_512x1024_40k_cityscapes_20210901_054739.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.68 + mIoU(ms+flip): 80.25 + Config: configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 5.869 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_80k_cityscapes/isanet_r50-d8_512x1024_80k_cityscapes_20210901_074202-89384497.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x1024_80k_cityscapes/isanet_r50-d8_512x1024_80k_cityscapes_20210901_074202.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.7 + mIoU(ms+flip): 80.28 + Config: configs/isanet/isanet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 6.759 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_40k_cityscapes/isanet_r50-d8_769x769_40k_cityscapes_20210903_050200-4ae7e65b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_40k_cityscapes/isanet_r50-d8_769x769_40k_cityscapes_20210903_050200.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.29 + mIoU(ms+flip): 80.53 + Config: configs/isanet/isanet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 6.759 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_80k_cityscapes/isanet_r50-d8_769x769_80k_cityscapes_20210903_101126-99b54519.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_769x769_80k_cityscapes/isanet_r50-d8_769x769_80k_cityscapes_20210903_101126.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.58 + mIoU(ms+flip): 81.05 + Config: configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.425 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_40k_cityscapes/isanet_r101-d8_512x1024_40k_cityscapes_20210901_145553-293e6bd6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_40k_cityscapes/isanet_r101-d8_512x1024_40k_cityscapes_20210901_145553.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.32 + mIoU(ms+flip): 81.58 + Config: configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.425 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_80k_cityscapes/isanet_r101-d8_512x1024_80k_cityscapes_20210901_145243-5b99c9b2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x1024_80k_cityscapes/isanet_r101-d8_512x1024_80k_cityscapes_20210901_145243.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.68 + mIoU(ms+flip): 80.95 + Config: configs/isanet/isanet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 10.815 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_40k_cityscapes/isanet_r101-d8_769x769_40k_cityscapes_20210903_111320-509e7224.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_40k_cityscapes/isanet_r101-d8_769x769_40k_cityscapes_20210903_111320.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.61 + mIoU(ms+flip): 81.59 + Config: configs/isanet/isanet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 10.815 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_80k_cityscapes/isanet_r101-d8_769x769_80k_cityscapes_20210903_111319-24f71dfa.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_769x769_80k_cityscapes/isanet_r101-d8_769x769_80k_cityscapes_20210903_111319.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.12 + mIoU(ms+flip): 42.35 + Config: configs/isanet/isanet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_80k_ade20k/isanet_r50-d8_512x512_80k_ade20k_20210903_124557-6ed83a0c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_80k_ade20k/isanet_r50-d8_512x512_80k_ade20k_20210903_124557.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.59 + mIoU(ms+flip): 43.07 + Config: configs/isanet/isanet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_160k_ade20k/isanet_r50-d8_512x512_160k_ade20k_20210903_104850-f752d0a3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_160k_ade20k/isanet_r50-d8_512x512_160k_ade20k_20210903_104850.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.51 + mIoU(ms+flip): 44.38 + Config: configs/isanet/isanet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 12.562 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_80k_ade20k/isanet_r101-d8_512x512_80k_ade20k_20210903_162056-68b235c2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_80k_ade20k/isanet_r101-d8_512x512_80k_ade20k_20210903_162056.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.8 + mIoU(ms+flip): 45.4 + Config: configs/isanet/isanet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 12.562 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_160k_ade20k/isanet_r101-d8_512x512_160k_ade20k_20210903_211431-a7879dcd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_160k_ade20k/isanet_r101-d8_512x512_160k_ade20k_20210903_211431.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.78 + mIoU(ms+flip): 77.79 + Config: configs/isanet/isanet_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 5.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_20k_voc12aug/isanet_r50-d8_512x512_20k_voc12aug_20210901_164838-79d59b80.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_20k_voc12aug/isanet_r50-d8_512x512_20k_voc12aug_20210901_164838.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.2 + mIoU(ms+flip): 77.22 + Config: configs/isanet/isanet_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 5.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_40k_voc12aug/isanet_r50-d8_512x512_40k_voc12aug_20210901_151349-7d08a54e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r50-d8_512x512_40k_voc12aug/isanet_r50-d8_512x512_40k_voc12aug_20210901_151349.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.46 + mIoU(ms+flip): 79.16 + Config: configs/isanet/isanet_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.465 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_20k_voc12aug/isanet_r101-d8_512x512_20k_voc12aug_20210901_115805-3ccbf355.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_20k_voc12aug/isanet_r101-d8_512x512_20k_voc12aug_20210901_115805.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch +- Name: isanet_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: ISANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.12 + mIoU(ms+flip): 79.04 + Config: configs/isanet/isanet_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - ISANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.465 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_40k_voc12aug/isanet_r101-d8_512x512_40k_voc12aug_20210901_145814-bc71233b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/isanet/isanet_r101-d8_512x512_40k_voc12aug/isanet_r101-d8_512x512_40k_voc12aug_20210901_145814.log.json + Paper: + Title: Interlaced Sparse Self-Attention for Semantic Segmentation + URL: https://arxiv.org/abs/1907.12273 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.18.0/mmseg/models/decode_heads/isa_head.py#L58 + Framework: PyTorch diff --git a/mmsegmentation/configs/knet/README.md b/mmsegmentation/configs/knet/README.md new file mode 100644 index 0000000..1f3f2ae --- /dev/null +++ b/mmsegmentation/configs/knet/README.md @@ -0,0 +1,52 @@ +# K-Net + +> [K-Net: Towards Unified Image Segmentation](https://arxiv.org/abs/2106.14855) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Semantic, instance, and panoptic segmentations have been addressed using different and specialized frameworks despite their underlying connections. This paper presents a unified, simple, and effective framework for these essentially similar tasks. The framework, named K-Net, segments both instances and semantic categories consistently by a group of learnable kernels, where each kernel is responsible for generating a mask for either a potential instance or a stuff class. To remedy the difficulties of distinguishing various instances, we propose a kernel update strategy that enables each kernel dynamic and conditional on its meaningful group in the input image. K-Net can be trained in an end-to-end manner with bipartite matching, and its training and inference are naturally NMS-free and box-free. Without bells and whistles, K-Net surpasses all previous published state-of-the-art single-model results of panoptic segmentation on MS COCO test-dev split and semantic segmentation on ADE20K val split with 55.2% PQ and 54.3% mIoU, respectively. Its instance segmentation performance is also on par with Cascade Mask R-CNN on MS COCO with 60%-90% faster inference speeds. Code and models will be released at [this https URL](https://github.com/ZwwWayne/K-Net/). + + + +
+ +
+ +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------------- | -------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| KNet + FCN | R-50-D8 | 512x512 | 80000 | 7.01 | 19.24 | V100 | 43.60 | 45.12 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_043751-abcab920.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_043751.log.json) | +| KNet + PSPNet | R-50-D8 | 512x512 | 80000 | 6.98 | 20.04 | V100 | 44.18 | 45.58 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_054634-d2c72240.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_054634.log.json) | +| KNet + DeepLabV3 | R-50-D8 | 512x512 | 80000 | 7.42 | 12.10 | V100 | 45.06 | 46.11 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_041642-00c8fbeb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_041642.log.json) | +| KNet + UperNet | R-50-D8 | 512x512 | 80000 | 7.34 | 17.11 | V100 | 43.45 | 44.07 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220304_125657-215753b0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220304_125657.log.json) | +| KNet + UperNet | Swin-T | 512x512 | 80000 | 7.57 | 15.56 | V100 | 45.84 | 46.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k_20220303_133059-7545e1dc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k_20220303_133059.log.json) | +| KNet + UperNet | Swin-L | 512x512 | 80000 | 13.5 | 8.29 | V100 | 52.05 | 53.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k_20220303_154559-d8da9a90.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k_20220303_154559.log.json) | +| KNet + UperNet | Swin-L | 640x640 | 80000 | 13.54 | 8.29 | V100 | 52.21 | 53.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k_20220301_220747-8787fc71.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k_20220301_220747.log.json) | + +Note: + +- All experiments of K-Net are implemented with 8 V100 (32G) GPUs with 2 samplers per GPU. + +# Citation + +```bibtex +@inproceedings{zhang2021knet, + title={{K-Net: Towards} Unified Image Segmentation}, + author={Wenwei Zhang and Jiangmiao Pang and Kai Chen and Chen Change Loy}, + year={2021}, + booktitle={NeurIPS}, +} +``` diff --git a/mmsegmentation/configs/knet/knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512.py b/mmsegmentation/configs/knet/knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512.py new file mode 100644 index 0000000..7946cca --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512.py @@ -0,0 +1,111 @@ +_base_ = [ + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + size=crop_size, + seg_pad_val=255) +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +num_stages = 3 +conv_kernel_size = 1 +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='IterativeDecodeHead', + num_stages=num_stages, + kernel_update_head=[ + dict( + type='KernelUpdateHead', + num_classes=150, + num_ffn_fcs=2, + num_heads=8, + num_mask_fcs=1, + feedforward_channels=2048, + in_channels=512, + out_channels=512, + dropout=0.0, + conv_kernel_size=conv_kernel_size, + ffn_act_cfg=dict(type='ReLU', inplace=True), + with_ffn=True, + feat_transform_cfg=dict( + conv_cfg=dict(type='Conv2d'), act_cfg=None), + kernel_updator_cfg=dict( + type='KernelUpdator', + in_channels=256, + feat_channels=256, + out_channels=256, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'))) for _ in range(num_stages) + ], + kernel_generate_head=dict( + type='ASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0005), + clip_grad=dict(max_norm=1, norm_type=2)) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + milestones=[60000, 72000], + by_epoch=False, + ) +] +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py b/mmsegmentation/configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py new file mode 100644 index 0000000..497cd04 --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py @@ -0,0 +1,112 @@ +_base_ = [ + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + size=crop_size, + seg_pad_val=255) +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +num_stages = 3 +conv_kernel_size = 1 +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='IterativeDecodeHead', + num_stages=num_stages, + kernel_update_head=[ + dict( + type='KernelUpdateHead', + num_classes=150, + num_ffn_fcs=2, + num_heads=8, + num_mask_fcs=1, + feedforward_channels=2048, + in_channels=512, + out_channels=512, + dropout=0.0, + conv_kernel_size=conv_kernel_size, + ffn_act_cfg=dict(type='ReLU', inplace=True), + with_ffn=True, + feat_transform_cfg=dict( + conv_cfg=dict(type='Conv2d'), act_cfg=None), + kernel_updator_cfg=dict( + type='KernelUpdator', + in_channels=256, + feat_channels=256, + out_channels=256, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'))) for _ in range(num_stages) + ], + kernel_generate_head=dict( + type='FCNHead', + in_channels=2048, + in_index=3, + channels=512, + num_convs=2, + concat_input=True, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0005), + clip_grad=dict(max_norm=1, norm_type=2)) + +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + milestones=[60000, 72000], + by_epoch=False, + ) +] +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py b/mmsegmentation/configs/knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py new file mode 100644 index 0000000..b918671 --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + size=crop_size, + seg_pad_val=255) +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +num_stages = 3 +conv_kernel_size = 1 +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='IterativeDecodeHead', + num_stages=num_stages, + kernel_update_head=[ + dict( + type='KernelUpdateHead', + num_classes=150, + num_ffn_fcs=2, + num_heads=8, + num_mask_fcs=1, + feedforward_channels=2048, + in_channels=512, + out_channels=512, + dropout=0.0, + conv_kernel_size=conv_kernel_size, + ffn_act_cfg=dict(type='ReLU', inplace=True), + with_ffn=True, + feat_transform_cfg=dict( + conv_cfg=dict(type='Conv2d'), act_cfg=None), + kernel_updator_cfg=dict( + type='KernelUpdator', + in_channels=256, + feat_channels=256, + out_channels=256, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'))) for _ in range(num_stages) + ], + kernel_generate_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0005), + clip_grad=dict(max_norm=1, norm_type=2)) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + milestones=[60000, 72000], + by_epoch=False, + ) +] +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py b/mmsegmentation/configs/knet/knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py new file mode 100644 index 0000000..a0a66c5 --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py @@ -0,0 +1,111 @@ +_base_ = [ + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + size=crop_size, + seg_pad_val=255) +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +num_stages = 3 +conv_kernel_size = 1 + +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='IterativeDecodeHead', + num_stages=num_stages, + kernel_update_head=[ + dict( + type='KernelUpdateHead', + num_classes=150, + num_ffn_fcs=2, + num_heads=8, + num_mask_fcs=1, + feedforward_channels=2048, + in_channels=512, + out_channels=512, + dropout=0.0, + conv_kernel_size=conv_kernel_size, + ffn_act_cfg=dict(type='ReLU', inplace=True), + with_ffn=True, + feat_transform_cfg=dict( + conv_cfg=dict(type='Conv2d'), act_cfg=None), + kernel_updator_cfg=dict( + type='KernelUpdator', + in_channels=256, + feat_channels=256, + out_channels=256, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'))) for _ in range(num_stages) + ], + kernel_generate_head=dict( + type='UPerHead', + in_channels=[256, 512, 1024, 2048], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0005), + clip_grad=dict(max_norm=1, norm_type=2)) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + milestones=[60000, 72000], + by_epoch=False, + ) +] +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py b/mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py new file mode 100644 index 0000000..c6f4eb6 --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py @@ -0,0 +1,21 @@ +_base_ = 'knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py' + +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window7_224_22k_20220308-d5bdebaf.pth' # noqa +# model settings +model = dict( + pretrained=checkpoint_file, + backbone=dict( + embed_dims=192, + depths=[2, 2, 18, 2], + num_heads=[6, 12, 24, 48], + window_size=7, + use_abs_pos_embed=False, + drop_path_rate=0.3, + patch_norm=True), + decode_head=dict( + kernel_generate_head=dict(in_channels=[192, 384, 768, 1536])), + auxiliary_head=dict(in_channels=768)) +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py b/mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py new file mode 100644 index 0000000..84c3d8c --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py @@ -0,0 +1,57 @@ +_base_ = 'knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py' + +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window7_224_22k_20220308-d5bdebaf.pth' # noqa +# model settings +crop_size = (640, 640) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + size=crop_size, + seg_pad_val=255) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=checkpoint_file, + backbone=dict( + embed_dims=192, + depths=[2, 2, 18, 2], + num_heads=[6, 12, 24, 48], + window_size=7, + use_abs_pos_embed=False, + drop_path_rate=0.4, + patch_norm=True), + decode_head=dict( + kernel_generate_head=dict(in_channels=[192, 384, 768, 1536])), + auxiliary_head=dict(in_channels=768)) + +crop_size = (640, 640) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 640), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 640), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py b/mmsegmentation/configs/knet/knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py new file mode 100644 index 0000000..a7acec4 --- /dev/null +++ b/mmsegmentation/configs/knet/knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py @@ -0,0 +1,63 @@ +_base_ = 'knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py' + +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_tiny_patch4_window7_224_20220308-f41b89d3.pth' # noqa + +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +num_stages = 3 +conv_kernel_size = 1 + +model = dict( + type='EncoderDecoder', + pretrained=checkpoint_file, + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + use_abs_pos_embed=False, + patch_norm=True, + out_indices=(0, 1, 2, 3)), + decode_head=dict( + kernel_generate_head=dict(in_channels=[96, 192, 384, 768])), + auxiliary_head=dict(in_channels=384)) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + # modify learning rate following the official implementation of Swin Transformer # noqa + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.0005), + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + }), + clip_grad=dict(max_norm=1, norm_type=2)) + +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + milestones=[60000, 72000], + by_epoch=False, + ) +] +# In K-Net implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/knet/metafile.yaml b/mmsegmentation/configs/knet/metafile.yaml new file mode 100644 index 0000000..0f4ab79 --- /dev/null +++ b/mmsegmentation/configs/knet/metafile.yaml @@ -0,0 +1,188 @@ +Collections: +- Name: KNet + License: Apache License 2.0 + Metadata: + Training Data: + - ADE20K + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + README: configs/knet/README.md + Frameworks: + - PyTorch +Models: +- Name: knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.6 + mIoU(ms+flip): 45.12 + Config: configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - KNet + - FCN + Training Resources: 8x V100 GPUS + Memory (GB): 7.01 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_043751-abcab920.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_043751.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch +- Name: knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.18 + mIoU(ms+flip): 45.58 + Config: configs/knet/knet-s3_r50-d8_pspnet_8xb2-adamw-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - KNet + - PSPNet + Training Resources: 8x V100 GPUS + Memory (GB): 6.98 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_054634-d2c72240.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_054634.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch +- Name: knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.06 + mIoU(ms+flip): 46.11 + Config: configs/knet/knet-s3_r50-d8_deeplabv3_8xb2-adamw-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - KNet + - DeepLabV3 + Training Resources: 8x V100 GPUS + Memory (GB): 7.42 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_041642-00c8fbeb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k_20220228_041642.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch +- Name: knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.45 + mIoU(ms+flip): 44.07 + Config: configs/knet/knet-s3_r50-d8_upernet_8xb2-adamw-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - KNet + - UperNet + Training Resources: 8x V100 GPUS + Memory (GB): 7.34 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220304_125657-215753b0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k_20220304_125657.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch +- Name: knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.84 + mIoU(ms+flip): 46.27 + Config: configs/knet/knet-s3_swin-t_upernet_8xb2-adamw-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-T + - KNet + - UperNet + Training Resources: 8x V100 GPUS + Memory (GB): 7.57 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k_20220303_133059-7545e1dc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k_20220303_133059.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch +- Name: knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 52.05 + mIoU(ms+flip): 53.24 + Config: configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-L + - KNet + - UperNet + Training Resources: 8x V100 GPUS + Memory (GB): 13.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k_20220303_154559-d8da9a90.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k_20220303_154559.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch +- Name: knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640 + In Collection: KNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 52.21 + mIoU(ms+flip): 53.34 + Config: configs/knet/knet-s3_swin-l_upernet_8xb2-adamw-80k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-L + - KNet + - UperNet + Training Resources: 8x V100 GPUS + Memory (GB): 13.54 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k_20220301_220747-8787fc71.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/knet/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k_20220301_220747.log.json + Paper: + Title: 'K-Net: Towards Unified Image Segmentation' + URL: https://arxiv.org/abs/2106.14855 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.23.0/mmseg/models/decode_heads/knet_head.py#L392 + Framework: PyTorch diff --git a/mmsegmentation/configs/mae/README.md b/mmsegmentation/configs/mae/README.md new file mode 100644 index 0000000..d14e383 --- /dev/null +++ b/mmsegmentation/configs/mae/README.md @@ -0,0 +1,82 @@ +# MAE + +> [Masked Autoencoders Are Scalable Vision Learners](https://arxiv.org/abs/2111.06377) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +This paper shows that masked autoencoders (MAE) are scalable self-supervised learners for computer vision. Our MAE approach is simple: we mask random patches of the input image and reconstruct the missing pixels. It is based on two core designs. First, we develop an asymmetric encoder-decoder architecture, with an encoder that operates only on the visible subset of patches (without mask tokens), along with a lightweight decoder that reconstructs the original image from the latent representation and mask tokens. Second, we find that masking a high proportion of the input image, e.g., 75%, yields a nontrivial and meaningful self-supervisory task. Coupling these two designs enables us to train large models efficiently and effectively: we accelerate training (by 3x or more) and improve accuracy. Our scalable approach allows for learning high-capacity models that generalize well: e.g., a vanilla ViT-Huge model achieves the best accuracy (87.8%) among methods that use only ImageNet-1K data. Transfer performance in downstream tasks outperforms supervised pre-training and shows promising scaling behavior. + + + +
+ +
+ +## Usage + +To use other repositories' pre-trained models, it is necessary to convert keys. + +We provide a script [`beit2mmseg.py`](../../tools/model_converters/beit2mmseg.py) in the tools directory to convert the key of MAE model from [the official repo](https://github.com/facebookresearch/mae) to MMSegmentation style. + +```shell +python tools/model_converters/beit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/beit2mmseg.py https://dl.fbaipublicfiles.com/mae/pretrain/mae_pretrain_vit_base.pth pretrain/mae_pretrain_vit_base_mmcls.pth +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +In our default setting, pretrained models could be defined below: + +| pretrained models | original models | +| ------------------------------- | ------------------------------------------------------------------------------------------------ | +| mae_pretrain_vit_base_mmcls.pth | ['mae_pretrain_vit_base'](https://dl.fbaipublicfiles.com/mae/pretrain/mae_pretrain_vit_base.pth) | + +Verify the single-scale results of the model: + +```shell +sh tools/dist_test.sh \ +configs/mae/upernet_mae-base_fp16_8x2_512x512_160k_ade20k.py \ +upernet_mae-base_fp16_8x2_512x512_160k_ade20k_20220426_174752-f92a2975.pth $GPUS --eval mIoU +``` + +Since relative position embedding requires the input length and width to be equal, the sliding window is adopted for multi-scale inference. So we set min_size=512, that is, the shortest edge is 512. So the multi-scale inference of config is performed separately, instead of '--aug-test'. For multi-scale inference: + +```shell +sh tools/dist_test.sh \ +configs/mae/upernet_mae-base_fp16_512x512_160k_ade20k_ms.py \ +upernet_mae-base_fp16_8x2_512x512_160k_ade20k_20220426_174752-f92a2975.pth $GPUS --eval mIoU +``` + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | pretrain | pretrain img size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ----------- | ----------------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| UPerNet | ViT-B | 512x512 | ImageNet-1K | 224x224 | 16 | 160000 | 9.96 | 7.14 | V100 | 48.13 | 48.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mae/upernet_mae-base_fp16_8x2_512x512_160k_ade20k/upernet_mae-base_fp16_8x2_512x512_160k_ade20k_20220426_174752-f92a2975.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mae/upernet_mae-base_fp16_8x2_512x512_160k_ade20k/upernet_mae-base_fp16_8x2_512x512_160k_ade20k_20220426_174752.log.json) | + +## Citation + +```bibtex +@article{he2021masked, + title={Masked autoencoders are scalable vision learners}, + author={He, Kaiming and Chen, Xinlei and Xie, Saining and Li, Yanghao and Doll{\'a}r, Piotr and Girshick, Ross}, + journal={arXiv preprint arXiv:2111.06377}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512-ms.py b/mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512-ms.py new file mode 100644 index 0000000..ec32fea --- /dev/null +++ b/mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512-ms.py @@ -0,0 +1,16 @@ +_base_ = './mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py' + +test_pipeline = [ + dict(type='LoadImageFromFile'), + # TODO: Refactor 'MultiScaleFlipAug' which supports + # `min_size` feature in `Resize` class + # img_ratios is [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] + # original image scale is (2048, 512) + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +val_dataloader = dict(batch_size=1, dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py b/mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py new file mode 100644 index 0000000..b8eae17 --- /dev/null +++ b/mmsegmentation/configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py @@ -0,0 +1,54 @@ +_base_ = [ + '../_base_/models/upernet_mae.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='./pretrain/mae_pretrain_vit_base_mmcls.pth', + backbone=dict( + type='MAE', + img_size=(512, 512), + patch_size=16, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + init_values=1.0, + drop_path_rate=0.1, + out_indices=[3, 5, 7, 11]), + neck=dict(embed_dim=768, rescales=[4, 2, 1, 0.5]), + decode_head=dict( + in_channels=[768, 768, 768, 768], num_classes=150, channels=768), + auxiliary_head=dict(in_channels=768, num_classes=150), + test_cfg=dict(mode='slide', crop_size=(512, 512), stride=(341, 341))) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=1e-4, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg=dict(num_layers=12, layer_decay_rate=0.65), + constructor='LayerDecayOptimizerConstructor') + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +# mixed precision +fp16 = dict(loss_scale='dynamic') + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/mae/metafile.yaml b/mmsegmentation/configs/mae/metafile.yaml new file mode 100644 index 0000000..567eafe --- /dev/null +++ b/mmsegmentation/configs/mae/metafile.yaml @@ -0,0 +1,25 @@ +Models: +- Name: mae-base_upernet_8xb2-amp-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.13 + mIoU(ms+flip): 48.7 + Config: configs/mae/mae-base_upernet_8xb2-amp-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.96 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mae/upernet_mae-base_fp16_8x2_512x512_160k_ade20k/upernet_mae-base_fp16_8x2_512x512_160k_ade20k_20220426_174752-f92a2975.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mae/upernet_mae-base_fp16_8x2_512x512_160k_ade20k/upernet_mae-base_fp16_8x2_512x512_160k_ade20k_20220426_174752.log.json + Paper: + Title: Masked Autoencoders Are Scalable Vision Learners + URL: https://arxiv.org/abs/2111.06377 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.24.0/mmseg/models/backbones/mae.py#L46 + Framework: PyTorch diff --git a/mmsegmentation/configs/mask2former/README.md b/mmsegmentation/configs/mask2former/README.md new file mode 100644 index 0000000..c21ab0d --- /dev/null +++ b/mmsegmentation/configs/mask2former/README.md @@ -0,0 +1,74 @@ +# Mask2Former + +> [Masked-attention Mask Transformer for Universal Image Segmentation](https://arxiv.org/abs/2112.01527) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Image segmentation is about grouping pixels with different semantics, e.g., category or instance membership, where each choice of semantics defines a task. While only the semantics of each task differ, current research focuses on designing specialized architectures for each task. We present Masked-attention Mask Transformer (Mask2Former), a new architecture capable of addressing any image segmentation task (panoptic, instance or semantic). Its key components include masked attention, which extracts localized features by constraining cross-attention within predicted mask regions. In addition to reducing the research effort by at least three times, it outperforms the best specialized architectures by a significant margin on four popular datasets. Most notably, Mask2Former sets a new state-of-the-art for panoptic segmentation (57.8 PQ on COCO), instance segmentation (50.1 AP on COCO) and semantic segmentation (57.7 mIoU on ADE20K). + +### Usage + +- Mask2Former model needs to install [MMDetection](https://github.com/open-mmlab/mmdetection) first. + +```shell +pip install "mmdet>=3.0.0rc4" +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ----------- | -------------- | --------- | ------- | -------: | -------------- | ------ | ----- | ------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Mask2Former | R-50-D32 | 512x1024 | 90000 | 5.67 | 9.17 | A100 | 80.44 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024/mask2former_r50_8xb2-90k_cityscapes-512x1024_20221202_140802-ffd9d750.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024/mask2former_r50_8xb2-90k_cityscapes-512x1024_20221202_140802.json) | +| Mask2Former | R-101-D32 | 512x1024 | 90000 | 6.81 | 7.11 | A100 | 80.80 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024/mask2former_r101_8xb2-90k_cityscapes-512x1024_20221130_031628-43e68666.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024/mask2former_r101_8xb2-90k_cityscapes-512x1024_20221130_031628.json)) | +| Mask2Former | Swin-T | 512x1024 | 90000 | 6.36 | 7.18 | A100 | 81.71 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024/mask2former_swin-t_8xb2-90k_cityscapes-512x1024_20221127_144501-36c59341.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024/mask2former_swin-t_8xb2-90k_cityscapes-512x1024_20221127_144501.json)) | +| Mask2Former | Swin-S | 512x1024 | 90000 | 8.09 | 5.57 | A100 | 82.57 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024/mask2former_swin-s_8xb2-90k_cityscapes-512x1024_20221127_143802-9ab177f6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024/mask2former_swin-s_8xb2-90k_cityscapes-512x1024_20221127_143802.json)) | +| Mask2Former | Swin-B (in22k) | 512x1024 | 90000 | 10.89 | 4.32 | A100 | 83.52 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221203_045030-9a86a225.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221203_045030.json)) | +| Mask2Former | Swin-L (in22k) | 512x1024 | 90000 | 15.83 | 2.86 | A100 | 83.65 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901-28ad20f1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901.json)) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ----------- | -------------- | --------- | ------- | -------: | -------------- | ------ | ----- | ------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Mask2Former | R-50-D32 | 512x512 | 160000 | 3.31 | 26.59 | A100 | 47.87 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512/mask2former_r50_8xb2-160k_ade20k-512x512_20221204_000055-2d1f55f1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512/mask2former_r50_8xb2-160k_ade20k-512x512_20221204_000055.json)) | +| Mask2Former | R-101-D32 | 512x512 | 160000 | 4.09 | 22.97 | A100 | 48.60 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512/mask2former_r101_8xb2-160k_ade20k-512x512_20221203_233905-b7135890.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512/mask2former_r101_8xb2-160k_ade20k-512x512_20221203_233905.json)) | +| Mask2Former | Swin-T | 512x512 | 160000 | 3826 | 23.82 | A100 | 48.66 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512/mask2former_swin-t_8xb2-160k_ade20k-512x512_20221203_234230-7d64e5dd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512/mask2former_swin-t_8xb2-160k_ade20k-512x512_20221203_234230.json)) | +| Mask2Former | Swin-S | 512x512 | 160000 | 3.74 | 19.69 | A100 | 51.24 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512/mask2former_swin-s_8xb2-160k_ade20k-512x512_20221204_143905-e715144e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512/mask2former_swin-s_8xb2-160k_ade20k-512x512_20221204_143905.json)) | +| Mask2Former | Swin-B | 640x640 | 160000 | 5.66 | 12.48 | A100 | 52.44 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640_20221129_125118-a4a086d2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640_20221129_125118.json)) | +| Mask2Former | Swin-B (in22k) | 640x640 | 160000 | 5.66 | 12.43 | A100 | 53.90 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235230-7ec0f569.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235230.json)) | +| Mask2Former | Swin-L (in22k) | 640x640 | 160000 | 8.86 | 8.81 | A100 | 56.01 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235933-7120c214.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235933.json)) | + +Note: + +- All experiments of Mask2Former are implemented with 8 A100 GPUs with 2 samplers per GPU. +- As mentioned at [the official repo](https://github.com/facebookresearch/Mask2Former/issues/5), the results of Mask2Former are relatively not stable, the result of Mask2Former(swin-s) on ADE20K dataset in the table is the medium result obtained by training 5 times following the suggestion of the author. +- The ResNet backbones utilized in MaskFormer models are standard `ResNet` rather than `ResNetV1c`. +- Test time augmentation is not supported in MMSegmentation 1.x version yet, we would add "ms+flip" results as soon as possible. + +## Citation + +```bibtex +@inproceedings{cheng2021mask2former, + title={Masked-attention Mask Transformer for Universal Image Segmentation}, + author={Bowen Cheng and Ishan Misra and Alexander G. Schwing and Alexander Kirillov and Rohit Girdhar}, + journal={CVPR}, + year={2022} +} +@inproceedings{cheng2021maskformer, + title={Per-Pixel Classification is Not All You Need for Semantic Segmentation}, + author={Bowen Cheng and Alexander G. Schwing and Alexander Kirillov}, + journal={NeurIPS}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..48f6c12 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,7 @@ +_base_ = ['./mask2former_r50_8xb2-160k_ade20k-512x512.py'] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/mmsegmentation/configs/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024.py b/mmsegmentation/configs/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024.py new file mode 100644 index 0000000..275a7da --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = ['./mask2former_r50_8xb2-90k_cityscapes-512x1024.py'] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/mmsegmentation/configs/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..78cf605 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,200 @@ +_base_ = ['../_base_/default_runtime.py', '../_base_/datasets/ade20k.py'] + +custom_imports = dict(imports='mmdet.models', allow_failed_imports=False) + +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=crop_size, + test_cfg=dict(size_divisor=32)) +num_classes = 150 +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='ResNet', + depth=50, + deep_stem=False, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='SyncBN', requires_grad=False), + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + decode_head=dict( + type='Mask2FormerHead', + in_channels=[256, 512, 1024, 2048], + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_classes=num_classes, + num_queries=100, + num_transformer_feat_level=3, + align_corners=False, + pixel_decoder=dict( + type='mmdet.MSDeformAttnPixelDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( # DeformableDetrTransformerEncoder + num_layers=6, + layer_cfg=dict( # DeformableDetrTransformerEncoderLayer + self_attn_cfg=dict( # MultiScaleDeformableAttention + embed_dims=256, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=True, + norm_cfg=None, + init_cfg=None), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True))), + init_cfg=None), + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + init_cfg=None), + enforce_decoder_input_project=False, + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + transformer_decoder=dict( # Mask2FormerTransformerDecoder + return_intermediate=True, + num_layers=9, + layer_cfg=dict( # Mask2FormerTransformerDecoderLayer + self_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=True), + cross_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=True), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True)), + init_cfg=None), + loss_cls=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='mmdet.DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='mmdet.HungarianAssigner', + match_costs=[ + dict(type='mmdet.ClassificationCost', weight=2.0), + dict( + type='mmdet.CrossEntropyLossCost', + weight=5.0, + use_sigmoid=True), + dict( + type='mmdet.DiceCost', + weight=5.0, + pred_act=True, + eps=1.0) + ]), + sampler=dict(type='mmdet.MaskPseudoSampler'))), + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +# dataset config +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomChoiceResize', + scales=[int(512 * x * 0.1) for x in range(5, 21)], + resize_type='ResizeShortestEdge', + max_size=2048), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +train_dataloader = dict(batch_size=2, dataset=dict(pipeline=train_pipeline)) + +# optimizer +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +optimizer = dict( + type='AdamW', lr=0.0001, weight_decay=0.05, eps=1e-8, betas=(0.9, 0.999)) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi, + }, + norm_decay_mult=0.0)) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=160000, + by_epoch=False) +] + +# training schedule for 160k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=160000, val_interval=5000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=5000, + save_best='mIoU'), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/mmsegmentation/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py b/mmsegmentation/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py new file mode 100644 index 0000000..d2211b6 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py @@ -0,0 +1,197 @@ +_base_ = ['../_base_/default_runtime.py', '../_base_/datasets/cityscapes.py'] + +crop_size = (512, 1024) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=crop_size, + test_cfg=dict(size_divisor=32)) +num_classes = 19 +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='ResNet', + depth=50, + deep_stem=False, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='SyncBN', requires_grad=False), + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + decode_head=dict( + type='Mask2FormerHead', + in_channels=[256, 512, 1024, 2048], + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_classes=num_classes, + num_queries=100, + num_transformer_feat_level=3, + align_corners=False, + pixel_decoder=dict( + type='mmdet.MSDeformAttnPixelDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( # DeformableDetrTransformerEncoder + num_layers=6, + layer_cfg=dict( # DeformableDetrTransformerEncoderLayer + self_attn_cfg=dict( # MultiScaleDeformableAttention + embed_dims=256, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=True, + norm_cfg=None, + init_cfg=None), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True))), + init_cfg=None), + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + init_cfg=None), + enforce_decoder_input_project=False, + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + transformer_decoder=dict( # Mask2FormerTransformerDecoder + return_intermediate=True, + num_layers=9, + layer_cfg=dict( # Mask2FormerTransformerDecoderLayer + self_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=True), + cross_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=True), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True)), + init_cfg=None), + loss_cls=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='mmdet.DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='mmdet.HungarianAssigner', + match_costs=[ + dict(type='mmdet.ClassificationCost', weight=2.0), + dict( + type='mmdet.CrossEntropyLossCost', + weight=5.0, + use_sigmoid=True), + dict( + type='mmdet.DiceCost', + weight=5.0, + pred_act=True, + eps=1.0) + ]), + sampler=dict(type='mmdet.MaskPseudoSampler'))), + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +# dataset config +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomChoiceResize', + scales=[int(1024 * x * 0.1) for x in range(5, 21)], + resize_type='ResizeShortestEdge', + max_size=4096), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) + +# optimizer +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +optimizer = dict( + type='AdamW', lr=0.0001, weight_decay=0.05, eps=1e-8, betas=(0.9, 0.999)) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi, + }, + norm_decay_mult=0.0)) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=90000, + by_epoch=False) +] + +# training schedule for 90k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=90000, val_interval=5000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=5000, + save_best='mIoU'), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py b/mmsegmentation/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py new file mode 100644 index 0000000..b8b1d6c --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py @@ -0,0 +1,229 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/ade20k_640x640.py' +] + +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_20220317-55b0104a.pth' # noqa + +crop_size = (640, 640) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=crop_size) +num_classes = 150 + +depths = [2, 2, 18, 2] +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='SwinTransformer', + pretrain_img_size=384, + embed_dims=128, + depths=depths, + num_heads=[4, 8, 16, 32], + window_size=12, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + decode_head=dict( + type='Mask2FormerHead', + in_channels=[128, 256, 512, 1024], + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_classes=num_classes, + num_queries=100, + num_transformer_feat_level=3, + align_corners=False, + pixel_decoder=dict( + type='mmdet.MSDeformAttnPixelDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( # DeformableDetrTransformerEncoder + num_layers=6, + layer_cfg=dict( # DeformableDetrTransformerEncoderLayer + self_attn_cfg=dict( # MultiScaleDeformableAttention + embed_dims=256, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=True, + norm_cfg=None, + init_cfg=None), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True))), + init_cfg=None), + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + init_cfg=None), + enforce_decoder_input_project=False, + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + transformer_decoder=dict( # Mask2FormerTransformerDecoder + return_intermediate=True, + num_layers=9, + layer_cfg=dict( # Mask2FormerTransformerDecoderLayer + self_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=True), + cross_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=True), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True)), + init_cfg=None), + loss_cls=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='mmdet.DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='mmdet.HungarianAssigner', + match_costs=[ + dict(type='mmdet.ClassificationCost', weight=2.0), + dict( + type='mmdet.CrossEntropyLossCost', + weight=5.0, + use_sigmoid=True), + dict( + type='mmdet.DiceCost', + weight=5.0, + pred_act=True, + eps=1.0) + ]), + sampler=dict(type='mmdet.MaskPseudoSampler'))), + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +# dataset config +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomChoiceResize', + scales=[int(x * 0.1 * 640) for x in range(5, 21)], + resize_type='ResizeShortestEdge', + max_size=2560), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +train_dataloader = dict(batch_size=2, dataset=dict(pipeline=train_pipeline)) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + type='AdamW', lr=0.0001, weight_decay=0.05, eps=1e-8, betas=(0.9, 0.999)) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) + +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=160000, + by_epoch=False) +] + +# training schedule for 160k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=160000, val_interval=5000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=5000, + save_best='mIoU'), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py b/mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py new file mode 100644 index 0000000..f39a3c5 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py @@ -0,0 +1,5 @@ +_base_ = ['./mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py'] + +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_22k_20220317-e5c09f74.pth' # noqa +model = dict( + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=pretrained))) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py b/mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py new file mode 100644 index 0000000..0c229c1 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py @@ -0,0 +1,42 @@ +_base_ = ['./mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_22k_20220317-e5c09f74.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + pretrain_img_size=384, + embed_dims=128, + depths=depths, + num_heads=[4, 8, 16, 32], + window_size=12, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + decode_head=dict(in_channels=[128, 256, 512, 1024])) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py b/mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py new file mode 100644 index 0000000..f2657e8 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py @@ -0,0 +1,9 @@ +_base_ = ['./mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth' # noqa + +model = dict( + backbone=dict( + embed_dims=192, + num_heads=[6, 12, 24, 48], + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + decode_head=dict(num_queries=100, in_channels=[192, 384, 768, 1536])) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py b/mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py new file mode 100644 index 0000000..01a7b99 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py @@ -0,0 +1,42 @@ +_base_ = ['./mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + pretrain_img_size=384, + embed_dims=192, + depths=depths, + num_heads=[6, 12, 24, 48], + window_size=12, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + decode_head=dict(in_channels=[192, 384, 768, 1536])) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..a7796d5 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,37 @@ +_base_ = ['./mask2former_swin-t_8xb2-160k_ade20k-512x512.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_small_patch4_window7_224_20220317-7ba6d6dd.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + depths=depths, init_cfg=dict(type='Pretrained', + checkpoint=pretrained))) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024.py b/mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024.py new file mode 100644 index 0000000..5f75544 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024.py @@ -0,0 +1,37 @@ +_base_ = ['./mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_small_patch4_window7_224_20220317-7ba6d6dd.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + depths=depths, init_cfg=dict(type='Pretrained', + checkpoint=pretrained))) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..9de3d24 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,52 @@ +_base_ = ['./mask2former_r50_8xb2-160k_ade20k-512x512.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_tiny_patch4_window7_224_20220317-1cdeb081.pth' # noqa +depths = [2, 2, 6, 2] +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=depths, + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + decode_head=dict(in_channels=[96, 192, 384, 768])) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py b/mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py new file mode 100644 index 0000000..0abda64 --- /dev/null +++ b/mmsegmentation/configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py @@ -0,0 +1,52 @@ +_base_ = ['./mask2former_r50_8xb2-90k_cityscapes-512x1024.py'] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_tiny_patch4_window7_224_20220317-1cdeb081.pth' # noqa +depths = [2, 2, 6, 2] +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=depths, + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + decode_head=dict(in_channels=[96, 192, 384, 768])) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/mmsegmentation/configs/mask2former/metafile.yaml b/mmsegmentation/configs/mask2former/metafile.yaml new file mode 100644 index 0000000..090c95e --- /dev/null +++ b/mmsegmentation/configs/mask2former/metafile.yaml @@ -0,0 +1,314 @@ +Collections: +- Name: Mask2Former + License: Apache License 2.0 + Metadata: + Training Data: + - Usage + - Cityscapes + - ADE20K + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + README: configs/mask2former/README.md + Frameworks: + - PyTorch +Models: +- Name: mask2former_r50_8xb2-90k_cityscapes-512x1024 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.44 + Config: configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - R-50-D32 + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 5.67 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024/mask2former_r50_8xb2-90k_cityscapes-512x1024_20221202_140802-ffd9d750.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024/mask2former_r50_8xb2-90k_cityscapes-512x1024_20221202_140802.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_r101_8xb2-90k_cityscapes-512x1024 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.8 + Config: configs/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - R-101-D32 + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 6.81 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024/mask2former_r101_8xb2-90k_cityscapes-512x1024_20221130_031628-43e68666.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-90k_cityscapes-512x1024/mask2former_r101_8xb2-90k_cityscapes-512x1024_20221130_031628.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-t_8xb2-90k_cityscapes-512x1024 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 81.71 + Config: configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - Swin-T + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 6.36 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024/mask2former_swin-t_8xb2-90k_cityscapes-512x1024_20221127_144501-36c59341.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024/mask2former_swin-t_8xb2-90k_cityscapes-512x1024_20221127_144501.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-s_8xb2-90k_cityscapes-512x1024 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 82.57 + Config: configs/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - Swin-S + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 8.09 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024/mask2former_swin-s_8xb2-90k_cityscapes-512x1024_20221127_143802-9ab177f6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-90k_cityscapes-512x1024/mask2former_swin-s_8xb2-90k_cityscapes-512x1024_20221127_143802.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 83.52 + Config: configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - Swin-B + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 10.89 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221203_045030-9a86a225.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221203_045030.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 83.65 + Config: configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - Swin-L + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 15.83 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901-28ad20f1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_r50_8xb2-160k_ade20k-512x512 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.87 + Config: configs/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 3.31 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512/mask2former_r50_8xb2-160k_ade20k-512x512_20221204_000055-2d1f55f1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r50_8xb2-160k_ade20k-512x512/mask2former_r50_8xb2-160k_ade20k-512x512_20221204_000055.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_r101_8xb2-160k_ade20k-512x512 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.6 + Config: configs/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D32 + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 4.09 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512/mask2former_r101_8xb2-160k_ade20k-512x512_20221203_233905-b7135890.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_r101_8xb2-160k_ade20k-512x512/mask2former_r101_8xb2-160k_ade20k-512x512_20221203_233905.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-t_8xb2-160k_ade20k-512x512 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.66 + Config: configs/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-T + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 3826.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512/mask2former_swin-t_8xb2-160k_ade20k-512x512_20221203_234230-7d64e5dd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-t_8xb2-160k_ade20k-512x512/mask2former_swin-t_8xb2-160k_ade20k-512x512_20221203_234230.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-s_8xb2-160k_ade20k-512x512 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 51.24 + Config: configs/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-S + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 3.74 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512/mask2former_swin-s_8xb2-160k_ade20k-512x512_20221204_143905-e715144e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-s_8xb2-160k_ade20k-512x512/mask2former_swin-s_8xb2-160k_ade20k-512x512_20221204_143905.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 52.44 + Config: configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-B + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 5.66 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640_20221129_125118-a4a086d2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640_20221129_125118.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 53.9 + Config: configs/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-B + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 5.66 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235230-7ec0f569.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235230.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch +- Name: mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640 + In Collection: Mask2Former + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 56.01 + Config: configs/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-L + - Mask2Former + Training Resources: 8x A100 GPUS + Memory (GB): 8.86 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235933-7120c214.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640/mask2former_swin-l-in22k-384x384-pre_8xb2-160k_ade20k-640x640_20221203_235933.json + Paper: + Title: Masked-attention Mask Transformer for Universal Image Segmentation + URL: https://arxiv.org/abs/2112.01527 + Code: https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/mask2former_head.py + Framework: PyTorch diff --git a/mmsegmentation/configs/maskformer/README.md b/mmsegmentation/configs/maskformer/README.md new file mode 100644 index 0000000..a899bac --- /dev/null +++ b/mmsegmentation/configs/maskformer/README.md @@ -0,0 +1,62 @@ +# MaskFormer + +> [MaskFormer: Per-Pixel Classification is Not All You Need for Semantic Segmentation](https://arxiv.org/abs/2107.06278) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Modern approaches typically formulate semantic segmentation as a per-pixel classification task, while instance-level segmentation is handled with an alternative mask classification. Our key insight: mask classification is sufficiently general to solve both semantic- and instance-level segmentation tasks in a unified manner using the exact same model, loss, and training procedure. Following this observation, we propose MaskFormer, a simple mask classification model which predicts a set of binary masks, each associated with a single global class label prediction. Overall, the proposed mask classification-based method simplifies the landscape of effective approaches to semantic and panoptic segmentation tasks and shows excellent empirical results. In particular, we observe that MaskFormer outperforms per-pixel classification baselines when the number of classes is large. Our mask classification-based method outperforms both current state-of-the-art semantic (55.6 mIoU on ADE20K) and panoptic segmentation (52.7 PQ on COCO) models. + + + +
+ +
+ +### Usage + +- MaskFormer model needs to install [MMDetection](https://github.com/open-mmlab/mmdetection) first. + +```shell +pip install "mmdet>=3.0.0rc4" +``` + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | --------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| MaskFormer | R-50-D32 | 512x512 | 160000 | 3.29 | A100 | 42.20 | 44.29 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512/maskformer_r50-d32_8xb2-160k_ade20k-512x512_20221030_182724-3a9cfe45.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512/maskformer_r50-d32_8xb2-160k_ade20k-512x512_20221030_182724.json) | +| MaskFormer | R-101-D32 | 512x512 | 160000 | 4.12 | A100 | 34.90 | 45.11 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512/maskformer_r101-d32_8xb2-160k_ade20k-512x512_20221031_223053-84adbfcb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512/maskformer_r101-d32_8xb2-160k_ade20k-512x512_20221031_223053.json) | +| MaskFormer | Swin-T | 512x512 | 160000 | 3.73 | A100 | 40.53 | 46.69 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512_20221114_232813-f14e7ce0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512_20221114_232813.json) | +| MaskFormer | Swin-S | 512x512 | 160000 | 5.33 | A100 | 26.98 | 49.36 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512_20221115_114710-723512c7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512_20221115_114710.json) | + +Note: + +- All experiments of MaskFormer are implemented with 8 V100 (32G) GPUs with 2 samplers per GPU. +- The results of MaskFormer are relatively not stable. The accuracy (mIoU) of model with `R-101-D32` is from 44.7 to 46.0, and with `Swin-S` is from 49.0 to 49.8. +- The ResNet backbones utilized in MaskFormer models are standard `ResNet` rather than `ResNetV1c`. +- Test time augmentation is not supported in MMSegmentation 1.x version yet, we would add "ms+flip" results as soon as possible. + +## Citation + +```bibtex +@article{cheng2021per, + title={Per-pixel classification is not all you need for semantic segmentation}, + author={Cheng, Bowen and Schwing, Alex and Kirillov, Alexander}, + journal={Advances in Neural Information Processing Systems}, + volume={34}, + pages={17864--17875}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..04bd375 --- /dev/null +++ b/mmsegmentation/configs/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,7 @@ +_base_ = './maskformer_r50-d32_8xb2-160k_ade20k-512x512.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/mmsegmentation/configs/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..2a83746 --- /dev/null +++ b/mmsegmentation/configs/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,141 @@ +_base_ = [ + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +# model_cfg +num_classes = 150 +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=True, + style='pytorch', + contract_dilation=True, + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + decode_head=dict( + type='MaskFormerHead', + in_channels=[256, 512, 1024, + 2048], # input channels of pixel_decoder modules + feat_channels=256, + in_index=[0, 1, 2, 3], + num_classes=150, + out_channels=256, + num_queries=100, + pixel_decoder=dict( + type='mmdet.PixelDecoder', + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU')), + enforce_decoder_input_project=False, + positional_encoding=dict( # SinePositionalEncoding + num_feats=128, normalize=True), + transformer_decoder=dict( # DetrTransformerDecoder + return_intermediate=True, + num_layers=6, + layer_cfg=dict( # DetrTransformerDecoderLayer + self_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=True), + cross_attn_cfg=dict( # MultiheadAttention + embed_dims=256, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=True), + ffn_cfg=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True)), + init_cfg=None), + loss_cls=dict( + type='mmdet.CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='mmdet.FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=20.0), + loss_dice=dict( + type='mmdet.DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=1.0), + train_cfg=dict( + assigner=dict( + type='mmdet.HungarianAssigner', + match_costs=[ + dict(type='mmdet.ClassificationCost', weight=1.0), + dict( + type='mmdet.FocalLossCost', + weight=20.0, + binary_input=True), + dict( + type='mmdet.DiceCost', + weight=1.0, + pred_act=True, + eps=1.0) + ]), + sampler=dict(type='mmdet.MaskPseudoSampler'))), + # training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole'), +) +# optimizer +optimizer = dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.0001) +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict(custom_keys={ + 'backbone': dict(lr_mult=0.1), + })) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=160000, + by_epoch=False) +] + +# In MaskFormer implementation we use batch size 2 per GPU as default +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..2cbc038 --- /dev/null +++ b/mmsegmentation/configs/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,79 @@ +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_small_patch4_window7_224_20220317-7ba6d6dd.pth' # noqa +_base_ = './maskformer_r50-d32_8xb2-160k_ade20k-512x512.py' +backbone_norm_cfg = dict(type='LN', requires_grad=True) +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + pretrain_img_size=224, + embed_dims=96, + patch_size=4, + window_size=7, + mlp_ratio=4, + depths=depths, + num_heads=[3, 6, 12, 24], + strides=(4, 2, 2, 2), + out_indices=(0, 1, 2, 3), + qkv_bias=True, + qk_scale=None, + patch_norm=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + use_abs_pos_embed=False, + act_cfg=dict(type='GELU'), + norm_cfg=backbone_norm_cfg, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)), + decode_head=dict( + type='MaskFormerHead', + in_channels=[96, 192, 384, + 768], # input channels of pixel_decoder modules + )) + +# optimizer +optimizer = dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01) +# set all layers in backbone to lr_mult=1.0 +# set all norm layers, position_embeding, +# query_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=1.0, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +embed_multi = dict(decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict(custom_keys=custom_keys)) + +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..aa242db --- /dev/null +++ b/mmsegmentation/configs/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,81 @@ +_base_ = './maskformer_r50-d32_8xb2-160k_ade20k-512x512.py' + +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_tiny_patch4_window7_224_20220317-1cdeb081.pth' # noqa +backbone_norm_cfg = dict(type='LN', requires_grad=True) +depths = [2, 2, 6, 2] +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + pretrain_img_size=224, + embed_dims=96, + patch_size=4, + window_size=7, + mlp_ratio=4, + depths=depths, + num_heads=[3, 6, 12, 24], + strides=(4, 2, 2, 2), + out_indices=(0, 1, 2, 3), + qkv_bias=True, + qk_scale=None, + patch_norm=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + use_abs_pos_embed=False, + act_cfg=dict(type='GELU'), + norm_cfg=backbone_norm_cfg, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)), + decode_head=dict( + type='MaskFormerHead', + in_channels=[96, 192, 384, + 768], # input channels of pixel_decoder modules + )) + +# optimizer +optimizer = dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01) + +# set all layers in backbone to lr_mult=1.0 +# set all norm layers, position_embeding, +# query_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=1.0, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +embed_multi = dict(decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2), + paramwise_cfg=dict(custom_keys=custom_keys)) + +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/maskformer/metafile.yaml b/mmsegmentation/configs/maskformer/metafile.yaml new file mode 100644 index 0000000..c9853e1 --- /dev/null +++ b/mmsegmentation/configs/maskformer/metafile.yaml @@ -0,0 +1,111 @@ +Collections: +- Name: MaskFormer + License: Apache License 2.0 + Metadata: + Training Data: + - Usage + - ADE20K + Paper: + Title: 'MaskFormer: Per-Pixel Classification is Not All You Need for Semantic + Segmentation' + URL: https://arxiv.org/abs/2107.06278 + README: configs/maskformer/README.md + Frameworks: + - PyTorch +Models: +- Name: maskformer_r50-d32_8xb2-160k_ade20k-512x512 + In Collection: MaskFormer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.29 + Config: configs/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D32 + - MaskFormer + Training Resources: 8x 42.20 GPUS + Memory (GB): 3.29 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512/maskformer_r50-d32_8xb2-160k_ade20k-512x512_20221030_182724-3a9cfe45.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r50-d32_8xb2-160k_ade20k-512x512/maskformer_r50-d32_8xb2-160k_ade20k-512x512_20221030_182724.json + Paper: + Title: 'MaskFormer: Per-Pixel Classification is Not All You Need for Semantic + Segmentation' + URL: https://arxiv.org/abs/2107.06278 + Code: https://github.com/open-mmlab/mmdetection/blob/dev-3.x/mmdet/models/dense_heads/maskformer_head.py#L21 + Framework: PyTorch +- Name: maskformer_r101-d32_8xb2-160k_ade20k-512x512 + In Collection: MaskFormer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.11 + Config: configs/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D32 + - MaskFormer + Training Resources: 8x 34.90 GPUS + Memory (GB): 4.12 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512/maskformer_r101-d32_8xb2-160k_ade20k-512x512_20221031_223053-84adbfcb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_r101-d32_8xb2-160k_ade20k-512x512/maskformer_r101-d32_8xb2-160k_ade20k-512x512_20221031_223053.json + Paper: + Title: 'MaskFormer: Per-Pixel Classification is Not All You Need for Semantic + Segmentation' + URL: https://arxiv.org/abs/2107.06278 + Code: https://github.com/open-mmlab/mmdetection/blob/dev-3.x/mmdet/models/dense_heads/maskformer_head.py#L21 + Framework: PyTorch +- Name: maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512 + In Collection: MaskFormer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.69 + Config: configs/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-T + - MaskFormer + Training Resources: 8x 40.53 GPUS + Memory (GB): 3.73 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512_20221114_232813-f14e7ce0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-t_upernet_8xb2-160k_ade20k-512x512_20221114_232813.json + Paper: + Title: 'MaskFormer: Per-Pixel Classification is Not All You Need for Semantic + Segmentation' + URL: https://arxiv.org/abs/2107.06278 + Code: https://github.com/open-mmlab/mmdetection/blob/dev-3.x/mmdet/models/dense_heads/maskformer_head.py#L21 + Framework: PyTorch +- Name: maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512 + In Collection: MaskFormer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 49.36 + Config: configs/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-S + - MaskFormer + Training Resources: 8x 26.98 GPUS + Memory (GB): 5.33 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512_20221115_114710-723512c7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/maskformer/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512/maskformer_swin-s_upernet_8xb2-160k_ade20k-512x512_20221115_114710.json + Paper: + Title: 'MaskFormer: Per-Pixel Classification is Not All You Need for Semantic + Segmentation' + URL: https://arxiv.org/abs/2107.06278 + Code: https://github.com/open-mmlab/mmdetection/blob/dev-3.x/mmdet/models/dense_heads/maskformer_head.py#L21 + Framework: PyTorch diff --git a/mmsegmentation/configs/mobilenet_v2/README.md b/mmsegmentation/configs/mobilenet_v2/README.md new file mode 100644 index 0000000..bff5259 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/README.md @@ -0,0 +1,56 @@ +# MobileNetV2 + +> [MobileNetV2: Inverted Residuals and Linear Bottlenecks](https://arxiv.org/abs/1801.04381) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +In this paper we describe a new mobile architecture, MobileNetV2, that improves the state of the art performance of mobile models on multiple tasks and benchmarks as well as across a spectrum of different model sizes. We also describe efficient ways of applying these mobile models to object detection in a novel framework we call SSDLite. Additionally, we demonstrate how to build mobile semantic segmentation models through a reduced form of DeepLabv3 which we call Mobile DeepLabv3. +The MobileNetV2 architecture is based on an inverted residual structure where the input and output of the residual block are thin bottleneck layers opposite to traditional residual models which use expanded representations in the input an MobileNetV2 uses lightweight depthwise convolutions to filter features in the intermediate expansion layer. Additionally, we find that it is important to remove non-linearities in the narrow layers in order to maintain representational power. We demonstrate that this improves performance and provide an intuition that led to this design. Finally, our approach allows decoupling of the input/output domains from the expressiveness of the transformation, which provides a convenient framework for further analysis. We measure our performance on Imagenet classification, COCO object detection, VOC image segmentation. We evaluate the trade-offs between accuracy, and number of operations measured by multiply-adds (MAdd), as well as the number of parameters. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | M-V2-D8 | 512x1024 | 80000 | 3.4 | 14.2 | A100 | 71.19 | 73.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024-20230224_185436-13fef4ea.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024_20230224_185436.json) | +| PSPNet | M-V2-D8 | 512x1024 | 80000 | 3.6 | 11.2 | V100 | 70.23 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes_20200825_124817-19e81d51.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes-20200825_124817.log.json) | +| DeepLabV3 | M-V2-D8 | 512x1024 | 80000 | 3.9 | 8.4 | V100 | 73.84 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-bef03590.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json) | +| DeepLabV3+ | M-V2-D8 | 512x1024 | 80000 | 5.1 | 8.4 | V100 | 75.20 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-d256dd4b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | M-V2-D8 | 512x512 | 160000 | 6.5 | 64.4 | V100 | 19.71 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k_20200825_214953-c40e1095.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json) | +| PSPNet | M-V2-D8 | 512x512 | 160000 | 6.5 | 57.7 | V100 | 29.68 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k_20200825_214953-f5942f7a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json) | +| DeepLabV3 | M-V2-D8 | 512x512 | 160000 | 6.8 | 39.9 | V100 | 34.08 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k_20200825_223255-63986343.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json) | +| DeepLabV3+ | M-V2-D8 | 512x512 | 160000 | 8.2 | 43.1 | V100 | 34.02 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k_20200825_223255-465a01d4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json) | + +## Citation + +```bibtex +@inproceedings{sandler2018mobilenetv2, + title={Mobilenetv2: Inverted residuals and linear bottlenecks}, + author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={4510--4520}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/mobilenet_v2/metafile.yaml b/mmsegmentation/configs/mobilenet_v2/metafile.yaml new file mode 100644 index 0000000..119c9ae --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/metafile.yaml @@ -0,0 +1,186 @@ +Models: +- Name: mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 71.19 + mIoU(ms+flip): 73.34 + Config: configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - M-V2-D8 + - FCN + Training Resources: 4x A100 GPUS + Memory (GB): 3.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024-20230224_185436-13fef4ea.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024_20230224_185436.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 70.23 + Config: configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - M-V2-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 3.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes_20200825_124817-19e81d51.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes-20200825_124817.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.84 + Config: configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - M-V2-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 3.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-bef03590.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.2 + Config: configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - M-V2-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 5.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-d256dd4b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 19.71 + Config: configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - M-V2-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 6.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k_20200825_214953-c40e1095.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 29.68 + Config: configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - M-V2-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k_20200825_214953-f5942f7a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 34.08 + Config: configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - M-V2-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 6.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k_20200825_223255-63986343.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch +- Name: mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 34.02 + Config: configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - M-V2-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 8.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k_20200825_223255-465a01d4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json + Paper: + Title: 'MobileNetV2: Inverted Residuals and Linear Bottlenecks' + URL: https://arxiv.org/abs/1801.04381 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v2.py#L14 + Framework: PyTorch diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..ece9b0b --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,13 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..86eec0d --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..195046e --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,15 @@ +_base_ = [ + '../deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py' +] +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320, c1_in_channels=24), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..d4f669f --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320, c1_in_channels=24), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..0829f43 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,13 @@ +_base_ = '../fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..015fa6f --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = '../fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..8542e02 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,13 @@ +_base_ = '../pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..73db59b --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = '../pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6), + norm_cfg=dict(type='SyncBN', requires_grad=True)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/mmsegmentation/configs/mobilenet_v3/README.md b/mmsegmentation/configs/mobilenet_v3/README.md new file mode 100644 index 0000000..8ed0a56 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v3/README.md @@ -0,0 +1,50 @@ +# MobileNetV3 + +> [Searching for MobileNetV3](https://arxiv.org/abs/1905.02244) + +## Introduction + + + + + +Official Repo + +Code Snippet + +## Abstract + + + +We present the next generation of MobileNets based on a combination of complementary search techniques as well as a novel architecture design. MobileNetV3 is tuned to mobile phone CPUs through a combination of hardware-aware network architecture search (NAS) complemented by the NetAdapt algorithm and then subsequently improved through novel architecture advances. This paper starts the exploration of how automated search algorithms and network design can work together to harness complementary approaches improving the overall state of the art. Through this process we create two new MobileNet models for release: MobileNetV3-Large and MobileNetV3-Small which are targeted for high and low resource use cases. These models are then adapted and applied to the tasks of object detection and semantic segmentation. For the task of semantic segmentation (or any dense pixel prediction), we propose a new efficient segmentation decoder Lite Reduced Atrous Spatial Pyramid Pooling (LR-ASPP). We achieve new state of the art results for mobile classification, detection and segmentation. MobileNetV3-Large is 3.2% more accurate on ImageNet classification while reducing latency by 15% compared to MobileNetV2. MobileNetV3-Small is 4.6% more accurate while reducing latency by 5% compared to MobileNetV2. MobileNetV3-Large detection is 25% faster at roughly the same accuracy as MobileNetV2 on COCO detection. MobileNetV3-Large LR-ASPP is 30% faster than MobileNetV2 R-ASPP at similar accuracy for Cityscapes segmentation. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| LRASPP | M-V3-D8 | 512x1024 | 320000 | 8.9 | 15.22 | V100 | 69.54 | 70.89 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v3/mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes_20201224_220337-cfe8fb07.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes-20201224_220337.log.json) | +| LRASPP | M-V3-D8 (scratch) | 512x1024 | 320000 | 8.9 | 14.77 | V100 | 67.87 | 69.78 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes_20201224_220337-9f29cd72.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes-20201224_220337.log.json) | +| LRASPP | M-V3s-D8 | 512x1024 | 320000 | 5.3 | 23.64 | V100 | 64.11 | 66.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v3/mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes_20201224_223935-61565b34.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes-20201224_223935.log.json) | +| LRASPP | M-V3s-D8 (scratch) | 512x1024 | 320000 | 5.3 | 24.50 | V100 | 62.74 | 65.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v3/mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes_20201224_223935-03daeabb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes-20201224_223935.log.json) | + +## Citation + +```bibtex +@inproceedings{Howard_2019_ICCV, + title={Searching for MobileNetV3}, + author={Howard, Andrew and Sandler, Mark and Chu, Grace and Chen, Liang-Chieh and Chen, Bo and Tan, Mingxing and Wang, Weijun and Zhu, Yukun and Pang, Ruoming and Vasudevan, Vijay and Le, Quoc V. and Adam, Hartwig}, + booktitle={The IEEE International Conference on Computer Vision (ICCV)}, + pages={1314-1324}, + month={October}, + year={2019}, + doi={10.1109/ICCV.2019.00140}} +} +``` diff --git a/mmsegmentation/configs/mobilenet_v3/metafile.yaml b/mmsegmentation/configs/mobilenet_v3/metafile.yaml new file mode 100644 index 0000000..0351d3b --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v3/metafile.yaml @@ -0,0 +1,109 @@ +Collections: +- Name: LRASPP + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: Searching for MobileNetV3 + URL: https://arxiv.org/abs/1905.02244 + README: configs/mobilenet_v3/README.md + Frameworks: + - PyTorch +Models: +- Name: mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024 + In Collection: LRASPP + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 69.54 + mIoU(ms+flip): 70.89 + Config: configs/mobilenet_v3/mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - M-V3-D8 + - LRASPP + Training Resources: 4x V100 GPUS + Memory (GB): 8.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes_20201224_220337-cfe8fb07.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes-20201224_220337.log.json + Paper: + Title: Searching for MobileNetV3 + URL: https://arxiv.org/abs/1905.02244 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v3.py#L15 + Framework: PyTorch +- Name: mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024 + In Collection: LRASPP + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 67.87 + mIoU(ms+flip): 69.78 + Config: configs/mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - M-V3-D8 + - LRASPP + Training Resources: 4x V100 GPUS + Memory (GB): 8.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes_20201224_220337-9f29cd72.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes-20201224_220337.log.json + Paper: + Title: Searching for MobileNetV3 + URL: https://arxiv.org/abs/1905.02244 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v3.py#L15 + Framework: PyTorch +- Name: mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024 + In Collection: LRASPP + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 64.11 + mIoU(ms+flip): 66.42 + Config: configs/mobilenet_v3/mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - M-V3s-D8 + - LRASPP + Training Resources: 4x V100 GPUS + Memory (GB): 5.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes_20201224_223935-61565b34.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes-20201224_223935.log.json + Paper: + Title: Searching for MobileNetV3 + URL: https://arxiv.org/abs/1905.02244 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v3.py#L15 + Framework: PyTorch +- Name: mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024 + In Collection: LRASPP + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 62.74 + mIoU(ms+flip): 65.01 + Config: configs/mobilenet_v3/mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - M-V3s-D8 + - LRASPP + Training Resources: 4x V100 GPUS + Memory (GB): 5.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes_20201224_223935-03daeabb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes-20201224_223935.log.json + Paper: + Title: Searching for MobileNetV3 + URL: https://arxiv.org/abs/1905.02244 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mobilenet_v3.py#L15 + Framework: PyTorch diff --git a/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024.py new file mode 100644 index 0000000..bc6322f --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-s_lraspp_4xb4-320k_cityscapes-512x1024.py @@ -0,0 +1,23 @@ +_base_ = './mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://contrib/mobilenet_v3_small', + backbone=dict( + type='MobileNetV3', + arch='small', + out_indices=(0, 1, 12), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024.py new file mode 100644 index 0000000..7260936 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch-s_lraspp_4xb4-320k_cityscapes-512x1024.py @@ -0,0 +1,22 @@ +_base_ = './mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='MobileNetV3', + arch='small', + out_indices=(0, 1, 12), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py new file mode 100644 index 0000000..8dcbc33 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8-scratch_lraspp_4xb4-320k_cityscapes-512x1024.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/lraspp_m-v3-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +# Re-config the data sampler. +model = dict(data_preprocessor=data_preprocessor) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader + +runner = dict(type='IterBasedRunner', max_iters=320000) diff --git a/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py new file mode 100644 index 0000000..cd84265 --- /dev/null +++ b/mmsegmentation/configs/mobilenet_v3/mobilenet-v3-d8_lraspp_4xb4-320k_cityscapes-512x1024.py @@ -0,0 +1,16 @@ +_base_ = [ + '../_base_/models/lraspp_m-v3-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://contrib/mobilenet_v3_large') + +# Re-config the data sampler. +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader + +runner = dict(type='IterBasedRunner', max_iters=320000) diff --git a/mmsegmentation/configs/nonlocal_net/README.md b/mmsegmentation/configs/nonlocal_net/README.md new file mode 100644 index 0000000..4c3f49f --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/README.md @@ -0,0 +1,68 @@ +# NonLocal Net + +> [Non-local Neural Networks](https://arxiv.org/abs/1711.07971) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Both convolutional and recurrent operations are building blocks that process one local neighborhood at a time. In this paper, we present non-local operations as a generic family of building blocks for capturing long-range dependencies. Inspired by the classical non-local means method in computer vision, our non-local operation computes the response at a position as a weighted sum of the features at all positions. This building block can be plugged into many computer vision architectures. On the task of video classification, even without any bells and whistles, our non-local models can compete or outperform current competition winners on both Kinetics and Charades datasets. In static image recognition, our non-local models improve object detection/segmentation and pose estimation on the COCO suite of tasks. Code is available at [this https URL](https://github.com/facebookresearch/video-nonlocal-net). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ----------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| NonLocalNet | R-50-D8 | 512x1024 | 40000 | 7.4 | 2.72 | V100 | 78.24 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748-c75e81e3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748.log.json) | +| NonLocalNet | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.95 | V100 | 78.66 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748-d63729fa.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748.log.json) | +| NonLocalNet | R-50-D8 | 769x769 | 40000 | 8.9 | 1.52 | V100 | 78.33 | 79.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243-82ef6749.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243.log.json) | +| NonLocalNet | R-101-D8 | 769x769 | 40000 | 12.8 | 1.05 | V100 | 78.57 | 80.29 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348-8fe9a9dc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348.log.json) | +| NonLocalNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 78.01 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518-d6839fae.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518.log.json) | +| NonLocalNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 78.93 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411-32700183.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411.log.json) | +| NonLocalNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.05 | 80.68 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506-1f9792f6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506.log.json) | +| NonLocalNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.40 | 80.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428-0e1fa4f9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ----------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| NonLocalNet | R-50-D8 | 512x512 | 80000 | 9.1 | 21.37 | V100 | 40.75 | 42.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801-5ae0aa33.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801.log.json) | +| NonLocalNet | R-101-D8 | 512x512 | 80000 | 12.6 | 13.97 | V100 | 42.90 | 44.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758-24105919.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758.log.json) | +| NonLocalNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 42.03 | 43.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410-baef45e3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410.log.json) | +| NonLocalNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 44.63 | 45.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20210827_221502-7881aa1a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20210827_221502.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ----------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| NonLocalNet | R-50-D8 | 512x512 | 20000 | 6.4 | 21.21 | V100 | 76.20 | 77.12 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613-07f2a57c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613.log.json) | +| NonLocalNet | R-101-D8 | 512x512 | 20000 | 9.8 | 14.01 | V100 | 78.15 | 78.86 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615-948c68ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615.log.json) | +| NonLocalNet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 76.65 | 77.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028-0139d4a9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028.log.json) | +| NonLocalNet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 78.27 | 79.12 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net/nonlocal_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028-7e5ff470.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028.log.json) | + +## Citation + +```bibtex +@inproceedings{wang2018non, + title={Non-local neural networks}, + author={Wang, Xiaolong and Girshick, Ross and Gupta, Abhinav and He, Kaiming}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={7794--7803}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/nonlocal_net/metafile.yaml b/mmsegmentation/configs/nonlocal_net/metafile.yaml new file mode 100644 index 0000000..69bd725 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/metafile.yaml @@ -0,0 +1,387 @@ +Collections: +- Name: NonLocalNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + README: configs/nonlocal_net/README.md + Frameworks: + - PyTorch +Models: +- Name: nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.24 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748-c75e81e3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.66 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748-d63729fa.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.33 + mIoU(ms+flip): 79.92 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243-82ef6749.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.57 + mIoU(ms+flip): 80.29 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348-8fe9a9dc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.01 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518-d6839fae.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.93 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411-32700183.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.05 + mIoU(ms+flip): 80.68 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506-1f9792f6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.4 + mIoU(ms+flip): 80.85 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428-0e1fa4f9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.75 + mIoU(ms+flip): 42.05 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801-5ae0aa33.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.9 + mIoU(ms+flip): 44.27 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758-24105919.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.03 + mIoU(ms+flip): 43.04 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410-baef45e3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.63 + mIoU(ms+flip): 45.79 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20210827_221502-7881aa1a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20210827_221502.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.2 + mIoU(ms+flip): 77.12 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613-07f2a57c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.15 + mIoU(ms+flip): 78.86 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615-948c68ab.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.65 + mIoU(ms+flip): 77.47 + Config: configs/nonlocal_net/nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028-0139d4a9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch +- Name: nonlocal_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: NonLocalNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.27 + mIoU(ms+flip): 79.12 + Config: configs/nonlocal_net/nonlocal_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - NonLocalNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028-7e5ff470.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028.log.json + Paper: + Title: Non-local Neural Networks + URL: https://arxiv.org/abs/1711.07971 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/nl_head.py#L10 + Framework: PyTorch diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..5fcf7bc --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..ee984c2 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..aca80d6 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..8a7aeea --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..0cdb3ca --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..a7cacea --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..ec47544 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..ca79f6f --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..f4d5fd2 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..17423f2 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..7cc752c --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..f855a81 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..848be4a --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..cd840a0 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..0efb9d0 --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..52783bc --- /dev/null +++ b/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/ocrnet/README.md b/mmsegmentation/configs/ocrnet/README.md new file mode 100644 index 0000000..628a3b1 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/README.md @@ -0,0 +1,89 @@ +# OCRNet + +> [Object-Contextual Representations for Semantic Segmentation](https://arxiv.org/abs/1909.11065) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +In this paper, we address the problem of semantic segmentation and focus on the context aggregation strategy for robust segmentation. Our motivation is that the label of a pixel is the category of the object that the pixel belongs to. We present a simple yet effective approach, object-contextual representations, characterizing a pixel by exploiting the representation of the corresponding object class. First, we construct object regions based on a feature map supervised by the ground-truth segmentation, and then compute the object region representations. Second, we compute the representation similarity between each pixel and each object region, and augment the representation of each pixel with an object contextual representation, which is a weighted aggregation of all the object region representations according to their similarities with the pixel. We empirically demonstrate that the proposed approach achieves competitive performance on six challenging semantic segmentation benchmarks: Cityscapes, ADE20K, LIP, PASCAL VOC 2012, PASCAL-Context and COCO-Stuff. Notably, we achieved the \\nth{2} place on the Cityscapes leader-board with a single model. + + + +
+ +
+ +## Results and models + +### Cityscapes + +#### HRNet backbone + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 40000 | 3.5 | 10.45 | A100 | 76.61 | 78.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026-6c052a14.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 40000 | 4.7 | 7.50 | V100 | 77.72 | 79.49 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320-401c5bdd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 40000 | 8 | 4.22 | V100 | 80.58 | 81.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.pyy) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336-55b32491.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 80000 | - | - | V100 | 77.16 | 78.66 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735-55979e63.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 80000 | - | - | V100 | 78.57 | 80.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521-c2e1dd4a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 80000 | - | - | V100 | 80.70 | 81.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752-9076bcdf.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 160000 | - | - | V100 | 78.45 | 79.97 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005-f4a7af28.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 160000 | - | - | V100 | 79.47 | 80.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001-b9172d0c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 160000 | - | - | V100 | 81.35 | 82.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037-dfbf1b0c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037.log.json) | + +#### ResNet backbone + +| Method | Backbone | Crop Size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| OCRNet | R-101-D8 | 512x1024 | 8 | 40000 | - | - | V100 | 80.09 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes_20200717_110721-02ac0f13.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes_20200717_110721.log.json) | +| OCRNet | R-101-D8 | 512x1024 | 16 | 40000 | 8.8 | 3.02 | V100 | 80.30 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes_20200723_193726-db500f80.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes_20200723_193726.log.json) | +| OCRNet | R-101-D8 | 512x1024 | 16 | 80000 | 8.8 | 3.02 | V100 | 80.81 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes_20200723_192421-78688424.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes_20200723_192421.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 80000 | 6.7 | 28.98 | V100 | 35.06 | 35.80 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600-e80b62af.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 80000 | 7.9 | 18.93 | V100 | 37.79 | 39.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157-d173d83b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 80000 | 11.2 | 16.99 | V100 | 43.00 | 44.30 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518-d168c2d1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 160000 | - | - | V100 | 37.19 | 38.40 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505-8e913058.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 160000 | - | - | V100 | 39.32 | 40.80 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940-d8fcd9d1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 160000 | - | - | V100 | 43.25 | 44.88 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705-a073726d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 20000 | 3.5 | 31.55 | V100 | 71.70 | 73.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913-02b04fcb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 20000 | 4.7 | 19.91 | V100 | 74.75 | 77.11 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932-8954cbb7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 20000 | 8.1 | 17.83 | V100 | 77.72 | 79.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932-9e82080a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 40000 | - | - | V100 | 72.76 | 74.60 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025-42b587ac.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 40000 | - | - | V100 | 74.98 | 77.40 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr18_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958-714302be.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 40000 | - | - | V100 | 77.14 | 79.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet/ocrnet_hr48_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958-255bc5ce.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958.log.json) | + +## Citation + +```bibtex +@article{YuanW18, + title={Ocnet: Object context network for scene parsing}, + author={Yuhui Yuan and Jingdong Wang}, + booktitle={arXiv preprint arXiv:1809.00916}, + year={2018} +} + +@article{YuanCW20, + title={Object-Contextual Representations for Semantic Segmentation}, + author={Yuhui Yuan and Xilin Chen and Jingdong Wang}, + booktitle={ECCV}, + year={2020} +} +``` diff --git a/mmsegmentation/configs/ocrnet/metafile.yaml b/mmsegmentation/configs/ocrnet/metafile.yaml new file mode 100644 index 0000000..5467feb --- /dev/null +++ b/mmsegmentation/configs/ocrnet/metafile.yaml @@ -0,0 +1,577 @@ +Collections: +- Name: OCRNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - '# HRNet backbone' + - '# ResNet backbone' + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + README: configs/ocrnet/README.md + Frameworks: + - PyTorch +Models: +- Name: ocrnet_hr18s_4xb2-40k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 76.61 + mIoU(ms+flip): 78.01 + Config: configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x A100 GPUS + Memory (GB): 3.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026-6c052a14.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb2-40k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 77.72 + mIoU(ms+flip): 79.49 + Config: configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 4.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320-401c5bdd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb2-40k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 80.58 + mIoU(ms+flip): 81.79 + Config: configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336-55b32491.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18s_4xb2-80k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 77.16 + mIoU(ms+flip): 78.66 + Config: configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735-55979e63.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb2-80k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 78.57 + mIoU(ms+flip): 80.46 + Config: configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521-c2e1dd4a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb2-80k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 80.7 + mIoU(ms+flip): 81.87 + Config: configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752-9076bcdf.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18s_4xb2-160k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 78.45 + mIoU(ms+flip): 79.97 + Config: configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005-f4a7af28.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb2-160k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 79.47 + mIoU(ms+flip): 80.91 + Config: configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001-b9172d0c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb2-160k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# HRNet backbone' + Metrics: + mIoU: 81.35 + mIoU(ms+flip): 82.7 + Config: configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py + Metadata: + Training Data: '# HRNet backbone' + Batch Size: 8 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037-dfbf1b0c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# ResNet backbone' + Metrics: + mIoU: 80.09 + Config: configs/ocrnet/ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: '# ResNet backbone' + Batch Size: 8 + Architecture: + - R-101-D8 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes_20200717_110721-02ac0f13.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes_20200717_110721.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# ResNet backbone' + Metrics: + mIoU: 80.3 + Config: configs/ocrnet/ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: '# ResNet backbone' + Batch Size: 16 + Architecture: + - R-101-D8 + - OCRNet + Training Resources: 8x V100 GPUS + Memory (GB): 8.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes_20200723_193726-db500f80.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes_20200723_193726.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: '# ResNet backbone' + Metrics: + mIoU: 80.81 + Config: configs/ocrnet/ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: '# ResNet backbone' + Batch Size: 16 + Architecture: + - R-101-D8 + - OCRNet + Training Resources: 8x V100 GPUS + Memory (GB): 8.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes_20200723_192421-78688424.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes_20200723_192421.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18s_4xb4-80k_ade20k-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 35.06 + mIoU(ms+flip): 35.8 + Config: configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600-e80b62af.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb4-80k_ade20k-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 37.79 + mIoU(ms+flip): 39.16 + Config: configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157-d173d83b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb4-80k_ade20k-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.0 + mIoU(ms+flip): 44.3 + Config: configs/ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 11.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518-d168c2d1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18s_4xb4-80k_ade20k-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 37.19 + mIoU(ms+flip): 38.4 + Config: configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505-8e913058.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb4-80k_ade20k-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 39.32 + mIoU(ms+flip): 40.8 + Config: configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940-d8fcd9d1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb4-160k_ade20k-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.25 + mIoU(ms+flip): 44.88 + Config: configs/ocrnet/ocrnet_hr48_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705-a073726d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18s_4xb4-20k_voc12aug-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 71.7 + mIoU(ms+flip): 73.84 + Config: configs/ocrnet/ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 3.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913-02b04fcb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb4-20k_voc12aug-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 74.75 + mIoU(ms+flip): 77.11 + Config: configs/ocrnet/ocrnet_hr18_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 4.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932-8954cbb7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb4-20k_voc12aug-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.72 + mIoU(ms+flip): 79.87 + Config: configs/ocrnet/ocrnet_hr48_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932-9e82080a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18s_4xb4-40k_voc12aug-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 72.76 + mIoU(ms+flip): 74.6 + Config: configs/ocrnet/ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18-Small + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025-42b587ac.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr18_4xb4-40k_voc12aug-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 74.98 + mIoU(ms+flip): 77.4 + Config: configs/ocrnet/ocrnet_hr18_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W18 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958-714302be.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch +- Name: ocrnet_hr48_4xb4-40k_voc12aug-512x512 + In Collection: OCRNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.14 + mIoU(ms+flip): 79.71 + Config: configs/ocrnet/ocrnet_hr48_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - HRNetV2p-W48 + - OCRNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958-255bc5ce.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958.log.json + Paper: + Title: Object-Contextual Representations for Semantic Segmentation + URL: https://arxiv.org/abs/1909.11065 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/ocr_head.py#L86 + Framework: PyTorch diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..659217c --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..d401c4b --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..44426a2 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..353005b --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..c696c21 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,40 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..c6b69ea --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,40 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..ceca8df --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..c5388fb --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..2335f3b --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..b2d1a8f --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..fabf582 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..0eca655 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb4-20k_voc12aug-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..13b02b9 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb4-40k_voc12aug-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..60c79c2 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr18s_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_4xb4-80k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..184d38d --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..7025ee9 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..9c68a15 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..e74976c --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb4-160k_ade20k-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..f015b92 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb4-20k_voc12aug-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..baafa38 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb4-40k_voc12aug-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..85514b9 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_hr48_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_4xb4-80k_ade20k-512x512.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..a94597b --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..88e5ad0 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +param_scheduler = [ + dict( + type='PolyLR', + eta_min=2e-4, + power=0.9, + begin=0, + end=40000, + by_epoch=False) +] diff --git a/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..a3b4209 --- /dev/null +++ b/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_8xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +param_scheduler = [ + dict( + type='PolyLR', + eta_min=2e-4, + power=0.9, + begin=0, + end=40000, + by_epoch=False) +] diff --git a/mmsegmentation/configs/pidnet/README.md b/mmsegmentation/configs/pidnet/README.md new file mode 100644 index 0000000..e23efbd --- /dev/null +++ b/mmsegmentation/configs/pidnet/README.md @@ -0,0 +1,50 @@ +# PIDNet + +> [PIDNet: A Real-time Semantic Segmentation Network Inspired from PID Controller](https://arxiv.org/pdf/2206.02066.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Two-branch network architecture has shown its efficiency and effectiveness for real-time semantic segmentation tasks. However, direct fusion of low-level details and high-level semantics will lead to a phenomenon that the detailed features are easily overwhelmed by surrounding contextual information, namely overshoot in this paper, which limits the improvement of the accuracy of existed two-branch models. In this paper, we bridge a connection between Convolutional Neural Network (CNN) and Proportional-IntegralDerivative (PID) controller and reveal that the two-branch network is nothing but a Proportional-Integral (PI) controller, which inherently suffers from the similar overshoot issue. To alleviate this issue, we propose a novel threebranch network architecture: PIDNet, which possesses three branches to parse the detailed, context and boundary information (derivative of semantics), respectively, and employs boundary attention to guide the fusion of detailed and context branches in final stage. The family of PIDNets achieve the best trade-off between inference speed and accuracy and their test accuracy surpasses all the existed models with similar inference speed on Cityscapes, CamVid and COCO-Stuff datasets. Especially, PIDNet-S achieves 78.6% mIOU with inference speed of 93.2 FPS on Cityscapes test set and 80.1% mIOU with speed of 153.7 FPS on CamVid test set. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PIDNet | PIDNet-S | 1024x1024 | 120000 | 3.38 | 80.82 | A100 | 78.74 | 80.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes/pidnet-s_2xb6-120k_1024x1024-cityscapes_20230302_191700-bb8e3bcc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes/pidnet-s_2xb6-120k_1024x1024-cityscapes_20230302_191700.json) | +| PIDNet | PIDNet-M | 1024x1024 | 120000 | 5.14 | 71.98 | A100 | 80.22 | 82.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes/pidnet-m_2xb6-120k_1024x1024-cityscapes_20230301_143452-f9bcdbf3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes/pidnet-m_2xb6-120k_1024x1024-cityscapes_20230301_143452.json) | +| PIDNet | PIDNet-L | 1024x1024 | 120000 | 5.83 | 60.06 | A100 | 80.89 | 82.37 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes/pidnet-l_2xb6-120k_1024x1024-cityscapes_20230303_114514-0783ca6b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes/pidnet-l_2xb6-120k_1024x1024-cityscapes_20230303_114514.json) | + +## Notes + +The pretrained weights in config files are converted from [the official repo](https://github.com/XuJiacong/PIDNet#models). + +## Citation + +```bibtex +@misc{xu2022pidnet, + title={PIDNet: A Real-time Semantic Segmentation Network Inspired from PID Controller}, + author={Jiacong Xu and Zixiang Xiong and Shankar P. Bhattacharyya}, + year={2022}, + eprint={2206.02066}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/mmsegmentation/configs/pidnet/metafile.yaml b/mmsegmentation/configs/pidnet/metafile.yaml new file mode 100644 index 0000000..51b514a --- /dev/null +++ b/mmsegmentation/configs/pidnet/metafile.yaml @@ -0,0 +1,85 @@ +Collections: +- Name: PIDNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: 'PIDNet: A Real-time Semantic Segmentation Network Inspired from PID Controller' + URL: https://arxiv.org/pdf/2206.02066.pdf + README: configs/pidnet/README.md + Frameworks: + - PyTorch +Models: +- Name: pidnet-s_2xb6-120k_1024x1024-cityscapes + In Collection: PIDNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.74 + mIoU(ms+flip): 80.87 + Config: configs/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes.py + Metadata: + Training Data: Cityscapes + Batch Size: 12 + Architecture: + - PIDNet-S + - PIDNet + Training Resources: 2x A100 GPUS + Memory (GB): 3.38 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes/pidnet-s_2xb6-120k_1024x1024-cityscapes_20230302_191700-bb8e3bcc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes/pidnet-s_2xb6-120k_1024x1024-cityscapes_20230302_191700.json + Paper: + Title: 'PIDNet: A Real-time Semantic Segmentation Network Inspired from PID Controller' + URL: https://arxiv.org/pdf/2206.02066.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/pidnet.py + Framework: PyTorch +- Name: pidnet-m_2xb6-120k_1024x1024-cityscapes + In Collection: PIDNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.22 + mIoU(ms+flip): 82.05 + Config: configs/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py + Metadata: + Training Data: Cityscapes + Batch Size: 12 + Architecture: + - PIDNet-M + - PIDNet + Training Resources: 2x A100 GPUS + Memory (GB): 5.14 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes/pidnet-m_2xb6-120k_1024x1024-cityscapes_20230301_143452-f9bcdbf3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes/pidnet-m_2xb6-120k_1024x1024-cityscapes_20230301_143452.json + Paper: + Title: 'PIDNet: A Real-time Semantic Segmentation Network Inspired from PID Controller' + URL: https://arxiv.org/pdf/2206.02066.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/pidnet.py + Framework: PyTorch +- Name: pidnet-l_2xb6-120k_1024x1024-cityscapes + In Collection: PIDNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.89 + mIoU(ms+flip): 82.37 + Config: configs/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py + Metadata: + Training Data: Cityscapes + Batch Size: 12 + Architecture: + - PIDNet-L + - PIDNet + Training Resources: 2x A100 GPUS + Memory (GB): 5.83 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes/pidnet-l_2xb6-120k_1024x1024-cityscapes_20230303_114514-0783ca6b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes/pidnet-l_2xb6-120k_1024x1024-cityscapes_20230303_114514.json + Paper: + Title: 'PIDNet: A Real-time Semantic Segmentation Network Inspired from PID Controller' + URL: https://arxiv.org/pdf/2206.02066.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/pidnet.py + Framework: PyTorch diff --git a/mmsegmentation/configs/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py b/mmsegmentation/configs/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py new file mode 100644 index 0000000..1955c91 --- /dev/null +++ b/mmsegmentation/configs/pidnet/pidnet-l_2xb6-120k_1024x1024-cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './pidnet-s_2xb6-120k_1024x1024-cityscapes.py' +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/pidnet/pidnet-l_imagenet1k_20230306-67889109.pth' # noqa +model = dict( + backbone=dict( + channels=64, + ppm_channels=112, + num_stem_blocks=3, + num_branch_blocks=4, + init_cfg=dict(checkpoint=checkpoint_file)), + decode_head=dict(in_channels=256, channels=256)) diff --git a/mmsegmentation/configs/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py b/mmsegmentation/configs/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py new file mode 100644 index 0000000..38a69c1 --- /dev/null +++ b/mmsegmentation/configs/pidnet/pidnet-m_2xb6-120k_1024x1024-cityscapes.py @@ -0,0 +1,5 @@ +_base_ = './pidnet-s_2xb6-120k_1024x1024-cityscapes.py' +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/pidnet/pidnet-m_imagenet1k_20230306-39893c52.pth' # noqa +model = dict( + backbone=dict(channels=64, init_cfg=dict(checkpoint=checkpoint_file)), + decode_head=dict(in_channels=256)) diff --git a/mmsegmentation/configs/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes.py b/mmsegmentation/configs/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes.py new file mode 100644 index 0000000..f70ca42 --- /dev/null +++ b/mmsegmentation/configs/pidnet/pidnet-s_2xb6-120k_1024x1024-cityscapes.py @@ -0,0 +1,113 @@ +_base_ = [ + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py' +] + +# The class_weight is borrowed from https://github.com/openseg-group/OCNet.pytorch/issues/14 # noqa +# Licensed under the MIT License +class_weight = [ + 0.8373, 0.918, 0.866, 1.0345, 1.0166, 0.9969, 0.9754, 1.0489, 0.8786, + 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, 1.0865, 1.0955, 1.0865, 1.1529, + 1.0507 +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/pidnet/pidnet-s_imagenet1k_20230306-715e6273.pth' # noqa +crop_size = (1024, 1024) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='PIDNet', + in_channels=3, + channels=32, + ppm_channels=96, + num_stem_blocks=2, + num_branch_blocks=3, + align_corners=False, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU', inplace=True), + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)), + decode_head=dict( + type='PIDHead', + in_channels=128, + channels=128, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU', inplace=True), + align_corners=True, + loss_decode=[ + dict( + type='CrossEntropyLoss', + use_sigmoid=False, + class_weight=class_weight, + loss_weight=0.4), + dict( + type='OhemCrossEntropy', + thres=0.9, + min_kept=131072, + class_weight=class_weight, + loss_weight=1.0), + dict(type='BoundaryLoss', loss_weight=20.0), + dict( + type='OhemCrossEntropy', + thres=0.9, + min_kept=131072, + class_weight=class_weight, + loss_weight=1.0) + ]), + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='GenerateEdge', edge_width=4), + dict(type='PackSegInputs') +] +train_dataloader = dict(batch_size=6, dataset=dict(pipeline=train_pipeline)) + +iters = 120000 +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0, + power=0.9, + begin=0, + end=iters, + by_epoch=False) +] +# training schedule for 120k +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=iters, val_interval=iters // 10) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict( + type='CheckpointHook', by_epoch=False, interval=iters // 10), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) + +randomness = dict(seed=304) diff --git a/mmsegmentation/configs/point_rend/README.md b/mmsegmentation/configs/point_rend/README.md new file mode 100644 index 0000000..487d3bc --- /dev/null +++ b/mmsegmentation/configs/point_rend/README.md @@ -0,0 +1,51 @@ +# PointRend + +> [PointRend: Image Segmentation as Rendering](https://arxiv.org/abs/1912.08193) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We present a new method for efficient high-quality image segmentation of objects and scenes. By analogizing classical computer graphics methods for efficient rendering with over- and undersampling challenges faced in pixel labeling tasks, we develop a unique perspective of image segmentation as a rendering problem. From this vantage, we present the PointRend (Point-based Rendering) neural network module: a module that performs point-based segmentation predictions at adaptively selected locations based on an iterative subdivision algorithm. PointRend can be flexibly applied to both instance and semantic segmentation tasks by building on top of existing state-of-the-art models. While many concrete implementations of the general idea are possible, we show that a simple design already achieves excellent results. Qualitatively, PointRend outputs crisp object boundaries in regions that are over-smoothed by previous methods. Quantitatively, PointRend yields significant gains on COCO and Cityscapes, for both instance and semantic segmentation. PointRend's efficiency enables output resolutions that are otherwise impractical in terms of memory or computation compared to existing approaches. Code has been made available at [this https URL](https://github.com/facebookresearch/detectron2/tree/main/projects/PointRend). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PointRend | R-50 | 512x1024 | 80000 | 3.1 | 8.48 | V100 | 76.47 | 78.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes_20200711_015821-bb1ff523.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes-20200715_214714.log.json) | +| PointRend | R-101 | 512x1024 | 80000 | 4.2 | 7.00 | V100 | 78.30 | 79.97 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/point_rend/pointrend_r101_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes_20200711_170850-d0ca84be.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes-20200715_214824.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| PointRend | R-50 | 512x512 | 160000 | 5.1 | 17.31 | V100 | 37.64 | 39.17 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/point_rend/pointrend_r50_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k_20200807_232644-ac3febf2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k-20200807_232644.log.json) | +| PointRend | R-101 | 512x512 | 160000 | 6.1 | 15.50 | V100 | 40.02 | 41.60 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/point_rend/pointrend_r101_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k_20200808_030852-8834902a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k-20200808_030852.log.json) | + +## Citation + +```bibtex +@inproceedings{kirillov2020pointrend, + title={Pointrend: Image segmentation as rendering}, + author={Kirillov, Alexander and Wu, Yuxin and He, Kaiming and Girshick, Ross}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, + pages={9799--9808}, + year={2020} +} +``` diff --git a/mmsegmentation/configs/point_rend/metafile.yaml b/mmsegmentation/configs/point_rend/metafile.yaml new file mode 100644 index 0000000..064717c --- /dev/null +++ b/mmsegmentation/configs/point_rend/metafile.yaml @@ -0,0 +1,110 @@ +Collections: +- Name: PointRend + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: 'PointRend: Image Segmentation as Rendering' + URL: https://arxiv.org/abs/1912.08193 + README: configs/point_rend/README.md + Frameworks: + - PyTorch +Models: +- Name: pointrend_r50_4xb2-80k_cityscapes-512x1024 + In Collection: PointRend + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.47 + mIoU(ms+flip): 78.13 + Config: configs/point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50 + - PointRend + Training Resources: 4x V100 GPUS + Memory (GB): 3.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes_20200711_015821-bb1ff523.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes-20200715_214714.log.json + Paper: + Title: 'PointRend: Image Segmentation as Rendering' + URL: https://arxiv.org/abs/1912.08193 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/point_head.py#L36 + Framework: PyTorch +- Name: pointrend_r101_4xb2-80k_cityscapes-512x1024 + In Collection: PointRend + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.3 + mIoU(ms+flip): 79.97 + Config: configs/point_rend/pointrend_r101_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101 + - PointRend + Training Resources: 4x V100 GPUS + Memory (GB): 4.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes_20200711_170850-d0ca84be.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes-20200715_214824.log.json + Paper: + Title: 'PointRend: Image Segmentation as Rendering' + URL: https://arxiv.org/abs/1912.08193 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/point_head.py#L36 + Framework: PyTorch +- Name: pointrend_r50_4xb4-160k_ade20k-512x512 + In Collection: PointRend + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 37.64 + mIoU(ms+flip): 39.17 + Config: configs/point_rend/pointrend_r50_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50 + - PointRend + Training Resources: 4x V100 GPUS + Memory (GB): 5.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k_20200807_232644-ac3febf2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k-20200807_232644.log.json + Paper: + Title: 'PointRend: Image Segmentation as Rendering' + URL: https://arxiv.org/abs/1912.08193 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/point_head.py#L36 + Framework: PyTorch +- Name: pointrend_r101_4xb4-160k_ade20k-512x512 + In Collection: PointRend + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.02 + mIoU(ms+flip): 41.6 + Config: configs/point_rend/pointrend_r101_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101 + - PointRend + Training Resources: 4x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k_20200808_030852-8834902a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k-20200808_030852.log.json + Paper: + Title: 'PointRend: Image Segmentation as Rendering' + URL: https://arxiv.org/abs/1912.08193 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/point_head.py#L36 + Framework: PyTorch diff --git a/mmsegmentation/configs/point_rend/pointrend_r101_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/point_rend/pointrend_r101_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..ca2a19a --- /dev/null +++ b/mmsegmentation/configs/point_rend/pointrend_r101_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './pointrend_r50_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/point_rend/pointrend_r101_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/point_rend/pointrend_r101_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..6729d3b --- /dev/null +++ b/mmsegmentation/configs/point_rend/pointrend_r101_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pointrend_r50_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..fb005d8 --- /dev/null +++ b/mmsegmentation/configs/point_rend/pointrend_r50_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/pointrend_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=200), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=200, + end=80000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/point_rend/pointrend_r50_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/point_rend/pointrend_r50_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..d350fa6 --- /dev/null +++ b/mmsegmentation/configs/point_rend/pointrend_r50_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,46 @@ +_base_ = [ + '../_base_/models/pointrend_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=[ + dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='PointHead', + in_channels=[256], + in_index=[0], + channels=256, + num_fcs=3, + coarse_pred_each_layer=True, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=200), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=200, + end=160000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/poolformer/README.md b/mmsegmentation/configs/poolformer/README.md new file mode 100644 index 0000000..e6e2eac --- /dev/null +++ b/mmsegmentation/configs/poolformer/README.md @@ -0,0 +1,65 @@ +# PoolFormer + +> [MetaFormer is Actually What You Need for Vision](https://arxiv.org/abs/2111.11418) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Transformers have shown great potential in computer vision tasks. A common belief is their attention-based token mixer module contributes most to their competence. However, recent works show the attention-based module in transformers can be replaced by spatial MLPs and the resulted models still perform quite well. Based on this observation, we hypothesize that the general architecture of the transformers, instead of the specific token mixer module, is more essential to the model's performance. To verify this, we deliberately replace the attention module in transformers with an embarrassingly simple spatial pooling operator to conduct only the most basic token mixing. Surprisingly, we observe that the derived model, termed as PoolFormer, achieves competitive performance on multiple computer vision tasks. For example, on ImageNet-1K, PoolFormer achieves 82.1% top-1 accuracy, surpassing well-tuned vision transformer/MLP-like baselines DeiT-B/ResMLP-B24 by 0.3%/1.1% accuracy with 35%/52% fewer parameters and 48%/60% fewer MACs. The effectiveness of PoolFormer verifies our hypothesis and urges us to initiate the concept of "MetaFormer", a general architecture abstracted from transformers without specifying the token mixer. Based on the extensive experiments, we argue that MetaFormer is the key player in achieving superior results for recent transformer and MLP-like models on vision tasks. This work calls for more future research dedicated to improving MetaFormer instead of focusing on the token mixer modules. Additionally, our proposed PoolFormer could serve as a starting baseline for future MetaFormer architecture design. Code is available at [this https URL](https://github.com/sail-sg/poolformer) + + + +
+ +
+ +## Citation + +```bibtex +@inproceedings{yu2022metaformer, + title={Metaformer is actually what you need for vision}, + author={Yu, Weihao and Luo, Mi and Zhou, Pan and Si, Chenyang and Zhou, Yichen and Wang, Xinchao and Feng, Jiashi and Yan, Shuicheng}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={10819--10829}, + year={2022} +} +``` + +### Usage + +- PoolFormer backbone needs to install [MMClassification](https://github.com/open-mmlab/mmclassification) first, which has abundant backbones for downstream tasks. + +```shell +pip install "mmpretrain>=1.0.0rc7" +``` + +- The pretrained models could also be downloaded from [PoolFormer config of MMClassification](https://github.com/open-mmlab/mmclassification/tree/master/configs/poolformer). + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | pretrain | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | mIoU\* | mIoU\*(ms+flip) | config | download | +| ------ | -------------- | --------- | ----------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | ------ | --------------: | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FPN | PoolFormer-S12 | 512x512 | ImageNet-1K | 32 | 40000 | 4.17 | 23.48 | V100 | 36.68 | - | 37.07 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s12_8x4_512x512_40k_ade20k/fpn_poolformer_s12_8x4_512x512_40k_ade20k_20220501_115154-b5aa2f49.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s12_8x4_512x512_40k_ade20k/fpn_poolformer_s12_8x4_512x512_40k_ade20k_20220501_115154.log.json) | +| FPN | PoolFormer-S24 | 512x512 | ImageNet-1K | 32 | 40000 | 5.47 | 15.74 | V100 | 40.12 | - | 40.36 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/poolformer/fpn_poolformer_s24_8xb4-40k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s24_8x4_512x512_40k_ade20k/fpn_poolformer_s24_8x4_512x512_40k_ade20k_20220503_222049-394a7cf7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s24_8x4_512x512_40k_ade20k/fpn_poolformer_s24_8x4_512x512_40k_ade20k_20220503_222049.log.json) | +| FPN | PoolFormer-S36 | 512x512 | ImageNet-1K | 32 | 40000 | 6.77 | 11.34 | V100 | 41.61 | - | 41.81 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/poolformer/fpn_poolformer_s36_8xb4-40k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k/fpn_poolformer_s36_8x4_512x512_40k_ade20k_20220501_151122-b47e607d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k/fpn_poolformer_s36_8x4_512x512_40k_ade20k_20220501_151122.log.json) | +| FPN | PoolFormer-M36 | 512x512 | ImageNet-1K | 32 | 40000 | 8.59 | 8.97 | V100 | 41.95 | - | 42.35 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/poolformer/fpn_poolformer_m36_8xb4-40k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m36_8x4_512x512_40k_ade20k/fpn_poolformer_m36_8x4_512x512_40k_ade20k_20220501_164230-3dc83921.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m36_8x4_512x512_40k_ade20k/fpn_poolformer_m36_8x4_512x512_40k_ade20k_20220501_164230.log.json) | +| FPN | PoolFormer-M48 | 512x512 | ImageNet-1K | 32 | 40000 | 10.48 | 6.69 | V100 | 42.43 | - | 42.76 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m48_8x4_512x512_40k_ade20k/fpn_poolformer_m48_8x4_512x512_40k_ade20k_20220504_003923-64168d3b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m48_8x4_512x512_40k_ade20k/fpn_poolformer_m48_8x4_512x512_40k_ade20k_20220504_003923.log.json) | + +Note: + +- We replace `AlignedResize` in original PoolFormer implementation to `Resize + ResizeToMultiple`. + +- `mIoU` with * is collected when `Resize + ResizeToMultiple` is adopted in `test_pipeline`, so do `mIoU` in logs. + +- The Test Time Augmentation i.e., "ms+flip" in MMSegmentation v1.x is developing, stay tuned! diff --git a/mmsegmentation/configs/poolformer/fpn_poolformer_m36_8xb4-40k_ade20k-512x512.py b/mmsegmentation/configs/poolformer/fpn_poolformer_m36_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..4100eb9 --- /dev/null +++ b/mmsegmentation/configs/poolformer/fpn_poolformer_m36_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,11 @@ +_base_ = './fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py' +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m36_3rdparty_32xb128_in1k_20220414-c55e0949.pth' # noqa + +# model settings +model = dict( + backbone=dict( + arch='m36', + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + neck=dict(in_channels=[96, 192, 384, 768])) diff --git a/mmsegmentation/configs/poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py b/mmsegmentation/configs/poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..cfc49cc --- /dev/null +++ b/mmsegmentation/configs/poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,11 @@ +_base_ = './fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py' +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m48_3rdparty_32xb128_in1k_20220414-9378f3eb.pth' # noqa + +# model settings +model = dict( + backbone=dict( + arch='m48', + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + neck=dict(in_channels=[96, 192, 384, 768])) diff --git a/mmsegmentation/configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py b/mmsegmentation/configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..c0b1531 --- /dev/null +++ b/mmsegmentation/configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,91 @@ +_base_ = [ + '../_base_/models/fpn_poolformer_s12.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] + +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + dict(type='ResizeToMultiple', size_divisor=32), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] + +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='RepeatDataset', + times=50, + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', + seg_map_path='annotations/training'), + pipeline=train_pipeline))) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator + +# model settings +model = dict( + data_preprocessor=data_preprocessor, + neck=dict(in_channels=[64, 128, 320, 512]), + decode_head=dict(num_classes=150)) + +# optimizer +# optimizer = dict(_delete_=True, type='AdamW', lr=0.0002, weight_decay=0.0001) +# optimizer_config = dict() +# # learning policy +# lr_config = dict(policy='poly', power=0.9, min_lr=0.0, by_epoch=False) +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict(type='AdamW', lr=0.0002, weight_decay=0.0001)) +param_scheduler = [ + dict( + type='PolyLR', + power=0.9, + begin=0, + end=40000, + eta_min=0.0, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/poolformer/fpn_poolformer_s24_8xb4-40k_ade20k-512x512.py b/mmsegmentation/configs/poolformer/fpn_poolformer_s24_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..1f9d24c --- /dev/null +++ b/mmsegmentation/configs/poolformer/fpn_poolformer_s24_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = './fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py' +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s24_3rdparty_32xb128_in1k_20220414-d7055904.pth' # noqa +# model settings +model = dict( + backbone=dict( + arch='s24', + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.'))) diff --git a/mmsegmentation/configs/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k.py b/mmsegmentation/configs/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k.py new file mode 100644 index 0000000..231dcf6 --- /dev/null +++ b/mmsegmentation/configs/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k.py @@ -0,0 +1,10 @@ +_base_ = './fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py' +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s36_3rdparty_32xb128_in1k_20220414-d78ff3e8.pth' # noqa + +# model settings +model = dict( + backbone=dict( + arch='s36', + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.'))) diff --git a/mmsegmentation/configs/poolformer/metafile.yaml b/mmsegmentation/configs/poolformer/metafile.yaml new file mode 100644 index 0000000..12f402b --- /dev/null +++ b/mmsegmentation/configs/poolformer/metafile.yaml @@ -0,0 +1,116 @@ +Models: +- Name: fpn_poolformer_s12_8xb4-40k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 36.68 + Config: configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - PoolFormer-S12 + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 4.17 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s12_8x4_512x512_40k_ade20k/fpn_poolformer_s12_8x4_512x512_40k_ade20k_20220501_115154-b5aa2f49.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s12_8x4_512x512_40k_ade20k/fpn_poolformer_s12_8x4_512x512_40k_ade20k_20220501_115154.log.json + Paper: + Title: MetaFormer is Actually What You Need for Vision + URL: https://arxiv.org/abs/2111.11418 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.23.0/mmcls/models/backbones/poolformer.py#L198 + Framework: PyTorch +- Name: fpn_poolformer_s24_8xb4-40k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.12 + Config: configs/poolformer/fpn_poolformer_s24_8xb4-40k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - PoolFormer-S24 + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 5.47 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s24_8x4_512x512_40k_ade20k/fpn_poolformer_s24_8x4_512x512_40k_ade20k_20220503_222049-394a7cf7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s24_8x4_512x512_40k_ade20k/fpn_poolformer_s24_8x4_512x512_40k_ade20k_20220503_222049.log.json + Paper: + Title: MetaFormer is Actually What You Need for Vision + URL: https://arxiv.org/abs/2111.11418 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.23.0/mmcls/models/backbones/poolformer.py#L198 + Framework: PyTorch +- Name: fpn_poolformer_s36_8xb4-40k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.61 + Config: configs/poolformer/fpn_poolformer_s36_8xb4-40k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - PoolFormer-S36 + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 6.77 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k/fpn_poolformer_s36_8x4_512x512_40k_ade20k_20220501_151122-b47e607d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_s36_8x4_512x512_40k_ade20k/fpn_poolformer_s36_8x4_512x512_40k_ade20k_20220501_151122.log.json + Paper: + Title: MetaFormer is Actually What You Need for Vision + URL: https://arxiv.org/abs/2111.11418 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.23.0/mmcls/models/backbones/poolformer.py#L198 + Framework: PyTorch +- Name: fpn_poolformer_m36_8xb4-40k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.95 + Config: configs/poolformer/fpn_poolformer_m36_8xb4-40k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - PoolFormer-M36 + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 8.59 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m36_8x4_512x512_40k_ade20k/fpn_poolformer_m36_8x4_512x512_40k_ade20k_20220501_164230-3dc83921.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m36_8x4_512x512_40k_ade20k/fpn_poolformer_m36_8x4_512x512_40k_ade20k_20220501_164230.log.json + Paper: + Title: MetaFormer is Actually What You Need for Vision + URL: https://arxiv.org/abs/2111.11418 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.23.0/mmcls/models/backbones/poolformer.py#L198 + Framework: PyTorch +- Name: fpn_poolformer_m48_8xb4-40k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.43 + Config: configs/poolformer/fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - PoolFormer-M48 + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 10.48 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m48_8x4_512x512_40k_ade20k/fpn_poolformer_m48_8x4_512x512_40k_ade20k_20220504_003923-64168d3b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/poolformer/fpn_poolformer_m48_8x4_512x512_40k_ade20k/fpn_poolformer_m48_8x4_512x512_40k_ade20k_20220504_003923.log.json + Paper: + Title: MetaFormer is Actually What You Need for Vision + URL: https://arxiv.org/abs/2111.11418 + Code: https://github.com/open-mmlab/mmclassification/blob/v0.23.0/mmcls/models/backbones/poolformer.py#L198 + Framework: PyTorch diff --git a/mmsegmentation/configs/psanet/README.md b/mmsegmentation/configs/psanet/README.md new file mode 100644 index 0000000..1f5680f --- /dev/null +++ b/mmsegmentation/configs/psanet/README.md @@ -0,0 +1,68 @@ +# PSANet + +> [PSANet: Point-wise Spatial Attention Network for Scene Parsing](https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We notice information flow in convolutional neural networksis restricted inside local neighborhood regions due to the physical de-sign of convolutional filters, which limits the overall understanding ofcomplex scenes. In this paper, we propose thepoint-wise spatial atten-tion network(PSANet) to relax the local neighborhood constraint. Eachposition on the feature map is connected to all the other ones througha self-adaptively learned attention mask. Moreover, information propa-gation in bi-direction for scene parsing is enabled. Information at otherpositions can be collected to help the prediction of the current positionand vice versa, information at the current position can be distributedto assist the prediction of other ones. Our proposed approach achievestop performance on various competitive scene parsing datasets, includ-ing ADE20K, PASCAL VOC 2012 and Cityscapes, demonstrating itseffectiveness and generality. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSANet | R-50-D8 | 512x1024 | 40000 | 7 | 3.17 | V100 | 77.63 | 79.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117-99fac37c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117.log.json) | +| PSANet | R-101-D8 | 512x1024 | 40000 | 10.5 | 2.20 | V100 | 79.14 | 80.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418-27b9cfa7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418.log.json) | +| PSANet | R-50-D8 | 769x769 | 40000 | 7.9 | 1.40 | V100 | 77.99 | 79.64 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717-d5365506.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717.log.json) | +| PSANet | R-101-D8 | 769x769 | 40000 | 11.9 | 0.98 | V100 | 78.43 | 80.26 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107-997da1e6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107.log.json) | +| PSANet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 77.24 | 78.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842-ab60a24f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842.log.json) | +| PSANet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 79.31 | 80.53 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823-0f73a169.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823.log.json) | +| PSANet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.31 | 80.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134-fe42f49e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134.log.json) | +| PSANet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.69 | 80.89 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550-7665827b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSANet | R-50-D8 | 512x512 | 80000 | 9 | 18.91 | V100 | 41.14 | 41.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141-835e4b97.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141.log.json) | +| PSANet | R-101-D8 | 512x512 | 80000 | 12.5 | 13.13 | V100 | 43.80 | 44.75 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117-1fab60d4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117.log.json) | +| PSANet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 41.67 | 42.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258-148077dd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258.log.json) | +| PSANet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 43.74 | 45.38 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537-dbfa564c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSANet | R-50-D8 | 512x512 | 20000 | 6.9 | 18.24 | V100 | 76.39 | 77.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413-2f1bbaa1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413.log.json) | +| PSANet | R-101-D8 | 512x512 | 20000 | 10.4 | 12.63 | V100 | 77.91 | 79.30 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624-946fef11.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624.log.json) | +| PSANet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 76.30 | 77.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946-f596afb5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946.log.json) | +| PSANet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 77.73 | 79.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet/psanet_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946-1f560f9e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946.log.json) | + +## Citation + +```bibtex +@inproceedings{zhao2018psanet, + title={Psanet: Point-wise spatial attention network for scene parsing}, + author={Zhao, Hengshuang and Zhang, Yi and Liu, Shu and Shi, Jianping and Change Loy, Chen and Lin, Dahua and Jia, Jiaya}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + pages={267--283}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/psanet/metafile.yaml b/mmsegmentation/configs/psanet/metafile.yaml new file mode 100644 index 0000000..3fbe6f6 --- /dev/null +++ b/mmsegmentation/configs/psanet/metafile.yaml @@ -0,0 +1,391 @@ +Collections: +- Name: PSANet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + README: configs/psanet/README.md + Frameworks: + - PyTorch +Models: +- Name: psanet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.63 + mIoU(ms+flip): 79.04 + Config: configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 7.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117-99fac37c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.14 + mIoU(ms+flip): 80.19 + Config: configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 10.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418-27b9cfa7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.99 + mIoU(ms+flip): 79.64 + Config: configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 7.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717-d5365506.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.43 + mIoU(ms+flip): 80.26 + Config: configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 11.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107-997da1e6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.24 + mIoU(ms+flip): 78.69 + Config: configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842-ab60a24f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.31 + mIoU(ms+flip): 80.53 + Config: configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823-0f73a169.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.31 + mIoU(ms+flip): 80.91 + Config: configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134-fe42f49e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.69 + mIoU(ms+flip): 80.89 + Config: configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550-7665827b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.14 + mIoU(ms+flip): 41.91 + Config: configs/psanet/psanet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 9.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141-835e4b97.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.8 + mIoU(ms+flip): 44.75 + Config: configs/psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 12.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117-1fab60d4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.67 + mIoU(ms+flip): 42.95 + Config: configs/psanet/psanet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258-148077dd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.74 + mIoU(ms+flip): 45.38 + Config: configs/psanet/psanet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537-dbfa564c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.39 + mIoU(ms+flip): 77.34 + Config: configs/psanet/psanet_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 6.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413-2f1bbaa1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.91 + mIoU(ms+flip): 79.3 + Config: configs/psanet/psanet_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Memory (GB): 10.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624-946fef11.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.3 + mIoU(ms+flip): 77.35 + Config: configs/psanet/psanet_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946-f596afb5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch +- Name: psanet_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: PSANet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.73 + mIoU(ms+flip): 79.05 + Config: configs/psanet/psanet_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - PSANet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946-1f560f9e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946.log.json + Paper: + Title: 'PSANet: Point-wise Spatial Attention Network for Scene Parsing' + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Hengshuang_Zhao_PSANet_Point-wise_Spatial_ECCV_2018_paper.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psa_head.py#L18 + Framework: PyTorch diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..e69cf42 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..e543099 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..b863638 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..097b1c5 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..ac86306 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..abd8e56 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..d3154a8 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..b34d424 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..82463aa --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..af44b30 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5e5052f --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..0eaf830 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..de13296 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(mask_size=(66, 66), num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..45d8762 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..b5d99d1 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..c3b6528 --- /dev/null +++ b/mmsegmentation/configs/psanet/psanet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(mask_size=(66, 66), num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/pspnet/README.md b/mmsegmentation/configs/pspnet/README.md new file mode 100644 index 0000000..4209d25 --- /dev/null +++ b/mmsegmentation/configs/pspnet/README.md @@ -0,0 +1,182 @@ +# PSPNet + +> [Pyramid Scene Parsing Network](https://arxiv.org/abs/1612.01105) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Scene parsing is challenging for unrestricted open vocabulary and diverse scenes. In this paper, we exploit the capability of global context information by different-region-based context aggregation through our pyramid pooling module together with the proposed pyramid scene parsing network (PSPNet). Our global prior representation is effective to produce good quality results on the scene parsing task, while PSPNet provides a superior framework for pixel-level prediction tasks. The proposed approach achieves state-of-the-art performance on various datasets. It came first in ImageNet scene parsing challenge 2016, PASCAL VOC 2012 benchmark and Cityscapes benchmark. A single PSPNet yields new record of mIoU accuracy 85.4% on PASCAL VOC 2012 and accuracy 80.2% on Cityscapes. + + + +
+ +
+ +
+PSPNet-R50-D8 +PSPNet-R50 D8 model structure +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------------- | ------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| PSPNet | R-50-D8 | 512x1024 | 40000 | 6.1 | 4.07 | V100 | 77.85 | 79.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 40000 | 9.6 | 2.68 | V100 | 78.34 | 79.74 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json) | +| PSPNet | R-50-D8 | 769x769 | 40000 | 6.9 | 1.76 | V100 | 78.26 | 79.88 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725-86638686.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725.log.json) | +| PSPNet | R-101-D8 | 769x769 | 40000 | 10.9 | 1.15 | V100 | 79.08 | 80.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753-61c6f5be.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753.log.json) | +| PSPNet | R-18-D8 | 512x1024 | 80000 | 1.7 | 15.71 | V100 | 74.87 | 76.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes_20201225_021458-09ffa746.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes-20201225_021458.log.json) | +| PSPNet | R-50-D8 | 512x1024 | 80000 | - | - | V100 | 78.55 | 79.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131.log.json) | +| PSPNet | R-50b-D8 rsb | 512x1024 | 80000 | 6.2 | 3.82 | V100 | 78.47 | 79.45 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220315_123238-588c30be.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220315_123238.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 80000 | - | - | V100 | 79.76 | 81.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211.log.json) | +| PSPNet (FP16) | R-101-D8 | 512x1024 | 80000 | 5.34 | 8.77 | V100 | 79.46 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_fp16_512x1024_80k_cityscapes/pspnet_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230919-a0875e5c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_fp16_512x1024_80k_cityscapes/pspnet_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230919.log.json) | +| PSPNet | R-18-D8 | 769x769 | 80000 | 1.9 | 6.20 | V100 | 75.90 | 77.86 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes_20201225_021458-3deefc62.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes-20201225_021458.log.json) | +| PSPNet | R-50-D8 | 769x769 | 80000 | - | - | V100 | 79.59 | 80.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121-5ccf03dd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121.log.json) | +| PSPNet | R-101-D8 | 769x769 | 80000 | - | - | V100 | 79.77 | 81.06 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.oz1z1penmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055-dba412fa.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055.log.json) | +| PSPNet | R-18b-D8 | 512x1024 | 80000 | 1.5 | 16.28 | V100 | 74.23 | 75.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes_20201226_063116-26928a60.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes-20201226_063116.log.json) | +| PSPNet | R-50b-D8 | 512x1024 | 80000 | 6.0 | 4.30 | V100 | 78.22 | 79.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes_20201225_094315-6344287a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes-20201225_094315.log.json) | +| PSPNet | R-101b-D8 | 512x1024 | 80000 | 9.5 | 2.76 | V100 | 79.69 | 80.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json) | +| PSPNet | R-18b-D8 | 769x769 | 80000 | 1.7 | 6.41 | V100 | 74.92 | 76.90 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes_20201226_080942-bf98d186.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes-20201226_080942.log.json) | +| PSPNet | R-50b-D8 | 769x769 | 80000 | 6.8 | 1.88 | V100 | 78.50 | 79.96 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes_20201225_094316-4c643cf6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes-20201225_094316.log.json) | +| PSPNet | R-101b-D8 | 769x769 | 80000 | 10.8 | 1.17 | V100 | 78.87 | 80.04 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes_20201226_171823-f0e7c293.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes-20201226_171823.log.json) | +| PSPNet | R-50-D32 | 512x1024 | 80000 | 3.0 | 15.21 | V100 | 73.88 | 76.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_512x1024_80k_cityscapes/pspnet_r50-d32_512x1024_80k_cityscapes_20220316_224840-9092b254.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_512x1024_80k_cityscapes/pspnet_r50-d32_512x1024_80k_cityscapes_20220316_224840.log.json) | +| PSPNet | R-50b-D32 rsb | 512x1024 | 80000 | 3.1 | 16.08 | V100 | 74.09 | 77.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220316_141229-dd9c9610.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220316_141229.log.json) | +| PSPNet | R-50b-D32 | 512x1024 | 80000 | 2.9 | 15.41 | V100 | 72.61 | 75.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d32_512x1024_80k_cityscapes/pspnet_r50b-d32_512x1024_80k_cityscapes_20220311_152152-23bcaf8c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d32_512x1024_80k_cityscapes/pspnet_r50b-d32_512x1024_80k_cityscapes_20220311_152152.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-50-D8 | 512x512 | 80000 | 8.5 | 23.53 | V100 | 41.13 | 41.94 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128-15a8b914.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 12 | 15.30 | V100 | 43.57 | 44.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423-b6e782f0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423.log.json) | +| PSPNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 42.48 | 43.44 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358.log.json) | +| PSPNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 44.39 | 45.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-50-D8 | 512x512 | 20000 | 6.1 | 23.59 | V100 | 76.78 | 77.61 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958-ed5dfbd9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958.log.json) | +| PSPNet | R-101-D8 | 512x512 | 20000 | 9.6 | 15.02 | V100 | 78.47 | 79.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003-4aef3c9a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003.log.json) | +| PSPNet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 77.29 | 78.48 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222-ae9c1b8c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json) | +| PSPNet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 78.52 | 79.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222-bc933b18.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-101-D8 | 480x480 | 40000 | 8.8 | 9.68 | V100 | 46.60 | 47.78 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context_20200911_211210-bf0f5d7c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context-20200911_211210.log.json) | +| PSPNet | R-101-D8 | 480x480 | 80000 | - | - | V100 | 46.03 | 47.15 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context_20200911_190530-c86d6233.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context-20200911_190530.log.json) | + +### Pascal Context 59 + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-101-D8 | 480x480 | 40000 | - | - | V100 | 52.02 | 53.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context_59/pspnet_r101-d8_480x480_40k_pascal_context_59_20210416_114524-86d44cd4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context_59/pspnet_r101-d8_480x480_40k_pascal_context_59-20210416_114524.log.json) | +| PSPNet | R-101-D8 | 480x480 | 80000 | - | - | V100 | 52.47 | 53.99 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context_59/pspnet_r101-d8_480x480_80k_pascal_context_59_20210416_114418-fa6caaa2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context_59/pspnet_r101-d8_480x480_80k_pascal_context_59-20210416_114418.log.json) | + +### Dark Zurich and Nighttime Driving + +We support evaluation results on these two datasets using models above trained on Cityscapes training set. + +| Method | Backbone | Training Dataset | Test Dataset | mIoU | config | evaluation checkpoint | +| ------ | --------- | ----------------------- | ------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| PSPNet | R-50-D8 | Cityscapes Training set | Dark Zurich | 10.91 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json) | +| PSPNet | R-50-D8 | Cityscapes Training set | Nighttime Driving | 23.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json) | +| PSPNet | R-50-D8 | Cityscapes Training set | Cityscapes Validation set | 77.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json) | +| PSPNet | R-101-D8 | Cityscapes Training set | Dark Zurich | 10.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json) | +| PSPNet | R-101-D8 | Cityscapes Training set | Nighttime Driving | 20.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json) | +| PSPNet | R-101-D8 | Cityscapes Training set | Cityscapes Validation set | 78.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json) | +| PSPNet | R-101b-D8 | Cityscapes Training set | Dark Zurich | 15.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json) | +| PSPNet | R-101b-D8 | Cityscapes Training set | Nighttime Driving | 22.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json) | +| PSPNet | R-101b-D8 | Cityscapes Training set | Cityscapes Validation set | 79.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json) | + +### COCO-Stuff 10k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-50-D8 | 512x512 | 20000 | 9.6 | 20.5 | V100 | 35.69 | 36.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k_20210820_203258-b88df27f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k_20210820_203258.log.json) | +| PSPNet | R-101-D8 | 512x512 | 20000 | 13.2 | 11.1 | V100 | 37.26 | 38.52 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k_20210820_232135-76aae482.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k_20210820_232135.log.json) | +| PSPNet | R-50-D8 | 512x512 | 40000 | - | - | V100 | 36.33 | 37.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_030857-92e2902b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_030857.log.json) | +| PSPNet | R-101-D8 | 512x512 | 40000 | - | - | V100 | 37.76 | 38.86 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_014022-831aec95.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_014022.log.json) | + +### COCO-Stuff 164k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-50-D8 | 512x512 | 80000 | 9.6 | 20.5 | V100 | 38.80 | 39.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034-0e41b2db.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 13.2 | 11.1 | V100 | 40.34 | 40.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034-7eb41789.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034.log.json) | +| PSPNet | R-50-D8 | 512x512 | 160000 | - | - | V100 | 39.64 | 39.97 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004-51276a57.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004.log.json) | +| PSPNet | R-101-D8 | 512x512 | 160000 | - | - | V100 | 41.28 | 41.66 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004-4af9621b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004.log.json) | +| PSPNet | R-50-D8 | 512x512 | 320000 | - | - | V100 | 40.53 | 40.75 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004-be9610cc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004.log.json) | +| PSPNet | R-101-D8 | 512x512 | 320000 | - | - | V100 | 41.95 | 42.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004-72220c60.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004.log.json) | + +### LoveDA + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| PSPNet | R-18-D8 | 512x512 | 80000 | 1.45 | 26.87 | V100 | 48.62 | 47.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18-d8_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x512_80k_loveda/pspnet_r18-d8_512x512_80k_loveda_20211105_052100-b97697f1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x512_80k_loveda/pspnet_r18-d8_512x512_80k_loveda_20211105_052100.log.json) | +| PSPNet | R-50-D8 | 512x512 | 80000 | 6.14 | 6.60 | V100 | 50.46 | 50.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_loveda/pspnet_r50-d8_512x512_80k_loveda_20211104_155728-88610f9f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_loveda/pspnet_r50-d8_512x512_80k_loveda_20211104_155728.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 9.61 | 4.58 | V100 | 51.86 | 51.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_loveda-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_loveda/pspnet_r101-d8_512x512_80k_loveda_20211104_153212-1c06c6a8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_loveda/pspnet_r101-d8_512x512_80k_loveda_20211104_153212.log.json) | + +### Potsdam + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-18-D8 | 512x512 | 80000 | 1.50 | 85.12 | V100 | 77.09 | 78.30 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_potsdam/pspnet_r18-d8_4x4_512x512_80k_potsdam_20211220_125612-7cd046e1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_potsdam/pspnet_r18-d8_4x4_512x512_80k_potsdam_20211220_125612.log.json) | +| PSPNet | R-50-D8 | 512x512 | 80000 | 6.14 | 30.21 | V100 | 78.12 | 78.98 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_potsdam/pspnet_r50-d8_4x4_512x512_80k_potsdam_20211219_043541-2dd5fe67.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_potsdam/pspnet_r50-d8_4x4_512x512_80k_potsdam_20211219_043541.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 9.61 | 19.40 | V100 | 78.62 | 79.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_potsdam-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_potsdam/pspnet_r101-d8_4x4_512x512_80k_potsdam_20211220_125612-aed036c4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_potsdam/pspnet_r101-d8_4x4_512x512_80k_potsdam_20211220_125612.log.json) | + +### Vaihingen + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-18-D8 | 512x512 | 80000 | 1.45 | 85.06 | V100 | 71.46 | 73.36 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18-d8_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_vaihingen/pspnet_r18-d8_4x4_512x512_80k_vaihingen_20211228_160355-52a8a6f6.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_vaihingen/pspnet_r18-d8_4x4_512x512_80k_vaihingen_20211228_160355.log.json) | +| PSPNet | R-50-D8 | 512x512 | 80000 | 6.14 | 30.29 | V100 | 72.36 | 73.75 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_vaihingen/pspnet_r50-d8_4x4_512x512_80k_vaihingen_20211228_160355-382f8f5b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_vaihingen/pspnet_r50-d8_4x4_512x512_80k_vaihingen_20211228_160355.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 9.61 | 19.97 | V100 | 72.61 | 74.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r101-d8_4xb4-80k_vaihingen-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_vaihingen/pspnet_r101-d8_4x4_512x512_80k_vaihingen_20211231_230806-8eba0a09.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_vaihingen/pspnet_r101-d8_4x4_512x512_80k_vaihingen_20211231_230806.log.json) | + +### iSAID + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PSPNet | R-18-D8 | 896x896 | 80000 | 4.52 | 26.91 | V100 | 60.22 | 61.25 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r18-d8_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_896x896_80k_isaid/pspnet_r18-d8_4x4_896x896_80k_isaid_20220110_180526-e84c0b6a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_896x896_80k_isaid/pspnet_r18-d8_4x4_896x896_80k_isaid_20220110_180526.log.json) | +| PSPNet | R-50-D8 | 896x896 | 80000 | 16.58 | 8.88 | V100 | 65.36 | 66.48 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet/pspnet_r50-d8_4xb4-80k_isaid-896x896.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_896x896_80k_isaid/pspnet_r50-d8_4x4_896x896_80k_isaid_20220110_180629-1f21dc32.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_896x896_80k_isaid/pspnet_r50-d8_4x4_896x896_80k_isaid_20220110_180629.log.json) | + +Note: + +- `FP16` means Mixed Precision (FP16) is adopted in training. +- `896x896` is the Crop Size of iSAID dataset, which is followed by the implementation of [PointFlow: Flowing Semantics Through Points for Aerial Image Segmentation](https://arxiv.org/pdf/2103.06564.pdf) +- `rsb` is short for 'Resnet strikes back'. +- The `b` in `R-50b` means ResNetV1b, which is a standard ResNet backbone. In MMSegmentation, default backbone is ResNetV1c, which usually performs better in semantic segmentation task. + +## Citation + +```bibtex +@inproceedings{zhao2017pspnet, + title={Pyramid Scene Parsing Network}, + author={Zhao, Hengshuang and Shi, Jianping and Qi, Xiaojuan and Wang, Xiaogang and Jia, Jiaya}, + booktitle={CVPR}, + year={2017} +} +``` + +```bibtex +@article{wightman2021resnet, + title={Resnet strikes back: An improved training procedure in timm}, + author={Wightman, Ross and Touvron, Hugo and J{\'e}gou, Herv{\'e}}, + journal={arXiv preprint arXiv:2110.00476}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/pspnet/metafile.yaml b/mmsegmentation/configs/pspnet/metafile.yaml new file mode 100644 index 0000000..d00b89d --- /dev/null +++ b/mmsegmentation/configs/pspnet/metafile.yaml @@ -0,0 +1,1303 @@ +Collections: +- Name: PSPNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + - Pascal Context + - Pascal Context 59 + - Dark Zurich and Nighttime Driving + - COCO-Stuff 10k + - COCO-Stuff 164k + - LoveDA + - Potsdam + - Vaihingen + - iSAID + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + README: configs/pspnet/README.md + Frameworks: + - PyTorch +Models: +- Name: pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.85 + mIoU(ms+flip): 79.18 + Config: configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb2-40k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.34 + mIoU(ms+flip): 79.74 + Config: configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb2-40k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.26 + mIoU(ms+flip): 79.88 + Config: configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725-86638686.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb2-40k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.08 + mIoU(ms+flip): 80.28 + Config: configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753-61c6f5be.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.87 + mIoU(ms+flip): 76.04 + Config: configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes_20201225_021458-09ffa746.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes-20201225_021458.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.55 + mIoU(ms+flip): 79.79 + Config: configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.47 + mIoU(ms+flip): 79.45 + Config: configs/pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220315_123238-588c30be.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220315_123238.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.76 + mIoU(ms+flip): 81.01 + Config: configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.46 + Config: configs/pspnet/pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSPNet + - (FP16) + Training Resources: 4x V100 GPUS + Memory (GB): 5.34 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_fp16_512x1024_80k_cityscapes/pspnet_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230919-a0875e5c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_fp16_512x1024_80k_cityscapes/pspnet_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230919.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.9 + mIoU(ms+flip): 77.86 + Config: configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes_20201225_021458-3deefc62.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes-20201225_021458.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.59 + mIoU(ms+flip): 80.69 + Config: configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121-5ccf03dd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.77 + mIoU(ms+flip): 81.06 + Config: configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.oz1z1penmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055-dba412fa.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.23 + mIoU(ms+flip): 75.79 + Config: configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes_20201226_063116-26928a60.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes-20201226_063116.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.22 + mIoU(ms+flip): 79.46 + Config: configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes_20201225_094315-6344287a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes-20201225_094315.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.69 + mIoU(ms+flip): 80.79 + Config: configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18b-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.92 + mIoU(ms+flip): 76.9 + Config: configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-18b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.7 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes_20201226_080942-bf98d186.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes-20201226_080942.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50b-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.5 + mIoU(ms+flip): 79.96 + Config: configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes_20201225_094316-4c643cf6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes-20201225_094316.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101b-d8_4xb2-80k_cityscapes-769x769 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.87 + mIoU(ms+flip): 80.04 + Config: configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101b-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 10.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes_20201226_171823-f0e7c293.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes-20201226_171823.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.88 + mIoU(ms+flip): 76.85 + Config: configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50-D32 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 3.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_512x1024_80k_cityscapes/pspnet_r50-d32_512x1024_80k_cityscapes_20220316_224840-9092b254.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_512x1024_80k_cityscapes/pspnet_r50-d32_512x1024_80k_cityscapes_20220316_224840.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.09 + mIoU(ms+flip): 77.18 + Config: configs/pspnet/pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D32 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 3.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220316_141229-dd9c9610.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes_20220316_141229.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 72.61 + mIoU(ms+flip): 75.51 + Config: configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50b-D32 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 2.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d32_512x1024_80k_cityscapes/pspnet_r50b-d32_512x1024_80k_cityscapes_20220311_152152-23bcaf8c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d32_512x1024_80k_cityscapes/pspnet_r50b-d32_512x1024_80k_cityscapes_20220311_152152.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-80k_ade20k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.13 + mIoU(ms+flip): 41.94 + Config: configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128-15a8b914.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_ade20k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.57 + mIoU(ms+flip): 44.35 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 12.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423-b6e782f0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-160k_ade20k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.48 + mIoU(ms+flip): 43.44 + Config: configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-160k_ade20k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.39 + mIoU(ms+flip): 45.35 + Config: configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-20k_voc12aug-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 76.78 + mIoU(ms+flip): 77.61 + Config: configs/pspnet/pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958-ed5dfbd9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-20k_voc12aug-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.47 + mIoU(ms+flip): 79.25 + Config: configs/pspnet/pspnet_r101-d8_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003-4aef3c9a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-40k_voc12aug-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.29 + mIoU(ms+flip): 78.48 + Config: configs/pspnet/pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222-ae9c1b8c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-40k_voc12aug-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 78.52 + mIoU(ms+flip): 79.57 + Config: configs/pspnet/pspnet_r101-d8_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222-bc933b18.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-40k_pascal-context-480x480 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 46.6 + mIoU(ms+flip): 47.78 + Config: configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context_20200911_211210-bf0f5d7c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context-20200911_211210.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_pascal-context-480x480 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal Context + Metrics: + mIoU: 46.03 + mIoU(ms+flip): 47.15 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-480x480.py + Metadata: + Training Data: Pascal Context + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context_20200911_190530-c86d6233.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context-20200911_190530.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 52.02 + mIoU(ms+flip): 53.54 + Config: configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context_59/pspnet_r101-d8_480x480_40k_pascal_context_59_20210416_114524-86d44cd4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context_59/pspnet_r101-d8_480x480_40k_pascal_context_59-20210416_114524.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Pascal Context 59 + Metrics: + mIoU: 52.47 + mIoU(ms+flip): 53.99 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480.py + Metadata: + Training Data: Pascal Context 59 + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context_59/pspnet_r101-d8_480x480_80k_pascal_context_59_20210416_114418-fa6caaa2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context_59/pspnet_r101-d8_480x480_80k_pascal_context_59-20210416_114418.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 35.69 + mIoU(ms+flip): 36.62 + Config: configs/pspnet/pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k_20210820_203258-b88df27f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k_20210820_203258.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 37.26 + mIoU(ms+flip): 38.52 + Config: configs/pspnet/pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 13.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k_20210820_232135-76aae482.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k_20210820_232135.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 36.33 + mIoU(ms+flip): 37.24 + Config: configs/pspnet/pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_030857-92e2902b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k_20210821_030857.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 10k + Metrics: + mIoU: 37.76 + mIoU(ms+flip): 38.86 + Config: configs/pspnet/pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512.py + Metadata: + Training Data: COCO-Stuff 10k + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_014022-831aec95.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k_20210821_014022.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 38.8 + mIoU(ms+flip): 39.19 + Config: configs/pspnet/pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034-0e41b2db.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 40.34 + mIoU(ms+flip): 40.79 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 13.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034-7eb41789.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k_20210707_152034.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 39.64 + mIoU(ms+flip): 39.97 + Config: configs/pspnet/pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004-51276a57.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 41.28 + mIoU(ms+flip): 41.66 + Config: configs/pspnet/pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004-4af9621b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k_20210707_152004.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 40.53 + mIoU(ms+flip): 40.75 + Config: configs/pspnet/pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004-be9610cc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 41.95 + mIoU(ms+flip): 42.42 + Config: configs/pspnet/pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004-72220c60.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k_20210707_152004.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18-d8_4xb4-80k_loveda-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 48.62 + mIoU(ms+flip): 47.57 + Config: configs/pspnet/pspnet_r18-d8_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - R-18-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.45 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x512_80k_loveda/pspnet_r18-d8_512x512_80k_loveda_20211105_052100-b97697f1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x512_80k_loveda/pspnet_r18-d8_512x512_80k_loveda_20211105_052100.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-80k_loveda-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 50.46 + mIoU(ms+flip): 50.19 + Config: configs/pspnet/pspnet_r50-d8_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.14 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_loveda/pspnet_r50-d8_512x512_80k_loveda_20211104_155728-88610f9f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_loveda/pspnet_r50-d8_512x512_80k_loveda_20211104_155728.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_loveda-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: LoveDA + Metrics: + mIoU: 51.86 + mIoU(ms+flip): 51.34 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_loveda-512x512.py + Metadata: + Training Data: LoveDA + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.61 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_loveda/pspnet_r101-d8_512x512_80k_loveda_20211104_153212-1c06c6a8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_loveda/pspnet_r101-d8_512x512_80k_loveda_20211104_153212.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18-d8_4xb4-80k_potsdam-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 77.09 + mIoU(ms+flip): 78.3 + Config: configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - R-18-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_potsdam/pspnet_r18-d8_4x4_512x512_80k_potsdam_20211220_125612-7cd046e1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_potsdam/pspnet_r18-d8_4x4_512x512_80k_potsdam_20211220_125612.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-80k_potsdam-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 78.12 + mIoU(ms+flip): 78.98 + Config: configs/pspnet/pspnet_r50-d8_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.14 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_potsdam/pspnet_r50-d8_4x4_512x512_80k_potsdam_20211219_043541-2dd5fe67.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_potsdam/pspnet_r50-d8_4x4_512x512_80k_potsdam_20211219_043541.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_potsdam-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Potsdam + Metrics: + mIoU: 78.62 + mIoU(ms+flip): 79.47 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_potsdam-512x512.py + Metadata: + Training Data: Potsdam + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.61 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_potsdam/pspnet_r101-d8_4x4_512x512_80k_potsdam_20211220_125612-aed036c4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_potsdam/pspnet_r101-d8_4x4_512x512_80k_potsdam_20211220_125612.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18-d8_4xb4-80k_vaihingen-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 71.46 + mIoU(ms+flip): 73.36 + Config: configs/pspnet/pspnet_r18-d8_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - R-18-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.45 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_vaihingen/pspnet_r18-d8_4x4_512x512_80k_vaihingen_20211228_160355-52a8a6f6.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_512x512_80k_vaihingen/pspnet_r18-d8_4x4_512x512_80k_vaihingen_20211228_160355.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-80k_vaihingen-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 72.36 + mIoU(ms+flip): 73.75 + Config: configs/pspnet/pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.14 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_vaihingen/pspnet_r50-d8_4x4_512x512_80k_vaihingen_20211228_160355-382f8f5b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_512x512_80k_vaihingen/pspnet_r50-d8_4x4_512x512_80k_vaihingen_20211228_160355.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r101-d8_4xb4-80k_vaihingen-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Vaihingen + Metrics: + mIoU: 72.61 + mIoU(ms+flip): 74.18 + Config: configs/pspnet/pspnet_r101-d8_4xb4-80k_vaihingen-512x512.py + Metadata: + Training Data: Vaihingen + Batch Size: 16 + Architecture: + - R-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.61 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_vaihingen/pspnet_r101-d8_4x4_512x512_80k_vaihingen_20211231_230806-8eba0a09.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_4x4_512x512_80k_vaihingen/pspnet_r101-d8_4x4_512x512_80k_vaihingen_20211231_230806.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r18-d8_4xb4-80k_isaid-896x896 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 60.22 + mIoU(ms+flip): 61.25 + Config: configs/pspnet/pspnet_r18-d8_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - R-18-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 4.52 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_896x896_80k_isaid/pspnet_r18-d8_4x4_896x896_80k_isaid_20220110_180526-e84c0b6a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_4x4_896x896_80k_isaid/pspnet_r18-d8_4x4_896x896_80k_isaid_20220110_180526.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch +- Name: pspnet_r50-d8_4xb4-80k_isaid-896x896 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: iSAID + Metrics: + mIoU: 65.36 + mIoU(ms+flip): 66.48 + Config: configs/pspnet/pspnet_r50-d8_4xb4-80k_isaid-896x896.py + Metadata: + Training Data: iSAID + Batch Size: 16 + Architecture: + - R-50-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 16.58 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_896x896_80k_isaid/pspnet_r50-d8_4x4_896x896_80k_isaid_20220110_180629-1f21dc32.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_4x4_896x896_80k_isaid/pspnet_r50-d8_4x4_896x896_80k_isaid_20220110_180629.log.json + Paper: + Title: Pyramid Scene Parsing Network + URL: https://arxiv.org/abs/1612.01105 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/psp_head.py#L63 + Framework: PyTorch diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..f33d653 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py new file mode 100644 index 0000000..5babaa8 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py' # noqa +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py new file mode 100644 index 0000000..a9480c5 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py' # noqa +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..e05cff6 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..6704cdd --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..3733e69 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..52f86b5 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py @@ -0,0 +1,6 @@ +_base_ = './pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py' +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005), + loss_scale=512.) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..2231049 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..f5390f8 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..84a986c --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_coco-stuff10k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..71897dd --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..ebaea36 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-320k_coco-stuff164k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..2a55f53 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_coco-stuff10k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..205d00b --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-40k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..0d7c176 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-40k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..0599f31 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..f955603 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..4a34f97 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_coco-stuff164k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..7076877 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_loveda-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..0ac40dc --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_pascal-context-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..307188c --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_pascal-context-59-480x480.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..31ed2f2 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_potsdam-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..ac33ed7 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101-d8_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..d2c0f69 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py new file mode 100644 index 0000000..b181744 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py' # noqa +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py new file mode 100644 index 0000000..6a8994b --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py' # noqa +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..891bfd5 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r101b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..a4b342e --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..0e7f3e9 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..efce7a0 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_isaid-896x896.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_isaid-896x896.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..80e2d20 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_loveda-512x512.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..1ef0585 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_potsdam-512x512.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..51e66d2 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..2e356c5 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..831354d --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r18b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d32_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50-d32_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5700b5b --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d32_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(dilations=(1, 1, 2, 4), strides=(1, 2, 2, 2))) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..1390329 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d32_rsb_4xb2-adamw-80k_cityscapes-512x1024.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='ResNet', + init_cfg=dict( + type='Pretrained', prefix='backbone.', checkpoint=checkpoint), + dilations=(1, 1, 2, 4), + strides=(1, 2, 2, 2))) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0005, weight_decay=0.05), + clip_grad=dict(max_norm=1, norm_type=2)) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + by_epoch=False, + milestones=[60000, 72000], + ) +] diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..b83a0b4 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8-rsb_4xb2-adamw-80k_cityscapes-512x1024.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='ResNet', + init_cfg=dict( + type='Pretrained', prefix='backbone.', checkpoint=checkpoint))) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0005, weight_decay=0.05), + clip_grad=dict(max_norm=1, norm_type=2)) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, + end=1000), + dict( + type='MultiStepLR', + begin=1000, + end=80000, + by_epoch=False, + milestones=[60000, 72000], + ) +] diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..a9dcb52 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py new file mode 100644 index 0000000..1bf4a13 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_dark-zurich-1920x1080.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(1920, 1080), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +test_dataloader = dict( + dataset=dict( + type='DarkZurichDataset', + data_root='data/dark_zurich/', + data_prefix=dict( + img_path='rgb_anon/val/night/GOPR0356', + seg_map_path='gt/val/night/GOPR0356'), + pipeline=test_pipeline)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py new file mode 100644 index 0000000..b912589 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024_night-driving-1920x1080.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(1920, 1080), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +test_dataloader = dict( + dataset=dict( + type='NightDrivingDataset', + data_root='data/NighttimeDrivingTest/', + data_prefix=dict( + img_path='leftImg8bit/test/night', + seg_map_path='gtCoarse_daytime_trainvaltest/test/night'), + pipeline=test_pipeline)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..6baa31b --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..6ea27de --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py new file mode 100644 index 0000000..200679f --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_dark-zurich-1920x1080.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(1920, 1080), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +test_dataloader = dict( + dataset=dict( + type='DarkZurichDataset', + data_root='data/dark_zurich/', + data_prefix=dict( + img_path='rgb_anon/val/night/GOPR0356', + seg_map_path='gt/val/night/GOPR0356'), + pipeline=test_pipeline)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py new file mode 100644 index 0000000..5173813 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024_night-driving-1920x1080.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(1920, 1080), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +test_dataloader = dict( + dataset=dict( + type='NightDrivingDataset', + data_root='data/NighttimeDrivingTest/', + data_prefix=dict( + img_path='leftImg8bit/test/night', + seg_map_path='gtCoarse_daytime_trainvaltest/test/night'), + pipeline=test_pipeline)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..d43d30a --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..3d9164f --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..6185c2e --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-160k_coco-stuff164k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..8c1ba2d --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_coco-stuff10k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/coco-stuff10k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..0f60819 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..2a9ce4c --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-320k_coco-stuff164k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_320k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py new file mode 100644 index 0000000..fae57b0 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_coco-stuff10k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/coco-stuff10k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-480x480.py new file mode 100644 index 0000000..08a2144 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-59-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-59-480x480.py new file mode 100644 index 0000000..b654495 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..c4a4611 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..bb12aed --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py new file mode 100644 index 0000000..954a653 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_coco-stuff164k-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=171), + auxiliary_head=dict(num_classes=171)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_isaid-896x896.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_isaid-896x896.py new file mode 100644 index 0000000..63165b6 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_isaid-896x896.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/isaid.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (896, 896) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=16), + auxiliary_head=dict(num_classes=16)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_loveda-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000..920729d --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/loveda.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=7), + auxiliary_head=dict(num_classes=7)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-480x480.py new file mode 100644 index 0000000..a7d8247 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-59-480x480.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-59-480x480.py new file mode 100644 index 0000000..b7abc1b --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_pascal-context-59-480x480.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (480, 480) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=59), + auxiliary_head=dict(num_classes=59), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_potsdam-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_potsdam-512x512.py new file mode 100644 index 0000000..afb3977 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_potsdam-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/potsdam.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=dict(num_classes=6)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py new file mode 100644 index 0000000..35322d2 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50-d8_4xb4-80k_vaihingen-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/vaihingen.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=dict(num_classes=6)) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..64e5509 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50b-d32_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='torchvision://resnet50', + backbone=dict(type='ResNet', dilations=(1, 1, 2, 4), strides=(1, 2, 2, 2))) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..7dd64b3 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..3875c09 --- /dev/null +++ b/mmsegmentation/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/mmsegmentation/configs/resnest/README.md b/mmsegmentation/configs/resnest/README.md new file mode 100644 index 0000000..304791a --- /dev/null +++ b/mmsegmentation/configs/resnest/README.md @@ -0,0 +1,54 @@ +# ResNeSt + +> [ResNeSt: Split-Attention Networks](https://arxiv.org/abs/2004.08955) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +It is well known that featuremap attention and multi-path representation are important for visual recognition. In this paper, we present a modularized architecture, which applies the channel-wise attention on different network branches to leverage their success in capturing cross-feature interactions and learning diverse representations. Our design results in a simple and unified computation block, which can be parameterized using only a few variables. Our model, named ResNeSt, outperforms EfficientNet in accuracy and latency trade-off on image classification. In addition, ResNeSt has achieved superior transfer learning results on several public benchmarks serving as the backbone, and has been adopted by the winning entries of COCO-LVIS challenge. The source code for complete system and pretrained models are publicly available. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | S-101-D8 | 512x1024 | 80000 | 11.4 | 2.39 | V100 | 77.56 | 78.98 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes_20200807_140631-f8d155b3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json) | +| PSPNet | S-101-D8 | 512x1024 | 80000 | 11.8 | 2.52 | V100 | 78.57 | 79.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json) | +| DeepLabV3 | S-101-D8 | 512x1024 | 80000 | 11.9 | 1.88 | V100 | 79.67 | 80.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes_20200807_144429-b73c4270.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json) | +| DeepLabV3+ | S-101-D8 | 512x1024 | 80000 | 13.2 | 2.36 | V100 | 79.62 | 80.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes_20200807_144429-1239eb43.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | S-101-D8 | 512x512 | 160000 | 14.2 | 12.86 | V100 | 45.62 | 46.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k_20200807_145416-d3160329.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k-20200807_145416.log.json) | +| PSPNet | S-101-D8 | 512x512 | 160000 | 14.2 | 13.02 | V100 | 45.44 | 46.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k-20200807_145416.log.json) | +| DeepLabV3 | S-101-D8 | 512x512 | 160000 | 14.6 | 9.28 | V100 | 45.71 | 46.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k_20200807_144503-17ecabe5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k-20200807_144503.log.json) | +| DeepLabV3+ | S-101-D8 | 512x512 | 160000 | 16.2 | 11.96 | V100 | 46.47 | 47.27 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k_20200807_144503-27b26226.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k-20200807_144503.log.json) | + +## Citation + +```bibtex +@article{zhang2020resnest, +title={ResNeSt: Split-Attention Networks}, +author={Zhang, Hang and Wu, Chongruo and Zhang, Zhongyue and Zhu, Yi and Zhang, Zhi and Lin, Haibin and Sun, Yue and He, Tong and Muller, Jonas and Manmatha, R. and Li, Mu and Smola, Alexander}, +journal={arXiv preprint arXiv:2004.08955}, +year={2020} +} +``` diff --git a/mmsegmentation/configs/resnest/metafile.yaml b/mmsegmentation/configs/resnest/metafile.yaml new file mode 100644 index 0000000..0b8d41e --- /dev/null +++ b/mmsegmentation/configs/resnest/metafile.yaml @@ -0,0 +1,193 @@ +Models: +- Name: resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.56 + mIoU(ms+flip): 78.98 + Config: configs/resnest/resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - S-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 11.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes_20200807_140631-f8d155b3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.57 + mIoU(ms+flip): 79.19 + Config: configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - S-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 11.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.67 + mIoU(ms+flip): 80.51 + Config: configs/resnest/resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - S-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 11.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes_20200807_144429-b73c4270.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.62 + mIoU(ms+flip): 80.27 + Config: configs/resnest/resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - S-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 13.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes_20200807_144429-1239eb43.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512 + In Collection: FCN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.62 + mIoU(ms+flip): 46.16 + Config: configs/resnest/resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - S-101-D8 + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 14.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k_20200807_145416-d3160329.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k-20200807_145416.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512 + In Collection: PSPNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.44 + mIoU(ms+flip): 46.28 + Config: configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - S-101-D8 + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 14.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k-20200807_145416.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3 + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.71 + mIoU(ms+flip): 46.59 + Config: configs/resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - S-101-D8 + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 14.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k_20200807_144503-17ecabe5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k-20200807_144503.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch +- Name: resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512 + In Collection: DeepLabV3+ + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.47 + mIoU(ms+flip): 47.27 + Config: configs/resnest/resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - S-101-D8 + - DeepLabV3+ + Training Resources: 4x V100 GPUS + Memory (GB): 16.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k_20200807_144503-27b26226.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k-20200807_144503.log.json + Paper: + Title: 'ResNeSt: Split-Attention Networks' + URL: https://arxiv.org/abs/2004.08955 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/resnest.py#L271 + Framework: PyTorch diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..7ece894 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..c285230 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5c43a95 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py' # noqa +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..ce39d37 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_deeplabv3plus_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..fc333e4 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,9 @@ +_base_ = '../fcn/fcn_r101-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..af12733 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_fcn_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = '../fcn/fcn_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py b/mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py new file mode 100644 index 0000000..3aab524 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py @@ -0,0 +1,9 @@ +_base_ = '../pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..66e6639 --- /dev/null +++ b/mmsegmentation/configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = '../pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/mmsegmentation/configs/san/README.md b/mmsegmentation/configs/san/README.md new file mode 100644 index 0000000..d9940eb --- /dev/null +++ b/mmsegmentation/configs/san/README.md @@ -0,0 +1,47 @@ +# SAN + +> [Side Adapter Network for Open-Vocabulary Semantic Segmentation](https://arxiv.org/abs/2302.12242) + +## Introduction + + + +Official Repo + +## Abstract + + + +This paper presents a new framework for open-vocabulary semantic segmentation with the pre-trained vision-language model, named Side Adapter Network (SAN). Our approach models the semantic segmentation task as a region recognition problem. A side network is attached to a frozen CLIP model with two branches: one for predicting mask proposals, and the other for predicting attention bias which is applied in the CLIP model to recognize the class of masks. This decoupled design has the benefit CLIP in recognizing the class of mask proposals. Since the attached side network can reuse CLIP features, it can be very light. In addition, the entire network can be trained end-to-end, allowing the side network to be adapted to the frozen CLIP model, which makes the predicted mask proposals CLIP-aware. Our approach is fast, accurate, and only adds a few additional trainable parameters. We evaluate our approach on multiple semantic segmentation benchmarks. Our method significantly outperforms other counterparts, with up to 18 times fewer trainable parameters and 19 times faster inference speed. We hope our approach will serve as a solid baseline and help ease future research in open-vocabulary semantic segmentation. + + + +
+ +
+ +## Results and models + +### COCO-Stuff164k + +| Method | Backbone | Pretrained | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | ------------ | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| SAN | ViT-B_16 | CLIP_ViT-B16 | 640x640 | 60000 | 12.61 | - | V100 | 41.93 | 41.77 | https://github.com/open-mmlab/mmsegmentation/blob/main/configs/san/san-vit-b16_coco-stuff164k-640x640.py | [model](https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-b16_20230906-fd0a7684.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-b16_20230906.log) | +| SAN | ViT-L_14 | CLIP_ViT-L14 | 640x640 | 60000 | 22.84 | - | V100 | 45.78 | 43.99 | https://github.com/open-mmlab/mmsegmentation/blob/main/configs/san/san-vit-l14_coco-stuff164k-640x640.py | [model](https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-l14_20230907-a11e098f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-l14_20230907.log) | + +## Notes + +git push +The pretrained weights in config files are converted from open_clip models using tools/model_converters/clip2mmseg.py. + +## Citation + +```bibtex +@inproceedings{xu2023side, + title={Side adapter network for open-vocabulary semantic segmentation}, + author={Xu, Mengde and Zhang, Zheng and Wei, Fangyun and Hu, Han and Bai, Xiang}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={2945--2954}, + year={2023} +} +``` diff --git a/mmsegmentation/configs/san/metafile.yaml b/mmsegmentation/configs/san/metafile.yaml new file mode 100644 index 0000000..117d088 --- /dev/null +++ b/mmsegmentation/configs/san/metafile.yaml @@ -0,0 +1,61 @@ +Collections: +- Name: SAN + License: Apache License 2.0 + Metadata: + Training Data: + - COCO-Stuff 164k + Paper: + Title: 'Side Adapter Network for Open-Vocabulary Semantic Segmentation' + URL: https://arxiv.org/abs/2302.12242 + README: configs/san/README.md + Frameworks: + - PyTorch +Models: +- Name: san-vit-b16_coco-stuff164k-640x640 + In Collection: SAN + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 41.93 + mIoU(ms+flip): 41.77 + Config: configs/san/san-vit-b16_coco-stuff164k-640x640.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - SAN + - ViT + Training Resources: 8x V100 GPUS + Memory (GB): 12.61 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-b16_20230906-fd0a7684.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-b16_20230906.log + Paper: + Title: 'Side Adapter Network for Open-Vocabulary Semantic Segmentation' + URL: https://arxiv.org/abs/2302.12242 + Code: https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/decode_heads/san_head.py#L470 + Framework: PyTorch +- Name: san-vit-l14_coco-stuff164k-640x640 + In Collection: SAN + Results: + Task: Semantic Segmentation + Dataset: COCO-Stuff 164k + Metrics: + mIoU: 45.78 + mIoU(ms+flip): 43.99 + Config: configs/san/san-vit-l14_coco-stuff164k-640x640.py + Metadata: + Training Data: COCO-Stuff 164k + Batch Size: 16 + Architecture: + - SAN + - ViT + Training Resources: 8x V100 GPUS + Memory (GB): 12.61 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-l14_20230907-a11e098f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/san/san-vit-l14_20230907.log + Paper: + Title: 'Side Adapter Network for Open-Vocabulary Semantic Segmentation' + URL: https://arxiv.org/abs/2302.12242 + Code: https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/decode_heads/san_head.py#L470 + Framework: PyTorch diff --git a/mmsegmentation/configs/san/san-vit-b16_coco-stuff164k-640x640.py b/mmsegmentation/configs/san/san-vit-b16_coco-stuff164k-640x640.py new file mode 100644 index 0000000..4059248 --- /dev/null +++ b/mmsegmentation/configs/san/san-vit-b16_coco-stuff164k-640x640.py @@ -0,0 +1,82 @@ +_base_ = [ + '../_base_/models/san_vit-b16.py', '../_base_/datasets/coco-stuff164k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomChoiceResize', + scales=[int(640 * x * 0.1) for x in range(5, 16)], + resize_type='ResizeShortestEdge', + max_size=2560), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=1.0), + dict(type='PhotoMetricDistortion'), + dict(type='RandomFlip', prob=0.5), + dict(type='PackSegInputs') +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeShortestEdge', scale=crop_size, max_size=2560), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] + +# By default, models are trained on 4 GPUs with 8 images per GPU +train_dataloader = dict(batch_size=8, dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(batch_size=1, dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/san/clip_vit-base-patch16-224_3rdparty-d08f8887.pth' # noqa +data_preprocessor = dict( + mean=[122.7709, 116.7460, 104.0937], + std=[68.5005, 66.6322, 70.3232], + size_divisor=640, + test_cfg=dict(size_divisor=32)) +model = dict( + pretrained=pretrained, + text_encoder=dict(dataset_name='coco-stuff164k'), + decode_head=dict(num_classes=171)) + +# training schedule for 60k +train_cfg = dict( + type='IterBasedTrainLoop', + max_iters=60000, + val_interval=500, + val_begin=55000) +default_hooks = dict( + checkpoint=dict( + type='CheckpointHook', + by_epoch=False, + interval=10000, + save_best='mIoU')) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.0001), + paramwise_cfg=dict( + custom_keys={ + 'img_encoder': dict(lr_mult=0.1, decay_mult=1.0), + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + }), + loss_scale='dynamic', + clip_grad=dict(max_norm=0.01, norm_type=2)) + +param_scheduler = [ + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=0, + end=60000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/san/san-vit-b16_pascal_context-640x640.py b/mmsegmentation/configs/san/san-vit-b16_pascal_context-640x640.py new file mode 100644 index 0000000..b164fe4 --- /dev/null +++ b/mmsegmentation/configs/san/san-vit-b16_pascal_context-640x640.py @@ -0,0 +1,56 @@ +_base_ = [ + '../_base_/models/san_vit-b16.py', + '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeShortestEdge', scale=crop_size, max_size=2560), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1, dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +data_preprocessor = dict( + mean=[122.7709, 116.7460, 104.0937], + std=[68.5005, 66.6322, 70.3232], + size_divisor=640, + test_cfg=dict(size_divisor=32)) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/vit_base_patch16_224.pth', + text_encoder=dict(dataset_name='pascal_context'), + decode_head=dict(num_classes=59)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/san/san-vit-b16_voc12aug-640x640.py b/mmsegmentation/configs/san/san-vit-b16_voc12aug-640x640.py new file mode 100644 index 0000000..62e9b26 --- /dev/null +++ b/mmsegmentation/configs/san/san-vit-b16_voc12aug-640x640.py @@ -0,0 +1,65 @@ +_base_ = [ + '../_base_/models/san_vit-b16.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) + +metainfo = dict( + classes=('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', + 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'), + palette=[[128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], + [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], + [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], + [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], + [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]]) +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeShortestEdge', scale=crop_size, max_size=2560), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict( + batch_size=1, dataset=dict(metainfo=metainfo, pipeline=test_pipeline)) +test_dataloader = val_dataloader + +data_preprocessor = dict( + mean=[122.7709, 116.7460, 104.0937], + std=[68.5005, 66.6322, 70.3232], + size_divisor=640, + test_cfg=dict(size_divisor=32)) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/vit_base_patch16_224.pth', + text_encoder=dict(dataset_name='voc'), + decode_head=dict(num_classes=20)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/san/san-vit-l14_coco-stuff164k-640x640.py b/mmsegmentation/configs/san/san-vit-l14_coco-stuff164k-640x640.py new file mode 100644 index 0000000..c34328d --- /dev/null +++ b/mmsegmentation/configs/san/san-vit-l14_coco-stuff164k-640x640.py @@ -0,0 +1,36 @@ +_base_ = ['./san-vit-b16_coco-stuff164k-640x640.py'] + +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/san/clip_vit-large-patch14-336_3rdparty-0b5df9cb.pth' # noqa +model = dict( + type='MultimodalEncoderDecoder', + pretrained=pretrained, + encoder_resolution=0.7, + image_encoder=dict( + type='VisionTransformer', + img_size=(336, 336), + patch_size=14, + patch_pad=0, + embed_dims=1024, + num_layers=18, + num_heads=16, + out_indices=(5, 11, 17), + ), + text_encoder=dict( + type='CLIPTextEncoder', + embed_dims=768, + num_layers=12, + num_heads=12, + output_dims=768, + ), + decode_head=dict( + type='SideAdapterCLIPHead', + san_cfg=dict(clip_channels=1024, cfg_decoder=dict(num_heads=16)), + maskgen_cfg=dict( + num_layers=6, + embed_dims=1024, + num_heads=16, + out_dims=768, + ))) + +# By default, models are trained on 8 GPUs with 4 images per GPU +train_dataloader = dict(batch_size=4) diff --git a/mmsegmentation/configs/san/san-vit-l14_pascal_context-640x640.py b/mmsegmentation/configs/san/san-vit-l14_pascal_context-640x640.py new file mode 100644 index 0000000..a9545fa --- /dev/null +++ b/mmsegmentation/configs/san/san-vit-l14_pascal_context-640x640.py @@ -0,0 +1,32 @@ +_base_ = ['./san-vit-b16_pascal_context-640x640.py'] + +model = dict( + type='MultimodalEncoderDecoder', + pretrained='pretrain/jx_vit_base_p16_224-80ecf9dd.pth', + encoder_resolution=0.7, + image_encoder=dict( + type='VisionTransformer', + img_size=(336, 336), + patch_size=14, + patch_pad=0, + embed_dims=1024, + num_layers=18, + num_heads=16, + out_indices=(5, 11, 17), + ), + text_encoder=dict( + type='CLIPTextEncoder', + embed_dims=768, + num_layers=12, + num_heads=12, + output_dims=768, + ), + decode_head=dict( + type='SideAdapterCLIPHead', + san_cfg=dict(clip_channels=1024, cfg_decoder=dict(num_heads=16)), + maskgen_cfg=dict( + num_layers=6, + embed_dims=1024, + num_heads=16, + out_dims=768, + ))) diff --git a/mmsegmentation/configs/san/san-vit-l14_voc12aug-640x640.py b/mmsegmentation/configs/san/san-vit-l14_voc12aug-640x640.py new file mode 100644 index 0000000..2f37715 --- /dev/null +++ b/mmsegmentation/configs/san/san-vit-l14_voc12aug-640x640.py @@ -0,0 +1,32 @@ +_base_ = ['./san-vit-b16_voc12aug-640x640.py'] + +model = dict( + type='MultimodalEncoderDecoder', + pretrained='pretrain/jx_vit_base_p16_224-80ecf9dd.pth', + encoder_resolution=0.7, + image_encoder=dict( + type='VisionTransformer', + img_size=(336, 336), + patch_size=14, + patch_pad=0, + embed_dims=1024, + num_layers=18, + num_heads=16, + out_indices=(5, 11, 17), + ), + text_encoder=dict( + type='CLIPTextEncoder', + embed_dims=768, + num_layers=12, + num_heads=12, + output_dims=768, + ), + decode_head=dict( + type='SideAdapterCLIPHead', + san_cfg=dict(clip_channels=1024, cfg_decoder=dict(num_heads=16)), + maskgen_cfg=dict( + num_layers=6, + embed_dims=1024, + num_heads=16, + out_dims=768, + ))) diff --git a/mmsegmentation/configs/segformer/README.md b/mmsegmentation/configs/segformer/README.md new file mode 100644 index 0000000..f8999b0 --- /dev/null +++ b/mmsegmentation/configs/segformer/README.md @@ -0,0 +1,101 @@ +# SegFormer + +> [SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers](https://arxiv.org/abs/2105.15203) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We present SegFormer, a simple, efficient yet powerful semantic segmentation framework which unifies Transformers with lightweight multilayer perception (MLP) decoders. SegFormer has two appealing features: 1) SegFormer comprises a novel hierarchically structured Transformer encoder which outputs multiscale features. It does not need positional encoding, thereby avoiding the interpolation of positional codes which leads to decreased performance when the testing resolution differs from training. 2) SegFormer avoids complex decoders. The proposed MLP decoder aggregates information from different layers, and thus combining both local attention and global attention to render powerful representations. We show that this simple and lightweight design is the key to efficient segmentation on Transformers. We scale our approach up to obtain a series of models from SegFormer-B0 to SegFormer-B5, reaching significantly better performance and efficiency than previous counterparts. For example, SegFormer-B4 achieves 50.3% mIoU on ADE20K with 64M parameters, being 5x smaller and 2.2% better than the previous best method. Our best model, SegFormer-B5, achieves 84.0% mIoU on Cityscapes validation set and shows excellent zero-shot robustness on Cityscapes-C. Code will be released at: [this http URL](https://github.com/NVlabs/SegFormer). + + + +
+ +
+ +## Usage + +To use other repositories' pre-trained models, it is necessary to convert keys. + +We provide a script [`mit2mmseg.py`](../../tools/model_converters/mit2mmseg.py) in the tools directory to convert the key of models from [the official repo](https://github.com/NVlabs/SegFormer) to MMSegmentation style. + +```shell +python tools/model_converters/mit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------: | -------------- | -------- | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Segformer | MIT-B0 | 512x512 | 160000 | 2.1 | 51.32 | 1080 Ti | 37.41 | 38.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b0_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_512x512_160k_ade20k/segformer_mit-b0_512x512_160k_ade20k_20210726_101530-8ffa8fda.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_512x512_160k_ade20k/segformer_mit-b0_512x512_160k_ade20k_20210726_101530.log.json) | +| Segformer | MIT-B1 | 512x512 | 160000 | 2.6 | 47.66 | TITAN Xp | 40.97 | 42.54 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b1_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_512x512_160k_ade20k/segformer_mit-b1_512x512_160k_ade20k_20210726_112106-d70e859d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_512x512_160k_ade20k/segformer_mit-b1_512x512_160k_ade20k_20210726_112106.log.json) | +| Segformer | MIT-B2 | 512x512 | 160000 | 3.6 | 30.88 | TITAN Xp | 45.58 | 47.03 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b2_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_512x512_160k_ade20k/segformer_mit-b2_512x512_160k_ade20k_20210726_112103-cbd414ac.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_512x512_160k_ade20k/segformer_mit-b2_512x512_160k_ade20k_20210726_112103.log.json) | +| Segformer | MIT-B3 | 512x512 | 160000 | 4.8 | 22.11 | V100 | 47.82 | 48.81 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b3_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_512x512_160k_ade20k/segformer_mit-b3_512x512_160k_ade20k_20210726_081410-962b98d2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_512x512_160k_ade20k/segformer_mit-b3_512x512_160k_ade20k_20210726_081410.log.json) | +| Segformer | MIT-B4 | 512x512 | 160000 | 6.1 | 15.45 | V100 | 48.46 | 49.76 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b4_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_512x512_160k_ade20k/segformer_mit-b4_512x512_160k_ade20k_20210728_183055-7f509d7d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_512x512_160k_ade20k/segformer_mit-b4_512x512_160k_ade20k_20210728_183055.log.json) | +| Segformer | MIT-B5 | 512x512 | 160000 | 7.2 | 11.89 | V100 | 49.13 | 50.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_512x512_160k_ade20k/segformer_mit-b5_512x512_160k_ade20k_20210726_145235-94cedf59.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_512x512_160k_ade20k/segformer_mit-b5_512x512_160k_ade20k_20210726_145235.log.json) | +| Segformer | MIT-B5 | 640x640 | 160000 | 11.5 | 11.30 | V100 | 49.62 | 50.36 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-640x640.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_640x640_160k_ade20k/segformer_mit-b5_640x640_160k_ade20k_20210801_121243-41d2845b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_640x640_160k_ade20k/segformer_mit-b5_640x640_160k_ade20k_20210801_121243.log.json) | + +Evaluation with AlignedResize: + +| Method | Backbone | Crop Size | Lr schd | mIoU | mIoU(ms+flip) | +| --------- | -------- | --------- | ------: | ----: | ------------- | +| Segformer | MIT-B0 | 512x512 | 160000 | 38.1 | 38.57 | +| Segformer | MIT-B1 | 512x512 | 160000 | 41.64 | 42.76 | +| Segformer | MIT-B2 | 512x512 | 160000 | 46.53 | 47.49 | +| Segformer | MIT-B3 | 512x512 | 160000 | 48.46 | 49.14 | +| Segformer | MIT-B4 | 512x512 | 160000 | 49.34 | 50.29 | +| Segformer | MIT-B5 | 512x512 | 160000 | 50.08 | 50.72 | +| Segformer | MIT-B5 | 640x640 | 160000 | 50.58 | 50.8 | + +We replace `AlignedResize` in original implementatiuon to `Resize + ResizeToMultiple`. If you want to test by +using `AlignedResize`, you can change the dataset pipeline like this: + +```python +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # resize image to multiple of 32, improve SegFormer by 0.5-1.0 mIoU. + dict(type='ResizeToMultiple', size_divisor=32), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +``` + +### Cityscapes + +The lower fps result is caused by the sliding window inference scheme (window size:1024x1024). + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| --------- | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Segformer | MIT-B0 | 1024x1024 | 160000 | 3.64 | 4.74 | V100 | 76.54 | 78.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_8x1_1024x1024_160k_cityscapes/segformer_mit-b0_8x1_1024x1024_160k_cityscapes_20211208_101857-e7f88502.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_8x1_1024x1024_160k_cityscapes/segformer_mit-b0_8x1_1024x1024_160k_cityscapes_20211208_101857.log.json) | +| Segformer | MIT-B1 | 1024x1024 | 160000 | 4.49 | 4.3 | V100 | 78.56 | 79.73 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b1_8xb1-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_8x1_1024x1024_160k_cityscapes/segformer_mit-b1_8x1_1024x1024_160k_cityscapes_20211208_064213-655c7b3f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_8x1_1024x1024_160k_cityscapes/segformer_mit-b1_8x1_1024x1024_160k_cityscapes_20211208_064213.log.json) | +| Segformer | MIT-B2 | 1024x1024 | 160000 | 7.42 | 3.36 | V100 | 81.08 | 82.18 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b2_8xb1-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_8x1_1024x1024_160k_cityscapes/segformer_mit-b2_8x1_1024x1024_160k_cityscapes_20211207_134205-6096669a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_8x1_1024x1024_160k_cityscapes/segformer_mit-b2_8x1_1024x1024_160k_cityscapes_20211207_134205.log.json) | +| Segformer | MIT-B3 | 1024x1024 | 160000 | 10.86 | 2.53 | V100 | 81.94 | 83.14 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b3_8xb1-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_8x1_1024x1024_160k_cityscapes/segformer_mit-b3_8x1_1024x1024_160k_cityscapes_20211206_224823-a8f8a177.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_8x1_1024x1024_160k_cityscapes/segformer_mit-b3_8x1_1024x1024_160k_cityscapes_20211206_224823.log.json) | +| Segformer | MIT-B4 | 1024x1024 | 160000 | 15.07 | 1.88 | V100 | 81.89 | 83.38 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b4_8xb1-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_8x1_1024x1024_160k_cityscapes/segformer_mit-b4_8x1_1024x1024_160k_cityscapes_20211207_080709-07f6c333.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_8x1_1024x1024_160k_cityscapes/segformer_mit-b4_8x1_1024x1024_160k_cityscapes_20211207_080709.log.json) | +| Segformer | MIT-B5 | 1024x1024 | 160000 | 18.00 | 1.39 | V100 | 82.25 | 83.48 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_8x1_1024x1024_160k_cityscapes/segformer_mit-b5_8x1_1024x1024_160k_cityscapes_20211206_072934-87a052ec.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_8x1_1024x1024_160k_cityscapes/segformer_mit-b5_8x1_1024x1024_160k_cityscapes_20211206_072934.log.json) | + +## Citation + +```bibtex +@article{xie2021segformer, + title={SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers}, + author={Xie, Enze and Wang, Wenhai and Yu, Zhiding and Anandkumar, Anima and Alvarez, Jose M and Luo, Ping}, + journal={arXiv preprint arXiv:2105.15203}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/segformer/metafile.yaml b/mmsegmentation/configs/segformer/metafile.yaml new file mode 100644 index 0000000..7fb38d7 --- /dev/null +++ b/mmsegmentation/configs/segformer/metafile.yaml @@ -0,0 +1,340 @@ +Collections: +- Name: Segformer + License: Apache License 2.0 + Metadata: + Training Data: + - ADE20K + - Cityscapes + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + README: configs/segformer/README.md + Frameworks: + - PyTorch +Models: +- Name: segformer_mit-b0_8xb2-160k_ade20k-512x512 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 37.41 + mIoU(ms+flip): 38.34 + Config: configs/segformer/segformer_mit-b0_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B0 + - Segformer + Training Resources: 8x 1080 Ti GPUS + Memory (GB): 2.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_512x512_160k_ade20k/segformer_mit-b0_512x512_160k_ade20k_20210726_101530-8ffa8fda.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_512x512_160k_ade20k/segformer_mit-b0_512x512_160k_ade20k_20210726_101530.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b1_8xb2-160k_ade20k-512x512 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.97 + mIoU(ms+flip): 42.54 + Config: configs/segformer/segformer_mit-b1_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B1 + - Segformer + Training Resources: 8x TITAN Xp GPUS + Memory (GB): 2.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_512x512_160k_ade20k/segformer_mit-b1_512x512_160k_ade20k_20210726_112106-d70e859d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_512x512_160k_ade20k/segformer_mit-b1_512x512_160k_ade20k_20210726_112106.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b2_8xb2-160k_ade20k-512x512 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.58 + mIoU(ms+flip): 47.03 + Config: configs/segformer/segformer_mit-b2_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B2 + - Segformer + Training Resources: 8x TITAN Xp GPUS + Memory (GB): 3.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_512x512_160k_ade20k/segformer_mit-b2_512x512_160k_ade20k_20210726_112103-cbd414ac.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_512x512_160k_ade20k/segformer_mit-b2_512x512_160k_ade20k_20210726_112103.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b3_8xb2-160k_ade20k-512x512 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.82 + mIoU(ms+flip): 48.81 + Config: configs/segformer/segformer_mit-b3_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B3 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 4.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_512x512_160k_ade20k/segformer_mit-b3_512x512_160k_ade20k_20210726_081410-962b98d2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_512x512_160k_ade20k/segformer_mit-b3_512x512_160k_ade20k_20210726_081410.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b4_8xb2-160k_ade20k-512x512 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.46 + mIoU(ms+flip): 49.76 + Config: configs/segformer/segformer_mit-b4_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B4 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 6.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_512x512_160k_ade20k/segformer_mit-b4_512x512_160k_ade20k_20210728_183055-7f509d7d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_512x512_160k_ade20k/segformer_mit-b4_512x512_160k_ade20k_20210728_183055.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b5_8xb2-160k_ade20k-512x512 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 49.13 + mIoU(ms+flip): 50.22 + Config: configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B5 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 7.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_512x512_160k_ade20k/segformer_mit-b5_512x512_160k_ade20k_20210726_145235-94cedf59.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_512x512_160k_ade20k/segformer_mit-b5_512x512_160k_ade20k_20210726_145235.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b5_8xb2-160k_ade20k-640x640 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 49.62 + mIoU(ms+flip): 50.36 + Config: configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-640x640.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MIT-B5 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 11.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_640x640_160k_ade20k/segformer_mit-b5_640x640_160k_ade20k_20210801_121243-41d2845b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_640x640_160k_ade20k/segformer_mit-b5_640x640_160k_ade20k_20210801_121243.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b0_8xb1-160k_cityscapes-1024x1024 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.54 + mIoU(ms+flip): 78.22 + Config: configs/segformer/segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - MIT-B0 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 3.64 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_8x1_1024x1024_160k_cityscapes/segformer_mit-b0_8x1_1024x1024_160k_cityscapes_20211208_101857-e7f88502.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b0_8x1_1024x1024_160k_cityscapes/segformer_mit-b0_8x1_1024x1024_160k_cityscapes_20211208_101857.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b1_8xb1-160k_cityscapes-1024x1024 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.56 + mIoU(ms+flip): 79.73 + Config: configs/segformer/segformer_mit-b1_8xb1-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - MIT-B1 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 4.49 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_8x1_1024x1024_160k_cityscapes/segformer_mit-b1_8x1_1024x1024_160k_cityscapes_20211208_064213-655c7b3f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b1_8x1_1024x1024_160k_cityscapes/segformer_mit-b1_8x1_1024x1024_160k_cityscapes_20211208_064213.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b2_8xb1-160k_cityscapes-1024x1024 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 81.08 + mIoU(ms+flip): 82.18 + Config: configs/segformer/segformer_mit-b2_8xb1-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - MIT-B2 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 7.42 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_8x1_1024x1024_160k_cityscapes/segformer_mit-b2_8x1_1024x1024_160k_cityscapes_20211207_134205-6096669a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b2_8x1_1024x1024_160k_cityscapes/segformer_mit-b2_8x1_1024x1024_160k_cityscapes_20211207_134205.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b3_8xb1-160k_cityscapes-1024x1024 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 81.94 + mIoU(ms+flip): 83.14 + Config: configs/segformer/segformer_mit-b3_8xb1-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - MIT-B3 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 10.86 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_8x1_1024x1024_160k_cityscapes/segformer_mit-b3_8x1_1024x1024_160k_cityscapes_20211206_224823-a8f8a177.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b3_8x1_1024x1024_160k_cityscapes/segformer_mit-b3_8x1_1024x1024_160k_cityscapes_20211206_224823.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b4_8xb1-160k_cityscapes-1024x1024 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 81.89 + mIoU(ms+flip): 83.38 + Config: configs/segformer/segformer_mit-b4_8xb1-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - MIT-B4 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 15.07 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_8x1_1024x1024_160k_cityscapes/segformer_mit-b4_8x1_1024x1024_160k_cityscapes_20211207_080709-07f6c333.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b4_8x1_1024x1024_160k_cityscapes/segformer_mit-b4_8x1_1024x1024_160k_cityscapes_20211207_080709.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch +- Name: segformer_mit-b5_8xb1-160k_cityscapes-1024x1024 + In Collection: Segformer + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 82.25 + mIoU(ms+flip): 83.48 + Config: configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - MIT-B5 + - Segformer + Training Resources: 8x V100 GPUS + Memory (GB): 18.0 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_8x1_1024x1024_160k_cityscapes/segformer_mit-b5_8x1_1024x1024_160k_cityscapes_20211206_072934-87a052ec.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segformer/segformer_mit-b5_8x1_1024x1024_160k_cityscapes/segformer_mit-b5_8x1_1024x1024_160k_cityscapes_20211206_072934.log.json + Paper: + Title: 'SegFormer: Simple and Efficient Design for Semantic Segmentation with + Transformers' + URL: https://arxiv.org/abs/2105.15203 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/mit.py#L246 + Framework: PyTorch diff --git a/mmsegmentation/configs/segformer/segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/segformer/segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..1280047 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py @@ -0,0 +1,41 @@ +_base_ = [ + '../_base_/models/segformer_mit-b0.py', + '../_base_/datasets/cityscapes_1024x1024.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (1024, 1024) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b0_20220624-7e0fe6dd.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), + test_cfg=dict(mode='slide', crop_size=(1024, 1024), stride=(768, 768))) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_block': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'head': dict(lr_mult=10.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +train_dataloader = dict(batch_size=1, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/segformer/segformer_mit-b0_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/segformer/segformer_mit-b0_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..4a9476d --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b0_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/segformer_mit-b0.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b0_20220624-7e0fe6dd.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), + decode_head=dict(num_classes=150)) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_block': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'head': dict(lr_mult=10.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/segformer/segformer_mit-b1_8xb1-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/segformer/segformer_mit-b1_8xb1-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..85c126e --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b1_8xb1-160k_cityscapes-1024x1024.py @@ -0,0 +1,9 @@ +_base_ = ['./segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b1_20220624-02e5a6a1.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b1_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/segformer/segformer_mit-b1_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..1ff21b8 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b1_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./segformer_mit-b0_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b1_20220624-02e5a6a1.pth' # noqa + +# model settings +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_heads=[1, 2, 5, 8], + num_layers=[2, 2, 2, 2]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b2_8xb1-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/segformer/segformer_mit-b2_8xb1-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..c802f27 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b2_8xb1-160k_cityscapes-1024x1024.py @@ -0,0 +1,10 @@ +_base_ = ['./segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b2_20220624-66e8bf70.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_layers=[3, 4, 6, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b2_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/segformer/segformer_mit-b2_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..0f4c1af --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b2_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./segformer_mit-b0_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b2_20220624-66e8bf70.pth' # noqa + +# model settings +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_heads=[1, 2, 5, 8], + num_layers=[3, 4, 6, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b3_8xb1-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/segformer/segformer_mit-b3_8xb1-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..9b41ad0 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b3_8xb1-160k_cityscapes-1024x1024.py @@ -0,0 +1,10 @@ +_base_ = ['./segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b3_20220624-13b1141c.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_layers=[3, 4, 18, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b3_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/segformer/segformer_mit-b3_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..a2cc13d --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b3_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./segformer_mit-b0_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b3_20220624-13b1141c.pth' # noqa + +# model settings +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_heads=[1, 2, 5, 8], + num_layers=[3, 4, 18, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b4_8xb1-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/segformer/segformer_mit-b4_8xb1-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..5fb1608 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b4_8xb1-160k_cityscapes-1024x1024.py @@ -0,0 +1,10 @@ +_base_ = ['./segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b4_20220624-d588d980.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_layers=[3, 8, 27, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b4_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/segformer/segformer_mit-b4_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..5f39c30 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b4_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./segformer_mit-b0_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b4_20220624-d588d980.pth' # noqa + +# model settings +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_heads=[1, 2, 5, 8], + num_layers=[3, 8, 27, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py b/mmsegmentation/configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py new file mode 100644 index 0000000..18c3c16 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py @@ -0,0 +1,10 @@ +_base_ = ['./segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b5_20220624-658746d9.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_layers=[3, 6, 40, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..1e9a209 --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./segformer_mit-b0_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b5_20220624-658746d9.pth' # noqa + +# model settings +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_heads=[1, 2, 5, 8], + num_layers=[3, 6, 40, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-640x640.py b/mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-640x640.py new file mode 100644 index 0000000..a32eb7c --- /dev/null +++ b/mmsegmentation/configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-640x640.py @@ -0,0 +1,41 @@ +_base_ = ['./segformer_mit-b0_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b5_20220624-658746d9.pth' # noqa + +# dataset settings +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 640), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 640), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +val_dataloader = dict(batch_size=1, dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader + +# model settings +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=64, + num_heads=[1, 2, 5, 8], + num_layers=[3, 6, 40, 3]), + decode_head=dict(in_channels=[64, 128, 320, 512])) diff --git a/mmsegmentation/configs/segmenter/README.md b/mmsegmentation/configs/segmenter/README.md new file mode 100644 index 0000000..103b125 --- /dev/null +++ b/mmsegmentation/configs/segmenter/README.md @@ -0,0 +1,76 @@ +# Segmenter + +> [Segmenter: Transformer for Semantic Segmentation](https://arxiv.org/abs/2105.05633) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Image segmentation is often ambiguous at the level of individual image patches and requires contextual information to reach label consensus. In this paper we introduce Segmenter, a transformer model for semantic segmentation. In contrast to convolution-based methods, our approach allows to model global context already at the first layer and throughout the network. We build on the recent Vision Transformer (ViT) and extend it to semantic segmentation. To do so, we rely on the output embeddings corresponding to image patches and obtain class labels from these embeddings with a point-wise linear decoder or a mask transformer decoder. We leverage models pre-trained for image classification and show that we can fine-tune them on moderate sized datasets available for semantic segmentation. The linear decoder allows to obtain excellent results already, but the performance can be further improved by a mask transformer generating class masks. We conduct an extensive ablation study to show the impact of the different parameters, in particular the performance is better for large models and small patch sizes. Segmenter attains excellent results for semantic segmentation. It outperforms the state of the art on both ADE20K and Pascal Context datasets and is competitive on Cityscapes. + + + +
+ +
+ +## Usage + +We have provided pretrained models converted from [ViT-AugReg](https://github.com/rwightman/pytorch-image-models/blob/f55c22bebf9d8afc449d317a723231ef72e0d662/timm/models/vision_transformer.py#L54-L106). + +If you want to convert keys on your own to use the pre-trained ViT model from [Segmenter](https://github.com/rstrudel/segmenter), we also provide a script [`vitjax2mmseg.py`](../../tools/model_converters/vitjax2mmseg.py) in the tools directory to convert the key of models from [ViT-AugReg](https://github.com/rwightman/pytorch-image-models/blob/f55c22bebf9d8afc449d317a723231ef72e0d662/timm/models/vision_transformer.py#L54-L106) to MMSegmentation style. + +```shell +python tools/model_converters/vitjax2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/vitjax2mmseg.py \ +Ti_16-i21k-300ep-lr_0.001-aug_none-wd_0.03-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.03-res_384.npz \ +pretrain/vit_tiny_p16_384.pth +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +In our default setting, pretrained models and their corresponding [ViT-AugReg](https://github.com/rwightman/pytorch-image-models/blob/f55c22bebf9d8afc449d317a723231ef72e0d662/timm/models/vision_transformer.py#L54-L106) models could be defined below: + +| pretrained models | original models | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| vit_tiny_p16_384.pth | [vit_tiny_patch16_384](https://storage.googleapis.com/vit_models/augreg/Ti_16-i21k-300ep-lr_0.001-aug_none-wd_0.03-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.03-res_384.npz) | +| vit_small_p16_384.pth | [vit_small_patch16_384](https://storage.googleapis.com/vit_models/augreg/S_16-i21k-300ep-lr_0.001-aug_light1-wd_0.03-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.03-res_384.npz) | +| vit_base_p16_384.pth | [vit_base_patch16_384](https://storage.googleapis.com/vit_models/augreg/B_16-i21k-300ep-lr_0.001-aug_medium1-wd_0.1-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.01-res_384.npz) | +| vit_large_p16_384.pth | [vit_large_patch16_384](https://storage.googleapis.com/vit_models/augreg/L_16-i21k-300ep-lr_0.001-aug_medium1-wd_0.1-do_0.1-sd_0.1--imagenet2012-steps_20k-lr_0.01-res_384.npz) | + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------------- | -------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Segmenter Mask | ViT-T_16 | 512x512 | 160000 | 1.21 | 27.98 | V100 | 39.99 | 40.83 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-t_mask_8x1_512x512_160k_ade20k/segmenter_vit-t_mask_8x1_512x512_160k_ade20k_20220105_151706-ffcf7509.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-t_mask_8x1_512x512_160k_ade20k/segmenter_vit-t_mask_8x1_512x512_160k_ade20k_20220105_151706.log.json) | +| Segmenter Linear | ViT-S_16 | 512x512 | 160000 | 1.78 | 28.07 | V100 | 45.75 | 46.82 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segmenter/segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_linear_8x1_512x512_160k_ade20k/segmenter_vit-s_linear_8x1_512x512_160k_ade20k_20220105_151713-39658c46.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_linear_8x1_512x512_160k_ade20k/segmenter_vit-s_linear_8x1_512x512_160k_ade20k_20220105_151713.log.json) | +| Segmenter Mask | ViT-S_16 | 512x512 | 160000 | 2.03 | 24.80 | V100 | 46.19 | 47.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segmenter/segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_mask_8x1_512x512_160k_ade20k/segmenter_vit-s_mask_8x1_512x512_160k_ade20k_20220105_151706-511bb103.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_mask_8x1_512x512_160k_ade20k/segmenter_vit-s_mask_8x1_512x512_160k_ade20k_20220105_151706.log.json) | +| Segmenter Mask | ViT-B_16 | 512x512 | 160000 | 4.20 | 13.20 | V100 | 49.60 | 51.07 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segmenter/segmenter_vit-b_mask_8xb1-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-b_mask_8x1_512x512_160k_ade20k/segmenter_vit-b_mask_8x1_512x512_160k_ade20k_20220105_151706-bc533b08.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-b_mask_8x1_512x512_160k_ade20k/segmenter_vit-b_mask_8x1_512x512_160k_ade20k_20220105_151706.log.json) | +| Segmenter Mask | ViT-L_16 | 640x640 | 160000 | 16.56 | 2.62 | V100 | 52.16 | 53.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segmenter/segmenter_vit-l_mask_8xb1-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-l_mask_8x1_512x512_160k_ade20k/segmenter_vit-l_mask_8x1_512x512_160k_ade20k_20220105_162750-7ef345be.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-l_mask_8x1_512x512_160k_ade20k/segmenter_vit-l_mask_8x1_512x512_160k_ade20k_20220105_162750.log.json) | + +## Citation + +```bibtex +@inproceedings{strudel2021segmenter, + title={Segmenter: Transformer for semantic segmentation}, + author={Strudel, Robin and Garcia, Ricardo and Laptev, Ivan and Schmid, Cordelia}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={7262--7272}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/segmenter/metafile.yaml b/mmsegmentation/configs/segmenter/metafile.yaml new file mode 100644 index 0000000..ff2aa44 --- /dev/null +++ b/mmsegmentation/configs/segmenter/metafile.yaml @@ -0,0 +1,138 @@ +Collections: +- Name: Segmenter + License: Apache License 2.0 + Metadata: + Training Data: + - ADE20K + Paper: + Title: 'Segmenter: Transformer for Semantic Segmentation' + URL: https://arxiv.org/abs/2105.05633 + README: configs/segmenter/README.md + Frameworks: + - PyTorch +Models: +- Name: segmenter_vit-t_mask_8xb1-160k_ade20k-512x512 + In Collection: Segmenter + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 39.99 + mIoU(ms+flip): 40.83 + Config: configs/segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - ViT-T_16 + - Segmenter + - Mask + Training Resources: 8x V100 GPUS + Memory (GB): 1.21 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-t_mask_8x1_512x512_160k_ade20k/segmenter_vit-t_mask_8x1_512x512_160k_ade20k_20220105_151706-ffcf7509.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-t_mask_8x1_512x512_160k_ade20k/segmenter_vit-t_mask_8x1_512x512_160k_ade20k_20220105_151706.log.json + Paper: + Title: 'Segmenter: Transformer for Semantic Segmentation' + URL: https://arxiv.org/abs/2105.05633 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.21.0/mmseg/models/decode_heads/segmenter_mask_head.py#L15 + Framework: PyTorch +- Name: segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512 + In Collection: Segmenter + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.75 + mIoU(ms+flip): 46.82 + Config: configs/segmenter/segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - ViT-S_16 + - Segmenter + - Linear + Training Resources: 8x V100 GPUS + Memory (GB): 1.78 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_linear_8x1_512x512_160k_ade20k/segmenter_vit-s_linear_8x1_512x512_160k_ade20k_20220105_151713-39658c46.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_linear_8x1_512x512_160k_ade20k/segmenter_vit-s_linear_8x1_512x512_160k_ade20k_20220105_151713.log.json + Paper: + Title: 'Segmenter: Transformer for Semantic Segmentation' + URL: https://arxiv.org/abs/2105.05633 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.21.0/mmseg/models/decode_heads/segmenter_mask_head.py#L15 + Framework: PyTorch +- Name: segmenter_vit-s_mask_8xb1-160k_ade20k-512x512 + In Collection: Segmenter + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.19 + mIoU(ms+flip): 47.85 + Config: configs/segmenter/segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - ViT-S_16 + - Segmenter + - Mask + Training Resources: 8x V100 GPUS + Memory (GB): 2.03 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_mask_8x1_512x512_160k_ade20k/segmenter_vit-s_mask_8x1_512x512_160k_ade20k_20220105_151706-511bb103.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-s_mask_8x1_512x512_160k_ade20k/segmenter_vit-s_mask_8x1_512x512_160k_ade20k_20220105_151706.log.json + Paper: + Title: 'Segmenter: Transformer for Semantic Segmentation' + URL: https://arxiv.org/abs/2105.05633 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.21.0/mmseg/models/decode_heads/segmenter_mask_head.py#L15 + Framework: PyTorch +- Name: segmenter_vit-b_mask_8xb1-160k_ade20k-512x512 + In Collection: Segmenter + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 49.6 + mIoU(ms+flip): 51.07 + Config: configs/segmenter/segmenter_vit-b_mask_8xb1-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - ViT-B_16 + - Segmenter + - Mask + Training Resources: 8x V100 GPUS + Memory (GB): 4.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-b_mask_8x1_512x512_160k_ade20k/segmenter_vit-b_mask_8x1_512x512_160k_ade20k_20220105_151706-bc533b08.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-b_mask_8x1_512x512_160k_ade20k/segmenter_vit-b_mask_8x1_512x512_160k_ade20k_20220105_151706.log.json + Paper: + Title: 'Segmenter: Transformer for Semantic Segmentation' + URL: https://arxiv.org/abs/2105.05633 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.21.0/mmseg/models/decode_heads/segmenter_mask_head.py#L15 + Framework: PyTorch +- Name: segmenter_vit-l_mask_8xb1-160k_ade20k-512x512 + In Collection: Segmenter + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 52.16 + mIoU(ms+flip): 53.65 + Config: configs/segmenter/segmenter_vit-l_mask_8xb1-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - ViT-L_16 + - Segmenter + - Mask + Training Resources: 8x V100 GPUS + Memory (GB): 16.56 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-l_mask_8x1_512x512_160k_ade20k/segmenter_vit-l_mask_8x1_512x512_160k_ade20k_20220105_162750-7ef345be.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segmenter/segmenter_vit-l_mask_8x1_512x512_160k_ade20k/segmenter_vit-l_mask_8x1_512x512_160k_ade20k_20220105_162750.log.json + Paper: + Title: 'Segmenter: Transformer for Semantic Segmentation' + URL: https://arxiv.org/abs/2105.05633 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.21.0/mmseg/models/decode_heads/segmenter_mask_head.py#L15 + Framework: PyTorch diff --git a/mmsegmentation/configs/segmenter/segmenter_vit-b_mask_8xb1-160k_ade20k-512x512.py b/mmsegmentation/configs/segmenter/segmenter_vit-b_mask_8xb1-160k_ade20k-512x512.py new file mode 100644 index 0000000..a4bae50 --- /dev/null +++ b/mmsegmentation/configs/segmenter/segmenter_vit-b_mask_8xb1-160k_ade20k-512x512.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/segmenter_vit-b16_mask.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +optimizer = dict(lr=0.001, weight_decay=0.0) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict( + # num_gpus: 8 -> batch_size: 8 + batch_size=1) +val_dataloader = dict(batch_size=1) diff --git a/mmsegmentation/configs/segmenter/segmenter_vit-l_mask_8xb1-160k_ade20k-512x512.py b/mmsegmentation/configs/segmenter/segmenter_vit-l_mask_8xb1-160k_ade20k-512x512.py new file mode 100644 index 0000000..302acde --- /dev/null +++ b/mmsegmentation/configs/segmenter/segmenter_vit-l_mask_8xb1-160k_ade20k-512x512.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/segmenter_vit-b16_mask.py', + '../_base_/datasets/ade20k_640x640.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (640, 640) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segmenter/vit_large_p16_384_20220308-d4efb41d.pth' # noqa + +model = dict( + data_preprocessor=data_preprocessor, + pretrained=checkpoint, + backbone=dict( + type='VisionTransformer', + img_size=(640, 640), + embed_dims=1024, + num_layers=24, + num_heads=16), + decode_head=dict( + type='SegmenterMaskTransformerHead', + in_channels=1024, + channels=1024, + num_heads=16, + embed_dims=1024), + test_cfg=dict(mode='slide', crop_size=(640, 640), stride=(608, 608))) + +optimizer = dict(lr=0.001, weight_decay=0.0) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict( + # num_gpus: 8 -> batch_size: 8 + batch_size=1) +val_dataloader = dict(batch_size=1) diff --git a/mmsegmentation/configs/segmenter/segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512.py b/mmsegmentation/configs/segmenter/segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512.py new file mode 100644 index 0000000..dc1e4c8 --- /dev/null +++ b/mmsegmentation/configs/segmenter/segmenter_vit-s_fcn_8xb1-160k_ade20k-512x512.py @@ -0,0 +1,14 @@ +_base_ = './segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py' + +model = dict( + decode_head=dict( + _delete_=True, + type='FCNHead', + in_channels=384, + channels=384, + num_convs=0, + dropout_ratio=0.0, + concat_input=False, + num_classes=150, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/mmsegmentation/configs/segmenter/segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py b/mmsegmentation/configs/segmenter/segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py new file mode 100644 index 0000000..b19fd41 --- /dev/null +++ b/mmsegmentation/configs/segmenter/segmenter_vit-s_mask_8xb1-160k_ade20k-512x512.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/segmenter_vit-b16_mask.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segmenter/vit_small_p16_384_20220308-410f6037.pth' # noqa + +backbone_norm_cfg = dict(type='LN', eps=1e-6, requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=checkpoint, + backbone=dict( + img_size=(512, 512), + embed_dims=384, + num_heads=6, + ), + decode_head=dict( + type='SegmenterMaskTransformerHead', + in_channels=384, + channels=384, + num_classes=150, + num_layers=2, + num_heads=6, + embed_dims=384, + dropout_ratio=0.0, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) + +optimizer = dict(lr=0.001, weight_decay=0.0) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict( + # num_gpus: 8 -> batch_size: 8 + batch_size=1) +val_dataloader = dict(batch_size=1) diff --git a/mmsegmentation/configs/segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py b/mmsegmentation/configs/segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py new file mode 100644 index 0000000..221a9f9 --- /dev/null +++ b/mmsegmentation/configs/segmenter/segmenter_vit-t_mask_8xb1-160k_ade20k-512x512.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/segmenter_vit-b16_mask.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segmenter/vit_tiny_p16_384_20220308-cce8c795.pth' # noqa + +model = dict( + data_preprocessor=data_preprocessor, + pretrained=checkpoint, + backbone=dict(embed_dims=192, num_heads=3), + decode_head=dict( + type='SegmenterMaskTransformerHead', + in_channels=192, + channels=192, + num_heads=3, + embed_dims=192)) + +optimizer = dict(lr=0.001, weight_decay=0.0) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer) +train_dataloader = dict( + # num_gpus: 8 -> batch_size: 8 + batch_size=1) +val_dataloader = dict(batch_size=1) diff --git a/mmsegmentation/configs/segnext/README.md b/mmsegmentation/configs/segnext/README.md new file mode 100644 index 0000000..d7434a0 --- /dev/null +++ b/mmsegmentation/configs/segnext/README.md @@ -0,0 +1,63 @@ +# SegNeXt + +> [SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation](https://arxiv.org/abs/2209.08575) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +We present SegNeXt, a simple convolutional network architecture for semantic segmentation. Recent transformer-based models have dominated the field of semantic segmentation due to the efficiency of self-attention in encoding spatial information. In this paper, we show that convolutional attention is a more efficient and effective way to encode contextual information than the self-attention mechanism in transformers. By re-examining the characteristics owned by successful segmentation models, we discover several key components leading to the performance improvement of segmentation models. This motivates us to design a novel convolutional attention network that uses cheap convolutional operations. Without bells and whistles, our SegNeXt significantly improves the performance of previous state-of-the-art methods on popular benchmarks, including ADE20K, Cityscapes, COCO-Stuff, Pascal VOC, Pascal Context, and iSAID. Notably, SegNeXt outperforms EfficientNet-L2 w/ NAS-FPN and achieves 90.6% mIoU on the Pascal VOC 2012 test leaderboard using only 1/10 parameters of it. On average, SegNeXt achieves about 2.0% mIoU improvements compared to the state-of-the-art methods on the ADE20K datasets with the same or fewer computations. Code is available at [this https URL](https://github.com/uyzhang/JSeg) (Jittor) and [this https URL](https://github.com/Visual-Attention-Network/SegNeXt) (Pytorch). + + + +
+ +
+ +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| SegNeXt | MSCAN-T | 512x512 | 160000 | 17.88 | 52.38 | A100 | 41.50 | 42.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k_20230210_140244-05bd8466.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k_20230210_140244.log.json) | +| SegNeXt | MSCAN-S | 512x512 | 160000 | 21.47 | 42.27 | A100 | 44.16 | 45.81 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segnext/segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k_20230214_113014-43013668.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k_20230214_113014.log.json) | +| SegNeXt | MSCAN-B | 512x512 | 160000 | 31.03 | 35.15 | A100 | 48.03 | 49.68 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segnext/segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k_20230209_172053-b6f6c70c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k_20230209_172053.log.json) | +| SegNeXt | MSCAN-L | 512x512 | 160000 | 43.32 | 22.91 | A100 | 50.99 | 52.10 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segnext/segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k_20230209_172055-19b14b63.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k_20230209_172055.log.json) | + +Note: + +- When we integrated SegNeXt into MMSegmentation, we modified some layers' names to make them more precise and concise without changing the model architecture. Therefore, the keys of pre-trained weights are different from the [original weights](https://cloud.tsinghua.edu.cn/d/c15b25a6745946618462/), but don't worry about these changes. we have converted them and uploaded the checkpoints, you might find URL of pre-trained checkpoints in config files and can use them directly for training. + +- The total batch size is 16. We trained for SegNeXt with a single GPU as the performance degrades significantly when using`SyncBN` (mainly in `OverlapPatchEmbed` modules of `MSCAN`) of PyTorch 1.9. + +- There will be subtle differences when model testing as Non-negative Matrix Factorization (NMF) in `LightHamHead` will be initialized randomly. To control this randomness, please set the random seed when model testing. You can modify [`./tools/test.py`](https://github.com/open-mmlab/mmsegmentation/blob/main/tools/test.py) like: + +```python +def main(): + from mmengine.runner import seg_random_seed + random_seed = xxx # set random seed recorded in training log + set_random_seed(random_seed, deterministic=False) + ... +``` + +- This model performance is sensitive to the seed values used, please refer to the log file for the specific settings of the seed. If you choose a different seed, the results might differ from the table results. Take SegNeXt Large for example, its results range from 49.60 to 51.0. + +## Citation + +```bibtex +@article{guo2022segnext, + title={SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation}, + author={Guo, Meng-Hao and Lu, Cheng-Ze and Hou, Qibin and Liu, Zhengning and Cheng, Ming-Ming and Hu, Shi-Min}, + journal={arXiv preprint arXiv:2209.08575}, + year={2022} +} +``` diff --git a/mmsegmentation/configs/segnext/metafile.yaml b/mmsegmentation/configs/segnext/metafile.yaml new file mode 100644 index 0000000..3c8ff5b --- /dev/null +++ b/mmsegmentation/configs/segnext/metafile.yaml @@ -0,0 +1,109 @@ +Collections: +- Name: SegNeXt + License: Apache License 2.0 + Metadata: + Training Data: + - ADE20K + Paper: + Title: 'SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation' + URL: https://arxiv.org/abs/2209.08575 + README: configs/segnext/README.md + Frameworks: + - PyTorch +Models: +- Name: segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512 + In Collection: SegNeXt + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 41.5 + mIoU(ms+flip): 42.59 + Config: configs/segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MSCAN-T + - SegNeXt + Training Resources: 1x A100 GPUS + Memory (GB): 17.88 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k_20230210_140244-05bd8466.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k/segnext_mscan-t_1x16_512x512_adamw_160k_ade20k_20230210_140244.log.json + Paper: + Title: 'SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation' + URL: https://arxiv.org/abs/2209.08575 + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/mscan.py#L328 + Framework: PyTorch +- Name: segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512 + In Collection: SegNeXt + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.16 + mIoU(ms+flip): 45.81 + Config: configs/segnext/segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MSCAN-S + - SegNeXt + Training Resources: 1x A100 GPUS + Memory (GB): 21.47 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k_20230214_113014-43013668.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k/segnext_mscan-s_1x16_512x512_adamw_160k_ade20k_20230214_113014.log.json + Paper: + Title: 'SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation' + URL: https://arxiv.org/abs/2209.08575 + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/mscan.py#L328 + Framework: PyTorch +- Name: segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512 + In Collection: SegNeXt + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.03 + mIoU(ms+flip): 49.68 + Config: configs/segnext/segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MSCAN-B + - SegNeXt + Training Resources: 1x A100 GPUS + Memory (GB): 31.03 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k_20230209_172053-b6f6c70c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k/segnext_mscan-b_1x16_512x512_adamw_160k_ade20k_20230209_172053.log.json + Paper: + Title: 'SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation' + URL: https://arxiv.org/abs/2209.08575 + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/mscan.py#L328 + Framework: PyTorch +- Name: segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512 + In Collection: SegNeXt + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 50.99 + mIoU(ms+flip): 52.1 + Config: configs/segnext/segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - MSCAN-L + - SegNeXt + Training Resources: 1x A100 GPUS + Memory (GB): 43.32 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k_20230209_172055-19b14b63.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/segnext/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k/segnext_mscan-l_1x16_512x512_adamw_160k_ade20k_20230209_172055.log.json + Paper: + Title: 'SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation' + URL: https://arxiv.org/abs/2209.08575 + Code: https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/backbones/mscan.py#L328 + Framework: PyTorch diff --git a/mmsegmentation/configs/segnext/segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512.py b/mmsegmentation/configs/segnext/segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512.py new file mode 100644 index 0000000..000f448 --- /dev/null +++ b/mmsegmentation/configs/segnext/segnext_mscan-b_1xb16-adamw-160k_ade20k-512x512.py @@ -0,0 +1,28 @@ +_base_ = './segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py' + +# model settings +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segnext/mscan_b_20230227-3ab7d230.pth' # noqa +ham_norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + embed_dims=[64, 128, 320, 512], + depths=[3, 3, 12, 3], + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + drop_path_rate=0.1, + norm_cfg=dict(type='BN', requires_grad=True)), + decode_head=dict( + type='LightHamHead', + in_channels=[128, 320, 512], + in_index=[1, 2, 3], + channels=512, + ham_channels=512, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=ham_norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/segnext/segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512.py b/mmsegmentation/configs/segnext/segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512.py new file mode 100644 index 0000000..212d0a8 --- /dev/null +++ b/mmsegmentation/configs/segnext/segnext_mscan-l_1xb16-adamw-160k_ade20k-512x512.py @@ -0,0 +1,27 @@ +_base_ = './segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py' +# model settings +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segnext/mscan_l_20230227-cef260d4.pth' # noqa +ham_norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + embed_dims=[64, 128, 320, 512], + depths=[3, 5, 27, 3], + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + drop_path_rate=0.3, + norm_cfg=dict(type='BN', requires_grad=True)), + decode_head=dict( + type='LightHamHead', + in_channels=[128, 320, 512], + in_index=[1, 2, 3], + channels=1024, + ham_channels=1024, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=ham_norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/segnext/segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512.py b/mmsegmentation/configs/segnext/segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512.py new file mode 100644 index 0000000..9a90779 --- /dev/null +++ b/mmsegmentation/configs/segnext/segnext_mscan-s_1xb16-adamw-160k_ade20k-512x512.py @@ -0,0 +1,27 @@ +_base_ = './segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py' +# model settings +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segnext/mscan_s_20230227-f33ccdf2.pth' # noqa +ham_norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + embed_dims=[64, 128, 320, 512], + depths=[2, 2, 4, 2], + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + norm_cfg=dict(type='BN', requires_grad=True)), + decode_head=dict( + type='LightHamHead', + in_channels=[128, 320, 512], + in_index=[1, 2, 3], + channels=256, + ham_channels=256, + ham_kwargs=dict(MD_R=16), + dropout_ratio=0.1, + num_classes=150, + norm_cfg=ham_norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py b/mmsegmentation/configs/segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py new file mode 100644 index 0000000..c8d6da8 --- /dev/null +++ b/mmsegmentation/configs/segnext/segnext_mscan-t_1xb16-adamw-160k_ade20k-512x512.py @@ -0,0 +1,84 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py', + '../_base_/datasets/ade20k.py' +] +# model settings +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segnext/mscan_t_20230227-119e8c9f.pth' # noqa +ham_norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +crop_size = (512, 512) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=(512, 512), + test_cfg=dict(size_divisor=32)) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='MSCAN', + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + embed_dims=[32, 64, 160, 256], + mlp_ratios=[8, 8, 4, 4], + drop_rate=0.0, + drop_path_rate=0.1, + depths=[3, 3, 5, 2], + attention_kernel_sizes=[5, [1, 7], [1, 11], [1, 21]], + attention_kernel_paddings=[2, [0, 3], [0, 5], [0, 10]], + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN', requires_grad=True)), + decode_head=dict( + type='LightHamHead', + in_channels=[64, 160, 256], + in_index=[1, 2, 3], + channels=256, + ham_channels=256, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=ham_norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + ham_kwargs=dict( + MD_S=1, + MD_R=16, + train_steps=6, + eval_steps=7, + inv_t=100, + rand_init=True)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +# dataset settings +train_dataloader = dict(batch_size=16) + +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_block': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'head': dict(lr_mult=10.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/sem_fpn/README.md b/mmsegmentation/configs/sem_fpn/README.md new file mode 100644 index 0000000..697cf50 --- /dev/null +++ b/mmsegmentation/configs/sem_fpn/README.md @@ -0,0 +1,51 @@ +# Semantic FPN + +> [Panoptic Feature Pyramid Networks](https://arxiv.org/abs/1901.02446) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +The recently introduced panoptic segmentation task has renewed our community's interest in unifying the tasks of instance segmentation (for thing classes) and semantic segmentation (for stuff classes). However, current state-of-the-art methods for this joint task use separate and dissimilar networks for instance and semantic segmentation, without performing any shared computation. In this work, we aim to unify these methods at the architectural level, designing a single network for both tasks. Our approach is to endow Mask R-CNN, a popular instance segmentation method, with a semantic segmentation branch using a shared Feature Pyramid Network (FPN) backbone. Surprisingly, this simple baseline not only remains effective for instance segmentation, but also yields a lightweight, top-performing method for semantic segmentation. In this work, we perform a detailed study of this minimally extended version of Mask R-CNN with FPN, which we refer to as Panoptic FPN, and show it is a robust and accurate baseline for both tasks. Given its effectiveness and conceptual simplicity, we hope our method can serve as a strong baseline and aid future research in panoptic segmentation. + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FPN | R-50 | 512x1024 | 80000 | 2.8 | 13.54 | V100 | 74.52 | 76.08 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/sem_fpn/fpn_r50_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes_20200717_021437-94018a0d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes-20200717_021437.log.json) | +| FPN | R-101 | 512x1024 | 80000 | 3.9 | 10.29 | V100 | 75.80 | 77.40 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes_20200717_012416-c5800d4c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes-20200717_012416.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------: | -------------- | ------ | ----: | ------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| FPN | R-50 | 512x512 | 160000 | 4.9 | 55.77 | V100 | 37.49 | 39.09 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/sem_fpn/fpn_r50_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k_20200718_131734-5b5a6ab9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k-20200718_131734.log.json) | +| FPN | R-101 | 512x512 | 160000 | 5.9 | 40.58 | V100 | 39.35 | 40.72 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/sem_fpn/fpn_r101_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k_20200718_131734-306b5004.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k-20200718_131734.log.json) | + +## Citation + +```bibtex +@inproceedings{kirillov2019panoptic, + title={Panoptic feature pyramid networks}, + author={Kirillov, Alexander and Girshick, Ross and He, Kaiming and Doll{\'a}r, Piotr}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={6399--6408}, + year={2019} +} +``` diff --git a/mmsegmentation/configs/sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..1e9bcfb --- /dev/null +++ b/mmsegmentation/configs/sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './fpn_r50_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/sem_fpn/fpn_r101_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/sem_fpn/fpn_r101_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..adad1a4 --- /dev/null +++ b/mmsegmentation/configs/sem_fpn/fpn_r101_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,5 @@ +_base_ = './fpn_r50_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/sem_fpn/fpn_r50_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/sem_fpn/fpn_r50_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..bf71d38 --- /dev/null +++ b/mmsegmentation/configs/sem_fpn/fpn_r50_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/sem_fpn/fpn_r50_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/sem_fpn/fpn_r50_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..4e4bc57 --- /dev/null +++ b/mmsegmentation/configs/sem_fpn/fpn_r50_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, decode_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/sem_fpn/metafile.yaml b/mmsegmentation/configs/sem_fpn/metafile.yaml new file mode 100644 index 0000000..e734897 --- /dev/null +++ b/mmsegmentation/configs/sem_fpn/metafile.yaml @@ -0,0 +1,110 @@ +Collections: +- Name: FPN + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + Paper: + Title: Panoptic Feature Pyramid Networks + URL: https://arxiv.org/abs/1901.02446 + README: configs/sem_fpn/README.md + Frameworks: + - PyTorch +Models: +- Name: fpn_r50_4xb2-80k_cityscapes-512x1024 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.52 + mIoU(ms+flip): 76.08 + Config: configs/sem_fpn/fpn_r50_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50 + - FPN + Training Resources: 4x V100 GPUS + Memory (GB): 2.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes_20200717_021437-94018a0d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes-20200717_021437.log.json + Paper: + Title: Panoptic Feature Pyramid Networks + URL: https://arxiv.org/abs/1901.02446 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fpn_head.py#L12 + Framework: PyTorch +- Name: fpn_r101_4xb2-80k_cityscapes-512x1024 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 75.8 + mIoU(ms+flip): 77.4 + Config: configs/sem_fpn/fpn_r101_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101 + - FPN + Training Resources: 4x V100 GPUS + Memory (GB): 3.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes_20200717_012416-c5800d4c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes-20200717_012416.log.json + Paper: + Title: Panoptic Feature Pyramid Networks + URL: https://arxiv.org/abs/1901.02446 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fpn_head.py#L12 + Framework: PyTorch +- Name: fpn_r50_4xb4-160k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 37.49 + mIoU(ms+flip): 39.09 + Config: configs/sem_fpn/fpn_r50_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50 + - FPN + Training Resources: 4x V100 GPUS + Memory (GB): 4.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k_20200718_131734-5b5a6ab9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k-20200718_131734.log.json + Paper: + Title: Panoptic Feature Pyramid Networks + URL: https://arxiv.org/abs/1901.02446 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fpn_head.py#L12 + Framework: PyTorch +- Name: fpn_r101_4xb4-160k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 39.35 + mIoU(ms+flip): 40.72 + Config: configs/sem_fpn/fpn_r101_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101 + - FPN + Training Resources: 4x V100 GPUS + Memory (GB): 5.9 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k_20200718_131734-306b5004.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k-20200718_131734.log.json + Paper: + Title: Panoptic Feature Pyramid Networks + URL: https://arxiv.org/abs/1901.02446 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/fpn_head.py#L12 + Framework: PyTorch diff --git a/mmsegmentation/configs/setr/README.md b/mmsegmentation/configs/setr/README.md new file mode 100644 index 0000000..15be6ec --- /dev/null +++ b/mmsegmentation/configs/setr/README.md @@ -0,0 +1,74 @@ +# SETR + +> [Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers](https://arxiv.org/abs/2012.15840) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Most recent semantic segmentation methods adopt a fully-convolutional network (FCN) with an encoder-decoder architecture. The encoder progressively reduces the spatial resolution and learns more abstract/semantic visual concepts with larger receptive fields. Since context modeling is critical for segmentation, the latest efforts have been focused on increasing the receptive field, through either dilated/atrous convolutions or inserting attention modules. However, the encoder-decoder based FCN architecture remains unchanged. In this paper, we aim to provide an alternative perspective by treating semantic segmentation as a sequence-to-sequence prediction task. Specifically, we deploy a pure transformer (ie, without convolution and resolution reduction) to encode an image as a sequence of patches. With the global context modeled in every layer of the transformer, this encoder can be combined with a simple decoder to provide a powerful segmentation model, termed SEgmentation TRansformer (SETR). Extensive experiments show that SETR achieves new state of the art on ADE20K (50.28% mIoU), Pascal Context (55.83% mIoU) and competitive results on Cityscapes. Particularly, we achieve the first position in the highly competitive ADE20K test server leaderboard on the day of submission. + + + +
+ +
+ +```None +This head has two version head. +``` + +## Usage + +You can download the pretrain from [here](https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_384-b3be5167.pth). Then you can convert its keys with the script `vit2mmseg.py` in the tools directory. + +```shell +python tools/model_converters/vit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/vit2mmseg.py \ +jx_vit_large_p16_384-b3be5167.pth pretrain/vit_large_p16.pth +``` + +This script convert the model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| SETR Naive | ViT-L | 512x512 | 16 | 160000 | 18.40 | 4.72 | V100 | 48.28 | 49.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l_naive_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_512x512_160k_b16_ade20k/setr_naive_512x512_160k_b16_ade20k_20210619_191258-061f24f5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_512x512_160k_b16_ade20k/setr_naive_512x512_160k_b16_ade20k_20210619_191258.log.json) | +| SETR PUP | ViT-L | 512x512 | 16 | 160000 | 19.54 | 4.50 | V100 | 48.24 | 49.99 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_512x512_160k_b16_ade20k/setr_pup_512x512_160k_b16_ade20k_20210619_191343-7e0ce826.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_512x512_160k_b16_ade20k/setr_pup_512x512_160k_b16_ade20k_20210619_191343.log.json) | +| SETR MLA | ViT-L | 512x512 | 8 | 160000 | 10.96 | - | V100 | 47.34 | 49.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b8_ade20k/setr_mla_512x512_160k_b8_ade20k_20210619_191118-c6d21df0.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b8_ade20k/setr_mla_512x512_160k_b8_ade20k_20210619_191118.log.json) | +| SETR MLA | ViT-L | 512x512 | 16 | 160000 | 17.30 | 5.25 | V100 | 47.39 | 49.37 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l_mla_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b16_ade20k/setr_mla_512x512_160k_b16_ade20k_20210619_191057-f9741de7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b16_ade20k/setr_mla_512x512_160k_b16_ade20k_20210619_191057.log.json) | + +### Cityscapes + +| Method | Backbone | Crop Size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| SETR Naive | ViT-L | 768x768 | 8 | 80000 | 24.06 | 0.39 | V100 | 78.10 | 80.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l_naive_8xb1-80k_cityscapes-768x768.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_vit-large_8x1_768x768_80k_cityscapes/setr_naive_vit-large_8x1_768x768_80k_cityscapes_20211123_000505-20728e80.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_vit-large_8x1_768x768_80k_cityscapes/setr_naive_vit-large_8x1_768x768_80k_cityscapes_20211123_000505.log.json) | +| SETR PUP | ViT-L | 768x768 | 8 | 80000 | 27.96 | 0.37 | V100 | 79.21 | 81.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l_pup_8xb1-80k_cityscapes-768x768.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_vit-large_8x1_768x768_80k_cityscapes/setr_pup_vit-large_8x1_768x768_80k_cityscapes_20211122_155115-f6f37b8f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_vit-large_8x1_768x768_80k_cityscapes/setr_pup_vit-large_8x1_768x768_80k_cityscapes_20211122_155115.log.json) | +| SETR MLA | ViT-L | 768x768 | 8 | 80000 | 24.10 | 0.41 | V100 | 77.00 | 79.59 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_vit-large_8x1_768x768_80k_cityscapes/setr_mla_vit-large_8x1_768x768_80k_cityscapes_20211119_101003-7f8dccbe.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_vit-large_8x1_768x768_80k_cityscapes/setr_mla_vit-large_8x1_768x768_80k_cityscapes_20211119_101003.log.json) | + +## Citation + +```bibtex +@article{zheng2020rethinking, + title={Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers}, + author={Zheng, Sixiao and Lu, Jiachen and Zhao, Hengshuang and Zhu, Xiatian and Luo, Zekun and Wang, Yabiao and Fu, Yanwei and Feng, Jianfeng and Xiang, Tao and Torr, Philip HS and others}, + journal={arXiv preprint arXiv:2012.15840}, + year={2020} +} +``` diff --git a/mmsegmentation/configs/setr/metafile.yaml b/mmsegmentation/configs/setr/metafile.yaml new file mode 100644 index 0000000..8e6bc08 --- /dev/null +++ b/mmsegmentation/configs/setr/metafile.yaml @@ -0,0 +1,197 @@ +Collections: +- Name: SETR + License: Apache License 2.0 + Metadata: + Training Data: + - ADE20K + - Cityscapes + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + README: configs/setr/README.md + Frameworks: + - PyTorch +Models: +- Name: setr_vit-l_naive_8xb2-160k_ade20k-512x512 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.28 + mIoU(ms+flip): 49.56 + Config: configs/setr/setr_vit-l_naive_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-L + - SETR + - Naive + Training Resources: 8x V100 GPUS + Memory (GB): 18.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_512x512_160k_b16_ade20k/setr_naive_512x512_160k_b16_ade20k_20210619_191258-061f24f5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_512x512_160k_b16_ade20k/setr_naive_512x512_160k_b16_ade20k_20210619_191258.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch +- Name: setr_vit-l_pup_8xb2-160k_ade20k-512x512 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.24 + mIoU(ms+flip): 49.99 + Config: configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-L + - SETR + - PUP + Training Resources: 8x V100 GPUS + Memory (GB): 19.54 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_512x512_160k_b16_ade20k/setr_pup_512x512_160k_b16_ade20k_20210619_191343-7e0ce826.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_512x512_160k_b16_ade20k/setr_pup_512x512_160k_b16_ade20k_20210619_191343.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch +- Name: setr_vit-l-mla_8xb1-160k_ade20k-512x512 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.34 + mIoU(ms+flip): 49.05 + Config: configs/setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 8 + Architecture: + - ViT-L + - SETR + - MLA + Training Resources: 8x V100 GPUS + Memory (GB): 10.96 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b8_ade20k/setr_mla_512x512_160k_b8_ade20k_20210619_191118-c6d21df0.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b8_ade20k/setr_mla_512x512_160k_b8_ade20k_20210619_191118.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch +- Name: setr_vit-l_mla_8xb2-160k_ade20k-512x512 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.39 + mIoU(ms+flip): 49.37 + Config: configs/setr/setr_vit-l_mla_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-L + - SETR + - MLA + Training Resources: 8x V100 GPUS + Memory (GB): 17.3 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b16_ade20k/setr_mla_512x512_160k_b16_ade20k_20210619_191057-f9741de7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_512x512_160k_b16_ade20k/setr_mla_512x512_160k_b16_ade20k_20210619_191057.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch +- Name: setr_vit-l_naive_8xb1-80k_cityscapes-768x768 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.1 + mIoU(ms+flip): 80.22 + Config: configs/setr/setr_vit-l_naive_8xb1-80k_cityscapes-768x768.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - ViT-L + - SETR + - Naive + Training Resources: 8x V100 GPUS + Memory (GB): 24.06 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_vit-large_8x1_768x768_80k_cityscapes/setr_naive_vit-large_8x1_768x768_80k_cityscapes_20211123_000505-20728e80.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_naive_vit-large_8x1_768x768_80k_cityscapes/setr_naive_vit-large_8x1_768x768_80k_cityscapes_20211123_000505.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch +- Name: setr_vit-l_pup_8xb1-80k_cityscapes-768x768 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.21 + mIoU(ms+flip): 81.02 + Config: configs/setr/setr_vit-l_pup_8xb1-80k_cityscapes-768x768.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - ViT-L + - SETR + - PUP + Training Resources: 8x V100 GPUS + Memory (GB): 27.96 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_vit-large_8x1_768x768_80k_cityscapes/setr_pup_vit-large_8x1_768x768_80k_cityscapes_20211122_155115-f6f37b8f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_pup_vit-large_8x1_768x768_80k_cityscapes/setr_pup_vit-large_8x1_768x768_80k_cityscapes_20211122_155115.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch +- Name: setr_vit-l_mla_8xb1-80k_cityscapes-768x768 + In Collection: SETR + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.0 + mIoU(ms+flip): 79.59 + Config: configs/setr/setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - ViT-L + - SETR + - MLA + Training Resources: 8x V100 GPUS + Memory (GB): 24.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_vit-large_8x1_768x768_80k_cityscapes/setr_mla_vit-large_8x1_768x768_80k_cityscapes_20211119_101003-7f8dccbe.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/setr/setr_mla_vit-large_8x1_768x768_80k_cityscapes/setr_mla_vit-large_8x1_768x768_80k_cityscapes_20211119_101003.log.json + Paper: + Title: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective + with Transformers + URL: https://arxiv.org/abs/2012.15840 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/setr_up_head.py#L11 + Framework: PyTorch diff --git a/mmsegmentation/configs/setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py b/mmsegmentation/configs/setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py new file mode 100644 index 0000000..1c6e284 --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l-mla_8xb1-160k_ade20k-512x512.py @@ -0,0 +1,90 @@ +_base_ = [ + '../_base_/models/setr_mla.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + img_size=(512, 512), + drop_rate=0., + init_cfg=dict( + type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), + decode_head=dict(num_classes=150), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=0, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=1, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=2, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=256, + channels=256, + in_index=3, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=0, + kernel_size=1, + concat_input=False, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ], + test_cfg=dict(mode='slide', crop_size=(512, 512), stride=(341, 341)), +) + +optimizer = dict(lr=0.001, weight_decay=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) +# num_gpus: 8 -> batch_size: 8 +train_dataloader = dict(batch_size=1) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/setr/setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py b/mmsegmentation/configs/setr/setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py new file mode 100644 index 0000000..026557f --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/setr_mla.py', '../_base_/datasets/cityscapes_768x768.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (768, 768) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + drop_rate=0, + init_cfg=dict( + type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), + test_cfg=dict(mode='slide', crop_size=(768, 768), stride=(512, 512))) + +optimizer = dict(lr=0.002, weight_decay=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) +train_dataloader = dict(batch_size=1) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/setr/setr_vit-l_mla_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/setr/setr_vit-l_mla_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..4d3fb7d --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l_mla_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,6 @@ +_base_ = ['./setr_vit-l-mla_8xb1-160k_ade20k-512x512.py'] + +# num_gpus: 8 -> batch_size: 16 +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/setr/setr_vit-l_naive_8xb1-80k_cityscapes-768x768.py b/mmsegmentation/configs/setr/setr_vit-l_naive_8xb1-80k_cityscapes-768x768.py new file mode 100644 index 0000000..db49317 --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l_naive_8xb1-80k_cityscapes-768x768.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/setr_naive.py', + '../_base_/datasets/cityscapes_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (768, 768) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + drop_rate=0., + init_cfg=dict( + type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), + test_cfg=dict(mode='slide', crop_size=(768, 768), stride=(512, 512))) + +optimizer = dict(weight_decay=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) +train_dataloader = dict(batch_size=1) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/setr/setr_vit-l_naive_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/setr/setr_vit-l_naive_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..109996c --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l_naive_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,72 @@ +_base_ = [ + '../_base_/models/setr_naive.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + img_size=(512, 512), + drop_rate=0., + init_cfg=dict( + type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), + decode_head=dict(num_classes=150), + auxiliary_head=[ + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=0, + num_classes=150, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=2, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=1, + num_classes=150, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=2, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=2, + num_classes=150, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=2, + kernel_size=1, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)) + ], + test_cfg=dict(mode='slide', crop_size=(512, 512), stride=(341, 341)), +) + +optimizer = dict(lr=0.01, weight_decay=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) +# num_gpus: 8 -> batch_size: 16 +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/setr/setr_vit-l_pup_8xb1-80k_cityscapes-768x768.py b/mmsegmentation/configs/setr/setr_vit-l_pup_8xb1-80k_cityscapes-768x768.py new file mode 100644 index 0000000..999ab18 --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l_pup_8xb1-80k_cityscapes-768x768.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/models/setr_pup.py', '../_base_/datasets/cityscapes_768x768.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (768, 768) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +crop_size = (768, 768) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + drop_rate=0., + init_cfg=dict( + type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), + auxiliary_head=[ + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=0, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=2, + up_scale=4, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=1, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=2, + up_scale=4, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=2, + num_classes=19, + dropout_ratio=0, + norm_cfg=norm_cfg, + num_convs=2, + up_scale=4, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)) + ], + test_cfg=dict(mode='slide', crop_size=crop_size, stride=(512, 512))) + +optimizer = dict(weight_decay=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) + +train_dataloader = dict(batch_size=1) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..e9bfb22 --- /dev/null +++ b/mmsegmentation/configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,72 @@ +_base_ = [ + '../_base_/models/setr_pup.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + img_size=(512, 512), + drop_rate=0., + init_cfg=dict( + type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), + decode_head=dict(num_classes=150), + auxiliary_head=[ + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=0, + num_classes=150, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=2, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=1, + num_classes=150, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=2, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='SETRUPHead', + in_channels=1024, + channels=256, + in_index=2, + num_classes=150, + dropout_ratio=0, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + num_convs=2, + kernel_size=3, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ], + test_cfg=dict(mode='slide', crop_size=(512, 512), stride=(341, 341)), +) + +optimizer = dict(lr=0.001, weight_decay=0.0) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) +# num_gpus: 8 -> batch_size: 16 +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/stdc/README.md b/mmsegmentation/configs/stdc/README.md new file mode 100644 index 0000000..3e8bf60 --- /dev/null +++ b/mmsegmentation/configs/stdc/README.md @@ -0,0 +1,73 @@ +# STDC + +> [Rethinking BiSeNet For Real-time Semantic Segmentation](https://arxiv.org/abs/2104.13188) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +BiSeNet has been proved to be a popular two-stream network for real-time segmentation. However, its principle of adding an extra path to encode spatial information is time-consuming, and the backbones borrowed from pretrained tasks, e.g., image classification, may be inefficient for image segmentation due to the deficiency of task-specific design. To handle these problems, we propose a novel and efficient structure named Short-Term Dense Concatenate network (STDC network) by removing structure redundancy. Specifically, we gradually reduce the dimension of feature maps and use the aggregation of them for image representation, which forms the basic module of STDC network. In the decoder, we propose a Detail Aggregation module by integrating the learning of spatial information into low-level layers in single-stream manner. Finally, the low-level features and deep features are fused to predict the final segmentation results. Extensive experiments on Cityscapes and CamVid dataset demonstrate the effectiveness of our method by achieving promising trade-off between segmentation accuracy and inference speed. On Cityscapes, we achieve 71.9% mIoU on the test set with a speed of 250.4 FPS on NVIDIA GTX 1080Ti, which is 45.2% faster than the latest methods, and achieve 76.8% mIoU with 97.0 FPS while inferring on higher resolution images. + + + +
+ +
+ +## Usage + +We have provided [ImageNet Pretrained STDCNet Weights](https://drive.google.com/drive/folders/1wROFwRt8qWHD4jSo8Zu1gp1d6oYJ3ns1) models converted from [official repo](https://github.com/MichaelFan01/STDC-Seg). + +If you want to convert keys on your own to use official repositories' pre-trained models, we also provide a script [`stdc2mmseg.py`](../../tools/model_converters/stdc2mmseg.py) in the tools directory to convert the key of models from [the official repo](https://github.com/MichaelFan01/STDC-Seg) to MMSegmentation style. + +```shell +python tools/model_converters/stdc2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} ${STDC_TYPE} +``` + +E.g. + +```shell +python tools/model_converters/stdc2mmseg.py ./STDCNet813M_73.91.tar ./pretrained/stdc1.pth STDC1 + +python tools/model_converters/stdc2mmseg.py ./STDCNet1446_76.47.tar ./pretrained/stdc2.pth STDC2 +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| STDC | STDC1 (No Pretrain) | 512x1024 | 80000 | 7.15 | 23.06 | V100 | 71.82 | 73.89 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/stdc/stdc1_4xb12-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_512x1024_80k_cityscapes/stdc1_512x1024_80k_cityscapes_20220224_073048-74e6920a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_512x1024_80k_cityscapes/stdc1_512x1024_80k_cityscapes_20220224_073048.log.json) | +| STDC | STDC1 | 512x1024 | 80000 | - | - | V100 | 74.94 | 76.97 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_in1k-pre_512x1024_80k_cityscapes/stdc1_in1k-pre_512x1024_80k_cityscapes_20220224_141648-3d4c2981.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_in1k-pre_512x1024_80k_cityscapes/stdc1_in1k-pre_512x1024_80k_cityscapes_20220224_141648.log.json) | +| STDC | STDC2 (No Pretrain) | 512x1024 | 80000 | 8.27 | 23.71 | V100 | 73.15 | 76.13 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/stdc/stdc2_4xb12-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_512x1024_80k_cityscapes/stdc2_512x1024_80k_cityscapes_20220222_132015-fb1e3a1a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_512x1024_80k_cityscapes/stdc2_512x1024_80k_cityscapes_20220222_132015.log.json) | +| STDC | STDC2 | 512x1024 | 80000 | - | - | V100 | 76.67 | 78.67 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/stdc/stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_in1k-pre_512x1024_80k_cityscapes/stdc2_in1k-pre_512x1024_80k_cityscapes_20220224_073048-1f8f0f6c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_in1k-pre_512x1024_80k_cityscapes/stdc2_in1k-pre_512x1024_80k_cityscapes_20220224_073048.log.json) | + +Note: + +- For STDC on Cityscapes dataset, default setting is 4 GPUs with 12 samples per GPU in training. +- `No Pretrain` means the model is trained from scratch. +- The FPS is for reference only. The environment is also different from paper setting, whose input size is `512x1024` and `768x1536`, i.e., 50% and 75% of our input size, respectively and using TensorRT. +- The parameter `fusion_kernel` in `STDCHead` is not learnable. In official repo, `find_unused_parameters=True` is set [here](https://github.com/MichaelFan01/STDC-Seg/blob/59ff37fbd693b99972c76fcefe97caa14aeb619f/train.py#L220). You may check it by printing model parameters of original repo on your own. + +## Citation + +```bibtex +@inproceedings{fan2021rethinking, + title={Rethinking BiSeNet For Real-time Semantic Segmentation}, + author={Fan, Mingyuan and Lai, Shenqi and Huang, Junshi and Wei, Xiaoming and Chai, Zhenhua and Luo, Junfeng and Wei, Xiaolin}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={9716--9725}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/stdc/metafile.yaml b/mmsegmentation/configs/stdc/metafile.yaml new file mode 100644 index 0000000..93cb14f --- /dev/null +++ b/mmsegmentation/configs/stdc/metafile.yaml @@ -0,0 +1,107 @@ +Collections: +- Name: STDC + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + Paper: + Title: Rethinking BiSeNet For Real-time Semantic Segmentation + URL: https://arxiv.org/abs/2104.13188 + README: configs/stdc/README.md + Frameworks: + - PyTorch +Models: +- Name: stdc1_4xb12-80k_cityscapes-512x1024 + In Collection: STDC + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 71.82 + mIoU(ms+flip): 73.89 + Config: configs/stdc/stdc1_4xb12-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 48 + Architecture: + - STDC1 + - STDC + Training Resources: 4x V100 GPUS + Memory (GB): 7.15 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_512x1024_80k_cityscapes/stdc1_512x1024_80k_cityscapes_20220224_073048-74e6920a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_512x1024_80k_cityscapes/stdc1_512x1024_80k_cityscapes_20220224_073048.log.json + Paper: + Title: Rethinking BiSeNet For Real-time Semantic Segmentation + URL: https://arxiv.org/abs/2104.13188 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/stdc.py#L394 + Framework: PyTorch +- Name: stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024 + In Collection: STDC + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 74.94 + mIoU(ms+flip): 76.97 + Config: configs/stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 48 + Architecture: + - STDC1 + - STDC + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_in1k-pre_512x1024_80k_cityscapes/stdc1_in1k-pre_512x1024_80k_cityscapes_20220224_141648-3d4c2981.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc1_in1k-pre_512x1024_80k_cityscapes/stdc1_in1k-pre_512x1024_80k_cityscapes_20220224_141648.log.json + Paper: + Title: Rethinking BiSeNet For Real-time Semantic Segmentation + URL: https://arxiv.org/abs/2104.13188 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/stdc.py#L394 + Framework: PyTorch +- Name: stdc2_4xb12-80k_cityscapes-512x1024 + In Collection: STDC + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 73.15 + mIoU(ms+flip): 76.13 + Config: configs/stdc/stdc2_4xb12-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 48 + Architecture: + - STDC2 + - STDC + Training Resources: 4x V100 GPUS + Memory (GB): 8.27 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_512x1024_80k_cityscapes/stdc2_512x1024_80k_cityscapes_20220222_132015-fb1e3a1a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_512x1024_80k_cityscapes/stdc2_512x1024_80k_cityscapes_20220222_132015.log.json + Paper: + Title: Rethinking BiSeNet For Real-time Semantic Segmentation + URL: https://arxiv.org/abs/2104.13188 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/stdc.py#L394 + Framework: PyTorch +- Name: stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024 + In Collection: STDC + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 76.67 + mIoU(ms+flip): 78.67 + Config: configs/stdc/stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 48 + Architecture: + - STDC2 + - STDC + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_in1k-pre_512x1024_80k_cityscapes/stdc2_in1k-pre_512x1024_80k_cityscapes_20220224_073048-1f8f0f6c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/stdc/stdc2_in1k-pre_512x1024_80k_cityscapes/stdc2_in1k-pre_512x1024_80k_cityscapes_20220224_073048.log.json + Paper: + Title: Rethinking BiSeNet For Real-time Semantic Segmentation + URL: https://arxiv.org/abs/2104.13188 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/stdc.py#L394 + Framework: PyTorch diff --git a/mmsegmentation/configs/stdc/stdc1_4xb12-80k_cityscapes-512x1024.py b/mmsegmentation/configs/stdc/stdc1_4xb12-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..20aec3d --- /dev/null +++ b/mmsegmentation/configs/stdc/stdc1_4xb12-80k_cityscapes-512x1024.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/stdc.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=80000, + by_epoch=False, + ) +] +train_dataloader = dict(batch_size=12, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py b/mmsegmentation/configs/stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..15e807f --- /dev/null +++ b/mmsegmentation/configs/stdc/stdc1_in1k-pre_4xb12-80k_cityscapes-512x1024.py @@ -0,0 +1,6 @@ +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/stdc/stdc1_20220308-5368626c.pth' # noqa +_base_ = './stdc1_4xb12-80k_cityscapes-512x1024.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint)))) diff --git a/mmsegmentation/configs/stdc/stdc2_4xb12-80k_cityscapes-512x1024.py b/mmsegmentation/configs/stdc/stdc2_4xb12-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..5657351 --- /dev/null +++ b/mmsegmentation/configs/stdc/stdc2_4xb12-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './stdc1_4xb12-80k_cityscapes-512x1024.py' +model = dict(backbone=dict(backbone_cfg=dict(stdc_type='STDCNet2'))) diff --git a/mmsegmentation/configs/stdc/stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024.py b/mmsegmentation/configs/stdc/stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..05a202b --- /dev/null +++ b/mmsegmentation/configs/stdc/stdc2_in1k-pre_4xb12-80k_cityscapes-512x1024.py @@ -0,0 +1,6 @@ +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/stdc/stdc2_20220308-7dbd9127.pth' # noqa +_base_ = './stdc2_4xb12-80k_cityscapes-512x1024.py' +model = dict( + backbone=dict( + backbone_cfg=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint)))) diff --git a/mmsegmentation/configs/swin/README.md b/mmsegmentation/configs/swin/README.md new file mode 100644 index 0000000..64f0d5f --- /dev/null +++ b/mmsegmentation/configs/swin/README.md @@ -0,0 +1,76 @@ +# Swin Transformer + +> [Swin Transformer: Hierarchical Vision Transformer using Shifted Windows](https://arxiv.org/abs/2103.14030) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +This paper presents a new vision Transformer, called Swin Transformer, that capably serves as a general-purpose backbone for computer vision. Challenges in adapting Transformer from language to vision arise from differences between the two domains, such as large variations in the scale of visual entities and the high resolution of pixels in images compared to words in text. To address these differences, we propose a hierarchical Transformer whose representation is computed with Shifted windows. The shifted windowing scheme brings greater efficiency by limiting self-attention computation to non-overlapping local windows while also allowing for cross-window connection. This hierarchical architecture has the flexibility to model at various scales and has linear computational complexity with respect to image size. These qualities of Swin Transformer make it compatible with a broad range of vision tasks, including image classification (87.3 top-1 accuracy on ImageNet-1K) and dense prediction tasks such as object detection (58.7 box AP and 51.1 mask AP on COCO test-dev) and semantic segmentation (53.5 mIoU on ADE20K val). Its performance surpasses the previous state-of-the-art by a large margin of +2.7 box AP and +2.6 mask AP on COCO, and +3.2 mIoU on ADE20K, demonstrating the potential of Transformer-based models as vision backbones. The hierarchical design and the shifted window approach also prove beneficial for all-MLP architectures. The code and models are publicly available at [this https URL](https://github.com/microsoft/Swin-Transformer). + + + +
+ +
+ +## Usage + +We have provided pretrained models converted from [official repo](https://github.com/microsoft/Swin-Transformer)๏ผŽ + +If you want to convert keys on your own to use official repositories' pre-trained models, we also provide a script [`swin2mmseg.py`](../../tools/model_converters/swin2mmseg.py) in the tools directory to convert the key of models from [the official repo](https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation) to MMSegmentation style. + +```shell +python tools/model_converters/swin2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/swin2mmseg.py https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224.pth pretrain/swin_base_patch4_window7_224.pth +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +In our default setting, pretrained models and their corresponding [original models](https://github.com/microsoft/Swin-Transforme) models could be defined below: + +| pretrained models | original models | +| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| pretrain/swin_tiny_patch4_window7_224.pth | [swin_tiny_patch4_window7_224.pth](https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth) | +| pretrain/swin_small_patch4_window7_224.pth | [swin_small_patch4_window7_224.pth](https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth) | +| pretrain/swin_base_patch4_window7_224.pth | [swin_base_patch4_window7_224.pth](https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224.pth) | +| pretrain/swin_base_patch4_window7_224_22k.pth | [swin_base_patch4_window7_224_22k.pth](https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22k.pth) | +| pretrain/swin_base_patch4_window12_384.pth | [swin_base_patch4_window12_384.pth](https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384.pth) | +| pretrain/swin_base_patch4_window12_384_22k.pth | [swin_base_patch4_window12_384_22k.pth](https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22k.pth) | + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | pretrain | pretrain img size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ------------ | ----------------- | ---------- | ------- | -------- | -------------- | ------ | ----- | ------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | Swin-T | 512x512 | ImageNet-1K | 224x224 | 16 | 160000 | 5.02 | 21.06 | V100 | 44.41 | 45.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542-e380ad3e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542.log.json) | +| UPerNet | Swin-S | 512x512 | ImageNet-1K | 224x224 | 16 | 160000 | 6.17 | 14.72 | V100 | 47.72 | 49.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192015-ee2fff1c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192015.log.json) | +| UPerNet | Swin-B | 512x512 | ImageNet-1K | 224x224 | 16 | 160000 | 7.61 | 12.65 | V100 | 47.99 | 49.57 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192340-593b0e13.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192340.log.json) | +| UPerNet | Swin-B | 512x512 | ImageNet-22K | 224x224 | 16 | 160000 | - | - | V100 | 50.13 | 51.9 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K_20210526_211650-762e2178.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K_20210526_211650.log.json) | +| UPerNet | Swin-B | 512x512 | ImageNet-1K | 384x384 | 16 | 160000 | 8.52 | 12.10 | V100 | 48.35 | 49.65 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K_20210531_132020-05b22ea4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K_20210531_132020.log.json) | +| UPerNet | Swin-B | 512x512 | ImageNet-22K | 384x384 | 16 | 160000 | - | - | V100 | 50.76 | 52.4 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K_20210531_125459-429057bf.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K_20210531_125459.log.json) | + +## Citation + +```bibtex +@article{liu2021Swin, + title={Swin Transformer: Hierarchical Vision Transformer using Shifted Windows}, + author={Liu, Ze and Lin, Yutong and Cao, Yue and Hu, Han and Wei, Yixuan and Zhang, Zheng and Lin, Stephen and Guo, Baining}, + journal={arXiv preprint arXiv:2103.14030}, + year={2021} +} +``` diff --git a/mmsegmentation/configs/swin/metafile.yaml b/mmsegmentation/configs/swin/metafile.yaml new file mode 100644 index 0000000..67a4e07 --- /dev/null +++ b/mmsegmentation/configs/swin/metafile.yaml @@ -0,0 +1,143 @@ +Models: +- Name: swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.41 + mIoU(ms+flip): 45.79 + Config: configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-T + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 5.02 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542-e380ad3e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542.log.json + Paper: + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + URL: https://arxiv.org/abs/2103.14030 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/swin.py#L524 + Framework: PyTorch +- Name: swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.72 + mIoU(ms+flip): 49.24 + Config: configs/swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 6.17 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192015-ee2fff1c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192015.log.json + Paper: + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + URL: https://arxiv.org/abs/2103.14030 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/swin.py#L524 + Framework: PyTorch +- Name: swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.99 + mIoU(ms+flip): 49.57 + Config: configs/swin/swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 7.61 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192340-593b0e13.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192340.log.json + Paper: + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + URL: https://arxiv.org/abs/2103.14030 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/swin.py#L524 + Framework: PyTorch +- Name: swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 50.13 + mIoU(ms+flip): 51.9 + Config: configs/swin/swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-B + - UPerNet + Training Resources: 8x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K_20210526_211650-762e2178.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K_20210526_211650.log.json + Paper: + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + URL: https://arxiv.org/abs/2103.14030 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/swin.py#L524 + Framework: PyTorch +- Name: swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.35 + mIoU(ms+flip): 49.65 + Config: configs/swin/swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 8.52 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K_20210531_132020-05b22ea4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K_20210531_132020.log.json + Paper: + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + URL: https://arxiv.org/abs/2103.14030 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/swin.py#L524 + Framework: PyTorch +- Name: swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 50.76 + mIoU(ms+flip): 52.4 + Config: configs/swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Swin-B + - UPerNet + Training Resources: 8x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K_20210531_125459-429057bf.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K_20210531_125459.log.json + Paper: + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + URL: https://arxiv.org/abs/2103.14030 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/swin.py#L524 + Framework: PyTorch diff --git a/mmsegmentation/configs/swin/swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..11cea36 --- /dev/null +++ b/mmsegmentation/configs/swin/swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,14 @@ +_base_ = [ + 'swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py' +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_20220317-55b0104a.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + pretrain_img_size=384, + embed_dims=128, + depths=[2, 2, 18, 2], + num_heads=[4, 8, 16, 32], + window_size=12), + decode_head=dict(in_channels=[128, 256, 512, 1024], num_classes=150), + auxiliary_head=dict(in_channels=512, num_classes=150)) diff --git a/mmsegmentation/configs/swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..5c11716 --- /dev/null +++ b/mmsegmentation/configs/swin/swin-base-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,7 @@ +_base_ = [ + './swin-base-patch4-window12-in1k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py' # noqa +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_22k_20220317-e5c09f74.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file))) diff --git a/mmsegmentation/configs/swin/swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..73bf616 --- /dev/null +++ b/mmsegmentation/configs/swin/swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = [ + './swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py' +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window7_224_20220317-e9b98025.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + embed_dims=128, + depths=[2, 2, 18, 2], + num_heads=[4, 8, 16, 32]), + decode_head=dict(in_channels=[128, 256, 512, 1024], num_classes=150), + auxiliary_head=dict(in_channels=512, num_classes=150)) diff --git a/mmsegmentation/configs/swin/swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..96148cd --- /dev/null +++ b/mmsegmentation/configs/swin/swin-base-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,7 @@ +_base_ = [ + './swin-base-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py' +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window7_224_22k_20220317-4f79f7c0.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file))) diff --git a/mmsegmentation/configs/swin/swin-large-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-large-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..a0a654e --- /dev/null +++ b/mmsegmentation/configs/swin/swin-large-patch4-window12-in22k-384x384-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + 'swin-large-patch4-window7-in22k-pre_upernet_' + '8xb2-160k_ade20k-512x512.py' +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + pretrain_img_size=384, + window_size=12)) diff --git a/mmsegmentation/configs/swin/swin-large-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-large-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..c93cdfe --- /dev/null +++ b/mmsegmentation/configs/swin/swin-large-patch4-window7-in22k-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,15 @@ +_base_ = [ + 'swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_' + 'ade20k-512x512.py' +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window7_224_22k_20220412-aeecf2aa.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + pretrain_img_size=224, + embed_dims=192, + depths=[2, 2, 18, 2], + num_heads=[6, 12, 24, 48], + window_size=7), + decode_head=dict(in_channels=[192, 384, 768, 1536], num_classes=150), + auxiliary_head=dict(in_channels=768, num_classes=150)) diff --git a/mmsegmentation/configs/swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..19863df --- /dev/null +++ b/mmsegmentation/configs/swin/swin-small-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + './swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py' +] +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_small_patch4_window7_224_20220317-7ba6d6dd.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + depths=[2, 2, 18, 2]), + decode_head=dict(in_channels=[96, 192, 384, 768], num_classes=150), + auxiliary_head=dict(in_channels=384, num_classes=150)) diff --git a/mmsegmentation/configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..f61a276 --- /dev/null +++ b/mmsegmentation/configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,52 @@ +_base_ = [ + '../_base_/models/upernet_swin.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_tiny_patch4_window7_224_20220317-1cdeb081.pth' # noqa +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), + embed_dims=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + use_abs_pos_embed=False, + drop_path_rate=0.3, + patch_norm=True), + decode_head=dict(in_channels=[96, 192, 384, 768], num_classes=150), + auxiliary_head=dict(in_channels=384, num_classes=150)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/swin/swin-tiny-patch4-window7_upernet_1xb8-20k_levir-256x256.py b/mmsegmentation/configs/swin/swin-tiny-patch4-window7_upernet_1xb8-20k_levir-256x256.py new file mode 100644 index 0000000..7b90686 --- /dev/null +++ b/mmsegmentation/configs/swin/swin-tiny-patch4-window7_upernet_1xb8-20k_levir-256x256.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/models/upernet_swin.py', '../_base_/datasets/levir_256x256.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +crop_size = (256, 256) +norm_cfg = dict(type='BN', requires_grad=True) +data_preprocessor = dict( + size=crop_size, + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53, 123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375, 58.395, 57.12, 57.375], + bgr_to_rgb=False) + +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + in_channels=6, + embed_dims=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + use_abs_pos_embed=False, + drop_path_rate=0.3, + patch_norm=True), + decode_head=dict(in_channels=[96, 192, 384, 768], num_classes=2), + auxiliary_head=dict(in_channels=384, num_classes=2)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=20000, + by_epoch=False, + ) +] + +train_dataloader = dict(batch_size=4) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/twins/README.md b/mmsegmentation/configs/twins/README.md new file mode 100644 index 0000000..e4b3735 --- /dev/null +++ b/mmsegmentation/configs/twins/README.md @@ -0,0 +1,76 @@ +# Twins + +> [Twins: Revisiting the Design of Spatial Attention in Vision Transformers](https://arxiv.org/pdf/2104.13840.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Very recently, a variety of vision transformer architectures for dense prediction tasks have been proposed and they show that the design of spatial attention is critical to their success in these tasks. In this work, we revisit the design of the spatial attention and demonstrate that a carefully-devised yet simple spatial attention mechanism performs favourably against the state-of-the-art schemes. As a result, we propose two vision transformer architectures, namely, Twins-PCPVT and Twins-SVT. Our proposed architectures are highly-efficient and easy to implement, only involving matrix multiplications that are highly optimized in modern deep learning frameworks. More importantly, the proposed architectures achieve excellent performance on a wide range of visual tasks, including image level classification as well as dense detection and segmentation. The simplicity and strong performance suggest that our proposed architectures may serve as stronger backbones for many vision tasks. Our code is released at [this https URL](https://github.com/Meituan-AutoML/Twins). + + + +
+ +
+ +## Usage + +We have provided pretrained models converted from [official repo](https://github.com/Meituan-AutoML/Twins). + +If you want to convert keys on your own to use official repositories' pre-trained models, we also provide a script [`twins2mmseg.py`](../../tools/model_converters/twins2mmseg.py) in the tools directory to convert the key of models from [the official repo](https://github.com/Meituan-AutoML/Twins) to MMSegmentation style. + +```shell +python tools/model_converters/twins2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} ${MODEL_TYPE} +``` + +This script convert `pcpvt` or `svt` pretrained model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +For example, + +```shell +python tools/model_converters/twins2mmseg.py ./alt_gvt_base.pth ./pretrained/alt_gvt_base.pth svt +``` + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | ------------------- | --------- | ------- | -------- | -------------- | ------ | ----- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FPN | Twins-PCPVT-S | 512x512 | 80000 | 6.60 | 27.15 | V100 | 43.26 | 44.11 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_204132-41acd132.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_204132.log.json) | +| UPerNet | Twins-PCPVT-S | 512x512 | 160000 | 9.67 | 14.24 | V100 | 46.04 | 46.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k_20211201_233537-8e99c07a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k_20211201_233537.log.json) | +| FPN | Twins-PCPVT-B | 512x512 | 80000 | 8.41 | 19.67 | V100 | 45.66 | 46.48 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141019-d396db72.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141019.log.json) | +| UPerNet | Twins-PCPVT-B (8x2) | 512x512 | 160000 | 6.46 | 12.04 | V100 | 47.91 | 48.64 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k_20211130_141020-02094ea5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k_20211130_141020.log.json) | +| FPN | Twins-PCPVT-L | 512x512 | 80000 | 10.78 | 14.32 | V100 | 45.94 | 46.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_105226-bc6d61dc.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_105226.log.json) | +| UPerNet | Twins-PCPVT-L (8x2) | 512x512 | 160000 | 7.82 | 10.70 | V100 | 49.35 | 50.08 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k_20211201_075053-c6095c07.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k_20211201_075053.log.json) | +| FPN | Twins-SVT-S | 512x512 | 80000 | 5.80 | 29.79 | V100 | 44.47 | 45.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141006-0a0d3317.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141006.log.json) | +| UPerNet | SVT-S (8x2) | 512x512 | 160000 | 4.93 | 15.09 | V100 | 46.08 | 46.96 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_uperhead_8x2_512x512_160k_ade20k/twins_svt-s_uperhead_8x2_512x512_160k_ade20k_20211130_141005-e48a2d94.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_uperhead_8x2_512x512_160k_ade20k/twins_svt-s_uperhead_8x2_512x512_160k_ade20k_20211130_141005.log.json) | +| FPN | Twins-SVT-B | 512x512 | 80000 | 8.75 | 21.10 | V100 | 46.77 | 47.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_113849-88b2907c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_113849.log.json) | +| UPerNet | Twins-SVT-B (8x2) | 512x512 | 160000 | 6.77 | 12.66 | V100 | 48.04 | 48.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_svt-b_uperhead_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_uperhead_8x2_512x512_160k_ade20k/twins_svt-b_uperhead_8x2_512x512_160k_ade20k_20211202_040826-0943a1f1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_uperhead_8x2_512x512_160k_ade20k/twins_svt-b_uperhead_8x2_512x512_160k_ade20k_20211202_040826.log.json) | +| FPN | Twins-SVT-L | 512x512 | 80000 | 11.20 | 17.80 | V100 | 46.55 | 47.74 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141005-1d59bee2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141005.log.json) | +| UPerNet | Twins-SVT-L (8x2) | 512x512 | 160000 | 8.41 | 10.73 | V100 | 49.65 | 50.63 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_uperhead_8x2_512x512_160k_ade20k/twins_svt-l_uperhead_8x2_512x512_160k_ade20k_20211130_141005-3e2cae61.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_uperhead_8x2_512x512_160k_ade20k/twins_svt-l_uperhead_8x2_512x512_160k_ade20k_20211130_141005.log.json) | + +Note: + +- `8x2` means 8 GPUs with 2 samples per GPU in training. Default setting of Twins on ADE20K is 8 GPUs with 4 samples per GPU in training. +- `UPerNet` and `FPN` are decoder heads utilized in corresponding Twins model, which is `UPerHead` and `FPNHead`, respectively. Specifically, models in [official repo](https://github.com/Meituan-AutoML/Twins) all use `UPerHead`. + +## Citation + +```bibtex +@article{chu2021twins, + title={Twins: Revisiting spatial attention design in vision transformers}, + author={Chu, Xiangxiang and Tian, Zhi and Wang, Yuqing and Zhang, Bo and Ren, Haibing and Wei, Xiaolin and Xia, Huaxia and Shen, Chunhua}, + journal={arXiv preprint arXiv:2104.13840}, + year={2021}altgvt +} +``` diff --git a/mmsegmentation/configs/twins/metafile.yaml b/mmsegmentation/configs/twins/metafile.yaml new file mode 100644 index 0000000..0de78d9 --- /dev/null +++ b/mmsegmentation/configs/twins/metafile.yaml @@ -0,0 +1,289 @@ +Models: +- Name: twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.26 + mIoU(ms+flip): 44.11 + Config: configs/twins/twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-PCPVT-S + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 6.6 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_204132-41acd132.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_204132.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.04 + mIoU(ms+flip): 46.92 + Config: configs/twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-PCPVT-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.67 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k_20211201_233537-8e99c07a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k_20211201_233537.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.66 + mIoU(ms+flip): 46.48 + Config: configs/twins/twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-PCPVT-B + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 8.41 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141019-d396db72.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141019.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.91 + mIoU(ms+flip): 48.64 + Config: configs/twins/twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Twins-PCPVT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 6.46 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k_20211130_141020-02094ea5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k_20211130_141020.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.94 + mIoU(ms+flip): 46.7 + Config: configs/twins/twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-PCPVT-L + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 10.78 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_105226-bc6d61dc.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_105226.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 49.35 + mIoU(ms+flip): 50.08 + Config: configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Twins-PCPVT-L + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 7.82 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k_20211201_075053-c6095c07.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k_20211201_075053.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 44.47 + mIoU(ms+flip): 45.42 + Config: configs/twins/twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-SVT-S + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 5.8 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141006-0a0d3317.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141006.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_svt-s_uperhead_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.08 + mIoU(ms+flip): 46.96 + Config: configs/twins/twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - SVT-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 4.93 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_uperhead_8x2_512x512_160k_ade20k/twins_svt-s_uperhead_8x2_512x512_160k_ade20k_20211130_141005-e48a2d94.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-s_uperhead_8x2_512x512_160k_ade20k/twins_svt-s_uperhead_8x2_512x512_160k_ade20k_20211130_141005.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.77 + mIoU(ms+flip): 47.47 + Config: configs/twins/twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-SVT-B + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 8.75 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_113849-88b2907c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k_20211201_113849.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_svt-b_uperhead_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 48.04 + mIoU(ms+flip): 48.87 + Config: configs/twins/twins_svt-b_uperhead_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Twins-SVT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 6.77 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_uperhead_8x2_512x512_160k_ade20k/twins_svt-b_uperhead_8x2_512x512_160k_ade20k_20211202_040826-0943a1f1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-b_uperhead_8x2_512x512_160k_ade20k/twins_svt-b_uperhead_8x2_512x512_160k_ade20k_20211202_040826.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512 + In Collection: FPN + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.55 + mIoU(ms+flip): 47.74 + Config: configs/twins/twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 32 + Architecture: + - Twins-SVT-L + - FPN + Training Resources: 8x V100 GPUS + Memory (GB): 11.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141005-1d59bee2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k_20211130_141005.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch +- Name: twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 49.65 + mIoU(ms+flip): 50.63 + Config: configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - Twins-SVT-L + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 8.41 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_uperhead_8x2_512x512_160k_ade20k/twins_svt-l_uperhead_8x2_512x512_160k_ade20k_20211130_141005-3e2cae61.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/twins/twins_svt-l_uperhead_8x2_512x512_160k_ade20k/twins_svt-l_uperhead_8x2_512x512_160k_ade20k_20211130_141005.log.json + Paper: + Title: 'Twins: Revisiting the Design of Spatial Attention in Vision Transformers' + URL: https://arxiv.org/pdf/2104.13840.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.20.0/mmseg/models/backbones/twins.py#L352 + Framework: PyTorch diff --git a/mmsegmentation/configs/twins/twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..4739ad4 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_pcpvt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = ['./twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/pcpvt_base_20220308-0621964c.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + depths=[3, 4, 18, 3]), ) diff --git a/mmsegmentation/configs/twins/twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..ba97485 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_pcpvt-b_uperhead_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = ['./twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/pcpvt_base_20220308-0621964c.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + depths=[3, 4, 18, 3], + drop_path_rate=0.3)) + +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/twins/twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..bff7c41 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_pcpvt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = ['./twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/pcpvt_large_20220308-37579dc6.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + depths=[3, 8, 27, 3])) diff --git a/mmsegmentation/configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..666ff5b --- /dev/null +++ b/mmsegmentation/configs/twins/twins_pcpvt-l_uperhead_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = ['./twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/pcpvt_large_20220308-37579dc6.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + depths=[3, 8, 27, 3], + drop_path_rate=0.3)) + +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/twins/twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..3b480b9 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_pcpvt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/twins_pcpvt-s_fpn.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0001), + clip_grad=None) diff --git a/mmsegmentation/configs/twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..387cf60 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_pcpvt-s_uperhead_8xb4-160k_ade20k-512x512.py @@ -0,0 +1,31 @@ +_base_ = [ + '../_base_/models/twins_pcpvt-s_upernet.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict(custom_keys={ + 'pos_block': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] diff --git a/mmsegmentation/configs/twins/twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..5e9fa00 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_svt-b_fpn_fpnhead_8xb4-80k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/alt_gvt_base_20220308-1b7eb711.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=[96, 192, 384, 768], + num_heads=[3, 6, 12, 24], + depths=[2, 2, 18, 2]), + neck=dict(in_channels=[96, 192, 384, 768]), +) diff --git a/mmsegmentation/configs/twins/twins_svt-b_uperhead_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_svt-b_uperhead_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..6ce2361 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_svt-b_uperhead_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,12 @@ +_base_ = ['./twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/alt_gvt_base_20220308-1b7eb711.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=[96, 192, 384, 768], + num_heads=[3, 6, 12, 24], + depths=[2, 2, 18, 2]), + decode_head=dict(in_channels=[96, 192, 384, 768]), + auxiliary_head=dict(in_channels=384)) diff --git a/mmsegmentation/configs/twins/twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..b7e5f9c --- /dev/null +++ b/mmsegmentation/configs/twins/twins_svt-l_fpn_fpnhead_8xb4-80k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = ['./twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/alt_gvt_large_20220308-fb5936f3.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=[128, 256, 512, 1024], + num_heads=[4, 8, 16, 32], + depths=[2, 2, 18, 2], + drop_path_rate=0.3), + neck=dict(in_channels=[128, 256, 512, 1024]), +) diff --git a/mmsegmentation/configs/twins/twins_svt-l_uperhead_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_svt-l_uperhead_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..69c69df --- /dev/null +++ b/mmsegmentation/configs/twins/twins_svt-l_uperhead_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,13 @@ +_base_ = ['./twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py'] + +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/alt_gvt_large_20220308-fb5936f3.pth' # noqa + +model = dict( + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=[128, 256, 512, 1024], + num_heads=[4, 8, 16, 32], + depths=[2, 2, 18, 2], + drop_path_rate=0.3), + decode_head=dict(in_channels=[128, 256, 512, 1024]), + auxiliary_head=dict(in_channels=512)) diff --git a/mmsegmentation/configs/twins/twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..c1aad83 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_svt-s_fpn_fpnhead_8xb4-80k_ade20k-512x512.py @@ -0,0 +1,28 @@ +_base_ = [ + '../_base_/models/twins_pcpvt-s_fpn.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/alt_gvt_small_20220308-7e1c3695.pth' # noqa + +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='SVT', + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=[64, 128, 256, 512], + num_heads=[2, 4, 8, 16], + mlp_ratios=[4, 4, 4, 4], + depths=[2, 2, 10, 4], + windiow_sizes=[7, 7, 7, 7], + norm_after_stage=True), + neck=dict(in_channels=[64, 128, 256, 512], out_channels=256, num_outs=4), + decode_head=dict(num_classes=150), +) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0001), + clip_grad=None) diff --git a/mmsegmentation/configs/twins/twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/twins/twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..3846795 --- /dev/null +++ b/mmsegmentation/configs/twins/twins_svt-s_uperhead_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,49 @@ +_base_ = [ + '../_base_/models/twins_pcpvt-s_upernet.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/twins/alt_gvt_small_20220308-7e1c3695.pth' # noqa + +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + type='SVT', + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + embed_dims=[64, 128, 256, 512], + num_heads=[2, 4, 8, 16], + mlp_ratios=[4, 4, 4, 4], + depths=[2, 2, 10, 4], + windiow_sizes=[7, 7, 7, 7], + norm_after_stage=True), + decode_head=dict(in_channels=[64, 128, 256, 512]), + auxiliary_head=dict(in_channels=256)) + +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict(custom_keys={ + 'pos_block': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +train_dataloader = dict(batch_size=2, num_workers=2) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/unet/README.md b/mmsegmentation/configs/unet/README.md new file mode 100644 index 0000000..7225fbb --- /dev/null +++ b/mmsegmentation/configs/unet/README.md @@ -0,0 +1,92 @@ +# UNet + +> [U-Net: Convolutional Networks for Biomedical Image Segmentation](https://arxiv.org/abs/1505.04597) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +There is large consent that successful training of deep networks requires many thousand annotated training samples. In this paper, we present a network and training strategy that relies on the strong use of data augmentation to use the available annotated samples more efficiently. The architecture consists of a contracting path to capture context and a symmetric expanding path that enables precise localization. We show that such a network can be trained end-to-end from very few images and outperforms the prior best method (a sliding-window convolutional network) on the ISBI challenge for segmentation of neuronal structures in electron microscopic stacks. Using the same network trained on transmitted light microscopy images (phase contrast and DIC) we won the ISBI cell tracking challenge 2015 in these categories by a large margin. Moreover, the network is fast. Segmentation of a 512x512 image takes less than a second on a recent GPU. The full implementation (based on Caffe) and the trained networks are available at [this http URL](https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Loss | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ---------- | ----------- | ------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UNet + FCN | UNet-S5-D16 | Cross Entropy | 512x1024 | 160000 | 17.91 | 3.05 | V100 | 69.10 | 71.05 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204-6860854e.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204.log.json) | + +### DRIVE + +| Method | Backbone | Loss | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Device | mDice | Dice | config | download | +| ---------------- | ----------- | -------------------- | ---------- | --------- | -----: | ------- | -------- | -------------: | ------ | ----: | ----: | ------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UNet + FCN | UNet-S5-D16 | Cross Entropy | 584x565 | 64x64 | 42x42 | 40000 | 0.680 | - | V100 | 88.38 | 78.67 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-40k_drive-64x64.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_64x64_40k_drive/fcn_unet_s5-d16_64x64_40k_drive_20201223_191051-5daf6d3b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_64x64_40k_drive/unet_s5-d16_64x64_40k_drive-20201223_191051.log.json) | +| UNet + FCN | UNet-S5-D16 | Cross Entropy + Dice | 584x565 | 64x64 | 42x42 | 40000 | 0.582 | - | V100 | 88.71 | 79.32 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201820-785de5c2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201820.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy | 584x565 | 64x64 | 42x42 | 40000 | 0.599 | - | V100 | 88.35 | 78.62 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive_20201227_181818-aac73387.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive-20201227_181818.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy + Dice | 584x565 | 64x64 | 42x42 | 40000 | 0.585 | - | V100 | 88.76 | 79.42 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201821-22b3e3ba.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201821.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy | 584x565 | 64x64 | 42x42 | 40000 | 0.596 | - | V100 | 88.38 | 78.69 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive_20201226_094047-0671ff20.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive-20201226_094047.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy + Dice | 584x565 | 64x64 | 42x42 | 40000 | 0.582 | - | V100 | 88.84 | 79.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201825-6bf0efd7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201825.log.json) | + +### STARE + +| Method | Backbone | Loss | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Device | mDice | Dice | config | download | +| ---------------- | ----------- | -------------------- | ---------- | --------- | -----: | ------- | -------- | -------------: | ------ | ----: | ----: | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| UNet + FCN | UNet-S5-D16 | Cross Entropy | 605x700 | 128x128 | 85x85 | 40000 | 0.968 | - | V100 | 89.78 | 81.02 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-40k_stare-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_stare/fcn_unet_s5-d16_128x128_40k_stare_20201223_191051-7d77e78b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_128x128_40k_stare/unet_s5-d16_128x128_40k_stare-20201223_191051.log.json) | +| UNet + FCN | UNet-S5-D16 | Cross Entropy + Dice | 605x700 | 128x128 | 85x85 | 40000 | 0.986 | - | V100 | 90.65 | 82.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201821-f75705a9.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201821.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy | 605x700 | 128x128 | 85x85 | 40000 | 0.982 | - | V100 | 89.89 | 81.22 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare_20201227_181818-3c2923c4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare-20201227_181818.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy + Dice | 605x700 | 128x128 | 85x85 | 40000 | 1.028 | - | V100 | 90.72 | 82.84 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201823-f1063ef7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201823.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy | 605x700 | 128x128 | 85x85 | 40000 | 0.999 | - | V100 | 89.73 | 80.93 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare_20201226_094047-93dcb93c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare-20201226_094047.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy + Dice | 605x700 | 128x128 | 85x85 | 40000 | 1.010 | - | V100 | 90.65 | 82.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201825-21db614c.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201825.log.json) | + +### CHASE_DB1 + +| Method | Backbone | Loss | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Device | mDice | Dice | config | download | +| ---------------- | ----------- | -------------------- | ---------- | --------- | -----: | ------- | -------- | -------------: | ------ | ----: | ----: | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UNet + FCN | UNet-S5-D16 | Cross Entropy | 960x999 | 128x128 | 85x85 | 40000 | 0.968 | - | V100 | 89.46 | 80.24 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_chase_db1/fcn_unet_s5-d16_128x128_40k_chase_db1_20201223_191051-11543527.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_128x128_40k_chase_db1/unet_s5-d16_128x128_40k_chase_db1-20201223_191051.log.json) | +| UNet + FCN | UNet-S5-D16 | Cross Entropy + Dice | 960x999 | 128x128 | 85x85 | 40000 | 0.986 | - | V100 | 89.52 | 80.40 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201821-1c4eb7cf.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201821.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy | 960x999 | 128x128 | 85x85 | 40000 | 0.982 | - | V100 | 89.52 | 80.36 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1_20201227_181818-68d4e609.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1-20201227_181818.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy + Dice | 960x999 | 128x128 | 85x85 | 40000 | 1.028 | - | V100 | 89.45 | 80.28 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201823-c0802c4d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201823.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy | 960x999 | 128x128 | 85x85 | 40000 | 0.999 | - | V100 | 89.57 | 80.47 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1_20201226_094047-4c5aefa3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1-20201226_094047.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy + Dice | 960x999 | 128x128 | 85x85 | 40000 | 1.010 | - | V100 | 89.49 | 80.37 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201825-4ef29df5.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201825.log.json) | + +### HRF + +| Method | Backbone | Loss | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Device | mDice | Dice | config | download | +| ---------------- | ----------- | -------------------- | ---------- | --------- | ------: | ------- | -------- | -------------: | ------ | ----: | ----: | ------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UNet + FCN | UNet-S5-D16 | Cross Entropy | 2336x3504 | 256x256 | 170x170 | 40000 | 2.525 | - | V100 | 88.92 | 79.45 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_256x256_40k_hrf/fcn_unet_s5-d16_256x256_40k_hrf_20201223_173724-d89cf1ed.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_256x256_40k_hrf/unet_s5-d16_256x256_40k_hrf-20201223_173724.log.json) | +| UNet + FCN | UNet-S5-D16 | Cross Entropy + Dice | 2336x3504 | 256x256 | 170x170 | 40000 | 2.623 | - | V100 | 89.64 | 80.87 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201821-c314da8a.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201821.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy | 2336x3504 | 256x256 | 170x170 | 40000 | 2.588 | - | V100 | 89.24 | 80.07 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf_20201227_181818-fdb7e29b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf-20201227_181818.log.json) | +| UNet + PSPNet | UNet-S5-D16 | Cross Entropy + Dice | 2336x3504 | 256x256 | 170x170 | 40000 | 2.798 | - | V100 | 89.69 | 80.96 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201823-53d492fa.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201823.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy | 2336x3504 | 256x256 | 170x170 | 40000 | 2.604 | - | V100 | 89.32 | 80.21 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf_20201226_094047-3a1fdf85.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf-20201226_094047.log.json) | +| UNet + DeepLabV3 | UNet-S5-D16 | Cross Entropy + Dice | 2336x3504 | 256x256 | 170x170 | 40000 | 2.607 | - | V100 | 89.56 | 80.71 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_202032-59daf7a4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_202032.log.json) | + +Note: + +- In `DRIVE`, `STARE`, `CHASE_DB1`, and `HRF` dataset, `mDice` is mean dice of background and vessel, while `Dice` is dice metric of vessel(foreground) only. + +## Citation + +```bibtex +@inproceedings{ronneberger2015u, + title={U-net: Convolutional networks for biomedical image segmentation}, + author={Ronneberger, Olaf and Fischer, Philipp and Brox, Thomas}, + booktitle={International Conference on Medical image computing and computer-assisted intervention}, + pages={234--241}, + year={2015}, + organization={Springer} +} +``` diff --git a/mmsegmentation/configs/unet/metafile.yaml b/mmsegmentation/configs/unet/metafile.yaml new file mode 100644 index 0000000..1eafbc6 --- /dev/null +++ b/mmsegmentation/configs/unet/metafile.yaml @@ -0,0 +1,642 @@ +Collections: +- Name: UNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - DRIVE + - STARE + - CHASE_DB1 + - HRF + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + README: configs/unet/README.md + Frameworks: + - PyTorch +Models: +- Name: unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 69.1 + mIoU(ms+flip): 71.05 + Config: configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 17.91 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204-6860854e.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-40k_drive-64x64 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: DRIVE + Metrics: + mDice: 88.38 + Dice: 78.67 + Config: configs/unet/unet-s5-d16_fcn_4xb4-40k_drive-64x64.py + Metadata: + Training Data: DRIVE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 0.68 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_64x64_40k_drive/fcn_unet_s5-d16_64x64_40k_drive_20201223_191051-5daf6d3b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_64x64_40k_drive/unet_s5-d16_64x64_40k_drive-20201223_191051.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: DRIVE + Metrics: + mDice: 88.71 + Dice: 79.32 + Config: configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py + Metadata: + Training Data: DRIVE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 0.582 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201820-785de5c2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201820.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-40k_drive-64x64 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: DRIVE + Metrics: + mDice: 88.35 + Dice: 78.62 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py + Metadata: + Training Data: DRIVE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 0.599 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive_20201227_181818-aac73387.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive-20201227_181818.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: DRIVE + Metrics: + mDice: 88.76 + Dice: 79.42 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py + Metadata: + Training Data: DRIVE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 0.585 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201821-22b3e3ba.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201821.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: DRIVE + Metrics: + mDice: 88.38 + Dice: 78.69 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py + Metadata: + Training Data: DRIVE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 0.596 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive_20201226_094047-0671ff20.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive-20201226_094047.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: DRIVE + Metrics: + mDice: 88.84 + Dice: 79.56 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py + Metadata: + Training Data: DRIVE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 0.582 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201825-6bf0efd7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive_20211210_201825.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-40k_stare-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: STARE + Metrics: + mDice: 89.78 + Dice: 81.02 + Config: configs/unet/unet-s5-d16_fcn_4xb4-40k_stare-128x128.py + Metadata: + Training Data: STARE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 0.968 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_stare/fcn_unet_s5-d16_128x128_40k_stare_20201223_191051-7d77e78b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_128x128_40k_stare/unet_s5-d16_128x128_40k_stare-20201223_191051.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: STARE + Metrics: + mDice: 90.65 + Dice: 82.7 + Config: configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py + Metadata: + Training Data: STARE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 0.986 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201821-f75705a9.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201821.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-40k_stare-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: STARE + Metrics: + mDice: 89.89 + Dice: 81.22 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py + Metadata: + Training Data: STARE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 0.982 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare_20201227_181818-3c2923c4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare-20201227_181818.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: STARE + Metrics: + mDice: 90.72 + Dice: 82.84 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py + Metadata: + Training Data: STARE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.028 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201823-f1063ef7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201823.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: STARE + Metrics: + mDice: 89.73 + Dice: 80.93 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py + Metadata: + Training Data: STARE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 0.999 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare_20201226_094047-93dcb93c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare-20201226_094047.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: STARE + Metrics: + mDice: 90.65 + Dice: 82.71 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py + Metadata: + Training Data: STARE + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 1.01 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201825-21db614c.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare_20211210_201825.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: CHASE_DB1 + Metrics: + mDice: 89.46 + Dice: 80.24 + Config: configs/unet/unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py + Metadata: + Training Data: CHASE_DB1 + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 0.968 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_chase_db1/fcn_unet_s5-d16_128x128_40k_chase_db1_20201223_191051-11543527.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_128x128_40k_chase_db1/unet_s5-d16_128x128_40k_chase_db1-20201223_191051.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: CHASE_DB1 + Metrics: + mDice: 89.52 + Dice: 80.4 + Config: configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py + Metadata: + Training Data: CHASE_DB1 + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 0.986 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201821-1c4eb7cf.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201821.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: CHASE_DB1 + Metrics: + mDice: 89.52 + Dice: 80.36 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py + Metadata: + Training Data: CHASE_DB1 + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 0.982 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1_20201227_181818-68d4e609.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1-20201227_181818.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: CHASE_DB1 + Metrics: + mDice: 89.45 + Dice: 80.28 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py + Metadata: + Training Data: CHASE_DB1 + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 1.028 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201823-c0802c4d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201823.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: CHASE_DB1 + Metrics: + mDice: 89.57 + Dice: 80.47 + Config: configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py + Metadata: + Training Data: CHASE_DB1 + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 0.999 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1_20201226_094047-4c5aefa3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1-20201226_094047.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: CHASE_DB1 + Metrics: + mDice: 89.49 + Dice: 80.37 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py + Metadata: + Training Data: CHASE_DB1 + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 1.01 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201825-4ef29df5.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1_20211210_201825.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-40k_hrf-256x256 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: HRF + Metrics: + mDice: 88.92 + Dice: 79.45 + Config: configs/unet/unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py + Metadata: + Training Data: HRF + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.525 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_256x256_40k_hrf/fcn_unet_s5-d16_256x256_40k_hrf_20201223_173724-d89cf1ed.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/unet_s5-d16_256x256_40k_hrf/unet_s5-d16_256x256_40k_hrf-20201223_173724.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: HRF + Metrics: + mDice: 89.64 + Dice: 80.87 + Config: configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py + Metadata: + Training Data: HRF + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - FCN + Training Resources: 4x V100 GPUS + Memory (GB): 2.623 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201821-c314da8a.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201821.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-40k_hrf-256x256 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: HRF + Metrics: + mDice: 89.24 + Dice: 80.07 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py + Metadata: + Training Data: HRF + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 2.588 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf_20201227_181818-fdb7e29b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf-20201227_181818.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: HRF + Metrics: + mDice: 89.69 + Dice: 80.96 + Config: configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py + Metadata: + Training Data: HRF + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - PSPNet + Training Resources: 4x V100 GPUS + Memory (GB): 2.798 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201823-53d492fa.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_201823.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: HRF + Metrics: + mDice: 89.32 + Dice: 80.21 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py + Metadata: + Training Data: HRF + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 2.604 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf_20201226_094047-3a1fdf85.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf-20201226_094047.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch +- Name: unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256 + In Collection: UNet + Results: + Task: Semantic Segmentation + Dataset: HRF + Metrics: + mDice: 89.56 + Dice: 80.71 + Config: configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py + Metadata: + Training Data: HRF + Batch Size: 16 + Architecture: + - UNet-S5-D16 + - UNet + - DeepLabV3 + Training Resources: 4x V100 GPUS + Memory (GB): 2.607 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_202032-59daf7a4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf_20211210_202032.log.json + Paper: + Title: 'U-Net: Convolutional Networks for Biomedical Image Segmentation' + URL: https://arxiv.org/abs/1505.04597 + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/unet.py#L225 + Framework: PyTorch diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py new file mode 100644 index 0000000..e4af542 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (64, 64) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py new file mode 100644 index 0000000..b45405f --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py new file mode 100644 index 0000000..554caca --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (128, 128) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py new file mode 100644 index 0000000..4f30bba --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py @@ -0,0 +1,6 @@ +_base_ = './unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py new file mode 100644 index 0000000..823fc6d --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_deeplabv3_4xb4-40k_drive-64x64.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py new file mode 100644 index 0000000..174eaf8 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_deeplabv3_4xb4-40k_hrf-256x256.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py new file mode 100644 index 0000000..35972be --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_deeplabv3_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_deeplabv3_4xb4-40k_stare-128x128.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..c2e995d --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py @@ -0,0 +1,16 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=19), + auxiliary_head=dict(num_classes=19), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) +train_dataloader = dict(batch_size=4, num_workers=4) +val_dataloader = dict(batch_size=1, num_workers=4) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py new file mode 100644 index 0000000..a5768ba --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/hsi_drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (192, 384) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + mean=None, + std=None, + bgr_to_rgb=None, + pad_val=0, + seg_pad_val=255) + +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(in_channels=25), + decode_head=dict( + ignore_index=0, + num_classes=11, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + auxiliary_head=dict( + ignore_index=0, + num_classes=11, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py new file mode 100644 index 0000000..bfc2109 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/chase_db1.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (128, 128) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_drive-64x64.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_drive-64x64.py new file mode 100644 index 0000000..10a45d1 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_drive-64x64.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (64, 64) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py new file mode 100644 index 0000000..7de57f2 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_stare-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_stare-128x128.py new file mode 100644 index 0000000..8eeef77 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-40k_stare-128x128.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (128, 128) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py new file mode 100644 index 0000000..5a26ccb --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_fcn_4xb4-40k_chase-db1-128x128.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py new file mode 100644 index 0000000..c3b1488 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_fcn_4xb4-40k_drive-64x64.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py new file mode 100644 index 0000000..dd3a6af --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_fcn_4xb4-40k_hrf-256x256.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py new file mode 100644 index 0000000..c8fecf3 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_fcn_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_fcn_4xb4-40k_stare-128x128.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py new file mode 100644 index 0000000..ca6e513 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', + '../_base_/datasets/chase_db1.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (128, 128) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py new file mode 100644 index 0000000..503b901 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (64, 64) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py new file mode 100644 index 0000000..245365c --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py new file mode 100644 index 0000000..c1eeeb9 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (128, 128) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py new file mode 100644 index 0000000..69a4bba --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_chase-db1-128x128.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_pspnet_4xb4-40k_chase-db1-128x128.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py new file mode 100644 index 0000000..1abbd53 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_drive-64x64.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_pspnet_4xb4-40k_drive-64x64.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py new file mode 100644 index 0000000..b3256d7 --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_hrf-256x256.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_pspnet_4xb4-40k_hrf-256x256.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py new file mode 100644 index 0000000..82aa3da --- /dev/null +++ b/mmsegmentation/configs/unet/unet-s5-d16_pspnet_4xb4-ce-1.0-dice-3.0-40k_stare-128x128.py @@ -0,0 +1,6 @@ +_base_ = './unet-s5-d16_pspnet_4xb4-40k_stare-128x128.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ])) diff --git a/mmsegmentation/configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py b/mmsegmentation/configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py new file mode 100644 index 0000000..82494f3 --- /dev/null +++ b/mmsegmentation/configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_chase-db1-128x128.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', + '../_base_/datasets/chase_db1.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (128, 128) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) diff --git a/mmsegmentation/configs/upernet/README.md b/mmsegmentation/configs/upernet/README.md new file mode 100644 index 0000000..c2babbd --- /dev/null +++ b/mmsegmentation/configs/upernet/README.md @@ -0,0 +1,68 @@ +# UPerNet + +> [Unified Perceptual Parsing for Scene Understanding](https://arxiv.org/pdf/1807.10221.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Humans recognize the visual world at multiple levels: we effortlessly categorize scenes and detect objects inside, while also identifying the textures and surfaces of the objects along with their different compositional parts. In this paper, we study a new task called Unified Perceptual Parsing, which requires the machine vision systems to recognize as many visual concepts as possible from a given image. A multi-task framework called UPerNet and a training strategy are developed to learn from heterogeneous image annotations. We benchmark our framework on Unified Perceptual Parsing and show that it is able to effectively segment a wide range of concepts from images. The trained networks are further applied to discover visual knowledge in natural scenes. Models are available at [this https URL](https://github.com/CSAILVision/unifiedparsing). + + + +
+ +
+ +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | R-50 | 512x1024 | 40000 | 6.4 | 4.25 | V100 | 77.10 | 78.37 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827-aa54cb54.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827.log.json) | +| UPerNet | R-101 | 512x1024 | 40000 | 7.4 | 3.79 | V100 | 78.69 | 80.11 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933-ebce3b10.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933.log.json) | +| UPerNet | R-50 | 769x769 | 40000 | 7.2 | 1.76 | V100 | 77.98 | 79.70 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048-92d21539.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048.log.json) | +| UPerNet | R-101 | 769x769 | 40000 | 8.4 | 1.56 | V100 | 79.03 | 80.77 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb2-40k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819-83c95d01.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819.log.json) | +| UPerNet | R-50 | 512x1024 | 80000 | - | - | V100 | 78.19 | 79.19 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207-848beca8.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207.log.json) | +| UPerNet | R-101 | 512x1024 | 80000 | - | - | V100 | 79.40 | 80.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403-f05f2345.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403.log.json) | +| UPerNet | R-50 | 769x769 | 80000 | - | - | V100 | 79.39 | 80.92 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107-82ae7d15.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107.log.json) | +| UPerNet | R-101 | 769x769 | 80000 | - | - | V100 | 80.10 | 81.49 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb2-80k_cityscapes-769x769.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014-082fc334.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | R-50 | 512x512 | 80000 | 8.1 | 23.40 | V100 | 40.70 | 41.81 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127-ecc8377b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127.log.json) | +| UPerNet | R-101 | 512x512 | 80000 | 9.1 | 20.34 | V100 | 42.91 | 43.96 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb4-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117-32e4db94.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117.log.json) | +| UPerNet | R-50 | 512x512 | 160000 | - | - | V100 | 42.05 | 42.78 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328-8534de8d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328.log.json) | +| UPerNet | R-101 | 512x512 | 160000 | - | - | V100 | 43.82 | 44.85 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb4-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951-91b32684.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | -------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | R-50 | 512x512 | 20000 | 6.4 | 23.17 | V100 | 74.82 | 76.35 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330-5b5890a7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330.log.json) | +| UPerNet | R-101 | 512x512 | 20000 | 7.5 | 19.98 | V100 | 77.10 | 78.29 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb4-20k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629-f14e7f27.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629.log.json) | +| UPerNet | R-50 | 512x512 | 40000 | - | - | V100 | 75.92 | 77.44 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r50_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257-ca9bcc6b.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257.log.json) | +| UPerNet | R-101 | 512x512 | 40000 | - | - | V100 | 77.43 | 78.56 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet/upernet_r101_4xb4-40k_voc12aug-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549-e26476ac.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549.log.json) | + +## Citation + +```bibtex +@inproceedings{xiao2018unified, + title={Unified perceptual parsing for scene understanding}, + author={Xiao, Tete and Liu, Yingcheng and Zhou, Bolei and Jiang, Yuning and Sun, Jian}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + pages={418--434}, + year={2018} +} +``` diff --git a/mmsegmentation/configs/upernet/metafile.yaml b/mmsegmentation/configs/upernet/metafile.yaml new file mode 100644 index 0000000..f6ad818 --- /dev/null +++ b/mmsegmentation/configs/upernet/metafile.yaml @@ -0,0 +1,391 @@ +Collections: +- Name: UPerNet + License: Apache License 2.0 + Metadata: + Training Data: + - Cityscapes + - ADE20K + - Pascal VOC 2012 + Aug + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + README: configs/upernet/README.md + Frameworks: + - PyTorch +Models: +- Name: upernet_r50_4xb2-40k_cityscapes-512x1024 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.1 + mIoU(ms+flip): 78.37 + Config: configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827-aa54cb54.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb2-40k_cityscapes-512x1024 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.69 + mIoU(ms+flip): 80.11 + Config: configs/upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933-ebce3b10.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb2-40k_cityscapes-769x769 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 77.98 + mIoU(ms+flip): 79.7 + Config: configs/upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048-92d21539.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb2-40k_cityscapes-769x769 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.03 + mIoU(ms+flip): 80.77 + Config: configs/upernet/upernet_r101_4xb2-40k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819-83c95d01.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb2-80k_cityscapes-512x1024 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 78.19 + mIoU(ms+flip): 79.19 + Config: configs/upernet/upernet_r50_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207-848beca8.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb2-80k_cityscapes-512x1024 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.4 + mIoU(ms+flip): 80.46 + Config: configs/upernet/upernet_r101_4xb2-80k_cityscapes-512x1024.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403-f05f2345.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb2-80k_cityscapes-769x769 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 79.39 + mIoU(ms+flip): 80.92 + Config: configs/upernet/upernet_r50_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107-82ae7d15.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb2-80k_cityscapes-769x769 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Cityscapes + Metrics: + mIoU: 80.1 + mIoU(ms+flip): 81.49 + Config: configs/upernet/upernet_r101_4xb2-80k_cityscapes-769x769.py + Metadata: + Training Data: Cityscapes + Batch Size: 8 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014-082fc334.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb4-80k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 40.7 + mIoU(ms+flip): 41.81 + Config: configs/upernet/upernet_r50_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 8.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127-ecc8377b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb4-80k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.91 + mIoU(ms+flip): 43.96 + Config: configs/upernet/upernet_r101_4xb4-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 9.1 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117-32e4db94.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb4-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.05 + mIoU(ms+flip): 42.78 + Config: configs/upernet/upernet_r50_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328-8534de8d.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb4-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.82 + mIoU(ms+flip): 44.85 + Config: configs/upernet/upernet_r101_4xb4-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951-91b32684.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb4-20k_voc12aug-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 74.82 + mIoU(ms+flip): 76.35 + Config: configs/upernet/upernet_r50_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 6.4 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330-5b5890a7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb4-20k_voc12aug-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.1 + mIoU(ms+flip): 78.29 + Config: configs/upernet/upernet_r101_4xb4-20k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Memory (GB): 7.5 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629-f14e7f27.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r50_4xb4-40k_voc12aug-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 75.92 + mIoU(ms+flip): 77.44 + Config: configs/upernet/upernet_r50_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-50 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257-ca9bcc6b.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch +- Name: upernet_r101_4xb4-40k_voc12aug-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: Pascal VOC 2012 + Aug + Metrics: + mIoU: 77.43 + mIoU(ms+flip): 78.56 + Config: configs/upernet/upernet_r101_4xb4-40k_voc12aug-512x512.py + Metadata: + Training Data: Pascal VOC 2012 + Aug + Batch Size: 16 + Architecture: + - R-101 + - UPerNet + Training Resources: 4x V100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549-e26476ac.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549.log.json + Paper: + Title: Unified Perceptual Parsing for Scene Understanding + URL: https://arxiv.org/pdf/1807.10221.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/decode_heads/uper_head.py#L13 + Framework: PyTorch diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..8f5f6ae --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb2-40k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..28b5d3e --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb2-40k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..cafd8a2 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb2-80k_cityscapes-512x1024.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..e175720 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb2-80k_cityscapes-769x769.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/upernet/upernet_r101_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..7a61527 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb4-160k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/upernet/upernet_r101_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..be8f084 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb4-20k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/upernet/upernet_r101_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..db1d976 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb4-40k_voc12aug-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r101_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/upernet/upernet_r101_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..84549a4 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r101_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_4xb4-80k_ade20k-512x512.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmsegmentation/configs/upernet/upernet_r18_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/upernet/upernet_r18_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..dbff0e7 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r18_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,6 @@ +_base_ = './upernet_r50_4xb2-40k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict(in_channels=[64, 128, 256, 512]), + auxiliary_head=dict(in_channels=256)) diff --git a/mmsegmentation/configs/upernet/upernet_r18_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/upernet/upernet_r18_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..dee6349 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r18_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,6 @@ +_base_ = './upernet_r50_4xb2-80k_cityscapes-512x1024.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict(in_channels=[64, 128, 256, 512]), + auxiliary_head=dict(in_channels=256)) diff --git a/mmsegmentation/configs/upernet/upernet_r18_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/upernet/upernet_r18_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..9ac6c35 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r18_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=150), + auxiliary_head=dict(in_channels=256, num_classes=150)) diff --git a/mmsegmentation/configs/upernet/upernet_r18_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/upernet/upernet_r18_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..5cae4f5 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r18_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=21), + auxiliary_head=dict(in_channels=256, num_classes=21)) diff --git a/mmsegmentation/configs/upernet/upernet_r18_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/upernet/upernet_r18_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..652ded7 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r18_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=21), + auxiliary_head=dict(in_channels=256, num_classes=21)) diff --git a/mmsegmentation/configs/upernet/upernet_r18_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/upernet/upernet_r18_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..1a7956d --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r18_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=150), + auxiliary_head=dict(in_channels=256, num_classes=150)) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..4751fc1 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py b/mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py new file mode 100644 index 0000000..6f05b6c --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb2-40k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-512x1024.py b/mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-512x1024.py new file mode 100644 index 0000000..f3488c6 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-769x769.py b/mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-769x769.py new file mode 100644 index 0000000..6a8f48e --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb2-80k_cityscapes-769x769.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (769, 769) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb4-160k_ade20k-512x512.py b/mmsegmentation/configs/upernet/upernet_r50_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..5d15b2a --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb4-20k_voc12aug-512x512.py b/mmsegmentation/configs/upernet/upernet_r50_4xb4-20k_voc12aug-512x512.py new file mode 100644 index 0000000..9e96b4e --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb4-20k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb4-40k_voc12aug-512x512.py b/mmsegmentation/configs/upernet/upernet_r50_4xb4-40k_voc12aug-512x512.py new file mode 100644 index 0000000..cada949 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb4-40k_voc12aug-512x512.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=21), + auxiliary_head=dict(num_classes=21)) diff --git a/mmsegmentation/configs/upernet/upernet_r50_4xb4-80k_ade20k-512x512.py b/mmsegmentation/configs/upernet/upernet_r50_4xb4-80k_ade20k-512x512.py new file mode 100644 index 0000000..322d5d8 --- /dev/null +++ b/mmsegmentation/configs/upernet/upernet_r50_4xb4-80k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/mmsegmentation/configs/vit/README.md b/mmsegmentation/configs/vit/README.md new file mode 100644 index 0000000..f75326e --- /dev/null +++ b/mmsegmentation/configs/vit/README.md @@ -0,0 +1,70 @@ +# Vision Transformer + +> [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale](https://arxiv.org/pdf/2010.11929.pdf) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +While the Transformer architecture has become the de-facto standard for natural language processing tasks, its applications to computer vision remain limited. In vision, attention is either applied in conjunction with convolutional networks, or used to replace certain components of convolutional networks while keeping their overall structure in place. We show that this reliance on CNNs is not necessary and a pure transformer applied directly to sequences of image patches can perform very well on image classification tasks. When pre-trained on large amounts of data and transferred to multiple mid-sized or small image recognition benchmarks (ImageNet, CIFAR-100, VTAB, etc.), Vision Transformer (ViT) attains excellent results compared to state-of-the-art convolutional networks while requiring substantially fewer computational resources to train. + + + +
+ +
+ +## Usage + +To use other repositories' pre-trained models, it is necessary to convert keys. + +We provide a script [`vit2mmseg.py`](../../tools/model_converters/vit2mmseg.py) in the tools directory to convert the key of models from [timm](https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py) to MMSegmentation style. + +```shell +python tools/model_converters/vit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +E.g. + +```shell +python tools/model_converters/vit2mmseg.py https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth pretrain/jx_vit_base_p16_224-80ecf9dd.pth +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +## Results and models + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | ----------------- | --------- | ------: | -------- | -------------- | ------ | ----: | ------------: | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| UPerNet | ViT-B + MLN | 512x512 | 80000 | 9.20 | 6.94 | V100 | 47.71 | 49.51 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_80k_ade20k/upernet_vit-b16_mln_512x512_80k_ade20k_20210624_130547-0403cee1.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_80k_ade20k/20210624_130547.log.json) | +| UPerNet | ViT-B + MLN | 512x512 | 160000 | 9.20 | 7.58 | V100 | 46.75 | 48.46 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_160k_ade20k/upernet_vit-b16_mln_512x512_160k_ade20k_20210624_130547-852fa768.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_160k_ade20k/20210623_192432.log.json) | +| UPerNet | ViT-B + LN + MLN | 512x512 | 160000 | 9.21 | 6.82 | V100 | 47.73 | 49.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k/upernet_vit-b16_ln_mln_512x512_160k_ade20k_20210621_172828-f444c077.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k/20210621_172828.log.json) | +| UPerNet | DeiT-S | 512x512 | 80000 | 4.68 | 29.85 | V100 | 42.96 | 43.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_80k_ade20k/upernet_deit-s16_512x512_80k_ade20k_20210624_095228-afc93ec2.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_80k_ade20k/20210624_095228.log.json) | +| UPerNet | DeiT-S | 512x512 | 160000 | 4.68 | 29.19 | V100 | 42.87 | 43.79 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-s16_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_160k_ade20k/upernet_deit-s16_512x512_160k_ade20k_20210621_160903-5110d916.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_160k_ade20k/20210621_160903.log.json) | +| UPerNet | DeiT-S + MLN | 512x512 | 160000 | 5.69 | 11.18 | V100 | 43.82 | 45.07 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_mln_512x512_160k_ade20k/upernet_deit-s16_mln_512x512_160k_ade20k_20210621_161021-fb9a5dfb.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_mln_512x512_160k_ade20k/20210621_161021.log.json) | +| UPerNet | DeiT-S + LN + MLN | 512x512 | 160000 | 5.69 | 12.39 | V100 | 43.52 | 45.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k/upernet_deit-s16_ln_mln_512x512_160k_ade20k_20210621_161021-c0cd652f.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k/20210621_161021.log.json) | +| UPerNet | DeiT-B | 512x512 | 80000 | 7.75 | 9.69 | V100 | 45.24 | 46.73 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-b16_upernet_8xb2-80k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_80k_ade20k/upernet_deit-b16_512x512_80k_ade20k_20210624_130529-1e090789.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_80k_ade20k/20210624_130529.log.json) | +| UPerNet | DeiT-B | 512x512 | 160000 | 7.75 | 10.39 | V100 | 45.36 | 47.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-b16_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_160k_ade20k/upernet_deit-b16_512x512_160k_ade20k_20210621_180100-828705d7.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_160k_ade20k/20210621_180100.log.json) | +| UPerNet | DeiT-B + MLN | 512x512 | 160000 | 9.21 | 7.78 | V100 | 45.46 | 47.16 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_mln_512x512_160k_ade20k/upernet_deit-b16_mln_512x512_160k_ade20k_20210621_191949-4e1450f3.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_mln_512x512_160k_ade20k/20210621_191949.log.json) | +| UPerNet | DeiT-B + LN + MLN | 512x512 | 160000 | 9.21 | 7.75 | V100 | 45.37 | 47.23 | [config](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_ln_mln_512x512_160k_ade20k/upernet_deit-b16_ln_mln_512x512_160k_ade20k_20210623_153535-8a959c14.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_ln_mln_512x512_160k_ade20k/20210623_153535.log.json) | + +## Citation + +```bibtex +@article{dosoViTskiy2020, + title={An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}, + author={DosoViTskiy, Alexey and Beyer, Lucas and Kolesnikov, Alexander and Weissenborn, Dirk and Zhai, Xiaohua and Unterthiner, Thomas and Dehghani, Mostafa and Minderer, Matthias and Heigold, Georg and Gelly, Sylvain and Uszkoreit, Jakob and Houlsby, Neil}, + journal={arXiv preprint arXiv:2010.11929}, + year={2020} +} +``` diff --git a/mmsegmentation/configs/vit/metafile.yaml b/mmsegmentation/configs/vit/metafile.yaml new file mode 100644 index 0000000..68e254a --- /dev/null +++ b/mmsegmentation/configs/vit/metafile.yaml @@ -0,0 +1,265 @@ +Models: +- Name: vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.71 + mIoU(ms+flip): 49.51 + Config: configs/vit/vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_80k_ade20k/upernet_vit-b16_mln_512x512_80k_ade20k_20210624_130547-0403cee1.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_80k_ade20k/20210624_130547.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 46.75 + mIoU(ms+flip): 48.46 + Config: configs/vit/vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.2 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_160k_ade20k/upernet_vit-b16_mln_512x512_160k_ade20k_20210624_130547-852fa768.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_mln_512x512_160k_ade20k/20210623_192432.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 47.73 + mIoU(ms+flip): 49.95 + Config: configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - ViT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.21 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k/upernet_vit-b16_ln_mln_512x512_160k_ade20k_20210621_172828-f444c077.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k/20210621_172828.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-s16_upernet_8xb2-80k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.96 + mIoU(ms+flip): 43.79 + Config: configs/vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 4.68 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_80k_ade20k/upernet_deit-s16_512x512_80k_ade20k_20210624_095228-afc93ec2.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_80k_ade20k/20210624_095228.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-s16_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 42.87 + mIoU(ms+flip): 43.79 + Config: configs/vit/vit_deit-s16_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 4.68 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_160k_ade20k/upernet_deit-s16_512x512_160k_ade20k_20210621_160903-5110d916.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_512x512_160k_ade20k/20210621_160903.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.82 + mIoU(ms+flip): 45.07 + Config: configs/vit/vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 5.69 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_mln_512x512_160k_ade20k/upernet_deit-s16_mln_512x512_160k_ade20k_20210621_161021-fb9a5dfb.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_mln_512x512_160k_ade20k/20210621_161021.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 43.52 + mIoU(ms+flip): 45.01 + Config: configs/vit/vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-S + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 5.69 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k/upernet_deit-s16_ln_mln_512x512_160k_ade20k_20210621_161021-c0cd652f.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k/20210621_161021.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-b16_upernet_8xb2-80k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.24 + mIoU(ms+flip): 46.73 + Config: configs/vit/vit_deit-b16_upernet_8xb2-80k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 7.75 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_80k_ade20k/upernet_deit-b16_512x512_80k_ade20k_20210624_130529-1e090789.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_80k_ade20k/20210624_130529.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-b16_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.36 + mIoU(ms+flip): 47.16 + Config: configs/vit/vit_deit-b16_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 7.75 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_160k_ade20k/upernet_deit-b16_512x512_160k_ade20k_20210621_180100-828705d7.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_512x512_160k_ade20k/20210621_180100.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.46 + mIoU(ms+flip): 47.16 + Config: configs/vit/vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.21 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_mln_512x512_160k_ade20k/upernet_deit-b16_mln_512x512_160k_ade20k_20210621_191949-4e1450f3.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_mln_512x512_160k_ade20k/20210621_191949.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch +- Name: vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512 + In Collection: UPerNet + Results: + Task: Semantic Segmentation + Dataset: ADE20K + Metrics: + mIoU: 45.37 + mIoU(ms+flip): 47.23 + Config: configs/vit/vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py + Metadata: + Training Data: ADE20K + Batch Size: 16 + Architecture: + - DeiT-B + - UPerNet + Training Resources: 8x V100 GPUS + Memory (GB): 9.21 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_ln_mln_512x512_160k_ade20k/upernet_deit-b16_ln_mln_512x512_160k_ade20k_20210623_153535-8a959c14.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vit/upernet_deit-b16_ln_mln_512x512_160k_ade20k/20210623_153535.log.json + Paper: + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + URL: https://arxiv.org/pdf/2010.11929.pdf + Code: https://github.com/open-mmlab/mmsegmentation/blob/v0.17.0/mmseg/models/backbones/vit.py#L98 + Framework: PyTorch diff --git a/mmsegmentation/configs/vit/vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..39d1c54 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,5 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', + backbone=dict(drop_path_rate=0.1, final_norm=True)) diff --git a/mmsegmentation/configs/vit/vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..706673f --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,6 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', + backbone=dict(drop_path_rate=0.1), +) diff --git a/mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..23a2358 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,6 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', + backbone=dict(drop_path_rate=0.1), + neck=None) diff --git a/mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-80k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-80k_ade20k-512x512.py new file mode 100644 index 0000000..4c8bc93 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-b16_upernet_8xb2-80k_ade20k-512x512.py @@ -0,0 +1,6 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', + backbone=dict(drop_path_rate=0.1), + neck=None) diff --git a/mmsegmentation/configs/vit/vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..8e626fe --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-s16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,9 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', + backbone=dict( + num_heads=6, embed_dims=384, drop_path_rate=0.1, final_norm=True), + decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), + neck=dict(in_channels=[384, 384, 384, 384], out_channels=384), + auxiliary_head=dict(num_classes=150, in_channels=384)) diff --git a/mmsegmentation/configs/vit/vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..9a69a89 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-s16_mln_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', + backbone=dict(num_heads=6, embed_dims=384, drop_path_rate=0.1), + decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), + neck=dict(in_channels=[384, 384, 384, 384], out_channels=384), + auxiliary_head=dict(num_classes=150, in_channels=384)) diff --git a/mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..9ef699d --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', + backbone=dict(num_heads=6, embed_dims=384, drop_path_rate=0.1), + decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), + neck=None, + auxiliary_head=dict(num_classes=150, in_channels=384)) diff --git a/mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py new file mode 100644 index 0000000..9ef699d --- /dev/null +++ b/mmsegmentation/configs/vit/vit_deit-s16_upernet_8xb2-80k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = './vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py' + +model = dict( + pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', + backbone=dict(num_heads=6, embed_dims=384, drop_path_rate=0.1), + decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), + neck=None, + auxiliary_head=dict(num_classes=150, in_channels=384)) diff --git a/mmsegmentation/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..2dd81b4 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/upernet_vit-b16_ln_mln.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/vit_base_patch16_224.pth', + backbone=dict(drop_path_rate=0.1, final_norm=True), + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..1a7ec16 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-160k_ade20k-512x512.py @@ -0,0 +1,44 @@ +_base_ = [ + '../_base_/models/upernet_vit-b16_ln_mln.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_160k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/vit_base_patch16_224.pth', + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=160000, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py b/mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py new file mode 100644 index 0000000..ef73450 --- /dev/null +++ b/mmsegmentation/configs/vit/vit_vit-b16_mln_upernet_8xb2-80k_ade20k-512x512.py @@ -0,0 +1,44 @@ +_base_ = [ + '../_base_/models/upernet_vit-b16_ln_mln.py', + '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='pretrain/vit_base_patch16_224.pth', + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) + +# AdamW optimizer, no weight decay for position embedding & layer norm +# in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + eta_min=0.0, + power=1.0, + begin=1500, + end=80000, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) +val_dataloader = dict(batch_size=1) +test_dataloader = val_dataloader diff --git a/mmsegmentation/configs/vpd/README.md b/mmsegmentation/configs/vpd/README.md new file mode 100644 index 0000000..e90085b --- /dev/null +++ b/mmsegmentation/configs/vpd/README.md @@ -0,0 +1,50 @@ +# VPD + +> [Unleashing Text-to-Image Diffusion Models for Visual Perception](https://arxiv.org/abs/2303.02153) + +## Introduction + + + +Official Repo + +## Abstract + + + +Diffusion models (DMs) have become the new trend of generative models and have demonstrated a powerful ability of conditional synthesis. Among those, text-to-image diffusion models pre-trained on large-scale image-text pairs are highly controllable by customizable prompts. Unlike the unconditional generative models that focus on low-level attributes and details, text-to-image diffusion models contain more high-level knowledge thanks to the vision-language pre-training. In this paper, we propose VPD (Visual Perception with a pre-trained Diffusion model), a new framework that exploits the semantic information of a pre-trained text-to-image diffusion model in visual perception tasks. Instead of using the pre-trained denoising autoencoder in a diffusion-based pipeline, we simply use it as a backbone and aim to study how to take full advantage of the learned knowledge. Specifically, we prompt the denoising decoder with proper textual inputs and refine the text features with an adapter, leading to a better alignment to the pre-trained stage and making the visual contents interact with the text prompts. We also propose to utilize the cross-attention maps between the visual features and the text features to provide explicit guidance. Compared with other pre-training methods, we show that vision-language pre-trained diffusion models can be faster adapted to downstream visual perception tasks using the proposed VPD. Extensive experiments on semantic segmentation, referring image segmentation and depth estimation demonstrates the effectiveness of our method. Notably, VPD attains 0.254 RMSE on NYUv2 depth estimation and 73.3% oIoU on RefCOCO-val referring image segmentation, establishing new records on these two benchmarks. + + + +
+ +
+ +## Usage + +To run training or inference with VPD model, please install the required packages via + +```sh +pip install -r requirements/albu.txt +pip install -r requirements/optional.txt +``` + +## Results and models + +### NYU + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | RMSE | d1 | d2 | d3 | REL | log_10 | config | download | +| ------ | --------------------- | --------- | ------- | -------- | -------------- | ------ | ----- | ----- | ----- | ----- | ----- | ------ | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| VPD | Stable-Diffusion-v1-5 | 480x480 | 25000 | - | - | A100 | 0.253 | 0.964 | 0.995 | 0.999 | 0.069 | 0.030 | [config](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-480x480_20230908-66144bc4.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-480x480_20230908.json) | +| VPD | Stable-Diffusion-v1-5 | 512x512 | 25000 | - | - | A100 | 0.258 | 0.963 | 0.995 | 0.999 | 0.072 | 0.031 | [config](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-512x512_20230918-60cefcff.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-512x512_20230918.json) | + +## Citation + +```bibtex +@article{zhao2023unleashing, + title={Unleashing Text-to-Image Diffusion Models for Visual Perception}, + author={Zhao, Wenliang and Rao, Yongming and Liu, Zuyan and Liu, Benlin and Zhou, Jie and Lu, Jiwen}, + journal={ICCV}, + year={2023} +} +``` diff --git a/mmsegmentation/configs/vpd/metafile.yaml b/mmsegmentation/configs/vpd/metafile.yaml new file mode 100644 index 0000000..ccdc0e8 --- /dev/null +++ b/mmsegmentation/configs/vpd/metafile.yaml @@ -0,0 +1,56 @@ +Collections: +- Name: VPD + License: Apache License 2.0 + Metadata: + Training Data: + - NYU + Paper: + Title: Unleashing Text-to-Image Diffusion Models for Visual Perception + URL: https://arxiv.org/abs/2303.02153 + README: configs/vpd/README.md + Frameworks: + - PyTorch +Models: +- Name: vpd_sd_4xb8-25k_nyu-480x480 + In Collection: VPD + Results: + Task: Depth Estimation + Dataset: NYU + Metrics: + RMSE: 0.253 + Config: configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py + Metadata: + Training Data: NYU + Batch Size: 32 + Architecture: + - Stable-Diffusion + Training Resources: 8x A100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-480x480_20230908-66144bc4.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-480x480_20230908.json + Paper: + Title: 'High-Resolution Image Synthesis with Latent Diffusion Models' + URL: https://arxiv.org/abs/2112.10752 + Code: https://github.com/open-mmlab/mmsegmentation/tree/main/mmseg/models/backbones/vpd.py#L333 + Framework: PyTorch +- Name: vpd_sd_4xb8-25k_nyu-512x512 + In Collection: VPD + Alias: vpd_depth + Results: + Task: Depth Estimation + Dataset: NYU + Metrics: + RMSE: 0.258 + Config: configs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py + Metadata: + Training Data: NYU + Batch Size: 32 + Architecture: + - Stable-Diffusion + Training Resources: 8x A100 GPUS + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-512x512_20230918-60cefcff.pth + Training log: https://download.openmmlab.com/mmsegmentation/v0.5/vpd/vpd_sd_4xb8-25k_nyu-512x512_20230918.json + Paper: + Title: 'High-Resolution Image Synthesis with Latent Diffusion Models' + URL: https://arxiv.org/abs/2112.10752 + Code: https://github.com/open-mmlab/mmsegmentation/tree/main/mmseg/models/backbones/vpd.py#L333 + Framework: PyTorch diff --git a/mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py b/mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py new file mode 100644 index 0000000..0d14d8d --- /dev/null +++ b/mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/vpd_sd.py', '../_base_/datasets/nyu.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_25k.py' +] + +crop_size = (480, 480) + +model = dict( + type='DepthEstimator', + data_preprocessor=dict(size=crop_size), + backbone=dict( + class_embed_path='https://download.openmmlab.com/mmsegmentation/' + 'v0.5/vpd/nyu_class_embeddings.pth', + class_embed_select=True, + pad_shape=512, + unet_cfg=dict(use_attn=False), + ), + decode_head=dict( + type='VPDDepthHead', + in_channels=[320, 640, 1280, 1280], + max_depth=10, + fmap_border=(1, 1), + ), + test_cfg=dict(mode='slide_flip', crop_size=crop_size, stride=(160, 160))) + +default_hooks = dict( + checkpoint=dict(save_best='rmse', rule='less', max_keep_ckpts=1)) + +# custom optimizer +optim_wrapper = dict( + constructor='ForceDefaultOptimWrapperConstructor', + paramwise_cfg=dict( + bias_decay_mult=0, + force_default_settings=True, + custom_keys={ + 'backbone.encoder_vq': dict(lr_mult=0), + 'backbone.unet': dict(lr_mult=0.01), + })) diff --git a/mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py b/mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py new file mode 100644 index 0000000..e89eb9c --- /dev/null +++ b/mmsegmentation/configs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/models/vpd_sd.py', '../_base_/datasets/nyu_512x512.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_25k.py' +] + +crop_size = (512, 512) + +model = dict( + type='DepthEstimator', + data_preprocessor=dict(size=crop_size), + backbone=dict( + class_embed_path='https://download.openmmlab.com/mmsegmentation/' + 'v0.5/vpd/nyu_class_embeddings.pth', + class_embed_select=True, + pad_shape=512, + unet_cfg=dict(use_attn=False), + ), + decode_head=dict( + type='VPDDepthHead', + in_channels=[320, 640, 1280, 1280], + max_depth=10, + ), + test_cfg=dict(mode='slide_flip', crop_size=crop_size, stride=(128, 128))) + +default_hooks = dict( + checkpoint=dict(save_best='rmse', rule='less', max_keep_ckpts=1)) + +# custom optimizer +optim_wrapper = dict( + constructor='ForceDefaultOptimWrapperConstructor', + paramwise_cfg=dict( + bias_decay_mult=0, + force_default_settings=True, + custom_keys={ + 'backbone.encoder_vq': dict(lr_mult=0), + 'backbone.unet': dict(lr_mult=0.01), + })) diff --git a/mmsegmentation/dataset-index.yml b/mmsegmentation/dataset-index.yml new file mode 100644 index 0000000..30ff0ee --- /dev/null +++ b/mmsegmentation/dataset-index.yml @@ -0,0 +1,80 @@ +openxlab: true +ade20k: + dataset: OpenDataLab/ADE20K_2016 + download_root: data + data_root: data/ade + +cityscapes: + dataset: OpenDataLab/CityScapes + download_root: data + data_root: data/cityscapes + +voc2012: + dataset: OpenDataLab/PASCAL_VOC2012 + download_root: data + data_root: data/VOCdevkit/VOC2012 + +cocostuff: + dataset: OpenDataLab/COCO-Stuff + download_root: data + data_root: data/coco_stuff164k + +mapillary: + dataset: OpenDataLab/Mapillary + download_root: data + data_root: data/mapillary + +pascal_context: + dataset: OpenDataLab/VOC2010 + download_root: data + data_root: data/VOCdevkit/VOC2010 + +isaid: + dataset: OpenDataLab/iSAID + download_root: data + data_root: data/iSAID + +isprs_potsdam: + dataset: OpenDataLab/ISPRS_Potsdam + download_root: data + data_root: data/potsdam + +loveda: + dataset: OpenDataLab/LoveDA + download_root: data + data_root: data/loveDA + +chase_db1: + dataset: OpenDataLab/CHASE_DB1 + download_root: data + data_root: data/CHASE_DB1 + +drive: + dataset: OpenDataLab/DRIVE + download_root: data + data_root: data/DRIVE + +hrf: + dataset: OpenDataLab/HRF + download_root: data + data_root: data/HRF + +stare: + dataset: OpenDataLab/STARE + download_root: data + data_root: data/STARE + +synapse: + dataset: OpenDataLab/SurgVisDom + download_root: data + data_root: data/synapse + +refuge: + dataset: OpenDataLab/REFUGE_Challenge + download_root: data + data_root: data/REFUGE + +lip: + dataset: OpenDataLab/LIP + download_root: data + data_root: data/LIP diff --git a/mmsegmentation/demo/MMSegmentation_Tutorial.ipynb b/mmsegmentation/demo/MMSegmentation_Tutorial.ipynb new file mode 100644 index 0000000..ac8601b --- /dev/null +++ b/mmsegmentation/demo/MMSegmentation_Tutorial.ipynb @@ -0,0 +1,555 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "view-in-github" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FVmnaxFJvsb8" + }, + "source": [ + "# MMSegmentation Tutorial\n", + "Welcome to MMSegmentation! \n", + "\n", + "In this tutorial, we demo\n", + "* How to do inference with MMSeg trained weight\n", + "* How to train on your own dataset and visualize the results. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QS8YHrEhbpas" + }, + "source": [ + "## Install MMSegmentation\n", + "This step may take several minutes. \n", + "\n", + "We use PyTorch 1.12 and CUDA 11.3 for this tutorial. You may install other versions by change the version number in pip install command. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UWyLrLYaNEaL", + "outputId": "32a47fe3-f10d-47a1-f6b9-b7c235abdab1" + }, + "outputs": [], + "source": [ + "# Check nvcc version\n", + "!nvcc -V\n", + "# Check GCC version\n", + "!gcc --version" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ki3WUBjKbutg", + "outputId": "14bd14b0-4d8c-4fa9-e3f9-da35c0efc0d5" + }, + "outputs": [], + "source": [ + "# Install PyTorch\n", + "!conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch\n", + "# Install mim\n", + "!pip install -U openmim\n", + "# Install mmengine\n", + "!mim install mmengine\n", + "# Install MMCV\n", + "!mim install 'mmcv >= 2.0.0rc1'\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nR-hHRvbNJJZ", + "outputId": "10c3b131-d4db-458c-fc10-b94b1c6ed546" + }, + "outputs": [], + "source": [ + "!rm -rf mmsegmentation\n", + "!git clone -b main https://github.com/open-mmlab/mmsegmentation.git \n", + "%cd mmsegmentation\n", + "!pip install -e ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mAE_h7XhPT7d", + "outputId": "83bf0f8e-fc69-40b1-f9fe-0025724a217c" + }, + "outputs": [], + "source": [ + "# Check Pytorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__, torch.cuda.is_available())\n", + "\n", + "# Check MMSegmentation installation\n", + "import mmseg\n", + "print(mmseg.__version__)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ta51clKX4cwM" + }, + "source": [ + "## Finetune a semantic segmentation model on a new dataset\n", + "\n", + "To finetune on a customized dataset, the following steps are necessary. \n", + "1. Add a new dataset class. \n", + "2. Create a config file accordingly. \n", + "3. Perform training and evaluation. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AcZg6x_K5Zs3" + }, + "source": [ + "### Add a new dataset\n", + "\n", + "Datasets in MMSegmentation require image and semantic segmentation maps to be placed in folders with the same prefix. To support a new dataset, we may need to modify the original file structure. \n", + "\n", + "In this tutorial, we give an example of converting the dataset. You may refer to [docs](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/tutorials/customize_datasets.md#customize-datasets-by-reorganizing-data) for details about dataset reorganization. \n", + "\n", + "We use [Stanford Background Dataset](http://dags.stanford.edu/projects/scenedataset.html) as an example. The dataset contains 715 images chosen from existing public datasets [LabelMe](http://labelme.csail.mit.edu), [MSRC](http://research.microsoft.com/en-us/projects/objectclassrecognition), [PASCAL VOC](http://pascallin.ecs.soton.ac.uk/challenges/VOC) and [Geometric Context](http://www.cs.illinois.edu/homes/dhoiem/). Images from these datasets are mainly outdoor scenes, each containing approximately 320-by-240 pixels. \n", + "In this tutorial, we use the region annotations as labels. There are 8 classes in total, i.e. sky, tree, road, grass, water, building, mountain, and foreground object. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TFIt7MHq5Wls", + "outputId": "74a126e4-c8a4-4d2f-a910-b58b71843a23" + }, + "outputs": [], + "source": [ + "# download and unzip\n", + "!wget http://dags.stanford.edu/data/iccv09Data.tar.gz -O stanford_background.tar.gz\n", + "!tar xf stanford_background.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 377 + }, + "id": "78LIci7F9WWI", + "outputId": "c432ddac-5a50-47b1-daac-5a26b07afea2" + }, + "outputs": [], + "source": [ + "# Let's take a look at the dataset\n", + "import mmcv\n", + "import mmengine\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "img = mmcv.imread('iccv09Data/images/6000124.jpg')\n", + "plt.figure(figsize=(8, 6))\n", + "plt.imshow(mmcv.bgr2rgb(img))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L5mNQuc2GsVE" + }, + "source": [ + "We need to convert the annotation into semantic map format as an image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WnGZfribFHCx" + }, + "outputs": [], + "source": [ + "# define dataset root and directory for images and annotations\n", + "data_root = 'iccv09Data'\n", + "img_dir = 'images'\n", + "ann_dir = 'labels'\n", + "# define class and palette for better visualization\n", + "classes = ('sky', 'tree', 'road', 'grass', 'water', 'bldg', 'mntn', 'fg obj')\n", + "palette = [[128, 128, 128], [129, 127, 38], [120, 69, 125], [53, 125, 34], \n", + " [0, 11, 123], [118, 20, 12], [122, 81, 25], [241, 134, 51]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WnGZfribFHCx" + }, + "outputs": [], + "source": [ + "import os.path as osp\n", + "import numpy as np\n", + "from PIL import Image\n", + "\n", + "# convert dataset annotation to semantic segmentation map\n", + "for file in mmengine.scandir(osp.join(data_root, ann_dir), suffix='.regions.txt'):\n", + " seg_map = np.loadtxt(osp.join(data_root, ann_dir, file)).astype(np.uint8)\n", + " seg_img = Image.fromarray(seg_map).convert('P')\n", + " seg_img.putpalette(np.array(palette, dtype=np.uint8))\n", + " seg_img.save(osp.join(data_root, ann_dir, file.replace('.regions.txt', \n", + " '.png')))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 377 + }, + "id": "5MCSS9ABfSks", + "outputId": "92b9bafc-589e-48fc-c9e9-476f125d6522" + }, + "outputs": [], + "source": [ + "# Let's take a look at the segmentation map we got\n", + "import matplotlib.patches as mpatches\n", + "img = Image.open('iccv09Data/labels/6000124.png')\n", + "plt.figure(figsize=(8, 6))\n", + "im = plt.imshow(np.array(img.convert('RGB')))\n", + "\n", + "# create a patch (proxy artist) for every color \n", + "patches = [mpatches.Patch(color=np.array(palette[i])/255., \n", + " label=classes[i]) for i in range(8)]\n", + "# put those patched as legend-handles into the legend\n", + "plt.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \n", + " fontsize='large')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WbeLYCp2k5hl" + }, + "outputs": [], + "source": [ + "# split train/val set randomly\n", + "split_dir = 'splits'\n", + "mmengine.mkdir_or_exist(osp.join(data_root, split_dir))\n", + "filename_list = [osp.splitext(filename)[0] for filename in mmengine.scandir(\n", + " osp.join(data_root, ann_dir), suffix='.png')]\n", + "with open(osp.join(data_root, split_dir, 'train.txt'), 'w') as f:\n", + " # select first 4/5 as train set\n", + " train_length = int(len(filename_list)*4/5)\n", + " f.writelines(line + '\\n' for line in filename_list[:train_length])\n", + "with open(osp.join(data_root, split_dir, 'val.txt'), 'w') as f:\n", + " # select last 1/5 as train set\n", + " f.writelines(line + '\\n' for line in filename_list[train_length:])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HchvmGYB_rrO" + }, + "source": [ + "After downloading the data, we need to implement `load_annotations` function in the new dataset class `StanfordBackgroundDataset`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LbsWOw62_o-X" + }, + "outputs": [], + "source": [ + "from mmseg.registry import DATASETS\n", + "from mmseg.datasets import BaseSegDataset\n", + "\n", + "\n", + "@DATASETS.register_module()\n", + "class StanfordBackgroundDataset(BaseSegDataset):\n", + " METAINFO = dict(classes = classes, palette = palette)\n", + " def __init__(self, **kwargs):\n", + " super().__init__(img_suffix='.jpg', seg_map_suffix='.png', **kwargs)\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yUVtmn3Iq3WA" + }, + "source": [ + "### Create a config file\n", + "In the next step, we need to modify the config for the training. To accelerate the process, we finetune the model from trained weights." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Download config and checkpoint files\n", + "!mim download mmsegmentation --config pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 --dest ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Wwnj9tRzqX_A" + }, + "outputs": [], + "source": [ + "from mmengine import Config\n", + "cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py')\n", + "print(f'Config:\\n{cfg.pretty_text}')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1y2oV5w97jQo" + }, + "source": [ + "Since the given config is used to train PSPNet on the cityscapes dataset, we need to modify it accordingly for our new dataset. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eyKnYC1Z7iCV", + "outputId": "6195217b-187f-4675-994b-ba90d8bb3078" + }, + "outputs": [], + "source": [ + "# Since we use only one GPU, BN is used instead of SyncBN\n", + "cfg.norm_cfg = dict(type='BN', requires_grad=True)\n", + "cfg.crop_size = (256, 256)\n", + "cfg.model.data_preprocessor.size = cfg.crop_size\n", + "cfg.model.backbone.norm_cfg = cfg.norm_cfg\n", + "cfg.model.decode_head.norm_cfg = cfg.norm_cfg\n", + "cfg.model.auxiliary_head.norm_cfg = cfg.norm_cfg\n", + "# modify num classes of the model in decode/auxiliary head\n", + "cfg.model.decode_head.num_classes = 8\n", + "cfg.model.auxiliary_head.num_classes = 8\n", + "\n", + "# Modify dataset type and path\n", + "cfg.dataset_type = 'StanfordBackgroundDataset'\n", + "cfg.data_root = data_root\n", + "\n", + "cfg.train_dataloader.batch_size = 8\n", + "\n", + "cfg.train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='RandomResize', scale=(320, 240), ratio_range=(0.5, 2.0), keep_ratio=True),\n", + " dict(type='RandomCrop', crop_size=cfg.crop_size, cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', prob=0.5),\n", + " dict(type='PackSegInputs')\n", + "]\n", + "\n", + "cfg.test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', scale=(320, 240), keep_ratio=True),\n", + " # add loading annotation after ``Resize`` because ground truth\n", + " # does not need to do resize data transform\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='PackSegInputs')\n", + "]\n", + "\n", + "\n", + "cfg.train_dataloader.dataset.type = cfg.dataset_type\n", + "cfg.train_dataloader.dataset.data_root = cfg.data_root\n", + "cfg.train_dataloader.dataset.data_prefix = dict(img_path=img_dir, seg_map_path=ann_dir)\n", + "cfg.train_dataloader.dataset.pipeline = cfg.train_pipeline\n", + "cfg.train_dataloader.dataset.ann_file = 'splits/train.txt'\n", + "\n", + "cfg.val_dataloader.dataset.type = cfg.dataset_type\n", + "cfg.val_dataloader.dataset.data_root = cfg.data_root\n", + "cfg.val_dataloader.dataset.data_prefix = dict(img_path=img_dir, seg_map_path=ann_dir)\n", + "cfg.val_dataloader.dataset.pipeline = cfg.test_pipeline\n", + "cfg.val_dataloader.dataset.ann_file = 'splits/val.txt'\n", + "\n", + "cfg.test_dataloader = cfg.val_dataloader\n", + "\n", + "\n", + "# Load the pretrained weights\n", + "cfg.load_from = 'pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'\n", + "\n", + "# Set up working dir to save files and logs.\n", + "cfg.work_dir = './work_dirs/tutorial'\n", + "\n", + "cfg.train_cfg.max_iters = 200\n", + "cfg.train_cfg.val_interval = 200\n", + "cfg.default_hooks.logger.interval = 10\n", + "cfg.default_hooks.checkpoint.interval = 200\n", + "\n", + "# Set seed to facilitate reproducing the result\n", + "cfg['randomness'] = dict(seed=0)\n", + "\n", + "# Let's have a look at the final config used for training\n", + "print(f'Config:\\n{cfg.pretty_text}')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QWuH14LYF2gQ" + }, + "source": [ + "### Train and Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jYKoSfdMF12B", + "outputId": "422219ca-d7a5-4890-f09f-88c959942e64" + }, + "outputs": [], + "source": [ + "from mmengine.runner import Runner\n", + "\n", + "runner = Runner.from_cfg(cfg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# start training\n", + "runner.train()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DEkWOP-NMbc_" + }, + "source": [ + "Inference with trained model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 645 + }, + "id": "ekG__UfaH_OU", + "outputId": "1437419c-869a-4902-df86-d4f6f8b2597a" + }, + "outputs": [], + "source": [ + "from mmseg.apis import init_model, inference_model, show_result_pyplot\n", + "\n", + "# Init the model from the config and the checkpoint\n", + "checkpoint_path = './work_dirs/tutorial/iter_200.pth'\n", + "model = init_model(cfg, checkpoint_path, 'cuda:0')\n", + "\n", + "img = mmcv.imread('iccv09Data/images/6000124.jpg')\n", + "result = inference_model(model, img)\n", + "plt.figure(figsize=(8, 6))\n", + "vis_result = show_result_pyplot(model, img, result)\n", + "plt.imshow(mmcv.bgr2rgb(vis_result))\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "include_colab_link": true, + "name": "MMSegmentation Tutorial.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3.10.6 ('pt1.12')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + }, + "vscode": { + "interpreter": { + "hash": "0442e67aee3d9cbb788fa6e86d60c4ffa94ad7f1943c65abfecb99a6f4696c58" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/mmsegmentation/demo/image_demo.py b/mmsegmentation/demo/image_demo.py new file mode 100644 index 0000000..ebc34c8 --- /dev/null +++ b/mmsegmentation/demo/image_demo.py @@ -0,0 +1,51 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser + +from mmengine.model import revert_sync_batchnorm + +from mmseg.apis import inference_model, init_model, show_result_pyplot + + +def main(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('--out-file', default=None, help='Path to output file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + parser.add_argument( + '--with-labels', + action='store_true', + default=False, + help='Whether to display the class labels.') + parser.add_argument( + '--title', default='result', help='The image identifier.') + args = parser.parse_args() + + # build the model from a config file and a checkpoint file + model = init_model(args.config, args.checkpoint, device=args.device) + if args.device == 'cpu': + model = revert_sync_batchnorm(model) + # test a single image + result = inference_model(model, args.img) + # show the results + show_result_pyplot( + model, + args.img, + result, + title=args.title, + opacity=args.opacity, + with_labels=args.with_labels, + draw_gt=False, + show=False if args.out_file is not None else True, + out_file=args.out_file) + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/demo/image_demo_with_inferencer.py b/mmsegmentation/demo/image_demo_with_inferencer.py new file mode 100644 index 0000000..d1fa9de --- /dev/null +++ b/mmsegmentation/demo/image_demo_with_inferencer.py @@ -0,0 +1,54 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser + +from mmseg.apis import MMSegInferencer + + +def main(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('model', help='Config file') + parser.add_argument('--checkpoint', default=None, help='Checkpoint file') + parser.add_argument( + '--out-dir', default='', help='Path to save result file') + parser.add_argument( + '--show', + action='store_true', + default=False, + help='Whether to display the drawn image.') + parser.add_argument( + '--dataset-name', + default='cityscapes', + help='Color palette used for segmentation map') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + parser.add_argument( + '--with-labels', + action='store_true', + default=False, + help='Whether to display the class labels.') + args = parser.parse_args() + + # build the model from a config file and a checkpoint file + mmseg_inferencer = MMSegInferencer( + args.model, + args.checkpoint, + dataset_name=args.dataset_name, + device=args.device) + + # test a single image + mmseg_inferencer( + args.img, + show=args.show, + out_dir=args.out_dir, + opacity=args.opacity, + with_labels=args.with_labels) + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/demo/inference_demo.ipynb b/mmsegmentation/demo/inference_demo.ipynb new file mode 100644 index 0000000..455c5df --- /dev/null +++ b/mmsegmentation/demo/inference_demo.ipynb @@ -0,0 +1,120 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir ../checkpoints\n", + "!wget https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P ../checkpoints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "import torch\n", + "import matplotlib.pyplot as plt\n", + "from mmengine.model.utils import revert_sync_batchnorm\n", + "from mmseg.apis import init_model, inference_model, show_result_pyplot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "config_file = '../configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py'\n", + "checkpoint_file = '../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_model(config_file, checkpoint_file, device='cpu')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# test a single image\n", + "img = 'demo.png'\n", + "if not torch.cuda.is_available():\n", + " model = revert_sync_batchnorm(model)\n", + "result = inference_model(model, img)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# show the results\n", + "vis_result = show_result_pyplot(model, img, result, show=False)\n", + "plt.imshow(vis_result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pt1.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + }, + "vscode": { + "interpreter": { + "hash": "f61d5b8fecdd960739697f6c2860080d7b76a5be5d896cb034bdb275ab3ddda0" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/mmsegmentation/demo/rs_image_inference.py b/mmsegmentation/demo/rs_image_inference.py new file mode 100644 index 0000000..799181f --- /dev/null +++ b/mmsegmentation/demo/rs_image_inference.py @@ -0,0 +1,50 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser + +from mmseg.apis import RSImage, RSInferencer + + +def main(): + parser = ArgumentParser() + parser.add_argument('image', help='Image file path') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument( + '--output-path', + help='Path to save result image', + default='result.png') + parser.add_argument( + '--batch-size', + type=int, + default=1, + help='maximum number of windows inferred simultaneously') + parser.add_argument( + '--window-size', + help='window xsize,ysize', + default=(224, 224), + type=int, + nargs=2) + parser.add_argument( + '--stride', + help='window xstride,ystride', + default=(224, 224), + type=int, + nargs=2) + parser.add_argument( + '--thread', default=1, type=int, help='number of inference threads') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + args = parser.parse_args() + inferencer = RSInferencer.from_config_path( + args.config, + args.checkpoint, + batch_size=args.batch_size, + thread=args.thread, + device=args.device) + image = RSImage(args.image) + + inferencer.run(image, args.window_size, args.stride, args.output_path) + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/demo/video_demo.py b/mmsegmentation/demo/video_demo.py new file mode 100644 index 0000000..7e6f3d6 --- /dev/null +++ b/mmsegmentation/demo/video_demo.py @@ -0,0 +1,112 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser + +import cv2 +from mmengine.model.utils import revert_sync_batchnorm + +from mmseg.apis import inference_model, init_model +from mmseg.apis.inference import show_result_pyplot + + +def main(): + parser = ArgumentParser() + parser.add_argument('video', help='Video file or webcam id') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--palette', + default='cityscapes', + help='Color palette used for segmentation map') + parser.add_argument( + '--show', action='store_true', help='Whether to show draw result') + parser.add_argument( + '--show-wait-time', default=1, type=int, help='Wait time after imshow') + parser.add_argument( + '--output-file', default=None, type=str, help='Output video file path') + parser.add_argument( + '--output-fourcc', + default='MJPG', + type=str, + help='Fourcc of the output video') + parser.add_argument( + '--output-fps', default=-1, type=int, help='FPS of the output video') + parser.add_argument( + '--output-height', + default=-1, + type=int, + help='Frame height of the output video') + parser.add_argument( + '--output-width', + default=-1, + type=int, + help='Frame width of the output video') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + args = parser.parse_args() + + assert args.show or args.output_file, \ + 'At least one output should be enabled.' + + # build the model from a config file and a checkpoint file + model = init_model(args.config, args.checkpoint, device=args.device) + if args.device == 'cpu': + model = revert_sync_batchnorm(model) + + # build input video + if args.video.isdigit(): + args.video = int(args.video) + cap = cv2.VideoCapture(args.video) + assert (cap.isOpened()) + input_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) + input_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) + input_fps = cap.get(cv2.CAP_PROP_FPS) + + # init output video + writer = None + output_height = None + output_width = None + if args.output_file is not None: + fourcc = cv2.VideoWriter_fourcc(*args.output_fourcc) + output_fps = args.output_fps if args.output_fps > 0 else input_fps + output_height = args.output_height if args.output_height > 0 else int( + input_height) + output_width = args.output_width if args.output_width > 0 else int( + input_width) + writer = cv2.VideoWriter(args.output_file, fourcc, output_fps, + (output_width, output_height), True) + + # start looping + try: + while True: + flag, frame = cap.read() + if not flag: + break + + # test a single image + result = inference_model(model, frame) + + # blend raw image and prediction + draw_img = show_result_pyplot(model, frame, result) + + if args.show: + cv2.imshow('video_demo', draw_img) + cv2.waitKey(args.show_wait_time) + if writer: + if draw_img.shape[0] != output_height or draw_img.shape[ + 1] != output_width: + draw_img = cv2.resize(draw_img, + (output_width, output_height)) + writer.write(draw_img) + finally: + if writer: + writer.release() + cap.release() + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/docker/Dockerfile b/mmsegmentation/docker/Dockerfile new file mode 100644 index 0000000..26420dd --- /dev/null +++ b/mmsegmentation/docker/Dockerfile @@ -0,0 +1,35 @@ +ARG PYTORCH="1.11.0" +ARG CUDA="11.3" +ARG CUDNN="8" +ARG MMCV="2.0.1" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX" +ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" +ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" + +# To fix GPG key error when running apt-get update +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +RUN apt-get update && apt-get install -y git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN conda clean --all + +# Install MMCV +ARG PYTORCH +ARG CUDA +ARG MMCV +RUN ["/bin/bash", "-c", "pip install openmim"] +RUN ["/bin/bash", "-c", "mim install mmengine"] +RUN ["/bin/bash", "-c", "mim install mmcv==${MMCV}"] + +# Install MMSegmentation +RUN git clone -b main https://github.com/open-mmlab/mmsegmentation.git /mmsegmentation +WORKDIR /mmsegmentation +ENV FORCE_CUDA="1" +RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -e . diff --git a/mmsegmentation/docker/serve/Dockerfile b/mmsegmentation/docker/serve/Dockerfile new file mode 100644 index 0000000..38f91ba --- /dev/null +++ b/mmsegmentation/docker/serve/Dockerfile @@ -0,0 +1,51 @@ +ARG PYTORCH="1.11.0" +ARG CUDA="11.3" +ARG CUDNN="8" +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +ARG MMCV="2.0.1" +ARG MMSEG="1.2.2" + +ENV PYTHONUNBUFFERED TRUE + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ + ca-certificates \ + g++ \ + openjdk-11-jre-headless \ + # MMDet Requirements + ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \ + && rm -rf /var/lib/apt/lists/* + +ENV PATH="/opt/conda/bin:$PATH" +RUN export FORCE_CUDA=1 + +# TORCHSEVER +RUN pip install torchserve torch-model-archiver + +# MMLAB +ARG PYTORCH +ARG CUDA +RUN ["/bin/bash", "-c", "pip install openmim"] +RUN ["/bin/bash", "-c", "mim install mmengine"] +RUN ["/bin/bash", "-c", "mim install mmcv==${MMCV}"] +RUN pip install mmsegmentation==${MMSEG} + +RUN useradd -m model-server \ + && mkdir -p /home/model-server/tmp + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh + +RUN chmod +x /usr/local/bin/entrypoint.sh \ + && chown -R model-server /home/model-server + +COPY config.properties /home/model-server/config.properties +RUN mkdir /home/model-server/model-store && chown -R model-server /home/model-server/model-store + +EXPOSE 8080 8081 8082 + +USER model-server +WORKDIR /home/model-server +ENV TEMP=/home/model-server/tmp +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["serve"] diff --git a/mmsegmentation/docker/serve/config.properties b/mmsegmentation/docker/serve/config.properties new file mode 100644 index 0000000..efb9c47 --- /dev/null +++ b/mmsegmentation/docker/serve/config.properties @@ -0,0 +1,5 @@ +inference_address=http://0.0.0.0:8080 +management_address=http://0.0.0.0:8081 +metrics_address=http://0.0.0.0:8082 +model_store=/home/model-server/model-store +load_models=all diff --git a/mmsegmentation/docker/serve/entrypoint.sh b/mmsegmentation/docker/serve/entrypoint.sh new file mode 100644 index 0000000..41ba00b --- /dev/null +++ b/mmsegmentation/docker/serve/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +if [[ "$1" = "serve" ]]; then + shift 1 + torchserve --start --ts-config /home/model-server/config.properties +else + eval "$@" +fi + +# prevent docker exit +tail -f /dev/null diff --git a/mmsegmentation/docs/en/.readthedocs.yaml b/mmsegmentation/docs/en/.readthedocs.yaml new file mode 100644 index 0000000..9df9fdb --- /dev/null +++ b/mmsegmentation/docs/en/.readthedocs.yaml @@ -0,0 +1,17 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.8" + +formats: + - epub + +sphinx: + configuration: docs/en/conf.py + +python: + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/mmsegmentation/docs/en/Makefile b/mmsegmentation/docs/en/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/mmsegmentation/docs/en/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/mmsegmentation/docs/en/_static/css/readthedocs.css b/mmsegmentation/docs/en/_static/css/readthedocs.css new file mode 100644 index 0000000..2e38d08 --- /dev/null +++ b/mmsegmentation/docs/en/_static/css/readthedocs.css @@ -0,0 +1,6 @@ +.header-logo { + background-image: url("../images/mmsegmentation.png"); + background-size: 201px 40px; + height: 40px; + width: 201px; +} diff --git a/mmsegmentation/docs/en/advanced_guides/add_datasets.md b/mmsegmentation/docs/en/advanced_guides/add_datasets.md new file mode 100644 index 0000000..a8e3503 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/add_datasets.md @@ -0,0 +1,199 @@ +# Add New Datasets + +## Add new custom dataset + +Here we show how to develop a new custom dataset. + +1. Create a new file `mmseg/datasets/example.py` + + ```python + from mmseg.registry import DATASETS + from .basesegdataset import BaseSegDataset + + + @DATASETS.register_module() + class ExampleDataset(BaseSegDataset): + + METAINFO = dict( + classes=('xxx', 'xxx', ...), + palette=[[x, x, x], [x, x, x], ...]) + + def __init__(self, arg1, arg2): + pass + ``` + +2. Import the module in `mmseg/datasets/__init__.py` + + ```python + from .example import ExampleDataset + ``` + +3. Use it by creating a new new dataset config file `configs/_base_/datasets/example_dataset.py` + + ```python + dataset_type = 'ExampleDataset' + data_root = 'data/example/' + ... + ``` + +4. Add dataset meta information in `mmseg/utils/class_names.py` + + ```python + def example_classes(): + return [ + 'xxx', 'xxx', + ... + ] + + def example_palette(): + return [ + [x, x, x], [x, x, x], + ... + ] + dataset_aliases ={ + 'example': ['example', ...], + ... + } + ``` + +**Note:** If the new dataset does not satisfy the mmseg requirements, a data preprocessing script needs to be prepared in `tools/dataset_converters/` + +## Customize datasets by reorganizing data + +The simplest way is to convert your dataset to organize your data into folders. + +An example of file structure is as followed. + +```none +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ my_dataset +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + +``` + +A training pair will consist of the files with same suffix in img_dir/ann_dir. + +Some datasets don't release the test set or don't release the ground truth of the test set, and we cannot evaluate models locally without the ground truth of the test set, so we set the validation set as the default test set in config files. + +About how to build your own datasets or implement a new dataset class please refer to the [datasets guide](./datasets.md) for more detailed information. + +**Note:** The annotations are images of shape (H, W), the value pixel should fall in range `[0, num_classes - 1]`. +You may use `'P'` mode of [pillow](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#palette) to create your annotation image with color. + +## Customize datasets by mixing dataset + +MMSegmentation also supports to mix dataset for training. +Currently it supports to concat, repeat and multi-image mix datasets. + +### Repeat dataset + +We use `RepeatDataset` as wrapper to repeat the dataset. +For example, suppose the original dataset is `Dataset_A`, to repeat it, the config looks like the following + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +``` + +### Concatenate dataset + +In case the dataset you want to concatenate is different, you can concatenate the dataset configs like the following. + +```python +dataset_A_train = dict() +dataset_B_train = dict() +concatenate_dataset = dict( + type='ConcatDataset', + datasets=[dataset_A_train, dataset_B_train]) +``` + +A more complex example that repeats `Dataset_A` and `Dataset_B` by N and M times, respectively, and then concatenates the repeated datasets is as the following. + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +dataset_A_val = dict( + ... + pipeline=test_pipeline +) +dataset_A_test = dict( + ... + pipeline=test_pipeline +) +dataset_B_train = dict( + type='RepeatDataset', + times=M, + dataset=dict( + type='Dataset_B', + ... + pipeline=train_pipeline + ) +) +train_dataloader = dict( + dataset=dict( + type='ConcatDataset', + datasets=[dataset_A_train, dataset_B_train])) + +val_dataloader = dict(dataset=dataset_A_val) +test_dataloader = dict(dataset=dataset_A_test) + +``` + +You can refer base dataset [tutorial](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/basedataset.html) from mmengine for more details + +### Multi-image Mix Dataset + +We use `MultiImageMixDataset` as a wrapper to mix images from multiple datasets. +`MultiImageMixDataset` can be used by multiple images mixed data augmentation like mosaic and mixup. + +An example of using `MultiImageMixDataset` with `Mosaic` data augmentation: + +```python +train_pipeline = [ + dict(type='RandomMosaic', prob=1), + dict(type='Resize', img_scale=(1024, 512), keep_ratio=True), + dict(type='RandomFlip', prob=0.5), + dict(type='PackSegInputs') +] + +train_dataset = dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + reduce_zero_label=False, + img_dir=data_root + "images/train", + ann_dir=data_root + "annotations/train", + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + ] + ), + pipeline=train_pipeline +) + +``` diff --git a/mmsegmentation/docs/en/advanced_guides/add_metrics.md b/mmsegmentation/docs/en/advanced_guides/add_metrics.md new file mode 100644 index 0000000..0298826 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/add_metrics.md @@ -0,0 +1,81 @@ +# Add New Metrics + +## Develop with the source code of MMSegmentation + +Here we show how to develop a new metric with an example of `CustomMetric` as the following. + +1. Create a new file `mmseg/evaluation/metrics/custom_metric.py`. + + ```python + from typing import List, Sequence + + from mmengine.evaluator import BaseMetric + + from mmseg.registry import METRICS + + + @METRICS.register_module() + class CustomMetric(BaseMetric): + + def __init__(self, arg1, arg2): + """ + The metric first processes each batch of data_samples and predictions, + and appends the processed results to the results list. Then it + collects all results together from all ranks if distributed training + is used. Finally, it computes the metrics of the entire dataset. + """ + + def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: + pass + + def compute_metrics(self, results: list) -> dict: + pass + + def evaluate(self, size: int) -> dict: + pass + ``` + + In the above example, `CustomMetric` is a subclass of `BaseMetric`. It has three methods: `process`, `compute_metrics` and `evaluate`. + + - `process()` process one batch of data samples and predictions. The processed results are stored in `self.results` which will be used to compute the metrics after all the data samples are processed. Please refer to [MMEngine documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/design/evaluation.md) for more details. + + - `compute_metrics()` is used to compute the metrics from the processed results. + + - `evaluate()` is an interface to compute the metrics and return the results. It will be called by `ValLoop` or `TestLoop` in the `Runner`. In most cases, you don't need to override this method, but you can override it if you want to do some extra work. + + **Note:** You might find the details of calling `evaluate()` method in the `Runner` [here](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L366). The `Runner` is the executor of the training and testing process, you can find more details about it at the [engine document](./engine.md). + +2. Import the new metric in `mmseg/evaluation/metrics/__init__.py`. + + ```python + from .custom_metric import CustomMetric + __all__ = ['CustomMetric', ...] + ``` + +3. Add the new metric to the config file. + + ```python + val_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + test_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + ``` + +## Develop with the released version of MMSegmentation + +The above example shows how to develop a new metric with the source code of MMSegmentation. If you want to develop a new metric with the released version of MMSegmentation, you can follow the following steps. + +1. Create a new file `/Path/to/metrics/custom_metric.py`, implement the `process`, `compute_metrics` and `evaluate` methods, `evaluate` method is optional. + +2. Import the new metric in your code or config file. + + ```python + from path.to.metrics import CustomMetric + ``` + + or + + ```python + custom_imports = dict(imports=['/Path/to/metrics'], allow_failed_imports=False) + + val_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + test_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + ``` diff --git a/mmsegmentation/docs/en/advanced_guides/add_models.md b/mmsegmentation/docs/en/advanced_guides/add_models.md new file mode 100644 index 0000000..ed5c9ce --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/add_models.md @@ -0,0 +1,260 @@ +# Add New Modules + +## Develop new components + +We can customize all the components introduced at [the model documentation](./models.md), such as **backbone**, **head**, **loss function** and **data preprocessor**. + +### Add new backbones + +Here we show how to develop a new backbone with an example of MobileNet. + +1. Create a new file `mmseg/models/backbones/mobilenet.py`. + + ```python + import torch.nn as nn + + from mmseg.registry import MODELS + + + @MODELS.register_module() + class MobileNet(nn.Module): + + def __init__(self, arg1, arg2): + pass + + def forward(self, x): # should return a tuple + pass + + def init_weights(self, pretrained=None): + pass + ``` + +2. Import the module in `mmseg/models/backbones/__init__.py`. + + ```python + from .mobilenet import MobileNet + ``` + +3. Use it in your config file. + + ```python + model = dict( + ... + backbone=dict( + type='MobileNet', + arg1=xxx, + arg2=xxx), + ... + ``` + +### Add new heads + +In MMSegmentation, we provide a [BaseDecodeHead](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/decode_heads/decode_head.py#L17) for developing all segmentation heads. +All newly implemented decode heads should be derived from it. +Here we show how to develop a new head with the example of [PSPNet](https://arxiv.org/abs/1612.01105) as the following. + +First, add a new decode head in `mmseg/models/decode_heads/psp_head.py`. +PSPNet implements a decode head for segmentation decode. +To implement a decode head, we need to implement three functions of the new module as the following. + +```python +from mmseg.registry import MODELS + +@MODELS.register_module() +class PSPHead(BaseDecodeHead): + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(PSPHead, self).__init__(**kwargs) + + def init_weights(self): + pass + + def forward(self, inputs): + pass +``` + +Next, the users need to add the module in the `mmseg/models/decode_heads/__init__.py`, thus the corresponding registry could find and load them. + +To config file of PSPNet is as the following + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrain_model/resnet50_v1c_trick-2cccc1ad.pth', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) + +``` + +### Add new loss + +Assume you want to add a new loss as `MyLoss` for segmentation decode. +To add a new loss function, the users need to implement it in `mmseg/models/losses/my_loss.py`. +The decorator `weighted_loss` enables the loss to be weighted for each element. + +```python +import torch +import torch.nn as nn + +from mmseg.registry import MODELS +from .utils import weighted_loss + +@weighted_loss +def my_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + +@MODELS.register_module() +class MyLoss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(MyLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * my_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss +``` + +Then the users need to add it in the `mmseg/models/losses/__init__.py`. + +```python +from .my_loss import MyLoss, my_loss + +``` + +To use it, modify the `loss_xxx` field. +Then you need to modify the `loss_decode` field in the head. +`loss_weight` could be used to balance multiple losses. + +```python +loss_decode=dict(type='MyLoss', loss_weight=1.0)) +``` + +### Add new data preprocessor + +In MMSegmentation 1.x versions, we use [SegDataPreProcessor](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/data_preprocessor.py#L13) to copy data to the target device and preprocess the data into the model input format as default. Here we show how to develop a new data preprocessor. + +1. Create a new file `mmseg/models/my_datapreprocessor.py`. + + ```python + from mmengine.model import BaseDataPreprocessor + + from mmseg.registry import MODELS + + @MODELS.register_module() + class MyDataPreProcessor(BaseDataPreprocessor): + def __init__(self, **kwargs): + super().__init__(**kwargs) + + def forward(self, data: dict, training: bool=False) -> Dict[str, Any]: + # TODO Define the logic for data pre-processing in the forward method + pass + ``` + +2. Import your data preprocessor in `mmseg/models/__init__.py` + + ```python + from .my_datapreprocessor import MyDataPreProcessor + ``` + +3. Use it in your config file. + + ```python + model = dict( + data_preprocessor=dict(type='MyDataPreProcessor) + ... + ) + ``` + +## Develop new segmentors + +The segmentor is an algorithmic architecture in which users can customize their algorithms by adding customized components and defining the logic of algorithm execution. Please refer to [the model document](./models.md) for more details. + +Since the [BaseSegmentor](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/segmentors/base.py#L15) in MMSegmentation unifies three modes for a forward process, to develop a new segmentor, users need to overwrite `loss`, `predict` and `_forward` methods corresponding to the `loss`, `predict` and `tensor` modes. + +Here we show how to develop a new segmentor. + +1. Create a new file `mmseg/models/segmentors/my_segmentor.py`. + + ```python + from typing import Dict, Optional, Union + + import torch + + from mmseg.registry import MODELS + from mmseg.models import BaseSegmentor + + @MODELS.register_module() + class MySegmentor(BaseSegmentor): + def __init__(self, **kwargs): + super().__init__(**kwargs) + # TODO users should build components of the network here + + def loss(self, inputs: Tensor, data_samples: SampleList) -> dict: + """Calculate losses from a batch of inputs and data samples.""" + pass + + def predict(self, inputs: Tensor, data_samples: OptSampleList=None) -> SampleList: + """Predict results from a batch of inputs and data samples with post- + processing.""" + pass + + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tuple[List[Tensor]]: + """Network forward process. + + Usually includes backbone, neck and head forward without any post- + processing. + """ + pass + ``` + +2. Import your segmentor in `mmseg/models/segmentors/__init__.py`. + + ```python + from .my_segmentor import MySegmentor + ``` + +3. Use it in your config file. + + ```python + model = dict( + type='MySegmentor' + ... + ) + ``` diff --git a/mmsegmentation/docs/en/advanced_guides/add_transforms.md b/mmsegmentation/docs/en/advanced_guides/add_transforms.md new file mode 100644 index 0000000..ca336ce --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/add_transforms.md @@ -0,0 +1,52 @@ +# Adding New Data Transforms + +## Customization data transformation + +The customized data transformation must inherited from `BaseTransform` and implement `transform` function. +Here we use a simple flipping transformation as example: + +```python +import random +import mmcv +from mmcv.transforms import BaseTransform, TRANSFORMS + +@TRANSFORMS.register_module() +class MyFlip(BaseTransform): + def __init__(self, direction: str): + super().__init__() + self.direction = direction + + def transform(self, results: dict) -> dict: + img = results['img'] + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +Moreover, import the new class. + +```python +from .my_pipeline import MyFlip +``` + +Thus, we can instantiate a `MyFlip` object and use it to process the data dict. + +```python +import numpy as np + +transform = MyFlip(direction='horizontal') +data_dict = {'img': np.random.rand(224, 224, 3)} +data_dict = transform(data_dict) +processed_img = data_dict['img'] +``` + +Or, we can use `MyFlip` transformation in data pipeline in our config file. + +```python +pipeline = [ + ... + dict(type='MyFlip', direction='horizontal'), + ... +] +``` + +Note that if you want to use `MyFlip` in config, you must ensure the file containing `MyFlip` is imported during runtime. diff --git a/mmsegmentation/docs/en/advanced_guides/customize_runtime.md b/mmsegmentation/docs/en/advanced_guides/customize_runtime.md new file mode 100644 index 0000000..33281bf --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/customize_runtime.md @@ -0,0 +1,168 @@ +# Customize Runtime Settings + +## Customize hooks + +### Step 1: Implement a new hook + +MMEngine has implemented commonly used [hooks](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/hook.md) for training and test, +When users have requirements for customization, they can follow examples below. +For example, if some hyper-parameter of the model needs to be changed when model training, we can implement a new hook for it: + +```python +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Sequence + +from mmengine.hooks import Hook +from mmengine.model import is_model_wrapper + +from mmseg.registry import HOOKS + + +@HOOKS.register_module() +class NewHook(Hook): + """Docstring for NewHook. + """ + + def __init__(self, a: int, b: int) -> None: + self.a = a + self.b = b + + def before_train_iter(self, + runner, + batch_idx: int, + data_batch: Optional[Sequence[dict]] = None) -> None: + cur_iter = runner.iter + # acquire this model when it is in a wrapper + if is_model_wrapper(runner.model): + model = runner.model.module + model.hyper_parameter = self.a * cur_iter + self.b +``` + +### Step 2: Import a new hook + +The module which is defined above needs to be imported into main namespace first to ensure being registered. +We assume `NewHook` is implemented in `mmseg/engine/hooks/new_hook.py`, there are two ways to import it: + +- Import it by modifying `mmseg/engine/hooks/__init__.py`. + Modules should be imported in `mmseg/engine/hooks/__init__.py` thus these new modules can be found and added by registry. + +```python +from .new_hook import NewHook + +__all__ = [..., NewHook] +``` + +- Import it manually by `custom_imports` in config file. + +```python +custom_imports = dict(imports=['mmseg.engine.hooks.new_hook'], allow_failed_imports=False) +``` + +### Step 3: Modify config file + +Users can set and use customized hooks in training and test followed methods below. +The execution priority of hooks at the same place of `Runner` can be referred [here](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/hook.md#built-in-hooks), +Default priority of customized hook is `NORMAL`. + +```python +custom_hooks = [ + dict(type='NewHook', a=a_value, b=b_value, priority='ABOVE_NORMAL') +] +``` + +## Customize optimizer + +### Step 1: Implement a new optimizer + +We recommend the customized optimizer implemented in `mmseg/engine/optimizers/my_optimizer.py`. Here is an example of a new optimizer `MyOptimizer` which has parameters `a`, `b` and `c`: + +```python +from mmseg.registry import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) +``` + +### Step 2: Import a new optimizer + +The module which is defined above needs to be imported into main namespace first to ensure being registered. +We assume `MyOptimizer` is implemented in `mmseg/engine/optimizers/my_optimizer.py`, there are two ways to import it: + +- Import it by modifying `mmseg/engine/optimizers/__init__.py`. + Modules should be imported in `mmseg/engine/optimizers/__init__.py` thus these new modules can be found and added by registry. + +```python +from .my_optimizer import MyOptimizer +``` + +- Import it manually by `custom_imports` in config file. + +```python +custom_imports = dict(imports=['mmseg.engine.optimizers.my_optimizer'], allow_failed_imports=False) +``` + +### Step 3: Modify config file + +Then it needs to modify `optimizer` in `optim_wrapper` of config file, if users want to use customized `MyOptimizer`, it can be modified as: + +```python +optim_wrapper = dict(type='OptimWrapper', + optimizer=dict(type='MyOptimizer', + a=a_value, b=b_value, c=c_value), + clip_grad=None) +``` + +## Customize optimizer constructor + +### Step 1: Implement a new optimizer constructor + +Optimizer constructor is used to create optimizer and optimizer wrapper for model training, which has powerful functions like specifying learning rate and weight decay for different model layers. +Here is an example for a customized optimizer constructor. + +```python +from mmengine.optim import DefaultOptimWrapperConstructor +from mmseg.registry import OPTIM_WRAPPER_CONSTRUCTORS + +@OPTIM_WRAPPER_CONSTRUCTORS.register_module() +class LearningRateDecayOptimizerConstructor(DefaultOptimWrapperConstructor): + def __init__(self, optim_wrapper_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer +``` + +Default optimizer constructor is implemented [here](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19). +It can also be used as base class of new optimizer constructor. + +### Step 2: Import a new optimizer constructor + +The module which is defined above needs to be imported into main namespace first to ensure being registered. +We assume `MyOptimizerConstructor` is implemented in `mmseg/engine/optimizers/my_optimizer_constructor.py`, there are two ways to import it: + +- Import it by modifying `mmseg/engine/optimizers/__init__.py`. + Modules should be imported in `mmseg/engine/optimizers/__init__.py` thus these new modules can be found and added by registry. + +```python +from .my_optimizer_constructor import MyOptimizerConstructor +``` + +- Import it manually by `custom_imports` in config file. + +```python +custom_imports = dict(imports=['mmseg.engine.optimizers.my_optimizer_constructor'], allow_failed_imports=False) +``` + +### Step 3: Modify config file + +Then it needs to modify `constructor` in `optim_wrapper` of config file, if users want to use customized `MyOptimizerConstructor`, it can be modified as: + +```python +optim_wrapper = dict(type='OptimWrapper', + constructor='MyOptimizerConstructor', + clip_grad=None) +``` diff --git a/mmsegmentation/docs/en/advanced_guides/data_flow.md b/mmsegmentation/docs/en/advanced_guides/data_flow.md new file mode 100644 index 0000000..404035a --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/data_flow.md @@ -0,0 +1,87 @@ +# Dataflow + +In this chapter, we will introduce the dataflow and data format convention between the internal modules managed by the [Runner](https://mmengine.readthedocs.io/en/latest/tutorials/runner.html). + +## Overview of dataflow + +The [Runner](https://github.com/open-mmlab/mmengine/blob/main/docs/en/design/runner.md) is an "integrator" in MMEngine. It covers all aspects of the framework and shoulders the responsibility of organizing and scheduling nearly all modules, that means the dataflow between all modules also controlled by the `Runner`. As illustrated in the [Runner document of MMEngine](https://mmengine.readthedocs.io/en/latest/tutorials/runner.html), the following diagram shows the basic dataflow. + +![Basic dataflow](https://user-images.githubusercontent.com/112053249/199228350-5f80699e-7fd2-4b4c-ac32-0b16b1922c2e.png) + +The dashed border, gray filled shapes represent different data formats, while solid boxes represent modules/methods. Due to the great flexibility and extensibility of MMEngine, some critical base classes can be inherited and their methods can be overridden. The diagram above only holds when users are not customizing `TrainLoop`, `ValLoop`, and `TestLoop` in `Runner`, and are not overriding `train_step`, `val_step` and `test_step` method in their custom model. The default setting of loops in MMSegmentation is as follows, it uses `IterBasedTrainLoop` to train models with 20000 iterations in total and do evaluation each 2000 iterations. + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=20000, val_interval=2000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +``` + +In the above diagram, the red line indicates the [train_step](./models.md#train_step). At each training iteration, dataloader loads images from storage and transfer to data preprocessor, data preprocessor would put images to the specific device and stack data to batch, then model accepts the batch data as inputs, finally the outputs of the model would be sent to optimizer. The blue line indicates [val_step](./models.md#val_step) and [test_step](./models.md#test_step). The dataflow of these two process is similar to the `train_step` except the outputs of model, since model parameters are freezed when doing evaluation, the model output would be transferred to [Evaluator](./evaluation.md#ioumetric) to compute metrics. + +## Dataflow convention in MMSegmentation + +From the diagram above, we could see the basic dataflow. In this section, we would introduce format convention of data involved in this dataflow, respectively. + +### DataLoader to Data Preprocessor + +DataLoader is an essential component in training and testing pipelines of MMEngine. Conceptually, it is derived from and consistent with [PyTorch](https://pytorch.org/). DataLoader loads data from filesystem and the original data passes through data preparation pipeline, then it would be sent to Data Preprocessor. + +MMSegmentation defines the default data format at [PackSegInputs](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/transforms/formatting.py#L12), it's the last component of `train_pipeline` and `test_pipeline`. Please refer to [data transform documentation](./transforms.md) for more information about data transform `pipeline`. + +Without any modifications, the return value of PackSegInputs is usually a `dict` and has only two keys, `inputs` and `data_samples`. The following pseudo-code shows the data types of the data loader output in mmseg, which is a batch of fetched data samples from the dataset, and data loader packs them into a dictionary of the list. `inputs` is the list of input tensors to the model and `data_samples` contains a list of input images' meta information and corresponding ground truth. + +```python +dict( + inputs=List[torch.Tensor], + data_samples=List[SegDataSample] +) +``` + +**Note:** [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) is a data structure interface of MMSegmentation, it is used as an interface between different components. `SegDataSample` implements the abstract data element `mmengine.structures.BaseDataElement`, please refer to [the SegDataSample documentation](./structures.md) and [data element documentation](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for more information. + +### Data Preprocessor to Model + +Though drawn separately in the diagram [above](#overview-of-dataflow), data_preprocessor is a part of the model and thus can be found in [Model tutorial](./models.md) at data preprocessor chapter. + +The return value of data preprocessor is a dictionary, containing `inputs` and `data_samples`, `inputs` is batched images, a 4D tensor, and some additional meta info used in data preprocesses would be added to the `data_samples`. When transferred to the network, the dictionary would be unpacked to two values. The following pseudo-codes show the return value of the data preprocessor and the input values of model. + +```python +dict( + inputs=torch.Tensor, + data_samples=List[SegDataSample] +) +``` + +```python +class Network(BaseSegmentor): + + def forward(self, inputs: torch.Tensor, data_samples: List[SegDataSample], mode: str): + pass +``` + +**Note:** Model forward has 3 kinds of mode, which is controlled by input argumentmode, please refer [model tutorial](./models.md) for more details. + +### Model output + +As [model tutorial](./models.md#forward) mentioned 3 kinds of mode forward with 3 kinds of output. `train_step`and `test_step`(or `val_step`) correspond to `'loss'` and `'predict'` respectively. + +In `test_step` or `val_step`, the inference results would be transferred to `Evaluator`. You might read the [evaluation document](./evaluation.md) for more information about `Evaluator`. + +After inference, the [BaseSegmentor](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/segmentors/base.py#L15) in MMSegmentation would do a simple post process to pack inference results, the segmentation logits produced by the neural network, segmentation mask after the `argmax` operation and ground truth(if exists) would be packed into a similar `SegDataSample` instance. The return value of [postprocess_result](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/segmentors/base.py#L132) is a **`List` of `SegDataSample`**. Following diagram shows the key properties of these `SegDataSample` instances. + +![SegDataSample](https://user-images.githubusercontent.com/15952744/209912225-ab46a8d9-904a-43cb-8bf1-8bec4938ed29.png) + +The same as Data Preprocessor, loss function is also a part of the model, it's a property of [decode head](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/decode_heads/decode_head.py#L142). + +In MMSegmentation, the method [loss_by_feat](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/decode_heads/decode_head.py#L291) of `decode_head` is an unified interface used to compute loss. + +Parameters: + +- seg_logits (Tensor): The output from decode head forward function. +- batch_data_samples (List\[:obj:`SegDataSample`\]): The seg data samples. It usually includes information such as `metainfo` and `gt_sem_seg`. + +Returns: + +- dict\[str, Tensor\]: a dictionary of loss components + +**Note:** The `train_step` transfers the loss into OptimWrapper to update the weights in model, please refer [train_step](./models.md#train_step) for more details. diff --git a/mmsegmentation/docs/en/advanced_guides/datasets.md b/mmsegmentation/docs/en/advanced_guides/datasets.md new file mode 100644 index 0000000..1efc334 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/datasets.md @@ -0,0 +1,386 @@ +# Dataset + +Dataset classes in MMSegmentation have two functions: (1) load data information after [data preparation](../user_guides/2_dataset_prepare.md) +and (2) send data into [dataset transform pipeline](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L141) to do [data augmentation](./transforms.md). +There are 2 kinds of loaded information: (1) meta information which is original dataset information such as categories (classes) of dataset and their corresponding palette information, (2) data information which includes +the path of dataset images and labels. +The tutorial includes some main interfaces in MMSegmentation 1.x dataset class: methods of loading data information and modifying dataset classes in base dataset class, and the relationship between dataset and the data transform pipeline. + +## Main Interfaces + +Take Cityscapes as an example, if you want to run the example, please download and [preprocess](../user_guides/2_dataset_prepare.md#cityscapes) +Cityscapes dataset in `data` directory, before running the demo code: + +Instantiate Cityscapes training dataset: + +```python +from mmseg.datasets import CityscapesDataset +from mmengine.registry import init_default_scope +init_default_scope('mmseg') + +data_root = 'data/cityscapes/' +data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='RandomCrop', crop_size=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PackSegInputs') +] + +dataset = CityscapesDataset(data_root=data_root, data_prefix=data_prefix, test_mode=False, pipeline=train_pipeline) +``` + +Get the length of training set: + +```python +print(len(dataset)) + +2975 +``` + +Get data information: The type of data information is `dict` which includes several keys: + +- `'img_path'`: path of images +- `'seg_map_path'`: path of segmentation labels +- `'seg_fields'`: saving label fields +- `'sample_idx'`: the index of the current sample + +There are also `'label_map'` and `'reduce_zero_label'` whose functions would be introduced in the next section. + +```python +# Acquire data information of first sample in dataset +print(dataset.get_data_info(0)) + +{'img_path': 'data/cityscapes/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png', + 'seg_map_path': 'data/cityscapes/gtFine/train/aachen/aachen_000000_000019_gtFine_labelTrainIds.png', + 'label_map': None, + 'reduce_zero_label': False, + 'seg_fields': [], + 'sample_idx': 0} +``` + +Get dataset meta information: the type of MMSegmentation meta information is also `dict`, which includes `'classes'` field for dataset classes and `'palette'` field for corresponding colors in visualization, and has `'label_map'` field and `'reduce_zero_label'` filed. + +```python +print(dataset.metainfo) + +{'classes': ('road', + 'sidewalk', + 'building', + 'wall', + 'fence', + 'pole', + 'traffic light', + 'traffic sign', + 'vegetation', + 'terrain', + 'sky', + 'person', + 'rider', + 'car', + 'truck', + 'bus', + 'train', + 'motorcycle', + 'bicycle'), + 'palette': [[128, 64, 128], + [244, 35, 232], + [70, 70, 70], + [102, 102, 156], + [190, 153, 153], + [153, 153, 153], + [250, 170, 30], + [220, 220, 0], + [107, 142, 35], + [152, 251, 152], + [70, 130, 180], + [220, 20, 60], + [255, 0, 0], + [0, 0, 142], + [0, 0, 70], + [0, 60, 100], + [0, 80, 100], + [0, 0, 230], + [119, 11, 32]], + 'label_map': None, + 'reduce_zero_label': False} +``` + +The return value of dataset `__getitem__` method is the output of data samples after data augmentation, whose type is also `dict`. It has two fields: `'inputs'` corresponding to images after data augmentation, +and `'data_samples'` corresponding to [`SegDataSample`](./structures.md) which is new data structures in MMSegmentation 1.x, +and `gt_sem_seg` of `SegDataSample` has labels after data augmentation operations. + +```python +print(dataset[0]) + +{'inputs': tensor([[[131, 130, 130, ..., 23, 23, 23], + [132, 132, 132, ..., 23, 22, 23], + [134, 133, 133, ..., 23, 23, 23], + ..., + [ 66, 67, 67, ..., 71, 71, 71], + [ 66, 67, 66, ..., 68, 68, 68], + [ 67, 67, 66, ..., 70, 70, 70]], + + [[143, 143, 142, ..., 28, 28, 29], + [145, 145, 145, ..., 28, 28, 29], + [145, 145, 145, ..., 27, 28, 29], + ..., + [ 75, 75, 76, ..., 80, 81, 81], + [ 75, 76, 75, ..., 80, 80, 80], + [ 77, 76, 76, ..., 82, 82, 82]], + + [[126, 125, 126, ..., 21, 21, 22], + [127, 127, 128, ..., 21, 21, 22], + [127, 127, 126, ..., 21, 21, 22], + ..., + [ 63, 63, 64, ..., 69, 69, 70], + [ 64, 65, 64, ..., 69, 69, 69], + [ 65, 66, 66, ..., 72, 71, 71]]], dtype=torch.uint8), + 'data_samples': + _gt_sem_seg: + )} +``` + +## BaseSegDataset + +As mentioned above, dataset classes have the same functions, we implemented [`BaseSegDataset`](https://mmsegmentation.readthedocs.io/en/latest/api.html?highlight=BaseSegDataset#mmseg.datasets.BaseSegDataset) to reues the common functions. +It inherits [`BaseDataset` of MMEngine](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/basedataset.md) and follows unified initialization process of OpenMMLab. It supports the highly effective interior storing format, some functions like +dataset concatenation and repeatedly sampling. In MMSegmentation `BaseSegDataset`, the **method of loading data information** (`load_data_list`) is redefined and adds new `get_label_map` method to **modify dataset classes information**. + +### Loading Dataset Information + +The loaded data information includes the path of images samples and annotations samples, the detailed implementation could be found in +[`load_data_list`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L231) of `BaseSegDataset` in MMSegmentation. +There are two main methods to acquire the path of images and labels: + +1. Load file paths according to the dirictory and suffix of input images and annotations + +If the dataset directory structure is organized as below, the [`load_data_list`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L231) can parse dataset directory Structure: + +``` +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ my_dataset +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{seg_map_suffix} +``` + +Here is an example pf ADE20K, and below the directory structure of the dataset: + +``` +โ”œโ”€โ”€ ade +โ”‚ โ”œโ”€โ”€ ADEChallengeData2016 +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_train_00000001.png +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”‚ โ”‚โ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_val_00000001.png +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_train_00000001.jpg +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_val_00000001.jpg +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +``` + +```python +from mmseg.datasets import ADE20KDataset + +ADE20KDataset(data_root = 'data/ade/ADEChallengeData2016', + data_prefix=dict(img_path='images/training', seg_map_path='annotations/training'), + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=True) +``` + +2. Load file paths from annotation file + +Dataset also can load an annotation file which includes the data sample paths of dataset. +Take PascalContext dataset instance as an example, its input annotation file is: + +```python +2008_000008 +... +``` + +It needs to define `ann_file` when instantiation: + +```python +PascalContextDataset(data_root='data/VOCdevkit/VOC2010/', + data_prefix=dict(img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/train.txt') +``` + +### Modification of Dataset Classes + +- Use `metainfo` input argument + +Meta information is defined as class variables, such as `METAINFO` variable of Cityscapes: + +```python +class CityscapesDataset(BaseSegDataset): + """Cityscapes dataset. + + The ``img_suffix`` is fixed to '_leftImg8bit.png' and ``seg_map_suffix`` is + fixed to '_gtFine_labelTrainIds.png' for Cityscapes dataset. + """ + METAINFO = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', + 'sky', 'person', 'rider', 'car', 'truck', 'bus', 'train', + 'motorcycle', 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, + 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], + [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]]) + +``` + +Here `'classes'` defines class names of Cityscapes dataset annotations, if users only concern some classes about vehicles and **ignore other classes**, +the meta information of dataset could be modified by defined input argument `metainfo` when instantiating Cityscapes dataset: + +```python +from mmseg.datasets import CityscapesDataset + +data_root = 'data/cityscapes/' +data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') +# metainfo only keep classes below: +metainfo=dict(classes=( 'car', 'truck', 'bus', 'train', 'motorcycle', 'bicycle')) +dataset = CityscapesDataset(data_root=data_root, data_prefix=data_prefix, metainfo=metainfo) + +print(dataset.metainfo) + +{'classes': ('car', 'truck', 'bus', 'train', 'motorcycle', 'bicycle'), + 'palette': [[0, 0, 142], + [0, 0, 70], + [0, 60, 100], + [0, 80, 100], + [0, 0, 230], + [119, 11, 32], + [128, 64, 128], + [244, 35, 232], + [70, 70, 70], + [102, 102, 156], + [190, 153, 153], + [153, 153, 153], + [250, 170, 30], + [220, 220, 0], + [107, 142, 35], + [152, 251, 152], + [70, 130, 180], + [220, 20, 60], + [255, 0, 0]], + # pixels whose label index are 255 would be ignored when calculating loss + 'label_map': {0: 255, + 1: 255, + 2: 255, + 3: 255, + 4: 255, + 5: 255, + 6: 255, + 7: 255, + 8: 255, + 9: 255, + 10: 255, + 11: 255, + 12: 255, + 13: 0, + 14: 1, + 15: 2, + 16: 3, + 17: 4, + 18: 5}, + 'reduce_zero_label': False} +``` + +Meta information is different from default setting of Cityscapes dataset. Moreover, `label_map` field is also defined, which is used for modifying label index of each pixel on segmentation mask. +The segmentation label would re-map class information by `label_map`, [here](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L151) is detailed implementation: + +```python +gt_semantic_seg_copy = gt_semantic_seg.copy() +for old_id, new_id in results['label_map'].items(): + gt_semantic_seg[gt_semantic_seg_copy == old_id] = new_id +``` + +- Using `reduce_zero_label` input argument + +To ignore label 0 (such as ADE20K dataset), we can use `reduce_zero_label` (default to `False`) argument of BaseSegDataset and its subclasses. +When `reduce_zero_label` is `True`, label 0 in segmentation annotations would be set as 255 (models of MMSegmentation would ignore label 255 in calculating loss) and indices of other labels will minus 1: + +```python +gt_semantic_seg[gt_semantic_seg == 0] = 255 +gt_semantic_seg = gt_semantic_seg - 1 +gt_semantic_seg[gt_semantic_seg == 254] = 255 +``` + +## Dataset and Data Transform Pipeline + +If the argument `pipeline` is defined, the return value of `__getitem__` method is after data argument. +If dataset input argument does not define pipeline, it is the same as return value of `get_data_info` method. + +```python +from mmseg.datasets import CityscapesDataset + +data_root = 'data/cityscapes/' +data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') +dataset = CityscapesDataset(data_root=data_root, data_prefix=data_prefix, test_mode=False) + +print(dataset[0]) + +{'img_path': 'data/cityscapes/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png', + 'seg_map_path': 'data/cityscapes/gtFine/train/aachen/aachen_000000_000019_gtFine_labelTrainIds.png', + 'label_map': None, + 'reduce_zero_label': False, + 'seg_fields': [], + 'sample_idx': 0} +``` diff --git a/mmsegmentation/docs/en/advanced_guides/engine.md b/mmsegmentation/docs/en/advanced_guides/engine.md new file mode 100644 index 0000000..7acfe5a --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/engine.md @@ -0,0 +1,279 @@ +# Training Engine + +MMEngine defined some [basic loop controllers](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py) such as epoch-based training loop (`EpochBasedTrainLoop`), iteration-based training loop (`IterBasedTrainLoop`), standard validation loop (`ValLoop`), and standard testing loop (`TestLoop`). + +OpenMMLab's algorithm libraries like MMSegmentation abstract model training, testing, and inference as `Runner` to handle. Users can use the default `Runner` in MMEngine directly or modify the `Runner` to meet customized needs. This document mainly introduces how users can configure existing running settings, hooks, and optimizers' basic concepts and usage methods. + +## Configuring Runtime Settings + +### Configuring Training Iterations + +Loop controllers refer to the execution process during training, validation, and testing. `train_cfg`, `val_cfg`, and `test_cfg` are used to build these processes in the configuration file. MMSegmentation sets commonly used training iterations in `train_cfg` under the `configs/_base_/schedules` folder. +For example, to train for 80,000 iterations using the iteration-based training loop (`IterBasedTrainLoop`) and perform validation every 8,000 iterations, you can set it as follows: + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=8000) +``` + +### Configuring Training Optimizers + +Here's an example of a SGD optimizer: + +```python +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005), + clip_grad=None) +``` + +OpenMMLab supports all optimizers in PyTorch. For more details, please refer to the [MMEngine optimizer documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md). + +It is worth emphasizing that `optim_wrapper` is a variable of `runner`, so when configuring the optimizer, the field to configure is the `optim_wrapper` field. For more information on using optimizers, see the [Optimizer](#Optimizer) section below. + +### Configuring Training Parameter Schedulers + +Before configuring the training parameter scheduler, it is recommended to first understand the basic concepts of parameter schedulers in the [MMEngine documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md). + +Here's an example of a parameter scheduler. During training, a linearly changing learning rate strategy is used for warm-up in the first 1,000 iterations. After the first 1,000 iterations until the 16,000 iterations in the end, the default polynomial learning rate decay is used: + +```python +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +``` + +Note: When modifying the `max_iters` in `train_cfg`, make sure the parameters in the parameter scheduler `param_scheduler` are also modified accordingly. + +## Hook + +### Introduction + +OpenMMLab abstracts the model training and testing process as `Runner`. Inserting hooks can implement the corresponding functionality needed at different training and testing stages (such as "before and after each training iter", "before and after each validation iter", etc.) in `Runner`. For more introduction on hook mechanisms, please refer to [here](https://www.calltutors.com/blog/what-is-hook). + +Hooks used in `Runner` are divided into two categories: + +- Default hooks: + +They implement essential functions during training and are defined in the configuration file by `default_hooks` and passed to `Runner`. `Runner` registers them through the [`register_default_hooks`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py#L1780) method. + +Hooks have corresponding priorities; the higher the priority, the earlier the runner calls them. If the priorities are the same, the calling order is consistent with the hook registration order. + +It is not recommended for users to modify the default hook priorities. Please refer to the [MMEngine hooks documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/hook.md) to understand the hook priority definitions. + +The following are the default hooks used in MMSegmentation: + +| Hook | Function | Priority | +| :--------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :---------------: | +| [IterTimerHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/iter_timer_hook.py) | Record the time spent on each iteration. | NORMAL (50) | +| [LoggerHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/logger_hook.py) | Collect log records from different components in `Runner` and output them to terminal, JSON file, tensorboard, wandb, etc. | BELOW_NORMAL (60) | +| [ParamSchedulerHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/param_scheduler_hook.py) | Update some hyperparameters in the optimizer, such as learning rate momentum. | LOW (70) | +| [CheckpointHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/checkpoint_hook.py) | Regularly save checkpoint files. | VERY_LOW (90) | +| [DistSamplerSeedHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/sampler_seed_hook.py) | Ensure the distributed sampler shuffle is enabled. | NORMAL (50) | +| [SegVisualizationHook](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/visualization/local_visualizer.py) | Visualize prediction results during validation and testing. | NORMAL (50) | + +MMSegmentation registers some hooks with essential training functions in `default_hooks`: + +```python +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=32000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) +``` + +All the default hooks mentioned above, except for `SegVisualizationHook`, are implemented in MMEngine. The `SegVisualizationHook` is a hook implemented in MMSegmentation, which will be introduced later. + +- Modifying default hooks + +We will use the `logger` and `checkpoint` in `default_hooks` as examples to demonstrate how to modify the default hooks in `default_hooks`. + +(1) Model saving configuration + +`default_hooks` uses the `checkpoint` field to initialize the [model saving hook (CheckpointHook)](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/checkpoint_hook.py#L19). + +```python +checkpoint = dict(type='CheckpointHook', interval=1) +``` + +Users can set `max_keep_ckpts` to save only a small number of checkpoints or use `save_optimizer` to determine whether to save optimizer information. More details on related parameters can be found [here](https://mmengine.readthedocs.io/en/latest/api/generated/mmengine.hooks.CheckpointHook.html#checkpointhook). + +(2) Logging configuration + +The `LoggerHook` is used to collect log information from different components in `Runner` and write it to terminal, JSON files, tensorboard, wandb, etc. + +```python +logger=dict(type='LoggerHook', interval=10) +``` + +In the latest 1.x version of MMSegmentation, some logger hooks (LoggerHook) such as `TextLoggerHook`, `WandbLoggerHook`, and `TensorboardLoggerHook` will no longer be used. Instead, MMEngine uses `LogProcessor` to handle the information processed by the aforementioned hooks, which are now in [`MessageHub`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/logging/message_hub.py#L17), [`WandbVisBackend`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/visualization/vis_backend.py#L324), and [`TensorboardVisBackend`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/visualization/vis_backend.py#L472). + +Detailed usage is as follows, configuring the visualizer and specifying the visualization backend at the same time, here using Tensorboard as the visualizer's backend: + +```python +# TensorboardVisBackend +visualizer = dict( + type='SegLocalVisualizer', vis_backends=[dict(type='TensorboardVisBackend')], name='visualizer') +``` + +For more related usage, please refer to [MMEngine Visualization Backend User Tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/visualization.md). + +- Custom hooks + +Custom hooks are defined in the configuration through `custom_hooks`, and `Runner` registers them using the [`register_custom_hooks`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py#L1820) method. + +The priority of custom hooks needs to be set in the configuration file; if not, it will be set to `NORMAL` by default. The following are some custom hooks implemented in MMEngine: + +| Hook | Usage | +| :----------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | +| [EMAHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/ema_hook.py) | Use Exponential Moving Average (EMA) during model training. | +| [EmptyCacheHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/empty_cache_hook.py) | Release all GPU memory not occupied by the cache during training | +| [SyncBuffersHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/sync_buffer_hook.py) | Synchronize the parameters in the model buffer, such as `running_mean` and `running_var` in BN, at the end of each training epoch. | + +The following is a use case for `EMAHook`, where the config file includes the configuration of the implemented custom hooks as members of the `custom_hooks` list. + +```python +custom_hooks = [ + dict(type='EMAHook', start_iters=500, priority='NORMAL') +] +``` + +### SegVisualizationHook + +MMSegmentation implemented [`SegVisualizationHook`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/engine/hooks/visualization_hook.py#L17), which is used to visualize prediction results during validation and testing. +`SegVisualizationHook` overrides the `_after_iter` method in the base class `Hook`. During validation or testing, it calls the `add_datasample` method of `visualizer` to draw semantic segmentation results according to the specified iteration interval. The specific implementation is as follows: + +```python +... +@HOOKS.register_module() +class SegVisualizationHook(Hook): +... + def _after_iter(self, + runner: Runner, + batch_idx: int, + data_batch: dict, + outputs: Sequence[SegDataSample], + mode: str = 'val') -> None: +... + # If it's a training phase or self.draw is False, then skip it + if self.draw is False or mode == 'train': + return +... + if self.every_n_inner_iters(batch_idx, self.interval): + for output in outputs: + img_path = output.img_path + img_bytes = self.file_client.get(img_path) + img = mmcv.imfrombytes(img_bytes, channel_order='rgb') + window_name = f'{mode}_{osp.basename(img_path)}' + + self._visualizer.add_datasample( + window_name, + img, + data_sample=output, + show=self.show, + wait_time=self.wait_time, + step=runner.iter) + +``` + +For more details about visualization, you can check [here](../user_guides/visualization.md). + +## Optimizer + +In the previous configuration and runtime settings, we provided a simple example of configuring the training optimizer. This section will further detailly introduce how to configure optimizers in MMSegmentation. + +## Optimizer Wrapper + +OpenMMLab 2.0 introduces an optimizer wrapper that supports different training strategies, including mixed-precision training, gradient accumulation, and gradient clipping. Users can choose the appropriate training strategy according to their needs. The optimizer wrapper also defines a standard parameter update process, allowing users to switch between different training strategies within the same code. For more information, please refer to the [MMEngine optimizer wrapper documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md). + +Here are some common usage methods in MMSegmentation: + +#### Configuring PyTorch Supported Optimizers + +OpenMMLab 2.0 supports all native PyTorch optimizers, as referenced [here](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md). + +To set the optimizer used by the `Runner` during training in the configuration file, you need to define `optim_wrapper` instead of `optimizer`. Below is an example of configuring an optimizer during training: + +```python +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005), + clip_grad=None) +``` + +#### Configuring Gradient Clipping + +When the model training requires gradient clipping, you can configure it as shown in the following example: + +```python +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2)) +``` + +Here, `max_norm` refers to the maximum value of the gradient after clipping, and `norm_type` refers to the norm used when clipping the gradient. Related methods can be found in [torch.nn.utils.clip_grad_norm\_](https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html). + +#### Configuring Mixed Precision Training + +When mixed precision training is needed to reduce memory usage, you can use `AmpOptimWrapper`. The specific configuration is as follows: + +```python +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='AmpOptimWrapper', optimizer=optimizer) +``` + +The default setting for `loss_scale` in [`AmpOptimWrapper`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/amp_optimizer_wrapper.py#L20) is `dynamic`. + +#### Configuring Hyperparameters for Different Layers of the Model Network + +In model training, if you want to set different optimization strategies for different parameters in the optimizer, such as setting different learning rates, weight decay, and other hyperparameters, you can achieve this by setting `paramwise_cfg` in the `optim_wrapper` of the configuration file. + +The following config file uses the [ViT `optim_wrapper`](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py#L15-L27) as an example to introduce the use of `paramwise_cfg` parameters. During training, the weight decay parameter coefficients for the `pos_embed`, `mask_token`, and `norm` modules are set to 0. That is, during training, the weight decay for these modules will be changed to `weight_decay * decay_mult`=0. + +```python +optimizer = dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) +``` + +Here, `decay_mult` refers to the weight decay coefficient for the corresponding parameters. For more information on the usage of `paramwise_cfg`, please refer to the [MMEngine optimizer wrapper documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md). + +### Optimizer Wrapper Constructor + +The default optimizer wrapper constructor [`DefaultOptimWrapperConstructor`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19) builds the optimizer used in training based on the input `optim_wrapper` and `paramwise_cfg` defined in the `optim_wrapper`. When the functionality of [`DefaultOptimWrapperConstructor`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19) does not meet the requirements, you can customize the optimizer wrapper constructor to implement the configuration of hyperparameters. + +MMSegmentation has implemented the [`LearningRateDecayOptimizerConstructor`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/engine/optimizers/layer_decay_optimizer_constructor.py#L104), which can decay the learning rate of model parameters in the backbone networks of ConvNeXt, BEiT, and MAE models during training according to the defined decay ratio (`decay_rate`). The configuration in the configuration file is as follows: + +```python +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') +``` + +The purpose of `_delete_=True` is to ignore the inherited configuration in the OpenMMLab Config. In this code snippet, the inherited `optim_wrapper` configuration is ignored. For more information on `_delete_` fields, please refer to the [MMEngine documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/config.md#delete-key-in-dict). diff --git a/mmsegmentation/docs/en/advanced_guides/evaluation.md b/mmsegmentation/docs/en/advanced_guides/evaluation.md new file mode 100644 index 0000000..ca0beee --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/evaluation.md @@ -0,0 +1,155 @@ +# Evaluation + +The evaluation procedure would be executed at [ValLoop](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L300) and [TestLoop](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L373), users can evaluate model performance during training or using the test script with simple settings in the configuration file. The `ValLoop` and `TestLoop` are properties of [Runner](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py#L59), they will be built the first time they are called. To build the `ValLoop` successfully, the `val_dataloader` and `val_evaluator` must be set when building `Runner` since `dataloader` and `evaluator` are required parameters, and the same goes for `TestLoop`. For more information about the Runner's design, please refer to the [documentation](https://github.com/open-mmlab/mmengine/blob/main/docs/en/design/runner.md) of [MMEngine](https://github.com/open-mmlab/mmengine). + +![test_step/val_step dataflow](https://user-images.githubusercontent.com/15952744/228828179-3269baa3-bebd-4c9a-9787-59e7d785fbcf.png) + +In MMSegmentation, we write the settings of dataloader and metrics in the config files of datasets and the configuration of the evaluation loop in the `schedule_x` config files by default. + +For example, in the ADE20K config file `configs/_base_/dataset/ade20k.py`, on lines 37 to 48, we configured the `val_dataloader`, on line 51, we select `IoUMetric` as the evaluator and set `mIoU` as the metric: + +```python +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +``` + +To be able to evaluate the model during training, for example, we add the evaluation configuration to the file `configs/schedules/schedule_40k.py` on lines 15 to 16: + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000) +val_cfg = dict(type='ValLoop') +``` + +With the above two settings, MMSegmentation evaluates the **mIoU** metric of the model once every 4000 iterations during the training of 40K iterations. + +If we would like to test the model after training, we need to add the `test_dataloader`, `test_evaluator` and `test_cfg` configs to the config file. + +```python +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) + +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_cfg = dict(type='TestLoop') +``` + +In MMSegmentation, the settings of `test_dataloader` and `test_evaluator` are the same as the `ValLoop`'s dataloader and evaluator by default, we can modify these settings to meet our needs. + +## IoUMetric + +MMSegmentation implements [IoUMetric](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/evaluation/metrics/iou_metric.py) and [CityscapesMetric](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/evaluation/metrics/citys_metric.py) for evaluating the performance of models, based on the [BaseMetric](https://github.com/open-mmlab/mmengine/blob/main/mmengine/evaluator/metric.py) provided by [MMEngine](https://github.com/open-mmlab/mmengine). Please refer to [the documentation](https://mmengine.readthedocs.io/en/latest/tutorials/evaluation.html) for more details about the unified evaluation interface. + +Here we briefly describe the arguments and the two main methods of `IoUMetric`. + +The constructor of `IoUMetric` has some additional parameters besides the base `collect_device` and `prefix`. + +The arguments of the constructor: + +- ignore_index (int) - Index that will be ignored in evaluation. Default: 255. +- iou_metrics (list\[str\] | str) - Metrics to be calculated, the options includes 'mIoU', 'mDice' and 'mFscore'. +- nan_to_num (int, optional) - If specified, NaN values will be replaced by the numbers defined by the user. Default: None. +- beta (int) - Determines the weight of recall in the combined score. Default: 1. +- collect_device (str) - Device name used for collecting results from different ranks during distributed training. Must be 'cpu' or 'gpu'. Defaults to 'cpu'. +- prefix (str, optional) - The prefix that will be added in the metric names to disambiguate homonymous metrics of different evaluators. If the prefix is not provided in the argument, self.default_prefix will be used instead. Defaults to None. + +`IoUMetric` implements the IoU metric calculation, the core two methods of `IoUMetric` are `process` and `compute_metrics`. + +- `process` method processes one batch of data and data_samples. +- `compute_metrics` method computes the metrics from processed results. + +### IoUMetric.process + +Parameters: + +- data_batch (Any) - A batch of data from the dataloader. +- data_samples (Sequence\[dict\]) - A batch of outputs from the model. + +Returns: + +This method doesn't have returns since the processed results would be stored in `self.results`, which will be used to compute the metrics when all batches have been processed. + +### IoUMetric.compute_metrics + +Parameters: + +- results (list) - The processed results of each batch. + +Returns: + +- Dict\[str, float\] - The computed metrics. The keys are the names of the metrics, and the values are corresponding results. The key mainly includes **aAcc**, **mIoU**, **mAcc**, **mDice**, **mFscore**, **mPrecision**, **mRecall**. + +## CityscapesMetric + +`CityscapesMetric` uses the official [CityscapesScripts](https://github.com/mcordts/cityscapesScripts) provided by Cityscapes to evaluate model performance. + +### Usage + +Before using it, please install the `cityscapesscripts` package first: + +```shell +pip install cityscapesscripts +``` + +Since the `IoUMetric` is used as the default evaluator in MMSegmentation, if you would like to use `CityscapesMetric`, customizing the config file is required. In your customized config file, you should overwrite the default evaluator as follows. + +```python +val_evaluator = dict(type='CityscapesMetric', output_dir='tmp') +test_evaluator = val_evaluator +``` + +### Interface + +The arguments of the constructor: + +- output_dir (str) - The directory for output prediction +- ignore_index (int) - Index that will be ignored in evaluation. Default: 255. +- format_only (bool) - Only format result for results commit without perform evaluation. It is useful when you want to format the result to a specific format and submit it to the test server. Defaults to False. +- keep_results (bool) - Whether to keep the results. When `format_only` is True, `keep_results` must be True. Defaults to False. +- collect_device (str) - Device name used for collecting results from different ranks during distributed training. Must be 'cpu' or 'gpu'. Defaults to 'cpu'. +- prefix (str, optional) - The prefix that will be added in the metric names to disambiguate homonymous metrics of different evaluators. If prefix is not provided in the argument, self.default_prefix will be used instead. Defaults to None. + +#### CityscapesMetric.process + +This method would draw the masks on images and save the painted images to `work_dir`. + +Parameters: + +- data_batch (dict) - A batch of data from the dataloader. +- data_samples (Sequence\[dict\]) - A batch of outputs from the model. + +Returns: + +This method doesn't have returns, the annotations' path would be stored in `self.results`, which will be used to compute the metrics when all batches have been processed. + +#### CityscapesMetric.compute_metrics + +This method would call `cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling` tool to calculate metrics. + +Parameters: + +- results (list) - Testing results of the dataset. + +Returns: + +- dict\[str: float\] - Cityscapes evaluation results. diff --git a/mmsegmentation/docs/en/advanced_guides/index.rst b/mmsegmentation/docs/en/advanced_guides/index.rst new file mode 100644 index 0000000..53ef8c5 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/index.rst @@ -0,0 +1,26 @@ +Basic Concepts +*************** + +.. toctree:: + :maxdepth: 1 + + data_flow.md + structures.md + models.md + datasets.md + transforms.md + evaluation.md + engine.md + training_tricks.md + +Component Customization +************************ + +.. toctree:: + :maxdepth: 1 + + add_models.md + add_datasets.md + add_transforms.md + add_metrics.md + customize_runtime.md diff --git a/mmsegmentation/docs/en/advanced_guides/models.md b/mmsegmentation/docs/en/advanced_guides/models.md new file mode 100644 index 0000000..b008986 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/models.md @@ -0,0 +1,164 @@ +# Models + +We usually define a neural network in a deep learning task as a model, and this model is the core of an algorithm. [MMEngine](https://github.com/open-mmlab/mmengine) abstracts a unified model [BaseModel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/base_model/base_model.py#L16) to standardize the interfaces for training, testing and other processes. All models implemented by MMSegmentation inherit from `BaseModel`, and in MMSegmentation we implemented forward and added some functions for the semantic segmentation algorithm. + +## Common components + +### Segmentor + +In MMSegmentation, we abstract the network architecture as a **Segmentor**, it is a model that contains all components of a network. We have already implemented **EncoderDecoder** and **CascadeEncoderDecoder**, which typically consist of **Data preprocessor**, **Backbone**, **Decode head** and **Auxiliary head**. + +### Data preprocessor + +**Data preprocessor** is the part that copies data to the target device and preprocesses the data into the model input format. + +### Backbone + +**Backbone** is the part that transforms an image to feature maps, such as a **ResNet-50** without the last fully connected layer. + +### Neck + +**Neck** is the part that connects the backbone and heads. It performs some refinements or reconfigurations on the raw feature maps produced by the backbone. An example is **Feature Pyramid Network (FPN)**. + +### Decode head + +**Decode head** is the part that transforms the feature maps into a segmentation mask, such as **PSPNet**. + +### Auxiliary head + +**Auxiliary head** is an optional component that transforms the feature maps into segmentation masks which only used for computing auxiliary losses. + +## Basic interfaces + +MMSegmentation wraps `BaseModel` and implements the [BaseSegmentor](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/segmentors/base.py#L15) class, which mainly provides the interfaces `forward`, `train_step`, `val_step` and `test_step`. The following will introduce these interfaces in detail. + +### forward + +![EncoderDecoder dataflow](https://user-images.githubusercontent.com/15952744/228827860-c0e34875-d370-4736-84f0-9560c26c9576.png) +![CascadeEncoderDecoder dataflow](https://user-images.githubusercontent.com/15952744/228827987-aa214507-0c6d-4a08-8ce4-679b2b200b79.png) + +The `forward` method returns losses or predictions of training, validation, testing, and a simple inference process. + +The method should accept three modes: "tensor", "predict" and "loss": + +- "tensor": Forward the whole network and return the tensor or tuple of tensor without any post-processing, same as a common `nn.Module`. +- "predict": Forward and return the predictions, which are fully processed to a list of `SegDataSample`. +- "loss": Forward and return a `dict` of losses according to the given inputs and data samples. + +**Note:** [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) is a data structure interface of MMSegmentation, it is used as an interface between different components. `SegDataSample` implements the abstract data element `mmengine.structures.BaseDataElement`, please refer to [the SegDataSample documentation](https://mmsegmentation.readthedocs.io/en/1.x/advanced_guides/structures.html) and [data element documentation](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for more information. + +Note that this method doesn't handle either backpropagation or optimizer updating, which are done in the method `train_step`. + +Parameters: + +- inputs (torch.Tensor) - The input tensor with shape (N, C, ...) in general. +- data_sample (list\[[SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py)\]) - The seg data samples. It usually includes information such as `metainfo` and `gt_sem_seg`. Default to None. +- mode (str) - Return what kind of value. Defaults to 'tensor'. + +Returns: + +- `dict` or `list`: + - If `mode == "loss"`, return a `dict` of loss tensor used for backward and logging. + - If `mode == "predict"`, return a `list` of `SegDataSample`, the inference results will be incrementally added to the `data_sample` parameter passed to the forward method, each `SegDataSample` contains the following keys: + - pred_sem_seg (`PixelData`): Prediction of semantic segmentation. + - seg_logits (`PixelData`): Predicted logits of semantic segmentation before normalization. + - If `mode == "tensor"`, return a `tensor` or `tuple of tensor` or `dict` of `tensor` for custom use. + +### prediction modes + +We briefly describe the fields of the model's configuration in [the config documentation](../user_guides/1_config.md), here we elaborate on the `model.test_cfg` field. `model.test_cfg` is used to control forward behavior, the `forward` method in `"predict"` mode can run in two modes: + +- `whole_inference`: If `cfg.model.test_cfg.mode == 'whole'`, model will inference with full images. + + An `whole_inference` mode example config: + + ```python + model = dict( + type='EncoderDecoder' + ... + test_cfg=dict(mode='whole') + ) + ``` + +- `slide_inference`: If `cfg.model.test_cfg.mode == 'slide'`, model will inference by sliding-window. **Note:** if you select the `slide` mode, `cfg.model.test_cfg.stride` and `cfg.model.test_cfg.crop_size` should also be specified. + + An `slide_inference` mode example config: + + ```python + model = dict( + type='EncoderDecoder' + ... + test_cfg=dict(mode='slide', crop_size=256, stride=170) + ) + ``` + +### train_step + +The `train_step` method calls the forward interface of the `loss` mode to get the loss `dict`. The `BaseModel` class implements the default model training process including preprocessing, model forward propagation, loss calculation, optimization, and back-propagation. + +Parameters: + +- data (dict or tuple or list) - Data sampled from the dataset. In MMSegmentation, the data dict contains `inputs` and `data_samples` two fields. +- optim_wrapper (OptimWrapper) - OptimWrapper instance used to update model parameters. + +**Note:** [OptimWrapper](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/optimizer_wrapper.py#L17) provides a common interface for updating parameters, please refer to optimizer wrapper [documentation](https://mmengine.readthedocs.io/en/latest/tutorials/optim_wrapper.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for more information. + +Returns: + +- Dict\[str, `torch.Tensor`\]: A `dict` of tensor for logging. + +![train_step dataflow](https://user-images.githubusercontent.com/15952744/228828089-a9ae1225-958d-4cf7-99af-9af8576f7ef7.png) + +### val_step + +The `val_step` method calls the forward interface of the `predict` mode and returns the prediction result, which is further passed to the process interface of the evaluator and the `after_val_iter` interface of the Hook. + +Parameters: + +- data (`dict` or `tuple` or `list`) - Data sampled from the dataset. In MMSegmentation, the data dict contains `inputs` and `data_samples` two fields. + +Returns: + +- `list` - The predictions of given data. + +![test_step/val_step dataflow](https://user-images.githubusercontent.com/15952744/228828179-3269baa3-bebd-4c9a-9787-59e7d785fbcf.png) + +### test_step + +The `BaseModel` implements `test_step` the same as `val_step`. + +## Data Preprocessor + +The [SegDataPreProcessor](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/data_preprocessor.py#L13) implemented by MMSegmentation inherits from the [BaseDataPreprocessor](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/base_model/data_preprocessor.py#L18) implemented by [MMEngine](https://github.com/open-mmlab/mmengine) and provides the functions of data preprocessing and copying data to the target device. + +The runner carries the model to the specified device during the construction stage, while the data is carried to the specified device by the [SegDataPreProcessor](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/data_preprocessor.py#L13) in `train_step`, `val_step`, and `test_step`, and the processed data is further passed to the model. + +The parameters of the `SegDataPreProcessor` constructor: + +- mean (Sequence\[Number\], optional) - The pixel mean of R, G, B channels. Defaults to None. +- std (Sequence\[Number\], optional) - The pixel standard deviation of R, G, B channels. Defaults to None. +- size (tuple, optional) - Fixed padding size. +- size_divisor (int, optional) - The divisor of padded size. +- pad_val (float, optional) - Padding value. Default: 0. +- seg_pad_val (float, optional) - Padding value of segmentation map. Default: 255. +- bgr_to_rgb (bool) - whether to convert image from BGR to RGB. Defaults to False. +- rgb_to_bgr (bool) - whether to convert image from RGB to BGR. Defaults to False. +- batch_augments (list\[dict\], optional) - Batch-level augmentations. Default to None. + +The data will be processed as follows: + +- Collate and move data to the target device. +- Pad inputs to the input size with defined `pad_val`, and pad seg map with defined `seg_pad_val`. +- Stack inputs to batch_inputs. +- Convert inputs from bgr to rgb if the shape of input is (3, H, W). +- Normalize image with defined std and mean. +- Do batch augmentations like Mixup and Cutmix during training. + +The parameters of the `forward` method: + +- data (dict) - data sampled from dataloader. +- training (bool) - Whether to enable training time augmentation. + +The returns of the `forward` method: + +- Dict: Data in the same format as the model input. diff --git a/mmsegmentation/docs/en/advanced_guides/structures.md b/mmsegmentation/docs/en/advanced_guides/structures.md new file mode 100644 index 0000000..2607242 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/structures.md @@ -0,0 +1,104 @@ +# Structures + +To unify input and output interfaces between different models and modules, OpenMMLab 2.0 MMEngine defines an abstract data structure, +it has implemented basic functions of `Create`, `Read`, `Update`, `Delete`, supported data transferring among different types of devices +and tensor-like or dictionary-like operations such as `.cpu()`, `.cuda()`, `.get()` and `.detach()`. +More details can be found [here](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/data_element.md). + +MMSegmentation also follows this interface protocol and defines `SegDataSample` which is used to encapsulate the data of semantic segmentation task. + +## Semantic Segmentation Data SegDataSample + +[SegDataSample](mmseg.structures.SegDataSample) includes three main fields `gt_sem_seg`, `pred_sem_seg` and `seg_logits`, which are used to store the annotation information and prediction results respectively. + +| Field | Type | Description | +| -------------- | ------------------------- | ------------------------------------------ | +| gt_sem_seg | [`PixelData`](#pixeldata) | Annotation information. | +| pred_instances | [`PixelData`](#pixeldata) | The predicted result. | +| seg_logits | [`PixelData`](#pixeldata) | The raw (non-normalized) predicted result. | + +The following sample code demonstrates the use of `SegDataSample`. + +```python +import torch +from mmengine.structures import PixelData +from mmseg.structures import SegDataSample + +img_meta = dict(img_shape=(4, 4, 3), + pad_shape=(4, 4, 3)) +data_sample = SegDataSample() +# defining gt_segmentations for encapsulate the ground truth data +gt_segmentations = PixelData(metainfo=img_meta) +gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) + +# add and process property in SegDataSample +data_sample.gt_sem_seg = gt_segmentations +assert 'gt_sem_seg' in data_sample +assert 'sem_seg' in data_sample.gt_sem_seg +assert 'img_shape' in data_sample.gt_sem_seg.metainfo_keys() +print(data_sample.gt_sem_seg.shape) +''' +(4, 4) +''' +print(data_sample) +''' + +) at 0x1c2aae44d60> +''' + +# delete and change property in SegDataSample +data_sample = SegDataSample() +gt_segmentations = PixelData(metainfo=img_meta) +gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) +data_sample.gt_sem_seg = gt_segmentations +data_sample.gt_sem_seg.set_metainfo(dict(img_shape=(4,4,9), pad_shape=(4,4,9))) +del data_sample.gt_sem_seg.img_shape + +# Tensor-like operations +data_sample = SegDataSample() +gt_segmentations = PixelData(metainfo=img_meta) +gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) +cuda_gt_segmentations = gt_segmentations.cuda() +cuda_gt_segmentations = gt_segmentations.to('cuda:0') +cpu_gt_segmentations = cuda_gt_segmentations.cpu() +cpu_gt_segmentations = cuda_gt_segmentations.to('cpu') +``` + +## Customize New Property in SegDataSample + +If you want to customize new property in `SegDataSample`, you may follow [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) below: + +```python +class SegDataSample(BaseDataElement): + ... + + @property + def xxx_property(self) -> xxxData: + return self._xxx_property + + @xxx_property.setter + def xxx_property(self, value: xxxData) -> None: + self.set_field(value, '_xxx_property', dtype=xxxData) + + @xxx_property.deleter + def xxx_property(self) -> None: + del self._xxx_property +``` + +Then a new property would be added to `SegDataSample`. diff --git a/mmsegmentation/docs/en/advanced_guides/training_tricks.md b/mmsegmentation/docs/en/advanced_guides/training_tricks.md new file mode 100644 index 0000000..bc4f722 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/training_tricks.md @@ -0,0 +1,75 @@ +# Training Tricks + +MMSegmentation support following training tricks out of box. + +## Different Learning Rate(LR) for Backbone and Heads + +In semantic segmentation, some methods make the LR of heads larger than backbone to achieve better performance or faster convergence. + +In MMSegmentation, you may add following lines to config to make the LR of heads 10 times of backbone. + +```python +optim_wrapper=dict( + paramwise_cfg = dict( + custom_keys={ + 'head': dict(lr_mult=10.)})) +``` + +With this modification, the LR of any parameter group with `'head'` in name will be multiplied by 10. +You may refer to [MMEngine documentation](https://mmengine.readthedocs.io/en/latest/tutorials/optim_wrapper.html#advanced-usages) for further details. + +## Online Hard Example Mining (OHEM) + +We implement pixel sampler for training sampling, like OHEM (Online Hard Example Mining), +which is used for remove the "easy" examples for model training. +Here is an example config of training PSPNet with OHEM enabled. + +```python +_base_ = './pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model=dict( + decode_head=dict( + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=100000)) ) +``` + +In this way, only pixels with confidence score under 0.7 are used to train. And we keep at least 100000 pixels during training. If `thresh` is not specified, pixels of top `min_kept` loss will be selected. + +## Class Balanced Loss + +For dataset that is not balanced in classes distribution, you may change the loss weight of each class. +Here is an example for cityscapes dataset. + +```python +_base_ = './pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +model=dict( + decode_head=dict( + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0, + # DeepLab used this class weight for cityscapes + class_weight=[0.8373, 0.9180, 0.8660, 1.0345, 1.0166, 0.9969, 0.9754, + 1.0489, 0.8786, 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, + 1.0865, 1.0955, 1.0865, 1.1529, 1.0507]))) +``` + +`class_weight` will be passed into `CrossEntropyLoss` as `weight` argument. Please refer to [PyTorch Doc](https://pytorch.org/docs/stable/nn.html?highlight=crossentropy#torch.nn.CrossEntropyLoss) for details. + +## Multiple Losses + +For loss calculation, we support multiple losses training concurrently. Here is an example config of training `unet` on `DRIVE` dataset, whose loss function is `1:3` weighted sum of `CrossEntropyLoss` and `DiceLoss`: + +```python +_base_ = './fcn_unet_s5-d16_64x64_40k_drive.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ]), + auxiliary_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ]), +) +``` + +In this way, `loss_weight` and `loss_name` will be weight and name in training log of corresponding loss, respectively. + +Note: If you want this loss item to be included into the backward graph, `loss_` must be the prefix of the name. diff --git a/mmsegmentation/docs/en/advanced_guides/transforms.md b/mmsegmentation/docs/en/advanced_guides/transforms.md new file mode 100644 index 0000000..68b1f44 --- /dev/null +++ b/mmsegmentation/docs/en/advanced_guides/transforms.md @@ -0,0 +1,119 @@ +# Data Transforms + +In this tutorial, we introduce the design of transforms pipeline in MMSegmentation. + +The structure of this guide is as follows: + +- [Data Transforms](#data-transforms) + - [Design of Data pipelines](#design-of-data-pipelines) + - [Data loading](#data-loading) + - [Pre-processing](#pre-processing) + - [Formatting](#formatting) + +## Design of Data pipelines + +Following typical conventions, we use `Dataset` and `DataLoader` for data loading with multiple workers. `Dataset` returns a dict of data items corresponding the arguments of models' forward method. Since the data in semantic segmentation may not be the same size, we introduce a new `DataContainer` type in MMCV to help collect and distribute data of different size. See [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py) for more details. + +In 1.x version of MMSegmentation, all data transformations are inherited from [`BaseTransform`](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/transforms/base.py#L6). + +The input and output types of transformations are both dict. A simple example is as follows: + +```python +>>> from mmseg.datasets.transforms import LoadAnnotations +>>> transforms = LoadAnnotations() +>>> img_path = './data/cityscapes/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png.png' +>>> gt_path = './data/cityscapes/gtFine/train/aachen/aachen_000015_000019_gtFine_instanceTrainIds.png' +>>> results = dict( +>>> img_path=img_path, +>>> seg_map_path=gt_path, +>>> reduce_zero_label=False, +>>> seg_fields=[]) +>>> data_dict = transforms(results) +>>> print(data_dict.keys()) +dict_keys(['img_path', 'seg_map_path', 'reduce_zero_label', 'seg_fields', 'gt_seg_map']) +``` + +The data preparation pipeline and the dataset are decomposed. Usually a dataset defines how to process the annotations and a data pipeline defines all the steps to prepare a data dict. A pipeline consists of a sequence of operations. Each operation takes a dict as input and also outputs a dict for the next transform. + +The operations are categorized into data loading, pre-processing, formatting and test-time augmentation. + +Here is a pipeline example for PSPNet: + +```python +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +``` + +For each operation, we list the related dict fields that are `added`/`updated`/`removed`. Before pipelines, the information we can directly obtain from the datasets are `img_path` and `seg_map_path`. + +### Data loading + +`LoadImageFromFile`: Load an image from file. + +- add: `img`, `img_shape`, `ori_shape` + +`LoadAnnotations`: Load semantic segmentation maps provided by dataset. + +- add: `seg_fields`, `gt_seg_map` + +### Pre-processing + +`RandomResize`: Random resize image & segmentation map. + +- add: `scale`, `scale_factor`, `keep_ratio` +- update: `img`, `img_shape`, `gt_seg_map` + +`Resize`: Resize image & segmentation map. + +- add: `scale`, `scale_factor`, `keep_ratio` +- update: `img`, `gt_seg_map`, `img_shape` + +`RandomCrop`: Random crop image & segmentation map. + +- update: `img`, `gt_seg_map`, `img_shape` + +`RandomFlip`: Flip the image & segmentation map. + +- add: `flip`, `flip_direction` +- update: `img`, `gt_seg_map` + +`PhotoMetricDistortion`: Apply photometric distortion to image sequentially, every transformation is applied with a probability of 0.5. The position of random contrast is in second or second to last(mode 0 or 1 below, respectively). + +``` +1. random brightness +2. random contrast (mode 0) +3. convert color from BGR to HSV +4. random saturation +5. random hue +6. convert color from HSV to BGR +7. random contrast (mode 1) +``` + +- update: `img` + +### Formatting + +`PackSegInputs`: Pack the inputs data for the semantic segmentation. + +- add: `inputs`, `data_sample` +- remove: keys specified by `meta_keys` (merged into the metainfo of data_sample), all other keys diff --git a/mmsegmentation/docs/en/api.rst b/mmsegmentation/docs/en/api.rst new file mode 100644 index 0000000..2f1a25e --- /dev/null +++ b/mmsegmentation/docs/en/api.rst @@ -0,0 +1,95 @@ +mmseg.apis +-------------- +.. automodule:: mmseg.apis + :members: + +mmseg.datasets +-------------- + +datasets +^^^^^^^^^^ +.. automodule:: mmseg.datasets + :members: + +transforms +^^^^^^^^^^^^ +.. automodule:: mmseg.datasets.transforms + :members: + +mmseg.engine +-------------- + +hooks +^^^^^^^^^^ +.. automodule:: mmseg.engine.hooks + :members: + +optimizers +^^^^^^^^^^^^^^^ +.. automodule:: mmseg.engine.optimizers + :members: + +mmseg.evaluation +----------------- + +metrics +^^^^^^^^^^ +.. automodule:: mmseg.evaluation.metrics + :members: + +mmseg.models +-------------- + +backbones +^^^^^^^^^^^^^^^^^^ +.. automodule:: mmseg.models.backbones + :members: + +decode_heads +^^^^^^^^^^^^^^^ +.. automodule:: mmseg.models.decode_heads + :members: + +segmentors +^^^^^^^^^^ +.. automodule:: mmseg.models.segmentors + :members: + +losses +^^^^^^^^^^ +.. automodule:: mmseg.models.losses + :members: + +necks +^^^^^^^^^^^^ +.. automodule:: mmseg.models.necks + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmseg.models.utils + :members: + + +mmseg.structures +-------------------- + +structures +^^^^^^^^^^^^^^^^^ +.. automodule:: mmseg.structures + :members: + +sampler +^^^^^^^^^^ +.. automodule:: mmseg.structures.sampler + :members: + +mmseg.visualization +-------------------- +.. automodule:: mmseg.visualization + :members: + +mmseg.utils +-------------- +.. automodule:: mmseg.utils + :members: diff --git a/mmsegmentation/docs/en/conf.py b/mmsegmentation/docs/en/conf.py new file mode 100644 index 0000000..e20aab1 --- /dev/null +++ b/mmsegmentation/docs/en/conf.py @@ -0,0 +1,133 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +import pytorch_sphinx_theme + +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'MMSegmentation' +copyright = '2020-2021, OpenMMLab' +author = 'MMSegmentation Authors' +version_file = '../../mmseg/version.py' + + +def get_version(): + with open(version_file) as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +# The full version, including alpha/beta/rc tags +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', + 'sphinx_markdown_tables', 'sphinx_copybutton', 'myst_parser' +] + +autodoc_mock_imports = [ + 'matplotlib', 'pycocotools', 'mmseg.version', 'mmcv.ops' +] + +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'sphinx_rtd_theme' +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] +html_theme_options = { + 'logo_url': + 'https://mmsegmentation.readthedocs.io/en/latest/', + 'menu': [ + { + 'name': + 'Tutorial', + 'url': + 'https://github.com/open-mmlab/mmsegmentation/blob/master/' + 'demo/MMSegmentation_Tutorial.ipynb' + }, + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmsegmentation' + }, + { + 'name': + 'Upstream', + 'children': [ + { + 'name': 'MMCV', + 'url': 'https://github.com/open-mmlab/mmcv', + 'description': 'Foundational library for computer vision' + }, + ] + }, + ], + # Specify the language of shared menu + 'menu_lang': + 'en' +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['css/readthedocs.css'] + +# Enable ::: for my_st +myst_enable_extensions = ['colon_fence'] + +language = 'en' + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/mmsegmentation/docs/en/device/npu.md b/mmsegmentation/docs/en/device/npu.md new file mode 100644 index 0000000..a90d6ac --- /dev/null +++ b/mmsegmentation/docs/en/device/npu.md @@ -0,0 +1,39 @@ +# NPU (HUAWEI Ascend) + +## Usage + +Please refer to the [building documentation of MMCV](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) to install MMCV on NPU devices + +Here we use 4 NPUs on your computer to train the model with the following command: + +```shell +bash tools/dist_train.sh configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py 4 +``` + +Also, you can use only one NPU to train the model with the following command: + +```shell +python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py +``` + +## Models Results + +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :----------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| [apcnet](<>) | 78.02 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | +| [bisenetv1](<>) | 76.04 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | +| [bisenetv2](<>) | 72.44 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | + +**Notes:** + +- If not specially marked, the results on NPU with amp are the basically same as those on the GPU with FP32. + +**All above models are provided by Huawei Ascend group.** diff --git a/mmsegmentation/docs/en/get_started.md b/mmsegmentation/docs/en/get_started.md new file mode 100644 index 0000000..3f957eb --- /dev/null +++ b/mmsegmentation/docs/en/get_started.md @@ -0,0 +1,211 @@ +# Get started: Install and Run MMSeg + +## Prerequisites + +In this section we demonstrate how to prepare an environment with PyTorch. + +MMSegmentation works on Linux, Windows and macOS. It requires Python 3.7+, CUDA 10.2+ and PyTorch 1.8+. + +**Note:** +If you are experienced with PyTorch and have already installed it, just skip this part and jump to the [next section](##installation). Otherwise, you can follow these steps for the preparation. + +**Step 0.** Download and install Miniconda from the [official website](https://docs.conda.io/en/latest/miniconda.html). + +**Step 1.** Create a conda environment and activate it. + +```shell +conda create --name openmmlab python=3.8 -y +conda activate openmmlab +``` + +**Step 2.** Install PyTorch following [official instructions](https://pytorch.org/get-started/locally/), e.g. + +On GPU platforms: + +```shell +conda install pytorch torchvision -c pytorch +``` + +On CPU platforms: + +```shell +conda install pytorch torchvision cpuonly -c pytorch +``` + +## Installation + +We recommend that users follow our best practices to install MMSegmentation. However, the whole process is highly customizable. See [Customize Installation](#customize-installation) section for more information. + +### Best Practices + +**Step 0.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +pip install -U openmim +mim install mmengine +mim install "mmcv>=2.0.0" +``` + +**Step 1.** Install MMSegmentation. + +Case a: If you develop and run mmseg directly, install it from source: + +```shell +git clone -b main https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -v -e . +# '-v' means verbose, or more output +# '-e' means installing a project in editable mode, +# thus any local modifications made to the code will take effect without reinstallation. +``` + +Case b: If you use mmsegmentation as a dependency or third-party package, install it with pip: + +```shell +pip install "mmsegmentation>=1.0.0" +``` + +### Verify the installation + +To verify whether MMSegmentation is installed correctly, we provide some sample codes to run an inference demo. + +**Step 1.** We need to download config and checkpoint files. + +```shell +mim download mmsegmentation --config pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 --dest . +``` + +The downloading will take several seconds or more, depending on your network environment. When it is done, you will find two files `pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py` and `pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth` in your current folder. + +**Step 2.** Verify the inference demo. + +Option (a). If you install mmsegmentation from source, just run the following command. + +```shell +python demo/image_demo.py demo/demo.png configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --out-file result.jpg +``` + +You will see a new image `result.jpg` on your current folder, where segmentation masks are covered on all objects. + +Option (b). If you install mmsegmentation with pip, open you python interpreter and copy&paste the following codes. + +```python +from mmseg.apis import inference_model, init_model, show_result_pyplot +import mmcv + +config_file = 'pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_file = 'pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' + +# build the model from a config file and a checkpoint file +model = init_model(config_file, checkpoint_file, device='cuda:0') + +# test a single image and show the results +img = 'demo/demo.png' # or img = mmcv.imread(img), which will only load it once +result = inference_model(model, img) +# visualize the results in a new window +show_result_pyplot(model, img, result, show=True) +# or save the visualization results to image files +# you can change the opacity of the painted segmentation map in (0, 1]. +show_result_pyplot(model, img, result, show=True, out_file='result.jpg', opacity=0.5) +# test a video and show the results +video = mmcv.VideoReader('video.mp4') +for frame in video: + result = inference_model(model, frame) + show_result_pyplot(model, frame, result, wait_time=1) +``` + +You can modify the code above to test a single image or a video, both of these options can verify that the installation was successful. + +### Customize Installation + +#### CUDA versions + +When installing PyTorch, you need to specify the version of CUDA. If you are not clear on which to choose, follow our recommendations: + +- For Ampere-based NVIDIA GPUs, such as GeForce 30 series and NVIDIA A100, CUDA 11 is a must. +- For older NVIDIA GPUs, CUDA 11 is backward compatible, but CUDA 10.2 offers better compatibility and is more lightweight. + +Please make sure the GPU driver satisfies the minimum version requirements. See [this table](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions) for more information. + +**Note:** +Installing CUDA runtime libraries is enough if you follow our best practices, because no CUDA code will be compiled locally. However if you hope to compile MMCV from source or develop other CUDA operators, you need to install the complete CUDA toolkit from NVIDIA's [website](https://developer.nvidia.com/cuda-downloads), and its version should match the CUDA version of PyTorch. i.e., the specified version of cudatoolkit in `conda install` command. + +#### Install MMCV without MIM + +MMCV contains C++ and CUDA extensions, thus depending on PyTorch in a complex way. MIM solves such dependencies automatically and makes the installation easier. However, it is not a must. + +To install MMCV with pip instead of MIM, please follow [MMCV installation guides](https://mmcv.readthedocs.io/en/latest/get_started/installation.html). This requires manually specifying a find-url based on PyTorch version and its CUDA version. + +For example, the following command install mmcv==2.0.0 built for PyTorch 1.10.x and CUDA 11.3. + +```shell +pip install mmcv==2.0.0 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10/index.html +``` + +#### Install on CPU-only platforms + +MMSegmentation can be built for CPU only environment. In CPU mode you can train (requires MMCV version >= 2.0.0), test or inference a model. + +#### Install on Google Colab + +[Google Colab](https://research.google.com/) usually has PyTorch installed, +thus we only need to install MMCV and MMSegmentation with the following commands. + +**Step 1.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +!pip3 install openmim +!mim install mmengine +!mim install "mmcv>=2.0.0" +``` + +**Step 2.** Install MMSegmentation from the source. + +```shell +!git clone https://github.com/open-mmlab/mmsegmentation.git +%cd mmsegmentation +!git checkout main +!pip install -e . +``` + +**Step 3.** Verification. + +```python +import mmseg +print(mmseg.__version__) +# Example output: 1.0.0 +``` + +**Note:** +Within Jupyter, the exclamation mark `!` is used to call external executables and `%cd` is a [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd) to change the current working directory of Python. + +### Using MMSegmentation with Docker + +We provide a [Dockerfile](https://github.com/open-mmlab/mmsegmentation/blob/main/docker/Dockerfile) to build an image. Ensure that your [docker version](https://docs.docker.com/engine/install/) >=19.03. + +```shell +# build an image with PyTorch 1.11, CUDA 11.3 +# If you prefer other versions, just modified the Dockerfile +docker build -t mmsegmentation docker/ +``` + +Run it with + +```shell +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmsegmentation/data mmsegmentation +``` + +### Optional Dependencies + +#### Install GDAL + +[GDAL](https://gdal.org/) is a translator library for raster and vector geospatial data formats. Install GDAL to read complex formats and extremely large remote sensing images. + +```shell +conda install GDAL +``` + +## Trouble shooting + +If you have some issues during the installation, please first view the [FAQ](notes/faq.md) page. +You may [open an issue](https://github.com/open-mmlab/mmsegmentation/issues/new/choose) on GitHub if no solution is found. diff --git a/mmsegmentation/docs/en/index.rst b/mmsegmentation/docs/en/index.rst new file mode 100644 index 0000000..cdf8622 --- /dev/null +++ b/mmsegmentation/docs/en/index.rst @@ -0,0 +1,63 @@ +Welcome to MMSegmentation's documentation! +=========================================== + +.. toctree:: + :maxdepth: 1 + :caption: Get Started + + overview.md + get_started.md + +.. toctree:: + :maxdepth: 2 + :caption: User Guides + + user_guides/index.rst + +.. toctree:: + :maxdepth: 2 + :caption: Advanced Guides + + advanced_guides/index.rst + +.. toctree:: + :maxdepth: 1 + :caption: Migration + + migration/index.rst + +.. toctree:: + :caption: API Reference + + api.rst + +.. toctree:: + :maxdepth: 1 + :caption: Model Zoo + + model_zoo.md + modelzoo_statistics.md + +.. toctree:: + :maxdepth: 1 + :caption: Notes + + notes/changelog.md + notes/faq.md + +.. toctree:: + :caption: Device Support + + device/npu.md + +.. toctree:: + :caption: Switch Language + + switch_language.md + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/mmsegmentation/docs/en/make.bat b/mmsegmentation/docs/en/make.bat new file mode 100644 index 0000000..922152e --- /dev/null +++ b/mmsegmentation/docs/en/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/mmsegmentation/docs/en/migration/index.rst b/mmsegmentation/docs/en/migration/index.rst new file mode 100644 index 0000000..2843bdb --- /dev/null +++ b/mmsegmentation/docs/en/migration/index.rst @@ -0,0 +1,8 @@ +Migration +*************** + +.. toctree:: + :maxdepth: 1 + + interface.md + package.md diff --git a/mmsegmentation/docs/en/migration/interface.md b/mmsegmentation/docs/en/migration/interface.md new file mode 100644 index 0000000..b83eeb9 --- /dev/null +++ b/mmsegmentation/docs/en/migration/interface.md @@ -0,0 +1,525 @@ +# Migration from MMSegmentation 0.x + +## Introduction + +This guide describes the fundamental differences between MMSegmentation 0.x and MMSegmentation 1.x in terms of behaviors and the APIs, and how these all relate to your migration journey. + +## New dependencies + +MMSegmentation 1.x depends on some new packages, you can prepare a new clean environment and install again according to the [installation tutorial](../get_started.md). + +Or install the below packages manually. + +1. [MMEngine](https://github.com/open-mmlab/mmengine): MMEngine is the core the OpenMMLab 2.0 architecture, and we splited many compentents unrelated to computer vision from MMCV to MMEngine. + +2. [MMCV](https://github.com/open-mmlab/mmcv): The computer vision package of OpenMMLab. This is not a new dependency, but you need to upgrade it to **2.0.0** version or above. + +3. [MMClassification](https://github.com/open-mmlab/mmclassification)(Optional): The image classification toolbox and benchmark of OpenMMLab. This is not a new dependency, but you need to upgrade it to **1.0.0rc6** version. + +4. [MMDetection](https://github.com/open-mmlab/mmdetection)(Optional): The object detection toolbox and benchmark of OpenMMLab. This is not a new dependency, but you need to upgrade it to **3.0.0** version or above. + +## Train launch + +The main improvement of OpenMMLab 2.0 is releasing MMEngine which provides universal and powerful runner for unified interfaces to launch training jobs. + +Compared with MMSeg0.x, MMSeg1.x provides fewer command line arguments in `tools/train.py` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionOriginalNew
Loading pre-trained checkpoint--load_from=$CHECKPOINT--cfg-options load_from=$CHECKPOINT
Resuming Train from specific checkpoint--resume-from=$CHECKPOINT--resume=$CHECKPOINT
Resuming Train from the latest checkpoint--auto-resume--resume='auto'
Whether not to evaluate the checkpoint during training--no-validate--cfg-options val_cfg=None val_dataloader=None val_evaluator=None
Training device assignment--gpu-id=$DEVICE_ID-
Whether or not set different seeds for different ranks--diff-seed--cfg-options randomness.diff_rank_seed=True
Whether to set deterministic options for CUDNN backend--deterministic--cfg-options randomness.deterministic=True
+ +## Test launch + +Similar to training launch, there are only common arguments in tools/test.py of MMSegmentation 1.x. +Below is the difference in test scripts, +please refer to [this documentation](../user_guides/4_train_test.md) for more details about test launch. + + + + + + + + + + + + + + + + + + + + + + +
Function0.x1.x
Evaluation metrics--eval mIoU--cfg-options test_evaluator.type=IoUMetric
Whether to use test time augmentation--aug-test--tta
Whether save the output results without perform evaluation--format-only--cfg-options test_evaluator.format_only=True
+ +## Configuration file + +### Model settings + +No changes in `model.backbone`, `model.neck`, `model.decode_head` and `model.losses` fields. + +Add `model.data_preprocessor` field to configure the `DataPreProcessor`, including: + +- `mean` (Sequence, optional): The pixel mean of R, G, B channels. Defaults to None. + +- `std` (Sequence, optional): The pixel standard deviation of R, G, B channels. Defaults to None. + +- `size` (Sequence, optional): Fixed padding size. + +- `size_divisor` (int, optional): The divisor of padded size. + +- `seg_pad_val` (float, optional): Padding value of segmentation map. Default: 255. + +- `padding_mode` (str): Type of padding. Default: 'constant'. + + - constant: pads with a constant value, this value is specified with pad_val. + +- `bgr_to_rgb` (bool): whether to convert image from BGR to RGB.Defaults to False. + +- `rgb_to_bgr` (bool): whether to convert image from RGB to BGR. Defaults to False. + +**Note:** +Please refer [models documentation](../advanced_guides/models.md) for more details. + +### Dataset settings + +Changes in **data**: + +The original `data` field is split to `train_dataloader`, `val_dataloader` and `test_dataloader`. This allows us to configure them in fine-grained. For example, you can specify different sampler and batch size during training and test. +The `samples_per_gpu` is renamed to `batch_size`. +The `workers_per_gpu` is renamed to `num_workers`. + + + + + + + + + +
Original + +```python +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict(...), + val=dict(...), + test=dict(...), +) +``` + +
New + +```python +train_dataloader = dict( + batch_size=4, + num_workers=4, + dataset=dict(...), + sampler=dict(type='DefaultSampler', shuffle=True) # necessary +) + +val_dataloader = dict( + batch_size=4, + num_workers=4, + dataset=dict(...), + sampler=dict(type='DefaultSampler', shuffle=False) # necessary +) + +test_dataloader = val_dataloader +``` + +
+ +Changes in **pipeline** + +- The original formatting transforms **`ToTensor`**ใ€**`ImageToTensor`**ใ€**`Collect`** are combined as [`PackSegInputs`](mmseg.datasets.transforms.PackSegInputs) +- We don't recommend to do **`Normalize`** and **Pad** in the dataset pipeline. Please remove it from pipelines and set it in the `data_preprocessor` field. +- The original **`Resize`** in MMSeg 1.x has been changed to **`RandomResize`** and the input arguments `img_scale` is renamed to `scale`, and the default value of `keep_ratio` is modified to False. +- The original `test_pipeline` combines single-scale test and multi-scale test together, in MMSeg 1.x we separate it into `test_pipeline` and `tta_pipeline`. + +**Note:** +We move some work of data transforms to the data preprocessor, like normalization, see [the documentation](package.md) for more details. + +train_pipeline + + + + + + + + + +
Original + +```python +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='Resize', img_scale=(2560, 640), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +``` + +
New + +```python +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2560, 640), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +``` + +
+ +test_pipeline + + + + + + + + + +
Original + +```python +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2560, 640), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +``` + +
New + +```python +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2560, 640), keep_ratio=True), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +``` + +
+ +Changes in **`evaluation`**: + +- The **`evaluation`** field is split to `val_evaluator` and `test_evaluator`. And it won't support `interval` and `save_best` arguments. + The `interval` is moved to `train_cfg.val_interval`, and the `save_best` is moved to `default_hooks.checkpoint.save_best`. `pre_eval` has been removed. +- `'mIoU'` has been changed to `'IoUMetric'`. + + + + + + + + + +
Original + +```python +evaluation = dict(interval=2000, metric='mIoU', pre_eval=True) +``` + +
New + +```python +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator +``` + +
+ +### Optimizer and Schedule settings + +Changes in **`optimizer`** and **`optimizer_config`**: + +- Now we use `optim_wrapper` field to specify all configuration about the optimization process. And the `optimizer` is a sub field of `optim_wrapper` now. +- `paramwise_cfg` is also a sub field of `optim_wrapper`, instead of `optimizer`. +- `optimizer_config` is removed now, and all configurations of it are moved to `optim_wrapper`. +- `grad_clip` is renamed to `clip_grad`. + + + + + + + + + +
Original + +```python +optimizer = dict(type='AdamW', lr=0.0001, weight_decay=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=1, norm_type=2)) +``` + +
New + +```python +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0005), + clip_grad=dict(max_norm=1, norm_type=2)) +``` + +
+ +Changes in **`lr_config`**: + +- The `lr_config` field is removed and we use new `param_scheduler` to replace it. +- The `warmup` related arguments are removed, since we use schedulers combination to implement this functionality. + +The new schedulers combination mechanism is very flexible, and you can use it to design many kinds of learning rate / momentum curves. See [the tutorial](TODO) for more details. + + + + + + + + + +
Original + +```python +lr_config = dict( + policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-6, + power=1.0, + min_lr=0.0, + by_epoch=False) +``` + +
New + +```python +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] +``` + +
+ +Changes in **`runner`**: + +Most configuration in the original `runner` field is moved to `train_cfg`, `val_cfg` and `test_cfg`, which configure the loop in training, validation and test. + + + + + + + + + +
Original + +```python +runner = dict(type='IterBasedRunner', max_iters=20000) +``` + +
New + +```python +# The `val_interval` is the original `evaluation.interval`. +train_cfg = dict(type='IterBasedTrainLoop', max_iters=20000, val_interval=2000) +val_cfg = dict(type='ValLoop') # Use the default validation loop. +test_cfg = dict(type='TestLoop') # Use the default test loop. +``` + +
+ +In fact, in OpenMMLab 2.0, we introduced `Loop` to control the behaviors in training, validation and test. The functionalities of `Runner` are also changed. You can find more details of [runner tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/en/design/runner.md) in [MMEngine](https://github.com/open-mmlab/mmengine/). + +### Runtime settings + +Changes in **`checkpoint_config`** and **`log_config`**: + +The `checkpoint_config` are moved to `default_hooks.checkpoint` and the `log_config` are moved to `default_hooks.logger`. +And we move many hooks settings from the script code to the `default_hooks` field in the runtime configuration. + +```python +default_hooks = dict( + # record the time of every iterations. + timer=dict(type='IterTimerHook'), + + # print log every 50 iterations. + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + + # enable the parameter scheduler. + param_scheduler=dict(type='ParamSchedulerHook'), + + # save checkpoint every 2000 iterations. + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000), + + # set sampler seed in distributed environment. + sampler_seed=dict(type='DistSamplerSeedHook'), + + # validation results visualization. + visualization=dict(type='SegVisualizationHook')) +``` + +In addition, we split the original logger to logger and visualizer. The logger is used to record information and the visualizer is used to show the logger in different backends, like terminal and TensorBoard. + + + + + + + + + +
Original + +```python +log_config = dict( + interval=100, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook'), + ]) +``` + +
New + +```python +default_hooks = dict( + ... + logger=dict(type='LoggerHook', interval=100), +) +vis_backends = [dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +``` + +
+ +Changes in **`load_from`** and **`resume_from`**: + +- The `resume_from` is removed. And we use `resume` and `load_from` to replace it. + - If `resume=True` and `load_from` is **not None**, resume training from the checkpoint in `load_from`. + - If `resume=True` and `load_from` is **None**, try to resume from the latest checkpoint in the work directory. + - If `resume=False` and `load_from` is **not None**, only load the checkpoint, not resume training. + - If `resume=False` and `load_from` is **None**, do not load nor resume. + +Changes in **`dist_params`**: The `dist_params` field is a sub field of `env_cfg` now. And there are some new configurations in the `env_cfg`. + +```python +env_cfg = dict( + # whether to enable cudnn benchmark + cudnn_benchmark=False, + + # set multi process parameters + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + + # set distributed parameters + dist_cfg=dict(backend='nccl'), +) +``` + +Changes in **`workflow`**: `workflow` related functionalities are removed. + +New field **`visualizer`**: The visualizer is a new design in OpenMMLab 2.0 architecture. We use a visualizer instance in the runner to handle results & log visualization and save to different backends. See the [visualization tutorial](../user_guides/visualization.md) for more details. + +New field **`default_scope`**: The start point to search module for all registries. The `default_scope` in MMSegmentation is `mmseg`. See [the registry tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/registry.md) for more details. diff --git a/mmsegmentation/docs/en/migration/package.md b/mmsegmentation/docs/en/migration/package.md new file mode 100644 index 0000000..728e9a9 --- /dev/null +++ b/mmsegmentation/docs/en/migration/package.md @@ -0,0 +1,113 @@ +# Package structures changes + +This section is included if you are curious about what has changed between MMSeg 0.x and 1.x. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MMSegmentation 0.xMMSegmentation 1.x
mmseg.apimmseg.api
- mmseg.core+ mmseg.engine
mmseg.datasetsmmseg.datasets
mmseg.modelsmmseg.models
- mmseg.ops+ mmseg.structure
mmseg.utilsmmseg.utils
+ mmseg.evaluation
+ mmseg.registry
+ +## Removed packages + +### `mmseg.core` + +In OpenMMLab 2.0, `core` package has been removed. `hooks` and `optimizers` of `core` are moved in `mmseg.engine`, and `evaluation` in `core` is mmseg.evaluation currently. + +## `mmseg.ops` + +`ops` package included `encoding` and `wrappers`, which are moved in `mmseg.models.utils`. + +## Added packages + +### `mmseg.engine` + +OpenMMLab 2.0 adds a new foundational library for training deep learning, MMEngine. It servers as the training engine of all OpenMMLab codebases. +`engine` package of mmseg is some customized modules for semantic segmentation task, like `SegVisualizationHook` which works for visualizing segmentation mask. + +### `mmseg.structure` + +In OpenMMLab 2.0, we designed data structure for computer vision task, and in mmseg, we implements `SegDataSample` in `structure` package. + +### `mmseg.evaluation` + +We move all evaluation metric in `mmseg.evaluation`. + +### `mmseg.registry` + +We moved registry implementations for all kinds of modules in MMSegmentation in `mmseg.registry`. + +## Modified packages + +### `mmseg.apis` + +OpenMMLab 2.0 tries to support unified interface for multitasking of Computer Vision, and releases much stronger [`Runner`](https://github.com/open-mmlab/mmengine/blob/main/docs/en/design/runner.md), so MMSeg 1.x removed modules in `train.py` and `test.py` renamed `init_segmentor` to `init_model` and `inference_segmentor` to `inference_model`. + +Here is the changes of `mmseg.apis`: + +| Function | Changes | +| :-------------------: | :---------------------------------------------- | +| `init_segmentor` | Renamed to `init_model` | +| `inference_segmentor` | Rename to `inference_model` | +| `show_result_pyplot` | Implemented based on `SegLocalVisualizer` | +| `train_model` | Removed, use `runner.train` to train. | +| `multi_gpu_test` | Removed, use `runner.test` to test. | +| `single_gpu_test` | Removed, use `runner.test` to test. | +| `set_random_seed` | Removed, use `mmengine.runner.set_random_seed`. | +| `init_random_seed` | Removed, use `mmengine.dist.sync_random_seed`. | + +### `mmseg.datasets` + +OpenMMLab 2.0 defines the `BaseDataset` to function and interface of dataset, and MMSegmentation 1.x also follow this protocol and defines the `BaseSegDataset` inherited from `BaseDataset`. MMCV 2.x collects general data transforms for multiple tasks e.g. classification, detection, segmentation, so MMSegmentation 1.x uses these data transforms and removes them from mmseg.datasets. + +| Packages/Modules | Changes | +| :-------------------: | :------------------------------------------------------------------------------------------ | +| `mmseg.pipelines` | Moved in `mmcv.transforms` | +| `mmseg.sampler` | Moved in `mmengine.dataset.sampler` | +| `CustomDataset` | Renamed to `BaseSegDataset` and inherited from `BaseDataset` in MMEngine | +| `DefaultFormatBundle` | Replaced with `PackSegInputs` | +| `LoadImageFromFile` | Moved in `mmcv.transforms.LoadImageFromFile` | +| `LoadAnnotations` | Moved in `mmcv.transforms.LoadAnnotations` | +| `Resize` | Moved in `mmcv.transforms` and split into `Resize`, `RandomResize` and `RandomChoiceResize` | +| `RandomFlip` | Moved in `mmcv.transforms.RandomFlip` | +| `Pad` | Moved in `mmcv.transforms.Pad` | +| `Normalize` | Moved in `mmcv.transforms.Normalize` | +| `Compose` | Moved in `mmcv.transforms.Compose` | +| `ImageToTensor` | Moved in `mmcv.transforms.ImageToTensor` | + +### `mmseg.models` + +`models` has not changed a lot, just added the `encoding` and `wrappers` from previous `mmseg.ops` diff --git a/mmsegmentation/docs/en/model_zoo.md b/mmsegmentation/docs/en/model_zoo.md new file mode 100644 index 0000000..6717df6 --- /dev/null +++ b/mmsegmentation/docs/en/model_zoo.md @@ -0,0 +1,186 @@ +# Benchmark and Model Zoo + +## Common settings + +- We use distributed training with 4 GPUs by default. + +- All pytorch-style pretrained backbones on ImageNet are train by ourselves, with the same procedure in the [paper](https://arxiv.org/pdf/1812.01187.pdf). + Our ResNet style backbone are based on ResNetV1c variant, where the 7x7 conv in the input stem is replaced with three 3x3 convs. + +- For the consistency across different hardwares, we report the GPU memory as the maximum value of `torch.cuda.max_memory_allocated()` for all 4 GPUs with `torch.backends.cudnn.benchmark=False`. + Note that this value is usually less than what `nvidia-smi` shows. + +- We report the inference time as the total time of network forwarding and post-processing, excluding the data loading time. + Results are obtained with the script `tools/benchmark.py` which computes the average time on 200 images with `torch.backends.cudnn.benchmark=False`. + +- There are two inference modes in this framework. + + - `slide` mode: The `test_cfg` will be like `dict(mode='slide', crop_size=(769, 769), stride=(513, 513))`. + + In this mode, multiple patches will be cropped from input image, passed into network individually. + The crop size and stride between patches are specified by `crop_size` and `stride`. + The overlapping area will be merged by average + + - `whole` mode: The `test_cfg` will be like `dict(mode='whole')`. + + In this mode, the whole imaged will be passed into network directly. + + By default, we use `slide` inference for 769x769 trained model, `whole` inference for the rest. + +- For input size of 8x+1 (e.g. 769), `align_corner=True` is adopted as a traditional practice. + Otherwise, for input size of 8x (e.g. 512, 1024), `align_corner=False` is adopted. + +## Baselines + +### FCN + +Please refer to [FCN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn) for details. + +### PSPNet + +Please refer to [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet) for details. + +### DeepLabV3 + +Please refer to [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3) for details. + +### PSANet + +Please refer to [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet) for details. + +### DeepLabV3+ + +Please refer to [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus) for details. + +### UPerNet + +Please refer to [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet) for details. + +### NonLocal Net + +Please refer to [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net) for details. + +### EncNet + +Please refer to [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet) for details. + +### CCNet + +Please refer to [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet) for details. + +### DANet + +Please refer to [DANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet) for details. + +### APCNet + +Please refer to [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet) for details. + +### HRNet + +Please refer to [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet) for details. + +### GCNet + +Please refer to [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet) for details. + +### DMNet + +Please refer to [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet) for details. + +### ANN + +Please refer to [ANN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann) for details. + +### OCRNet + +Please refer to [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet) for details. + +### Fast-SCNN + +Please refer to [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastscnn) for details. + +### ResNeSt + +Please refer to [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest) for details. + +### Semantic FPN + +Please refer to [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/sem_fpn) for details. + +### PointRend + +Please refer to [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/point_rend) for details. + +### MobileNetV2 + +Please refer to [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2) for details. + +### MobileNetV3 + +Please refer to [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v3) for details. + +### EMANet + +Please refer to [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/emanet) for details. + +### DNLNet + +Please refer to [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet) for details. + +### CGNet + +Please refer to [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/cgnet) for details. + +### Mixed Precision (FP16) Training + +Please refer [Mixed Precision (FP16) Training on BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py) for details. + +### U-Net + +Please refer to [U-Net](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet/README.md) for details. + +### ViT + +Please refer to [ViT](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/README.md) for details. + +### Swin + +Please refer to [Swin](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin/README.md) for details. + +### SETR + +Please refer to [SETR](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr/README.md) for details. + +## Speed benchmark + +### Hardware + +- 8 NVIDIA Tesla V100 (32G) GPUs +- Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz + +### Software environment + +- Python 3.7 +- PyTorch 1.5 +- CUDA 10.1 +- CUDNN 7.6.03 +- NCCL 2.4.08 + +### Training speed + +For fair comparison, we benchmark all implementations with ResNet-101V1c. +The input size is fixed to 1024x512 with batch size 2. + +The training speed is reported as followed, in terms of second per iter (s/iter). The lower, the better. + +| Implementation | PSPNet (s/iter) | DeepLabV3+ (s/iter) | +| --------------------------------------------------------------------------- | --------------- | ------------------- | +| [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) | **0.83** | **0.85** | +| [SegmenTron](https://github.com/LikeLy-Journey/SegmenTron) | 0.84 | 0.85 | +| [CASILVision](https://github.com/CSAILVision/semantic-segmentation-pytorch) | 1.15 | N/A | +| [vedaseg](https://github.com/Media-Smart/vedaseg) | 0.95 | 1.25 | + +:::{note} +The output stride of DeepLabV3+ is 8. +::: diff --git a/mmsegmentation/docs/en/modelzoo_statistics.md b/mmsegmentation/docs/en/modelzoo_statistics.md new file mode 100644 index 0000000..e5e21a1 --- /dev/null +++ b/mmsegmentation/docs/en/modelzoo_statistics.md @@ -0,0 +1,102 @@ +# Model Zoo Statistics + +- Number of papers: 47 + + - ALGORITHM: 36 + - BACKBONE: 11 + +- Number of checkpoints: 612 + + - \[ALGORITHM\] [ANN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ann) (16 ckpts) + + - \[ALGORITHM\] [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/apcnet) (12 ckpts) + + - \[BACKBONE\] [BEiT](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/beit) (2 ckpts) + + - \[ALGORITHM\] [BiSeNetV1](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv1) (11 ckpts) + + - \[ALGORITHM\] [BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/bisenetv2) (4 ckpts) + + - \[ALGORITHM\] [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ccnet) (16 ckpts) + + - \[ALGORITHM\] [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/cgnet) (2 ckpts) + + - \[BACKBONE\] [ConvNeXt](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/convnext) (6 ckpts) + + - \[ALGORITHM\] [DANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/danet) (16 ckpts) + + - \[ALGORITHM\] [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3) (41 ckpts) + + - \[ALGORITHM\] [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/deeplabv3plus) (42 ckpts) + + - \[ALGORITHM\] [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dmnet) (12 ckpts) + + - \[ALGORITHM\] [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dnlnet) (12 ckpts) + + - \[ALGORITHM\] [DPT](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/dpt) (1 ckpts) + + - \[ALGORITHM\] [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/emanet) (4 ckpts) + + - \[ALGORITHM\] [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/encnet) (12 ckpts) + + - \[ALGORITHM\] [ERFNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/erfnet) (1 ckpts) + + - \[ALGORITHM\] [FastFCN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastfcn) (12 ckpts) + + - \[ALGORITHM\] [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fastscnn) (1 ckpts) + + - \[ALGORITHM\] [FCN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn) (41 ckpts) + + - \[ALGORITHM\] [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/gcnet) (16 ckpts) + + - \[BACKBONE\] [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/hrnet) (37 ckpts) + + - \[ALGORITHM\] [ICNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/icnet) (12 ckpts) + + - \[ALGORITHM\] [ISANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/isanet) (16 ckpts) + + - \[ALGORITHM\] [K-Net](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/knet) (7 ckpts) + + - \[BACKBONE\] [MAE](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mae) (1 ckpts) + + - \[ALGORITHM\] [Mask2Former](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mask2former) (13 ckpts) + + - \[ALGORITHM\] [MaskFormer](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/maskformer) (4 ckpts) + + - \[BACKBONE\] [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v2) (8 ckpts) + + - \[BACKBONE\] [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/mobilenet_v3) (4 ckpts) + + - \[ALGORITHM\] [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/nonlocal_net) (16 ckpts) + + - \[ALGORITHM\] [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/ocrnet) (24 ckpts) + + - \[ALGORITHM\] [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/point_rend) (4 ckpts) + + - \[BACKBONE\] [PoolFormer](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/poolformer) (5 ckpts) + + - \[ALGORITHM\] [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/psanet) (16 ckpts) + + - \[ALGORITHM\] [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/pspnet) (54 ckpts) + + - \[BACKBONE\] [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/resnest) (8 ckpts) + + - \[ALGORITHM\] [SegFormer](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segformer) (13 ckpts) + + - \[ALGORITHM\] [Segmenter](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/segmenter) (5 ckpts) + + - \[ALGORITHM\] [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/sem_fpn) (4 ckpts) + + - \[ALGORITHM\] [SETR](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/setr) (7 ckpts) + + - \[ALGORITHM\] [STDC](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/stdc) (4 ckpts) + + - \[BACKBONE\] [Swin Transformer](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/swin) (6 ckpts) + + - \[BACKBONE\] [Twins](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/twins) (12 ckpts) + + - \[ALGORITHM\] [UNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/unet) (25 ckpts) + + - \[ALGORITHM\] [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/upernet) (16 ckpts) + + - \[BACKBONE\] [Vision Transformer](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit) (11 ckpts) diff --git a/mmsegmentation/docs/en/notes/changelog.md b/mmsegmentation/docs/en/notes/changelog.md new file mode 100644 index 0000000..8eaf332 --- /dev/null +++ b/mmsegmentation/docs/en/notes/changelog.md @@ -0,0 +1,506 @@ +# Changelog of v1.x + +## v1.2.2 (12/14/2023) + +### Bug Fixes + +- Fix bug in cross entropy loss ([#3457](https://github.com/open-mmlab/mmsegmentation/pull/3457)) +- Allow custom visualizer ([#3455](https://github.com/open-mmlab/mmsegmentation/pull/3455)) +- test resize with pad_shape ([#3421](https://github.com/open-mmlab/mmsegmentation/pull/3421)) +- add with-labels args to inferencer for visualization without labels ([#3466](https://github.com/open-mmlab/mmsegmentation/pull/3466)) + +### New Contributors + +- @okotaku made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3421 + +## v1.2.1 (10/17/2023) + +### Bug Fixes + +- Add bpe_simple_vocab_16e6.txt.gz to release ([#3386](https://github.com/open-mmlab/mmsegmentation/pull/3386)) +- Fix init api ([#3388](https://github.com/open-mmlab/mmsegmentation/pull/3388)) + +## v1.2.0 (10/12/2023) + +### Features + +- Support Side Adapter Network ([#3232](https://github.com/open-mmlab/mmsegmentation/pull/3232)) + +### Bug Fixes + +- fix wrong variables passing for `set_dataset_meta` ([#3348](https://github.com/open-mmlab/mmsegmentation/pull/3348)) + +### Documentation + +- add documentation of Finetune ONNX Models (MMSegemetation) Inference for NVIDIA Jetson ([#3372](https://github.com/open-mmlab/mmsegmentation/pull/3372)) + +## v1.1.2(09/20/2023) + +### Features + +- Add semantic label to the segmentation visualization results ([#3229](https://github.com/open-mmlab/mmsegmentation/pull/3229)) +- Support NYU depth estimation dataset ([#3269](https://github.com/open-mmlab/mmsegmentation/pull/3269)) +- Support Kullback-Leibler divergence Loss ([#3242](https://github.com/open-mmlab/mmsegmentation/pull/3242)) +- Support depth metrics ([#3297](https://github.com/open-mmlab/mmsegmentation/pull/3297)) +- Support Remote sensing inferencer ([#3131](https://github.com/open-mmlab/mmsegmentation/pull/3131)) +- Support VPD Depth Estimator ((#3321)(https://github.com/open-mmlab/mmsegmentation/pull/3321)) +- Support inference and visualization of VPD ([#3331](https://github.com/open-mmlab/mmsegmentation/pull/3331)) +- Support using the pytorch-grad-cam tool to visualize Class Activation Maps (CAM) ([#3324](https://github.com/open-mmlab/mmsegmentation/pull/3324)) + +### New projects + +- Support PP-Mobileseg ([#3239](https://github.com/open-mmlab/mmsegmentation/pull/3239)) +- Support CAT-Seg (CVPR'2023) ([#3098](https://github.com/open-mmlab/mmsegmentation/pull/3098)) +- Support Adabins ([#3257](https://github.com/open-mmlab/mmsegmentation/pull/3257)) +- Add pp_mobileseg onnx inference script ([#3268](https://github.com/open-mmlab/mmsegmentation/pull/3268)) + +### Bug Fixes + +- Fix module PascalContextDataset ([#3235](https://github.com/open-mmlab/mmsegmentation/pull/3235)) +- Fix one hot encoding for dice loss ([#3237](https://github.com/open-mmlab/mmsegmentation/pull/3237)) +- Fix confusion_matrix.py ([#3291](https://github.com/open-mmlab/mmsegmentation/pull/3291)) +- Fix inferencer visualization ([#3333](https://github.com/open-mmlab/mmsegmentation/pull/3333)) + +### Documentation + +- Translate doc for docs/zh_cn/user_guides/5_deployment.md ([#3281](https://github.com/open-mmlab/mmsegmentation/pull/3281)) + +### New Contributors + +- @angiecao made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3235 +- @yeedrag made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3237 +- @Yang-Changhui made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3239 +- @ooooo-create made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3261 +- @Ben-Louis made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3269 +- @crazysteeaam made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3284 +- @zen0no made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3242 +- @XiandongWang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3291 +- @ZhaoQiiii made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3332 +- @zhen6618 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3324 + +## v1.1.1(07/24/2023) + +### Features + +- Add bdd100K datasets ([#3158](https://github.com/open-mmlab/mmsegmentation/pull/3158)) +- Remove batch inference assertion ([#3210](https://github.com/open-mmlab/mmsegmentation/pull/3210)) + +### Bug Fixes + +- Fix train map path for coco-stuff164k.py ([#3187](https://github.com/open-mmlab/mmsegmentation/pull/3187)) +- Fix mim search error ([#3194](https://github.com/open-mmlab/mmsegmentation/pull/3194)) +- Fix SegTTAModel with no attribute '\_gt_sem_seg' error ([#3152](https://github.com/open-mmlab/mmsegmentation/pull/3152)) +- Fix Albumentations default key mapping mismatch ([#3195](https://github.com/open-mmlab/mmsegmentation/pull/3195)) + +### New Contributors + +- @OliverGrace made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3187 +- @ZiAn-Su made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3152 +- @CastleDream made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3158 +- @coding-famer made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3174 +- @Alias-z made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3195 + +## v1.1.0(06/28/2023) + +## What's Changed + +### Features + +- Support albu transform ([#2943](https://github.com/open-mmlab/mmsegmentation/pull/2943)) +- Support DDRNet ([#2855](https://github.com/open-mmlab/mmsegmentation/pull/2855)) +- Add GDAL backend and Support LEVIR-CD Dataset ([#2903](https://github.com/open-mmlab/mmsegmentation/pull/2903)) +- Support DSDL Dataset ([#2925](https://github.com/open-mmlab/mmsegmentation/pull/2925)) +- huasdorff distance loss ([#2820](https://github.com/open-mmlab/mmsegmentation/pull/2820)) + +### New Projects + +- Support SAM inferencer ([#2897](https://github.com/open-mmlab/mmsegmentation/pull/2897)) +- Added a supported for Visual Attention Network (VAN) ([#2987](https://github.com/open-mmlab/mmsegmentation/pull/2987)) +- add GID dataset ([#3038](https://github.com/open-mmlab/mmsegmentation/pull/3038)) +- add Medical semantic seg dataset: Bactteria ([#2568](https://github.com/open-mmlab/mmsegmentation/pull/2568)) +- add Medical semantic seg dataset: Vampire ([#2633](https://github.com/open-mmlab/mmsegmentation/pull/2633)) +- add Medical semantic seg dataset: Ravir ([#2635](https://github.com/open-mmlab/mmsegmentation/pull/2635)) +- add Medical semantic seg dataset: Cranium ([#2675](https://github.com/open-mmlab/mmsegmentation/pull/2675)) +- add Medical semantic seg dataset: bccs ([#2861](https://github.com/open-mmlab/mmsegmentation/pull/2861)) +- add Medical semantic seg dataset: Gamma Task3 dataset ([#2695](https://github.com/open-mmlab/mmsegmentation/pull/2695)) +- add Medical semantic seg dataset: consep ([#2724](https://github.com/open-mmlab/mmsegmentation/pull/2724)) +- add Medical semantic seg dataset: breast_cancer_cell_seg dataset ([#2726](https://github.com/open-mmlab/mmsegmentation/pull/2726)) +- add Medical semantic seg dataset: chest_image_pneum dataset ([#2727](https://github.com/open-mmlab/mmsegmentation/pull/2727)) +- add Medical semantic seg dataset: conic2022 ([#2725](https://github.com/open-mmlab/mmsegmentation/pull/2725)) +- add Medical semantic seg dataset: dr_hagis ([#2729](https://github.com/open-mmlab/mmsegmentation/pull/2729)) +- add Medical semantic seg dataset: orvs ([#2728](https://github.com/open-mmlab/mmsegmentation/pull/2728)) +- add Medical semantic seg dataset: ISIC-2016 Task1 ([#2708](https://github.com/open-mmlab/mmsegmentation/pull/2708)) +- add Medical semantic seg dataset: ISIC-2017 Task1 ([#2709](https://github.com/open-mmlab/mmsegmentation/pull/2709)) +- add Medical semantic seg dataset: Kvasir seg ([#2677](https://github.com/open-mmlab/mmsegmentation/pull/2677)) +- add Medical semantic seg dataset: Kvasir seg aliyun ([#2678](https://github.com/open-mmlab/mmsegmentation/pull/2678)) +- add Medical semantic seg dataset: Rite ([#2680](https://github.com/open-mmlab/mmsegmentation/pull/2680)) +- add Medical semantic seg dataset: Fusc2021 ([#2682](https://github.com/open-mmlab/mmsegmentation/pull/2682)) +- add Medical semantic seg dataset: 2pm vessel ([#2685](https://github.com/open-mmlab/mmsegmentation/pull/2685)) +- add Medical semantic seg dataset: Pcam ([#2684](https://github.com/open-mmlab/mmsegmentation/pull/2684)) +- add Medical semantic seg dataset: Pannuke ([#2683](https://github.com/open-mmlab/mmsegmentation/pull/2683)) +- add Medical semantic seg dataset: Covid 19 ct cxr ([#2688](https://github.com/open-mmlab/mmsegmentation/pull/2688)) +- add Medical semantic seg dataset: Crass ([#2690](https://github.com/open-mmlab/mmsegmentation/pull/2690)) +- add Medical semantic seg dataset: Chest x ray images with pneumothorax masks ([#2687](https://github.com/open-mmlab/mmsegmentation/pull/2687)) + +### Enhancement + +- Robust mapping from image path to seg map path ([#3091](https://github.com/open-mmlab/mmsegmentation/pull/3091)) +- Change assertion logic inference cfg.model.test_cfg ([#3012](https://github.com/open-mmlab/mmsegmentation/pull/3012)) +- Refactor dice loss ([#3002](https://github.com/open-mmlab/mmsegmentation/pull/3002)) +- Update Dockerfile libgl1-mesa-dev ([#3095](https://github.com/open-mmlab/mmsegmentation/pull/3095)) +- Prevent passed `ann_file` from silently failing to load ([#2966](https://github.com/open-mmlab/mmsegmentation/pull/2966)) +- Update the translation of models documentation ([#2833](https://github.com/open-mmlab/mmsegmentation/pull/2833)) +- Add docs contents at README.md ([#3083](https://github.com/open-mmlab/mmsegmentation/pull/3083)) +- Enhance swin pretrained model loading ([#3097](https://github.com/open-mmlab/mmsegmentation/pull/3097)) + +### Bug Fixes + +- Handle case where device is neither CPU nor CUDA in HamHead ([#2868](https://github.com/open-mmlab/mmsegmentation/pull/2868)) +- Fix bugs when out_channels==1 ([#2911](https://github.com/open-mmlab/mmsegmentation/pull/2911)) +- Fix binary C=1 focal loss & dataset fileio ([#2935](https://github.com/open-mmlab/mmsegmentation/pull/2935)) +- Fix isaid dataset pre-processing tool ([#3010](https://github.com/open-mmlab/mmsegmentation/pull/3010)) +- Fix bug cannot use both '--tta' and '--out' while testing ([#3067](https://github.com/open-mmlab/mmsegmentation/pull/3067)) +- Fix inferencer ut ([#3117](https://github.com/open-mmlab/mmsegmentation/pull/3117)) +- Fix document ([#2863](https://github.com/open-mmlab/mmsegmentation/pull/2863), [#2896](https://github.com/open-mmlab/mmsegmentation/pull/2896), [#2919](https://github.com/open-mmlab/mmsegmentation/pull/2919), [#2951](https://github.com/open-mmlab/mmsegmentation/pull/2951), [#2970](https://github.com/open-mmlab/mmsegmentation/pull/2970), [#2961](https://github.com/open-mmlab/mmsegmentation/pull/2961), [#3042](https://github.com/open-mmlab/mmsegmentation/pull/3042), ) +- Fix squeeze error when N=1 and C=1 ([#2933](https://github.com/open-mmlab/mmsegmentation/pull/2933)) + +### New Contributors + +- @liu-mengyang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2896 +- @likyoo made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2911 +- @1qh made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2902 +- @JoshuaChou2018 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2951 +- @jts250 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2833 +- @MGAMZ made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2970 +- @tianbinli made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2568 +- @Provable0816 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2633 +- @Zoulinx made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2903 +- @wufan-tb made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2925 +- @haruishi43 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2966 +- @Masaaki-75 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2675 +- @tang576225574 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2987 +- @Kedreamix made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3010 +- @nightrain01 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3067 +- @shigengtian made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3095 +- @SheffieldCao made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3097 +- @wangruohui made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3091 +- @LHamnett made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/3012 + +## v1.0.0(04/06/2023) + +### Highlights + +- Add Mapillary Vistas Datasets support to MMSegmentation Core Package ([#2576](https://github.com/open-mmlab/mmsegmentation/pull/2576)) +- Support PIDNet ([#2609](https://github.com/open-mmlab/mmsegmentation/pull/2609)) +- Support SegNeXt ([#2654](https://github.com/open-mmlab/mmsegmentation/pull/2654)) + +### Features + +- Support calculating FLOPs of segmentors ([#2706](https://github.com/open-mmlab/mmsegmentation/pull/2706)) +- Support multi-band image for Mosaic ([#2748](https://github.com/open-mmlab/mmsegmentation/pull/2748)) +- Support dump segment prediction ([#2712](https://github.com/open-mmlab/mmsegmentation/pull/2712)) + +### Bug fix + +- Fix format_result and fix prefix param in cityscape metric, and rename CitysMetric to CityscapesMetric ([#2660](https://github.com/open-mmlab/mmsegmentation/pull/2660)) +- Support input gt seg map is not 2D ([#2739](https://github.com/open-mmlab/mmsegmentation/pull/2739)) +- Fix accepting an unexpected argument `local-rank` in PyTorch 2.0 ([#2812](https://github.com/open-mmlab/mmsegmentation/pull/2812)) + +### Documentation + +- Add Chinese version of various documentation ([#2673](https://github.com/open-mmlab/mmsegmentation/pull/2673), [#2702](https://github.com/open-mmlab/mmsegmentation/pull/2702), [#2703](https://github.com/open-mmlab/mmsegmentation/pull/2703), [#2701](https://github.com/open-mmlab/mmsegmentation/pull/2701), [#2722](https://github.com/open-mmlab/mmsegmentation/pull/2722), [#2733](https://github.com/open-mmlab/mmsegmentation/pull/2733), [#2769](https://github.com/open-mmlab/mmsegmentation/pull/2769), [#2790](https://github.com/open-mmlab/mmsegmentation/pull/2790), [#2798](https://github.com/open-mmlab/mmsegmentation/pull/2798)) +- Update and refine various English documentation ([#2715](https://github.com/open-mmlab/mmsegmentation/pull/2715), [#2755](https://github.com/open-mmlab/mmsegmentation/pull/2755), [#2745](https://github.com/open-mmlab/mmsegmentation/pull/2745), [#2797](https://github.com/open-mmlab/mmsegmentation/pull/2797), [#2799](https://github.com/open-mmlab/mmsegmentation/pull/2799), [#2821](https://github.com/open-mmlab/mmsegmentation/pull/2821), [#2827](https://github.com/open-mmlab/mmsegmentation/pull/2827), [#2831](https://github.com/open-mmlab/mmsegmentation/pull/2831)) +- Add deeplabv3 model structure documentation ([#2426](https://github.com/open-mmlab/mmsegmentation/pull/2426)) +- Add custom metrics documentation ([#2799](https://github.com/open-mmlab/mmsegmentation/pull/2799)) +- Add faq in dev-1.x branch ([#2765](https://github.com/open-mmlab/mmsegmentation/pull/2765)) + +### New Contributors + +- @liuruiqiang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2554 +- @wangjiangben-hw made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2569 +- @jinxianwei made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2557 +- @KKIEEK made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2747 +- @Renzhihan made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2765 + +## v1.0.0rc6(03/03/2023) + +### Highlights + +- Support MMSegInferencer ([#2413](https://github.com/open-mmlab/mmsegmentation/pull/2413), [#2658](https://github.com/open-mmlab/mmsegmentation/pull/2658)) +- Support REFUGE dataset ([#2554](https://github.com/open-mmlab/mmsegmentation/pull/2554)) + +### Features + +- Support auto import modules from registry ([#2481](https://github.com/open-mmlab/mmsegmentation/pull/2481)) +- Replace numpy ascontiguousarray with torch contiguous to speed-up ([#2604](https://github.com/open-mmlab/mmsegmentation/pull/2604)) +- Add browse_dataset.py tool ([#2649](https://github.com/open-mmlab/mmsegmentation/pull/2649)) + +### Bug fix + +- Rename and Fix bug of projects HieraSeg ([#2565](https://github.com/open-mmlab/mmsegmentation/pull/2565)) +- Add out_channels in `CascadeEncoderDecoder` and update OCRNet and MobileNet v2 results ([#2656](https://github.com/open-mmlab/mmsegmentation/pull/2656)) + +### Documentation + +- Add dataflow documentation of Chinese version ([#2652](https://github.com/open-mmlab/mmsegmentation/pull/2652)) +- Add custmized runtime documentation of English version ([#2533](https://github.com/open-mmlab/mmsegmentation/pull/2533)) +- Add documentation for visualizing feature map using wandb backend ([#2557](https://github.com/open-mmlab/mmsegmentation/pull/2557)) +- Add documentation for benchmark results on NPU (HUAWEI Ascend) ([#2569](https://github.com/open-mmlab/mmsegmentation/pull/2569), [#2596](https://github.com/open-mmlab/mmsegmentation/pull/2596), [#2610](https://github.com/open-mmlab/mmsegmentation/pull/2610)) +- Fix api name error in the migration doc ([#2601](https://github.com/open-mmlab/mmsegmentation/pull/2601)) +- Refine projects documentation ([#2586](https://github.com/open-mmlab/mmsegmentation/pull/2586)) +- Refine MMSegmentation documentation ([#2668](https://github.com/open-mmlab/mmsegmentation/pull/2668), [#2659](https://github.com/open-mmlab/mmsegmentation/pull/2659)) + +### New Contributors + +- @zccjjj made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2548 +- @liuruiqiang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2554 +- @wangjiangben-hw made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2569 +- @jinxianwei made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2557 + +## v1.0.0rc5(02/01/2023) + +### Bug fix + +- Fix MaskFormer and Mask2Former when install mmdet from source ([#2532](https://github.com/open-mmlab/mmsegmentation/pull/2532)) +- Support new fileio interface in `MMCV>=2.0.0rc4` ([#2543](https://github.com/open-mmlab/mmsegmentation/pull/2543)) +- Fix ERFNet URL in dev-1.x branch ([#2537](https://github.com/open-mmlab/mmsegmentation/pull/2537)) +- Fix misleading `List[Tensor]` types ([#2546](https://github.com/open-mmlab/mmsegmentation/pull/2546)) +- Rename typing.py to typing_utils.py ([#2548](https://github.com/open-mmlab/mmsegmentation/pull/2548)) + +## v1.0.0rc4(01/30/2023) + +### Highlights + +- Support ISNet (ICCV'2021) in projects ([#2400](https://github.com/open-mmlab/mmsegmentation/pull/2400)) +- Support HSSN (CVPR'2022) in projects ([#2444](https://github.com/open-mmlab/mmsegmentation/pull/2444)) + +### Features + +- Add Gaussian Noise and Blur for biomedical data ([#2373](https://github.com/open-mmlab/mmsegmentation/pull/2373)) +- Add BioMedicalRandomGamma ([#2406](https://github.com/open-mmlab/mmsegmentation/pull/2406)) +- Add BioMedical3DPad ([#2383](https://github.com/open-mmlab/mmsegmentation/pull/2383)) +- Add BioMedical3DRandomFlip ([#2404](https://github.com/open-mmlab/mmsegmentation/pull/2404)) +- Add `gt_edge_map` field to SegDataSample ([#2466](https://github.com/open-mmlab/mmsegmentation/pull/2466)) +- Support synapse dataset ([#2432](https://github.com/open-mmlab/mmsegmentation/pull/2432), [#2465](https://github.com/open-mmlab/mmsegmentation/pull/2465)) +- Support Mapillary Vistas Dataset in projects ([#2484](https://github.com/open-mmlab/mmsegmentation/pull/2484)) +- Switch order of `reduce_zero_label` and applying `label_map` ([#2517](https://github.com/open-mmlab/mmsegmentation/pull/2517)) + +### Documentation + +- Add ZN Customized_runtime Doc ([#2502](https://github.com/open-mmlab/mmsegmentation/pull/2502)) +- Add EN datasets.md ([#2464](https://github.com/open-mmlab/mmsegmentation/pull/2464)) +- Fix minor typo in migration `package.md` ([#2518](https://github.com/open-mmlab/mmsegmentation/pull/2518)) + +### Bug fix + +- Fix incorrect `img_shape` value assignment in RandomCrop ([#2469](https://github.com/open-mmlab/mmsegmentation/pull/2469)) +- Fix inference api and support setting palette to SegLocalVisualizer ([#2475](https://github.com/open-mmlab/mmsegmentation/pull/2475)) +- Unfinished label conversion from `-1` to `255` ([#2516](https://github.com/open-mmlab/mmsegmentation/pull/2516)) + +### New Contributors + +- @blueyo0 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2373 +- @Fivethousand5k made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2406 +- @suyanzhou626 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2383 +- @unrealMJ made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2400 +- @Dominic23331 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2432 +- @AI-Tianlong made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2444 +- @morkovka1337 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2492 +- @Leeinsn made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2404 +- @siddancha made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2516 + +## v1.0.0rc3(31/12/2022) + +### Highlights + +- Support test time augmentation ([#2184](https://github.com/open-mmlab/mmsegmentation/pull/2184)) +- Add 'Projects/' folder and the first example project ([#2412](https://github.com/open-mmlab/mmsegmentation/pull/2412)) + +### Features + +- Add Biomedical 3D array random crop transform ([#2378](https://github.com/open-mmlab/mmsegmentation/pull/2378)) + +### Documentation + +- Add Chinese version of config tutorial ([#2371](https://github.com/open-mmlab/mmsegmentation/pull/2371)) +- Add Chinese version of train & test tutorial ([#2355](https://github.com/open-mmlab/mmsegmentation/pull/2355)) +- Add Chinese version of overview ([(#2397)](https://github.com/open-mmlab/mmsegmentation/pull/2397))) +- Add Chinese version of get_started ([#2417](https://github.com/open-mmlab/mmsegmentation/pull/2417)) +- Add datasets in Chinese ([#2387](https://github.com/open-mmlab/mmsegmentation/pull/2387)) +- Add dataflow document ([#2403](https://github.com/open-mmlab/mmsegmentation/pull/2403)) +- Add pspnet model structure graph ([#2437](https://github.com/open-mmlab/mmsegmentation/pull/2437)) +- Update some content of engine Chinese documentation ([#2341](https://github.com/open-mmlab/mmsegmentation/pull/2341)) +- Update TTA to migration documentation ([#2335](https://github.com/open-mmlab/mmsegmentation/pull/2335)) + +### Bug fix + +- Remove dependency mmdet when do not use MaskFormerHead and MMDET_Mask2FormerHead ([#2448](https://github.com/open-mmlab/mmsegmentation/pull/2448)) + +### Enhancement + +- Add torch1.13 checking in CI ([#2402](https://github.com/open-mmlab/mmsegmentation/pull/2402)) +- Fix pytorch version for merge stage test ([#2449](https://github.com/open-mmlab/mmsegmentation/pull/2449)) + +## v1.0.0rc2(6/12/2022) + +### Highlights + +- Support MaskFormer ([#2215](https://github.com/open-mmlab/mmsegmentation/pull/2215)) +- Support Mask2Former ([#2255](https://github.com/open-mmlab/mmsegmentation/pull/2255)) + +### Features + +- Add ResizeShortestEdge transform ([#2339](https://github.com/open-mmlab/mmsegmentation/pull/2339)) +- Support padding in data pre-processor for model testing([#2290](https://github.com/open-mmlab/mmsegmentation/pull/2290)) +- Fix the problem of post-processing not removing padding ([#2367](https://github.com/open-mmlab/mmsegmentation/pull/2367)) + +### Bug fix + +- Fix links in README ([#2024](https://github.com/open-mmlab/mmsegmentation/pull/2024)) +- Fix swin load state_dict ([#2304](https://github.com/open-mmlab/mmsegmentation/pull/2304)) +- Fix typo of BaseSegDataset docstring ([#2322](https://github.com/open-mmlab/mmsegmentation/pull/2322)) +- Fix the bug in the visualization step ([#2326](https://github.com/open-mmlab/mmsegmentation/pull/2326)) +- Fix ignore class id from -1 to 255 in BaseSegDataset ([#2332](https://github.com/open-mmlab/mmsegmentation/pull/2332)) +- Fix KNet IterativeDecodeHead bug ([#2334](https://github.com/open-mmlab/mmsegmentation/pull/2334)) +- Add input argument for datasets ([#2379](https://github.com/open-mmlab/mmsegmentation/pull/2379)) +- Fix typo in warning on binary classification ([#2382](https://github.com/open-mmlab/mmsegmentation/pull/2382)) + +### Enhancement + +- Fix ci for 1.x ([#2011](https://github.com/open-mmlab/mmsegmentation/pull/2011), [#2019](https://github.com/open-mmlab/mmsegmentation/pull/2019)) +- Fix lint and pre-commit hook ([#2308](https://github.com/open-mmlab/mmsegmentation/pull/2308)) +- Add `data` string in .gitignore file in dev-1.x branch ([#2336](https://github.com/open-mmlab/mmsegmentation/pull/2336)) +- Make scipy as a default dependency in runtime ([#2362](https://github.com/open-mmlab/mmsegmentation/pull/2362)) +- Delete mmcls in runtime.txt ([#2368](https://github.com/open-mmlab/mmsegmentation/pull/2368)) + +### Documentation + +- Update configuration documentation ([#2048](https://github.com/open-mmlab/mmsegmentation/pull/2048)) +- Update inference documentation ([#2052](https://github.com/open-mmlab/mmsegmentation/pull/2052)) +- Update train test documentation ([#2061](https://github.com/open-mmlab/mmsegmentation/pull/2061)) +- Update get started documentatin ([#2148](https://github.com/open-mmlab/mmsegmentation/pull/2148)) +- Update transforms documentation ([#2088](https://github.com/open-mmlab/mmsegmentation/pull/2088)) +- Add MMEval projects like in README ([#2259](https://github.com/open-mmlab/mmsegmentation/pull/2259)) +- Translate the visualization.md ([#2298](https://github.com/open-mmlab/mmsegmentation/pull/2298)) + +## v1.0.0rc1 (2/11/2022) + +### Highlights + +- Support PoolFormer ([#2191](https://github.com/open-mmlab/mmsegmentation/pull/2191)) +- Add Decathlon dataset ([#2227](https://github.com/open-mmlab/mmsegmentation/pull/2227)) + +### Features + +- Add BioMedical data loading ([#2176](https://github.com/open-mmlab/mmsegmentation/pull/2176)) +- Add LIP dataset ([#2251](https://github.com/open-mmlab/mmsegmentation/pull/2251)) +- Add `GenerateEdge` data transform ([#2210](https://github.com/open-mmlab/mmsegmentation/pull/2210)) + +### Bug fix + +- Fix segmenter-vit-s_fcn config ([#2037](https://github.com/open-mmlab/mmsegmentation/pull/2037)) +- Fix binary segmentation ([#2101](https://github.com/open-mmlab/mmsegmentation/pull/2101)) +- Fix MMSegmentation colab demo ([#2089](https://github.com/open-mmlab/mmsegmentation/pull/2089)) +- Fix ResizeToMultiple transform ([#2185](https://github.com/open-mmlab/mmsegmentation/pull/2185)) +- Use SyncBN in mobilenet_v2 ([#2198](https://github.com/open-mmlab/mmsegmentation/pull/2198)) +- Fix typo in installation ([#2175](https://github.com/open-mmlab/mmsegmentation/pull/2175)) +- Fix typo in visualization.md ([#2116](https://github.com/open-mmlab/mmsegmentation/pull/2116)) + +### Enhancement + +- Add mim extras_requires in setup.py ([#2012](https://github.com/open-mmlab/mmsegmentation/pull/2012)) +- Fix CI ([#2029](https://github.com/open-mmlab/mmsegmentation/pull/2029)) +- Remove ops module ([#2063](https://github.com/open-mmlab/mmsegmentation/pull/2063)) +- Add pyupgrade pre-commit hook ([#2078](https://github.com/open-mmlab/mmsegmentation/pull/2078)) +- Add `out_file` in `add_datasample` of `SegLocalVisualizer` to directly save image ([#2090](https://github.com/open-mmlab/mmsegmentation/pull/2090)) +- Upgrade pre commit hooks ([#2154](https://github.com/open-mmlab/mmsegmentation/pull/2154)) +- Ignore test timm in CI when torch\<1.7 ([#2158](https://github.com/open-mmlab/mmsegmentation/pull/2158)) +- Update requirements ([#2186](https://github.com/open-mmlab/mmsegmentation/pull/2186)) +- Fix Windows platform CI ([#2202](https://github.com/open-mmlab/mmsegmentation/pull/2202)) + +### Documentation + +- Add `Overview` documentation ([#2042](https://github.com/open-mmlab/mmsegmentation/pull/2042)) +- Add `Evaluation` documentation ([#2077](https://github.com/open-mmlab/mmsegmentation/pull/2077)) +- Add `Migration` documentation ([#2066](https://github.com/open-mmlab/mmsegmentation/pull/2066)) +- Add `Structures` documentation ([#2070](https://github.com/open-mmlab/mmsegmentation/pull/2070)) +- Add `Structures` ZN documentation ([#2129](https://github.com/open-mmlab/mmsegmentation/pull/2129)) +- Add `Engine` ZN documentation ([#2157](https://github.com/open-mmlab/mmsegmentation/pull/2157)) +- Update `Prepare datasets` and `Visualization` doc ([#2054](https://github.com/open-mmlab/mmsegmentation/pull/2054)) +- Update `Models` documentation ([#2160](https://github.com/open-mmlab/mmsegmentation/pull/2160)) +- Update `Add New Modules` documentation ([#2067](https://github.com/open-mmlab/mmsegmentation/pull/2067)) +- Fix the installation commands in get_started.md ([#2174](https://github.com/open-mmlab/mmsegmentation/pull/2174)) +- Add MMYOLO to README.md ([#2220](https://github.com/open-mmlab/mmsegmentation/pull/2220)) + +## v1.0.0rc0 (31/8/2022) + +We are excited to announce the release of MMSegmentation 1.0.0rc0. +MMSeg 1.0.0rc0 is the first version of MMSegmentation 1.x, a part of the OpenMMLab 2.0 projects. +Built upon the new [training engine](https://github.com/open-mmlab/mmengine), +MMSeg 1.x unifies the interfaces of dataset, models, evaluation, and visualization with faster training and testing speed. + +### Highlights + +1. **New engines** MMSeg 1.x is based on [MMEngine](https://github.com/open-mmlab/mmengine), which provides a general and powerful runner that allows more flexible customizations and significantly simplifies the entrypoints of high-level interfaces. + +2. **Unified interfaces** As a part of the OpenMMLab 2.0 projects, MMSeg 1.x unifies and refactors the interfaces and internal logics of train, testing, datasets, models, evaluation, and visualization. All the OpenMMLab 2.0 projects share the same design in those interfaces and logics to allow the emergence of multi-task/modality algorithms. + +3. **Faster speed** We optimize the training and inference speed for common models. + +4. **New features**: + + - Support TverskyLoss function + +5. **More documentation and tutorials**. We add a bunch of documentation and tutorials to help users get started more smoothly. Read it [here](https://mmsegmentation.readthedocs.io/en/1.x/). + +### Breaking Changes + +We briefly list the major breaking changes here. +We will update the [migration guide](../migration.md) to provide complete details and migration instructions. + +#### Training and testing + +- MMSeg 1.x runs on PyTorch>=1.6. We have deprecated the support of PyTorch 1.5 to embrace the mixed precision training and other new features since PyTorch 1.6. Some models can still run on PyTorch 1.5, but the full functionality of MMSeg 1.x is not guaranteed. + +- MMSeg 1.x uses Runner in [MMEngine](https://github.com/open-mmlab/mmengine) rather than that in MMCV. The new Runner implements and unifies the building logic of dataset, model, evaluation, and visualizer. Therefore, MMSeg 1.x no longer maintains the building logics of those modules in `mmseg.train.apis` and `tools/train.py`. Those code have been migrated into [MMEngine](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py). Please refer to the [migration guide of Runner in MMEngine](https://mmengine.readthedocs.io/en/latest/migration/runner.html) for more details. + +- The Runner in MMEngine also supports testing and validation. The testing scripts are also simplified, which has similar logic as that in training scripts to build the runner. + +- The execution points of hooks in the new Runner have been enriched to allow more flexible customization. Please refer to the [migration guide of Hook in MMEngine](https://mmengine.readthedocs.io/en/latest/migration/hook.html) for more details. + +- Learning rate and momentum scheduling has been migrated from `Hook` to `Parameter Scheduler` in MMEngine. Please refer to the [migration guide of Parameter Scheduler in MMEngine](https://mmengine.readthedocs.io/en/latest/migration/param_scheduler.html) for more details. + +#### Configs + +- The [Runner in MMEngine](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py) uses a different config structures to ease the understanding of the components in runner. Users can read the [config example of mmseg](../user_guides/config.md) or refer to the [migration guide in MMEngine](https://mmengine.readthedocs.io/en/latest/migration/runner.html) for migration details. +- The file names of configs and models are also refactored to follow the new rules unified across OpenMMLab 2.0 projects. Please refer to the [user guides of config](../user_guides/1_config.md) for more details. + +#### Components + +- Dataset +- Data Transforms +- Model +- Evaluation +- Visualization + +### Improvements + +- Support mixed precision training of all the models. However, some models may got Nan results due to some numerical issues. We will update the documentation and list their results (accuracy of failure) of mixed precision training. + +### Bug Fixes + +- Fix several config file errors [#1994](https://github.com/open-mmlab/mmsegmentation/pull/1994) + +### New Features + +1. Support data structures and encapsulating `seg_logits` in data samples, which can be return from models to support more common evaluation metrics. + +### Ongoing changes + +1. Test-time augmentation: which is supported in MMSeg 0.x is not implemented in this version due to limited time slot. We will support it in the following releases with a new and simplified design. + +2. Inference interfaces: a unified inference interfaces will be supported in the future to ease the use of released models. + +3. Interfaces of useful tools that can be used in notebook: more useful tools that implemented in the `tools` directory will have their python interfaces so that they can be used through notebook and in downstream libraries. + +4. Documentation: we will add more design docs, tutorials, and migration guidance so that the community can deep dive into our new design, participate the future development, and smoothly migrate downstream libraries to MMSeg 1.x. diff --git a/mmsegmentation/docs/en/notes/changelog_v0.x.md b/mmsegmentation/docs/en/notes/changelog_v0.x.md new file mode 100644 index 0000000..d347a44 --- /dev/null +++ b/mmsegmentation/docs/en/notes/changelog_v0.x.md @@ -0,0 +1,720 @@ +## Changelog + +### V0.24.1 (5/1/2022) + +**Bug Fixes** + +- Fix `LayerDecayOptimizerConstructor` for MAE training ([#1539](https://github.com/open-mmlab/mmsegmentation/pull/1539), [#1540](https://github.com/open-mmlab/mmsegmentation/pull/1540)) + +### V0.24.0 (4/29/2022) + +**Highlights** + +- Support MAE: Masked Autoencoders Are Scalable Vision Learners +- Support Resnet strikes back + +**New Features** + +- Support MAE: Masked Autoencoders Are Scalable Vision Learners ([#1307](https://github.com/open-mmlab/mmsegmentation/pull/1307), [#1523](https://github.com/open-mmlab/mmsegmentation/pull/1523)) +- Support Resnet strikes back ([#1390](https://github.com/open-mmlab/mmsegmentation/pull/1390)) +- Support extra dataloader settings in configs ([#1435](https://github.com/open-mmlab/mmsegmentation/pull/1435)) + +**Bug Fixes** + +- Fix input previous results for the last cascade_decode_head ([#1450](https://github.com/open-mmlab/mmsegmentation/pull/1450)) +- Fix validation loss logging ([#1494](https://github.com/open-mmlab/mmsegmentation/pull/1494)) +- Fix the bug in binary_cross_entropy ([1527](https://github.com/open-mmlab/mmsegmentation/pull/1527)) +- Support single channel prediction for Binary Cross Entropy Loss ([#1454](https://github.com/open-mmlab/mmsegmentation/pull/1454)) +- Fix potential bugs in accuracy.py ([1496](https://github.com/open-mmlab/mmsegmentation/pull/1496)) +- Avoid converting label ids twice by label map during evaluation ([1417](https://github.com/open-mmlab/mmsegmentation/pull/1417)) +- Fix bug about label_map ([1445](https://github.com/open-mmlab/mmsegmentation/pull/1445)) +- Fix image save path bug in Windows ([1423](https://github.com/open-mmlab/mmsegmentation/pull/1423)) +- Fix MMSegmentation Colab demo ([1501](https://github.com/open-mmlab/mmsegmentation/pull/1501), [1452](https://github.com/open-mmlab/mmsegmentation/pull/1452)) +- Migrate azure blob for beit checkpoints ([1503](https://github.com/open-mmlab/mmsegmentation/pull/1503)) +- Fix bug in `tools/analyse_logs.py` caused by wrong plot_iter in some cases ([1428](https://github.com/open-mmlab/mmsegmentation/pull/1428)) + +**Improvements** + +- Merge BEiT and ConvNext's LR decay optimizer constructors ([#1438](https://github.com/open-mmlab/mmsegmentation/pull/1438)) +- Register optimizer constructor with mmseg ([#1456](https://github.com/open-mmlab/mmsegmentation/pull/1456)) +- Refactor transformer encode layer in ViT and BEiT backbone ([#1481](https://github.com/open-mmlab/mmsegmentation/pull/1481)) +- Add `build_pos_embed` and `build_layers` for BEiT ([1517](https://github.com/open-mmlab/mmsegmentation/pull/1517)) +- Add `with_cp` to mit and vit ([1431](https://github.com/open-mmlab/mmsegmentation/pull/1431)) +- Fix inconsistent dtype of `seg_label` in stdc decode ([1463](https://github.com/open-mmlab/mmsegmentation/pull/1463)) +- Delete random seed for training in `dist_train.sh` ([1519](https://github.com/open-mmlab/mmsegmentation/pull/1519)) +- Revise high `workers_per_gpus` in config file ([#1506](https://github.com/open-mmlab/mmsegmentation/pull/1506)) +- Add GPG keys and del mmcv version in Dockerfile ([1534](https://github.com/open-mmlab/mmsegmentation/pull/1534)) +- Update checkpoint for model in deeplabv3plus ([#1487](https://github.com/open-mmlab/mmsegmentation/pull/1487)) +- Add `DistSamplerSeedHook` to set epoch number to dataloader when runner is `EpochBasedRunner` ([1449](https://github.com/open-mmlab/mmsegmentation/pull/1449)) +- Provide URLs of Swin Transformer pretrained models ([1389](https://github.com/open-mmlab/mmsegmentation/pull/1389)) +- Updating Dockerfiles From Docker Directory and `get_started.md` to reach latest stable version of Python, PyTorch and MMCV ([1446](https://github.com/open-mmlab/mmsegmentation/pull/1446)) + +**Documentation** + +- Add more clearly statement of CPU training/inference ([1518](https://github.com/open-mmlab/mmsegmentation/pull/1518)) + +**Contributors** + +- @jiangyitong made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1431 +- @kahkeng made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1447 +- @Nourollah made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1446 +- @androbaza made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1452 +- @Yzichen made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1445 +- @whu-pzhang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1423 +- @panfeng-hover made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1417 +- @Johnson-Wang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1496 +- @jere357 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1460 +- @mfernezir made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1494 +- @donglixp made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1503 +- @YuanLiuuuuuu made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1307 +- @Dawn-bin made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1527 + +### V0.23.0 (4/1/2022) + +**Highlights** + +- Support BEiT: BERT Pre-Training of Image Transformers +- Support K-Net: Towards Unified Image Segmentation +- Add `avg_non_ignore` of CELoss to support average loss over non-ignored elements +- Support dataset initialization with file client + +**New Features** + +- Support BEiT: BERT Pre-Training of Image Transformers ([#1404](https://github.com/open-mmlab/mmsegmentation/pull/1404)) +- Support K-Net: Towards Unified Image Segmentation ([#1289](https://github.com/open-mmlab/mmsegmentation/pull/1289)) +- Support dataset initialization with file client ([#1402](https://github.com/open-mmlab/mmsegmentation/pull/1402)) +- Add class name function for STARE datasets ([#1376](https://github.com/open-mmlab/mmsegmentation/pull/1376)) +- Support different seeds on different ranks when distributed training ([#1362](https://github.com/open-mmlab/mmsegmentation/pull/1362)) +- Add `nlc2nchw2nlc` and `nchw2nlc2nchw` to simplify tensor with different dimension operation ([#1249](https://github.com/open-mmlab/mmsegmentation/pull/1249)) + +**Improvements** + +- Synchronize random seed for distributed sampler ([#1411](https://github.com/open-mmlab/mmsegmentation/pull/1411)) +- Add script and documentation for multi-machine distributed training ([#1383](https://github.com/open-mmlab/mmsegmentation/pull/1383)) + +**Bug Fixes** + +- Add `avg_non_ignore` of CELoss to support average loss over non-ignored elements ([#1409](https://github.com/open-mmlab/mmsegmentation/pull/1409)) +- Fix some wrong URLs of models or logs in `./configs` ([#1336](https://github.com/open-mmlab/mmsegmentation/pull/1433)) +- Add title and color theme arguments to plot function in `tools/confusion_matrix.py` ([#1401](https://github.com/open-mmlab/mmsegmentation/pull/1401)) +- Fix outdated link in Colab demo ([#1392](https://github.com/open-mmlab/mmsegmentation/pull/1392)) +- Fix typos ([#1424](https://github.com/open-mmlab/mmsegmentation/pull/1424), [#1405](https://github.com/open-mmlab/mmsegmentation/pull/1405), [#1371](https://github.com/open-mmlab/mmsegmentation/pull/1371), [#1366](https://github.com/open-mmlab/mmsegmentation/pull/1366), [#1363](https://github.com/open-mmlab/mmsegmentation/pull/1363)) + +**Documentation** + +- Add FAQ document ([#1420](https://github.com/open-mmlab/mmsegmentation/pull/1420)) +- Fix the config name style description in official docs([#1414](https://github.com/open-mmlab/mmsegmentation/pull/1414)) + +**Contributors** + +- @kinglintianxia made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1371 +- @CCODING04 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1376 +- @mob5566 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1401 +- @xiongnemo made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1392 +- @Xiangxu-0103 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1405 + +### V0.22.1 (3/9/2022) + +**Bug Fixes** + +- Fix the ZeroDivisionError that all pixels in one image is ignored. ([#1336](https://github.com/open-mmlab/mmsegmentation/pull/1336)) + +**Improvements** + +- Provide URLs of STDC, Segmenter and Twins pretrained models ([#1272](https://github.com/open-mmlab/mmsegmentation/pull/1357)) + +### V0.22 (3/04/2022) + +**Highlights** + +- Support ConvNeXt: A ConvNet for the 2020s. Please use the latest MMClassification (0.21.0) to try it out. +- Support iSAID aerial Dataset. +- Officially Support inference on Windows OS. + +**New Features** + +- Support ConvNeXt: A ConvNet for the 2020s. ([#1216](https://github.com/open-mmlab/mmsegmentation/pull/1216)) +- Support iSAID aerial Dataset. ([#1115](https://github.com/open-mmlab/mmsegmentation/pull/1115) +- Generating and plotting confusion matrix. ([#1301](https://github.com/open-mmlab/mmsegmentation/pull/1301)) + +**Improvements** + +- Refactor 4 decoder heads (ASPP, FCN, PSP, UPer): Split forward function into `_forward_feature` and `cls_seg`. ([#1299](https://github.com/open-mmlab/mmsegmentation/pull/1299)) +- Add `min_size` arg in `Resize` to keep the shape after resize bigger than slide window. ([#1318](https://github.com/open-mmlab/mmsegmentation/pull/1318)) +- Revise pre-commit-hooks. ([#1315](https://github.com/open-mmlab/mmsegmentation/pull/1315)) +- Add win-ci. ([#1296](https://github.com/open-mmlab/mmsegmentation/pull/1296)) + +**Bug Fixes** + +- Fix `mlp_ratio` type in Swin Transformer. ([#1274](https://github.com/open-mmlab/mmsegmentation/pull/1274)) +- Fix path errors in `./demo` . ([#1269](https://github.com/open-mmlab/mmsegmentation/pull/1269)) +- Fix bug in conversion of potsdam. ([#1279](https://github.com/open-mmlab/mmsegmentation/pull/1279)) +- Make accuracy take into account `ignore_index`. ([#1259](https://github.com/open-mmlab/mmsegmentation/pull/1259)) +- Add Pytorch HardSwish assertion in unit test. ([#1294](https://github.com/open-mmlab/mmsegmentation/pull/1294)) +- Fix wrong palette value in vaihingen. ([#1292](https://github.com/open-mmlab/mmsegmentation/pull/1292)) +- Fix the bug that SETR cannot load pretrain. ([#1293](https://github.com/open-mmlab/mmsegmentation/pull/1293)) +- Update correct `In Collection` in metafile of each configs. ([#1239](https://github.com/open-mmlab/mmsegmentation/pull/1239)) +- Upload completed STDC models. ([#1332](https://github.com/open-mmlab/mmsegmentation/pull/1332)) +- Fix `DNLHead` exports onnx inference difference type Cast error. ([#1161](https://github.com/open-mmlab/mmsegmentation/pull/1332)) + +**Contributors** + +- @JiaYanhao made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1269 +- @andife made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1281 +- @SBCV made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1279 +- @HJoonKwon made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1259 +- @Tsingularity made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1290 +- @Waterman0524 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1115 +- @MeowZheng made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1315 +- @linfangjian01 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1318 + +### V0.21.1 (2/9/2022) + +**Bug Fixes** + +- Fix typos in docs. ([#1263](https://github.com/open-mmlab/mmsegmentation/pull/1263)) +- Fix repeating log by `setup_multi_processes`. ([#1267](https://github.com/open-mmlab/mmsegmentation/pull/1267)) +- Upgrade isort in pre-commit hook. ([#1270](https://github.com/open-mmlab/mmsegmentation/pull/1270)) + +**Improvements** + +- Use MMCV load_state_dict func in ViT/Swin. ([#1272](https://github.com/open-mmlab/mmsegmentation/pull/1272)) +- Add exception for PointRend for support CPU-only. ([#1271](https://github.com/open-mmlab/mmsegmentation/pull/1270)) + +### V0.21 (1/29/2022) + +**Highlights** + +- Officially Support CPUs training and inference, please use the latest MMCV (1.4.4) to try it out. +- Support Segmenter: Transformer for Semantic Segmentation (ICCV'2021). +- Support ISPRS Potsdam and Vaihingen Dataset. +- Add Mosaic transform and `MultiImageMixDataset` class in `dataset_wrappers`. + +**New Features** + +- Support Segmenter: Transformer for Semantic Segmentation (ICCV'2021) ([#955](https://github.com/open-mmlab/mmsegmentation/pull/955)) +- Support ISPRS Potsdam and Vaihingen Dataset ([#1097](https://github.com/open-mmlab/mmsegmentation/pull/1097), [#1171](https://github.com/open-mmlab/mmsegmentation/pull/1171)) +- Add segformerโ€˜s benchmark on cityscapes ([#1155](https://github.com/open-mmlab/mmsegmentation/pull/1155)) +- Add auto resume ([#1172](https://github.com/open-mmlab/mmsegmentation/pull/1172)) +- Add Mosaic transform and `MultiImageMixDataset` class in `dataset_wrappers` ([#1093](https://github.com/open-mmlab/mmsegmentation/pull/1093), [#1105](https://github.com/open-mmlab/mmsegmentation/pull/1105)) +- Add log collector ([#1175](https://github.com/open-mmlab/mmsegmentation/pull/1175)) + +**Improvements** + +- New-style CPU training and inference ([#1251](https://github.com/open-mmlab/mmsegmentation/pull/1251)) +- Add UNet benchmark with multiple losses supervision ([#1143](https://github.com/open-mmlab/mmsegmentation/pull/1143)) + +**Bug Fixes** + +- Fix the model statistics in doc for readthedoc ([#1153](https://github.com/open-mmlab/mmsegmentation/pull/1153)) +- Set random seed for `palette` if not given ([#1152](https://github.com/open-mmlab/mmsegmentation/pull/1152)) +- Add `COCOStuffDataset` in `class_names.py` ([#1222](https://github.com/open-mmlab/mmsegmentation/pull/1222)) +- Fix bug in non-distributed multi-gpu training/testing ([#1247](https://github.com/open-mmlab/mmsegmentation/pull/1247)) +- Delete unnecessary lines of STDCHead ([#1231](https://github.com/open-mmlab/mmsegmentation/pull/1231)) + +**Contributors** + +- @jbwang1997 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1152 +- @BeaverCC made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1206 +- @Echo-minn made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1214 +- @rstrudel made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/955 + +### V0.20.2 (12/15/2021) + +**Bug Fixes** + +- Revise --option to --options to avoid BC-breaking. ([#1140](https://github.com/open-mmlab/mmsegmentation/pull/1140)) + +### V0.20.1 (12/14/2021) + +**Improvements** + +- Change options to cfg-options ([#1129](https://github.com/open-mmlab/mmsegmentation/pull/1129)) + +**Bug Fixes** + +- Fix `` in metafile. ([#1127](https://github.com/open-mmlab/mmsegmentation/pull/1127)) +- Fix correct `num_classes` of HRNet in `LoveDA` dataset ([#1136](https://github.com/open-mmlab/mmsegmentation/pull/1136)) + +### V0.20 (12/10/2021) + +**Highlights** + +- Support Twins ([#989](https://github.com/open-mmlab/mmsegmentation/pull/989)) +- Support a real-time segmentation model STDC ([#995](https://github.com/open-mmlab/mmsegmentation/pull/995)) +- Support a widely-used segmentation model in lane detection ERFNet ([#960](https://github.com/open-mmlab/mmsegmentation/pull/960)) +- Support A Remote Sensing Land-Cover Dataset LoveDA ([#1028](https://github.com/open-mmlab/mmsegmentation/pull/1028)) +- Support focal loss ([#1024](https://github.com/open-mmlab/mmsegmentation/pull/1024)) + +**New Features** + +- Support Twins ([#989](https://github.com/open-mmlab/mmsegmentation/pull/989)) +- Support a real-time segmentation model STDC ([#995](https://github.com/open-mmlab/mmsegmentation/pull/995)) +- Support a widely-used segmentation model in lane detection ERFNet ([#960](https://github.com/open-mmlab/mmsegmentation/pull/960)) +- Add SETR cityscapes benchmark ([#1087](https://github.com/open-mmlab/mmsegmentation/pull/1087)) +- Add BiSeNetV1 COCO-Stuff 164k benchmark ([#1019](https://github.com/open-mmlab/mmsegmentation/pull/1019)) +- Support focal loss ([#1024](https://github.com/open-mmlab/mmsegmentation/pull/1024)) +- Add Cutout transform ([#1022](https://github.com/open-mmlab/mmsegmentation/pull/1022)) + +**Improvements** + +- Set a random seed when the user does not set a seed ([#1039](https://github.com/open-mmlab/mmsegmentation/pull/1039)) +- Add CircleCI setup ([#1086](https://github.com/open-mmlab/mmsegmentation/pull/1086)) +- Skip CI on ignoring given paths ([#1078](https://github.com/open-mmlab/mmsegmentation/pull/1078)) +- Add abstract and image for every paper ([#1060](https://github.com/open-mmlab/mmsegmentation/pull/1060)) +- Create a symbolic link on windows ([#1090](https://github.com/open-mmlab/mmsegmentation/pull/1090)) +- Support video demo using trained model ([#1014](https://github.com/open-mmlab/mmsegmentation/pull/1014)) + +**Bug Fixes** + +- Fix incorrectly loading init_cfg or pretrained models of several transformer models ([#999](https://github.com/open-mmlab/mmsegmentation/pull/999), [#1069](https://github.com/open-mmlab/mmsegmentation/pull/1069), [#1102](https://github.com/open-mmlab/mmsegmentation/pull/1102)) +- Fix EfficientMultiheadAttention in SegFormer ([#1037](https://github.com/open-mmlab/mmsegmentation/pull/1037)) +- Remove `fp16` folder in `configs` ([#1031](https://github.com/open-mmlab/mmsegmentation/pull/1031)) +- Fix several typos in .yml file (Dice Metric [#1041](https://github.com/open-mmlab/mmsegmentation/pull/1041), ADE20K dataset [#1120](https://github.com/open-mmlab/mmsegmentation/pull/1120), Training Memory (GB) [#1083](https://github.com/open-mmlab/mmsegmentation/pull/1083)) +- Fix test error when using `--show-dir` ([#1091](https://github.com/open-mmlab/mmsegmentation/pull/1091)) +- Fix dist training infinite waiting issue ([#1035](https://github.com/open-mmlab/mmsegmentation/pull/1035)) +- Change the upper version of mmcv to 1.5.0 ([#1096](https://github.com/open-mmlab/mmsegmentation/pull/1096)) +- Fix symlink failure on Windows ([#1038](https://github.com/open-mmlab/mmsegmentation/pull/1038)) +- Cancel previous runs that are not completed ([#1118](https://github.com/open-mmlab/mmsegmentation/pull/1118)) +- Unified links of readthedocs in docs ([#1119](https://github.com/open-mmlab/mmsegmentation/pull/1119)) + +**Contributors** + +- @Junjue-Wang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1028 +- @ddebby made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1066 +- @del-zhenwu made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1078 +- @KangBK0120 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1106 +- @zergzzlun made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1091 +- @fingertap made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1035 +- @irvingzhang0512 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1014 +- @littleSunlxy made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/989 +- @lkm2835 +- @RockeyCoss +- @MengzhangLI +- @Junjun2016 +- @xiexinch +- @xvjiarui + +### V0.19 (11/02/2021) + +**Highlights** + +- Support TIMMBackbone wrapper ([#998](https://github.com/open-mmlab/mmsegmentation/pull/998)) +- Support custom hook ([#428](https://github.com/open-mmlab/mmsegmentation/pull/428)) +- Add codespell pre-commit hook ([#920](https://github.com/open-mmlab/mmsegmentation/pull/920)) +- Add FastFCN benchmark on ADE20K ([#972](https://github.com/open-mmlab/mmsegmentation/pull/972)) + +**New Features** + +- Support TIMMBackbone wrapper ([#998](https://github.com/open-mmlab/mmsegmentation/pull/998)) +- Support custom hook ([#428](https://github.com/open-mmlab/mmsegmentation/pull/428)) +- Add FastFCN benchmark on ADE20K ([#972](https://github.com/open-mmlab/mmsegmentation/pull/972)) +- Add codespell pre-commit hook and fix typos ([#920](https://github.com/open-mmlab/mmsegmentation/pull/920)) + +**Improvements** + +- Make inputs & channels smaller in unittests ([#1004](https://github.com/open-mmlab/mmsegmentation/pull/1004)) +- Change `self.loss_decode` back to `dict` in Single Loss situation ([#1002](https://github.com/open-mmlab/mmsegmentation/pull/1002)) + +**Bug Fixes** + +- Fix typo in usage example ([#1003](https://github.com/open-mmlab/mmsegmentation/pull/1003)) +- Add contiguous after permutation in ViT ([#992](https://github.com/open-mmlab/mmsegmentation/pull/992)) +- Fix the invalid link ([#985](https://github.com/open-mmlab/mmsegmentation/pull/985)) +- Fix bug in CI with python 3.9 ([#994](https://github.com/open-mmlab/mmsegmentation/pull/994)) +- Fix bug when loading class name form file in custom dataset ([#923](https://github.com/open-mmlab/mmsegmentation/pull/923)) + +**Contributors** + +- @ShoupingShan made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/923 +- @RockeyCoss made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/954 +- @HarborYuan made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/992 +- @lkm2835 made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/1003 +- @gszh made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/428 +- @VVsssssk +- @MengzhangLI +- @Junjun2016 + +### V0.18 (10/07/2021) + +**Highlights** + +- Support three real-time segmentation models (ICNet [#884](https://github.com/open-mmlab/mmsegmentation/pull/884), BiSeNetV1 [#851](https://github.com/open-mmlab/mmsegmentation/pull/851), and BiSeNetV2 [#804](https://github.com/open-mmlab/mmsegmentation/pull/804)) +- Support one efficient segmentation model (FastFCN [#885](https://github.com/open-mmlab/mmsegmentation/pull/885)) +- Support one efficient non-local/self-attention based segmentation model (ISANet [#70](https://github.com/open-mmlab/mmsegmentation/pull/70)) +- Support COCO-Stuff 10k and 164k datasets ([#625](https://github.com/open-mmlab/mmsegmentation/pull/625)) +- Support evaluate concated dataset separately ([#833](https://github.com/open-mmlab/mmsegmentation/pull/833)) +- Support loading GT for evaluation from multi-file backend ([#867](https://github.com/open-mmlab/mmsegmentation/pull/867)) + +**New Features** + +- Support three real-time segmentation models (ICNet [#884](https://github.com/open-mmlab/mmsegmentation/pull/884), BiSeNetV1 [#851](https://github.com/open-mmlab/mmsegmentation/pull/851), and BiSeNetV2 [#804](https://github.com/open-mmlab/mmsegmentation/pull/804)) +- Support one efficient segmentation model (FastFCN [#885](https://github.com/open-mmlab/mmsegmentation/pull/885)) +- Support one efficient non-local/self-attention based segmentation model (ISANet [#70](https://github.com/open-mmlab/mmsegmentation/pull/70)) +- Support COCO-Stuff 10k and 164k datasets ([#625](https://github.com/open-mmlab/mmsegmentation/pull/625)) +- Support evaluate concated dataset separately ([#833](https://github.com/open-mmlab/mmsegmentation/pull/833)) + +**Improvements** + +- Support loading GT for evaluation from multi-file backend ([#867](https://github.com/open-mmlab/mmsegmentation/pull/867)) +- Auto-convert SyncBN to BN when training on DP automatly([#772](https://github.com/open-mmlab/mmsegmentation/pull/772)) +- Refactor Swin-Transformer ([#800](https://github.com/open-mmlab/mmsegmentation/pull/800)) + +**Bug Fixes** + +- Update mmcv installation in dockerfile ([#860](https://github.com/open-mmlab/mmsegmentation/pull/860)) +- Fix number of iteration bug when resuming checkpoint in distributed train ([#866](https://github.com/open-mmlab/mmsegmentation/pull/866)) +- Fix parsing parse in val_step ([#906](https://github.com/open-mmlab/mmsegmentation/pull/906)) + +### V0.17 (09/01/2021) + +**Highlights** + +- Support SegFormer +- Support DPT +- Support Dark Zurich and Nighttime Driving datasets +- Support progressive evaluation + +**New Features** + +- Support SegFormer ([#599](https://github.com/open-mmlab/mmsegmentation/pull/599)) +- Support DPT ([#605](https://github.com/open-mmlab/mmsegmentation/pull/605)) +- Support Dark Zurich and Nighttime Driving datasets ([#815](https://github.com/open-mmlab/mmsegmentation/pull/815)) +- Support progressive evaluation ([#709](https://github.com/open-mmlab/mmsegmentation/pull/709)) + +**Improvements** + +- Add multiscale_output interface and unittests for HRNet ([#830](https://github.com/open-mmlab/mmsegmentation/pull/830)) +- Support inherit cityscapes dataset ([#750](https://github.com/open-mmlab/mmsegmentation/pull/750)) +- Fix some typos in README.md ([#824](https://github.com/open-mmlab/mmsegmentation/pull/824)) +- Delete convert function and add instruction to ViT/Swin README.md ([#791](https://github.com/open-mmlab/mmsegmentation/pull/791)) +- Add vit/swin/mit convert weight scripts ([#783](https://github.com/open-mmlab/mmsegmentation/pull/783)) +- Add copyright files ([#796](https://github.com/open-mmlab/mmsegmentation/pull/796)) + +**Bug Fixes** + +- Fix invalid checkpoint link in inference_demo.ipynb ([#814](https://github.com/open-mmlab/mmsegmentation/pull/814)) +- Ensure that items in dataset have the same order across multi machine ([#780](https://github.com/open-mmlab/mmsegmentation/pull/780)) +- Fix the log error ([#766](https://github.com/open-mmlab/mmsegmentation/pull/766)) + +### V0.16 (08/04/2021) + +**Highlights** + +- Support PyTorch 1.9 +- Support SegFormer backbone MiT +- Support md2yml pre-commit hook +- Support frozen stage for HRNet + +**New Features** + +- Support SegFormer backbone MiT ([#594](https://github.com/open-mmlab/mmsegmentation/pull/594)) +- Support md2yml pre-commit hook ([#732](https://github.com/open-mmlab/mmsegmentation/pull/732)) +- Support mim ([#717](https://github.com/open-mmlab/mmsegmentation/pull/717)) +- Add mmseg2torchserve tool ([#552](https://github.com/open-mmlab/mmsegmentation/pull/552)) + +**Improvements** + +- Support hrnet frozen stage ([#743](https://github.com/open-mmlab/mmsegmentation/pull/743)) +- Add template of reimplementation questions ([#741](https://github.com/open-mmlab/mmsegmentation/pull/741)) +- Output pdf and epub formats for readthedocs ([#742](https://github.com/open-mmlab/mmsegmentation/pull/742)) +- Refine the docstring of ResNet ([#723](https://github.com/open-mmlab/mmsegmentation/pull/723)) +- Replace interpolate with resize ([#731](https://github.com/open-mmlab/mmsegmentation/pull/731)) +- Update resource limit ([#700](https://github.com/open-mmlab/mmsegmentation/pull/700)) +- Update config.md ([#678](https://github.com/open-mmlab/mmsegmentation/pull/678)) + +**Bug Fixes** + +- Fix ATTENTION registry ([#729](https://github.com/open-mmlab/mmsegmentation/pull/729)) +- Fix analyze log script ([#716](https://github.com/open-mmlab/mmsegmentation/pull/716)) +- Fix doc api display ([#725](https://github.com/open-mmlab/mmsegmentation/pull/725)) +- Fix patch_embed and pos_embed mismatch error ([#685](https://github.com/open-mmlab/mmsegmentation/pull/685)) +- Fix efficient test for multi-node ([#707](https://github.com/open-mmlab/mmsegmentation/pull/707)) +- Fix init_cfg in resnet backbone ([#697](https://github.com/open-mmlab/mmsegmentation/pull/697)) +- Fix efficient test bug ([#702](https://github.com/open-mmlab/mmsegmentation/pull/702)) +- Fix url error in config docs ([#680](https://github.com/open-mmlab/mmsegmentation/pull/680)) +- Fix mmcv installation ([#676](https://github.com/open-mmlab/mmsegmentation/pull/676)) +- Fix torch version ([#670](https://github.com/open-mmlab/mmsegmentation/pull/670)) + +**Contributors** + +@sshuair @xiexinch @Junjun2016 @mmeendez8 @xvjiarui @sennnnn @puhsu @BIGWangYuDong @keke1u @daavoo + +### V0.15 (07/04/2021) + +**Highlights** + +- Support ViT, SETR, and Swin-Transformer +- Add Chinese documentation +- Unified parameter initialization + +**Bug Fixes** + +- Fix typo and links ([#608](https://github.com/open-mmlab/mmsegmentation/pull/608)) +- Fix Dockerfile ([#607](https://github.com/open-mmlab/mmsegmentation/pull/607)) +- Fix ViT init ([#609](https://github.com/open-mmlab/mmsegmentation/pull/609)) +- Fix mmcv version compatible table ([#658](https://github.com/open-mmlab/mmsegmentation/pull/658)) +- Fix model links of DMNEt ([#660](https://github.com/open-mmlab/mmsegmentation/pull/660)) + +**New Features** + +- Support loading DeiT weights ([#538](https://github.com/open-mmlab/mmsegmentation/pull/538)) +- Support SETR ([#531](https://github.com/open-mmlab/mmsegmentation/pull/531), [#635](https://github.com/open-mmlab/mmsegmentation/pull/635)) +- Add config and models for ViT backbone with UperHead ([#520](https://github.com/open-mmlab/mmsegmentation/pull/531), [#635](https://github.com/open-mmlab/mmsegmentation/pull/520)) +- Support Swin-Transformer ([#511](https://github.com/open-mmlab/mmsegmentation/pull/511)) +- Add higher accuracy FastSCNN ([#606](https://github.com/open-mmlab/mmsegmentation/pull/606)) +- Add Chinese documentation ([#666](https://github.com/open-mmlab/mmsegmentation/pull/666)) + +**Improvements** + +- Unified parameter initialization ([#567](https://github.com/open-mmlab/mmsegmentation/pull/567)) +- Separate CUDA and CPU in github action CI ([#602](https://github.com/open-mmlab/mmsegmentation/pull/602)) +- Support persistent dataloader worker ([#646](https://github.com/open-mmlab/mmsegmentation/pull/646)) +- Update meta file fields ([#661](https://github.com/open-mmlab/mmsegmentation/pull/661), [#664](https://github.com/open-mmlab/mmsegmentation/pull/664)) + +### V0.14 (06/02/2021) + +**Highlights** + +- Support ONNX to TensorRT +- Support MIM + +**Bug Fixes** + +- Fix ONNX to TensorRT verify ([#547](https://github.com/open-mmlab/mmsegmentation/pull/547)) +- Fix save best for EvalHook ([#575](https://github.com/open-mmlab/mmsegmentation/pull/575)) + +**New Features** + +- Support loading DeiT weights ([#538](https://github.com/open-mmlab/mmsegmentation/pull/538)) +- Support ONNX to TensorRT ([#542](https://github.com/open-mmlab/mmsegmentation/pull/542)) +- Support output results for ADE20k ([#544](https://github.com/open-mmlab/mmsegmentation/pull/544)) +- Support MIM ([#549](https://github.com/open-mmlab/mmsegmentation/pull/549)) + +**Improvements** + +- Add option for ViT output shape ([#530](https://github.com/open-mmlab/mmsegmentation/pull/530)) +- Infer batch size using len(result) ([#532](https://github.com/open-mmlab/mmsegmentation/pull/532)) +- Add compatible table between MMSeg and MMCV ([#558](https://github.com/open-mmlab/mmsegmentation/pull/558)) + +### V0.13 (05/05/2021) + +**Highlights** + +- Support Pascal Context Class-59 dataset. +- Support Visual Transformer Backbone. +- Support mFscore metric. + +**Bug Fixes** + +- Fixed Colaboratory tutorial ([#451](https://github.com/open-mmlab/mmsegmentation/pull/451)) +- Fixed mIoU calculation range ([#471](https://github.com/open-mmlab/mmsegmentation/pull/471)) +- Fixed sem_fpn, unet README.md ([#492](https://github.com/open-mmlab/mmsegmentation/pull/492)) +- Fixed `num_classes` in FCN for Pascal Context 60-class dataset ([#488](https://github.com/open-mmlab/mmsegmentation/pull/488)) +- Fixed FP16 inference ([#497](https://github.com/open-mmlab/mmsegmentation/pull/497)) + +**New Features** + +- Support dynamic export and visualize to pytorch2onnx ([#463](https://github.com/open-mmlab/mmsegmentation/pull/463)) +- Support export to torchscript ([#469](https://github.com/open-mmlab/mmsegmentation/pull/469), [#499](https://github.com/open-mmlab/mmsegmentation/pull/499)) +- Support Pascal Context Class-59 dataset ([#459](https://github.com/open-mmlab/mmsegmentation/pull/459)) +- Support Visual Transformer backbone ([#465](https://github.com/open-mmlab/mmsegmentation/pull/465)) +- Support UpSample Neck ([#512](https://github.com/open-mmlab/mmsegmentation/pull/512)) +- Support mFscore metric ([#509](https://github.com/open-mmlab/mmsegmentation/pull/509)) + +**Improvements** + +- Add more CI for PyTorch ([#460](https://github.com/open-mmlab/mmsegmentation/pull/460)) +- Add print model graph args for tools/print_config.py ([#451](https://github.com/open-mmlab/mmsegmentation/pull/451)) +- Add cfg links in modelzoo README.md ([#468](https://github.com/open-mmlab/mmsegmentation/pull/469)) +- Add BaseSegmentor import to segmentors/__init__.py ([#495](https://github.com/open-mmlab/mmsegmentation/pull/495)) +- Add MMOCR, MMGeneration links ([#501](https://github.com/open-mmlab/mmsegmentation/pull/501), [#506](https://github.com/open-mmlab/mmsegmentation/pull/506)) +- Add Chinese QR code ([#506](https://github.com/open-mmlab/mmsegmentation/pull/506)) +- Use MMCV MODEL_REGISTRY ([#515](https://github.com/open-mmlab/mmsegmentation/pull/515)) +- Add ONNX testing tools ([#498](https://github.com/open-mmlab/mmsegmentation/pull/498)) +- Replace data_dict calling 'img' key to support MMDet3D ([#514](https://github.com/open-mmlab/mmsegmentation/pull/514)) +- Support reading class_weight from file in loss function ([#513](https://github.com/open-mmlab/mmsegmentation/pull/513)) +- Make tags as comment ([#505](https://github.com/open-mmlab/mmsegmentation/pull/505)) +- Use MMCV EvalHook ([#438](https://github.com/open-mmlab/mmsegmentation/pull/438)) + +### V0.12 (04/03/2021) + +**Highlights** + +- Support FCN-Dilate 6 model. +- Support Dice Loss. + +**Bug Fixes** + +- Fixed PhotoMetricDistortion Doc ([#388](https://github.com/open-mmlab/mmsegmentation/pull/388)) +- Fixed install scripts ([#399](https://github.com/open-mmlab/mmsegmentation/pull/399)) +- Fixed Dice Loss multi-class ([#417](https://github.com/open-mmlab/mmsegmentation/pull/417)) + +**New Features** + +- Support Dice Loss ([#396](https://github.com/open-mmlab/mmsegmentation/pull/396)) +- Add plot logs tool ([#426](https://github.com/open-mmlab/mmsegmentation/pull/426)) +- Add opacity option to show_result ([#425](https://github.com/open-mmlab/mmsegmentation/pull/425)) +- Speed up mIoU metric ([#430](https://github.com/open-mmlab/mmsegmentation/pull/430)) + +**Improvements** + +- Refactor unittest file structure ([#440](https://github.com/open-mmlab/mmsegmentation/pull/440)) +- Fix typos in the repo ([#449](https://github.com/open-mmlab/mmsegmentation/pull/449)) +- Include class-level metrics in the log ([#445](https://github.com/open-mmlab/mmsegmentation/pull/445)) + +### V0.11 (02/02/2021) + +**Highlights** + +- Support memory efficient test, add more UNet models. + +**Bug Fixes** + +- Fixed TTA resize scale ([#334](https://github.com/open-mmlab/mmsegmentation/pull/334)) +- Fixed CI for pip 20.3 ([#307](https://github.com/open-mmlab/mmsegmentation/pull/307)) +- Fixed ADE20k test ([#359](https://github.com/open-mmlab/mmsegmentation/pull/359)) + +**New Features** + +- Support memory efficient test ([#330](https://github.com/open-mmlab/mmsegmentation/pull/330)) +- Add more UNet benchmarks ([#324](https://github.com/open-mmlab/mmsegmentation/pull/324)) +- Support Lovasz Loss ([#351](https://github.com/open-mmlab/mmsegmentation/pull/351)) + +**Improvements** + +- Move train_cfg/test_cfg inside model ([#341](https://github.com/open-mmlab/mmsegmentation/pull/341)) + +### V0.10 (01/01/2021) + +**Highlights** + +- Support MobileNetV3, DMNet, APCNet. Add models of ResNet18V1b, ResNet18V1c, ResNet50V1b. + +**Bug Fixes** + +- Fixed CPU TTA ([#276](https://github.com/open-mmlab/mmsegmentation/pull/276)) +- Fixed CI for pip 20.3 ([#307](https://github.com/open-mmlab/mmsegmentation/pull/307)) + +**New Features** + +- Add ResNet18V1b, ResNet18V1c, ResNet50V1b, ResNet101V1b models ([#316](https://github.com/open-mmlab/mmsegmentation/pull/316)) +- Support MobileNetV3 ([#268](https://github.com/open-mmlab/mmsegmentation/pull/268)) +- Add 4 retinal vessel segmentation benchmark ([#315](https://github.com/open-mmlab/mmsegmentation/pull/315)) +- Support DMNet ([#313](https://github.com/open-mmlab/mmsegmentation/pull/313)) +- Support APCNet ([#299](https://github.com/open-mmlab/mmsegmentation/pull/299)) + +**Improvements** + +- Refactor Documentation page ([#311](https://github.com/open-mmlab/mmsegmentation/pull/311)) +- Support resize data augmentation according to original image size ([#291](https://github.com/open-mmlab/mmsegmentation/pull/291)) + +### V0.9 (30/11/2020) + +**Highlights** + +- Support 4 medical dataset, UNet and CGNet. + +**New Features** + +- Support RandomRotate transform ([#215](https://github.com/open-mmlab/mmsegmentation/pull/215), [#260](https://github.com/open-mmlab/mmsegmentation/pull/260)) +- Support RGB2Gray transform ([#227](https://github.com/open-mmlab/mmsegmentation/pull/227)) +- Support Rerange transform ([#228](https://github.com/open-mmlab/mmsegmentation/pull/228)) +- Support ignore_index for BCE loss ([#210](https://github.com/open-mmlab/mmsegmentation/pull/210)) +- Add modelzoo statistics ([#263](https://github.com/open-mmlab/mmsegmentation/pull/263)) +- Support Dice evaluation metric ([#225](https://github.com/open-mmlab/mmsegmentation/pull/225)) +- Support Adjust Gamma transform ([#232](https://github.com/open-mmlab/mmsegmentation/pull/232)) +- Support CLAHE transform ([#229](https://github.com/open-mmlab/mmsegmentation/pull/229)) + +**Bug Fixes** + +- Fixed detail API link ([#267](https://github.com/open-mmlab/mmsegmentation/pull/267)) + +### V0.8 (03/11/2020) + +**Highlights** + +- Support 4 medical dataset, UNet and CGNet. + +**New Features** + +- Support customize runner ([#118](https://github.com/open-mmlab/mmsegmentation/pull/118)) +- Support UNet ([#161](https://github.com/open-mmlab/mmsegmentation/pull/162)) +- Support CHASE_DB1, DRIVE, STARE, HRD ([#203](https://github.com/open-mmlab/mmsegmentation/pull/203)) +- Support CGNet ([#223](https://github.com/open-mmlab/mmsegmentation/pull/223)) + +### V0.7 (07/10/2020) + +**Highlights** + +- Support Pascal Context dataset and customizing class dataset. + +**Bug Fixes** + +- Fixed CPU inference ([#153](https://github.com/open-mmlab/mmsegmentation/pull/153)) + +**New Features** + +- Add DeepLab OS16 models ([#154](https://github.com/open-mmlab/mmsegmentation/pull/154)) +- Support Pascal Context dataset ([#133](https://github.com/open-mmlab/mmsegmentation/pull/133)) +- Support customizing dataset classes ([#71](https://github.com/open-mmlab/mmsegmentation/pull/71)) +- Support customizing dataset palette ([#157](https://github.com/open-mmlab/mmsegmentation/pull/157)) + +**Improvements** + +- Support 4D tensor output in ONNX ([#150](https://github.com/open-mmlab/mmsegmentation/pull/150)) +- Remove redundancies in ONNX export ([#160](https://github.com/open-mmlab/mmsegmentation/pull/160)) +- Migrate to MMCV DepthwiseSeparableConv ([#158](https://github.com/open-mmlab/mmsegmentation/pull/158)) +- Migrate to MMCV collect_env ([#137](https://github.com/open-mmlab/mmsegmentation/pull/137)) +- Use img_prefix and seg_prefix for loading ([#153](https://github.com/open-mmlab/mmsegmentation/pull/153)) + +### V0.6 (10/09/2020) + +**Highlights** + +- Support new methods i.e. MobileNetV2, EMANet, DNL, PointRend, Semantic FPN, Fast-SCNN, ResNeSt. + +**Bug Fixes** + +- Fixed sliding inference ONNX export ([#90](https://github.com/open-mmlab/mmsegmentation/pull/90)) + +**New Features** + +- Support MobileNet v2 ([#86](https://github.com/open-mmlab/mmsegmentation/pull/86)) +- Support EMANet ([#34](https://github.com/open-mmlab/mmsegmentation/pull/34)) +- Support DNL ([#37](https://github.com/open-mmlab/mmsegmentation/pull/37)) +- Support PointRend ([#109](https://github.com/open-mmlab/mmsegmentation/pull/109)) +- Support Semantic FPN ([#94](https://github.com/open-mmlab/mmsegmentation/pull/94)) +- Support Fast-SCNN ([#58](https://github.com/open-mmlab/mmsegmentation/pull/58)) +- Support ResNeSt backbone ([#47](https://github.com/open-mmlab/mmsegmentation/pull/47)) +- Support ONNX export (experimental) ([#12](https://github.com/open-mmlab/mmsegmentation/pull/12)) + +**Improvements** + +- Support Upsample in ONNX ([#100](https://github.com/open-mmlab/mmsegmentation/pull/100)) +- Support Windows install (experimental) ([#75](https://github.com/open-mmlab/mmsegmentation/pull/75)) +- Add more OCRNet results ([#20](https://github.com/open-mmlab/mmsegmentation/pull/20)) +- Add PyTorch 1.6 CI ([#64](https://github.com/open-mmlab/mmsegmentation/pull/64)) +- Get version and githash automatically ([#55](https://github.com/open-mmlab/mmsegmentation/pull/55)) + +### v0.5.1 (11/08/2020) + +**Highlights** + +- Support FP16 and more generalized OHEM + +**Bug Fixes** + +- Fixed Pascal VOC conversion script (#19) +- Fixed OHEM weight assign bug (#54) +- Fixed palette type when palette is not given (#27) + +**New Features** + +- Support FP16 (#21) +- Generalized OHEM (#54) + +**Improvements** + +- Add load-from flag (#33) +- Fixed training tricks doc about different learning rates of model (#26) diff --git a/mmsegmentation/docs/en/notes/faq.md b/mmsegmentation/docs/en/notes/faq.md new file mode 100644 index 0000000..a3f8099 --- /dev/null +++ b/mmsegmentation/docs/en/notes/faq.md @@ -0,0 +1,132 @@ +# Frequently Asked Questions (FAQ) + +We list some common troubles faced by many users and their corresponding solutions here. Feel free to enrich the list if you find any frequent issues and have ways to help others to solve them. If the contents here do not cover your issue, please create an issue using the [provided templates](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/.github/ISSUE_TEMPLATE/error-report.md/) and make sure you fill in all required information in the template. + +## Installation + +The compatible MMSegmentation, MMCV and MMEngine versions are as below. Please install the correct versions of them to avoid installation issues. + +| MMSegmentation version | MMCV version | MMEngine version | MMClassification (optional) version | MMDetection (optional) version | +| :--------------------: | :----------------------------: | :---------------: | :---------------------------------: | :----------------------------: | +| dev-1.x branch | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| main branch | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.2.2 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.2.1 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.2.0 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.1.2 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.1.1 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.1.0 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.0.0 | mmcv >= 2.0.0rc4 | MMEngine >= 0.7.1 | mmcls==1.0.0rc6 | mmdet >= 3.0.0 | +| 1.0.0rc6 | mmcv >= 2.0.0rc4 | MMEngine >= 0.5.0 | mmcls>=1.0.0rc0 | mmdet >= 3.0.0rc6 | +| 1.0.0rc5 | mmcv >= 2.0.0rc4 | MMEngine >= 0.2.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc6 | +| 1.0.0rc4 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | +| 1.0.0rc3 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | +| 1.0.0rc2 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | +| 1.0.0rc1 | mmcv >= 2.0.0rc1, \<=2.0.0rc3> | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | Not required | +| 1.0.0rc0 | mmcv >= 2.0.0rc1, \<=2.0.0rc3> | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | Not required | + +Notes: + +- MMClassification and MMDetatction are optional for MMSegmentation. If you didn't install them, `ConvNeXt` (required MMClassification) and MaskFormer, Mask2Former (required MMDetection) cannot be used. We recommend to install them with source code. Please refer to [MMClasssication](https://github.com/open-mmlab/mmclassification) and [MMDetection](https://github.com/open-mmlab/mmdetection) for more details about their installation. + +- To install MMSegmentation 0.x and master branch, please refer to [the faq 0.x document](https://mmsegmentation.readthedocs.io/en/latest/faq.html#installation) to check compatible versions of MMCV. + +- If you have installed an incompatible version of mmcv, please run `pip uninstall mmcv` to uninstall the installed mmcv first. If you have previously installed mmcv-full (which exists in OpenMMLab 1.x), please run `pip uninstall mmcv-full` to uninstall it. + +- If "No module named 'mmcv'" appears, please follow the steps below; + + 1. Use `pip uninstall mmcv` to uninstall the existing mmcv in the environment. + 2. Install the corresponding mmcv according to the [installation instructions](https://mmsegmentation.readthedocs.io/en/dev-1.x/get_started.html#best-practices). + +## How to know the number of GPUs needed to train the model + +- Infer from the name of the config file of the model. You can refer to the `Config Name Style` part of [Learn about Configs](../user_guides/1_config.md). For example, for config file with name `segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py`, `8xb1` means training the model corresponding to it needs 8 GPUs, and the batch size of each GPU is 1. +- Infer from the log file. Open the log file of the model and search `nGPU` in the file. The number of figures following `nGPU` is the number of GPUs needed to train the model. For instance, searching for `nGPU` in the log file yields the record `nGPU 0,1,2,3,4,5,6,7`, which indicates that eight GPUs are needed to train the model. + +## What does the auxiliary head mean + +Briefly, it is a deep supervision trick to improve the accuracy. In the training phase, `decode_head` is for decoding semantic segmentation output, `auxiliary_head` is just adding an auxiliary loss, the segmentation result produced by it has no impact to your model's result, it just works in training. You may read this [paper](https://arxiv.org/pdf/1612.01105.pdf) for more information. + +## How to output the segmentation mask image when running the test script + +In the test script, we provide `--out` argument to control whether output the painted images. Users might run the following command: + +```shell +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --out ${OUTPUT_DIR} +``` + +## How to handle binary segmentation task + +MMSegmentation uses `num_classes` and `out_channels` to control output of last layer `self.conv_seg`. More details could be found [here](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/decode_heads/decode_head.py). + +`num_classes` should be the same as number of types of labels, in binary segmentation task, dataset only has two types of labels: foreground and background, so `num_classes=2`. `out_channels` controls the output channel of last layer of model, it usually equals to `num_classes`. +But in binary segmentation task, there are two solutions: + +- Set `out_channels=2`, using Cross Entropy Loss in training, using `F.softmax()` and `argmax()` to get prediction of each pixel in inference. + +- Set `out_channels=1`, using Binary Cross Entropy Loss in training, using `F.sigmoid()` and `threshold` to get prediction of each pixel in inference. `threshold` is set 0.3 as default. + +In summary, to implement binary segmentation methods users should modify below parameters in the `decode_head` and `auxiliary_head` configs. Here is a modification example of [pspnet_unet_s5-d16.py](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/_base_/models/pspnet_unet_s5-d16.py): + +- (1) `num_classes=2`, `out_channels=2` and `use_sigmoid=False` in `CrossEntropyLoss`. + +```python +decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + num_classes=2, + out_channels=2, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + num_classes=2, + out_channels=2, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), +``` + +- (2) `num_classes=2`, `out_channels=1` and `use_sigmoid=True` in `CrossEntropyLoss`. + +```python +decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + num_classes=2, + out_channels=1, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), +auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + num_classes=2, + out_channels=1, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), +``` + +## Functionality of `reduce_zero_label` + +The parameter type of `reduce_zero_label` in dataset is Boolean, which is default to False. It is used to ignore the dataset label 0. The specific method is to change label 0 to 255, and subtract 1 from the corresponding number of all the remaining labels. At the same time, set 255 as ignore index in the decode head, which means that it will not participate in the loss calculation. + +Following is the specific implementation logic of `reduce_zero_label`: + +```python +if self.reduce_zero_label: + # avoid using underflow conversion + gt_semantic_seg[gt_semantic_seg == 0] = 255 + gt_semantic_seg = gt_semantic_seg - 1 + gt_semantic_seg[gt_semantic_seg == 254] = 255 +``` + +Whether your dataset needs to use `reduce_zero_label`, there are two types of situations: + +- On [Potsdam](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/user_guides/2_dataset_prepare.md#isprs-potsdam) dataset, there are six classes: 0-Impervious surfaces, 1-Building, 2-Low vegetation, 3-Tree, 4-Car, 5-Clutter/background. However, this dataset provides two types of RGB labels, one with black pixels at the edges of the images, and the other without. For labels with black edges, in [dataset_converters.py](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/tools/dataset_converters/potsdam.py), it converts the black edges to label 0, and the other labels are 1-Impervious surfaces, 2-Building, 3-Low vegetation, 4-Tree, 5-Car, 6-Clutter/background. Therefore, in the dataset config [potsdam.py](https://github.com/open-mmlab/mmsegmentation/blob/ff95416c3b5ce8d62b9289f743531398efce534f/mmseg/datasets/potsdam.py#L23) `reduce_zero_label=True`ใ€‚ If you are using labels without black edges, then there are only class 0-5 in the mask label. At this point, you should use `reduce_zero_label=False`. `reduce_zero_label` usage needs to be considered with your actual situation. +- On a dataset with class 0 as the background class, if you need to separate the background from the rest of your classes ultimately then you do not need to use `reduce_zero_label`, which in the dataset config settings should be `reduce_zero_label=False` + +**Note:** Please confirm the number of original classes in the dataset. If there are only two classes, you should not use `reduce_zero_label` which is `reduce_zero_label=False`. diff --git a/mmsegmentation/docs/en/overview.md b/mmsegmentation/docs/en/overview.md new file mode 100644 index 0000000..bbc0b8e --- /dev/null +++ b/mmsegmentation/docs/en/overview.md @@ -0,0 +1,85 @@ +# Overview + +This chapter introduces you to the framework of MMSegmentation, and the basic conception of semantic segmentation. It also provides links to detailed tutorials about MMSegmentation. + +## What is semantic segmentation? + +Semantic segmentation is the task of clustering parts of an image together that belong to the same object class. +It is a form of pixel-level prediction because each pixel in an image is classified according to a category. +Some example benchmarks for this task are [Cityscapes](https://www.cityscapes-dataset.com/benchmarks/), [PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/) and [ADE20K](https://groups.csail.mit.edu/vision/datasets/ADE20K/). +Models are usually evaluated with the Mean Intersection-Over-Union (Mean IoU) and Pixel Accuracy metrics. + +## What is MMSegmentation? + +MMSegmentation is a toolbox that provides a framework for unified implementation and evaluation of semant +ic segmentation methods, +and contains high-quality implementations of popular semantic segmentation methods and datasets. + +MMSeg consists of 7 main parts including apis, structures, datasets, models, engine, evaluation and visualization. + +- **apis** provides high-level APIs for model inference. + +- **structures** provides segmentation data structure `SegDataSample`. + +- **datasets** supports various datasets for semantic segmentation. + + - **transforms** contains a lot of useful data augmentation transforms. + +- **models** is the most vital part for segmentors and contains different components of a segmentor. + + - **segmentors** defines all of the segmentation model classes. + - **data_preprocessors** works for preprocessing the input data of the model. + - **backbones** contains various backbone networks that transform an image to feature maps. + - **necks** contains various neck components that connect the backbone and heads. + - **decode_heads** contains various head components that take feature map as input and predict segmentation results. + - **losses** contains various loss functions. + +- **engine** is a part for runtime components that extends function of [MMEngine](https://github.com/open-mmlab/mmengine). + + - **optimizers** provides optimizers and optimizer wrappers. + - **hooks** provides various hooks of the runner. + +- **evaluation** provides different metrics for evaluating model performance. + +- **visualization** is for visualizing segmentation results. + +## How to use this documentation + +Here is a detailed step-by-step guide to learn more about MMSegmentation: + +1. For installation instructions, please see [get_started](getting_started.md). + +2. For beginners, MMSegmentation is the best place to start the journey of semantic segmentation + as there are many SOTA and classic segmentation [models](model_zoo.md), + and it is easier to carry out a segmentation task by plugging together building blocks and convenient high-level apis. + Refer to the tutorials below for the basic usage of MMSegmentation: + + - [Config](user_guides/1_config.md) + - [Dataset Preparation](user_guides/2_dataset_prepare.md) + - [Inference](user_guides/3_inference.md) + - [Train and Test](user_guides/4_train_test.md) + +3. If you would like to learn about the fundamental classes and features that make MMSegmentation work, + please refer to the tutorials below to dive deeper: + + - [Data flow](advanced_guides/data_flow.md) + - [Structures](advanced_guides/structures.md) + - [Models](advanced_guides/models.md) + - [Datasets](advanced_guides/datasets.md) + - [Evaluation](advanced_guides/evaluation.md) + +4. MMSegmentation also provide tutorials for customization and advanced research, + please refer to the below guides to build your own segmentation project: + + - [Add new models](advanced_guides/add_models.md) + - [Add new datasets](advanced_guides/add_datasets.md) + - [Add new transforms](advanced_guides/add_transforms.md) + - [Customize runtime](advanced_guides/customize_runtime.md) + +5. If you are more familiar with MMSegmentation v0.x, there is documentation about migration from MMSegmentation v0.x to v1.x + + - [migration](migration/index.rst) + +## References + +- [Paper with code](https://paperswithcode.com/task/semantic-segmentation/codeless#task-home) diff --git a/mmsegmentation/docs/en/stat.py b/mmsegmentation/docs/en/stat.py new file mode 100755 index 0000000..c458ee3 --- /dev/null +++ b/mmsegmentation/docs/en/stat.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +# Copyright (c) OpenMMLab. All rights reserved. +import functools as func +import glob +import os.path as osp +import re + +import numpy as np + +url_prefix = 'https://github.com/open-mmlab/mmsegmentation/blob/master/' + +files = sorted(glob.glob('../../configs/*/README.md')) + +stats = [] +titles = [] +num_ckpts = 0 + +for f in files: + url = osp.dirname(f.replace('../../', url_prefix)) + + with open(f) as content_file: + content = content_file.read() + + title = content.split('\n')[0].replace('#', '').strip() + ckpts = { + x.lower().strip() + for x in re.findall(r'https?://download.*\.pth', content) + if 'mmsegmentation' in x + } + if len(ckpts) == 0: + continue + + _papertype = [ + x for x in re.findall(r'', content) + ] + assert len(_papertype) > 0 + papertype = _papertype[0] + + paper = {(papertype, title)} + + titles.append(title) + num_ckpts += len(ckpts) + statsmsg = f""" +\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) +""" + stats.append((paper, ckpts, statsmsg)) + +allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) +msglist = '\n'.join(x for _, _, x in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# Model Zoo Statistics + +* Number of papers: {len(set(titles))} +{countstr} + +* Number of checkpoints: {num_ckpts} +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/mmsegmentation/docs/en/switch_language.md b/mmsegmentation/docs/en/switch_language.md new file mode 100644 index 0000000..f58efc4 --- /dev/null +++ b/mmsegmentation/docs/en/switch_language.md @@ -0,0 +1,3 @@ +## English + +## ็ฎ€ไฝ“ไธญๆ–‡ diff --git a/mmsegmentation/docs/en/user_guides/1_config.md b/mmsegmentation/docs/en/user_guides/1_config.md new file mode 100644 index 0000000..291c488 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/1_config.md @@ -0,0 +1,588 @@ +# Tutorial 1: Learn about Configs + +We incorporate modular and inheritance design into our config system, which is convenient to conduct various experiments. +If you wish to inspect the config file, you may run `python tools/misc/print_config.py /PATH/TO/CONFIG` to see the complete config. +You may also pass `--cfg-options xxx.yyy=zzz` to see updated config. + +## Config File Structure + +There are 4 basic component types under `config/_base_`, datasets, models, schedules, default_runtime. +Many methods could be easily constructed with one of each like DeepLabV3, PSPNet. +The configs that are composed by components from `_base_` are called _primitive_. + +For all configs under the same folder, it is recommended to have only **one** _primitive_ config. All other configs should inherit from the _primitive_ config. In this way, the maximum of inheritance level is 3. + +For easy understanding, we recommend contributors to inherit from existing methods. +For example, if some modification is made base on DeepLabV3, user may first inherit the basic DeepLabV3 structure by specifying `_base_ = ../deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py`, then modify the necessary fields in the config files. + +If you are building an entirely new method that does not share the structure with any of the existing methods, you may create a folder `xxxnet` under `configs`, + +Please refer to [mmengine](https://mmengine.readthedocs.io/en/latest/tutorials/config.html) for detailed documentation. + +## Config Name Style + +We follow the below style to name config files. Contributors are advised to follow the same style. + +```text +{algorithm name}_{model component names [component1]_[component2]_[...]}_{training settings}_{training dataset information}_{testing dataset information} +``` + +The file name is divided to five parts. All parts and components are connected with `_` and words of each part or component should be connected with `-`. + +- `{algorithm name}`: The name of the algorithm, such as `deeplabv3`, `pspnet`, etc. +- `{model component names}`: Names of the components used in the algorithm such as backbone, head, etc. For example, `r50-d8` means using ResNet50 backbone and use output of backbone is 8 times downsampling as input. +- `{training settings}`: Information of training settings such as batch size, augmentations, loss, learning rate scheduler, and epochs/iterations. For example: `4xb4-ce-linearlr-40K` means using 4-gpus x 4-images-per-gpu, CrossEntropy loss, Linear learning rate scheduler, and train 40K iterations. + Some abbreviations: + - `{gpu x batch_per_gpu}`: GPUs and samples per GPU. `bN` indicates N batch size per GPU. E.g. `8xb2` is the short term of 8-gpus x 2-images-per-gpu. And `4xb4` is used by default if not mentioned. + - `{schedule}`: training schedule, options are `20k`, `40k`, etc. `20k` and `40k` means 20000 iterations and 40000 iterations respectively. +- `{training dataset information}`: Training dataset names like `cityscapes`, `ade20k`, etc, and input resolutions. For example: `cityscapes-768x768` means training on `cityscapes` dataset and the input shape is `768x768`. +- `{testing dataset information}` (optional): Testing dataset name for models trained on one dataset but tested on another. If not mentioned, it means the model was trained and tested on the same dataset type. + +## An Example of PSPNet + +To help the users have a basic idea of a complete config and the modules in a modern semantic segmentation system, +we make brief comments on the config of PSPNet using ResNet50V1c as the following. +For more detailed usage and the corresponding alternative for each module, please refer to the API documentation. + +```python +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] # base config file which we build new config file on. +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +``` + +`_base_/models/pspnet_r50-d8.py` is a basic model cfg file for PSPNet using ResNet50V1c + +```python +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) # Segmentation usually uses SyncBN +data_preprocessor = dict( # The config of data preprocessor, usually includes image normalization and augmentation. + type='SegDataPreProcessor', # The type of data preprocessor. + mean=[123.675, 116.28, 103.53], # Mean values used for normalizing the input images. + std=[58.395, 57.12, 57.375], # Standard variance used for normalizing the input images. + bgr_to_rgb=True, # Whether to convert image from BGR to RGB. + pad_val=0, # Padding value of image. + seg_pad_val=255) # Padding value of segmentation map. +model = dict( + type='EncoderDecoder', # Name of segmentor + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', # The ImageNet pretrained backbone to be loaded + backbone=dict( + type='ResNetV1c', # The type of backbone. Please refer to mmseg/models/backbones/resnet.py for details. + depth=50, # Depth of backbone. Normally 50, 101 are used. + num_stages=4, # Number of stages of backbone. + out_indices=(0, 1, 2, 3), # The index of output feature maps produced in each stages. + dilations=(1, 1, 2, 4), # The dilation rate of each layer. + strides=(1, 2, 1, 1), # The stride of each layer. + norm_cfg=norm_cfg, # The configuration of norm layer. + norm_eval=False, # Whether to freeze the statistics in BN + style='pytorch', # The style of backbone, 'pytorch' means that stride 2 layers are in 3x3 conv, 'caffe' means stride 2 layers are in 1x1 convs. + contract_dilation=True), # When dilation > 1, whether contract first layer of dilation. + decode_head=dict( + type='PSPHead', # Type of decode head. Please refer to mmseg/models/decode_heads for available options. + in_channels=2048, # Input channel of decode head. + in_index=3, # The index of feature map to select. + channels=512, # The intermediate channels of decode head. + pool_scales=(1, 2, 3, 6), # The avg pooling scales of PSPHead. Please refer to paper for details. + dropout_ratio=0.1, # The dropout ratio before final classification layer. + num_classes=19, # Number of segmentation class. Usually 19 for cityscapes, 21 for VOC, 150 for ADE20k. + norm_cfg=norm_cfg, # The configuration of norm layer. + align_corners=False, # The align_corners argument for resize in decoding. + loss_decode=dict( # Config of loss function for the decode_head. + type='CrossEntropyLoss', # Type of loss used for segmentation. + use_sigmoid=False, # Whether use sigmoid activation for segmentation. + loss_weight=1.0)), # Loss weight of decode_head. + auxiliary_head=dict( + type='FCNHead', # Type of auxiliary head. Please refer to mmseg/models/decode_heads for available options. + in_channels=1024, # Input channel of auxiliary head. + in_index=2, # The index of feature map to select. + channels=256, # The intermediate channels of decode head. + num_convs=1, # Number of convs in FCNHead. It is usually 1 in auxiliary head. + concat_input=False, # Whether concat output of convs with input before classification layer. + dropout_ratio=0.1, # The dropout ratio before final classification layer. + num_classes=19, # Number of segmentation class. Usually 19 for cityscapes, 21 for VOC, 150 for ADE20k. + norm_cfg=norm_cfg, # The configuration of norm layer. + align_corners=False, # The align_corners argument for resize in decoding. + loss_decode=dict( # Config of loss function for the auxiliary_head. + type='CrossEntropyLoss', # Type of loss used for segmentation. + use_sigmoid=False, # Whether use sigmoid activation for segmentation. + loss_weight=0.4)), # Loss weight of auxiliary_head. + # model training and testing settings + train_cfg=dict(), # train_cfg is just a place holder for now. + test_cfg=dict(mode='whole')) # The test mode, options are 'whole' and 'slide'. 'whole': whole image fully-convolutional test. 'slide': sliding crop window on the image. +``` + +`_base_/datasets/cityscapes.py` is the configuration file of the dataset + +```python +# dataset settings +dataset_type = 'CityscapesDataset' # Dataset type, this will be used to define the dataset. +data_root = 'data/cityscapes/' # Root path of data. +crop_size = (512, 1024) # The crop size during training. +train_pipeline = [ # Training pipeline. + dict(type='LoadImageFromFile'), # First pipeline to load images from file path. + dict(type='LoadAnnotations'), # Second pipeline to load annotations for current image. + dict(type='RandomResize', # Augmentation pipeline that resize the images and their annotations. + scale=(2048, 1024), # The scale of image. + ratio_range=(0.5, 2.0), # The augmented scale range as ratio. + keep_ratio=True), # Whether to keep the aspect ratio when resizing the image. + dict(type='RandomCrop', # Augmentation pipeline that randomly crop a patch from current image. + crop_size=crop_size, # The crop size of patch. + cat_max_ratio=0.75), # The max area ratio that could be occupied by single category. + dict(type='RandomFlip', # Augmentation pipeline that flip the images and their annotations + prob=0.5), # The ratio or probability to flip + dict(type='PhotoMetricDistortion'), # Augmentation pipeline that distort current image with several photo metric methods. + dict(type='PackSegInputs') # Pack the inputs data for the semantic segmentation. +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # First pipeline to load images from file path + dict(type='Resize', # Use resize augmentation + scale=(2048, 1024), # Images scales for resizing. + keep_ratio=True), # Whether to keep the aspect ratio when resizing the image. + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), # Load annotations for semantic segmentation provided by dataset. + dict(type='PackSegInputs') # Pack the inputs data for the semantic segmentation. +] +train_dataloader = dict( # Train dataloader config + batch_size=2, # Batch size of a single GPU + num_workers=2, # Worker to pre-fetch data for each single GPU + persistent_workers=True, # Shut down the worker processes after an epoch end, which can accelerate training speed. + sampler=dict(type='InfiniteSampler', shuffle=True), # Randomly shuffle during training. + dataset=dict( # Train dataset config + type=dataset_type, # Type of dataset, refer to mmseg/datasets/ for details. + data_root=data_root, # The root of dataset. + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), # Prefix for training data. + pipeline=train_pipeline)) # Processing pipeline. This is passed by the train_pipeline created before. +val_dataloader = dict( + batch_size=1, # Batch size of a single GPU + num_workers=4, # Worker to pre-fetch data for each single GPU + persistent_workers=True, # Shut down the worker processes after an epoch end, which can accelerate testing speed. + sampler=dict(type='DefaultSampler', shuffle=False), # Not shuffle during validation and testing. + dataset=dict( # Test dataset config + type=dataset_type, # Type of dataset, refer to mmseg/datasets/ for details. + data_root=data_root, # The root of dataset. + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), # Prefix for testing data. + pipeline=test_pipeline)) # Processing pipeline. This is passed by the test_pipeline created before. +test_dataloader = val_dataloader +# The metric to measure the accuracy. Here, we use IoUMetric. +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator +``` + +`_base_/schedules/schedule_40k.py` + +```python +# optimizer +optimizer = dict(type='SGD', # Type of optimizers, refer to https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py for more details + lr=0.01, # Learning rate of optimizers, see detail usages of the parameters in the documentation of PyTorch + momentum=0.9, # Momentum + weight_decay=0.0005) # Weight decay of SGD +optim_wrapper = dict(type='OptimWrapper', # Optimizer wrapper provides a common interface for updating parameters. + optimizer=optimizer, # Optimizer used to update model parameters. + clip_grad=None) # If ``clip_grad`` is not None, it will be the arguments of ``torch.nn.utils.clip_grad``. +# learning policy +param_scheduler = [ + dict( + type='PolyLR', # The policy of scheduler, also support Step, CosineAnnealing, Cyclic, etc. Refer to details of supported LrUpdater from https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/scheduler/lr_scheduler.py + eta_min=1e-4, # Minimum learning rate at the end of scheduling. + power=0.9, # The power of polynomial decay. + begin=0, # Step at which to start updating the parameters. + end=40000, # Step at which to stop updating the parameters. + by_epoch=False) # Whether count by epoch or not. +] +# training schedule for 40k iteration +train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +# default hooks +default_hooks = dict( + timer=dict(type='IterTimerHook'), # Log the time spent during iteration. + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), # Collect and write logs from different components of ``Runner``. + param_scheduler=dict(type='ParamSchedulerHook'), # update some hyper-parameters in optimizer, e.g., learning rate. + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), # Save checkpoints periodically. + sampler_seed=dict(type='DistSamplerSeedHook')) # Data-loading sampler for distributed training. +``` + +in `_base_/default_runtime.py` + +```python +# Set the default scope of the registry to mmseg. +default_scope = 'mmseg' +# environment +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +log_level = 'INFO' +log_processor = dict(by_epoch=False) +load_from = None # Load checkpoint from file. +resume = False # Whether to resume from existed model. +``` + +These are all the configs for training and testing PSPNet, to load and parse them, we can use [Config](https://mmengine.readthedocs.io/en/latest/tutorials/config.html) implemented in [MMEngine](https://github.com/open-mmlab/mmengine) + +```python +from mmengine.config import Config + +cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py') +print(cfg.train_dataloader) +``` + +```shell +{'batch_size': 2, + 'num_workers': 2, + 'persistent_workers': True, + 'sampler': {'type': 'InfiniteSampler', 'shuffle': True}, + 'dataset': {'type': 'CityscapesDataset', + 'data_root': 'data/cityscapes/', + 'data_prefix': {'img_path': 'leftImg8bit/train', + 'seg_map_path': 'gtFine/train'}, + 'pipeline': [{'type': 'LoadImageFromFile'}, + {'type': 'LoadAnnotations'}, + {'type': 'RandomResize', + 'scale': (2048, 1024), + 'ratio_range': (0.5, 2.0), + 'keep_ratio': True}, + {'type': 'RandomCrop', 'crop_size': (512, 1024), 'cat_max_ratio': 0.75}, + {'type': 'RandomFlip', 'prob': 0.5}, + {'type': 'PhotoMetricDistortion'}, + {'type': 'PackSegInputs'}]}} +``` + +`cfg` is an instance of `mmengine.config.Config`, its interface is the same as a dict object and also allows access config values as attributes. See [config tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/config.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for more information. + +## FAQ + +### Ignore some fields in the base configs + +Sometimes, you may set `_delete_=True` to ignore some of the fields in base configs. +See [config tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/config.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for simple illustration. + +In MMSegmentation, for example, if you would like to modify the backbone of PSPNet with the following config file `pspnet.py`: + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='torchvision://resnet50', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) +``` + +Load and parse the config file `pspnet.py` in the code as follows: + +```python +from mmengine.config import Config + +cfg = Config.fromfile('pspnet.py') +print(cfg.model) +``` + +```shell +{'type': 'EncoderDecoder', + 'pretrained': 'torchvision://resnet50', + 'backbone': {'type': 'ResNetV1c', + 'depth': 50, + 'num_stages': 4, + 'out_indices': (0, 1, 2, 3), + 'dilations': (1, 1, 2, 4), + 'strides': (1, 2, 1, 1), + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'norm_eval': False, + 'style': 'pytorch', + 'contract_dilation': True}, + 'decode_head': {'type': 'PSPHead', + 'in_channels': 2048, + 'in_index': 3, + 'channels': 512, + 'pool_scales': (1, 2, 3, 6), + 'dropout_ratio': 0.1, + 'num_classes': 19, + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'align_corners': False, + 'loss_decode': {'type': 'CrossEntropyLoss', + 'use_sigmoid': False, + 'loss_weight': 1.0}}} +``` + +`ResNet` and `HRNet` use different keywords to construct, write a new config file `hrnet.py` as follows: + +```python +_base_ = 'pspnet.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w32', + backbone=dict( + _delete_=True, + type='HRNet', + norm_cfg=norm_cfg, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))))) +``` + +Load and parse the config file `hrnet.py` in the code as follows: + +```python +from mmengine.config import Config +cfg = Config.fromfile('hrnet.py') +print(cfg.model) +``` + +```shell +{'type': 'EncoderDecoder', + 'pretrained': 'open-mmlab://msra/hrnetv2_w32', + 'backbone': {'type': 'HRNet', + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'extra': {'stage1': {'num_modules': 1, + 'num_branches': 1, + 'block': 'BOTTLENECK', + 'num_blocks': (4,), + 'num_channels': (64,)}, + 'stage2': {'num_modules': 1, + 'num_branches': 2, + 'block': 'BASIC', + 'num_blocks': (4, 4), + 'num_channels': (32, 64)}, + 'stage3': {'num_modules': 4, + 'num_branches': 3, + 'block': 'BASIC', + 'num_blocks': (4, 4, 4), + 'num_channels': (32, 64, 128)}, + 'stage4': {'num_modules': 3, + 'num_branches': 4, + 'block': 'BASIC', + 'num_blocks': (4, 4, 4, 4), + 'num_channels': (32, 64, 128, 256)}}}, + 'decode_head': {'type': 'PSPHead', + 'in_channels': 2048, + 'in_index': 3, + 'channels': 512, + 'pool_scales': (1, 2, 3, 6), + 'dropout_ratio': 0.1, + 'num_classes': 19, + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'align_corners': False, + 'loss_decode': {'type': 'CrossEntropyLoss', + 'use_sigmoid': False, + 'loss_weight': 1.0}}} +``` + +The `_delete_=True` would replace all old keys in `backbone` field with new keys. + +### Use intermediate variables in configs + +Some intermediate variables are used in the configs files, like `train_pipeline`/`test_pipeline` in datasets. +It's worth noting that when modifying intermediate variables in the children configs, user need to pass the intermediate variables into corresponding fields again. +For example, we would like to change multi scale strategy to train/test a PSPNet. `train_pipeline`/`test_pipeline` are intermediate variable we would like to modify. + +```python +_base_ = '../pspnet/pspnet_r50-d8_4xb4-40k_cityscpaes-512x1024.py' +crop_size = (512, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='RandomResize', + img_scale=(2048, 1024), + ratio_range=(1., 2.), + keep_ration=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs'), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', + scale=(2048, 1024), + keep_ratio=True), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), + pipeline=train_pipeline) +test_dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + pipeline=test_pipeline) +train_dataloader = dict(dataset=train_dataset) +val_dataloader = dict(dataset=test_dataset) +test_dataloader = val_dataloader +``` + +We first define the new `train_pipeline`/`test_pipeline` and pass them into `dataset`. + +Similarly, if we would like to switch from `SyncBN` to `BN` or `MMSyncBN`, we need to substitute every `norm_cfg` in the config. + +```python +_base_ = '../pspnet/pspnet_r50-d8_4xb4-40k_cityscpaes-512x1024.py' +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + decode_head=dict(norm_cfg=norm_cfg), + auxiliary_head=dict(norm_cfg=norm_cfg)) +``` + +## Modify config through script arguments + +In the [training script](https://github.com/open-mmlab/mmsegmentation/blob/1.x/tools/train.py) and the [testing script](https://github.com/open-mmlab/mmsegmentation/blob/1.x/tools/test.py), we support the script argument `--cfg-options`, it may help users override some settings in the used config, the key-value pair in `xxx=yyy` format will be merged into config file. + +For example, this is a simplified script `demo_script.py`: + +```python +import argparse + +from mmengine.config import Config, DictAction + +def parse_args(): + parser = argparse.ArgumentParser(description='Script Example') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + print(cfg) + +if __name__ == '__main__': + main() +``` + +An example config file `demo_config.py` as follows: + +```python +backbone = dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_eval=False, + style='pytorch', + contract_dilation=True) +``` + +Run `demo_script.py`: + +```shell +python demo_script.py demo_config.py +``` + +```shell +Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': (1, 2, 1, 1), 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} +``` + +Modify config through script arguments: + +```shell +python demo_script.py demo_config.py --cfg-options backbone.depth=101 +``` + +```shell +Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 101, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': (1, 2, 1, 1), 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} +``` + +- Update values of list/tuples. + + If the value to be updated is a list or a tuple. For example, the config file `demo_config.py` sets `strides=(1, 2, 1, 1)` in `backbone`. + If you want to change this key, you may specify in two ways: + + 1. `--cfg-options backbone.strides="(1, 1, 1, 1)"`. Note that the quotation mark " is necessary to support list/tuple data types. + + ```shell + python demo_script.py demo_config.py --cfg-options backbone.strides="(1, 1, 1, 1)" + ``` + + ```shell + Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': (1, 1, 1, 1), 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} + ``` + + 2. `--cfg-options backbone.strides=1,1,1,1`. Note that **NO** white space is allowed in the specified value. + In addition, if the original type is tuple, it will be automatically converted to list after this way. + + ```shell + python demo_script.py demo_config.py --cfg-options backbone.strides=1,1,1,1 + ``` + + ```shell + Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': [1, 1, 1, 1], 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} + ``` + +```{note} + This modification method only supports modifying configuration items of string, int, float, boolean, None, list and tuple types. + More specifically, for list and tuple types, the elements inside them must also be one of the above seven types. +``` diff --git a/mmsegmentation/docs/en/user_guides/2_dataset_prepare.md b/mmsegmentation/docs/en/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..3f94a94 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/2_dataset_prepare.md @@ -0,0 +1,806 @@ +# Tutorial 2: Prepare datasets + +It is recommended to symlink the dataset root to `$MMSEGMENTATION/data`. +If your folder structure is different, you may need to change the corresponding paths in config files. +For users in China, we also recommend you get the dsdl dataset from our opensource platform [OpenDataLab](https://opendatalab.com/), for better download and use experience๏ผŒhere is an example: [DSDLReadme](../../../configs/dsdl/README.md)๏ผŒ welcome to try. + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ cityscapes +โ”‚ โ”‚ โ”œโ”€โ”€ leftImg8bit +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ gtFine +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ VOCdevkit +โ”‚ โ”‚ โ”œโ”€โ”€ VOC2012 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ JPEGImages +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SegmentationClass +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ImageSets +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Segmentation +โ”‚ โ”‚ โ”œโ”€โ”€ VOC2010 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ JPEGImages +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SegmentationClassContext +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ImageSets +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SegmentationContext +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ trainval_merged.json +โ”‚ โ”‚ โ”œโ”€โ”€ VOCaug +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dataset +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ cls +โ”‚ โ”œโ”€โ”€ ade +โ”‚ โ”‚ โ”œโ”€โ”€ ADEChallengeData2016 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ coco_stuff10k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2014 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test2014 +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2014 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test2014 +โ”‚ โ”‚ โ”œโ”€โ”€ imagesLists +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test.txt +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ all.txt +โ”‚ โ”œโ”€โ”€ coco_stuff164k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2017 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val2017 +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2017 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val2017 +โ”‚ โ”œโ”€โ”€ CHASE_DB1 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ DRIVE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ HRF +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ STARE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +| โ”œโ”€โ”€ dark_zurich +| โ”‚ย ย  โ”œโ”€โ”€ gps +| โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ val +| โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ val_ref +| โ”‚ย ย  โ”œโ”€โ”€ gt +| โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ val +| โ”‚ย ย  โ”œโ”€โ”€ LICENSE.txt +| โ”‚ย ย  โ”œโ”€โ”€ lists_file_names +| โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ val_filenames.txt +| โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ val_ref_filenames.txt +| โ”‚ย ย  โ”œโ”€โ”€ README.md +| โ”‚ย ย  โ””โ”€โ”€ rgb_anon +| โ”‚ย ย  | โ”œโ”€โ”€ val +| โ”‚ย ย  | โ””โ”€โ”€ val_ref +| โ”œโ”€โ”€ NighttimeDrivingTest +| | โ”œโ”€โ”€ gtCoarse_daytime_trainvaltest +| | โ”‚ย ย  โ””โ”€โ”€ test +| | โ”‚ย ย  โ””โ”€โ”€ night +| | โ””โ”€โ”€ leftImg8bit +| | | โ””โ”€โ”€ test +| | | โ””โ”€โ”€ night +โ”‚ โ”œโ”€โ”€ loveDA +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ potsdam +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ vaihingen +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ iSAID +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ synapse +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ REFUGE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”œโ”€โ”€ mapillary +โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons +โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +| โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons +โ”‚ โ”œโ”€โ”€ bdd100k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ 10k +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ val +โ”‚ โ”‚ โ””โ”€โ”€ labels +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ sem_seg +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ colormaps +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ polygons +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ rles +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +โ”‚ โ”œโ”€โ”€ nyu +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”œโ”€โ”€ HSIDrive20 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +``` + +## Download dataset via MIM + +By using [OpenXLab](https://openxlab.org.cn/datasets), you can obtain free formatted datasets in various fields. Through the search function of the platform, you may address the dataset they look for quickly and easily. Using the formatted datasets from the platform, you can efficiently conduct tasks across datasets. + +If you use MIM to download, make sure that the version is greater than v0.3.8. You can use the following command to update, install, login and download the dataset: + +```shell +# upgrade your MIM +pip install -U openmim + +# install OpenXLab CLI tools +pip install -U openxlab +# log in OpenXLab +openxlab login + +# download ADE20K by MIM +mim download mmsegmentation --dataset ade20k +``` + +## Cityscapes + +The data could be found [here](https://www.cityscapes-dataset.com/downloads/) after registration. + +By convention, `**labelTrainIds.png` are used for cityscapes training. +We provided a [script](https://github.com/open-mmlab/mmsegmentation/blob/1.x/tools/dataset_converters/cityscapes.py) based on [cityscapesscripts](https://github.com/mcordts/cityscapesScripts)to generate `**labelTrainIds.png`. + +```shell +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/dataset_converters/cityscapes.py data/cityscapes --nproc 8 +``` + +## Pascal VOC + +Pascal VOC 2012 could be downloaded from [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar). +Beside, most recent works on Pascal VOC dataset usually exploit extra augmentation data, which could be found [here](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz). + +If you would like to use augmented VOC dataset, please run following command to convert augmentation annotations into proper format. + +```shell +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/dataset_converters/voc_aug.py data/VOCdevkit data/VOCdevkit/VOCaug --nproc 8 +``` + +Please refer to [concat dataset](../advanced_guides/add_datasets.md#concatenate-dataset) and [voc_aug config example](../../../configs/_base_/datasets/pascal_voc12_aug.py) for details about how to concatenate them and train them together. + +## ADE20K + +The training and validation set of ADE20K could be download from this [link](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip). +We may also download test set from [here](http://data.csail.mit.edu/places/ADEchallenge/release_test.zip). + +## Pascal Context + +The training and validation set of Pascal Context could be download from [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar). You may also download test set from [here](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar) after registration. + +To split the training and validation set from original dataset, you may download trainval_merged.json from [here](https://codalabuser.blob.core.windows.net/public/trainval_merged.json). + +If you would like to use Pascal Context dataset, please install [Detail](https://github.com/zhanghang1989/detail-api) and then run the following command to convert annotations into proper format. + +```shell +python tools/dataset_converters/pascal_context.py data/VOCdevkit data/VOCdevkit/VOC2010/trainval_merged.json +``` + +## COCO Stuff 10k + +The data could be downloaded [here](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/cocostuff-10k-v1.1.zip) by wget. + +For COCO Stuff 10k dataset, please run the following commands to download and convert the dataset. + +```shell +# download +mkdir coco_stuff10k && cd coco_stuff10k +wget http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/cocostuff-10k-v1.1.zip + +# unzip +unzip cocostuff-10k-v1.1.zip + +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/dataset_converters/coco_stuff10k.py /path/to/coco_stuff10k --nproc 8 +``` + +By convention, mask labels in `/path/to/coco_stuff164k/annotations/*2014/*_labelTrainIds.png` are used for COCO Stuff 10k training and testing. + +## COCO Stuff 164k + +For COCO Stuff 164k dataset, please run the following commands to download and convert the augmented dataset. + +```shell +# download +mkdir coco_stuff164k && cd coco_stuff164k +wget http://images.cocodataset.org/zips/train2017.zip +wget http://images.cocodataset.org/zips/val2017.zip +wget http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip + +# unzip +unzip train2017.zip -d images/ +unzip val2017.zip -d images/ +unzip stuffthingmaps_trainval2017.zip -d annotations/ + +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/dataset_converters/coco_stuff164k.py /path/to/coco_stuff164k --nproc 8 +``` + +By convention, mask labels in `/path/to/coco_stuff164k/annotations/*2017/*_labelTrainIds.png` are used for COCO Stuff 164k training and testing. + +The details of this dataset could be found at [here](https://github.com/nightrome/cocostuff#downloads). + +## CHASE DB1 + +The training and validation set of CHASE DB1 could be download from [here](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip). + +To convert CHASE DB1 dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/dataset_converters/chase_db1.py /path/to/CHASEDB1.zip +``` + +The script will make directory structure automatically. + +## DRIVE + +The training and validation set of DRIVE could be download from [here](https://drive.grand-challenge.org/). Before that, you should register an account. Currently '1st_manual' is not provided officially. + +To convert DRIVE dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/dataset_converters/drive.py /path/to/training.zip /path/to/test.zip +``` + +The script will make directory structure automatically. + +## HRF + +First, download [healthy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy.zip), [glaucoma.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma.zip), [diabetic_retinopathy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy.zip), [healthy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy_manualsegm.zip), [glaucoma_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma_manualsegm.zip) and [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip). + +To convert HRF dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/dataset_converters/hrf.py /path/to/healthy.zip /path/to/healthy_manualsegm.zip /path/to/glaucoma.zip /path/to/glaucoma_manualsegm.zip /path/to/diabetic_retinopathy.zip /path/to/diabetic_retinopathy_manualsegm.zip +``` + +The script will make directory structure automatically. + +## STARE + +First, download [stare-images.tar](http://cecas.clemson.edu/~ahoover/stare/probing/stare-images.tar), [labels-ah.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-ah.tar) and [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar). + +To convert STARE dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/dataset_converters/stare.py /path/to/stare-images.tar /path/to/labels-ah.tar /path/to/labels-vk.tar +``` + +The script will make directory structure automatically. + +## Dark Zurich + +Since we only support test models on this dataset, you may only download [the validation set](https://data.vision.ee.ethz.ch/csakarid/shared/GCMA_UIoU/Dark_Zurich_val_anon.zip). + +## Nighttime Driving + +Since we only support test models on this dataset, you may only download [the test set](http://data.vision.ee.ethz.ch/daid/NighttimeDriving/NighttimeDrivingTest.zip). + +## LoveDA + +The data could be downloaded from Google Drive [here](https://drive.google.com/drive/folders/1ibYV0qwn4yuuh068Rnc-w4tPi0U0c-ti?usp=sharing). + +Or it can be downloaded from [zenodo](https://zenodo.org/record/5706578#.YZvN7SYRXdF), you should run the following command: + +```shell +# Download Train.zip +wget https://zenodo.org/record/5706578/files/Train.zip +# Download Val.zip +wget https://zenodo.org/record/5706578/files/Val.zip +# Download Test.zip +wget https://zenodo.org/record/5706578/files/Test.zip +``` + +For LoveDA dataset, please run the following command to re-organize the dataset. + +```shell +python tools/dataset_converters/loveda.py /path/to/loveDA +``` + +Using trained model to predict test set of LoveDA and submit it to server can be found [here](https://codalab.lisn.upsaclay.fr/competitions/421). + +More details about LoveDA can be found [here](https://github.com/Junjue-Wang/LoveDA). + +## ISPRS Potsdam + +The [Potsdam](https://www.isprs.org/education/benchmarks/UrbanSemLab/2d-sem-label-potsdam.aspx) dataset is for urban semantic segmentation used in the 2D Semantic Labeling Contest - Potsdam. + +The dataset can be requested at the challenge [homepage](https://www.isprs.org/education/benchmarks/UrbanSemLab/default.aspx). +Or download on [BaiduNetdisk](https://pan.baidu.com/s/1K-cLVZnd1X7d8c26FQ-nGg?pwd=mseg)๏ผŒpassword๏ผšmseg, [Google Drive](https://drive.google.com/drive/folders/1w3EJuyUGet6_qmLwGAWZ9vw5ogeG0zLz?usp=sharing) and [OpenDataLab](https://opendatalab.com/ISPRS_Potsdam/download). +The '2_Ortho_RGB.zip' and '5_Labels_all_noBoundary.zip' are required. + +For Potsdam dataset, please run the following command to re-organize the dataset. + +```shell +python tools/dataset_converters/potsdam.py /path/to/potsdam +``` + +In our default setting, it will generate 3456 images for training and 2016 images for validation. + +## ISPRS Vaihingen + +The [Vaihingen](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-vaihingen/) dataset is for urban semantic segmentation used in the 2D Semantic Labeling Contest - Vaihingen. + +The dataset can be requested at the challenge [homepage](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/). +Or [BaiduNetdisk](https://pan.baidu.com/s/109D3WLrLafsuYtLeerLiiA?pwd=mseg)๏ผŒpassword๏ผšmseg, [Google Drive](https://drive.google.com/drive/folders/1w3NhvLVA2myVZqOn2pbiDXngNC7NTP_t?usp=sharing). +The 'ISPRS_semantic_labeling_Vaihingen.zip' and 'ISPRS_semantic_labeling_Vaihingen_ground_truth_eroded_COMPLETE.zip' are required. + +For Vaihingen dataset, please run the following command to re-organize the dataset. + +```shell +python tools/dataset_converters/vaihingen.py /path/to/vaihingen +``` + +In our default setting (`clip_size`=512, `stride_size`=256), it will generate 344 images for training and 398 images for validation. + +## iSAID + +The data images could be download from [DOTA-v1.0](https://captain-whu.github.io/DOTA/dataset.html) (train/val/test) + +The data annotations could be download from [iSAID](https://captain-whu.github.io/iSAID/dataset.html) (train/val) + +The dataset is a Large-scale Dataset for Instance Segmentation (also have semantic segmentation) in Aerial Images. + +You may need to follow the following structure for dataset preparation after downloading iSAID dataset. + +```none +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ iSAID +โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part1.zip +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part2.zip +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part3.zip +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Semantic_masks +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images.zip +โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part1.zip +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Semantic_masks +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images.zip +โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part1.zip +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part2.zip +``` + +```shell +python tools/dataset_converters/isaid.py /path/to/iSAID +``` + +In our default setting (`patch_width`=896, `patch_height`=896, `overlap_area`=384), it will generate 33978 images for training and 11644 images for validation. + +## LIP(Look Into Person) dataset + +This dataset could be download from [this page](https://lip.sysuhcp.com/overview.php). + +Please run the following commands to unzip dataset. + +```shell +unzip LIP.zip +cd LIP +unzip TrainVal_images.zip +unzip TrainVal_parsing_annotations.zip +cd TrainVal_parsing_annotations +unzip TrainVal_parsing_annotations.zip +mv train_segmentations ../ +mv val_segmentations ../ +cd .. +``` + +The contents of LIP datasets include: + +```none +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ LIP +โ”‚ โ”‚ โ”œโ”€โ”€ train_images +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 1000_1234574.jpg +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ train_segmentations +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 1000_1234574.png +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ val_images +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 100034_483681.jpg +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ val_segmentations +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 100034_483681.png +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +``` + +## Synapse dataset + +This dataset could be download from [this page](https://www.synapse.org/#!Synapse:syn3193805/wiki/). + +To follow the data preparation setting of [TransUNet](https://arxiv.org/abs/2102.04306), which splits original training set (30 scans) into new training (18 scans) and validation set (12 scans). Please run the following command to prepare the dataset. + +```shell +unzip RawData.zip +cd ./RawData/Training +``` + +Then create `train.txt` and `val.txt` to split dataset. + +According to TransUnet, the following is the data set division. + +train.txt + +```none +img0005.nii.gz +img0006.nii.gz +img0007.nii.gz +img0009.nii.gz +img0010.nii.gz +img0021.nii.gz +img0023.nii.gz +img0024.nii.gz +img0026.nii.gz +img0027.nii.gz +img0028.nii.gz +img0030.nii.gz +img0031.nii.gz +img0033.nii.gz +img0034.nii.gz +img0037.nii.gz +img0039.nii.gz +img0040.nii.gz +``` + +val.txt + +```none +img0008.nii.gz +img0022.nii.gz +img0038.nii.gz +img0036.nii.gz +img0032.nii.gz +img0002.nii.gz +img0029.nii.gz +img0003.nii.gz +img0001.nii.gz +img0004.nii.gz +img0025.nii.gz +img0035.nii.gz +``` + +The contents of synapse datasets include: + +```none +โ”œโ”€โ”€ Training +โ”‚ โ”œโ”€โ”€ img +โ”‚ โ”‚ โ”œโ”€โ”€ img0001.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ img0002.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”œโ”€โ”€ label +โ”‚ โ”‚ โ”œโ”€โ”€ label0001.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ label0002.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”œโ”€โ”€ train.txt +โ”‚ โ”œโ”€โ”€ val.txt +``` + +Then, use this command to convert synapse dataset. + +```shell +python tools/dataset_converters/synapse.py --dataset-path /path/to/synapse +``` + +Noted that MMSegmentation default evaluation metric (such as mean dice value) is calculated on 2D slice image, which is not comparable to results of 3D scan in some paper such as [TransUNet](https://arxiv.org/abs/2102.04306). + +## REFUGE + +Register in [REFUGE Challenge](https://refuge.grand-challenge.org) and download [REFUGE dataset](https://refuge.grand-challenge.org/REFUGE2Download). + +Then, unzip `REFUGE2.zip` and the contents of original datasets include: + +```none +โ”œโ”€โ”€ REFUGE2 +โ”‚ โ”œโ”€โ”€ REFUGE2 +โ”‚ โ”‚ โ”œโ”€โ”€ Annotation-Training400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Test400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Test-GT.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Training400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Validation400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Validation400-GT.zip +โ”‚ โ”œโ”€โ”€ __MACOSX +``` + +Please run the following command to convert REFUGE dataset: + +```shell +python tools/convert_datasets/refuge.py --raw_data_root=/path/to/refuge/REFUGE2/REFUGE2 +``` + +The script will make directory structure below: + +```none +โ”‚ โ”œโ”€โ”€ REFUGE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +``` + +It includes 400 images for training, 400 images for validation and 400 images for testing which is the same as REFUGE 2018 dataset. + +## Mapillary Vistas Datasets + +- The dataset could be download [here](https://www.mapillary.com/dataset/vistas) after registration. + +- Mapillary Vistas Dataset use 8-bit with color-palette to store labels. No conversion operation is required. + +- Assumption you have put the dataset zip file in `mmsegmentation/data/mapillary` + +- Please run the following commands to unzip dataset. + + ```bash + cd data/mapillary + unzip An-ZjB1Zm61yAZG0ozTymz8I8NqI4x0MrYrh26dq7kPgfu8vf9ImrdaOAVOFYbJ2pNAgUnVGBmbue9lTgdBOb5BbKXIpFs0fpYWqACbrQDChAA2fdX0zS9PcHu7fY8c-FOvyBVxPNYNFQuM.zip + ``` + +- After unzip, you will get Mapillary Vistas Dataset like this structure. Semantic segmentation mask labels in `labels` folder. + + ```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ tools + โ”œโ”€โ”€ configs + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ mapillary + โ”‚ โ”‚ โ”œโ”€โ”€ training + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + โ”‚ โ”‚ โ”œโ”€โ”€ validation + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + | โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + ``` + +- You could set Datasets version with `MapillaryDataset_v1` and `MapillaryDataset_v2` in your configs. + View the Mapillary Vistas Datasets config file here [V1.2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/datasets/mapillary_v1.py) and [V2.0](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/datasets/mapillary_v2.py) + +## LEVIR-CD + +[LEVIR-CD](https://justchenhao.github.io/LEVIR/) Large-scale Remote Sensing Change Detection Dataset for Building. + +Download the dataset from [here](https://justchenhao.github.io/LEVIR/). + +The supplement version of the dataset can be requested on the [homepage](https://github.com/S2Looking/Dataset) + +Please download the supplement version of the dataset, then unzip `LEVIR-CD+.zip`, the contents of original datasets include: + +```none +โ”‚ โ”œโ”€โ”€ LEVIR-CD+ +โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ A +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ B +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ label +โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ A +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ B +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ label +``` + +For LEVIR-CD dataset, please run the following command to crop images without overlap: + +```shell +python tools/dataset_converters/levircd.py --dataset-path /path/to/LEVIR-CD+ --out_dir /path/to/LEVIR-CD +``` + +The size of cropped image is 256x256, which is consistent with the original paper. + +## BDD100K + +- You could download BDD100k datasets from [here](https://bdd-data.berkeley.edu/) after registration. + +- You can download images and masks by clicking `10K Images` button and `Segmentation` button. + +- After download, unzip by the following instructions: + + ```bash + unzip ~/bdd100k_images_10k.zip -d ~/mmsegmentation/data/ + unzip ~/bdd100k_sem_seg_labels_trainval.zip -d ~/mmsegmentation/data/ + ``` + +- And get + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ bdd100k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ 10k +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ val +โ”‚ โ”‚ โ””โ”€โ”€ labels +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ sem_seg +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ colormaps +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ polygons +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ rles +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +``` + +## NYU + +- To access the NYU dataset, you can download it from [this link](https://drive.google.com/file/d/1wC-io-14RCIL4XTUrQLk6lBqU2AexLVp/view?usp=share_link) + +- Once the download is complete, you can utilize the [tools/dataset_converters/nyu.py](/tools/dataset_converters/nyu.py) script to extract and organize the data into the required format. Run the following command in your terminal: + + ```bash + python tools/dataset_converters/nyu.py nyu.zip + ``` + +## HSI Drive 2.0 + +- You could download HSI Drive 2.0 dataset from [here](https://ipaccess.ehu.eus/HSI-Drive/#download) after just sending an email to gded@ehu.eus with the subject "download HSI-Drive". You will receive a password to uncompress the files. + +- After download, unzip by the following instructions: + + ```bash + 7z x -p"password" ./HSI_Drive_v2_0_Phyton.zip + + mv ./HSIDrive20 path_to_mmsegmentation/data + mv ./HSI_Drive_v2_0_release_notes_Python_version.md path_to_mmsegmentation/data + mv ./image_numbering.pdf path_to_mmsegmentation/data + ``` + +- After unzip, you get + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ HSIDrive20 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ images_MF +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ RGB +โ”‚ โ”‚ โ”œโ”€โ”€ training_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ validation_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ test_filenames.txt +โ”‚ โ”œโ”€โ”€ HSI_Drive_v2_0_release_notes_Python_version.md +โ”‚ โ”œโ”€โ”€ image_numbering.pdf +``` diff --git a/mmsegmentation/docs/en/user_guides/3_inference.md b/mmsegmentation/docs/en/user_guides/3_inference.md new file mode 100644 index 0000000..cacebd2 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/3_inference.md @@ -0,0 +1,244 @@ +# Tutorial 3: Inference with existing models + +MMSegmentation provides pre-trained models for semantic segmentation in [Model Zoo](../model_zoo.md), and supports multiple standard datasets, including Cityscapes, ADE20K, etc. +This note will show how to use existing models to inference on given images. +As for how to test existing models on standard datasets, please see this [guide](./4_train_test.md) + +MMSegmentation provides several interfaces for users to easily use pre-trained models for inference. + +- [Tutorial 3: Inference with existing models](#tutorial-3-inference-with-existing-models) + - [Inferencer](#inferencer) + - [Basic Usage](#basic-usage) + - [Initialization](#initialization) + - [Visualize prediction](#visualize-prediction) + - [List model](#list-model) + - [Inference API](#inference-api) + - [mmseg.apis.init_model](#mmsegapisinit_model) + - [mmseg.apis.inference_model](#mmsegapisinference_model) + - [mmseg.apis.show_result_pyplot](#mmsegapisshow_result_pyplot) + +## Inferencer + +We provide the most **convenient** way to use the model in MMSegmentation `MMSegInferencer`. You can get segmentation mask for an image with only 3 lines of code. + +### Basic Usage + +The following example shows how to use `MMSegInferencer` to perform inference on a single image. + +``` +>>> from mmseg.apis import MMSegInferencer +>>> # Load models into memory +>>> inferencer = MMSegInferencer(model='deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024') +>>> # Inference +>>> inferencer('demo/demo.png', show=True) +``` + +The visualization result should look like: + +
+ +
+ +Moreover, you can use `MMSegInferencer` to process a list of images: + +``` +# Input a list of images +>>> images = [image1, image2, ...] # image1 can be a file path or a np.ndarray +>>> inferencer(images, show=True, wait_time=0.5) # wait_time is delay time, and 0 means forever + +# Or input image directory +>>> images = $IMAGESDIR +>>> inferencer(images, show=True, wait_time=0.5) + +# Save visualized rendering color maps and predicted results +# out_dir is the directory to save the output results, img_out_dir and pred_out_dir are subdirectories of out_dir +# to save visualized rendering color maps and predicted results +>>> inferencer(images, out_dir='outputs', img_out_dir='vis', pred_out_dir='pred') +``` + +There is a optional parameter of inferencer, `return_datasamples`, whose default value is False, and return value of inferencer is a `dict` type by default, including 2 keys 'visualization' and 'predictions'. +If `return_datasamples=True` inferencer will return [`SegDataSample`](../advanced_guides/structures.md), or list of it. + +``` +result = inferencer('demo/demo.png') +# result is a `dict` including 2 keys 'visualization' and 'predictions' +# 'visualization' includes color segmentation map +print(result['visualization'].shape) +# (512, 683, 3) + +# 'predictions' includes segmentation mask with label indice +print(result['predictions'].shape) +# (512, 683) + +result = inferencer('demo/demo.png', return_datasamples=True) +print(type(result)) +# + +# Input a list of images +results = inferencer(images) +# The output is list +print(type(results['visualization']), results['visualization'][0].shape) +# (512, 683, 3) +print(type(results['predictions']), results['predictions'][0].shape) +# (512, 683) + +results = inferencer(images, return_datasamples=True) +# +print(type(results[0])) +# +``` + +### Initialization + +`MMSegInferencer` must be initialized from a `model`, which can be a model name or a `Config` even a path of config file. +The model names can be found in models' metafile (configs/xxx/metafile.yaml), like one model name of maskformer is `maskformer_r50-d32_8xb2-160k_ade20k-512x512`, and if input model name and the weights of the model will be download automatically. Below are other input parameters: + +- weights (str, optional) - Path to the checkpoint. If it is not specified and model is a model name of metafile, the weights will be loaded from metafile. Defaults to None. +- classes (list, optional) - Input classes for result rendering, as the prediction of segmentation model is a segment map with label indices, `classes` is a list which includes items responding to the label indices. If classes is not defined, visualizer will take `cityscapes` classes by default. Defaults to None. +- palette (list, optional) - Input palette for result rendering, which is a list of colors responding to the classes. If the palette is not defined, the visualizer will take the palette of `cityscapes` by default. Defaults to None. +- dataset_name (str, optional) - [Dataset name or alias](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/utils/class_names.py#L302-L317), visualizer will use the meta information of the dataset i.e. classes and palette, but the `classes` and `palette` have higher priority. Defaults to None. +- device (str, optional) - Device to run inference. If None, the available device will be automatically used. Defaults to None. +- scope (str, optional) - The scope of the model. Defaults to 'mmseg'. + +### Visualize prediction + +`MMSegInferencer` supports 4 parameters for visualize prediction, you can use them when call initialized inferencer: + +- show (bool) - Whether to display the image in a popup window. Defaults to False. +- wait_time (float) - The interval of show (s). Defaults to 0. +- img_out_dir (str) - Subdirectory of `out_dir`, used to save rendering color segmentation mask, so `out_dir` must be defined if you would like to save predicted mask. Defaults to 'vis'. +- opacity (int, float) - The transparency of segmentation mask. Defaults to 0.8. + +The examples of these parameters is in [Basic Usage](#basic-usage) + +### List model + +There is a very easy to list all model names in MMSegmentation + +``` +>>> from mmseg.apis import MMSegInferencer +# models is a list of model names, and them will print automatically +>>> models = MMSegInferencer.list_models('mmseg') +``` + +## Inference API + +### mmseg.apis.init_model + +Initialize a segmentor from config file. + +Parameters: + +- config (str, `Path`, or `mmengine.Config`) - Config file path or the config object. +- checkpoint (str, optional) - Checkpoint path. If left as None, the model will not load any weights. +- device (str, optional) - CPU/CUDA device option. Default 'cuda:0'. +- cfg_options (dict, optional) - Options to override some settings in the used config. + +Returns: + +- nn.Module: The constructed segmentor. + +Example: + +```python +from mmseg.apis import init_model + +config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' + +# initialize model without checkpoint +model = init_model(config_path) + +# init model and load checkpoint +model = init_model(config_path, checkpoint_path) + +# init model and load checkpoint on CPU +model = init_model(config_path, checkpoint_path, 'cpu') +``` + +### mmseg.apis.inference_model + +Inference image(s) with the segmentor. + +Parameters: + +- model (nn.Module) - The loaded segmentor +- imgs (str, np.ndarray, or list\[str/np.ndarray\]) - Either image files or loaded images + +Returns: + +- `SegDataSample` or list\[`SegDataSample`\]: If imgs is a list or tuple, the same length list type results will be returned, otherwise return the segmentation results directly. + +**Note:** [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) is a data structure interface of MMSegmentation, it is used as interfaces between different components. `SegDataSample` implement the abstract data element `mmengine.structures.BaseDataElement`, please refer to data element [documentation](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for more information. + +The attributes in `SegDataSample` are divided into several parts: + +- `gt_sem_seg` (`PixelData`) - Ground truth of semantic segmentation. +- `pred_sem_seg` (`PixelData`) - Prediction of semantic segmentation. +- `seg_logits` (`PixelData`) - Predicted logits of semantic segmentation. + +**Note** [PixelData](https://github.com/open-mmlab/mmengine/blob/main/mmengine/structures/pixel_data.py) is the data structure for pixel-level annotations or predictions, please refer to PixelData [documentation](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html) in [MMEngine](https://github.com/open-mmlab/mmengine) for more information. + +Example: + +```python +from mmseg.apis import init_model, inference_model + +config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' +img_path = 'demo/demo.png' + + +model = init_model(config_path, checkpoint_path) +result = inference_model(model, img_path) +``` + +### mmseg.apis.show_result_pyplot + +Visualize the segmentation results on the image. + +Parameters: + +- model (nn.Module) - The loaded segmentor. +- img (str or np.ndarray) - Image filename or loaded image. +- result (`SegDataSample`) - The prediction SegDataSample result. +- opacity (float) - Opacity of painted segmentation map. Default `0.5`, must be in `(0, 1]` range. +- title (str) - The title of pyplot figure. Default is ''. +- draw_gt (bool) - Whether to draw GT SegDataSample. Default to `True`. +- draw_pred (draws_pred) - Whether to draw Prediction SegDataSample. Default to `True`. +- wait_time (float) - The interval of show (s), 0 is the special value that means "forever". Default to `0`. +- show (bool) - Whether to display the drawn image. Default to `True`. +- save_dir (str, optional) - Save file dir for all storage backends. If it is `None`, the backend storage will not save any data. +- out_file (str, optional) - Path to output file. Default to `None`. + +Returns: + +- np.ndarray: the drawn image which channel is RGB. + +Example: + +```python +from mmseg.apis import init_model, inference_model, show_result_pyplot + +config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' +img_path = 'demo/demo.png' + + +# build the model from a config file and a checkpoint file +model = init_model(config_path, checkpoint_path, device='cuda:0') + +# inference on given image +result = inference_model(model, img_path) + +# display the segmentation result +vis_image = show_result_pyplot(model, img_path, result) + +# save the visualization result, the output image would be found at the path `work_dirs/result.png` +vis_iamge = show_result_pyplot(model, img_path, result, out_file='work_dirs/result.png') + +# Modify the time of displaying images, note that 0 is the special value that means "forever" +vis_image = show_result_pyplot(model, img_path, result, wait_time=5) +``` + +**Note:** If your current device doesn't have graphical user interface, it is recommended that setting `show` to `False` and specify the `out_file` or `save_dir` to save the results. If you would like to display the result on a window, no special settings are required. diff --git a/mmsegmentation/docs/en/user_guides/4_train_test.md b/mmsegmentation/docs/en/user_guides/4_train_test.md new file mode 100644 index 0000000..9b2d17d --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/4_train_test.md @@ -0,0 +1,315 @@ +# Tutorial 4: Train and test with existing models + +MMSegmentation supports training and testing models on a variety of devices, which are described below for single-GPU, distributed, and cluster training and testing, respectively. Through this tutorial, you will learn how to train and test using the scripts provided by MMSegmentation. + +## Training and testing on a single GPU + +### Training on a single GPU + +We provide `tools/train.py` to launch training jobs on a single GPU. +The basic usage is as follows. + +```shell +python tools/train.py ${CONFIG_FILE} [optional arguments] +``` + +This tool accepts several optional arguments, including: + +- `--work-dir ${WORK_DIR}`: Override the working directory. +- `--amp`: Use auto mixed precision training. +- `--resume`: Resume from the latest checkpoint in the work_dir automatically. +- `--cfg-options ${OVERRIDE_CONFIGS}`: Override some settings in the used config, and the key-value pair in xxx=yyy format will be merged into the config file. + For example, '--cfg-option model.encoder.in_channels=6'. Please see this [guide](./1_config.md#Modify-config-through-script-arguments) for more details. + +Below are the optional arguments for the multi-gpu test: + +- `--launcher`: Items for distributed job initialization launcher. Allowed choices are `none`, `pytorch`, `slurm`, `mpi`. Especially, if set to none, it will test in a non-distributed mode. +- `--local_rank`: ID for local rank. If not specified, it will be set to 0. + +**Note:** Difference between the argument `--resume` and the field `load_from` in the config file: + +`--resume` only determines whether to resume from the latest checkpoint in the work_dir. It is usually used for resuming the training process that is interrupted accidentally. + +`load_from` will specify the checkpoint to be loaded and the training iteration starts from 0. It is usually used for fine-tuning. + +If you would like to resume training from a specific checkpoint, you can use: + +```python +python tools/train.py ${CONFIG_FILE} --resume --cfg-options load_from=${CHECKPOINT} +``` + +**Training on CPU**: The process of training on the CPU is consistent with single GPU training if a machine does not have GPU. If it has GPUs but not wanting to use them, we just need to disable GPUs before the training process. + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +And then run the script [above](#training-on-a-single-gpu). + +### Testing on a single GPU + +We provide `tools/test.py` to launch training jobs on a single GPU. +The basic usage is as follows. + +```shell +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments] +``` + +This tool accepts several optional arguments, including: + +- `--work-dir`: If specified, results will be saved in this directory. If not specified, the results will be automatically saved to `work_dirs/{CONFIG_NAME}`. +- `--show`: Show prediction results at runtime, available when `--show-dir` is not specified. +- `--show-dir`: Directory where painted images will be saved. If specified, the visualized segmentation mask will be saved to the `work_dir/timestamp/show_dir`. +- `--wait-time`: The interval of show (s), which takes effect when `--show` is activated. Default to 2. +- `--cfg-options`: If specified, the key-value pair in xxx=yyy format will be merged into the config file. +- `--tta`: Test time augmentation option. + +**Testing on CPU**: The process of testing on the CPU is consistent with single GPU testing if a machine does not have GPU. If it has GPUs but not wanting to use them, we just need to disable GPUs before the training process. + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +then run the script [above](#testing-on-a-single-gpu). + +## Training and testing on multiple GPUs and multiple machines + +### Training on multiple GPUs + +OpenMMLab2.0 implements **distributed** training with `MMDistributedDataParallel`. +We provide `tools/dist_train.sh` to launch training on multiple GPUs. + +The basic usage is as follows: + +```shell +sh tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] +``` + +Optional arguments remain the same as stated [above](#training-on-a-single-gpu) and have additional arguments to specify the number of GPUs. + +An example: + +```shell +# checkpoints and logs saved in WORK_DIR=work_dirs/pspnet_r50-d8_4xb4-80k_ade20k-512x512/ +# If work_dir is not set, it will be generated automatically. +sh tools/dist_train.sh configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py 8 --work-dir work_dirs/pspnet_r50-d8_4xb4-80k_ade20k-512x512 +``` + +**Note**: During training, checkpoints and logs are saved in the same folder structure as the config file under `work_dirs/`. A custom work directory is not recommended since evaluation scripts infer work directories from the config file name. If you want to save your weights somewhere else, please use a symlink, for example: + +```shell +ln -s ${YOUR_WORK_DIRS} ${MMSEG}/work_dirs +``` + +### Testing on multiple GPUs + +We provide `tools/dist_test.sh` to launch testing on multiple GPUs. +The basic usage is as follows. + +```shell +sh tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [optional arguments] +``` + +Optional arguments remain the same as stated [above](#testing-on-a-single-gpu) and have additional arguments to specify the number of GPUs. + +An example: + +```shell +./tools/dist_test.sh configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth 4 +``` + +### Launch multiple jobs on a single machine + +If you launch multiple jobs on a single machine, e.g., 2 jobs of 4-GPU training on a machine with 8 GPUs, you need to specify different ports (29500 by default) for each job to avoid communication conflict. Otherwise, there will be an error message saying `RuntimeError: Address already in use`. +If you use `dist_train.sh` to launch training jobs, you can set the port in commands with the environment variable `PORT`. + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 sh tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 sh tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +### Training with multiple machines + +MMSegmentation relies on `torch.distributed` package for distributed training. +Thus, as a basic usage, one can launch distributed training via PyTorch's [launch utility](https://pytorch.org/docs/stable/distributed.html#launch-utility). + +If you launch with multiple machines simply connected with ethernet, you can simply run the following commands: +On the first machine: + +```shell +NNODES=2 NODE_RANK=0 PORT=${MASTER_PORT} MASTER_ADDR=${MASTER_ADDR} sh tools/dist_train.sh ${CONFIG_FILE} ${GPUS} +``` + +On the second machine: + +```shell +NNODES=2 NODE_RANK=1 PORT=${MASTER_PORT} MASTER_ADDR=${MASTER_ADDR} sh tools/dist_train.sh ${CONFIG_FILE} ${GPUS} +``` + +Usually, it is slow if you do not have high-speed networking like InfiniBand. + +## Manage jobs with Slurm + +[Slurm](https://slurm.schedmd.com/) is a good job scheduling system for computing clusters. + +### Training on a cluster with Slurm + +On a cluster managed by Slurm, you can use `slurm_train.sh` to spawn training jobs. It supports both single-node and multi-node training. + +The basic usage is as follows: + +```shell +[GPUS=${GPUS}] sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} [optional arguments] +``` + +Below is an example of using 4 GPUs to train PSPNet on a Slurm partition named _dev_, and set the work-dir to some shared file systems. + +```shell +GPUS=4 sh tools/slurm_train.sh dev pspnet configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py --work-dir work_dir/pspnet +``` + +You can check [the source code](../../../tools/slurm_train.sh) to review full arguments and environment variables. + +### Testing on a cluster with Slurm + +Similar to the training task, MMSegmentation provides `slurm_test.sh` to launch testing jobs. + +The basic usage is as follows: + +```shell +[GPUS=${GPUS}] sh tools/slurm_test.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments] +``` + +You can check [the source code](../../../tools/slurm_test.sh) to review full arguments and environment variables. + +**Note:** When using Slurm, the port option needs to be set in one of the following ways: + +1. Set the port through `--cfg-options`. This is more recommended since it does not change the original configs. + + ```shell + GPUS=4 GPUS_PER_NODE=4 sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} --cfg-options env_cfg.dist_cfg.port=29500 + GPUS=4 GPUS_PER_NODE=4 sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} --cfg-options env_cfg.dist_cfg.port=29501 + ``` + +2. Modify the config files to set different communication ports. + In `config1.py`: + + ```python + enf_cfg = dict(dist_cfg=dict(backend='nccl', port=29500)) + ``` + + In `config2.py`: + + ```python + enf_cfg = dict(dist_cfg=dict(backend='nccl', port=29501)) + ``` + + Then you can launch two jobs with config1.py and config2.py. + + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} + CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} + ``` + +3. Set the port in the command using the environment variable 'MASTER_PORT': + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 MASTER_PORT=29500 sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} +CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 MASTER_PORT=29501 sh tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} +``` + +## Testing and saving segment files + +### Basic Usage + +When you want to save the results, you can use `--out` to specify the output directory. + +```shell +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --out ${OUTPUT_DIR} +``` + +Here is an example to save the predicted results from model `fcn_r50-d8_4xb4-80k_ade20k-512x512` on ADE20k validatation dataset. + +```shell +python tools/test.py configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py ckpt/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth --out work_dirs/format_results +``` + +You also can modify the config file to define `output_dir`. We also take +`fcn_r50-d8_4xb4-80k_ade20k-512x512` as example just add +`test_evaluator` in `configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py` + +```python +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'], output_dir='work_dirs/format_results') +``` + +then run command without `--out`: + +```shell +python tools/test.py configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py ckpt/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth +``` + +If you would like to only save the predicted results without evaluation as annotation is not released by the official dataset, you can set `format_only=True` and modify `test_dataloader`. +As there is no annotation in dataset, we remove `dict(type='LoadAnnotations')` from `test_dataloader` Here is the example configuration: + +```python +test_evaluator = dict( + type='IoUMetric', + iou_metrics=['mIoU'], + format_only=True, + output_dir='work_dirs/format_results') +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type = 'ADE20KDataset' + data_root='data/ade/release_test', + data_prefix=dict(img_path='testing'), + # we don't load annotation in test transform pipeline. + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + dict(type='PackSegInputs') + ])) +``` + +then run test command: + +```shell +python tools/test.py configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py ckpt/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth +``` + +### Testing Cityscape dataset and save predicted segment files + +We recommend `CityscapesMetric` which is the wrapper of Cityscapes'sdk, when you want to +save the predicted results of Cityscape test dataset to submit them in [Cityscape test server](https://www.cityscapes-dataset.com/submit/). Here is the example configuration: + +```python +test_evaluator = dict( + type='CityscapesMetric', + format_only=True, + keep_results=True, + output_dir='work_dirs/format_results') +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='CityscapesDataset', + data_root='data/cityscapes/', + data_prefix=dict(img_path='leftImg8bit/test'), + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + dict(type='PackSegInputs') + ])) +``` + +then run test command, for example: + +```shell +python tools/test.py configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py ckpt/fcn_r18-d8_512x1024_80k_cityscapes_20201225_021327-6c50f8b4.pth +``` diff --git a/mmsegmentation/docs/en/user_guides/5_deployment.md b/mmsegmentation/docs/en/user_guides/5_deployment.md new file mode 100644 index 0000000..b3b8f57 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/5_deployment.md @@ -0,0 +1,255 @@ +# Tutorial 5: Model Deployment + +# MMSegmentation Model Deployment + +- [Tutorial 5: Model Deployment](#tutorial-5-model-deployment) +- [MMSegmentation Model Deployment](#mmsegmentation-model-deployment) + - [Installation](#installation) + - [Install mmseg](#install-mmseg) + - [Install mmdeploy](#install-mmdeploy) + - [Convert model](#convert-model) + - [Model specification](#model-specification) + - [Model inference](#model-inference) + - [Backend model inference](#backend-model-inference) + - [SDK model inference](#sdk-model-inference) + - [Supported models](#supported-models) + - [Note](#note) + +______________________________________________________________________ + +[MMSegmentation](https://github.com/open-mmlab/mmsegmentation/tree/main), also known as `mmseg`, is an open source semantic segmentation toolbox based on Pytorch. It's a part of the [OpenMMLab](<(https://openmmlab.com/)>) object. + +## Installation + +### Install mmseg + +Please follow the [Installation Guide](https://mmsegmentation.readthedocs.io/en/latest/get_started.html). + +### Install mmdeploy + +`mmdeploy` can be installed as follows: + +**Option 1:** Install precompiled package + +Please follow the [Installation overview](https://mmdeploy.readthedocs.io/zh_CN/latest/get_started.html#mmdeploy) + +**Option 2:** Automatic Installation script + +If the deployment platform is **Ubuntu 18.04 +**, please follow the [scription installation](../01-how-to-build/build_from_script.md) to install. +For example, the following commands describe how to install mmdeploy and inference engine-`ONNX Runtime`. + +```shell +git clone --recursive -b main https://github.com/open-mmlab/mmdeploy.git +cd mmdeploy +python3 tools/scripts/build_ubuntu_x64_ort.py $(nproc) +export PYTHONPATH=$(pwd)/build/lib:$PYTHONPATH +export LD_LIBRARY_PATH=$(pwd)/../mmdeploy-dep/onnxruntime-linux-x64-1.8.1/lib/:$LD_LIBRARY_PATH +``` + +**NOTE**: + +- Add `$(pwd)/build/lib` to `PYTHONPATH`, can loading mmdeploy SDK python package `mmdeploy_runtime`. See [SDK model inference](#SDK-model-inference) for more information. +- With [ONNX Runtime model inference](#Backend-model-inference), need to load custom operator library and add ONNX Runtime Library's PATH to `LD_LIBRARY_PATH`. + +**Option 3:** Install with mim + +1. Use mim to install mmcv + +```shell +pip install -U openmim +mim install "mmcv>=2.0.0rc2" +``` + +2. Install mmdeploy + +```shell +git clone https://github.com/open-mmlab/mmdeploy.git +cd mmdeploy +mim install -e . +``` + +**Option 4:** Build MMDeploy from source + +If the first three methods aren't suitable, please [Build MMDeploy from source](<(../01-how-to-build/build_from_source.md)>) + +## Convert model + +[tools/deploy.py](https://github.com/open-mmlab/mmdeploy/tree/main/tools/deploy.py) can convert mmseg Model to backend model conveniently. See [this](https://github.com/open-mmlab/mmdeploy/tree/main/docs/en/02-how-to-run/convert_model.md#usage) for detailed information. + +Then convert `unet` to onnx model as follows: + +```shell +cd mmdeploy + +# download unet model from mmseg model zoo +mim download mmsegmentation --config unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024 --dest . + +# convert mmseg model to onnxruntime model with dynamic shape +python tools/deploy.py \ + configs/mmseg/segmentation_onnxruntime_dynamic.py \ + unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py \ + fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204-6860854e.pth \ + demo/resources/cityscapes.png \ + --work-dir mmdeploy_models/mmseg/ort \ + --device cpu \ + --show \ + --dump-info +``` + +It is crucial to specify the correct deployment config during model conversion. MMDeploy has already provided builtin deployment config [files](https://github.com/open-mmlab/mmdeploy/tree/main/configs/mmseg) of all supported backends for mmsegmentation, under which the config file path follows the pattern: + +``` +segmentation_{backend}-{precision}_{static | dynamic}_{shape}.py +``` + +- **{backend}:** inference backend, such as onnxruntime, tensorrt, pplnn, ncnn, openvino, coreml etc. +- **{precision}:** fp16, int8. When it's empty, it means fp32 +- **{static | dynamic}:** static shape or dynamic shape +- **{shape}:** input shape or shape range of a model + +Therefore, in the above example, you can also convert `unet` to tensorrt-fp16 model by `segmentation_tensorrt-fp16_dynamic-512x1024-2048x2048.py`. + +```{tip} +When converting mmsegmentation models to tensorrt models, --device should be set to "cuda" +``` + +## Model specification + +Before moving on to model inference chapter, let's know more about the converted model structure which is very important for model inference. + +The converted model locates in the working directory like `mmdeploy_models/mmseg/ort` in the previous example. It includes: + +``` +mmdeploy_models/mmseg/ort +โ”œโ”€โ”€ deploy.json +โ”œโ”€โ”€ detail.json +โ”œโ”€โ”€ end2end.onnx +โ””โ”€โ”€ pipeline.json +``` + +in which, + +- **end2end.onnx**: backend model which can be inferred by ONNX Runtime +- ***xxx*.json**: the necessary information for mmdeploy SDK + +The whole package **mmdeploy_models/mmseg/ort** is defined as **mmdeploy SDK model**, i.e., **mmdeploy SDK model** includes both backend model and inference meta information. + +## Model inference + +### Backend model inference + +Take the previous converted `end2end.onnx` model as an example, you can use the following code to inference the model and visualize the results: + +```python +from mmdeploy.apis.utils import build_task_processor +from mmdeploy.utils import get_input_shape, load_config +import torch + +deploy_cfg = 'configs/mmseg/segmentation_onnxruntime_dynamic.py' +model_cfg = './unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py' +device = 'cpu' +backend_model = ['./mmdeploy_models/mmseg/ort/end2end.onnx'] +image = './demo/resources/cityscapes.png' + +# read deploy_cfg and model_cfg +deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) + +# build task and backend model +task_processor = build_task_processor(model_cfg, deploy_cfg, device) +model = task_processor.build_backend_model(backend_model) + +# process input image +input_shape = get_input_shape(deploy_cfg) +model_inputs, _ = task_processor.create_input(image, input_shape) + +# do model inference +with torch.no_grad(): + result = model.test_step(model_inputs) + +# visualize results +task_processor.visualize( + image=image, + model=model, + result=result[0], + window_name='visualize', + output_file='./output_segmentation.png') +``` + +### SDK model inference + +You can also perform SDK model inference like following: + +```python +from mmdeploy_runtime import Segmentor +import cv2 +import numpy as np + +img = cv2.imread('./demo/resources/cityscapes.png') + +# create a classifier +segmentor = Segmentor(model_path='./mmdeploy_models/mmseg/ort', device_name='cpu', device_id=0) +# perform inference +seg = segmentor(img) + +# visualize inference result +## random a palette with size 256x3 +palette = np.random.randint(0, 256, size=(256, 3)) +color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) +for label, color in enumerate(palette): + color_seg[seg == label, :] = color +# convert to BGR +color_seg = color_seg[..., ::-1] +img = img * 0.5 + color_seg * 0.5 +img = img.astype(np.uint8) +cv2.imwrite('output_segmentation.png', img) +``` + +Besides python API, mmdeploy SDK also provides other FFI (Foreign Function Interface), such as C, C++, C#, Java and so on. You can learn their usage from [demo](https://github.com/open-mmlab/mmdeploy/tree/main/demo) + +## Supported models + +| Model | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVino | +| :-------------------------------------------------------------------------------------------------------- | :---------: | :---------: | :------: | :--: | :---: | :------: | +| [FCN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fcn) | Y | Y | Y | Y | Y | Y | +| [PSPNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/pspnet)[\*](#static_shape) | Y | Y | Y | Y | Y | Y | +| [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3) | Y | Y | Y | Y | Y | Y | +| [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3plus) | Y | Y | Y | Y | Y | Y | +| [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fastscnn)[\*](#static_shape) | Y | Y | Y | N | Y | Y | +| [UNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/unet) | Y | Y | Y | Y | Y | Y | +| [ANN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/ann)[\*](#static_shape) | Y | Y | Y | N | N | N | +| [APCNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/apcnet) | Y | Y | Y | Y | N | N | +| [BiSeNetV1](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/bisenetv1) | Y | Y | Y | Y | N | Y | +| [BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/bisenetv2) | Y | Y | Y | Y | N | Y | +| [CGNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/cgnet) | Y | Y | Y | Y | N | Y | +| [DMNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/dmnet) | ? | Y | N | N | N | N | +| [DNLNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/dnlnet) | ? | Y | Y | Y | N | Y | +| [EMANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/emanet) | Y | Y | Y | N | N | Y | +| [EncNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/encnet) | Y | Y | Y | N | N | Y | +| [ERFNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/erfnet) | Y | Y | Y | Y | N | Y | +| [FastFCN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fastfcn) | Y | Y | Y | Y | N | Y | +| [GCNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/gcnet) | Y | Y | Y | N | N | N | +| [ICNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/icnet)[\*](#static_shape) | Y | Y | Y | N | N | Y | +| [ISANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/isanet)[\*](#static_shape) | N | Y | Y | N | N | Y | +| [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/nonlocal_net) | ? | Y | Y | Y | N | Y | +| [OCRNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/ocrnet) | Y | Y | Y | Y | N | Y | +| [PointRend](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/point_rend)[\*](#static_shape) | Y | Y | Y | N | N | N | +| [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/sem_fpn) | Y | Y | Y | Y | N | Y | +| [STDC](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/stdc) | Y | Y | Y | Y | N | Y | +| [UPerNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/upernet)[\*](#static_shape) | N | Y | Y | N | N | N | +| [DANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/danet) | ? | Y | Y | N | N | Y | +| [Segmenter](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/segmenter)[\*](#static_shape) | N | Y | Y | Y | N | Y | +| [SegFormer](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/segformer)[\*](#static_shape) | ? | Y | Y | N | N | Y | +| [SETR](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/setr) | ? | Y | N | N | N | Y | +| [CCNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/ccnet) | ? | N | N | N | N | N | +| [PSANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/psanet) | ? | N | N | N | N | N | +| [DPT](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/dpt) | ? | N | N | N | N | N | + +## Note + +- All mmseg models only support the 'whole' inference mode. + +- PSPNet๏ผŒFast-SCNN only supports static input, because most inference framework's [nn.AdaptiveAvgPool2d](https://github.com/open-mmlab/mmsegmentation/blob/0c87f7a0c9099844eff8e90fa3db5b0d0ca02fee/mmseg/models/decode_heads/psp_head.py#L38) don't support dynamic inputใ€‚ + +- For models that only support static shapes, should use the static shape deployment config file, such as `configs/mmseg/segmentation_tensorrt_static-1024x2048.py` + +- To deploy models to generate probabilistic feature maps, please add `codebase_config = dict(with_argmax=False)` to deployment config file. diff --git a/mmsegmentation/docs/en/user_guides/index.rst b/mmsegmentation/docs/en/user_guides/index.rst new file mode 100644 index 0000000..1feb127 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/index.rst @@ -0,0 +1,21 @@ +Train & Test +************** + +.. toctree:: + :maxdepth: 1 + + 1_config.md + 2_dataset_prepare.md + 3_inference.md + 4_train_test.md + +Useful Tools +************* + +.. toctree:: + :maxdepth: 2 + + visualization.md + useful_tools.md + deployment.md + visualization_feature_map.md diff --git a/mmsegmentation/docs/en/user_guides/useful_tools.md b/mmsegmentation/docs/en/user_guides/useful_tools.md new file mode 100644 index 0000000..0d86778 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/useful_tools.md @@ -0,0 +1,245 @@ +# \[WIP\] Useful Tools + +Apart from training/testing scripts, We provide lots of useful tools under the +`tools/` directory. + +## Analysis Tools + +### Plot training logs + +`tools/analyze_logs.py` plots loss/mIoU curves given a training log file. `pip install seaborn` first to install the dependency. + +```shell +python tools/analysis_tools/analyze_logs.py xxx.json [--keys ${KEYS}] [--legend ${LEGEND}] [--backend ${BACKEND}] [--style ${STYLE}] [--out ${OUT_FILE}] +``` + +Examples: + +- Plot the mIoU, mAcc, aAcc metrics. + + ```shell + python tools/analysis_tools/analyze_logs.py log.json --keys mIoU mAcc aAcc --legend mIoU mAcc aAcc + ``` + +- Plot loss metric. + + ```shell + python tools/analysis_tools/analyze_logs.py log.json --keys loss --legend loss + ``` + +### Confusion Matrix (experimental) + +In order to generate and plot a `nxn` confusion matrix where `n` is the number of classes, you can follow the steps: + +#### 1.Generate a prediction result in pkl format using `test.py` + +```shell +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${PATH_TO_RESULT_FILE}] +``` + +Example: + +```shell +python tools/test.py \ +configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py \ +checkpoint/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth \ +--out result/pred_result.pkl +``` + +#### 2. Use `confusion_matrix.py` to generate and plot a confusion matrix + +```shell +python tools/confusion_matrix.py ${CONFIG_FILE} ${PATH_TO_RESULT_FILE} ${SAVE_DIR} --show +``` + +Description of arguments: + +- `config`: Path to the test config file. +- `prediction_path`: Path to the prediction .pkl result. +- `save_dir`: Directory where confusion matrix will be saved. +- `--show`: Enable result visualize. +- `--color-theme`: Theme of the matrix color map. +- `--cfg_options`: Custom options to replace the config file. + +Example: + +```shell +python tools/confusion_matrix.py \ +configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py \ +result/pred_result.pkl \ +result/confusion_matrix \ +--show +``` + +### Get the FLOPs and params (experimental) + +We provide a script adapted from [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) to compute the FLOPs and params of a given model. + +```shell +python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +You will get the result like this. + +```none +============================== +Input shape: (3, 2048, 1024) +Flops: 1429.68 GMac +Params: 48.98 M +============================== +``` + +:::{note} +This tool is still experimental and we do not guarantee that the number is correct. You may well use the result for simple comparisons, but double check it before you adopt it in technical reports or papers. +::: + +(1) FLOPs are related to the input shape while parameters are not. The default input shape is (1, 3, 1280, 800). +(2) Some operators are not counted into FLOPs like GN and custom operators. + +## Miscellaneous + +### Publish a model + +Before you upload a model to AWS, you may want to +(1) convert model weights to CPU tensors, (2) delete the optimizer states and +(3) compute the hash of the checkpoint file and append the hash id to the filename. + +```shell +python tools/misc/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +E.g., + +```shell +python tools/publish_model.py work_dirs/pspnet/latest.pth psp_r50_512x1024_40k_cityscapes.pth +``` + +The final output filename will be `psp_r50_512x1024_40k_cityscapes-{hash id}.pth`. + +### Print the entire config + +`tools/misc/print_config.py` prints the whole config verbatim, expanding all its +imports. + +```shell +python tools/misc/print_config.py \ + ${CONFIG} \ + --graph \ + --cfg-options ${OPTIONS [OPTIONS...]} \ +``` + +Description of arguments: + +- `config` : The path of a pytorch model config file. +- `--graph` : Determines whether to print the models graph. +- `--cfg-options`: Custom options to replace the config file. + +## Model conversion + +`tools/model_converters/` provide several scripts to convert pretrain models released by other repos to MMSegmentation style. + +### ViT Swin MiT Transformer Models + +- ViT + + `tools/model_converters/vit2mmseg.py` convert keys in timm pretrained vit models to MMSegmentation style. + + ```shell + python tools/model_converters/vit2mmseg.py ${SRC} ${DST} + ``` + +- Swin + + `tools/model_converters/swin2mmseg.py` convert keys in official pretrained swin models to MMSegmentation style. + + ```shell + python tools/model_converters/swin2mmseg.py ${SRC} ${DST} + ``` + +- SegFormer + + `tools/model_converters/mit2mmseg.py` convert keys in official pretrained mit models to MMSegmentation style. + + ```shell + python tools/model_converters/mit2mmseg.py ${SRC} ${DST} + ``` + +## Model Serving + +In order to serve an `MMSegmentation` model with [`TorchServe`](https://pytorch.org/serve/), you can follow the steps: + +### 1. Convert model from MMSegmentation to TorchServe + +```shell +python tools/torchserve/mmseg2torchserve.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \ +--output-folder ${MODEL_STORE} \ +--model-name ${MODEL_NAME} +``` + +:::{note} +${MODEL_STORE} needs to be an absolute path to a folder. +::: + +### 2. Build `mmseg-serve` docker image + +```shell +docker build -t mmseg-serve:latest docker/serve/ +``` + +### 3. Run `mmseg-serve` + +Check the official docs for [running TorchServe with docker](https://github.com/pytorch/serve/blob/master/docker/README.md#running-torchserve-in-a-production-docker-environment). + +In order to run in GPU, you need to install [nvidia-docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). You can omit the `--gpus` argument in order to run in CPU. + +Example: + +```shell +docker run --rm \ +--cpus 8 \ +--gpus device=0 \ +-p8080:8080 -p8081:8081 -p8082:8082 \ +--mount type=bind,source=$MODEL_STORE,target=/home/model-server/model-store \ +mmseg-serve:latest +``` + +[Read the docs](https://github.com/pytorch/serve/blob/072f5d088cce9bb64b2a18af065886c9b01b317b/docs/rest_api.md) about the Inference (8080), Management (8081) and Metrics (8082) APIs + +### 4. Test deployment + +```shell +curl -O https://raw.githubusercontent.com/open-mmlab/mmsegmentation/master/resources/3dogs.jpg +curl http://127.0.0.1:8080/predictions/${MODEL_NAME} -T 3dogs.jpg -o 3dogs_mask.png +``` + +The response will be a ".png" mask. + +You can visualize the output as follows: + +```python +import matplotlib.pyplot as plt +import mmcv +plt.imshow(mmcv.imread("3dogs_mask.png", "grayscale")) +plt.show() +``` + +You should see something similar to: + +![3dogs_mask](../../resources/3dogs_mask.png) + +And you can use `test_torchserve.py` to compare result of torchserve and pytorch, and visualize them. + +```shell +python tools/torchserve/test_torchserve.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} ${MODEL_NAME} +[--inference-addr ${INFERENCE_ADDR}] [--result-image ${RESULT_IMAGE}] [--device ${DEVICE}] +``` + +Example: + +```shell +python tools/torchserve/test_torchserve.py \ +demo/demo.png \ +configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py \ +checkpoint/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth \ +fcn +``` diff --git a/mmsegmentation/docs/en/user_guides/visualization.md b/mmsegmentation/docs/en/user_guides/visualization.md new file mode 100644 index 0000000..e7c3359 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/visualization.md @@ -0,0 +1,174 @@ +# Visualization + +MMSegmentation 1.x provides convenient ways for monitoring training status or visualizing data and model predictions. + +## Training status Monitor + +MMSegmentation 1.x uses TensorBoard to monitor training status. + +### TensorBoard Configuration + +Install TensorBoard following [official instructions](https://www.tensorflow.org/install) e.g. + +```shell +pip install tensorboardX +pip install future tensorboard +``` + +Add `TensorboardVisBackend` in `vis_backend` of `visualizer` in `default_runtime.py` config file: + +```python +vis_backends = [dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +``` + +### Examining scalars in TensorBoard + +Launch training experiment e.g. + +```shell +python tools/train.py configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py --work-dir work_dir/test_visual +``` + +Find the `vis_data` path of `work_dir` after starting training, for example, the vis_data path of this particular test is as follows: + +```shell +work_dirs/test_visual/20220810_115248/vis_data +``` + +The scalar file in vis_data path includes learning rate, losses and data_time etc, also record metrics results and you can refer [logging tutorial](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/logging.html) in MMEngine to log custom data. The tensorboard visualization results are executed with the following command: + +```shell +tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data +``` + +## Data and Results visualization + +### Visualizer Data Samples during Model Testing or Validation + +MMSegmentation provides `SegVisualizationHook` which is a [hook](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/hook.md) working to visualize ground truth and prediction of segmentation during model testing and evaluation. Its configuration is in `default_hooks`, please see [Runner tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/runner.md) for more details. + +For example, In `_base_/schedules/schedule_20k.py`, modify the `SegVisualizationHook` configuration, set `draw` to `True` to enable the storage of network inference results, `interval` indicates the sampling interval of the prediction results, and when set to 1, each inference result of the network will be saved. `interval` is set to 50 by default: + +```python +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook', draw=True, interval=1)) + +``` + +After launch training experiment, visualization results will be stored in the local folder in validation loop, +or when launch evaluation a model on one dataset, the prediction results will be store in the local. +The stored results of the local visualization are kept in `vis_image` under `$WORK_DIRS/vis_data`, e.g.: + +```shell +work_dirs/test_visual/20220810_115248/vis_data/vis_image +``` + +In addition, if `TensorboardVisBackend` is add in `vis_backends`, like [above](#tensorboard-configuration), +we can also run the following command to view them in TensorBoard: + +```shell +tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data +``` + +### Visualize a Single Data Sample + +If you want to visualize a single data sample, we suggest to use `SegLocalVisualizer`. + +`SegLocalVisualizer` is child class inherits from `Visualizer` in MMEngine and works for MMSegmentation visualization, for more details about `Visualizer` please refer to [visualization tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/visualization.md) in MMEngine. + +Here is an example about `SegLocalVisualizer`, first you may download example data below by following commands: + +
+ +
+ +```shell +wget https://user-images.githubusercontent.com/24582831/189833109-eddad58f-f777-4fc0-b98a-6bd429143b06.png --output-document aachen_000000_000019_leftImg8bit.png +wget https://user-images.githubusercontent.com/24582831/189833143-15f60f8a-4d1e-4cbb-a6e7-5e2233869fac.png --output-document aachen_000000_000019_gtFine_labelTrainIds.png +``` + +Then you can find their local path and use the scripts below to visualize: + +```python +import mmcv +import os.path as osp +import torch +# `PixelData` is data structure for pixel-level annotations or predictions defined in MMEngine. +# Please refer to below tutorial file of data structures in MMEngine: +# https://github.com/open-mmlab/mmengine/tree/main/docs/en/advanced_tutorials/data_element.md + +from mmengine.structures import PixelData + +# `SegDataSample` is data structure interface between different components +# defined in MMSegmentation, it includes ground truth, prediction and +# predicted logits of semantic segmentation. +# Please refer to below tutorial file of `SegDataSample` for more details: +# https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/advanced_guides/structures.md + +from mmseg.structures import SegDataSample +from mmseg.visualization import SegLocalVisualizer + +out_file = 'out_file_cityscapes' +save_dir = './work_dirs' + +image = mmcv.imread( + osp.join( + osp.dirname(__file__), + './aachen_000000_000019_leftImg8bit.png' + ), + 'color') +sem_seg = mmcv.imread( + osp.join( + osp.dirname(__file__), + './aachen_000000_000019_gtFine_labelTrainIds.png' # noqa + ), + 'unchanged') +sem_seg = torch.from_numpy(sem_seg) +gt_sem_seg_data = dict(data=sem_seg) +gt_sem_seg = PixelData(**gt_sem_seg_data) +data_sample = SegDataSample() +data_sample.gt_sem_seg = gt_sem_seg + +seg_local_visualizer = SegLocalVisualizer( + vis_backends=[dict(type='LocalVisBackend')], + save_dir=save_dir) + +# The meta information of dataset usually includes `classes` for class names and +# `palette` for visualization color of each foreground. +# All class names and palettes are defined in the file: +# https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/utils/class_names.py + +seg_local_visualizer.dataset_meta = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', + 'pole', 'traffic light', 'traffic sign', + 'vegetation', 'terrain', 'sky', 'person', 'rider', + 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], + [102, 102, 156], [190, 153, 153], [153, 153, 153], + [250, 170, 30], [220, 220, 0], [107, 142, 35], + [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], + [119, 11, 32]]) +# When `show=True`, the results would be shown directly, +# else if `show=False`, the results would be saved in local directory folder. +seg_local_visualizer.add_datasample(out_file, image, + data_sample, show=False) +``` + +Then the visualization result of image with its corresponding ground truth could be found in `./work_dirs/vis_data/vis_image/` whose name is `out_file_cityscapes_0.png`: + +
+ +
+ +If you would like to know more visualization usage, you can refer to [visualization tutorial](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/visualization.html) in MMEngine. diff --git a/mmsegmentation/docs/en/user_guides/visualization_feature_map.md b/mmsegmentation/docs/en/user_guides/visualization_feature_map.md new file mode 100644 index 0000000..08398e5 --- /dev/null +++ b/mmsegmentation/docs/en/user_guides/visualization_feature_map.md @@ -0,0 +1,201 @@ +# Wandb Feature Map Visualization + +MMSegmentation 1.x provides backend support for Weights & Biases to facilitate visualization and management of project code results. + +## Wandb Configuration + +Install Weights & Biases following [official instructions](https://docs.wandb.ai/quickstart) e.g. + +```shell +pip install wandb +wandb login +``` + +Add `WandbVisBackend` in `vis_backend` of `visualizer` in `default_runtime.py` config file: + +```python +vis_backends=[dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend'), + dict(type='WandbVisBackend')] +``` + +## Examining feature map visualization in Wandb + +`SegLocalVisualizer` is child class inherits from `Visualizer` in MMEngine and works for MMSegmentation visualization, for more details about `Visualizer` please refer to [visualization tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/visualization.md) in MMEngine. + +Here is an example about `SegLocalVisualizer`, first you may download example data below by following commands: + +
+ +
+ +```shell +wget https://user-images.githubusercontent.com/24582831/189833109-eddad58f-f777-4fc0-b98a-6bd429143b06.png --output-document aachen_000000_000019_leftImg8bit.png +wget https://user-images.githubusercontent.com/24582831/189833143-15f60f8a-4d1e-4cbb-a6e7-5e2233869fac.png --output-document aachen_000000_000019_gtFine_labelTrainIds.png + +wget https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth + +``` + +```python +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser +from typing import Type + +import mmcv +import torch +import torch.nn as nn + +from mmengine.model import revert_sync_batchnorm +from mmengine.structures import PixelData +from mmseg.apis import inference_model, init_model +from mmseg.structures import SegDataSample +from mmseg.utils import register_all_modules +from mmseg.visualization import SegLocalVisualizer + + +class Recorder: + """record the forward output feature map and save to data_buffer.""" + + def __init__(self) -> None: + self.data_buffer = list() + + def __enter__(self, ): + self._data_buffer = list() + + def record_data_hook(self, model: nn.Module, input: Type, output: Type): + self.data_buffer.append(output) + + def __exit__(self, *args, **kwargs): + pass + + +def visualize(args, model, recorder, result): + seg_visualizer = SegLocalVisualizer( + vis_backends=[dict(type='WandbVisBackend')], + save_dir='temp_dir', + alpha=0.5) + seg_visualizer.dataset_meta = dict( + classes=model.dataset_meta['classes'], + palette=model.dataset_meta['palette']) + + image = mmcv.imread(args.img, 'color') + + seg_visualizer.add_datasample( + name='predict', + image=image, + data_sample=result, + draw_gt=False, + draw_pred=True, + wait_time=0, + out_file=None, + show=False) + + # add feature map to wandb visualizer + for i in range(len(recorder.data_buffer)): + feature = recorder.data_buffer[i][0] # remove the batch + drawn_img = seg_visualizer.draw_featmap( + feature, image, channel_reduction='select_max') + seg_visualizer.add_image(f'feature_map{i}', drawn_img) + + if args.gt_mask: + sem_seg = mmcv.imread(args.gt_mask, 'unchanged') + sem_seg = torch.from_numpy(sem_seg) + gt_mask = dict(data=sem_seg) + gt_mask = PixelData(**gt_mask) + data_sample = SegDataSample() + data_sample.gt_sem_seg = gt_mask + + seg_visualizer.add_datasample( + name='gt_mask', + image=image, + data_sample=data_sample, + draw_gt=True, + draw_pred=False, + wait_time=0, + out_file=None, + show=False) + + seg_visualizer.add_image('image', image) + + +def main(): + parser = ArgumentParser( + description='Draw the Feature Map During Inference') + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('--gt_mask', default=None, help='Path of gt mask file') + parser.add_argument('--out-file', default=None, help='Path to output file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + parser.add_argument( + '--title', default='result', help='The image identifier.') + args = parser.parse_args() + + register_all_modules() + + # build the model from a config file and a checkpoint file + model = init_model(args.config, args.checkpoint, device=args.device) + if args.device == 'cpu': + model = revert_sync_batchnorm(model) + + # show all named module in the model and use it in source list below + for name, module in model.named_modules(): + print(name) + + source = [ + 'decode_head.fusion.stages.0.query_project.activate', + 'decode_head.context.stages.0.key_project.activate', + 'decode_head.context.bottleneck.activate' + ] + source = dict.fromkeys(source) + + count = 0 + recorder = Recorder() + # registry the forward hook + for name, module in model.named_modules(): + if name in source: + count += 1 + module.register_forward_hook(recorder.record_data_hook) + if count == len(source): + break + + with recorder: + # test a single image, and record feature map to data_buffer + result = inference_model(model, args.img) + + visualize(args, model, recorder, result) + + +if __name__ == '__main__': + main() + +``` + +Save the above code as feature_map_visual.py and execute the following code in terminal + +```shell +python feature_map_visual.py ${image} ${config} ${checkpoint} [optional args] +``` + +e.g + +```shell +python feature_map_visual.py \ +aachen_000000_000019_leftImg8bit.png \ +configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py \ +ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth \ +--gt_mask aachen_000000_000019_gtFine_labelTrainIds.png +``` + +The visualized image result and its corresponding feature map will appear in the wandb account. + +
+ +
diff --git a/mmsegmentation/docs/zh_cn/.readthedocs.yaml b/mmsegmentation/docs/zh_cn/.readthedocs.yaml new file mode 100644 index 0000000..fc3efd0 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/.readthedocs.yaml @@ -0,0 +1,17 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.8" + +formats: + - epub + +sphinx: + configuration: docs/zh_cn/conf.py + +python: + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/mmsegmentation/docs/zh_cn/Makefile b/mmsegmentation/docs/zh_cn/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/mmsegmentation/docs/zh_cn/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/mmsegmentation/docs/zh_cn/_static/css/readthedocs.css b/mmsegmentation/docs/zh_cn/_static/css/readthedocs.css new file mode 100644 index 0000000..2e38d08 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/_static/css/readthedocs.css @@ -0,0 +1,6 @@ +.header-logo { + background-image: url("../images/mmsegmentation.png"); + background-size: 201px 40px; + height: 40px; + width: 201px; +} diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/add_datasets.md b/mmsegmentation/docs/zh_cn/advanced_guides/add_datasets.md new file mode 100644 index 0000000..316feb0 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/add_datasets.md @@ -0,0 +1,199 @@ +# ๆ–ฐๅขž่‡ชๅฎšไน‰ๆ•ฐๆฎ้›† + +## ๆ–ฐๅขž่‡ชๅฎšไน‰ๆ•ฐๆฎ้›† + +ๅœจ่ฟ™้‡Œ๏ผŒๆˆ‘ไปฌๅฑ•็คบๅฆ‚ไฝ•ๆž„ๅปบไธ€ไธชๆ–ฐ็š„ๆ•ฐๆฎ้›†ใ€‚ + +1. ๅˆ›ๅปบไธ€ไธชๆ–ฐๆ–‡ไปถ `mmseg/datasets/example.py` + + ```python + from mmseg.registry import DATASETS + from .basesegdataset import BaseSegDataset + + + @DATASETS.register_module() + class ExampleDataset(BaseSegDataset): + + METAINFO = dict( + classes=('xxx', 'xxx', ...), + palette=[[x, x, x], [x, x, x], ...]) + + def __init__(self, arg1, arg2): + pass + ``` + +2. ๅœจ `mmseg/datasets/__init__.py` ไธญๅฏผๅ…ฅๆจกๅ— + + ```python + from .example import ExampleDataset + ``` + +3. ้€š่ฟ‡ๅˆ›ๅปบไธ€ไธชๆ–ฐ็š„ๆ•ฐๆฎ้›†้…็ฝฎๆ–‡ไปถ `configs/_base_/datasets/example_dataset.py` ๆฅไฝฟ็”จๅฎƒ + + ```python + dataset_type = 'ExampleDataset' + data_root = 'data/example/' + ... + ``` + +4. ๅœจ `mmseg/utils/class_names.py` ไธญ่กฅๅ……ๆ•ฐๆฎ้›†ๅ…ƒไฟกๆฏ + + ```python + def example_classes(): + return [ + 'xxx', 'xxx', + ... + ] + + def example_palette(): + return [ + [x, x, x], [x, x, x], + ... + ] + dataset_aliases ={ + 'example': ['example', ...], + ... + } + ``` + +**ๆณจๆ„๏ผš** ๅฆ‚ๆžœๆ–ฐๆ•ฐๆฎ้›†ไธๆปก่ถณ mmseg ็š„่ฆๆฑ‚๏ผŒๅˆ™้œ€่ฆๅœจ `tools/dataset_converters/` ไธญๅ‡†ๅค‡ไธ€ไธชๆ•ฐๆฎ้›†้ข„ๅค„็†่„šๆœฌ + +## ้€š่ฟ‡้‡ๆ–ฐ็ป„็ป‡ๆ•ฐๆฎๆฅๅฎšๅˆถๆ•ฐๆฎ้›† + +ๆœ€็ฎ€ๅ•็š„ๆ–นๆณ•ๆ˜ฏๅฐ†ๆ‚จ็š„ๆ•ฐๆฎ้›†่ฟ›่กŒ่ฝฌๅŒ–๏ผŒๅนถ็ป„็ป‡ๆˆๆ–‡ไปถๅคน็š„ๅฝขๅผใ€‚ + +ๅฆ‚ไธ‹็š„ๆ–‡ไปถ็ป“ๆž„ๅฐฑๆ˜ฏไธ€ไธชไพ‹ๅญใ€‚ + +```none +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ my_dataset +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + +``` + +ไธ€ไธช่ฎญ็ปƒๅฏนๅฐ†็”ฑ img_dir/ann_dir ้‡ŒๅŒๆ ท้ฆ–็ผ€็š„ๆ–‡ไปถ็ป„ๆˆใ€‚ + +ๆœ‰ไบ›ๆ•ฐๆฎ้›†ไธไผšๅ‘ๅธƒๆต‹่ฏ•้›†ๆˆ–ๆต‹่ฏ•้›†็š„ๆ ‡ๆณจ๏ผŒๅฆ‚ๆžœๆฒกๆœ‰ๆต‹่ฏ•้›†็š„ๆ ‡ๆณจ๏ผŒๆˆ‘ไปฌๅฐฑๆ— ๆณ•ๅœจๆœฌๅœฐ่ฟ›่กŒ่ฏ„ไผฐๆจกๅž‹๏ผŒๅ› ๆญคๆˆ‘ไปฌๅœจ้…็ฝฎๆ–‡ไปถไธญๅฐ†้ชŒ่ฏ้›†่ฎพ็ฝฎไธบ้ป˜่ฎคๆต‹่ฏ•้›†ใ€‚ + +ๅ…ณไบŽๅฆ‚ไฝ•ๆž„ๅปบ่‡ชๅทฑ็š„ๆ•ฐๆฎ้›†ๆˆ–ๅฎž็Žฐๆ–ฐ็š„ๆ•ฐๆฎ้›†็ฑป๏ผŒ่ฏทๅ‚้˜…[ๆ•ฐๆฎ้›†ๆŒ‡ๅ—](./datasets.md)ไปฅ่Žทๅ–ๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏใ€‚ + +**ๆณจๆ„๏ผš** ๆ ‡ๆณจๆ˜ฏ่ทŸๅ›พๅƒๅŒๆ ท็š„ๅฝข็Šถ (H, W)๏ผŒๅ…ถไธญ็š„ๅƒ็ด ๅ€ผ็š„่Œƒๅ›ดๆ˜ฏ `[0, num_classes - 1]`ใ€‚ +ๆ‚จไนŸๅฏไปฅไฝฟ็”จ [pillow](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#palette) ็š„ `'P'` ๆจกๅผๅŽปๅˆ›ๅปบๅŒ…ๅซ้ขœ่‰ฒ็š„ๆ ‡ๆณจใ€‚ + +## ้€š่ฟ‡ๆททๅˆๆ•ฐๆฎๅŽปๅฎšๅˆถๆ•ฐๆฎ้›† + +MMSegmentation ๅŒๆ ทๆ”ฏๆŒๆททๅˆๆ•ฐๆฎ้›†ๅŽป่ฎญ็ปƒใ€‚ +ๅฝ“ๅ‰ๅฎƒๆ”ฏๆŒๆ‹ผๆŽฅ (concat), ้‡ๅค (repeat) ๅ’Œๅคšๅ›พๆททๅˆ (multi-image mix) ๆ•ฐๆฎ้›†ใ€‚ + +### ้‡ๅคๆ•ฐๆฎ้›† + +ๆˆ‘ไปฌไฝฟ็”จ `RepeatDataset` ไฝœไธบๅŒ…่ฃ… (wrapper) ๅŽป้‡ๅคๆ•ฐๆฎ้›†ใ€‚ +ไพ‹ๅฆ‚๏ผŒๅ‡่ฎพๅŽŸๅง‹ๆ•ฐๆฎ้›†ๆ˜ฏ `Dataset_A`๏ผŒไธบไบ†้‡ๅคๅฎƒ๏ผŒ้…็ฝฎๆ–‡ไปถๅฆ‚ไธ‹๏ผš + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # ่ฟ™ๆ˜ฏ Dataset_A ๆ•ฐๆฎ้›†็š„ๅŽŸๅง‹้…็ฝฎ + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +``` + +### ๆ‹ผๆŽฅๆ•ฐๆฎ้›† + +ๅฆ‚ๆžœ่ฆๆ‹ผๆŽฅไธๅŒ็š„ๆ•ฐๆฎ้›†๏ผŒๅฏไปฅๆŒ‰ๅฆ‚ไธ‹ๆ–นๅผ่ฟžๆŽฅๆ•ฐๆฎ้›†้…็ฝฎใ€‚ + +```python +dataset_A_train = dict() +dataset_B_train = dict() +concatenate_dataset = dict( + type='ConcatDataset', + datasets=[dataset_A_train, dataset_B_train]) +``` + +ไธ‹้ขๆ˜ฏไธ€ไธชๆ›ดๅคๆ‚็š„็คบไพ‹๏ผŒๅฎƒๅˆ†ๅˆซ้‡ๅค `Dataset_A` ๅ’Œ `Dataset_B` N ๆฌกๅ’Œ M ๆฌก๏ผŒ็„ถๅŽ่ฟžๆŽฅ้‡ๅค็š„ๆ•ฐๆฎ้›†ใ€‚ + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +dataset_A_val = dict( + ... + pipeline=test_pipeline +) +dataset_A_test = dict( + ... + pipeline=test_pipeline +) +dataset_B_train = dict( + type='RepeatDataset', + times=M, + dataset=dict( + type='Dataset_B', + ... + pipeline=train_pipeline + ) +) +train_dataloader = dict( + dataset=dict( + type='ConcatDataset', + datasets=[dataset_A_train, dataset_B_train])) + +val_dataloader = dict(dataset=dataset_A_val) +test_dataloader = dict(dataset=dataset_A_test) + +``` + +ๆ‚จๅฏไปฅๅ‚่€ƒ mmengine ็š„ๅŸบ็ก€ๆ•ฐๆฎ้›†[ๆ•™็จ‹](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/basedataset.html)ไปฅไบ†่งฃๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏ + +### ๅคšๅ›พๆททๅˆ้›† + +ๆˆ‘ไปฌไฝฟ็”จ `MultiImageMixDataset` ไฝœไธบๅŒ…่ฃ…๏ผˆwrapper๏ผ‰ๅŽปๆททๅˆๅคšไธชๆ•ฐๆฎ้›†็š„ๅ›พ็‰‡ใ€‚ +`MultiImageMixDataset`ๅฏไปฅ่ขซ็ฑปไผผ mosaic ๅ’Œ mixup ็š„ๅคšๅ›พๆททๅˆๆ•ฐๆฎๅข—ๅนฟไฝฟ็”จใ€‚ + +`MultiImageMixDataset` ไธŽ `Mosaic` ๆ•ฐๆฎๅข—ๅนฟไธ€่ตทไฝฟ็”จ็š„ไพ‹ๅญ๏ผš + +```python +train_pipeline = [ + dict(type='RandomMosaic', prob=1), + dict(type='Resize', img_scale=(1024, 512), keep_ratio=True), + dict(type='RandomFlip', prob=0.5), + dict(type='PackSegInputs') +] + +train_dataset = dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + reduce_zero_label=False, + img_dir=data_root + "images/train", + ann_dir=data_root + "annotations/train", + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + ] + ), + pipeline=train_pipeline +) + +``` diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/add_metrics.md b/mmsegmentation/docs/zh_cn/advanced_guides/add_metrics.md new file mode 100644 index 0000000..0637b44 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/add_metrics.md @@ -0,0 +1,81 @@ +# ๆ–ฐๅขž่ฏ„ๆต‹ๆŒ‡ๆ ‡ + +## ไฝฟ็”จ MMSegmentation ็š„ๆบไปฃ็ ่ฟ›่กŒๅผ€ๅ‘ + +ๅœจ่ฟ™้‡Œ๏ผŒๆˆ‘ไปฌ็”จ `CustomMetric` ไฝœไธบไพ‹ๅญๆฅๅฑ•็คบๅฆ‚ไฝ•ๅผ€ๅ‘ไธ€ไธชๆ–ฐ็š„่ฏ„ๆต‹ๆŒ‡ๆ ‡ใ€‚ + +1. ๅˆ›ๅปบไธ€ไธชๆ–ฐๆ–‡ไปถ `mmseg/evaluation/metrics/custom_metric.py`ใ€‚ + + ```python + from typing import List, Sequence + + from mmengine.evaluator import BaseMetric + + from mmseg.registry import METRICS + + + @METRICS.register_module() + class CustomMetric(BaseMetric): + + def __init__(self, arg1, arg2): + """ + The metric first processes each batch of data_samples and predictions, + and appends the processed results to the results list. Then it + collects all results together from all ranks if distributed training + is used. Finally, it computes the metrics of the entire dataset. + """ + + def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: + pass + + def compute_metrics(self, results: list) -> dict: + pass + + def evaluate(self, size: int) -> dict: + pass + ``` + + ๅœจไธŠ้ข็š„็คบไพ‹ไธญ๏ผŒ`CustomMetric` ๆ˜ฏ `BaseMetric` ็š„ๅญ็ฑปใ€‚ๅฎƒๆœ‰ไธ‰ไธชๆ–นๆณ•๏ผš`process`๏ผŒ`compute_metrics` ๅ’Œ `evaluate`ใ€‚ + + - `process()` ๅค„็†ไธ€ๆ‰นๆ•ฐๆฎๆ ทๆœฌๅ’Œ้ข„ๆต‹ใ€‚ๅค„็†ๅŽ็š„็ป“ๆžœ้œ€่ฆๆ˜พ็คบๅœฐไผ ็ป™ `self.results` ๏ผŒๅฐ†ๅœจๅค„็†ๆ‰€ๆœ‰ๆ•ฐๆฎๆ ทๆœฌๅŽ็”จไบŽ่ฎก็ฎ—ๆŒ‡ๆ ‡ใ€‚ๆ›ดๅคš็ป†่Š‚่ฏทๅ‚่€ƒ [MMEngine ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/design/evaluation.md) + + - `compute_metrics()` ็”จไบŽไปŽๅค„็†ๅŽ็š„็ป“ๆžœไธญ่ฎก็ฎ—ๆŒ‡ๆ ‡ใ€‚ + + - `evaluate()` ๆ˜ฏไธ€ไธชๆŽฅๅฃ๏ผŒ็”จไบŽ่ฎก็ฎ—ๆŒ‡ๆ ‡ๅนถ่ฟ”ๅ›ž็ป“ๆžœใ€‚ๅฎƒๅฐ†็”ฑ `ValLoop` ๆˆ– `TestLoop` ๅœจ `Runner` ไธญ่ฐƒ็”จใ€‚ๅœจๅคงๅคšๆ•ฐๆƒ…ๅ†ตไธ‹๏ผŒๆ‚จไธ้œ€่ฆ้‡ๅ†™ๆญคๆ–นๆณ•๏ผŒไฝ†ๅฆ‚ๆžœๆ‚จๆƒณๅšไธ€ไบ›้ขๅค–็š„ๅทฅไฝœ๏ผŒๅฏไปฅ้‡ๅ†™ๅฎƒใ€‚ + + **ๆณจๆ„๏ผš** ๆ‚จๅฏไปฅๅœจ[่ฟ™้‡Œ](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L366) ๆ‰พๅˆฐ `Runner` ่ฐƒ็”จ `evaluate()` ๆ–นๆณ•็š„่ฟ‡็จ‹ใ€‚`Runner` ๆ˜ฏ่ฎญ็ปƒๅ’Œๆต‹่ฏ•่ฟ‡็จ‹็š„ๆ‰ง่กŒๅ™จ๏ผŒๆ‚จๅฏไปฅๅœจ[่ฎญ็ปƒๅผ•ๆ“Žๆ–‡ๆกฃ](./engine.md)ไธญๆ‰พๅˆฐๆœ‰ๅ…ณๅฎƒ็š„่ฏฆ็ป†ไฟกๆฏใ€‚ + +2. ๅœจ `mmseg/evaluation/metrics/__init__.py` ไธญๅฏผๅ…ฅๆ–ฐ็š„ๆŒ‡ๆ ‡ใ€‚ + + ```python + from .custom_metric import CustomMetric + __all__ = ['CustomMetric', ...] + ``` + +3. ๅœจ้…็ฝฎๆ–‡ไปถไธญ่ฎพ็ฝฎๆ–ฐ็š„่ฏ„ๆต‹ๆŒ‡ๆ ‡ + + ```python + val_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + test_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + ``` + +## ไฝฟ็”จๅ‘ๅธƒ็‰ˆๆœฌ็š„ MMSegmentation ่ฟ›่กŒๅผ€ๅ‘ + +ไธŠ้ข็š„็คบไพ‹ๅฑ•็คบไบ†ๅฆ‚ไฝ•ไฝฟ็”จ MMSegmentation ็š„ๆบไปฃ็ ๅผ€ๅ‘ๆ–ฐๆŒ‡ๆ ‡ใ€‚ๅฆ‚ๆžœๆ‚จๆƒณไฝฟ็”จ MMSegmentation ็š„ๅ‘ๅธƒ็‰ˆๆœฌๅผ€ๅ‘ๆ–ฐๆŒ‡ๆ ‡๏ผŒๅฏไปฅๆŒ‰็…งไปฅไธ‹ๆญฅ้ชคๆ“ไฝœใ€‚ + +1. ๅˆ›ๅปบไธ€ไธชๆ–ฐๆ–‡ไปถ `/Path/to/metrics/custom_metric.py`๏ผŒๅฎž็Žฐ `process`๏ผŒ`compute_metrics` ๅ’Œ `evaluate` ๆ–นๆณ•๏ผŒ`evaluate` ๆ–นๆณ•ๆ˜ฏๅฏ้€‰็š„ใ€‚ + +2. ๅœจไปฃ็ ๆˆ–้…็ฝฎๆ–‡ไปถไธญๅฏผๅ…ฅๆ–ฐ็š„ๆŒ‡ๆ ‡ใ€‚ + + ```python + from path.to.metrics import CustomMetric + ``` + + ๆˆ–่€… + + ```python + custom_imports = dict(imports=['/Path/to/metrics'], allow_failed_imports=False) + + val_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + test_evaluator = dict(type='CustomMetric', arg1=xxx, arg2=xxx) + ``` diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/add_models.md b/mmsegmentation/docs/zh_cn/advanced_guides/add_models.md new file mode 100644 index 0000000..e05c07c --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/add_models.md @@ -0,0 +1,260 @@ +# ๆ–ฐๅขžๆจกๅ— + +## ๅผ€ๅ‘ๆ–ฐ็ป„ไปถ + +ๆˆ‘ไปฌๅฏไปฅ่‡ชๅฎšไน‰ [ๆจกๅž‹ๆ–‡ๆกฃ](./models.md) ไธญไป‹็ป็š„ๆ‰€ๆœ‰็ป„ไปถ๏ผŒไพ‹ๅฆ‚**ไธปๅนฒ็ฝ‘็ปœ๏ผˆbackbone๏ผ‰**ใ€**ๅคด๏ผˆhead๏ผ‰**ใ€**ๆŸๅคฑๅ‡ฝๆ•ฐ๏ผˆloss function๏ผ‰**ๅ’Œ**ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ๏ผˆdata preprocessor๏ผ‰**ใ€‚ + +### ๆทปๅŠ ๆ–ฐ็š„ไธปๅนฒ็ฝ‘็ปœ๏ผˆbackbone๏ผ‰ + +ๅœจ่ฟ™้‡Œ๏ผŒๆˆ‘ไปฌไปฅ MobileNet ไธบไพ‹ๅฑ•็คบๅฆ‚ไฝ•ๅผ€ๅ‘ๆ–ฐ็š„ไธปๅนฒ็ฝ‘็ปœใ€‚ + +1. ๅˆ›ๅปบไธ€ไธชๆ–ฐๆ–‡ไปถ `mmseg/models/backbones/mobilenet.py`ใ€‚ + + ```python + import torch.nn as nn + + from mmseg.registry import MODELS + + + @MODELS.register_module() + class MobileNet(nn.Module): + + def __init__(self, arg1, arg2): + pass + + def forward(self, x): # should return a tuple + pass + + def init_weights(self, pretrained=None): + pass + ``` + +2. ๅœจ `mmseg/models/backbones/__init__.py` ไธญๅผ•ๅ…ฅๆจกๅ—ใ€‚ + + ```python + from .mobilenet import MobileNet + ``` + +3. ๅœจ้…็ฝฎๆ–‡ไปถไธญไฝฟ็”จๅฎƒใ€‚ + + ```python + model = dict( + ... + backbone=dict( + type='MobileNet', + arg1=xxx, + arg2=xxx), + ... + ``` + +### ๆทปๅŠ ๆ–ฐ็š„ๅคด๏ผˆhead๏ผ‰ + +ๅœจ MMSegmentation ไธญ๏ผŒๆˆ‘ไปฌๆไพ› [BaseDecodeHead](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/decode_heads/decode_head.py#L17) ็”จไบŽๅผ€ๅ‘ๆ‰€ๆœ‰ๅˆ†ๅ‰ฒๅคดใ€‚ +ๆ‰€ๆœ‰ๆ–ฐๅฎž็Žฐ็š„่งฃ็ ๅคด้ƒฝๅบ”่ฏฅไปŽไธญๆดพ็”Ÿๅ‡บๆฅใ€‚ +ๆŽฅไธ‹ๆฅๆˆ‘ไปฌไปฅ [PSPNet](https://arxiv.org/abs/1612.01105) ไธบไพ‹่ฏดๆ˜Žๅฆ‚ไฝ•ๅผ€ๅ‘ๆ–ฐ็š„ๅคดใ€‚ + +้ฆ–ๅ…ˆ๏ผŒๅœจ `mmseg/models/decode_heads/psp_head.py` ไธญๆทปๅŠ ไธ€ไธชๆ–ฐ็š„่งฃ็ ๅคดใ€‚ +PSPNet ๅฎž็Žฐไบ†็”จไบŽๅˆ†ๅ‰ฒ่งฃ็ ็š„่งฃ็ ๅคดใ€‚ +ไธบไบ†ๅฎž็Žฐ่งฃ็ ๅคด๏ผŒๅœจๆ–ฐๆจกๅ—ไธญๆˆ‘ไปฌ้œ€่ฆๆ‰ง่กŒไปฅไธ‹ไธ‰ไธชๅ‡ฝๆ•ฐใ€‚ + +```python +from mmseg.registry import MODELS + +@MODELS.register_module() +class PSPHead(BaseDecodeHead): + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(PSPHead, self).__init__(**kwargs) + + def init_weights(self): + pass + + def forward(self, inputs): + pass +``` + +ๆŽฅไธ‹ๆฅ๏ผŒ็”จๆˆท้œ€่ฆๅœจ `mmseg/models/decode_heads/__init__.py` ไธญๆทปๅŠ ๆจกๅ—๏ผŒ่ฟ™ๆ ท็›ธๅบ”็š„ๆณจๅ†Œๅ™จๅฐฑๅฏไปฅๆ‰พๅˆฐๅนถๅŠ ่ฝฝๅฎƒไปฌใ€‚ + +PSPNet ็š„้…็ฝฎๆ–‡ไปถๅฆ‚ไธ‹ + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrain_model/resnet50_v1c_trick-2cccc1ad.pth', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) + +``` + +### ๆทปๅŠ ๆ–ฐ็š„ๆŸๅคฑๅ‡ฝๆ•ฐ๏ผˆloss๏ผ‰ + +ๅ‡่ฎพๆ‚จๆƒณไธบๅˆ†ๅ‰ฒ่งฃ็ ๆทปๅŠ ไธ€ไธชๅซๅš `MyLoss` ็š„ๆ–ฐ็š„ๆŸๅคฑๅ‡ฝๆ•ฐใ€‚ +่ฆๆทปๅŠ ๆ–ฐ็š„ๆŸๅคฑๅ‡ฝๆ•ฐ๏ผŒ็”จๆˆท้œ€่ฆๅœจ `mmseg/models/loss/my_loss.py` ไธญๅฎž็Žฐๅฎƒใ€‚ +ไฟฎ้ฅฐๅ™จ `weighted_loss` ๅฏไปฅๅฏนๆŸๅคฑ็š„ๆฏไธชๅ…ƒ็ด ่ฟ›่กŒๅŠ ๆƒใ€‚ + +```python +import torch +import torch.nn as nn + +from mmseg.registry import MODELS +from .utils import weighted_loss + +@weighted_loss +def my_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + +@MODELS.register_module() +class MyLoss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(MyLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * my_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss +``` + +็„ถๅŽ๏ผŒ็”จๆˆท้œ€่ฆๅฐ†ๅ…ถๆทปๅŠ ๅˆฐ `mmseg/models/loss/__init__.py` ไธญใ€‚ + +```python +from .my_loss import MyLoss, my_loss + +``` + +่ฆไฝฟ็”จๅฎƒ๏ผŒ่ฏทไฟฎๆ”น `loss_xx` ๅญ—ๆฎตใ€‚ +็„ถๅŽ้œ€่ฆไฟฎๆ”นๅคดไธญ็š„ `loss_decode` ๅญ—ๆฎตใ€‚ +`loss_weight` ๅฏ็”จไบŽๅนณ่กกๅคš้‡ๆŸๅคฑใ€‚ + +```python +loss_decode=dict(type='MyLoss', loss_weight=1.0)) +``` + +### ๆทปๅŠ ๆ–ฐ็š„ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ๏ผˆdata preprocessor๏ผ‰ + +ๅœจ MMSegmentation 1.x ็‰ˆๆœฌไธญ๏ผŒๆˆ‘ไปฌไฝฟ็”จ [SegDataPreProcessor](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/data_preprocessor.py#L13) ๅฐ†ๆ•ฐๆฎๅคๅˆถๅˆฐ็›ฎๆ ‡่ฎพๅค‡๏ผŒๅนถๅฐ†ๆ•ฐๆฎ้ข„ๅค„็†ไธบ้ป˜่ฎค็š„ๆจกๅž‹่พ“ๅ…ฅๆ ผๅผใ€‚่ฟ™้‡Œๆˆ‘ไปฌๅฐ†ๅฑ•็คบๅฆ‚ไฝ•ๅผ€ๅ‘ไธ€ไธชๆ–ฐ็š„ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จใ€‚ + +1. ๅˆ›ๅปบไธ€ไธชๆ–ฐๆ–‡ไปถ `mmseg/models/my_datapreprocessor.py`ใ€‚ + + ```python + from mmengine.model import BaseDataPreprocessor + + from mmseg.registry import MODELS + + @MODELS.register_module() + class MyDataPreProcessor(BaseDataPreprocessor): + def __init__(self, **kwargs): + super().__init__(**kwargs) + + def forward(self, data: dict, training: bool=False) -> Dict[str, Any]: + # TODO Define the logic for data pre-processing in the forward method + pass + ``` + +2. ๅœจ `mmseg/models/__init__.py` ไธญๅฏผๅ…ฅๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ + + ```python + from .my_datapreprocessor import MyDataPreProcessor + ``` + +3. ๅœจ้…็ฝฎๆ–‡ไปถไธญไฝฟ็”จๅฎƒใ€‚ + + ```python + model = dict( + data_preprocessor=dict(type='MyDataPreProcessor) + ... + ) + ``` + +## ๅผ€ๅ‘ๆ–ฐ็š„ๅˆ†ๅ‰ฒๅ™จ๏ผˆsegmentor๏ผ‰ + +ๅˆ†ๅ‰ฒๅ™จๆ˜ฏไธ€็งๆˆทๅฏไปฅ้€š่ฟ‡ๆทปๅŠ ่‡ชๅฎšไน‰็ป„ไปถๅ’Œๅฎšไน‰็ฎ—ๆณ•ๆ‰ง่กŒ้€ป่พ‘ๆฅ่‡ชๅฎšไน‰ๅ…ถ็ฎ—ๆณ•็š„็ฎ—ๆณ•ๆžถๆž„ใ€‚่ฏทๅ‚่€ƒ[ๆจกๅž‹ๆ–‡ๆกฃ](./models.md)ไบ†่งฃๆ›ดๅคš่ฏฆๆƒ…ใ€‚ + +็”ฑไบŽ MMSegmentation ไธญ็š„ [BaseSegmenter](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/segmentors/base.py#L15) ็ปŸไธ€ไบ†ๅ‰ๅ‘่ฟ‡็จ‹็š„ไธ‰็งๆจกๅผ๏ผŒไธบไบ†ๅผ€ๅ‘ๆ–ฐ็š„ๅˆ†ๅ‰ฒๅ™จ๏ผŒ็”จๆˆท้œ€่ฆ้‡ๅ†™ไธŽ `loss`ใ€`predict` ๅ’Œ `tensor` ็›ธๅฏนๅบ”็š„ `loss`ใ€`predict` ๅ’Œ `_forward` ๆ–นๆณ•ใ€‚ + +่ฟ™้‡Œๆˆ‘ไปฌๅฐ†ๅฑ•็คบๅฆ‚ไฝ•ๅผ€ๅ‘ไธ€ไธชๆ–ฐ็š„ๅˆ†ๅ‰ฒๅ™จใ€‚ + +1. ๅˆ›ๅปบไธ€ไธชๆ–ฐๆ–‡ไปถ `mmseg/models/segmentors/my_segmentor.py`ใ€‚ + + ```python + from typing import Dict, Optional, Union + + import torch + + from mmseg.registry import MODELS + from mmseg.models import BaseSegmentor + + @MODELS.register_module() + class MySegmentor(BaseSegmentor): + def __init__(self, **kwargs): + super().__init__(**kwargs) + # TODO users should build components of the network here + + def loss(self, inputs: Tensor, data_samples: SampleList) -> dict: + """Calculate losses from a batch of inputs and data samples.""" + pass + + def predict(self, inputs: Tensor, data_samples: OptSampleList=None) -> SampleList: + """Predict results from a batch of inputs and data samples with post- + processing.""" + pass + + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tuple[List[Tensor]]: + """Network forward process. + + Usually includes backbone, neck and head forward without any post- + processing. + """ + pass + ``` + +2. ๅœจ `mmseg/models/segmentors/__init__.py` ไธญๅฏผๅ…ฅๅˆ†ๅ‰ฒๅ™จใ€‚ + + ```python + from .my_segmentor import MySegmentor + ``` + +3. ๅœจ้…็ฝฎๆ–‡ไปถไธญไฝฟ็”จๅฎƒใ€‚ + + ```python + model = dict( + type='MySegmentor' + ... + ) + ``` diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/add_transforms.md b/mmsegmentation/docs/zh_cn/advanced_guides/add_transforms.md new file mode 100644 index 0000000..d720668 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/add_transforms.md @@ -0,0 +1,51 @@ +# ๆ–ฐๅขžๆ•ฐๆฎๅขžๅผบ + +## ่‡ชๅฎšไน‰ๆ•ฐๆฎๅขžๅผบ + +่‡ชๅฎšไน‰ๆ•ฐๆฎๅขžๅผบๅฟ…้กป็ปงๆ‰ฟ `BaseTransform` ๅนถๅฎž็Žฐ `transform` ๅ‡ฝๆ•ฐใ€‚่ฟ™้‡Œๆˆ‘ไปฌไฝฟ็”จไธ€ไธช็ฎ€ๅ•็š„็ฟป่ฝฌๅ˜ๆขไฝœไธบ็คบไพ‹๏ผš + +```python +import random +import mmcv +from mmcv.transforms import BaseTransform, TRANSFORMS + +@TRANSFORMS.register_module() +class MyFlip(BaseTransform): + def __init__(self, direction: str): + super().__init__() + self.direction = direction + + def transform(self, results: dict) -> dict: + img = results['img'] + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +ๆญคๅค–๏ผŒๆ–ฐ็š„็ฑป้œ€่ฆ่ขซๅฏผๅ…ฅใ€‚ + +```python +from .my_pipeline import MyFlip +``` + +่ฟ™ๆ ท๏ผŒๆˆ‘ไปฌๅฐฑๅฏไปฅๅฎžไพ‹ๅŒ–ไธ€ไธช `MyFlip` ๅฏน่ฑกๅนถไฝฟ็”จๅฎƒๆฅๅค„็†ๆ•ฐๆฎๅญ—ๅ…ธใ€‚ + +```python +import numpy as np + +transform = MyFlip(direction='horizontal') +data_dict = {'img': np.random.rand(224, 224, 3)} +data_dict = transform(data_dict) +processed_img = data_dict['img'] +``` + +ๆˆ–่€…๏ผŒๆˆ‘ไปฌๅฏไปฅๅœจ้…็ฝฎๆ–‡ไปถไธญ็š„ๆ•ฐๆฎๆต็จ‹ไธญไฝฟ็”จ `MyFlip` ๅ˜ๆขใ€‚ + +```python +pipeline = [ + ... + dict(type='MyFlip', direction='horizontal'), + ... +] +``` + +้œ€่ฆๆณจๆ„๏ผŒๅฆ‚ๆžœ่ฆๅœจ้…็ฝฎๆ–‡ไปถไธญไฝฟ็”จ `MyFlip`๏ผŒๅฟ…้กป็กฎไฟๅœจ่ฟ่กŒๆ—ถๅฏผๅ…ฅไบ†ๅŒ…ๅซ `MyFlip` ็š„ๆ–‡ไปถใ€‚ diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/contribute_dataset.md b/mmsegmentation/docs/zh_cn/advanced_guides/contribute_dataset.md new file mode 100644 index 0000000..4222de3 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/contribute_dataset.md @@ -0,0 +1,461 @@ +# ๅœจ mmsegmentation projects ไธญ่ดก็Œฎไธ€ไธชๆ ‡ๅ‡†ๆ ผๅผ็š„ๆ•ฐๆฎ้›† + +- ๅœจๅผ€ๅง‹ๆ‚จ็š„่ดก็Œฎๆต็จ‹ๅ‰๏ผŒ่ฏทๅ…ˆ้˜…่ฏป[ใ€ŠOpenMMLab ่ดก็Œฎไปฃ็ ๆŒ‡ๅ—ใ€‹](https://mmcv.readthedocs.io/zh_CN/latest/community/contributing.html)๏ผŒไปฅ่ฏฆ็ป†็š„ไบ†่งฃ OpenMMLab ไปฃ็ ๅบ“็š„ไปฃ็ ่ดก็Œฎๆต็จ‹ใ€‚ +- ่ฏฅๆ•™็จ‹ไปฅ [Gaofen Image Dataset (GID)](https://www.sciencedirect.com/science/article/pii/S0034425719303414) ้ซ˜ๅˆ† 2 ๅทๅซๆ˜Ÿๆ‰€ๆ‹ๆ‘„็š„้ฅๆ„Ÿๅ›พๅƒ่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ้›†ไฝœไธบๆ ทไพ‹๏ผŒๆฅๆผ”็คบๅœจ mmsegmentation ไธญ็š„ๆ•ฐๆฎ้›†่ดก็Œฎๆต็จ‹ใ€‚ + +## ๆญฅ้ชค 1๏ผš ้…็ฝฎ mmsegmentation ๅผ€ๅ‘ๆ‰€้œ€ๅฟ…่ฆ็Žฏๅขƒ + +- ๅผ€ๅ‘ๆ‰€ๅฟ…้œ€็š„็Žฏๅขƒๅฎ‰่ฃ…่ฏทๅ‚่€ƒ[ไธญๆ–‡ๅฟซ้€Ÿๅ…ฅ้—จๆŒ‡ๅ—](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/get_started.md)ๆˆ–[่‹ฑๆ–‡ get_started](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/get_started.md)ใ€‚ + +- ๅฆ‚ๆžœๆ‚จๅทฒๅฎ‰่ฃ…ไบ†ๆœ€ๆ–ฐ็‰ˆ็š„ pytorchใ€mmcvใ€mmengine๏ผŒ้‚ฃไนˆๆ‚จๅฏไปฅ่ทณ่ฟ‡ๆญฅ้ชค 1 ่‡ณ[ๆญฅ้ชค 2](<#[ๆญฅ้ชค-2](#%E6%AD%A5%E9%AA%A4-2%E4%BB%A3%E7%A0%81%E8%B4%A1%E7%8C%AE%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C)>)ใ€‚ + +- **ๆณจ๏ผš** ๅœจๆญคๅค„ๆ— ้œ€ๅฎ‰่ฃ… mmsegmentation๏ผŒๅช้œ€ๅฎ‰่ฃ…ๅผ€ๅ‘ mmsegmentation ๆ‰€ๅฟ…้œ€็š„ pytorchใ€mmcvใ€mmengine ็ญ‰ๅณๅฏใ€‚ + +**ๆ–ฐๅปบ่™šๆ‹Ÿ็Žฏๅขƒ๏ผˆๅฆ‚ๅทฒๆœ‰ๅˆ้€‚็š„ๅผ€ๅ‘็Žฏๅขƒ๏ผŒๅฏ่ทณ่ฟ‡๏ผ‰** + +- ไปŽ[ๅฎ˜ๆ–น็ฝ‘็ซ™](https://docs.conda.io/en/latest/miniconda.html)ไธ‹่ฝฝๅนถๅฎ‰่ฃ… Miniconda +- ๅˆ›ๅปบไธ€ไธช conda ็Žฏๅขƒ๏ผŒๅนถๆฟ€ๆดป + +```shell +conda create --name openmmlab python=3.8 -y +conda activate openmmlab +``` + +**ๅฎ‰่ฃ… pytorch ๏ผˆๅฆ‚็Žฏๅขƒไธ‹ๅทฒๅฎ‰่ฃ… pytorch๏ผŒๅฏ่ทณ่ฟ‡๏ผ‰** + +- ๅ‚่€ƒ [official instructions](https://pytorch.org/get-started/locally/) ๅฎ‰่ฃ… **PyTorch** + +**ไฝฟ็”จ mim ๅฎ‰่ฃ… mmcvใ€mmengine** + +- ไฝฟ็”จ [MIM](https://github.com/open-mmlab/mim) ๅฎ‰่ฃ… [MMCV](https://github.com/open-mmlab/mmcv) + +```shell +pip install -U openmim +mim install mmengine +mim install "mmcv>=2.0.0" +``` + +## ๆญฅ้ชค 2๏ผšไปฃ็ ่ดก็Œฎๅ‰็š„ๅ‡†ๅค‡ๅทฅไฝœ + +### 2.1 Fork mmsegmentation ไป“ๅบ“ + +- ้€š่ฟ‡ๆต่งˆๅ™จๆ‰“ๅผ€[mmsegmentation ๅฎ˜ๆ–นไป“ๅบ“](https://github.com/open-mmlab/mmsegmentation/tree/main)ใ€‚ +- ็™ปๅฝ•ๆ‚จ็š„ GitHub ่ดฆๆˆท๏ผŒไปฅไธ‹ๆญฅ้ชคๅ‡้œ€ๅœจ GitHub ็™ปๅฝ•็š„ๆƒ…ๅ†ตไธ‹่ฟ›่กŒใ€‚ +- Fork mmsegmentation ไป“ๅบ“ + ![image](https://user-images.githubusercontent.com/50650583/233825567-b8bf273c-38f5-4487-b4c6-75ede1e283ee.png) +- Fork ไน‹ๅŽ๏ผŒmmsegmentation ไป“ๅบ“ๅฐ†ไผšๅ‡บ็Žฐๅœจๆ‚จ็š„ไธชไบบไป“ๅบ“ไธญใ€‚ + +### 2.2 ๅœจๆ‚จ็š„ไปฃ็ ็ผ–ๅ†™่ฝฏไปถไธญ git clone mmsegmentation + +่ฟ™้‡Œไปฅ VSCODE ไธบไพ‹ + +- ๆ‰“ๅผ€ VSCODE๏ผŒๆ–ฐๅปบ็ปˆ็ซฏ็ช—ๅฃๅนถๆฟ€ๆดปๆ‚จๅœจ[ๆญฅ้ชค 1 ](#%E6%AD%A5%E9%AA%A4-1-%E9%85%8D%E7%BD%AE-mmsegmentation-%E5%BC%80%E5%8F%91%E6%89%80%E9%9C%80%E5%BF%85%E8%A6%81%E7%8E%AF%E5%A2%83)ไธญๆ‰€ๅฎ‰่ฃ…็š„่™šๆ‹Ÿ็Žฏๅขƒใ€‚ +- ๅœจๆ‚จ GitHub ็š„ไธชไบบไป“ๅบ“ไธญๆ‰พๅˆฐๆ‚จ Fork ็š„ mmsegmentation ไป“ๅบ“๏ผŒๅคๅˆถๅ…ถ้“พๆŽฅใ€‚ + ![image](https://github.com/AI-Tianlong/OpenMMLabCamp/assets/50650583/92ad555b-c5b2-4a7f-a800-ebee1e405ab6) +- ๅœจ็ปˆ็ซฏไธญๆ‰ง่กŒๅ‘ฝไปค + ```bash + git clone {ๆ‚จๆ‰€ๅคๅˆถ็š„ไธชไบบไป“ๅบ“็š„้“พๆŽฅ} + ``` + ![image](https://github.com/AI-Tianlong/OpenMMLabCamp/assets/50650583/23ba2636-e66f-4ea5-9077-9dd6b69deb1d) + **ๆณจ๏ผš** ๅฆ‚ๆ็คบไปฅไธ‹ไฟกๆฏ๏ผŒ่ฏทๅœจ GitHub ไธญๆทปๅŠ  [SSH ็ง˜้’ฅ](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) + ![image](https://github.com/AI-Tianlong/OpenMMLabCamp/assets/50650583/6fcab213-0739-483c-b345-c59656027377) +- ่ฟ›ๅ…ฅ mmsegmentation ็›ฎๅฝ•๏ผˆไน‹ๅŽ็š„ๆ“ไฝœๅ‡ๅœจ mmsegmentation ็›ฎๅฝ•ไธ‹๏ผ‰ใ€‚ + ```bash + cd mmsegmentation + ``` +- ๅœจ็ปˆ็ซฏไธญๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปค๏ผŒๆทปๅŠ ๅฎ˜ๆ–นไป“ๅบ“ไธบไธŠๆธธไป“ๅบ“ใ€‚ + ```bash + git remote add upstream git@github.com:open-mmlab/mmsegmentation.git + ``` +- ไฝฟ็”จไปฅไธ‹ๅ‘ฝไปคๆฃ€ๆŸฅ remote ๆ˜ฏๅฆๆทปๅŠ ๆˆๅŠŸใ€‚ + ```bash + git remote -v + ``` + ![image](https://github.com/AI-Tianlong/OpenMMLabCamp/assets/50650583/beec7e5e-2b00-4e49-ab38-f0c79e346594) + +### 2.3 ๅˆ‡ๆข็›ฎๅฝ•่‡ณ mmsegmentation ๅนถไปŽๆบ็ ๅฎ‰่ฃ…mmsegmentation + +ๅœจ`mmsegmentation`็›ฎๅฝ•ไธ‹ๆ‰ง่กŒ`pip install -v -e .`๏ผŒ้€š่ฟ‡ๆบ็ ๆž„ๅปบๆ–นๅผๅฎ‰่ฃ… mmsegmentaion ๅบ“ใ€‚ +ๅฎ‰่ฃ…ๅฎŒๆˆๅŽ๏ผŒๆ‚จๅฐ†่ƒฝ็œ‹ๅˆฐๅฆ‚ไธ‹ๅ›พๆ‰€็คบ็š„ๆ–‡ไปถๆ ‘ใ€‚ +image + +### 2.4 ๅˆ‡ๆขๅˆ†ๆ”ฏไธบ dev-1.x + +ๆญฃๅฆ‚ๆ‚จๅœจ[ mmsegmentation ๅฎ˜็ฝ‘](https://github.com/open-mmlab/mmsegmentation/tree/main)ๆ‰€่ง๏ผŒ่ฏฅไป“ๅบ“ๆœ‰่ฎธๅคšๅˆ†ๆ”ฏ๏ผŒ้ป˜่ฎคๅˆ†ๆ”ฏ`main`ไธบ็จณๅฎš็š„ๅ‘่กŒ็‰ˆๆœฌ๏ผŒไปฅๅŠ็”จไบŽ่ดก็Œฎ่€…่ฟ›่กŒๅผ€ๅ‘็š„`dev-1.x`ๅˆ†ๆ”ฏใ€‚`dev-1.x`ๅˆ†ๆ”ฏๆ˜ฏ่ดก็Œฎ่€…ไปฌ็”จๆฅๆไบคๅˆ›ๆ„ๅ’Œ PR ็š„ๅˆ†ๆ”ฏ๏ผŒ`dev-1.x`ๅˆ†ๆ”ฏ็š„ๅ†…ๅฎนไผš่ขซๅ‘จๆœŸๆ€ง็š„ๅˆๅ…ฅๅˆฐ`main`ๅˆ†ๆ”ฏใ€‚ +![image](https://user-images.githubusercontent.com/50650583/233826225-f4b7299d-de23-47db-900d-dfb01ba0efc3.png) + +ๅ›žๅˆฐ VSCODE ไธญ๏ผŒๅœจ็ปˆ็ซฏๆ‰ง่กŒๅ‘ฝไปค + +```bash +git checkout dev-1.x +``` + +### 2.5 ๅˆ›ๆ–ฐๅฑžไบŽ่‡ชๅทฑ็š„ๆ–ฐๅˆ†ๆ”ฏ + +ๅœจๅŸบไบŽ`dev-1.x`ๅˆ†ๆ”ฏไธ‹๏ผŒไฝฟ็”จๅฆ‚ไธ‹ๅ‘ฝไปค๏ผŒๅˆ›ๅปบๅฑžไบŽๆ‚จ่‡ชๅทฑ็š„ๅˆ†ๆ”ฏใ€‚ + +```bash +# git checkout -b ๆ‚จ็š„GitHubID/ๆ‚จ็š„ๅˆ†ๆ”ฏๆƒณ่ฆๅฎž็Žฐ็š„ๅŠŸ่ƒฝ็š„ๅๅญ— +# git checkout -b AI-Tianlong/support_GID_dataset +git checkout -b {ๆ‚จ็š„GitHubID/ๆ‚จ็š„ๅˆ†ๆ”ฏๆƒณ่ฆๅฎž็Žฐ็š„ๅŠŸ่ƒฝ็š„ๅๅญ—} +``` + +### 2.6 ้…็ฝฎ pre-commit + +OpenMMLab ไป“ๅบ“ๅฏนไปฃ็ ่ดจ้‡ๆœ‰็€่พƒ้ซ˜็š„่ฆๆฑ‚๏ผŒๆ‰€ๆœ‰ๆไบค็š„ PR ๅฟ…้กป่ฆ้€š่ฟ‡ไปฃ็ ๆ ผๅผๆฃ€ๆŸฅใ€‚pre-commit ่ฏฆ็ป†้…็ฝฎๅ‚้˜…[้…็ฝฎ pre-commit](https://mmcv.readthedocs.io/zh_CN/latest/community/contributing.html#pre-commit)ใ€‚ + +## ๆญฅ้ชค 3๏ผšๅœจ`mmsegmentation/projects`ไธ‹่ดก็Œฎๆ‚จ็š„ไปฃ็  + +**ๅ…ˆๅฏน GID ๆ•ฐๆฎ้›†่ฟ›่กŒๅˆ†ๆž** + +่ฟ™้‡Œไปฅ่ดก็Œฎ้ซ˜ๅˆ† 2 ๅท้ฅๆ„Ÿๅ›พๅƒ่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ้›† GID ไธบไพ‹๏ผŒGID ๆ•ฐๆฎ้›†ๆ˜ฏ็”ฑๆˆ‘ๅ›ฝ่‡ชไธป็ ”ๅ‘็š„้ซ˜ๅˆ† 2 ๅทๅซๆ˜Ÿๆ‰€ๆ‹ๆ‘„็š„ๅ…‰ๅญฆ้ฅๆ„Ÿๅ›พๅƒๆ‰€ๅˆ›ๅปบ๏ผŒ็ปๅ›พๅƒ้ข„ๅค„็†ๅŽๅ…ฑๆไพ›ไบ† 150 ๅผ  6800x7200 ๅƒ็ด ็š„ RGB ไธ‰้€š้“้ฅๆ„Ÿๅ›พๅƒใ€‚ๅนถๆไพ›ไบ†ไธค็งไธๅŒ็ฑปๅˆซๆ•ฐ็š„ๆ•ฐๆฎๆ ‡ๆณจ๏ผŒไธ€็งๆ˜ฏๅŒ…ๅซ 5 ็ฑปๆœ‰ๆ•ˆ็‰ฉไฝ“็š„ RGB ๆ ‡็ญพ๏ผŒๅฆไธ€็งๆ˜ฏๅŒ…ๅซ 15 ็ฑปๆœ‰ๆ•ˆ็‰ฉไฝ“็š„ RGB ๆ ‡็ญพใ€‚ๆœฌๆ•™็จ‹ๅฐ†้’ˆๅฏน 5 ็ฑปๆ ‡็ญพ่ฟ›่กŒๆ•ฐๆฎ้›†่ดก็Œฎๆต็จ‹่ฎฒ่งฃใ€‚ + +GID ็š„ 5 ็ฑปๆœ‰ๆ•ˆๆ ‡็ญพๅˆ†ๅˆซไธบ๏ผš0-่ƒŒๆ™ฏ-\[0,0,0\](mask ๆ ‡็ญพๅ€ผ-ๆ ‡็ญพๅ็งฐ-RGB ๆ ‡็ญพๅ€ผ)ใ€1-ๅปบ็ญ‘-\[255,0,0\]ใ€2-ๅ†œ็”ฐ-\[0,255,0\]ใ€3-ๆฃฎๆž—-\[0,0,255\]ใ€4-่‰ๅœฐ-\[255,255,0\]ใ€5-ๆฐด-\[0,0,255\]ใ€‚ๅœจ่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠกไธญ๏ผŒๆ ‡็ญพๆ˜ฏไธŽๅŽŸๅ›พๅฐบๅฏธไธ€่‡ด็š„ๅ•้€š้“ๅ›พๅƒ๏ผŒๆ ‡็ญพๅ›พๅƒไธญ็š„ๅƒ็ด ๅ€ผไธบ็œŸๅฎžๆ ทๆœฌๅ›พๅƒไธญๅฏนๅบ”ๅƒ็ด ๆ‰€ๅŒ…ๅซ็š„็‰ฉไฝ“็š„็ฑปๅˆซใ€‚GID ๆ•ฐๆฎ้›†ๆไพ›็š„ๆ˜ฏๅ…ทๆœ‰ RGB ไธ‰้€š้“็š„ๅฝฉ่‰ฒๆ ‡็ญพ๏ผŒไธบไบ†ๆจกๅž‹็š„่ฎญ็ปƒ้œ€่ฆๅฐ† RGB ๆ ‡็ญพ่ฝฌๆขไธบ mask ๆ ‡็ญพใ€‚ๅนถไธ”็”ฑไบŽๅ›พๅƒๅฐบๅฏธไธบ 6800x7200 ๅƒ็ด ๏ผŒๅฏนไบŽ็ฅž็ป็ฝ‘็ปœ็š„่ฎญ็ปƒๆฅๆœ‰ไบ›่ฟ‡ๅคง๏ผŒๆ‰€ไปฅๅฐ†ๆฏๅผ ๅ›พๅƒ่ฃๅˆ‡ๆˆไบ†ๆฒกๆœ‰้‡ๅ ็š„ 512x512 ็š„ๅ›พๅƒไปฅไพฟ่ฟ›่กŒ่ฎญ็ปƒใ€‚ +image + +### 3.1 ๅœจ`mmsegmentation/projects`ไธ‹ๅˆ›ๅปบๆ–ฐ็š„้กน็›ฎๆ–‡ไปถๅคน + +ๅœจ`mmsegmentation/projects`ไธ‹ๅˆ›ๅปบๆ–‡ไปถๅคน`gid_dataset` +![image](https://user-images.githubusercontent.com/50650583/233829687-8f2b6600-bc9d-48ff-a865-d462af54d55a.png) + +### 3.2 ่ดก็Œฎๆ‚จ็š„ๆ•ฐๆฎ้›†ไปฃ็  + +ไธบไบ†ๆœ€็ปˆ่ƒฝๅฐ†ๆ‚จๅœจ projects ไธญ่ดก็Œฎ็š„ไปฃ็ ๆ›ดๅŠ ้กบ็•…็š„็งปๅ…ฅๆ ธๅฟƒๅบ“ไธญ๏ผˆๅฏนไปฃ็ ่ฆๆฑ‚่ดจ้‡ๆ›ด้ซ˜๏ผ‰๏ผŒ้žๅธธๅปบ่ฎฎๆŒ‰็…งๆ ธๅฟƒๅบ“็š„็›ฎๅฝ•ๆฅ็ผ–่พ‘ๆ‚จ็š„ๆ•ฐๆฎ้›†ๆ–‡ไปถใ€‚ +ๅ…ณไบŽๆ•ฐๆฎ้›†ๆœ‰ 4 ไธชๅฟ…่ฆ็š„ๆ–‡ไปถ๏ผš + +- **1** `mmseg/datasets/gid.py` ๅฎšไน‰ไบ†ๆ•ฐๆฎ้›†็š„ๅฐพ็ผ€ใ€CLASSESใ€PALETTEใ€reduce_zero_label็ญ‰ +- **2** `configs/_base_/gid.py` GID ๆ•ฐๆฎ้›†็š„้…็ฝฎๆ–‡ไปถ๏ผŒๅฎšไน‰ไบ†ๆ•ฐๆฎ้›†็š„`dataset_type`๏ผˆๆ•ฐๆฎ้›†็ฑปๅž‹๏ผŒ`mmseg/datasets/gid.py`ไธญๆณจๅ†Œ็š„ๆ•ฐๆฎ้›†็š„็ฑปๅ๏ผ‰ใ€`data_root`(ๆ•ฐๆฎ้›†ๆ‰€ๅœจ็š„ๆ น็›ฎๅฝ•๏ผŒๅปบ่ฎฎๅฐ†ๆ•ฐๆฎ้›†้€š่ฟ‡่ฝฏ่ฟžๆŽฅ็š„ๆ–นๅผๅฐ†ๆ•ฐๆฎ้›†ๆ”พ่‡ณ`mmsegmentation/data`)ใ€`train_pipline`(่ฎญ็ปƒ็š„ๆ•ฐๆฎๆต)ใ€`test_pipline`(ๆต‹่ฏ•ๅ’Œ้ชŒ่ฏๆ—ถ็š„ๆ•ฐๆฎๆต)ใ€`img_rations`(ๅคšๅฐบๅบฆ้ข„ๆต‹ๆ—ถ็š„ๅคšๅฐบๅบฆ้…็ฝฎ)ใ€`tta_pipeline`๏ผˆๅคšๅฐบๅบฆ้ข„ๆต‹๏ผ‰ใ€`train_dataloader`(่ฎญ็ปƒ้›†็š„ๆ•ฐๆฎๅŠ ่ฝฝๅ™จ)ใ€`val_dataloader`(้ชŒ่ฏ้›†็š„ๆ•ฐๆฎๅŠ ่ฝฝๅ™จ)ใ€`test_dataloader`(ๆต‹่ฏ•้›†็š„ๆ•ฐๆฎๅŠ ่ฝฝๅ™จ)ใ€`val_evaluator`(้ชŒ่ฏ้›†็š„่ฏ„ไผฐๅ™จ)ใ€`test_evaluator`(ๆต‹่ฏ•้›†็š„่ฏ„ไผฐๅ™จ)ใ€‚ +- **3** ไฝฟ็”จไบ† GID ๆ•ฐๆฎ้›†็š„ๆจกๅž‹่ฎญ็ปƒ้…็ฝฎๆ–‡ไปถ + ่ฟ™ไธชๆ˜ฏๅฏ้€‰็š„๏ผŒไฝ†ๆ˜ฏๅผบ็ƒˆๅปบ่ฎฎๆ‚จๆทปๅŠ ใ€‚ๅœจๆ ธๅฟƒๅบ“ไธญ๏ผŒๆ‰€่ดก็Œฎ็š„ๆ•ฐๆฎ้›†้œ€่ฆๅ’Œๅ‚่€ƒๆ–‡็Œฎไธญๆ‰€ๆๅ‡บ็š„็ป“ๆžœ็ฒพๅบฆๅฏน้ฝ๏ผŒไธบไบ†ๅŽๆœŸๅฐ†ๆ‚จ่ดก็Œฎ็š„ไปฃ็ ๅˆๅนถๅ…ฅๆ ธๅฟƒๅบ“ใ€‚ๅฆ‚ๆ‚จ็š„็ฎ—ๅŠ›ๅ……่ถณ๏ผŒๆœ€ๅฅฝ่ƒฝๆไพ›ๅฏนๅบ”็š„ๆจกๅž‹้…็ฝฎๆ–‡ไปถๅœจๆ‚จ่ดก็Œฎ็š„ๆ•ฐๆฎ้›†ไธŠๆ‰€้ชŒ่ฏ็š„็ป“ๆžœไปฅๅŠ็›ธๅบ”็š„ๆƒ้‡ๆ–‡ไปถ๏ผŒๅนถๆ’ฐๅ†™่พƒไธบ่ฏฆ็ป†็š„README.mdๆ–‡ๆกฃใ€‚[็คบไพ‹ๅ‚่€ƒ็ป“ๆžœ](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3plus#mapillary-vistas-v12) + ![image](https://user-images.githubusercontent.com/50650583/233877682-eabe8723-bce9-40e4-a303-08c8385cb6b5.png) +- **4** ไฝฟ็”จๅฆ‚ไธ‹ๅ‘ฝไปคๆ ผๅผ๏ผš ๆ’ฐๅ†™`docs/zh_cn/user_guides/2_dataset_prepare.md`ๆฅๆทปๅŠ ๆ‚จ็š„ๆ•ฐๆฎ้›†ไป‹็ป๏ผŒๅŒ…ๆ‹ฌไฝ†ไธ้™ไบŽๆ•ฐๆฎ้›†็š„ไธ‹่ฝฝๆ–นๅผ๏ผŒๆ•ฐๆฎ้›†็›ฎๅฝ•็ป“ๆž„ใ€ๆ•ฐๆฎ้›†็”Ÿๆˆ็ญ‰ไธ€ไบ›ๅฟ…่ฆๆ€ง็š„ๆ–‡ๅญ—ๆ€งๆ่ฟฐๅ’Œ่ฟ่กŒๅ‘ฝไปคใ€‚ไปฅๆ›ดๅฅฝๅœฐๅธฎๅŠฉ็”จๆˆท่ƒฝๆ›ดๅฟซ็š„ๅฎž็Žฐๆ•ฐๆฎ้›†็š„ๅ‡†ๅค‡ๅทฅไฝœใ€‚ + +### 3.3 ่ดก็Œฎ`tools/dataset_converters/gid.py` + +็”ฑไบŽ GID ๆ•ฐๆฎ้›†ๆ˜ฏ็”ฑๆœช็ป่ฟ‡ๅˆ‡ๅˆ†็š„ 6800x7200 ๅ›พๅƒๆ‰€ๆž„ๆˆ็š„ๆ•ฐๆฎ้›†๏ผŒๅนถไธ”ๆฒกๆœ‰ๅˆ’ๅˆ†่ฎญ็ปƒ้›†ใ€้ชŒ่ฏ้›†ไธŽๆต‹่ฏ•้›†ใ€‚ไปฅๅŠๅ…ถๆ ‡็ญพไธบ RGB ๅฝฉ่‰ฒๆ ‡็ญพ๏ผŒ้œ€่ฆๅฐ†ๆ ‡็ญพ่ฝฌๆขไธบๅ•้€š้“็š„ mask labelใ€‚ไธบไบ†ๆ–นไพฟ่ฎญ็ปƒ๏ผŒ้ฆ–ๅ…ˆๅฐ† GID ๆ•ฐๆฎ้›†่ฟ›่กŒ่ฃๅˆ‡ๅ’Œๆ ‡็ญพ่ฝฌๆข๏ผŒๅนถ่ฟ›่กŒๆ•ฐๆฎ้›†ๅˆ’ๅˆ†๏ผŒๆž„ๅปบไธบ mmsegmentation ๆ‰€ๆ”ฏๆŒ็š„ๆ ผๅผใ€‚ + +```python +# tools/dataset_converters/gid.py +import argparse +import glob +import math +import os +import os.path as osp +from PIL import Image + +import mmcv +import numpy as np +from mmengine.utils import ProgressBar, mkdir_or_exist + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert GID dataset to mmsegmentation format') + parser.add_argument('dataset_img_path', help='GID images folder path') + parser.add_argument('dataset_label_path', help='GID labels folder path') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path', default='data/gid') + parser.add_argument( + '--clip_size', + type=int, + help='clipped size of image after preparation', + default=256) + parser.add_argument( + '--stride_size', + type=int, + help='stride of clipping original images', + default=256) + args = parser.parse_args() + return args + +GID_COLORMAP = dict( + Background=(0, 0, 0), #0-่ƒŒๆ™ฏ-้ป‘่‰ฒ + Building=(255, 0, 0), #1-ๅปบ็ญ‘-็บข่‰ฒ + Farmland=(0, 255, 0), #2-ๅ†œ็”ฐ-็ปฟ่‰ฒ + Forest=(0, 0, 255), #3-ๆฃฎๆž—-่“่‰ฒ + Meadow=(255, 255, 0),#4-่‰ๅœฐ-้ป„่‰ฒ + Water=(0, 0, 255)#5-ๆฐด-่“่‰ฒ +) +palette = list(GID_COLORMAP.values()) +classes = list(GID_COLORMAP.keys()) + +#############็”จๅˆ—่กจๆฅๅญ˜ไธ€ไธช RGB ๅ’Œไธ€ไธช็ฑปๅˆซ็š„ๅฏนๅบ”################ +def colormap2label(palette): + colormap2label_list = np.zeros(256**3, dtype = np.longlong) + for i, colormap in enumerate(palette): + colormap2label_list[(colormap[0] * 256 + colormap[1])*256+colormap[2]] = i + return colormap2label_list + +#############็ป™ๅฎš้‚ฃไธชๅˆ—่กจ๏ผŒๅ’Œvis_png็„ถๅŽ็”Ÿๆˆmasks_png################ +def label_indices(RGB_label, colormap2label_list): + RGB_label = RGB_label.astype('int32') + idx = (RGB_label[:, :, 0] * 256 + RGB_label[:, :, 1]) * 256 + RGB_label[:, :, 2] + # print(idx.shape) + return colormap2label_list[idx] + +def RGB2mask(RGB_label, colormap2label_list): + # RGB_label = np.array(Image.open(RGB_label).convert('RGB')) #ๆ‰“ๅผ€RGB_png + mask_label = label_indices(RGB_label, colormap2label_list) # .numpy() + return mask_label + +colormap2label_list = colormap2label(palette) + +def clip_big_image(image_path, clip_save_dir, args, to_label=False): + """ + Original image of GID dataset is very large, thus pre-processing + of them is adopted. Given fixed clip size and stride size to generate + clipped image, the intersectionใ€€of width and height is determined. + For example, given one 6800 x 7200 original image, the clip size is + 256 and stride size is 256, thus it would generate 29 x 27 = 783 images + whose size are all 256 x 256. + + """ + + image = mmcv.imread(image_path, channel_order='rgb') + # image = mmcv.bgr2gray(image) + + h, w, c = image.shape + clip_size = args.clip_size + stride_size = args.stride_size + + num_rows = math.ceil((h - clip_size) / stride_size) if math.ceil( + (h - clip_size) / + stride_size) * stride_size + clip_size >= h else math.ceil( + (h - clip_size) / stride_size) + 1 + num_cols = math.ceil((w - clip_size) / stride_size) if math.ceil( + (w - clip_size) / + stride_size) * stride_size + clip_size >= w else math.ceil( + (w - clip_size) / stride_size) + 1 + + x, y = np.meshgrid(np.arange(num_cols + 1), np.arange(num_rows + 1)) + xmin = x * clip_size + ymin = y * clip_size + + xmin = xmin.ravel() + ymin = ymin.ravel() + xmin_offset = np.where(xmin + clip_size > w, w - xmin - clip_size, + np.zeros_like(xmin)) + ymin_offset = np.where(ymin + clip_size > h, h - ymin - clip_size, + np.zeros_like(ymin)) + boxes = np.stack([ + xmin + xmin_offset, ymin + ymin_offset, + np.minimum(xmin + clip_size, w), + np.minimum(ymin + clip_size, h) + ], axis=1) + + if to_label: + image = RGB2mask(image, colormap2label_list) #่ฟ™้‡Œๅพ—ๆ”นไธ€ไธ‹ + + for count, box in enumerate(boxes): + start_x, start_y, end_x, end_y = box + clipped_image = image[start_y:end_y, + start_x:end_x] if to_label else image[ + start_y:end_y, start_x:end_x, :] + img_name = osp.basename(image_path).replace('.tif', '') + img_name = img_name.replace('_label', '') + if count % 3 == 0: + mmcv.imwrite( + clipped_image.astype(np.uint8), + osp.join( + clip_save_dir.replace('train', 'val'), + f'{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png')) + else: + mmcv.imwrite( + clipped_image.astype(np.uint8), + osp.join( + clip_save_dir, + f'{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png')) + count += 1 + +def main(): + args = parse_args() + + """ + According to this paper: https://ieeexplore.ieee.org/document/9343296/ + select 15 images contained in GID, , which cover the whole six + categories, to generate train set and validation set. + + According to Paper: https://ieeexplore.ieee.org/document/9343296/ + + """ + + if args.out_dir is None: + out_dir = osp.join('data', 'gid') + else: + out_dir = args.out_dir + + print('Making directories...') + mkdir_or_exist(osp.join(out_dir, 'img_dir', 'train')) + mkdir_or_exist(osp.join(out_dir, 'img_dir', 'val')) + mkdir_or_exist(osp.join(out_dir, 'ann_dir', 'train')) + mkdir_or_exist(osp.join(out_dir, 'ann_dir', 'val')) + + src_path_list = glob.glob(os.path.join(args.dataset_img_path, '*.tif')) + print(f'Find {len(src_path_list)} pictures') + + prog_bar = ProgressBar(len(src_path_list)) + + dst_img_dir = osp.join(out_dir, 'img_dir', 'train') + dst_label_dir = osp.join(out_dir, 'ann_dir', 'train') + + for i, img_path in enumerate(src_path_list): + label_path = osp.join(args.dataset_label_path, osp.basename(img_path.replace('.tif', '_label.tif'))) + + clip_big_image(img_path, dst_img_dir, args, to_label=False) + clip_big_image(label_path, dst_label_dir, args, to_label=True) + prog_bar.update() + + print('Done!') + +if __name__ == '__main__': + main() +``` + +### 3.4 ่ดก็Œฎ`mmseg/datasets/gid.py` + +ๅฏๅ‚่€ƒ[`projects/mapillary_dataset/mmseg/datasets/mapillary.py`](https://github.com/open-mmlab/mmsegmentation/blob/main/projects/mapillary_dataset/mmseg/datasets/mapillary.py)ๅนถๅœจๆญคๅŸบ็ก€ไธŠไฟฎๆ”น็›ธๅบ”ๅ˜้‡ไปฅ้€‚้…ๆ‚จ็š„ๆ•ฐๆฎ้›†ใ€‚ + +```python +# mmseg/datasets/gid.py +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.datasets.basesegdataset import BaseSegDataset +from mmseg.registry import DATASETS + +# ๆณจๅ†Œๆ•ฐๆฎ้›†็ฑป +@DATASETS.register_module() +class GID_Dataset(BaseSegDataset): + """Gaofen Image Dataset (GID) + + Dataset paper link: + https://www.sciencedirect.com/science/article/pii/S0034425719303414 + https://x-ytong.github.io/project/GID.html + + GID 6 classes: background(others), built-up, farmland, forest, meadow, water + + In This example, select 10 images from GID dataset as training set, + and select 5 images as validation set. + The selected images are listed as follows: + + GF2_PMS1__L1A0000647767-MSS1 + GF2_PMS1__L1A0001064454-MSS1 + GF2_PMS1__L1A0001348919-MSS1 + GF2_PMS1__L1A0001680851-MSS1 + GF2_PMS1__L1A0001680853-MSS1 + GF2_PMS1__L1A0001680857-MSS1 + GF2_PMS1__L1A0001757429-MSS1 + GF2_PMS2__L1A0000607681-MSS2 + GF2_PMS2__L1A0000635115-MSS2 + GF2_PMS2__L1A0000658637-MSS2 + GF2_PMS2__L1A0001206072-MSS2 + GF2_PMS2__L1A0001471436-MSS2 + GF2_PMS2__L1A0001642620-MSS2 + GF2_PMS2__L1A0001787089-MSS2 + GF2_PMS2__L1A0001838560-MSS2 + + The ``img_suffix`` is fixed to '.tif' and ``seg_map_suffix`` is + fixed to '.tif' for GID. + """ + METAINFO = dict( + classes=('Others', 'Built-up', 'Farmland', 'Forest', + 'Meadow', 'Water'), + + palette=[[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 255, 255], + [255, 255, 0], [0, 0, 255]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=None, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) +``` + +### 3.5 ่ดก็Œฎไฝฟ็”จ GID ็š„่ฎญ็ปƒ config file + +```python +_base_ = [ + '../../../configs/_base_/models/deeplabv3plus_r50-d8.py', + './_base_/datasets/gid.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_240k.py' +] +custom_imports = dict( + imports=['projects.gid_dataset.mmseg.datasets.gid']) + +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101), + decode_head=dict(num_classes=6), + auxiliary_head=dict(num_classes=6)) + +``` + +### 3.6 ๆ’ฐๅ†™`docs/zh_cn/user_guides/2_dataset_prepare.md` + +**Gaofen Image Dataset (GID)** + +- GID ๆ•ฐๆฎ้›†ๅฏๅœจ[ๆญคๅค„](https://x-ytong.github.io/project/Five-Billion-Pixels.html)่ฟ›่กŒไธ‹่ฝฝใ€‚ +- GID ๆ•ฐๆฎ้›†ๅŒ…ๅซ 150 ๅผ  6800x7200 ็š„ๅคงๅฐบๅฏธๅ›พๅƒ๏ผŒๆ ‡็ญพไธบ RGB ๆ ‡็ญพใ€‚ +- ๆญคๅค„้€‰ๆ‹ฉ 15 ๅผ ๅ›พๅƒ็”Ÿๆˆ่ฎญ็ปƒ้›†ๅ’Œ้ชŒ่ฏ้›†๏ผŒ่ฏฅ 15 ๅผ ๅ›พๅƒๅŒ…ๅซไบ†ๆ‰€ๆœ‰ๅ…ญ็ฑปไฟกๆฏใ€‚ๆ‰€้€‰็š„ๅ›พๅƒๅ็งฐๅฆ‚ไธ‹๏ผš + +```None + GF2_PMS1__L1A0000647767-MSS1 + GF2_PMS1__L1A0001064454-MSS1 + GF2_PMS1__L1A0001348919-MSS1 + GF2_PMS1__L1A0001680851-MSS1 + GF2_PMS1__L1A0001680853-MSS1 + GF2_PMS1__L1A0001680857-MSS1 + GF2_PMS1__L1A0001757429-MSS1 + GF2_PMS2__L1A0000607681-MSS2 + GF2_PMS2__L1A0000635115-MSS2 + GF2_PMS2__L1A0000658637-MSS2 + GF2_PMS2__L1A0001206072-MSS2 + GF2_PMS2__L1A0001471436-MSS2 + GF2_PMS2__L1A0001642620-MSS2 + GF2_PMS2__L1A0001787089-MSS2 + GF2_PMS2__L1A0001838560-MSS2 +``` + +ๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปค่ฟ›่กŒ่ฃๅˆ‡ๅŠๆ ‡็ญพ็š„่ฝฌๆข๏ผŒ้œ€่ฆไฟฎๆ”นไธบๆ‚จๆ‰€ๅญ˜ๅ‚จ 15 ๅผ ๅ›พๅƒๅŠๆ ‡็ญพ็š„่ทฏๅพ„ใ€‚ + +``` +python projects/gid_dataset/tools/dataset_converters/gid.py [15 ๅผ ๅ›พๅƒ็š„่ทฏๅพ„] [15 ๅผ ๆ ‡็ญพ็š„่ทฏๅพ„] +``` + +ๅฎŒๆˆ่ฃๅˆ‡ๅŽ็š„ GID ๆ•ฐๆฎ็ป“ๆž„ๅฆ‚ไธ‹๏ผš + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ gid +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + +``` + +### 3.7 ่ดก็Œฎ็š„ไปฃ็ ๅŠๆ–‡ๆกฃ้€š่ฟ‡`pre-commit`ๆฃ€ๆŸฅ + +ไฝฟ็”จๅ‘ฝไปค + +```bash +git add . +git commit -m "ๆทปๅŠ ๆ่ฟฐ" +git push +``` + +### 3.8 ๅœจ GitHub ไธญๅ‘ mmsegmentation ๆไบค PR + +ๅ…ทไฝ“ๆญฅ้ชคๅฏ่ง[ใ€ŠOpenMMLab ่ดก็Œฎไปฃ็ ๆŒ‡ๅ—ใ€‹](https://mmcv.readthedocs.io/zh_CN/latest/community/contributing.html) diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/customize_runtime.md b/mmsegmentation/docs/zh_cn/advanced_guides/customize_runtime.md new file mode 100644 index 0000000..a80aca6 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/customize_runtime.md @@ -0,0 +1,162 @@ +# ่‡ชๅฎšไน‰่ฟ่กŒ่ฎพๅฎš + +## ๅฎž็Žฐ่‡ชๅฎšไน‰้’ฉๅญ + +### Step 1: ๅˆ›ๅปบไธ€ไธชๆ–ฐ็š„้’ฉๅญ + +MMEngine ๅทฒๅฎž็Žฐไบ†่ฎญ็ปƒๅ’Œๆต‹่ฏ•ๅธธ็”จ็š„[้’ฉๅญ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/hook.md), +ๅฝ“ๆœ‰ๅฎšๅˆถๅŒ–้œ€ๆฑ‚ๆ—ถ, ๅฏไปฅๆŒ‰็…งๅฆ‚ไธ‹็คบไพ‹ๅฎž็Žฐ้€‚็”จไบŽ่‡ช่บซ่ฎญ็ปƒ้œ€ๆฑ‚็š„้’ฉๅญ, ไพ‹ๅฆ‚ๆƒณไฟฎๆ”นไธ€ไธช่ถ…ๅ‚ๆ•ฐ `model.hyper_paramete` ็š„ๅ€ผ, ่ฎฉๅฎƒ้š็€่ฎญ็ปƒ่ฟญไปฃๆฌกๆ•ฐ่€Œๅ˜ๅŒ–: + +```python +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Sequence + +from mmengine.hooks import Hook +from mmengine.model import is_model_wrapper + +from mmseg.registry import HOOKS + + +@HOOKS.register_module() +class NewHook(Hook): + """Docstring for NewHook. + """ + + def __init__(self, a: int, b: int) -> None: + self.a = a + self.b = b + + def before_train_iter(self, + runner, + batch_idx: int, + data_batch: Optional[Sequence[dict]] = None) -> None: + cur_iter = runner.iter + # ๅฝ“ๆจกๅž‹่ขซๅŒ…ๅœจ wrapper ้‡Œๆ—ถ่Žทๅ–่ฟ™ไธชๆจกๅž‹ + if is_model_wrapper(runner.model): + model = runner.model.module + model.hyper_parameter = self.a * cur_iter + self.b +``` + +### Step 2: ๅฏผๅ…ฅไธ€ไธชๆ–ฐ็š„้’ฉๅญ + +ไธบไบ†่ฎฉไธŠ้ขๅฎšไน‰็š„ๆจกๅ—ๅฏไปฅ่ขซๆ‰ง่กŒ็š„็จ‹ๅบๅ‘็Žฐ, ่ฟ™ไธชๆจกๅ—้œ€่ฆๅ…ˆ่ขซๅฏผๅ…ฅไธปๅ‘ฝๅ็ฉบ้—ด (main namespace) ้‡Œ้ข, +ๅ‡่ฎพ NewHook ๅœจ `mmseg/engine/hooks/new_hook.py` ้‡Œ้ข, ๆœ‰ไธค็งๆ–นๅผๅŽปๅฎž็Žฐๅฎƒ: + +- ไฟฎๆ”น `mmseg/engine/hooks/__init__.py` ๆฅๅฏผๅ…ฅๅฎƒ. + ๆ–ฐๅฎšไน‰็š„ๆจกๅ—ๅบ”่ฏฅๅœจ `mmseg/engine/hooks/__init__.py` ้‡Œ้ขๅฏผๅ…ฅ, ่ฟ™ๆ ทๆณจๅ†Œๅ™จๅฏไปฅๅ‘็ŽฐๅนถๆทปๅŠ ่ฟ™ไธชๆ–ฐ็š„ๆจกๅ—: + +```python +from .new_hook import NewHook + +__all__ = [..., NewHook] +``` + +- ๅœจ้…็ฝฎๆ–‡ไปถ้‡Œไฝฟ็”จ custom_imports ๆฅๆ‰‹ๅŠจๅฏผๅ…ฅๅฎƒ. + +```python +custom_imports = dict(imports=['mmseg.engine.hooks.new_hook'], allow_failed_imports=False) +``` + +### Step 3: ไฟฎๆ”น้…็ฝฎๆ–‡ไปถ + +ๅฏไปฅๆŒ‰็…งๅฆ‚ไธ‹ๆ–นๅผ, ๅœจ่ฎญ็ปƒๆˆ–ๆต‹่ฏ•ไธญ้…็ฝฎๅนถไฝฟ็”จ่‡ชๅฎšไน‰็š„้’ฉๅญ. ไธๅŒ้’ฉๅญๅœจๅŒไธ€ไฝ็‚น็š„ไผ˜ๅ…ˆ็บงๅฏไปฅๅ‚่€ƒ[่ฟ™้‡Œ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/hook.md#%E5%86%85%E7%BD%AE%E9%92%A9%E5%AD%90), ่‡ชๅฎšไน‰้’ฉๅญๅฆ‚ๆžœๆฒกๆœ‰ๆŒ‡ๅฎšไผ˜ๅ…ˆ, ้ป˜่ฎคๆ˜ฏ `NORMAL`. + +```python +custom_hooks = [ + dict(type='NewHook', a=a_value, b=b_value, priority='ABOVE_NORMAL') +] +``` + +## ๅฎž็Žฐ่‡ชๅฎšไน‰ไผ˜ๅŒ–ๅ™จ + +### Step 1: ๅˆ›ๅปบไธ€ไธชๆ–ฐ็š„ไผ˜ๅŒ–ๅ™จ + +ๅฆ‚ๆžœๅขžๅŠ ไธ€ไธชๅซไฝœ `MyOptimizer` ็š„ไผ˜ๅŒ–ๅ™จ, ๅฎƒๆœ‰ๅ‚ๆ•ฐ `a`, `b` ๅ’Œ `c`. ๆŽจ่ๅœจ `mmseg/engine/optimizers/my_optimizer.py` ๆ–‡ไปถไธญๅฎž็Žฐ + +```python +from mmseg.registry import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) +``` + +### Step 2: ๅฏผๅ…ฅไธ€ไธชๆ–ฐ็š„ไผ˜ๅŒ–ๅ™จ + +ไธบไบ†่ฎฉไธŠ้ขๅฎšไน‰็š„ๆจกๅ—ๅฏไปฅ่ขซๆ‰ง่กŒ็š„็จ‹ๅบๅ‘็Žฐ, ่ฟ™ไธชๆจกๅ—้œ€่ฆๅ…ˆ่ขซๅฏผๅ…ฅไธปๅ‘ฝๅ็ฉบ้—ด (main namespace) ้‡Œ้ข, +ๅ‡่ฎพ `MyOptimizer` ๅœจ `mmseg/engine/optimizers/my_optimizer.py` ้‡Œ้ข, ๆœ‰ไธค็งๆ–นๅผๅŽปๅฎž็Žฐๅฎƒ: + +- ไฟฎๆ”น `mmseg/engine/optimizers/__init__.py` ๆฅๅฏผๅ…ฅๅฎƒ. + ๆ–ฐๅฎšไน‰็š„ๆจกๅ—ๅบ”่ฏฅๅœจ `mmseg/engine/optimizers/__init__.py` ้‡Œ้ขๅฏผๅ…ฅ, ่ฟ™ๆ ทๆณจๅ†Œๅ™จๅฏไปฅๅ‘็ŽฐๅนถๆทปๅŠ ่ฟ™ไธชๆ–ฐ็š„ๆจกๅ—: + +```python +from .my_optimizer import MyOptimizer +``` + +- ๅœจ้…็ฝฎๆ–‡ไปถ้‡Œไฝฟ็”จ `custom_imports` ๆฅๆ‰‹ๅŠจๅฏผๅ…ฅๅฎƒ. + +```python +custom_imports = dict(imports=['mmseg.engine.optimizers.my_optimizer'], allow_failed_imports=False) +``` + +### Step 3: ไฟฎๆ”น้…็ฝฎๆ–‡ไปถ + +้šๅŽ้œ€่ฆไฟฎๆ”น้…็ฝฎๆ–‡ไปถ `optim_wrapper` ้‡Œ็š„ `optimizer` ๅ‚ๆ•ฐ, ๅฆ‚ๆžœ่ฆไฝฟ็”จไฝ ่‡ชๅทฑ็š„ไผ˜ๅŒ–ๅ™จ `MyOptimizer`, ๅญ—ๆฎตๅฏไปฅ่ขซไฟฎๆ”นๆˆ: + +```python +optim_wrapper = dict(type='OptimWrapper', + optimizer=dict(type='MyOptimizer', + a=a_value, b=b_value, c=c_value), + clip_grad=None) +``` + +## ๅฎž็Žฐ่‡ชๅฎšไน‰ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จ + +### Step 1: ๅˆ›ๅปบไธ€ไธชๆ–ฐ็š„ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จ + +ๆž„้€ ๅ™จๅฏไปฅ็”จๆฅๅˆ›ๅปบไผ˜ๅŒ–ๅ™จ, ไผ˜ๅŒ–ๅ™จๅŒ…, ไปฅๅŠ่‡ชๅฎšไน‰ๆจกๅž‹็ฝ‘็ปœไธๅŒๅฑ‚็š„่ถ…ๅ‚ๆ•ฐ. ไธ€ไบ›ๆจกๅž‹็š„ไผ˜ๅŒ–ๅ™จๅฏ่ƒฝไผšๆ นๆฎ็‰นๅฎš็š„ๅ‚ๆ•ฐ่€Œ่ฐƒๆ•ด, ไพ‹ๅฆ‚ BatchNorm ๅฑ‚็š„ weight decay. ไฝฟ็”จ่€…ๅฏไปฅ้€š่ฟ‡่‡ชๅฎšไน‰ไผ˜ๅŒ–ๅ™จๆž„้€ ๅ™จๆฅ็ฒพ็ป†ๅŒ–่ฎพๅฎšไธๅŒๅ‚ๆ•ฐ็š„ไผ˜ๅŒ–็ญ–็•ฅ. + +```python +from mmengine.optim import DefaultOptimWrapperConstructor +from mmseg.registry import OPTIM_WRAPPER_CONSTRUCTORS + +@OPTIM_WRAPPER_CONSTRUCTORS.register_module() +class LearningRateDecayOptimizerConstructor(DefaultOptimWrapperConstructor): + def __init__(self, optim_wrapper_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer +``` + +้ป˜่ฎค็š„ไผ˜ๅŒ–ๅ™จๆž„้€ ๅ™จๅœจ[่ฟ™้‡Œ](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19) ่ขซๅฎž็Žฐ, ๅฎƒไนŸๅฏไปฅ็”จๆฅไฝœไธบๆ–ฐ็š„ไผ˜ๅŒ–ๅ™จๆž„้€ ๅ™จ็š„ๆจกๆฟ. + +### Step 2: ๅฏผๅ…ฅไธ€ไธชๆ–ฐ็š„ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จ + +ไธบไบ†่ฎฉไธŠ้ขๅฎšไน‰็š„ๆจกๅ—ๅฏไปฅ่ขซๆ‰ง่กŒ็š„็จ‹ๅบๅ‘็Žฐ, ่ฟ™ไธชๆจกๅ—้œ€่ฆๅ…ˆ่ขซๅฏผๅ…ฅไธปๅ‘ฝๅ็ฉบ้—ด (main namespace) ้‡Œ้ข, ๅ‡่ฎพ `MyOptimizerConstructor` ๅœจ `mmseg/engine/optimizers/my_optimizer_constructor.py` ้‡Œ้ข, ๆœ‰ไธค็งๆ–นๅผๅŽปๅฎž็Žฐๅฎƒ: + +- ไฟฎๆ”น `mmseg/engine/optimizers/__init__.py` ๆฅๅฏผๅ…ฅๅฎƒ. + ๆ–ฐๅฎšไน‰็š„ๆจกๅ—ๅบ”่ฏฅๅœจ `mmseg/engine/optimizers/__init__.py` ้‡Œ้ขๅฏผๅ…ฅ, ่ฟ™ๆ ทๆณจๅ†Œๅ™จๅฏไปฅๅ‘็ŽฐๅนถๆทปๅŠ ่ฟ™ไธชๆ–ฐ็š„ๆจกๅ—: + +```python +from .my_optimizer_constructor import MyOptimizerConstructor +``` + +- ๅœจ้…็ฝฎๆ–‡ไปถ้‡Œไฝฟ็”จ `custom_imports` ๆฅๆ‰‹ๅŠจๅฏผๅ…ฅๅฎƒ. + +```python +custom_imports = dict(imports=['mmseg.engine.optimizers.my_optimizer_constructor'], allow_failed_imports=False) +``` + +### Step 3: ไฟฎๆ”น้…็ฝฎๆ–‡ไปถ + +้šๅŽ้œ€่ฆไฟฎๆ”น้…็ฝฎๆ–‡ไปถ `optim_wrapper` ้‡Œ็š„ `constructor` ๅ‚ๆ•ฐ, ๅฆ‚ๆžœ่ฆไฝฟ็”จไฝ ่‡ชๅทฑ็š„ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จ `MyOptimizerConstructor`, ๅญ—ๆฎตๅฏไปฅ่ขซไฟฎๆ”นๆˆ: + +```python +optim_wrapper = dict(type='OptimWrapper', + constructor='MyOptimizerConstructor', + clip_grad=None) +``` diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/data_flow.md b/mmsegmentation/docs/zh_cn/advanced_guides/data_flow.md new file mode 100644 index 0000000..20dbe07 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/data_flow.md @@ -0,0 +1,90 @@ +# ๆ•ฐๆฎๆต + +ๅœจๆœฌ็ซ ่Š‚ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ไป‹็ป [Runner](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html) ็ฎก็†็š„ๅ†…้ƒจๆจกๅ—ไน‹้—ด็š„ๆ•ฐๆฎๆตๅ’Œๆ•ฐๆฎๆ ผๅผ็บฆๅฎšใ€‚ + +## ๆ•ฐๆฎๆตๆฆ‚่ฟฐ + +[Runner](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/design/runner.md) ็›ธๅฝ“ไบŽ MMEngine ไธญ็š„โ€œ้›†ๆˆๅ™จโ€ใ€‚ๅฎƒ่ฆ†็›–ไบ†ๆก†ๆžถ็š„ๆ‰€ๆœ‰ๆ–น้ข๏ผŒๅนถ่‚ฉ่ดŸ็€็ป„็ป‡ๅ’Œ่ฐƒๅบฆๅ‡ ไนŽๆ‰€ๆœ‰ๆจกๅ—็š„่ดฃไปป๏ผŒ่ฟ™ๆ„ๅ‘ณ็€ๅ„ๆจกๅ—ไน‹้—ด็š„ๆ•ฐๆฎๆตไนŸ็”ฑ `Runner` ๆŽงๅˆถใ€‚ ๅฆ‚ [MMEngine ไธญ็š„ Runner ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html)ๆ‰€็คบ๏ผŒไธ‹ๅ›พๅฑ•็คบไบ†ๅŸบๆœฌ็š„ๆ•ฐๆฎๆตใ€‚ + +![Basic dataflow](https://user-images.githubusercontent.com/112053249/199228350-5f80699e-7fd2-4b4c-ac32-0b16b1922c2e.png) + +่™š็บฟ่พนๆก†ใ€็ฐ่‰ฒๅกซๅ……ๅฝข็Šถไปฃ่กจไธๅŒ็š„ๆ•ฐๆฎๆ ผๅผ๏ผŒ่€Œๅฎžๅฟƒๆก†่กจ็คบๆจกๅ—/ๆ–นๆณ•ใ€‚็”ฑไบŽ MMEngine ๆžๅคง็š„็ตๆดปๆ€งๅ’Œๅฏๆ‰ฉๅฑ•ๆ€ง๏ผŒไธ€ไบ›้‡่ฆ็š„ๅŸบ็ฑปๅฏไปฅ่ขซ็ปงๆ‰ฟ๏ผŒๅนถไธ”ๅฎƒไปฌ็š„ๆ–นๆณ•ๅฏไปฅ่ขซ่ฆ†ๅ†™ใ€‚ ไธŠๅ›พๆ‰€็คบๆ•ฐๆฎๆตไป…้€‚็”จไบŽๅฝ“็”จๆˆทๆฒกๆœ‰่‡ชๅฎšไน‰ `Runner` ไธญ็š„ `TrainLoop`ใ€`ValLoop` ๅ’Œ `TestLoop`๏ผŒๅนถไธ”ๆฒกๆœ‰ๅœจๅ…ถ่‡ชๅฎšไน‰ๆจกๅž‹ไธญ่ฆ†ๅ†™ `train_step`ใ€`val_step` ๅ’Œ `test_step` ๆ–นๆณ•ๆ—ถใ€‚MMSegmentation ไธญ loop ็š„้ป˜่ฎค่ฎพ็ฝฎๅฆ‚ไธ‹๏ผšไฝฟ็”จ`IterBasedTrainLoop` ่ฎญ็ปƒๆจกๅž‹๏ผŒๅ…ฑ่ฎก 20000 ๆฌก่ฟญไปฃ๏ผŒๅนถไธ”ๅœจๆฏ 2000 ๆฌก่ฟญไปฃๅŽ่ฟ›่กŒไธ€ๆฌก้ชŒ่ฏใ€‚ + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=20000, val_interval=2000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +``` + +ๅœจไธŠๅ›พไธญ๏ผŒ็บข่‰ฒ็บฟ่กจ็คบ [train_step](./models.md#train_step)๏ผŒๅœจๆฏๆฌก่ฎญ็ปƒ่ฟญไปฃไธญ๏ผŒๆ•ฐๆฎๅŠ ่ฝฝๅ™จ๏ผˆdataloader๏ผ‰ไปŽๅญ˜ๅ‚จไธญๅŠ ่ฝฝๅ›พๅƒๅนถไผ ่พ“ๅˆฐๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ๏ผˆdata preprocessor๏ผ‰๏ผŒๆ•ฐๆฎ้ข„ๅค„็†ๅ™จไผšๅฐ†ๅ›พๅƒๆ”พๅˆฐ็‰นๅฎš็š„่ฎพๅค‡ไธŠ๏ผŒๅนถๅฐ†ๆ•ฐๆฎๅ †ๅ ๅˆฐๆ‰นๅค„็†ไธญ๏ผŒไน‹ๅŽๆจกๅž‹ๆŽฅๅ—ๆ‰นๅค„็†ๆ•ฐๆฎไฝœไธบ่พ“ๅ…ฅ๏ผŒๆœ€ๅŽๅฐ†ๆจกๅž‹็š„่พ“ๅ‡บๅ‘้€็ป™ไผ˜ๅŒ–ๅ™จ๏ผˆoptimizer๏ผ‰ใ€‚่“่‰ฒ็บฟ่กจ็คบ [val_step](./models.md#val_step) ๅ’Œ [test_step](./models.md#test_step)ใ€‚่ฟ™ไธคไธช่ฟ‡็จ‹็š„ๆ•ฐๆฎๆต้™คไบ†ๆจกๅž‹่พ“ๅ‡บไธŽ `train_step` ไธๅŒๅค–๏ผŒๅ…ถไฝ™ๅ‡ๅ’Œ `train_step` ็ฑปไผผใ€‚็”ฑไบŽๅœจ่ฏ„ไผฐๆ—ถๆจกๅž‹ๅ‚ๆ•ฐไผš่ขซๅ†ป็ป“๏ผŒๅ› ๆญคๆจกๅž‹็š„่พ“ๅ‡บๅฐ†่ขซไผ ้€’็ป™ [Evaluator](./evaluation.md#ioumetric)ใ€‚ +ๆฅ่ฎก็ฎ—ๆŒ‡ๆ ‡ใ€‚ + +## MMSegmentation ไธญ็š„ๆ•ฐๆฎๆต็บฆๅฎš + +ๅœจไธŠ้ข็š„ๅ›พไธญ๏ผŒๆˆ‘ไปฌๅฏไปฅ็œ‹ๅˆฐๅŸบๆœฌ็š„ๆ•ฐๆฎๆตใ€‚ๅœจๆœฌ่Š‚ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ๅˆ†ๅˆซไป‹็ปๆ•ฐๆฎๆตไธญๆถ‰ๅŠ็š„ๆ•ฐๆฎ็š„ๆ ผๅผ็บฆๅฎšใ€‚ + +### ๆ•ฐๆฎๅŠ ่ฝฝๅ™จๅˆฐๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ + +ๆ•ฐๆฎๅŠ ่ฝฝๅ™จ๏ผˆDataLoader๏ผ‰ๆ˜ฏ MMEngine ็š„่ฎญ็ปƒๅ’Œๆต‹่ฏ•ๆต็จ‹ไธญ็š„ไธ€ไธช้‡่ฆ็ป„ไปถใ€‚ +ไปŽๆฆ‚ๅฟตไธŠ่ฎฒ๏ผŒๅฎƒๆบไบŽ [PyTorch](https://pytorch.org/) ๅนถไฟๆŒไธ€่‡ดใ€‚DataLoader ไปŽๆ–‡ไปถ็ณป็ปŸๅŠ ่ฝฝๆ•ฐๆฎ๏ผŒๅŽŸๅง‹ๆ•ฐๆฎ้€š่ฟ‡ๆ•ฐๆฎๅ‡†ๅค‡ๆต็จ‹ๅŽ่ขซๅ‘้€็ป™ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จใ€‚ + +MMSegmentation ๅœจ [PackSegInputs](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/transforms/formatting.py#L12) ไธญๅฎšไน‰ไบ†้ป˜่ฎคๆ•ฐๆฎๆ ผๅผ๏ผŒ ๅฎƒๆ˜ฏ `train_pipeline` ๅ’Œ `test_pipeline` ็š„ๆœ€ๅŽไธ€ไธช็ป„ไปถใ€‚ๆœ‰ๅ…ณๆ•ฐๆฎ่ฝฌๆข `pipeline` ็š„ๆ›ดๅคšไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…[ๆ•ฐๆฎ่ฝฌๆขๆ–‡ๆกฃ](./transforms.md)ใ€‚ + +ๅœจๆฒกๆœ‰ไปปไฝ•ไฟฎๆ”น็š„ๆƒ…ๅ†ตไธ‹๏ผŒPackSegInputs ็š„่ฟ”ๅ›žๅ€ผ้€šๅธธๆ˜ฏไธ€ไธชๅŒ…ๅซ `inputs` ๅ’Œ `data_samples` ็š„ `dict`ใ€‚ไปฅไธ‹ไผชไปฃ็ ๅฑ•็คบไบ† mmseg ไธญๆ•ฐๆฎๅŠ ่ฝฝๅ™จ่พ“ๅ‡บ็š„ๆ•ฐๆฎ็ฑปๅž‹๏ผŒๅฎƒๆ˜ฏไปŽๆ•ฐๆฎ้›†ไธญ่Žทๅ–็š„ไธ€ๆ‰นๆ•ฐๆฎๆ ทๆœฌ๏ผŒๆ•ฐๆฎๅŠ ่ฝฝๅ™จๅฐ†ๅฎƒไปฌๆ‰“ๅŒ…ๆˆไธ€ไธชๅญ—ๅ…ธๅˆ—่กจใ€‚`inputs` ๆ˜ฏ่พ“ๅ…ฅ่ฟ›ๆจกๅž‹็š„ๅผ ้‡ๅˆ—่กจ๏ผŒ`data_samples` ๅŒ…ๅซไบ†่พ“ๅ…ฅๅ›พๅƒ็š„ meta information ๅ’Œ็›ธๅบ”็š„ ground truthใ€‚ + +```python +dict( + inputs=List[torch.Tensor], + data_samples=List[SegDataSample] +) +``` + +**ๆณจๆ„๏ผš** [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) ๆ˜ฏ MMSegmentation ็š„ๆ•ฐๆฎ็ป“ๆž„ๆŽฅๅฃ๏ผŒ็”จไบŽ่ฟžๆŽฅไธๅŒ็ป„ไปถใ€‚`SegDataSample` ๅฎž็Žฐไบ†ๆŠฝ่ฑกๆ•ฐๆฎๅ…ƒ็ด  `mmengine.structures.BaseDataElement`๏ผŒๆ›ดๅคšไฟกๆฏ่ฏทๅœจ [MMEngine](https://github.com/open-mmlab/mmengine) ไธญๅ‚้˜… [SegDataSample ๆ–‡ๆกฃ](./structures.md)ๅ’Œ[ๆ•ฐๆฎๅ…ƒ็ด ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/data_element.html)ใ€‚ + +### ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จๅˆฐๆจกๅž‹ + +่™ฝ็„ถๅœจ[ไธŠ้ข็š„ๅ›พ](##ๆ•ฐๆฎๆตๆฆ‚่ฟฐ)ไธญๅˆ†ๅผ€็ป˜ๅˆถไบ†ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จๅ’Œๆจกๅž‹๏ผŒไฝ†ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จๆ˜ฏๆจกๅž‹็š„ไธ€้ƒจๅˆ†๏ผŒๅ› ๆญคๅฏไปฅๅœจ[ๆจกๅž‹ๆ•™็จ‹](./models.md)ไธญๆ‰พๅˆฐๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ็ซ ่Š‚ใ€‚ + +ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ็š„่ฟ”ๅ›žๅ€ผๆ˜ฏไธ€ไธชๅŒ…ๅซ `inputs` ๅ’Œ `data_samples` ็š„ๅญ—ๅ…ธ๏ผŒๅ…ถไธญ `inputs` ๆ˜ฏๆ‰นๅค„็†ๅ›พๅƒ็š„ 4D ๅผ ้‡๏ผŒ`data_samples` ไธญๆทปๅŠ ไบ†ไธ€ไบ›็”จไบŽๆ•ฐๆฎ้ข„ๅค„็†็š„้ขๅค–ๅ…ƒไฟกๆฏใ€‚ๅฝ“ไผ ้€’็ป™็ฝ‘็ปœๆ—ถ๏ผŒๅญ—ๅ…ธๅฐ†่ขซ่งฃๅŒ…ไธบไธคไธชๅ€ผใ€‚ ไปฅไธ‹ไผชไปฃ็ ๅฑ•็คบไบ†ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ็š„่ฟ”ๅ›žๅ€ผๅ’Œๆจกๅž‹็š„่พ“ๅ…ฅๅ€ผใ€‚ + +```python +dict( + inputs=torch.Tensor, + data_samples=List[SegDataSample] +) +``` + +```python +class Network(BaseSegmentor): + + def forward(self, inputs: torch.Tensor, data_samples: List[SegDataSample], mode: str): + pass +``` + +**ๆณจๆ„๏ผš** ๆจกๅž‹็š„ๅ‰ๅ‘ไผ ๆ’ญๆœ‰ 3 ็งๆจกๅผ๏ผŒ็”ฑ่พ“ๅ…ฅๅ‚ๆ•ฐ mode ๆŽงๅˆถ๏ผŒๆ›ดๅคšไฟกๆฏ่ฏทๅ‚้˜…[ๆจกๅž‹ๆ•™็จ‹](./models.md)ใ€‚ + +### ๆจกๅž‹่พ“ๅ‡บ + +ๅฆ‚[ๆจกๅž‹ๆ•™็จ‹](./models.md#forward) ***๏ผˆ[ไธญๆ–‡้“พๆŽฅๅพ…ๆ›ดๆ–ฐ](./models.md#forward)๏ผ‰*** ๆ‰€ๆๅˆฐ็š„ 3 ็งๅ‰ๅ‘ไผ ๆ’ญๅ…ทๆœ‰ 3 ็ง่พ“ๅ‡บใ€‚ +`train_step` ๅ’Œ `test_step`๏ผˆๆˆ– `val_step`๏ผ‰ๅˆ†ๅˆซๅฏนๅบ”ไบŽ `'loss'` ๅ’Œ `'predict'`ใ€‚ + +ๅœจ `test_step` ๆˆ– `val_step` ไธญ๏ผŒๆŽจ็†็ป“ๆžœไผš่ขซไผ ้€’็ป™ `Evaluator` ใ€‚ๆ‚จๅฏไปฅๅ‚้˜…[่ฏ„ไผฐๆ–‡ๆกฃ](./evaluation.md)ๆฅ่Žทๅ–ๆ›ดๅคšๅ…ณไบŽ `Evaluator` ็š„ไฟกๆฏใ€‚ + +ๅœจๆŽจ็†ๅŽ๏ผŒMMSegmentation ไธญ็š„ [BaseSegmentor](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/segmentors/base.py#L15) ไผšๅฏนๆŽจ็†็ป“ๆžœ่ฟ›่กŒ็ฎ€ๅ•็š„ๅŽๅค„็†ไปฅๆ‰“ๅŒ…ๆŽจ็†็ป“ๆžœใ€‚็ฅž็ป็ฝ‘็ปœ็”Ÿๆˆ็š„ๅˆ†ๅ‰ฒ logits๏ผŒ็ป่ฟ‡ `argmax` ๆ“ไฝœๅŽ็š„ๅˆ†ๅ‰ฒ mask ๅ’Œ ground truth๏ผˆๅฆ‚ๆžœๅญ˜ๅœจ๏ผ‰ๅฐ†่ขซๆ‰“ๅŒ…ๅˆฐ็ฑปไผผ `SegDataSample` ็š„ๅฎžไพ‹ใ€‚ [postprocess_result](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/segmentors/base.py#L132) ็š„่ฟ”ๅ›žๅ€ผๆ˜ฏไธ€ไธช **`SegDataSample`็š„`List`**ใ€‚ไธ‹ๅ›พๆ˜พ็คบไบ†่ฟ™ไบ› `SegDataSample` ๅฎžไพ‹็š„ๅ…ณ้”ฎๅฑžๆ€งใ€‚ + +![SegDataSample](https://user-images.githubusercontent.com/15952744/209912225-ab46a8d9-904a-43cb-8bf1-8bec4938ed29.png) + +ไธŽๆ•ฐๆฎ้ข„ๅค„็†ๅ™จไธ€่‡ด๏ผŒๆŸๅคฑๅ‡ฝๆ•ฐไนŸๆ˜ฏๆจกๅž‹็š„ไธ€้ƒจๅˆ†๏ผŒๅฎƒๆ˜ฏ[่งฃ็ ๅคด](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/decode_heads/decode_head.py#L142)็š„ๅฑžๆ€งไน‹ไธ€ใ€‚ + +ๅœจ MMSegmentation ไธญ๏ผŒ`decode_head` ็š„ [loss_by_feat](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/models/decode_heads/decode_head.py#L291) ๆ–นๆณ•ๆ˜ฏ็”จไบŽ่ฎก็ฎ—ๆŸๅคฑ็š„็ปŸไธ€ๆŽฅๅฃใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- seg_logits (Tensor)๏ผš่งฃ็ ๅคดๅ‰ๅ‘ๅ‡ฝๆ•ฐ็š„่พ“ๅ‡บ +- batch_data_samples (List\[SegDataSample\])๏ผšๅˆ†ๅ‰ฒๆ•ฐๆฎๆ ทๆœฌ๏ผŒ้€šๅธธๅŒ…ๆ‹ฌๅฆ‚ `metainfo` ๅ’Œ `gt_sem_seg` ็ญ‰ไฟกๆฏ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- dict\[str, Tensor\]๏ผšไธ€ไธชๆŸๅคฑ็ป„ไปถ็š„ๅญ—ๅ…ธ + +**ๆณจๆ„๏ผš** `train_step` ๅฐ†ๆŸๅคฑไผ ้€’่ฟ› OptimWrapper ไปฅๆ›ดๆ–ฐๆจกๅž‹ไธญ็š„ๆƒ้‡๏ผŒๆ›ดๅคšไฟกๆฏ่ฏทๅ‚้˜… [train_step](./models.md#train_step)ใ€‚ diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/datasets.md b/mmsegmentation/docs/zh_cn/advanced_guides/datasets.md new file mode 100644 index 0000000..b45f2d2 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/datasets.md @@ -0,0 +1,363 @@ +# ๆ•ฐๆฎ้›† + +ๅœจ MMSegmentation ็ฎ—ๆณ•ๅบ“ไธญ, ๆ‰€ๆœ‰ Dataset ็ฑป็š„ๅŠŸ่ƒฝๆœ‰ไธคไธช: ๅŠ ่ฝฝ[้ข„ๅค„็†](../user_guides/2_dataset_prepare.md) ไน‹ๅŽ็š„ๆ•ฐๆฎ้›†็š„ไฟกๆฏ, ๅ’Œๅฐ†ๆ•ฐๆฎ้€ๅ…ฅ[ๆ•ฐๆฎ้›†ๅ˜ๆขๆตๆฐด็บฟ](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L141) ไธญ, ่ฟ›่กŒ[ๆ•ฐๆฎๅ˜ๆขๆ“ไฝœ](./transforms.md). ๅŠ ่ฝฝ็š„ๆ•ฐๆฎ้›†ไฟกๆฏๅŒ…ๆ‹ฌไธค็ฑป: ๅ…ƒไฟกๆฏ (meta information), ๆ•ฐๆฎ้›†ๆœฌ่บซ็š„ไฟกๆฏ, ไพ‹ๅฆ‚ๆ•ฐๆฎ้›†ๆ€ปๅ…ฑ็š„็ฑปๅˆซ, ๅ’Œๅฎƒไปฌๅฏนๅบ”่ฐƒ่‰ฒ็›˜ไฟกๆฏ: ๆ•ฐๆฎไฟกๆฏ (data information) ๆ˜ฏๆŒ‡ๆฏ็ป„ๆ•ฐๆฎไธญๅ›พ็‰‡ๅ’Œๅฏนๅบ”ๆ ‡็ญพ็š„่ทฏๅพ„. ไธ‹ๆ–‡ไธญไป‹็ปไบ† MMSegmentation 1.x ไธญๆ•ฐๆฎ้›†็š„ๅธธ็”จๆŽฅๅฃ, ๅ’Œ mmseg ๆ•ฐๆฎ้›†ๅŸบ็ฑปไธญๆ•ฐๆฎไฟกๆฏๅŠ ่ฝฝไธŽไฟฎๆ”นๆ•ฐๆฎ้›†็ฑปๅˆซ็š„้€ป่พ‘, ไปฅๅŠๆ•ฐๆฎ้›†ไธŽๆ•ฐๆฎๅ˜ๆขๆตๆฐด็บฟ (pipeline) ็š„ๅ…ณ็ณป. + +## ๅธธ็”จๆŽฅๅฃ + +ไปฅ Cityscapes ไธบไพ‹, ไป‹็ปๆ•ฐๆฎ้›†ๅธธ็”จๆŽฅๅฃ. ๅฆ‚้œ€่ฟ่กŒไปฅไธ‹็คบไพ‹, ่ฏทๅœจๅฝ“ๅ‰ๅทฅไฝœ็›ฎๅฝ•ไธ‹็š„ `data` ็›ฎๅฝ•ไธ‹่ฝฝๅนถ[้ข„ๅค„็†](../user_guides/2_dataset_prepare.md#cityscapes) Cityscapes ๆ•ฐๆฎ้›†. + +ๅฎžไพ‹ๅŒ– Cityscapes ่ฎญ็ปƒๆ•ฐๆฎ้›†: + +```python +from mmengine.registry import init_default_scope +from mmseg.datasets import CityscapesDataset + +init_default_scope('mmseg') + +data_root = 'data/cityscapes/' +data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='RandomCrop', crop_size=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PackSegInputs') +] + +dataset = CityscapesDataset(data_root=data_root, data_prefix=data_prefix, test_mode=False, pipeline=train_pipeline) +``` + +ๆŸฅ็œ‹่ฎญ็ปƒๆ•ฐๆฎ้›†้•ฟๅบฆ: + +```python +print(len(dataset)) + +2975 +``` + +่Žทๅ–ๆ•ฐๆฎไฟกๆฏ, ๆ•ฐๆฎไฟกๆฏ็š„็ฑปๅž‹ๆ˜ฏไธ€ไธชๅญ—ๅ…ธ, ๅŒ…ๆ‹ฌ `'img_path'` ๅญ—ๆฎต็š„ๅญ˜ๆ”พๅ›พ็‰‡็š„่ทฏๅพ„ๅ’Œ `'seg_map_path'` ๅญ—ๆฎตๅญ˜ๆ”พๅˆ†ๅ‰ฒๆ ‡ๆณจ็š„่ทฏๅพ„, ไปฅๅŠๆ ‡็ญพ้‡ๆ˜ ๅฐ„็š„ๅญ—ๆฎต `'label_map'` ๅ’Œ `'reduce_zero_label'`(ไธป่ฆๅŠŸ่ƒฝๅœจไธ‹ๆ–‡ไธญไป‹็ป), ่ฟ˜ๆœ‰ๅญ˜ๆ”พๅทฒๅŠ ่ฝฝๆ ‡็ญพๅญ—ๆฎต `'seg_fields'`, ๅ’Œๅฝ“ๅ‰ๆ ทๆœฌ็š„็ดขๅผ•ๅญ—ๆฎต `'sample_idx'`. + +```python +# ่Žทๅ–ๆ•ฐๆฎ้›†ไธญ็ฌฌไธ€็ป„ๆ ทๆœฌ็š„ๆ•ฐๆฎไฟกๆฏ +print(dataset.get_data_info(0)) + +{'img_path': 'data/cityscapes/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png', + 'seg_map_path': 'data/cityscapes/gtFine/train/aachen/aachen_000000_000019_gtFine_labelTrainIds.png', + 'label_map': None, + 'reduce_zero_label': False, + 'seg_fields': [], + 'sample_idx': 0} +``` + +่Žทๅ–ๆ•ฐๆฎ้›†ๅ…ƒไฟกๆฏ, MMSegmentation ็š„ๆ•ฐๆฎ้›†ๅ…ƒไฟกๆฏ็š„็ฑปๅž‹ๅŒๆ ทๆ˜ฏไธ€ไธชๅญ—ๅ…ธ, ๅŒ…ๆ‹ฌ `'classes'` ๅญ—ๆฎตๅญ˜ๆ”พๆ•ฐๆฎ้›†็ฑปๅˆซ, `'palette'` ๅญ˜ๆ”พๆ•ฐๆฎ้›†็ฑปๅˆซๅฏนๅบ”็š„ๅฏ่ง†ๅŒ–ๆ—ถ่ฐƒ่‰ฒ็›˜็š„้ขœ่‰ฒ, ไปฅๅŠๆ ‡็ญพ้‡ๆ˜ ๅฐ„็š„ๅญ—ๆฎต `'label_map'` ๅ’Œ `'reduce_zero_label'`. + +```python +print(dataset.metainfo) + +{'classes': ('road', + 'sidewalk', + 'building', + 'wall', + 'fence', + 'pole', + 'traffic light', + 'traffic sign', + 'vegetation', + 'terrain', + 'sky', + 'person', + 'rider', + 'car', + 'truck', + 'bus', + 'train', + 'motorcycle', + 'bicycle'), + 'palette': [[128, 64, 128], + [244, 35, 232], + [70, 70, 70], + [102, 102, 156], + [190, 153, 153], + [153, 153, 153], + [250, 170, 30], + [220, 220, 0], + [107, 142, 35], + [152, 251, 152], + [70, 130, 180], + [220, 20, 60], + [255, 0, 0], + [0, 0, 142], + [0, 0, 70], + [0, 60, 100], + [0, 80, 100], + [0, 0, 230], + [119, 11, 32]], + 'label_map': None, + 'reduce_zero_label': False} +``` + +ๆ•ฐๆฎ้›† `__getitem__` ๆ–นๆณ•็š„่ฟ”ๅ›žๅ€ผ, ๆ˜ฏ็ป่ฟ‡ๆ•ฐๆฎๅขžๅผบ็š„ๆ ทๆœฌๆ•ฐๆฎ็š„่พ“ๅ‡บ, ๅŒๆ ทไนŸๆ˜ฏไธ€ไธชๅญ—ๅ…ธ, ๅŒ…ๆ‹ฌไธคไธชๅญ—ๆฎต, `'inputs'` ๅญ—ๆฎตๆ˜ฏๅฝ“ๅ‰ๆ ทๆœฌ็ป่ฟ‡ๆ•ฐๆฎๅขžๅผบๆ“ไฝœ็š„ๅ›พๅƒ, ็ฑปๅž‹ไธบ torch.Tensor, `'data_samples'` ๅญ—ๆฎตๅญ˜ๆ”พ็š„ๆ•ฐๆฎ็ฑปๅž‹ๆ˜ฏ MMSegmentation 1.x ๆ–ฐๆทปๅŠ ็š„ๆ•ฐๆฎ็ป“ๆž„ [`Segdatasample`](./structures.md), ๅ…ถไธญ`gt_sem_seg` ๅญ—ๆฎตๆ˜ฏ็ป่ฟ‡ๆ•ฐๆฎๅขžๅผบ็š„ๆ ‡็ญพๆ•ฐๆฎ. + +```python +print(dataset[0]) + +{'inputs': tensor([[[131, 130, 130, ..., 23, 23, 23], + [132, 132, 132, ..., 23, 22, 23], + [134, 133, 133, ..., 23, 23, 23], + ..., + [ 66, 67, 67, ..., 71, 71, 71], + [ 66, 67, 66, ..., 68, 68, 68], + [ 67, 67, 66, ..., 70, 70, 70]], + + [[143, 143, 142, ..., 28, 28, 29], + [145, 145, 145, ..., 28, 28, 29], + [145, 145, 145, ..., 27, 28, 29], + ..., + [ 75, 75, 76, ..., 80, 81, 81], + [ 75, 76, 75, ..., 80, 80, 80], + [ 77, 76, 76, ..., 82, 82, 82]], + + [[126, 125, 126, ..., 21, 21, 22], + [127, 127, 128, ..., 21, 21, 22], + [127, 127, 126, ..., 21, 21, 22], + ..., + [ 63, 63, 64, ..., 69, 69, 70], + [ 64, 65, 64, ..., 69, 69, 69], + [ 65, 66, 66, ..., 72, 71, 71]]], dtype=torch.uint8), + 'data_samples': + _gt_sem_seg: + )} +``` + +## BaseSegDataset + +็”ฑไบŽ MMSegmentation ไธญ็š„ๆ‰€ๆœ‰ๆ•ฐๆฎ้›†็š„ๅŸบๆœฌๅŠŸ่ƒฝๅ‡ๅŒ…ๆ‹ฌ(1) ๅŠ ่ฝฝ[ๆ•ฐๆฎ้›†้ข„ๅค„็†](../user_guides/2_dataset_prepare.md) ไน‹ๅŽ็š„ๆ•ฐๆฎไฟกๆฏๅ’Œ (2) ๅฐ†ๆ•ฐๆฎ้€ๅ…ฅๆ•ฐๆฎๅ˜ๆขๆตๆฐด็บฟไธญ่ฟ›่กŒๆ•ฐๆฎๅ˜ๆข, ๅ› ๆญคๅœจ MMSegmentation ไธญๅฐ†ๅ…ถไธญ็š„ๅ…ฑๅŒๆŽฅๅฃๆŠฝ่ฑกๆˆ [`BaseSegDataset`](https://mmsegmentation.readthedocs.io/zh_CN/latest/api.html?highlight=BaseSegDataset#mmseg.datasets.BaseSegDataset)๏ผŒๅฎƒ็ปงๆ‰ฟ่‡ช [MMEngine ็š„ `BaseDataset`](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/basedataset.md), ้ตๅพช OpenMMLab ๆ•ฐๆฎ้›†ๅˆๅง‹ๅŒ–็ปŸไธ€ๆต็จ‹, ๆ”ฏๆŒ้ซ˜ๆ•ˆ็š„ๅ†…้ƒจๆ•ฐๆฎๅญ˜ๅ‚จๆ ผๅผ, ๆ”ฏๆŒๆ•ฐๆฎ้›†ๆ‹ผๆŽฅใ€ๆ•ฐๆฎ้›†้‡ๅค้‡‡ๆ ท็ญ‰ๅŠŸ่ƒฝ. +ๅœจ MMSegmentation BaseSegDataset ไธญ้‡ๆ–ฐๅฎšไน‰ไบ†**ๆ•ฐๆฎไฟกๆฏๅŠ ่ฝฝๆ–นๆณ•**๏ผˆ`load_data_list`๏ผ‰ๅ’Œๅนถๆ–ฐๅขžไบ† `get_label_map` ๆ–นๆณ•็”จๆฅ**ไฟฎๆ”นๆ•ฐๆฎ้›†็š„็ฑปๅˆซไฟกๆฏ**. + +### ๆ•ฐๆฎไฟกๆฏๅŠ ่ฝฝ + +ๆ•ฐๆฎไฟกๆฏๅŠ ่ฝฝ็š„ๅ†…ๅฎนๆ˜ฏๆ ทๆœฌๆ•ฐๆฎ็š„ๅ›พ็‰‡่ทฏๅพ„ๅ’Œๆ ‡็ญพ่ทฏๅพ„, ๅ…ทไฝ“ๅฎž็Žฐๅœจ MMSegmentation ็š„ BaseSegDataset ็š„ [`load_data_list`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L231) ไธญ. +ไธป่ฆๆœ‰ไธค็ง่Žทๅ–ๅ›พ็‰‡ๅ’Œๆ ‡็ญพ็š„่ทฏๅพ„ๆ–นๆณ•, ๅฆ‚ๆžœๅฝ“ๆ•ฐๆฎ้›†็›ฎๅฝ•ๆŒ‰ไปฅไธ‹็›ฎๅฝ•็ป“ๆž„็ป„็ป‡, [`load_data_list`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L231)) ไผšๆ นๆฎๆ•ฐๆฎ่ทฏๅพ„ๅ’ŒๅŽ็ผ€ๆฅ่งฃๆž. + +``` +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ my_dataset +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{seg_map_suffix} +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{seg_map_suffix} +``` + +ไพ‹ๅฆ‚ ADE20k ๆ•ฐๆฎ้›†็ป“ๆž„ๅฆ‚ไธ‹ๆ‰€็คบ: + +``` +โ”œโ”€โ”€ ade +โ”‚ โ”œโ”€โ”€ ADEChallengeData2016 +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_train_00000001.png +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”‚ โ”‚โ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_val_00000001.png +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_train_00000001.jpg +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ADE_val_00000001.jpg +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... +``` + +ๅฎžไพ‹ๅŒ– ADE20k ๆ•ฐๆฎ้›†ๆ—ถ๏ผŒ่พ“ๅ…ฅๅ›พ็‰‡ๅ’Œๆ ‡็ญพ็š„่ทฏๅพ„ๅ’ŒๅŽ็ผ€: + +```python +from mmseg.datasets import ADE20KDataset + +ADE20KDataset(data_root = 'data/ade/ADEChallengeData2016', + data_prefix=dict(img_path='images/training', seg_map_path='annotations/training'), + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=True๏ผ‰ +``` + +ๅฆ‚ๆžœๆ•ฐๆฎ้›†ๆœ‰ๆ ‡ๆณจๆ–‡ไปถ, ๅฎžไพ‹ๅŒ–ๆ•ฐๆฎ้›†ๆ—ถไผšๆ นๆฎ่พ“ๅ…ฅ็š„ๆ•ฐๆฎ้›†ๆ ‡ๆณจๆ–‡ไปถๅŠ ่ฝฝๆ•ฐๆฎไฟกๆฏ. ไพ‹ๅฆ‚, PascalContext ๆ•ฐๆฎ้›†ๅฎžไพ‹, ่พ“ๅ…ฅๆ ‡ๆณจๆ–‡ไปถ็š„ๅ†…ๅฎนไธบ: + +```python +2008_000008 +... +``` + +ๅฎžไพ‹ๅŒ–ๆ—ถ้œ€่ฆๅฎšไน‰ `ann_file` + +```python +PascalContextDataset(data_root='data/VOCdevkit/VOC2010/', + data_prefix=dict(img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/train.txt') +``` + +### ๆ•ฐๆฎ้›†็ฑปๅˆซไฟฎๆ”น + +- ้€š่ฟ‡่พ“ๅ…ฅ metainfo ไฟฎๆ”น + `BaseSegDataset` ็š„ๅญ็ฑปๅ…ƒไฟกๆฏๅœจๆ•ฐๆฎ้›†ๅฎž็Žฐๆ—ถๅฎšไน‰ไธบ็ฑปๅ˜้‡๏ผŒไพ‹ๅฆ‚ Cityscapes ็š„ `METAINFO` ๅ˜้‡: + +```python +class CityscapesDataset(BaseSegDataset): + """Cityscapes dataset. + + The ``img_suffix`` is fixed to '_leftImg8bit.png' and ``seg_map_suffix`` is + fixed to '_gtFine_labelTrainIds.png' for Cityscapes dataset. + """ + METAINFO = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', + 'sky', 'person', 'rider', 'car', 'truck', 'bus', 'train', + 'motorcycle', 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, + 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], + [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]]) + +``` + +่ฟ™้‡Œ็š„ `'classes'` ไธญๅฎšไน‰ไบ† Cityscapes ๆ•ฐๆฎ้›†ๆ ‡็ญพไธญ็š„็ฑปๅˆซๅ, ๅฆ‚ๆžœ่ฎญ็ปƒๆ—ถๅชๅ…ณๆณจๅ‡ ไธชไบค้€šๅทฅๅ…ท็ฑปๅˆซ, **ๅฟฝ็•ฅๅ…ถไป–็ฑปๅˆซ**, +ๅœจๅฎžไพ‹ๅŒ– Cityscapes ๆ•ฐๆฎ้›†ๆ—ถ้€š่ฟ‡ๅฎšไน‰ `metainfo` ่พ“ๅ…ฅๅ‚ๆ•ฐ็š„ classes ็š„ๅญ—ๆฎตๆฅไฟฎๆ”นๆ•ฐๆฎ้›†็š„ๅ…ƒไฟกๆฏ: + +```python +from mmseg.datasets import CityscapesDataset + +data_root = 'data/cityscapes/' +data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') +# metainfo ไธญๅชไฟ็•™ไปฅไธ‹ classes +metainfo=dict(classes=( 'car', 'truck', 'bus', 'train', 'motorcycle', 'bicycle')) +dataset = CityscapesDataset(data_root=data_root, data_prefix=data_prefix, metainfo=metainfo) + +print(dataset.metainfo) + +{'classes': ('car', 'truck', 'bus', 'train', 'motorcycle', 'bicycle'), + 'palette': [[0, 0, 142], + [0, 0, 70], + [0, 60, 100], + [0, 80, 100], + [0, 0, 230], + [119, 11, 32], + [128, 64, 128], + [244, 35, 232], + [70, 70, 70], + [102, 102, 156], + [190, 153, 153], + [153, 153, 153], + [250, 170, 30], + [220, 220, 0], + [107, 142, 35], + [152, 251, 152], + [70, 130, 180], + [220, 20, 60], + [255, 0, 0]], + # ็ฑปๅˆซ็ดขๅผ•ไธบ 255 ็š„ๅƒ็ด ๏ผŒๅœจ่ฎก็ฎ—ๆŸๅคฑๆ—ถไผš่ขซๅฟฝ็•ฅ + 'label_map': {0: 255, + 1: 255, + 2: 255, + 3: 255, + 4: 255, + 5: 255, + 6: 255, + 7: 255, + 8: 255, + 9: 255, + 10: 255, + 11: 255, + 12: 255, + 13: 0, + 14: 1, + 15: 2, + 16: 3, + 17: 4, + 18: 5}, + 'reduce_zero_label': False} +``` + +ๅฏไปฅ็œ‹ๅˆฐ, ๆ•ฐๆฎ้›†ๅ…ƒไฟกๆฏ็š„็ฑปๅˆซๅ’Œ้ป˜่ฎค Cityscapes ไธๅŒ. ๅนถไธ”, ๅฎšไน‰ไบ†ๆ ‡็ญพ้‡ๆ˜ ๅฐ„็š„ๅญ—ๆฎต `label_map` ็”จๆฅไฟฎๆ”นๆฏไธชๅˆ†ๅ‰ฒๆŽฉ่†œไธŠ็š„ๅƒ็ด ็š„็ฑปๅˆซ็ดขๅผ•, ๅˆ†ๅ‰ฒๆ ‡็ญพ็ฑปๅˆซไผšๆ นๆฎ `label_map`, ๅฐ†็ฑปๅˆซ้‡ๆ˜ ๅฐ„, [ๅ…ทไฝ“ๅฎž็Žฐ](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/basesegdataset.py#L151): + +```python +gt_semantic_seg_copy = gt_semantic_seg.copy() +for old_id, new_id in results['label_map'].items(): + gt_semantic_seg[gt_semantic_seg_copy == old_id] = new_id +``` + +- ้€š่ฟ‡ `reduce_zero_label` ไฟฎๆ”น + ๅฏนไบŽๅธธ่ง็š„ๅฟฝ็•ฅ 0 ๅทๆ ‡็ญพ็š„ๅœบๆ™ฏ, `BaseSegDataset` ็š„ๅญ็ฑปไธญๅฏไปฅ็”จ `reduce_zero_label` ่พ“ๅ…ฅๅ‚ๆ•ฐๆฅๆŽงๅˆถใ€‚`reduce_zero_label` (้ป˜่ฎคไธบ `False`) + ็”จๆฅๆŽงๅˆถๆ˜ฏๅฆๅฐ†ๆ ‡็ญพ 0 ๅฟฝ็•ฅ, ๅฝ“่ฏฅๅ‚ๆ•ฐไธบ `True` ๆ—ถ(ๆœ€ๅธธ่ง็š„ๅบ”็”จๆ˜ฏ ADE20k ๆ•ฐๆฎ้›†), ๅฏนๅˆ†ๅ‰ฒๆ ‡็ญพไธญ็ฌฌ 0 ไธช็ฑปๅˆซๅฏนๅบ”็š„็ฑปๅˆซ็ดขๅผ•ๆ”นไธบ 255 (MMSegmentation ๆจกๅž‹ไธญ่ฎก็ฎ—ๆŸๅคฑๆ—ถ, ้ป˜่ฎคๅฟฝ็•ฅ 255), ๅ…ถไป–็ฑปๅˆซๅฏนๅบ”็š„็ฑปๅˆซ็ดขๅผ•ๅ‡ไธ€: + +```python +gt_semantic_seg[gt_semantic_seg == 0] = 255 +gt_semantic_seg = gt_semantic_seg - 1 +gt_semantic_seg[gt_semantic_seg == 254] = 255 +``` + +## ๆ•ฐๆฎ้›†ไธŽๆ•ฐๆฎๅ˜ๆขๆตๆฐด็บฟ + +ๅœจๅธธ็”จๆŽฅๅฃ็š„ไพ‹ๅญไธญๅฏไปฅ็œ‹ๅˆฐ, ่พ“ๅ…ฅ็š„ๅ‚ๆ•ฐไธญๅฎšไน‰ไบ†ๆ•ฐๆฎๅ˜ๆขๆตๆฐด็บฟๅ‚ๆ•ฐ `pipeline`, ๆ•ฐๆฎ้›† `__getitem__` ๆ–นๆณ•่ฟ”ๅ›ž็ป่ฟ‡ๆ•ฐๆฎๅ˜ๆข็š„ๅ€ผ. +ๅฝ“ๆ•ฐๆฎ้›†่พ“ๅ…ฅๅ‚ๆ•ฐๆฒกๆœ‰ๅฎšไน‰ pipeline, ่ฟ”ๅ›žๅ€ผๅ’Œ `get_data_info` ๆ–นๆณ•่ฟ”ๅ›žๅ€ผ็›ธๅŒ, ไพ‹ๅฆ‚: + +```python +from mmseg.datasets import CityscapesDataset + +data_root = 'data/cityscapes/' +data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') +dataset = CityscapesDataset(data_root=data_root, data_prefix=data_prefix, test_mode=False) + +print(dataset[0]) + +{'img_path': 'data/cityscapes/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png', + 'seg_map_path': 'data/cityscapes/gtFine/train/aachen/aachen_000000_000019_gtFine_labelTrainIds.png', + 'label_map': None, + 'reduce_zero_label': False, + 'seg_fields': [], + 'sample_idx': 0} +``` diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/engine.md b/mmsegmentation/docs/zh_cn/advanced_guides/engine.md new file mode 100644 index 0000000..79b4c8d --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/engine.md @@ -0,0 +1,281 @@ +# ่ฎญ็ปƒๅผ•ๆ“Ž + +MMEngine ๅฎšไน‰ไบ†ไธ€ไบ›[ๅŸบ็ก€ๅพช็ŽฏๆŽงๅˆถๅ™จ](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py) ไพ‹ๅฆ‚ๅŸบไบŽ่ฝฎๆฌก็š„่ฎญ็ปƒๅพช็Žฏ (`EpochBasedTrainLoop`), ๅŸบไบŽ่ฟญไปฃๆฌกๆ•ฐ็š„่ฎญ็ปƒๅพช็Žฏ (`IterBasedTrainLoop`), ๆ ‡ๅ‡†็š„้ชŒ่ฏๅพช็Žฏ (`ValLoop`) ๅ’Œๆ ‡ๅ‡†็š„ๆต‹่ฏ•ๅพช็Žฏ (`TestLoop`). +OpenMMLab ็š„็ฎ—ๆณ•ๅบ“ๅฆ‚ MMSegmentation ๅฐ†ๆจกๅž‹่ฎญ็ปƒ, ๆต‹่ฏ•ๅ’ŒๆŽจ็†ๆŠฝ่ฑกไธบๆ‰ง่กŒๅ™จ(`Runner`) ๆฅๅค„็†. ็”จๆˆทๅฏไปฅ็›ดๆŽฅไฝฟ็”จ MMEngine ไธญ็š„้ป˜่ฎคๆ‰ง่กŒๅ™จ, ไนŸๅฏไปฅๅฏนๆ‰ง่กŒๅ™จ่ฟ›่กŒไฟฎๆ”นไปฅๆปก่ถณๅฎšๅˆถๅŒ–้œ€ๆฑ‚. ่ฟ™ไธชๆ–‡ๆกฃไธป่ฆไป‹็ป็”จๆˆทๅฆ‚ไฝ•้…็ฝฎๅทฒๆœ‰็š„่ฟ่กŒ่ฎพๅฎš, ้’ฉๅญๅ’Œไผ˜ๅŒ–ๅ™จ็š„ๅŸบๆœฌๆฆ‚ๅฟตไธŽไฝฟ็”จๆ–นๆณ•. + +## ้…็ฝฎ่ฟ่กŒ่ฎพๅฎš + +### ้…็ฝฎ่ฎญ็ปƒ้•ฟๅบฆ + +ๅพช็ŽฏๆŽงๅˆถๅ™จๆŒ‡็š„ๆ˜ฏ่ฎญ็ปƒ, ้ชŒ่ฏๅ’Œๆต‹่ฏ•ๆ—ถ็š„ๆ‰ง่กŒๆต็จ‹, ๅœจ้…็ฝฎๆ–‡ไปถ้‡Œ้ขไฝฟ็”จ `train_cfg`, `val_cfg` ๅ’Œ `test_cfg` ๆฅๆž„ๅปบ่ฟ™ไบ›ๆต็จ‹. MMSegmentation ๅœจ `configs/_base_/schedules` ๆ–‡ไปถๅคน้‡Œ้ข็š„ `train_cfg` ่ฎพ็ฝฎๅธธ็”จ็š„่ฎญ็ปƒ้•ฟๅบฆ. +ไพ‹ๅฆ‚, ไฝฟ็”จๅŸบไบŽ่ฟญไปฃๆฌกๆ•ฐ็š„่ฎญ็ปƒๅพช็Žฏ (`IterBasedTrainLoop`) ๅŽป่ฎญ็ปƒ 80,000 ไธช่ฟญไปฃๆฌกๆ•ฐ, ๅนถไธ”ๆฏ 8,000 iteration ๅšไธ€ๆฌก้ชŒ่ฏ, ๅฏไปฅๅฆ‚ไธ‹่ฎพ็ฝฎ: + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=8000) +``` + +### ้…็ฝฎ่ฎญ็ปƒไผ˜ๅŒ–ๅ™จ + +่ฟ™้‡Œๆ˜ฏไธ€ไธช SGD ไผ˜ๅŒ–ๅ™จ็š„ไพ‹ๅญ: + +```python +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005), + clip_grad=None) +``` + +OpenMMLab ๆ”ฏๆŒ PyTorch ้‡Œ้ขๆ‰€ๆœ‰็š„ไผ˜ๅŒ–ๅ™จ, ๆ›ดๅคš็ป†่Š‚ๅฏไปฅๅ‚่€ƒ MMEngine [ไผ˜ๅŒ–ๅ™จๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/optim_wrapper.md). + +้œ€่ฆๅผบ่ฐƒ็š„ๆ˜ฏ, `optim_wrapper` ๆ˜ฏ `runner` ็š„ๅ˜้‡, ๆ‰€ไปฅ้œ€่ฆ้…็ฝฎไผ˜ๅŒ–ๅ™จๆ—ถ้…็ฝฎ็š„ๅญ—ๆฎตๆ˜ฏ `optim_wrapper` ๅญ—ๆฎต. ๆ›ดๅคšๅ…ณไบŽไผ˜ๅŒ–ๅ™จ็š„ไฝฟ็”จๆ–นๆณ•, ๅฏไปฅ็œ‹ไธ‹้ขไผ˜ๅŒ–ๅ™จ็š„็ซ ่Š‚. + +### ้…็ฝฎ่ฎญ็ปƒๅ‚ๆ•ฐ่ฐƒๅบฆๅ™จ + +ๅœจ้…็ฝฎ่ฎญ็ปƒๅ‚ๆ•ฐ่ฐƒๅบฆๅ™จๅ‰, ๆŽจ่ๅ…ˆไบ†่งฃ [MMEngine ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md) ้‡Œ้ขๅ…ณไบŽๅ‚ๆ•ฐ่ฐƒๅบฆๅ™จ็š„ๅŸบๆœฌๆฆ‚ๅฟต. + +ไปฅไธ‹ๆ˜ฏไธ€ไธชๅ‚ๆ•ฐ่ฐƒๅบฆๅ™จ็š„ไพ‹ๅญ, ่ฎญ็ปƒๆ—ถๅ‰ 1,000 ไธช iteration ๆ—ถ้‡‡็”จ็บฟๆ€งๅ˜ๅŒ–็š„ๅญฆไน ็Ž‡็ญ–็•ฅไฝœไธบ่ฎญ็ปƒ้ข„็ƒญ, ไปŽ 1,000 iteration ไน‹ๅŽ็›ดๅˆฐๆœ€ๅŽ 16,000 ไธช iteration ๆ—ถๅˆ™้‡‡็”จ้ป˜่ฎค็š„ๅคš้กนๅผๅญฆไน ็Ž‡่กฐๅ‡: + +```python +param_scheduler = [ + dict(type='LinearLR', by_epoch=False, start_factor=0.1, begin=0, end=1000), + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=1000, + end=160000, + by_epoch=False, + ) +] +``` + +ๆณจๆ„: ๅฝ“ไฟฎๆ”น `train_cfg` ้‡Œ้ข `max_iters` ็š„ๆ—ถๅ€™, ่ฏท็กฎไฟๅ‚ๆ•ฐ่ฐƒๅบฆๅ™จ `param_scheduler` ้‡Œ้ข็š„ๅ‚ๆ•ฐไนŸ่ขซๅŒๆ—ถไฟฎๆ”น. + +## ้’ฉๅญ (Hook) + +### ไป‹็ป + +OpenMMLab ๅฐ†ๆจกๅž‹่ฎญ็ปƒๅ’Œๆต‹่ฏ•่ฟ‡็จ‹ๆŠฝ่ฑกไธบ `Runner`, ๆ’ๅ…ฅ้’ฉๅญๅฏไปฅๅฎž็Žฐๅœจ `Runner` ไธญไธๅŒ็š„่ฎญ็ปƒๅ’Œๆต‹่ฏ•่Š‚็‚น (ไพ‹ๅฆ‚ "ๆฏไธช่ฎญ็ปƒ iter ๅ‰ๅŽ", "ๆฏไธช้ชŒ่ฏ iter ๅ‰ๅŽ" ็ญ‰ไธๅŒ้˜ถๆฎต) ๆ‰€้œ€่ฆ็š„็›ธๅบ”ๅŠŸ่ƒฝ. ๆ›ดๅคš้’ฉๅญๆœบๅˆถ็š„ไป‹็ปๅฏไปฅๅ‚่€ƒ[่ฟ™้‡Œ](https://www.calltutors.com/blog/what-is-hook). + +`Runner` ไธญๆ‰€ไฝฟ็”จ็š„้’ฉๅญๅˆ†ไธบไธค็ฑป: + +- ้ป˜่ฎค้’ฉๅญ (default hooks) + +ๅฎƒไปฌๅฎž็Žฐไบ†่ฎญ็ปƒๆ—ถๆ‰€ๅฟ…้œ€็š„ๅŠŸ่ƒฝ, ๅœจ้…็ฝฎๆ–‡ไปถไธญ็”จ `default_hooks` ๅฎšไน‰ไผ ็ป™ `Runner`, `Runner` ้€š่ฟ‡ [`register_default_hooks`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py#L1780) ๆ–นๆณ•ๆณจๅ†Œ. +้’ฉๅญๆœ‰ๅฏนๅบ”็š„ไผ˜ๅ…ˆ็บง, ไผ˜ๅ…ˆ็บง่ถŠ้ซ˜, ่ถŠๆ—ฉ่ขซๆ‰ง่กŒๅ™จ่ฐƒ็”จ. ๅฆ‚ๆžœไผ˜ๅ…ˆ็บงไธ€ๆ ท, ่ขซ่ฐƒ็”จ็š„้กบๅบๅ’Œ้’ฉๅญๆณจๅ†Œ็š„้กบๅบไธ€่‡ด. +ไธๅปบ่ฎฎ็”จๆˆทไฟฎๆ”น้ป˜่ฎค้’ฉๅญ็š„ไผ˜ๅ…ˆ็บง, ๅฏไปฅๅ‚่€ƒ [mmengine hooks ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/hook.md) ไบ†่งฃ้’ฉๅญไผ˜ๅ…ˆ็บง็š„ๅฎšไน‰. +ไธ‹้ขๆ˜ฏ MMSegmentation ไธญๆ‰€็”จๅˆฐ็š„้ป˜่ฎค้’ฉๅญ๏ผš + +| ้’ฉๅญ | ๅŠŸ่ƒฝ | ไผ˜ๅ…ˆ็บง | +| :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | :---------------: | +| [IterTimerHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/iter_timer_hook.py) | ่ฎฐๅฝ• iteration ่Šฑ่ดน็š„ๆ—ถ้—ด. | NORMAL (50) | +| [LoggerHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/logger_hook.py) | ไปŽ `Runner` ้‡ŒไธๅŒ็š„็ป„ไปถไธญๆ”ถ้›†ๆ—ฅๅฟ—่ฎฐๅฝ•, ๅนถๅฐ†ๅ…ถ่พ“ๅ‡บๅˆฐ็ปˆ็ซฏ, JSON ๆ–‡ไปถ, tensorboard, wandb ็ญ‰ไธ‹ๆธธ. | BELOW_NORMAL (60) | +| [ParamSchedulerHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/param_scheduler_hook.py) | ๆ›ดๆ–ฐไผ˜ๅŒ–ๅ™จ้‡Œ้ข็š„ไธ€ไบ›่ถ…ๅ‚ๆ•ฐ, ไพ‹ๅฆ‚ๅญฆไน ็Ž‡็š„ๅŠจ้‡. | LOW (70) | +| [CheckpointHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/checkpoint_hook.py) | ่ง„ๅพ‹ๆ€งๅœฐไฟๅญ˜ checkpoint ๆ–‡ไปถ. | VERY_LOW (90) | +| [DistSamplerSeedHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/sampler_seed_hook.py) | ็กฎไฟๅˆ†ๅธƒๅผ้‡‡ๆ ทๅ™จ shuffle ๆ˜ฏๆ‰“ๅผ€็š„. | NORMAL (50) | +| [SegVisualizationHook](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/visualization/local_visualizer.py) | ๅฏ่ง†ๅŒ–้ชŒ่ฏๅ’Œๆต‹่ฏ•่ฟ‡็จ‹้‡Œ็š„้ข„ๆต‹็ป“ๆžœ. | NORMAL (50) | + +MMSegmentation ไผšๅœจ [`defualt_hooks`](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/schedules/schedule_160k.py#L19-L25) ้‡Œ้ขๆณจๅ†Œไธ€ไบ›่ฎญ็ปƒๆ‰€ๅฟ…้œ€ๅŠŸ่ƒฝ็š„้’ฉๅญ:: + +```python +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=32000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) +``` + +ไปฅไธŠ้ป˜่ฎค้’ฉๅญ้™ค `SegVisualizationHook` ๅค–้ƒฝๆ˜ฏๅœจ MMEngine ไธญๆ‰€ๅฎž็Žฐ, `SegVisualizationHook` ๆ˜ฏๅœจ MMSegmentation ้‡Œ่ขซๅฎž็Žฐ็š„้’ฉๅญ, ไน‹ๅŽไผšไธ“้—จไป‹็ป. + +- ไฟฎๆ”น้ป˜่ฎค็š„้’ฉๅญ + +ไปฅ `default_hooks` ้‡Œ้ข็š„ `logger` ๅ’Œ `checkpoint` ไธบไพ‹, ๆˆ‘ไปฌๆฅไป‹็ปๅฆ‚ไฝ•ไฟฎๆ”น `default_hooks` ไธญ้ป˜่ฎค็š„้’ฉๅญ. + +(1) ๆจกๅž‹ไฟๅญ˜้…็ฝฎ + +`default_hooks` ไฝฟ็”จ `checkpoint` ๅญ—ๆฎตๆฅๅˆๅง‹ๅŒ–[ๆจกๅž‹ไฟๅญ˜้’ฉๅญ (CheckpointHook)](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/checkpoint_hook.py#L19). + +```python +checkpoint = dict(type='CheckpointHook', interval=1) +``` + +็”จๆˆทๅฏไปฅ่ฎพ็ฝฎ `max_keep_ckpts` ๆฅๅชไฟๅญ˜ๅฐ‘้‡็š„ๆฃ€ๆŸฅ็‚นๆˆ–่€…็”จ `save_optimizer` ๆฅๅ†ณๅฎšๆ˜ฏๅฆไฟๅญ˜ optimizer ็š„ไฟกๆฏ. +ๆ›ดๅคš็›ธๅ…ณๅ‚ๆ•ฐ็š„็ป†่Š‚ๅฏไปฅๅ‚่€ƒ[่ฟ™้‡Œ](https://mmengine.readthedocs.io/zh_CN/latest/api/generated/mmengine.hooks.CheckpointHook.html#checkpointhook). + +(2) ๆ—ฅๅฟ—้…็ฝฎ + +`ๆ—ฅๅฟ—้’ฉๅญ (LoggerHook)` ่ขซ็”จๆฅๆ”ถ้›† `ๆ‰ง่กŒๅ™จ (Runner)` ้‡Œ้ขไธๅŒ็ป„ไปถ็š„ๆ—ฅๅฟ—ไฟกๆฏ็„ถๅŽๅ†™ๅ…ฅ็ปˆ็ซฏ, JSON ๆ–‡ไปถ, tensorboard ๅ’Œ wandb ็ญ‰ๅœฐๆ–น. + +```python +logger=dict(type='LoggerHook', interval=10) +``` + +ๅœจๆœ€ๆ–ฐ็š„ 1.x ็‰ˆๆœฌ็š„ MMSegmentation ้‡Œ้ข, ไธ€ไบ›ๆ—ฅๅฟ—้’ฉๅญ (LoggerHook) ไพ‹ๅฆ‚ `TextLoggerHook`, `WandbLoggerHook` ๅ’Œ `TensorboardLoggerHook` ๅฐ†ไธๅ†่ขซไฝฟ็”จ. +ไฝœไธบๆ›ฟไปฃ, MMEngine ไฝฟ็”จ `LogProcessor` ๆฅๅค„็†ไธŠ่ฟฐ้’ฉๅญๅค„็†็š„ไฟกๆฏ, ๅฎƒไปฌ็Žฐๅœจๅœจ [`MessageHub`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/logging/message_hub.py#L17), +[`WandbVisBackend`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/visualization/vis_backend.py#L324) ๅ’Œ [`TensorboardVisBackend`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/visualization/vis_backend.py#L472) ้‡Œ้ข. + +ๅ…ทไฝ“ไฝฟ็”จๆ–นๆณ•ๅฆ‚ไธ‹, ้…็ฝฎๅฏ่ง†ๅŒ–ๅ™จๅ’ŒๅŒๆ—ถๆŒ‡ๅฎšๅฏ่ง†ๅŒ–ๅŽ็ซฏ, ่ฟ™้‡Œไฝฟ็”จ Tensorboard ไฝœไธบๅฏ่ง†ๅŒ–ๅ™จ็š„ๅŽ็ซฏ: + +```python +# TensorboardVisBackend +visualizer = dict( + type='SegLocalVisualizer', vis_backends=[dict(type='TensorboardVisBackend')], name='visualizer') +``` + +ๅ…ณไบŽๆ›ดๅคš็›ธๅ…ณ็”จๆณ•, ๅฏไปฅๅ‚่€ƒ [MMEngine ๅฏ่ง†ๅŒ–ๅŽ็ซฏ็”จๆˆทๆ•™็จ‹](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/advanced_tutorials/visualization.md). + +- ่‡ชๅฎšไน‰้’ฉๅญ (custom hooks) + +่‡ชๅฎšไน‰้’ฉๅญๅœจ้…็ฝฎ้€š่ฟ‡ `custom_hooks` ๅฎšไน‰, `Runner` ้€š่ฟ‡ [`register_custom_hooks`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py#L1820) ๆ–นๆณ•ๆณจๅ†Œ. +่‡ชๅฎšไน‰้’ฉๅญไผ˜ๅ…ˆ็บง้œ€่ฆๅœจ้…็ฝฎๆ–‡ไปถ้‡Œ่ฎพ็ฝฎ, ๅฆ‚ๆžœๆฒกๆœ‰่ฎพ็ฝฎ, ๅˆ™ไผš่ขซ้ป˜่ฎค่ฎพ็ฝฎไธบ `NORMAL`. ไธ‹้ขๆ˜ฏ้ƒจๅˆ† MMEngine ไธญๅฎž็Žฐ็š„่‡ชๅฎšไน‰้’ฉๅญ: + +| ้’ฉๅญ | ็”จๆณ• | +| :----------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------: | +| [EMAHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/ema_hook.py) | ๅœจๆจกๅž‹่ฎญ็ปƒๆ—ถไฝฟ็”จๆŒ‡ๆ•ฐๆป‘ๅŠจๅนณๅ‡ (Exponential Moving Average, EMA). | +| [EmptyCacheHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/empty_cache_hook.py) | ๅœจ่ฎญ็ปƒๆ—ถ้‡Šๆ”พๆ‰€ๆœ‰ๆฒกๆœ‰่ขซ็ผ“ๅญ˜ๅ ็”จ็š„ GPU ๆ˜พๅญ˜. | +| [SyncBuffersHook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/sync_buffer_hook.py) | ๅœจๆฏไธช่ฎญ็ปƒ Epoch ็ป“ๆŸๆ—ถๅŒๆญฅๆจกๅž‹ buffer ้‡Œ็š„ๅ‚ๆ•ฐไพ‹ๅฆ‚ BN ้‡Œ็š„ `running_mean` ๅ’Œ `running_var`. | + +ไปฅไธ‹ๆ˜ฏ `EMAHook` ็š„็”จไพ‹, ้…็ฝฎๆ–‡ไปถไธญ, ๅฐ†ๅทฒ็ปๅฎž็Žฐ็š„่‡ชๅฎšไน‰้’ฉๅญ็š„้…็ฝฎไฝœไธบ `custom_hooks` ๅˆ—่กจไธญ็š„ๆˆๅ‘˜. + +```python +custom_hooks = [ + dict(type='EMAHook', start_iters=500, priority='NORMAL') +] +``` + +### SegVisualizationHook + +MMSegmentation ๅฎž็Žฐไบ† [`SegVisualizationHook`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/engine/hooks/visualization_hook.py#L17), ็”จๆฅๅœจ้ชŒ่ฏๅ’Œๆต‹่ฏ•ๆ—ถๅฏ่ง†ๅŒ–้ข„ๆต‹็ป“ๆžœ. +`SegVisualizationHook` ้‡ๅ†™ไบ†ๅŸบ็ฑป `Hook` ไธญ็š„ `_after_iter` ๆ–นๆณ•, ๅœจ้ชŒ่ฏๆˆ–ๆต‹่ฏ•ๆ—ถ, ๆ นๆฎๆŒ‡ๅฎš็š„่ฟญไปฃๆฌกๆ•ฐ้—ด้š”่ฐƒ็”จ `visualizer` ็š„ `add_datasample` ๆ–นๆณ•็ป˜ๅˆถ่ฏญไน‰ๅˆ†ๅ‰ฒ็ป“ๆžœ, ๅ…ทไฝ“ๅฎž็Žฐๅฆ‚ไธ‹: + +```python +... +@HOOKS.register_module() +class SegVisualizationHook(Hook): +... + def _after_iter(self, + runner: Runner, + batch_idx: int, + data_batch: dict, + outputs: Sequence[SegDataSample], + mode: str = 'val') -> None: +... + # ๅฆ‚ๆžœๆ˜ฏ่ฎญ็ปƒ้˜ถๆฎตๆˆ–่€… self.draw ไธบ False ๅˆ™็›ดๆŽฅ่ทณๅ‡บ + if self.draw is False or mode == 'train': + return +... + if self.every_n_inner_iters(batch_idx, self.interval): + for output in outputs: + img_path = output.img_path + img_bytes = self.file_client.get(img_path) + img = mmcv.imfrombytes(img_bytes, channel_order='rgb') + window_name = f'{mode}_{osp.basename(img_path)}' + + self._visualizer.add_datasample( + window_name, + img, + data_sample=output, + show=self.show, + wait_time=self.wait_time, + step=runner.iter) + +``` + +ๅ…ณไบŽๅฏ่ง†ๅŒ–ๆ›ดๅคš็š„็ป†่Š‚ๅฏไปฅๆŸฅ็œ‹[่ฟ™้‡Œ](../user_guides/visualization.md). + +## ไผ˜ๅŒ–ๅ™จ + +ๅœจไธŠ้ข้…็ฝฎ่ฟ่กŒ่ฎพๅฎš้‡Œ, ๆˆ‘ไปฌ็ป™ๅ‡บไบ†้…็ฝฎ่ฎญ็ปƒไผ˜ๅŒ–ๅ™จ็š„็ฎ€ๅ•็คบไพ‹. ๆœฌ็ซ ่Š‚ๅฐ†่ฟ›ไธ€ๆญฅ่ฏฆ็ป†ไป‹็ปๅœจ MMSegmentation ้‡Œๅฆ‚ไฝ•้…็ฝฎไผ˜ๅŒ–ๅ™จ. + +### ไผ˜ๅŒ–ๅ™จๅฐ่ฃ… + +OpenMMLab 2.0 ่ฎพ่ฎกไบ†ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…, ๅฎƒๆ”ฏๆŒไธๅŒ็š„่ฎญ็ปƒ็ญ–็•ฅ, ๅŒ…ๆ‹ฌๆททๅˆ็ฒพๅบฆ่ฎญ็ปƒใ€ๆขฏๅบฆ็ดฏๅŠ ๅ’Œๆขฏๅบฆๆˆชๆ–ญ็ญ‰, ็”จๆˆทๅฏไปฅๆ นๆฎ้œ€ๆฑ‚้€‰ๆ‹ฉๅˆ้€‚็š„่ฎญ็ปƒ็ญ–็•ฅ. +ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…่ฟ˜ๅฎšไน‰ไบ†ไธ€ๅฅ—ๆ ‡ๅ‡†็š„ๅ‚ๆ•ฐๆ›ดๆ–ฐๆต็จ‹, ็”จๆˆทๅฏไปฅๅŸบไบŽ่ฟ™ไธ€ๅฅ—ๆต็จ‹, ๅœจๅŒไธ€ๅฅ—ไปฃ็ ้‡Œ, ๅฎž็ŽฐไธๅŒ่ฎญ็ปƒ็ญ–็•ฅ็š„ๅˆ‡ๆข. ๅฆ‚ๆžœๆƒณไบ†่งฃๆ›ดๅคš, ๅฏไปฅๅ‚่€ƒ [MMEngine ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/optim_wrapper.md). + +ไปฅไธ‹ๆ˜ฏ MMSegmentation ไธญๅธธ็”จ็š„ไฝฟ็”จๆ–นๆณ•: + +#### ้…็ฝฎ PyTorch ๆ”ฏๆŒ็š„ไผ˜ๅŒ–ๅ™จ + +OpenMMLab 2.0 ๆ”ฏๆŒ PyTorch ๅŽŸ็”Ÿๆ‰€ๆœ‰ไผ˜ๅŒ–ๅ™จ, ๅ‚่€ƒ[่ฟ™้‡Œ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/optim_wrapper.md#%E7%AE%80%E5%8D%95%E9%85%8D%E7%BD%AE). + +ๅœจ้…็ฝฎๆ–‡ไปถไธญ่ฎพ็ฝฎ่ฎญ็ปƒๆ—ถ `Runner` ๆ‰€ไฝฟ็”จ็š„ไผ˜ๅŒ–ๅ™จ, ้œ€่ฆๅฎšไน‰ `optim_wrapper`, ่€Œไธๆ˜ฏ `optimizer`, ไธ‹้ขๆ˜ฏไธ€ไธช้…็ฝฎ่ฎญ็ปƒไธญไผ˜ๅŒ–ๅ™จ็š„ไพ‹ๅญ: + +```python +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005), + clip_grad=None) +``` + +#### ้…็ฝฎๆขฏๅบฆ่ฃๅ‰ช + +ๅฝ“ๆจกๅž‹่ฎญ็ปƒ้œ€่ฆไฝฟ็”จๆขฏๅบฆ่ฃๅ‰ช็š„่ฎญ็ปƒๆŠ€ๅทงๅผ, ๅฏไปฅๆŒ‰็…งๅฆ‚ไธ‹็คบไพ‹่ฟ›่กŒ้…็ฝฎ: + +```python +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, + clip_grad=dict(max_norm=0.01, norm_type=2)) +``` + +่ฟ™้‡Œ `max_norm` ๆŒ‡็š„ๆ˜ฏ่ฃๅ‰ชๅŽๆขฏๅบฆ็š„ๆœ€ๅคงๅ€ผ, `norm_type` ๆŒ‡็š„ๆ˜ฏ่ฃๅ‰ชๆขฏๅบฆๆ—ถไฝฟ็”จ็š„่Œƒๆ•ฐ. ็›ธๅ…ณๆ–นๆณ•ๅฏๅ‚่€ƒ [torch.nn.utils.clip_grad_norm\_](https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html). + +#### ้…็ฝฎๆททๅˆ็ฒพๅบฆ่ฎญ็ปƒ + +ๅฝ“้œ€่ฆไฝฟ็”จๆททๅˆ็ฒพๅบฆ่ฎญ็ปƒ้™ไฝŽๅ†…ๅญ˜ๆ—ถ, ๅฏไปฅไฝฟ็”จ `AmpOptimWrapper`, ๅ…ทไฝ“้…็ฝฎๅฆ‚ไธ‹: + +```python +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='AmpOptimWrapper', optimizer=optimizer) +``` + +[`AmpOptimWrapper`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/amp_optimizer_wrapper.py#L20) ไธญ `loss_scale` ็š„้ป˜่ฎค่ฎพ็ฝฎๆ˜ฏ `dynamic`. + +#### ้…็ฝฎๆจกๅž‹็ฝ‘็ปœไธๅŒๅฑ‚็š„่ถ…ๅ‚ๆ•ฐ + +ๅœจๆจกๅž‹่ฎญ็ปƒไธญ, ๅฆ‚ๆžœๆƒณๅœจไผ˜ๅŒ–ๅ™จ้‡ŒไธบไธๅŒๅ‚ๆ•ฐๅˆ†ๅˆซ่ฎพ็ฝฎไผ˜ๅŒ–็ญ–็•ฅ, ไพ‹ๅฆ‚่ฎพ็ฝฎไธๅŒ็š„ๅญฆไน ็Ž‡ใ€ๆƒ้‡่กฐๅ‡็ญ‰่ถ…ๅ‚ๆ•ฐ, ๅฏไปฅ้€š่ฟ‡่ฎพ็ฝฎ้…็ฝฎๆ–‡ไปถ้‡Œ `optim_wrapper` ไธญ็š„ `paramwise_cfg` ๆฅๅฎž็Žฐ. + +ไธ‹้ข็š„้…็ฝฎๆ–‡ไปถไปฅ [ViT `optim_wrapper`](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py#L15-L27) ไธบไพ‹ไป‹็ป `paramwise_cfg` ๅ‚ๆ•ฐไฝฟ็”จ. +่ฎญ็ปƒๆ—ถๅฐ† `pos_embed`, `mask_token`, `norm` ๆจกๅ—็š„ weight decay ๅ‚ๆ•ฐ็š„็ณปๆ•ฐ่ฎพ็ฝฎๆˆ 0. +ๅณ: ๅœจ่ฎญ็ปƒๆ—ถ, ่ฟ™ไบ›ๆจกๅ—็š„ weight decay ๅฐ†่ขซๅ˜ไธบ `weight_decay * decay_mult`=0. + +```python +optimizer = dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01) +optim_wrapper = dict( + type='OptimWrapper', + optimizer=optimizer, + paramwise_cfg=dict( + custom_keys={ + 'pos_embed': dict(decay_mult=0.), + 'cls_token': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) +``` + +ๅ…ถไธญ `decay_mult` ๆŒ‡็š„ๆ˜ฏๅฏนๅบ”ๅ‚ๆ•ฐ็š„ๆƒ้‡่กฐๅ‡็š„็ณปๆ•ฐ. +ๅ…ณไบŽๆ›ดๅคš `paramwise_cfg` ็š„ไฝฟ็”จๅฏไปฅๅœจ [MMEngine ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/optim_wrapper.md) ้‡Œ้ขๆŸฅๅˆฐ. + +### ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จ + +้ป˜่ฎค็š„ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จ [`DefaultOptimWrapperConstructor`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19) ๆ นๆฎ่พ“ๅ…ฅ็š„ `optim_wrapper` ๅ’Œ `optim_wrapper` ไธญๅฎšไน‰็š„ `paramwise_cfg` ๆฅๆž„ๅปบ่ฎญ็ปƒไธญไฝฟ็”จ็š„ไผ˜ๅŒ–ๅ™จ. ๅฝ“ [`DefaultOptimWrapperConstructor`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19) ๅŠŸ่ƒฝไธ่ƒฝๆปก่ถณ้œ€ๆฑ‚ๆ—ถ, ๅฏไปฅ่‡ชๅฎšไน‰ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…ๆž„้€ ๅ™จๆฅๅฎž็Žฐ่ถ…ๅ‚ๆ•ฐ็š„้…็ฝฎ. + +MMSegmentation ไธญ็š„ๅฎž็Žฐไบ† [`LearningRateDecayOptimizerConstructor`](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/engine/optimizers/layer_decay_optimizer_constructor.py#L104), ๅฏไปฅๅฏนไปฅ ConvNeXt, BEiT ๅ’Œ MAE ไธบ้ชจๅนฒ็ฝ‘็ปœ็š„ๆจกๅž‹่ฎญ็ปƒๆ—ถ, ้ชจๅนฒ็ฝ‘็ปœ็š„ๆจกๅž‹ๅ‚ๆ•ฐ็š„ๅญฆไน ็Ž‡ๆŒ‰็…งๅฎšไน‰็š„่กฐๅ‡ๆฏ”ไพ‹๏ผˆ`decay_rate`๏ผ‰้€ๅฑ‚้€’ๅ‡, ๅœจ้…็ฝฎๆ–‡ไปถไธญ็š„้…็ฝฎๅฆ‚ไธ‹: + +```python +optim_wrapper = dict( + _delete_=True, + type='AmpOptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0001, betas=(0.9, 0.999), weight_decay=0.05), + paramwise_cfg={ + 'decay_rate': 0.9, + 'decay_type': 'stage_wise', + 'num_layers': 12 + }, + constructor='LearningRateDecayOptimizerConstructor', + loss_scale='dynamic') +``` + +`_delete_=True` ็š„ไฝœ็”จๆ˜ฏ OpenMMLab Config ไธญ็š„ๅฟฝ็•ฅ็ปงๆ‰ฟ็š„้…็ฝฎ, ๅœจ่ฏฅไปฃ็ ็‰‡ๆฎตไธญๅฟฝ็•ฅ็ปงๆ‰ฟ็š„ `optim_wrapper` ้…็ฝฎ, ๆ›ดๅคš `_delete_` ๅญ—ๆฎต็š„ๅ†…ๅฎนๅฏไปฅๅ‚่€ƒ [MMEngine ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/advanced_tutorials/config.md#%E5%88%A0%E9%99%A4%E5%AD%97%E5%85%B8%E4%B8%AD%E7%9A%84-key). diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/evaluation.md b/mmsegmentation/docs/zh_cn/advanced_guides/evaluation.md new file mode 100644 index 0000000..dc93a46 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/evaluation.md @@ -0,0 +1,158 @@ +# ๆจกๅž‹่ฏ„ๆต‹ + +ๆจกๅž‹่ฏ„ๆต‹่ฟ‡็จ‹ไผšๅˆ†ๅˆซๅœจ [ValLoop](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L300) ๅ’Œ [TestLoop](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L373) ไธญ่ขซๆ‰ง่กŒ๏ผŒ็”จๆˆทๅฏไปฅๅœจ่ฎญ็ปƒๆœŸ้—ดๆˆ–ไฝฟ็”จ้…็ฝฎๆ–‡ไปถไธญ็ฎ€ๅ•่ฎพ็ฝฎ็š„ๆต‹่ฏ•่„šๆœฌ่ฟ›่กŒๆจกๅž‹ๆ€ง่ƒฝ่ฏ„ไผฐใ€‚`ValLoop` ๅ’Œ `TestLoop` ๅฑžไบŽ [Runner](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/runner.py#L59)๏ผŒๅฎƒไปฌไผšๅœจ็ฌฌไธ€ๆฌก่ขซ่ฐƒ็”จๆ—ถๆž„ๅปบใ€‚็”ฑไบŽ `dataloader` ไธŽ `evaluator` ๆ˜ฏๅฟ…้œ€็š„ๅ‚ๆ•ฐ๏ผŒๆ‰€ไปฅ่ฆๆˆๅŠŸๆž„ๅปบ `ValLoop`๏ผŒๅœจๆž„ๅปบ `Runner` ๆ—ถๅฟ…้กป่ฎพ็ฝฎ `val_dataloader` ๅ’Œ `val_evaluator`๏ผŒ`TestLoop` ไบฆ็„ถใ€‚ๆœ‰ๅ…ณ Runner ่ฎพ่ฎก็š„ๆ›ดๅคšไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… [MMEngine](https://github.com/open-mmlab/mmengine) ็š„[ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/design/runner.md)ใ€‚ + +
+ +
ๆต‹่ฏ•/้ชŒ่ฏ ๆ•ฐๆฎๆต
+
+ +ๅœจ MMSegmentation ไธญ๏ผŒ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒๆˆ‘ไปฌๅฐ† dataloader ๅ’Œ metrics ็š„่ฎพ็ฝฎๅ†™ๅœจๆ•ฐๆฎ้›†้…็ฝฎๆ–‡ไปถไธญ๏ผŒๅนถๅฐ† evaluation loop ็š„้…็ฝฎๅ†™ๅœจ `schedule_x` ้…็ฝฎๆ–‡ไปถไธญใ€‚ + +ไพ‹ๅฆ‚๏ผŒๅœจ ADE20K ้…็ฝฎๆ–‡ไปถ `configs/_base_/dataset/ADE20K.py` ไธญ๏ผŒๅœจ็ฌฌ37ๅˆฐ48่กŒ๏ผŒๆˆ‘ไปฌ้…็ฝฎไบ† `val_dataloader`๏ผŒๅœจ็ฌฌ51่กŒ๏ผŒๆˆ‘ไปฌ้€‰ๆ‹ฉ `IoUMetric` ไฝœไธบ evaluator๏ผŒๅนถ่ฎพ็ฝฎ `mIoU` ไฝœไธบๆŒ‡ๆ ‡๏ผš + +```python +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +``` + +ไธบไบ†่ƒฝๅคŸๅœจ่ฎญ็ปƒๆœŸ้—ด่ฟ›่กŒ่ฏ„ไผฐๆจกๅž‹๏ผŒๆˆ‘ไปฌๅฐ†่ฏ„ไผฐ้…็ฝฎๆทปๅŠ ๅˆฐไบ† `configs/schedules/schedule_40k.py` ๆ–‡ไปถ็š„็ฌฌ15่‡ณ16่กŒ๏ผš + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000) +val_cfg = dict(type='ValLoop') +``` + +ไฝฟ็”จไปฅไธŠไธค็ง่ฎพ็ฝฎ๏ผŒMMSegmentation ๅœจ 40K ่ฟญไปฃ่ฎญ็ปƒๆœŸ้—ด๏ผŒๆฏ 4000 ๆฌก่ฟญไปฃ่ฟ›่กŒไธ€ๆฌกๆจกๅž‹ **mIoU** ๆŒ‡ๆ ‡็š„่ฏ„ไผฐใ€‚ + +ๅฆ‚ๆžœๆˆ‘ไปฌๅธŒๆœ›ๅœจ่ฎญ็ปƒๅŽๆต‹่ฏ•ๆจกๅž‹๏ผŒๅˆ™้œ€่ฆๅฐ† `test_dataloader`ใ€`test_evaluator` ๅ’Œ `test_cfg` ้…็ฝฎๆทปๅŠ ๅˆฐ้…็ฝฎๆ–‡ไปถไธญใ€‚ + +```python +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) + +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_cfg = dict(type='TestLoop') +``` + +ๅœจ MMSegmentation ไธญ๏ผŒ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒ`test_dataloader` ๅ’Œ `test_evaluator` ็š„่ฎพ็ฝฎไธŽ `ValLoop` ็š„ dataloader ๅ’Œ evaluator ็›ธๅŒ๏ผŒๆˆ‘ไปฌๅฏไปฅไฟฎๆ”น่ฟ™ไบ›่ฎพ็ฝฎไปฅๆปก่ถณๆˆ‘ไปฌ็š„้œ€่ฆใ€‚ + +## IoUMetric + +MMSegmentation ๅŸบไบŽ [MMEngine](https://github.com/open-mmlab/mmengine) ๆไพ›็š„ [BaseMetric](https://github.com/open-mmlab/mmengine/blob/main/mmengine/evaluator/metric.py) ๅฎž็Žฐ [IoUMetric](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/evaluation/metrics/iou_metric.py) ๅ’Œ [CityscapesMetric](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/evaluation/metrics/citys_metric.py)๏ผŒไปฅ่ฏ„ไผฐๆจกๅž‹็š„ๆ€ง่ƒฝใ€‚ๆœ‰ๅ…ณ็ปŸไธ€่ฏ„ไผฐๆŽฅๅฃ็š„ๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…[ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/evaluation.html)ใ€‚ + +่ฟ™้‡Œๆˆ‘ไปฌ็ฎ€่ฆไป‹็ป `IoUMetric` ็š„ๅ‚ๆ•ฐๅ’Œไธค็งไธป่ฆๆ–นๆณ•ใ€‚ + +้™คไบ† `collect_device` ๅ’Œ `prefix` ไน‹ๅค–๏ผŒ`IoUMetric` ็š„ๆž„ๅปบ่ฟ˜ๅŒ…ๅซไธ€ไบ›ๅ…ถไป–ๅ‚ๆ•ฐใ€‚ + +ๆž„้€ ๅ‡ฝๆ•ฐ็š„ๅ‚ๆ•ฐ๏ผš + +- ignore_index๏ผˆint๏ผ‰- ๅฐ†ๅœจ่ฏ„ไผฐไธญๅฟฝ็•ฅ็š„็ฑปๅˆซ็ดขๅผ•ใ€‚้ป˜่ฎคๅ€ผ๏ผš255ใ€‚ +- iou_metrics๏ผˆlist\[str\] | str๏ผ‰- ้œ€่ฆ่ฎก็ฎ—็š„ๆŒ‡ๆ ‡๏ผŒๅฏ้€‰้กนๅŒ…ๆ‹ฌ 'mIoU'ใ€'mDice' ๅ’Œ 'mFscore'ใ€‚ +- nan_to_num๏ผˆint๏ผŒๅฏ้€‰๏ผ‰- ๅฆ‚ๆžœๆŒ‡ๅฎš๏ผŒNaN ๅ€ผๅฐ†่ขซ็”จๆˆทๅฎšไน‰็š„ๆ•ฐๅญ—ๆ›ฟๆขใ€‚้ป˜่ฎคๅ€ผ๏ผšNoneใ€‚ +- beta๏ผˆint๏ผ‰- ๅ†ณๅฎš็ปผๅˆ่ฏ„ๅˆ†ไธญ recall ็š„ๆƒ้‡ใ€‚้ป˜่ฎคๅ€ผ๏ผš1ใ€‚ +- collect_device๏ผˆstr๏ผ‰- ็”จไบŽๅœจๅˆ†ๅธƒๅผ่ฎญ็ปƒๆœŸ้—ดไปŽไธๅŒ่ฟ›็จ‹ๆ”ถ้›†็ป“ๆžœ็š„่ฎพๅค‡ๅ็งฐใ€‚ๅฟ…้กปๆ˜ฏ 'cpu' ๆˆ– 'gpu'ใ€‚้ป˜่ฎคไธบ 'cpu'ใ€‚ +- prefix๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ๅฐ†ๆทปๅŠ ๅˆฐๆŒ‡ๆ ‡ๅ็งฐไธญ็š„ๅ‰็ผ€๏ผŒไปฅๆถˆ้™คไธๅŒ evaluator ็š„ๅŒๅๆŒ‡ๆ ‡็š„ๆญงไน‰ใ€‚ๅฆ‚ๆžœๅ‚ๆ•ฐไธญๆœชๆไพ›ๅ‰็ผ€๏ผŒๅˆ™ๅฐ†ไฝฟ็”จ self.default_prefix ่ฟ›่กŒๆ›ฟไปฃใ€‚้ป˜่ฎคไธบ Noneใ€‚ + +`IoUMetric` ๅฎž็Žฐ IoU ๆŒ‡ๆ ‡็š„่ฎก็ฎ—๏ผŒ`IoUMetric` ็š„ไธคไธชๆ ธๅฟƒๆ–นๆณ•ๆ˜ฏ `process` ๅ’Œ `compute_metrics`ใ€‚ + +- `process` ๆ–นๆณ•ๅค„็†ไธ€ๆ‰น data ๅ’Œ data_samplesใ€‚ +- `compute_metrics` ๆ–นๆณ•ๆ นๆฎๅค„็†็š„็ป“ๆžœ่ฎก็ฎ—ๆŒ‡ๆ ‡ใ€‚ + +### IoUMetric.process + +ๅ‚ๆ•ฐ๏ผš + +- data_batch๏ผˆAny๏ผ‰- ๆฅ่‡ช dataloader ็š„ไธ€ๆ‰นๆ•ฐๆฎใ€‚ +- data_samples๏ผˆSequence\[dict\]๏ผ‰- ๆจกๅž‹็š„ไธ€ๆ‰น่พ“ๅ‡บใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +ๆญคๆ–นๆณ•ๆฒกๆœ‰่ฟ”ๅ›žๅ€ผ๏ผŒๅ› ไธบๅค„็†็š„็ป“ๆžœๅฐ†ๅญ˜ๅ‚จๅœจ `self.results` ไธญ๏ผŒไปฅๅœจๅค„็†ๅฎŒๆ‰€ๆœ‰ๆ‰นๆฌกๅŽ่ฟ›่กŒๆŒ‡ๆ ‡็š„่ฎก็ฎ—ใ€‚ + +### IoUMetric.compute_metrics + +ๅ‚ๆ•ฐ๏ผš + +- results๏ผˆlist๏ผ‰- ๆฏไธชๆ‰นๆฌก็š„ๅค„็†็ป“ๆžœใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- Dict\[str๏ผŒfloat\] - ่ฎก็ฎ—็š„ๆŒ‡ๆ ‡ใ€‚ๆŒ‡ๆ ‡็š„ๅ็งฐไธบ key๏ผŒๅ€ผๆ˜ฏ็›ธๅบ”็š„็ป“ๆžœใ€‚key ไธป่ฆๅŒ…ๆ‹ฌ **aAcc**ใ€**mIoU**ใ€**mAcc**ใ€**mDice**ใ€**mFscore**ใ€**mPrecision**ใ€**mPrecall**ใ€‚ + +## CityscapesMetric + +`CityscapesMetric` ไฝฟ็”จ็”ฑ Cityscapes ๅฎ˜ๆ–นๆไพ›็š„ [CityscapesScripts](https://github.com/mcordts/cityscapesScripts) ่ฟ›่กŒๆจกๅž‹ๆ€ง่ƒฝ็š„่ฏ„ไผฐใ€‚ + +### ไฝฟ็”จๆ–นๆณ• + +ๅœจไฝฟ็”จไน‹ๅ‰๏ผŒ่ฏทๅ…ˆๅฎ‰่ฃ… `cityscapesscripts` ๅŒ…๏ผš + +```shell +pip install cityscapesscripts +``` + +็”ฑไบŽ `IoUMetric` ๅœจ MMSegmentation ไธญไฝœไธบ้ป˜่ฎค็š„ evaluator ไฝฟ็”จ๏ผŒๅฆ‚ๆžœๆ‚จๆƒณไฝฟ็”จ `CityscapesMetric`๏ผŒๅˆ™้œ€่ฆ่‡ชๅฎšไน‰้…็ฝฎๆ–‡ไปถใ€‚ๅœจ่‡ชๅฎšไน‰้…็ฝฎๆ–‡ไปถไธญ๏ผŒๅบ”ๆŒ‰ๅฆ‚ไธ‹ๆ–นๅผๆ›ฟๆข้ป˜่ฎค evaluatorใ€‚ + +```python +val_evaluator = dict(type='CityscapesMetric', output_dir='tmp') +test_evaluator = val_evaluator +``` + +### ๆŽฅๅฃ + +ๆž„้€ ๅ‡ฝๆ•ฐ็š„ๅ‚ๆ•ฐ๏ผš + +- output_dir (str) - ้ข„ๆต‹็ป“ๆžœ่พ“ๅ‡บ็š„่ทฏๅพ„ +- ignore_index (int) - ๅฐ†ๅœจ่ฏ„ไผฐไธญๅฟฝ็•ฅ็š„็ฑปๅˆซ็ดขๅผ•ใ€‚้ป˜่ฎคๅ€ผ๏ผš255ใ€‚ +- format_only (bool) - ๅชไธบๆไบค่ฟ›่กŒ็ป“ๆžœๆ ผๅผๅŒ–่€Œไธ่ฟ›่กŒ่ฏ„ไผฐใ€‚ๅฝ“ๆ‚จๅธŒๆœ›ๅฐ†็ป“ๆžœๆ ผๅผๅŒ–ไธบ็‰นๅฎšๆ ผๅผๅนถๅฐ†ๅ…ถๆไบค็ป™ๆต‹่ฏ•ๆœๅŠกๅ™จๆ—ถๆœ‰็”จใ€‚้ป˜่ฎคไธบ Falseใ€‚ +- keep_results (bool) - ๆ˜ฏๅฆไฟ็•™็ป“ๆžœใ€‚ๅฝ“ `format_only` ไธบ True ๆ—ถ๏ผŒ`keep_results` ๅฟ…้กปไธบ Trueใ€‚้ป˜่ฎคไธบ Falseใ€‚ +- collect_device (str) - ็”จไบŽๅœจๅˆ†ๅธƒๅผ่ฎญ็ปƒๆœŸ้—ดไปŽไธๅŒ่ฟ›็จ‹ๆ”ถ้›†็ป“ๆžœ็š„่ฎพๅค‡ๅ็งฐใ€‚ๅฟ…้กปๆ˜ฏ 'cpu' ๆˆ– 'gpu'ใ€‚้ป˜่ฎคไธบ 'cpu'ใ€‚ +- prefix (str๏ผŒๅฏ้€‰) - ๅฐ†ๆทปๅŠ ๅˆฐๆŒ‡ๆ ‡ๅ็งฐไธญ็š„ๅ‰็ผ€๏ผŒไปฅๆถˆ้™คไธๅŒ evaluator ็š„ๅŒๅๆŒ‡ๆ ‡็š„ๆญงไน‰ใ€‚ๅฆ‚ๆžœๅ‚ๆ•ฐไธญๆœชๆไพ›ๅ‰็ผ€๏ผŒๅˆ™ๅฐ†ไฝฟ็”จ self.default_prefix ่ฟ›่กŒๆ›ฟไปฃใ€‚้ป˜่ฎคไธบ Noneใ€‚ + +#### CityscapesMetric.process + +่ฏฅๆ–นๆณ•ๅฐ†ๅœจๅ›พๅƒไธŠ็ป˜ๅˆถ mask๏ผŒๅนถๅฐ†็ป˜ๅˆถ็š„ๅ›พๅƒไฟๅญ˜ๅˆฐ `work_dir` ไธญใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- data_batch๏ผˆdict๏ผ‰- ๆฅ่‡ช dataloader ็š„ไธ€ๆ‰นๆ•ฐๆฎใ€‚ +- data_samples๏ผˆSequence\[dict\]๏ผ‰- ๆจกๅž‹็š„ไธ€ๆ‰น่พ“ๅ‡บใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +ๆญคๆ–นๆณ•ๆฒกๆœ‰่ฟ”ๅ›žๅ€ผ๏ผŒๅ› ไธบๅค„็†็š„็ป“ๆžœๅฐ†ๅญ˜ๅ‚จๅœจ `self.results` ไธญ๏ผŒไปฅๅœจๅค„็†ๅฎŒๆ‰€ๆœ‰ๆ‰นๆฌกๅŽ่ฟ›่กŒๆŒ‡ๆ ‡็š„่ฎก็ฎ—ใ€‚ + +#### CityscapesMetric.compute_metrics + +ๆญคๆ–นๆณ•ๅฐ†่ฐƒ็”จ `cityscapessscripts.evaluation.evalPixelLevelSemanticLabeling` ๅทฅๅ…ทๆฅ่ฎก็ฎ—ๆŒ‡ๆ ‡ใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- results๏ผˆlist๏ผ‰- ๆ•ฐๆฎ้›†็š„ๆต‹่ฏ•็ป“ๆžœใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- dict\[str:float\] - Cityscapes ่ฏ„ๆต‹็ป“ๆžœใ€‚ diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/index.rst b/mmsegmentation/docs/zh_cn/advanced_guides/index.rst new file mode 100644 index 0000000..2aec1ac --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/index.rst @@ -0,0 +1,26 @@ +ๅŸบๆœฌๆฆ‚ๅฟต +*************** + +.. toctree:: + :maxdepth: 1 + + data_flow.md + structures.md + models.md + datasets.md + transforms.md + evaluation.md + engine.md + training_tricks.md + +่‡ชๅฎšไน‰็ป„ไปถ +************************ + +.. toctree:: + :maxdepth: 1 + + add_models.md + add_datasets.md + add_transforms.md + add_metrics.md + customize_runtime.md diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/models.md b/mmsegmentation/docs/zh_cn/advanced_guides/models.md new file mode 100644 index 0000000..6eb2251 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/models.md @@ -0,0 +1,177 @@ +# ๆจกๅž‹ + +ๆˆ‘ไปฌ้€šๅธธๅฐ†ๆทฑๅบฆๅญฆไน ไปปๅŠกไธญ็š„็ฅž็ป็ฝ‘็ปœๅฎšไน‰ไธบๆจกๅž‹๏ผŒ่ฟ™ไธชๆจกๅž‹ๅณๆ˜ฏ็ฎ—ๆณ•็š„ๆ ธๅฟƒใ€‚[MMEngine](https://github.com/open-mmlab/mmengine) ๆŠฝ่ฑกๅ‡บไบ†ไธ€ไธช็ปŸไธ€ๆจกๅž‹ [BaseModel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/base_model/base_model.py#L16) ไปฅๆ ‡ๅ‡†ๅŒ–่ฎญ็ปƒใ€ๆต‹่ฏ•ๅ’Œๅ…ถไป–่ฟ‡็จ‹ใ€‚MMSegmentation ๅฎž็Žฐ็š„ๆ‰€ๆœ‰ๆจกๅž‹้ƒฝ็ปงๆ‰ฟ่‡ช `BaseModel`๏ผŒๅนถไธ”ๅœจ MMSegmention ไธญ๏ผŒๆˆ‘ไปฌๅฎž็Žฐไบ†ๅ‰ๅ‘ไผ ๆ’ญๅนถไธบ่ฏญไน‰ๅˆ†ๅ‰ฒ็ฎ—ๆณ•ๆทปๅŠ ไบ†ไธ€ไบ›ๅŠŸ่ƒฝใ€‚ + +## ๅธธ็”จ็ป„ไปถ + +### ๅˆ†ๅ‰ฒๅ™จ๏ผˆSegmentor๏ผ‰ + +ๅœจ MMSegmentation ไธญ๏ผŒๆˆ‘ไปฌๅฐ†็ฝ‘็ปœๆžถๆž„ๆŠฝ่ฑกไธบ**ๅˆ†ๅ‰ฒๅ™จ**๏ผŒๅฎƒๆ˜ฏไธ€ไธชๅŒ…ๅซ็ฝ‘็ปœๆ‰€ๆœ‰็ป„ไปถ็š„ๆจกๅž‹ใ€‚ๆˆ‘ไปฌๅทฒ็ปๅฎž็Žฐไบ†**็ผ–็ ๅ™จ่งฃ็ ๅ™จ๏ผˆEncoderDecoder๏ผ‰**ๅ’Œ**็บง่”็ผ–็ ๅ™จ่งฃ็ ๅ™จ๏ผˆCascadeEncoderDecoder๏ผ‰**๏ผŒๅฎƒไปฌ้€šๅธธ็”ฑ**ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ**ใ€**้ชจๅนฒ็ฝ‘็ปœ**ใ€**่งฃ็ ๅคด**ๅ’Œ**่พ…ๅŠฉๅคด**็ป„ๆˆใ€‚ + +### ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ๏ผˆData preprocessor๏ผ‰ + +**ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ**ๆ˜ฏๅฐ†ๆ•ฐๆฎๅคๅˆถๅˆฐ็›ฎๆ ‡่ฎพๅค‡ๅนถๅฐ†ๆ•ฐๆฎ้ข„ๅค„็†ไธบๆจกๅž‹่พ“ๅ…ฅๆ ผๅผ็š„้ƒจๅˆ†ใ€‚ + +### ไธปๅนฒ็ฝ‘็ปœ๏ผˆBackbone๏ผ‰ + +**ไธปๅนฒ็ฝ‘็ปœ**ๆ˜ฏๅฐ†ๅ›พๅƒ่ฝฌๆขไธบ็‰นๅพๅ›พ็š„้ƒจๅˆ†๏ผŒไพ‹ๅฆ‚ๆฒกๆœ‰ๆœ€ๅŽๅ…จ่ฟžๆŽฅๅฑ‚็š„ **ResNet-50**ใ€‚ + +### ้ขˆ้ƒจ๏ผˆNeck๏ผ‰ + +**้ขˆ้ƒจ**ๆ˜ฏ่ฟžๆŽฅไธปๅนฒ็ฝ‘็ปœๅ’Œๅคด็š„้ƒจๅˆ†ใ€‚ๅฎƒๅฏนไธปๅนฒ็ฝ‘็ปœ็”Ÿๆˆ็š„ๅŽŸๅง‹็‰นๅพๅ›พ่ฟ›่กŒไธ€ไบ›ๆ”น่ฟ›ๆˆ–้‡ๆ–ฐ้…็ฝฎใ€‚ไพ‹ๅฆ‚ **Feature Pyramid Network๏ผˆFPN๏ผ‰**ใ€‚ + +### ่งฃ็ ๅคด๏ผˆDecode head๏ผ‰ + +**่งฃ็ ๅคด**ๆ˜ฏๅฐ†็‰นๅพๅ›พ่ฝฌๆขไธบๅˆ†ๅ‰ฒๆŽฉ่†œ็š„้ƒจๅˆ†๏ผŒไพ‹ๅฆ‚ **PSPNet**ใ€‚ + +### ่พ…ๅŠฉๅคด๏ผˆAuxiliary head๏ผ‰ + +**่พ…ๅŠฉๅคด**ๆ˜ฏไธ€ไธชๅฏ้€‰็ป„ไปถ๏ผŒๅฎƒๅฐ†็‰นๅพๅ›พ่ฝฌๆขไธบไป…็”จไบŽ่ฎก็ฎ—่พ…ๅŠฉๆŸๅคฑ็š„ๅˆ†ๅ‰ฒๆŽฉ่†œใ€‚ + +## ๅŸบๆœฌๆŽฅๅฃ + +MMSegmentation ๅฐ่ฃ… `BaseModel` ๅนถๅฎž็Žฐไบ† [BaseSegmentor](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/segmentors/base.py#L15) ็ฑป๏ผŒไธป่ฆๆไพ› `forward`ใ€`train_step`ใ€`val_step` ๅ’Œ `test_step` ๆŽฅๅฃใ€‚ๆŽฅไธ‹ๆฅๅฐ†่ฏฆ็ป†ไป‹็ป่ฟ™ไบ›ๆŽฅๅฃใ€‚ + +### forward + +
+ +
็ผ–็ ๅ™จ่งฃ็ ๅ™จๆ•ฐๆฎๆต
+
+ +
+
+
็บง่”็ผ–็ ๅ™จ่งฃ็ ๅ™จๆ•ฐๆฎๆต
+
+ +`forward` ๆ–นๆณ•่ฟ”ๅ›ž่ฎญ็ปƒใ€้ชŒ่ฏใ€ๆต‹่ฏ•ๅ’Œ็ฎ€ๅ•ๆŽจ็†่ฟ‡็จ‹็š„ๆŸๅคฑๆˆ–้ข„ๆต‹ใ€‚ + +่ฏฅๆ–นๆณ•ๅบ”ๆŽฅๅ—ไธ‰็งๆจกๅผ๏ผšโ€œtensorโ€ใ€โ€œpredictโ€ ๅ’Œ โ€œlossโ€๏ผš + +- โ€œtensorโ€๏ผšๅ‰ๅ‘ๆŽจ็†ๆ•ดไธช็ฝ‘็ปœๅนถ่ฟ”ๅ›žๅผ ้‡ๆˆ–ๅผ ้‡ๆ•ฐ็ป„๏ผŒๆ— ้œ€ไปปไฝ•ๅŽๅค„็†๏ผŒไธŽๅธธ่ง็š„ `nn.Module` ็›ธๅŒใ€‚ +- โ€œpredictโ€๏ผšๅ‰ๅ‘ๆŽจ็†ๅนถ่ฟ”ๅ›ž้ข„ๆต‹ๅ€ผ๏ผŒ่ฟ™ไบ›้ข„ๆต‹ๅ€ผๅฐ†่ขซๅฎŒๅ…จๅค„็†ๅˆฐ `SegDataSample` ๅˆ—่กจไธญใ€‚ +- โ€œlossโ€๏ผšๅ‰ๅ‘ๆŽจ็†ๅนถๆ นๆฎ็ป™ๅฎš็š„่พ“ๅ…ฅๅ’Œๆ•ฐๆฎๆ ทๆœฌ่ฟ”ๅ›žๆŸๅคฑ็š„`ๅญ—ๅ…ธ`ใ€‚ + +**ๆณจ๏ผš**[SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) ๆ˜ฏ MMSegmentation ็š„ๆ•ฐๆฎ็ป“ๆž„ๆŽฅๅฃ๏ผŒ็”จไฝœไธๅŒ็ป„ไปถไน‹้—ด็š„ๆŽฅๅฃใ€‚`SegDataSample` ๅฎž็Žฐไบ†ๆŠฝ่ฑกๆ•ฐๆฎๅ…ƒ็ด  `mmengine.structures.BaseDataElement`๏ผŒ่ฏทๅ‚้˜… [MMMEngine](https://github.com/open-mmlab/mmengine) ไธญ็š„ [SegDataSample ๆ–‡ๆกฃ](https://mmsegmentation.readthedocs.io/zh_CN/1.x/advanced_guides/structures.html)ๅ’Œ[ๆ•ฐๆฎๅ…ƒ็ด ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/data_element.html)ไบ†่งฃๆ›ดๅคšไฟกๆฏใ€‚ + +ๆณจๆ„๏ผŒๆญคๆ–นๆณ•ไธๅค„็†ๅœจ `train_step` ๆ–นๆณ•ไธญๅฎŒๆˆ็š„ๅๅ‘ไผ ๆ’ญๆˆ–ไผ˜ๅŒ–ๅ™จๆ›ดๆ–ฐใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- inputs๏ผˆtorch.Tensor๏ผ‰- ้€šๅธธไธบๅฝข็Šถๆ˜ฏ๏ผˆN, C, ...) ็š„่พ“ๅ…ฅๅผ ้‡ใ€‚ +- data_sample๏ผˆlist\[[SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py)\]) - ๅˆ†ๅ‰ฒๆ•ฐๆฎๆ ทๆœฌใ€‚ๅฎƒ้€šๅธธๅŒ…ๆ‹ฌ `metainfo` ๅ’Œ `gt_sem_seg` ็ญ‰ไฟกๆฏใ€‚้ป˜่ฎคๅ€ผไธบ Noneใ€‚ +- mode (str) - ่ฟ”ๅ›žไป€ไนˆ็ฑปๅž‹็š„ๅ€ผใ€‚้ป˜่ฎคไธบ 'tensor'ใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- `dict` ๆˆ– `list`๏ผš + - ๅฆ‚ๆžœ `mode == "loss"`๏ผŒๅˆ™่ฟ”ๅ›ž็”จไบŽๅๅ‘่ฟ‡็จ‹ๅ’Œๆ—ฅๅฟ—่ฎฐๅฝ•็š„ๆŸๅคฑๅผ ้‡`ๅญ—ๅ…ธ`ใ€‚ + - ๅฆ‚ๆžœ `mode == "predict"`๏ผŒๅˆ™่ฟ”ๅ›ž `SegDataSample` ็š„`ๅˆ—่กจ`๏ผŒๆŽจ็†็ป“ๆžœๅฐ†่ขซ้€’ๅขžๅœฐๆทปๅŠ ๅˆฐไผ ้€’็ป™ forward ๆ–นๆณ•็š„ `data_sample` ๅ‚ๆ•ฐไธญ๏ผŒๆฏไธช `SegDataSeample` ๅŒ…ๅซไปฅไธ‹ๅ…ณ้”ฎ่ฏ๏ผš + - pred_sm_seg (`PixelData`)๏ผš่ฏญไน‰ๅˆ†ๅ‰ฒ็š„้ข„ๆต‹ใ€‚ + - seg_logits (`PixelData`)๏ผšๆ ‡ๅ‡†ๅŒ–ๅ‰่ฏญไน‰ๅˆ†ๅ‰ฒ็š„้ข„ๆต‹ๆŒ‡ๆ ‡ใ€‚ + - ๅฆ‚ๆžœ `mode == "tensor"`๏ผŒๅˆ™่ฟ”ๅ›ž`ๅผ ้‡`ๆˆ–`ๅผ ้‡ๆ•ฐ็ป„`็š„`ๅญ—ๅ…ธ`ไปฅไพ›่‡ชๅฎšไน‰ไฝฟ็”จใ€‚ + +### ้ข„ๆต‹ๆจกๅผ + +ๆˆ‘ไปฌๅœจ[้…็ฝฎๆ–‡ๆกฃ](../user_guides/1_config.md)ไธญ็ฎ€่ฆๆ่ฟฐไบ†ๆจกๅž‹้…็ฝฎ็š„ๅญ—ๆฎต๏ผŒ่ฟ™้‡Œๆˆ‘ไปฌ่ฏฆ็ป†ไป‹็ป `model.test_cfg` ๅญ—ๆฎตใ€‚`model.test_cfg` ็”จไบŽๆŽงๅˆถๅ‰ๅ‘่กŒไธบ๏ผŒ`"predict"` ๆจกๅผไธ‹็š„ `forward` ๆ–นๆณ•ๅฏไปฅๅœจไธค็งๆจกๅผไธ‹่ฟ่กŒ๏ผš + +- `whole_inference`๏ผšๅฆ‚ๆžœ `cfg.model.test_cfg.mode == 'whole'`๏ผŒๅˆ™ๆจกๅž‹ๅฐ†ไฝฟ็”จๅฎŒๆ•ดๅ›พๅƒ่ฟ›่กŒๆŽจ็†ใ€‚ + + `whole_inference` ๆจกๅผ็š„ไธ€ไธช็คบไพ‹้…็ฝฎ๏ผš + + ```python + model = dict( + type='EncoderDecoder' + ... + test_cfg=dict(mode='whole') + ) + ``` + +- `slide_inference`๏ผšๅฆ‚ๆžœ `cfg.model.test_cfg.mode == โ€˜slideโ€™`๏ผŒๅˆ™ๆจกๅž‹ๅฐ†้€š่ฟ‡ๆป‘ๅŠจ็ช—ๅฃ่ฟ›่กŒๆŽจ็†ใ€‚**ๆณจๆ„๏ผš** ๅฆ‚ๆžœ้€‰ๆ‹ฉ `slide` ๆจกๅผ๏ผŒ่ฟ˜ๅบ”ๆŒ‡ๅฎš `cfg.model.test_cfg.stride` ๅ’Œ `cfg.model.test_cfg.crop_size`ใ€‚ + + `slide_inference` ๆจกๅผ็š„ไธ€ไธช็คบไพ‹้…็ฝฎ๏ผš + + ```python + model = dict( + type='EncoderDecoder' + ... + test_cfg=dict(mode='slide', crop_size=256, stride=170) + ) + ``` + +### train_step + +`train_step` ๆ–นๆณ•่ฐƒ็”จ `loss` ๆจกๅผ็š„ๅ‰ๅ‘ๆŽฅๅฃไปฅ่Žทๅพ—ๆŸๅคฑ`ๅญ—ๅ…ธ`ใ€‚`BaseModel` ็ฑปๅฎž็Žฐ้ป˜่ฎค็š„ๆจกๅž‹่ฎญ็ปƒ่ฟ‡็จ‹๏ผŒๅŒ…ๆ‹ฌ้ข„ๅค„็†ใ€ๆจกๅž‹ๅ‰ๅ‘ไผ ๆ’ญใ€ๆŸๅคฑ่ฎก็ฎ—ใ€ไผ˜ๅŒ–ๅ’Œๅๅ‘ไผ ๆ’ญใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- data (dict or tuple or list) - ไปŽๆ•ฐๆฎ้›†้‡‡ๆ ท็š„ๆ•ฐๆฎใ€‚ๅœจ MMSegmentation ไธญ๏ผŒๆ•ฐๆฎๅญ—ๅ…ธๅŒ…ๅซ `inputs` ๅ’Œ `data_samples` ไธคไธชๅญ—ๆฎตใ€‚ +- optim_wrapper (OptimWrapper) - ็”จไบŽๆ›ดๆ–ฐๆจกๅž‹ๅ‚ๆ•ฐ็š„ OptimWrapper ๅฎžไพ‹ใ€‚ + +**ๆณจ๏ผš**[OptimWrapper](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/optimizer_wrapper.py#L17) ๆไพ›ไบ†ไธ€ไธช็”จไบŽๆ›ดๆ–ฐๅ‚ๆ•ฐ็š„้€š็”จๆŽฅๅฃ๏ผŒ่ฏทๅ‚้˜… [MMMEngine](https://github.com/open-mmlab/mmengine) ไธญ็š„ไผ˜ๅŒ–ๅ™จๅฐ่ฃ…[ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/optim_wrapper.html)ไบ†่งฃๆ›ดๅคšไฟกๆฏใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +-Dict\[str, `torch.Tensor`\]๏ผš็”จไบŽ่ฎฐๅฝ•ๆ—ฅๅฟ—็š„ๅผ ้‡็š„`ๅญ—ๅ…ธ`ใ€‚ + +
+ +
train_step ๆ•ฐๆฎๆต
+
+ +### val_step + +`val_step` ๆ–นๆณ•่ฐƒ็”จ `predict` ๆจกๅผ็š„ๅ‰ๅ‘ๆŽฅๅฃๅนถ่ฟ”ๅ›ž้ข„ๆต‹็ป“ๆžœ๏ผŒ้ข„ๆต‹็ป“ๆžœๅฐ†่ฟ›ไธ€ๆญฅ่ขซไผ ้€’็ป™่ฏ„ๆต‹ๅ™จ็š„่ฟ›็จ‹ๆŽฅๅฃๅ’Œ้’ฉๅญ็š„ `after_val_inter` ๆŽฅๅฃใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- data (`dict` or `tuple` or `list`) - ไปŽๆ•ฐๆฎ้›†ไธญ้‡‡ๆ ท็š„ๆ•ฐๆฎใ€‚ๅœจ MMSegmentation ไธญ๏ผŒๆ•ฐๆฎๅญ—ๅ…ธๅŒ…ๅซ `inputs` ๅ’Œ `data_samples` ไธคไธชๅญ—ๆฎตใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- `list` - ็ป™ๅฎšๆ•ฐๆฎ็š„้ข„ๆต‹็ป“ๆžœใ€‚ + +
+ +
test_step/val_step ๆ•ฐๆฎๆต
+
+ +### test_step + +`BaseModel` ไธญ `test_step` ไธŽ `val_step` ็š„ๅฎž็Žฐ็›ธๅŒใ€‚ + +## ๆ•ฐๆฎ้ข„ๅค„็†ๅ™จ๏ผˆData Preprocessor๏ผ‰ + +MMSegmentation ๅฎž็Žฐ็š„ [SegDataPreProcessor](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/data_preprocessor.py#L13) ็ปงๆ‰ฟ่‡ช็”ฑ [MMEngine](https://github.com/open-mmlab/mmengine) ๅฎž็Žฐ็š„ [BaseDataPreprocessor](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/base_model/data_preprocessor.py#L18)๏ผŒๆไพ›ๆ•ฐๆฎ้ข„ๅค„็†ๅ’Œๅฐ†ๆ•ฐๆฎๅคๅˆถๅˆฐ็›ฎๆ ‡่ฎพๅค‡็š„ๅŠŸ่ƒฝใ€‚ + +Runner ๅœจๆž„ๅปบ้˜ถๆฎตๅฐ†ๆจกๅž‹ไผ ้€ๅˆฐๆŒ‡ๅฎš็š„่ฎพๅค‡๏ผŒ่€Œ [SegDataPreProcessor](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/data_preprocessor.py#L13) ๅœจ `train_step`ใ€`val_step` ๅ’Œ `test_step` ไธญๅฐ†ๆ•ฐๆฎไผ ้€ๅˆฐๆŒ‡ๅฎš่ฎพๅค‡๏ผŒไน‹ๅŽๅค„็†ๅŽ็š„ๆ•ฐๆฎๅฐ†่ขซ่ฟ›ไธ€ๆญฅไผ ้€’็ป™ๆจกๅž‹ใ€‚ + +`SegDataPreProcessor` ๆž„้€ ๅ‡ฝๆ•ฐ็š„ๅ‚ๆ•ฐ๏ผš + +- mean (Sequence\[Number\], ๅฏ้€‰) - Rใ€Gใ€B ้€š้“็š„ๅƒ็ด ๅนณๅ‡ๅ€ผใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- std (Sequence\[Number\], ๅฏ้€‰) - Rใ€Gใ€B ้€š้“็š„ๅƒ็ด ๆ ‡ๅ‡†ๅทฎใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- size (tuple, ๅฏ้€‰) - ๅ›บๅฎš็š„ๅกซๅ……ๅคงๅฐใ€‚ +- size_divisor (int, ๅฏ้€‰) - ๅกซๅ……ๅคงๅฐ็š„้™คๆณ•ๅ› ๅญใ€‚ +- pad_val (float, ๅฏ้€‰) - ๅกซๅ……ๅ€ผใ€‚้ป˜่ฎคๅ€ผ๏ผš0ใ€‚ +- seg_pad_val (float, ๅฏ้€‰) - ๅˆ†ๅ‰ฒๅ›พ็š„ๅกซๅ……ๅ€ผใ€‚้ป˜่ฎคๅ€ผ๏ผš255ใ€‚ +- bgr_to_rgb (bool) - ๆ˜ฏๅฆๅฐ†ๅ›พๅƒไปŽ BGR ่ฝฌๆขไธบ RGBใ€‚้ป˜่ฎคไธบ Falseใ€‚ +- rgb_to_bgr (bool) - ๆ˜ฏๅฆๅฐ†ๅ›พๅƒไปŽ RGB ่ฝฌๆขไธบ BGRใ€‚้ป˜่ฎคไธบ Falseใ€‚ +- batch_augments (list\[dict\], ๅฏ้€‰) - ๆ‰น้‡ๅŒ–็š„ๆ•ฐๆฎๅขžๅผบใ€‚้ป˜่ฎคๅ€ผไธบ Noneใ€‚ + +ๆ•ฐๆฎๅฐ†ๆŒ‰ๅฆ‚ไธ‹ๆ–นๅผๅค„็†๏ผš + +- ๆ”ถ้›†ๆ•ฐๆฎๅนถๅฐ†ๅ…ถ็งปๅŠจๅˆฐ็›ฎๆ ‡่ฎพๅค‡ใ€‚ +- ็”จๅฎšไน‰็š„ `pad_val` ๅฐ†่พ“ๅ…ฅๅกซๅ……ๅˆฐ่พ“ๅ…ฅๅคงๅฐ๏ผŒๅนถ็”จๅฎšไน‰็š„ `seg_Pad_val` ๅกซๅ……ๅˆ†ๅ‰ฒๅ›พใ€‚ +- ๅฐ†่พ“ๅ…ฅๅ †ๆ ˆๅˆฐ batch_inputใ€‚ +- ๅฆ‚ๆžœ่พ“ๅ…ฅ็š„ๅฝข็Šถไธบ (3, H, W)๏ผŒๅˆ™ๅฐ†่พ“ๅ…ฅไปŽ BGR ่ฝฌๆขไธบ RGBใ€‚ +- ไฝฟ็”จๅฎšไน‰็š„ๆ ‡ๅ‡†ๅทฎๅ’Œๅนณๅ‡ๅ€ผๆ ‡ๅ‡†ๅŒ–ๅ›พๅƒใ€‚ +- ๅœจ่ฎญ็ปƒๆœŸ้—ด่ฟ›่กŒๅฆ‚ Mixup ๅ’Œ Cutmix ็š„ๆ‰น้‡ๅŒ–ๆ•ฐๆฎๅขžๅผบใ€‚ + +`forward` ๆ–นๆณ•็š„ๅ‚ๆ•ฐ๏ผš + +- data (dict) - ไปŽๆ•ฐๆฎๅŠ ่ฝฝๅ™จ้‡‡ๆ ท็š„ๆ•ฐๆฎใ€‚ +- training (bool) - ๆ˜ฏๅฆๅฏ็”จ่ฎญ็ปƒๆ—ถๆ•ฐๆฎๅขžๅผบใ€‚ + +`forward` ๆ–นๆณ•็š„่ฟ”ๅ›žๅ€ผ๏ผš + +- Dict๏ผšไธŽๆจกๅž‹่พ“ๅ…ฅๆ ผๅผ็›ธๅŒ็š„ๆ•ฐๆฎใ€‚ diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/structures.md b/mmsegmentation/docs/zh_cn/advanced_guides/structures.md new file mode 100644 index 0000000..958e011 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/structures.md @@ -0,0 +1,102 @@ +# ๆ•ฐๆฎ็ป“ๆž„ + +ไธบไบ†็ปŸไธ€ๆจกๅž‹ๅ’Œๅ„ๅŠŸ่ƒฝๆจกๅ—ไน‹้—ด็š„่พ“ๅ…ฅๅ’Œ่พ“ๅ‡บ็š„ๆŽฅๅฃ, ๅœจ OpenMMLab 2.0 MMEngine ไธญๅฎšไน‰ไบ†ไธ€ๅฅ—ๆŠฝ่ฑกๆ•ฐๆฎ็ป“ๆž„, ๅฎž็Žฐไบ†ๅŸบ็ก€็š„ๅขž/ๅˆ /ๆŸฅ/ๆ”นๅŠŸ่ƒฝ, ๆ”ฏๆŒไธๅŒ่ฎพๅค‡้—ด็š„ๆ•ฐๆฎ่ฟ็งป, ไนŸๆ”ฏๆŒไบ†ๅฆ‚ +`.cpu()`, `.cuda()`, `.get()` ๅ’Œ `.detach()` ็š„็ฑปๅญ—ๅ…ธๅ’Œๅผ ้‡็š„ๆ“ไฝœใ€‚ๅ…ทไฝ“ๅฏไปฅๅ‚่€ƒ [MMEngine ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/data_element.md)ใ€‚ + +ๅŒๆ ท็š„, MMSegmentation ไบฆ้ตๅพชไบ† OpenMMLab 2.0 ๅ„ๆจกๅ—้—ด็š„ๆŽฅๅฃๅ่ฎฎ, ๅฎšไน‰ไบ† `SegDataSample` ็”จๆฅๅฐ่ฃ…่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠกๆ‰€้œ€่ฆ็š„ๆ•ฐๆฎใ€‚ + +## ่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ SegDataSample + +[SegDataSample](mmseg.structures.SegDataSample) ๅŒ…ๆ‹ฌไบ†ไธ‰ไธชไธป่ฆๆ•ฐๆฎๅญ—ๆฎต `gt_sem_seg`, `pred_sem_seg` ๅ’Œ `seg_logits`, ๅˆ†ๅˆซ็”จๆฅๅญ˜ๆ”พๆ ‡ๆณจไฟกๆฏ, ้ข„ๆต‹็ป“ๆžœๅ’Œ้ข„ๆต‹็š„ๆœชๅฝ’ไธ€ๅŒ–ๅ‰็š„ logits ๅ€ผใ€‚ + +| ๅญ—ๆฎต | ็ฑปๅž‹ | ๆ่ฟฐ | +| -------------- | ------------------------- | ------------------------------- | +| gt_sem_seg | [`PixelData`](#pixeldata) | ๅ›พๅƒๆ ‡ๆณจไฟกๆฏ. | +| pred_instances | [`PixelData`](#pixeldata) | ๅ›พๅƒ้ข„ๆต‹็ป“ๆžœ. | +| seg_logits | [`PixelData`](#pixeldata) | ๆจกๅž‹้ข„ๆต‹ๆœชๅฝ’ไธ€ๅŒ–ๅ‰็š„ logits ๅ€ผ. | + +ไปฅไธ‹็คบไพ‹ไปฃ็ ๅฑ•็คบไบ† `SegDataSample` ็š„ไฝฟ็”จๆ–นๆณ•๏ผš + +```python +import torch +from mmengine.structures import PixelData +from mmseg.structures import SegDataSample + +img_meta = dict(img_shape=(4, 4, 3), + pad_shape=(4, 4, 3)) +data_sample = SegDataSample() +# ๅฎšไน‰ gt_segmentations ็”จไบŽๅฐ่ฃ…ๆจกๅž‹็š„่พ“ๅ‡บไฟกๆฏ +gt_segmentations = PixelData(metainfo=img_meta) +gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) + +# ๅขžๅŠ ๅ’Œๅค„็† SegDataSampleใ€€ไธญ็š„ๅฑžๆ€ง +data_sample.gt_sem_seg = gt_segmentations +assert 'gt_sem_seg' in data_sample +assert 'data' in data_sample.gt_sem_seg +assert 'img_shape' in data_sample.gt_sem_seg.metainfo_keys() +print(data_sample.gt_sem_seg.shape) +''' +(4, 4) +''' +print(data_sample) +''' + +) at 0x1c2aae44d60> +''' + +# ๅˆ ้™คๅ’Œไฟฎๆ”น SegDataSampleใ€€ไธญ็š„ๅฑžๆ€ง +data_sample = SegDataSample() +gt_segmentations = PixelData(metainfo=img_meta) +gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) +data_sample.gt_sem_seg = gt_segmentations +data_sample.gt_sem_seg.set_metainfo(dict(img_shape=(4,4,9), pad_shape=(4,4,9))) +del data_sample.gt_sem_seg.img_shape + +# ็ฑปๅผ ้‡็š„ๆ“ไฝœ +data_sample = SegDataSample() +gt_segmentations = PixelData(metainfo=img_meta) +gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) +cuda_gt_segmentations = gt_segmentations.cuda() +cuda_gt_segmentations = gt_segmentations.to('cuda:0') +cpu_gt_segmentations = cuda_gt_segmentations.cpu() +cpu_gt_segmentations = cuda_gt_segmentations.to('cpu') +``` + +## ๅœจ SegDataSample ไธญ่‡ชๅฎšไน‰ๆ–ฐ็š„ๅฑžๆ€ง + +ๅฆ‚ๆžœไฝ ๆƒณๅœจ `SegDataSample` ไธญ่‡ชๅฎšไน‰ๆ–ฐ็š„ๅฑžๆ€ง๏ผŒไฝ ๅฏไปฅๅ‚่€ƒไธ‹้ข็š„ [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) ็คบไพ‹: + +```python +class SegDataSample(BaseDataElement): + ... + + @property + def xxx_property(self) -> xxxData: + return self._xxx_property + + @xxx_property.setter + def xxx_property(self, value: xxxData) -> None: + self.set_field(value, '_xxx_property', dtype=xxxData) + + @xxx_property.deleter + def xxx_property(self) -> None: + del self._xxx_property +``` + +่ฟ™ๆ ทไธ€ไธชๆ–ฐ็š„ๅฑžๆ€ง `xxx_property` ๅฐฑๅฐ†่ขซๅขžๅŠ ๅˆฐ `SegDataSample` ้‡Œ้ขไบ†ใ€‚ diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/training_tricks.md b/mmsegmentation/docs/zh_cn/advanced_guides/training_tricks.md new file mode 100644 index 0000000..e5b8e4d --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/training_tricks.md @@ -0,0 +1,74 @@ +# ่ฎญ็ปƒๆŠ€ๅทง + +MMSegmentation ๆ”ฏๆŒๅฆ‚ไธ‹่ฎญ็ปƒๆŠ€ๅทง๏ผš + +## ไธปๅนฒ็ฝ‘็ปœๅ’Œ่งฃ็ ๅคด็ป„ไปถไฝฟ็”จไธๅŒ็š„ๅญฆไน ็Ž‡ (Learning Rate, LR) + +ๅœจ่ฏญไน‰ๅˆ†ๅ‰ฒ้‡Œ๏ผŒไธ€ไบ›ๆ–นๆณ•ไผš่ฎฉ่งฃ็ ๅคด็ป„ไปถ็š„ๅญฆไน ็Ž‡ๅคงไบŽไธปๅนฒ็ฝ‘็ปœ็š„ๅญฆไน ็Ž‡๏ผŒ่ฟ™ๆ ทๅฏไปฅ่Žทๅพ—ๆ›ดๅฅฝ็š„่กจ็Žฐๆˆ–ๆ›ดๅฟซ็š„ๆ”ถๆ•›ใ€‚ + +ๅœจ MMSegmentation ้‡Œ้ข๏ผŒๆ‚จไนŸๅฏไปฅๅœจ้…็ฝฎๆ–‡ไปถ้‡ŒๆทปๅŠ ๅฆ‚ไธ‹่กŒๆฅ่ฎฉ่งฃ็ ๅคด็ป„ไปถ็š„ๅญฆไน ็Ž‡ๆ˜ฏไธปๅนฒ็ป„ไปถ็š„10ๅ€ใ€‚ + +```python +optim_wrapper=dict( + paramwise_cfg = dict( + custom_keys={ + 'head': dict(lr_mult=10.)})) +``` + +้€š่ฟ‡่ฟ™็งไฟฎๆ”น๏ผŒไปปไฝ•่ขซๅˆ†็ป„ๅˆฐ `'head'` ็š„ๅ‚ๆ•ฐ็š„ๅญฆไน ็Ž‡้ƒฝๅฐ†ไน˜ไปฅ10ใ€‚ๆ‚จไนŸๅฏไปฅๅ‚็…ง [MMEngine ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/optim_wrapper.html#id6) ่Žทๅ–ๆ›ด่ฏฆ็ป†็š„ไฟกๆฏใ€‚ + +## ๅœจ็บฟ้šพๆ ทๆœฌๆŒ–ๆŽ˜ (Online Hard Example Mining, OHEM) + +MMSegmentation ไธญๅฎž็Žฐไบ†ๅƒ็ด ้‡‡ๆ ทๅ™จ๏ผŒ่ฎญ็ปƒๆ—ถๅฏไปฅๅฏน็‰นๅฎšๅƒ็ด ่ฟ›่กŒ้‡‡ๆ ท๏ผŒไพ‹ๅฆ‚ OHEM(Online Hard Example Mining)๏ผŒๅฏไปฅ่งฃๅ†ณๆ ทๆœฌไธๅนณ่กก้—ฎ้ข˜๏ผŒ +ๅฆ‚ไธ‹ไพ‹ๅญๆ˜ฏไฝฟ็”จ PSPNet ่ฎญ็ปƒๅนถ้‡‡็”จ OHEM ็ญ–็•ฅ็š„้…็ฝฎ๏ผš + +```python +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model=dict( + decode_head=dict( + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=100000)) ) +``` + +้€š่ฟ‡่ฟ™็งๆ–นๅผ๏ผŒๅชๆœ‰็ฝฎไฟกๅˆ†ๆ•ฐๅœจ0.7ไปฅไธ‹็š„ๅƒ็ด ๅ€ผ็‚นไผš่ขซๆ‹ฟๆฅ่ฎญ็ปƒใ€‚ๅœจ่ฎญ็ปƒๆ—ถๆˆ‘ไปฌ่‡ณๅฐ‘่ฆไฟ็•™100000ไธชๅƒ็ด ๅ€ผ็‚นใ€‚ๅฆ‚ๆžœ `thresh` ๅนถๆœช่ขซๆŒ‡ๅฎš๏ผŒๅ‰ `min_kept` +ไธชๆŸๅคฑ็š„ๅƒ็ด ๅ€ผ็‚นๆ‰ไผš่ขซ้€‰ๆ‹ฉใ€‚ + +## ็ฑปๅˆซๅนณ่กกๆŸๅคฑ (Class Balanced Loss) + +ๅฏนไบŽไธๅนณ่กก็ฑปๅˆซๅˆ†ๅธƒ็š„ๆ•ฐๆฎ้›†๏ผŒๆ‚จไนŸ่ฎธๅฏไปฅๆ”นๅ˜ๆฏไธช็ฑปๅˆซ็š„ๆŸๅคฑๆƒ้‡ใ€‚่ฟ™้‡Œไปฅ cityscapes ๆ•ฐๆฎ้›†ไธบไพ‹๏ผš + +```python +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model=dict( + decode_head=dict( + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0, + # DeepLab ๅฏน cityscapes ไฝฟ็”จ่ฟ™็งๆƒ้‡ + class_weight=[0.8373, 0.9180, 0.8660, 1.0345, 1.0166, 0.9969, 0.9754, + 1.0489, 0.8786, 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, + 1.0865, 1.0955, 1.0865, 1.1529, 1.0507]))) +``` + +`class_weight` ๅฐ†่ขซไฝœไธบ `weight` ๅ‚ๆ•ฐ๏ผŒไผ ้€’็ป™ `CrossEntropyLoss`ใ€‚่ฏฆ็ป†ไฟกๆฏ่ฏทๅ‚็…ง [PyTorch ๆ–‡ๆกฃ](https://pytorch.org/docs/stable/nn.html?highlight=crossentropy#torch.nn.CrossEntropyLoss) ใ€‚ + +## ๅŒๆ—ถไฝฟ็”จๅคš็งๆŸๅคฑๅ‡ฝๆ•ฐ (Multiple Losses) + +ๅฏนไบŽ่ฎญ็ปƒๆ—ถๆŸๅคฑๅ‡ฝๆ•ฐ็š„่ฎก็ฎ—๏ผŒๆˆ‘ไปฌ็›ฎๅ‰ๆ”ฏๆŒๅคšไธชๆŸๅคฑๅ‡ฝๆ•ฐๅŒๆ—ถไฝฟ็”จใ€‚ ไปฅ `unet` ไฝฟ็”จ `DRIVE` ๆ•ฐๆฎ้›†่ฎญ็ปƒไธบไพ‹๏ผŒ +ไฝฟ็”จ `CrossEntropyLoss` ๅ’Œ `DiceLoss` ็š„ `1:3` ็š„ๅŠ ๆƒๅ’ŒไฝœไธบๆŸๅคฑๅ‡ฝๆ•ฐใ€‚้…็ฝฎๆ–‡ไปถๅ†™ไธบ: + +```python +_base_ = './fcn_unet_s5-d16_64x64_40k_drive.py' +model = dict( + decode_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ]), + auxiliary_head=dict(loss_decode=[ + dict(type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), + dict(type='DiceLoss', loss_name='loss_dice', loss_weight=3.0) + ]), +) +``` + +้€š่ฟ‡่ฟ™็งๆ–นๅผ๏ผŒ็กฎๅฎš่ฎญ็ปƒ่ฟ‡็จ‹ไธญๆŸๅคฑๅ‡ฝๆ•ฐ็š„ๆƒ้‡ `loss_weight` ๅ’Œๅœจ่ฎญ็ปƒๆ—ฅๅฟ—้‡Œ็š„ๅๅญ— `loss_name`ใ€‚ + +ๆณจๆ„๏ผš `loss_name` ็š„ๅๅญ—ๅฟ…้กปๅธฆๆœ‰ `loss_` ๅ‰็ผ€๏ผŒ่ฟ™ๆ ทๅฎƒๆ‰่ƒฝ่ขซๅŒ…ๆ‹ฌๅœจ่ฎก็ฎ—ๅ›พ้‡Œใ€‚ diff --git a/mmsegmentation/docs/zh_cn/advanced_guides/transforms.md b/mmsegmentation/docs/zh_cn/advanced_guides/transforms.md new file mode 100644 index 0000000..e5f3beb --- /dev/null +++ b/mmsegmentation/docs/zh_cn/advanced_guides/transforms.md @@ -0,0 +1,119 @@ +# ๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ– + +ๅœจๆœฌๆ•™็จ‹ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ไป‹็ป MMSegmentation ไธญๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ–ๆต็จ‹็š„่ฎพ่ฎกใ€‚ + +ๆœฌๆŒ‡ๅ—็š„็ป“ๆž„ๅฆ‚ไธ‹๏ผš + +- [ๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ–](#ๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ–) + - [ๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ–ๆต็จ‹่ฎพ่ฎก](#ๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ–ๆต็จ‹่ฎพ่ฎก) + - [ๆ•ฐๆฎๅŠ ่ฝฝ](#ๆ•ฐๆฎๅŠ ่ฝฝ) + - [้ข„ๅค„็†](#้ข„ๅค„็†) + - [ๆ ผๅผไฟฎๆ”น](#ๆ ผๅผไฟฎๆ”น) + +## ๆ•ฐๆฎๅขžๅผบๅ˜ๅŒ–ๆต็จ‹่ฎพ่ฎก + +ๆŒ‰็…งๆƒฏไพ‹๏ผŒๆˆ‘ไปฌไฝฟ็”จ `Dataset` ๅ’Œ `DataLoader` ๅคš่ฟ›็จ‹ๅœฐๅŠ ่ฝฝๆ•ฐๆฎใ€‚`Dataset` ่ฟ”ๅ›žไธŽๆจกๅž‹ forward ๆ–นๆณ•็š„ๅ‚ๆ•ฐ็›ธๅฏนๅบ”็š„ๆ•ฐๆฎ้กน็š„ๅญ—ๅ…ธใ€‚็”ฑไบŽ่ฏญไน‰ๅˆ†ๅ‰ฒไธญ็š„ๆ•ฐๆฎๅฏ่ƒฝๅคงๅฐไธๅŒ๏ผŒๆˆ‘ไปฌๅœจ MMCV ไธญๅผ•ๅ…ฅไบ†ไธ€็งๆ–ฐ็š„ `DataContainer` ็ฑปๅž‹๏ผŒไปฅๅธฎๅŠฉๆ”ถ้›†ๅ’Œๅˆ†ๅ‘ไธๅŒๅคงๅฐ็š„ๆ•ฐๆฎใ€‚ๅ‚่ง[ๆญคๅค„](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py)ไบ†่งฃๆ›ดๅคš่ฏฆๆƒ…ใ€‚ + +ๅœจ MMSegmentation ็š„ 1.x ็‰ˆๆœฌไธญ๏ผŒๆ‰€ๆœ‰ๆ•ฐๆฎ่ฝฌๆข้ƒฝ็ปงๆ‰ฟ่‡ช [`BaseTransform`](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/transforms/base.py#L6). + +่ฝฌๆข็š„่พ“ๅ…ฅๅ’Œ่พ“ๅ‡บ็ฑปๅž‹้ƒฝๆ˜ฏๅญ—ๅ…ธใ€‚ไธ€ไธช็ฎ€ๅ•็š„็คบไพ‹ๅฆ‚ไธ‹๏ผš + +```python +>>> from mmseg.datasets.transforms import LoadAnnotations +>>> transforms = LoadAnnotations() +>>> img_path = './data/cityscapes/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png.png' +>>> gt_path = './data/cityscapes/gtFine/train/aachen/aachen_000015_000019_gtFine_instanceTrainIds.png' +>>> results = dict( +>>> img_path=img_path, +>>> seg_map_path=gt_path, +>>> reduce_zero_label=False, +>>> seg_fields=[]) +>>> data_dict = transforms(results) +>>> print(data_dict.keys()) +dict_keys(['img_path', 'seg_map_path', 'reduce_zero_label', 'seg_fields', 'gt_seg_map']) +``` + +ๆ•ฐๆฎๅ‡†ๅค‡ๆต็จ‹ๅ’Œๆ•ฐๆฎ้›†ๆ˜ฏ่งฃ่€ฆ็š„ใ€‚้€šๅธธ๏ผŒๆ•ฐๆฎ้›†ๅฎšไน‰ๅฆ‚ไฝ•ๅค„็†ๆ ‡ๆณจ๏ผŒๆ•ฐๆฎๆต็จ‹ๅฎšไน‰ๅ‡†ๅค‡ๆ•ฐๆฎๅญ—ๅ…ธ็š„ๆ‰€ๆœ‰ๆญฅ้ชคใ€‚ๆต็จ‹็”ฑไธ€็ณปๅˆ—ๆ“ไฝœ็ป„ๆˆใ€‚ๆฏไธชๆ“ไฝœ้ƒฝๅฐ†ๅญ—ๅ…ธไฝœไธบ่พ“ๅ…ฅ๏ผŒๅนถไธบๆŽฅไธ‹ๆฅ็š„่ฝฌๆข่พ“ๅ‡บๅญ—ๅ…ธใ€‚ + +ๆ“ไฝœๅˆ†ไธบๆ•ฐๆฎๅŠ ่ฝฝใ€้ข„ๅค„็†ใ€ๆ ผๅผไฟฎๆ”นๅ’Œๆต‹่ฏ•ๆ•ฐๆฎๅขžๅผบใ€‚ + +่ฟ™้‡Œๆ˜ฏ PSPNet ็š„ๆต็จ‹็คบไพ‹๏ผš + +```python +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +``` + +ๅฏนไบŽๆฏไธชๆ“ไฝœ๏ผŒๆˆ‘ไปฌๅˆ—ๅ‡บไบ† `ๆทปๅŠ `/`ๆ›ดๆ–ฐ`/`ๅˆ ้™ค` ็›ธๅ…ณ็š„ๅญ—ๅ…ธๅญ—ๆฎตใ€‚ๅœจๆต็จ‹ๅ‰๏ผŒๆˆ‘ไปฌๅฏไปฅไปŽๆ•ฐๆฎ้›†็›ดๆŽฅ่Žทๅพ—็š„ไฟกๆฏๆ˜ฏ `img_path` ๅ’Œ `seg_map_path`ใ€‚ + +### ๆ•ฐๆฎๅŠ ่ฝฝ + +`LoadImageFromFile`๏ผšไปŽๆ–‡ไปถๅŠ ่ฝฝๅ›พๅƒใ€‚ + +- ๆทปๅŠ ๏ผš`img`๏ผŒ`img_shape`๏ผŒ`ori_shape` + +`LoadAnnotations`๏ผšๅŠ ่ฝฝๆ•ฐๆฎ้›†ๆไพ›็š„่ฏญไน‰ๅˆ†ๅ‰ฒๅ›พใ€‚ + +- ๆทปๅŠ ๏ผš`seg_fields`๏ผŒ`gt_seg_map` + +### ้ข„ๅค„็† + +`RandomResize`๏ผš้šๆœบ่ฐƒๆ•ดๅ›พๅƒๅ’Œๅˆ†ๅ‰ฒๅ›พๅคงๅฐใ€‚ + +-ๆทปๅŠ ๏ผš`scale`๏ผŒ`scale_factor`๏ผŒ`keep_ratio` +-ๆ›ดๆ–ฐ๏ผš`img`๏ผŒ`img_shape`๏ผŒ`gt_seg_map` + +`Resize`๏ผš่ฐƒๆ•ดๅ›พๅƒๅ’Œๅˆ†ๅ‰ฒๅ›พ็š„ๅคงๅฐใ€‚ + +-ๆทปๅŠ ๏ผš`scale`๏ผŒ`scale_factor`๏ผŒ`keep_ratio` +-ๆ›ดๆ–ฐ๏ผš`img`๏ผŒ`gt_seg_map`๏ผŒ`img_shape` + +`RandomCrop`๏ผš้šๆœบ่ฃๅ‰ชๅ›พๅƒๅ’Œๅˆ†ๅ‰ฒๅ›พใ€‚ + +-ๆ›ดๆ–ฐ๏ผš`img`๏ผŒ`gt_seg_map`๏ผŒ`img_shape` + +`RandomFlip`๏ผš็ฟป่ฝฌๅ›พๅƒๅ’Œๅˆ†ๅ‰ฒๅ›พใ€‚ + +-ๆทปๅŠ ๏ผš`flip`๏ผŒ`flip_direction` +-ๆ›ดๆ–ฐ๏ผš`img`๏ผŒ`gt_seg_map` + +`PhotoMetricDistortion`๏ผšๆŒ‰้กบๅบๅฏนๅ›พๅƒๅบ”็”จๅ…‰ๅบฆๅคฑ็œŸ๏ผŒๆฏไธชๅ˜ๆข็š„ๅบ”็”จๆฆ‚็Ž‡ไธบ 0.5ใ€‚้šๆœบๅฏนๆฏ”ๅบฆ็š„ไฝ็ฝฎๆ˜ฏ็ฌฌไบŒๆˆ–ๅ€’ๆ•ฐ็ฌฌไบŒ๏ผˆๅˆ†ๅˆซไธบไธ‹้ข็š„ๆจกๅผ 0 ๆˆ– 1๏ผ‰ใ€‚ + +``` +1.้šๆœบไบฎๅบฆ +2.้šๆœบๅฏนๆฏ”ๅบฆ๏ผˆๆจกๅผ 0๏ผ‰ +3.ๅฐ†้ขœ่‰ฒไปŽ BGR ่ฝฌๆขไธบ HSV +4.้šๆœบ้ฅฑๅ’Œๅบฆ +5.้šๆœบ่‰ฒ่ฐƒ +6.ๅฐ†้ขœ่‰ฒไปŽ HSV ่ฝฌๆขไธบ BGR +7.้šๆœบๅฏนๆฏ”ๅบฆ๏ผˆๆจกๅผ 1๏ผ‰ +``` + +- ๆ›ดๆ–ฐ๏ผš`img` + +### ๆ ผๅผไฟฎๆ”น + +`PackSegInputs`๏ผšไธบ่ฏญไน‰ๅˆ†ๆฎตๆ‰“ๅŒ…่พ“ๅ…ฅๆ•ฐๆฎใ€‚ + +- ๆทปๅŠ ๏ผš`inputs`๏ผŒ`data_sample` +- ๅˆ ้™ค๏ผš็”ฑ `meta_keys` ๆŒ‡ๅฎš็š„ keys๏ผˆๅˆๅนถๅˆฐ data_sample ็š„ metainfo ไธญ๏ผ‰๏ผŒๆ‰€ๆœ‰ๅ…ถไป– keys diff --git a/mmsegmentation/docs/zh_cn/api.rst b/mmsegmentation/docs/zh_cn/api.rst new file mode 100644 index 0000000..3478aa9 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/api.rst @@ -0,0 +1,95 @@ +mmseg.apis +-------------- +.. automodule:: mmseg.apis + :members: + +mmseg.datasets +-------------- + +datasets +^^^^^^^^^^ +.. automodule:: mmseg.datasets + :members: + +transforms +^^^^^^^^^^^^ +.. automodule:: mmseg.datasets.transforms + :members: + +mmseg.engine +-------------- + +hooks +^^^^^^^^^^ +.. automodule:: mmseg.engine.hooks + :members: + +optimizers +^^^^^^^^^^^^^^^ +.. automodule:: mmseg.engine.optimizers + :members: + +mmseg.evaluation +-------------- + +metrics +^^^^^^^^^^ +.. automodule:: mmseg.evaluation.metrics + :members: + +mmseg.models +-------------- + +backbones +^^^^^^^^^^^^^^^^^^ +.. automodule:: mmseg.models.backbones + :members: + +decode_heads +^^^^^^^^^^^^^^^ +.. automodule:: mmseg.models.decode_heads + :members: + +segmentors +^^^^^^^^^^ +.. automodule:: mmseg.models.segmentors + :members: + +losses +^^^^^^^^^^ +.. automodule:: mmseg.models.losses + :members: + +necks +^^^^^^^^^^^^ +.. automodule:: mmseg.models.necks + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmseg.models.utils + :members: + + +mmseg.structures +-------------------- + +structures +^^^^^^^^^^^^^^^^^ +.. automodule:: mmseg.structures + :members: + +sampler +^^^^^^^^^^ +.. automodule:: mmseg.structures.sampler + :members: + +mmseg.visualization +-------------------- +.. automodule:: mmseg.visualization + :members: + +mmseg.utils +-------------- +.. automodule:: mmseg.utils + :members: diff --git a/mmsegmentation/docs/zh_cn/conf.py b/mmsegmentation/docs/zh_cn/conf.py new file mode 100644 index 0000000..1842055 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/conf.py @@ -0,0 +1,133 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +import pytorch_sphinx_theme + +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'MMSegmentation' +copyright = '2020-2021, OpenMMLab' +author = 'MMSegmentation Authors' +version_file = '../../mmseg/version.py' + + +def get_version(): + with open(version_file) as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +# The full version, including alpha/beta/rc tags +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', + 'sphinx_markdown_tables', 'sphinx_copybutton', 'myst_parser' +] + +autodoc_mock_imports = [ + 'matplotlib', 'pycocotools', 'mmseg.version', 'mmcv.ops' +] + +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'sphinx_rtd_theme' +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] +html_theme_options = { + 'logo_url': + 'https://mmsegmentation.readthedocs.io/zh-CN/latest/', + 'menu': [ + { + 'name': + 'ๆ•™็จ‹', + 'url': + 'https://github.com/open-mmlab/mmsegmentation/blob/master/' + 'demo/MMSegmentation_Tutorial.ipynb' + }, + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmsegmentation' + }, + { + 'name': + 'ไธŠๆธธๅบ“', + 'children': [ + { + 'name': 'MMCV', + 'url': 'https://github.com/open-mmlab/mmcv', + 'description': 'ๅŸบ็ก€่ง†่ง‰ๅบ“' + }, + ] + }, + ], + # Specify the language of shared menu + 'menu_lang': + 'cn', +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['css/readthedocs.css'] + +# Enable ::: for my_st +myst_enable_extensions = ['colon_fence'] + +language = 'zh-CN' + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/mmsegmentation/docs/zh_cn/device/npu.md b/mmsegmentation/docs/zh_cn/device/npu.md new file mode 100644 index 0000000..d50439d --- /dev/null +++ b/mmsegmentation/docs/zh_cn/device/npu.md @@ -0,0 +1,39 @@ +# NPU (ๅŽไธบ ๆ˜‡่…พ) + +## ไฝฟ็”จๆ–นๆณ• + +่ฏทๅ‚่€ƒ [MMCV ็š„ๅฎ‰่ฃ…ๆ–‡ๆกฃ](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) ๆฅๅฎ‰่ฃ… NPU ็‰ˆๆœฌ็š„ MMCVใ€‚ + +ไปฅไธ‹ๅฑ•็คบๅ•ๆœบๅ››ๅกๅœบๆ™ฏ็š„่ฟ่กŒๆŒ‡ไปค: + +```shell +bash tools/dist_train.sh configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py 4 +``` + +ไปฅไธ‹ๅฑ•็คบๅ•ๆœบๅ•ๅกไธ‹็š„่ฟ่กŒๆŒ‡ไปค: + +```shell +python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py +``` + +## ๆจกๅž‹้ชŒ่ฏ็ป“ๆžœ + +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :----------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| [apcnet](<>) | 78.02 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | +| [bisenetv1](<>) | 76.04 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | +| [bisenetv2](<>) | 72.44 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | + +**ๆณจๆ„:** + +- ๅฆ‚ๆžœๆฒกๆœ‰็‰นๅˆซๆ ‡่ฎฐ๏ผŒNPU ไธŠ็š„ไฝฟ็”จๆททๅˆ็ฒพๅบฆ่ฎญ็ปƒ็š„็ป“ๆžœไธŽไฝฟ็”จ FP32 ็š„ GPU ไธŠ็š„็ป“ๆžœ็›ธๅŒใ€‚ + +**ไปฅไธŠๆจกๅž‹็ป“ๆžœ็”ฑๅŽไธบๆ˜‡่…พๅ›ข้˜Ÿๆไพ›** diff --git a/mmsegmentation/docs/zh_cn/get_started.md b/mmsegmentation/docs/zh_cn/get_started.md new file mode 100644 index 0000000..ca375f3 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/get_started.md @@ -0,0 +1,209 @@ +# ๅผ€ๅง‹๏ผšๅฎ‰่ฃ…ๅ’Œ่ฟ่กŒ MMSeg + +## ้ข„ๅค‡็Ÿฅ่ฏ† + +ๆœฌๆ•™็จ‹ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ไผšๆผ”็คบๅฆ‚ไฝ•ไฝฟ็”จ PyTorch ๅ‡†ๅค‡็Žฏๅขƒใ€‚ + +MMSegmentation ๅฏไปฅๅœจ Linux, Windows ๅ’Œ macOS ็ณป็ปŸไธŠ่ฟ่กŒ๏ผŒๅนถไธ”้œ€่ฆๅฎ‰่ฃ… Python 3.7+, CUDA 10.2+ ๅ’Œ PyTorch 1.8+ + +**ๆณจๆ„:** +ๅฆ‚ๆžœๆ‚จๅทฒ็ปๅฎ‰่ฃ…ไบ† PyTorch, ๅฏไปฅ่ทณ่ฟ‡่ฏฅ้ƒจๅˆ†๏ผŒ็›ดๆŽฅๅˆฐ[ไธ‹ไธ€ๅฐ่Š‚](##ๅฎ‰่ฃ…)ใ€‚ๅฆๅˆ™๏ผŒๆ‚จๅฏไปฅๆŒ‰็…งไปฅไธ‹ๆญฅ้ชคๆ“ไฝœใ€‚ + +**ๆญฅ้ชค 0.** ไปŽ[ๅฎ˜ๆ–น็ฝ‘็ซ™](https://docs.conda.io/en/latest/miniconda.html)ไธ‹่ฝฝๅนถๅฎ‰่ฃ… Miniconda + +**ๆญฅ้ชค 1.** ๅˆ›ๅปบไธ€ไธช conda ็Žฏๅขƒ๏ผŒๅนถๆฟ€ๆดป + +```shell +conda create --name openmmlab python=3.8 -y +conda activate openmmlab +``` + +**Step 2.** ๅ‚่€ƒ [official instructions](https://pytorch.org/get-started/locally/) ๅฎ‰่ฃ… PyTorch + +ๅœจ GPU ๅนณๅฐไธŠ๏ผš + +```shell +conda install pytorch torchvision -c pytorch +``` + +ๅœจ CPU ๅนณๅฐไธŠ + +```shell +conda install pytorch torchvision cpuonly -c pytorch +``` + +## ๅฎ‰่ฃ… + +ๆˆ‘ไปฌๅปบ่ฎฎ็”จๆˆท้ตๅพชๆˆ‘ไปฌ็š„ๆœ€ไฝณๅฎž่ทตๆฅๅฎ‰่ฃ… MMSegmentation ใ€‚ไฝ†ๆ˜ฏๆ•ดไธช่ฟ‡็จ‹ๆ˜ฏ้ซ˜ๅบฆ่‡ชๅฎšไน‰็š„ใ€‚ๆ›ดๅคšไฟกๆฏ่ฏทๅ‚่ง[่‡ชๅฎšไน‰ๅฎ‰่ฃ…](##่‡ชๅฎšไน‰ๅฎ‰่ฃ…)้ƒจๅˆ†ใ€‚ + +### ๆœ€ไฝณๅฎž่ทต + +**ๆญฅ้ชค 0.** ไฝฟ็”จ [MIM](https://github.com/open-mmlab/mim) ๅฎ‰่ฃ… [MMCV](https://github.com/open-mmlab/mmcv) + +```shell +pip install -U openmim +mim install mmengine +mim install "mmcv>=2.0.0" +``` + +**ๆญฅ้ชค 1.** ๅฎ‰่ฃ… MMSegmentation + +ๆƒ…ๅ†ต a: ๅฆ‚ๆžœๆ‚จๆƒณ็ซ‹ๅˆปๅผ€ๅ‘ๅ’Œ่ฟ่กŒ mmsegmentation๏ผŒๆ‚จๅฏ้€š่ฟ‡ๆบ็ ๅฎ‰่ฃ…๏ผš + +```shell +git clone -b main https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -v -e . +# '-v' ่กจ็คบ่ฏฆ็ป†ๆจกๅผ๏ผŒๆ›ดๅคš็š„่พ“ๅ‡บ +# '-e' ่กจ็คบไปฅๅฏ็ผ–่พ‘ๆจกๅผๅฎ‰่ฃ…ๅทฅ็จ‹๏ผŒ +# ๅ› ๆญคๅฏนไปฃ็ ๆ‰€ๅš็š„ไปปไฝ•ไฟฎๆ”น้ƒฝ็”Ÿๆ•ˆ๏ผŒๆ— ้œ€้‡ๆ–ฐๅฎ‰่ฃ… +``` + +ๆƒ…ๅ†ต b: ๅฆ‚ๆžœๆ‚จๆŠŠ mmsegmentation ไฝœไธบไพ่ต–ๅบ“ๆˆ–่€…็ฌฌไธ‰ๆ–นๅบ“๏ผŒๅฏไปฅ้€š่ฟ‡ pip ๅฎ‰่ฃ…๏ผš + +```shell +pip install "mmsegmentation>=1.0.0" +``` + +### ้ชŒ่ฏๆ˜ฏๅฆๅฎ‰่ฃ…ๆˆๅŠŸ + +ไธบไบ†้ชŒ่ฏ MMSegmentation ๆ˜ฏๅฆๆญฃ็กฎๅฎ‰่ฃ…๏ผŒๆˆ‘ไปฌๆไพ›ไบ†ไธ€ไบ›็คบไพ‹ไปฃ็ ๆฅ่ฟ่กŒไธ€ไธชๆŽจ็† demo ใ€‚ + +**ๆญฅ้ชค 1.** ไธ‹่ฝฝ้…็ฝฎๆ–‡ไปถๅ’Œๆจกๅž‹ๆ–‡ไปถ + +```shell +mim download mmsegmentation --config pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 --dest . +``` + +่ฏฅไธ‹่ฝฝ่ฟ‡็จ‹ๅฏ่ƒฝ้œ€่ฆ่Šฑ่ดนๅ‡ ๅˆ†้’Ÿ๏ผŒ่ฟ™ๅ–ๅ†ณไบŽๆ‚จ็š„็ฝ‘็ปœ็Žฏๅขƒใ€‚ๅฝ“ไธ‹่ฝฝ็ป“ๆŸ๏ผŒๆ‚จๅฐ†็œ‹ๅˆฐไปฅไธ‹ไธคไธชๆ–‡ไปถๅœจๆ‚จๅฝ“ๅ‰ๅทฅไฝœ็›ฎๅฝ•๏ผš`pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py` ๅ’Œ `pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth` + +**ๆญฅ้ชค 2.** ้ชŒ่ฏๆŽจ็† demo + +้€‰้กน (a). ๅฆ‚ๆžœๆ‚จ้€š่ฟ‡ๆบ็ ๅฎ‰่ฃ…ไบ† mmsegmentation๏ผŒ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๅณๅฏ๏ผš + +```shell +python demo/image_demo.py demo/demo.png configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --out-file result.jpg +``` + +ๆ‚จๅฐ†ๅœจๅฝ“ๅ‰ๆ–‡ไปถๅคนไธญ็œ‹ๅˆฐไธ€ไธชๆ–ฐๅ›พๅƒ `result.jpg`๏ผŒๅ…ถไธญๆ‰€ๆœ‰็›ฎๆ ‡้ƒฝ่ฆ†็›–ไบ†ๅˆ†ๅ‰ฒ mask + +้€‰้กน (b). ๅฆ‚ๆžœๆ‚จ้€š่ฟ‡ pip ๅฎ‰่ฃ… mmsegmentation, ๆ‰“ๅผ€ๆ‚จ็š„ python ่งฃ้‡Šๅ™จ๏ผŒๅคๅˆถ็ฒ˜่ดดไปฅไธ‹ไปฃ็ ๏ผš + +```python +from mmseg.apis import inference_model, init_model, show_result_pyplot +import mmcv + +config_file = 'pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_file = 'pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' + +# ๆ นๆฎ้…็ฝฎๆ–‡ไปถๅ’Œๆจกๅž‹ๆ–‡ไปถๅปบ็ซ‹ๆจกๅž‹ +model = init_model(config_file, checkpoint_file, device='cuda:0') + +# ๅœจๅ•ๅผ ๅ›พๅƒไธŠๆต‹่ฏ•ๅนถๅฏ่ง†ๅŒ– +img = 'demo/demo.png' # or img = mmcv.imread(img), ่ฟ™ๆ ทไป…้œ€ไธ‹่ฝฝไธ€ๆฌก +result = inference_model(model, img) +# ๅœจๆ–ฐ็š„็ช—ๅฃๅฏ่ง†ๅŒ–็ป“ๆžœ +show_result_pyplot(model, img, result, show=True) +# ๆˆ–่€…ๅฐ†ๅฏ่ง†ๅŒ–็ป“ๆžœไฟๅญ˜ๅˆฐๅ›พๅƒๆ–‡ไปถๅคนไธญ +# ๆ‚จๅฏไปฅไฟฎๆ”นๅˆ†ๅ‰ฒ map ็š„้€ๆ˜Žๅบฆ (0, 1]. +show_result_pyplot(model, img, result, show=True, out_file='result.jpg', opacity=0.5) +# ๅœจไธ€ๆฎต่ง†้ข‘ไธŠๆต‹่ฏ•ๅนถๅฏ่ง†ๅŒ–ๅˆ†ๅ‰ฒ็ป“ๆžœ +video = mmcv.VideoReader('video.mp4') +for frame in video: + result = inference_model(model, frame) + show_result_pyplot(model, frame, result, wait_time=1) +``` + +ๆ‚จๅฏไปฅไฟฎๆ”นไธŠ้ข็š„ไปฃ็ ๆฅๆต‹่ฏ•ๅ•ไธชๅ›พๅƒๆˆ–่ง†้ข‘๏ผŒ่ฟ™ไธคไธช้€‰้กน้ƒฝๅฏไปฅ้ชŒ่ฏๅฎ‰่ฃ…ๆ˜ฏๅฆๆˆๅŠŸใ€‚ + +### ่‡ชๅฎšไน‰ๅฎ‰่ฃ… + +#### CUDA ็‰ˆๆœฌ + +ๅฝ“ๅฎ‰่ฃ… PyTorch ็š„ๆ—ถๅ€™๏ผŒๆ‚จ้œ€่ฆๆŒ‡ๅฎš CUDA ็š„็‰ˆๆœฌ๏ผŒ ๅฆ‚ๆžœๆ‚จไธ็กฎๅฎš้€‰ๆ‹ฉๅ“ชไธช็‰ˆๆœฌ๏ผŒ่ฏท้ตๅพชๆˆ‘ไปฌ็š„ๅปบ่ฎฎ๏ผš + +- ๅฏนไบŽๅŸบไบŽ Ampere ็š„ NVIDIA GPUs, ไพ‹ๅฆ‚ GeForce 30 ็ณปๅˆ—ๅ’Œ NVIDIA A100, ๅฟ…้กป่ฆๆฑ‚ๆ˜ฏ CUDA 11. +- ๅฏนไบŽๆ›ด่€็š„ NVIDIA GPUs, CUDA 11 is backward compatible, but CUDA 10.2 ๆไพ›ไบ†ๆ›ดๅฅฝ็š„ๅ…ผๅฎนๆ€ง๏ผŒไปฅๅŠๆ›ดๅŠ ็š„่ฝป้‡ๅŒ– + +่ฏท็กฎไฟ GPU ้ฉฑๅŠจๆปก่ถณๆœ€ๅฐ็š„็‰ˆๆœฌ้œ€ๆฑ‚ใ€‚่ฏฆๆƒ…่ฏทๅ‚่€ƒ่ฟ™ไธช[่กจๆ ผ](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions) + +**ๆณจๆ„:** +ๅฆ‚ๆžœๆ‚จๆŒ‰็…งๆˆ‘ไปฌ็š„ๆœ€ไฝณๅฎž่ทต๏ผŒๅฎ‰่ฃ… CUDA ่ฟ่กŒๅบ“ๅฐฑ่ถณๅคŸไบ†๏ผŒๅ› ไธบไธ้œ€่ฆ CUDA ไปฃ็ ๅœจๆœฌๅœฐ็ผ–่ฏ‘ใ€‚ ไฝ†ๆ˜ฏๅฆ‚ๆžœๆ‚จๅธŒๆœ›ไปŽๆบ็ ็ผ–่ฏ‘ MMCV ๆˆ–่€…้œ€่ฆๅผ€ๅ‘ๅ…ถไป–็š„ CUDA ็ฎ—ๅญ๏ผŒๆ‚จ้œ€่ฆไปŽ NVIDIA ็š„[ๅฎ˜็ฝ‘](https://developer.nvidia.com/cuda-downloads)ๅฎ‰่ฃ…ๅฎŒๆ•ด็š„ CUDA ๅทฅๅ…ท๏ผŒๅŒๆ—ถๅฎƒ็š„็‰ˆๆœฌ้œ€่ฆไธŽ PyTorch ็š„ CUDA ็‰ˆๆœฌๅŒน้…ใ€‚ๅณ `conda install` ๅ‘ฝไปคไธญๆŒ‡ๅฎš็š„ cudatoolkit ็‰ˆๆœฌใ€‚ + +#### ไธไฝฟ็”จ MIM ๅฎ‰่ฃ… MMCV + +MMCV ๅŒ…ๅซ C++ ๅ’Œ CUDA ๆ‰ฉๅฑ•๏ผŒๅ› ๆญคไธŽ PyTorch ็š„ไพ่ต–ๆ–นๅผๆฏ”่พƒๅคๆ‚ใ€‚MIM ่‡ชๅŠจ่งฃๅ†ณไบ†่ฟ™็งไพ่ต–ๅ…ณ็ณป๏ผŒไฝฟๅฎ‰่ฃ…ๆ›ดๅฎนๆ˜“ใ€‚็„ถ่€Œ๏ผŒMIM ไนŸๅนถไธๆ˜ฏๅฟ…้กป็š„ใ€‚ + +ไธบไบ†ไฝฟ็”จ pip ่€Œไธๆ˜ฏ MIM ๅฎ‰่ฃ… MMCV, ่ฏทๅ‚่€ƒ [MMCV ๅฎ‰่ฃ…ๆŒ‡ๅ—](https://mmcv.readthedocs.io/en/latest/get_started/installation.html). ่ฟ™้œ€่ฆๆ‰‹ๅŠจๆŒ‡ๅฎšไธ€ไธชๅŸบไบŽ PyTorch ็‰ˆๆœฌๅŠๅ…ถ CUDA ็‰ˆๆœฌ็š„ find-url. + +ไพ‹ๅฆ‚๏ผŒไปฅไธ‹ๅ‘ฝไปคๅฏไธบ PyTorch 1.10.x and CUDA 11.3 ๅฎ‰่ฃ… mmcv==2.0.0 + +```shell +pip install mmcv==2.0.0 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10/index.html +``` + +#### ๅœจไป…ๆœ‰ CPU ็š„ๅนณๅฐๅฎ‰่ฃ… + +MMSegmentation ๅฏไปฅๅœจไป…ๆœ‰ CPU ็š„็‰ˆๆœฌไธŠ่ฟ่กŒใ€‚ๅœจ CPU ๆจกๅผ๏ผŒๆ‚จๅฏไปฅ่ฎญ็ปƒ๏ผˆ้œ€่ฆ MMCV ็‰ˆๆœฌ >= 2.0.0๏ผ‰๏ผŒๆต‹่ฏ•ๅ’ŒๆŽจ็†ๆจกๅž‹ใ€‚ + +#### ๅœจ Google Colab ไธŠๅฎ‰่ฃ… + +[Google Colab](https://research.google.com/) ้€šๅธธๅทฒ็ปๅฎ‰่ฃ…ไบ† PyTorch๏ผŒๅ› ๆญคๆˆ‘ไปฌไป…้œ€่ฆ้€š่ฟ‡ไปฅไธ‹ๅ‘ฝไปคๅฎ‰่ฃ… MMCV ๅ’Œ MMSegmentationใ€‚ + +**ๆญฅ้ชค 1.** ไฝฟ็”จ [MIM](https://github.com/open-mmlab/mim) ๅฎ‰่ฃ… [MMCV](https://github.com/open-mmlab/mmcv) + +```shell +!pip3 install openmim +!mim install mmengine +!mim install "mmcv>=2.0.0" +``` + +**Step 2.** ้€š่ฟ‡ๆบ็ ๅฎ‰่ฃ… MMSegmentation + +```shell +!git clone https://github.com/open-mmlab/mmsegmentation.git +%cd mmsegmentation +!git checkout main +!pip install -e . +``` + +**Step 3.** ้ชŒ่ฏ + +```python +import mmseg +print(mmseg.__version__) +# ็คบไพ‹่พ“ๅ‡บ: 1.0.0 +``` + +**ๆณจๆ„:** +ๅœจ Jupyter ไธญ, ๆ„Ÿๅนๅท `!` ็”จไบŽ่ฐƒ็”จๅค–้ƒจๅฏๆ‰ง่กŒๅ‘ฝไปค๏ผŒ`%cd` ๆ˜ฏไธ€ไธช [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd) ๅฏไปฅๆ”นๅ˜ๅฝ“ๅ‰ python ็š„ๅทฅไฝœ็›ฎๅฝ•ใ€‚ + +### ้€š่ฟ‡ Docker ไฝฟ็”จ MMSegmentation + +ๆˆ‘ไปฌๆไพ›ไบ†ไธ€ไธช [Dockerfile](https://github.com/open-mmlab/mmsegmentation/blob/master/docker/Dockerfile) ๆฅๅปบ็ซ‹ๆ˜ ๅƒใ€‚็กฎไฟๆ‚จ็š„ [docker ็‰ˆๆœฌ](https://docs.docker.com/engine/install/) >=19.03. + +```shell +# ้€š่ฟ‡ PyTorch 1.11, CUDA 11.3 ๅปบ็ซ‹ๆ˜ ๅƒ +# ๅฆ‚ๆžœๆ‚จไฝฟ็”จๅ…ถไป–็‰ˆๆœฌ๏ผŒไฟฎๆ”น Dockerfile ๅณๅฏ +docker build -t mmsegmentation docker/ +``` + +่ฟ่กŒ๏ผš + +```shell +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmsegmentation/data mmsegmentation +``` + +### ๅฏ้€‰ไพ่ต– + +#### ๅฎ‰่ฃ… GDAL + +[GDAL](https://gdal.org/) ๆ˜ฏไธ€ไธช็”จไบŽๆ …ๆ ผๅ’Œ็Ÿข้‡ๅœฐ็†็ฉบ้—ดๆ•ฐๆฎๆ ผๅผ็š„่ฝฌๆขๅบ“ใ€‚ๅฎ‰่ฃ… GDAL ๅฏไปฅ่ฏปๅ–ๅคๆ‚ๆ ผๅผๅ’Œๆžๅคง็š„้ฅๆ„Ÿๅ›พๅƒใ€‚ + +```shell +conda install GDAL +``` + +## ้—ฎ้ข˜่งฃ็ญ” + +ๅฆ‚ๆžœๆ‚จๅœจๅฎ‰่ฃ…่ฟ‡็จ‹ไธญ้‡ๅˆฐไบ†ๅ…ถไป–้—ฎ้ข˜๏ผŒ่ฏท็ฌฌไธ€ๆ—ถ้—ดๆŸฅ้˜… [FAQ](notes/faq.md) ๆ–‡ไปถใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ๆ‰พๅˆฐ็ญ”ๆกˆ๏ผŒๆ‚จไนŸๅฏไปฅๅœจ GitHub ไธŠๆๅ‡บ [issue](https://github.com/open-mmlab/mmsegmentation/issues/new/choose) diff --git a/mmsegmentation/docs/zh_cn/index.rst b/mmsegmentation/docs/zh_cn/index.rst new file mode 100644 index 0000000..ce5e499 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/index.rst @@ -0,0 +1,57 @@ +ๆฌข่ฟŽๆฅๅˆฐ MMSegmentation ็š„ๆ–‡ๆกฃ! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: ๅผ€ๅง‹ไฝ ็š„็ฌฌไธ€ๆญฅ + + get_started.md + +.. toctree:: + :maxdepth: 2 + :caption: ็”จๆˆทๆŒ‡ๅ— + + user_guides/index.rst + +.. toctree:: + :maxdepth: 2 + :caption: ่ฟ›้˜ถๆŒ‡ๅ— + + advanced_guides/index.rst + +.. toctree:: + :maxdepth: 1 + :caption: ่ฟ็งปๆŒ‡ๅผ• + + migration/index.rst + +.. toctree:: + :caption: ๆŽฅๅฃๆ–‡ๆกฃ๏ผˆ่‹ฑๆ–‡๏ผ‰ + + api.rst + +.. toctree:: + :maxdepth: 1 + :caption: ๆจกๅž‹ๅบ“ + + model_zoo.md + modelzoo_statistics.md + +.. toctree:: + :maxdepth: 2 + :caption: ่ฏดๆ˜Ž + + changelog.md + faq.md + +.. toctree:: + :caption: ่ฏญ่จ€ๅˆ‡ๆข + + switch_language.md + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/mmsegmentation/docs/zh_cn/make.bat b/mmsegmentation/docs/zh_cn/make.bat new file mode 100644 index 0000000..922152e --- /dev/null +++ b/mmsegmentation/docs/zh_cn/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/mmsegmentation/docs/zh_cn/migration/index.rst b/mmsegmentation/docs/zh_cn/migration/index.rst new file mode 100644 index 0000000..854b9e6 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/migration/index.rst @@ -0,0 +1,8 @@ +่ฟ็งป +*************** + +.. toctree:: + :maxdepth: 1 + + interface.md + package.md diff --git a/mmsegmentation/docs/zh_cn/migration/interface.md b/mmsegmentation/docs/zh_cn/migration/interface.md new file mode 100644 index 0000000..42f91bf --- /dev/null +++ b/mmsegmentation/docs/zh_cn/migration/interface.md @@ -0,0 +1,523 @@ +# ไปŽ MMSegmentation 0.x ่ฟ็งป + +## ๅผ•่จ€ + +ๆœฌๆŒ‡ๅ—ไป‹็ปไบ† MMSegmentation 0.x ๅ’Œ MMSegmentation1.x ๅœจ่กจ็Žฐๅ’Œ API ๆ–น้ข็š„ๅŸบๆœฌๅŒบๅˆซ๏ผŒไปฅๅŠ่ฟ™ไบ›ไธŽ่ฟ็งป่ฟ‡็จ‹็š„ๅ…ณ็ณปใ€‚ + +## ๆ–ฐ็š„ไพ่ต– + +MMSegmentation 1.x ไพ่ต–ไบŽไธ€ไบ›ๆ–ฐ็š„่ฝฏไปถๅŒ…๏ผŒๆ‚จๅฏไปฅๅ‡†ๅค‡ไธ€ไธชๆ–ฐ็š„ๅนฒๅ‡€็Žฏๅขƒ๏ผŒ็„ถๅŽๆ นๆฎ[ๅฎ‰่ฃ…ๆ•™็จ‹](../get_started.md)้‡ๆ–ฐๅฎ‰่ฃ…ใ€‚ + +ๆˆ–ๆ‰‹ๅŠจๅฎ‰่ฃ…ไปฅไธ‹่ฝฏไปถๅŒ…ใ€‚ + +1. [MMEngine](https://github.com/open-mmlab/mmengine)๏ผšMMEngine ๆ˜ฏ OpenMMLab 2.0 ๆžถๆž„็š„ๆ ธๅฟƒ๏ผŒๆˆ‘ไปฌๅฐ†่ฎธๅคšไธŽ่ฎก็ฎ—ๆœบ่ง†่ง‰ๆ— ๅ…ณ็š„ๅ†…ๅฎนไปŽ MMCV ๆ‹†ๅˆ†ๅˆฐ MMEngine ไธญใ€‚ + +2. [MMCV](https://github.com/open-mmlab/mmcv)๏ผšOpenMMLab ็š„่ฎก็ฎ—ๆœบ่ง†่ง‰ๅŒ…ใ€‚่ฟ™ไธๆ˜ฏไธ€ไธชๆ–ฐ็š„ไพ่ต–๏ผŒไฝ†ๆ‚จ้œ€่ฆๅฐ†ๅ…ถๅ‡็บงๅˆฐ **2.0.0** ๆˆ–ไปฅไธŠ็š„็‰ˆๆœฌใ€‚ + +3. [MMClassification](https://github.com/open-mmlab/mmclassification)๏ผˆๅฏ้€‰๏ผ‰๏ผšOpenMMLab ็š„ๅ›พๅƒๅˆ†็ฑปๅทฅๅ…ท็ฎฑๅ’ŒๅŸบๅ‡†ใ€‚่ฟ™ไธๆ˜ฏไธ€ไธชๆ–ฐ็š„ไพ่ต–๏ผŒไฝ†ๆ‚จ้œ€่ฆๅฐ†ๅ…ถๅ‡็บงๅˆฐ **1.0.0rc6** ็‰ˆๆœฌใ€‚ + +4. [MMDetection](https://github.com/open-mmlab/mmdetection)(ๅฏ้€‰): OpenMMLab ็š„็›ฎๆ ‡ๆฃ€ๆต‹ๅทฅๅ…ท็ฎฑๅ’ŒๅŸบๅ‡†ใ€‚่ฟ™ไธๆ˜ฏไธ€ไธชๆ–ฐ็š„ไพ่ต–๏ผŒไฝ†ๆ‚จ้œ€่ฆๅฐ†ๅ…ถๅ‡็บงๅˆฐ **3.0.0** ๆˆ–ไปฅไธŠ็š„็‰ˆๆœฌใ€‚ + +## ๅฏๅŠจ่ฎญ็ปƒ + +OpenMMLab 2.0 ็š„ไธป่ฆๆ”น่ฟ›ๆ˜ฏๅ‘ๅธƒไบ† MMEngine๏ผŒๅฎƒไธบๅฏๅŠจ่ฎญ็ปƒไปปๅŠก็š„็ปŸไธ€ๆŽฅๅฃๆไพ›ไบ†้€š็”จไธ”ๅผบๅคง็š„ๆ‰ง่กŒๅ™จใ€‚ + +ไธŽ MMSeg 0.x ็›ธๆฏ”๏ผŒMMSeg 1.x ๅœจ `tools/train.py` ไธญๆไพ›็š„ๅ‘ฝไปค่กŒๅ‚ๆ•ฐๆ›ดๅฐ‘ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ๅŠŸ่ƒฝๅŽŸ็‰ˆๆ–ฐ็‰ˆ
ๅŠ ่ฝฝ้ข„่ฎญ็ปƒๆจกๅž‹--load_from=$CHECKPOINT--cfg-options load_from=$CHECKPOINT
ไปŽ็‰นๅฎšๆฃ€ๆŸฅ็‚นๆขๅค่ฎญ็ปƒ--resume-from=$CHECKPOINT--resume=$CHECKPOINT
ไปŽๆœ€ๆ–ฐ็š„ๆฃ€ๆŸฅ็‚นๆขๅค่ฎญ็ปƒ--auto-resume--resume='auto'
่ฎญ็ปƒๆœŸ้—ดๆ˜ฏๅฆไธ่ฏ„ไผฐๆฃ€ๆŸฅ็‚น--no-validate--cfg-options val_cfg=None val_dataloader=None val_evaluator=None
ๆŒ‡ๅฎš่ฎญ็ปƒ่ฎพๅค‡--gpu-id=$DEVICE_ID-
ๆ˜ฏๅฆไธบไธๅŒ่ฟ›็จ‹่ฎพ็ฝฎไธๅŒ็š„็งๅญ--diff-seed--cfg-options randomness.diff_rank_seed=True
ๆ˜ฏๅฆไธบ CUDNN ๅŽ็ซฏ่ฎพ็ฝฎ็กฎๅฎšๆ€ง้€‰้กน--deterministic--cfg-options randomness.deterministic=True
+ +## ๆต‹่ฏ•ๅฏๅŠจ + +ไธŽ่ฎญ็ปƒๅฏๅŠจ็ฑปไผผ๏ผŒMMSegmentation 1.x ็š„ๆต‹่ฏ•ๅฏๅŠจ่„šๆœฌๅœจ tools/test.py ไธญไป…ๆไพ›ๅ…ณ้”ฎๅ‘ฝไปค่กŒๅ‚ๆ•ฐ๏ผŒไปฅไธ‹ๆ˜ฏๆต‹่ฏ•ๅฏๅŠจ่„šๆœฌ็š„ๅŒบๅˆซ๏ผŒๆ›ดๅคšๅ…ณไบŽๆต‹่ฏ•ๅฏๅŠจ็š„็ป†่Š‚่ฏทๅ‚่€ƒ[่ฟ™้‡Œ](../user_guides/4_train_test.md)ใ€‚ + + + + + + + + + + + + + + + + + + + + + + +
ๅŠŸ่ƒฝ0.x1.x
ๆŒ‡ๅฎš่ฏ„ๆต‹ๆŒ‡ๆ ‡--eval mIoU--cfg-options test_evaluator.type=IoUMetric
ๆต‹่ฏ•ๆ—ถๆ•ฐๆฎๅขžๅผบ--aug-test--tta
ๆต‹่ฏ•ๆ—ถๆ˜ฏๅฆๅชไฟๅญ˜้ข„ๆต‹็ป“ๆžœไธ่ฎก็ฎ—่ฏ„ๆต‹ๆŒ‡ๆ ‡--format-only--cfg-options test_evaluator.format_only=True
+ +## ้…็ฝฎๆ–‡ไปถ + +### ๆจกๅž‹่ฎพ็ฝฎ + +`model.backend`ใ€`model.neck`ใ€`model.decode_head` ๅ’Œ `model.loss` ๅญ—ๆฎตๆฒกๆœ‰ๆ›ดๆ”นใ€‚ + +ๆทปๅŠ  `model.data_preprocessor` ๅญ—ๆฎตไปฅ้…็ฝฎ `DataPreProcessor`๏ผŒๅŒ…ๆ‹ฌ๏ผš + +- `mean`๏ผˆSequence๏ผŒๅฏ้€‰๏ผ‰๏ผšRใ€Gใ€B ้€š้“็š„ๅƒ็ด ๅนณๅ‡ๅ€ผใ€‚้ป˜่ฎคไธบ Noneใ€‚ + +- `std`๏ผˆSequence๏ผŒๅฏ้€‰๏ผ‰๏ผšRใ€Gใ€B ้€š้“็š„ๅƒ็ด ๆ ‡ๅ‡†ๅทฎใ€‚้ป˜่ฎคไธบ Noneใ€‚ + +- `size`๏ผˆSequence๏ผŒๅฏ้€‰๏ผ‰๏ผšๅ›บๅฎš็š„ๅกซๅ……ๅคงๅฐใ€‚ + +- `size_divisor`๏ผˆint๏ผŒๅฏ้€‰๏ผ‰๏ผšๅกซๅ……ๅ›พๅƒๅฏไปฅ่ขซๅฝ“ๅ‰ๅ€ผๆ•ด้™คใ€‚ + +- `seg_pad_val`๏ผˆfloat๏ผŒๅฏ้€‰๏ผ‰๏ผšๅˆ†ๅ‰ฒๅ›พ็š„ๅกซๅ……ๅ€ผใ€‚้ป˜่ฎคๅ€ผ๏ผš255ใ€‚ + +- `padding_mode`๏ผˆstr๏ผ‰๏ผšๅกซๅ……็ฑปๅž‹ใ€‚้ป˜่ฎคๅ€ผ๏ผš'constant'ใ€‚ + + - constant๏ผšๅธธ้‡ๅ€ผๅกซๅ……๏ผŒๅ€ผ็”ฑ pad_val ๆŒ‡ๅฎšใ€‚ + +- `bgr_to_rgb`๏ผˆbool๏ผ‰๏ผšๆ˜ฏๅฆๅฐ†ๅ›พๅƒไปŽ BGR ่ฝฌๆขไธบ RGBใ€‚้ป˜่ฎคไธบ Falseใ€‚ + +- `rgb_to_bgr`๏ผˆbool๏ผ‰๏ผšๆ˜ฏๅฆๅฐ†ๅ›พๅƒไปŽ RGB ่ฝฌๆขไธบ BGRใ€‚้ป˜่ฎคไธบ Falseใ€‚ + +**ๆณจ๏ผš** +ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…[ๆจกๅž‹ๆ–‡ๆกฃ](../advanced_guides/models.md)ใ€‚ + +### ๆ•ฐๆฎ้›†่ฎพ็ฝฎ + +**data** ็š„ๆ›ดๆ”น๏ผš + +ๅŽŸ็‰ˆ `data` ๅญ—ๆฎต่ขซๆ‹†ๅˆ†ไธบ `train_dataloader`ใ€`val_dataloader` ๅ’Œ `test_dataloader`๏ผŒๅ…่ฎธๆˆ‘ไปฌไปฅ็ป†็ฒ’ๅบฆ้…็ฝฎๅฎƒไปฌใ€‚ไพ‹ๅฆ‚๏ผŒๆ‚จๅฏไปฅๅœจ่ฎญ็ปƒๅ’Œๆต‹่ฏ•ๆœŸ้—ดๆŒ‡ๅฎšไธๅŒ็š„้‡‡ๆ ทๅ™จๅ’Œๆ‰นๆฌกๅคงๅฐใ€‚ +`samples_per_gpu` ้‡ๅ‘ฝๅไธบ `batch_size`ใ€‚ +`workers_per_gpu` ้‡ๅ‘ฝๅไธบ `num_workers`ใ€‚ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict(...), + val=dict(...), + test=dict(...), +) +``` + +
ๆ–ฐ็‰ˆ + +```python +train_dataloader = dict( + batch_size=4, + num_workers=4, + dataset=dict(...), + sampler=dict(type='DefaultSampler', shuffle=True) # ๅฟ…้กป +) + +val_dataloader = dict( + batch_size=4, + num_workers=4, + dataset=dict(...), + sampler=dict(type='DefaultSampler', shuffle=False) # ๅฟ…้กป +) + +test_dataloader = val_dataloader +``` + +
+ +**ๆ•ฐๆฎๅขžๅผบๅ˜ๆขๆต็จ‹**ๅ˜ๆ›ด + +- ๅŽŸๅง‹ๆ ผๅผ่ฝฌๆข **`ToTensor`**ใ€**`ImageToTensor`**ใ€**`Collect`** ็ป„ๅˆไธบ [`PackSegInputs`](mmseg.datasets.transforms.PackSegInputs) +- ๆˆ‘ไปฌไธๅปบ่ฎฎๅœจๆ•ฐๆฎ้›†ๆต็จ‹ไธญๆ‰ง่กŒ **`Normalize`** ๅ’Œ **Pad**ใ€‚่ฏทๅฐ†ๅ…ถไปŽๆต็จ‹ไธญๅˆ ้™ค๏ผŒๅนถๅฐ†ๅ…ถ่ฎพ็ฝฎๅœจ `data_preprocessor` ๅญ—ๆฎตไธญใ€‚ +- MMSeg 1.x ไธญๅŽŸๅง‹็š„ **`Resize`** ๅทฒๆ›ดๆ”นไธบ **`RandomResize `**๏ผŒ่พ“ๅ…ฅๅ‚ๆ•ฐ `img_scale` ้‡ๅ‘ฝๅไธบ `scale`๏ผŒ`keep_ratio` ็š„้ป˜่ฎคๅ€ผไฟฎๆ”นไธบ Falseใ€‚ +- ๅŽŸๅง‹็š„ `test_pipeline` ๅฐ†ๅ•ๅฐบๅบฆๅ’Œๅคšๅฐบๅบฆๆต‹่ฏ•็ป“ๅˆๅœจไธ€่ตท๏ผŒๅœจ MMSeg 1.x ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ๅ…ถๅˆ†ไธบ `test_pipeline` ๅ’Œ `tta_pipeline`ใ€‚ + +**ๆณจ๏ผš** +ๆˆ‘ไปฌๅฐ†ไธ€ไบ›ๆ•ฐๆฎ่ฝฌๆขๅทฅไฝœ่ฝฌ็งปๅˆฐๆ•ฐๆฎ้ข„ๅค„็†ๅ™จไธญ๏ผŒๅฆ‚ๅฝ’ไธ€ๅŒ–๏ผŒ่ฏทๅ‚้˜…[ๆ–‡ๆกฃ](package.md)ไบ†่งฃๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏใ€‚ + +่ฎญ็ปƒๆต็จ‹ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='Resize', img_scale=(2560, 640), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +``` + +
ๆ–ฐ็‰ˆ + +```python +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2560, 640), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +``` + +
+ +ๆต‹่ฏ•ๆต็จ‹ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2560, 640), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +``` + +
ๆ–ฐ็‰ˆ + +```python +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2560, 640), keep_ratio=True), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +``` + +
+ +**`evaluation`** ไธญ็š„ๆ›ดๆ”น๏ผš + +- **`evaluation`** ๅญ—ๆฎต่ขซๆ‹†ๅˆ†ไธบ `val_evaluator` ๅ’Œ `test_evaluator `ใ€‚่€Œไธ”ไธๅ†ๆ”ฏๆŒ `interval` ๅ’Œ `save_best` ๅ‚ๆ•ฐใ€‚ + `interval` ๅทฒ็งปๅŠจๅˆฐ `train_cfg.val_interval`๏ผŒ`save_best` ๅทฒ็งปๅŠจๅˆฐ `default_hooks.checkpoint.save_best`ใ€‚`pre_eval` ๅทฒๅˆ ้™คใ€‚ +- `IoU` ๅทฒๆ›ดๆ”นไธบ `IoUMetric`ใ€‚ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +evaluation = dict(interval=2000, metric='mIoU', pre_eval=True) +``` + +
ๆ–ฐ็‰ˆ + +```python +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator +``` + +
+ +### Optimizer ๅ’Œ Schedule ่ฎพ็ฝฎ + +**`optimizer`** ๅ’Œ **`optimizer_config`** ไธญ็š„ๆ›ดๆ”น๏ผš + +- ็Žฐๅœจๆˆ‘ไปฌไฝฟ็”จ `optim_wrapper` ๅญ—ๆฎตๆฅๆŒ‡ๅฎšไผ˜ๅŒ–่ฟ‡็จ‹็š„ๆ‰€ๆœ‰้…็ฝฎใ€‚ไปฅๅŠ `optimizer` ๆ˜ฏ `optim_wrapper` ็š„ไธ€ไธชๅญๅญ—ๆฎตใ€‚ +- `paramwise_cfg` ไนŸๆ˜ฏ `optim_wrapper` ็š„ไธ€ไธชๅญๅญ—ๆฎต๏ผŒไปฅๆ›ฟไปฃ `optimizer`ใ€‚ +- `optimizer_config` ็Žฐๅœจ่ขซๅˆ ้™ค๏ผŒๅฎƒ็š„ๆ‰€ๆœ‰้…็ฝฎ้ƒฝ่ขซ็งปๅŠจๅˆฐ `optim_wrapper` ไธญใ€‚ +- `grad_clip` ้‡ๅ‘ฝๅไธบ `clip_grad`ใ€‚ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +optimizer = dict(type='AdamW', lr=0.0001, weight_decay=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=1, norm_type=2)) +``` + +
ๆ–ฐ็‰ˆ + +```python +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='AdamW', lr=0.0001, weight_decay=0.0005), + clip_grad=dict(max_norm=1, norm_type=2)) +``` + +
+ +**`lr_config`** ไธญ็š„ๆ›ดๆ”น๏ผš + +- ๆˆ‘ไปฌๅฐ† `lr_config` ๅญ—ๆฎตๅˆ ้™ค๏ผŒๅนถไฝฟ็”จๆ–ฐ็š„ `param_scheduler` ๆ›ฟไปฃใ€‚ +- ๆˆ‘ไปฌๅˆ ้™คไบ†ไธŽ `warmup` ็›ธๅ…ณ็š„ๅ‚ๆ•ฐ๏ผŒๅ› ไธบๆˆ‘ไปฌไฝฟ็”จ scheduler ็ป„ๅˆๆฅๅฎž็Žฐ่ฏฅๅŠŸ่ƒฝใ€‚ + +ๆ–ฐ็š„ scheduler ็ป„ๅˆๆœบๅˆถ้žๅธธ็ตๆดป๏ผŒๆ‚จๅฏไปฅไฝฟ็”จๅฎƒๆฅ่ฎพ่ฎกๅคš็งๅญฆไน ็Ž‡/ๅŠจ้‡ๆ›ฒ็บฟใ€‚ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚่ง[ๆ•™็จ‹](TODO)ใ€‚ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +lr_config = dict( + policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-6, + power=1.0, + min_lr=0.0, + by_epoch=False) +``` + +
ๆ–ฐ็‰ˆ + +```python +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=160000, + eta_min=0.0, + by_epoch=False, + ) +] +``` + +
+ +**`runner`** ไธญ็š„ๆ›ดๆ”น๏ผš + +ๅŽŸ็‰ˆ `runner` ๅญ—ๆฎตไธญ็š„ๅคงๅคšๆ•ฐ้…็ฝฎ่ขซ็งปๅŠจๅˆฐ `train_cfg`ใ€`val_cfg` ๅ’Œ `test_cfg` ไธญ๏ผŒไปฅๅœจ่ฎญ็ปƒใ€้ชŒ่ฏๅ’Œๆต‹่ฏ•ไธญ้…็ฝฎ loopใ€‚ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +runner = dict(type='IterBasedRunner', max_iters=20000) +``` + +
ๆ–ฐ็‰ˆ + +```python +# `val_interval` ๆ˜ฏๆ—ง็‰ˆๆœฌ็š„ `evaluation.interval`ใ€‚ +train_cfg = dict(type='IterBasedTrainLoop', max_iters=20000, val_interval=2000) +val_cfg = dict(type='ValLoop') # ไฝฟ็”จ้ป˜่ฎค็š„้ชŒ่ฏๅพช็Žฏใ€‚ +test_cfg = dict(type='TestLoop') # ไฝฟ็”จ้ป˜่ฎค็š„ๆต‹่ฏ•ๅพช็Žฏใ€‚ +``` + +
+ +ไบ‹ๅฎžไธŠ๏ผŒๅœจ OpenMMLab 2.0 ไธญ๏ผŒๆˆ‘ไปฌๅผ•ๅ…ฅไบ† `Loop` ๆฅๆŽงๅˆถ่ฎญ็ปƒใ€้ชŒ่ฏๅ’Œๆต‹่ฏ•ไธญ็š„่กŒไธบใ€‚`Runner` ็š„ๅŠŸ่ƒฝไนŸๅ‘็”Ÿไบ†ๅ˜ๅŒ–ใ€‚ๆ‚จๅฏไปฅๅœจ [MMMEngine](https://github.com/open-mmlab/mmengine/) ็š„[ๆ‰ง่กŒๅ™จๆ•™็จ‹](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/design/runner.md) ไธญๆ‰พๅˆฐๆ›ดๅคš็š„่ฏฆ็ป†ไฟกๆฏใ€‚ + +### ่ฟ่กŒๆ—ถ่ฎพ็ฝฎ + +**`checkpoint_config`** ๅ’Œ **`log_config`** ไธญ็š„ๆ›ดๆ”น๏ผš + +`checkpoint_config` ่ขซ็งปๅŠจๅˆฐ `default_hooks.checkpoint` ไธญ๏ผŒ`log_config` ่ขซ็งปๅŠจๅˆฐ `default_hooks.logger` ไธญใ€‚ +ๅนถไธ”ๆˆ‘ไปฌๅฐ†่ฎธๅคš้’ฉๅญ่ฎพ็ฝฎไปŽ่„šๆœฌไปฃ็ ็งปๅŠจๅˆฐ่ฟ่กŒๆ—ถ้…็ฝฎ็š„ `default_hooks` ๅญ—ๆฎตไธญใ€‚ + +```python +default_hooks = dict( + # ่ฎฐๅฝ•ๆฏๆฌก่ฟญไปฃ็š„ๆ—ถ้—ดใ€‚ + timer=dict(type='IterTimerHook'), + + # ๆฏ50ๆฌก่ฟญไปฃๆ‰“ๅฐไธ€ๆฌกๆ—ฅๅฟ—ใ€‚ + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + + # ๅฏ็”จๅ‚ๆ•ฐ่ฐƒๅบฆ็จ‹ๅบใ€‚ + param_scheduler=dict(type='ParamSchedulerHook'), + + # ๆฏ2000ๆฌก่ฟญไปฃไฟๅญ˜ไธ€ๆฌกๆฃ€ๆŸฅ็‚นใ€‚ + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000), + + # ๅœจๅˆ†ๅธƒๅผ็Žฏๅขƒไธญ่ฎพ็ฝฎ้‡‡ๆ ทๅ™จ็งๅญใ€‚ + sampler_seed=dict(type='DistSamplerSeedHook'), + + # ้ชŒ่ฏ็ป“ๆžœๅฏ่ง†ๅŒ–ใ€‚ + visualization=dict(type='SegVisualizationHook')) +``` + +ๆญคๅค–๏ผŒๆˆ‘ไปฌๅฐ†ๅŽŸ็‰ˆ logger ๆ‹†ๅˆ†ไธบ logger ๅ’Œ visualizerใ€‚logger ็”จไบŽ่ฎฐๅฝ•ไฟกๆฏ๏ผŒvisualizer ็”จไบŽๅœจไธๅŒ็š„ๅŽ็ซฏๆ˜พ็คบ logger๏ผŒๅฆ‚ terminal ๅ’Œ TensorBoardใ€‚ + + + + + + + + + +
ๅŽŸ็‰ˆ + +```python +log_config = dict( + interval=100, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook'), + ]) +``` + +
ๆ–ฐ็‰ˆ + +```python +default_hooks = dict( + ... + logger=dict(type='LoggerHook', interval=100), +) +vis_backends = [dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +``` + +
+ +**`load_from`** ๅ’Œ **`resume_from`** ไธญ็š„ๆ›ดๆ”น๏ผš + +- ๅˆ ้™ค `resume_from`ใ€‚ๆˆ‘ไปฌไฝฟ็”จ `resume` ๅ’Œ `load_from` ๆฅๆ›ฟๆขๅฎƒใ€‚ + - ๅฆ‚ๆžœ `resume=True` ไธ” `load_from` ไธบ **not None**๏ผŒๅˆ™ไปŽ `load_from` ไธญ็š„ๆฃ€ๆŸฅ็‚นๆขๅค่ฎญ็ปƒใ€‚ + - ๅฆ‚ๆžœ `resume=True` ไธ” `load_from` ไธบ **None**๏ผŒๅˆ™ๅฐ่ฏ•ไปŽๅทฅไฝœ็›ฎๅฝ•ไธญ็š„ๆœ€ๆ–ฐๆฃ€ๆŸฅ็‚นๆขๅคใ€‚ + - ๅฆ‚ๆžœ `resume=False` ไธ” `load_from` ไธบ **not None**๏ผŒๅˆ™ๅชๅŠ ่ฝฝๆฃ€ๆŸฅ็‚น๏ผŒ่€Œไธ็ปง็ปญ่ฎญ็ปƒใ€‚ + - ๅฆ‚ๆžœ `resume=False` ไธ” `load_from` ไธบ **None**๏ผŒๅˆ™ไธๅŠ ่ฝฝๆˆ–ๆขๅคใ€‚ + +**`dist_params`** ไธญ็š„ๆ›ดๆ”น๏ผš`dist_params` ๅญ—ๆฎต็Žฐๅœจๆ˜ฏ `env_cfg` ็š„ๅญๅญ—ๆฎตใ€‚ๅนถไธ” `env_cfg` ไธญ่ฟ˜ๆœ‰ไธ€ไบ›ๆ–ฐ็š„้…็ฝฎใ€‚ + +```python +env_cfg = dict( + # ๆ˜ฏๅฆๅฏ็”จ cudnn_benchmark + cudnn_benchmark=False, + + # ่ฎพ็ฝฎๅคš่ฟ›็จ‹ๅ‚ๆ•ฐ + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + + # ่ฎพ็ฝฎๅˆ†ๅธƒๅผๅ‚ๆ•ฐ + dist_cfg=dict(backend='nccl'), +) +``` + +**`workflow`** ็š„ๆ”นๅŠจ:`workflow` ็›ธๅ…ณๅŠŸ่ƒฝ่ขซๅˆ ้™คใ€‚ + +ๆ–ฐๅญ—ๆฎต **`visualizer`**๏ผšvisualizer ๆ˜ฏ OpenMMLab 2.0 ไฝ“็ณป็ป“ๆž„ไธญ็š„ๆ–ฐ่ฎพ่ฎกใ€‚ๆˆ‘ไปฌๅœจ runner ไธญไฝฟ็”จ visualizer ๅฎžไพ‹ๆฅๅค„็†็ป“ๆžœๅ’Œๆ—ฅๅฟ—ๅฏ่ง†ๅŒ–๏ผŒๅนถไฟๅญ˜ๅˆฐไธๅŒ็š„ๅŽ็ซฏใ€‚ๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…[ๅฏ่ง†ๅŒ–ๆ•™็จ‹](../user_guides/visualization.md)ใ€‚ + +ๆ–ฐๅญ—ๆฎต **`default_scope`**๏ผšๆœ็ดขๆ‰€ๆœ‰ๆณจๅ†Œๆจกๅ—็š„่ตท็‚นใ€‚MMSegmentation ไธญ็š„ `default_scope` ไธบ `mmseg`ใ€‚่ฏทๅ‚่ง[ๆณจๅ†Œๅ™จๆ•™็จ‹](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/advanced_tutorials/registry.md)ไบ†่งฃๆ›ดๅคš่ฏฆๆƒ…ใ€‚ diff --git a/mmsegmentation/docs/zh_cn/migration/package.md b/mmsegmentation/docs/zh_cn/migration/package.md new file mode 100644 index 0000000..19e5f18 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/migration/package.md @@ -0,0 +1,113 @@ +# ๅŒ…็ป“ๆž„ๆ›ดๆ”น + +ๆœฌ่Š‚ๅŒ…ๅซๆ‚จๅฏน MMSeg 0.x ๅ’Œ 1.x ไน‹้—ด็š„ๅ˜ๅŒ–ๅฏ่ƒฝๆ„Ÿๅˆฐๅฅฝๅฅ‡็š„ๅ†…ๅฎนใ€‚ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MMSegmentation 0.xMMSegmentation 1.x
mmseg.apimmseg.api
- mmseg.core+ mmseg.engine
mmseg.datasetsmmseg.datasets
mmseg.modelsmmseg.models
- mmseg.ops+ mmseg.structure
mmseg.utilsmmseg.utils
+ mmseg.evaluation
+ mmseg.registry
+ +## ๅทฒๅˆ ้™ค็š„ๅŒ… + +### `mmseg.core` + +ๅœจ OpenMMLab 2.0 ไธญ๏ผŒ`core` ๅŒ…ๅทฒ่ขซๅˆ ้™คใ€‚`core` ็š„ `hooks` ๅ’Œ `optimizers` ่ขซ็งปๅŠจๅˆฐไบ† `mmseg.engine` ไธญ๏ผŒ่€Œ `core` ไธญ็š„ `evaluation` ็›ฎๅ‰ๆ˜ฏ mmseg.evaluationใ€‚ + +## `mmseg.ops` + +`ops` ๅŒ…ๅซ `encoding` ๅ’Œ `wrappers`๏ผŒๅฎƒไปฌ่ขซ็งปๅˆฐไบ† `mmseg.models.utils` ไธญใ€‚ + +## ๅขžๅŠ ็š„ๅŒ… + +### `mmseg.engine` + +OpenMMLab 2.0 ๅขžๅŠ ไบ†ไธ€ไธชๆ–ฐ็š„ๆทฑๅบฆๅญฆไน ่ฎญ็ปƒๅŸบ็ก€ๅบ“ MMEngineใ€‚ๅฎƒๆ˜ฏๆ‰€ๆœ‰ OpenMMLab ไปฃ็ ๅบ“็š„่ฎญ็ปƒๅผ•ๆ“Žใ€‚ +mmseg ็š„ `engine` ๅŒ…ๆ˜ฏไธ€ไบ›็”จไบŽ่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠก็š„ๅฎšๅˆถๆจกๅ—๏ผŒๅฆ‚ `SegVisualizationHook` ็”จไบŽๅฏ่ง†ๅŒ–ๅˆ†ๅ‰ฒๆŽฉ่†œใ€‚ + +### `mmseg.structure` + +ๅœจ OpenMMLab 2.0 ไธญ๏ผŒๆˆ‘ไปฌไธบ่ฎก็ฎ—ๆœบ่ง†่ง‰ไปปๅŠก่ฎพ่ฎกไบ†ๆ•ฐๆฎ็ป“ๆž„๏ผŒๅœจ mmseg ไธญ๏ผŒๆˆ‘ไปฌๅœจ `structure` ๅŒ…ไธญๅฎž็Žฐไบ† `SegDataSample`ใ€‚ + +### `mmseg.evaluation` + +ๆˆ‘ไปฌๅฐ†ๆ‰€ๆœ‰่ฏ„ไผฐๆŒ‡ๆ ‡้ƒฝ็งปๅŠจๅˆฐไบ† `mmseg.evaluation` ไธญใ€‚ + +### `mmseg.registry` + +ๆˆ‘ไปฌๅฐ† MMSegmentation ไธญๆ‰€ๆœ‰็ฑปๅž‹ๆจกๅ—็š„ๆณจๅ†Œๅฎž็Žฐ็งปๅŠจๅˆฐ `mmseg.registry` ไธญใ€‚ + +## ไฟฎๆ”น็š„ๅŒ… + +### `mmseg.apis` + +OpenMMLab 2.0 ๅฐ่ฏ•ๆ”ฏๆŒ่ฎก็ฎ—ๆœบ่ง†่ง‰็š„ๅคšไปปๅŠก็ปŸไธ€ๆŽฅๅฃ๏ผŒๅนถๅ‘ๅธƒไบ†ๆ›ดๅผบ็š„ [`Runner`](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/design/runner.md)๏ผŒๅ› ๆญค MMSeg 1.x ๅˆ ้™คไบ† `train.py` ๅ’Œ `test.py` ไธญ็š„ๆจกๅ—๏ผŒๅนถๅฐ† `init_segmentor` ้‡ๅ‘ฝๅไธบ `init_model`๏ผŒๅฐ† `inference_segmentor` ้‡ๅ‘ฝๅไธบ `inference_model`ใ€‚ + +ไปฅไธ‹ๆ˜ฏ `mmseg.apis` ็š„ๆ›ดๆ”น๏ผš + +| ๅ‡ฝๆ•ฐ | ๅ˜ๅŒ– | +| :-------------------: | :--------------------------------------------- | +| `init_segmentor` | ้‡ๅ‘ฝๅไธบ `init_model` | +| `inference_segmentor` | ้‡ๅ‘ฝๅไธบ `inference_model` | +| `show_result_pyplot` | ๅŸบไบŽ `SegLocalVisualizer` ๅฎž็Žฐ | +| `train_model` | ๅˆ ้™ค๏ผŒไฝฟ็”จ `runner.train` ่ฎญ็ปƒใ€‚ | +| `multi_gpu_test` | ๅˆ ้™ค๏ผŒไฝฟ็”จ `runner.test` ๆต‹่ฏ•ใ€‚ | +| `single_gpu_test` | ๅˆ ้™ค๏ผŒไฝฟ็”จ `runner.test` ๆต‹่ฏ•ใ€‚ | +| `set_random_seed` | ๅˆ ้™ค๏ผŒไฝฟ็”จ `mmengine.runner.set_random_seed`ใ€‚ | +| `init_random_seed` | ๅˆ ้™ค๏ผŒไฝฟ็”จ `mmengine.dist.sync_random_seed`ใ€‚ | + +### `mmseg.datasets` + +OpenMMLab 2.0 ๅฐ† `BaseDataset` ๅฎšไน‰ไธบๆ•ฐๆฎ้›†็š„ๅ‡ฝๆ•ฐๅ’ŒๆŽฅๅฃ๏ผŒMMSegmentation 1.x ไนŸ้ตๅพชๆญคๅ่ฎฎ๏ผŒๅนถๅฎšไน‰ไบ†ไปŽ `BaseDataset` ็ปงๆ‰ฟ็š„ `BaseSegDataset`ใ€‚MMCV 2.x ๆ”ถ้›†ๅคš็งไปปๅŠก็š„้€š็”จๆ•ฐๆฎ่ฝฌๆข๏ผŒไพ‹ๅฆ‚ๅˆ†็ฑปใ€ๆฃ€ๆต‹ใ€ๅˆ†ๅ‰ฒ๏ผŒๅ› ๆญค MMSegmentation 1.x ไฝฟ็”จ่ฟ™ไบ›ๆ•ฐๆฎ่ฝฌๆขๅนถๅฐ†ๅ…ถไปŽ mmseg.dataset ไธญๅˆ ้™คใ€‚ + +| ๅŒ…/ๆจกๅ— | ๆ›ดๆ”น | +| :-------------------: | :----------------------------------------------------------------------------------- | +| `mmseg.pipelines` | ็งปๅŠจๅˆฐ `mmcv.transforms` ไธญ | +| `mmseg.sampler` | ็งปๅŠจๅˆฐ `mmengine.dataset.sampler` ไธญ | +| `CustomDataset` | ้‡ๅ‘ฝๅไธบ `BaseSegDataset` ๅนถไปŽ MMEngine ไธญ็š„ `BaseDataset` ็ปงๆ‰ฟ | +| `DefaultFormatBundle` | ๆ›ฟๆขไธบ `PackSegInputs` | +| `LoadImageFromFile` | ็งปๅŠจๅˆฐ `mmcv.transforms.LoadImageFromFile` ไธญ | +| `LoadAnnotations` | ็งปๅŠจๅˆฐ `mmcv.transforms.LoadAnnotations` ไธญ | +| `Resize` | ็งปๅŠจๅˆฐ `mmcv.transforms` ไธญๅนถๆ‹†ๅˆ†ไธบ `Resize`๏ผŒ`RandomResize` ๅ’Œ `RandomChoiceResize` | +| `RandomFlip` | ็งปๅŠจๅˆฐ `mmcv.transforms.RandomFlip` ไธญ | +| `Pad` | ็งปๅŠจๅˆฐ `mmcv.transforms.Pad` ไธญ | +| `Normalize` | ็งปๅŠจๅˆฐ `mmcv.transforms.Normalize` ไธญ | +| `Compose` | ็งปๅŠจๅˆฐ `mmcv.transforms.Compose` ไธญ | +| `ImageToTensor` | ็งปๅŠจๅˆฐ `mmcv.transforms.ImageToTensor` ไธญ | + +### `mmseg.models` + +`models` ๆฒกๆœ‰ๅคชๅคงๅ˜ๅŒ–๏ผŒๅชๆ˜ฏไปŽไปฅๅ‰็š„ `mmseg.ops` ๆทปๅŠ ไบ† `encoding` ๅ’Œ `wrappers` diff --git a/mmsegmentation/docs/zh_cn/model_zoo.md b/mmsegmentation/docs/zh_cn/model_zoo.md new file mode 100644 index 0000000..bd57215 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/model_zoo.md @@ -0,0 +1,152 @@ +# ๆ ‡ๅ‡†ไธŽๆจกๅž‹ๅบ“ + +## ๅ…ฑๅŒ่ฎพๅฎš + +- ๆˆ‘ไปฌ้ป˜่ฎคไฝฟ็”จ 4 ๅกๅˆ†ๅธƒๅผ่ฎญ็ปƒ +- ๆ‰€ๆœ‰ PyTorch ้ฃŽๆ ผ็š„ ImageNet ้ข„่ฎญ็ปƒ็ฝ‘็ปœ็”ฑๆˆ‘ไปฌ่‡ชๅทฑ่ฎญ็ปƒ๏ผŒๅ’Œ [่ฎบๆ–‡](https://arxiv.org/pdf/1812.01187.pdf) ไฟๆŒไธ€่‡ดใ€‚ + ๆˆ‘ไปฌ็š„ ResNet ็ฝ‘็ปœๆ˜ฏๅŸบไบŽ ResNetV1c ็š„ๅ˜็ง๏ผŒๅœจ่ฟ™้‡Œ่พ“ๅ…ฅๅฑ‚็š„ 7x7 ๅท็งฏ่ขซ 3ไธช 3x3 ๅ–ไปฃ +- ไธบไบ†ๅœจไธๅŒ็š„็กฌไปถไธŠไฟๆŒไธ€่‡ด๏ผŒๆˆ‘ไปฌไปฅ `torch.cuda.max_memory_allocated()` ็š„ๆœ€ๅคงๅ€ผไฝœไธบ GPU ๅ ็”จ็Ž‡๏ผŒๅŒๆ—ถ่ฎพ็ฝฎ `torch.backends.cudnn.benchmark=False`ใ€‚ + ๆณจๆ„๏ผŒ่ฟ™้€šๅธธๆฏ” `nvidia-smi` ๆ˜พ็คบ็š„่ฆๅฐ‘ +- ๆˆ‘ไปฌไปฅ็ฝ‘็ปœ forward ๅ’ŒๅŽๅค„็†็š„ๆ—ถ้—ดๅŠ ๅ’ŒไฝœไธบๆŽจ็†ๆ—ถ้—ด๏ผŒ้™คๅŽปๆ•ฐๆฎๅŠ ่ฝฝๆ—ถ้—ดใ€‚ๆˆ‘ไปฌไฝฟ็”จ่„šๆœฌ `tools/benchmark.py` ๆฅ่Žทๅ–ๆŽจ็†ๆ—ถ้—ด๏ผŒๅฎƒๅœจ `torch.backends.cudnn.benchmark=False` ็š„่ฎพๅฎšไธ‹๏ผŒ่ฎก็ฎ— 200 ๅผ ๅ›พ็‰‡็š„ๅนณๅ‡ๆŽจ็†ๆ—ถ้—ด +- ๅœจๆก†ๆžถไธญ๏ผŒๆœ‰ไธค็งๆŽจ็†ๆจกๅผ + - `slide` ๆจกๅผ๏ผˆๆป‘ๅŠจๆจกๅผ๏ผ‰๏ผšๆต‹่ฏ•็š„้…็ฝฎๆ–‡ไปถๅญ—ๆฎต `test_cfg` ไผšๆ˜ฏ `dict(mode='slide', crop_size=(769, 769), stride=(513, 513))`. + ๅœจ่ฟ™ไธชๆจกๅผไธ‹๏ผŒไปŽๅŽŸๅ›พไธญ่ฃๅ‰ชๅคšไธชๅฐๅ›พๅˆ†ๅˆซ่พ“ๅ…ฅ็ฝ‘็ปœไธญ่ฟ›่กŒๆŽจ็†ใ€‚ๅฐๅ›พ็š„ๅคงๅฐๅ’Œๅฐๅ›พไน‹้—ด็š„่ท็ฆป็”ฑ `crop_size` ๅ’Œ `stride` ๅ†ณๅฎš๏ผŒ้‡ๅˆๅŒบๅŸŸไผš่ฟ›่กŒๅนณๅ‡ + - `whole` ๆจกๅผ ๏ผˆๅ…จๅ›พๆจกๅผ๏ผ‰๏ผšๆต‹่ฏ•็š„้…็ฝฎๆ–‡ไปถๅญ—ๆฎต `test_cfg` ไผšๆ˜ฏ `dict(mode='whole')`. ๅœจ่ฟ™ไธชๆจกๅผไธ‹๏ผŒๅ…จๅ›พไผš่ขซ็›ดๆŽฅ่พ“ๅ…ฅๅˆฐ็ฝ‘็ปœไธญ่ฟ›่กŒๆŽจ็†ใ€‚ + ๅฏนไบŽ 769x769 ไธ‹่ฎญ็ปƒ็š„ๆจกๅž‹๏ผŒๆˆ‘ไปฌ้ป˜่ฎคไฝฟ็”จ `slide` ่ฟ›่กŒๆŽจ็†๏ผŒๅ…ถไฝ™ๆจกๅž‹็”จ `whole` ่ฟ›่กŒๆŽจ็† +- ๅฏนไบŽ่พ“ๅ…ฅๅคงๅฐไธบ 8x+1 ๏ผˆๆฏ”ๅฆ‚769๏ผ‰๏ผŒๆˆ‘ไปฌไฝฟ็”จ `align_corners=True`ใ€‚ๅ…ถไฝ™ๆƒ…ๅ†ต๏ผŒๅฏนไบŽ่พ“ๅ…ฅๅคงๅฐไธบ 8x (ๆฏ”ๅฆ‚ 512๏ผŒ1024)๏ผŒๆˆ‘ไปฌไฝฟ็”จ `align_corners=False` + +## ๅŸบ็บฟ + +### FCN + +่ฏทๅ‚่€ƒ [FCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fcn) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### PSPNet + +่ฏทๅ‚่€ƒ [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/pspnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### DeepLabV3 + +่ฏทๅ‚่€ƒ [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### PSANet + +่ฏทๅ‚่€ƒ [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/psanet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### DeepLabV3+ + +่ฏทๅ‚่€ƒ [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3plus) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### UPerNet + +่ฏทๅ‚่€ƒ [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/upernet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### NonLocal Net + +่ฏทๅ‚่€ƒ [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/nlnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### EncNet + +่ฏทๅ‚่€ƒ [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/encnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### CCNet + +่ฏทๅ‚่€ƒ [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ccnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### DANet + +่ฏทๅ‚่€ƒ [DANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/danet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### APCNet + +่ฏทๅ‚่€ƒ [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/apcnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### HRNet + +่ฏทๅ‚่€ƒ [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/hrnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### GCNet + +่ฏทๅ‚่€ƒ [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/gcnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### DMNet + +่ฏทๅ‚่€ƒ [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dmnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### ANN + +่ฏทๅ‚่€ƒ [ANN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ann) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### OCRNet + +่ฏทๅ‚่€ƒ [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ocrnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### Fast-SCNN + +่ฏทๅ‚่€ƒ [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastscnn) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### ResNeSt + +่ฏทๅ‚่€ƒ [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/resnest) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### Semantic FPN + +่ฏทๅ‚่€ƒ [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/semfpn) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### PointRend + +่ฏทๅ‚่€ƒ [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/point_rend) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### MobileNetV2 + +่ฏทๅ‚่€ƒ [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v2) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### MobileNetV3 + +่ฏทๅ‚่€ƒ [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v3) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### EMANet + +่ฏทๅ‚่€ƒ [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### DNLNet + +่ฏทๅ‚่€ƒ [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### CGNet + +่ฏทๅ‚่€ƒ [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +### Mixed Precision (FP16) Training + +่ฏทๅ‚่€ƒ [Mixed Precision (FP16) Training ๅœจ BiSeNetV2 ่ฎญ็ปƒ็š„ๆ ทไพ‹](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv2/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes.py) ่Žทๅพ—่ฏฆ็ป†ไฟกๆฏใ€‚ + +## ้€Ÿๅบฆๆ ‡ๅฎš๏ผˆๅพ…ๆ›ดๆ–ฐ๏ผ‰ + +### ็กฌไปถ + +- 8 NVIDIA Tesla V100 (32G) GPUs +- Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz + +### ่ฝฏไปถ็Žฏๅขƒ + +- Python 3.7 +- PyTorch 1.5 +- CUDA 10.1 +- CUDNN 7.6.03 +- NCCL 2.4.08 + +### ่ฎญ็ปƒ้€Ÿๅบฆ + +ไธบไบ†ๅ…ฌๅนณๆฏ”่พƒ๏ผŒๆˆ‘ไปฌๅ…จ้ƒจไฝฟ็”จ ResNet-101V1c ่ฟ›่กŒๆ ‡ๅฎšใ€‚่พ“ๅ…ฅๅคงๅฐไธบ 1024x512๏ผŒๆ‰น้‡ๆ ทๆœฌๆ•ฐไธบ 2ใ€‚ + +่ฎญ็ปƒ้€Ÿๅบฆๅฆ‚ไธ‹่กจ๏ผŒๆŒ‡ๆ ‡ไธบๆฏๆฌก่ฟญไปฃ็š„ๆ—ถ้—ด๏ผŒไปฅ็ง’ไธบๅ•ไฝ๏ผŒ่ถŠไฝŽ่ถŠๅฟซใ€‚ + +| Implementation | PSPNet (s/iter) | DeepLabV3+ (s/iter) | +| --------------------------------------------------------------------------- | --------------- | ------------------- | +| [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) | **0.83** | **0.85** | +| [SegmenTron](https://github.com/LikeLy-Journey/SegmenTron) | 0.84 | 0.85 | +| [CASILVision](https://github.com/CSAILVision/semantic-segmentation-pytorch) | 1.15 | N/A | +| [vedaseg](https://github.com/Media-Smart/vedaseg) | 0.95 | 1.25 | + +ๆณจๆ„๏ผšDeepLabV3+ ็š„่พ“ๅ‡บๆญฅ้•ฟไธบ 8ใ€‚ diff --git a/mmsegmentation/docs/zh_cn/modelzoo_statistics.md b/mmsegmentation/docs/zh_cn/modelzoo_statistics.md new file mode 100644 index 0000000..b057575 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/modelzoo_statistics.md @@ -0,0 +1,102 @@ +# ๆจกๅž‹ๅบ“็ปŸ่ฎกๆ•ฐๆฎ + +- ่ฎบๆ–‡ๆ•ฐ้‡: 47 + + - ALGORITHM: 36 + - BACKBONE: 11 + +- ๆจกๅž‹ๆ•ฐ้‡: 612 + + - \[ALGORITHM\] [ANN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ann) (16 ckpts) + + - \[ALGORITHM\] [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/apcnet) (12 ckpts) + + - \[BACKBONE\] [BEiT](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/beit) (2 ckpts) + + - \[ALGORITHM\] [BiSeNetV1](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv1) (11 ckpts) + + - \[ALGORITHM\] [BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv2) (4 ckpts) + + - \[ALGORITHM\] [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ccnet) (16 ckpts) + + - \[ALGORITHM\] [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) (2 ckpts) + + - \[BACKBONE\] [ConvNeXt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/convnext) (6 ckpts) + + - \[ALGORITHM\] [DANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/danet) (16 ckpts) + + - \[ALGORITHM\] [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3) (41 ckpts) + + - \[ALGORITHM\] [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3plus) (42 ckpts) + + - \[ALGORITHM\] [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dmnet) (12 ckpts) + + - \[ALGORITHM\] [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) (12 ckpts) + + - \[ALGORITHM\] [DPT](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dpt) (1 ckpts) + + - \[ALGORITHM\] [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet) (4 ckpts) + + - \[ALGORITHM\] [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/encnet) (12 ckpts) + + - \[ALGORITHM\] [ERFNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/erfnet) (1 ckpts) + + - \[ALGORITHM\] [FastFCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastfcn) (12 ckpts) + + - \[ALGORITHM\] [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastscnn) (1 ckpts) + + - \[ALGORITHM\] [FCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fcn) (41 ckpts) + + - \[ALGORITHM\] [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/gcnet) (16 ckpts) + + - \[BACKBONE\] [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/hrnet) (37 ckpts) + + - \[ALGORITHM\] [ICNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/icnet) (12 ckpts) + + - \[ALGORITHM\] [ISANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/isanet) (16 ckpts) + + - \[ALGORITHM\] [K-Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/knet) (7 ckpts) + + - \[BACKBONE\] [MAE](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mae) (1 ckpts) + + - \[ALGORITHM\] [Mask2Former](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mask2former) (13 ckpts) + + - \[ALGORITHM\] [MaskFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/maskformer) (4 ckpts) + + - \[BACKBONE\] [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v2) (8 ckpts) + + - \[BACKBONE\] [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v3) (4 ckpts) + + - \[ALGORITHM\] [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/nonlocal_net) (16 ckpts) + + - \[ALGORITHM\] [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ocrnet) (24 ckpts) + + - \[ALGORITHM\] [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/point_rend) (4 ckpts) + + - \[BACKBONE\] [PoolFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/poolformer) (5 ckpts) + + - \[ALGORITHM\] [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/psanet) (16 ckpts) + + - \[ALGORITHM\] [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/pspnet) (54 ckpts) + + - \[BACKBONE\] [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/resnest) (8 ckpts) + + - \[ALGORITHM\] [SegFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/segformer) (13 ckpts) + + - \[ALGORITHM\] [Segmenter](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/segmenter) (5 ckpts) + + - \[ALGORITHM\] [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/sem_fpn) (4 ckpts) + + - \[ALGORITHM\] [SETR](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/setr) (7 ckpts) + + - \[ALGORITHM\] [STDC](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/stdc) (4 ckpts) + + - \[BACKBONE\] [Swin Transformer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/swin) (6 ckpts) + + - \[BACKBONE\] [Twins](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/twins) (12 ckpts) + + - \[ALGORITHM\] [UNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/unet) (25 ckpts) + + - \[ALGORITHM\] [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/upernet) (16 ckpts) + + - \[BACKBONE\] [Vision Transformer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/vit) (11 ckpts) diff --git a/mmsegmentation/docs/zh_cn/notes/faq.md b/mmsegmentation/docs/zh_cn/notes/faq.md new file mode 100644 index 0000000..aa99c25 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/notes/faq.md @@ -0,0 +1,125 @@ +# ๅธธ่ง้—ฎ้ข˜่งฃ็ญ”๏ผˆFAQ๏ผ‰ + +ๆˆ‘ไปฌๅœจ่ฟ™้‡Œๅˆ—ๅ‡บไบ†ไฝฟ็”จๆ—ถ็š„ไธ€ไบ›ๅธธ่ง้—ฎ้ข˜ๅŠๅ…ถ็›ธๅบ”็š„่งฃๅ†ณๆ–นๆกˆใ€‚ ๅฆ‚ๆžœๆ‚จๅ‘็Žฐๆœ‰ไธ€ไบ›้—ฎ้ข˜่ขซ้—ๆผ๏ผŒ่ฏท้šๆ—ถๆ PR ไธฐๅฏŒ่ฟ™ไธชๅˆ—่กจใ€‚ ๅฆ‚ๆžœๆ‚จๆ— ๆณ•ๅœจๆญค่Žทๅพ—ๅธฎๅŠฉ๏ผŒ่ฏทไฝฟ็”จ [issue ๆจกๆฟ](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/.github/ISSUE_TEMPLATE/error-report.md/)ๅˆ›ๅปบ้—ฎ้ข˜๏ผŒไฝ†ๆ˜ฏ่ฏทๅœจๆจกๆฟไธญๅกซๅ†™ๆ‰€ๆœ‰ๅฟ…ๅกซไฟกๆฏ๏ผŒ่ฟ™ๆœ‰ๅŠฉไบŽๆˆ‘ไปฌๆ›ดๅฟซๅฎšไฝ้—ฎ้ข˜ใ€‚ + +## ๅฎ‰่ฃ… + +ๅ…ผๅฎน็š„ MMSegmentation ๅ’Œ MMCV ็‰ˆๆœฌๅฆ‚ไธ‹ใ€‚่ฏทๅฎ‰่ฃ…ๆญฃ็กฎ็‰ˆๆœฌ็š„ MMCV ไปฅ้ฟๅ…ๅฎ‰่ฃ…้—ฎ้ข˜ใ€‚ + +| MMSegmentation version | MMCV version | MMEngine version | MMClassification (optional) version | MMDetection (optional) version | +| :--------------------: | :----------------------------: | :---------------: | :---------------------------------: | :----------------------------: | +| dev-1.x branch | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| main branch | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.2.2 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.2.1 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.2.0 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.1.2 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.1.1 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.1.0 | mmcv >= 2.0.0 | MMEngine >= 0.7.4 | mmpretrain>=1.0.0rc7 | mmdet >= 3.0.0 | +| 1.0.0 | mmcv >= 2.0.0rc4 | MMEngine >= 0.7.1 | mmcls==1.0.0rc6 | mmdet >= 3.0.0 | +| 1.0.0rc6 | mmcv >= 2.0.0rc4 | MMEngine >= 0.5.0 | mmcls>=1.0.0rc0 | mmdet >= 3.0.0rc6 | +| 1.0.0rc5 | mmcv >= 2.0.0rc4 | MMEngine >= 0.2.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc6 | +| 1.0.0rc4 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | +| 1.0.0rc3 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | +| 1.0.0rc2 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | +| 1.0.0rc1 | mmcv >= 2.0.0rc1, \<=2.0.0rc3> | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | Not required | +| 1.0.0rc0 | mmcv >= 2.0.0rc1, \<=2.0.0rc3> | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | Not required | + +ๅฆ‚ๆžœๆ‚จๅทฒ็ปๅฎ‰่ฃ…ไบ†็‰ˆๆœฌไธๅˆ้€‚็š„ mmcv๏ผŒ่ฏทๅ…ˆ่ฟ่กŒ`pip uninstall mmcv`ๅธ่ฝฝๅทฒๅฎ‰่ฃ…็š„ mmcv๏ผŒๅฆ‚ๆ‚จๅ…ˆๅ‰ๅฎ‰่ฃ…็š„ไธบ mmcv-full๏ผˆๅญ˜ๅœจไบŽ OpenMMLab 1.x๏ผ‰๏ผŒ่ฏท่ฟ่กŒ`pip uninstall mmcv-full`่ฟ›่กŒๅธ่ฝฝใ€‚ + +- ๅฆ‚ๅ‡บ็Žฐ "No module named 'mmcv'" + 1. ไฝฟ็”จ`pip uninstall mmcv`ๅธ่ฝฝ็Žฏๅขƒไธญ็Žฐๆœ‰็š„ mmcv + 2. ๆŒ‰็…ง[ๅฎ‰่ฃ…่ฏดๆ˜Ž](../get_started.md)ๅฎ‰่ฃ…ๅฏนๅบ”็š„ mmcv + +## ๅฆ‚ไฝ•่Žท็Ÿฅๆจกๅž‹่ฎญ็ปƒๆ—ถ้œ€่ฆ็š„ๆ˜พๅกๆ•ฐ้‡ + +- ็œ‹ๆจกๅž‹็š„ config ๆ–‡ไปถๅ‘ฝๅใ€‚ๅฏไปฅๅ‚่€ƒ[ไบ†่งฃ้…็ฝฎๆ–‡ไปถ](../user_guides/1_config.md)ไธญ็š„`้…็ฝฎๆ–‡ไปถๅ‘ฝๅ้ฃŽๆ ผ`้ƒจๅˆ†ใ€‚ๆฏ”ๅฆ‚๏ผŒๅฏนไบŽๅๅญ—ไธบ`segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py`็š„ config ๆ–‡ไปถ๏ผŒ`8xb1`ไปฃ่กจ่ฎญ็ปƒๅ…ถๅฏนๅบ”็š„ๆจกๅž‹้œ€่ฆ็š„ๅกๆ•ฐไธบ 8๏ผŒๆฏๅผ ๅกไธญ็š„ batch size ไธบ 1ใ€‚ +- ็œ‹ๆจกๅž‹็š„ log ๆ–‡ไปถใ€‚็‚นๅผ€่ฏฅๆจกๅž‹็š„ log ๆ–‡ไปถ๏ผŒๅนถๅœจๅ…ถไธญๆœ็ดข`nGPU`๏ผŒๅœจ`nGPU`ๅŽ็š„ๆ•ฐๅญ—ไธชๆ•ฐๅณ่ฎญ็ปƒๆ—ถๆ‰€้œ€็š„ๅกๆ•ฐใ€‚ๆฏ”ๅฆ‚๏ผŒๅœจ log ๆ–‡ไปถไธญๆœ็ดข`nGPU`ๅพ—ๅˆฐ`nGPU 0,1,2,3,4,5,6,7`็š„่ฎฐๅฝ•๏ผŒๅˆ™่ฏดๆ˜Ž่ฎญ็ปƒ่ฏฅๆจกๅž‹้œ€่ฆไฝฟ็”จๅ…ซๅผ ๅกใ€‚ + +## auxiliary head ๆ˜ฏไป€ไนˆ + +็ฎ€ๅ•ๆฅ่ฏด๏ผŒ่ฟ™ๆ˜ฏไธ€ไธชๆ้ซ˜ๅ‡†็กฎ็Ž‡็š„ๆทฑๅบฆ็›‘็ฃๆŠ€ๆœฏใ€‚ๅœจ่ฎญ็ปƒ้˜ถๆฎต๏ผŒ`decode_head`็”จไบŽ่พ“ๅ‡บ่ฏญไน‰ๅˆ†ๅ‰ฒ็š„็ป“ๆžœ๏ผŒ`auxiliary_head` ๅชๆ˜ฏๅขžๅŠ ไบ†ไธ€ไธช่พ…ๅŠฉๆŸๅคฑ๏ผŒๅ…ถไบง็”Ÿ็š„ๅˆ†ๅ‰ฒ็ป“ๆžœๅฏนไฝ ็š„ๆจกๅž‹็ป“ๆžœๆฒกๆœ‰ๅฝฑๅ“๏ผŒไป…ๅœจๅœจ่ฎญ็ปƒไธญ่ตทไฝœ็”จใ€‚ๆ‚จๅฏไปฅ้˜…่ฏป่ฟ™็ฏ‡[่ฎบๆ–‡](https://arxiv.org/pdf/1612.01105.pdf)ไบ†่งฃๆ›ดๅคšไฟกๆฏใ€‚ + +## ่ฟ่กŒๆต‹่ฏ•่„šๆœฌๆ—ถๅฆ‚ไฝ•่พ“ๅ‡บ็ป˜ๅˆถๅˆ†ๅ‰ฒๆŽฉ่†œ็š„ๅ›พๅƒ + +ๅœจๆต‹่ฏ•่„šๆœฌไธญ๏ผŒๆˆ‘ไปฌๆไพ›ไบ†`--out`ๅ‚ๆ•ฐๆฅๆŽงๅˆถๆ˜ฏๅฆ่พ“ๅ‡บไฟๅญ˜้ข„ๆต‹็š„ๅˆ†ๅ‰ฒๆŽฉ่†œๅ›พๅƒใ€‚ๆ‚จๅฏไปฅ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค่พ“ๅ‡บๆต‹่ฏ•็ป“ๆžœ๏ผš + +```shell +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --out ${OUTPUT_DIR} +``` + +ๆ›ดๅคš็”จไพ‹็ป†่Š‚ๅฏๆŸฅ้˜…[ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/user_guides/4_train_test.md#%E6%B5%8B%E8%AF%95%E5%B9%B6%E4%BF%9D%E5%AD%98%E5%88%86%E5%89%B2%E7%BB%93%E6%9E%9C)๏ผŒ[PR #2712](https://github.com/open-mmlab/mmsegmentation/pull/2712) ไปฅๅŠ[่ฟ็งปๆ–‡ๆกฃ](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/migration/interface.md#%E6%B5%8B%E8%AF%95%E5%90%AF%E5%8A%A8)ไบ†่งฃ็›ธๅ…ณ่ฏดๆ˜Žใ€‚ + +## ๅฆ‚ไฝ•ๅค„็†ไบŒๅ€ผๅˆ†ๅ‰ฒไปปๅŠก? + +MMSegmentation ไฝฟ็”จ `num_classes` ๅ’Œ `out_channels` ๆฅๆŽงๅˆถๆจกๅž‹ๆœ€ๅŽไธ€ๅฑ‚ `self.conv_seg` ็š„่พ“ๅ‡บใ€‚ๆ›ดๅคš็ป†่Š‚ๅฏไปฅๅ‚่€ƒ [่ฟ™้‡Œ](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/decode_heads/decode_head.py)ใ€‚ + +`num_classes` ๅบ”่ฏฅๅ’Œๆ•ฐๆฎ้›†ๆœฌ่บซ็ฑปๅˆซไธชๆ•ฐไธ€่‡ด๏ผŒๅฝ“ๆ˜ฏไบŒๅ€ผๅˆ†ๅ‰ฒๆ—ถ๏ผŒๆ•ฐๆฎ้›†ๅชๆœ‰ๅ‰ๆ™ฏๅ’Œ่ƒŒๆ™ฏไธค็ฑป๏ผŒๆ‰€ไปฅ `num_classes` ไธบ 2. `out_channels` ๆŽงๅˆถๆจกๅž‹ๆœ€ๅŽไธ€ๅฑ‚็š„่พ“ๅ‡บ็š„้€š้“ๆ•ฐ๏ผŒ้€šๅธธๅ’Œ `num_classes` ็›ธ็ญ‰๏ผŒไฝ†ๅฝ“ไบŒๅ€ผๅˆ†ๅ‰ฒๆ—ถๅ€™๏ผŒๅฏไปฅๆœ‰ไธค็งๅค„็†ๆ–นๆณ•, ๅˆ†ๅˆซๆ˜ฏ๏ผš + +- ่ฎพ็ฝฎ `out_channels=2`๏ผŒๅœจ่ฎญ็ปƒๆ—ถไปฅ Cross Entropy Loss ไฝœไธบๆŸๅคฑๅ‡ฝๆ•ฐ๏ผŒๅœจๆŽจ็†ๆ—ถไฝฟ็”จ `F.softmax()` ๅฝ’ไธ€ๅŒ– logits ๅ€ผ๏ผŒ็„ถๅŽ้€š่ฟ‡ `argmax()` ๅพ—ๅˆฐๆฏไธชๅƒ็ด ็š„้ข„ๆต‹็ป“ๆžœใ€‚ + +- ่ฎพ็ฝฎ `out_channels=1`๏ผŒๅœจ่ฎญ็ปƒๆ—ถไปฅ Binary Cross Entropy Loss ไฝœไธบๆŸๅคฑๅ‡ฝๆ•ฐ๏ผŒๅœจๆŽจ็†ๆ—ถไฝฟ็”จ `F.sigmoid()` ๅ’Œ `threshold` ๅพ—ๅˆฐ้ข„ๆต‹็ป“ๆžœ๏ผŒ`threshold` ้ป˜่ฎคไธบ 0.3ใ€‚ + +ๅฏนไบŽๅฎž็ŽฐไธŠ่ฟฐไธค็ง่ฎก็ฎ—ไบŒๅ€ผๅˆ†ๅ‰ฒ็š„ๆ–นๆณ•๏ผŒ้œ€่ฆๅœจ `decode_head` ๅ’Œ `auxiliary_head` ็š„้…็ฝฎ้‡Œไฟฎๆ”นใ€‚ไธ‹้ขๆ˜ฏๅฏนๆ ทไพ‹ [pspnet_unet_s5-d16.py](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/_base_/models/pspnet_unet_s5-d16.py) ๅšๅ‡บ็š„ๅฏนๅบ”ไฟฎๆ”นใ€‚ + +- (1) `num_classes=2`, `out_channels=2` ๅนถๅœจ `CrossEntropyLoss` ้‡Œ้ข่ฎพ็ฝฎ `use_sigmoid=False`ใ€‚ + +```python +decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + num_classes=2, + out_channels=2, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + num_classes=2, + out_channels=2, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), +``` + +- (2) `num_classes=2`, `out_channels=1` ๅนถๅœจ `CrossEntropyLoss` ้‡Œ้ข่ฎพ็ฝฎ `use_sigmoid=True`. + +```python +decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + num_classes=2, + out_channels=1, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), +auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + num_classes=2, + out_channels=1, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), +``` + +## `reduce_zero_label` ็š„ไฝœ็”จ + +ๆ•ฐๆฎ้›†ไธญ `reduce_zero_label` ๅ‚ๆ•ฐ็ฑปๅž‹ไธบๅธƒๅฐ”็ฑปๅž‹๏ผŒ้ป˜่ฎคไธบ False๏ผŒๅฎƒ็š„ๅŠŸ่ƒฝๆ˜ฏไธบไบ†ๅฟฝ็•ฅๆ•ฐๆฎ้›† label 0ใ€‚ๅ…ทไฝ“ๅšๆณ•ๆ˜ฏๅฐ† label 0 ๆ”นไธบ 255๏ผŒๅ…ถไฝ™ label ็›ธๅบ”็ผ–ๅทๅ‡ 1๏ผŒๅŒๆ—ถ decode head ้‡Œๅฐ† 255 ่ฎพไธบ ignore index๏ผŒๅณไธๅ‚ไธŽ loss ่ฎก็ฎ—ใ€‚ +ไปฅไธ‹ๆ˜ฏ `reduce_zero_label` ๅ…ทไฝ“ๅฎž็Žฐ้€ป่พ‘: + +```python +if self.reduce_zero_label: + # avoid using underflow conversion + gt_semantic_seg[gt_semantic_seg == 0] = 255 + gt_semantic_seg = gt_semantic_seg - 1 + gt_semantic_seg[gt_semantic_seg == 254] = 255 +``` + +ๅ…ณไบŽๆ‚จ็š„ๆ•ฐๆฎ้›†ๆ˜ฏๅฆ้œ€่ฆไฝฟ็”จ reduce_zero_label๏ผŒๆœ‰ไปฅไธ‹ไธค็ฑปๆƒ…ๅ†ต๏ผš + +- ไพ‹ๅฆ‚ๅœจ [Potsdam](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/user_guides/2_dataset_prepare.md#isprs-potsdam) ๆ•ฐๆฎ้›†ไธŠ๏ผŒๆœ‰ 0-ไธ้€ๆฐด้ขใ€1-ๅปบ็ญ‘ใ€2-ไฝŽ็Ÿฎๆค่ขซใ€3-ๆ ‘ใ€4-ๆฑฝ่ฝฆใ€5-ๆ‚ไนฑ๏ผŒๅ…ญ็ฑปใ€‚ไฝ†่ฏฅๆ•ฐๆฎ้›†ๆไพ›ไบ†ไธค็ง RGB ๆ ‡็ญพ๏ผŒไธ€็งไธบๅ›พๅƒ่พน็ผ˜ๅค„ๆœ‰้ป‘่‰ฒๅƒ็ด ็š„ๆ ‡็ญพ๏ผŒๅฆไธ€็งๆ˜ฏๆฒกๆœ‰้ป‘่‰ฒ่พน็ผ˜็š„ๆ ‡็ญพใ€‚ๅฏนไบŽๆœ‰้ป‘่‰ฒ่พน็ผ˜็š„ๆ ‡็ญพ๏ผŒๅœจ [dataset_converters.py](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/tools/dataset_converters/potsdam.py)ไธญ๏ผŒๅ…ถๅฐ†้ป‘่‰ฒ่พน็ผ˜่ฝฌๆขไธบ label 0๏ผŒๅ…ถไฝ™ๆ ‡็ญพๅˆ†ๅˆซไธบ 1-ไธ้€ๆฐด้ขใ€2-ๅปบ็ญ‘ใ€3-ไฝŽ็Ÿฎๆค่ขซใ€4-ๆ ‘ใ€5-ๆฑฝ่ฝฆใ€6-ๆ‚ไนฑ๏ผŒ้‚ฃไนˆๆญคๆ—ถ๏ผŒๅฐฑๅบ”่ฏฅๅœจๆ•ฐๆฎ้›† [potsdam.py](https://github.com/open-mmlab/mmsegmentation/blob/ff95416c3b5ce8d62b9289f743531398efce534f/mmseg/datasets/potsdam.py#L23) ไธญๅฐ†`reduce_zero_label=True`ใ€‚ๅฆ‚ๆžœไฝฟ็”จ็š„ๆ˜ฏๆฒกๆœ‰้ป‘่‰ฒ่พน็ผ˜็š„ๆ ‡็ญพ๏ผŒ้‚ฃไนˆ mask label ไธญๅชๆœ‰ 0-5๏ผŒๆญคๆ—ถๅฐฑๅบ”่ฏฅไฝฟ`reduce_zero_label=False`ใ€‚้œ€่ฆ็ป“ๅˆๆ‚จ็š„ๅฎž้™…ๆƒ…ๅ†ตๆฅไฝฟ็”จใ€‚ +- ไพ‹ๅฆ‚ๅœจ็ฌฌ 0 ็ฑปไธบ background ็ฑปๅˆซ็š„ๆ•ฐๆฎ้›†ไธŠ๏ผŒๅฆ‚ๆžœๆ‚จๆœ€็ปˆๆ˜ฏ้œ€่ฆๅฐ†่ƒŒๆ™ฏๅ’Œๆ‚จ็š„ๅ…ถไฝ™็ฑปๅˆซๅˆ†ๅผ€ๆ—ถ๏ผŒๆ˜ฏไธ้œ€่ฆไฝฟ็”จ`reduce_zero_label`็š„๏ผŒๆญคๆ—ถๅœจๆ•ฐๆฎ้›†ไธญๅบ”่ฏฅๅฐ†ๅ…ถ่ฎพ็ฝฎไธบ`reduce_zero_label=False` + +**ๆณจๆ„:** ไฝฟ็”จ `reduce_zero_label` ่ฏท็กฎ่ฎคๆ•ฐๆฎ้›†ๅŽŸๅง‹็ฑปๅˆซไธชๆ•ฐ๏ผŒๅฆ‚ๆžœๅชๆœ‰ไธค็ฑป๏ผŒ้œ€่ฆๅ…ณ้—ญ `reduce_zero_label` ๅณ่ฎพ็ฝฎ `reduce_zero_label=False`ใ€‚ diff --git a/mmsegmentation/docs/zh_cn/overview.md b/mmsegmentation/docs/zh_cn/overview.md new file mode 100644 index 0000000..ed14795 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/overview.md @@ -0,0 +1,75 @@ +# ๆฆ‚่ฟฐ + +ๆœฌ็ซ ่Š‚ๅ‘ๆ‚จไป‹็ป MMSegmentation ๆก†ๆžถไปฅๅŠ่ฏญไน‰ๅˆ†ๅ‰ฒ็›ธๅ…ณ็š„ๅŸบๆœฌๆฆ‚ๅฟตใ€‚ๆˆ‘ไปฌ่ฟ˜ๆไพ›ไบ†ๅ…ณไบŽ MMSegmentation ็š„่ฏฆ็ป†ๆ•™็จ‹้“พๆŽฅใ€‚ + +## ไป€ไนˆๆ˜ฏ่ฏญไน‰ๅˆ†ๅ‰ฒ๏ผŸ + +่ฏญไน‰ๅˆ†ๅ‰ฒๆ˜ฏๅฐ†ๅ›พๅƒไธญๅฑžไบŽๅŒไธ€็›ฎๆ ‡็ฑปๅˆซ็š„้ƒจๅˆ†่š็ฑปๅœจไธ€่ตท็š„ไปปๅŠกใ€‚ๅฎƒไนŸๆ˜ฏไธ€็งๅƒ็ด ็บง้ข„ๆต‹ไปปๅŠก๏ผŒๅ› ไธบๅ›พๅƒไธญ็š„ๆฏไธ€ไธชๅƒ็ด ้ƒฝๅฐ†ๆ นๆฎ็ฑปๅˆซ่ฟ›่กŒๅˆ†็ฑปใ€‚่ฏฅไปปๅŠก็š„ไธ€ไบ›็คบไพ‹ๅŸบๅ‡†ๆœ‰ [Cityscapes](https://www.cityscapes-dataset.com/benchmarks/), [PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/) ๅ’Œ [ADE20K](https://groups.csail.mit.edu/vision/datasets/ADE20K/) ใ€‚้€šๅธธ็”จๅนณๅ‡ไบคๅนถๆฏ” (Mean IoU) ๅ’Œๅƒ็ด ๅ‡†็กฎ็Ž‡ (Pixel Accuracy) ่ฟ™ไธคไธชๆŒ‡ๆ ‡ๆฅ่ฏ„ไผฐๆจกๅž‹ใ€‚ + +## ไป€ไนˆๆ˜ฏ MMSegmentation? + +MMSegmentation ๆ˜ฏไธ€ไธชๅทฅๅ…ท็ฎฑ๏ผŒๅฎƒไธบ่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠก็š„็ปŸไธ€ๅฎž็Žฐๅ’Œๆจกๅž‹่ฏ„ไผฐๆไพ›ไบ†ไธ€ไธชๆก†ๆžถ๏ผŒๅนถไธ”้ซ˜่ดจ้‡ๅฎž็Žฐไบ†ๅธธ็”จ็š„่ฏญไน‰ๅˆ†ๅ‰ฒๆ–นๆณ•ๅ’Œๆ•ฐๆฎ้›†ใ€‚ + +MMSeg ไธป่ฆๅŒ…ๅซไบ† apis, structures, datasets, models, engine, evaluation ๅ’Œ visualization ่ฟ™ไธƒไธชไธป่ฆ้ƒจๅˆ†ใ€‚ + +- **apis** ๆไพ›ไบ†ๆจกๅž‹ๆŽจ็†็š„้ซ˜็บงapi + +- **structures** ๆไพ›ไบ†ๅˆ†ๅ‰ฒไปปๅŠก็š„ๆ•ฐๆฎ็ป“ๆž„ `SegDataSample` + +- **datasets** ๆ”ฏๆŒ็”จไบŽ่ฏญไน‰ๅˆ†ๅ‰ฒ็š„ๅคš็งๆ•ฐๆฎ้›† + + - **transforms** ๅŒ…ๅซๅคš็งๆ•ฐๆฎๅขžๅผบๅ˜ๆข + +- **models** ๆ˜ฏๅˆ†ๅ‰ฒๅ™จๆœ€้‡่ฆ็š„้ƒจๅˆ†๏ผŒๅŒ…ๅซไบ†ๅˆ†ๅ‰ฒๅ™จ็š„ไธๅŒ็ป„ไปถ + + - **segmentors** ๅฎšไน‰ไบ†ๆ‰€ๆœ‰ๅˆ†ๅ‰ฒๆจกๅž‹็ฑป + - **data_preprocessors** ็”จไบŽ้ข„ๅค„็†ๆจกๅž‹็š„่พ“ๅ…ฅๆ•ฐๆฎ + - **backbones** ๅŒ…ๅซๅ„็ง้ชจๅนฒ็ฝ‘็ปœ๏ผŒๅฏๅฐ†ๅ›พๅƒๆ˜ ๅฐ„ไธบ็‰นๅพๅ›พ + - **necks** ๅŒ…ๅซๅ„็งๆจกๅž‹้ขˆ้ƒจ็ป„ไปถ๏ผŒ็”จไบŽ่ฟžๆŽฅๅˆ†ๅ‰ฒๅคดๅ’Œ้ชจๅนฒ็ฝ‘็ปœ + - **decode_heads** ๅŒ…ๅซๅ„็งๅˆ†ๅ‰ฒๅคด๏ผŒๅฐ†็‰นๅพๅ›พไฝœไธบ่พ“ๅ…ฅ๏ผŒๅนถ้ข„ๆต‹ๅˆ†ๅ‰ฒ็ป“ๆžœ + - **losses** ๅŒ…ๅซๅ„็งๆŸๅคฑๅ‡ฝๆ•ฐ + +- **engine** ๆ˜ฏ่ฟ่กŒๆ—ถ็ป„ไปถ็š„ไธ€้ƒจๅˆ†๏ผŒๆ‰ฉๅฑ•ไบ† [MMEngine](https://github.com/open-mmlab/mmengine) ็š„ๅŠŸ่ƒฝ + + - **optimizers** ๆไพ›ไบ†ไผ˜ๅŒ–ๅ™จๅ’Œไผ˜ๅŒ–ๅ™จๅฐ่ฃ… + - **hooks** ๆไพ›ไบ† runner ็š„ๅ„็ง้’ฉๅญ + +- **evaluation** ๆไพ›ไบ†่ฏ„ไผฐๆจกๅž‹ๆ€ง่ƒฝ็š„ไธๅŒๆŒ‡ๆ ‡ + +- **visualization** ๅˆ†ๅ‰ฒ็ป“ๆžœ็š„ๅฏ่ง†ๅŒ–ๅทฅๅ…ท + +## ๅฆ‚ไฝ•ไฝฟ็”จๆœฌๆŒ‡ๅ—๏ผŸ + +ไปฅไธ‹ๆ˜ฏ่ฏฆ็ป†ๆญฅ้ชค๏ผŒๅฐ†ๅธฆๆ‚จไธ€ๆญฅๆญฅๅญฆไน ๅฆ‚ไฝ•ไฝฟ็”จ MMSegmentation : + +1. ๆœ‰ๅ…ณๅฎ‰่ฃ…่ฏดๆ˜Ž๏ผŒ่ฏทๅ‚้˜… [ๅผ€ๅง‹ไฝ ็š„็ฌฌไธ€ๆญฅ](get_started.md)ใ€‚ + +2. ๅฏนไบŽๅˆๅญฆ่€…ๆฅ่ฏด๏ผŒMMSegmentation ๆ˜ฏๅผ€ๅง‹่ฏญไน‰ๅˆ†ๅ‰ฒไน‹ๆ—…็š„ๆœ€ๅฅฝ้€‰ๆ‹ฉ๏ผŒๅ› ไธบ่ฟ™้‡Œๅฎž็Žฐไบ†่ฎธๅคš SOTA ๆจกๅž‹ไปฅๅŠ็ปๅ…ธ็š„ๆจกๅž‹ [model](model_zoo.md) ใ€‚ๅฆๅค–๏ผŒๅฐ†ๅ„็ฑป็ป„ไปถๅ’Œ้ซ˜็บง API ็ตๅˆไฝฟ็”จ๏ผŒๅฏไปฅๆ›ดไพฟๆท็š„ๆ‰ง่กŒๅˆ†ๅ‰ฒไปปๅŠกใ€‚ๅ…ณไบŽ MMSegmentation ็š„ๅŸบๆœฌ็”จๆณ•๏ผŒ่ฏทๅ‚่€ƒไธ‹้ข็š„ๆ•™็จ‹๏ผš + + - [้…็ฝฎ](user_guides/1_config.md) + - [ๆ•ฐๆฎ้ข„ๅค„็†](user_guides/2_dataset_prepare.md) + - [ๆŽจ็†](user_guides/3_inference.md) + - [่ฎญ็ปƒๅ’Œๆต‹่ฏ•](user_guides/4_train_test.md) + +3. ๅฆ‚ๆžœไฝ ๆƒณไบ†่งฃ MMSegmentation ๅทฅไฝœ็š„ๅŸบๆœฌ็ฑปๅ’ŒๅŠŸ่ƒฝ๏ผŒ่ฏทๅ‚่€ƒไธ‹้ข็š„ๆ•™็จ‹ๆฅๆทฑๅ…ฅ็ ”็ฉถ๏ผš + + - [ๆ•ฐๆฎๆต](advanced_guides/data_flow.md) + - [็ป“ๆž„](advanced_guides/structures.md) + - [ๆจกๅž‹](advanced_guides/models.md) + - [ๆ•ฐๆฎ้›†](advanced_guides/datasets.md) + - [่ฏ„ไผฐ](advanced_guides/evaluation.md) + +4. MMSegmentation ไนŸไธบ็”จๆˆท่‡ชๅฎšไน‰ๅ’Œไธ€ไบ›ๅ‰ๆฒฟ็š„็ ”็ฉถๆไพ›ไบ†ๆ•™็จ‹๏ผŒ่ฏทๅ‚่€ƒไธ‹้ข็š„ๆ•™็จ‹ๆฅๅปบ็ซ‹ไฝ ่‡ชๅทฑ็š„ๅˆ†ๅ‰ฒ้กน็›ฎ๏ผš + + - [ๆทปๅŠ ๆ–ฐ็š„ๆจกๅž‹](advanced_guides/add_models.md) + - [ๆทปๅŠ ๆ–ฐ็š„ๆ•ฐๆฎ้›†](advanced_guides/add_datasets.md) + - [ๆทปๅŠ ๆ–ฐ็š„ transform](advanced_guides/add_transforms.md) + - [่‡ชๅฎšไน‰ runtime](advanced_guides/customize_runtime.md) + +5. ๅฆ‚ๆžœๆ‚จๆ›ด็†Ÿๆ‚‰ MMSegmentation v0.x , ไปฅไธ‹ๆ˜ฏ MMSegmentation v0.x ่ฟ็งปๅˆฐ v1.x ็š„ๆ–‡ๆกฃ + + - [่ฟ็งป](migration/index.rst) + +## ๅ‚่€ƒๆฅๆบ + +- https://paperswithcode.com/task/semantic-segmentation/codeless#task-home diff --git a/mmsegmentation/docs/zh_cn/stat.py b/mmsegmentation/docs/zh_cn/stat.py new file mode 100755 index 0000000..7a86302 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/stat.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +# Copyright (c) OpenMMLab. All rights reserved. +import functools as func +import glob +import os.path as osp +import re + +import numpy as np + +url_prefix = 'https://github.com/open-mmlab/mmsegmentation/blob/master/' + +files = sorted(glob.glob('../../configs/*/README.md')) + +stats = [] +titles = [] +num_ckpts = 0 + +for f in files: + url = osp.dirname(f.replace('../../', url_prefix)) + + with open(f) as content_file: + content = content_file.read() + + title = content.split('\n')[0].replace('#', '').strip() + ckpts = { + x.lower().strip() + for x in re.findall(r'https?://download.*\.pth', content) + if 'mmsegmentation' in x + } + if len(ckpts) == 0: + continue + + _papertype = [ + x for x in re.findall(r'', content) + ] + assert len(_papertype) > 0 + papertype = _papertype[0] + + paper = {(papertype, title)} + + titles.append(title) + num_ckpts += len(ckpts) + statsmsg = f""" +\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) +""" + stats.append((paper, ckpts, statsmsg)) + +allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) +msglist = '\n'.join(x for _, _, x in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# ๆจกๅž‹ๅบ“็ปŸ่ฎกๆ•ฐๆฎ + +* ่ฎบๆ–‡ๆ•ฐ้‡: {len(set(titles))} +{countstr} + +* ๆจกๅž‹ๆ•ฐ้‡: {num_ckpts} +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/mmsegmentation/docs/zh_cn/switch_language.md b/mmsegmentation/docs/zh_cn/switch_language.md new file mode 100644 index 0000000..f58efc4 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/switch_language.md @@ -0,0 +1,3 @@ +## English + +## ็ฎ€ไฝ“ไธญๆ–‡ diff --git a/mmsegmentation/docs/zh_cn/user_guides/1_config.md b/mmsegmentation/docs/zh_cn/user_guides/1_config.md new file mode 100644 index 0000000..dfcf0f9 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/1_config.md @@ -0,0 +1,577 @@ +# ๆ•™็จ‹1๏ผšไบ†่งฃ้…็ฝฎๆ–‡ไปถ + +ๆˆ‘ไปฌๅฐ†ๆจกๅ—ๅŒ–ๅ’Œ็ปงๆ‰ฟๆ€ง่ฎพ่ฎก่žๅ…ฅๅˆฐๆˆ‘ไปฌ็š„้…็ฝฎๆ–‡ไปถ็ณป็ปŸไธญ๏ผŒๆ–นไพฟ่ฟ›่กŒๅ„็งๅฎž้ชŒใ€‚ๅฆ‚ๆžœๆ‚จๆƒณๆŸฅ็œ‹้…็ฝฎๆ–‡ไปถ๏ผŒไฝ ๅฏไปฅ่ฟ่กŒ `python tools/misc/print_config.py /PATH/TO/CONFIG` ๆฅๆŸฅ็œ‹ๅฎŒๆ•ด็š„้…็ฝฎๆ–‡ไปถใ€‚ไฝ ไนŸๅฏไปฅ้€š่ฟ‡ไผ ้€’ๅ‚ๆ•ฐ `--cfg-options xxx.yyy=zzz` ๆฅๆŸฅ็œ‹ๆ›ดๆ–ฐ็š„้…็ฝฎไฟกๆฏใ€‚ + +## ้…็ฝฎๆ–‡ไปถ็š„็ป“ๆž„ + +ๅœจ `config/_base_ ` ๆ–‡ไปถๅคนไธ‹้ขๆœ‰4็งๅŸบๆœฌ็ป„ไปถ็ฑปๅž‹๏ผš ๆ•ฐๆฎ้›†(dataset)๏ผŒๆจกๅž‹(model)๏ผŒ่ฎญ็ปƒ็ญ–็•ฅ(schedule)ๅ’Œ่ฟ่กŒๆ—ถ็š„้ป˜่ฎค่ฎพ็ฝฎ(default runtime)ใ€‚่ฎธๅคšๆจกๅž‹้ƒฝๅฏไปฅๅพˆๅฎนๆ˜“ๅœฐ้€š่ฟ‡็ป„ๅˆ่ฟ™ไบ›็ป„ไปถ่ฟ›่กŒๅฎž็Žฐ๏ผŒๆฏ”ๅฆ‚ DeepLabV3๏ผŒPSPNetใ€‚ไฝฟ็”จ `_base_` ไธ‹็š„็ป„ไปถๆž„ๅปบ็š„้…็ฝฎไฟกๆฏๅซๅšๅŽŸๅง‹้…็ฝฎ (primitive)ใ€‚ + +ๅฏนไบŽๅŒไธ€ไธชๆ–‡ไปถๅคนไธ‹็š„ๆ‰€ๆœ‰้…็ฝฎๆ–‡ไปถ๏ผŒๅปบ่ฎฎ**ๅชๆœ‰ไธ€ไธช**ๅฏนๅบ”็š„**ๅŽŸๅง‹้…็ฝฎๆ–‡ไปถ**ใ€‚ๆ‰€ๆœ‰ๅ…ถไป–็š„้…็ฝฎๆ–‡ไปถ้ƒฝๅบ”่ฏฅ็ปงๆ‰ฟ่‡ช่ฟ™ไธชๅŽŸๅง‹้…็ฝฎๆ–‡ไปถ๏ผŒไปŽ่€Œไฟ่ฏๆฏไธช้…็ฝฎๆ–‡ไปถ็š„ๆœ€ๅคง็ปงๆ‰ฟๆทฑๅบฆไธบ 3ใ€‚ + +ไธบไบ†ไพฟไบŽ็†่งฃ๏ผŒๆˆ‘ไปฌๅปบ่ฎฎ็คพๅŒบ่ดก็Œฎ่€…ไปŽ็Žฐๆœ‰็š„ๆ–นๆณ•็ปงๆ‰ฟใ€‚ไพ‹ๅฆ‚๏ผŒๅฆ‚ๆžœๆ‚จๅœจ DeepLabV3 ๅŸบ็ก€ไธŠ่ฟ›่กŒไบ†ไธ€ไบ›ไฟฎๆ”น๏ผŒ็”จๆˆทๅฏไปฅๅ…ˆ้€š่ฟ‡ๆŒ‡ๅฎš `_base_ = ../deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py` ็ปงๆ‰ฟๅŸบๆœฌ็š„ DeepLabV3 ็ป“ๆž„๏ผŒ็„ถๅŽๅœจ้…็ฝฎๆ–‡ไปถไธญไฟฎๆ”นๅฟ…่ฆ็š„ๅญ—ๆฎตใ€‚ + +ๅฆ‚ๆžœไฝ ๆญฃๅœจๆž„ๅปบไธ€ไธชๅ…จๆ–ฐ็š„ๆ–นๆณ•๏ผŒๅฎƒไธไธŽ็Žฐๆœ‰็š„ไปปไฝ•ๆ–นๆณ•ๅ…ฑไบซๅŸบๆœฌ็ป„ไปถ๏ผŒๆ‚จๅฏไปฅๅœจ`config`ไธ‹ๅˆ›ๅปบไธ€ไธชๆ–ฐ็š„ๆ–‡ไปถๅคน`xxxnet` ๏ผŒ่ฏฆ็ป†ๆ–‡ๆกฃ่ฏทๅ‚่€ƒ[mmengine](https://mmengine.readthedocs.io/en/latest/tutorials/config.html)ใ€‚ + +## ้…็ฝฎๆ–‡ไปถๅ‘ฝๅ้ฃŽๆ ผ + +ๆˆ‘ไปฌ้ตๅพชไปฅไธ‹ๆ ผๅผๆฅๅ‘ฝๅ้…็ฝฎๆ–‡ไปถ๏ผŒๅปบ่ฎฎ็คพๅŒบ่ดก็Œฎ่€…้ตๅพช็›ธๅŒ็š„้ฃŽๆ ผใ€‚ + +```text +{algorithm name}_{model component names [component1]_[component2]_[...]}_{training settings}_{training dataset information}_{testing dataset information} +``` + +้…็ฝฎๆ–‡ไปถ็š„ๆ–‡ไปถๅๅˆ†ไธบไบ”ไธช้ƒจๅˆ†๏ผŒ็ป„ๆˆๆ–‡ไปถๅๆฏไธ€ไธช้ƒจๅˆ†ๅ’Œ็ป„ไปถไน‹้—ด้ƒฝ็”จ`_`่ฟžๆŽฅ๏ผŒๆฏไธช้ƒจๅˆ†ๆˆ–็ป„ไปถไธญ็š„ๆฏไธชๅ•่ฏ้ƒฝ่ฆ็”จ`-`่ฟžๆŽฅใ€‚ + +- `{algorithm name}`: ็ฎ—ๆณ•็š„ๅ็งฐ๏ผŒๅฆ‚ `deeplabv3`, `pspnet` ็ญ‰ใ€‚ +- `{model component names}`: ็ฎ—ๆณ•ไธญไฝฟ็”จ็š„็ป„ไปถๅ็งฐ๏ผŒๅฆ‚ไธปๅนฒ(backbone)ใ€่งฃ็ ๅคด(head)็ญ‰ใ€‚ไพ‹ๅฆ‚๏ผŒ`r50-d8 `่กจ็คบไฝฟ็”จResNet50ไธปๅนฒ็ฝ‘็ปœ๏ผŒๅนถไฝฟ็”จไธปๅนฒ็ฝ‘็ปœ็š„8ๅ€ไธ‹้‡‡ๆ ท่พ“ๅ‡บไฝœไธบไธ‹ไธ€็บง็š„่พ“ๅ…ฅใ€‚ +- `{training settings}`: ่ฎญ็ปƒๆ—ถ็š„ๅ‚ๆ•ฐ่ฎพ็ฝฎ๏ผŒๅฆ‚ `batch size`ใ€ๆ•ฐๆฎๅขžๅผบ(augmentation)ใ€ๆŸๅคฑๅ‡ฝๆ•ฐ(loss)ใ€ๅญฆไน ็Ž‡่ฐƒๅบฆๅ™จ(learning rate scheduler)ๅ’Œ่ฎญ็ปƒ่ฝฎๆ•ฐ(epochs/iterations)ใ€‚ไพ‹ๅฆ‚: `4xb4-ce-linearlr-40K` ๆ„ๅ‘ณ็€ไฝฟ็”จ4ไธชgpu๏ผŒๆฏไธชgpu4ไธชๅ›พๅƒ๏ผŒไฝฟ็”จไบคๅ‰็†ตๆŸๅคฑๅ‡ฝๆ•ฐ(CrossEntropy)๏ผŒ็บฟๆ€งๅญฆไน ็Ž‡่ฐƒๅบฆ็จ‹ๅบ๏ผŒ่ฎญ็ปƒ40K iterationsใ€‚ + ไธ€ไบ›็ผฉๅ†™: + - `{gpu x batch_per_gpu}`: GPUๆ•ฐ้‡ๅ’ŒๆฏไธชGPU็š„ๆ ทๆœฌๆ•ฐใ€‚`bN ` ่กจ็คบๆฏไธชGPU็š„batch sizeไธบN๏ผŒๅฆ‚ `8xb2` ไธบ8ไธชgpu x ๆฏไธชgpu2ๅผ ๅ›พๅƒ็š„็ผฉๅ†™ใ€‚ๅฆ‚ๆžœๆœชๆๅŠ๏ผŒๅˆ™้ป˜่ฎคไฝฟ็”จ `4xb4 `ใ€‚ + - `{schedule}`: ่ฎญ็ปƒ่ฎกๅˆ’๏ผŒ้€‰้กนๆœ‰`20k`๏ผŒ`40k`็ญ‰ใ€‚`20k ` ๅ’Œ `40k` ๅˆ†ๅˆซ่กจ็คบ20000ๆฌก่ฟญไปฃ(iterations)ๅ’Œ40000ๆฌก่ฟญไปฃ(iterations)ใ€‚ +- `{training dataset information}`: ่ฎญ็ปƒๆ•ฐๆฎ้›†ๅ็งฐ๏ผŒๅฆ‚ `cityscapes `๏ผŒ `ade20k ` ็ญ‰๏ผŒไปฅๅŠ่พ“ๅ…ฅๅˆ†่พจ็Ž‡ใ€‚ไพ‹ๅฆ‚: `cityscapes-768x768 `่กจ็คบไฝฟ็”จ `cityscapes` ๆ•ฐๆฎ้›†่ฟ›่กŒ่ฎญ็ปƒ๏ผŒ่พ“ๅ…ฅๅˆ†่พจ็Ž‡ไธบ`768x768 `ใ€‚ +- `{testing dataset information}` (ๅฏ้€‰): ๆต‹่ฏ•ๆ•ฐๆฎ้›†ๅ็งฐใ€‚ๅฝ“ๆ‚จ็š„ๆจกๅž‹ๅœจไธ€ไธชๆ•ฐๆฎ้›†ไธŠ่ฎญ็ปƒไฝ†ๅœจๅฆไธ€ไธชๆ•ฐๆฎ้›†ไธŠๆต‹่ฏ•ๆ—ถ๏ผŒ่ฏทๅฐ†ๆต‹่ฏ•ๆ•ฐๆฎ้›†ๅ็งฐๆทปๅŠ ๅˆฐๆญคๅค„ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰่ฟ™ไธ€้ƒจๅˆ†๏ผŒๅˆ™ๆ„ๅ‘ณ็€ๆจกๅž‹ๆ˜ฏๅœจๅŒไธ€ไธชๆ•ฐๆฎ้›†ไธŠ่ฟ›่กŒ่ฎญ็ปƒๅ’Œๆต‹่ฏ•็š„ใ€‚ + +## PSPNet ็š„ไธ€ไธชไพ‹ๅญ + +ไธบไบ†ๅธฎๅŠฉ็”จๆˆท็†Ÿๆ‚‰ๅฏน่ฟ™ไธช็Žฐไปฃ่ฏญไน‰ๅˆ†ๅ‰ฒ็ณป็ปŸ็š„ๅฎŒๆ•ด้…็ฝฎๆ–‡ไปถๅ’Œๆจกๅ—๏ผŒๆˆ‘ไปฌๅฏนไฝฟ็”จResNet50V1cไฝœไธบไธปๅนฒ็ฝ‘็ปœ็š„PSPNet็š„้…็ฝฎๆ–‡ไปถไฝœๅฆ‚ไธ‹็š„็ฎ€่ฆๆณจ้‡Šๅ’Œ่ฏดๆ˜Žใ€‚่ฆไบ†่งฃๆ›ด่ฏฆ็ป†็š„็”จๆณ•ๅ’Œๆฏไธชๆจกๅ—ๅฏนๅบ”็š„ๆ›ฟๆขๆ–นๆณ•๏ผŒ่ฏทๅ‚้˜…APIๆ–‡ๆกฃใ€‚ + +```python +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] # ๆˆ‘ไปฌๅฏไปฅๅœจๅŸบๆœฌ้…็ฝฎๆ–‡ไปถ็š„ๅŸบ็ก€ไธŠ ๆž„ๅปบๆ–ฐ็š„้…็ฝฎๆ–‡ไปถ +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) +``` + +`_base_/models/pspnet_r50-d8.py`ๆ˜ฏไฝฟ็”จResNet50V1cไฝœไธบไธปๅนฒ็ฝ‘็ปœ็š„PSPNet็š„ๅŸบๆœฌๆจกๅž‹้…็ฝฎๆ–‡ไปถใ€‚ + +```python +# ๆจกๅž‹่ฎพ็ฝฎ +norm_cfg = dict(type='SyncBN', requires_grad=True) # ๅˆ†ๅ‰ฒๆก†ๆžถ้€šๅธธไฝฟ็”จ SyncBN +data_preprocessor = dict( # ๆ•ฐๆฎ้ข„ๅค„็†็š„้…็ฝฎ้กน๏ผŒ้€šๅธธๅŒ…ๆ‹ฌๅ›พๅƒ็š„ๅฝ’ไธ€ๅŒ–ๅ’Œๅขžๅผบ + type='SegDataPreProcessor', # ๆ•ฐๆฎ้ข„ๅค„็†็š„็ฑปๅž‹ + mean=[123.675, 116.28, 103.53], # ็”จไบŽๅฝ’ไธ€ๅŒ–่พ“ๅ…ฅๅ›พๅƒ็š„ๅนณๅ‡ๅ€ผ + std=[58.395, 57.12, 57.375], # ็”จไบŽๅฝ’ไธ€ๅŒ–่พ“ๅ…ฅๅ›พๅƒ็š„ๆ ‡ๅ‡†ๅทฎ + bgr_to_rgb=True, # ๆ˜ฏๅฆๅฐ†ๅ›พๅƒไปŽ BGR ่ฝฌไธบ RGB + pad_val=0, # ๅ›พๅƒ็š„ๅกซๅ……ๅ€ผ + seg_pad_val=255) # 'gt_seg_map'็š„ๅกซๅ……ๅ€ผ +model = dict( + type='EncoderDecoder', # ๅˆ†ๅ‰ฒๅ™จ(segmentor)็š„ๅๅญ— + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', # ๅŠ ่ฝฝไฝฟ็”จ ImageNet ้ข„่ฎญ็ปƒ็š„ไธปๅนฒ็ฝ‘็ปœ + backbone=dict( + type='ResNetV1c', # ไธปๅนฒ็ฝ‘็ปœ็š„็ฑปๅˆซ๏ผŒๆ›ดๅคš็ป†่Š‚่ฏทๅ‚่€ƒ mmseg/models/backbones/resnet.py + depth=50, # ไธปๅนฒ็ฝ‘็ปœ็š„ๆทฑๅบฆ๏ผŒ้€šๅธธไธบ 50 ๅ’Œ 101 + num_stages=4, # ไธปๅนฒ็ฝ‘็ปœ็Šถๆ€(stages)็š„ๆ•ฐ็›ฎ + out_indices=(0, 1, 2, 3), # ๆฏไธช็Šถๆ€(stage)ไบง็”Ÿ็š„็‰นๅพๅ›พ่พ“ๅ‡บ็š„็ดขๅผ• + dilations=(1, 1, 2, 4), # ๆฏไธ€ๅฑ‚(layer)็š„็ฉบๅฟƒ็Ž‡(dilation rate) + strides=(1, 2, 1, 1), # ๆฏไธ€ๅฑ‚(layer)็š„ๆญฅ้•ฟ(stride) + norm_cfg=norm_cfg, # ๅฝ’ไธ€ๅŒ–ๅฑ‚(norm layer)็š„้…็ฝฎ้กน + norm_eval=False, # ๆ˜ฏๅฆๅ†ป็ป“ BN ้‡Œ็š„็ปŸ่ฎก้กน + style='pytorch', # ไธปๅนฒ็ฝ‘็ปœ็š„้ฃŽๆ ผ๏ผŒ'pytorch' ๆ„ๆ€ๆ˜ฏๆญฅ้•ฟไธบ2็š„ๅฑ‚ไธบ 3x3 ๅท็งฏ๏ผŒ 'caffe' ๆ„ๆ€ๆ˜ฏๆญฅ้•ฟไธบ2็š„ๅฑ‚ไธบ 1x1 ๅท็งฏ + contract_dilation=True), # ๅฝ“็ฉบๆดž็Ž‡ > 1, ๆ˜ฏๅฆๅŽ‹็ผฉ็ฌฌไธ€ไธช็ฉบๆดžๅฑ‚ + decode_head=dict( + type='PSPHead', # ่งฃ็ ๅคด(decode head)็š„็ฑปๅˆซใ€‚ๅฏ็”จ้€‰้กน่ฏทๅ‚ mmseg/models/decode_heads + in_channels=2048, # ่งฃ็ ๅคด็š„่พ“ๅ…ฅ้€š้“ๆ•ฐ + in_index=3, # ่ขซ้€‰ๆ‹ฉ็‰นๅพๅ›พ(feature map)็š„็ดขๅผ• + channels=512, # ่งฃ็ ๅคดไธญ้—ดๆ€(intermediate)็š„้€š้“ๆ•ฐ + pool_scales=(1, 2, 3, 6), # PSPHead ๅนณๅ‡ๆฑ ๅŒ–(avg pooling)็š„่ง„ๆจก(scales)ใ€‚ ็ป†่Š‚่ฏทๅ‚่€ƒๆ–‡็ซ ๅ†…ๅฎน + dropout_ratio=0.1, # ่ฟ›ๅ…ฅๆœ€ๅŽๅˆ†็ฑปๅฑ‚(classification layer)ไน‹ๅ‰็š„ dropout ๆฏ”ไพ‹ + num_classes=19, # ๅˆ†ๅ‰ฒๅ‰ๆ™ฏ็š„็ง็ฑปๆ•ฐ็›ฎใ€‚ ้€šๅธธๆƒ…ๅ†ตไธ‹๏ผŒcityscapes ไธบ19๏ผŒVOCไธบ21๏ผŒADE20k ไธบ150 + norm_cfg=norm_cfg, # ๅฝ’ไธ€ๅŒ–ๅฑ‚็š„้…็ฝฎ้กน + align_corners=False, # ่งฃ็ ่ฟ‡็จ‹ไธญ่ฐƒๆ•ดๅคงๅฐ(resize)็š„ align_corners ๅ‚ๆ•ฐ + loss_decode=dict( # ่งฃ็ ๅคด(decode_head)้‡Œ็š„ๆŸๅคฑๅ‡ฝๆ•ฐ็š„้…็ฝฎ้กน + type='CrossEntropyLoss', # ๅˆ†ๅ‰ฒๆ—ถไฝฟ็”จ็š„ๆŸๅคฑๅ‡ฝๆ•ฐ็š„็ฑปๅˆซ + use_sigmoid=False, # ๅˆ†ๅ‰ฒๆ—ถๆ˜ฏๅฆไฝฟ็”จ sigmoid ๆฟ€ๆดป + loss_weight=1.0)), # ่งฃ็ ๅคด็š„ๆŸๅคฑๆƒ้‡ + auxiliary_head=dict( + type='FCNHead', # ่พ…ๅŠฉๅคด(auxiliary head)็š„็ง็ฑปใ€‚ๅฏ็”จ้€‰้กน่ฏทๅ‚่€ƒ mmseg/models/decode_heads + in_channels=1024, # ่พ…ๅŠฉๅคด็š„่พ“ๅ…ฅ้€š้“ๆ•ฐ + in_index=2, # ่ขซ้€‰ๆ‹ฉ็š„็‰นๅพๅ›พ(feature map)็š„็ดขๅผ• + channels=256, # ่พ…ๅŠฉๅคดไธญ้—ดๆ€(intermediate)็š„้€š้“ๆ•ฐ + num_convs=1, # FCNHead ้‡Œๅท็งฏ(convs)็š„ๆ•ฐ็›ฎ๏ผŒ่พ…ๅŠฉๅคดไธญ้€šๅธธไธบ1 + concat_input=False, # ๅœจๅˆ†็ฑปๅฑ‚(classification layer)ไน‹ๅ‰ๆ˜ฏๅฆ่ฟžๆŽฅ(concat)่พ“ๅ…ฅๅ’Œๅท็งฏ็š„่พ“ๅ‡บ + dropout_ratio=0.1, # ่ฟ›ๅ…ฅๆœ€ๅŽๅˆ†็ฑปๅฑ‚(classification layer)ไน‹ๅ‰็š„ dropout ๆฏ”ไพ‹ + num_classes=19, # ๅˆ†ๅ‰ฒๅ‰ๆ™ฏ็š„็ง็ฑปๆ•ฐ็›ฎใ€‚ ้€šๅธธๆƒ…ๅ†ตไธ‹๏ผŒcityscapes ไธบ19๏ผŒVOCไธบ21๏ผŒADE20k ไธบ150 + norm_cfg=norm_cfg, # ๅฝ’ไธ€ๅŒ–ๅฑ‚็š„้…็ฝฎ้กน + align_corners=False, # ่งฃ็ ่ฟ‡็จ‹ไธญ่ฐƒๆ•ดๅคงๅฐ(resize)็š„ align_corners ๅ‚ๆ•ฐ + loss_decode=dict( # ่พ…ๅŠฉๅคด(auxiliary head)้‡Œ็š„ๆŸๅคฑๅ‡ฝๆ•ฐ็š„้…็ฝฎ้กน + type='CrossEntropyLoss', # ๅˆ†ๅ‰ฒๆ—ถไฝฟ็”จ็š„ๆŸๅคฑๅ‡ฝๆ•ฐ็š„็ฑปๅˆซ + use_sigmoid=False, # ๅˆ†ๅ‰ฒๆ—ถๆ˜ฏๅฆไฝฟ็”จ sigmoid ๆฟ€ๆดป + loss_weight=0.4)), # ่พ…ๅŠฉๅคดๆŸๅคฑ็š„ๆƒ้‡๏ผŒ้ป˜่ฎค่ฎพ็ฝฎไธบ0.4 + # ๆจกๅž‹่ฎญ็ปƒๅ’Œๆต‹่ฏ•่ฎพ็ฝฎ้กน + train_cfg=dict(), # train_cfg ๅฝ“ๅ‰ไป…ๆ˜ฏไธ€ไธชๅ ไฝ็ฌฆ + test_cfg=dict(mode='whole')) # ๆต‹่ฏ•ๆจกๅผ๏ผŒๅฏ้€‰ๅ‚ๆ•ฐไธบ 'whole' ๅ’Œ 'slide'. 'whole': ๅœจๆ•ดๅผ ๅ›พๅƒไธŠๅ…จๅท็งฏ(fully-convolutional)ๆต‹่ฏ•ใ€‚ 'slide': ๅœจ่พ“ๅ…ฅๅ›พๅƒไธŠๅšๆป‘็ช—้ข„ๆต‹ +``` + +`_base_/datasets/cityscapes.py`ๆ˜ฏๆ•ฐๆฎ้›†็š„ๅŸบๆœฌ้…็ฝฎๆ–‡ไปถใ€‚ + +```python +# ๆ•ฐๆฎ้›†่ฎพ็ฝฎ +dataset_type = 'CityscapesDataset' # ๆ•ฐๆฎ้›†็ฑปๅž‹๏ผŒ่ฟ™ๅฐ†่ขซ็”จๆฅๅฎšไน‰ๆ•ฐๆฎ้›† +data_root = 'data/cityscapes/' # ๆ•ฐๆฎ็š„ๆ น่ทฏๅพ„ +crop_size = (512, 1024) # ่ฎญ็ปƒๆ—ถ็š„่ฃๅ‰ชๅคงๅฐ +train_pipeline = [ # ่ฎญ็ปƒๆต็จ‹ + dict(type='LoadImageFromFile'), # ็ฌฌ1ไธชๆต็จ‹๏ผŒไปŽๆ–‡ไปถ่ทฏๅพ„้‡ŒๅŠ ่ฝฝๅ›พๅƒ + dict(type='LoadAnnotations'), # ็ฌฌ2ไธชๆต็จ‹๏ผŒๅฏนไบŽๅฝ“ๅ‰ๅ›พๅƒ๏ผŒๅŠ ่ฝฝๅฎƒ็š„ๆ ‡ๆณจๅ›พๅƒ + dict(type='RandomResize', # ่ฐƒๆ•ด่พ“ๅ…ฅๅ›พๅƒๅคงๅฐ(resize)ๅ’Œๅ…ถๆ ‡ๆณจๅ›พๅƒ็š„ๆ•ฐๆฎๅขžๅนฟๆต็จ‹ + scale=(2048, 1024), # ๅ›พๅƒ่ฃๅ‰ช็š„ๅคงๅฐ + ratio_range=(0.5, 2.0), # ๆ•ฐๆฎๅขžๅนฟ็š„ๆฏ”ไพ‹่Œƒๅ›ด + keep_ratio=True), # ่ฐƒๆ•ดๅ›พๅƒๅคงๅฐๆ—ถๆ˜ฏๅฆไฟๆŒ็บตๆจชๆฏ” + dict(type='RandomCrop', # ้šๆœบ่ฃๅ‰ชๅฝ“ๅ‰ๅ›พๅƒๅ’Œๅ…ถๆ ‡ๆณจๅ›พๅƒ็š„ๆ•ฐๆฎๅขžๅนฟๆต็จ‹ + crop_size=crop_size, # ้šๆœบ่ฃๅ‰ช็š„ๅคงๅฐ + cat_max_ratio=0.75), # ๅ•ไธช็ฑปๅˆซๅฏไปฅๅกซๅ……็š„ๆœ€ๅคงๅŒบๅŸŸ็š„ๆฏ” + dict(type='RandomFlip', # ็ฟป่ฝฌๅ›พๅƒๅ’Œๅ…ถๆ ‡ๆณจๅ›พๅƒ็š„ๆ•ฐๆฎๅขžๅนฟๆต็จ‹ + prob=0.5), # ็ฟป่ฝฌๅ›พๅƒ็š„ๆฆ‚็Ž‡ + dict(type='PhotoMetricDistortion'), # ๅ…‰ๅญฆไธŠไฝฟ็”จไธ€ไบ›ๆ–นๆณ•ๆ‰ญๆ›ฒๅฝ“ๅ‰ๅ›พๅƒๅ’Œๅ…ถๆ ‡ๆณจๅ›พๅƒ็š„ๆ•ฐๆฎๅขžๅนฟๆต็จ‹ + dict(type='PackSegInputs') # ๆ‰“ๅŒ…็”จไบŽ่ฏญไน‰ๅˆ†ๅ‰ฒ็š„่พ“ๅ…ฅๆ•ฐๆฎ +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # ็ฌฌ1ไธชๆต็จ‹๏ผŒไปŽๆ–‡ไปถ่ทฏๅพ„้‡ŒๅŠ ่ฝฝๅ›พๅƒ + dict(type='Resize', # ไฝฟ็”จ่ฐƒๆ•ดๅ›พๅƒๅคงๅฐ(resize)ๅขžๅผบ + scale=(2048, 1024), # ๅ›พๅƒ็ผฉๆ”พ็š„ๅคงๅฐ + keep_ratio=True), # ๅœจ่ฐƒๆ•ดๅ›พๅƒๅคงๅฐๆ—ถๆ˜ฏๅฆไฟ็•™้•ฟๅฎฝๆฏ” + # ๅœจ' Resize 'ไน‹ๅŽๆทปๅŠ ๆ ‡ๆณจๅ›พๅƒ + # ไธ้œ€่ฆๅš่ฐƒๆ•ดๅ›พๅƒๅคงๅฐ(resize)็š„ๆ•ฐๆฎๅ˜ๆข + dict(type='LoadAnnotations'), # ๅŠ ่ฝฝๆ•ฐๆฎ้›†ๆไพ›็š„่ฏญไน‰ๅˆ†ๅ‰ฒๆ ‡ๆณจ + dict(type='PackSegInputs') # ๆ‰“ๅŒ…็”จไบŽ่ฏญไน‰ๅˆ†ๅ‰ฒ็š„่พ“ๅ…ฅๆ•ฐๆฎ +] +train_dataloader = dict( # ่ฎญ็ปƒๆ•ฐๆฎๅŠ ่ฝฝๅ™จ(dataloader)็š„้…็ฝฎ + batch_size=2, # ๆฏไธ€ไธชGPU็š„batch sizeๅคงๅฐ + num_workers=2, # ไธบๆฏไธ€ไธชGPU้ข„่ฏปๅ–ๆ•ฐๆฎ็š„่ฟ›็จ‹ไธชๆ•ฐ + persistent_workers=True, # ๅœจไธ€ไธชepoch็ป“ๆŸๅŽๅ…ณ้—ญworker่ฟ›็จ‹๏ผŒๅฏไปฅๅŠ ๅฟซ่ฎญ็ปƒ้€Ÿๅบฆ + sampler=dict(type='InfiniteSampler', shuffle=True), # ่ฎญ็ปƒๆ—ถ่ฟ›่กŒ้šๆœบๆด—็‰Œ(shuffle) + dataset=dict( # ่ฎญ็ปƒๆ•ฐๆฎ้›†้…็ฝฎ + type=dataset_type, # ๆ•ฐๆฎ้›†็ฑปๅž‹๏ผŒ่ฏฆ่งmmseg/datassets/ + data_root=data_root, # ๆ•ฐๆฎ้›†็š„ๆ น็›ฎๅฝ• + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), # ่ฎญ็ปƒๆ•ฐๆฎ็š„ๅ‰็ผ€ + pipeline=train_pipeline)) # ๆ•ฐๆฎๅค„็†ๆต็จ‹๏ผŒๅฎƒ้€š่ฟ‡ไน‹ๅ‰ๅˆ›ๅปบ็š„train_pipelineไผ ้€’ใ€‚ +val_dataloader = dict( + batch_size=1, # ๆฏไธ€ไธชGPU็š„batch sizeๅคงๅฐ + num_workers=4, # ไธบๆฏไธ€ไธชGPU้ข„่ฏปๅ–ๆ•ฐๆฎ็š„่ฟ›็จ‹ไธชๆ•ฐ + persistent_workers=True, # ๅœจไธ€ไธชepoch็ป“ๆŸๅŽๅ…ณ้—ญworker่ฟ›็จ‹๏ผŒๅฏไปฅๅŠ ๅฟซ่ฎญ็ปƒ้€Ÿๅบฆ + sampler=dict(type='DefaultSampler', shuffle=False), # ่ฎญ็ปƒๆ—ถไธ่ฟ›่กŒ้šๆœบๆด—็‰Œ(shuffle) + dataset=dict( # ๆต‹่ฏ•ๆ•ฐๆฎ้›†้…็ฝฎ + type=dataset_type, # ๆ•ฐๆฎ้›†็ฑปๅž‹๏ผŒ่ฏฆ่งmmseg/datassets/ + data_root=data_root, # ๆ•ฐๆฎ้›†็š„ๆ น็›ฎๅฝ• + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), # ๆต‹่ฏ•ๆ•ฐๆฎ็š„ๅ‰็ผ€ + pipeline=test_pipeline)) # ๆ•ฐๆฎๅค„็†ๆต็จ‹๏ผŒๅฎƒ้€š่ฟ‡ไน‹ๅ‰ๅˆ›ๅปบ็š„test_pipelineไผ ้€’ใ€‚ +test_dataloader = val_dataloader +# ็ฒพๅบฆ่ฏ„ไผฐๆ–นๆณ•๏ผŒๆˆ‘ไปฌๅœจ่ฟ™้‡Œไฝฟ็”จ IoUMetric ่ฟ›่กŒ่ฏ„ไผฐ +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator +``` + +`_base_/schedules/schedule_40k.py` + +```python +# optimizer +optimizer = dict(type='SGD', # ไผ˜ๅŒ–ๅ™จ็ง็ฑป๏ผŒๆ›ดๅคš็ป†่Š‚ๅฏๅ‚่€ƒ https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py + lr=0.01, # ไผ˜ๅŒ–ๅ™จ็š„ๅญฆไน ็Ž‡๏ผŒๅ‚ๆ•ฐ็š„ไฝฟ็”จ็ป†่Š‚่ฏทๅ‚็…งๅฏนๅบ”็š„ PyTorch ๆ–‡ๆกฃ + momentum=0.9, # ๅŠจ้‡ๅคงๅฐ (Momentum) + weight_decay=0.0005) # SGD ็š„ๆƒ้‡่กฐๅ‡ (weight decay) +optim_wrapper = dict(type='OptimWrapper', # ไผ˜ๅŒ–ๅ™จๅŒ…่ฃ…ๅ™จ(Optimizer wrapper)ไธบๆ›ดๆ–ฐๅ‚ๆ•ฐๆไพ›ไบ†ไธ€ไธชๅ…ฌๅ…ฑๆŽฅๅฃ + optimizer=optimizer, # ็”จไบŽๆ›ดๆ–ฐๆจกๅž‹ๅ‚ๆ•ฐ็š„ไผ˜ๅŒ–ๅ™จ(Optimizer) + clip_grad=None) # ๅฆ‚ๆžœ 'clip_grad' ไธๆ˜ฏNone๏ผŒๅฎƒๅฐ†ๆ˜ฏ ' torch.nn.utils.clip_grad' ็š„ๅ‚ๆ•ฐใ€‚ +# ๅญฆไน ็ญ–็•ฅ +param_scheduler = [ + dict( + type='PolyLR', # ่ฐƒๅบฆๆต็จ‹็š„็ญ–็•ฅ๏ผŒๅŒๆ ทๆ”ฏๆŒ Step, CosineAnnealing, Cyclic ็ญ‰. ่ฏทไปŽ https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/scheduler/lr_scheduler.py ๅ‚่€ƒ LrUpdater ็š„็ป†่Š‚ + eta_min=1e-4, # ่ฎญ็ปƒ็ป“ๆŸๆ—ถ็š„ๆœ€ๅฐๅญฆไน ็Ž‡ + power=0.9, # ๅคš้กนๅผ่กฐๅ‡ (polynomial decay) ็š„ๅน‚ + begin=0, # ๅผ€ๅง‹ๆ›ดๆ–ฐๅ‚ๆ•ฐ็š„ๆ—ถ้—ดๆญฅ(step) + end=40000, # ๅœๆญขๆ›ดๆ–ฐๅ‚ๆ•ฐ็š„ๆ—ถ้—ดๆญฅ(step) + by_epoch=False) # ๆ˜ฏๅฆๆŒ‰็…ง epoch ่ฎก็ฎ—่ฎญ็ปƒๆ—ถ้—ด +] +# 40k iteration ็š„่ฎญ็ปƒ่ฎกๅˆ’ +train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +# ้ป˜่ฎค้’ฉๅญ(hook)้…็ฝฎ +default_hooks = dict( + timer=dict(type='IterTimerHook'), # ่ฎฐๅฝ•่ฟญไปฃ่ฟ‡็จ‹ไธญ่Šฑ่ดน็š„ๆ—ถ้—ด + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), # ไปŽ'Runner'็š„ไธๅŒ็ป„ไปถๆ”ถ้›†ๅ’Œๅ†™ๅ…ฅๆ—ฅๅฟ— + param_scheduler=dict(type='ParamSchedulerHook'), # ๆ›ดๆ–ฐไผ˜ๅŒ–ๅ™จไธญ็š„ไธ€ไบ›่ถ…ๅ‚ๆ•ฐ๏ผŒไพ‹ๅฆ‚ๅญฆไน ็Ž‡ + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), # ๅฎšๆœŸไฟๅญ˜ๆฃ€ๆŸฅ็‚น(checkpoint) + sampler_seed=dict(type='DistSamplerSeedHook')) # ็”จไบŽๅˆ†ๅธƒๅผ่ฎญ็ปƒ็š„ๆ•ฐๆฎๅŠ ่ฝฝ้‡‡ๆ ทๅ™จ +``` + +in `_base_/default_runtime.py` + +```python +# ๅฐ†ๆณจๅ†Œ่กจ็š„้ป˜่ฎค่Œƒๅ›ด่ฎพ็ฝฎไธบmmseg +default_scope = 'mmseg' +# environment +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +log_level = 'INFO' +log_processor = dict(by_epoch=False) +load_from = None # ไปŽๆ–‡ไปถไธญๅŠ ่ฝฝๆฃ€ๆŸฅ็‚น(checkpoint) +resume = False # ๆ˜ฏๅฆไปŽๅทฒๆœ‰็š„ๆจกๅž‹ๆขๅค +``` + +่ฟ™ไบ›้ƒฝๆ˜ฏ็”จไบŽ่ฎญ็ปƒๅ’Œๆต‹่ฏ•PSPNet็š„้…็ฝฎๆ–‡ไปถ๏ผŒ่ฆๅŠ ่ฝฝๅ’Œ่งฃๆžๅฎƒไปฌ๏ผŒๆˆ‘ไปฌๅฏไปฅไฝฟ็”จ[MMEngine](https://github.com/open-mmlab/mmengine)ๅฎž็Žฐ็š„[Config](https://mmengine.readthedocs.io/en/latest/tutorials/config.html)ใ€‚ + +```python +from mmengine.config import Config + +cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py') +print(cfg.train_dataloader) +``` + +```shell +{'batch_size': 2, + 'num_workers': 2, + 'persistent_workers': True, + 'sampler': {'type': 'InfiniteSampler', 'shuffle': True}, + 'dataset': {'type': 'CityscapesDataset', + 'data_root': 'data/cityscapes/', + 'data_prefix': {'img_path': 'leftImg8bit/train', + 'seg_map_path': 'gtFine/train'}, + 'pipeline': [{'type': 'LoadImageFromFile'}, + {'type': 'LoadAnnotations'}, + {'type': 'RandomResize', + 'scale': (2048, 1024), + 'ratio_range': (0.5, 2.0), + 'keep_ratio': True}, + {'type': 'RandomCrop', 'crop_size': (512, 1024), 'cat_max_ratio': 0.75}, + {'type': 'RandomFlip', 'prob': 0.5}, + {'type': 'PhotoMetricDistortion'}, + {'type': 'PackSegInputs'}]}} +``` + +`cfg `ๆ˜ฏ`mmengine.config.Config `็š„ไธ€ไธชๅฎžไพ‹ใ€‚ๅฎƒ็š„ๆŽฅๅฃไธŽdictๅฏน่ฑก็›ธๅŒ๏ผŒไนŸๅ…่ฎธๅฐ†้…็ฝฎๅ€ผไฝœไธบๅฑžๆ€ง่ฎฟ้—ฎใ€‚ๆ›ดๅคšไฟกๆฏ่ฏทๅ‚่ง[MMEngine](https://github.com/open-mmlab/mmengine)ไธญ็š„[config tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/config.html)ใ€‚ + +## FAQ + +### ๅฟฝ็•ฅๅŸบ็ก€้…็ฝฎๆ–‡ไปถ้‡Œ็š„ไธ€ไบ›ๅญ—ๆฎต + +ๆœ‰ๆ—ถ๏ผŒๆ‚จๅฏไปฅ่ฎพ็ฝฎ`_delete_=True `ๆฅๅฟฝ็•ฅๅŸบๆœฌ้…็ฝฎๆ–‡ไปถไธญ็š„ๆŸไบ›ๅญ—ๆฎตใ€‚ๆ‚จๅฏไปฅๅ‚่€ƒ[MMEngine](https://github.com/open-mmlab/mmengine)ไธญ็š„[config tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/config.html)ๆฅ่Žทๅพ—ไธ€ไบ›็ฎ€ๅ•็š„ๆŒ‡ๅฏผใ€‚ + +ไพ‹ๅฆ‚๏ผŒๅœจMMSegmentationไธญ๏ผŒๅฆ‚ๆžœๆ‚จๆƒณๅœจไธ‹้ข็š„้…็ฝฎๆ–‡ไปถ`pspnet.py `ไธญไฟฎๆ”นPSPNet็š„ไธปๅนฒ็ฝ‘็ปœ: + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='torchvision://resnet50', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) +``` + +็”จไปฅไธ‹ไปฃ็ ๅŠ ่ฝฝๅนถ่งฃๆž้…็ฝฎๆ–‡ไปถ`pspnet.py`: + +```python +from mmengine.config import Config + +cfg = Config.fromfile('pspnet.py') +print(cfg.model) +``` + +```shell +{'type': 'EncoderDecoder', + 'pretrained': 'torchvision://resnet50', + 'backbone': {'type': 'ResNetV1c', + 'depth': 50, + 'num_stages': 4, + 'out_indices': (0, 1, 2, 3), + 'dilations': (1, 1, 2, 4), + 'strides': (1, 2, 1, 1), + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'norm_eval': False, + 'style': 'pytorch', + 'contract_dilation': True}, + 'decode_head': {'type': 'PSPHead', + 'in_channels': 2048, + 'in_index': 3, + 'channels': 512, + 'pool_scales': (1, 2, 3, 6), + 'dropout_ratio': 0.1, + 'num_classes': 19, + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'align_corners': False, + 'loss_decode': {'type': 'CrossEntropyLoss', + 'use_sigmoid': False, + 'loss_weight': 1.0}}} +``` + +`ResNet`ๅ’Œ`HRNet`ไฝฟ็”จไธๅŒ็š„ๅ…ณ้”ฎๅญ—ๆž„ๅปบ๏ผŒ็ผ–ๅ†™ไธ€ไธชๆ–ฐ็š„้…็ฝฎๆ–‡ไปถ`hrnet.py`๏ผŒๅฆ‚ไธ‹ๆ‰€็คบ: + +```python +_base_ = 'pspnet.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w32', + backbone=dict( + _delete_=True, + type='HRNet', + norm_cfg=norm_cfg, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))))) +``` + +็”จไปฅไธ‹ไปฃ็ ๅŠ ่ฝฝๅนถ่งฃๆž้…็ฝฎๆ–‡ไปถ`hrnet.py`: + +```python +from mmengine.config import Config +cfg = Config.fromfile('hrnet.py') +print(cfg.model) +``` + +```shell +{'type': 'EncoderDecoder', + 'pretrained': 'open-mmlab://msra/hrnetv2_w32', + 'backbone': {'type': 'HRNet', + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'extra': {'stage1': {'num_modules': 1, + 'num_branches': 1, + 'block': 'BOTTLENECK', + 'num_blocks': (4,), + 'num_channels': (64,)}, + 'stage2': {'num_modules': 1, + 'num_branches': 2, + 'block': 'BASIC', + 'num_blocks': (4, 4), + 'num_channels': (32, 64)}, + 'stage3': {'num_modules': 4, + 'num_branches': 3, + 'block': 'BASIC', + 'num_blocks': (4, 4, 4), + 'num_channels': (32, 64, 128)}, + 'stage4': {'num_modules': 3, + 'num_branches': 4, + 'block': 'BASIC', + 'num_blocks': (4, 4, 4, 4), + 'num_channels': (32, 64, 128, 256)}}}, + 'decode_head': {'type': 'PSPHead', + 'in_channels': 2048, + 'in_index': 3, + 'channels': 512, + 'pool_scales': (1, 2, 3, 6), + 'dropout_ratio': 0.1, + 'num_classes': 19, + 'norm_cfg': {'type': 'SyncBN', 'requires_grad': True}, + 'align_corners': False, + 'loss_decode': {'type': 'CrossEntropyLoss', + 'use_sigmoid': False, + 'loss_weight': 1.0}}} +``` + +`_delete_=True` ๅฐ†็”จๆ–ฐ็š„้”ฎๅŽปๆ›ฟๆข `backbone` ๅญ—ๆฎตๅ†…ๆ‰€ๆœ‰ๆ—ง็š„้”ฎใ€‚ + +### ไฝฟ็”จ้…็ฝฎๆ–‡ไปถ้‡Œ็š„ไธญ้—ดๅ˜้‡ + +้…็ฝฎๆ–‡ไปถไธญไผšไฝฟ็”จไธ€ไบ›ไธญ้—ดๅ˜้‡๏ผŒไพ‹ๅฆ‚ๆ•ฐๆฎ้›†(datasets)ๅญ—ๆฎต้‡Œ็š„ `train_pipeline`/`test_pipeline`ใ€‚ ้œ€่ฆๆณจๆ„็š„ๆ˜ฏ๏ผŒๅœจๅญ้…็ฝฎๆ–‡ไปถ้‡Œไฟฎๆ”นไธญ้—ดๅ˜้‡ๆ—ถ๏ผŒๆ‚จ้œ€่ฆๅ†ๆฌกไผ ้€’่ฟ™ไบ›ๅ˜้‡็ป™ๅฏนๅบ”็š„ๅญ—ๆฎตใ€‚ไพ‹ๅฆ‚๏ผŒๆˆ‘ไปฌๆƒณๆ”นๅ˜ๅœจ่ฎญ็ปƒๆˆ–ๆต‹่ฏ•PSPNetๆ—ถ้‡‡็”จ็š„ๅคšๅฐบๅบฆ็ญ–็•ฅ (multi scale strategy)๏ผŒ`train_pipeline`/`test_pipeline` ๆ˜ฏๆˆ‘ไปฌ้œ€่ฆไฟฎๆ”น็š„ไธญ้—ดๅ˜้‡ใ€‚ + +```python +_base_ = '../pspnet/pspnet_r50-d8_4xb4-40k_cityscpaes-512x1024.py' +crop_size = (512, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='RandomResize', + img_scale=(2048, 1024), + ratio_range=(1., 2.), + keep_ration=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs'), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', + scale=(2048, 1024), + keep_ratio=True), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), + pipeline=train_pipeline) +test_dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + pipeline=test_pipeline) +train_dataloader = dict(dataset=train_dataset) +val_dataloader = dict(dataset=test_dataset) +test_dataloader = val_dataloader +``` + +ๆˆ‘ไปฌ้ฆ–ๅ…ˆ้œ€่ฆๅฎšไน‰ๆ–ฐ็š„ `train_pipeline`/`test_pipeline` ็„ถๅŽไผ ้€’ๅˆฐ `dataset` ้‡Œใ€‚ + +็ฑปไผผ็š„๏ผŒๅฆ‚ๆžœๆˆ‘ไปฌๆƒณไปŽ `SyncBN` ๅˆ‡ๆขๅˆฐ `BN` ๆˆ–่€… `MMSyncBN`๏ผŒๆˆ‘ไปฌ้œ€่ฆๆ›ฟๆข้…็ฝฎๆ–‡ไปถ้‡Œ็š„ๆฏไธ€ไธช `norm_cfg`ใ€‚ + +```python +_base_ = '../pspnet/pspnet_r50-d8_4xb4-40k_cityscpaes-512x1024.py' +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + decode_head=dict(norm_cfg=norm_cfg), + auxiliary_head=dict(norm_cfg=norm_cfg)) +``` + +## ้€š่ฟ‡่„šๆœฌๅ‚ๆ•ฐไฟฎๆ”น้…็ฝฎๆ–‡ไปถ + +ๅœจ[training script](https://github.com/open-mmlab/mmsegmentation/blob/1.x/tools/train.py)ๅ’Œ[testing script](https://github.com/open-mmlab/mmsegmentation/blob/1.x/tools/test.py)ไธญ๏ผŒๆˆ‘ไปฌๆ”ฏๆŒ่„šๆœฌๅ‚ๆ•ฐ `--cfg-options`๏ผŒๅฎƒๅฏไปฅๅธฎๅŠฉ็”จๆˆท่ฆ†็›–ๆ‰€ไฝฟ็”จ็š„้…็ฝฎไธญ็š„ไธ€ไบ›่ฎพ็ฝฎ๏ผŒ`xxx=yyy` ๆ ผๅผ็š„้”ฎๅ€ผๅฏนๅฐ†ๅˆๅนถๅˆฐ้…็ฝฎๆ–‡ไปถไธญใ€‚ + +ไพ‹ๅฆ‚๏ผŒ่ฟ™ๆ˜ฏไธ€ไธช็ฎ€ๅŒ–็š„่„šๆœฌ `demo_script.py `: + +```python +import argparse + +from mmengine.config import Config, DictAction + +def parse_args(): + parser = argparse.ArgumentParser(description='Script Example') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + print(cfg) + +if __name__ == '__main__': + main() +``` + +ไธ€ไธช้…็ฝฎๆ–‡ไปถ็คบไพ‹ `demo_config.py` ๅฆ‚ไธ‹ๆ‰€็คบ: + +```python +backbone = dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_eval=False, + style='pytorch', + contract_dilation=True) +``` + +่ฟ่กŒ `demo_script.py`: + +```shell +python demo_script.py demo_config.py +``` + +```shell +Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': (1, 2, 1, 1), 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} +``` + +้€š่ฟ‡่„šๆœฌๅ‚ๆ•ฐไฟฎๆ”น้…็ฝฎ: + +```shell +python demo_script.py demo_config.py --cfg-options backbone.depth=101 +``` + +```shell +Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 101, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': (1, 2, 1, 1), 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} +``` + +- ๆ›ดๆ–ฐๅˆ—่กจ/ๅ…ƒ็ป„็š„ๅ€ผใ€‚ + + ๅฆ‚ๆžœ่ฆๆ›ดๆ–ฐ็š„ๅ€ผๆ˜ฏไธ€ไธช list ๆˆ– tupleใ€‚ไพ‹ๅฆ‚๏ผŒ้œ€่ฆๅœจ้…็ฝฎๆ–‡ไปถ `demo_config.py ` ็š„ `backbone ` ไธญ่ฎพ็ฝฎ `stride =(1,2,1,1) `ใ€‚ + ๅฆ‚ๆžœๆ‚จๆƒณๆ›ดๆ”น่ฟ™ไธช้”ฎ๏ผŒไฝ ๅฏไปฅ็”จไธค็งๆ–นๅผ่ฟ›่กŒๆŒ‡ๅฎš: + + 1. `--cfg-options backbone.strides="(1, 1, 1, 1)"`. ๆณจๆ„ๅผ•ๅท " ๆ˜ฏๆ”ฏๆŒ list/tuple ๆ•ฐๆฎ็ฑปๅž‹ๆ‰€ๅฟ…้œ€็š„ใ€‚ + + ```shell + python demo_script.py demo_config.py --cfg-options backbone.strides="(1, 1, 1, 1)" + ``` + + ```shell + Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': (1, 1, 1, 1), 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} + ``` + + 2. `--cfg-options backbone.strides=1,1,1,1`. ๆณจๆ„๏ผŒๅœจๆŒ‡ๅฎš็š„ๅ€ผไธญ**ไธๅ…่ฎธ**ๆœ‰็ฉบๆ ผใ€‚ + + ๅฆๅค–๏ผŒๅฆ‚ๆžœๅŽŸๆฅ็š„็ฑปๅž‹ๆ˜ฏtuple๏ผŒ้€š่ฟ‡่ฟ™็งๆ–นๅผไฟฎๆ”นๅŽไผš่‡ชๅŠจ่ฝฌๆขไธบlistใ€‚ + + ```shell + python demo_script.py demo_config.py --cfg-options backbone.strides=1,1,1,1 + ``` + + ```shell + Config (path: demo_config.py): {'backbone': {'type': 'ResNetV1c', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'dilations': (1, 1, 2, 4), 'strides': [1, 1, 1, 1], 'norm_eval': False, 'style': 'pytorch', 'contract_dilation': True}} + ``` + +```{note} + ่ฟ™็งไฟฎๆ”นๆ–นๆณ•ไป…ๆ”ฏๆŒไฟฎๆ”นstringใ€intใ€floatใ€booleanใ€Noneใ€listๅ’Œtuple็ฑปๅž‹็š„้…็ฝฎ้กนใ€‚ + ๅ…ทไฝ“ๆฅ่ฏด๏ผŒๅฏนไบŽlistๅ’Œtuple็ฑปๅž‹็š„้…็ฝฎ้กน๏ผŒๅฎƒไปฌๅ†…้ƒจ็š„ๅ…ƒ็ด ไนŸๅฟ…้กปๆ˜ฏไธŠ่ฟฐไธƒ็ง็ฑปๅž‹ไน‹ไธ€ใ€‚ +``` diff --git a/mmsegmentation/docs/zh_cn/user_guides/2_dataset_prepare.md b/mmsegmentation/docs/zh_cn/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..e32303a --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/2_dataset_prepare.md @@ -0,0 +1,802 @@ +# ๆ•™็จ‹2๏ผšๅ‡†ๅค‡ๆ•ฐๆฎ้›† + +ๆˆ‘ไปฌๅปบ่ฎฎๅฐ†ๆ•ฐๆฎ้›†ๆ น็›ฎๅฝ•็ฌฆๅท้“พๆŽฅๅˆฐ `$MMSEGMENTATION/data`ใ€‚ +ๅฆ‚ๆžœๆ‚จ็š„็›ฎๅฝ•็ป“ๆž„ไธๅŒ๏ผŒๆ‚จๅฏ่ƒฝ้œ€่ฆๆ›ดๆ”น้…็ฝฎๆ–‡ไปถไธญ็›ธๅบ”็š„่ทฏๅพ„ใ€‚ +ๅฏนไบŽไธญๅ›ฝๅขƒๅ†…็š„็”จๆˆท๏ผŒๆˆ‘ไปฌไนŸๆŽจ่้€š่ฟ‡ๅผ€ๆบๆ•ฐๆฎๅนณๅฐ [OpenDataLab](https://opendatalab.com/) ๆฅไธ‹่ฝฝdsdlๆ ‡ๅ‡†ๆ•ฐๆฎ๏ผŒไปฅ่Žทๅพ—ๆ›ดๅฅฝ็š„ไธ‹่ฝฝๅ’Œไฝฟ็”จไฝ“้ชŒ๏ผŒ่ฟ™้‡Œๆœ‰ไธ€ไธชไธ‹่ฝฝdsdlๆ•ฐๆฎ้›†ๅนถ่ฟ›่กŒ่ฎญ็ปƒ็š„ๆกˆไพ‹[DSDLReadme](../../../configs/dsdl/README.md)๏ผŒๆฌข่ฟŽๅฐ่ฏ•ใ€‚ + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ cityscapes +โ”‚ โ”‚ โ”œโ”€โ”€ leftImg8bit +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ gtFine +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ VOCdevkit +โ”‚ โ”‚ โ”œโ”€โ”€ VOC2012 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ JPEGImages +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SegmentationClass +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ImageSets +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Segmentation +โ”‚ โ”‚ โ”œโ”€โ”€ VOC2010 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ JPEGImages +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SegmentationClassContext +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ImageSets +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SegmentationContext +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ trainval_merged.json +โ”‚ โ”‚ โ”œโ”€โ”€ VOCaug +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dataset +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ cls +โ”‚ โ”œโ”€โ”€ ade +โ”‚ โ”‚ โ”œโ”€โ”€ ADEChallengeData2016 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ coco_stuff10k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2014 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test2014 +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2014 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test2014 +โ”‚ โ”‚ โ”œโ”€โ”€ imagesLists +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test.txt +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ all.txt +โ”‚ โ”œโ”€โ”€ coco_stuff164k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2017 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val2017 +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train2017 +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val2017 +โ”‚ โ”œโ”€โ”€ CHASE_DB1 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ DRIVE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ HRF +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”œโ”€โ”€ STARE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +| โ”œโ”€โ”€ dark_zurich +| โ”‚ย ย  โ”œโ”€โ”€ gps +| โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ val +| โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ val_ref +| โ”‚ย ย  โ”œโ”€โ”€ gt +| โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ val +| โ”‚ย ย  โ”œโ”€โ”€ LICENSE.txt +| โ”‚ย ย  โ”œโ”€โ”€ lists_file_names +| โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ val_filenames.txt +| โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ val_ref_filenames.txt +| โ”‚ย ย  โ”œโ”€โ”€ README.md +| โ”‚ย ย  โ””โ”€โ”€ rgb_anon +| โ”‚ย ย  | โ”œโ”€โ”€ val +| โ”‚ย ย  | โ””โ”€โ”€ val_ref +| โ”œโ”€โ”€ NighttimeDrivingTest +| | โ”œโ”€โ”€ gtCoarse_daytime_trainvaltest +| | โ”‚ย ย  โ””โ”€โ”€ test +| | โ”‚ย ย  โ””โ”€โ”€ night +| | โ””โ”€โ”€ leftImg8bit +| | | โ””โ”€โ”€ test +| | | โ””โ”€โ”€ night +โ”‚ โ”œโ”€โ”€ loveDA +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ potsdam +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ vaihingen +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ iSAID +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ synapse +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”œโ”€โ”€ REFUGE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”œโ”€โ”€ mapillary +โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons +โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +| โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons +โ”‚ โ”œโ”€โ”€ bdd100k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ 10k +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ val +โ”‚ โ”‚ โ””โ”€โ”€ labels +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ sem_seg +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ colormaps +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ polygons +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ rles +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +โ”‚ โ”œโ”€โ”€ nyu +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”œโ”€โ”€ HSIDrive20 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +``` + +## ็”จ MIM ไธ‹่ฝฝๆ•ฐๆฎ้›† + +้€š่ฟ‡ไฝฟ็”จ [OpenXLab](https://openxlab.org.cn/datasets)๏ผŒๆ‚จๅฏไปฅ็›ดๆŽฅไธ‹่ฝฝๅผ€ๆบๆ•ฐๆฎ้›†ใ€‚้€š่ฟ‡ๅนณๅฐ็š„ๆœ็ดขๅŠŸ่ƒฝ๏ผŒๆ‚จๅฏไปฅๅฟซ้€Ÿ่ฝปๆพๅœฐๆ‰พๅˆฐไป–ไปฌๆญฃๅœจๅฏปๆ‰พ็š„ๆ•ฐๆฎ้›†ใ€‚ไฝฟ็”จๅนณๅฐไธŠ็š„ๆ ผๅผๅŒ–ๆ•ฐๆฎ้›†๏ผŒๆ‚จๅฏไปฅ้ซ˜ๆ•ˆๅœฐ่ทจๆ•ฐๆฎ้›†ๆ‰ง่กŒไปปๅŠกใ€‚ + +ๅฆ‚ๆžœๆ‚จไฝฟ็”จ MIM ไธ‹่ฝฝ๏ผŒ่ฏท็กฎไฟ็‰ˆๆœฌๅคงไบŽ v0.3.8ใ€‚ๆ‚จๅฏไปฅไฝฟ็”จไปฅไธ‹ๅ‘ฝไปค่ฟ›่กŒๆ›ดๆ–ฐใ€ๅฎ‰่ฃ…ใ€็™ปๅฝ•ๅ’Œๆ•ฐๆฎ้›†ไธ‹่ฝฝ๏ผš + +```shell +# upgrade your MIM +pip install -U openmim + +# install OpenXLab CLI tools +pip install -U openxlab +# log in OpenXLab +openxlab login + +# download ADE20K by MIM +mim download mmsegmentation --dataset ade20k +``` + +## Cityscapes + +Cityscapes [ๅฎ˜ๆ–น็ฝ‘็ซ™](https://www.cityscapes-dataset.com/)ๅฏไปฅไธ‹่ฝฝ Cityscapes ๆ•ฐๆฎ้›†๏ผŒๆŒ‰็…งๅฎ˜็ฝ‘่ฆๆฑ‚ๆณจๅ†Œๅนถ็™ป้™†ๅŽ๏ผŒๆ•ฐๆฎๅฏไปฅๅœจ[่ฟ™้‡Œ](https://www.cityscapes-dataset.com/downloads/)ๆ‰พๅˆฐใ€‚ + +ๆŒ‰็…งๆƒฏไพ‹๏ผŒ`**labelTrainIds.png` ็”จไบŽ cityscapes ่ฎญ็ปƒใ€‚ +ๆˆ‘ไปฌๆไพ›ไบ†ไธ€ไธชๅŸบไบŽ [cityscapesscripts](https://github.com/mcordts/cityscapesScripts) ็š„[่„šๆœฌ](https://github.com/open-mmlab/mmsegmentation/blob/1.x/tools/dataset_converters/cityscapes.py)็”จไบŽ็”Ÿๆˆ `**labelTrainIds.png`ใ€‚ + +```shell +# --nproc ่กจ็คบ 8 ไธช่ฝฌๆข่ฟ›็จ‹๏ผŒไนŸๅฏไปฅ็œ็•ฅใ€‚ +python tools/dataset_converters/cityscapes.py data/cityscapes --nproc 8 +``` + +## Pascal VOC + +Pascal VOC 2012 ๅฏไปŽ[ๆญคๅค„](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar)ไธ‹่ฝฝใ€‚ +ๆญคๅค–๏ผŒPascal VOC ๆ•ฐๆฎ้›†็š„ๆœ€ๆ–ฐๅทฅไฝœ้€šๅธธๅˆฉ็”จ้ขๅค–็š„ๅขžๅผบๆ•ฐๆฎ๏ผŒๅฏไปฅๅœจ[่ฟ™้‡Œ](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz)ๆ‰พๅˆฐใ€‚ + +ๅฆ‚ๆžœๆ‚จๆƒณไฝฟ็”จๅขžๅผบ็š„ VOC ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๅฐ†ๅขžๅผบๆ•ฐๆฎ็š„ๆ ‡ๆณจ่ฝฌๆขไธบๆญฃ็กฎ็š„ๆ ผๅผใ€‚ + +```shell +# --nproc ่กจ็คบ 8 ไธช่ฝฌๆข่ฟ›็จ‹๏ผŒไนŸๅฏไปฅ็œ็•ฅใ€‚ +python tools/dataset_converters/voc_aug.py data/VOCdevkit data/VOCdevkit/VOCaug --nproc 8 +``` + +่ฏทๅ‚่€ƒ[ๆ‹ผๆŽฅๆ•ฐๆฎ้›†ๆ–‡ๆกฃ](../advanced_guides/add_datasets.md#ๆ‹ผๆŽฅๆ•ฐๆฎ้›†)ๅŠ [voc_aug ้…็ฝฎ็คบไพ‹](../../../configs/_base_/datasets/pascal_voc12_aug.py)ไปฅ่ฏฆ็ป†ไบ†่งฃๅฆ‚ไฝ•ๅฐ†ๅฎƒไปฌๆ‹ผๆŽฅๅนถๅˆๅนถ่ฎญ็ปƒใ€‚ + +## ADE20K + +ADE20K ็š„่ฎญ็ปƒๅ’Œ้ชŒ่ฏ้›†ๅฏไปฅไปŽ่ฟ™ไธช[้“พๆŽฅ](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip)ไธ‹่ฝฝใ€‚ +ๅฆ‚ๆžœ้œ€่ฆไธ‹่ฝฝๆต‹่ฏ•ๆ•ฐๆฎ้›†๏ผŒๅฏไปฅๅœจ[ๅฎ˜็ฝ‘](http://host.robots.ox.ac.uk/)ๆณจๅ†ŒๅŽ๏ผŒไธ‹่ฝฝ[ๆต‹่ฏ•้›†](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar)ใ€‚ + +## Pascal Context + +Pascal Context ็š„่ฎญ็ปƒๅ’Œ้ชŒ่ฏ้›†ๅฏไปฅไปŽ[ๆญคๅค„](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar)ไธ‹่ฝฝใ€‚ๆณจๅ†ŒๅŽ๏ผŒๆ‚จไนŸๅฏไปฅไปŽ[ๆญคๅค„](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar)ไธ‹่ฝฝๆต‹่ฏ•้›†ใ€‚ + +ไปŽๅŽŸๅง‹ๆ•ฐๆฎ้›†ไธญๆŠฝๅ‡บ้ƒจๅˆ†ๆ•ฐๆฎไฝœไธบ้ชŒ่ฏ้›†๏ผŒๆ‚จๅฏไปฅไปŽ[ๆญคๅค„](https://codalabuser.blob.core.windows.net/public/trainval_merged.json)ไธ‹่ฝฝ trainval_merged.json ๆ–‡ไปถใ€‚ + +่ฏทๅ…ˆๅฎ‰่ฃ… [Detail](https://github.com/zhanghang1989/detail-api) ๅทฅๅ…ท็„ถๅŽ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๅฐ†ๆ ‡ๆณจ่ฝฌๆขไธบๆญฃ็กฎ็š„ๆ ผๅผใ€‚ + +```shell +python tools/dataset_converters/pascal_context.py data/VOCdevkit data/VOCdevkit/VOC2010/trainval_merged.json +``` + +## COCO Stuff 10k + +ๆ•ฐๆฎๅฏไปฅ้€š่ฟ‡ wget ๅœจ[่ฟ™้‡Œ](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/cocostuff-10k-v1.1.zip)ไธ‹่ฝฝใ€‚ + +ๅฏนไบŽ COCO Stuff 10k ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคไธ‹่ฝฝๅนถ่ฝฌๆขๆ•ฐๆฎ้›†ใ€‚ + +```shell +# ไธ‹่ฝฝ +mkdir coco_stuff10k && cd coco_stuff10k +wget http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/cocostuff-10k-v1.1.zip + +# ่งฃๅŽ‹ +unzip cocostuff-10k-v1.1.zip + +# --nproc ่กจ็คบ 8 ไธช่ฝฌๆข่ฟ›็จ‹๏ผŒไนŸๅฏไปฅ็œ็•ฅใ€‚ +python tools/dataset_converters/coco_stuff10k.py /path/to/coco_stuff10k --nproc 8 +``` + +ๆŒ‰็…งๆƒฏไพ‹๏ผŒ`/path/to/coco_stuff164k/annotations/*2014/*_labelTrainIds.png` ไธญ็š„ mask ๆ ‡ๆณจ็”จไบŽ COCO Stuff 10k ็š„่ฎญ็ปƒๅ’Œๆต‹่ฏ•ใ€‚ + +## COCO Stuff 164k + +ๅฏนไบŽ COCO Stuff 164k ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคไธ‹่ฝฝๅนถ่ฝฌๆขๅขžๅผบ็š„ๆ•ฐๆฎ้›†ใ€‚ + +```shell +# ไธ‹่ฝฝ +mkdir coco_stuff164k && cd coco_stuff164k +wget http://images.cocodataset.org/zips/train2017.zip +wget http://images.cocodataset.org/zips/val2017.zip +wget http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip + +# ่งฃๅŽ‹ +unzip train2017.zip -d images/ +unzip val2017.zip -d images/ +unzip stuffthingmaps_trainval2017.zip -d annotations/ + +# --nproc ่กจ็คบ 8 ไธช่ฝฌๆข่ฟ›็จ‹๏ผŒไนŸๅฏไปฅ็œ็•ฅใ€‚ +python tools/dataset_converters/coco_stuff164k.py /path/to/coco_stuff164k --nproc 8 +``` + +ๆŒ‰็…งๆƒฏไพ‹๏ผŒ`/path/to/coco_stuff164k/annotations/*2017/*_labelTrainIds.png` ไธญ็š„ mask ๆ ‡ๆณจ็”จไบŽ COCO Stuff 164k ็š„่ฎญ็ปƒๅ’Œๆต‹่ฏ•ใ€‚ + +ๆญคๆ•ฐๆฎ้›†็š„่ฏฆ็ป†ไฟกๆฏๅฏๅœจ[ๆญคๅค„](https://github.com/nightrome/cocostuff#downloads)ๆ‰พๅˆฐใ€‚ + +## CHASE DB1 + +CHASE DB1 ็š„่ฎญ็ปƒๅ’Œ้ชŒ่ฏ้›†ๅฏไปฅไปŽ[ๆญคๅค„](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip)ไธ‹่ฝฝใ€‚ + +่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผŒๅ‡†ๅค‡ CHASE DB1 ๆ•ฐๆฎ้›†๏ผš + +```shell +python tools/dataset_converters/chase_db1.py /path/to/CHASEDB1.zip +``` + +่ฏฅ่„šๆœฌๅฐ†่‡ชๅŠจ่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•็ป“ๆž„๏ผŒไฝฟๅ…ถๆปก่ถณ MMSegmentation ๆ•ฐๆฎ้›†ๅŠ ่ฝฝ่ฆๆฑ‚ใ€‚ + +## DRIVE + +ๆŒ‰็…ง[ๅฎ˜็ฝ‘](https://drive.grand-challenge.org/)่ฆๆฑ‚๏ผŒๆณจๅ†Œๅนถ็™ป้™†ๅŽ๏ผŒไพฟๅฏไปฅไธ‹่ฝฝ DRIVE ็š„่ฎญ็ปƒๅ’Œ้ชŒ่ฏๆ•ฐๆฎ้›†ใ€‚ + +่ฆๅฐ† DRIVE ๆ•ฐๆฎ้›†่ฝฌๆขไธบ MMSegmentation ็š„ๆ ผๅผ๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผš + +```shell +python tools/dataset_converters/drive.py /path/to/training.zip /path/to/test.zip +``` + +่ฏฅ่„šๆœฌๅฐ†่‡ชๅŠจ่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•็ป“ๆž„๏ผŒไฝฟๅ…ถๆปก่ถณ MMSegmentation ๆ•ฐๆฎ้›†ๅŠ ่ฝฝ่ฆๆฑ‚ใ€‚ + +## HRF + +่ฏทไธ‹่ฝฝ [health.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy.zip)ใ€[glaucoma.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma.zip)ใ€[diabetic_retinopathy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy.zip)ใ€[healthy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy_manualsegm.zip)ใ€[glaucoma_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma_manualsegm.zip) ๅ’Œ [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip)๏ผŒๆ— ้œ€่งฃๅŽ‹๏ผŒๅฏไปฅ็›ดๆŽฅ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผŒๅ‡†ๅค‡ HRF ๆ•ฐๆฎ้›†๏ผš + +```shell +python tools/dataset_converters/hrf.py /path/to/healthy.zip /path/to/healthy_manualsegm.zip /path/to/glaucoma.zip /path/to/glaucoma_manualsegm.zip /path/to/diabetic_retinopathy.zip /path/to/diabetic_retinopathy_manualsegm.zip +``` + +่ฏฅ่„šๆœฌๅฐ†่‡ชๅŠจ่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•็ป“ๆž„๏ผŒไฝฟๅ…ถๆปก่ถณ MMSegmentation ๆ•ฐๆฎ้›†ๅŠ ่ฝฝ่ฆๆฑ‚ใ€‚ + +## STARE + +่ฏทไธ‹่ฝฝ [stare images.tar](http://cecas.clemson.edu/~ahoover/stare/probing/stare-images.tar)ใ€[labels-ah.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-ah.tar) ๅ’Œ [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar)๏ผŒๆ— ้œ€่งฃๅŽ‹๏ผŒๅฏไปฅ็›ดๆŽฅ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผŒๅ‡†ๅค‡ STARE ๆ•ฐๆฎ้›†๏ผš + +```shell +python tools/dataset_converters/stare.py /path/to/stare-images.tar /path/to/labels-ah.tar /path/to/labels-vk.tar +``` + +่ฏฅ่„šๆœฌๅฐ†่‡ชๅŠจ่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•็ป“ๆž„๏ผŒไฝฟๅ…ถๆปก่ถณ MMSegmentation ๆ•ฐๆฎ้›†ๅŠ ่ฝฝ่ฆๆฑ‚ใ€‚ + +## Dark Zurich + +็”ฑไบŽๆˆ‘ไปฌๅชๆ”ฏๆŒๅœจๆญคๆ•ฐๆฎ้›†ไธŠ็š„ๆจกๅž‹ๆต‹่ฏ•๏ผŒๅ› ๆญคๆ‚จๅช้œ€่ฆไธ‹่ฝฝๅนถ่งฃๅŽ‹[้ชŒ่ฏๆ•ฐๆฎ้›†](https://data.vision.ee.ethz.ch/csakarid/shared/GCMA_UIoU/Dark_Zurich_val_anon.zip)ใ€‚ + +## Nighttime Driving + +็”ฑไบŽๆˆ‘ไปฌๅชๆ”ฏๆŒๅœจๆญคๆ•ฐๆฎ้›†ไธŠ็š„ๆจกๅž‹ๆต‹่ฏ•๏ผŒๅ› ๆญคๆ‚จๅช้œ€่ฆไธ‹่ฝฝๅนถ่งฃๅŽ‹[้ชŒ่ฏๆ•ฐๆฎ้›†](http://data.vision.ee.ethz.ch/daid/NighttimeDriving/NighttimeDrivingTest.zip)ใ€‚ + +## LoveDA + +ๆ•ฐๆฎๅฏไปฅไปŽ[ๆญคๅค„](https://drive.google.com/drive/folders/1ibYV0qwn4yuuh068Rnc-w4tPi0U0c-ti?usp=sharing)ไธ‹่ฝฝ LaveDA ๆ•ฐๆฎ้›†ใ€‚ + +ๆˆ–่€…ๅฏไปฅไปŽ [zenodo](https://zenodo.org/record/5706578#.YZvN7SYRXdF) ไธ‹่ฝฝใ€‚ไธ‹่ฝฝๅŽ๏ผŒๆ— ้œ€่งฃๅŽ‹๏ผŒ็›ดๆŽฅ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผš + +```shell +# ไธ‹่ฝฝ Train.zip +wget https://zenodo.org/record/5706578/files/Train.zip +# ไธ‹่ฝฝ Val.zip +wget https://zenodo.org/record/5706578/files/Val.zip +# ไธ‹่ฝฝ Test.zip +wget https://zenodo.org/record/5706578/files/Test.zip +``` + +่ฏทๅฏนไบŽ LoveDA ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•ใ€‚ + +```shell +python tools/dataset_converters/loveda.py /path/to/loveDA +``` + +ๅฏๅฐ†ๆจกๅž‹ๅฏน LoveDA ็š„ๆต‹่ฏ•้›†็š„้ข„ๆต‹็ป“ๆžœไธŠไผ ่‡ณๅˆฐๆ•ฐๆฎ้›†[ๆต‹่ฏ•ๆœๅŠกๅ™จ](https://codalab.lisn.upsaclay.fr/competitions/421)๏ผŒๆŸฅ็œ‹่ฏ„ๆต‹็ป“ๆžœใ€‚ + +ๆœ‰ๅ…ณ LoveDA ็š„ๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏ๏ผŒๅฏๆŸฅ็œ‹[ๆญคๅค„](https://github.com/Junjue-Wang/LoveDA). + +## ISPRS Potsdam + +[Potsdam](https://www.isprs.org/education/benchmarks/UrbanSemLab/2d-sem-label-potsdam.aspx) ๅŸŽๅธ‚่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ้›†็”จไบŽ 2D ่ฏญไน‰ๅˆ†ๅ‰ฒ็ซž่ต› โ€”โ€” Potsdamใ€‚ + +ๆ•ฐๆฎ้›†ๅฏไปฅๅœจ็ซž่ต›[ไธป้กต](https://www.isprs.org/education/benchmarks/UrbanSemLab/default.aspx)ไธŠ่ฏทๆฑ‚่Žทๅพ—ใ€‚ +่ฟ™้‡ŒไนŸๆไพ›ไบ†[BaiduNetdisk](https://pan.baidu.com/s/1K-cLVZnd1X7d8c26FQ-nGg?pwd=mseg)๏ผŒๆๅ–็ ๏ผšmsegใ€ [Google Drive](https://drive.google.com/drive/folders/1w3EJuyUGet6_qmLwGAWZ9vw5ogeG0zLz?usp=sharing)ไปฅๅŠ[OpenDataLab](https://opendatalab.com/ISPRS_Potsdam/download)ใ€‚ +ๅฎž้ชŒไธญ้œ€่ฆไธ‹่ฝฝ '2_Ortho_RGB.zip' ๅ’Œ '5_Labels_all_noBoundary.zip'ใ€‚ + +ๅฏนไบŽ Potsdam ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•ใ€‚ + +```shell +python tools/dataset_converters/potsdam.py /path/to/potsdam +``` + +ๅœจๆˆ‘ไปฌ็š„้ป˜่ฎค่ฎพ็ฝฎไธญ๏ผŒๅฐ†็”Ÿๆˆ 3456 ๅผ ๅ›พๅƒ็”จไบŽ่ฎญ็ปƒๅ’Œ 2016 ๅผ ๅ›พๅƒ็”จไบŽ้ชŒ่ฏใ€‚ + +## ISPRS Vaihingen + +[Vaihingen](https://www.isprs.org/education/benchmarks/UrbanSemLab/2d-sem-label-vaihingen.aspx) ๅŸŽๅธ‚่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ้›†็”จไบŽ 2D ่ฏญไน‰ๅˆ†ๅ‰ฒ็ซž่ต› โ€”โ€” Vaihingenใ€‚ + +ๆ•ฐๆฎ้›†ๅฏไปฅๅœจ็ซž่ต›[ไธป้กต](https://www.isprs.org/education/benchmarks/UrbanSemLab/default.aspx)ไธŠ่ฏทๆฑ‚่Žทๅพ—ใ€‚ +่ฟ™้‡ŒไนŸๆไพ›ไบ†[BaiduNetdisk](https://pan.baidu.com/s/109D3WLrLafsuYtLeerLiiA?pwd=mseg)๏ผŒๆๅ–็ ๏ผšmseg ใ€ [Google Drive](https://drive.google.com/drive/folders/1w3NhvLVA2myVZqOn2pbiDXngNC7NTP_t?usp=sharing)ใ€‚ +ๅฎž้ชŒไธญ้œ€่ฆไธ‹่ฝฝ 'ISPRS_semantic_labeling_Vaihingen.zip' ๅ’Œ 'ISPRS_semantic_labeling_Vaihingen_ground_truth_eroded_COMPLETE.zip'ใ€‚ + +ๅฏนไบŽ Vaihingen ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค่ฐƒๆ•ดๆ•ฐๆฎ้›†็›ฎๅฝ•ใ€‚ + +```shell +python tools/dataset_converters/vaihingen.py /path/to/vaihingen +``` + +ๅœจๆˆ‘ไปฌ็š„้ป˜่ฎค่ฎพ็ฝฎ๏ผˆ`clip_size`=512, `stride_size`=256๏ผ‰ไธญ๏ผŒๅฐ†็”Ÿๆˆ 344 ๅผ ๅ›พๅƒ็”จไบŽ่ฎญ็ปƒๅ’Œ 398 ๅผ ๅ›พๅƒ็”จไบŽ้ชŒ่ฏใ€‚ + +## iSAID + +iSAID ๆ•ฐๆฎ้›†ๅฏไปŽ [DOTA-v1.0](https://captain-whu.github.io/DOTA/dataset.html) ไธ‹่ฝฝ่ฎญ็ปƒ/้ชŒ่ฏ/ๆต‹่ฏ•ๆ•ฐๆฎ้›†็š„ๅ›พๅƒๆ•ฐๆฎ๏ผŒ + +ๅนถไปŽ [iSAID](https://captain-whu.github.io/iSAID/dataset.html)ไธ‹่ฝฝ่ฎญ็ปƒ/้ชŒ่ฏๆ•ฐๆฎ้›†็š„ๆ ‡ๆณจๆ•ฐๆฎใ€‚ + +่ฏฅๆ•ฐๆฎ้›†ๆ˜ฏ่ˆช็ฉบๅ›พๅƒๅฎžไพ‹ๅˆ†ๅ‰ฒๅ’Œ่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠก็š„ๅคง่ง„ๆจกๆ•ฐๆฎ้›†ใ€‚ + +ไธ‹่ฝฝ iSAID ๆ•ฐๆฎ้›†ๅŽ๏ผŒๆ‚จๅฏ่ƒฝ้œ€่ฆๆŒ‰็…งไปฅไธ‹็ป“ๆž„่ฟ›่กŒๆ•ฐๆฎ้›†ๅ‡†ๅค‡ใ€‚ + +```none +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ iSAID +โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part1.zip +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part2.zip +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part3.zip +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Semantic_masks +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images.zip +โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part1.zip +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Semantic_masks +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images.zip +โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part1.zip +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ part2.zip +``` + +```shell +python tools/dataset_converters/isaid.py /path/to/iSAID +``` + +ๅœจๆˆ‘ไปฌ็š„้ป˜่ฎค่ฎพ็ฝฎ๏ผˆ`patch_width`=896, `patch_height`=896, `overlap_area`=384๏ผ‰ไธญ๏ผŒๅฐ†็”Ÿๆˆ 33978 ๅผ ๅ›พๅƒ็”จไบŽ่ฎญ็ปƒๅ’Œ 11644 ๅผ ๅ›พๅƒ็”จไบŽ้ชŒ่ฏใ€‚ + +## LIP(Look Into Person) dataset + +่ฏฅๆ•ฐๆฎ้›†ๅฏไปฅไปŽ[ๆญค้กต้ข](https://lip.sysuhcp.com/overview.php)ไธ‹่ฝฝใ€‚ + +่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๆฅ่งฃๅŽ‹ๆ•ฐๆฎ้›†ใ€‚ + +```shell +unzip LIP.zip +cd LIP +unzip TrainVal_images.zip +unzip TrainVal_parsing_annotations.zip +cd TrainVal_parsing_annotations +unzip TrainVal_parsing_annotations.zip +mv train_segmentations ../ +mv val_segmentations ../ +cd .. +``` + +LIP ๆ•ฐๆฎ้›†็š„ๅ†…ๅฎนๅŒ…ๆ‹ฌ๏ผš + +```none +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ LIP +โ”‚ โ”‚ โ”œโ”€โ”€ train_images +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 1000_1234574.jpg +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ train_segmentations +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 1000_1234574.png +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ val_images +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 100034_483681.jpg +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ val_segmentations +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ 100034_483681.png +โ”‚ย ย  โ”‚ โ”‚ โ”œโ”€โ”€ ... +``` + +## Synapse dataset + +ๆญคๆ•ฐๆฎ้›†ๅฏไปฅไปŽ[ๆญค้กต้ข](https://www.synapse.org/#!Synapse:syn3193805/wiki/)ไธ‹่ฝฝใ€‚ + +้ตๅพช [TransUNet](https://arxiv.org/abs/2102.04306) ็š„ๆ•ฐๆฎๅ‡†ๅค‡่ฎพๅฎš๏ผŒๅฐ†ๅŽŸๅง‹่ฎญ็ปƒ้›†๏ผˆ30 ๆฌกๆ‰ซๆ๏ผ‰ๆ‹†ๅˆ†ไธบๆ–ฐ็š„่ฎญ็ปƒ้›†๏ผˆ18 ๆฌกๆ‰ซๆ๏ผ‰ๅ’Œ้ชŒ่ฏ้›†๏ผˆ12 ๆฌกๆ‰ซๆ๏ผ‰ใ€‚่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๆฅๅ‡†ๅค‡ๆ•ฐๆฎ้›†ใ€‚ + +```shell +unzip RawData.zip +cd ./RawData/Training +``` + +็„ถๅŽๅˆ›ๅปบ `train.txt` ๅ’Œ `val.txt` ไปฅๆ‹†ๅˆ†ๆ•ฐๆฎ้›†ใ€‚ + +ๆ นๆฎ TransUnet๏ผŒไปฅไธ‹ๆ˜ฏๆ•ฐๆฎ้›†็š„ๅˆ’ๅˆ†ใ€‚ + +train.txt + +```none +img0005.nii.gz +img0006.nii.gz +img0007.nii.gz +img0009.nii.gz +img0010.nii.gz +img0021.nii.gz +img0023.nii.gz +img0024.nii.gz +img0026.nii.gz +img0027.nii.gz +img0028.nii.gz +img0030.nii.gz +img0031.nii.gz +img0033.nii.gz +img0034.nii.gz +img0037.nii.gz +img0039.nii.gz +img0040.nii.gz +``` + +val.txt + +```none +img0008.nii.gz +img0022.nii.gz +img0038.nii.gz +img0036.nii.gz +img0032.nii.gz +img0002.nii.gz +img0029.nii.gz +img0003.nii.gz +img0001.nii.gz +img0004.nii.gz +img0025.nii.gz +img0035.nii.gz +``` + +synapse ๆ•ฐๆฎ้›†็š„ๅ†…ๅฎนๅŒ…ๆ‹ฌ๏ผš + +```none +โ”œโ”€โ”€ Training +โ”‚ โ”œโ”€โ”€ img +โ”‚ โ”‚ โ”œโ”€โ”€ img0001.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ img0002.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”œโ”€โ”€ label +โ”‚ โ”‚ โ”œโ”€โ”€ label0001.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ label0002.nii.gz +โ”‚ โ”‚ โ”œโ”€โ”€ ... +โ”‚ โ”œโ”€โ”€ train.txt +โ”‚ โ”œโ”€โ”€ val.txt +``` + +็„ถๅŽ๏ผŒไฝฟ็”จๆญคๅ‘ฝไปค่ฝฌๆข synapse ๆ•ฐๆฎ้›†ใ€‚ + +```shell +python tools/dataset_converters/synapse.py --dataset-path /path/to/synapse +``` + +ๆณจๆ„๏ผŒMMSegmentation ็š„้ป˜่ฎค่ฏ„ไผฐๆŒ‡ๆ ‡๏ผˆไพ‹ๅฆ‚ mean dice value๏ผ‰ๆ˜ฏๅœจ 2D ๅˆ‡็‰‡ๅ›พๅƒไธŠ่ฎก็ฎ—็š„๏ผŒ่ฟ™ไธŽ [TransUNet](https://arxiv.org/abs/2102.04306) ็ญ‰ไธ€ไบ›่ฎบๆ–‡ไธญ็š„ 3D ๆ‰ซๆ็ป“ๆžœๆ˜ฏไธๅŒ็š„ใ€‚ + +## REFUGE + +ๅœจ [REFUGE Challenge](https://refuge.grand-challenge.org) ๅฎ˜็ฝ‘ไธŠๆณจๅ†Œๅนถไธ‹่ฝฝ [REFUGE ๆ•ฐๆฎ้›†](https://refuge.grand-challenge.org/REFUGE2Download)ใ€‚ + +็„ถๅŽ๏ผŒ่งฃๅŽ‹ `REFUGE2.zip`๏ผŒๅŽŸๅง‹ๆ•ฐๆฎ้›†็š„ๅ†…ๅฎนๅŒ…ๆ‹ฌ๏ผš + +```none +โ”œโ”€โ”€ REFUGE2 +โ”‚ โ”œโ”€โ”€ REFUGE2 +โ”‚ โ”‚ โ”œโ”€โ”€ Annotation-Training400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Test400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Test-GT.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Training400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Validation400.zip +โ”‚ โ”‚ โ”œโ”€โ”€ REFUGE-Validation400-GT.zip +โ”‚ โ”œโ”€โ”€ __MACOSX +``` + +่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค่ฝฌๆข REFUGE ๆ•ฐๆฎ้›†๏ผš + +```shell +python tools/convert_datasets/refuge.py --raw_data_root=/path/to/refuge/REFUGE2/REFUGE2 +``` + +่„šๆœฌไผšๅฐ†็›ฎๅฝ•็ป“ๆž„่ฝฌๆขๅฆ‚ไธ‹๏ผš + +```none +โ”‚ โ”œโ”€โ”€ REFUGE +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +``` + +ๅŒ…ๅซ 400 ๅผ ็”จไบŽ่ฎญ็ปƒ็š„ๅ›พๅƒใ€400 ๅผ ็”จไบŽ้ชŒ่ฏ็š„ๅ›พๅƒๅ’Œ 400 ๅผ ็”จไบŽๆต‹่ฏ•็š„ๅ›พๅƒ๏ผŒ่ฟ™ไธŽ REFUGE 2018 ๆ•ฐๆฎ้›†็›ธๅŒใ€‚ + +## Mapillary Vistas Datasets + +- Mapillary Vistas [ๅฎ˜ๆ–น็ฝ‘็ซ™](https://www.mapillary.com/dataset/vistas) ๅฏไปฅไธ‹่ฝฝ Mapillary Vistas ๆ•ฐๆฎ้›†๏ผŒๆŒ‰็…งๅฎ˜็ฝ‘่ฆๆฑ‚ๆณจๅ†Œๅนถ็™ป้™†ๅŽ๏ผŒๆ•ฐๆฎๅฏไปฅๅœจ[่ฟ™้‡Œ](https://www.mapillary.com/dataset/vistas)ๆ‰พๅˆฐใ€‚ + +- Mapillary Vistas ๆ•ฐๆฎ้›†ไฝฟ็”จ 8-bit with color-palette ๆฅๅญ˜ๅ‚จๆ ‡็ญพใ€‚ไธ้œ€่ฆ่ฟ›่กŒ่ฝฌๆขๆ“ไฝœใ€‚ + +- ๅ‡่ฎพๆ‚จๅทฒๅฐ†ๆ•ฐๆฎ้›† zip ๆ–‡ไปถๆ”พๅœจ `mmsegmentation/data/mapillary` ไธญ + +- ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๆฅ่งฃๅŽ‹ๆ•ฐๆฎ้›†ใ€‚ + + ```bash + cd data/mapillary + unzip An-ZjB1Zm61yAZG0ozTymz8I8NqI4x0MrYrh26dq7kPgfu8vf9ImrdaOAVOFYbJ2pNAgUnVGBmbue9lTgdBOb5BbKXIpFs0fpYWqACbrQDChAA2fdX0zS9PcHu7fY8c-FOvyBVxPNYNFQuM.zip + ``` + +- ่งฃๅŽ‹ๅŽ๏ผŒๆ‚จๅฐ†่Žทๅพ—็ฑปไผผไบŽๆญค็ป“ๆž„็š„ Mapillary Vistas ๆ•ฐๆฎ้›†ใ€‚่ฏญไน‰ๅˆ†ๅ‰ฒ mask ๆ ‡็ญพๅœจ `labels` ๆ–‡ไปถๅคนไธญใ€‚ + + ```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ tools + โ”œโ”€โ”€ configs + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ mapillary + โ”‚ โ”‚ โ”œโ”€โ”€ training + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + โ”‚ โ”‚ โ”œโ”€โ”€ validation + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + | โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + ``` + +- ๆ‚จๅฏไปฅๅœจ้…็ฝฎไธญไฝฟ็”จ `MapillaryDataset_v1` ๅ’Œ `Mapillary Dataset_v2` ่ฎพ็ฝฎๆ•ฐๆฎ้›†็‰ˆๆœฌใ€‚ + ๅœจๆญคๅค„ [V1.2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/datasets/mapillary_v1.py) ๅ’Œ [V2.0](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/datasets/mapillary_v2.py) ๆŸฅ็œ‹ Mapillary Vistas ๆ•ฐๆฎ้›†้…็ฝฎๆ–‡ไปถ + +## LEVIR-CD + +[LEVIR-CD](https://justchenhao.github.io/LEVIR/) ๅคง่ง„ๆจก้ฅๆ„Ÿๅปบ็ญ‘ๅ˜ๅŒ–ๆฃ€ๆต‹ๆ•ฐๆฎ้›†ใ€‚ + +ๆ•ฐๆฎ้›†ๅฏไปฅๅœจ[ไธป้กต](https://justchenhao.github.io/LEVIR/)ไธŠ่ฏทๆฑ‚่Žทๅพ—ใ€‚ + +ๆ•ฐๆฎ้›†็š„่กฅๅ……็‰ˆๆœฌๅฏไปฅๅœจ[ไธป้กต](https://github.com/S2Looking/Dataset)ไธŠ่ฏทๆฑ‚่Žทๅพ—ใ€‚ + +่ฏทไธ‹่ฝฝๆ•ฐๆฎ้›†็š„่กฅๅ……็‰ˆๆœฌ๏ผŒ็„ถๅŽ่งฃๅŽ‹ `LEVIR-CD+.zip`๏ผŒๆ•ฐๆฎ้›†็š„ๅ†…ๅฎนๅŒ…ๆ‹ฌ๏ผš + +```none +โ”‚ โ”œโ”€โ”€ LEVIR-CD+ +โ”‚ โ”‚ โ”œโ”€โ”€ train +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ A +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ B +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ label +โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ A +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ B +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ label +``` + +ๅฏนไบŽ LEVIR-CD ๆ•ฐๆฎ้›†๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๆ— ้‡ๅ ่ฃๅ‰ชๅฝฑๅƒ๏ผš + +```shell +python tools/dataset_converters/levircd.py --dataset-path /path/to/LEVIR-CD+ --out_dir /path/to/LEVIR-CD +``` + +่ฃๅ‰ชๅŽ็š„ๅฝฑๅƒๅคงๅฐไธบ256x256๏ผŒไธŽๅŽŸ่ฎบๆ–‡ไฟๆŒไธ€่‡ดใ€‚ + +## BDD100K + +- ๅฏไปฅไปŽ[ๅฎ˜ๆ–น็ฝ‘็ซ™](https://bdd-data.berkeley.edu/) ไธ‹่ฝฝ BDD100Kๆ•ฐๆฎ้›†๏ผˆ่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠกไธป่ฆๆ˜ฏ10Kๆ•ฐๆฎ้›†๏ผ‰๏ผŒๆŒ‰็…งๅฎ˜็ฝ‘่ฆๆฑ‚ๆณจๅ†Œๅนถ็™ป้™†ๅŽ๏ผŒๆ•ฐๆฎๅฏไปฅๅœจ[่ฟ™้‡Œ](https://bdd-data.berkeley.edu/portal.html#download)ๆ‰พๅˆฐใ€‚ + +- ๅ›พๅƒๆ•ฐๆฎๅฏนๅบ”็š„ๅ็งฐๆ˜ฏๆ˜ฏ`10K Images`, ่ฏญไน‰ๅˆ†ๅ‰ฒๆ ‡ๆณจๅฏนๅบ”็š„ๅ็งฐๆ˜ฏ`Segmentation` + +- ไธ‹่ฝฝๅŽ๏ผŒๅฏไปฅไฝฟ็”จไปฅไธ‹ไปฃ็ ่ฟ›่กŒ่งฃๅŽ‹ + + ```bash + unzip ~/bdd100k_images_10k.zip -d ~/mmsegmentation/data/ + unzip ~/bdd100k_sem_seg_labels_trainval.zip -d ~/mmsegmentation/data/ + ``` + +ๅฐฑๅฏไปฅๅพ—ๅˆฐไปฅไธ‹ๆ–‡ไปถ็ป“ๆž„ไบ†๏ผš + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ bdd100k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ 10k +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ val +โ”‚ โ”‚ โ””โ”€โ”€ labels +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ sem_seg +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ colormaps +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ polygons +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ rles +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +``` + +## NYU + +- ๆ‚จๅฏไปฅไปŽ [่ฟ™ไธช้“พๆŽฅ](https://drive.google.com/file/d/1wC-io-14RCIL4XTUrQLk6lBqU2AexLVp/view?usp=share_link) ไธ‹่ฝฝ NYU ๆ•ฐๆฎ้›† + +- ไธ‹่ฝฝๅฎŒๆˆๅŽ๏ผŒๆ‚จๅฏไปฅไฝฟ็”จ [tools/dataset_converters/nyu.py](/tools/dataset_converters/nyu.py) ่„šๆœฌๆฅ่งฃๅŽ‹ๅ’Œ็ป„็ป‡ๆ•ฐๆฎๅˆฐๆ‰€้œ€็š„ๆ ผๅผ + + ```bash + python tools/dataset_converters/nyu.py nyu.zip + ``` + +## HSI Drive 2.0 + +- ๆ‚จๅฏไปฅไปŽไปฅไธ‹ไฝ็ฝฎไธ‹่ฝฝ HSI Drive 2.0 ๆ•ฐๆฎ้›† [here](https://ipaccess.ehu.eus/HSI-Drive/#download) ๅˆšๅˆšๅ‘ gded@ehu.eus ๅ‘้€ไธป้ข˜ไธบโ€œไธ‹่ฝฝ HSI-Driveโ€็š„็”ตๅญ้‚ฎไปถๅŽ ๆ‚จๅฐ†ๆ”ถๅˆฐ่งฃๅŽ‹็ผฉๆ–‡ไปถ็š„ๅฏ†็ . + +- ไธ‹่ฝฝๅŽ๏ผŒๆŒ‰็…งไปฅไธ‹่ฏดๆ˜Ž่งฃๅŽ‹๏ผš + + ```bash + 7z x -p"password" ./HSI_Drive_v2_0_Phyton.zip + + mv ./HSIDrive20 path_to_mmsegmentation/data + mv ./HSI_Drive_v2_0_release_notes_Python_version.md path_to_mmsegmentation/data + mv ./image_numbering.pdf path_to_mmsegmentation/data + ``` + +- ่งฃๅŽ‹ๅŽๅพ—ๅˆฐ: + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ HSIDrive20 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ images_MF +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ RGB +โ”‚ โ”‚ โ”œโ”€โ”€ training_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ validation_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ test_filenames.txt +โ”‚ โ”œโ”€โ”€ HSI_Drive_v2_0_release_notes_Python_version.md +โ”‚ โ”œโ”€โ”€ image_numbering.pdf +``` diff --git a/mmsegmentation/docs/zh_cn/user_guides/3_inference.md b/mmsegmentation/docs/zh_cn/user_guides/3_inference.md new file mode 100644 index 0000000..0afcb4b --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/3_inference.md @@ -0,0 +1,244 @@ +# ๆ•™็จ‹3๏ผšไฝฟ็”จ้ข„่ฎญ็ปƒๆจกๅž‹ๆŽจ็† + +MMSegmentation ๅœจ [Model Zoo](../Model_Zoo.md) ไธญไธบ่ฏญไน‰ๅˆ†ๅ‰ฒๆไพ›ไบ†้ข„่ฎญ็ปƒ็š„ๆจกๅž‹๏ผŒๅนถๆ”ฏๆŒๅคšไธชๆ ‡ๅ‡†ๆ•ฐๆฎ้›†๏ผŒๅŒ…ๆ‹ฌ Cityscapesใ€ADE20K ็ญ‰ใ€‚ +ๆœฌ่ฏดๆ˜Žๅฐ†ๅฑ•็คบๅฆ‚ไฝ•ไฝฟ็”จ็Žฐๆœ‰ๆจกๅž‹ๅฏน็ป™ๅฎšๅ›พๅƒ่ฟ›่กŒๆŽจ็†ใ€‚ +ๅ…ณไบŽๅฆ‚ไฝ•ๅœจๆ ‡ๅ‡†ๆ•ฐๆฎ้›†ไธŠๆต‹่ฏ•็Žฐๆœ‰ๆจกๅž‹๏ผŒ่ฏทๅ‚้˜…ๆœฌ[ๆŒ‡ๅ—](./4_train_test.md) + +MMSegmentation ไธบ็”จๆˆทๆไพ›ไบ†ๆ•ฐไธชๆŽฅๅฃ๏ผŒไปฅไพฟ่ฝปๆพไฝฟ็”จ้ข„่ฎญ็ปƒ็š„ๆจกๅž‹่ฟ›่กŒๆŽจ็†ใ€‚ + +- [ๆ•™็จ‹3๏ผšไฝฟ็”จ้ข„่ฎญ็ปƒๆจกๅž‹ๆŽจ็†](#ๆ•™็จ‹3ไฝฟ็”จ้ข„่ฎญ็ปƒๆจกๅž‹ๆŽจ็†) + - [ๆŽจ็†ๅ™จ](#ๆŽจ็†ๅ™จ) + - [ๅŸบๆœฌไฝฟ็”จ](#ๅŸบๆœฌไฝฟ็”จ) + - [ๅˆๅง‹ๅŒ–](#ๅˆๅง‹ๅŒ–) + - [ๅฏ่ง†ๅŒ–้ข„ๆต‹็ป“ๆžœ](#ๅฏ่ง†ๅŒ–้ข„ๆต‹็ป“ๆžœ) + - [ๆจกๅž‹ๅˆ—่กจ](#ๆจกๅž‹ๅˆ—่กจ) + - [ๆŽจ็† API](#ๆŽจ็†-api) + - [mmseg.apis.init_model](#mmsegapisinit_model) + - [mmseg.apis.inference_model](#mmsegapisinference_model) + - [mmseg.apis.show_result_pyplot](#mmsegapisshow_result_pyplot) + +## ๆŽจ็†ๅ™จ + +ๅœจ MMSegmentation ไธญ๏ผŒๆˆ‘ไปฌๆไพ›ไบ†ๆœ€**ๆ–นไพฟ็š„**ๆ–นๅผ `MMSegInferencer` ๆฅไฝฟ็”จๆจกๅž‹ใ€‚ๆ‚จๅช้œ€ 3 ่กŒไปฃ็ ๅฐฑๅฏไปฅ่Žทๅพ—ๅ›พๅƒ็š„ๅˆ†ๅ‰ฒๆŽฉ่†œใ€‚ + +### ๅŸบๆœฌไฝฟ็”จ + +ไปฅไธ‹็คบไพ‹ๅฑ•็คบไบ†ๅฆ‚ไฝ•ไฝฟ็”จ `MMSegInferencer` ๅฏนๅ•ไธชๅ›พๅƒๆ‰ง่กŒๆŽจ็†ใ€‚ + +``` +>>> from mmseg.apis import MMSegInferencer +>>> # ๅฐ†ๆจกๅž‹ๅŠ ่ฝฝๅˆฐๅ†…ๅญ˜ไธญ +>>> inferencer = MMSegInferencer(model='deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024') +>>> # ๆŽจ็† +>>> inferencer('demo/demo.png', show=True) +``` + +ๅฏ่ง†ๅŒ–็ป“ๆžœๅบ”ๅฆ‚ไธ‹ๆ‰€็คบ๏ผš + +
+ +
+ +ๆญคๅค–๏ผŒๆ‚จๅฏไปฅไฝฟ็”จ `MMSegInferencer` ๆฅๅค„็†ไธ€ไธชๅŒ…ๅซๅคšๅผ ๅ›พ็‰‡็š„ `list`๏ผš + +``` +# ่พ“ๅ…ฅไธ€ไธชๅ›พ็‰‡ list +>>> images = [image1, image2, ...] # image1 ๅฏไปฅๆ˜ฏๆ–‡ไปถ่ทฏๅพ„ๆˆ– np.ndarray +>>> inferencer(images, show=True, wait_time=0.5) # wait_time ๆ˜ฏๅปถ่ฟŸๆ—ถ้—ด๏ผŒ0 ่กจ็คบๆ— ้™ + +# ๆˆ–่พ“ๅ…ฅๅ›พๅƒ็›ฎๅฝ• +>>> images = $IMAGESDIR +>>> inferencer(images, show=True, wait_time=0.5) + +# ไฟๅญ˜ๅฏ่ง†ๅŒ–ๆธฒๆŸ“ๅฝฉ่‰ฒๅˆ†ๅ‰ฒๅ›พๅ’Œ้ข„ๆต‹็ป“ๆžœ +# out_dir ๆ˜ฏไฟๅญ˜่พ“ๅ‡บ็ป“ๆžœ็š„็›ฎๅฝ•๏ผŒimg_out_dir ๅ’Œ pred_out_dir ไธบ out_dir ็š„ๅญ็›ฎๅฝ• +# ไปฅไฟๅญ˜ๅฏ่ง†ๅŒ–ๆธฒๆŸ“ๅฝฉ่‰ฒๅˆ†ๅ‰ฒๅ›พๅ’Œ้ข„ๆต‹็ป“ๆžœ +>>> inferencer(images, out_dir='outputs', img_out_dir='vis', pred_out_dir='pred') +``` + +ๆŽจ็†ๅ™จๆœ‰ไธ€ไธชๅฏ้€‰ๅ‚ๆ•ฐ `return_datasamples`๏ผŒๅ…ถ้ป˜่ฎคๅ€ผไธบ False๏ผŒๆŽจ็†ๅ™จ็š„่ฟ”ๅ›žๅ€ผ้ป˜่ฎคไธบ `dict` ็ฑปๅž‹๏ผŒๅŒ…ๆ‹ฌ 'visualization' ๅ’Œ 'predictions' ไธคไธช keyใ€‚ +ๅฆ‚ๆžœ `return_datasamples=True` ๆŽจ็†ๅ™จๅฐ†่ฟ”ๅ›ž [`SegDataSample`](../advanced_guides/structures.md) ๆˆ–ๅ…ถๅˆ—่กจใ€‚ + +``` +result = inferencer('demo/demo.png') +# ็ป“ๆžœๆ˜ฏไธ€ไธชๅŒ…ๅซ 'visualization' ๅ’Œ 'predictions' ไธคไธช key ็š„ `dict` +# 'visualization' ๅŒ…ๅซๅฝฉ่‰ฒๅˆ†ๅ‰ฒๅ›พ +print(result['visualization'].shape) +# (512, 683, 3) + +# 'predictions' ๅŒ…ๅซๅธฆๆœ‰ๆ ‡็ญพ็ดขๅผ•็š„ๅˆ†ๅ‰ฒๆŽฉ่†œ +print(result['predictions'].shape) +# (512, 683) + +result = inferencer('demo/demo.png', return_datasamples=True) +print(type(result)) +# + +# ่พ“ๅ…ฅไธ€ไธชๅ›พ็‰‡ list +results = inferencer(images) +# ่พ“ๅ‡บไธบๅˆ—่กจ +print(type(results['visualization']), results['visualization'][0].shape) +# (512, 683, 3) +print(type(results['predictions']), results['predictions'][0].shape) +# (512, 683) + +results = inferencer(images, return_datasamples=True) +# +print(type(results[0])) +# +``` + +### ๅˆๅง‹ๅŒ– + +`MMSegInferencer` ๅฟ…้กปไฝฟ็”จ `model` ๅˆๅง‹ๅŒ–๏ผŒ่ฏฅ `model` ๅฏไปฅๆ˜ฏๆจกๅž‹ๅ็งฐๆˆ–ไธ€ไธช `Config`๏ผŒ็”š่‡ณๅฏไปฅๆ˜ฏ้…็ฝฎๆ–‡ไปถ็š„่ทฏๅพ„ใ€‚ +ๆจกๅž‹ๅ็งฐๅฏไปฅๅœจๆจกๅž‹็š„ๅ…ƒๆ–‡ไปถ๏ผˆconfigs/xxx/metafile.yaml๏ผ‰ไธญๆ‰พๅˆฐ๏ผŒๆฏ”ๅฆ‚ maskformer ็š„ไธ€ไธชๆจกๅž‹ๅ็งฐๆ˜ฏ `maskformer_r50-d32_8xb2-160k_ade20k-512x512`๏ผŒๅฆ‚ๆžœ่พ“ๅ…ฅๆจกๅž‹ๅ็งฐ๏ผŒๆจกๅž‹็š„ๆƒ้‡ๅฐ†่‡ชๅŠจไธ‹่ฝฝใ€‚ไปฅไธ‹ๆ˜ฏๅ…ถไป–่พ“ๅ…ฅๅ‚ๆ•ฐ๏ผš + +- weights๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ๆƒ้‡็š„่ทฏๅพ„ใ€‚ๅฆ‚ๆžœๆœชๆŒ‡ๅฎš๏ผŒๅนถไธ”ๆจกๅž‹ๆ˜ฏๅ…ƒๆ–‡ไปถไธญ็š„ๆจกๅž‹ๅ็งฐ๏ผŒๅˆ™ๆƒ้‡ๅฐ†ไปŽๅ…ƒๆ–‡ไปถๅŠ ่ฝฝใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- classes๏ผˆlist๏ผŒๅฏ้€‰๏ผ‰- ่พ“ๅ…ฅ็ฑปๅˆซ็”จไบŽ็ป“ๆžœๆธฒๆŸ“๏ผŒ็”ฑไบŽๅˆ†ๅ‰ฒๆจกๅž‹็š„้ข„ๆต‹็ป“ๆž„ๆ˜ฏๆ ‡็ญพ็ดขๅผ•็š„ๅˆ†ๅ‰ฒๅ›พ๏ผŒ`classes` ๆ˜ฏไธ€ไธช็›ธๅบ”็š„ๆ ‡็ญพ็ดขๅผ•็š„็ฑปๅˆซๅˆ—่กจใ€‚่‹ฅ classes ๆฒกๆœ‰ๅฎšไน‰๏ผŒๅฏ่ง†ๅŒ–ๅทฅๅ…ทๅฐ†้ป˜่ฎคไฝฟ็”จ `cityscapes` ็š„็ฑปๅˆซใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- palette๏ผˆlist๏ผŒๅฏ้€‰๏ผ‰- ่พ“ๅ…ฅ่ฐƒ่‰ฒ็›˜็”จไบŽ็ป“ๆžœๆธฒๆŸ“๏ผŒๅฎƒๆ˜ฏๅฏนๅบ”ๅˆ†็ฑป็š„้…่‰ฒๅˆ—่กจใ€‚่‹ฅ palette ๆฒกๆœ‰ๅฎšไน‰๏ผŒๅฏ่ง†ๅŒ–ๅทฅๅ…ทๅฐ†้ป˜่ฎคไฝฟ็”จ `cityscapes` ็š„่ฐƒ่‰ฒ็›˜ใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- dataset_name๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- [ๆ•ฐๆฎ้›†ๅ็งฐๆˆ–ๅˆซๅ](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/utils/class_names.py#L302-L317)๏ผŒๅฏ่ง†ๅŒ–ๅทฅๅ…ทๅฐ†ไฝฟ็”จๆ•ฐๆฎ้›†็š„ๅ…ƒไฟกๆฏ๏ผŒๅฆ‚็ฑปๅˆซๅ’Œ้…่‰ฒ๏ผŒไฝ† `classes` ๅ’Œ `palette` ๅ…ทๆœ‰ๆ›ด้ซ˜็š„ไผ˜ๅ…ˆ็บงใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- device๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ่ฟ่กŒๆŽจ็†็š„่ฎพๅค‡ใ€‚ๅฆ‚ๆžœๆ— ๏ผŒๅˆ™ไผš่‡ชๅŠจไฝฟ็”จๅฏ็”จ็š„่ฎพๅค‡ใ€‚้ป˜่ฎคไธบ Noneใ€‚ +- scope๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ๆจกๅž‹็š„ไฝœ็”จๅŸŸใ€‚้ป˜่ฎคไธบ 'mmseg'ใ€‚ + +### ๅฏ่ง†ๅŒ–้ข„ๆต‹็ป“ๆžœ + +`MMSegInferencer` ๆœ‰4ไธช็”จไบŽๅฏ่ง†ๅŒ–้ข„ๆต‹็š„ๅ‚ๆ•ฐ๏ผŒๆ‚จๅฏไปฅๅœจๅˆๅง‹ๅŒ–ๆŽจ็†ๅ™จๆ—ถไฝฟ็”จๅฎƒไปฌ๏ผš + +- show๏ผˆbool๏ผ‰- ๆ˜ฏๅฆๅผนๅ‡บ็ช—ๅฃๆ˜พ็คบๅ›พๅƒใ€‚้ป˜่ฎคไธบ Falseใ€‚ +- wait_time๏ผˆfloat๏ผ‰- ๆ˜พ็คบ็š„้—ด้š”ใ€‚้ป˜่ฎคๅ€ผไธบ 0ใ€‚ +- img_out_dir๏ผˆstr๏ผ‰- `out_dir` ็š„ๅญ็›ฎๅฝ•๏ผŒ็”จไบŽไฟๅญ˜ๆธฒๆŸ“ๆœ‰่‰ฒๅˆ†ๅ‰ฒๆŽฉ่†œ๏ผŒๅ› ๆญคๅฆ‚ๆžœ่ฆไฟๅญ˜้ข„ๆต‹ๆŽฉ่†œ๏ผŒๅˆ™ๅฟ…้กปๅฎšไน‰ `out_dir`ใ€‚้ป˜่ฎคไธบ `vis`ใ€‚ +- opacity๏ผˆint๏ผŒfloat๏ผ‰- ๅˆ†ๅ‰ฒๆŽฉ่†œ็š„้€ๆ˜Žๅบฆใ€‚้ป˜่ฎคๅ€ผไธบ 0.8ใ€‚ + +่ฟ™ไบ›ๅ‚ๆ•ฐ็š„็คบไพ‹่ฏทๅ‚่€ƒ[ๅŸบๆœฌไฝฟ็”จ](#ๅŸบๆœฌไฝฟ็”จ) + +### ๆจกๅž‹ๅˆ—่กจ + +ๅœจ MMSegmentation ไธญๆœ‰ไธ€ไธช้žๅธธๅฎนๆ˜“ๅˆ—ๅ‡บๆ‰€ๆœ‰ๆจกๅž‹ๅ็งฐ็š„ๆ–นๆณ• + +``` +>>> from mmseg.apis import MMSegInferencer +# models ๆ˜ฏไธ€ไธชๆจกๅž‹ๅ็งฐๅˆ—่กจ๏ผŒๅฎƒไปฌๅฐ†่‡ชๅŠจๆ‰“ๅฐ +>>> models = MMSegInferencer.list_models('mmseg') +``` + +## ๆŽจ็† API + +### mmseg.apis.init_model + +ไปŽ้…็ฝฎๆ–‡ไปถๅˆๅง‹ๅŒ–ไธ€ไธชๅˆ†ๅ‰ฒๅ™จใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- config๏ผˆstr๏ผŒ`Path` ๆˆ– `mmengine.Config`๏ผ‰- ้…็ฝฎๆ–‡ไปถ่ทฏๅพ„ๆˆ–้…็ฝฎๅฏน่ฑกใ€‚ +- checkpoint๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ๆƒ้‡่ทฏๅพ„ใ€‚ๅฆ‚ๆžœไธบ None๏ผŒๅˆ™ๆจกๅž‹ๅฐ†ไธไผšๅŠ ่ฝฝไปปไฝ•ๆƒ้‡ใ€‚ +- device๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- CPU/CUDA ่ฎพๅค‡้€‰้กนใ€‚้ป˜่ฎคไธบ 'cuda:0'ใ€‚ +- cfg_options๏ผˆdict๏ผŒๅฏ้€‰๏ผ‰- ็”จไบŽ่ฆ†็›–ๆ‰€็”จ้…็ฝฎไธญ็š„ๆŸไบ›่ฎพ็ฝฎ็š„้€‰้กนใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- nn.Module๏ผšๆž„ๅปบๅฅฝ็š„ๅˆ†ๅ‰ฒๅ™จใ€‚ + +็คบไพ‹๏ผš + +```python +from mmseg.apis import init_model + +config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' + +# ๅˆๅง‹ๅŒ–ไธๅธฆๆƒ้‡็š„ๆจกๅž‹ +model = init_model(config_path) + +# ๅˆๅง‹ๅŒ–ๆจกๅž‹ๅนถๅŠ ่ฝฝๆƒ้‡ +model = init_model(config_path, checkpoint_path) + +# ๅœจ CPU ไธŠ็š„ๅˆๅง‹ๅŒ–ๆจกๅž‹ๅนถๅŠ ่ฝฝๆƒ้‡ +model = init_model(config_path, checkpoint_path, 'cpu') +``` + +### mmseg.apis.inference_model + +ไฝฟ็”จๅˆ†ๅ‰ฒๅ™จๆŽจ็†ๅ›พๅƒใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- model๏ผˆnn.Module๏ผ‰- ๅŠ ่ฝฝ็š„ๅˆ†ๅ‰ฒๅ™จ +- imgs๏ผˆstr๏ผŒnp.ndarray ๆˆ– list\[str/np.ndarray\]๏ผ‰- ๅ›พๅƒๆ–‡ไปถๆˆ–ๅŠ ่ฝฝ็š„ๅ›พๅƒ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- `SegDataSample` ๆˆ– list\[`SegDataSample`\]๏ผšๅฆ‚ๆžœ imgs ๆ˜ฏๅˆ—่กจๆˆ–ๅ…ƒ็ป„๏ผŒๅˆ™่ฟ”ๅ›ž็›ธๅŒ้•ฟๅบฆ็š„ๅˆ—่กจ็ฑปๅž‹็ป“ๆžœ๏ผŒๅฆๅˆ™็›ดๆŽฅ่ฟ”ๅ›žๅˆ†ๅ‰ฒ็ป“ๆžœใ€‚ + +**ๆณจๆ„๏ผš** [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) ๆ˜ฏ MMSegmentation ็š„ๆ•ฐๆฎ็ป“ๆž„ๆŽฅๅฃ๏ผŒ็”จไฝœไธๅŒ็ป„ไปถไน‹้—ด็š„ๆŽฅๅฃใ€‚`SegDataSample` ๅฎž็ŽฐๆŠฝ่ฑกๆ•ฐๆฎๅ…ƒ็ด  `mmengine.structures.BaseDataElement`๏ผŒ่ฏทๅ‚้˜… [MMEngine](https://github.com/open-mmlab/mmengine) ไธญ็š„ๆ•ฐๆฎๅ…ƒ็ด [ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/data_element.html)ไบ†่งฃๆ›ดๅคšไฟกๆฏใ€‚ + +`SegDataSample` ไธญ็š„ๅ‚ๆ•ฐๅˆ†ไธบๅ‡ ไธช้ƒจๅˆ†๏ผš + +- `gt_sem_seg`๏ผˆ`PixelData`๏ผ‰- ่ฏญไน‰ๅˆ†ๅ‰ฒ็š„ๆ ‡ๆณจใ€‚ +- `pred_sem_seg`๏ผˆ`PixelData`๏ผ‰- ่ฏญไน‰ๅˆ†ๅ‰ฒ็š„้ข„ๆต‹ใ€‚ +- `seg_logits`๏ผˆ`PixelData`๏ผ‰- ๆจกๅž‹ๆœ€ๅŽไธ€ๅฑ‚็š„่พ“ๅ‡บ็ป“ๆžœใ€‚ + +**ๆณจๆ„๏ผš** [PixelData](https://github.com/open-mmlab/mmengine/blob/main/mmengine/structures/pixel_data.py) ๆ˜ฏๅƒ็ด ็บงๆ ‡ๆณจๆˆ–้ข„ๆต‹็š„ๆ•ฐๆฎ็ป“ๆž„๏ผŒ่ฏทๅ‚้˜… [MMEngine](https://github.com/open-mmlab/mmengine) ไธญ็š„ PixelData [ๆ–‡ๆกฃ](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html)ไบ†่งฃๆ›ดๅคšไฟกๆฏใ€‚ + +็คบไพ‹๏ผš + +```python +from mmseg.apis import init_model, inference_model + +config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' +img_path = 'demo/demo.png' + + +model = init_model(config_path, checkpoint_path) +result = inference_model(model, img_path) +``` + +### mmseg.apis.show_result_pyplot + +ๅœจๅ›พๅƒไธŠๅฏ่ง†ๅŒ–ๅˆ†ๅ‰ฒ็ป“ๆžœใ€‚ + +ๅ‚ๆ•ฐ๏ผš + +- model๏ผˆnn.Module๏ผ‰- ๅŠ ่ฝฝ็š„ๅˆ†ๅ‰ฒๅ™จใ€‚ +- img๏ผˆstr ๆˆ– np.ndarray๏ผ‰- ๅ›พๅƒๆ–‡ไปถๅๆˆ–ๅŠ ่ฝฝ็š„ๅ›พๅƒใ€‚ +- result๏ผˆ`SegDataSample`๏ผ‰- SegDataSample ้ข„ๆต‹็ป“ๆžœใ€‚ +- opacity๏ผˆfloat๏ผ‰- ็ป˜ๅˆถๅˆ†ๅ‰ฒๅ›พ็š„ไธ้€ๆ˜Žๅบฆใ€‚้ป˜่ฎคๅ€ผไธบ `0.5`๏ผŒๅฟ…้กปๅœจ `(0๏ผŒ1]` ่Œƒๅ›ดๅ†…ใ€‚ +- title๏ผˆstr๏ผ‰- pyplot ๅ›พ็š„ๆ ‡้ข˜ใ€‚้ป˜่ฎคๅ€ผไธบ ''ใ€‚ +- draw_gt๏ผˆbool๏ผ‰- ๆ˜ฏๅฆ็ป˜ๅˆถ GT SegDataSampleใ€‚้ป˜่ฎคไธบ `True`ใ€‚ +- draw_pred๏ผˆdraws_pred๏ผ‰- ๆ˜ฏๅฆ็ป˜ๅˆถ้ข„ๆต‹ SegDataSampleใ€‚้ป˜่ฎคไธบ `True`ใ€‚ +- wait_time๏ผˆfloat๏ผ‰- ๆ˜พ็คบ็š„้—ด้š”๏ผŒ0 ๆ˜ฏ่กจ็คบโ€œๆ— ้™โ€็š„็‰นๆฎŠๅ€ผใ€‚้ป˜่ฎคไธบ `0`ใ€‚ +- show๏ผˆbool๏ผ‰- ๆ˜ฏๅฆๅฑ•็คบ็ป˜ๅˆถ็š„ๅ›พๅƒใ€‚้ป˜่ฎคไธบ `True`ใ€‚ +- save_dir๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ไธบๆ‰€ๆœ‰ๅญ˜ๅ‚จๅŽ็ซฏไฟๅญ˜็š„ๆ–‡ไปถ่ทฏๅพ„ใ€‚ๅฆ‚ๆžœไธบ `None`๏ผŒๅˆ™ๅŽ็ซฏๅญ˜ๅ‚จๅฐ†ไธไผšไฟๅญ˜ไปปไฝ•ๆ•ฐๆฎใ€‚ +- out_file๏ผˆstr๏ผŒๅฏ้€‰๏ผ‰- ่พ“ๅ‡บๆ–‡ไปถ็š„่ทฏๅพ„ใ€‚้ป˜่ฎคไธบ `None`ใ€‚ + +่ฟ”ๅ›žๅ€ผ๏ผš + +- np.ndarray๏ผš้€š้“ไธบ RGB ็š„็ป˜ๅˆถๅ›พๅƒใ€‚ + +็คบไพ‹๏ผš + +```python +from mmseg.apis import init_model, inference_model, show_result_pyplot + +config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' +checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' +img_path = 'demo/demo.png' + + +# ไปŽ้…็ฝฎๆ–‡ไปถๅ’Œๆƒ้‡ๆ–‡ไปถๆž„ๅปบๆจกๅž‹ +model = init_model(config_path, checkpoint_path, device='cuda:0') + +# ๆŽจ็†็ป™ๅฎšๅ›พๅƒ +result = inference_model(model, img_path) + +# ๅฑ•็คบๅˆ†ๅ‰ฒ็ป“ๆžœ +vis_image = show_result_pyplot(model, img_path, result) + +# ไฟๅญ˜ๅฏ่ง†ๅŒ–็ป“ๆžœ๏ผŒ่พ“ๅ‡บๅ›พๅƒๅฐ†ๅœจ `workdirs/result.png` ่ทฏๅพ„ไธ‹ๆ‰พๅˆฐ +vis_iamge = show_result_pyplot(model, img_path, result, out_file='work_dirs/result.png') + +# ไฟฎๆ”นๅฑ•็คบๅ›พๅƒ็š„ๆ—ถ้—ด๏ผŒๆณจๆ„ 0 ๆ˜ฏ่กจ็คบโ€œๆ— ้™โ€็š„็‰นๆฎŠๅ€ผ +vis_image = show_result_pyplot(model, img_path, result, wait_time=5) +``` + +**ๆณจๆ„๏ผš** ๅฆ‚ๆžœๅฝ“ๅ‰่ฎพๅค‡ๆฒกๆœ‰ๅ›พๅฝข็”จๆˆท็•Œ้ข๏ผŒๅปบ่ฎฎๅฐ† `show` ่ฎพ็ฝฎไธบ `False`๏ผŒๅนถๆŒ‡ๅฎš `out_file` ๆˆ– `save_dir` ๆฅไฟๅญ˜็ป“ๆžœใ€‚ๅฆ‚ๆžœๆ‚จๆƒณๅœจ็ช—ๅฃไธŠๆ˜พ็คบ็ป“ๆžœ๏ผŒๅˆ™ไธ้œ€่ฆ็‰นๆฎŠ่ฎพ็ฝฎใ€‚ diff --git a/mmsegmentation/docs/zh_cn/user_guides/4_train_test.md b/mmsegmentation/docs/zh_cn/user_guides/4_train_test.md new file mode 100644 index 0000000..f821aca --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/4_train_test.md @@ -0,0 +1,317 @@ +# ๆ•™็จ‹4๏ผšไฝฟ็”จ็Žฐๆœ‰ๆจกๅž‹่ฟ›่กŒ่ฎญ็ปƒๅ’Œๆต‹่ฏ• + +MMSegmentation ๆ”ฏๆŒๅœจๅคš็ง่ฎพๅค‡ไธŠ่ฎญ็ปƒๅ’Œๆต‹่ฏ•ๆจกๅž‹ใ€‚ๅฆ‚ไธ‹ๆ–‡๏ผŒๅ…ทไฝ“ๆ–นๅผๅˆ†ๅˆซไธบๅ•GPUใ€ๅˆ†ๅธƒๅผไปฅๅŠ่ฎก็ฎ—้›†็พค็š„่ฎญ็ปƒๅ’Œๆต‹่ฏ•ใ€‚้€š่ฟ‡ๆœฌๆ•™็จ‹๏ผŒๆ‚จๅฐ†็Ÿฅๆ™“ๅฆ‚ไฝ•็”จ MMSegmentation ๆไพ›็š„่„šๆœฌ่ฟ›่กŒ่ฎญ็ปƒๅ’Œๆต‹่ฏ•ใ€‚ + +## ๅœจๅ•GPUไธŠ่ฎญ็ปƒๅ’Œๆต‹่ฏ• + +### ๅœจๅ•GPUไธŠ่ฎญ็ปƒ + +`tools/train.py` ๆ–‡ไปถๆไพ›ไบ†ๅœจๅ•GPUไธŠ้ƒจ็ฝฒ่ฎญ็ปƒไปปๅŠก็š„ๆ–นๆณ•ใ€‚ + +ๅŸบ็ก€็”จๆณ•ๅฆ‚ไธ‹: + +```shell +python tools/train.py ${้…็ฝฎๆ–‡ไปถ} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +- `--work-dir ${ๅทฅไฝœ่ทฏๅพ„}`: ้‡ๆ–ฐๆŒ‡ๅฎšๅทฅไฝœ่ทฏๅพ„ +- `--amp`: ไฝฟ็”จ่‡ชๅŠจๆททๅˆ็ฒพๅบฆ่ฎก็ฎ— +- `--resume`: ไปŽๅทฅไฝœ่ทฏๅพ„ไธญไฟๅญ˜็š„ๆœ€ๆ–ฐๆฃ€ๆŸฅ็‚นๆ–‡ไปถ๏ผˆcheckpoint๏ผ‰ๆขๅค่ฎญ็ปƒ +- `--cfg-options ${้œ€ๆ›ด่ฆ†็›–็š„้…็ฝฎ}`: ่ฆ†็›–ๅทฒ่ฝฝๅ…ฅ็š„้…็ฝฎไธญ็š„้ƒจๅˆ†่ฎพ็ฝฎ๏ผŒๅนถไธ” ไปฅ xxx=yyy ๆ ผๅผ็š„้”ฎๅ€ผๅฏน ๅฐ†่ขซๅˆๅนถๅˆฐ้…็ฝฎๆ–‡ไปถไธญใ€‚ + ๆฏ”ๅฆ‚๏ผš '--cfg-option model.encoder.in_channels=6'๏ผŒ ๆ›ดๅคš็ป†่Š‚่ฏท็œ‹[ๆŒ‡ๅฏผ](./1_config.md#Modify-config-through-script-arguments)ใ€‚ + +ไธ‹้ขๆ˜ฏๅฏนไบŽๅคšGPUๆต‹่ฏ•็š„ๅฏ้€‰ๅ‚ๆ•ฐ: + +- `--launcher`: ๆ‰ง่กŒๅ™จ็š„ๅฏๅŠจๆ–นๅผใ€‚ๅ…่ฎธ้€‰ๆ‹ฉ็š„ๅ‚ๆ•ฐๅ€ผๆœ‰ `none`, `pytorch`, `slurm`, `mpi`ใ€‚็‰นๅˆซ็š„๏ผŒๅฆ‚ๆžœ่ฎพ็ฝฎไธบnone๏ผŒๆต‹่ฏ•ๅฐ†้žๅˆ†ๅธƒๅผๆจกๅผไธ‹่ฟ›่กŒใ€‚ +- `--local_rank`: ๅˆ†ๅธƒๅผไธญ่ฟ›็จ‹็š„ๅบๅทใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ๆŒ‡ๅฎš๏ผŒ้ป˜่ฎค่ฎพ็ฝฎไธบ0ใ€‚ + +**ๆณจๆ„๏ผš** ๅ‘ฝไปค่กŒๅ‚ๆ•ฐ `--resume` ๅ’Œๅœจ้…็ฝฎๆ–‡ไปถไธญ็š„ๅ‚ๆ•ฐ `load_from` ็š„ไธๅŒไน‹ๅค„๏ผš + +`--resume` ๅชๅ†ณๅฎšๆ˜ฏๅฆ็ปง็ปญไฝฟ็”จๅทฅไฝœ่ทฏๅพ„ไธญๆœ€ๆ–ฐ็š„ๆฃ€ๆŸฅ็‚น๏ผŒๅฎƒๅธธๅธธ็”จไบŽๆขๅค่ขซๆ„ๅค–ๆ‰“ๆ–ญ็š„่ฎญ็ปƒใ€‚ + +`load_from` ไผšๆ˜Ž็กฎๆŒ‡ๅฎš่ขซ่ฝฝๅ…ฅ็š„ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ๏ผŒไธ”่ฎญ็ปƒ่ฟญไปฃๅ™จๅฐ†ไปŽ0ๅผ€ๅง‹๏ผŒ้€šๅธธ็”จไบŽๅพฎ่ฐƒๆจกๅž‹ใ€‚ + +ๅฆ‚ๆžœๆ‚จๅธŒๆœ›ไปŽๆŒ‡ๅฎš็š„ๆฃ€ๆŸฅ็‚นไธŠๆขๅค่ฎญ็ปƒๆ‚จๅฏไปฅไฝฟ็”จ๏ผš + +```python +python tools/train.py ${้…็ฝฎๆ–‡ไปถ} --resume --cfg-options load_from=${ๆฃ€ๆŸฅ็‚น} +``` + +**ๅœจ CPU ไธŠ่ฎญ็ปƒ**: ๅฆ‚ๆžœๆœบๅ™จๆฒกๆœ‰ GPU๏ผŒๅˆ™ๅœจ CPU ไธŠ่ฎญ็ปƒ็š„่ฟ‡็จ‹ๆ˜ฏไธŽๅ•GPU่ฎญ็ปƒไธ€่‡ด็š„ใ€‚ๅฆ‚ๆžœๆœบๅ™จๆœ‰ GPU ไฝ†ๆ˜ฏไธๅธŒๆœ›ไฝฟ็”จๅฎƒไปฌ๏ผŒๆˆ‘ไปฌๅช้œ€่ฆๅœจ่ฎญ็ปƒๅ‰้€š่ฟ‡ไปฅไธ‹ๆ–นๅผๅ…ณ้—ญ GPU ่ฎญ็ปƒๅŠŸ่ƒฝใ€‚ + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +็„ถๅŽ่ฟ่กŒ[ไธŠๆ–น](###ๅœจๅ•GPUไธŠ่ฎญ็ปƒ)่„šๆœฌใ€‚ + +### ๅœจๅ•GPUไธŠๆต‹่ฏ• + +`tools/test.py` ๆ–‡ไปถๆไพ›ไบ†ๅœจๅ• GPU ไธŠๅฏๅŠจๆต‹่ฏ•ไปปๅŠก็š„ๆ–นๆณ•ใ€‚ + +ๅŸบ็ก€็”จๆณ•ๅฆ‚ไธ‹: + +```shell +python tools/test.py ${้…็ฝฎๆ–‡ไปถ} ${ๆจกๅž‹ๆƒ้‡ๆ–‡ไปถ} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +่ฟ™ไธชๅทฅๅ…ทๆœ‰ๅ‡ ไธชๅฏ้€‰ๅ‚ๆ•ฐ๏ผŒๅŒ…ๆ‹ฌ๏ผš + +- `--work-dir`: ๅฆ‚ๆžœๆŒ‡ๅฎšไบ†่ทฏๅพ„๏ผŒ็ป“ๆžœไผšไฟๅญ˜ๅœจ่ฏฅ่ทฏๅพ„ไธ‹ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ๆŒ‡ๅฎšๅˆ™ไผšไฟๅญ˜ๅœจ `work_dirs/{้…็ฝฎๆ–‡ไปถๅ}` ่ทฏๅพ„ไธ‹. +- `--show`: ๅฝ“ `--show-dir` ๆฒกๆœ‰ๆŒ‡ๅฎšๆ—ถ๏ผŒๅฏไปฅไฝฟ็”จ่ฏฅๅ‚ๆ•ฐ๏ผŒๅœจ็จ‹ๅบ่ฟ่กŒ่ฟ‡็จ‹ไธญๆ˜พ็คบ้ข„ๆต‹็ป“ๆžœใ€‚ +- `--show-dir`: ็ป˜ๅˆถไบ†ๅˆ†ๅ‰ฒๆŽฉ่†œๅ›พ็‰‡็š„ๅญ˜ๅ‚จๆ–‡ไปถๅคนใ€‚ๅฆ‚ๆžœๆŒ‡ๅฎšไบ†่ฏฅๅ‚ๆ•ฐ๏ผŒๅˆ™ๅฏ่ง†ๅŒ–็š„ๅˆ†ๅ‰ฒๆŽฉ่†œๅฐ†่ขซไฟๅญ˜ๅˆฐ `work_dir/timestamp/{ๆŒ‡ๅฎš่ทฏๅพ„}`. +- `--wait-time`: ๅคšๆฌกๅฏ่ง†ๅŒ–็ป“ๆžœ็š„ๆ—ถ้—ด้—ด้š”ใ€‚ๅฝ“ `--show` ไธบๆฟ€ๆดป็Šถๆ€ๆ—ถๅ‘ๆŒฅไฝœ็”จใ€‚้ป˜่ฎคไธบ2ใ€‚ +- `--cfg-options`: ๅฆ‚ๆžœ่ขซๅ…ทไฝ“ๆŒ‡ๅฎš๏ผŒไปฅ xxx=yyy ๅฝขๅผ็š„้”ฎๅ€ผๅฏนๅฐ†่ขซๅˆๅนถๅ…ฅ้…็ฝฎๆ–‡ไปถไธญใ€‚ + +**ๅœจCPUไธŠๆต‹่ฏ•**: ๅฆ‚ๆžœๆœบๅ™จๆฒกๆœ‰GPU๏ผŒๅˆ™ๅœจCPUไธŠ่ฎญ็ปƒ็š„่ฟ‡็จ‹ๆ˜ฏไธŽๅ•GPU่ฎญ็ปƒไธ€่‡ด็š„ใ€‚ๅฆ‚ๆžœๆœบๅ™จๆœ‰GPU๏ผŒไฝ†ๆ˜ฏไธๅธŒๆœ›ไฝฟ็”จๅฎƒไปฌ๏ผŒๆˆ‘ไปฌๅช้œ€่ฆๅœจ่ฎญ็ปƒๅ‰้€š่ฟ‡ไปฅไธ‹ๆ–นๅผๅ…ณ้—ญGPUs่ฎญ็ปƒๅŠŸ่ƒฝใ€‚ + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +็„ถๅŽ่ฟ่กŒ[ไธŠๆ–น](###ๅœจๅ•GPUไธŠๆต‹่ฏ•)่„šๆœฌใ€‚ + +## ๅคšGPUใ€ๅคšๆœบๅ™จไธŠ่ฎญ็ปƒๅ’Œๆต‹่ฏ• + +### ๅœจๅคšGPUไธŠ่ฎญ็ปƒ + +OpenMMLab2.0 ้€š่ฟ‡ `MMDistributedDataParallel`ๅฎž็Žฐ **ๅˆ†ๅธƒๅผ** ่ฎญ็ปƒใ€‚ + +`tools/dist_train.sh` ๆ–‡ไปถๆไพ›ไบ†ๅœจๅœจๅคšGPUไธŠ้ƒจ็ฝฒ่ฎญ็ปƒไปปๅŠก็š„ๆ–นๆณ•ใ€‚ + +ๅŸบ็ก€็”จๆณ•ๅฆ‚ไธ‹: + +```shell +sh tools/dist_train.sh ${้…็ฝฎๆ–‡ไปถ} ${GPUๆ•ฐ้‡} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +ๅฏ้€‰ๅ‚ๆ•ฐไธŽ[ไธŠๆ–น](###ๅœจๅ•GPUไธŠ่ฎญ็ปƒ)็›ธๅŒๅนถไธ”่ฟ˜ๅขžๅŠ ไบ†ๅฏไปฅๆŒ‡ๅฎšgpuๆ•ฐ้‡็š„ๅ‚ๆ•ฐใ€‚ + +็คบไพ‹: + +```shell +# ๆจกๅž‹่ฎญ็ปƒ็š„ๆฃ€ๆŸฅ็‚นๅ’Œๆ—ฅๅฟ—ไฟๅญ˜ๅœจ่ฟ™ไธช่ทฏๅพ„ไธ‹๏ผš WORK_DIR=work_dirs/pspnet_r50-d8_4xb4-80k_ade20k-512x512/ +# ๅฆ‚ๆžœๅทฅไฝœ่ทฏๅพ„ๆฒกๆœ‰่ขซ่ฎพๅฎš๏ผŒๅฎƒๅฐ†ไผš่ขซ่‡ชๅŠจ็”Ÿๆˆใ€‚ +sh tools/dist_train.sh configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py 8 --work-dir work_dirs/pspnet_r50-d8_4xb4-80k_ade20k-512x512 +``` + +**ๆณจๆ„**: ๅœจ่ฎญ็ปƒ่ฟ‡็จ‹ไธญ๏ผŒๆฃ€ๆŸฅ็‚นๅ’Œๆ—ฅๅฟ—ไฟๅญ˜ๅœจ`work_dirs/`ไธ‹็š„้…็ฝฎๆ–‡ไปถ็š„็›ธๅŒๆ–‡ไปถๅคน็ป“ๆž„ไธ‹ใ€‚ +ไธๆŽจ่่‡ชๅฎšไน‰็š„ๅทฅไฝœ่ทฏๅพ„๏ผŒๅ› ไธบ่ฏ„ไผฐ่„šๆœฌไพ่ต–ไบŽๆบ่‡ช้…็ฝฎๆ–‡ไปถๅ็š„่ทฏๅพ„ใ€‚ๅฆ‚ๆžœๆ‚จๅธŒๆœ›ๅฐ†ๆƒ้‡ไฟๅญ˜ๅœจๅ…ถไป–ๅœฐๆ–น๏ผŒ่ฏท็”จ็ฌฆๅท้“พๆŽฅ๏ผŒไพ‹ๅฆ‚๏ผš + +```shell +ln -s ${ๆ‚จ็š„ๅทฅไฝœ่ทฏๅพ„} ${MMSEG ่ทฏๅพ„}/work_dirs +``` + +### ๅœจๅคšGPUไธŠๆต‹่ฏ• + +`tools/dist_test.sh` ๆ–‡ไปถๆไพ›ไบ†ๅœจๅคšGPUไธŠๅฏๅŠจๆต‹่ฏ•ไปปๅŠก็š„ๆ–นๆณ•ใ€‚ + +ๅŸบ็ก€็”จๆณ•ๅฆ‚ไธ‹: + +```shell +sh tools/dist_test.sh ${้…็ฝฎๆ–‡ไปถ} ${ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ} ${GPUๆ•ฐ้‡} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +ๅฏ้€‰ๅ‚ๆ•ฐไธŽ[ไธŠๆ–น](###ๅœจๅ•GPUไธŠๆต‹่ฏ•)็›ธๅŒๅนถไธ”ๅขžๅŠ ไบ†ๅฏไปฅๆŒ‡ๅฎš gpu ๆ•ฐ้‡็š„ๅ‚ๆ•ฐใ€‚ + +็คบไพ‹: + +```shell +./tools/dist_test.sh configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth 4 +``` + +### ๅœจๅ•ๅฐๆœบๅ™จไธŠๅฏๅŠจๅคšไธชไปปๅŠก + +ๅฆ‚ๆžœๆ‚จๅœจๅ•ไธชๆœบๅ™จไธŠ่ฟ่กŒๅคšไธชไปปๅŠก๏ผŒๆฏ”ๅฆ‚๏ผšๅœจ8ๅกGPU็š„ๅ•ไธชๆœบๅ™จไธŠๆ‰ง่กŒ2ไธชๅ„้œ€4ๅกGPU็š„่ฎญ็ปƒไปปๅŠก๏ผŒๆ‚จ้œ€่ฆไธบๆฏไธชไปปๅŠกๅ…ทไฝ“ๆŒ‡ๅฎšไธๅŒ็ซฏๅฃ๏ผˆ้ป˜่ฎค29500๏ผ‰๏ผŒไปŽ่€Œ้ฟๅ…้€š่ฎฏๅ†ฒ็ชใ€‚ๅฆๅˆ™๏ผŒไผšๆœ‰ๆŠฅ้”™ไฟกๆฏโ€”โ€”`RuntimeError: Address already in use`๏ผˆ่ฟ่กŒ้”™่ฏฏ๏ผšๅœฐๅ€่ขซไฝฟ็”จ๏ผ‰ใ€‚ + +ๅฆ‚ๆžœๆ‚จไฝฟ็”จ `dist_train.sh` ๆฅๅฏๅŠจ่ฎญ็ปƒไปปๅŠก๏ผŒๆ‚จๅฏไปฅ้€š่ฟ‡็Žฏๅขƒๅ˜้‡ `PORT` ่ฎพ็ฝฎ็ซฏๅฃใ€‚ + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 sh tools/dist_train.sh ${้…็ฝฎๆ–‡ไปถ} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 sh tools/dist_train.sh ${้…็ฝฎๆ–‡ไปถ} 4 +``` + +### ๅœจๅคšๅฐๆœบๅ™จไธŠ่ฎญ็ปƒ + +MMSegmentation ็š„ๅˆ†ๅธƒๅผ่ฎญ็ปƒไพ่ต– `torch.distributed`ใ€‚ +ๅ› ๆญค๏ผŒ ๅฏไปฅ้€š่ฟ‡ PyTorch ็š„ [่ฟ่กŒๅทฅๅ…ท launch utility](https://pytorch.org/docs/stable/distributed.html#launch-utility) ๆฅ่ฟ›่กŒๅˆ†ๅธƒๅผ่ฎญ็ปƒใ€‚ + +ๅฆ‚ๆžœๆ‚จๅฏๅŠจ็š„ๅคšๅฐๆœบๅ™จ็ฎ€ๅ•ๅœฐ้€š่ฟ‡ไปฅๅคช็ฝ‘่ฟžๆŽฅ๏ผŒๆ‚จๅฏไปฅ็›ดๆŽฅ่ฟ่กŒไธ‹ๆ–นๅ‘ฝไปค๏ผš + +ๅœจ็ฌฌไธ€ไธชๆœบๅ™จไธŠ: + +```shell +NNODES=2 NODE_RANK=0 PORT=${ไธป่Š‚็‚น็ซฏๅฃ} MASTER_ADDR=${ไธป่Š‚็‚นๅœฐๅ€} sh tools/dist_train.sh ${้…็ฝฎๆ–‡ไปถ} ${GPUS} +``` + +ๅœจ็ฌฌไบŒไธชๆœบๅ™จไธŠ: + +```shell +NNODES=2 NODE_RANK=1 PORT=${ไธป่Š‚็‚น็ซฏๅฃ} MASTER_ADDR=${ไธป่Š‚็‚นๅœฐๅ€} sh tools/dist_train.sh ${้…็ฝฎๆ–‡ไปถ} ${GPUS} +``` + +้€šๅธธ๏ผŒๅฆ‚ๆžœๆ‚จๆฒกๆœ‰ไฝฟ็”จๅƒๆ— ้™ๅธฆๅฎฝไธ€็ฑป็š„้ซ˜้€Ÿ็ฝ‘็ปœ๏ผŒ่ฟ™ไธชไผš่ฟ‡็จ‹ๆฏ”่พƒๆ…ขใ€‚ + +## ้€š่ฟ‡ Slurm ็ฎก็†ไปปๅŠก + +[Slurm](https://slurm.schedmd.com/) ๆ˜ฏไธ€ไธชๅพˆๅฅฝ็š„่ฎก็ฎ—้›†็พคไฝœไธš่ฐƒๅบฆ็ณป็ปŸใ€‚ + +### ้€š่ฟ‡ Slurm ๅœจ้›†็พคไธŠ่ฎญ็ปƒ + +ๅœจไธ€ไธช็”ฑSlurm็ฎก็†็š„้›†็พคไธŠ๏ผŒๆ‚จๅฏไปฅไฝฟ็”จ`slurm_train.sh`ๆฅๅฏๅŠจ่ฎญ็ปƒไปปๅŠกใ€‚ๅฎƒๅŒๆ—ถๆ”ฏๆŒๅ•่Š‚็‚นๅ’Œๅคš่Š‚็‚น็š„่ฎญ็ปƒใ€‚ + +ๅŸบ็ก€็”จๆณ•ๅฆ‚ไธ‹๏ผš + +```shell +[GPUS=${GPUS}] sh tools/slurm_train.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} ${้…็ฝฎๆ–‡ไปถ} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +ไธ‹ๆ–นๆ˜ฏไธ€ไธช้€š่ฟ‡ๅไธบ `dev` ็š„ Slurm ๅˆ†ๅŒบ๏ผŒ่ฐƒ็”จ4ไธช GPU ๆฅ่ฎญ็ปƒ PSPNet๏ผŒๅนถ่ฎพ็ฝฎๅทฅไฝœ่ทฏๅพ„ไธบๅ…ฑไบซๆ–‡ไปถ็ณป็ปŸใ€‚ + +```shell +GPUS=4 sh tools/slurm_train.sh dev pspnet configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py --work-dir work_dir/pspnet +``` + +ๆ‚จๅฏไปฅๆฃ€ๆŸฅ [ๆบ็ ](../../../tools/slurm_train.sh) ๆฅๆŸฅ็œ‹ๅ…จ้ƒจ็š„ๅ‚ๆ•ฐๅ’Œ็Žฏๅขƒๅ˜้‡ใ€‚ + +### ้€š่ฟ‡ Slurm ๅœจ้›†็พคไธŠๆต‹่ฏ• + +ไธŽ่ฎญ็ปƒไปปๅŠก็›ธๅŒ๏ผŒ MMSegmentation ๆไพ› `slurm_test.sh` ๆ–‡ไปถๆฅๅฏๅŠจๆต‹่ฏ•ไปปๅŠกใ€‚ + +ๅŸบ็ก€็”จๆณ•ๅฆ‚ไธ‹๏ผš + +```shell +[GPUS=${GPUS}] sh tools/slurm_test.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} ${้…็ฝฎๆ–‡ไปถ} ${ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +ๆ‚จๅฏไปฅ้€š่ฟ‡ [ๆบ็ ](../../../tools/slurm_test.sh) ๆฅๆŸฅ็œ‹ๅ…จ้ƒจ็š„ๅ‚ๆ•ฐๅ’Œ็Žฏๅขƒๅ˜้‡ใ€‚ + +**ๆณจๆ„๏ผš** ไฝฟ็”จ Slurm ๆ—ถ๏ผŒ้œ€่ฆ่ฎพ็ฝฎ็ซฏๅฃ๏ผŒๅฏไปŽไปฅไธ‹ๆ–นๅผไธญ้€‰ๅ–ไธ€็งใ€‚ + +1. ๆˆ‘ไปฌๆ›ดๆŽจ่็š„้€š่ฟ‡`--cfg-options`่ฎพ็ฝฎ็ซฏๅฃ๏ผŒๅ› ไธบ่ฟ™ไธไผšๆ”นๅ˜ๅŽŸๅง‹้…็ฝฎ๏ผš + + ```shell + GPUS=4 GPUS_PER_NODE=4 sh tools/slurm_train.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} config1.py ${ๅทฅไฝœ่ทฏๅพ„} --cfg-options env_cfg.dist_cfg.port=29500 + GPUS=4 GPUS_PER_NODE=4 sh tools/slurm_train.sh ${ไปปๅŠกๅ} ${ๅทฅไฝœ่ทฏๅพ„} config2.py ${ๅทฅไฝœ่ทฏๅพ„} --cfg-options env_cfg.dist_cfg.port=29501 + ``` + +2. ้€š่ฟ‡ไฟฎๆ”น้…็ฝฎๆ–‡ไปถ่ฎพ็ฝฎไธๅŒ็š„้€š่ฎฏ็ซฏๅฃ๏ผš + + ๅœจ `config1.py`ไธญ: + + ```python + enf_cfg = dict(dist_cfg=dict(backend='nccl', port=29500)) + ``` + + ๅœจ `config2.py`ไธญ๏ผš + + ```python + enf_cfg = dict(dist_cfg=dict(backend='nccl', port=29501)) + ``` + + ็„ถๅŽๆ‚จๅฏไปฅ้€š่ฟ‡ config1.py ๅ’Œ config2.py ๅŒๆ—ถๅฏๅŠจไธคไธชไปปๅŠก๏ผš + + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 sh tools/slurm_train.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} config1.py ${ๅทฅไฝœ่ทฏๅพ„} + CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 sh tools/slurm_train.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} config2.py ${ๅทฅไฝœ่ทฏๅพ„} + ``` + +3. ๅœจๅ‘ฝไปค่กŒไธญ้€š่ฟ‡็Žฏๅขƒๅ˜้‡ `MASTER_PORT` ่ฎพ็ฝฎ็ซฏๅฃ ๏ผš + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 MASTER_PORT=29500 sh tools/slurm_train.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} config1.py ${ๅทฅไฝœ่ทฏๅพ„} +CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 MASTER_PORT=29501 sh tools/slurm_train.sh ${ๅˆ†ๅŒบ} ${ไปปๅŠกๅ} config2.py ${ๅทฅไฝœ่ทฏๅพ„} +``` + +## ๆต‹่ฏ•ๅนถไฟๅญ˜ๅˆ†ๅ‰ฒ็ป“ๆžœ + +### ๅŸบ็ก€ไฝฟ็”จ + +ๅฝ“้œ€่ฆไฟๅญ˜ๆต‹่ฏ•่พ“ๅ‡บ็š„ๅˆ†ๅ‰ฒ็ป“ๆžœ๏ผŒ็”จ `--out` ๆŒ‡ๅฎšๅˆ†ๅ‰ฒ็ป“ๆžœ่พ“ๅ‡บ่ทฏๅพ„ + +```shell +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --out ${OUTPUT_DIR} +``` + +ไปฅไฟๅญ˜ๆจกๅž‹ `fcn_r50-d8_4xb4-80k_ade20k-512x512` ๅœจ ADE20K ้ชŒ่ฏๆ•ฐๆฎ้›†ไธŠ็š„็ป“ๆžœไธบไพ‹๏ผš + +```shell +python tools/test.py configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py ckpt/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth --out work_dirs/format_results +``` + +ๆˆ–่€…้€š่ฟ‡้…็ฝฎๆ–‡ไปถๅฎšไน‰ `output_dir`ใ€‚ไพ‹ๅฆ‚ๅœจ `configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py` ๆทปๅŠ  `test_evaluator` ๅฎšไน‰๏ผš + +```python +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'], output_dir='work_dirs/format_results') +``` + +็„ถๅŽๆ‰ง่กŒ็›ธๅŒๅŠŸ่ƒฝ็š„ๅ‘ฝไปคไธ้œ€่ฆๅ†ไฝฟ็”จ `--out`๏ผš + +```shell +python tools/test.py configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py ckpt/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth +``` + +ๅฝ“ๆต‹่ฏ•็š„ๆ•ฐๆฎ้›†ๆฒกๆœ‰ๆไพ›ๆ ‡ๆณจ๏ผŒ่ฏ„ๆต‹ๆ—ถๆฒกๆœ‰็œŸๅ€ผๅฏไปฅๅ‚ไธŽ่ฎก็ฎ—๏ผŒๅ› ๆญค้œ€่ฆ่ฎพ็ฝฎ `format_only=True`๏ผŒ +ๅŒๆ—ถ้œ€่ฆไฟฎๆ”น `test_dataloader`๏ผŒ็”ฑไบŽๆฒกๆœ‰ๆ ‡ๆณจ๏ผŒๆˆ‘ไปฌ้œ€่ฆๅœจๆ•ฐๆฎๅขžๅผบๅ˜ๆขไธญๅˆ ๆŽ‰ `dict(type='LoadAnnotations')`๏ผŒไปฅไธ‹ๆ˜ฏไธ€ไธช้…็ฝฎ็คบไพ‹๏ผš + +```python +test_evaluator = dict( + type='IoUMetric', + iou_metrics=['mIoU'], + format_only=True, + output_dir='work_dirs/format_results') +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type = 'ADE20KDataset' + data_root='data/ade/release_test', + data_prefix=dict(img_path='testing'), + # ๆต‹่ฏ•ๆ•ฐๆฎๅ˜ๆขไธญๆฒกๆœ‰ๅŠ ่ฝฝๆ ‡ๆณจ + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + dict(type='PackSegInputs') + ])) +``` + +็„ถๅŽๆ‰ง่กŒๆต‹่ฏ•ๅ‘ฝไปค๏ผš + +```shell +python tools/test.py configs/fcn/fcn_r50-d8_4xb4-80k_ade20k-512x512.py ckpt/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth +``` + +### ๆต‹่ฏ• Cityscapes ๆ•ฐๆฎ้›†ๅนถไฟๅญ˜่พ“ๅ‡บๅˆ†ๅ‰ฒ็ป“ๆžœ + +ๆŽจ่ไฝฟ็”จ `CityscapesMetric` ๆฅไฟๅญ˜ๆจกๅž‹ๅœจ Cityscapes ๆ•ฐๆฎ้›†ไธŠ็š„ๆต‹่ฏ•็ป“ๆžœ๏ผŒไปฅไธ‹ๆ˜ฏไธ€ไธช้…็ฝฎ็คบไพ‹๏ผš + +```python +test_evaluator = dict( + type='CityscapesMetric', + format_only=True, + keep_results=True, + output_dir='work_dirs/format_results') +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='CityscapesDataset', + data_root='data/cityscapes/', + data_prefix=dict(img_path='leftImg8bit/test'), + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + dict(type='PackSegInputs') + ])) +``` + +็„ถๅŽๆ‰ง่กŒ็›ธๅŒ็š„ๅ‘ฝไปค๏ผŒไพ‹ๅฆ‚๏ผš + +```shell +python tools/test.py configs/fcn/fcn_r18-d8_4xb2-80k_cityscapes-512x1024.py ckpt/fcn_r18-d8_512x1024_80k_cityscapes_20201225_021327-6c50f8b4.pth +``` diff --git a/mmsegmentation/docs/zh_cn/user_guides/5_deployment.md b/mmsegmentation/docs/zh_cn/user_guides/5_deployment.md new file mode 100644 index 0000000..b2bec02 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/5_deployment.md @@ -0,0 +1,243 @@ +# ๆ•™็จ‹5๏ผšๆจกๅž‹้ƒจ็ฝฒ + +# MMSegmentation ๆจกๅž‹้ƒจ็ฝฒ + +- [ๆ•™็จ‹5๏ผšๆจกๅž‹้ƒจ็ฝฒ](#ๆ•™็จ‹5ๆจกๅž‹้ƒจ็ฝฒ) +- [MMSegmentation ๆจกๅž‹้ƒจ็ฝฒ](#mmsegmentation-ๆจกๅž‹้ƒจ็ฝฒ) + - [ๅฎ‰่ฃ…](#ๅฎ‰่ฃ…) + - [ๅฎ‰่ฃ… mmseg](#ๅฎ‰่ฃ…-mmseg) + - [ๅฎ‰่ฃ… mmdeploy](#ๅฎ‰่ฃ…-mmdeploy) + - [ๆจกๅž‹่ฝฌๆข](#ๆจกๅž‹่ฝฌๆข) + - [ๆจกๅž‹่ง„่Œƒ](#ๆจกๅž‹่ง„่Œƒ) + - [ๆจกๅž‹ๆŽจ็†](#ๆจกๅž‹ๆŽจ็†) + - [ๅŽ็ซฏๆจกๅž‹ๆŽจ็†](#ๅŽ็ซฏๆจกๅž‹ๆŽจ็†) + - [SDK ๆจกๅž‹ๆŽจ็†](#sdk-ๆจกๅž‹ๆŽจ็†) + - [ๆจกๅž‹ๆ”ฏๆŒๅˆ—่กจ](#ๆจกๅž‹ๆ”ฏๆŒๅˆ—่กจ) + - [ๆณจๆ„ไบ‹้กน](#ๆณจๆ„ไบ‹้กน) + +______________________________________________________________________ + +[MMSegmentation](https://github.com/open-mmlab/mmsegmentation/tree/main) ๅˆ็งฐ`mmseg`๏ผŒๆ˜ฏไธ€ไธชๅŸบไบŽ PyTorch ็š„ๅผ€ๆบๅฏน่ฑกๅˆ†ๅ‰ฒๅทฅๅ…ท็ฎฑใ€‚ๅฎƒๆ˜ฏ [OpenMMLab](https://openmmlab.com/) ้กน็›ฎ็š„ไธ€้ƒจๅˆ†ใ€‚ + +## ๅฎ‰่ฃ… + +### ๅฎ‰่ฃ… mmseg + +่ฏทๅ‚่€ƒ[ๅฎ˜็ฝ‘ๅฎ‰่ฃ…ๆŒ‡ๅ—](https://mmsegmentation.readthedocs.io/en/latest/get_started.html)ใ€‚ + +### ๅฎ‰่ฃ… mmdeploy + +mmdeploy ๆœ‰ไปฅไธ‹ๅ‡ ็งๅฎ‰่ฃ…ๆ–นๅผ: + +**ๆ–นๅผไธ€๏ผš** ๅฎ‰่ฃ…้ข„็ผ–่ฏ‘ๅŒ… + +่ฏทๅ‚่€ƒ[ๅฎ‰่ฃ…ๆฆ‚่ฟฐ](https://mmdeploy.readthedocs.io/zh_CN/latest/get_started.html#mmdeploy) + +**ๆ–นๅผไบŒ๏ผš** ไธ€้”ฎๅผ่„šๆœฌๅฎ‰่ฃ… + +ๅฆ‚ๆžœ้ƒจ็ฝฒๅนณๅฐๆ˜ฏ **Ubuntu 18.04 ๅŠไปฅไธŠ็‰ˆๆœฌ**๏ผŒ ่ฏทๅ‚่€ƒ[่„šๆœฌๅฎ‰่ฃ…่ฏดๆ˜Ž](../01-how-to-build/build_from_script.md)๏ผŒๅฎŒๆˆๅฎ‰่ฃ…่ฟ‡็จ‹ใ€‚ +ๆฏ”ๅฆ‚๏ผŒไปฅไธ‹ๅ‘ฝไปคๅฏไปฅๅฎ‰่ฃ… mmdeploy ไปฅๅŠ้…ๅฅ—็š„ๆŽจ็†ๅผ•ๆ“Žโ€”โ€”`ONNX Runtime`. + +```shell +git clone --recursive -b main https://github.com/open-mmlab/mmdeploy.git +cd mmdeploy +python3 tools/scripts/build_ubuntu_x64_ort.py $(nproc) +export PYTHONPATH=$(pwd)/build/lib:$PYTHONPATH +export LD_LIBRARY_PATH=$(pwd)/../mmdeploy-dep/onnxruntime-linux-x64-1.8.1/lib/:$LD_LIBRARY_PATH +``` + +**่ฏดๆ˜Ž**: + +- ๆŠŠ `$(pwd)/build/lib` ๆทปๅŠ ๅˆฐ `PYTHONPATH`๏ผŒ็›ฎ็š„ๆ˜ฏไธบไบ†ๅŠ ่ฝฝ mmdeploy SDK python ๅŒ… `mmdeploy_runtime`๏ผŒๅœจ็ซ ่Š‚ [SDKๆจกๅž‹ๆŽจ็†](#sdkๆจกๅž‹ๆŽจ็†)ไธญ่ฎฒ่ฟฐๅ…ถ็”จๆณ•ใ€‚ +- ๅœจ[ไฝฟ็”จ ONNX RuntimeๆŽจ็†ๅŽ็ซฏๆจกๅž‹](#ๅŽ็ซฏๆจกๅž‹ๆŽจ็†)ๆ—ถ๏ผŒ้œ€่ฆๅŠ ่ฝฝ่‡ชๅฎšไน‰็ฎ—ๅญๅบ“๏ผŒ้œ€่ฆๆŠŠ ONNX Runtime ๅบ“็š„่ทฏๅพ„ๅŠ ๅ…ฅ็Žฏๅขƒๅ˜้‡ `LD_LIBRARY_PATH`ไธญใ€‚ + +**ๆ–นๅผไธ‰๏ผš** ๆบ็ ๅฎ‰่ฃ… + +ๅœจๆ–นๅผไธ€ใ€ไบŒ้ƒฝๆปก่ถณไธไบ†็š„ๆƒ…ๅ†ตไธ‹๏ผŒ่ฏทๅ‚่€ƒ[ๆบ็ ๅฎ‰่ฃ…่ฏดๆ˜Ž](../01-how-to-build/build_from_source.md) ๅฎ‰่ฃ… mmdeploy ไปฅๅŠๆ‰€้œ€ๆŽจ็†ๅผ•ๆ“Žใ€‚ + +## ๆจกๅž‹่ฝฌๆข + +ไฝ ๅฏไปฅไฝฟ็”จ [tools/deploy.py](https://github.com/open-mmlab/mmdeploy/tree/main/tools/deploy.py) ๆŠŠ mmseg ๆจกๅž‹ไธ€้”ฎๅผ่ฝฌๆขไธบๆŽจ็†ๅŽ็ซฏๆจกๅž‹ใ€‚ +่ฏฅๅทฅๅ…ท็š„่ฏฆ็ป†ไฝฟ็”จ่ฏดๆ˜Ž่ฏทๅ‚่€ƒ[่ฟ™้‡Œ](https://github.com/open-mmlab/mmdeploy/tree/main/docs/en/02-how-to-run/convert_model.md#usage). + +ไปฅไธ‹๏ผŒๆˆ‘ไปฌๅฐ†ๆผ”็คบๅฆ‚ไฝ•ๆŠŠ `unet` ่ฝฌๆขไธบ onnx ๆจกๅž‹ใ€‚ + +```shell +cd mmdeploy + +# download unet model from mmseg model zoo +mim download mmsegmentation --config unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024 --dest . + +# convert mmseg model to onnxruntime model with dynamic shape +python tools/deploy.py \ + configs/mmseg/segmentation_onnxruntime_dynamic.py \ + unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py \ + fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204-6860854e.pth \ + demo/resources/cityscapes.png \ + --work-dir mmdeploy_models/mmseg/ort \ + --device cpu \ + --show \ + --dump-info +``` + +่ฝฌๆข็š„ๅ…ณ้”ฎไน‹ไธ€ๆ˜ฏไฝฟ็”จๆญฃ็กฎ็š„้…็ฝฎๆ–‡ไปถใ€‚้กน็›ฎไธญๅทฒๅ†…็ฝฎไบ†ๅ„ๅŽ็ซฏ้ƒจ็ฝฒ[้…็ฝฎๆ–‡ไปถ](https://github.com/open-mmlab/mmdeploy/tree/main/configs/mmseg)ใ€‚ +ๆ–‡ไปถ็š„ๅ‘ฝๅๆจกๅผๆ˜ฏ๏ผš + +``` +segmentation_{backend}-{precision}_{static | dynamic}_{shape}.py +``` + +ๅ…ถไธญ๏ผš + +- **{backend}:** ๆŽจ็†ๅŽ็ซฏๅ็งฐใ€‚ๆฏ”ๅฆ‚๏ผŒonnxruntimeใ€tensorrtใ€pplnnใ€ncnnใ€openvinoใ€coreml ็ญ‰็ญ‰ +- **{precision}:** ๆŽจ็†็ฒพๅบฆใ€‚ๆฏ”ๅฆ‚๏ผŒfp16ใ€int8ใ€‚ไธๅกซ่กจ็คบ fp32 +- **{static | dynamic}:** ๅŠจๆ€ใ€้™ๆ€ shape +- **{shape}:** ๆจกๅž‹่พ“ๅ…ฅ็š„ shape ๆˆ–่€… shape ่Œƒๅ›ด + +ๅœจไธŠไพ‹ไธญ๏ผŒไฝ ไนŸๅฏไปฅๆŠŠ `unet` ่ฝฌไธบๅ…ถไป–ๅŽ็ซฏๆจกๅž‹ใ€‚ๆฏ”ๅฆ‚ไฝฟ็”จ`segmentation_tensorrt-fp16_dynamic-512x1024-2048x2048.py`๏ผŒๆŠŠๆจกๅž‹่ฝฌไธบ tensorrt-fp16 ๆจกๅž‹ใ€‚ + +```{tip} +ๅฝ“่ฝฌ tensorrt ๆจกๅž‹ๆ—ถ, --device ้œ€่ฆ่ขซ่ฎพ็ฝฎไธบ "cuda" +``` + +## ๆจกๅž‹่ง„่Œƒ + +ๅœจไฝฟ็”จ่ฝฌๆขๅŽ็š„ๆจกๅž‹่ฟ›่กŒๆŽจ็†ไน‹ๅ‰๏ผŒๆœ‰ๅฟ…่ฆไบ†่งฃ่ฝฌๆข็ป“ๆžœ็š„็ป“ๆž„ใ€‚ ๅฎƒๅญ˜ๆ”พๅœจ `--work-dir` ๆŒ‡ๅฎš็š„่ทฏ่ทฏๅพ„ไธ‹ใ€‚ + +ไธŠไพ‹ไธญ็š„`mmdeploy_models/mmseg/ort`๏ผŒ็ป“ๆž„ๅฆ‚ไธ‹๏ผš + +``` +mmdeploy_models/mmseg/ort +โ”œโ”€โ”€ deploy.json +โ”œโ”€โ”€ detail.json +โ”œโ”€โ”€ end2end.onnx +โ””โ”€โ”€ pipeline.json +``` + +้‡่ฆ็š„ๆ˜ฏ๏ผš + +- **end2end.onnx**: ๆŽจ็†ๅผ•ๆ“Žๆ–‡ไปถใ€‚ๅฏ็”จ ONNX Runtime ๆŽจ็† +- \***.json**: mmdeploy SDK ๆŽจ็†ๆ‰€้œ€็š„ meta ไฟกๆฏ + +ๆ•ดไธชๆ–‡ไปถๅคน่ขซๅฎšไน‰ไธบ**mmdeploy SDK model**ใ€‚ๆข่จ€ไน‹๏ผŒ**mmdeploy SDK model**ๆ—ขๅŒ…ๆ‹ฌๆŽจ็†ๅผ•ๆ“Ž๏ผŒไนŸๅŒ…ๆ‹ฌๆŽจ็† meta ไฟกๆฏใ€‚ + +## ๆจกๅž‹ๆŽจ็† + +### ๅŽ็ซฏๆจกๅž‹ๆŽจ็† + +ไปฅไธŠ่ฟฐๆจกๅž‹่ฝฌๆขๅŽ็š„ `end2end.onnx` ไธบไพ‹๏ผŒไฝ ๅฏไปฅไฝฟ็”จๅฆ‚ไธ‹ไปฃ็ ่ฟ›่กŒๆŽจ็†๏ผš + +```python +from mmdeploy.apis.utils import build_task_processor +from mmdeploy.utils import get_input_shape, load_config +import torch + +deploy_cfg = 'configs/mmseg/segmentation_onnxruntime_dynamic.py' +model_cfg = './unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py' +device = 'cpu' +backend_model = ['./mmdeploy_models/mmseg/ort/end2end.onnx'] +image = './demo/resources/cityscapes.png' + +# read deploy_cfg and model_cfg +deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) + +# build task and backend model +task_processor = build_task_processor(model_cfg, deploy_cfg, device) +model = task_processor.build_backend_model(backend_model) + +# process input image +input_shape = get_input_shape(deploy_cfg) +model_inputs, _ = task_processor.create_input(image, input_shape) + +# do model inference +with torch.no_grad(): + result = model.test_step(model_inputs) + +# visualize results +task_processor.visualize( + image=image, + model=model, + result=result[0], + window_name='visualize', + output_file='./output_segmentation.png') +``` + +### SDK ๆจกๅž‹ๆŽจ็† + +ไฝ ไนŸๅฏไปฅๅ‚่€ƒๅฆ‚ไธ‹ไปฃ็ ๏ผŒๅฏน SDK model ่ฟ›่กŒๆŽจ็†๏ผš + +```python +from mmdeploy_runtime import Segmentor +import cv2 +import numpy as np + +img = cv2.imread('./demo/resources/cityscapes.png') + +# create a classifier +segmentor = Segmentor(model_path='./mmdeploy_models/mmseg/ort', device_name='cpu', device_id=0) +# perform inference +seg = segmentor(img) + +# visualize inference result +## random a palette with size 256x3 +palette = np.random.randint(0, 256, size=(256, 3)) +color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) +for label, color in enumerate(palette): + color_seg[seg == label, :] = color +# convert to BGR +color_seg = color_seg[..., ::-1] +img = img * 0.5 + color_seg * 0.5 +img = img.astype(np.uint8) +cv2.imwrite('output_segmentation.png', img) +``` + +้™คไบ†python API๏ผŒmmdeploy SDK ่ฟ˜ๆไพ›ไบ†่ฏธๅฆ‚ Cใ€C++ใ€C#ใ€Java็ญ‰ๅคš่ฏญ่จ€ๆŽฅๅฃใ€‚ +ไฝ ๅฏไปฅๅ‚่€ƒ[ๆ ทไพ‹](https://github.com/open-mmlab/mmdeploy/tree/main/demo)ๅญฆไน ๅ…ถไป–่ฏญ่จ€ๆŽฅๅฃ็š„ไฝฟ็”จๆ–นๆณ•ใ€‚ + +## ๆจกๅž‹ๆ”ฏๆŒๅˆ—่กจ + +| Model | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVino | +| :-------------------------------------------------------------------------------------------------------- | :---------: | :---------: | :------: | :--: | :---: | :------: | +| [FCN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fcn) | Y | Y | Y | Y | Y | Y | +| [PSPNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/pspnet)[\*](#static_shape) | Y | Y | Y | Y | Y | Y | +| [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3) | Y | Y | Y | Y | Y | Y | +| [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3plus) | Y | Y | Y | Y | Y | Y | +| [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fastscnn)[\*](#static_shape) | Y | Y | Y | N | Y | Y | +| [UNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/unet) | Y | Y | Y | Y | Y | Y | +| [ANN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/ann)[\*](#static_shape) | Y | Y | Y | N | N | N | +| [APCNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/apcnet) | Y | Y | Y | Y | N | N | +| [BiSeNetV1](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/bisenetv1) | Y | Y | Y | Y | N | Y | +| [BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/bisenetv2) | Y | Y | Y | Y | N | Y | +| [CGNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/cgnet) | Y | Y | Y | Y | N | Y | +| [DMNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/dmnet) | ? | Y | N | N | N | N | +| [DNLNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/dnlnet) | ? | Y | Y | Y | N | Y | +| [EMANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/emanet) | Y | Y | Y | N | N | Y | +| [EncNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/encnet) | Y | Y | Y | N | N | Y | +| [ERFNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/erfnet) | Y | Y | Y | Y | N | Y | +| [FastFCN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fastfcn) | Y | Y | Y | Y | N | Y | +| [GCNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/gcnet) | Y | Y | Y | N | N | N | +| [ICNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/icnet)[\*](#static_shape) | Y | Y | Y | N | N | Y | +| [ISANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/isanet)[\*](#static_shape) | N | Y | Y | N | N | Y | +| [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/nonlocal_net) | ? | Y | Y | Y | N | Y | +| [OCRNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/ocrnet) | Y | Y | Y | Y | N | Y | +| [PointRend](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/point_rend)[\*](#static_shape) | Y | Y | Y | N | N | N | +| [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/sem_fpn) | Y | Y | Y | Y | N | Y | +| [STDC](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/stdc) | Y | Y | Y | Y | N | Y | +| [UPerNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/upernet)[\*](#static_shape) | N | Y | Y | N | N | N | +| [DANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/danet) | ? | Y | Y | N | N | Y | +| [Segmenter](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/segmenter)[\*](#static_shape) | N | Y | Y | Y | N | Y | +| [SegFormer](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/segformer)[\*](#static_shape) | ? | Y | Y | N | N | Y | +| [SETR](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/setr) | ? | Y | N | N | N | Y | +| [CCNet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/ccnet) | ? | N | N | N | N | N | +| [PSANet](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/psanet) | ? | N | N | N | N | N | +| [DPT](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/dpt) | ? | N | N | N | N | N | + +## ๆณจๆ„ไบ‹้กน + +- ๆ‰€ๆœ‰ mmseg ๆจกๅž‹ไป…ๆ”ฏๆŒ "whole" ๆŽจ็†ๆจกๅผใ€‚ + +- PSPNet๏ผŒFast-SCNN ไป…ๆ”ฏๆŒ้™ๆ€่พ“ๅ…ฅ๏ผŒๅ› ไธบๅคšๆ•ฐๆŽจ็†ๆก†ๆžถ็š„ [nn.AdaptiveAvgPool2d](https://github.com/open-mmlab/mmsegmentation/blob/0c87f7a0c9099844eff8e90fa3db5b0d0ca02fee/mmseg/models/decode_heads/psp_head.py#L38) ไธๆ”ฏๆŒๅŠจๆ€่พ“ๅ…ฅใ€‚ + +- ๅฏนไบŽไป…ๆ”ฏๆŒ้™ๆ€ๅฝข็Šถ็š„ๆจกๅž‹๏ผŒๅบ”ไฝฟ็”จ้™ๆ€ๅฝข็Šถ็š„้ƒจ็ฝฒ้…็ฝฎๆ–‡ไปถ๏ผŒไพ‹ๅฆ‚ `configs/mmseg/segmentation_tensorrt_static-1024x2048.py` + +- ๅฏนไบŽๅ–œๆฌข้ƒจ็ฝฒๆจกๅž‹็”Ÿๆˆๆฆ‚็Ž‡็‰นๅพๅ›พ็š„็”จๆˆท๏ผŒๅฐ† `codebase_config = dict(with_argmax=False)` ๆ”พๅœจ้ƒจ็ฝฒ้…็ฝฎไธญๅฐฑ่ถณๅคŸไบ†ใ€‚ diff --git a/mmsegmentation/docs/zh_cn/user_guides/deploy_jetson.md b/mmsegmentation/docs/zh_cn/user_guides/deploy_jetson.md new file mode 100644 index 0000000..6cebd9c --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/deploy_jetson.md @@ -0,0 +1,372 @@ +# ๅฐ† MMSeg ๆจกๅž‹่ฐƒไผ˜ๅŠ้ƒจ็ฝฒๅˆฐ NVIDIA Jetson ๅนณๅฐๆ•™็จ‹ + +- ่ฏทๅ…ˆๆŸฅ้˜…[MMSegmentation ๆจกๅž‹้ƒจ็ฝฒ](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/5_deployment.md)ๆ–‡ๆกฃใ€‚ +- **ๆœฌๆ•™็จ‹ๆ‰€็”จ mmsegmentation ็‰ˆๆœฌ๏ผš v1.1.2** +- **ๆœฌๆ•™็จ‹ๆ‰€็”จ NVIDIA Jetson ่ฎพๅค‡๏ผš NVIDIA Jetson AGX Orin 64G** + +
+ Smiley face +
+ +## 1 ้…็ฝฎ [mmsegmentation](https://github.com/open-mmlab/mmsegmentation) + +- ๆ นๆฎ[ๅฎ‰่ฃ…ๅ’Œ้ชŒ่ฏ](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/get_started.md)ๆ–‡ๆกฃ๏ผŒๅฎŒๆˆๅผ€ๅ‘ [mmsegmentation](https://github.com/open-mmlab/mmsegmentation) ๆ‰€้œ€็š„ [`pytorch`](https://pytorch.org/get-started/locally/)ใ€[`mmcv`](https://github.com/open-mmlab/mmcv)ใ€[`mmengine`](https://github.com/open-mmlab/mmengine) ็ญ‰็Žฏๅขƒไพ่ต–ๅฎ‰่ฃ…ใ€‚ +- ไปŽ GitHub ไฝฟ็”จ git clone ๅ‘ฝไปคๅฎŒๆˆ [mmsegmentation](https://github.com/open-mmlab/mmsegmentation) ไธ‹่ฝฝใ€‚็ฝ‘็ปœไธๅฅฝ็š„ๅŒๅญฆ๏ผŒๅฏ้€š่ฟ‡ [MMSeg GitHub](https://github.com/open-mmlab/mmsegmentation) ้กต้ข่ฟ›่กŒ zip ็š„ไธ‹่ฝฝใ€‚ + ```bash + git clone https://github.com/open-mmlab/mmsegmentation.git + ``` +- ไฝฟ็”จ `pip install -v -e.` ๅ‘ฝไปคๅŠจๆ€ๅฎ‰่ฃ… mmsegmentation ใ€‚ + ```bash + cd mmsegmentation + pip install -v -e . + ``` + ๆ็คบๆˆๅŠŸๅฎ‰่ฃ…ๅŽ๏ผŒๅฏ้€š่ฟ‡ `pip list` ๅ‘ฝไปคๆŸฅ็œ‹ๅˆฐ mmsegmentation ๅทฒ้€š่ฟ‡ๆœฌๅœฐๅฎ‰่ฃ…ๆ–นๅผๅฎ‰่ฃ…ๅˆฐไบ†ๆ‚จ็š„็Žฏๅขƒไธญใ€‚ + ![mmseg-install](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/a9c7bcc9-cdcc-40a4-bd7b-8153195549c8) + +## 2 ๅ‡†ๅค‡ๆ‚จ็š„ๆ•ฐๆฎ้›† + +- ๆœฌๆ•™็จ‹ไฝฟ็”จ้ฅๆ„Ÿๅ›พๅƒ่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ้›† [potsdam](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/2_dataset_prepare.md#isprs-potsdam) ไฝœไธบ็คบไพ‹ใ€‚ +- ๆ นๆฎ [potsdam ๆ•ฐๆฎๅ‡†ๅค‡](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/2_dataset_prepare.md#isprs-potsdam)ๆ–‡ๆกฃ๏ผŒ่ฟ›่กŒๆ•ฐๆฎ้›†ไธ‹่ฝฝๅŠ MMSeg ๆ ผๅผ็š„ๅ‡†ๅค‡ใ€‚ +- ๆ•ฐๆฎ้›†ไป‹็ป๏ผš potsdam ๆ•ฐๆฎ้›†ๆ˜ฏไปฅๅพทๅ›ฝไธ€ไธชๅ…ธๅž‹็š„ๅŽ†ๅฒๅŸŽๅธ‚ Potsdam ๅ‘ฝๅ็š„๏ผŒ่ฏฅๅŸŽๅธ‚ๆœ‰็€ๅคงๅปบ็ญ‘็พคใ€็‹ญ็ช„็š„่ก—้“ๅ’Œๅฏ†้›†็š„ๅปบ็ญ‘็ป“ๆž„ใ€‚ potsdam ๆ•ฐๆฎ้›†ๅŒ…ๅซ 38 ๅน… 6000x6000 ๅƒ็ด ็š„ๅ›พๅƒ๏ผŒ็ฉบ้—ดๅˆ†่พจ็Ž‡ไธบ 5cm๏ผŒๆ•ฐๆฎ้›†็š„็คบไพ‹ๅฆ‚ไธ‹ๅ›พ๏ผš + ![potsdam-img](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/3bc0a75b-1693-4ae6-aeea-ad502e955068) + +## 3 ไปŽ config ้กต้ขไธ‹่ฝฝๆจกๅž‹็š„ pth ๆƒ้‡ๆ–‡ไปถ + +่ฟ™้‡Œไปฅ [`deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py`](../../configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py) ้…็ฝฎๆ–‡ไปถไธพไพ‹๏ผŒๅœจ [configs](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3plus#potsdam) ้กต้ขไธ‹่ฝฝๆƒ้‡ๆ–‡ไปถ๏ผŒ +![pth](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/8f747362-caf4-406c-808d-4ca72babb209) + +## 4 ้€š่ฟ‡ [OpenMMLab deployee](https://platform.openmmlab.com/deploee) ไปฅไบคไบ’ๅผๆ–นๅผ่ฟ›่กŒๆจกๅž‹่ฝฌๆขๅŠๆต‹้€Ÿ + +### 4.1 ๆจกๅž‹่ฝฌๆข + +ๅœจ่ฏฅ้ƒจๅˆ†ไธญ๏ผŒ[OpenMMLab ๅฎ˜็ฝ‘](https://platform.openmmlab.com/deploee)ๆไพ›ไบ†ๆจกๅž‹่ฝฌๆขๅŠๆจกๅž‹ๆต‹้€Ÿ็š„ไบคไบ’็•Œ้ข๏ผŒๆ— ้œ€ไปปไฝ•ไปฃ็ ๏ผŒๅณๅฏ้€š่ฟ‡้€‰ๆ‹ฉๅฏนๅบ”้€‰้กนๅฎŒๆˆๆจกๅž‹ ONNX ๆ ผๅผ`xxxx.onnx` ๅ’Œ TensorRT `.engine`ๆ ผๅผ็š„่ฝฌๆขใ€‚ +ๅฆ‚ๆ‚จ็š„่‡ชๅฎšไน‰ config ๆ–‡ไปถไธญๆœ‰็›ธๅฏนๅผ•็”จๅ…ณ็ณป๏ผŒๅฆ‚๏ผš + +```python +# xxxx.py +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/potsdam.py', + '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +``` + +ๆ‚จๅฏไปฅไฝฟ็”จไปฅไธ‹ไปฃ็ ๆถˆ้™ค็›ธๅฏนๅผ•็”จๅ…ณ็ณป๏ผŒไปฅ็”ŸๆˆๅฎŒๆ•ด็š„ config ๆ–‡ไปถใ€‚ + +```python +import mmengine + +mmengine.Config.fromfile("configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py").dump("My_config.py") +``` + +ไฝฟ็”จไธŠ่ฟฐไปฃ็ ๅŽ๏ผŒๆ‚จ่ƒฝๅคŸ็œ‹ๅˆฐ๏ผŒๅœจ`My_config.py`ๅŒ…ๅซ็€ๅฎŒๆ•ด็š„้…็ฝฎๆ–‡ไปถ๏ผŒๆ— ็›ธๅฏนๅผ•็”จใ€‚่ฟ™ๆ—ถ๏ผŒไธŠไผ ๆจกๅž‹ config ่‡ณ็ฝ‘้กตๅ†…ๅฏนๅบ”ๅค„ใ€‚ + +#### ๅˆ›ๅปบ่ฝฌๆขไปปๅŠก + +ๆŒ‰็…งไธ‹ๅ›พๆ็คบๅŠ่‡ชๅทฑ็š„้œ€ๆฑ‚๏ผŒๅˆ›ๅปบ่ฝฌๆขไปปๅŠกๅนถๆไบคใ€‚ + +
+ NVIDIA-Jetson +
+ +### 4.2 ๆจกๅž‹ๆต‹้€Ÿ + +ๅœจๅฎŒๆˆๆจกๅž‹่ฝฌๆขๅŽๅฏ้€š่ฟ‡**ๆจกๅž‹ๆต‹้€Ÿ**็•Œ้ข๏ผŒๅฎŒๆˆๅœจ็œŸๅฎž่ฎพๅค‡ไธŠ็š„ๆจกๅž‹ๆต‹้€Ÿใ€‚ + +#### ๅˆ›ๅปบๆต‹้€ŸไปปๅŠก + +
+ NVIDIA-Jetson +
+ +
+ NVIDIA-Jetson +
+ +ๆต‹้€ŸๅฎŒๆˆๅŽ๏ผŒๅฏๅœจ้กต้ข็”ŸๆˆๅฎŒๆ•ด็š„ๆต‹้€ŸๆŠฅๅ‘Šใ€‚[ๆŸฅ็œ‹ๆต‹้€ŸๆŠฅๅ‘Š็คบไพ‹](https://openmmlab-deploee.oss-cn-shanghai.aliyuncs.com/tmp/profile_speed/4352f5.txt) + +## 5 ้€š่ฟ‡ OpenMMLab mmdeploy ไปฅๅ‘ฝไปค่กŒๅฐ†ๆจกๅž‹่ฝฌๆขไธบONNXๆ ผๅผ + +่ฏฅ้ƒจๅˆ†ๅฏไปฅ้€š่ฟ‡ mmdeploy ๅบ“ๅฏน mmseg ่ฎญ็ปƒๅฅฝ็š„ๆจกๅž‹่ฟ›่กŒๆŽจ็†ๆ ผๅผ็š„่ฝฌๆขใ€‚่ฟ™้‡Œ็ป™ๅ‡บไธ€ไธช็คบไพ‹๏ผŒๅ…ทไฝ“ๆ–‡ๆกฃๅฏ่ง[ mmdeploy ๆจกๅž‹่ฝฌๆขๆ–‡ๆกฃ](../../docs/zh_cn/user_guides/5_deployment.md)ใ€‚ + +### 5.1 ้€š่ฟ‡ๆบ็ ๆž„ๅปบ mmdeploy ๅบ“ + +ๅœจๆ‚จๅฎ‰่ฃ… mmsegmentation ๅบ“็š„่™šๆ‹Ÿ็Žฏๅขƒไธ‹๏ผŒ้€š่ฟ‡ `git clone`ๅ‘ฝไปคไปŽ GitHub ๅ…‹้š† [mmdeploy](https://github.com/open-mmlab/mmdeploy) + +### 5.2 ๆจกๅž‹่ฝฌๆข + +ๅฆ‚ๆ‚จ็š„ config ไธญๅซๆœ‰็›ธๅฏนๅผ•็”จ๏ผŒไป้œ€่ฟ›่กŒๆถˆ้™ค๏ผŒๅฆ‚[4.1 ๆจกๅž‹่ฝฌๆข](#4.1-ๆจกๅž‹่ฝฌๆข)ๆ‰€่ฟฐ, +่ฟ›ๅ…ฅ mmdeploy ๆ–‡ไปถๅคน๏ผŒๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปค๏ผŒๅณๅฏๅฎŒๆˆๆจกๅž‹่ฝฌๆขใ€‚ + +```bash +python tools/deploy.py \ + configs/mmseg/segmentation_onnxruntime_static-512x512.py \ + ../atl_config.py \ + ../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \ + ../2_13_1024_5488_1536_6000.png \ + --work-dir ../atl_models \ + --device cpu \ + --show \ + --dump-info +``` + +```bash +# ไฝฟ็”จๆ–นๆณ• +python ./tools/deploy.py \ + ${้ƒจ็ฝฒ้…็ฝฎๆ–‡ไปถ่ทฏๅพ„} \ + ${ๆจกๅž‹้…็ฝฎๆ–‡ไปถ่ทฏๅพ„} \ + ${ๆจกๅž‹ๆƒ้‡่ทฏๅพ„} \ + ${่พ“ๅ…ฅๅ›พๅƒ่ทฏๅพ„} \ + --work-dir ${็”จๆฅไฟๅญ˜ๆ—ฅๅฟ—ๅ’Œๆจกๅž‹ๆ–‡ไปถ่ทฏๅพ„} \ + --device ${cpu/cuda:0} \ + --show \ # ๆ˜ฏๅฆๆ˜พ็คบๆฃ€ๆต‹็š„็ป“ๆžœ + --dump-info # ๆ˜ฏๅฆ่พ“ๅ‡บ SDK ไฟกๆฏ + +``` + +ๆ‰ง่กŒๆˆๅŠŸๅŽ๏ผŒๆ‚จๅฐ†่ƒฝๅคŸ็œ‹ๅˆฐไปฅไธ‹ๆ็คบ๏ผŒๅณไธบ่ฝฌๆขๆˆๅŠŸใ€‚ + +```bash +10/08 17:40:44 - mmengine - INFO - visualize pytorch model success. +10/08 17:40:44 - mmengine - INFO - All process success. +``` + +
+ NVIDIA-Jetson +
+ +# 6 ๅœจ Jetson ๅนณๅฐ่ฟ›่กŒ่ฝฌๆขๅŠ้ƒจ็ฝฒ + +## 6.1 ็Žฏๅขƒๅ‡†ๅค‡ + +ๅ‚่€ƒ[ๅฆ‚ไฝ•ๅœจ Jetson ๆจก็ป„ไธŠๅฎ‰่ฃ… MMDeploy](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/jetsons.md)ๆ–‡ๆกฃ๏ผŒๅฎŒๆˆๅœจ Jetson ไธŠ็š„็Žฏๅขƒๅ‡†ๅค‡ๅทฅไฝœใ€‚ +**ๆณจ**๏ผšๅฎ‰่ฃ… Pytorch๏ผŒๅฏๆŸฅ้˜… [NVIDIA Jetson Pytorch ๅฎ‰่ฃ…ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/jetsons.md)ๅฎ‰่ฃ…ๆœ€ๆ–ฐ็š„ Pytorchใ€‚ + +### 6.1.1 ๅˆ›ๅปบ่™šๆ‹Ÿ็Žฏๅขƒ + +```bash +conda create -n {ๆ‚จ่™šๆ‹Ÿ็Žฏๅขƒ็š„ๅๅญ—} python={python็‰ˆๆœฌ} +``` + +### 6.1.2 ่™šๆ‹Ÿ็Žฏๅขƒๅ†…ๅฎ‰่ฃ…Pytorch + +ๆณจๆ„๏ผš่ฟ™้‡Œไธ่ฆๅฎ‰่ฃ…ๆœ€ๆ–ฐ็š„ pytorch 2.0๏ผŒๅ› ไธบ pyTorch 1.11 ๆ˜ฏๆœ€ๅŽไธ€ไธชไฝฟ็”จ USE_DISTRIBUTED ๆž„ๅปบ็š„wheel๏ผŒๅฆๅˆ™ไผšๅœจ็”จmmdeploy่ฟ›่กŒๆจกๅž‹่ฝฌๆข็š„ๆ—ถๅ€™ๆ็คบ`AttributeError: module 'torch.distributed' has no attribute 'ReduceOp'`็š„้”™่ฏฏใ€‚ๅ‚่€ƒไปฅไธ‹้“พๆŽฅ๏ผšhttps://forums.developer.nvidia.com/t/module-torch-distributed-has-no-attribute-reduceop/256581/6 +ไธ‹่ฝฝ`torch-1.11.0-cp38-cp38-linux_aarch64.whl`ๅนถๅฎ‰่ฃ… + +```bash +pip install torch-1.11.0-cp38-cp38-linux_aarch64.whl +``` + +ๆ‰ง่กŒไปฅไธŠๅ‘ฝไปคๅŽ๏ผŒๆ‚จๅฐ†่ƒฝ็œ‹ๅˆฐไปฅไธ‹ๆ็คบ๏ผŒๅณไธบๅฎ‰่ฃ…ๆˆๅŠŸใ€‚ + +```bash +Processing ./torch-1.11.0-cp38-cp38-linux_aarch64.whl +Requirement already satisfied: typing-extensions in /home/sirs/miniconda3/envs/openmmlab/lib/python3.8/site-packages (from torch==1.11.0) (4.7.1) +Installing collected packages: torch +Successfully installed torch-1.11.0 +``` + +### 6.1.3 ๅฐ† Jetson Pack ่‡ชๅธฆ็š„ tensorrt ๆ‹ท่ด่‡ณ่™šๆ‹Ÿ็Žฏๅขƒไธ‹ + +่ฏทๅ‚่€ƒ[้…็ฝฎ TensorRT](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/jetsons.md#%E9%85%8D%E7%BD%AE-tensorrt)ใ€‚ +JetPack SDK ่‡ชๅธฆ TensorRTใ€‚ ไฝ†ๆ˜ฏไธบไบ†่ƒฝๅคŸๅœจ Conda ็ŽฏๅขƒไธญๆˆๅŠŸๅฏผๅ…ฅ๏ผŒๆˆ‘ไปฌ้œ€่ฆๅฐ† TensorRT ๆ‹ท่ด่ฟ›ๅ…ˆๅ‰ๅˆ›ๅปบ็š„ Conda ็Žฏๅขƒไธญใ€‚ + +```bash +export PYTHON_VERSION=`python3 --version | cut -d' ' -f 2 | cut -d'.' -f1,2` +cp -r /usr/lib/python${PYTHON_VERSION}/dist-packages/tensorrt* ~/miniconda/envs/{ๆ‚จ็š„่™šๆ‹Ÿ็Žฏๅขƒๅๅญ—}/lib/python${PYTHON_VERSION}/site-packages/ +``` + +### 6.1.4 ๅฎ‰่ฃ… MMCV + +้€š่ฟ‡`mim install mmcv`ๆˆ–ไปŽๆบ็ ๅฏนๅ…ถ่ฟ›่กŒ็ผ–่ฏ‘ใ€‚ + +```bash +pip install openmim +mim install mmcv +``` + +ๆˆ–่€…ไปŽๆบ็ ๅฏนๅ…ถ่ฟ›่กŒ็ผ–่ฏ‘ใ€‚ + +```bash +sudo apt-get install -y libssl-dev +git clone https://github.com/open-mmlab/mmcv.git +cd mmcv +pip install -e . +``` + +ๆณจ๏ผšpytorch็‰ˆๆœฌๅ‘็”Ÿๅ˜ๅŠจๅŽ๏ผŒ้œ€่ฆ้‡ๆ–ฐ็ผ–่ฏ‘mmcvใ€‚ + +### 6.1.5 ๅฎ‰่ฃ… ONNX + +ๆณจ๏ผšไปฅไธ‹ๆ–นๅผไบŒ้€‰ไธ€ + +- conda + ```bash + conda install -c conda-forge onnx + ``` +- pip + ```bash + python3 -m pip install onnx + ``` + +### 6.1.6 ๅฎ‰่ฃ… ONNX Runtime + +ๆ นๆฎ็ฝ‘้กต [ONNX Runtime](https://elinux.org/Jetson_Zoo#ONNX_Runtime) ้€‰ๆ‹ฉๅˆ้€‚็š„ONNX Runtime็‰ˆๆœฌ่ฟ›่กŒไธ‹่ฝฝๅฎ‰่ฃ…ใ€‚ +็คบไพ‹๏ผš + +```bash +# Install pip wheel +$ pip3 install onnxruntime_gpu-1.10.0-cp38-cp38-linux_aarch64.whl + +``` + +## 6.2 ๅœจ Jetson AGX Orin ่ฟ›่กŒๆจกๅž‹่ฝฌๆขๅŠๆŽจ็† + +### 6.2.1 ONNX ๆจกๅž‹่ฝฌๆข + +ๅŒ[4.1 ๆจกๅž‹่ฝฌๆข](#4.1-ๆจกๅž‹่ฝฌๆข)็›ธๅŒ๏ผŒๅœจ Jetson ๅนณๅฐไธ‹่ฟ›ๅ…ฅๅฎ‰่ฃ…ๅฅฝ็š„่™šๆ‹Ÿ็Žฏๅขƒ๏ผŒไปฅๅŠmmdeploy ็›ฎๅฝ•๏ผŒ่ฟ›่กŒๆจกๅž‹ONNX่ฝฌๆขใ€‚ + +```bash +python tools/deploy.py \ + configs/mmseg/segmentation_onnxruntime_static-512x512.py \ + ../atl_config.py \ + ../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \ + ../2_13_3584_2560_4096_3072.png \ + --work-dir ../atl_models \ + --device cpu \ + --show \ + --dump-info + +``` + +ๆณจ๏ผš ๅฆ‚ๆžœๆŠฅ้”™ๆ็คบๅ†…ๅฎน๏ผš + +```none +AttributeError: module 'torch.distributed' has no attribute 'ReduceOp' +``` + +ๅฏๅ‚่€ƒไปฅไธ‹้“พๆŽฅ่ฟ›่กŒ่งฃๅ†ณ๏ผšhttps://forums.developer.nvidia.com/t/module-torch-distributed-has-no-attribute-reduceop/256581/6๏ผŒๅณๅฎ‰่ฃ… pytorch 1.11.0 ็‰ˆๆœฌใ€‚ + +่ฝฌๆขๆˆๅŠŸๅŽ๏ผŒๆ‚จๅฐ†ไผš็œ‹ๅˆฐๅฆ‚ไธ‹ไฟกๆฏไปฅๅŠๅŒ…ๅซ ONNX ๆจกๅž‹็š„ๆ–‡ไปถๅคน๏ผš + +```bash +10/09 19:58:22 - mmengine - INFO - visualize pytorch model success. +10/09 19:58:22 - mmengine - INFO - All process success. +``` + +
+ NVIDIA-Jetson + NVIDIA-Jetson +
+ +### 6.2.2 TensorRT ๆจกๅž‹่ฝฌๆข + +ๆ›ดๆข้ƒจ็ฝฒtrt้…็ฝฎๆ–‡ไปถ๏ผŒ่ฟ›่กŒ TensorRT ๆจกๅž‹่ฝฌๆขใ€‚ + +```bash +python tools/deploy.py \ + configs/mmseg/segmentation_tensorrt_static-512x512.py \ + ../atl_config.py \ + ../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \ + ../2_13_3584_2560_4096_3072.png \ + --work-dir ../atl_trt_models \ + --device cuda:0 \ + --show \ + --dump-info + +``` + +่ฝฌๆขๆˆๅŠŸๅŽๆ‚จๅฐ†็œ‹ๅˆฐไปฅไธ‹ไฟกๆฏๅŠ TensorRT ๆจกๅž‹ๆ–‡ไปถๅคน๏ผš + +```bash +10/09 20:15:50 - mmengine - INFO - visualize pytorch model success. +10/09 20:15:50 - mmengine - INFO - All process success. +``` + +
+ NVIDIA-Jetson + NVIDIA-Jetson +
+ +## 6.3 ๆจกๅž‹ๆต‹้€Ÿ + +ๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปคๅฎŒๆˆๆจกๅž‹ๆต‹้€Ÿ๏ผŒ่ฏฆ็ป†ๅ†…ๅฎน่ฏทๆŸฅ็œ‹[ profiler ](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/02-how-to-run/useful_tools.md#profiler) + +```bash +python tools/profiler.py \ + ${DEPLOY_CFG} \ + ${MODEL_CFG} \ + ${IMAGE_DIR} \ + --model ${MODEL} \ + --device ${DEVICE} \ + --shape ${SHAPE} \ + --num-iter ${NUM_ITER} \ + --warmup ${WARMUP} \ + --cfg-options ${CFG_OPTIONS} \ + --batch-size ${BATCH_SIZE} \ + --img-ext ${IMG_EXT} +``` + +็คบไพ‹๏ผš + +```bash +python tools/profiler.py \ + configs/mmseg/segmentation_tensorrt_static-512x512.py \ + ../atl_config.py \ + ../atl_demo_img \ + --model /home/sirs/AI-Tianlong/OpenMMLab/atl_trt_models/end2end.engine \ + --device cuda:0 \ + --shape 512x512 \ + --num-iter 100 +``` + +ๆต‹้€Ÿ็ป“ๆžœ + +![image](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/874e9742-ee10-490c-9e69-17da0096c49b) + +## 6.4 ๆจกๅž‹ๆŽจ็† + +ๆ นๆฎ[6.2.2](#6.2.2-TensorRT-ๆจกๅž‹่ฝฌๆข)ไธญ็”Ÿๆˆ็š„TensorRTๆจกๅž‹ๆ–‡ไปถๅคน๏ผŒ่ฟ›่กŒๆจกๅž‹ๆŽจ็†ใ€‚ + +```python +from mmdeploy.apis.utils import build_task_processor +from mmdeploy.utils import get_input_shape, load_config +import torch + +deploy_cfg='./mmdeploy/configs/mmseg/segmentation_tensorrt_static-512x512.py' +model_cfg='./atl_config.py' +device='cuda:0' +backend_model = ['./atl_trt_models/end2end.engine'] +image = './atl_demo_img/2_13_2048_1024_2560_1536.png' + +# read deploy_cfg and model_cfg +deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) + +# build task and backend model +task_processor = build_task_processor(model_cfg, deploy_cfg, device) +model = task_processor.build_backend_model(backend_model) + +# process input image +input_shape = get_input_shape(deploy_cfg) +model_inputs, _ = task_processor.create_input(image, input_shape) + +# do model inference +with torch.no_grad(): + result = model.test_step(model_inputs) + +# visualize results +task_processor.visualize( + image=image, + model=model, + result=result[0], + window_name='visualize', + output_file='./output_segmentation.png') +``` + +ๅณๅฏๅพ—ๅˆฐๆŽจ็†็ป“ๆžœ๏ผš + +
+ NVIDIA-Jetson + NVIDIA-Jetson +
diff --git a/mmsegmentation/docs/zh_cn/user_guides/index.rst b/mmsegmentation/docs/zh_cn/user_guides/index.rst new file mode 100644 index 0000000..d0a313d --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/index.rst @@ -0,0 +1,21 @@ +่ฎญ็ปƒ & ๆต‹่ฏ• +************** + +.. toctree:: + :maxdepth: 1 + + 1_config.md + 2_dataset_prepare.md + 3_inference.md + 4_train_test.md + +ๅฎž็”จๅทฅๅ…ท +************* + +.. toctree:: + :maxdepth: 2 + + visualization.md + useful_tools.md + deployment.md + visualization_feature_map.md diff --git a/mmsegmentation/docs/zh_cn/user_guides/useful_tools.md b/mmsegmentation/docs/zh_cn/user_guides/useful_tools.md new file mode 100644 index 0000000..acbacb9 --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/useful_tools.md @@ -0,0 +1,368 @@ +## ๅธธ็”จๅทฅๅ…ท๏ผˆๅพ…ๆ›ดๆ–ฐ๏ผ‰ + +้™คไบ†่ฎญ็ปƒๅ’Œๆต‹่ฏ•็š„่„šๆœฌ๏ผŒๆˆ‘ไปฌๅœจ `tools/` ๆ–‡ไปถๅคน่ทฏๅพ„ไธ‹่ฟ˜ๆไพ›่ฎธๅคšๆœ‰็”จ็š„ๅทฅๅ…ทใ€‚ + +### ่ฎก็ฎ—ๅ‚ๆ•ฐ้‡๏ผˆparams๏ผ‰ๅ’Œ่ฎก็ฎ—้‡๏ผˆ FLOPs๏ผ‰ (่ฏ•้ชŒๆ€ง) + +ๆˆ‘ไปฌๅŸบไบŽ [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) +ๆไพ›ไบ†ไธ€ไธช็”จไบŽ่ฎก็ฎ—็ป™ๅฎšๆจกๅž‹ๅ‚ๆ•ฐ้‡ๅ’Œ่ฎก็ฎ—้‡็š„่„šๆœฌใ€‚ + +```shell +python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +ๆ‚จๅฐ†ๅพ—ๅˆฐๅฆ‚ไธ‹็š„็ป“ๆžœ๏ผš + +```none +============================== +Input shape: (3, 2048, 1024) +Flops: 1429.68 GMac +Params: 48.98 M +============================== +``` + +**ๆณจๆ„**: ่ฟ™ไธชๅทฅๅ…ทไป็„ถๆ˜ฏ่ฏ•้ชŒๆ€ง็š„๏ผŒๆˆ‘ไปฌๆ— ๆณ•ไฟ่ฏๆ•ฐๅญ—ๆ˜ฏๆญฃ็กฎ็š„ใ€‚ๆ‚จๅฏไปฅๆ‹ฟ่ฟ™ไบ›็ป“ๆžœๅš็ฎ€ๅ•็š„ๅฎž้ชŒ็š„ๅฏน็…ง๏ผŒๅœจๅ†™ๆŠ€ๆœฏๆ–‡ๆกฃๆŠฅๅ‘Šๆˆ–่€…่ฎบๆ–‡ๅ‰ๆ‚จ้œ€่ฆๅ†ๆฌก็กฎ่ฎคไธ€ไธ‹ใ€‚ + +(1) ่ฎก็ฎ—้‡ไธŽ่พ“ๅ…ฅ็š„ๅฝข็Šถๆœ‰ๅ…ณ๏ผŒ่€Œๅ‚ๆ•ฐ้‡ไธŽ่พ“ๅ…ฅ็š„ๅฝข็Šถๆ— ๅ…ณ๏ผŒ้ป˜่ฎค็š„่พ“ๅ…ฅๅฝข็Šถๆ˜ฏ (1, 3, 1280, 800)๏ผ› +(2) ไธ€ไบ›่ฟ็ฎ—ๆ“ไฝœ๏ผŒๅฆ‚ GN ๅ’Œๅ…ถไป–ๅฎšๅˆถ็š„่ฟ็ฎ—ๆ“ไฝœๆฒกๆœ‰ๅŠ ๅ…ฅๅˆฐ่ฎก็ฎ—้‡็š„่ฎก็ฎ—ไธญใ€‚ + +### ๅ‘ๅธƒๆจกๅž‹ + +ๅœจๆ‚จไธŠไผ ไธ€ไธชๆจกๅž‹ๅˆฐไบ‘ๆœๅŠกๅ™จไน‹ๅ‰๏ผŒๆ‚จ้œ€่ฆๅšไปฅไธ‹ๅ‡ ๆญฅ๏ผš +(1) ๅฐ†ๆจกๅž‹ๆƒ้‡่ฝฌๆˆ CPU ๅผ ้‡๏ผ› +(2) ๅˆ ้™ค่ฎฐๅฝ•ไผ˜ๅŒ–ๅ™จ็Šถๆ€ (optimizer states)็š„็›ธๅ…ณไฟกๆฏ๏ผ› +(3) ่ฎก็ฎ—ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ (checkpoint file) ็š„ๅ“ˆๅธŒ็ผ–็ ๏ผˆhash id๏ผ‰ๅนถไธ”ๅฐ†ๅ“ˆๅธŒ็ผ–็ ๅŠ ๅˆฐๆ–‡ไปถๅไธญใ€‚ + +```shell +python tools/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +ไพ‹ๅฆ‚๏ผŒ + +```shell +python tools/publish_model.py work_dirs/pspnet/latest.pth psp_r50_hszhao_200ep.pth +``` + +ๆœ€็ปˆ่พ“ๅ‡บๆ–‡ไปถๅฐ†ๆ˜ฏ `psp_r50_512x1024_40ki_cityscapes-{hash id}.pth`ใ€‚ + +### ๅฏผๅ‡บ ONNX (่ฏ•้ชŒๆ€ง) + +ๆˆ‘ไปฌๆไพ›ไบ†ไธ€ไธช่„šๆœฌๆฅๅฏผๅ‡บๆจกๅž‹ๅˆฐ [ONNX](https://github.com/onnx/onnx) ๆ ผๅผใ€‚่ขซ่ฝฌๆข็š„ๆจกๅž‹ๅฏไปฅ้€š่ฟ‡ๅทฅๅ…ท [Netron](https://github.com/lutzroeder/netron) +ๆฅๅฏ่ง†ๅŒ–ใ€‚้™คๆญคไปฅๅค–๏ผŒๆˆ‘ไปฌๅŒๆ ทๆ”ฏๆŒๅฏน PyTorch ๅ’Œ ONNX ๆจกๅž‹็š„่พ“ๅ‡บ็ป“ๆžœๅšๅฏนๆฏ”ใ€‚ + +```bash +python tools/pytorch2onnx.py \ + ${CONFIG_FILE} \ + --checkpoint ${CHECKPOINT_FILE} \ + --output-file ${ONNX_FILE} \ + --input-img ${INPUT_IMG} \ + --shape ${INPUT_SHAPE} \ + --rescale-shape ${RESCALE_SHAPE} \ + --show \ + --verify \ + --dynamic-export \ + --cfg-options \ + model.test_cfg.mode="whole" +``` + +ๅ„ไธชๅ‚ๆ•ฐ็š„ๆ่ฟฐ: + +- `config` : ๆจกๅž‹้…็ฝฎๆ–‡ไปถ็š„่ทฏๅพ„ +- `--checkpoint` : ๆจกๅž‹ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ็š„่ทฏๅพ„ +- `--output-file`: ่พ“ๅ‡บ็š„ ONNX ๆจกๅž‹็š„่ทฏๅพ„ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒ้ป˜่ฎคๆ˜ฏ `tmp.onnx` +- `--input-img` : ็”จๆฅ่ฝฌๆขๅ’Œๅฏ่ง†ๅŒ–็š„ไธ€ๅผ ่พ“ๅ…ฅๅ›พๅƒ็š„่ทฏๅพ„ +- `--shape`: ๆจกๅž‹็š„่พ“ๅ…ฅๅผ ้‡็š„้ซ˜ๅ’Œๅฎฝใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `test_pipeline` ็š„ `img_scale` +- `--rescale-shape`: ๆ”นๅ˜่พ“ๅ‡บ็š„ๅฝข็Šถใ€‚่ฎพ็ฝฎ่ฟ™ไธชๅ€ผๆฅ้ฟๅ… OOM๏ผŒๅฎƒไป…ๅœจ `slide` ๆจกๅผไธ‹ๅฏไปฅ็”จ +- `--show`: ๆ˜ฏๅฆๆ‰“ๅฐ่พ“ๅ‡บๆจกๅž‹็š„็ป“ๆž„ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `False` +- `--verify`: ๆ˜ฏๅฆ้ชŒ่ฏไธ€ไธช่พ“ๅ‡บๆจกๅž‹็š„ๆญฃ็กฎๆ€ง (correctness)ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `False` +- `--dynamic-export`: ๆ˜ฏๅฆๅฏผๅ‡บๅฝข็Šถๅ˜ๅŒ–็š„่พ“ๅ…ฅไธŽ่พ“ๅ‡บ็š„ ONNX ๆจกๅž‹ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `False` +- `--cfg-options`: ๆ›ดๆ–ฐ้…็ฝฎ้€‰้กน + +**ๆณจๆ„**: ่ฟ™ไธชๅทฅๅ…ทไป็„ถๆ˜ฏ่ฏ•้ชŒๆ€ง็š„๏ผŒ็›ฎๅ‰ไธ€ไบ›่‡ชๅฎšไน‰ๆ“ไฝœ่ฟ˜ๆฒกๆœ‰่ขซๆ”ฏๆŒ + +### ่ฏ„ไผฐ ONNX ๆจกๅž‹ + +ๆˆ‘ไปฌๆไพ› `tools/deploy_test.py` ๅŽป่ฏ„ไผฐไธๅŒๅŽ็ซฏ็š„ ONNX ๆจกๅž‹ใ€‚ + +#### ๅ…ˆๅ†ณๆกไปถ + +- ๅฎ‰่ฃ… onnx ๅ’Œ onnxruntime-gpu + + ```shell + pip install onnx onnxruntime-gpu + ``` + +- ๅ‚่€ƒ [ๅฆ‚ไฝ•ๅœจ MMCV ้‡Œๆž„ๅปบ tensorrt ๆ’ไปถ](https://mmcv.readthedocs.io/en/latest/tensorrt_plugin.html#how-to-build-tensorrt-plugins-in-mmcv) ๅฎ‰่ฃ…TensorRT (ๅฏ้€‰) + +#### ไฝฟ็”จๆ–นๆณ• + +```bash +python tools/deploy_test.py \ + ${CONFIG_FILE} \ + ${MODEL_FILE} \ + ${BACKEND} \ + --out ${OUTPUT_FILE} \ + --eval ${EVALUATION_METRICS} \ + --show \ + --show-dir ${SHOW_DIRECTORY} \ + --cfg-options ${CFG_OPTIONS} \ + --eval-options ${EVALUATION_OPTIONS} \ + --opacity ${OPACITY} \ +``` + +ๅ„ไธชๅ‚ๆ•ฐ็š„ๆ่ฟฐ: + +- `config`: ๆจกๅž‹้…็ฝฎๆ–‡ไปถ็š„่ทฏๅพ„ +- `model`: ่ขซ่ฝฌๆข็š„ๆจกๅž‹ๆ–‡ไปถ็š„่ทฏๅพ„ +- `backend`: ๆŽจ็†็š„ๅŽ็ซฏ๏ผŒๅฏ้€‰้กน๏ผš`onnxruntime`๏ผŒ `tensorrt` +- `--out`: ่พ“ๅ‡บ็ป“ๆžœๆˆ pickle ๆ ผๅผๆ–‡ไปถ็š„่ทฏๅพ„ +- `--format-only` : ไธ่ฏ„ไผฐ็›ดๆŽฅ็ป™่พ“ๅ‡บ็ป“ๆžœ็š„ๆ ผๅผใ€‚้€šๅธธ็”จๅœจๅฝ“ๆ‚จๆƒณๆŠŠ็ป“ๆžœ่พ“ๅ‡บๆˆไธ€ไบ›ๆต‹่ฏ•ๆœๅŠกๅ™จ้œ€่ฆ็š„็‰นๅฎšๆ ผๅผๆ—ถใ€‚ๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `False`ใ€‚ ๆณจๆ„่ฟ™ไธชๅ‚ๆ•ฐๆ˜ฏ็”จ `--eval` ๆฅ **ๆ‰‹ๅŠจๆทปๅŠ ** +- `--eval`: ่ฏ„ไผฐๆŒ‡ๆ ‡๏ผŒๅ–ๅ†ณไบŽๆฏไธชๆ•ฐๆฎ้›†็š„่ฆๆฑ‚๏ผŒไพ‹ๅฆ‚ "mIoU" ๆ˜ฏๅคงๅคšๆ•ฐๆฎ้›†็š„ๆŒ‡ๆ ‡่€Œ "cityscapes" ไป…้’ˆๅฏน Cityscapes ๆ•ฐๆฎ้›†ใ€‚ๆณจๆ„่ฟ™ไธชๅ‚ๆ•ฐๆ˜ฏ็”จ `--format-only` ๆฅ **ๆ‰‹ๅŠจๆทปๅŠ ** +- `--show`: ๆ˜ฏๅฆๅฑ•็คบ็ป“ๆžœ +- `--show-dir`: ๆถ‚ไธŠ็ป“ๆžœ็š„ๅ›พๅƒ่ขซไฟๅญ˜็š„ๆ–‡ไปถๅคน็š„่ทฏๅพ„ +- `--cfg-options`: ้‡ๅ†™้…็ฝฎๆ–‡ไปถ้‡Œ็š„ไธ€ไบ›่ฎพ็ฝฎ๏ผŒ`xxx=yyy` ๆ ผๅผ็š„้”ฎๅ€ผๅฏนๅฐ†่ขซ่ฆ†็›–ๅˆฐ้…็ฝฎๆ–‡ไปถ้‡Œ +- `--eval-options`: ่‡ชๅฎšไน‰็š„่ฏ„ไผฐ็š„้€‰้กน๏ผŒ `xxx=yyy` ๆ ผๅผ็š„้”ฎๅ€ผๅฏนๅฐ†ๆˆไธบ `dataset.evaluate()` ๅ‡ฝๆ•ฐ็š„ๅ‚ๆ•ฐๅ˜้‡ +- `--opacity`: ๆถ‚ไธŠ็ป“ๆžœ็š„ๅˆ†ๅ‰ฒๅ›พ็š„้€ๆ˜Žๅบฆ๏ผŒ่Œƒๅ›ดๅœจ (0, 1\] ไน‹้—ด + +#### ็ป“ๆžœๅ’Œๆจกๅž‹ + +| ๆจกๅž‹ | ้…็ฝฎๆ–‡ไปถ | ๆ•ฐๆฎ้›† | ่ฏ„ไปทๆŒ‡ๆ ‡ | PyTorch | ONNXRuntime | TensorRT-fp32 | TensorRT-fp16 | +| :--------: | :---------------------------------------------: | :--------: | :------: | :-----: | :---------: | :-----------: | :-----------: | +| FCN | fcn_r50-d8_512x1024_40k_cityscapes.py | cityscapes | mIoU | 72.2 | 72.2 | 72.2 | 72.2 | +| PSPNet | pspnet_r50-d8_512x1024_40k_cityscapes.py | cityscapes | mIoU | 77.8 | 77.8 | 77.8 | 77.8 | +| deeplabv3 | deeplabv3_r50-d8_512x1024_40k_cityscapes.py | cityscapes | mIoU | 79.0 | 79.0 | 79.0 | 79.0 | +| deeplabv3+ | deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py | cityscapes | mIoU | 79.6 | 79.5 | 79.5 | 79.5 | +| PSPNet | pspnet_r50-d8_769x769_40k_cityscapes.py | cityscapes | mIoU | 78.2 | 78.1 | | | +| deeplabv3 | deeplabv3_r50-d8_769x769_40k_cityscapes.py | cityscapes | mIoU | 78.5 | 78.3 | | | +| deeplabv3+ | deeplabv3plus_r50-d8_769x769_40k_cityscapes.py | cityscapes | mIoU | 78.9 | 78.7 | | | + +**ๆณจๆ„**: TensorRT ไป…ๅœจไฝฟ็”จ `whole mode` ๆต‹่ฏ•ๆจกๅผๆ—ถ็š„้…็ฝฎๆ–‡ไปถ้‡Œๅฏ็”จใ€‚ + +### ๅฏผๅ‡บ TorchScript (่ฏ•้ชŒๆ€ง) + +ๆˆ‘ไปฌๅŒๆ ทๆไพ›ไธ€ไธช่„šๆœฌๅŽปๆŠŠๆจกๅž‹ๅฏผๅ‡บๆˆ [TorchScript](https://pytorch.org/docs/stable/jit.html) ๆ ผๅผใ€‚ๆ‚จๅฏไปฅไฝฟ็”จ pytorch C++ API [LibTorch](https://pytorch.org/docs/stable/cpp_index.html) ๅŽปๆŽจ็†่ฎญ็ปƒๅฅฝ็š„ๆจกๅž‹ใ€‚ +่ขซ่ฝฌๆข็š„ๆจกๅž‹่ƒฝ่ขซๅƒ [Netron](https://github.com/lutzroeder/netron) ็š„ๅทฅๅ…ทๆฅๅฏ่ง†ๅŒ–ใ€‚ๆญคๅค–๏ผŒๆˆ‘ไปฌ่ฟ˜ๆ”ฏๆŒ PyTorch ๅ’Œ TorchScript ๆจกๅž‹็š„่พ“ๅ‡บ็ป“ๆžœ็š„ๆฏ”่พƒใ€‚ + +```shell +python tools/pytorch2torchscript.py \ + ${CONFIG_FILE} \ + --checkpoint ${CHECKPOINT_FILE} \ + --output-file ${ONNX_FILE} + --shape ${INPUT_SHAPE} + --verify \ + --show +``` + +ๅ„ไธชๅ‚ๆ•ฐ็š„ๆ่ฟฐ: + +- `config` : pytorch ๆจกๅž‹็š„้…็ฝฎๆ–‡ไปถ็š„่ทฏๅพ„ +- `--checkpoint` : pytorch ๆจกๅž‹็š„ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ็š„่ทฏๅพ„ +- `--output-file`: TorchScript ๆจกๅž‹่พ“ๅ‡บ็š„่ทฏๅพ„๏ผŒๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `tmp.pt` +- `--input-img` : ็”จๆฅ่ฝฌๆขๅ’Œๅฏ่ง†ๅŒ–็š„่พ“ๅ…ฅๅ›พๅƒ็š„่ทฏๅพ„ +- `--shape`: ๆจกๅž‹็š„่พ“ๅ…ฅๅผ ้‡็š„ๅฎฝๅ’Œ้ซ˜ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `512 512` +- `--show`: ๆ˜ฏๅฆๆ‰“ๅฐ่พ“ๅ‡บๆจกๅž‹็š„่ฟฝ่ธชๅ›พ (traced graph)๏ผŒๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `False` +- `--verify`: ๆ˜ฏๅฆ้ชŒ่ฏไธ€ไธช่พ“ๅ‡บๆจกๅž‹็š„ๆญฃ็กฎๆ€ง (correctness)๏ผŒๅฆ‚ๆžœๆฒกๆœ‰่ขซไธ“้—จๆŒ‡ๅฎš๏ผŒๅฎƒๅฐ†่ขซ่ฎพ็ฝฎๆˆ `False` + +**ๆณจๆ„**: ็›ฎๅ‰ไป…ๆ”ฏๆŒ PyTorch>=1.8.0 ็‰ˆๆœฌ + +**ๆณจๆ„**: ่ฟ™ไธชๅทฅๅ…ทไป็„ถๆ˜ฏ่ฏ•้ชŒๆ€ง็š„๏ผŒไธ€ไบ›่‡ชๅฎšไน‰ๆ“ไฝœ็ฌฆ็›ฎๅ‰่ฟ˜ไธ่ขซๆ”ฏๆŒ + +ไพ‹ๅญ: + +- ๅฏผๅ‡บ PSPNet ๅœจ cityscapes ๆ•ฐๆฎ้›†ไธŠ็š„ pytorch ๆจกๅž‹ + + ```shell + python tools/pytorch2torchscript.py configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + --checkpoint checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + --output-file checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pt \ + --shape 512 1024 + ``` + +### ๅฏผๅ‡บ TensorRT (่ฏ•้ชŒๆ€ง) + +ไธ€ไธชๅฏผๅ‡บ [ONNX](https://github.com/onnx/onnx) ๆจกๅž‹ๆˆ [TensorRT](https://developer.nvidia.com/tensorrt) ๆ ผๅผ็š„่„šๆœฌ + +ๅ…ˆๅ†ณๆกไปถ + +- ๆŒ‰็…ง [ONNXRuntime in mmcv](https://mmcv.readthedocs.io/en/latest/deployment/onnxruntime_op.html) ๅ’Œ [TensorRT plugin in mmcv](https://github.com/open-mmlab/mmcv/blob/master/docs/en/deployment/tensorrt_plugin.md) ๏ผŒ็”จ ONNXRuntime ่‡ชๅฎšไน‰่ฟ็ฎ— (custom ops) ๅ’Œ TensorRT ๆ’ไปถๅฎ‰่ฃ… `mmcv-full` +- ไฝฟ็”จ [pytorch2onnx](#convert-to-onnx-experimental) ๅฐ†ๆจกๅž‹ไปŽ PyTorch ่ฝฌๆˆ ONNX + +ไฝฟ็”จๆ–นๆณ• + +```bash +python ${MMSEG_PATH}/tools/onnx2tensorrt.py \ + ${CFG_PATH} \ + ${ONNX_PATH} \ + --trt-file ${OUTPUT_TRT_PATH} \ + --min-shape ${MIN_SHAPE} \ + --max-shape ${MAX_SHAPE} \ + --input-img ${INPUT_IMG} \ + --show \ + --verify +``` + +ๅ„ไธชๅ‚ๆ•ฐ็š„ๆ่ฟฐ: + +- `config` : ๆจกๅž‹็š„้…็ฝฎๆ–‡ไปถ +- `model` : ่พ“ๅ…ฅ็š„ ONNX ๆจกๅž‹็š„่ทฏๅพ„ +- `--trt-file` : ่พ“ๅ‡บ็š„ TensorRT ๅผ•ๆ“Ž็š„่ทฏๅพ„ +- `--max-shape` : ๆจกๅž‹็š„่พ“ๅ…ฅ็š„ๆœ€ๅคงๅฝข็Šถ +- `--min-shape` : ๆจกๅž‹็š„่พ“ๅ…ฅ็š„ๆœ€ๅฐๅฝข็Šถ +- `--fp16` : ๅš fp16 ๆจกๅž‹่ฝฌๆข +- `--workspace-size` : ๅœจ GiB ้‡Œ็š„ๆœ€ๅคงๅทฅไฝœ็ฉบ้—ดๅคงๅฐ (Max workspace size) +- `--input-img` : ็”จๆฅๅฏ่ง†ๅŒ–็š„ๅ›พๅƒ +- `--show` : ๅš็ป“ๆžœ็š„ๅฏ่ง†ๅŒ– +- `--dataset` : Palette provider, ้ป˜่ฎคไธบ `CityscapesDataset` +- `--verify` : ้ชŒ่ฏ ONNXRuntime ๅ’Œ TensorRT ็š„่พ“ๅ‡บ +- `--verbose` : ๅฝ“ๅˆ›ๅปบ TensorRT ๅผ•ๆ“Žๆ—ถ๏ผŒๆ˜ฏๅฆ่ฏฆ็ป†ๅšไฟกๆฏๆ—ฅๅฟ—ใ€‚้ป˜่ฎคไธบ False + +**ๆณจๆ„**: ไป…ๅœจๅ…จๅ›พๆต‹่ฏ•ๆจกๅผ (whole mode) ไธ‹ๆต‹่ฏ•่ฟ‡ + +## ๅ…ถไป–ๅ†…ๅฎน + +### ๆ‰“ๅฐๅฎŒๆ•ด็š„้…็ฝฎๆ–‡ไปถ + +`tools/print_config.py` ไผš้€ๅญ—้€ๅฅ็š„ๆ‰“ๅฐๆ•ดไธช้…็ฝฎๆ–‡ไปถ๏ผŒๅฑ•ๅผ€ๆ‰€ๆœ‰็š„ๅฏผๅ…ฅใ€‚ + +```shell +python tools/print_config.py \ + ${CONFIG} \ + --graph \ + --cfg-options ${OPTIONS [OPTIONS...]} \ +``` + +ๅ„ไธชๅ‚ๆ•ฐ็š„ๆ่ฟฐ: + +- `config` : pytorch ๆจกๅž‹็š„้…็ฝฎๆ–‡ไปถ็š„่ทฏๅพ„ +- `--graph` : ๆ˜ฏๅฆๆ‰“ๅฐๆจกๅž‹็š„ๅ›พ (models graph) +- `--cfg-options`: ่‡ชๅฎšไน‰ๆ›ฟๆข้…็ฝฎๆ–‡ไปถ็š„้€‰้กน + +### ๅฏน่ฎญ็ปƒๆ—ฅๅฟ— (training logs) ็”ปๅ›พ + +`tools/analyze_logs.py` ไผš็”ปๅ‡บ็ป™ๅฎš็š„่ฎญ็ปƒๆ—ฅๅฟ—ๆ–‡ไปถ็š„ loss/mIoU ๆ›ฒ็บฟ๏ผŒ้ฆ–ๅ…ˆ้œ€่ฆ `pip install seaborn` ๅฎ‰่ฃ…ไพ่ต–ๅŒ…ใ€‚ + +```shell +python tools/analyze_logs.py xxx.log.json [--keys ${KEYS}] [--legend ${LEGEND}] [--backend ${BACKEND}] [--style ${STYLE}] [--out ${OUT_FILE}] +``` + +็คบไพ‹: + +- ๅฏน mIoU, mAcc, aAcc ๆŒ‡ๆ ‡็”ปๅ›พ + + ```shell + python tools/analyze_logs.py log.json --keys mIoU mAcc aAcc --legend mIoU mAcc aAcc + ``` + +- ๅฏน loss ๆŒ‡ๆ ‡็”ปๅ›พ + + ```shell + python tools/analyze_logs.py log.json --keys loss --legend loss + ``` + +### ่ฝฌๆขๅ…ถไป–ไป“ๅบ“็š„ๆƒ้‡ + +`tools/model_converters/` ๆไพ›ไบ†่‹ฅๅนฒไธช้ข„่ฎญ็ปƒๆƒ้‡่ฝฌๆข่„šๆœฌ๏ผŒๆ”ฏๆŒๅฐ†ๅ…ถไป–ไป“ๅบ“็š„้ข„่ฎญ็ปƒๆƒ้‡็š„ key ่ฝฌๆขไธบไธŽ MMSegmentation ็›ธๅŒน้…็š„ keyใ€‚ + +#### ViT Swin MiT Transformer ๆจกๅž‹ + +- ViT + +`tools/model_converters/vit2mmseg.py` ๅฐ† timm ้ข„่ฎญ็ปƒๆจกๅž‹่ฝฌๆขๅˆฐ MMSegmentationใ€‚ + +```shell +python tools/model_converters/vit2mmseg.py ${SRC} ${DST} +``` + +- Swin + + `tools/model_converters/swin2mmseg.py` ๅฐ†ๅฎ˜ๆ–น้ข„่ฎญ็ปƒๆจกๅž‹่ฝฌๆขๅˆฐ MMSegmentationใ€‚ + + ```shell + python tools/model_converters/swin2mmseg.py ${SRC} ${DST} + ``` + +- SegFormer + + `tools/model_converters/mit2mmseg.py` ๅฐ†ๅฎ˜ๆ–น้ข„่ฎญ็ปƒๆจกๅž‹่ฝฌๆขๅˆฐ MMSegmentationใ€‚ + + ```shell + python tools/model_converters/mit2mmseg.py ${SRC} ${DST} + ``` + +## ๆจกๅž‹ๆœๅŠก + +ไธบไบ†็”จ [`TorchServe`](https://pytorch.org/serve/) ๆœๅŠก `MMSegmentation` ็š„ๆจกๅž‹ ๏ผŒ ๆ‚จๅฏไปฅ้ตๅพชๅฆ‚ไธ‹ๆต็จ‹: + +### 1. ๅฐ† model ไปŽใ€€MMSegmentation ่ฝฌๆขๅˆฐ TorchServe + +```shell +python tools/mmseg2torchserve.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \ +--output-folder ${MODEL_STORE} \ +--model-name ${MODEL_NAME} +``` + +**ๆณจๆ„**: ${MODEL_STORE} ้œ€่ฆ่ฎพ็ฝฎไธบๆŸไธชๆ–‡ไปถๅคน็š„็ปๅฏน่ทฏๅพ„ + +### 2. ๆž„ๅปบ `mmseg-serve` ๅฎนๅ™จ้•œๅƒ (docker image) + +```shell +docker build -t mmseg-serve:latest docker/serve/ +``` + +### 3. ่ฟ่กŒ `mmseg-serve` + +่ฏทๆŸฅ้˜…ๅฎ˜ๆ–นๆ–‡ๆกฃ: [ไฝฟ็”จๅฎนๅ™จ่ฟ่กŒ TorchServe](https://github.com/pytorch/serve/blob/master/docker/README.md#running-torchserve-in-a-production-docker-environment) + +ไธบไบ†ๅœจ GPU ็Žฏๅขƒไธ‹ไฝฟ็”จ, ๆ‚จ้œ€่ฆๅฎ‰่ฃ… [nvidia-docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). ่‹ฅๅœจ CPU ็Žฏๅขƒไธ‹ไฝฟ็”จ๏ผŒๆ‚จๅฏไปฅๅฟฝ็•ฅๆทปๅŠ  `--gpus` ๅ‚ๆ•ฐใ€‚ + +็คบไพ‹: + +```shell +docker run --rm \ +--cpus 8 \ +--gpus device=0 \ +-p8080:8080 -p8081:8081 -p8082:8082 \ +--mount type=bind,source=$MODEL_STORE,target=/home/model-server/model-store \ +mmseg-serve:latest +``` + +้˜…่ฏปๅ…ณไบŽๆŽจ็† (8080), ็ฎก็† (8081) ๅ’ŒๆŒ‡ๆ ‡ (8082) APIs ็š„ [ๆ–‡ๆกฃ](https://github.com/pytorch/serve/blob/072f5d088cce9bb64b2a18af065886c9b01b317b/docs/rest_api.md) ใ€‚ + +### 4. ๆต‹่ฏ•้ƒจ็ฝฒ + +```shell +curl -O https://raw.githubusercontent.com/open-mmlab/mmsegmentation/master/resources/3dogs.jpg +curl http://127.0.0.1:8080/predictions/${MODEL_NAME} -T 3dogs.jpg -o 3dogs_mask.png +``` + +ๅพ—ๅˆฐ็š„ๅ“ๅบ”ๅฐ†ๆ˜ฏไธ€ไธช ".png" ็š„ๅˆ†ๅ‰ฒๆŽฉ็ . + +ๆ‚จๅฏไปฅๆŒ‰็…งๅฆ‚ไธ‹ๆ–นๆณ•ๅฏ่ง†ๅŒ–่พ“ๅ‡บ: + +```python +import matplotlib.pyplot as plt +import mmcv +plt.imshow(mmcv.imread("3dogs_mask.png", "grayscale")) +plt.show() +``` + +็œ‹ๅˆฐ็š„ไธœ่ฅฟๅฐ†ไผšๅ’Œไธ‹ๅ›พ็ฑปไผผ: + +![3dogs_mask](../../resources/3dogs_mask.png) + +็„ถๅŽๆ‚จๅฏไปฅไฝฟ็”จ `test_torchserve.py` ๆฏ”่พƒ torchserve ๅ’Œ pytorch ็š„็ป“ๆžœ๏ผŒๅนถๅฐ†ๅฎƒไปฌๅฏ่ง†ๅŒ–ใ€‚ + +```shell +python tools/torchserve/test_torchserve.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} ${MODEL_NAME} +[--inference-addr ${INFERENCE_ADDR}] [--result-image ${RESULT_IMAGE}] [--device ${DEVICE}] +``` + +็คบไพ‹๏ผš + +```shell +python tools/torchserve/test_torchserve.py \ +demo/demo.png \ +configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py \ +checkpoint/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth \ +fcn +``` diff --git a/mmsegmentation/docs/zh_cn/user_guides/visualization.md b/mmsegmentation/docs/zh_cn/user_guides/visualization.md new file mode 100644 index 0000000..2ef020b --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/visualization.md @@ -0,0 +1,173 @@ +# ๅฏ่ง†ๅŒ– + +MMSegmentation 1.x ๆไพ›ไบ†็ฎ€ไพฟ็š„ๆ–นๅผ็›‘ๆŽง่ฎญ็ปƒๆ—ถ็š„็Šถๆ€ไปฅๅŠๅฏ่ง†ๅŒ–ๅœจๆจกๅž‹้ข„ๆต‹ๆ—ถ็š„ๆ•ฐๆฎใ€‚ + +## ่ฎญ็ปƒ็Šถๆ€็›‘ๆŽง + +MMSegmentation 1.x ไฝฟ็”จ TensorBoard ๆฅ็›‘ๆŽง่ฎญ็ปƒๆ—ถๅ€™็š„็Šถๆ€ใ€‚ + +### TensorBoard ็š„้…็ฝฎ + +ๅฎ‰่ฃ… TensorBoard ็š„่ฟ‡็จ‹ๅฏไปฅๆŒ‰็…ง [ๅฎ˜ๆ–นๅฎ‰่ฃ…ๆŒ‡ๅ—](https://www.tensorflow.org/install) ๏ผŒๅ…ทไฝ“็š„ๆญฅ้ชคๅฆ‚ไธ‹๏ผš + +```shell +pip install tensorboardX +pip install future tensorboard +``` + +ๅœจ้…็ฝฎๆ–‡ไปถ `default_runtime.py` ็š„ `vis_backend` ไธญๆทปๅŠ  `TensorboardVisBackend`ใ€‚ + +```python +vis_backends = [dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +``` + +### ๆฃ€ๆŸฅ TensorBoard ไธญ็š„ๆ ‡้‡ + +ๅฏๅŠจ่ฎญ็ปƒๅฎž้ชŒ็š„ๅ‘ฝไปคๅฆ‚ไธ‹ + +```shell +python tools/train.py configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py --work-dir work_dir/test_visual +``` + +ๅผ€ๅง‹่ฎญ็ปƒๅŽๆ‰พๅˆฐ `work_dir` ไธญ็š„ `vis_data` ่ทฏๅพ„๏ผŒไพ‹ๅฆ‚๏ผšๆœฌๆฌก็‰นๅฎšๆต‹่ฏ•็š„ vis_data ่ทฏๅพ„ๅฆ‚ไธ‹ๆ‰€็คบ๏ผš + +```shell +work_dirs/test_visual/20220810_115248/vis_data +``` + +vis_data ่ทฏๅพ„ไธญ็š„ๆ ‡้‡ๆ–‡ไปถๅŒ…ๆ‹ฌไบ†ๅญฆไน ็Ž‡ใ€ๆŸๅคฑๅ‡ฝๆ•ฐๅ’Œ data_time ็ญ‰๏ผŒ่ฟ˜่ฎฐๅฝ•ไบ†ๆŒ‡ๆ ‡็ป“ๆžœ๏ผŒๆ‚จๅฏไปฅๅ‚่€ƒ MMEngine ไธญ็š„ [่ฎฐๅฝ•ๆ—ฅๅฟ—ๆ•™็จ‹](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/logging.html) ไธญ็š„ๆ—ฅๅฟ—ๆ•™็จ‹ๆฅๅธฎๅŠฉ่ฎฐๅฝ•่‡ชๅทฑๅฎšไน‰็š„ๆ•ฐๆฎใ€‚ Tensorboard ็š„ๅฏ่ง†ๅŒ–็ป“ๆžœไฝฟ็”จไธ‹้ข็š„ๅ‘ฝไปคๆ‰ง่กŒ๏ผš + +```shell +tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data +``` + +## ๆ•ฐๆฎๅ’Œ็ป“ๆžœ็š„ๅฏ่ง†ๅŒ– + +### ๆจกๅž‹ๆต‹่ฏ•ๆˆ–้ชŒ่ฏๆœŸ้—ด็š„ๅฏ่ง†ๅŒ–ๆ•ฐๆฎๆ ทๆœฌ + +MMSegmentation ๆไพ›ไบ† `SegVisualizationHook` ๏ผŒๅฎƒๆ˜ฏไธ€ไธชๅฏไปฅ็”จไบŽๅฏ่ง†ๅŒ– ground truth ๅ’Œๅœจๆจกๅž‹ๆต‹่ฏ•ๅ’Œ้ชŒ่ฏๆœŸ้—ด็š„้ข„ๆต‹ๅˆ†ๅ‰ฒ็ป“ๆžœ็š„[้’ฉๅญ](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/hook.html) ใ€‚ ๅฎƒ็š„้…็ฝฎๅœจ `default_hooks` ไธญ๏ผŒๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏ่ฏทๅ‚่ง [ๆ‰ง่กŒๅ™จๆ•™็จ‹](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html)ใ€‚ + +ไพ‹ๅฆ‚๏ผŒๅœจ `_base_/schedules/schedule_20k.py` ไธญ๏ผŒไฟฎๆ”น `SegVisualizationHook` ้…็ฝฎ๏ผŒๅฐ† `draw` ่ฎพ็ฝฎไธบ `True` ไปฅๅฏ็”จ็ฝ‘็ปœๆŽจ็†็ป“ๆžœ็š„ๅญ˜ๅ‚จ๏ผŒ`interval` ่กจ็คบ้ข„ๆต‹็ป“ๆžœ็š„้‡‡ๆ ท้—ด้š”๏ผŒ ่ฎพ็ฝฎไธบ 1 ๆ—ถ๏ผŒๅฐ†ไฟๅญ˜็ฝ‘็ปœ็š„ๆฏไธชๆŽจ็†็ป“ๆžœใ€‚ `interval` ้ป˜่ฎค่ฎพ็ฝฎไธบ 50๏ผš + +```python +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook', draw=True, interval=1)) + +``` + +ๅฏๅŠจ่ฎญ็ปƒๅฎž้ชŒๅŽ๏ผŒๅฏ่ง†ๅŒ–็ป“ๆžœๅฐ†ๅœจ validation loop ๅญ˜ๅ‚จๅˆฐๆœฌๅœฐๆ–‡ไปถๅคนไธญ๏ผŒๆˆ–่€…ๅœจไธ€ไธชๆ•ฐๆฎ้›†ไธŠๅฏๅŠจ่ฏ„ไผฐๆจกๅž‹ๆ—ถ๏ผŒ้ข„ๆต‹็ป“ๆžœๅฐ†ๅญ˜ๅ‚จๅœจๆœฌๅœฐใ€‚ๆœฌๅœฐ็š„ๅฏ่ง†ๅŒ–็š„ๅญ˜ๅ‚จ็ป“ๆžœไฟๅญ˜ๅœจ `$WORK_DIRS/vis_data` ไธ‹็š„ `vis_image` ไธญ๏ผŒไพ‹ๅฆ‚๏ผš + +```shell +work_dirs/test_visual/20220810_115248/vis_data/vis_image +``` + +ๅฆๅค–๏ผŒๅฆ‚ๆžœๅœจ `vis_backends` ไธญๆทปๅŠ  `TensorboardVisBackend` ๏ผŒๅฆ‚ [TensorBoard ็š„้…็ฝฎ](###TensorBoard็š„้…็ฝฎ)๏ผŒๆˆ‘ไปฌ่ฟ˜ๅฏไปฅ่ฟ่กŒไธ‹้ข็š„ๅ‘ฝไปคๅœจ TensorBoard ไธญๆŸฅ็œ‹ๅฎƒไปฌ๏ผš + +```shell +tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data +``` + +### ๅฏ่ง†ๅŒ–ๅ•ไธชๆ•ฐๆฎๆ ทๆœฌ + +ๅฆ‚ๆžœไฝ ๆƒณๅฏ่ง†ๅŒ–ๅ•ไธชๆ ทๆœฌๆ•ฐๆฎ๏ผŒๆˆ‘ไปฌๅปบ่ฎฎไฝฟ็”จ `SegLocalVisualizer` ใ€‚ + +`SegLocalVisualizer`ๆ˜ฏ็ปงๆ‰ฟ่‡ช MMEngine ไธญ`Visualizer` ็ฑป็š„ๅญ็ฑป๏ผŒ้€‚็”จไบŽ MMSegmentation ๅฏ่ง†ๅŒ–๏ผŒๆœ‰ๅ…ณ`Visualizer`็š„่ฏฆ็ป†ไฟกๆฏ่ฏทๅ‚่€ƒๅœจ MMEngine ไธญ็š„[ๅฏ่ง†ๅŒ–ๆ•™็จ‹](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html) ใ€‚ + +ไปฅไธ‹ๆ˜ฏไธ€ไธชๅ…ณไบŽ `SegLocalVisualizer` ็š„็คบไพ‹๏ผŒ้ฆ–ๅ…ˆไฝ ๅฏไปฅไฝฟ็”จไธ‹้ข็š„ๅ‘ฝไปคไธ‹่ฝฝ่ฟ™ไธชๆกˆไพ‹ไธญ็š„ๆ•ฐๆฎ๏ผš + +
+ +
+ +```shell +wget https://user-images.githubusercontent.com/24582831/189833109-eddad58f-f777-4fc0-b98a-6bd429143b06.png --output-document aachen_000000_000019_leftImg8bit.png +wget https://user-images.githubusercontent.com/24582831/189833143-15f60f8a-4d1e-4cbb-a6e7-5e2233869fac.png --output-document aachen_000000_000019_gtFine_labelTrainIds.png +``` + +็„ถๅŽไฝ ๅฏไปฅๆ‰พๅˆฐไป–ไปฌๆœฌๅœฐ็š„่ทฏๅพ„ๅ’Œไฝฟ็”จไธ‹้ข็š„่„šๆœฌๆ–‡ไปถๅฏนๅ…ถ่ฟ›่กŒๅฏ่ง†ๅŒ–๏ผš + +```python +import mmcv +import os.path as osp +import torch + +# `PixelData` ๆ˜ฏ MMEngine ไธญ็”จไบŽๅฎšไน‰ๅƒ็ด ็บงๆ ‡ๆณจๆˆ–้ข„ๆต‹็š„ๆ•ฐๆฎ็ป“ๆž„ใ€‚ +# ่ฏทๅ‚่€ƒไธ‹้ข็š„MMEngineๆ•ฐๆฎ็ป“ๆž„ๆ•™็จ‹ๆ–‡ไปถ๏ผš +# https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/data_element.html#pixeldata + +from mmengine.structures import PixelData + +# `SegDataSample` ๆ˜ฏๅœจ MMSegmentation ไธญๅฎšไน‰็š„ไธๅŒ็ป„ไปถไน‹้—ด็š„ๆ•ฐๆฎ็ป“ๆž„ๆŽฅๅฃ๏ผŒ +# ๅฎƒๅŒ…ๆ‹ฌ ground truthใ€่ฏญไน‰ๅˆ†ๅ‰ฒ็š„้ข„ๆต‹็ป“ๆžœๅ’Œ้ข„ๆต‹้€ป่พ‘ใ€‚ +# ่ฏฆๆƒ…่ฏทๅ‚่€ƒไธ‹้ข็š„ `SegDataSample` ๆ•™็จ‹ๆ–‡ไปถ๏ผš +# https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/advanced_guides/structures.md + +from mmseg.structures import SegDataSample +from mmseg.visualization import SegLocalVisualizer + +out_file = 'out_file_cityscapes' +save_dir = './work_dirs' + +image = mmcv.imread( + osp.join( + osp.dirname(__file__), + './aachen_000000_000019_leftImg8bit.png' + ), + 'color') +sem_seg = mmcv.imread( + osp.join( + osp.dirname(__file__), + './aachen_000000_000019_gtFine_labelTrainIds.png' # noqa + ), + 'unchanged') +sem_seg = torch.from_numpy(sem_seg) +gt_sem_seg_data = dict(data=sem_seg) +gt_sem_seg = PixelData(**gt_sem_seg_data) +data_sample = SegDataSample() +data_sample.gt_sem_seg = gt_sem_seg + +seg_local_visualizer = SegLocalVisualizer( + vis_backends=[dict(type='LocalVisBackend')], + save_dir=save_dir) + +# ๆ•ฐๆฎ้›†็š„ๅ…ƒไฟกๆฏ้€šๅธธๅŒ…ๆ‹ฌ็ฑปๅ็š„ `classes` ๅ’Œ +# ็”จไบŽๅฏ่ง†ๅŒ–ๆฏไธชๅ‰ๆ™ฏ้ขœ่‰ฒ็š„ `palette` ใ€‚ +# ๆ‰€ๆœ‰็ฑปๅๅ’Œ่ฐƒ่‰ฒๆฟ้ƒฝๅœจๆญคๆ–‡ไปถไธญๅฎšไน‰๏ผš +# https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/utils/class_names.py + +seg_local_visualizer.dataset_meta = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', + 'pole', 'traffic light', 'traffic sign', + 'vegetation', 'terrain', 'sky', 'person', 'rider', + 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], + [102, 102, 156], [190, 153, 153], [153, 153, 153], + [250, 170, 30], [220, 220, 0], [107, 142, 35], + [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], + [119, 11, 32]]) + +# ๅฝ“`show=True`ๆ—ถ๏ผŒ็›ดๆŽฅๆ˜พ็คบ็ป“ๆžœ๏ผŒ +# ๅฝ“ `show=False`ๆ—ถ๏ผŒ็ป“ๆžœๅฐ†ไฟๅญ˜ๅœจๆœฌๅœฐๆ–‡ไปถๅคนไธญใ€‚ + +seg_local_visualizer.add_datasample(out_file, image, + data_sample, show=False) +``` + +ๅฏ่ง†ๅŒ–ๅŽ็š„ๅ›พๅƒ็ป“ๆžœๅ’Œๅฎƒ็š„ๅฏนๅบ”็š„ ground truth ๅ›พๅƒๅฏไปฅๅœจ `./work_dirs/vis_data/vis_image/` ่ทฏๅพ„ๆ‰พๅˆฐ๏ผŒๆ–‡ไปถๅๅญ—ๆ˜ฏ๏ผš`out_file_cityscapes_0.png` ๏ผš + +
+ +
+ +ๅฆ‚ๆžœไฝ ๆƒณ็Ÿฅ้“ๆ›ดๅคš็š„ๅ…ณไบŽๅฏ่ง†ๅŒ–็š„ไฝฟ็”จๆŒ‡ๅผ•๏ผŒไฝ ๅฏไปฅๅ‚่€ƒ MMEngine ไธญ็š„[ๅฏ่ง†ๅŒ–ๆ•™็จ‹](<[https://mmengine.readthedocs.io/en/latest/advanced_tutorials/visualization.html](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/advanced_tutorials/visualization.md)>) diff --git a/mmsegmentation/docs/zh_cn/user_guides/visualization_feature_map.md b/mmsegmentation/docs/zh_cn/user_guides/visualization_feature_map.md new file mode 100644 index 0000000..fda99bb --- /dev/null +++ b/mmsegmentation/docs/zh_cn/user_guides/visualization_feature_map.md @@ -0,0 +1,201 @@ +# wandb่ฎฐๅฝ•็‰นๅพๅ›พๅฏ่ง†ๅŒ– + +MMSegmentation 1.x ๆไพ›ไบ† Weights & Biases ็š„ๅŽ็ซฏๆ”ฏๆŒ๏ผŒๆ–นไพฟๅฏน้กน็›ฎไปฃ็ ็ป“ๆžœ็š„ๅฏ่ง†ๅŒ–ๅ’Œ็ฎก็†ใ€‚ + +## Wandb็š„้…็ฝฎ + +ๅฎ‰่ฃ… Weights & Biases ็š„่ฟ‡็จ‹ๅฏไปฅๅ‚่€ƒ [ๅฎ˜ๆ–นๅฎ‰่ฃ…ๆŒ‡ๅ—](https://docs.wandb.ai/quickstart)๏ผŒๅ…ทไฝ“็š„ๆญฅ้ชคๅฆ‚ไธ‹: + +```shell +pip install wandb +wandb login +``` + +ๅœจ `vis_backend` ไธญๆทปๅŠ  `WandbVisBackend`ใ€‚ + +```python +vis_backends=[dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend'), + dict(type='WandbVisBackend')] +``` + +## ๆต‹่ฏ•ๆ•ฐๆฎๅ’Œ็ป“ๆžœๅŠ็‰นๅพๅ›พ็š„ๅฏ่ง†ๅŒ– + +`SegLocalVisualizer` ๆ˜ฏ็ปงๆ‰ฟ่‡ช MMEngine ไธญ `Visualizer` ็ฑป็š„ๅญ็ฑป๏ผŒ้€‚็”จไบŽ MMSegmentation ๅฏ่ง†ๅŒ–๏ผŒๆœ‰ๅ…ณ `Visualizer` ็š„่ฏฆ็ป†ไฟกๆฏ่ฏทๅ‚่€ƒๅœจ MMEngine ไธญ็š„[ๅฏ่ง†ๅŒ–ๆ•™็จ‹](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html) ใ€‚ + +ไปฅไธ‹ๆ˜ฏไธ€ไธชๅ…ณไบŽ `SegLocalVisualizer` ็š„็คบไพ‹๏ผŒ้ฆ–ๅ…ˆไฝ ๅฏไปฅไฝฟ็”จไธ‹้ข็š„ๅ‘ฝไปคไธ‹่ฝฝ่ฟ™ไธชๆกˆไพ‹ไธญ็š„ๆ•ฐๆฎ๏ผš + +
+ +
+ +```shell +wget https://user-images.githubusercontent.com/24582831/189833109-eddad58f-f777-4fc0-b98a-6bd429143b06.png --output-document aachen_000000_000019_leftImg8bit.png +wget https://user-images.githubusercontent.com/24582831/189833143-15f60f8a-4d1e-4cbb-a6e7-5e2233869fac.png --output-document aachen_000000_000019_gtFine_labelTrainIds.png + +wget https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth + +``` + +```python +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser +from typing import Type + +import mmcv +import torch +import torch.nn as nn + +from mmengine.model import revert_sync_batchnorm +from mmengine.structures import PixelData +from mmseg.apis import inference_model, init_model +from mmseg.structures import SegDataSample +from mmseg.utils import register_all_modules +from mmseg.visualization import SegLocalVisualizer + + +class Recorder: + """record the forward output feature map and save to data_buffer.""" + + def __init__(self) -> None: + self.data_buffer = list() + + def __enter__(self, ): + self._data_buffer = list() + + def record_data_hook(self, model: nn.Module, input: Type, output: Type): + self.data_buffer.append(output) + + def __exit__(self, *args, **kwargs): + pass + + +def visualize(args, model, recorder, result): + seg_visualizer = SegLocalVisualizer( + vis_backends=[dict(type='WandbVisBackend')], + save_dir='temp_dir', + alpha=0.5) + seg_visualizer.dataset_meta = dict( + classes=model.dataset_meta['classes'], + palette=model.dataset_meta['palette']) + + image = mmcv.imread(args.img, 'color') + + seg_visualizer.add_datasample( + name='predict', + image=image, + data_sample=result, + draw_gt=False, + draw_pred=True, + wait_time=0, + out_file=None, + show=False) + + # add feature map to wandb visualizer + for i in range(len(recorder.data_buffer)): + feature = recorder.data_buffer[i][0] # remove the batch + drawn_img = seg_visualizer.draw_featmap( + feature, image, channel_reduction='select_max') + seg_visualizer.add_image(f'feature_map{i}', drawn_img) + + if args.gt_mask: + sem_seg = mmcv.imread(args.gt_mask, 'unchanged') + sem_seg = torch.from_numpy(sem_seg) + gt_mask = dict(data=sem_seg) + gt_mask = PixelData(**gt_mask) + data_sample = SegDataSample() + data_sample.gt_sem_seg = gt_mask + + seg_visualizer.add_datasample( + name='gt_mask', + image=image, + data_sample=data_sample, + draw_gt=True, + draw_pred=False, + wait_time=0, + out_file=None, + show=False) + + seg_visualizer.add_image('image', image) + + +def main(): + parser = ArgumentParser( + description='Draw the Feature Map During Inference') + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('--gt_mask', default=None, help='Path of gt mask file') + parser.add_argument('--out-file', default=None, help='Path to output file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + parser.add_argument( + '--title', default='result', help='The image identifier.') + args = parser.parse_args() + + register_all_modules() + + # build the model from a config file and a checkpoint file + model = init_model(args.config, args.checkpoint, device=args.device) + if args.device == 'cpu': + model = revert_sync_batchnorm(model) + + # show all named module in the model and use it in source list below + for name, module in model.named_modules(): + print(name) + + source = [ + 'decode_head.fusion.stages.0.query_project.activate', + 'decode_head.context.stages.0.key_project.activate', + 'decode_head.context.bottleneck.activate' + ] + source = dict.fromkeys(source) + + count = 0 + recorder = Recorder() + # registry the forward hook + for name, module in model.named_modules(): + if name in source: + count += 1 + module.register_forward_hook(recorder.record_data_hook) + if count == len(source): + break + + with recorder: + # test a single image, and record feature map to data_buffer + result = inference_model(model, args.img) + + visualize(args, model, recorder, result) + + +if __name__ == '__main__': + main() + +``` + +ๅฐ†ไธŠ่ฟฐไปฃ็ ไฟๅญ˜ไธบ feature_map_visual.py๏ผŒๅœจ็ปˆ็ซฏๆ‰ง่กŒๅฆ‚ไธ‹ไปฃ็  + +```shell +python feature_map_visual.py ${ๅ›พๅƒ} ${้…็ฝฎๆ–‡ไปถ} ${ๆฃ€ๆŸฅ็‚นๆ–‡ไปถ} [ๅฏ้€‰ๅ‚ๆ•ฐ] +``` + +ๆ ทไพ‹ + +```shell +python feature_map_visual.py \ +aachen_000000_000019_leftImg8bit.png \ +configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py \ +ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth \ +--gt_mask aachen_000000_000019_gtFine_labelTrainIds.png +``` + +ๅฏ่ง†ๅŒ–ๅŽ็š„ๅ›พๅƒ็ป“ๆžœๅ’Œๅฎƒ็š„ๅฏนๅบ”็š„ feature mapๅ›พๅƒไผšๅ‡บ็Žฐๅœจwandb่ดฆๆˆทไธญ + +
+ +
diff --git a/mmsegmentation/mmseg/__init__.py b/mmsegmentation/mmseg/__init__.py new file mode 100644 index 0000000..5fcb84e --- /dev/null +++ b/mmsegmentation/mmseg/__init__.py @@ -0,0 +1,74 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import mmcv +import mmengine +from packaging.version import parse + +from .version import __version__, version_info + +MMCV_MIN = '2.0.0rc4' +MMCV_MAX = '2.2.0' +MMENGINE_MIN = '0.5.0' +MMENGINE_MAX = '1.0.0' + + +def digit_version(version_str: str, length: int = 4): + """Convert a version string into a tuple of integers. + + This method is usually used for comparing two versions. For pre-release + versions: alpha < beta < rc. + + Args: + version_str (str): The version string. + length (int): The maximum number of version levels. Default: 4. + + Returns: + tuple[int]: The version info in digits (integers). + """ + version = parse(version_str) + assert version.release, f'failed to parse version {version_str}' + release = list(version.release) + release = release[:length] + if len(release) < length: + release = release + [0] * (length - len(release)) + if version.is_prerelease: + mapping = {'a': -3, 'b': -2, 'rc': -1} + val = -4 + # version.pre can be None + if version.pre: + if version.pre[0] not in mapping: + warnings.warn(f'unknown prerelease version {version.pre[0]}, ' + 'version checking may go wrong') + else: + val = mapping[version.pre[0]] + release.extend([val, version.pre[-1]]) + else: + release.extend([val, 0]) + + elif version.is_postrelease: + release.extend([1, version.post]) + else: + release.extend([0, 0]) + return tuple(release) + + +mmcv_min_version = digit_version(MMCV_MIN) +mmcv_max_version = digit_version(MMCV_MAX) +mmcv_version = digit_version(mmcv.__version__) + + +assert (mmcv_min_version <= mmcv_version < mmcv_max_version), \ + f'MMCV=={mmcv.__version__} is used but incompatible. ' \ + f'Please install mmcv>=2.0.0rc4.' + +mmengine_min_version = digit_version(MMENGINE_MIN) +mmengine_max_version = digit_version(MMENGINE_MAX) +mmengine_version = digit_version(mmengine.__version__) + +assert (mmengine_min_version <= mmengine_version < mmengine_max_version), \ + f'MMEngine=={mmengine.__version__} is used but incompatible. ' \ + f'Please install mmengine>={mmengine_min_version}, '\ + f'<{mmengine_max_version}.' + +__all__ = ['__version__', 'version_info', 'digit_version'] diff --git a/mmsegmentation/mmseg/apis/__init__.py b/mmsegmentation/mmseg/apis/__init__.py new file mode 100644 index 0000000..b50a266 --- /dev/null +++ b/mmsegmentation/mmseg/apis/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .inference import inference_model, init_model, show_result_pyplot +from .mmseg_inferencer import MMSegInferencer +from .remote_sense_inferencer import RSImage, RSInferencer + +__all__ = [ + 'init_model', 'inference_model', 'show_result_pyplot', 'MMSegInferencer', + 'RSInferencer', 'RSImage' +] diff --git a/mmsegmentation/mmseg/apis/inference.py b/mmsegmentation/mmseg/apis/inference.py new file mode 100644 index 0000000..aab11d1 --- /dev/null +++ b/mmsegmentation/mmseg/apis/inference.py @@ -0,0 +1,189 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from pathlib import Path +from typing import Optional, Union + +import mmcv +import numpy as np +import torch +from mmengine import Config +from mmengine.registry import init_default_scope +from mmengine.runner import load_checkpoint +from mmengine.utils import mkdir_or_exist + +from mmseg.models import BaseSegmentor +from mmseg.registry import MODELS +from mmseg.structures import SegDataSample +from mmseg.utils import SampleList, dataset_aliases, get_classes, get_palette +from mmseg.visualization import SegLocalVisualizer +from .utils import ImageType, _preprare_data + + +def init_model(config: Union[str, Path, Config], + checkpoint: Optional[str] = None, + device: str = 'cuda:0', + cfg_options: Optional[dict] = None): + """Initialize a segmentor from config file. + + Args: + config (str, :obj:`Path`, or :obj:`mmengine.Config`): Config file path, + :obj:`Path`, or the config object. + checkpoint (str, optional): Checkpoint path. If left as None, the model + will not load any weights. + device (str, optional) CPU/CUDA device option. Default 'cuda:0'. + Use 'cpu' for loading model on CPU. + cfg_options (dict, optional): Options to override some settings in + the used config. + Returns: + nn.Module: The constructed segmentor. + """ + if isinstance(config, (str, Path)): + config = Config.fromfile(config) + elif not isinstance(config, Config): + raise TypeError('config must be a filename or Config object, ' + 'but got {}'.format(type(config))) + if cfg_options is not None: + config.merge_from_dict(cfg_options) + if config.model.type == 'EncoderDecoder': + if 'init_cfg' in config.model.backbone: + config.model.backbone.init_cfg = None + elif config.model.type == 'MultimodalEncoderDecoder': + for k, v in config.model.items(): + if isinstance(v, dict) and 'init_cfg' in v: + config.model[k].init_cfg = None + config.model.pretrained = None + config.model.train_cfg = None + init_default_scope(config.get('default_scope', 'mmseg')) + + model = MODELS.build(config.model) + if checkpoint is not None: + checkpoint = load_checkpoint(model, checkpoint, map_location='cpu') + dataset_meta = checkpoint['meta'].get('dataset_meta', None) + # save the dataset_meta in the model for convenience + if 'dataset_meta' in checkpoint.get('meta', {}): + # mmseg 1.x + model.dataset_meta = dataset_meta + elif 'CLASSES' in checkpoint.get('meta', {}): + # < mmseg 1.x + classes = checkpoint['meta']['CLASSES'] + palette = checkpoint['meta']['PALETTE'] + model.dataset_meta = {'classes': classes, 'palette': palette} + else: + warnings.simplefilter('once') + warnings.warn( + 'dataset_meta or class names are not saved in the ' + 'checkpoint\'s meta data, classes and palette will be' + 'set according to num_classes ') + num_classes = model.decode_head.num_classes + dataset_name = None + for name in dataset_aliases.keys(): + if len(get_classes(name)) == num_classes: + dataset_name = name + break + if dataset_name is None: + warnings.warn( + 'No suitable dataset found, use Cityscapes by default') + dataset_name = 'cityscapes' + model.dataset_meta = { + 'classes': get_classes(dataset_name), + 'palette': get_palette(dataset_name) + } + model.cfg = config # save the config in the model for convenience + model.to(device) + model.eval() + return model + + +def inference_model(model: BaseSegmentor, + img: ImageType) -> Union[SegDataSample, SampleList]: + """Inference image(s) with the segmentor. + + Args: + model (nn.Module): The loaded segmentor. + imgs (str/ndarray or list[str/ndarray]): Either image files or loaded + images. + + Returns: + :obj:`SegDataSample` or list[:obj:`SegDataSample`]: + If imgs is a list or tuple, the same length list type results + will be returned, otherwise return the segmentation results directly. + """ + # prepare data + data, is_batch = _preprare_data(img, model) + + # forward the model + with torch.no_grad(): + results = model.test_step(data) + + return results if is_batch else results[0] + + +def show_result_pyplot(model: BaseSegmentor, + img: Union[str, np.ndarray], + result: SegDataSample, + opacity: float = 0.5, + title: str = '', + draw_gt: bool = True, + draw_pred: bool = True, + wait_time: float = 0, + show: bool = True, + with_labels: Optional[bool] = True, + save_dir=None, + out_file=None): + """Visualize the segmentation results on the image. + + Args: + model (nn.Module): The loaded segmentor. + img (str or np.ndarray): Image filename or loaded image. + result (SegDataSample): The prediction SegDataSample result. + opacity(float): Opacity of painted segmentation map. + Default 0.5. Must be in (0, 1] range. + title (str): The title of pyplot figure. + Default is ''. + draw_gt (bool): Whether to draw GT SegDataSample. Default to True. + draw_pred (bool): Whether to draw Prediction SegDataSample. + Defaults to True. + wait_time (float): The interval of show (s). 0 is the special value + that means "forever". Defaults to 0. + show (bool): Whether to display the drawn image. + Default to True. + with_labels(bool, optional): Add semantic labels in visualization + result, Default to True. + save_dir (str, optional): Save file dir for all storage backends. + If it is None, the backend storage will not save any data. + out_file (str, optional): Path to output file. Default to None. + + + + Returns: + np.ndarray: the drawn image which channel is RGB. + """ + if hasattr(model, 'module'): + model = model.module + if isinstance(img, str): + image = mmcv.imread(img, channel_order='rgb') + else: + image = img + if save_dir is not None: + mkdir_or_exist(save_dir) + # init visualizer + visualizer = SegLocalVisualizer( + vis_backends=[dict(type='LocalVisBackend')], + save_dir=save_dir, + alpha=opacity) + visualizer.dataset_meta = dict( + classes=model.dataset_meta['classes'], + palette=model.dataset_meta['palette']) + visualizer.add_datasample( + name=title, + image=image, + data_sample=result, + draw_gt=draw_gt, + draw_pred=draw_pred, + wait_time=wait_time, + out_file=out_file, + show=show, + with_labels=with_labels) + vis_img = visualizer.get_image() + + return vis_img diff --git a/mmsegmentation/mmseg/apis/mmseg_inferencer.py b/mmsegmentation/mmseg/apis/mmseg_inferencer.py new file mode 100644 index 0000000..02a198b --- /dev/null +++ b/mmsegmentation/mmseg/apis/mmseg_inferencer.py @@ -0,0 +1,382 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import warnings +from typing import List, Optional, Sequence, Union + +import mmcv +import mmengine +import numpy as np +import torch +import torch.nn as nn +from mmcv.transforms import Compose +from mmengine.infer.infer import BaseInferencer, ModelType +from mmengine.model import revert_sync_batchnorm +from mmengine.registry import init_default_scope +from mmengine.runner.checkpoint import _load_checkpoint_to_model +from PIL import Image + +from mmseg.structures import SegDataSample +from mmseg.utils import ConfigType, SampleList, get_classes, get_palette +from mmseg.visualization import SegLocalVisualizer + +InputType = Union[str, np.ndarray] +InputsType = Union[InputType, Sequence[InputType]] +PredType = Union[SegDataSample, SampleList] + + +class MMSegInferencer(BaseInferencer): + """Semantic segmentation inferencer, provides inference and visualization + interfaces. Note: MMEngine >= 0.5.0 is required. + + Args: + model (str, optional): Path to the config file or the model name + defined in metafile. Take the `mmseg metafile `_ + as an example the `model` could be + "fcn_r50-d8_4xb2-40k_cityscapes-512x1024", and the weights of model + will be download automatically. If use config file, like + "configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py", the + `weights` should be defined. + weights (str, optional): Path to the checkpoint. If it is not specified + and model is a model name of metafile, the weights will be loaded + from metafile. Defaults to None. + classes (list, optional): Input classes for result rendering, as the + prediction of segmentation model is a segment map with label + indices, `classes` is a list which includes items responding to the + label indices. If classes is not defined, visualizer will take + `cityscapes` classes by default. Defaults to None. + palette (list, optional): Input palette for result rendering, which is + a list of color palette responding to the classes. If palette is + not defined, visualizer will take `cityscapes` palette by default. + Defaults to None. + dataset_name (str, optional): `Dataset name or alias `_ + visulizer will use the meta information of the dataset i.e. classes + and palette, but the `classes` and `palette` have higher priority. + Defaults to None. + device (str, optional): Device to run inference. If None, the available + device will be automatically used. Defaults to None. + scope (str, optional): The scope of the model. Defaults to 'mmseg'. + """ # noqa + + preprocess_kwargs: set = set() + forward_kwargs: set = {'mode', 'out_dir'} + visualize_kwargs: set = { + 'show', 'wait_time', 'img_out_dir', 'opacity', 'return_vis', + 'with_labels' + } + postprocess_kwargs: set = {'pred_out_dir', 'return_datasample'} + + def __init__(self, + model: Union[ModelType, str], + weights: Optional[str] = None, + classes: Optional[Union[str, List]] = None, + palette: Optional[Union[str, List]] = None, + dataset_name: Optional[str] = None, + device: Optional[str] = None, + scope: Optional[str] = 'mmseg') -> None: + # A global counter tracking the number of images processes, for + # naming of the output images + self.num_visualized_imgs = 0 + self.num_pred_imgs = 0 + init_default_scope(scope if scope else 'mmseg') + super().__init__( + model=model, weights=weights, device=device, scope=scope) + + if device == 'cpu' or not torch.cuda.is_available(): + self.model = revert_sync_batchnorm(self.model) + + assert isinstance(self.visualizer, SegLocalVisualizer) + self.visualizer.set_dataset_meta(classes, palette, dataset_name) + + def _load_weights_to_model(self, model: nn.Module, + checkpoint: Optional[dict], + cfg: Optional[ConfigType]) -> None: + """Loading model weights and meta information from cfg and checkpoint. + + Subclasses could override this method to load extra meta information + from ``checkpoint`` and ``cfg`` to model. + + Args: + model (nn.Module): Model to load weights and meta information. + checkpoint (dict, optional): The loaded checkpoint. + cfg (Config or ConfigDict, optional): The loaded config. + """ + + if checkpoint is not None: + _load_checkpoint_to_model(model, checkpoint) + checkpoint_meta = checkpoint.get('meta', {}) + # save the dataset_meta in the model for convenience + if 'dataset_meta' in checkpoint_meta: + # mmsegmentation 1.x + model.dataset_meta = { + 'classes': checkpoint_meta['dataset_meta'].get('classes'), + 'palette': checkpoint_meta['dataset_meta'].get('palette') + } + elif 'CLASSES' in checkpoint_meta: + # mmsegmentation 0.x + classes = checkpoint_meta['CLASSES'] + palette = checkpoint_meta.get('PALETTE', None) + model.dataset_meta = {'classes': classes, 'palette': palette} + else: + warnings.warn( + 'dataset_meta or class names are not saved in the ' + 'checkpoint\'s meta data, use classes of Cityscapes by ' + 'default.') + model.dataset_meta = { + 'classes': get_classes('cityscapes'), + 'palette': get_palette('cityscapes') + } + else: + warnings.warn('Checkpoint is not loaded, and the inference ' + 'result is calculated by the randomly initialized ' + 'model!') + warnings.warn( + 'weights is None, use cityscapes classes by default.') + model.dataset_meta = { + 'classes': get_classes('cityscapes'), + 'palette': get_palette('cityscapes') + } + + def __call__(self, + inputs: InputsType, + return_datasamples: bool = False, + batch_size: int = 1, + return_vis: bool = False, + show: bool = False, + wait_time: int = 0, + out_dir: str = '', + img_out_dir: str = 'vis', + pred_out_dir: str = 'pred', + **kwargs) -> dict: + """Call the inferencer. + + Args: + inputs (Union[list, str, np.ndarray]): Inputs for the inferencer. + return_datasamples (bool): Whether to return results as + :obj:`SegDataSample`. Defaults to False. + batch_size (int): Batch size. Defaults to 1. + show (bool): Whether to display the rendering color segmentation + mask in a popup window. Defaults to False. + wait_time (float): The interval of show (s). Defaults to 0. + out_dir (str): Output directory of inference results. Defaults + to ''. + img_out_dir (str): Subdirectory of `out_dir`, used to save + rendering color segmentation mask, so `out_dir` must be defined + if you would like to save predicted mask. Defaults to 'vis'. + pred_out_dir (str): Subdirectory of `out_dir`, used to save + predicted mask file, so `out_dir` must be defined if you would + like to save predicted mask. Defaults to 'pred'. + + **kwargs: Other keyword arguments passed to :meth:`preprocess`, + :meth:`forward`, :meth:`visualize` and :meth:`postprocess`. + Each key in kwargs should be in the corresponding set of + ``preprocess_kwargs``, ``forward_kwargs``, ``visualize_kwargs`` + and ``postprocess_kwargs``. + + + Returns: + dict: Inference and visualization results. + """ + + if out_dir != '': + pred_out_dir = osp.join(out_dir, pred_out_dir) + img_out_dir = osp.join(out_dir, img_out_dir) + else: + pred_out_dir = '' + img_out_dir = '' + + return super().__call__( + inputs=inputs, + return_datasamples=return_datasamples, + batch_size=batch_size, + show=show, + wait_time=wait_time, + img_out_dir=img_out_dir, + pred_out_dir=pred_out_dir, + return_vis=return_vis, + **kwargs) + + def visualize(self, + inputs: list, + preds: List[dict], + return_vis: bool = False, + show: bool = False, + wait_time: int = 0, + img_out_dir: str = '', + opacity: float = 0.8, + with_labels: Optional[bool] = True) -> List[np.ndarray]: + """Visualize predictions. + + Args: + inputs (list): Inputs preprocessed by :meth:`_inputs_to_list`. + preds (Any): Predictions of the model. + show (bool): Whether to display the image in a popup window. + Defaults to False. + wait_time (float): The interval of show (s). Defaults to 0. + img_out_dir (str): Output directory of rendering prediction i.e. + color segmentation mask. Defaults: '' + opacity (int, float): The transparency of segmentation mask. + Defaults to 0.8. + + Returns: + List[np.ndarray]: Visualization results. + """ + if not show and img_out_dir == '' and not return_vis: + return None + if self.visualizer is None: + raise ValueError('Visualization needs the "visualizer" term' + 'defined in the config, but got None.') + + self.visualizer.set_dataset_meta(**self.model.dataset_meta) + self.visualizer.alpha = opacity + + results = [] + + for single_input, pred in zip(inputs, preds): + if isinstance(single_input, str): + img_bytes = mmengine.fileio.get(single_input) + img = mmcv.imfrombytes(img_bytes) + img = img[:, :, ::-1] + img_name = osp.basename(single_input) + elif isinstance(single_input, np.ndarray): + img = single_input.copy() + img_num = str(self.num_visualized_imgs).zfill(8) + '_vis' + img_name = f'{img_num}.jpg' + else: + raise ValueError('Unsupported input type:' + f'{type(single_input)}') + + out_file = osp.join(img_out_dir, img_name) if img_out_dir != ''\ + else None + + self.visualizer.add_datasample( + img_name, + img, + pred, + show=show, + wait_time=wait_time, + draw_gt=False, + draw_pred=True, + out_file=out_file, + with_labels=with_labels) + if return_vis: + results.append(self.visualizer.get_image()) + self.num_visualized_imgs += 1 + + return results if return_vis else None + + def postprocess(self, + preds: PredType, + visualization: List[np.ndarray], + return_datasample: bool = False, + pred_out_dir: str = '') -> dict: + """Process the predictions and visualization results from ``forward`` + and ``visualize``. + + This method should be responsible for the following tasks: + + 1. Pack the predictions and visualization results and return them. + 2. Save the predictions, if it needed. + + Args: + preds (List[Dict]): Predictions of the model. + visualization (List[np.ndarray]): The list of rendering color + segmentation mask. + return_datasample (bool): Whether to return results as datasamples. + Defaults to False. + pred_out_dir: File to save the inference results w/o + visualization. If left as empty, no file will be saved. + Defaults to ''. + + Returns: + dict: Inference and visualization results with key ``predictions`` + and ``visualization`` + + - ``visualization (Any)``: Returned by :meth:`visualize` + - ``predictions`` (List[np.ndarray], np.ndarray): Returned by + :meth:`forward` and processed in :meth:`postprocess`. + If ``return_datasample=False``, it will be the segmentation mask + with label indice. + """ + if return_datasample: + if len(preds) == 1: + return preds[0] + else: + return preds + + results_dict = {} + + results_dict['predictions'] = [] + results_dict['visualization'] = [] + + for i, pred in enumerate(preds): + pred_data = dict() + if 'pred_sem_seg' in pred.keys(): + pred_data['sem_seg'] = pred.pred_sem_seg.numpy().data[0] + elif 'pred_depth_map' in pred.keys(): + pred_data['depth_map'] = pred.pred_depth_map.numpy().data[0] + + if visualization is not None: + vis = visualization[i] + results_dict['visualization'].append(vis) + if pred_out_dir != '': + mmengine.mkdir_or_exist(pred_out_dir) + for key, data in pred_data.items(): + post_fix = '_pred.png' if key == 'sem_seg' else '_pred.npy' + img_name = str(self.num_pred_imgs).zfill(8) + post_fix + img_path = osp.join(pred_out_dir, img_name) + if key == 'sem_seg': + output = Image.fromarray(data.astype(np.uint8)) + output.save(img_path) + else: + np.save(img_path, data) + pred_data = next(iter(pred_data.values())) + results_dict['predictions'].append(pred_data) + self.num_pred_imgs += 1 + + if len(results_dict['predictions']) == 1: + results_dict['predictions'] = results_dict['predictions'][0] + if visualization is not None: + results_dict['visualization'] = \ + results_dict['visualization'][0] + return results_dict + + def _init_pipeline(self, cfg: ConfigType) -> Compose: + """Initialize the test pipeline. + + Return a pipeline to handle various input data, such as ``str``, + ``np.ndarray``. It is an abstract method in BaseInferencer, and should + be implemented in subclasses. + + The returned pipeline will be used to process a single data. + It will be used in :meth:`preprocess` like this: + + .. code-block:: python + def preprocess(self, inputs, batch_size, **kwargs): + ... + dataset = map(self.pipeline, dataset) + ... + """ + pipeline_cfg = cfg.test_dataloader.dataset.pipeline + # Loading annotations is also not applicable + for transform in ('LoadAnnotations', 'LoadDepthAnnotation'): + idx = self._get_transform_idx(pipeline_cfg, transform) + if idx != -1: + del pipeline_cfg[idx] + + load_img_idx = self._get_transform_idx(pipeline_cfg, + 'LoadImageFromFile') + if load_img_idx == -1: + raise ValueError( + 'LoadImageFromFile is not found in the test pipeline') + pipeline_cfg[load_img_idx]['type'] = 'InferencerLoader' + return Compose(pipeline_cfg) + + def _get_transform_idx(self, pipeline_cfg: ConfigType, name: str) -> int: + """Returns the index of the transform in a pipeline. + + If the transform is not found, returns -1. + """ + for i, transform in enumerate(pipeline_cfg): + if transform['type'] == name: + return i + return -1 diff --git a/mmsegmentation/mmseg/apis/remote_sense_inferencer.py b/mmsegmentation/mmseg/apis/remote_sense_inferencer.py new file mode 100644 index 0000000..6726c6a --- /dev/null +++ b/mmsegmentation/mmseg/apis/remote_sense_inferencer.py @@ -0,0 +1,279 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import threading +from queue import Queue +from typing import List, Optional, Tuple + +import numpy as np +import torch +from mmengine import Config +from mmengine.model import BaseModel +from mmengine.registry import init_default_scope +from mmengine.runner import load_checkpoint + +try: + from osgeo import gdal +except ImportError: + gdal = None + +from mmseg.registry import MODELS +from .utils import _preprare_data + + +class RSImage: + """Remote sensing image class. + + Args: + img (str or gdal.Dataset): Image file path or gdal.Dataset. + """ + + def __init__(self, image): + self.dataset = gdal.Open(image, gdal.GA_ReadOnly) if isinstance( + image, str) else image + assert isinstance(self.dataset, gdal.Dataset), \ + f'{image} is not a image' + self.width = self.dataset.RasterXSize + self.height = self.dataset.RasterYSize + self.channel = self.dataset.RasterCount + self.trans = self.dataset.GetGeoTransform() + self.proj = self.dataset.GetProjection() + self.band_list = [] + self.band_list.extend( + self.dataset.GetRasterBand(c + 1) for c in range(self.channel)) + self.grids = [] + + def read(self, grid: Optional[List] = None) -> np.ndarray: + """Read image data. If grid is None, read the whole image. + + Args: + grid (Optional[List], optional): Grid to read. Defaults to None. + Returns: + np.ndarray: Image data. + """ + if grid is None: + return np.einsum('ijk->jki', self.dataset.ReadAsArray()) + assert len( + grid) >= 4, 'grid must be a list containing at least 4 elements' + data = self.dataset.ReadAsArray(*grid[:4]) + if data.ndim == 2: + data = data[np.newaxis, ...] + return np.einsum('ijk->jki', data) + + def write(self, data: Optional[np.ndarray], grid: Optional[List] = None): + """Write image data. + + Args: + grid (Optional[List], optional): Grid to write. Defaults to None. + data (Optional[np.ndarray], optional): Data to write. + Defaults to None. + + Raises: + ValueError: Either grid or data must be provided. + """ + if grid is not None: + assert len(grid) == 8, 'grid must be a list of 8 elements' + for band in self.band_list: + band.WriteArray( + data[grid[5]:grid[5] + grid[7], grid[4]:grid[4] + grid[6]], + grid[0] + grid[4], grid[1] + grid[5]) + elif data is not None: + for i in range(self.channel): + self.band_list[i].WriteArray(data[..., i]) + else: + raise ValueError('Either grid or data must be provided.') + + def create_seg_map(self, output_path: Optional[str] = None): + if output_path is None: + output_path = 'output_label.tif' + driver = gdal.GetDriverByName('GTiff') + seg_map = driver.Create(output_path, self.width, self.height, 1, + gdal.GDT_Byte) + seg_map.SetGeoTransform(self.trans) + seg_map.SetProjection(self.proj) + seg_map_img = RSImage(seg_map) + seg_map_img.path = output_path + return seg_map_img + + def create_grids(self, + window_size: Tuple[int, int], + stride: Tuple[int, int] = (0, 0)): + """Create grids for image inference. + + Args: + window_size (Tuple[int, int]): the size of the sliding window. + stride (Tuple[int, int], optional): the stride of the sliding + window. Defaults to (0, 0). + + Raises: + AssertionError: window_size must be a tuple of 2 elements. + AssertionError: stride must be a tuple of 2 elements. + """ + assert len( + window_size) == 2, 'window_size must be a tuple of 2 elements' + assert len(stride) == 2, 'stride must be a tuple of 2 elements' + win_w, win_h = window_size + stride_x, stride_y = stride + + stride_x = win_w if stride_x == 0 else stride_x + stride_y = win_h if stride_y == 0 else stride_y + + x_half_overlap = (win_w - stride_x + 1) // 2 + y_half_overlap = (win_h - stride_y + 1) // 2 + + for y in range(0, self.height, stride_y): + y_end = y + win_h >= self.height + y_offset = self.height - win_h if y_end else y + y_size = win_h + y_crop_off = 0 if y_offset == 0 else y_half_overlap + y_crop_size = y_size if y_end else win_h - y_crop_off + + for x in range(0, self.width, stride_x): + x_end = x + win_w >= self.width + x_offset = self.width - win_w if x_end else x + x_size = win_w + x_crop_off = 0 if x_offset == 0 else x_half_overlap + x_crop_size = x_size if x_end else win_w - x_crop_off + + self.grids.append([ + x_offset, y_offset, x_size, y_size, x_crop_off, y_crop_off, + x_crop_size, y_crop_size + ]) + + +class RSInferencer: + """Remote sensing inference class. + + Args: + model (BaseModel): The loaded model. + batch_size (int, optional): Batch size. Defaults to 1. + thread (int, optional): Number of threads. Defaults to 1. + """ + + def __init__(self, model: BaseModel, batch_size: int = 1, thread: int = 1): + self.model = model + self.batch_size = batch_size + self.END_FLAG = object() + self.read_buffer = Queue(self.batch_size) + self.write_buffer = Queue(self.batch_size) + self.thread = thread + + @classmethod + def from_config_path(cls, + config_path: str, + checkpoint_path: str, + batch_size: int = 1, + thread: int = 1, + device: Optional[str] = 'cpu'): + """Initialize a segmentor from config file. + + Args: + config_path (str): Config file path. + checkpoint_path (str): Checkpoint path. + batch_size (int, optional): Batch size. Defaults to 1. + """ + init_default_scope('mmseg') + cfg = Config.fromfile(config_path) + model = MODELS.build(cfg.model) + model.cfg = cfg + load_checkpoint(model, checkpoint_path, map_location='cpu') + model.to(device) + model.eval() + return cls(model, batch_size, thread) + + @classmethod + def from_model(cls, + model: BaseModel, + checkpoint_path: Optional[str] = None, + batch_size: int = 1, + thread: int = 1, + device: Optional[str] = 'cpu'): + """Initialize a segmentor from model. + + Args: + model (BaseModel): The loaded model. + checkpoint_path (Optional[str]): Checkpoint path. + batch_size (int, optional): Batch size. Defaults to 1. + """ + if checkpoint_path is not None: + load_checkpoint(model, checkpoint_path, map_location='cpu') + model.to(device) + return cls(model, batch_size, thread) + + def read(self, + image: RSImage, + window_size: Tuple[int, int], + strides: Tuple[int, int] = (0, 0)): + """Load image data to read buffer. + + Args: + image (RSImage): The image to read. + window_size (Tuple[int, int]): The size of the sliding window. + strides (Tuple[int, int], optional): The stride of the sliding + window. Defaults to (0, 0). + """ + image.create_grids(window_size, strides) + for grid in image.grids: + self.read_buffer.put([grid, image.read(grid=grid)]) + self.read_buffer.put(self.END_FLAG) + + def inference(self): + """Inference image data from read buffer and put the result to write + buffer.""" + while True: + item = self.read_buffer.get() + if item == self.END_FLAG: + self.read_buffer.put(self.END_FLAG) + self.write_buffer.put(item) + break + data, _ = _preprare_data(item[1], self.model) + with torch.no_grad(): + result = self.model.test_step(data) + item[1] = result[0].pred_sem_seg.cpu().data.numpy()[0] + self.write_buffer.put(item) + self.read_buffer.task_done() + + def write(self, image: RSImage, output_path: Optional[str] = None): + """Write image data from write buffer. + + Args: + image (RSImage): The image to write. + output_path (Optional[str], optional): The path to save the + segmentation map. Defaults to None. + """ + seg_map = image.create_seg_map(output_path) + while True: + item = self.write_buffer.get() + if item == self.END_FLAG: + break + seg_map.write(data=item[1], grid=item[0]) + self.write_buffer.task_done() + + def run(self, + image: RSImage, + window_size: Tuple[int, int], + strides: Tuple[int, int] = (0, 0), + output_path: Optional[str] = None): + """Run inference with multi-threading. + + Args: + image (RSImage): The image to inference. + window_size (Tuple[int, int]): The size of the sliding window. + strides (Tuple[int, int], optional): The stride of the sliding + window. Defaults to (0, 0). + output_path (Optional[str], optional): The path to save the + segmentation map. Defaults to None. + """ + read_thread = threading.Thread( + target=self.read, args=(image, window_size, strides)) + read_thread.start() + inference_threads = [] + for _ in range(self.thread): + inference_thread = threading.Thread(target=self.inference) + inference_thread.start() + inference_threads.append(inference_thread) + write_thread = threading.Thread( + target=self.write, args=(image, output_path)) + write_thread.start() + read_thread.join() + for inference_thread in inference_threads: + inference_thread.join() + write_thread.join() diff --git a/mmsegmentation/mmseg/apis/utils.py b/mmsegmentation/mmseg/apis/utils.py new file mode 100644 index 0000000..4cf8775 --- /dev/null +++ b/mmsegmentation/mmseg/apis/utils.py @@ -0,0 +1,41 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections import defaultdict +from typing import Sequence, Union + +import numpy as np +from mmengine.dataset import Compose +from mmengine.model import BaseModel + +ImageType = Union[str, np.ndarray, Sequence[str], Sequence[np.ndarray]] + + +def _preprare_data(imgs: ImageType, model: BaseModel): + + cfg = model.cfg + for t in cfg.test_pipeline: + if t.get('type') == 'LoadAnnotations': + cfg.test_pipeline.remove(t) + + is_batch = True + if not isinstance(imgs, (list, tuple)): + imgs = [imgs] + is_batch = False + + if isinstance(imgs[0], np.ndarray): + cfg.test_pipeline[0]['type'] = 'LoadImageFromNDArray' + + # TODO: Consider using the singleton pattern to avoid building + # a pipeline for each inference + pipeline = Compose(cfg.test_pipeline) + + data = defaultdict(list) + for img in imgs: + if isinstance(img, np.ndarray): + data_ = dict(img=img) + else: + data_ = dict(img_path=img) + data_ = pipeline(data_) + data['inputs'].append(data_['inputs']) + data['data_samples'].append(data_['data_samples']) + + return data, is_batch diff --git a/mmsegmentation/mmseg/configs/_base_/datasets/loveda.py b/mmsegmentation/mmseg/configs/_base_/datasets/loveda.py new file mode 100644 index 0000000..eb3d358 --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/datasets/loveda.py @@ -0,0 +1,79 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.transforms.loading import LoadImageFromFile +from mmcv.transforms.processing import (RandomFlip, RandomResize, Resize, + TestTimeAug) +from mmengine.dataset.sampler import DefaultSampler, InfiniteSampler + +from mmseg.datasets.loveda import LoveDADataset +from mmseg.datasets.transforms.formatting import PackSegInputs +from mmseg.datasets.transforms.loading import LoadAnnotations +from mmseg.datasets.transforms.transforms import (PhotoMetricDistortion, + RandomCrop) +from mmseg.evaluation import IoUMetric + +# dataset settings +dataset_type = LoveDADataset +data_root = 'data/loveDA' +crop_size = (512, 512) +train_pipeline = [ + dict(type=LoadImageFromFile), + dict(type=LoadAnnotations, reduce_zero_label=True), + dict( + type=RandomResize, + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type=RandomCrop, crop_size=crop_size, cat_max_ratio=0.75), + dict(type=RandomFlip, prob=0.5), + dict(type=PhotoMetricDistortion), + dict(type=PackSegInputs) +] +test_pipeline = [ + dict(type=LoadImageFromFile), + dict(type=Resize, scale=(1024, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type=LoadAnnotations, reduce_zero_label=True), + dict(type=PackSegInputs) +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type=LoadImageFromFile, backend_args=None), + dict( + type=TestTimeAug, + transforms=[[ + dict(type=Resize, scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type=RandomFlip, prob=0., direction='horizontal'), + dict(type=RandomFlip, prob=1., direction='horizontal') + ], [dict(type=LoadAnnotations)], + [dict(type=PackSegInputs)]]) +] +train_dataloader = dict( + batch_size=2, + num_workers=12, + persistent_workers=True, + sampler=dict(type=InfiniteSampler, shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type=DefaultSampler, shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) + +test_dataloader = val_dataloader +val_evaluator = dict(type=IoUMetric, iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/mmseg/configs/_base_/datasets/potsdam.py b/mmsegmentation/mmseg/configs/_base_/datasets/potsdam.py new file mode 100644 index 0000000..33a4ebf --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/datasets/potsdam.py @@ -0,0 +1,81 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.transforms.loading import LoadImageFromFile +from mmcv.transforms.processing import (RandomFlip, RandomResize, Resize, + TestTimeAug) +from mmengine.dataset.sampler import DefaultSampler, InfiniteSampler + +from mmseg.datasets.potsdam import PotsdamDataset +from mmseg.datasets.transforms.formatting import PackSegInputs +from mmseg.datasets.transforms.loading import LoadAnnotations +from mmseg.datasets.transforms.transforms import (PhotoMetricDistortion, + RandomCrop) +from mmseg.evaluation import IoUMetric + +# dataset settings +dataset_type = PotsdamDataset +data_root = 'data/potsdam' +crop_size = (512, 512) +train_pipeline = [ + dict(type=LoadImageFromFile), + dict(type=LoadAnnotations, reduce_zero_label=True), + dict( + type=RandomResize, + scale=(512, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type=RandomCrop, crop_size=crop_size, cat_max_ratio=0.75), + dict(type=RandomFlip, prob=0.5), + dict(type=PhotoMetricDistortion), + dict(type=PackSegInputs) +] +test_pipeline = [ + dict(type=LoadImageFromFile), + dict(type=Resize, scale=(512, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type=LoadAnnotations, reduce_zero_label=True), + dict(type=PackSegInputs) +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type=LoadImageFromFile, backend_args=None), + dict( + type=TestTimeAug, + transforms=[[ + dict(type=Resize, scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type=RandomFlip, prob=0., direction='horizontal'), + dict(type=RandomFlip, prob=1., direction='horizontal') + ], [dict(type=LoadAnnotations)], + [dict(type=PackSegInputs)]]) +] + +train_dataloader = dict( + batch_size=2, + num_workers=4, + persistent_workers=True, + sampler=dict(type=InfiniteSampler, shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type=DefaultSampler, shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict( + type=IoUMetric, iou_metrics=['mIoU']) # 'mDice', 'mFscore' +test_evaluator = val_evaluator diff --git a/mmsegmentation/mmseg/configs/_base_/default_runtime.py b/mmsegmentation/mmseg/configs/_base_/default_runtime.py new file mode 100644 index 0000000..c905020 --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/default_runtime.py @@ -0,0 +1,22 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +from mmengine.visualization import LocalVisBackend + +from mmseg.models import SegTTAModel +from mmseg.visualization import SegLocalVisualizer + +env_cfg = dict( + cudnn_benchmark=False, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +vis_backends = [dict(type=LocalVisBackend)] +visualizer = dict( + type=SegLocalVisualizer, vis_backends=vis_backends, name='visualizer') +log_processor = dict(by_epoch=False) +log_level = 'INFO' +load_from = None +resume = False + +tta_model = dict(type=SegTTAModel) +default_scope = None diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_160k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_160k.py new file mode 100644 index 0000000..294d6ee --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_160k.py @@ -0,0 +1,43 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +from torch.optim.sgd import SGD + +from mmseg.engine import SegVisualizationHook + +# optimizer +optimizer = dict( + type=SGD, + # lr=0.01, + # momentum=0.9, + # weight_decay=0.0005 +) + +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) + +# learning policy +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=160000, + by_epoch=False) +] +# training schedule for 160k + +train_cfg = dict(type=IterBasedTrainLoop, max_iters=160000, val_interval=8000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) + +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=8000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_20k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_20k.py new file mode 100644 index 0000000..255300a --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_20k.py @@ -0,0 +1,36 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +from torch.optim.sgd import SGD + +from mmseg.engine import SegVisualizationHook + +# optimizer +optimizer = dict(type=SGD, lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) + +# learning policy +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=20000, + by_epoch=False) +] +# training schedule for 20k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=20000, val_interval=2000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) + +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=2000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_240k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_240k.py new file mode 100644 index 0000000..cf9e5d3 --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_240k.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +# from mmengine.runner.loops import EpochBasedTrainLoop +from torch.optim.sgd import SGD + +from mmseg.engine import SegVisualizationHook + +optimizer = dict(type=SGD, lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=240000, + by_epoch=False) +] +# training schedule for 240k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=240000, val_interval=24000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=24000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_25k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_25k.py new file mode 100644 index 0000000..8a3ebf4 --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_25k.py @@ -0,0 +1,43 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import ConstantLR, LinearLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +# from mmengine.runner.loops import EpochBasedTrainLoop +from torch.optim.adamw import AdamW + +from mmseg.engine import SegVisualizationHook +from mmseg.engine.schedulers import PolyLRRatio + +# optimizer +optimizer = dict(type=AdamW, lr=0.01, weight_decay=0.1) + +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) +# learning policy + +# learning policy +param_scheduler = [ + dict(type=LinearLR, start_factor=3e-2, begin=0, end=12000, by_epoch=False), + dict( + type=PolyLRRatio, + eta_min_ratio=3e-2, + power=0.9, + begin=12000, + end=24000, + by_epoch=False), + dict(type=ConstantLR, by_epoch=False, factor=1, begin=24000, end=25000) +] + +# training schedule for 25k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=25000, val_interval=1000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) + +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=1000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_320k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_320k.py new file mode 100644 index 0000000..dae323e --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_320k.py @@ -0,0 +1,36 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +# from mmengine.runner.loops import EpochBasedTrainLoop +from torch.optim.sgd import SGD + +from mmseg.engine import SegVisualizationHook + +# optimizer +optimizer = dict(type=SGD, lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) + +# learning policy +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=320000, + by_epoch=False) +] +# training schedule for 320k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=320000, val_interval=32000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=32000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_40k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_40k.py new file mode 100644 index 0000000..b4b2ea4 --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_40k.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +from torch.optim.sgd import SGD + +from mmseg.engine import SegVisualizationHook + +# optimizer +optimizer = dict(type=SGD, lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) + +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=40000, + by_epoch=False) +] +# training schedule for 40k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=40000, val_interval=4000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=4000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/configs/_base_/schedules/schedule_80k.py b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000..3e711ca --- /dev/null +++ b/mmsegmentation/mmseg/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop +from torch.optim.sgd import SGD + +from mmseg.engine import SegVisualizationHook + +# optimizer +optimizer = dict( + type=SGD, + # lr=0.01, + # momentum=0.9, + # weight_decay=0.0005 +) + +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) + +# learning policy +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=80000, + by_epoch=False) +] +# training schedule for 80k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=80000, val_interval=8000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) + +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=8000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) diff --git a/mmsegmentation/mmseg/datasets/__init__.py b/mmsegmentation/mmseg/datasets/__init__.py new file mode 100644 index 0000000..49c3383 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/__init__.py @@ -0,0 +1,69 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# yapf: disable +from .ade import ADE20KDataset +from .basesegdataset import BaseCDDataset, BaseSegDataset +from .bdd100k import BDD100KDataset +from .chase_db1 import ChaseDB1Dataset +from .cityscapes import CityscapesDataset +from .coco_stuff import COCOStuffDataset +from .dark_zurich import DarkZurichDataset +from .dataset_wrappers import MultiImageMixDataset +from .decathlon import DecathlonDataset +from .drive import DRIVEDataset +from .dsdl import DSDLSegDataset +from .hrf import HRFDataset +from .hsi_drive import HSIDrive20Dataset +from .isaid import iSAIDDataset +from .isprs import ISPRSDataset +from .levir import LEVIRCDDataset +from .lip import LIPDataset +from .loveda import LoveDADataset +from .mapillary import MapillaryDataset_v1, MapillaryDataset_v2 +from .night_driving import NightDrivingDataset +from .nyu import NYUDataset +from .pascal_context import PascalContextDataset, PascalContextDataset59 +from .potsdam import PotsdamDataset +from .refuge import REFUGEDataset +from .stare import STAREDataset +from .synapse import SynapseDataset +from .xray import XRayDataset +from .xray2 import XRayDataset2, LoadXRayAnnotations, TransposeAnnotations + +# yapf: disable +from .transforms import (CLAHE, AdjustGamma, Albu, BioMedical3DPad, + BioMedical3DRandomCrop, BioMedical3DRandomFlip, + BioMedicalGaussianBlur, BioMedicalGaussianNoise, + BioMedicalRandomGamma, ConcatCDInput, GenerateEdge, + LoadAnnotations, LoadBiomedicalAnnotation, + LoadBiomedicalData, LoadBiomedicalImageFromFile, + LoadImageFromNDArray, LoadMultipleRSImageFromFile, + LoadSingleRSImageFromFile, PackSegInputs, + PhotoMetricDistortion, RandomCrop, RandomCutOut, + RandomMosaic, RandomRotate, RandomRotFlip, Rerange, + ResizeShortestEdge, ResizeToMultiple, RGB2Gray, + SegRescale) +from .voc import PascalVOCDataset + + +# yapf: enable +__all__ = [ + 'BaseSegDataset', 'BioMedical3DRandomCrop', 'BioMedical3DRandomFlip', + 'CityscapesDataset', 'PascalVOCDataset', 'ADE20KDataset', + 'PascalContextDataset', 'PascalContextDataset59', 'ChaseDB1Dataset', + 'DRIVEDataset', 'HRFDataset', 'STAREDataset', 'DarkZurichDataset', + 'NightDrivingDataset', 'COCOStuffDataset', 'LoveDADataset', + 'MultiImageMixDataset', 'iSAIDDataset', 'ISPRSDataset', 'PotsdamDataset', + 'LoadAnnotations', 'RandomCrop', 'SegRescale', 'PhotoMetricDistortion', + 'RandomRotate', 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray', + 'RandomCutOut', 'RandomMosaic', 'PackSegInputs', 'ResizeToMultiple', + 'LoadImageFromNDArray', 'LoadBiomedicalImageFromFile', + 'LoadBiomedicalAnnotation', 'LoadBiomedicalData', 'GenerateEdge', + 'DecathlonDataset', 'LIPDataset', 'ResizeShortestEdge', + 'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur', + 'BioMedicalRandomGamma', 'BioMedical3DPad', 'RandomRotFlip', + 'SynapseDataset', 'REFUGEDataset', 'MapillaryDataset_v1', + 'MapillaryDataset_v2', 'Albu', 'LEVIRCDDataset', + 'LoadMultipleRSImageFromFile', 'LoadSingleRSImageFromFile', + 'ConcatCDInput', 'BaseCDDataset', 'DSDLSegDataset', 'BDD100KDataset', + 'NYUDataset', 'HSIDrive20Dataset', 'XRayDataset', 'XRayDataset2', 'LoadXRayAnnotations', 'TransposeAnnotations' +] diff --git a/mmsegmentation/mmseg/datasets/ade.py b/mmsegmentation/mmseg/datasets/ade.py new file mode 100644 index 0000000..e9bdae7 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/ade.py @@ -0,0 +1,92 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class ADE20KDataset(BaseSegDataset): + """ADE20K dataset. + + In segmentation map annotation for ADE20K, 0 stands for background, which + is not included in 150 categories. ``reduce_zero_label`` is fixed to True. + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is fixed to + '.png'. + """ + METAINFO = dict( + classes=('wall', 'building', 'sky', 'floor', 'tree', 'ceiling', 'road', + 'bed ', 'windowpane', 'grass', 'cabinet', 'sidewalk', + 'person', 'earth', 'door', 'table', 'mountain', 'plant', + 'curtain', 'chair', 'car', 'water', 'painting', 'sofa', + 'shelf', 'house', 'sea', 'mirror', 'rug', 'field', 'armchair', + 'seat', 'fence', 'desk', 'rock', 'wardrobe', 'lamp', + 'bathtub', 'railing', 'cushion', 'base', 'box', 'column', + 'signboard', 'chest of drawers', 'counter', 'sand', 'sink', + 'skyscraper', 'fireplace', 'refrigerator', 'grandstand', + 'path', 'stairs', 'runway', 'case', 'pool table', 'pillow', + 'screen door', 'stairway', 'river', 'bridge', 'bookcase', + 'blind', 'coffee table', 'toilet', 'flower', 'book', 'hill', + 'bench', 'countertop', 'stove', 'palm', 'kitchen island', + 'computer', 'swivel chair', 'boat', 'bar', 'arcade machine', + 'hovel', 'bus', 'towel', 'light', 'truck', 'tower', + 'chandelier', 'awning', 'streetlight', 'booth', + 'television receiver', 'airplane', 'dirt track', 'apparel', + 'pole', 'land', 'bannister', 'escalator', 'ottoman', 'bottle', + 'buffet', 'poster', 'stage', 'van', 'ship', 'fountain', + 'conveyer belt', 'canopy', 'washer', 'plaything', + 'swimming pool', 'stool', 'barrel', 'basket', 'waterfall', + 'tent', 'bag', 'minibike', 'cradle', 'oven', 'ball', 'food', + 'step', 'tank', 'trade name', 'microwave', 'pot', 'animal', + 'bicycle', 'lake', 'dishwasher', 'screen', 'blanket', + 'sculpture', 'hood', 'sconce', 'vase', 'traffic light', + 'tray', 'ashcan', 'fan', 'pier', 'crt screen', 'plate', + 'monitor', 'bulletin board', 'shower', 'radiator', 'glass', + 'clock', 'flag'), + palette=[[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/mmseg/datasets/basesegdataset.py b/mmsegmentation/mmseg/datasets/basesegdataset.py new file mode 100644 index 0000000..3a5c49c --- /dev/null +++ b/mmsegmentation/mmseg/datasets/basesegdataset.py @@ -0,0 +1,552 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import os.path as osp +from typing import Callable, Dict, List, Optional, Sequence, Union + +import mmengine +import mmengine.fileio as fileio +import numpy as np +from mmengine.dataset import BaseDataset, Compose + +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class BaseSegDataset(BaseDataset): + """Custom dataset for semantic segmentation. An example of file structure + is as followed. + + .. code-block:: none + + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ my_dataset + โ”‚ โ”‚ โ”œโ”€โ”€ img_dir + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{seg_map_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{seg_map_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{seg_map_suffix} + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + + The img/gt_semantic_seg pair of BaseSegDataset should be of the same + except suffix. A valid img/gt_semantic_seg filename pair should be like + ``xxx{img_suffix}`` and ``xxx{seg_map_suffix}`` (extension is also included + in the suffix). If split is given, then ``xxx`` is specified in txt file. + Otherwise, all files in ``img_dir/``and ``ann_dir`` will be loaded. + Please refer to ``docs/en/tutorials/new_dataset.md`` for more details. + + + Args: + ann_file (str): Annotation file path. Defaults to ''. + metainfo (dict, optional): Meta information for dataset, such as + specify classes to load. Defaults to None. + data_root (str, optional): The root directory for ``data_prefix`` and + ``ann_file``. Defaults to None. + data_prefix (dict, optional): Prefix for training data. Defaults to + dict(img_path=None, seg_map_path=None). + img_suffix (str): Suffix of images. Default: '.jpg' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + filter_cfg (dict, optional): Config for filter data. Defaults to None. + indices (int or Sequence[int], optional): Support using first few + data in annotation file to facilitate training/testing on a smaller + dataset. Defaults to None which means using all ``data_infos``. + serialize_data (bool, optional): Whether to hold memory using + serialized objects, when enabled, data loader workers can use + shared RAM from master process instead of making a copy. Defaults + to True. + pipeline (list, optional): Processing pipeline. Defaults to []. + test_mode (bool, optional): ``test_mode=True`` means in test phase. + Defaults to False. + lazy_init (bool, optional): Whether to load annotation during + instantiation. In some cases, such as visualization, only the meta + information of the dataset is needed, which is not necessary to + load annotation file. ``Basedataset`` can skip load annotations to + save time by set ``lazy_init=True``. Defaults to False. + max_refetch (int, optional): If ``Basedataset.prepare_data`` get a + None img. The maximum extra number of cycles to get a valid + image. Defaults to 1000. + ignore_index (int): The label index to be ignored. Default: 255 + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + METAINFO: dict = dict() + + def __init__(self, + ann_file: str = '', + img_suffix='.jpg', + seg_map_suffix='.png', + metainfo: Optional[dict] = None, + data_root: Optional[str] = None, + data_prefix: dict = dict(img_path='', seg_map_path=''), + filter_cfg: Optional[dict] = None, + indices: Optional[Union[int, Sequence[int]]] = None, + serialize_data: bool = True, + pipeline: List[Union[dict, Callable]] = [], + test_mode: bool = False, + lazy_init: bool = False, + max_refetch: int = 1000, + ignore_index: int = 255, + reduce_zero_label: bool = False, + backend_args: Optional[dict] = None) -> None: + + self.img_suffix = img_suffix + self.seg_map_suffix = seg_map_suffix + self.ignore_index = ignore_index + self.reduce_zero_label = reduce_zero_label + self.backend_args = backend_args.copy() if backend_args else None + + self.data_root = data_root + self.data_prefix = copy.copy(data_prefix) + self.ann_file = ann_file + self.filter_cfg = copy.deepcopy(filter_cfg) + self._indices = indices + self.serialize_data = serialize_data + self.test_mode = test_mode + self.max_refetch = max_refetch + self.data_list: List[dict] = [] + self.data_bytes: np.ndarray + + # Set meta information. + self._metainfo = self._load_metainfo(copy.deepcopy(metainfo)) + + # Get label map for custom classes + new_classes = self._metainfo.get('classes', None) + self.label_map = self.get_label_map(new_classes) + self._metainfo.update( + dict( + label_map=self.label_map, + reduce_zero_label=self.reduce_zero_label)) + + # Update palette based on label map or generate palette + # if it is not defined + updated_palette = self._update_palette() + self._metainfo.update(dict(palette=updated_palette)) + + # Join paths. + if self.data_root is not None: + self._join_prefix() + + # Build pipeline. + self.pipeline = Compose(pipeline) + # Full initialize the dataset. + if not lazy_init: + self.full_init() + + if test_mode: + assert self._metainfo.get('classes') is not None, \ + 'dataset metainfo `classes` should be specified when testing' + + @classmethod + def get_label_map(cls, + new_classes: Optional[Sequence] = None + ) -> Union[Dict, None]: + """Require label mapping. + + The ``label_map`` is a dictionary, its keys are the old label ids and + its values are the new label ids, and is used for changing pixel + labels in load_annotations. If and only if old classes in cls.METAINFO + is not equal to new classes in self._metainfo and nether of them is not + None, `label_map` is not None. + + Args: + new_classes (list, tuple, optional): The new classes name from + metainfo. Default to None. + + + Returns: + dict, optional: The mapping from old classes in cls.METAINFO to + new classes in self._metainfo + """ + old_classes = cls.METAINFO.get('classes', None) + if (new_classes is not None and old_classes is not None + and list(new_classes) != list(old_classes)): + + label_map = {} + if not set(new_classes).issubset(cls.METAINFO['classes']): + raise ValueError( + f'new classes {new_classes} is not a ' + f'subset of classes {old_classes} in METAINFO.') + for i, c in enumerate(old_classes): + if c not in new_classes: + label_map[i] = 255 + else: + label_map[i] = new_classes.index(c) + return label_map + else: + return None + + def _update_palette(self) -> list: + """Update palette after loading metainfo. + + If length of palette is equal to classes, just return the palette. + If palette is not defined, it will randomly generate a palette. + If classes is updated by customer, it will return the subset of + palette. + + Returns: + Sequence: Palette for current dataset. + """ + palette = self._metainfo.get('palette', []) + classes = self._metainfo.get('classes', []) + # palette does match classes + if len(palette) == len(classes): + return palette + + if len(palette) == 0: + # Get random state before set seed, and restore + # random state later. + # It will prevent loss of randomness, as the palette + # may be different in each iteration if not specified. + # See: https://github.com/open-mmlab/mmdetection/issues/5844 + state = np.random.get_state() + np.random.seed(42) + # random palette + new_palette = np.random.randint( + 0, 255, size=(len(classes), 3)).tolist() + np.random.set_state(state) + elif len(palette) >= len(classes) and self.label_map is not None: + new_palette = [] + # return subset of palette + for old_id, new_id in sorted( + self.label_map.items(), key=lambda x: x[1]): + if new_id != 255: + new_palette.append(palette[old_id]) + new_palette = type(palette)(new_palette) + else: + raise ValueError('palette does not match classes ' + f'as metainfo is {self._metainfo}.') + return new_palette + + def load_data_list(self) -> List[dict]: + """Load annotation from directory or annotation file. + + Returns: + list[dict]: All data info of dataset. + """ + data_list = [] + img_dir = self.data_prefix.get('img_path', None) + ann_dir = self.data_prefix.get('seg_map_path', None) + if not osp.isdir(self.ann_file) and self.ann_file: + assert osp.isfile(self.ann_file), \ + f'Failed to load `ann_file` {self.ann_file}' + lines = mmengine.list_from_file( + self.ann_file, backend_args=self.backend_args) + for line in lines: + img_name = line.strip() + data_info = dict( + img_path=osp.join(img_dir, img_name + self.img_suffix)) + if ann_dir is not None: + seg_map = img_name + self.seg_map_suffix + data_info['seg_map_path'] = osp.join(ann_dir, seg_map) + data_info['label_map'] = self.label_map + data_info['reduce_zero_label'] = self.reduce_zero_label + data_info['seg_fields'] = [] + data_list.append(data_info) + else: + _suffix_len = len(self.img_suffix) + for img in fileio.list_dir_or_file( + dir_path=img_dir, + list_dir=False, + suffix=self.img_suffix, + recursive=True, + backend_args=self.backend_args): + data_info = dict(img_path=osp.join(img_dir, img)) + if ann_dir is not None: + seg_map = img[:-_suffix_len] + self.seg_map_suffix + data_info['seg_map_path'] = osp.join(ann_dir, seg_map) + data_info['label_map'] = self.label_map + data_info['reduce_zero_label'] = self.reduce_zero_label + data_info['seg_fields'] = [] + data_list.append(data_info) + data_list = sorted(data_list, key=lambda x: x['img_path']) + return data_list + + +@DATASETS.register_module() +class BaseCDDataset(BaseDataset): + """Custom dataset for change detection. An example of file structure is as + followed. + + .. code-block:: none + + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ my_dataset + โ”‚ โ”‚ โ”œโ”€โ”€ img_dir + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + โ”‚ โ”‚ โ”œโ”€โ”€ img_dir2 + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{img_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{img_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{img_suffix} + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx{seg_map_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy{seg_map_suffix} + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ zzz{seg_map_suffix} + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + + The image names in img_dir and img_dir2 should be consistent. + The img/gt_semantic_seg pair of BaseSegDataset should be of the same + except suffix. A valid img/gt_semantic_seg filename pair should be like + ``xxx{img_suffix}`` and ``xxx{seg_map_suffix}`` (extension is also included + in the suffix). If split is given, then ``xxx`` is specified in txt file. + Otherwise, all files in ``img_dir/``and ``ann_dir`` will be loaded. + Please refer to ``docs/en/tutorials/new_dataset.md`` for more details. + + + Args: + ann_file (str): Annotation file path. Defaults to ''. + metainfo (dict, optional): Meta information for dataset, such as + specify classes to load. Defaults to None. + data_root (str, optional): The root directory for ``data_prefix`` and + ``ann_file``. Defaults to None. + data_prefix (dict, optional): Prefix for training data. Defaults to + dict(img_path=None, img_path2=None, seg_map_path=None). + img_suffix (str): Suffix of images. Default: '.jpg' + img_suffix2 (str): Suffix of images. Default: '.jpg' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + filter_cfg (dict, optional): Config for filter data. Defaults to None. + indices (int or Sequence[int], optional): Support using first few + data in annotation file to facilitate training/testing on a smaller + dataset. Defaults to None which means using all ``data_infos``. + serialize_data (bool, optional): Whether to hold memory using + serialized objects, when enabled, data loader workers can use + shared RAM from master process instead of making a copy. Defaults + to True. + pipeline (list, optional): Processing pipeline. Defaults to []. + test_mode (bool, optional): ``test_mode=True`` means in test phase. + Defaults to False. + lazy_init (bool, optional): Whether to load annotation during + instantiation. In some cases, such as visualization, only the meta + information of the dataset is needed, which is not necessary to + load annotation file. ``Basedataset`` can skip load annotations to + save time by set ``lazy_init=True``. Defaults to False. + max_refetch (int, optional): If ``Basedataset.prepare_data`` get a + None img. The maximum extra number of cycles to get a valid + image. Defaults to 1000. + ignore_index (int): The label index to be ignored. Default: 255 + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + METAINFO: dict = dict() + + def __init__(self, + ann_file: str = '', + img_suffix='.jpg', + img_suffix2='.jpg', + seg_map_suffix='.png', + metainfo: Optional[dict] = None, + data_root: Optional[str] = None, + data_prefix: dict = dict( + img_path='', img_path2='', seg_map_path=''), + filter_cfg: Optional[dict] = None, + indices: Optional[Union[int, Sequence[int]]] = None, + serialize_data: bool = True, + pipeline: List[Union[dict, Callable]] = [], + test_mode: bool = False, + lazy_init: bool = False, + max_refetch: int = 1000, + ignore_index: int = 255, + reduce_zero_label: bool = False, + backend_args: Optional[dict] = None) -> None: + + self.img_suffix = img_suffix + self.img_suffix2 = img_suffix2 + self.seg_map_suffix = seg_map_suffix + self.ignore_index = ignore_index + self.reduce_zero_label = reduce_zero_label + self.backend_args = backend_args.copy() if backend_args else None + + self.data_root = data_root + self.data_prefix = copy.copy(data_prefix) + self.ann_file = ann_file + self.filter_cfg = copy.deepcopy(filter_cfg) + self._indices = indices + self.serialize_data = serialize_data + self.test_mode = test_mode + self.max_refetch = max_refetch + self.data_list: List[dict] = [] + self.data_bytes: np.ndarray + + # Set meta information. + self._metainfo = self._load_metainfo(copy.deepcopy(metainfo)) + + # Get label map for custom classes + new_classes = self._metainfo.get('classes', None) + self.label_map = self.get_label_map(new_classes) + self._metainfo.update( + dict( + label_map=self.label_map, + reduce_zero_label=self.reduce_zero_label)) + + # Update palette based on label map or generate palette + # if it is not defined + updated_palette = self._update_palette() + self._metainfo.update(dict(palette=updated_palette)) + + # Join paths. + if self.data_root is not None: + self._join_prefix() + + # Build pipeline. + self.pipeline = Compose(pipeline) + # Full initialize the dataset. + if not lazy_init: + self.full_init() + + if test_mode: + assert self._metainfo.get('classes') is not None, \ + 'dataset metainfo `classes` should be specified when testing' + + @classmethod + def get_label_map(cls, + new_classes: Optional[Sequence] = None + ) -> Union[Dict, None]: + """Require label mapping. + + The ``label_map`` is a dictionary, its keys are the old label ids and + its values are the new label ids, and is used for changing pixel + labels in load_annotations. If and only if old classes in cls.METAINFO + is not equal to new classes in self._metainfo and nether of them is not + None, `label_map` is not None. + + Args: + new_classes (list, tuple, optional): The new classes name from + metainfo. Default to None. + + + Returns: + dict, optional: The mapping from old classes in cls.METAINFO to + new classes in self._metainfo + """ + old_classes = cls.METAINFO.get('classes', None) + if (new_classes is not None and old_classes is not None + and list(new_classes) != list(old_classes)): + + label_map = {} + if not set(new_classes).issubset(cls.METAINFO['classes']): + raise ValueError( + f'new classes {new_classes} is not a ' + f'subset of classes {old_classes} in METAINFO.') + for i, c in enumerate(old_classes): + if c not in new_classes: + label_map[i] = 255 + else: + label_map[i] = new_classes.index(c) + return label_map + else: + return None + + def _update_palette(self) -> list: + """Update palette after loading metainfo. + + If length of palette is equal to classes, just return the palette. + If palette is not defined, it will randomly generate a palette. + If classes is updated by customer, it will return the subset of + palette. + + Returns: + Sequence: Palette for current dataset. + """ + palette = self._metainfo.get('palette', []) + classes = self._metainfo.get('classes', []) + # palette does match classes + if len(palette) == len(classes): + return palette + + if len(palette) == 0: + # Get random state before set seed, and restore + # random state later. + # It will prevent loss of randomness, as the palette + # may be different in each iteration if not specified. + # See: https://github.com/open-mmlab/mmdetection/issues/5844 + state = np.random.get_state() + np.random.seed(42) + # random palette + new_palette = np.random.randint( + 0, 255, size=(len(classes), 3)).tolist() + np.random.set_state(state) + elif len(palette) >= len(classes) and self.label_map is not None: + new_palette = [] + # return subset of palette + for old_id, new_id in sorted( + self.label_map.items(), key=lambda x: x[1]): + if new_id != 255: + new_palette.append(palette[old_id]) + new_palette = type(palette)(new_palette) + else: + raise ValueError('palette does not match classes ' + f'as metainfo is {self._metainfo}.') + return new_palette + + def load_data_list(self) -> List[dict]: + """Load annotation from directory or annotation file. + + Returns: + list[dict]: All data info of dataset. + """ + data_list = [] + img_dir = self.data_prefix.get('img_path', None) + img_dir2 = self.data_prefix.get('img_path2', None) + ann_dir = self.data_prefix.get('seg_map_path', None) + if osp.isfile(self.ann_file): + lines = mmengine.list_from_file( + self.ann_file, backend_args=self.backend_args) + for line in lines: + img_name = line.strip() + if '.' in osp.basename(img_name): + img_name, img_ext = osp.splitext(img_name) + self.img_suffix = img_ext + self.img_suffix2 = img_ext + data_info = dict( + img_path=osp.join(img_dir, img_name + self.img_suffix), + img_path2=osp.join(img_dir2, img_name + self.img_suffix2)) + + if ann_dir is not None: + seg_map = img_name + self.seg_map_suffix + data_info['seg_map_path'] = osp.join(ann_dir, seg_map) + data_info['label_map'] = self.label_map + data_info['reduce_zero_label'] = self.reduce_zero_label + data_info['seg_fields'] = [] + data_list.append(data_info) + else: + for img in fileio.list_dir_or_file( + dir_path=img_dir, + list_dir=False, + suffix=self.img_suffix, + recursive=True, + backend_args=self.backend_args): + if '.' in osp.basename(img): + img, img_ext = osp.splitext(img) + self.img_suffix = img_ext + self.img_suffix2 = img_ext + data_info = dict( + img_path=osp.join(img_dir, img + self.img_suffix), + img_path2=osp.join(img_dir2, img + self.img_suffix2)) + if ann_dir is not None: + seg_map = img + self.seg_map_suffix + data_info['seg_map_path'] = osp.join(ann_dir, seg_map) + data_info['label_map'] = self.label_map + data_info['reduce_zero_label'] = self.reduce_zero_label + data_info['seg_fields'] = [] + data_list.append(data_info) + data_list = sorted(data_list, key=lambda x: x['img_path']) + return data_list diff --git a/mmsegmentation/mmseg/datasets/bdd100k.py b/mmsegmentation/mmseg/datasets/bdd100k.py new file mode 100644 index 0000000..8ae70b5 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/bdd100k.py @@ -0,0 +1,30 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +from mmseg.datasets.basesegdataset import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class BDD100KDataset(BaseSegDataset): + METAINFO = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', + 'sky', 'person', 'rider', 'car', 'truck', 'bus', 'train', + 'motorcycle', 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, + 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], + [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/mmseg/datasets/chase_db1.py b/mmsegmentation/mmseg/datasets/chase_db1.py new file mode 100644 index 0000000..626ddf7 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/chase_db1.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class ChaseDB1Dataset(BaseSegDataset): + """Chase_db1 dataset. + + In segmentation map annotation for Chase_db1, 0 stands for background, + which is included in 2 categories. ``reduce_zero_label`` is fixed to False. + The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_1stHO.png'. + """ + METAINFO = dict( + classes=('background', 'vessel'), + palette=[[120, 120, 120], [6, 230, 230]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='_1stHO.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/cityscapes.py b/mmsegmentation/mmseg/datasets/cityscapes.py new file mode 100644 index 0000000..f494d62 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/cityscapes.py @@ -0,0 +1,30 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class CityscapesDataset(BaseSegDataset): + """Cityscapes dataset. + + The ``img_suffix`` is fixed to '_leftImg8bit.png' and ``seg_map_suffix`` is + fixed to '_gtFine_labelTrainIds.png' for Cityscapes dataset. + """ + METAINFO = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', + 'sky', 'person', 'rider', 'car', 'truck', 'bus', 'train', + 'motorcycle', 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, + 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], + [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]]) + + def __init__(self, + img_suffix='_leftImg8bit.png', + seg_map_suffix='_gtFine_labelTrainIds.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/coco_stuff.py b/mmsegmentation/mmseg/datasets/coco_stuff.py new file mode 100644 index 0000000..1e1574d --- /dev/null +++ b/mmsegmentation/mmseg/datasets/coco_stuff.py @@ -0,0 +1,99 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class COCOStuffDataset(BaseSegDataset): + """COCO-Stuff dataset. + + In segmentation map annotation for COCO-Stuff, Train-IDs of the 10k version + are from 1 to 171, where 0 is the ignore index, and Train-ID of COCO Stuff + 164k is from 0 to 170, where 255 is the ignore index. So, they are all 171 + semantic categories. ``reduce_zero_label`` is set to True and False for the + 10k and 164k versions, respectively. The ``img_suffix`` is fixed to '.jpg', + and ``seg_map_suffix`` is fixed to '.png'. + """ + METAINFO = dict( + classes=( + 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', + 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', + 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', + 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', + 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', + 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', + 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', + 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', + 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', + 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', + 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', + 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', + 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', + 'scissors', 'teddy bear', 'hair drier', 'toothbrush', 'banner', + 'blanket', 'branch', 'bridge', 'building-other', 'bush', 'cabinet', + 'cage', 'cardboard', 'carpet', 'ceiling-other', 'ceiling-tile', + 'cloth', 'clothes', 'clouds', 'counter', 'cupboard', 'curtain', + 'desk-stuff', 'dirt', 'door-stuff', 'fence', 'floor-marble', + 'floor-other', 'floor-stone', 'floor-tile', 'floor-wood', 'flower', + 'fog', 'food-other', 'fruit', 'furniture-other', 'grass', 'gravel', + 'ground-other', 'hill', 'house', 'leaves', 'light', 'mat', 'metal', + 'mirror-stuff', 'moss', 'mountain', 'mud', 'napkin', 'net', + 'paper', 'pavement', 'pillow', 'plant-other', 'plastic', + 'platform', 'playingfield', 'railing', 'railroad', 'river', 'road', + 'rock', 'roof', 'rug', 'salad', 'sand', 'sea', 'shelf', + 'sky-other', 'skyscraper', 'snow', 'solid-other', 'stairs', + 'stone', 'straw', 'structural-other', 'table', 'tent', + 'textile-other', 'towel', 'tree', 'vegetable', 'wall-brick', + 'wall-concrete', 'wall-other', 'wall-panel', 'wall-stone', + 'wall-tile', 'wall-wood', 'water-other', 'waterdrops', + 'window-blind', 'window-other', 'wood'), + palette=[[0, 192, 64], [0, 192, 64], [0, 64, 96], [128, 192, 192], + [0, 64, 64], [0, 192, 224], [0, 192, 192], [128, 192, 64], + [0, 192, 96], [128, 192, 64], [128, 32, 192], [0, 0, 224], + [0, 0, 64], [0, 160, 192], [128, 0, 96], [128, 0, 192], + [0, 32, 192], [128, 128, 224], [0, 0, 192], [128, 160, 192], + [128, 128, 0], [128, 0, 32], [128, 32, 0], [128, 0, 128], + [64, 128, 32], [0, 160, 0], [0, 0, 0], [192, 128, 160], + [0, 32, 0], [0, 128, 128], [64, 128, 160], [128, 160, 0], + [0, 128, 0], [192, 128, 32], [128, 96, 128], [0, 0, 128], + [64, 0, 32], [0, 224, 128], [128, 0, 0], [192, 0, 160], + [0, 96, 128], [128, 128, 128], [64, 0, 160], [128, 224, 128], + [128, 128, 64], [192, 0, 32], [128, 96, 0], [128, 0, 192], + [0, 128, 32], [64, 224, 0], [0, 0, 64], [128, 128, 160], + [64, 96, 0], [0, 128, 192], [0, 128, 160], [192, 224, 0], + [0, 128, 64], [128, 128, 32], [192, 32, 128], [0, 64, 192], + [0, 0, 32], [64, 160, 128], [128, 64, 64], [128, 0, 160], + [64, 32, 128], [128, 192, 192], [0, 0, 160], [192, 160, 128], + [128, 192, 0], [128, 0, 96], [192, 32, 0], [128, 64, 128], + [64, 128, 96], [64, 160, 0], [0, 64, 0], [192, 128, 224], + [64, 32, 0], [0, 192, 128], [64, 128, 224], [192, 160, 0], + [0, 192, 0], [192, 128, 96], [192, 96, 128], [0, 64, 128], + [64, 0, 96], [64, 224, 128], [128, 64, 0], [192, 0, 224], + [64, 96, 128], [128, 192, 128], [64, 0, 224], [192, 224, 128], + [128, 192, 64], [192, 0, 96], [192, 96, 0], [128, 64, 192], + [0, 128, 96], [0, 224, 0], [64, 64, 64], [128, 128, 224], + [0, 96, 0], [64, 192, 192], [0, 128, 224], [128, 224, 0], + [64, 192, 64], [128, 128, 96], [128, 32, 128], [64, 0, 192], + [0, 64, 96], [0, 160, 128], [192, 0, 64], [128, 64, 224], + [0, 32, 128], [192, 128, 192], [0, 64, 224], [128, 160, 128], + [192, 128, 0], [128, 64, 32], [128, 32, 64], [192, 0, 128], + [64, 192, 32], [0, 160, 64], [64, 0, 0], [192, 192, 160], + [0, 32, 64], [64, 128, 128], [64, 192, 160], [128, 160, 64], + [64, 128, 0], [192, 192, 32], [128, 96, 192], [64, 0, 128], + [64, 64, 32], [0, 224, 192], [192, 0, 0], [192, 64, 160], + [0, 96, 192], [192, 128, 128], [64, 64, 160], [128, 224, 192], + [192, 128, 64], [192, 64, 32], [128, 96, 64], [192, 0, 192], + [0, 192, 32], [64, 224, 64], [64, 0, 64], [128, 192, 160], + [64, 96, 64], [64, 128, 192], [0, 192, 160], [192, 224, 64], + [64, 128, 64], [128, 192, 32], [192, 32, 192], [64, 64, 192], + [0, 64, 32], [64, 160, 192], [192, 64, 64], [128, 64, 160], + [64, 32, 192], [192, 192, 192], [0, 64, 160], [192, 160, 192], + [192, 192, 0], [128, 64, 96], [192, 32, 64], [192, 64, 128], + [64, 192, 96], [64, 160, 64], [64, 64, 0]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='_labelTrainIds.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/dark_zurich.py b/mmsegmentation/mmseg/datasets/dark_zurich.py new file mode 100644 index 0000000..9b5393f --- /dev/null +++ b/mmsegmentation/mmseg/datasets/dark_zurich.py @@ -0,0 +1,15 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .cityscapes import CityscapesDataset + + +@DATASETS.register_module() +class DarkZurichDataset(CityscapesDataset): + """DarkZurichDataset dataset.""" + + def __init__(self, + img_suffix='_rgb_anon.png', + seg_map_suffix='_gt_labelTrainIds.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/dataset_wrappers.py b/mmsegmentation/mmseg/datasets/dataset_wrappers.py new file mode 100644 index 0000000..082c116 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/dataset_wrappers.py @@ -0,0 +1,136 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import collections +import copy +from typing import List, Optional, Sequence, Union + +from mmengine.dataset import ConcatDataset, force_full_init + +from mmseg.registry import DATASETS, TRANSFORMS + + +@DATASETS.register_module() +class MultiImageMixDataset: + """A wrapper of multiple images mixed dataset. + + Suitable for training on multiple images mixed data augmentation like + mosaic and mixup. + + Args: + dataset (ConcatDataset or dict): The dataset to be mixed. + pipeline (Sequence[dict]): Sequence of transform object or + config dict to be composed. + skip_type_keys (list[str], optional): Sequence of type string to + be skip pipeline. Default to None. + """ + + def __init__(self, + dataset: Union[ConcatDataset, dict], + pipeline: Sequence[dict], + skip_type_keys: Optional[List[str]] = None, + lazy_init: bool = False) -> None: + assert isinstance(pipeline, collections.abc.Sequence) + + if isinstance(dataset, dict): + self.dataset = DATASETS.build(dataset) + elif isinstance(dataset, ConcatDataset): + self.dataset = dataset + else: + raise TypeError( + 'elements in datasets sequence should be config or ' + f'`ConcatDataset` instance, but got {type(dataset)}') + + if skip_type_keys is not None: + assert all([ + isinstance(skip_type_key, str) + for skip_type_key in skip_type_keys + ]) + self._skip_type_keys = skip_type_keys + + self.pipeline = [] + self.pipeline_types = [] + for transform in pipeline: + if isinstance(transform, dict): + self.pipeline_types.append(transform['type']) + transform = TRANSFORMS.build(transform) + self.pipeline.append(transform) + else: + raise TypeError('pipeline must be a dict') + + self._metainfo = self.dataset.metainfo + self.num_samples = len(self.dataset) + + self._fully_initialized = False + if not lazy_init: + self.full_init() + + @property + def metainfo(self) -> dict: + """Get the meta information of the multi-image-mixed dataset. + + Returns: + dict: The meta information of multi-image-mixed dataset. + """ + return copy.deepcopy(self._metainfo) + + def full_init(self): + """Loop to ``full_init`` each dataset.""" + if self._fully_initialized: + return + + self.dataset.full_init() + self._ori_len = len(self.dataset) + self._fully_initialized = True + + @force_full_init + def get_data_info(self, idx: int) -> dict: + """Get annotation by index. + + Args: + idx (int): Global index of ``ConcatDataset``. + + Returns: + dict: The idx-th annotation of the datasets. + """ + return self.dataset.get_data_info(idx) + + @force_full_init + def __len__(self): + return self.num_samples + + def __getitem__(self, idx): + results = copy.deepcopy(self.dataset[idx]) + for (transform, transform_type) in zip(self.pipeline, + self.pipeline_types): + if self._skip_type_keys is not None and \ + transform_type in self._skip_type_keys: + continue + + if hasattr(transform, 'get_indices'): + indices = transform.get_indices(self.dataset) + if not isinstance(indices, collections.abc.Sequence): + indices = [indices] + mix_results = [ + copy.deepcopy(self.dataset[index]) for index in indices + ] + results['mix_results'] = mix_results + + results = transform(results) + + if 'mix_results' in results: + results.pop('mix_results') + + return results + + def update_skip_type_keys(self, skip_type_keys): + """Update skip_type_keys. + + It is called by an external hook. + + Args: + skip_type_keys (list[str], optional): Sequence of type + string to be skip pipeline. + """ + assert all([ + isinstance(skip_type_key, str) for skip_type_key in skip_type_keys + ]) + self._skip_type_keys = skip_type_keys diff --git a/mmsegmentation/mmseg/datasets/decathlon.py b/mmsegmentation/mmseg/datasets/decathlon.py new file mode 100644 index 0000000..26aa4ef --- /dev/null +++ b/mmsegmentation/mmseg/datasets/decathlon.py @@ -0,0 +1,96 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import os.path as osp +from typing import List + +from mmengine.fileio import load + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class DecathlonDataset(BaseSegDataset): + """Dataset for Dacathlon dataset. + + The dataset.json format is shown as follows + + .. code-block:: none + + { + "name": "BRATS", + "tensorImageSize": "4D", + "modality": + { + "0": "FLAIR", + "1": "T1w", + "2": "t1gd", + "3": "T2w" + }, + "labels": { + "0": "background", + "1": "edema", + "2": "non-enhancing tumor", + "3": "enhancing tumour" + }, + "numTraining": 484, + "numTest": 266, + "training": + [ + { + "image": "./imagesTr/BRATS_306.nii.gz" + "label": "./labelsTr/BRATS_306.nii.gz" + ... + } + ] + "test": + [ + "./imagesTs/BRATS_557.nii.gz" + ... + ] + } + """ + + def load_data_list(self) -> List[dict]: + """Load annotation from directory or annotation file. + + Returns: + list[dict]: All data info of dataset. + """ + # `self.ann_file` denotes the absolute annotation file path if + # `self.root=None` or relative path if `self.root=/path/to/data/`. + annotations = load(self.ann_file) + if not isinstance(annotations, dict): + raise TypeError(f'The annotations loaded from annotation file ' + f'should be a dict, but got {type(annotations)}!') + raw_data_list = annotations[ + 'training'] if not self.test_mode else annotations['test'] + data_list = [] + for raw_data_info in raw_data_list: + # `2:` works for removing './' in file path, which will break + # loading from cloud storage. + if isinstance(raw_data_info, dict): + data_info = dict( + img_path=osp.join(self.data_root, raw_data_info['image'] + [2:])) + data_info['seg_map_path'] = osp.join( + self.data_root, raw_data_info['label'][2:]) + else: + data_info = dict( + img_path=osp.join(self.data_root, raw_data_info)[2:]) + data_info['label_map'] = self.label_map + data_info['reduce_zero_label'] = self.reduce_zero_label + data_info['seg_fields'] = [] + data_list.append(data_info) + annotations.pop('training') + annotations.pop('test') + + metainfo = copy.deepcopy(annotations) + metainfo['classes'] = [*metainfo['labels'].values()] + # Meta information load from annotation file will not influence the + # existed meta information load from `BaseDataset.METAINFO` and + # `metainfo` arguments defined in constructor. + for k, v in metainfo.items(): + self._metainfo.setdefault(k, v) + + return data_list diff --git a/mmsegmentation/mmseg/datasets/drive.py b/mmsegmentation/mmseg/datasets/drive.py new file mode 100644 index 0000000..76c0160 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/drive.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class DRIVEDataset(BaseSegDataset): + """DRIVE dataset. + + In segmentation map annotation for DRIVE, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_manual1.png'. + """ + METAINFO = dict( + classes=('background', 'vessel'), + palette=[[120, 120, 120], [6, 230, 230]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='_manual1.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/dsdl.py b/mmsegmentation/mmseg/datasets/dsdl.py new file mode 100644 index 0000000..bf7e4e6 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/dsdl.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +from typing import Dict, List, Optional, Sequence, Union + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + +try: + from dsdl.dataset import DSDLDataset +except ImportError: + DSDLDataset = None + + +@DATASETS.register_module() +class DSDLSegDataset(BaseSegDataset): + """Dataset for dsdl segmentation. + + Args: + specific_key_path(dict): Path of specific key which can not + be loaded by it's field name. + pre_transform(dict): pre-transform functions before loading. + used_labels(sequence): list of actual used classes in train steps, + this must be subset of class domain. + """ + + METAINFO = {} + + def __init__(self, + specific_key_path: Dict = {}, + pre_transform: Dict = {}, + used_labels: Optional[Sequence] = None, + **kwargs) -> None: + + if DSDLDataset is None: + raise RuntimeError( + 'Package dsdl is not installed. Please run "pip install dsdl".' + ) + self.used_labels = used_labels + + loc_config = dict(type='LocalFileReader', working_dir='') + if kwargs.get('data_root'): + kwargs['ann_file'] = os.path.join(kwargs['data_root'], + kwargs['ann_file']) + required_fields = ['Image', 'LabelMap'] + + self.dsdldataset = DSDLDataset( + dsdl_yaml=kwargs['ann_file'], + location_config=loc_config, + required_fields=required_fields, + specific_key_path=specific_key_path, + transform=pre_transform, + ) + BaseSegDataset.__init__(self, **kwargs) + + def load_data_list(self) -> List[Dict]: + """Load data info from a dsdl yaml file named as ``self.ann_file`` + + Returns: + List[dict]: A list of data list. + """ + + if self.used_labels: + self._metainfo['classes'] = tuple(self.used_labels) + self.label_map = self.get_label_map(self.used_labels) + else: + self._metainfo['classes'] = tuple(['background'] + + self.dsdldataset.class_names) + data_list = [] + + for i, data in enumerate(self.dsdldataset): + datainfo = dict( + img_path=os.path.join(self.data_prefix['img_path'], + data['Image'][0].location), + seg_map_path=os.path.join(self.data_prefix['seg_map_path'], + data['LabelMap'][0].location), + label_map=self.label_map, + reduce_zero_label=self.reduce_zero_label, + seg_fields=[], + ) + data_list.append(datainfo) + + return data_list + + def get_label_map(self, + new_classes: Optional[Sequence] = None + ) -> Union[Dict, None]: + """Require label mapping. + + The ``label_map`` is a dictionary, its keys are the old label ids and + its values are the new label ids, and is used for changing pixel + labels in load_annotations. If and only if old classes in class_dom + is not equal to new classes in args and nether of them is not + None, `label_map` is not None. + Args: + new_classes (list, tuple, optional): The new classes name from + metainfo. Default to None. + Returns: + dict, optional: The mapping from old classes to new classes. + """ + old_classes = ['background'] + self.dsdldataset.class_names + if (new_classes is not None and old_classes is not None + and list(new_classes) != list(old_classes)): + + label_map = {} + if not set(new_classes).issubset(old_classes): + raise ValueError( + f'new classes {new_classes} is not a ' + f'subset of classes {old_classes} in class_dom.') + for i, c in enumerate(old_classes): + if c not in new_classes: + label_map[i] = 255 + else: + label_map[i] = new_classes.index(c) + return label_map + else: + return None diff --git a/mmsegmentation/mmseg/datasets/hrf.py b/mmsegmentation/mmseg/datasets/hrf.py new file mode 100644 index 0000000..fd669cc --- /dev/null +++ b/mmsegmentation/mmseg/datasets/hrf.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class HRFDataset(BaseSegDataset): + """HRF dataset. + + In segmentation map annotation for HRF, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.png'. + """ + METAINFO = dict( + classes=('background', 'vessel'), + palette=[[120, 120, 120], [6, 230, 230]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/hsi_drive.py b/mmsegmentation/mmseg/datasets/hsi_drive.py new file mode 100644 index 0000000..3d46a86 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/hsi_drive.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + +classes_exp = ('unlabelled', 'road', 'road marks', 'vegetation', + 'painted metal', 'sky', 'concrete', 'pedestrian', 'water', + 'unpainted metal', 'glass') +palette_exp = [[0, 0, 0], [77, 77, 77], [255, 255, 255], [0, 255, 0], + [255, 0, 0], [0, 0, 255], [102, 51, 0], [255, 255, 0], + [0, 207, 250], [255, 166, 0], [0, 204, 204]] + + +@DATASETS.register_module() +class HSIDrive20Dataset(BaseSegDataset): + """HSI-Drive v2.0 (https://ieeexplore.ieee.org/document/10371793), the + updated version of HSI-Drive + (https://ieeexplore.ieee.org/document/9575298), is a structured dataset for + the research and development of automated driving systems (ADS) supported + by hyperspectral imaging (HSI). It contains per-pixel manually annotated + images selected from videos recorded in real driving conditions and has + been organized according to four parameters: season, daytime, road type, + and weather conditions. + + The video sequences have been captured with a small-size 25-band VNIR + (Visible-NearlnfraRed) snapshot hyperspectral camera mounted on a driving + automobile. As a consequence, you need to modify the in_channels parameter + of your model from 3 (RGB images) to 25 (HSI images) as it is done in + configs/unet/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py + + Apart from the abovementioned articles, additional information is provided + in the website (https://ipaccess.ehu.eus/HSI-Drive/) from where you can + download the dataset and also visualize some examples of segmented videos. + """ + + METAINFO = dict(classes=classes_exp, palette=palette_exp) + + def __init__(self, + img_suffix='.npy', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/isaid.py b/mmsegmentation/mmseg/datasets/isaid.py new file mode 100644 index 0000000..61942ec --- /dev/null +++ b/mmsegmentation/mmseg/datasets/isaid.py @@ -0,0 +1,39 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class iSAIDDataset(BaseSegDataset): + """ iSAID: A Large-scale Dataset for Instance Segmentation in Aerial Images + In segmentation map annotation for iSAID dataset, which is included + in 16 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_manual1.png'. + """ + + METAINFO = dict( + classes=('background', 'ship', 'store_tank', 'baseball_diamond', + 'tennis_court', 'basketball_court', 'Ground_Track_Field', + 'Bridge', 'Large_Vehicle', 'Small_Vehicle', 'Helicopter', + 'Swimming_pool', 'Roundabout', 'Soccer_ball_field', 'plane', + 'Harbor'), + palette=[[0, 0, 0], [0, 0, 63], [0, 63, 63], [0, 63, 0], [0, 63, 127], + [0, 63, 191], [0, 63, 255], [0, 127, 63], [0, 127, 127], + [0, 0, 127], [0, 0, 191], [0, 0, 255], [0, 191, 127], + [0, 127, 191], [0, 127, 255], [0, 100, 155]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='_instance_color_RGB.png', + ignore_index=255, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + ignore_index=ignore_index, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/isprs.py b/mmsegmentation/mmseg/datasets/isprs.py new file mode 100644 index 0000000..30af53c --- /dev/null +++ b/mmsegmentation/mmseg/datasets/isprs.py @@ -0,0 +1,29 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class ISPRSDataset(BaseSegDataset): + """ISPRS dataset. + + In segmentation map annotation for ISPRS, 0 is the ignore index. + ``reduce_zero_label`` should be set to True. The ``img_suffix`` and + ``seg_map_suffix`` are both fixed to '.png'. + """ + METAINFO = dict( + classes=('impervious_surface', 'building', 'low_vegetation', 'tree', + 'car', 'clutter'), + palette=[[255, 255, 255], [0, 0, 255], [0, 255, 255], [0, 255, 0], + [255, 255, 0], [255, 0, 0]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/mmseg/datasets/levir.py b/mmsegmentation/mmseg/datasets/levir.py new file mode 100644 index 0000000..f467481 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/levir.py @@ -0,0 +1,31 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +from mmseg.registry import DATASETS +from .basesegdataset import BaseCDDataset + + +@DATASETS.register_module() +class LEVIRCDDataset(BaseCDDataset): + """ISPRS dataset. + + In segmentation map annotation for ISPRS, 0 is to ignore index. + ``reduce_zero_label`` should be set to True. The ``img_suffix`` and + ``seg_map_suffix`` are both fixed to '.png'. + """ + + METAINFO = dict( + classes=('background', 'changed'), + palette=[[0, 0, 0], [255, 255, 255]]) + + def __init__(self, + img_suffix='.png', + img_suffix2='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + img_suffix2=img_suffix2, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/mmseg/datasets/lip.py b/mmsegmentation/mmseg/datasets/lip.py new file mode 100644 index 0000000..3a32a19 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/lip.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class LIPDataset(BaseSegDataset): + """LIP dataset. + + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is fixed to + '.png'. + """ + METAINFO = dict( + classes=('Background', 'Hat', 'Hair', 'Glove', 'Sunglasses', + 'UpperClothes', 'Dress', 'Coat', 'Socks', 'Pants', + 'Jumpsuits', 'Scarf', 'Skirt', 'Face', 'Left-arm', + 'Right-arm', 'Left-leg', 'Right-leg', 'Left-shoe', + 'Right-shoe'), + palette=( + [0, 0, 0], + [128, 0, 0], + [255, 0, 0], + [0, 85, 0], + [170, 0, 51], + [255, 85, 0], + [0, 0, 85], + [0, 119, 221], + [85, 85, 0], + [0, 85, 85], + [85, 51, 0], + [52, 86, 128], + [0, 128, 0], + [0, 0, 255], + [51, 170, 221], + [0, 255, 255], + [85, 255, 170], + [170, 255, 85], + [255, 255, 0], + [255, 170, 0], + )) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/loveda.py b/mmsegmentation/mmseg/datasets/loveda.py new file mode 100644 index 0000000..5c16db5 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/loveda.py @@ -0,0 +1,29 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class LoveDADataset(BaseSegDataset): + """LoveDA dataset. + + In segmentation map annotation for LoveDA, 0 is the ignore index. + ``reduce_zero_label`` should be set to True. The ``img_suffix`` and + ``seg_map_suffix`` are both fixed to '.png'. + """ + METAINFO = dict( + classes=('background', 'building', 'road', 'water', 'barren', 'forest', + 'agricultural'), + palette=[[255, 255, 255], [255, 0, 0], [255, 255, 0], [0, 0, 255], + [159, 129, 183], [0, 255, 0], [255, 195, 128]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/mmseg/datasets/mapillary.py b/mmsegmentation/mmseg/datasets/mapillary.py new file mode 100644 index 0000000..6c29473 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/mapillary.py @@ -0,0 +1,176 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class MapillaryDataset_v1(BaseSegDataset): + """Mapillary Vistas Dataset. + + Dataset paper link: + http://ieeexplore.ieee.org/document/8237796/ + + v1.2 contain 66 object classes. + (37 instance-specific) + + v2.0 contain 124 object classes. + (70 instance-specific, 46 stuff, 8 void or crowd). + + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png' for Mapillary Vistas Dataset. + """ + METAINFO = dict( + classes=('Bird', 'Ground Animal', 'Curb', 'Fence', 'Guard Rail', + 'Barrier', 'Wall', 'Bike Lane', 'Crosswalk - Plain', + 'Curb Cut', 'Parking', 'Pedestrian Area', 'Rail Track', + 'Road', 'Service Lane', 'Sidewalk', 'Bridge', 'Building', + 'Tunnel', 'Person', 'Bicyclist', 'Motorcyclist', + 'Other Rider', 'Lane Marking - Crosswalk', + 'Lane Marking - General', 'Mountain', 'Sand', 'Sky', 'Snow', + 'Terrain', 'Vegetation', 'Water', 'Banner', 'Bench', + 'Bike Rack', 'Billboard', 'Catch Basin', 'CCTV Camera', + 'Fire Hydrant', 'Junction Box', 'Mailbox', 'Manhole', + 'Phone Booth', 'Pothole', 'Street Light', 'Pole', + 'Traffic Sign Frame', 'Utility Pole', 'Traffic Light', + 'Traffic Sign (Back)', 'Traffic Sign (Front)', 'Trash Can', + 'Bicycle', 'Boat', 'Bus', 'Car', 'Caravan', 'Motorcycle', + 'On Rails', 'Other Vehicle', 'Trailer', 'Truck', + 'Wheeled Slow', 'Car Mount', 'Ego Vehicle', 'Unlabeled'), + palette=[[165, 42, 42], [0, 192, 0], [196, 196, 196], [190, 153, 153], + [180, 165, 180], [90, 120, 150], [102, 102, 156], + [128, 64, 255], [140, 140, 200], [170, 170, 170], + [250, 170, 160], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], + [244, 35, 232], [150, 100, 100], [70, 70, 70], [150, 120, 90], + [220, 20, 60], [255, 0, 0], [255, 0, 100], [255, 0, 200], + [200, 128, 128], [255, 255, 255], [64, 170, + 64], [230, 160, 50], + [70, 130, 180], [190, 255, 255], [152, 251, 152], + [107, 142, 35], [0, 170, 30], [255, 255, 128], [250, 0, 30], + [100, 140, 180], [220, 220, 220], [220, 128, 128], + [222, 40, 40], [100, 170, 30], [40, 40, 40], [33, 33, 33], + [100, 128, 160], [142, 0, 0], [70, 100, 150], [210, 170, 100], + [153, 153, 153], [128, 128, 128], [0, 0, 80], [250, 170, 30], + [192, 192, 192], [220, 220, 0], [140, 140, 20], [119, 11, 32], + [150, 0, 255], [0, 60, 100], [0, 0, 142], [0, 0, 90], + [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 192], [32, 32, 32], [120, 10, + 10], [0, 0, 0]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) + + +@DATASETS.register_module() +class MapillaryDataset_v2(BaseSegDataset): + """Mapillary Vistas Dataset. + + Dataset paper link: + http://ieeexplore.ieee.org/document/8237796/ + + v1.2 contain 66 object classes. + (37 instance-specific) + + v2.0 contain 124 object classes. + (70 instance-specific, 46 stuff, 8 void or crowd). + + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png' for Mapillary Vistas Dataset. + """ + METAINFO = dict( + classes=( + 'Bird', 'Ground Animal', 'Ambiguous Barrier', 'Concrete Block', + 'Curb', 'Fence', 'Guard Rail', 'Barrier', 'Road Median', + 'Road Side', 'Lane Separator', 'Temporary Barrier', 'Wall', + 'Bike Lane', 'Crosswalk - Plain', 'Curb Cut', 'Driveway', + 'Parking', 'Parking Aisle', 'Pedestrian Area', 'Rail Track', + 'Road', 'Road Shoulder', 'Service Lane', 'Sidewalk', + 'Traffic Island', 'Bridge', 'Building', 'Garage', 'Tunnel', + 'Person', 'Person Group', 'Bicyclist', 'Motorcyclist', + 'Other Rider', 'Lane Marking - Dashed Line', + 'Lane Marking - Straight Line', 'Lane Marking - Zigzag Line', + 'Lane Marking - Ambiguous', 'Lane Marking - Arrow (Left)', + 'Lane Marking - Arrow (Other)', 'Lane Marking - Arrow (Right)', + 'Lane Marking - Arrow (Split Left or Straight)', + 'Lane Marking - Arrow (Split Right or Straight)', + 'Lane Marking - Arrow (Straight)', 'Lane Marking - Crosswalk', + 'Lane Marking - Give Way (Row)', + 'Lane Marking - Give Way (Single)', + 'Lane Marking - Hatched (Chevron)', + 'Lane Marking - Hatched (Diagonal)', 'Lane Marking - Other', + 'Lane Marking - Stop Line', 'Lane Marking - Symbol (Bicycle)', + 'Lane Marking - Symbol (Other)', 'Lane Marking - Text', + 'Lane Marking (only) - Dashed Line', + 'Lane Marking (only) - Crosswalk', 'Lane Marking (only) - Other', + 'Lane Marking (only) - Test', 'Mountain', 'Sand', 'Sky', 'Snow', + 'Terrain', 'Vegetation', 'Water', 'Banner', 'Bench', 'Bike Rack', + 'Catch Basin', 'CCTV Camera', 'Fire Hydrant', 'Junction Box', + 'Mailbox', 'Manhole', 'Parking Meter', 'Phone Booth', 'Pothole', + 'Signage - Advertisement', 'Signage - Ambiguous', 'Signage - Back', + 'Signage - Information', 'Signage - Other', 'Signage - Store', + 'Street Light', 'Pole', 'Pole Group', 'Traffic Sign Frame', + 'Utility Pole', 'Traffic Cone', 'Traffic Light - General (Single)', + 'Traffic Light - Pedestrians', 'Traffic Light - General (Upright)', + 'Traffic Light - General (Horizontal)', 'Traffic Light - Cyclists', + 'Traffic Light - Other', 'Traffic Sign - Ambiguous', + 'Traffic Sign (Back)', 'Traffic Sign - Direction (Back)', + 'Traffic Sign - Direction (Front)', 'Traffic Sign (Front)', + 'Traffic Sign - Parking', 'Traffic Sign - Temporary (Back)', + 'Traffic Sign - Temporary (Front)', 'Trash Can', 'Bicycle', 'Boat', + 'Bus', 'Car', 'Caravan', 'Motorcycle', 'On Rails', 'Other Vehicle', + 'Trailer', 'Truck', 'Vehicle Group', 'Wheeled Slow', 'Water Valve', + 'Car Mount', 'Dynamic', 'Ego Vehicle', 'Ground', 'Static', + 'Unlabeled'), + palette=[[165, 42, 42], [0, 192, 0], [250, 170, 31], [250, 170, 32], + [196, 196, 196], [190, 153, 153], [180, 165, 180], + [90, 120, 150], [250, 170, 33], [250, 170, 34], + [128, 128, 128], [250, 170, 35], [102, 102, 156], + [128, 64, 255], [140, 140, 200], [170, 170, 170], + [250, 170, 36], [250, 170, 160], [250, 170, 37], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], + [110, 110, 110], [244, 35, 232], [128, 196, + 128], [150, 100, 100], + [70, 70, 70], [150, 150, 150], [150, 120, 90], [220, 20, 60], + [220, 20, 60], [255, 0, 0], [255, 0, 100], [255, 0, 200], + [255, 255, 255], [255, 255, 255], [250, 170, 29], + [250, 170, 28], [250, 170, 26], [250, 170, + 25], [250, 170, 24], + [250, 170, 22], [250, 170, 21], [250, 170, + 20], [255, 255, 255], + [250, 170, 19], [250, 170, 18], [250, 170, + 12], [250, 170, 11], + [255, 255, 255], [255, 255, 255], [250, 170, 16], + [250, 170, 15], [250, 170, 15], [255, 255, 255], + [255, 255, 255], [255, 255, 255], [255, 255, 255], + [64, 170, 64], [230, 160, 50], + [70, 130, 180], [190, 255, 255], [152, 251, 152], + [107, 142, 35], [0, 170, 30], [255, 255, 128], [250, 0, 30], + [100, 140, 180], [220, 128, 128], [222, 40, + 40], [100, 170, 30], + [40, 40, 40], [33, 33, 33], [100, 128, 160], [20, 20, 255], + [142, 0, 0], [70, 100, 150], [250, 171, 30], [250, 172, 30], + [250, 173, 30], [250, 174, 30], [250, 175, + 30], [250, 176, 30], + [210, 170, 100], [153, 153, 153], [153, 153, 153], + [128, 128, 128], [0, 0, 80], [210, 60, 60], [250, 170, 30], + [250, 170, 30], [250, 170, 30], [250, 170, + 30], [250, 170, 30], + [250, 170, 30], [192, 192, 192], [192, 192, 192], + [192, 192, 192], [220, 220, 0], [220, 220, 0], [0, 0, 196], + [192, 192, 192], [220, 220, 0], [140, 140, 20], [119, 11, 32], + [150, 0, 255], [0, 60, 100], [0, 0, 142], [0, 0, 90], + [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 142], [0, 0, 192], [170, 170, 170], + [32, 32, 32], [111, 74, 0], [120, 10, 10], [81, 0, 81], + [111, 111, 0], [0, 0, 0]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/night_driving.py b/mmsegmentation/mmseg/datasets/night_driving.py new file mode 100644 index 0000000..3ead91e --- /dev/null +++ b/mmsegmentation/mmseg/datasets/night_driving.py @@ -0,0 +1,15 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .cityscapes import CityscapesDataset + + +@DATASETS.register_module() +class NightDrivingDataset(CityscapesDataset): + """NightDrivingDataset dataset.""" + + def __init__(self, + img_suffix='_leftImg8bit.png', + seg_map_suffix='_gtCoarse_labelTrainIds.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/nyu.py b/mmsegmentation/mmseg/datasets/nyu.py new file mode 100644 index 0000000..fcfda46 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/nyu.py @@ -0,0 +1,123 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from typing import List + +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class NYUDataset(BaseSegDataset): + """NYU depth estimation dataset. The file structure should be. + + .. code-block:: none + + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ nyu + โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ scene_xxx.jpg + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”œโ”€โ”€ annotations + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ scene_xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + + Args: + ann_file (str): Annotation file path. Defaults to ''. + metainfo (dict, optional): Meta information for dataset, such as + specify classes to load. Defaults to None. + data_root (str, optional): The root directory for ``data_prefix`` and + ``ann_file``. Defaults to None. + data_prefix (dict, optional): Prefix for training data. Defaults to + dict(img_path='images', depth_map_path='annotations'). + img_suffix (str): Suffix of images. Default: '.jpg' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + filter_cfg (dict, optional): Config for filter data. Defaults to None. + indices (int or Sequence[int], optional): Support using first few + data in annotation file to facilitate training/testing on a smaller + dataset. Defaults to None which means using all ``data_infos``. + serialize_data (bool, optional): Whether to hold memory using + serialized objects, when enabled, data loader workers can use + shared RAM from master process instead of making a copy. Defaults + to True. + pipeline (list, optional): Processing pipeline. Defaults to []. + test_mode (bool, optional): ``test_mode=True`` means in test phase. + Defaults to False. + lazy_init (bool, optional): Whether to load annotation during + instantiation. In some cases, such as visualization, only the meta + information of the dataset is needed, which is not necessary to + load annotation file. ``Basedataset`` can skip load annotations to + save time by set ``lazy_init=True``. Defaults to False. + max_refetch (int, optional): If ``Basedataset.prepare_data`` get a + None img. The maximum extra number of cycles to get a valid + image. Defaults to 1000. + ignore_index (int): The label index to be ignored. Default: 255 + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + METAINFO = dict( + classes=('printer_room', 'bathroom', 'living_room', 'study', + 'conference_room', 'study_room', 'kitchen', 'home_office', + 'bedroom', 'dinette', 'playroom', 'indoor_balcony', + 'laundry_room', 'basement', 'excercise_room', 'foyer', + 'home_storage', 'cafe', 'furniture_store', 'office_kitchen', + 'student_lounge', 'dining_room', 'reception_room', + 'computer_lab', 'classroom', 'office', 'bookstore')) + + def __init__(self, + data_prefix=dict( + img_path='images', depth_map_path='annotations'), + img_suffix='.jpg', + depth_map_suffix='.png', + **kwargs) -> None: + super().__init__( + data_prefix=data_prefix, + img_suffix=img_suffix, + seg_map_suffix=depth_map_suffix, + **kwargs) + + def _get_category_id_from_filename(self, image_fname: str) -> int: + """Retrieve the category ID from the given image filename.""" + image_fname = osp.basename(image_fname) + position = image_fname.find(next(filter(str.isdigit, image_fname)), 0) + categoty_name = image_fname[:position - 1] + if categoty_name not in self._metainfo['classes']: + return -1 + else: + return self._metainfo['classes'].index(categoty_name) + + def load_data_list(self) -> List[dict]: + """Load annotation from directory or annotation file. + + Returns: + list[dict]: All data info of dataset. + """ + data_list = [] + img_dir = self.data_prefix.get('img_path', None) + ann_dir = self.data_prefix.get('depth_map_path', None) + + _suffix_len = len(self.img_suffix) + for img in fileio.list_dir_or_file( + dir_path=img_dir, + list_dir=False, + suffix=self.img_suffix, + recursive=True, + backend_args=self.backend_args): + data_info = dict(img_path=osp.join(img_dir, img)) + if ann_dir is not None: + depth_map = img[:-_suffix_len] + self.seg_map_suffix + data_info['depth_map_path'] = osp.join(ann_dir, depth_map) + data_info['seg_fields'] = [] + data_info['category_id'] = self._get_category_id_from_filename(img) + data_list.append(data_info) + data_list = sorted(data_list, key=lambda x: x['img_path']) + return data_list diff --git a/mmsegmentation/mmseg/datasets/pascal_context.py b/mmsegmentation/mmseg/datasets/pascal_context.py new file mode 100644 index 0000000..82d00a9 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/pascal_context.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class PascalContextDataset(BaseSegDataset): + """PascalContext dataset. + + In segmentation map annotation for PascalContext, 0 stands for background, + which is included in 60 categories. ``reduce_zero_label`` is fixed to + False. The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png'. + + Args: + ann_file (str): Annotation file path. + """ + + METAINFO = dict( + classes=('background', 'aeroplane', 'bag', 'bed', 'bedclothes', + 'bench', 'bicycle', 'bird', 'boat', 'book', 'bottle', + 'building', 'bus', 'cabinet', 'car', 'cat', 'ceiling', + 'chair', 'cloth', 'computer', 'cow', 'cup', 'curtain', 'dog', + 'door', 'fence', 'floor', 'flower', 'food', 'grass', 'ground', + 'horse', 'keyboard', 'light', 'motorbike', 'mountain', + 'mouse', 'person', 'plate', 'platform', 'pottedplant', 'road', + 'rock', 'sheep', 'shelves', 'sidewalk', 'sign', 'sky', 'snow', + 'sofa', 'table', 'track', 'train', 'tree', 'truck', + 'tvmonitor', 'wall', 'water', 'window', 'wood'), + palette=[[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255]]) + + def __init__(self, + ann_file='', + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + ann_file=ann_file, + reduce_zero_label=reduce_zero_label, + **kwargs) + assert fileio.exists(self.data_prefix['img_path'], self.backend_args) + + +@DATASETS.register_module() +class PascalContextDataset59(BaseSegDataset): + """PascalContext dataset. + + In segmentation map annotation for PascalContext, 0 stands for background, + which is included in 60 categories. ``reduce_zero_label`` is fixed to + True. The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png'. + Noted: If the background is 255 and the ids of categories are from 0 to 58, + ``reduce_zero_label`` needs to be set to False. + + Args: + ann_file (str): Annotation file path. + """ + METAINFO = dict( + classes=('aeroplane', 'bag', 'bed', 'bedclothes', 'bench', 'bicycle', + 'bird', 'boat', 'book', 'bottle', 'building', 'bus', + 'cabinet', 'car', 'cat', 'ceiling', 'chair', 'cloth', + 'computer', 'cow', 'cup', 'curtain', 'dog', 'door', 'fence', + 'floor', 'flower', 'food', 'grass', 'ground', 'horse', + 'keyboard', 'light', 'motorbike', 'mountain', 'mouse', + 'person', 'plate', 'platform', 'pottedplant', 'road', 'rock', + 'sheep', 'shelves', 'sidewalk', 'sign', 'sky', 'snow', 'sofa', + 'table', 'track', 'train', 'tree', 'truck', 'tvmonitor', + 'wall', 'water', 'window', 'wood'), + palette=[[180, 120, 120], [6, 230, 230], [80, 50, 50], [4, 200, 3], + [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255]]) + + def __init__(self, + ann_file='', + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs): + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + ann_file=ann_file, + reduce_zero_label=reduce_zero_label, + **kwargs) + assert fileio.exists(self.data_prefix['img_path'], self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/potsdam.py b/mmsegmentation/mmseg/datasets/potsdam.py new file mode 100644 index 0000000..6892de3 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/potsdam.py @@ -0,0 +1,29 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class PotsdamDataset(BaseSegDataset): + """ISPRS Potsdam dataset. + + In segmentation map annotation for Potsdam dataset, 0 is the ignore index. + ``reduce_zero_label`` should be set to True. The ``img_suffix`` and + ``seg_map_suffix`` are both fixed to '.png'. + """ + METAINFO = dict( + classes=('impervious_surface', 'building', 'low_vegetation', 'tree', + 'car', 'clutter'), + palette=[[255, 255, 255], [0, 0, 255], [0, 255, 255], [0, 255, 0], + [255, 255, 0], [255, 0, 0]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/mmseg/datasets/refuge.py b/mmsegmentation/mmseg/datasets/refuge.py new file mode 100644 index 0000000..4016a82 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/refuge.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class REFUGEDataset(BaseSegDataset): + """REFUGE dataset. + + In segmentation map annotation for REFUGE, 0 stands for background, which + is not included in 2 categories. ``reduce_zero_label`` is fixed to True. + The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.png'. + """ + METAINFO = dict( + classes=('background', ' Optic Cup', 'Optic Disc'), + palette=[[120, 120, 120], [6, 230, 230], [56, 59, 120]]) + + def __init__(self, **kwargs) -> None: + super().__init__( + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/stare.py b/mmsegmentation/mmseg/datasets/stare.py new file mode 100644 index 0000000..1b997bb --- /dev/null +++ b/mmsegmentation/mmseg/datasets/stare.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class STAREDataset(BaseSegDataset): + """STARE dataset. + + In segmentation map annotation for STARE, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.ah.png'. + """ + METAINFO = dict( + classes=('background', 'vessel'), + palette=[[120, 120, 120], [6, 230, 230]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.ah.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/mmsegmentation/mmseg/datasets/synapse.py b/mmsegmentation/mmseg/datasets/synapse.py new file mode 100644 index 0000000..6f83b64 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/synapse.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class SynapseDataset(BaseSegDataset): + """Synapse dataset. + + Before dataset preprocess of Synapse, there are total 13 categories of + foreground which does not include background. After preprocessing, 8 + foreground categories are kept while the other 5 foreground categories are + handled as background. The ``img_suffix`` is fixed to '.jpg' and + ``seg_map_suffix`` is fixed to '.png'. + """ + METAINFO = dict( + classes=('background', 'aorta', 'gallbladder', 'left_kidney', + 'right_kidney', 'liver', 'pancreas', 'spleen', 'stomach'), + palette=[[0, 0, 0], [0, 0, 255], [0, 255, 0], [255, 0, 0], + [0, 255, 255], [255, 0, 255], [255, 255, 0], [60, 255, 255], + [240, 240, 240]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/mmseg/datasets/transforms/__init__.py b/mmsegmentation/mmseg/datasets/transforms/__init__.py new file mode 100644 index 0000000..125f070 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/transforms/__init__.py @@ -0,0 +1,30 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .formatting import PackSegInputs +from .loading import (LoadAnnotations, LoadBiomedicalAnnotation, + LoadBiomedicalData, LoadBiomedicalImageFromFile, + LoadDepthAnnotation, LoadImageFromNDArray, + LoadMultipleRSImageFromFile, LoadSingleRSImageFromFile) +# yapf: disable +from .transforms import (CLAHE, AdjustGamma, Albu, BioMedical3DPad, + BioMedical3DRandomCrop, BioMedical3DRandomFlip, + BioMedicalGaussianBlur, BioMedicalGaussianNoise, + BioMedicalRandomGamma, ConcatCDInput, GenerateEdge, + PhotoMetricDistortion, RandomCrop, RandomCutOut, + RandomDepthMix, RandomFlip, RandomMosaic, + RandomRotate, RandomRotFlip, Rerange, Resize, + ResizeShortestEdge, ResizeToMultiple, RGB2Gray, + SegRescale) + +# yapf: enable +__all__ = [ + 'LoadAnnotations', 'RandomCrop', 'BioMedical3DRandomCrop', 'SegRescale', + 'PhotoMetricDistortion', 'RandomRotate', 'AdjustGamma', 'CLAHE', 'Rerange', + 'RGB2Gray', 'RandomCutOut', 'RandomMosaic', 'PackSegInputs', + 'ResizeToMultiple', 'LoadImageFromNDArray', 'LoadBiomedicalImageFromFile', + 'LoadBiomedicalAnnotation', 'LoadBiomedicalData', 'GenerateEdge', + 'ResizeShortestEdge', 'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur', + 'BioMedical3DRandomFlip', 'BioMedicalRandomGamma', 'BioMedical3DPad', + 'RandomRotFlip', 'Albu', 'LoadSingleRSImageFromFile', 'ConcatCDInput', + 'LoadMultipleRSImageFromFile', 'LoadDepthAnnotation', 'RandomDepthMix', + 'RandomFlip', 'Resize' +] diff --git a/mmsegmentation/mmseg/datasets/transforms/formatting.py b/mmsegmentation/mmseg/datasets/transforms/formatting.py new file mode 100644 index 0000000..bd25055 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/transforms/formatting.py @@ -0,0 +1,112 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import numpy as np +from mmcv.transforms import to_tensor +from mmcv.transforms.base import BaseTransform +from mmengine.structures import PixelData + +from mmseg.registry import TRANSFORMS +from mmseg.structures import SegDataSample + + +@TRANSFORMS.register_module() +class PackSegInputs(BaseTransform): + """Pack the inputs data for the semantic segmentation. + + The ``img_meta`` item is always populated. The contents of the + ``img_meta`` dictionary depends on ``meta_keys``. By default this includes: + + - ``img_path``: filename of the image + + - ``ori_shape``: original shape of the image as a tuple (h, w, c) + + - ``img_shape``: shape of the image input to the network as a tuple \ + (h, w, c). Note that images may be zero padded on the \ + bottom/right if the batch tensor is larger than this shape. + + - ``pad_shape``: shape of padded images + + - ``scale_factor``: a float indicating the preprocessing scale + + - ``flip``: a boolean indicating if image flip transform was used + + - ``flip_direction``: the flipping direction + + Args: + meta_keys (Sequence[str], optional): Meta keys to be packed from + ``SegDataSample`` and collected in ``data[img_metas]``. + Default: ``('img_path', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction')`` + """ + + def __init__(self, + meta_keys=('img_path', 'seg_map_path', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction', 'reduce_zero_label')): + self.meta_keys = meta_keys + + def transform(self, results: dict) -> dict: + """Method to pack the input data. + + Args: + results (dict): Result dict from the data pipeline. + + Returns: + dict: + + - 'inputs' (obj:`torch.Tensor`): The forward data of models. + - 'data_sample' (obj:`SegDataSample`): The annotation info of the + sample. + """ + packed_results = dict() + if 'img' in results: + img = results['img'] + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + if not img.flags.c_contiguous: + img = to_tensor(np.ascontiguousarray(img.transpose(2, 0, 1))) + else: + img = img.transpose(2, 0, 1) + img = to_tensor(img).contiguous() + packed_results['inputs'] = img + + data_sample = SegDataSample() + if 'gt_seg_map' in results: + if len(results['gt_seg_map'].shape) == 2: + data = to_tensor(results['gt_seg_map'][None, + ...].astype(np.int64)) + else: + warnings.warn('Please pay attention your ground truth ' + 'segmentation map, usually the segmentation ' + 'map is 2D, but got ' + f'{results["gt_seg_map"].shape}') + data = to_tensor(results['gt_seg_map'].astype(np.int64)) + gt_sem_seg_data = dict(data=data) + data_sample.gt_sem_seg = PixelData(**gt_sem_seg_data) + + if 'gt_edge_map' in results: + gt_edge_data = dict( + data=to_tensor(results['gt_edge_map'][None, + ...].astype(np.int64))) + data_sample.set_data(dict(gt_edge_map=PixelData(**gt_edge_data))) + + if 'gt_depth_map' in results: + gt_depth_data = dict( + data=to_tensor(results['gt_depth_map'][None, ...])) + data_sample.set_data(dict(gt_depth_map=PixelData(**gt_depth_data))) + + img_meta = {} + for key in self.meta_keys: + if key in results: + img_meta[key] = results[key] + data_sample.set_metainfo(img_meta) + packed_results['data_samples'] = data_sample + + return packed_results + + def __repr__(self) -> str: + repr_str = self.__class__.__name__ + repr_str += f'(meta_keys={self.meta_keys})' + return repr_str diff --git a/mmsegmentation/mmseg/datasets/transforms/loading.py b/mmsegmentation/mmseg/datasets/transforms/loading.py new file mode 100644 index 0000000..c28937e --- /dev/null +++ b/mmsegmentation/mmseg/datasets/transforms/loading.py @@ -0,0 +1,771 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from pathlib import Path +from typing import Dict, Optional, Union + +import mmcv +import mmengine.fileio as fileio +import numpy as np +from mmcv.transforms import BaseTransform +from mmcv.transforms import LoadAnnotations as MMCV_LoadAnnotations +from mmcv.transforms import LoadImageFromFile + +from mmseg.registry import TRANSFORMS +from mmseg.utils import datafrombytes + +try: + from osgeo import gdal +except ImportError: + gdal = None + + +@TRANSFORMS.register_module() +class LoadAnnotations(MMCV_LoadAnnotations): + """Load annotations for semantic segmentation provided by dataset. + + The annotation format is as the following: + + .. code-block:: python + + { + # Filename of semantic segmentation ground truth file. + 'seg_map_path': 'a/b/c' + } + + After this module, the annotation has been changed to the format below: + + .. code-block:: python + + { + # in str + 'seg_fields': List + # In uint8 type. + 'gt_seg_map': np.ndarray (H, W) + } + + Required Keys: + + - seg_map_path (str): Path of semantic segmentation ground truth file. + + Added Keys: + + - seg_fields (List) + - gt_seg_map (np.uint8) + + Args: + reduce_zero_label (bool, optional): Whether reduce all label value + by 1. Usually used for datasets where 0 is background label. + Defaults to None. + imdecode_backend (str): The image decoding backend type. The backend + argument for :func:``mmcv.imfrombytes``. + See :fun:``mmcv.imfrombytes`` for details. + Defaults to 'pillow'. + backend_args (dict): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + + def __init__( + self, + reduce_zero_label=None, + backend_args=None, + imdecode_backend='pillow', + ) -> None: + super().__init__( + with_bbox=False, + with_label=False, + with_seg=True, + with_keypoints=False, + imdecode_backend=imdecode_backend, + backend_args=backend_args) + self.reduce_zero_label = reduce_zero_label + if self.reduce_zero_label is not None: + warnings.warn('`reduce_zero_label` will be deprecated, ' + 'if you would like to ignore the zero label, please ' + 'set `reduce_zero_label=True` when dataset ' + 'initialized') + self.imdecode_backend = imdecode_backend + + def _load_seg_map(self, results: dict) -> None: + """Private function to load semantic segmentation annotations. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded semantic segmentation annotations. + """ + + img_bytes = fileio.get( + results['seg_map_path'], backend_args=self.backend_args) + gt_semantic_seg = mmcv.imfrombytes( + img_bytes, flag='unchanged', + backend=self.imdecode_backend).squeeze().astype(np.uint8) + + # reduce zero_label + if self.reduce_zero_label is None: + self.reduce_zero_label = results['reduce_zero_label'] + assert self.reduce_zero_label == results['reduce_zero_label'], \ + 'Initialize dataset with `reduce_zero_label` as ' \ + f'{results["reduce_zero_label"]} but when load annotation ' \ + f'the `reduce_zero_label` is {self.reduce_zero_label}' + if self.reduce_zero_label: + # avoid using underflow conversion + gt_semantic_seg[gt_semantic_seg == 0] = 255 + gt_semantic_seg = gt_semantic_seg - 1 + gt_semantic_seg[gt_semantic_seg == 254] = 255 + # modify if custom classes + if results.get('label_map', None) is not None: + # Add deep copy to solve bug of repeatedly + # replace `gt_semantic_seg`, which is reported in + # https://github.com/open-mmlab/mmsegmentation/pull/1445/ + gt_semantic_seg_copy = gt_semantic_seg.copy() + for old_id, new_id in results['label_map'].items(): + gt_semantic_seg[gt_semantic_seg_copy == old_id] = new_id + results['gt_seg_map'] = gt_semantic_seg + results['seg_fields'].append('gt_seg_map') + + def __repr__(self) -> str: + repr_str = self.__class__.__name__ + repr_str += f'(reduce_zero_label={self.reduce_zero_label}, ' + repr_str += f"imdecode_backend='{self.imdecode_backend}', " + repr_str += f'backend_args={self.backend_args})' + return repr_str + + +@TRANSFORMS.register_module() +class LoadImageFromNDArray(LoadImageFromFile): + """Load an image from ``results['img']``. + + Similar with :obj:`LoadImageFromFile`, but the image has been loaded as + :obj:`np.ndarray` in ``results['img']``. Can be used when loading image + from webcam. + + Required Keys: + + - img + + Modified Keys: + + - img + - img_path + - img_shape + - ori_shape + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + """ + + def transform(self, results: dict) -> dict: + """Transform function to add image meta information. + + Args: + results (dict): Result dict with Webcam read image in + ``results['img']``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + img = results['img'] + if self.to_float32: + img = img.astype(np.float32) + + results['img_path'] = None + results['img'] = img + results['img_shape'] = img.shape[:2] + results['ori_shape'] = img.shape[:2] + return results + + +@TRANSFORMS.register_module() +class LoadBiomedicalImageFromFile(BaseTransform): + """Load an biomedical mage from file. + + Required Keys: + + - img_path + + Added Keys: + + - img (np.ndarray): Biomedical image with shape (N, Z, Y, X) by default, + N is the number of modalities, and data type is float32 + if set to_float32 = True, or float64 if decode_backend is 'nifti' and + to_float32 is False. + - img_shape + - ori_shape + + Args: + decode_backend (str): The data decoding backend type. Options are + 'numpy'and 'nifti', and there is a convention that when backend is + 'nifti' the axis of data loaded is XYZ, and when backend is + 'numpy', the the axis is ZYX. The data will be transposed if the + backend is 'nifti'. Defaults to 'nifti'. + to_xyz (bool): Whether transpose data from Z, Y, X to X, Y, Z. + Defaults to False. + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an float64 array. + Defaults to True. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + + def __init__(self, + decode_backend: str = 'nifti', + to_xyz: bool = False, + to_float32: bool = True, + backend_args: Optional[dict] = None) -> None: + self.decode_backend = decode_backend + self.to_xyz = to_xyz + self.to_float32 = to_float32 + self.backend_args = backend_args.copy() if backend_args else None + + def transform(self, results: Dict) -> Dict: + """Functions to load image. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + filename = results['img_path'] + + data_bytes = fileio.get(filename, self.backend_args) + img = datafrombytes(data_bytes, backend=self.decode_backend) + + if self.to_float32: + img = img.astype(np.float32) + + if len(img.shape) == 3: + img = img[None, ...] + + if self.decode_backend == 'nifti': + img = img.transpose(0, 3, 2, 1) + + if self.to_xyz: + img = img.transpose(0, 3, 2, 1) + + results['img'] = img + results['img_shape'] = img.shape[1:] + results['ori_shape'] = img.shape[1:] + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f"decode_backend='{self.decode_backend}', " + f'to_xyz={self.to_xyz}, ' + f'to_float32={self.to_float32}, ' + f'backend_args={self.backend_args})') + return repr_str + + +@TRANSFORMS.register_module() +class LoadBiomedicalAnnotation(BaseTransform): + """Load ``seg_map`` annotation provided by biomedical dataset. + + The annotation format is as the following: + + .. code-block:: python + + { + 'gt_seg_map': np.ndarray (X, Y, Z) or (Z, Y, X) + } + + Required Keys: + + - seg_map_path + + Added Keys: + + - gt_seg_map (np.ndarray): Biomedical seg map with shape (Z, Y, X) by + default, and data type is float32 if set to_float32 = True, or + float64 if decode_backend is 'nifti' and to_float32 is False. + + Args: + decode_backend (str): The data decoding backend type. Options are + 'numpy'and 'nifti', and there is a convention that when backend is + 'nifti' the axis of data loaded is XYZ, and when backend is + 'numpy', the the axis is ZYX. The data will be transposed if the + backend is 'nifti'. Defaults to 'nifti'. + to_xyz (bool): Whether transpose data from Z, Y, X to X, Y, Z. + Defaults to False. + to_float32 (bool): Whether to convert the loaded seg map to a float32 + numpy array. If set to False, the loaded image is an float64 array. + Defaults to True. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See :class:`mmengine.fileio` for details. + Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + + def __init__(self, + decode_backend: str = 'nifti', + to_xyz: bool = False, + to_float32: bool = True, + backend_args: Optional[dict] = None) -> None: + super().__init__() + self.decode_backend = decode_backend + self.to_xyz = to_xyz + self.to_float32 = to_float32 + self.backend_args = backend_args.copy() if backend_args else None + + def transform(self, results: Dict) -> Dict: + """Functions to load image. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + data_bytes = fileio.get(results['seg_map_path'], self.backend_args) + gt_seg_map = datafrombytes(data_bytes, backend=self.decode_backend) + + if self.to_float32: + gt_seg_map = gt_seg_map.astype(np.float32) + + if self.decode_backend == 'nifti': + gt_seg_map = gt_seg_map.transpose(2, 1, 0) + + if self.to_xyz: + gt_seg_map = gt_seg_map.transpose(2, 1, 0) + + results['gt_seg_map'] = gt_seg_map + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f"decode_backend='{self.decode_backend}', " + f'to_xyz={self.to_xyz}, ' + f'to_float32={self.to_float32}, ' + f'backend_args={self.backend_args})') + return repr_str + + +@TRANSFORMS.register_module() +class LoadBiomedicalData(BaseTransform): + """Load an biomedical image and annotation from file. + + The loading data format is as the following: + + .. code-block:: python + + { + 'img': np.ndarray data[:-1, X, Y, Z] + 'seg_map': np.ndarray data[-1, X, Y, Z] + } + + + Required Keys: + + - img_path + + Added Keys: + + - img (np.ndarray): Biomedical image with shape (N, Z, Y, X) by default, + N is the number of modalities. + - gt_seg_map (np.ndarray, optional): Biomedical seg map with shape + (Z, Y, X) by default. + - img_shape + - ori_shape + + Args: + with_seg (bool): Whether to parse and load the semantic segmentation + annotation. Defaults to False. + decode_backend (str): The data decoding backend type. Options are + 'numpy'and 'nifti', and there is a convention that when backend is + 'nifti' the axis of data loaded is XYZ, and when backend is + 'numpy', the the axis is ZYX. The data will be transposed if the + backend is 'nifti'. Defaults to 'nifti'. + to_xyz (bool): Whether transpose data from Z, Y, X to X, Y, Z. + Defaults to False. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + + def __init__(self, + with_seg=False, + decode_backend: str = 'numpy', + to_xyz: bool = False, + backend_args: Optional[dict] = None) -> None: # noqa + self.with_seg = with_seg + self.decode_backend = decode_backend + self.to_xyz = to_xyz + self.backend_args = backend_args.copy() if backend_args else None + + def transform(self, results: Dict) -> Dict: + """Functions to load image. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + data_bytes = fileio.get(results['img_path'], self.backend_args) + data = datafrombytes(data_bytes, backend=self.decode_backend) + # img is 4D data (N, X, Y, Z), N is the number of protocol + img = data[:-1, :] + + if self.decode_backend == 'nifti': + img = img.transpose(0, 3, 2, 1) + + if self.to_xyz: + img = img.transpose(0, 3, 2, 1) + + results['img'] = img + results['img_shape'] = img.shape[1:] + results['ori_shape'] = img.shape[1:] + + if self.with_seg: + gt_seg_map = data[-1, :] + if self.decode_backend == 'nifti': + gt_seg_map = gt_seg_map.transpose(2, 1, 0) + + if self.to_xyz: + gt_seg_map = gt_seg_map.transpose(2, 1, 0) + results['gt_seg_map'] = gt_seg_map + return results + + def __repr__(self) -> str: + repr_str = (f'{self.__class__.__name__}(' + f'with_seg={self.with_seg}, ' + f"decode_backend='{self.decode_backend}', " + f'to_xyz={self.to_xyz}, ' + f'backend_args={self.backend_args})') + return repr_str + + +@TRANSFORMS.register_module() +class InferencerLoader(BaseTransform): + """Load an image from ``results['img']``. + + Similar with :obj:`LoadImageFromFile`, but the image has been loaded as + :obj:`np.ndarray` in ``results['img']``. Can be used when loading image + from webcam. + + Required Keys: + + - img + + Modified Keys: + + - img + - img_path + - img_shape + - ori_shape + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + """ + + def __init__(self, **kwargs) -> None: + super().__init__() + self.from_file = TRANSFORMS.build( + dict(type='LoadImageFromFile', **kwargs)) + self.from_ndarray = TRANSFORMS.build( + dict(type='LoadImageFromNDArray', **kwargs)) + + def transform(self, single_input: Union[str, np.ndarray, dict]) -> dict: + """Transform function to add image meta information. + + Args: + results (dict): Result dict with Webcam read image in + ``results['img']``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + if isinstance(single_input, str): + inputs = dict(img_path=single_input) + elif isinstance(single_input, np.ndarray): + inputs = dict(img=single_input) + elif isinstance(single_input, dict): + inputs = single_input + else: + raise NotImplementedError + + if 'img' in inputs: + return self.from_ndarray(inputs) + return self.from_file(inputs) + + +@TRANSFORMS.register_module() +class LoadSingleRSImageFromFile(BaseTransform): + """Load a Remote Sensing mage from file. + + Required Keys: + + - img_path + + Modified Keys: + + - img + - img_shape + - ori_shape + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is a float64 array. + Defaults to True. + """ + + def __init__(self, to_float32: bool = True): + self.to_float32 = to_float32 + + if gdal is None: + raise RuntimeError('gdal is not installed') + + def transform(self, results: Dict) -> Dict: + """Functions to load image. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + filename = results['img_path'] + ds = gdal.Open(filename) + if ds is None: + raise Exception(f'Unable to open file: {filename}') + img = np.einsum('ijk->jki', ds.ReadAsArray()) + + if self.to_float32: + img = img.astype(np.float32) + + results['img'] = img + results['img_shape'] = img.shape[:2] + results['ori_shape'] = img.shape[:2] + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f'to_float32={self.to_float32})') + return repr_str + + +@TRANSFORMS.register_module() +class LoadMultipleRSImageFromFile(BaseTransform): + """Load two Remote Sensing mage from file. + + Required Keys: + + - img_path + - img_path2 + + Modified Keys: + + - img + - img2 + - img_shape + - ori_shape + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is a float64 array. + Defaults to True. + """ + + def __init__(self, to_float32: bool = True): + if gdal is None: + raise RuntimeError('gdal is not installed') + self.to_float32 = to_float32 + + def transform(self, results: Dict) -> Dict: + """Functions to load image. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + filename = results['img_path'] + filename2 = results['img_path2'] + + ds = gdal.Open(filename) + ds2 = gdal.Open(filename2) + + if ds is None: + raise Exception(f'Unable to open file: {filename}') + if ds2 is None: + raise Exception(f'Unable to open file: {filename2}') + + img = np.einsum('ijk->jki', ds.ReadAsArray()) + img2 = np.einsum('ijk->jki', ds2.ReadAsArray()) + + if self.to_float32: + img = img.astype(np.float32) + img2 = img2.astype(np.float32) + + if img.shape != img2.shape: + raise Exception(f'Image shapes do not match:' + f' {img.shape} vs {img2.shape}') + + results['img'] = img + results['img2'] = img2 + results['img_shape'] = img.shape[:2] + results['ori_shape'] = img.shape[:2] + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f'to_float32={self.to_float32})') + return repr_str + + +@TRANSFORMS.register_module() +class LoadDepthAnnotation(BaseTransform): + """Load ``depth_map`` annotation provided by depth estimation dataset. + + The annotation format is as the following: + + .. code-block:: python + + { + 'gt_depth_map': np.ndarray [Y, X] + } + + Required Keys: + + - seg_depth_path + + Added Keys: + + - gt_depth_map (np.ndarray): Depth map with shape (Y, X) by + default, and data type is float32 if set to_float32 = True. + - depth_rescale_factor (float): The rescale factor of depth map, which + can be used to recover the original value of depth map. + + Args: + decode_backend (str): The data decoding backend type. Options are + 'numpy', 'nifti', and 'cv2'. Defaults to 'cv2'. + to_float32 (bool): Whether to convert the loaded depth map to a float32 + numpy array. If set to False, the loaded image is an uint16 array. + Defaults to True. + depth_rescale_factor (float): Factor to rescale the depth value to + limit the range. Defaults to 1.0. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See :class:`mmengine.fileio` for details. + Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + + def __init__(self, + decode_backend: str = 'cv2', + to_float32: bool = True, + depth_rescale_factor: float = 1.0, + backend_args: Optional[dict] = None) -> None: + super().__init__() + self.decode_backend = decode_backend + self.to_float32 = to_float32 + self.depth_rescale_factor = depth_rescale_factor + self.backend_args = backend_args.copy() if backend_args else None + + def transform(self, results: Dict) -> Dict: + """Functions to load depth map. + + Args: + results (dict): Result dict from :obj:``mmcv.BaseDataset``. + + Returns: + dict: The dict contains loaded depth map. + """ + data_bytes = fileio.get(results['depth_map_path'], self.backend_args) + gt_depth_map = datafrombytes(data_bytes, backend=self.decode_backend) + + if self.to_float32: + gt_depth_map = gt_depth_map.astype(np.float32) + + gt_depth_map *= self.depth_rescale_factor + results['gt_depth_map'] = gt_depth_map + results['seg_fields'].append('gt_depth_map') + results['depth_rescale_factor'] = self.depth_rescale_factor + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f"decode_backend='{self.decode_backend}', " + f'to_float32={self.to_float32}, ' + f'backend_args={self.backend_args})') + return repr_str + + +@TRANSFORMS.register_module() +class LoadImageFromNpyFile(LoadImageFromFile): + """Load an image from ``results['img_path']``. + + Required Keys: + + - img_path + + Modified Keys: + + - img + - img_shape + - ori_shape + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + """ + + def transform(self, results: dict) -> Optional[dict]: + """Functions to load image. + + Args: + results (dict): Result dict from + :class:`mmengine.dataset.BaseDataset`. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + filename = results['img_path'] + + try: + if Path(filename).suffix in ['.npy', '.npz']: + img = np.load(filename) + else: + if self.file_client_args is not None: + file_client = fileio.FileClient.infer_client( + self.file_client_args, filename) + img_bytes = file_client.get(filename) + else: + img_bytes = fileio.get( + filename, backend_args=self.backend_args) + img = mmcv.imfrombytes( + img_bytes, + flag=self.color_type, + backend=self.imdecode_backend) + except Exception as e: + if self.ignore_empty: + return None + else: + raise e + + # in some cases, images are not read successfully, the img would be + # `None`, refer to https://github.com/open-mmlab/mmpretrain/issues/1427 + assert img is not None, f'failed to load image: {filename}' + if self.to_float32: + img = img.astype(np.float32) + + results['img'] = img + results['img_shape'] = img.shape[:2] + results['ori_shape'] = img.shape[:2] + return results diff --git a/mmsegmentation/mmseg/datasets/transforms/transforms.py b/mmsegmentation/mmseg/datasets/transforms/transforms.py new file mode 100644 index 0000000..64e2323 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/transforms/transforms.py @@ -0,0 +1,2537 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import inspect +import warnings +from typing import Dict, List, Optional, Sequence, Tuple, Union + +import cv2 +import mmcv +import mmengine +import numpy as np +from mmcv.transforms import RandomFlip as MMCV_RandomFlip +from mmcv.transforms import Resize as MMCV_Resize +from mmcv.transforms.base import BaseTransform +from mmcv.transforms.utils import cache_randomness +from mmengine.utils import is_tuple_of +from numpy import random +from scipy.ndimage import gaussian_filter + +from mmseg.datasets.dataset_wrappers import MultiImageMixDataset +from mmseg.registry import TRANSFORMS + +try: + import albumentations + from albumentations import Compose + ALBU_INSTALLED = True +except ImportError: + albumentations = None + Compose = None + ALBU_INSTALLED = False + + +@TRANSFORMS.register_module() +class ResizeToMultiple(BaseTransform): + """Resize images & seg to multiple of divisor. + + Required Keys: + + - img + - gt_seg_map + + Modified Keys: + + - img + - img_shape + - pad_shape + + Args: + size_divisor (int): images and gt seg maps need to resize to multiple + of size_divisor. Default: 32. + interpolation (str, optional): The interpolation mode of image resize. + Default: None + """ + + def __init__(self, size_divisor=32, interpolation=None): + self.size_divisor = size_divisor + self.interpolation = interpolation + + def transform(self, results: dict) -> dict: + """Call function to resize images, semantic segmentation map to + multiple of size divisor. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Resized results, 'img_shape', 'pad_shape' keys are updated. + """ + # Align image to multiple of size divisor. + img = results['img'] + img = mmcv.imresize_to_multiple( + img, + self.size_divisor, + scale_factor=1, + interpolation=self.interpolation + if self.interpolation else 'bilinear') + + results['img'] = img + results['img_shape'] = img.shape[:2] + results['pad_shape'] = img.shape[:2] + + # Align segmentation map to multiple of size divisor. + for key in results.get('seg_fields', []): + gt_seg = results[key] + gt_seg = mmcv.imresize_to_multiple( + gt_seg, + self.size_divisor, + scale_factor=1, + interpolation='nearest') + results[key] = gt_seg + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += (f'(size_divisor={self.size_divisor}, ' + f'interpolation={self.interpolation})') + return repr_str + + +@TRANSFORMS.register_module() +class Rerange(BaseTransform): + """Rerange the image pixel value. + + Required Keys: + + - img + + Modified Keys: + + - img + + Args: + min_value (float or int): Minimum value of the reranged image. + Default: 0. + max_value (float or int): Maximum value of the reranged image. + Default: 255. + """ + + def __init__(self, min_value=0, max_value=255): + assert isinstance(min_value, float) or isinstance(min_value, int) + assert isinstance(max_value, float) or isinstance(max_value, int) + assert min_value < max_value + self.min_value = min_value + self.max_value = max_value + + def transform(self, results: dict) -> dict: + """Call function to rerange images. + + Args: + results (dict): Result dict from loading pipeline. + Returns: + dict: Reranged results. + """ + + img = results['img'] + img_min_value = np.min(img) + img_max_value = np.max(img) + + assert img_min_value < img_max_value + # rerange to [0, 1] + img = (img - img_min_value) / (img_max_value - img_min_value) + # rerange to [min_value, max_value] + img = img * (self.max_value - self.min_value) + self.min_value + results['img'] = img + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(min_value={self.min_value}, max_value={self.max_value})' + return repr_str + + +@TRANSFORMS.register_module() +class CLAHE(BaseTransform): + """Use CLAHE method to process the image. + + See `ZUIDERVELD,K. Contrast Limited Adaptive Histogram Equalization[J]. + Graphics Gems, 1994:474-485.` for more information. + + Required Keys: + + - img + + Modified Keys: + + - img + + Args: + clip_limit (float): Threshold for contrast limiting. Default: 40.0. + tile_grid_size (tuple[int]): Size of grid for histogram equalization. + Input image will be divided into equally sized rectangular tiles. + It defines the number of tiles in row and column. Default: (8, 8). + """ + + def __init__(self, clip_limit=40.0, tile_grid_size=(8, 8)): + assert isinstance(clip_limit, (float, int)) + self.clip_limit = clip_limit + assert is_tuple_of(tile_grid_size, int) + assert len(tile_grid_size) == 2 + self.tile_grid_size = tile_grid_size + + def transform(self, results: dict) -> dict: + """Call function to Use CLAHE method process images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Processed results. + """ + + for i in range(results['img'].shape[2]): + results['img'][:, :, i] = mmcv.clahe( + np.array(results['img'][:, :, i], dtype=np.uint8), + self.clip_limit, self.tile_grid_size) + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(clip_limit={self.clip_limit}, ' \ + f'tile_grid_size={self.tile_grid_size})' + return repr_str + + +@TRANSFORMS.register_module() +class RandomCrop(BaseTransform): + """Random crop the image & seg. + + Required Keys: + + - img + - gt_seg_map + + Modified Keys: + + - img + - img_shape + - gt_seg_map + + + Args: + crop_size (Union[int, Tuple[int, int]]): Expected size after cropping + with the format of (h, w). If set to an integer, then cropping + width and height are equal to this integer. + cat_max_ratio (float): The maximum ratio that single category could + occupy. + ignore_index (int): The label index to be ignored. Default: 255 + """ + + def __init__(self, + crop_size: Union[int, Tuple[int, int]], + cat_max_ratio: float = 1., + ignore_index: int = 255): + super().__init__() + assert isinstance(crop_size, int) or ( + isinstance(crop_size, tuple) and len(crop_size) == 2 + ), 'The expected crop_size is an integer, or a tuple containing two ' + 'intergers' + + if isinstance(crop_size, int): + crop_size = (crop_size, crop_size) + assert crop_size[0] > 0 and crop_size[1] > 0 + self.crop_size = crop_size + self.cat_max_ratio = cat_max_ratio + self.ignore_index = ignore_index + + @cache_randomness + def crop_bbox(self, results: dict) -> tuple: + """get a crop bounding box. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + tuple: Coordinates of the cropped image. + """ + + def generate_crop_bbox(img: np.ndarray) -> tuple: + """Randomly get a crop bounding box. + + Args: + img (np.ndarray): Original input image. + + Returns: + tuple: Coordinates of the cropped image. + """ + + margin_h = max(img.shape[0] - self.crop_size[0], 0) + margin_w = max(img.shape[1] - self.crop_size[1], 0) + offset_h = np.random.randint(0, margin_h + 1) + offset_w = np.random.randint(0, margin_w + 1) + crop_y1, crop_y2 = offset_h, offset_h + self.crop_size[0] + crop_x1, crop_x2 = offset_w, offset_w + self.crop_size[1] + + return crop_y1, crop_y2, crop_x1, crop_x2 + + img = results['img'] + crop_bbox = generate_crop_bbox(img) + if self.cat_max_ratio < 1.: + # Repeat 10 times + for _ in range(10): + seg_temp = self.crop(results['gt_seg_map'], crop_bbox) + labels, cnt = np.unique(seg_temp, return_counts=True) + cnt = cnt[labels != self.ignore_index] + if len(cnt) > 1 and np.max(cnt) / np.sum( + cnt) < self.cat_max_ratio: + break + crop_bbox = generate_crop_bbox(img) + + return crop_bbox + + def crop(self, img: np.ndarray, crop_bbox: tuple) -> np.ndarray: + """Crop from ``img`` + + Args: + img (np.ndarray): Original input image. + crop_bbox (tuple): Coordinates of the cropped image. + + Returns: + np.ndarray: The cropped image. + """ + + crop_y1, crop_y2, crop_x1, crop_x2 = crop_bbox + img = img[crop_y1:crop_y2, crop_x1:crop_x2, ...] + return img + + def transform(self, results: dict) -> dict: + """Transform function to randomly crop images, semantic segmentation + maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Randomly cropped results, 'img_shape' key in result dict is + updated according to crop size. + """ + + img = results['img'] + crop_bbox = self.crop_bbox(results) + + # crop the image + img = self.crop(img, crop_bbox) + + # crop semantic seg + for key in results.get('seg_fields', []): + results[key] = self.crop(results[key], crop_bbox) + + results['img'] = img + results['img_shape'] = img.shape[:2] + return results + + def __repr__(self): + return self.__class__.__name__ + f'(crop_size={self.crop_size})' + + +@TRANSFORMS.register_module() +class RandomRotate(BaseTransform): + """Rotate the image & seg. + + Required Keys: + + - img + - gt_seg_map + + Modified Keys: + + - img + - gt_seg_map + + Args: + prob (float): The rotation probability. + degree (float, tuple[float]): Range of degrees to select from. If + degree is a number instead of tuple like (min, max), + the range of degree will be (``-degree``, ``+degree``) + pad_val (float, optional): Padding value of image. Default: 0. + seg_pad_val (float, optional): Padding value of segmentation map. + Default: 255. + center (tuple[float], optional): Center point (w, h) of the rotation in + the source image. If not specified, the center of the image will be + used. Default: None. + auto_bound (bool): Whether to adjust the image size to cover the whole + rotated image. Default: False + """ + + def __init__(self, + prob, + degree, + pad_val=0, + seg_pad_val=255, + center=None, + auto_bound=False): + self.prob = prob + assert prob >= 0 and prob <= 1 + if isinstance(degree, (float, int)): + assert degree > 0, f'degree {degree} should be positive' + self.degree = (-degree, degree) + else: + self.degree = degree + assert len(self.degree) == 2, f'degree {self.degree} should be a ' \ + f'tuple of (min, max)' + self.pal_val = pad_val + self.seg_pad_val = seg_pad_val + self.center = center + self.auto_bound = auto_bound + + @cache_randomness + def generate_degree(self): + return np.random.rand() < self.prob, np.random.uniform( + min(*self.degree), max(*self.degree)) + + def transform(self, results: dict) -> dict: + """Call function to rotate image, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Rotated results. + """ + + rotate, degree = self.generate_degree() + if rotate: + # rotate image + results['img'] = mmcv.imrotate( + results['img'], + angle=degree, + border_value=self.pal_val, + center=self.center, + auto_bound=self.auto_bound) + + # rotate segs + for key in results.get('seg_fields', []): + results[key] = mmcv.imrotate( + results[key], + angle=degree, + border_value=self.seg_pad_val, + center=self.center, + auto_bound=self.auto_bound, + interpolation='nearest') + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' \ + f'degree={self.degree}, ' \ + f'pad_val={self.pal_val}, ' \ + f'seg_pad_val={self.seg_pad_val}, ' \ + f'center={self.center}, ' \ + f'auto_bound={self.auto_bound})' + return repr_str + + +@TRANSFORMS.register_module() +class RGB2Gray(BaseTransform): + """Convert RGB image to grayscale image. + + Required Keys: + + - img + + Modified Keys: + + - img + - img_shape + + This transform calculate the weighted mean of input image channels with + ``weights`` and then expand the channels to ``out_channels``. When + ``out_channels`` is None, the number of output channels is the same as + input channels. + + Args: + out_channels (int): Expected number of output channels after + transforming. Default: None. + weights (tuple[float]): The weights to calculate the weighted mean. + Default: (0.299, 0.587, 0.114). + """ + + def __init__(self, out_channels=None, weights=(0.299, 0.587, 0.114)): + assert out_channels is None or out_channels > 0 + self.out_channels = out_channels + assert isinstance(weights, tuple) + for item in weights: + assert isinstance(item, (float, int)) + self.weights = weights + + def transform(self, results: dict) -> dict: + """Call function to convert RGB image to grayscale image. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with grayscale image. + """ + img = results['img'] + assert len(img.shape) == 3 + assert img.shape[2] == len(self.weights) + weights = np.array(self.weights).reshape((1, 1, -1)) + img = (img * weights).sum(2, keepdims=True) + if self.out_channels is None: + img = img.repeat(weights.shape[2], axis=2) + else: + img = img.repeat(self.out_channels, axis=2) + + results['img'] = img + results['img_shape'] = img.shape + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(out_channels={self.out_channels}, ' \ + f'weights={self.weights})' + return repr_str + + +@TRANSFORMS.register_module() +class AdjustGamma(BaseTransform): + """Using gamma correction to process the image. + + Required Keys: + + - img + + Modified Keys: + + - img + + Args: + gamma (float or int): Gamma value used in gamma correction. + Default: 1.0. + """ + + def __init__(self, gamma=1.0): + assert isinstance(gamma, float) or isinstance(gamma, int) + assert gamma > 0 + self.gamma = gamma + inv_gamma = 1.0 / gamma + self.table = np.array([(i / 255.0)**inv_gamma * 255 + for i in np.arange(256)]).astype('uint8') + + def transform(self, results: dict) -> dict: + """Call function to process the image with gamma correction. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Processed results. + """ + + results['img'] = mmcv.lut_transform( + np.array(results['img'], dtype=np.uint8), self.table) + + return results + + def __repr__(self): + return self.__class__.__name__ + f'(gamma={self.gamma})' + + +@TRANSFORMS.register_module() +class SegRescale(BaseTransform): + """Rescale semantic segmentation maps. + + Required Keys: + + - gt_seg_map + + Modified Keys: + + - gt_seg_map + + Args: + scale_factor (float): The scale factor of the final output. + """ + + def __init__(self, scale_factor=1): + self.scale_factor = scale_factor + + def transform(self, results: dict) -> dict: + """Call function to scale the semantic segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with semantic segmentation map scaled. + """ + for key in results.get('seg_fields', []): + if self.scale_factor != 1: + results[key] = mmcv.imrescale( + results[key], self.scale_factor, interpolation='nearest') + return results + + def __repr__(self): + return self.__class__.__name__ + f'(scale_factor={self.scale_factor})' + + +@TRANSFORMS.register_module() +class PhotoMetricDistortion(BaseTransform): + """Apply photometric distortion to image sequentially, every transformation + is applied with a probability of 0.5. The position of random contrast is in + second or second to last. + + 1. random brightness + 2. random contrast (mode 0) + 3. convert color from BGR to HSV + 4. random saturation + 5. random hue + 6. convert color from HSV to BGR + 7. random contrast (mode 1) + + Required Keys: + + - img + + Modified Keys: + + - img + + Args: + brightness_delta (int): delta of brightness. + contrast_range (tuple): range of contrast. + saturation_range (tuple): range of saturation. + hue_delta (int): delta of hue. + """ + + def __init__(self, + brightness_delta: int = 32, + contrast_range: Sequence[float] = (0.5, 1.5), + saturation_range: Sequence[float] = (0.5, 1.5), + hue_delta: int = 18): + self.brightness_delta = brightness_delta + self.contrast_lower, self.contrast_upper = contrast_range + self.saturation_lower, self.saturation_upper = saturation_range + self.hue_delta = hue_delta + + def convert(self, + img: np.ndarray, + alpha: int = 1, + beta: int = 0) -> np.ndarray: + """Multiple with alpha and add beat with clip. + + Args: + img (np.ndarray): The input image. + alpha (int): Image weights, change the contrast/saturation + of the image. Default: 1 + beta (int): Image bias, change the brightness of the + image. Default: 0 + + Returns: + np.ndarray: The transformed image. + """ + + img = img.astype(np.float32) * alpha + beta + img = np.clip(img, 0, 255) + return img.astype(np.uint8) + + def brightness(self, img: np.ndarray) -> np.ndarray: + """Brightness distortion. + + Args: + img (np.ndarray): The input image. + Returns: + np.ndarray: Image after brightness change. + """ + + if random.randint(2): + return self.convert( + img, + beta=random.uniform(-self.brightness_delta, + self.brightness_delta)) + return img + + def contrast(self, img: np.ndarray) -> np.ndarray: + """Contrast distortion. + + Args: + img (np.ndarray): The input image. + Returns: + np.ndarray: Image after contrast change. + """ + + if random.randint(2): + return self.convert( + img, + alpha=random.uniform(self.contrast_lower, self.contrast_upper)) + return img + + def saturation(self, img: np.ndarray) -> np.ndarray: + """Saturation distortion. + + Args: + img (np.ndarray): The input image. + Returns: + np.ndarray: Image after saturation change. + """ + + if random.randint(2): + img = mmcv.bgr2hsv(img) + img[:, :, 1] = self.convert( + img[:, :, 1], + alpha=random.uniform(self.saturation_lower, + self.saturation_upper)) + img = mmcv.hsv2bgr(img) + return img + + def hue(self, img: np.ndarray) -> np.ndarray: + """Hue distortion. + + Args: + img (np.ndarray): The input image. + Returns: + np.ndarray: Image after hue change. + """ + + if random.randint(2): + img = mmcv.bgr2hsv(img) + img[:, :, + 0] = (img[:, :, 0].astype(int) + + random.randint(-self.hue_delta, self.hue_delta)) % 180 + img = mmcv.hsv2bgr(img) + return img + + def transform(self, results: dict) -> dict: + """Transform function to perform photometric distortion on images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images distorted. + """ + + img = results['img'] + # random brightness + img = self.brightness(img) + + # mode == 0 --> do random contrast first + # mode == 1 --> do random contrast last + mode = random.randint(2) + if mode == 1: + img = self.contrast(img) + + # random saturation + img = self.saturation(img) + + # random hue + img = self.hue(img) + + # random contrast + if mode == 0: + img = self.contrast(img) + + results['img'] = img + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += (f'(brightness_delta={self.brightness_delta}, ' + f'contrast_range=({self.contrast_lower}, ' + f'{self.contrast_upper}), ' + f'saturation_range=({self.saturation_lower}, ' + f'{self.saturation_upper}), ' + f'hue_delta={self.hue_delta})') + return repr_str + + +@TRANSFORMS.register_module() +class RandomCutOut(BaseTransform): + """CutOut operation. + + Randomly drop some regions of image used in + `Cutout `_. + + Required Keys: + + - img + - gt_seg_map + + Modified Keys: + + - img + - gt_seg_map + + Args: + prob (float): cutout probability. + n_holes (int | tuple[int, int]): Number of regions to be dropped. + If it is given as a list, number of holes will be randomly + selected from the closed interval [`n_holes[0]`, `n_holes[1]`]. + cutout_shape (tuple[int, int] | list[tuple[int, int]]): The candidate + shape of dropped regions. It can be `tuple[int, int]` to use a + fixed cutout shape, or `list[tuple[int, int]]` to randomly choose + shape from the list. + cutout_ratio (tuple[float, float] | list[tuple[float, float]]): The + candidate ratio of dropped regions. It can be `tuple[float, float]` + to use a fixed ratio or `list[tuple[float, float]]` to randomly + choose ratio from the list. Please note that `cutout_shape` + and `cutout_ratio` cannot be both given at the same time. + fill_in (tuple[float, float, float] | tuple[int, int, int]): The value + of pixel to fill in the dropped regions. Default: (0, 0, 0). + seg_fill_in (int): The labels of pixel to fill in the dropped regions. + If seg_fill_in is None, skip. Default: None. + """ + + def __init__(self, + prob, + n_holes, + cutout_shape=None, + cutout_ratio=None, + fill_in=(0, 0, 0), + seg_fill_in=None): + + assert 0 <= prob and prob <= 1 + assert (cutout_shape is None) ^ (cutout_ratio is None), \ + 'Either cutout_shape or cutout_ratio should be specified.' + assert (isinstance(cutout_shape, (list, tuple)) + or isinstance(cutout_ratio, (list, tuple))) + if isinstance(n_holes, tuple): + assert len(n_holes) == 2 and 0 <= n_holes[0] < n_holes[1] + else: + n_holes = (n_holes, n_holes) + if seg_fill_in is not None: + assert (isinstance(seg_fill_in, int) and 0 <= seg_fill_in + and seg_fill_in <= 255) + self.prob = prob + self.n_holes = n_holes + self.fill_in = fill_in + self.seg_fill_in = seg_fill_in + self.with_ratio = cutout_ratio is not None + self.candidates = cutout_ratio if self.with_ratio else cutout_shape + if not isinstance(self.candidates, list): + self.candidates = [self.candidates] + + @cache_randomness + def do_cutout(self): + return np.random.rand() < self.prob + + @cache_randomness + def generate_patches(self, results): + cutout = self.do_cutout() + + h, w, _ = results['img'].shape + if cutout: + n_holes = np.random.randint(self.n_holes[0], self.n_holes[1] + 1) + else: + n_holes = 0 + x1_lst = [] + y1_lst = [] + index_lst = [] + for _ in range(n_holes): + x1_lst.append(np.random.randint(0, w)) + y1_lst.append(np.random.randint(0, h)) + index_lst.append(np.random.randint(0, len(self.candidates))) + return cutout, n_holes, x1_lst, y1_lst, index_lst + + def transform(self, results: dict) -> dict: + """Call function to drop some regions of image.""" + cutout, n_holes, x1_lst, y1_lst, index_lst = self.generate_patches( + results) + if cutout: + h, w, c = results['img'].shape + for i in range(n_holes): + x1 = x1_lst[i] + y1 = y1_lst[i] + index = index_lst[i] + if not self.with_ratio: + cutout_w, cutout_h = self.candidates[index] + else: + cutout_w = int(self.candidates[index][0] * w) + cutout_h = int(self.candidates[index][1] * h) + + x2 = np.clip(x1 + cutout_w, 0, w) + y2 = np.clip(y1 + cutout_h, 0, h) + results['img'][y1:y2, x1:x2, :] = self.fill_in + + if self.seg_fill_in is not None: + for key in results.get('seg_fields', []): + results[key][y1:y2, x1:x2] = self.seg_fill_in + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' + repr_str += f'n_holes={self.n_holes}, ' + repr_str += (f'cutout_ratio={self.candidates}, ' if self.with_ratio + else f'cutout_shape={self.candidates}, ') + repr_str += f'fill_in={self.fill_in}, ' + repr_str += f'seg_fill_in={self.seg_fill_in})' + return repr_str + + +@TRANSFORMS.register_module() +class RandomRotFlip(BaseTransform): + """Rotate and flip the image & seg or just rotate the image & seg. + + Required Keys: + + - img + - gt_seg_map + + Modified Keys: + + - img + - gt_seg_map + + Args: + rotate_prob (float): The probability of rotate image. + flip_prob (float): The probability of rotate&flip image. + degree (float, tuple[float]): Range of degrees to select from. If + degree is a number instead of tuple like (min, max), + the range of degree will be (``-degree``, ``+degree``) + """ + + def __init__(self, rotate_prob=0.5, flip_prob=0.5, degree=(-20, 20)): + self.rotate_prob = rotate_prob + self.flip_prob = flip_prob + assert 0 <= rotate_prob <= 1 and 0 <= flip_prob <= 1 + if isinstance(degree, (float, int)): + assert degree > 0, f'degree {degree} should be positive' + self.degree = (-degree, degree) + else: + self.degree = degree + assert len(self.degree) == 2, f'degree {self.degree} should be a ' \ + f'tuple of (min, max)' + + def random_rot_flip(self, results: dict) -> dict: + k = np.random.randint(0, 4) + results['img'] = np.rot90(results['img'], k) + for key in results.get('seg_fields', []): + results[key] = np.rot90(results[key], k) + axis = np.random.randint(0, 2) + results['img'] = np.flip(results['img'], axis=axis).copy() + for key in results.get('seg_fields', []): + results[key] = np.flip(results[key], axis=axis).copy() + return results + + def random_rotate(self, results: dict) -> dict: + angle = np.random.uniform(min(*self.degree), max(*self.degree)) + results['img'] = mmcv.imrotate(results['img'], angle=angle) + for key in results.get('seg_fields', []): + results[key] = mmcv.imrotate(results[key], angle=angle) + return results + + def transform(self, results: dict) -> dict: + """Call function to rotate or rotate & flip image, semantic + segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Rotated or rotated & flipped results. + """ + rotate_flag = 0 + if random.random() < self.rotate_prob: + results = self.random_rotate(results) + rotate_flag = 1 + if random.random() < self.flip_prob and rotate_flag == 0: + results = self.random_rot_flip(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(rotate_prob={self.rotate_prob}, ' \ + f'flip_prob={self.flip_prob}, ' \ + f'degree={self.degree})' + return repr_str + + +@TRANSFORMS.register_module() +class RandomFlip(MMCV_RandomFlip): + """Flip the image & bbox & segmentation map. Added or Updated + keys: flip, flip_direction, img, gt_bboxes, gt_seg_map, and gt_depth_map. + There are 3 flip modes: + + - ``prob`` is float, ``direction`` is string: the image will be + ``direction``ly flipped with probability of ``prob`` . + E.g., ``prob=0.5``, ``direction='horizontal'``, + then image will be horizontally flipped with probability of 0.5. + + - ``prob`` is float, ``direction`` is list of string: the image will + be ``direction[i]``ly flipped with probability of + ``prob/len(direction)``. + E.g., ``prob=0.5``, ``direction=['horizontal', 'vertical']``, + then image will be horizontally flipped with probability of 0.25, + vertically with probability of 0.25. + + - ``prob`` is list of float, ``direction`` is list of string: + given ``len(prob) == len(direction)``, the image will + be ``direction[i]``ly flipped with probability of ``prob[i]``. + E.g., ``prob=[0.3, 0.5]``, ``direction=['horizontal', + 'vertical']``, then image will be horizontally flipped with + probability of 0.3, vertically with probability of 0.5. + + Required Keys: + + - img + - gt_bboxes (optional) + - gt_seg_map (optional) + - gt_depth_map (optional) + + Modified Keys: + + - img + - gt_bboxes (optional) + - gt_seg_map (optional) + - gt_depth_map (optional) + + Added Keys: + + - flip + - flip_direction + - swap_seg_labels (optional) + + Args: + prob (float | list[float], optional): The flipping probability. + Defaults to None. + direction(str | list[str]): The flipping direction. Options + If input is a list, the length must equal ``prob``. Each + element in ``prob`` indicates the flip probability of + corresponding direction. Defaults to 'horizontal'. + swap_seg_labels (list, optional): The label pair need to be swapped + for ground truth, like 'left arm' and 'right arm' need to be + swapped after horizontal flipping. For example, ``[(1, 5)]``, + where 1/5 is the label of the left/right arm. Defaults to None. + """ + + def _flip(self, results: dict) -> None: + """Flip images, bounding boxes and semantic segmentation map.""" + # flip image + results['img'] = mmcv.imflip( + results['img'], direction=results['flip_direction']) + + img_shape = results['img'].shape[:2] + + # flip bboxes + if results.get('gt_bboxes', None) is not None: + results['gt_bboxes'] = self._flip_bbox(results['gt_bboxes'], + img_shape, + results['flip_direction']) + + # flip seg map + for key in results.get('seg_fields', []): + if results.get(key, None) is not None: + results[key] = self._flip_seg_map( + results[key], direction=results['flip_direction']).copy() + results['swap_seg_labels'] = self.swap_seg_labels + + +@TRANSFORMS.register_module() +class Resize(MMCV_Resize): + """Resize images & seg & depth map. + + This transform resizes the input image according to ``scale`` or + ``scale_factor``. Seg map, depth map and other relative annotations are + then resized with the same scale factor. + if ``scale`` and ``scale_factor`` are both set, it will use ``scale`` to + resize. + + Required Keys: + + - img + - gt_seg_map (optional) + - gt_depth_map (optional) + + Modified Keys: + + - img + - gt_seg_map + - gt_depth_map + + Added Keys: + + - scale + - scale_factor + - keep_ratio + + Args: + scale (int or tuple): Images scales for resizing. Defaults to None + scale_factor (float or tuple[float]): Scale factors for resizing. + Defaults to None. + keep_ratio (bool): Whether to keep the aspect ratio when resizing the + image. Defaults to False. + clip_object_border (bool): Whether to clip the objects + outside the border of the image. In some dataset like MOT17, the gt + bboxes are allowed to cross the border of images. Therefore, we + don't need to clip the gt bboxes in these cases. Defaults to True. + backend (str): Image resize backend, choices are 'cv2' and 'pillow'. + These two backends generates slightly different results. Defaults + to 'cv2'. + interpolation (str): Interpolation method, accepted values are + "nearest", "bilinear", "bicubic", "area", "lanczos" for 'cv2' + backend, "nearest", "bilinear" for 'pillow' backend. Defaults + to 'bilinear'. + """ + + def _resize_seg(self, results: dict) -> None: + """Resize semantic segmentation map with ``results['scale']``.""" + for seg_key in results.get('seg_fields', []): + if results.get(seg_key, None) is not None: + if self.keep_ratio: + gt_seg = mmcv.imrescale( + results[seg_key], + results['scale'], + interpolation='nearest', + backend=self.backend) + else: + gt_seg = mmcv.imresize( + results[seg_key], + results['scale'], + interpolation='nearest', + backend=self.backend) + results[seg_key] = gt_seg + + +@TRANSFORMS.register_module() +class RandomMosaic(BaseTransform): + """Mosaic augmentation. Given 4 images, mosaic transform combines them into + one output image. The output image is composed of the parts from each sub- + image. + + .. code:: text + + mosaic transform + center_x + +------------------------------+ + | pad | pad | + | +-----------+ | + | | | | + | | image1 |--------+ | + | | | | | + | | | image2 | | + center_y |----+-------------+-----------| + | | cropped | | + |pad | image3 | image4 | + | | | | + +----|-------------+-----------+ + | | + +-------------+ + + The mosaic transform steps are as follows: + 1. Choose the mosaic center as the intersections of 4 images + 2. Get the left top image according to the index, and randomly + sample another 3 images from the custom dataset. + 3. Sub image will be cropped if image is larger than mosaic patch + + Required Keys: + + - img + - gt_seg_map + - mix_results + + Modified Keys: + + - img + - img_shape + - ori_shape + - gt_seg_map + + Args: + prob (float): mosaic probability. + img_scale (Sequence[int]): Image size after mosaic pipeline of + a single image. The size of the output image is four times + that of a single image. The output image comprises 4 single images. + Default: (640, 640). + center_ratio_range (Sequence[float]): Center ratio range of mosaic + output. Default: (0.5, 1.5). + pad_val (int): Pad value. Default: 0. + seg_pad_val (int): Pad value of segmentation map. Default: 255. + """ + + def __init__(self, + prob, + img_scale=(640, 640), + center_ratio_range=(0.5, 1.5), + pad_val=0, + seg_pad_val=255): + assert 0 <= prob and prob <= 1 + assert isinstance(img_scale, tuple) + self.prob = prob + self.img_scale = img_scale + self.center_ratio_range = center_ratio_range + self.pad_val = pad_val + self.seg_pad_val = seg_pad_val + + @cache_randomness + def do_mosaic(self): + return np.random.rand() < self.prob + + def transform(self, results: dict) -> dict: + """Call function to make a mosaic of image. + + Args: + results (dict): Result dict. + + Returns: + dict: Result dict with mosaic transformed. + """ + mosaic = self.do_mosaic() + if mosaic: + results = self._mosaic_transform_img(results) + results = self._mosaic_transform_seg(results) + return results + + def get_indices(self, dataset: MultiImageMixDataset) -> list: + """Call function to collect indices. + + Args: + dataset (:obj:`MultiImageMixDataset`): The dataset. + + Returns: + list: indices. + """ + + indices = [random.randint(0, len(dataset)) for _ in range(3)] + return indices + + @cache_randomness + def generate_mosaic_center(self): + # mosaic center x, y + center_x = int( + random.uniform(*self.center_ratio_range) * self.img_scale[1]) + center_y = int( + random.uniform(*self.center_ratio_range) * self.img_scale[0]) + return center_x, center_y + + def _mosaic_transform_img(self, results: dict) -> dict: + """Mosaic transform function. + + Args: + results (dict): Result dict. + + Returns: + dict: Updated result dict. + """ + + assert 'mix_results' in results + if len(results['img'].shape) == 3: + c = results['img'].shape[2] + mosaic_img = np.full( + (int(self.img_scale[0] * 2), int(self.img_scale[1] * 2), c), + self.pad_val, + dtype=results['img'].dtype) + else: + mosaic_img = np.full( + (int(self.img_scale[0] * 2), int(self.img_scale[1] * 2)), + self.pad_val, + dtype=results['img'].dtype) + + # mosaic center x, y + self.center_x, self.center_y = self.generate_mosaic_center() + center_position = (self.center_x, self.center_y) + + loc_strs = ('top_left', 'top_right', 'bottom_left', 'bottom_right') + for i, loc in enumerate(loc_strs): + if loc == 'top_left': + result_patch = copy.deepcopy(results) + else: + result_patch = copy.deepcopy(results['mix_results'][i - 1]) + + img_i = result_patch['img'] + h_i, w_i = img_i.shape[:2] + # keep_ratio resize + scale_ratio_i = min(self.img_scale[0] / h_i, + self.img_scale[1] / w_i) + img_i = mmcv.imresize( + img_i, (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i))) + + # compute the combine parameters + paste_coord, crop_coord = self._mosaic_combine( + loc, center_position, img_i.shape[:2][::-1]) + x1_p, y1_p, x2_p, y2_p = paste_coord + x1_c, y1_c, x2_c, y2_c = crop_coord + + # crop and paste image + mosaic_img[y1_p:y2_p, x1_p:x2_p] = img_i[y1_c:y2_c, x1_c:x2_c] + + results['img'] = mosaic_img + results['img_shape'] = mosaic_img.shape + results['ori_shape'] = mosaic_img.shape + + return results + + def _mosaic_transform_seg(self, results: dict) -> dict: + """Mosaic transform function for label annotations. + + Args: + results (dict): Result dict. + + Returns: + dict: Updated result dict. + """ + + assert 'mix_results' in results + for key in results.get('seg_fields', []): + mosaic_seg = np.full( + (int(self.img_scale[0] * 2), int(self.img_scale[1] * 2)), + self.seg_pad_val, + dtype=results[key].dtype) + + # mosaic center x, y + center_position = (self.center_x, self.center_y) + + loc_strs = ('top_left', 'top_right', 'bottom_left', 'bottom_right') + for i, loc in enumerate(loc_strs): + if loc == 'top_left': + result_patch = copy.deepcopy(results) + else: + result_patch = copy.deepcopy(results['mix_results'][i - 1]) + + gt_seg_i = result_patch[key] + h_i, w_i = gt_seg_i.shape[:2] + # keep_ratio resize + scale_ratio_i = min(self.img_scale[0] / h_i, + self.img_scale[1] / w_i) + gt_seg_i = mmcv.imresize( + gt_seg_i, + (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i)), + interpolation='nearest') + + # compute the combine parameters + paste_coord, crop_coord = self._mosaic_combine( + loc, center_position, gt_seg_i.shape[:2][::-1]) + x1_p, y1_p, x2_p, y2_p = paste_coord + x1_c, y1_c, x2_c, y2_c = crop_coord + + # crop and paste image + mosaic_seg[y1_p:y2_p, x1_p:x2_p] = \ + gt_seg_i[y1_c:y2_c, x1_c:x2_c] + + results[key] = mosaic_seg + + return results + + def _mosaic_combine(self, loc: str, center_position_xy: Sequence[float], + img_shape_wh: Sequence[int]) -> tuple: + """Calculate global coordinate of mosaic image and local coordinate of + cropped sub-image. + + Args: + loc (str): Index for the sub-image, loc in ('top_left', + 'top_right', 'bottom_left', 'bottom_right'). + center_position_xy (Sequence[float]): Mixing center for 4 images, + (x, y). + img_shape_wh (Sequence[int]): Width and height of sub-image + + Returns: + tuple[tuple[float]]: Corresponding coordinate of pasting and + cropping + - paste_coord (tuple): paste corner coordinate in mosaic image. + - crop_coord (tuple): crop corner coordinate in mosaic image. + """ + + assert loc in ('top_left', 'top_right', 'bottom_left', 'bottom_right') + if loc == 'top_left': + # index0 to top left part of image + x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \ + max(center_position_xy[1] - img_shape_wh[1], 0), \ + center_position_xy[0], \ + center_position_xy[1] + crop_coord = img_shape_wh[0] - (x2 - x1), img_shape_wh[1] - ( + y2 - y1), img_shape_wh[0], img_shape_wh[1] + + elif loc == 'top_right': + # index1 to top right part of image + x1, y1, x2, y2 = center_position_xy[0], \ + max(center_position_xy[1] - img_shape_wh[1], 0), \ + min(center_position_xy[0] + img_shape_wh[0], + self.img_scale[1] * 2), \ + center_position_xy[1] + crop_coord = 0, img_shape_wh[1] - (y2 - y1), min( + img_shape_wh[0], x2 - x1), img_shape_wh[1] + + elif loc == 'bottom_left': + # index2 to bottom left part of image + x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \ + center_position_xy[1], \ + center_position_xy[0], \ + min(self.img_scale[0] * 2, center_position_xy[1] + + img_shape_wh[1]) + crop_coord = img_shape_wh[0] - (x2 - x1), 0, img_shape_wh[0], min( + y2 - y1, img_shape_wh[1]) + + else: + # index3 to bottom right part of image + x1, y1, x2, y2 = center_position_xy[0], \ + center_position_xy[1], \ + min(center_position_xy[0] + img_shape_wh[0], + self.img_scale[1] * 2), \ + min(self.img_scale[0] * 2, center_position_xy[1] + + img_shape_wh[1]) + crop_coord = 0, 0, min(img_shape_wh[0], + x2 - x1), min(y2 - y1, img_shape_wh[1]) + + paste_coord = x1, y1, x2, y2 + return paste_coord, crop_coord + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' + repr_str += f'img_scale={self.img_scale}, ' + repr_str += f'center_ratio_range={self.center_ratio_range}, ' + repr_str += f'pad_val={self.pad_val}, ' + repr_str += f'seg_pad_val={self.pad_val})' + return repr_str + + +@TRANSFORMS.register_module() +class GenerateEdge(BaseTransform): + """Generate Edge for CE2P approach. + + Edge will be used to calculate loss of + `CE2P `_. + + Modified from https://github.com/liutinglt/CE2P/blob/master/dataset/target_generation.py # noqa:E501 + + Required Keys: + + - img_shape + - gt_seg_map + + Added Keys: + - gt_edge_map (np.ndarray, uint8): The edge annotation generated from the + seg map by extracting border between different semantics. + + Args: + edge_width (int): The width of edge. Default to 3. + ignore_index (int): Index that will be ignored. Default to 255. + """ + + def __init__(self, edge_width: int = 3, ignore_index: int = 255) -> None: + super().__init__() + self.edge_width = edge_width + self.ignore_index = ignore_index + + def transform(self, results: Dict) -> Dict: + """Call function to generate edge from segmentation map. + + Args: + results (dict): Result dict. + + Returns: + dict: Result dict with edge mask. + """ + h, w = results['img_shape'] + edge = np.zeros((h, w), dtype=np.uint8) + seg_map = results['gt_seg_map'] + + # down + edge_down = edge[1:h, :] + edge_down[(seg_map[1:h, :] != seg_map[:h - 1, :]) + & (seg_map[1:h, :] != self.ignore_index) & + (seg_map[:h - 1, :] != self.ignore_index)] = 1 + # left + edge_left = edge[:, :w - 1] + edge_left[(seg_map[:, :w - 1] != seg_map[:, 1:w]) + & (seg_map[:, :w - 1] != self.ignore_index) & + (seg_map[:, 1:w] != self.ignore_index)] = 1 + # up_left + edge_upleft = edge[:h - 1, :w - 1] + edge_upleft[(seg_map[:h - 1, :w - 1] != seg_map[1:h, 1:w]) + & (seg_map[:h - 1, :w - 1] != self.ignore_index) & + (seg_map[1:h, 1:w] != self.ignore_index)] = 1 + # up_right + edge_upright = edge[:h - 1, 1:w] + edge_upright[(seg_map[:h - 1, 1:w] != seg_map[1:h, :w - 1]) + & (seg_map[:h - 1, 1:w] != self.ignore_index) & + (seg_map[1:h, :w - 1] != self.ignore_index)] = 1 + + kernel = cv2.getStructuringElement(cv2.MORPH_RECT, + (self.edge_width, self.edge_width)) + edge = cv2.dilate(edge, kernel) + + results['gt_edge_map'] = edge + results['edge_width'] = self.edge_width + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'edge_width={self.edge_width}, ' + repr_str += f'ignore_index={self.ignore_index})' + return repr_str + + +@TRANSFORMS.register_module() +class ResizeShortestEdge(BaseTransform): + """Resize the image and mask while keeping the aspect ratio unchanged. + + Modified from https://github.com/facebookresearch/detectron2/blob/main/detectron2/data/transforms/augmentation_impl.py#L130 # noqa:E501 + Copyright (c) Facebook, Inc. and its affiliates. + Licensed under the Apache-2.0 License + + This transform attempts to scale the shorter edge to the given + `scale`, as long as the longer edge does not exceed `max_size`. + If `max_size` is reached, then downscale so that the longer + edge does not exceed `max_size`. + + Required Keys: + + - img + - gt_seg_map (optional) + + Modified Keys: + + - img + - img_shape + - gt_seg_map (optional)) + + Added Keys: + + - scale + - scale_factor + - keep_ratio + + + Args: + scale (Union[int, Tuple[int, int]]): The target short edge length. + If it's tuple, will select the min value as the short edge length. + max_size (int): The maximum allowed longest edge length. + """ + + def __init__(self, scale: Union[int, Tuple[int, int]], + max_size: int) -> None: + super().__init__() + self.scale = scale + self.max_size = max_size + + # Create a empty Resize object + self.resize = TRANSFORMS.build({ + 'type': 'Resize', + 'scale': 0, + 'keep_ratio': True + }) + + def _get_output_shape(self, img, short_edge_length) -> Tuple[int, int]: + """Compute the target image shape with the given `short_edge_length`. + + Args: + img (np.ndarray): The input image. + short_edge_length (Union[int, Tuple[int, int]]): The target short + edge length. If it's tuple, will select the min value as the + short edge length. + """ + h, w = img.shape[:2] + if isinstance(short_edge_length, int): + size = short_edge_length * 1.0 + elif isinstance(short_edge_length, tuple): + size = min(short_edge_length) * 1.0 + scale = size / min(h, w) + if h < w: + new_h, new_w = size, scale * w + else: + new_h, new_w = scale * h, size + + if max(new_h, new_w) > self.max_size: + scale = self.max_size * 1.0 / max(new_h, new_w) + new_h *= scale + new_w *= scale + + new_h = int(new_h + 0.5) + new_w = int(new_w + 0.5) + return (new_w, new_h) + + def transform(self, results: Dict) -> Dict: + self.resize.scale = self._get_output_shape(results['img'], self.scale) + return self.resize(results) + + +@TRANSFORMS.register_module() +class BioMedical3DRandomCrop(BaseTransform): + """Crop the input patch for medical image & segmentation mask. + + Required Keys: + + - img (np.ndarray): Biomedical image with shape (N, Z, Y, X), + N is the number of modalities, and data type is float32. + - gt_seg_map (np.ndarray, optional): Biomedical semantic segmentation mask + with shape (Z, Y, X). + + Modified Keys: + + - img + - img_shape + - gt_seg_map (optional) + + Args: + crop_shape (Union[int, Tuple[int, int, int]]): Expected size after + cropping with the format of (z, y, x). If set to an integer, + then cropping width and height are equal to this integer. + keep_foreground (bool): If keep_foreground is True, it will sample a + voxel of foreground classes randomly, and will take it as the + center of the crop bounding-box. Default to True. + """ + + def __init__(self, + crop_shape: Union[int, Tuple[int, int, int]], + keep_foreground: bool = True): + super().__init__() + assert isinstance(crop_shape, int) or ( + isinstance(crop_shape, tuple) and len(crop_shape) == 3 + ), 'The expected crop_shape is an integer, or a tuple containing ' + 'three integers' + + if isinstance(crop_shape, int): + crop_shape = (crop_shape, crop_shape, crop_shape) + assert crop_shape[0] > 0 and crop_shape[1] > 0 and crop_shape[2] > 0 + self.crop_shape = crop_shape + self.keep_foreground = keep_foreground + + def random_sample_location(self, seg_map: np.ndarray) -> dict: + """sample foreground voxel when keep_foreground is True. + + Args: + seg_map (np.ndarray): gt seg map. + + Returns: + dict: Coordinates of selected foreground voxel. + """ + num_samples = 10000 + # at least 1% of the class voxels need to be selected, + # otherwise it may be too sparse + min_percent_coverage = 0.01 + class_locs = {} + foreground_classes = [] + all_classes = np.unique(seg_map) + for c in all_classes: + if c == 0: + # to avoid the segmentation mask full of background 0 + # and the class_locs is just void dictionary {} when it return + # there add a void list for background 0. + class_locs[c] = [] + else: + all_locs = np.argwhere(seg_map == c) + target_num_samples = min(num_samples, len(all_locs)) + target_num_samples = max( + target_num_samples, + int(np.ceil(len(all_locs) * min_percent_coverage))) + + selected = all_locs[np.random.choice( + len(all_locs), target_num_samples, replace=False)] + class_locs[c] = selected + foreground_classes.append(c) + + selected_voxel = None + if len(foreground_classes) > 0: + selected_class = np.random.choice(foreground_classes) + voxels_of_that_class = class_locs[selected_class] + selected_voxel = voxels_of_that_class[np.random.choice( + len(voxels_of_that_class))] + + return selected_voxel + + def random_generate_crop_bbox(self, margin_z: int, margin_y: int, + margin_x: int) -> tuple: + """Randomly get a crop bounding box. + + Args: + seg_map (np.ndarray): Ground truth segmentation map. + + Returns: + tuple: Coordinates of the cropped image. + """ + offset_z = np.random.randint(0, margin_z + 1) + offset_y = np.random.randint(0, margin_y + 1) + offset_x = np.random.randint(0, margin_x + 1) + crop_z1, crop_z2 = offset_z, offset_z + self.crop_shape[0] + crop_y1, crop_y2 = offset_y, offset_y + self.crop_shape[1] + crop_x1, crop_x2 = offset_x, offset_x + self.crop_shape[2] + + return crop_z1, crop_z2, crop_y1, crop_y2, crop_x1, crop_x2 + + def generate_margin(self, results: dict) -> tuple: + """Generate margin of crop bounding-box. + + If keep_foreground is True, it will sample a voxel of foreground + classes randomly, and will take it as the center of the bounding-box, + and return the margin between of the bounding-box and image. + If keep_foreground is False, it will return the difference from crop + shape and image shape. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + tuple: The margin for 3 dimensions of crop bounding-box and image. + """ + + seg_map = results['gt_seg_map'] + if self.keep_foreground: + selected_voxel = self.random_sample_location(seg_map) + if selected_voxel is None: + # this only happens if some image does not contain + # foreground voxels at all + warnings.warn(f'case does not contain any foreground classes' + f': {results["img_path"]}') + margin_z = max(seg_map.shape[0] - self.crop_shape[0], 0) + margin_y = max(seg_map.shape[1] - self.crop_shape[1], 0) + margin_x = max(seg_map.shape[2] - self.crop_shape[2], 0) + else: + margin_z = max(0, selected_voxel[0] - self.crop_shape[0] // 2) + margin_y = max(0, selected_voxel[1] - self.crop_shape[1] // 2) + margin_x = max(0, selected_voxel[2] - self.crop_shape[2] // 2) + margin_z = max( + 0, min(seg_map.shape[0] - self.crop_shape[0], margin_z)) + margin_y = max( + 0, min(seg_map.shape[1] - self.crop_shape[1], margin_y)) + margin_x = max( + 0, min(seg_map.shape[2] - self.crop_shape[2], margin_x)) + else: + margin_z = max(seg_map.shape[0] - self.crop_shape[0], 0) + margin_y = max(seg_map.shape[1] - self.crop_shape[1], 0) + margin_x = max(seg_map.shape[2] - self.crop_shape[2], 0) + + return margin_z, margin_y, margin_x + + def crop(self, img: np.ndarray, crop_bbox: tuple) -> np.ndarray: + """Crop from ``img`` + + Args: + img (np.ndarray): Original input image. + crop_bbox (tuple): Coordinates of the cropped image. + + Returns: + np.ndarray: The cropped image. + """ + crop_z1, crop_z2, crop_y1, crop_y2, crop_x1, crop_x2 = crop_bbox + if len(img.shape) == 3: + # crop seg map + img = img[crop_z1:crop_z2, crop_y1:crop_y2, crop_x1:crop_x2] + else: + # crop image + assert len(img.shape) == 4 + img = img[:, crop_z1:crop_z2, crop_y1:crop_y2, crop_x1:crop_x2] + return img + + def transform(self, results: dict) -> dict: + """Transform function to randomly crop images, semantic segmentation + maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Randomly cropped results, 'img_shape' key in result dict is + updated according to crop size. + """ + margin = self.generate_margin(results) + crop_bbox = self.random_generate_crop_bbox(*margin) + + # crop the image + img = results['img'] + results['img'] = self.crop(img, crop_bbox) + results['img_shape'] = results['img'].shape[1:] + + # crop semantic seg + seg_map = results['gt_seg_map'] + results['gt_seg_map'] = self.crop(seg_map, crop_bbox) + + return results + + def __repr__(self): + return self.__class__.__name__ + f'(crop_shape={self.crop_shape})' + + +@TRANSFORMS.register_module() +class BioMedicalGaussianNoise(BaseTransform): + """Add random Gaussian noise to image. + + Modified from https://github.com/MIC-DKFZ/batchgenerators/blob/7651ece69faf55263dd582a9f5cbd149ed9c3ad0/batchgenerators/transforms/noise_transforms.py#L53 # noqa:E501 + + Copyright (c) German Cancer Research Center (DKFZ) + Licensed under the Apache License, Version 2.0 + + Required Keys: + + - img (np.ndarray): Biomedical image with shape (N, Z, Y, X), + N is the number of modalities, and data type is float32. + + Modified Keys: + + - img + + Args: + prob (float): Probability to add Gaussian noise for + each sample. Default to 0.1. + mean (float): Mean or โ€œcentreโ€ of the distribution. Default to 0.0. + std (float): Standard deviation of distribution. Default to 0.1. + """ + + def __init__(self, + prob: float = 0.1, + mean: float = 0.0, + std: float = 0.1) -> None: + super().__init__() + assert 0.0 <= prob <= 1.0 and std >= 0.0 + self.prob = prob + self.mean = mean + self.std = std + + def transform(self, results: Dict) -> Dict: + """Call function to add random Gaussian noise to image. + + Args: + results (dict): Result dict. + + Returns: + dict: Result dict with random Gaussian noise. + """ + if np.random.rand() < self.prob: + rand_std = np.random.uniform(0, self.std) + noise = np.random.normal( + self.mean, rand_std, size=results['img'].shape) + # noise is float64 array, convert to the results['img'].dtype + noise = noise.astype(results['img'].dtype) + results['img'] = results['img'] + noise + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' + repr_str += f'mean={self.mean}, ' + repr_str += f'std={self.std})' + return repr_str + + +@TRANSFORMS.register_module() +class BioMedicalGaussianBlur(BaseTransform): + """Add Gaussian blur with random sigma to image. + + Modified from https://github.com/MIC-DKFZ/batchgenerators/blob/7651ece69faf55263dd582a9f5cbd149ed9c3ad0/batchgenerators/transforms/noise_transforms.py#L81 # noqa:E501 + + Copyright (c) German Cancer Research Center (DKFZ) + Licensed under the Apache License, Version 2.0 + + Required Keys: + + - img (np.ndarray): Biomedical image with shape (N, Z, Y, X), + N is the number of modalities, and data type is float32. + + Modified Keys: + + - img + + Args: + sigma_range (Tuple[float, float]|float): range to randomly + select sigma value. Default to (0.5, 1.0). + prob (float): Probability to apply Gaussian blur + for each sample. Default to 0.2. + prob_per_channel (float): Probability to apply Gaussian blur + for each channel (axis N of the image). Default to 0.5. + different_sigma_per_channel (bool): whether to use different + sigma for each channel (axis N of the image). Default to True. + different_sigma_per_axis (bool): whether to use different + sigma for axis Z, X and Y of the image. Default to True. + """ + + def __init__(self, + sigma_range: Tuple[float, float] = (0.5, 1.0), + prob: float = 0.2, + prob_per_channel: float = 0.5, + different_sigma_per_channel: bool = True, + different_sigma_per_axis: bool = True) -> None: + super().__init__() + assert 0.0 <= prob <= 1.0 + assert 0.0 <= prob_per_channel <= 1.0 + assert isinstance(sigma_range, Sequence) and len(sigma_range) == 2 + self.sigma_range = sigma_range + self.prob = prob + self.prob_per_channel = prob_per_channel + self.different_sigma_per_channel = different_sigma_per_channel + self.different_sigma_per_axis = different_sigma_per_axis + + def _get_valid_sigma(self, value_range) -> Tuple[float, ...]: + """Ensure the `value_range` to be either a single value or a sequence + of two values. If the `value_range` is a sequence, generate a random + value with `[value_range[0], value_range[1]]` based on uniform + sampling. + + Modified from https://github.com/MIC-DKFZ/batchgenerators/blob/7651ece69faf55263dd582a9f5cbd149ed9c3ad0/batchgenerators/augmentations/utils.py#L625 # noqa:E501 + + Args: + value_range (tuple|list|float|int): the input value range + """ + if (isinstance(value_range, (list, tuple))): + if (value_range[0] == value_range[1]): + value = value_range[0] + else: + orig_type = type(value_range[0]) + value = np.random.uniform(value_range[0], value_range[1]) + value = orig_type(value) + return value + + def _gaussian_blur(self, data_sample: np.ndarray) -> np.ndarray: + """Random generate sigma and apply Gaussian Blur to the data + Args: + data_sample (np.ndarray): data sample with multiple modalities, + the data shape is (N, Z, Y, X) + """ + sigma = None + for c in range(data_sample.shape[0]): + if np.random.rand() < self.prob_per_channel: + # if no `sigma` is generated, generate one + # if `self.different_sigma_per_channel` is True, + # re-generate random sigma for each channel + if (sigma is None or self.different_sigma_per_channel): + if (not self.different_sigma_per_axis): + sigma = self._get_valid_sigma(self.sigma_range) + else: + sigma = [ + self._get_valid_sigma(self.sigma_range) + for _ in data_sample.shape[1:] + ] + # apply gaussian filter with `sigma` + data_sample[c] = gaussian_filter( + data_sample[c], sigma, order=0) + return data_sample + + def transform(self, results: Dict) -> Dict: + """Call function to add random Gaussian blur to image. + + Args: + results (dict): Result dict. + + Returns: + dict: Result dict with random Gaussian noise. + """ + if np.random.rand() < self.prob: + results['img'] = self._gaussian_blur(results['img']) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' + repr_str += f'prob_per_channel={self.prob_per_channel}, ' + repr_str += f'sigma_range={self.sigma_range}, ' + repr_str += 'different_sigma_per_channel=' \ + f'{self.different_sigma_per_channel}, ' + repr_str += 'different_sigma_per_axis=' \ + f'{self.different_sigma_per_axis})' + return repr_str + + +@TRANSFORMS.register_module() +class BioMedicalRandomGamma(BaseTransform): + """Using random gamma correction to process the biomedical image. + + Modified from + https://github.com/MIC-DKFZ/batchgenerators/blob/master/batchgenerators/transforms/color_transforms.py#L132 # noqa:E501 + With licence: Apache 2.0 + + Required Keys: + + - img (np.ndarray): Biomedical image with shape (N, Z, Y, X), + N is the number of modalities, and data type is float32. + + Modified Keys: + - img + + Args: + prob (float): The probability to perform this transform. Default: 0.5. + gamma_range (Tuple[float]): Range of gamma values. Default: (0.5, 2). + invert_image (bool): Whether invert the image before applying gamma + augmentation. Default: False. + per_channel (bool): Whether perform the transform each channel + individually. Default: False + retain_stats (bool): Gamma transformation will alter the mean and std + of the data in the patch. If retain_stats=True, the data will be + transformed to match the mean and standard deviation before gamma + augmentation. Default: False. + """ + + def __init__(self, + prob: float = 0.5, + gamma_range: Tuple[float] = (0.5, 2), + invert_image: bool = False, + per_channel: bool = False, + retain_stats: bool = False): + assert 0 <= prob and prob <= 1 + assert isinstance(gamma_range, tuple) and len(gamma_range) == 2 + assert isinstance(invert_image, bool) + assert isinstance(per_channel, bool) + assert isinstance(retain_stats, bool) + self.prob = prob + self.gamma_range = gamma_range + self.invert_image = invert_image + self.per_channel = per_channel + self.retain_stats = retain_stats + + @cache_randomness + def _do_gamma(self): + """Whether do adjust gamma for image.""" + return np.random.rand() < self.prob + + def _adjust_gamma(self, img: np.array): + """Gamma adjustment for image. + + Args: + img (np.array): Input image before gamma adjust. + + Returns: + np.arrays: Image after gamma adjust. + """ + + if self.invert_image: + img = -img + + def _do_adjust(img): + if retain_stats_here: + img_mean = img.mean() + img_std = img.std() + if np.random.random() < 0.5 and self.gamma_range[0] < 1: + gamma = np.random.uniform(self.gamma_range[0], 1) + else: + gamma = np.random.uniform( + max(self.gamma_range[0], 1), self.gamma_range[1]) + img_min = img.min() + img_range = img.max() - img_min # range + img = np.power(((img - img_min) / float(img_range + 1e-7)), + gamma) * img_range + img_min + if retain_stats_here: + img = img - img.mean() + img = img / (img.std() + 1e-8) * img_std + img = img + img_mean + return img + + if not self.per_channel: + retain_stats_here = self.retain_stats + img = _do_adjust(img) + else: + for c in range(img.shape[0]): + img[c] = _do_adjust(img[c]) + if self.invert_image: + img = -img + return img + + def transform(self, results: dict) -> dict: + """Call function to perform random gamma correction + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with random gamma correction performed. + """ + do_gamma = self._do_gamma() + + if do_gamma: + results['img'] = self._adjust_gamma(results['img']) + else: + pass + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' + repr_str += f'gamma_range={self.gamma_range},' + repr_str += f'invert_image={self.invert_image},' + repr_str += f'per_channel={self.per_channel},' + repr_str += f'retain_stats={self.retain_stats}' + return repr_str + + +@TRANSFORMS.register_module() +class BioMedical3DPad(BaseTransform): + """Pad the biomedical 3d image & biomedical 3d semantic segmentation maps. + + Required Keys: + + - img (np.ndarry): Biomedical image with shape (N, Z, Y, X) by default, + N is the number of modalities. + - gt_seg_map (np.ndarray, optional): Biomedical seg map with shape + (Z, Y, X) by default. + + Modified Keys: + + - img (np.ndarry): Biomedical image with shape (N, Z, Y, X) by default, + N is the number of modalities. + - gt_seg_map (np.ndarray, optional): Biomedical seg map with shape + (Z, Y, X) by default. + + Added Keys: + + - pad_shape (Tuple[int, int, int]): The padded shape. + + Args: + pad_shape (Tuple[int, int, int]): Fixed padding size. + Expected padding shape (Z, Y, X). + pad_val (float): Padding value for biomedical image. + The padding mode is set to "constant". The value + to be filled in padding area. Default: 0. + seg_pad_val (int): Padding value for biomedical 3d semantic + segmentation maps. The padding mode is set to "constant". + The value to be filled in padding area. Default: 0. + """ + + def __init__(self, + pad_shape: Tuple[int, int, int], + pad_val: float = 0., + seg_pad_val: int = 0) -> None: + + # check pad_shape + assert pad_shape is not None + if not isinstance(pad_shape, tuple): + assert len(pad_shape) == 3 + + self.pad_shape = pad_shape + self.pad_val = pad_val + self.seg_pad_val = seg_pad_val + + def _pad_img(self, results: dict) -> None: + """Pad images according to ``self.pad_shape`` + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: The dict contains the padded image and shape + information. + """ + padded_img = self._to_pad( + results['img'], pad_shape=self.pad_shape, pad_val=self.pad_val) + + results['img'] = padded_img + results['pad_shape'] = padded_img.shape[1:] + + def _pad_seg(self, results: dict) -> None: + """Pad semantic segmentation map according to ``self.pad_shape`` if + ``gt_seg_map`` is not None in results dict. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Update the padded gt seg map in dict. + """ + if results.get('gt_seg_map', None) is not None: + pad_gt_seg = self._to_pad( + results['gt_seg_map'][None, ...], + pad_shape=results['pad_shape'], + pad_val=self.seg_pad_val) + results['gt_seg_map'] = pad_gt_seg[1:] + + @staticmethod + def _to_pad(img: np.ndarray, + pad_shape: Tuple[int, int, int], + pad_val: Union[int, float] = 0) -> np.ndarray: + """Pad the given 3d image to a certain shape with specified padding + value. + + Args: + img (ndarray): Biomedical image with shape (N, Z, Y, X) + to be padded. N is the number of modalities. + pad_shape (Tuple[int,int,int]): Expected padding shape (Z, Y, X). + pad_val (float, int): Values to be filled in padding areas + and the padding_mode is set to 'constant'. Default: 0. + + Returns: + ndarray: The padded image. + """ + # compute pad width + d = max(pad_shape[0] - img.shape[1], 0) + pad_d = (d // 2, d - d // 2) + h = max(pad_shape[1] - img.shape[2], 0) + pad_h = (h // 2, h - h // 2) + w = max(pad_shape[2] - img.shape[2], 0) + pad_w = (w // 2, w - w // 2) + + pad_list = [(0, 0), pad_d, pad_h, pad_w] + + img = np.pad(img, pad_list, mode='constant', constant_values=pad_val) + return img + + def transform(self, results: dict) -> dict: + """Call function to pad images, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Updated result dict. + """ + self._pad_img(results) + self._pad_seg(results) + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'pad_shape={self.pad_shape}, ' + repr_str += f'pad_val={self.pad_val}), ' + repr_str += f'seg_pad_val={self.seg_pad_val})' + return repr_str + + +@TRANSFORMS.register_module() +class BioMedical3DRandomFlip(BaseTransform): + """Flip biomedical 3D images and segmentations. + + Modified from https://github.com/MIC-DKFZ/batchgenerators/blob/master/batchgenerators/transforms/spatial_transforms.py # noqa:E501 + + Copyright 2021 Division of + Medical Image Computing, German Cancer Research Center (DKFZ) and Applied + Computer Vision Lab, Helmholtz Imaging Platform. + Licensed under the Apache-2.0 License. + + Required Keys: + + - img (np.ndarry): Biomedical image with shape (N, Z, Y, X) by default, + N is the number of modalities. + - gt_seg_map (np.ndarray, optional): Biomedical seg map with shape + (Z, Y, X) by default. + + Modified Keys: + + - img (np.ndarry): Biomedical image with shape (N, Z, Y, X) by default, + N is the number of modalities. + - gt_seg_map (np.ndarray, optional): Biomedical seg map with shape + (Z, Y, X) by default. + + Added Keys: + + - do_flip + - flip_axes + + Args: + prob (float): Flipping probability. + axes (Tuple[int, ...]): Flipping axes with order 'ZXY'. + swap_label_pairs (Optional[List[Tuple[int, int]]]): + The segmentation label pairs that are swapped when flipping. + """ + + def __init__(self, + prob: float, + axes: Tuple[int, ...], + swap_label_pairs: Optional[List[Tuple[int, int]]] = None): + self.prob = prob + self.axes = axes + self.swap_label_pairs = swap_label_pairs + assert prob >= 0 and prob <= 1 + if axes is not None: + assert max(axes) <= 2 + + @staticmethod + def _flip(img, direction: Tuple[bool, bool, bool]) -> np.ndarray: + if direction[0]: + img[:, :] = img[:, ::-1] + if direction[1]: + img[:, :, :] = img[:, :, ::-1] + if direction[2]: + img[:, :, :, :] = img[:, :, :, ::-1] + return img + + def _do_flip(self, img: np.ndarray) -> Tuple[bool, bool, bool]: + """Call function to determine which axis to flip. + + Args: + img (np.ndarry): Image or segmentation map array. + Returns: + tuple: Flip action, whether to flip on the z, x, and y axes. + """ + flip_c, flip_x, flip_y = False, False, False + if self.axes is not None: + flip_c = 0 in self.axes and np.random.rand() < self.prob + flip_x = 1 in self.axes and np.random.rand() < self.prob + if len(img.shape) == 4: + flip_y = 2 in self.axes and np.random.rand() < self.prob + return flip_c, flip_x, flip_y + + def _swap_label(self, seg: np.ndarray) -> np.ndarray: + out = seg.copy() + for first, second in self.swap_label_pairs: + first_area = (seg == first) + second_area = (seg == second) + out[first_area] = second + out[second_area] = first + return out + + def transform(self, results: Dict) -> Dict: + """Call function to flip and swap pair labels. + + Args: + results (dict): Result dict. + Returns: + dict: Flipped results, 'do_flip', 'flip_axes' keys are added into + result dict. + """ + # get actual flipped axis + if 'do_flip' not in results: + results['do_flip'] = self._do_flip(results['img']) + if 'flip_axes' not in results: + results['flip_axes'] = self.axes + # flip image + results['img'] = self._flip( + results['img'], direction=results['do_flip']) + # flip seg + if results['gt_seg_map'] is not None: + if results['gt_seg_map'].shape != results['img'].shape: + results['gt_seg_map'] = results['gt_seg_map'][None, :] + results['gt_seg_map'] = self._flip( + results['gt_seg_map'], direction=results['do_flip']) + results['gt_seg_map'] = results['gt_seg_map'].squeeze() + # swap label pairs + if self.swap_label_pairs is not None: + results['gt_seg_map'] = self._swap_label(results['gt_seg_map']) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, axes={self.axes}, ' \ + f'swap_label_pairs={self.swap_label_pairs})' + return repr_str + + +@TRANSFORMS.register_module() +class Albu(BaseTransform): + """Albumentation augmentation. Adds custom transformations from + Albumentations library. Please, visit + `https://albumentations.readthedocs.io` to get more information. An example + of ``transforms`` is as followed: + + .. code-block:: + [ + dict( + type='ShiftScaleRotate', + shift_limit=0.0625, + scale_limit=0.0, + rotate_limit=0, + interpolation=1, + p=0.5), + dict( + type='RandomBrightnessContrast', + brightness_limit=[0.1, 0.3], + contrast_limit=[0.1, 0.3], + p=0.2), + dict(type='ChannelShuffle', p=0.1), + dict( + type='OneOf', + transforms=[ + dict(type='Blur', blur_limit=3, p=1.0), + dict(type='MedianBlur', blur_limit=3, p=1.0) + ], + p=0.1), + ] + Args: + transforms (list[dict]): A list of albu transformations + keymap (dict): Contains {'input key':'albumentation-style key'} + additional_targets(dict): Allows applying same augmentations to \ + multiple objects of same type. + update_pad_shape (bool): Whether to update padding shape according to \ + the output shape of the last transform + bgr_to_rgb (bool): Whether to convert the band order to RGB + """ + + def __init__(self, + transforms: List[dict], + keymap: Optional[dict] = None, + additional_targets: Optional[dict] = None, + update_pad_shape: bool = False, + bgr_to_rgb: bool = True): + if not ALBU_INSTALLED: + raise ImportError( + 'albumentations is not installed, ' + 'we suggest install albumentation by ' + '"pip install albumentations>=0.3.2 --no-binary qudida,albumentations"' # noqa + ) + + # Args will be modified later, copying it will be safer + transforms = copy.deepcopy(transforms) + + self.transforms = transforms + self.keymap = keymap + self.additional_targets = additional_targets + self.update_pad_shape = update_pad_shape + self.bgr_to_rgb = bgr_to_rgb + + self.aug = Compose([self.albu_builder(t) for t in self.transforms], + additional_targets=self.additional_targets) + + if not keymap: + self.keymap_to_albu = {'img': 'image', 'gt_seg_map': 'mask'} + else: + self.keymap_to_albu = copy.deepcopy(keymap) + self.keymap_back = {v: k for k, v in self.keymap_to_albu.items()} + + def albu_builder(self, cfg: dict) -> object: + """Build a callable object from a dict containing albu arguments. + + Args: + cfg (dict): Config dict. It should at least contain the key "type". + + Returns: + Callable: A callable object. + """ + + assert isinstance(cfg, dict) and 'type' in cfg + args = cfg.copy() + + obj_type = args.pop('type') + if mmengine.is_str(obj_type): + if not ALBU_INSTALLED: + raise ImportError( + 'albumentations is not installed, ' + 'we suggest install albumentation by ' + '"pip install albumentations>=0.3.2 --no-binary qudida,albumentations"' # noqa + ) + obj_cls = getattr(albumentations, obj_type) + elif inspect.isclass(obj_type): + obj_cls = obj_type + else: + raise TypeError( + f'type must be a valid type or str, but got {type(obj_type)}') + + if 'transforms' in args: + args['transforms'] = [ + self.albu_builder(t) for t in args['transforms'] + ] + + return obj_cls(**args) + + @staticmethod + def mapper(d: dict, keymap: dict): + """Dictionary mapper. + + Renames keys according to keymap provided. + Args: + d (dict): old dict + keymap (dict): {'old_key':'new_key'} + Returns: + dict: new dict. + """ + + updated_dict = {} + for k, _ in zip(d.keys(), d.values()): + new_k = keymap.get(k, k) + updated_dict[new_k] = d[k] + return updated_dict + + def transform(self, results): + # dict to albumentations format + results = self.mapper(results, self.keymap_to_albu) + + # Convert to RGB since Albumentations works with RGB images + if self.bgr_to_rgb: + results['image'] = cv2.cvtColor(results['image'], + cv2.COLOR_BGR2RGB) + if self.additional_targets: + for key, value in self.additional_targets.items(): + if value == 'image': + results[key] = cv2.cvtColor(results[key], + cv2.COLOR_BGR2RGB) + + # Apply Transform + results = self.aug(**results) + + # Convert back to BGR + if self.bgr_to_rgb: + results['image'] = cv2.cvtColor(results['image'], + cv2.COLOR_RGB2BGR) + if self.additional_targets: + for key, value in self.additional_targets.items(): + if value == 'image': + results[key] = cv2.cvtColor(results['image2'], + cv2.COLOR_RGB2BGR) + + # back to the original format + results = self.mapper(results, self.keymap_back) + + # update final shape + if self.update_pad_shape: + results['pad_shape'] = results['img'].shape + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + f'(transforms={self.transforms})' + return repr_str + + +@TRANSFORMS.register_module() +class ConcatCDInput(BaseTransform): + """Concat images for change detection. + + Required Keys: + + - img + - img2 + + Args: + input_keys (tuple): Input image keys for change detection. + Default: ('img', 'img2'). + """ + + def __init__(self, input_keys=('img', 'img2')): + self.input_keys = input_keys + + def transform(self, results: dict) -> dict: + img = [] + for input_key in self.input_keys: + img.append(results.pop(input_key)) + results['img'] = np.concatenate(img, axis=2) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(input_keys={self.input_keys}, ' + return repr_str + + +@TRANSFORMS.register_module() +class RandomDepthMix(BaseTransform): + """This class implements the RandomDepthMix transform. + + Args: + prob (float): Probability of applying the transformation. + Defaults to 0.25. + mix_scale_ratio (float): Ratio to scale the mix width. + Defaults to 0.75. + """ + + def __init__( + self, + prob: float = 0.25, + mix_scale_ratio: float = 0.75, + ): + super().__init__() + + self.prob = prob + self.mix_scale_ratio = mix_scale_ratio + + def transform(self, results: dict) -> dict: + if random.random() > self.prob: + return results + + h, w = results['img_shape'][:2] + left = int(w * random.random()) + width_ratio = self.mix_scale_ratio * random.random() + width = int(max(1, (w - left) * width_ratio)) + + img = results['img'] + depth_rescale_factor = results.get('depth_rescale_factor', 1) + depth_map = results['gt_depth_map'] / depth_rescale_factor + + if img.ndim == 3: + for c in range(img.shape[-1]): + img[:, left:left + width, c] = depth_map[:, left:left + width] + elif img.ndim == 2: + img[:, left:left + width] = depth_map[:, left:left + width] + else: + raise ValueError(f'Invalid image shape ({img.shape})') + + results['img'] = img + return results diff --git a/mmsegmentation/mmseg/datasets/voc.py b/mmsegmentation/mmseg/datasets/voc.py new file mode 100644 index 0000000..5e5d602 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/voc.py @@ -0,0 +1,40 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class PascalVOCDataset(BaseSegDataset): + """Pascal VOC dataset. + + Args: + split (str): Split txt file for Pascal VOC. + """ + METAINFO = dict( + classes=('background', 'aeroplane', 'bicycle', 'bird', 'boat', + 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', + 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', + 'sofa', 'train', 'tvmonitor'), + palette=[[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], + [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128], + [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0], + [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128], + [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0], + [0, 64, 128]]) + + def __init__(self, + ann_file, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + ann_file=ann_file, + **kwargs) + assert fileio.exists(self.data_prefix['img_path'], + self.backend_args) and osp.isfile(self.ann_file) diff --git a/mmsegmentation/mmseg/datasets/xray.py b/mmsegmentation/mmseg/datasets/xray.py new file mode 100644 index 0000000..458e2c2 --- /dev/null +++ b/mmsegmentation/mmseg/datasets/xray.py @@ -0,0 +1,29 @@ +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset +import os.path as osp + + +@DATASETS.register_module() +class XRayDataset(BaseSegDataset): + METAINFO = dict( + classes = [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', + ], + palette=[ + (220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228), + (0, 60, 100), (0, 80, 100), (0, 0, 70), (0, 0, 192), (250, 170, 30), + (100, 170, 30), (220, 220, 0), (175, 116, 175), (250, 0, 30), (165, 42, 42), + (255, 77, 255), (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157), + (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), (255, 179, 240), + (0, 125, 92), (209, 0, 151), (188, 208, 182), (0, 220, 176), + ] + ) + + def __init__(self, data_root, data_prefix, pipeline, **kwargs): + super(XRayDataset, self).__init__( + data_root=data_root, data_prefix=data_prefix, pipeline=pipeline, **kwargs) \ No newline at end of file diff --git a/mmsegmentation/mmseg/datasets/xray2.py b/mmsegmentation/mmseg/datasets/xray2.py new file mode 100644 index 0000000..eafe94a --- /dev/null +++ b/mmsegmentation/mmseg/datasets/xray2.py @@ -0,0 +1,141 @@ +import os +import json + +import numpy as np +import cv2 +from sklearn.model_selection import GroupKFold + +from mmseg.registry import DATASETS, TRANSFORMS, MODELS, METRICS +from mmseg.datasets import BaseSegDataset + +from mmcv.transforms import BaseTransform + +# ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” + +IMAGE_ROOT = '/data/ephemeral/home/data/train/DCM' +LABEL_ROOT = '/data/ephemeral/home/data/train/outputs_json' + +CLASSES = [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', +] + +CLASS2IND = {v: i for i, v in enumerate(CLASSES)} +IND2CLASS = {v: k for k, v in CLASS2IND.items()} + +pngs = { + os.path.relpath(os.path.join(root, fname), start=IMAGE_ROOT) + for root, _dirs, files in os.walk(IMAGE_ROOT) + for fname in files + if os.path.splitext(fname)[1].lower() == ".png" +} + +jsons = { + os.path.relpath(os.path.join(root, fname), start=LABEL_ROOT) + for root, _dirs, files in os.walk(LABEL_ROOT) + for fname in files + if os.path.splitext(fname)[1].lower() == ".json" +} + +jsons_fn_prefix = {os.path.splitext(fname)[0] for fname in jsons} +pngs_fn_prefix = {os.path.splitext(fname)[0] for fname in pngs} + +assert len(jsons_fn_prefix - pngs_fn_prefix) == 0 +assert len(pngs_fn_prefix - jsons_fn_prefix) == 0 + +pngs = sorted(pngs) +jsons = sorted(jsons) + +_filenames = np.array(pngs) +_labelnames = np.array(jsons) + +# split train-valid +# ํ•œ ํด๋” ์•ˆ์— ํ•œ ์ธ๋ฌผ์˜ ์–‘์†์— ๋Œ€ํ•œ `.dcm` ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— +# ํด๋” ์ด๋ฆ„์„ ๊ทธ๋ฃน์œผ๋กœ ํ•ด์„œ GroupKFold๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +# ๋™์ผ ์ธ๋ฌผ์˜ ์†์ด train, valid์— ๋”ฐ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. +groups = [os.path.dirname(fname) for fname in _filenames] + +# dummy label +ys = [0 for fname in _filenames] + +# ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 20%๋ฅผ validation data๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด `n_splits`๋ฅผ +# 5์œผ๋กœ ์„ค์ •ํ•˜์—ฌ KFold๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +gkf = GroupKFold(n_splits=5) + +@DATASETS.register_module() +class XRayDataset2(BaseSegDataset): + def __init__(self, is_train, **kwargs): + self.is_train = is_train + + super().__init__(**kwargs) + + def load_data_list(self): + filenames = [] + labelnames = [] + valid_set_num = 2 + for i, (x, y) in enumerate(gkf.split(_filenames, ys, groups)): + if self.is_train: + if i == valid_set_num: + continue + + filenames += list(_filenames[y]) + labelnames += list(_labelnames[y]) + + else: + if i == valid_set_num: + filenames = list(_filenames[y]) + labelnames = list(_labelnames[y]) + break + + data_list = [] + for i, (img_path, ann_path) in enumerate(zip(filenames, labelnames)): + data_info = dict( + img_path=os.path.join(IMAGE_ROOT, img_path), + seg_map_path=os.path.join(LABEL_ROOT, ann_path), + ) + data_list.append(data_info) + + return data_list + + +@TRANSFORMS.register_module() +class LoadXRayAnnotations(BaseTransform): + def transform(self, result): + label_path = result["seg_map_path"] + + image_size = (2048, 2048) + + # process a label of shape (H, W, NC) + label_shape = image_size + (len(CLASSES), ) + label = np.zeros(label_shape, dtype=np.uint8) + + # read label file + with open(label_path, "r") as f: + annotations = json.load(f) + annotations = annotations["annotations"] + + # iterate each class + for ann in annotations: + c = ann["label"] + class_ind = CLASS2IND[c] + points = np.array(ann["points"]) + + # polygon to mask + class_label = np.zeros(image_size, dtype=np.uint8) + cv2.fillPoly(class_label, [points], 1) + label[..., class_ind] = class_label + + result["gt_seg_map"] = label + + return result + +@TRANSFORMS.register_module() +class TransposeAnnotations(BaseTransform): + def transform(self, result): + result["gt_seg_map"] = np.transpose(result["gt_seg_map"], (2, 0, 1)) + + return result \ No newline at end of file diff --git a/mmsegmentation/mmseg/engine/__init__.py b/mmsegmentation/mmseg/engine/__init__.py new file mode 100644 index 0000000..98139a0 --- /dev/null +++ b/mmsegmentation/mmseg/engine/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .hooks import SegVisualizationHook +from .optimizers import (ForceDefaultOptimWrapperConstructor, + LayerDecayOptimizerConstructor, + LearningRateDecayOptimizerConstructor) +from .schedulers import PolyLRRatio + +__all__ = [ + 'LearningRateDecayOptimizerConstructor', 'LayerDecayOptimizerConstructor', + 'SegVisualizationHook', 'PolyLRRatio', + 'ForceDefaultOptimWrapperConstructor' +] diff --git a/mmsegmentation/mmseg/engine/hooks/__init__.py b/mmsegmentation/mmseg/engine/hooks/__init__.py new file mode 100644 index 0000000..c604808 --- /dev/null +++ b/mmsegmentation/mmseg/engine/hooks/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .visualization_hook import SegVisualizationHook + +__all__ = ['SegVisualizationHook'] diff --git a/mmsegmentation/mmseg/engine/hooks/visualization_hook.py b/mmsegmentation/mmseg/engine/hooks/visualization_hook.py new file mode 100644 index 0000000..21cddde --- /dev/null +++ b/mmsegmentation/mmseg/engine/hooks/visualization_hook.py @@ -0,0 +1,129 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import warnings +from typing import Optional, Sequence + +import mmcv +from mmengine.fileio import get +from mmengine.hooks import Hook +from mmengine.runner import Runner +from mmengine.visualization import Visualizer + +from mmseg.registry import HOOKS +from mmseg.structures import SegDataSample + + +@HOOKS.register_module() +class SegVisualizationHook(Hook): + """Segmentation Visualization Hook. Used to visualize validation and + testing process prediction results. + + In the testing phase: + + 1. If ``show`` is True, it means that only the prediction results are + visualized without storing data, so ``vis_backends`` needs to + be excluded. + + Args: + draw (bool): whether to draw prediction results. If it is False, + it means that no drawing will be done. Defaults to False. + interval (int): The interval of visualization. Defaults to 50. + show (bool): Whether to display the drawn image. Default to False. + wait_time (float): The interval of show (s). Defaults to 0. + backend_args (dict, Optional): Arguments to instantiate a file backend. + See https://mmengine.readthedocs.io/en/latest/api/fileio.htm + for details. Defaults to None. + Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. + """ + + def __init__(self, + draw: bool = False, + interval: int = 50, + show: bool = False, + wait_time: float = 0., + backend_args: Optional[dict] = None): + self._visualizer: Visualizer = Visualizer.get_current_instance() + self.interval = interval + self.show = show + if self.show: + # No need to think about vis backends. + self._visualizer._vis_backends = {} + warnings.warn('The show is True, it means that only ' + 'the prediction results are visualized ' + 'without storing data, so vis_backends ' + 'needs to be excluded.') + + self.wait_time = wait_time + self.backend_args = backend_args.copy() if backend_args else None + self.draw = draw + if not self.draw: + warnings.warn('The draw is False, it means that the ' + 'hook for visualization will not take ' + 'effect. The results will NOT be ' + 'visualized or stored.') + self._test_index = 0 + + def after_val_iter(self, runner: Runner, batch_idx: int, data_batch: dict, + outputs: Sequence[SegDataSample]) -> None: + """Run after every ``self.interval`` validation iterations. + + Args: + runner (:obj:`Runner`): The runner of the validation process. + batch_idx (int): The index of the current batch in the val loop. + data_batch (dict): Data from dataloader. + outputs (Sequence[:obj:`SegDataSample`]]): A batch of data samples + that contain annotations and predictions. + """ + if self.draw is False: + return + + # There is no guarantee that the same batch of images + # is visualized for each evaluation. + total_curr_iter = runner.iter + batch_idx + + # Visualize only the first data + img_path = outputs[0].img_path + img_bytes = get(img_path, backend_args=self.backend_args) + img = mmcv.imfrombytes(img_bytes, channel_order='rgb') + window_name = f'val_{osp.basename(img_path)}' + + if total_curr_iter % self.interval == 0: + self._visualizer.add_datasample( + window_name, + img, + data_sample=outputs[0], + show=self.show, + wait_time=self.wait_time, + step=total_curr_iter) + + def after_test_iter(self, runner: Runner, batch_idx: int, data_batch: dict, + outputs: Sequence[SegDataSample]) -> None: + """Run after every testing iterations. + + Args: + runner (:obj:`Runner`): The runner of the testing process. + batch_idx (int): The index of the current batch in the val loop. + data_batch (dict): Data from dataloader. + outputs (Sequence[:obj:`SegDataSample`]): A batch of data samples + that contain annotations and predictions. + """ + if self.draw is False: + return + + for data_sample in outputs: + self._test_index += 1 + + img_path = data_sample.img_path + window_name = f'test_{osp.basename(img_path)}' + + img_path = data_sample.img_path + img_bytes = get(img_path, backend_args=self.backend_args) + img = mmcv.imfrombytes(img_bytes, channel_order='rgb') + + self._visualizer.add_datasample( + window_name, + img, + data_sample=data_sample, + show=self.show, + wait_time=self.wait_time, + step=self._test_index) diff --git a/mmsegmentation/mmseg/engine/optimizers/__init__.py b/mmsegmentation/mmseg/engine/optimizers/__init__.py new file mode 100644 index 0000000..e4cf587 --- /dev/null +++ b/mmsegmentation/mmseg/engine/optimizers/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .force_default_constructor import ForceDefaultOptimWrapperConstructor +from .layer_decay_optimizer_constructor import ( + LayerDecayOptimizerConstructor, LearningRateDecayOptimizerConstructor) + +__all__ = [ + 'LearningRateDecayOptimizerConstructor', 'LayerDecayOptimizerConstructor', + 'ForceDefaultOptimWrapperConstructor' +] diff --git a/mmsegmentation/mmseg/engine/optimizers/force_default_constructor.py b/mmsegmentation/mmseg/engine/optimizers/force_default_constructor.py new file mode 100644 index 0000000..12c642a --- /dev/null +++ b/mmsegmentation/mmseg/engine/optimizers/force_default_constructor.py @@ -0,0 +1,255 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +from typing import List, Optional, Union + +import torch +import torch.nn as nn +from mmengine.logging import print_log +from mmengine.optim import DefaultOptimWrapperConstructor +from mmengine.utils.dl_utils import mmcv_full_available +from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm, _InstanceNorm +from torch.nn import GroupNorm, LayerNorm + +from mmseg.registry import OPTIM_WRAPPER_CONSTRUCTORS + + +@OPTIM_WRAPPER_CONSTRUCTORS.register_module() +class ForceDefaultOptimWrapperConstructor(DefaultOptimWrapperConstructor): + """Default constructor with forced optimizer settings. + + This constructor extends the default constructor to add an option for + forcing default optimizer settings. This is useful for ensuring that + certain parameters or layers strictly adhere to pre-defined default + settings, regardless of any custom settings specified. + + By default, each parameter share the same optimizer settings, and we + provide an argument ``paramwise_cfg`` to specify parameter-wise settings. + It is a dict and may contain various fields like 'custom_keys', + 'bias_lr_mult', etc., as well as the additional field + `force_default_settings` which allows for enforcing default settings on + optimizer parameters. + + - ``custom_keys`` (dict): Specified parameters-wise settings by keys. If + one of the keys in ``custom_keys`` is a substring of the name of one + parameter, then the setting of the parameter will be specified by + ``custom_keys[key]`` and other setting like ``bias_lr_mult`` etc. will + be ignored. It should be noted that the aforementioned ``key`` is the + longest key that is a substring of the name of the parameter. If there + are multiple matched keys with the same length, then the key with lower + alphabet order will be chosen. + ``custom_keys[key]`` should be a dict and may contain fields ``lr_mult`` + and ``decay_mult``. See Example 2 below. + - ``bias_lr_mult`` (float): It will be multiplied to the learning + rate for all bias parameters (except for those in normalization + layers and offset layers of DCN). + - ``bias_decay_mult`` (float): It will be multiplied to the weight + decay for all bias parameters (except for those in + normalization layers, depthwise conv layers, offset layers of DCN). + - ``norm_decay_mult`` (float): It will be multiplied to the weight + decay for all weight and bias parameters of normalization + layers. + - ``flat_decay_mult`` (float): It will be multiplied to the weight + decay for all one-dimensional parameters + - ``dwconv_decay_mult`` (float): It will be multiplied to the weight + decay for all weight and bias parameters of depthwise conv + layers. + - ``dcn_offset_lr_mult`` (float): It will be multiplied to the learning + rate for parameters of offset layer in the deformable convs + of a model. + - ``bypass_duplicate`` (bool): If true, the duplicate parameters + would not be added into optimizer. Defaults to False. + - ``force_default_settings`` (bool): If true, this will override any + custom settings defined by ``custom_keys`` and enforce the use of + default settings for optimizer parameters like ``bias_lr_mult``. + This is particularly useful when you want to ensure that certain layers + or parameters adhere strictly to the pre-defined default settings. + + Note: + + 1. If the option ``dcn_offset_lr_mult`` is used, the constructor will + override the effect of ``bias_lr_mult`` in the bias of offset layer. + So be careful when using both ``bias_lr_mult`` and + ``dcn_offset_lr_mult``. If you wish to apply both of them to the offset + layer in deformable convs, set ``dcn_offset_lr_mult`` to the original + ``dcn_offset_lr_mult`` * ``bias_lr_mult``. + + 2. If the option ``dcn_offset_lr_mult`` is used, the constructor will + apply it to all the DCN layers in the model. So be careful when the + model contains multiple DCN layers in places other than backbone. + + 3. When the option ``force_default_settings`` is true, it will override + any custom settings provided in ``custom_keys``. This ensures that the + default settings for the optimizer parameters are used. + + Args: + optim_wrapper_cfg (dict): The config dict of the optimizer wrapper. + + Required fields of ``optim_wrapper_cfg`` are + + - ``type``: class name of the OptimizerWrapper + - ``optimizer``: The configuration of optimizer. + + Optional fields of ``optim_wrapper_cfg`` are + + - any arguments of the corresponding optimizer wrapper type, + e.g., accumulative_counts, clip_grad, etc. + + Required fields of ``optimizer`` are + + - `type`: class name of the optimizer. + + Optional fields of ``optimizer`` are + + - any arguments of the corresponding optimizer type, e.g., + lr, weight_decay, momentum, etc. + + paramwise_cfg (dict, optional): Parameter-wise options. + + Example 1: + >>> model = torch.nn.modules.Conv1d(1, 1, 1) + >>> optim_wrapper_cfg = dict( + >>> dict(type='OptimWrapper', optimizer=dict(type='SGD', lr=0.01, + >>> momentum=0.9, weight_decay=0.0001)) + >>> paramwise_cfg = dict(norm_decay_mult=0.) + >>> optim_wrapper_builder = DefaultOptimWrapperConstructor( + >>> optim_wrapper_cfg, paramwise_cfg) + >>> optim_wrapper = optim_wrapper_builder(model) + + Example 2: + >>> # assume model have attribute model.backbone and model.cls_head + >>> optim_wrapper_cfg = dict(type='OptimWrapper', optimizer=dict( + >>> type='SGD', lr=0.01, weight_decay=0.95)) + >>> paramwise_cfg = dict(custom_keys={ + >>> 'backbone': dict(lr_mult=0.1, decay_mult=0.9)}) + >>> optim_wrapper_builder = DefaultOptimWrapperConstructor( + >>> optim_wrapper_cfg, paramwise_cfg) + >>> optim_wrapper = optim_wrapper_builder(model) + >>> # Then the `lr` and `weight_decay` for model.backbone is + >>> # (0.01 * 0.1, 0.95 * 0.9). `lr` and `weight_decay` for + >>> # model.cls_head is (0.01, 0.95). + """ + + def add_params(self, + params: List[dict], + module: nn.Module, + prefix: str = '', + is_dcn_module: Optional[Union[int, float]] = None) -> None: + """Add all parameters of module to the params list. + + The parameters of the given module will be added to the list of param + groups, with specific rules defined by paramwise_cfg. + + Args: + params (list[dict]): A list of param groups, it will be modified + in place. + module (nn.Module): The module to be added. + prefix (str): The prefix of the module + is_dcn_module (int|float|None): If the current module is a + submodule of DCN, `is_dcn_module` will be passed to + control conv_offset layer's learning rate. Defaults to None. + """ + # get param-wise options + custom_keys = self.paramwise_cfg.get('custom_keys', {}) + # first sort with alphabet order and then sort with reversed len of str + sorted_keys = sorted(sorted(custom_keys.keys()), key=len, reverse=True) + + bias_lr_mult = self.paramwise_cfg.get('bias_lr_mult', None) + bias_decay_mult = self.paramwise_cfg.get('bias_decay_mult', None) + norm_decay_mult = self.paramwise_cfg.get('norm_decay_mult', None) + dwconv_decay_mult = self.paramwise_cfg.get('dwconv_decay_mult', None) + flat_decay_mult = self.paramwise_cfg.get('flat_decay_mult', None) + bypass_duplicate = self.paramwise_cfg.get('bypass_duplicate', False) + dcn_offset_lr_mult = self.paramwise_cfg.get('dcn_offset_lr_mult', None) + force_default_settings = self.paramwise_cfg.get( + 'force_default_settings', False) + + # special rules for norm layers and depth-wise conv layers + is_norm = isinstance(module, + (_BatchNorm, _InstanceNorm, GroupNorm, LayerNorm)) + is_dwconv = ( + isinstance(module, torch.nn.Conv2d) + and module.in_channels == module.groups) + + for name, param in module.named_parameters(recurse=False): + param_group = {'params': [param]} + if bypass_duplicate and self._is_in(param_group, params): + print_log( + f'{prefix} is duplicate. It is skipped since ' + f'bypass_duplicate={bypass_duplicate}', + logger='current', + level=logging.WARNING) + continue + if not param.requires_grad: + params.append(param_group) + continue + + # if the parameter match one of the custom keys, ignore other rules + is_custom = False + for key in sorted_keys: + if key in f'{prefix}.{name}': + is_custom = True + lr_mult = custom_keys[key].get('lr_mult', 1.) + param_group['lr'] = self.base_lr * lr_mult + if self.base_wd is not None: + decay_mult = custom_keys[key].get('decay_mult', 1.) + param_group['weight_decay'] = self.base_wd * decay_mult + # add custom settings to param_group + for k, v in custom_keys[key].items(): + param_group[k] = v + break + + if not is_custom or force_default_settings: + # bias_lr_mult affects all bias parameters + # except for norm.bias dcn.conv_offset.bias + if name == 'bias' and not ( + is_norm or is_dcn_module) and bias_lr_mult is not None: + param_group['lr'] = self.base_lr * bias_lr_mult + + if (prefix.find('conv_offset') != -1 and is_dcn_module + and dcn_offset_lr_mult is not None + and isinstance(module, torch.nn.Conv2d)): + # deal with both dcn_offset's bias & weight + param_group['lr'] = self.base_lr * dcn_offset_lr_mult + + # apply weight decay policies + if self.base_wd is not None: + # norm decay + if is_norm and norm_decay_mult is not None: + param_group[ + 'weight_decay'] = self.base_wd * norm_decay_mult + # bias lr and decay + elif (name == 'bias' and not is_dcn_module + and bias_decay_mult is not None): + param_group[ + 'weight_decay'] = self.base_wd * bias_decay_mult + # depth-wise conv + elif is_dwconv and dwconv_decay_mult is not None: + param_group[ + 'weight_decay'] = self.base_wd * dwconv_decay_mult + # flatten parameters except dcn offset + elif (param.ndim == 1 and not is_dcn_module + and flat_decay_mult is not None): + param_group[ + 'weight_decay'] = self.base_wd * flat_decay_mult + params.append(param_group) + for key, value in param_group.items(): + if key == 'params': + continue + full_name = f'{prefix}.{name}' if prefix else name + print_log( + f'paramwise_options -- {full_name}:{key}={value}', + logger='current') + + if mmcv_full_available(): + from mmcv.ops import DeformConv2d, ModulatedDeformConv2d + is_dcn_module = isinstance(module, + (DeformConv2d, ModulatedDeformConv2d)) + else: + is_dcn_module = False + for child_name, child_mod in module.named_children(): + child_prefix = f'{prefix}.{child_name}' if prefix else child_name + self.add_params( + params, + child_mod, + prefix=child_prefix, + is_dcn_module=is_dcn_module) diff --git a/mmsegmentation/mmseg/engine/optimizers/layer_decay_optimizer_constructor.py b/mmsegmentation/mmseg/engine/optimizers/layer_decay_optimizer_constructor.py new file mode 100644 index 0000000..fdae3ca --- /dev/null +++ b/mmsegmentation/mmseg/engine/optimizers/layer_decay_optimizer_constructor.py @@ -0,0 +1,207 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import json +import warnings + +from mmengine.dist import get_dist_info +from mmengine.logging import print_log +from mmengine.optim import DefaultOptimWrapperConstructor + +from mmseg.registry import OPTIM_WRAPPER_CONSTRUCTORS + + +def get_layer_id_for_convnext(var_name, max_layer_id): + """Get the layer id to set the different learning rates in ``layer_wise`` + decay_type. + + Args: + var_name (str): The key of the model. + max_layer_id (int): Maximum number of backbone layers. + + Returns: + int: The id number corresponding to different learning rate in + ``LearningRateDecayOptimizerConstructor``. + """ + + if var_name in ('backbone.cls_token', 'backbone.mask_token', + 'backbone.pos_embed'): + return 0 + elif var_name.startswith('backbone.downsample_layers'): + stage_id = int(var_name.split('.')[2]) + if stage_id == 0: + layer_id = 0 + elif stage_id == 1: + layer_id = 2 + elif stage_id == 2: + layer_id = 3 + elif stage_id == 3: + layer_id = max_layer_id + return layer_id + elif var_name.startswith('backbone.stages'): + stage_id = int(var_name.split('.')[2]) + block_id = int(var_name.split('.')[3]) + if stage_id == 0: + layer_id = 1 + elif stage_id == 1: + layer_id = 2 + elif stage_id == 2: + layer_id = 3 + block_id // 3 + elif stage_id == 3: + layer_id = max_layer_id + return layer_id + else: + return max_layer_id + 1 + + +def get_stage_id_for_convnext(var_name, max_stage_id): + """Get the stage id to set the different learning rates in ``stage_wise`` + decay_type. + + Args: + var_name (str): The key of the model. + max_stage_id (int): Maximum number of backbone layers. + + Returns: + int: The id number corresponding to different learning rate in + ``LearningRateDecayOptimizerConstructor``. + """ + + if var_name in ('backbone.cls_token', 'backbone.mask_token', + 'backbone.pos_embed'): + return 0 + elif var_name.startswith('backbone.downsample_layers'): + return 0 + elif var_name.startswith('backbone.stages'): + stage_id = int(var_name.split('.')[2]) + return stage_id + 1 + else: + return max_stage_id - 1 + + +def get_layer_id_for_vit(var_name, max_layer_id): + """Get the layer id to set the different learning rates. + + Args: + var_name (str): The key of the model. + num_max_layer (int): Maximum number of backbone layers. + + Returns: + int: Returns the layer id of the key. + """ + + if var_name in ('backbone.cls_token', 'backbone.mask_token', + 'backbone.pos_embed'): + return 0 + elif var_name.startswith('backbone.patch_embed'): + return 0 + elif var_name.startswith('backbone.layers'): + layer_id = int(var_name.split('.')[2]) + return layer_id + 1 + else: + return max_layer_id - 1 + + +@OPTIM_WRAPPER_CONSTRUCTORS.register_module() +class LearningRateDecayOptimizerConstructor(DefaultOptimWrapperConstructor): + """Different learning rates are set for different layers of backbone. + + Note: Currently, this optimizer constructor is built for ConvNeXt, + BEiT and MAE. + """ + + def add_params(self, params, module, **kwargs): + """Add all parameters of module to the params list. + + The parameters of the given module will be added to the list of param + groups, with specific rules defined by paramwise_cfg. + + Args: + params (list[dict]): A list of param groups, it will be modified + in place. + module (nn.Module): The module to be added. + """ + + parameter_groups = {} + print_log(f'self.paramwise_cfg is {self.paramwise_cfg}') + num_layers = self.paramwise_cfg.get('num_layers') + 2 + decay_rate = self.paramwise_cfg.get('decay_rate') + decay_type = self.paramwise_cfg.get('decay_type', 'layer_wise') + print_log('Build LearningRateDecayOptimizerConstructor ' + f'{decay_type} {decay_rate} - {num_layers}') + weight_decay = self.base_wd + for name, param in module.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith('.bias') or name in ( + 'pos_embed', 'cls_token'): + group_name = 'no_decay' + this_weight_decay = 0. + else: + group_name = 'decay' + this_weight_decay = weight_decay + if 'layer_wise' in decay_type: + if 'ConvNeXt' in module.backbone.__class__.__name__: + layer_id = get_layer_id_for_convnext( + name, self.paramwise_cfg.get('num_layers')) + print_log(f'set param {name} as id {layer_id}') + elif 'BEiT' in module.backbone.__class__.__name__ or \ + 'MAE' in module.backbone.__class__.__name__: + layer_id = get_layer_id_for_vit(name, num_layers) + print_log(f'set param {name} as id {layer_id}') + else: + raise NotImplementedError() + elif decay_type == 'stage_wise': + if 'ConvNeXt' in module.backbone.__class__.__name__: + layer_id = get_stage_id_for_convnext(name, num_layers) + print_log(f'set param {name} as id {layer_id}') + else: + raise NotImplementedError() + group_name = f'layer_{layer_id}_{group_name}' + + if group_name not in parameter_groups: + scale = decay_rate**(num_layers - layer_id - 1) + + parameter_groups[group_name] = { + 'weight_decay': this_weight_decay, + 'params': [], + 'param_names': [], + 'lr_scale': scale, + 'group_name': group_name, + 'lr': scale * self.base_lr, + } + + parameter_groups[group_name]['params'].append(param) + parameter_groups[group_name]['param_names'].append(name) + rank, _ = get_dist_info() + if rank == 0: + to_display = {} + for key in parameter_groups: + to_display[key] = { + 'param_names': parameter_groups[key]['param_names'], + 'lr_scale': parameter_groups[key]['lr_scale'], + 'lr': parameter_groups[key]['lr'], + 'weight_decay': parameter_groups[key]['weight_decay'], + } + print_log(f'Param groups = {json.dumps(to_display, indent=2)}') + params.extend(parameter_groups.values()) + + +@OPTIM_WRAPPER_CONSTRUCTORS.register_module() +class LayerDecayOptimizerConstructor(LearningRateDecayOptimizerConstructor): + """Different learning rates are set for different layers of backbone. + + Note: Currently, this optimizer constructor is built for BEiT, + and it will be deprecated. + Please use ``LearningRateDecayOptimizerConstructor`` instead. + """ + + def __init__(self, optim_wrapper_cfg, paramwise_cfg): + warnings.warn('DeprecationWarning: Original ' + 'LayerDecayOptimizerConstructor of BEiT ' + 'will be deprecated. Please use ' + 'LearningRateDecayOptimizerConstructor instead, ' + 'and set decay_type = layer_wise_vit in paramwise_cfg.') + paramwise_cfg.update({'decay_type': 'layer_wise_vit'}) + warnings.warn('DeprecationWarning: Layer_decay_rate will ' + 'be deleted, please use decay_rate instead.') + paramwise_cfg['decay_rate'] = paramwise_cfg.pop('layer_decay_rate') + super().__init__(optim_wrapper_cfg, paramwise_cfg) diff --git a/mmsegmentation/mmseg/engine/schedulers/__init__.py b/mmsegmentation/mmseg/engine/schedulers/__init__.py new file mode 100644 index 0000000..3cd3f62 --- /dev/null +++ b/mmsegmentation/mmseg/engine/schedulers/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .poly_ratio_scheduler import PolyLRRatio + +__all__ = ['PolyLRRatio'] diff --git a/mmsegmentation/mmseg/engine/schedulers/poly_ratio_scheduler.py b/mmsegmentation/mmseg/engine/schedulers/poly_ratio_scheduler.py new file mode 100644 index 0000000..057203a --- /dev/null +++ b/mmsegmentation/mmseg/engine/schedulers/poly_ratio_scheduler.py @@ -0,0 +1,62 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + +from mmengine.optim.scheduler import PolyLR + +from mmseg.registry import PARAM_SCHEDULERS + + +@PARAM_SCHEDULERS.register_module() +class PolyLRRatio(PolyLR): + """Implements polynomial learning rate decay with ratio. + + This scheduler adjusts the learning rate of each parameter group + following a polynomial decay equation. The decay can occur in + conjunction with external parameter adjustments made outside this + scheduler. + + Args: + optimizer (Optimizer or OptimWrapper): Wrapped optimizer. + eta_min (float): Minimum learning rate at the end of scheduling. + Defaults to 0. + eta_min_ratio (float, optional): The ratio of the minimum parameter + value to the base parameter value. Either `eta_min` or + `eta_min_ratio` should be specified. Defaults to None. + power (float): The power of the polynomial. Defaults to 1.0. + begin (int): Step at which to start updating the parameters. + Defaults to 0. + end (int): Step at which to stop updating the parameters. + Defaults to INF. + last_step (int): The index of last step. Used for resume without + state dict. Defaults to -1. + by_epoch (bool): Whether the scheduled parameters are updated by + epochs. Defaults to True. + verbose (bool): Whether to print the value for each update. + Defaults to False. + """ + + def __init__(self, eta_min_ratio: Optional[int] = None, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.eta_min_ratio = eta_min_ratio + + def _get_value(self): + """Compute value using chainable form of the scheduler.""" + + if self.last_step == 0: + return [ + group[self.param_name] for group in self.optimizer.param_groups + ] + + param_groups_value = [] + for base_value, param_group in zip(self.base_values, + self.optimizer.param_groups): + eta_min = self.eta_min if self.eta_min_ratio is None else \ + base_value * self.eta_min_ratio + step_ratio = (1 - 1 / + (self.total_iters - self.last_step + 1))**self.power + step_value = (param_group[self.param_name] - + eta_min) * step_ratio + eta_min + param_groups_value.append(step_value) + + return param_groups_value diff --git a/mmsegmentation/mmseg/evaluation/__init__.py b/mmsegmentation/mmseg/evaluation/__init__.py new file mode 100644 index 0000000..82b3a8d --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .metrics import CityscapesMetric, DepthMetric, IoUMetric + +__all__ = ['IoUMetric', 'CityscapesMetric', 'DepthMetric'] diff --git a/mmsegmentation/mmseg/evaluation/metrics/__init__.py b/mmsegmentation/mmseg/evaluation/metrics/__init__.py new file mode 100644 index 0000000..0814de4 --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/metrics/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .citys_metric import CityscapesMetric +from .depth_metric import DepthMetric +from .iou_metric import IoUMetric +from .dice_metric import DiceMetric +from .submission_metric import SubmissionMetric + +__all__ = ['IoUMetric', 'CityscapesMetric', 'DepthMetric', 'DiceMetric', 'SubmissionMetric'] diff --git a/mmsegmentation/mmseg/evaluation/metrics/citys_metric.py b/mmsegmentation/mmseg/evaluation/metrics/citys_metric.py new file mode 100644 index 0000000..3298465 --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/metrics/citys_metric.py @@ -0,0 +1,158 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import shutil +from collections import OrderedDict +from typing import Dict, Optional, Sequence + +try: + + import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa + import cityscapesscripts.helpers.labels as CSLabels +except ImportError: + CSLabels = None + CSEval = None + +import numpy as np +from mmengine.dist import is_main_process, master_only +from mmengine.evaluator import BaseMetric +from mmengine.logging import MMLogger, print_log +from mmengine.utils import mkdir_or_exist +from PIL import Image + +from mmseg.registry import METRICS + + +@METRICS.register_module() +class CityscapesMetric(BaseMetric): + """Cityscapes evaluation metric. + + Args: + output_dir (str): The directory for output prediction + ignore_index (int): Index that will be ignored in evaluation. + Default: 255. + format_only (bool): Only format result for results commit without + perform evaluation. It is useful when you want to format the result + to a specific format and submit it to the test server. + Defaults to False. + keep_results (bool): Whether to keep the results. When ``format_only`` + is True, ``keep_results`` must be True. Defaults to False. + collect_device (str): Device name used for collecting results from + different ranks during distributed training. Must be 'cpu' or + 'gpu'. Defaults to 'cpu'. + prefix (str, optional): The prefix that will be added in the metric + names to disambiguate homonymous metrics of different evaluators. + If prefix is not provided in the argument, self.default_prefix + will be used instead. Defaults to None. + """ + + def __init__(self, + output_dir: str, + ignore_index: int = 255, + format_only: bool = False, + keep_results: bool = False, + collect_device: str = 'cpu', + prefix: Optional[str] = None, + **kwargs) -> None: + super().__init__(collect_device=collect_device, prefix=prefix) + if CSEval is None: + raise ImportError('Please run "pip install cityscapesscripts" to ' + 'install cityscapesscripts first.') + self.output_dir = output_dir + self.ignore_index = ignore_index + + self.format_only = format_only + if format_only: + assert keep_results, ( + 'When format_only is True, the results must be keep, please ' + f'set keep_results as True, but got {keep_results}') + self.keep_results = keep_results + self.prefix = prefix + if is_main_process(): + mkdir_or_exist(self.output_dir) + + @master_only + def __del__(self) -> None: + """Clean up.""" + if not self.keep_results: + shutil.rmtree(self.output_dir) + + def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: + """Process one batch of data and data_samples. + + The processed results should be stored in ``self.results``, which will + be used to computed the metrics when all batches have been processed. + + Args: + data_batch (dict): A batch of data from the dataloader. + data_samples (Sequence[dict]): A batch of outputs from the model. + """ + mkdir_or_exist(self.output_dir) + + for data_sample in data_samples: + pred_label = data_sample['pred_sem_seg']['data'][0].cpu().numpy() + # when evaluating with official cityscapesscripts, + # labelIds should be used + pred_label = self._convert_to_label_id(pred_label) + basename = osp.splitext(osp.basename(data_sample['img_path']))[0] + png_filename = osp.abspath( + osp.join(self.output_dir, f'{basename}.png')) + output = Image.fromarray(pred_label.astype(np.uint8)).convert('P') + output.save(png_filename) + if self.format_only: + # format_only always for test dataset without ground truth + gt_filename = '' + else: + # when evaluating with official cityscapesscripts, + # **_gtFine_labelIds.png is used + gt_filename = data_sample['seg_map_path'].replace( + 'labelTrainIds.png', 'labelIds.png') + self.results.append((png_filename, gt_filename)) + + def compute_metrics(self, results: list) -> Dict[str, float]: + """Compute the metrics from processed results. + + Args: + results (list): Testing results of the dataset. + + Returns: + dict[str: float]: Cityscapes evaluation results. + """ + logger: MMLogger = MMLogger.get_current_instance() + if self.format_only: + logger.info(f'results are saved to {osp.dirname(self.output_dir)}') + return OrderedDict() + + msg = 'Evaluating in Cityscapes style' + if logger is None: + msg = '\n' + msg + print_log(msg, logger=logger) + + eval_results = dict() + print_log( + f'Evaluating results under {self.output_dir} ...', logger=logger) + + CSEval.args.evalInstLevelScore = True + CSEval.args.predictionPath = osp.abspath(self.output_dir) + CSEval.args.evalPixelAccuracy = True + CSEval.args.JSONOutput = False + + pred_list, gt_list = zip(*results) + metric = dict() + eval_results.update( + CSEval.evaluateImgLists(pred_list, gt_list, CSEval.args)) + metric['averageScoreCategories'] = eval_results[ + 'averageScoreCategories'] + metric['averageScoreInstCategories'] = eval_results[ + 'averageScoreInstCategories'] + return metric + + @staticmethod + def _convert_to_label_id(result): + """Convert trainId to id for cityscapes.""" + if isinstance(result, str): + result = np.load(result) + result_copy = result.copy() + for trainId, label in CSLabels.trainId2label.items(): + result_copy[result == trainId] = label.id + + return result_copy diff --git a/mmsegmentation/mmseg/evaluation/metrics/depth_metric.py b/mmsegmentation/mmseg/evaluation/metrics/depth_metric.py new file mode 100644 index 0000000..621d4a3 --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/metrics/depth_metric.py @@ -0,0 +1,212 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from collections import OrderedDict, defaultdict +from typing import Dict, List, Optional, Sequence + +import cv2 +import numpy as np +import torch +from mmengine.dist import is_main_process +from mmengine.evaluator import BaseMetric +from mmengine.logging import MMLogger, print_log +from mmengine.utils import mkdir_or_exist +from prettytable import PrettyTable +from torch import Tensor + +from mmseg.registry import METRICS + + +@METRICS.register_module() +class DepthMetric(BaseMetric): + """Depth estimation evaluation metric. + + Args: + depth_metrics (List[str], optional): List of metrics to compute. If + not specified, defaults to all metrics in self.METRICS. + min_depth_eval (float): Minimum depth value for evaluation. + Defaults to 0.0. + max_depth_eval (float): Maximum depth value for evaluation. + Defaults to infinity. + crop_type (str, optional): Specifies the type of cropping to be used + during evaluation. This option can affect how the evaluation mask + is generated. Currently, 'nyu_crop' is supported, but other + types can be added in future. Defaults to None if no cropping + should be applied. + depth_scale_factor (float): Factor to scale the depth values. + Defaults to 1.0. + collect_device (str): Device name used for collecting results from + different ranks during distributed training. Must be 'cpu' or + 'gpu'. Defaults to 'cpu'. + output_dir (str): The directory for output prediction. Defaults to + None. + format_only (bool): Only format result for results commit without + perform evaluation. It is useful when you want to save the result + to a specific format and submit it to the test server. + Defaults to False. + prefix (str, optional): The prefix that will be added in the metric + names to disambiguate homonymous metrics of different evaluators. + If prefix is not provided in the argument, self.default_prefix + will be used instead. Defaults to None. + """ + METRICS = ('d1', 'd2', 'd3', 'abs_rel', 'sq_rel', 'rmse', 'rmse_log', + 'log10', 'silog') + + def __init__(self, + depth_metrics: Optional[List[str]] = None, + min_depth_eval: float = 0.0, + max_depth_eval: float = float('inf'), + crop_type: Optional[str] = None, + depth_scale_factor: float = 1.0, + collect_device: str = 'cpu', + output_dir: Optional[str] = None, + format_only: bool = False, + prefix: Optional[str] = None, + **kwargs) -> None: + super().__init__(collect_device=collect_device, prefix=prefix) + + if depth_metrics is None: + self.metrics = self.METRICS + elif isinstance(depth_metrics, [tuple, list]): + for metric in depth_metrics: + assert metric in self.METRICS, f'the metric {metric} is not ' \ + f'supported. Please use metrics in {self.METRICS}' + self.metrics = depth_metrics + + # Validate crop_type, if provided + assert crop_type in [ + None, 'nyu_crop' + ], (f'Invalid value for crop_type: {crop_type}. Supported values are ' + 'None or \'nyu_crop\'.') + self.crop_type = crop_type + self.min_depth_eval = min_depth_eval + self.max_depth_eval = max_depth_eval + self.output_dir = output_dir + if self.output_dir and is_main_process(): + mkdir_or_exist(self.output_dir) + self.format_only = format_only + self.depth_scale_factor = depth_scale_factor + + def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: + """Process one batch of data and data_samples. + + The processed results should be stored in ``self.results``, which will + be used to compute the metrics when all batches have been processed. + + Args: + data_batch (dict): A batch of data from the dataloader. + data_samples (Sequence[dict]): A batch of outputs from the model. + """ + for data_sample in data_samples: + pred_label = data_sample['pred_depth_map']['data'].squeeze() + # format_only always for test dataset without ground truth + if not self.format_only: + gt_depth = data_sample['gt_depth_map']['data'].squeeze().to( + pred_label) + + eval_mask = self._get_eval_mask(gt_depth) + self.results.append( + (gt_depth[eval_mask], pred_label[eval_mask])) + # format_result + if self.output_dir is not None: + basename = osp.splitext(osp.basename( + data_sample['img_path']))[0] + png_filename = osp.abspath( + osp.join(self.output_dir, f'{basename}.png')) + output_mask = pred_label.cpu().numpy( + ) * self.depth_scale_factor + + cv2.imwrite(png_filename, output_mask.astype(np.uint16), + [cv2.IMWRITE_PNG_COMPRESSION, 0]) + + def _get_eval_mask(self, gt_depth: Tensor): + """Generates an evaluation mask based on ground truth depth and + cropping. + + Args: + gt_depth (Tensor): Ground truth depth map. + + Returns: + Tensor: Boolean mask where evaluation should be performed. + """ + valid_mask = torch.logical_and(gt_depth > self.min_depth_eval, + gt_depth < self.max_depth_eval) + + if self.crop_type == 'nyu_crop': + # this implementation is adapted from + # https://github.com/zhyever/Monocular-Depth-Estimation-Toolbox/blob/main/depth/datasets/nyu.py # noqa + crop_mask = torch.zeros_like(valid_mask) + crop_mask[45:471, 41:601] = 1 + else: + crop_mask = torch.ones_like(valid_mask) + + eval_mask = torch.logical_and(valid_mask, crop_mask) + return eval_mask + + @staticmethod + def _calc_all_metrics(gt_depth, pred_depth): + """Computes final evaluation metrics based on accumulated results.""" + assert gt_depth.shape == pred_depth.shape + + thresh = torch.max((gt_depth / pred_depth), (pred_depth / gt_depth)) + diff = pred_depth - gt_depth + diff_log = torch.log(pred_depth) - torch.log(gt_depth) + + d1 = torch.sum(thresh < 1.25).float() / len(thresh) + d2 = torch.sum(thresh < 1.25**2).float() / len(thresh) + d3 = torch.sum(thresh < 1.25**3).float() / len(thresh) + + abs_rel = torch.mean(torch.abs(diff) / gt_depth) + sq_rel = torch.mean(torch.pow(diff, 2) / gt_depth) + + rmse = torch.sqrt(torch.mean(torch.pow(diff, 2))) + rmse_log = torch.sqrt(torch.mean(torch.pow(diff_log, 2))) + + log10 = torch.mean( + torch.abs(torch.log10(pred_depth) - torch.log10(gt_depth))) + silog = torch.sqrt( + torch.pow(diff_log, 2).mean() - + 0.5 * torch.pow(diff_log.mean(), 2)) + + return { + 'd1': d1.item(), + 'd2': d2.item(), + 'd3': d3.item(), + 'abs_rel': abs_rel.item(), + 'sq_rel': sq_rel.item(), + 'rmse': rmse.item(), + 'rmse_log': rmse_log.item(), + 'log10': log10.item(), + 'silog': silog.item() + } + + def compute_metrics(self, results: list) -> Dict[str, float]: + """Compute the metrics from processed results. + + Args: + results (list): The processed results of each batch. + + Returns: + Dict[str, float]: The computed metrics. The keys are the names of + the metrics, and the values are corresponding results. The keys + are identical with self.metrics. + """ + logger: MMLogger = MMLogger.get_current_instance() + if self.format_only: + logger.info(f'results are saved to {osp.dirname(self.output_dir)}') + return OrderedDict() + + metrics = defaultdict(list) + for gt_depth, pred_depth in results: + for key, value in self._calc_all_metrics(gt_depth, + pred_depth).items(): + metrics[key].append(value) + metrics = {k: sum(metrics[k]) / len(metrics[k]) for k in self.metrics} + + table_data = PrettyTable() + for key, val in metrics.items(): + table_data.add_column(key, [round(val, 5)]) + + print_log('results:', logger) + print_log('\n' + table_data.get_string(), logger=logger) + + return metrics diff --git a/mmsegmentation/mmseg/evaluation/metrics/dice_metric.py b/mmsegmentation/mmseg/evaluation/metrics/dice_metric.py new file mode 100644 index 0000000..6ae18cb --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/metrics/dice_metric.py @@ -0,0 +1,119 @@ +from collections import OrderedDict + +import numpy as np +from prettytable import PrettyTable + +import torch + +from mmseg.registry import METRICS + +from mmengine.evaluator import BaseMetric +from mmengine.logging import MMLogger, print_log + + +CLASSES = [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', +] +num_classes = len(CLASSES) + 1 + +@METRICS.register_module() +class DiceMetric(BaseMetric): + def __init__(self, + collect_device='cpu', + prefix=None, + **kwargs): + super().__init__(collect_device=collect_device, prefix=prefix) + + @staticmethod + def dice_coef(y_true, y_pred): + dice_scores = [] + y_true_f = y_true.flatten(-2) + y_pred_f = y_pred.flatten(-2) + eps = 0.0001 + + # ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•ด Dice score ๊ณ„์‚ฐ + for c in range(1, num_classes): + # ๊ฐ ํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋งˆ์Šคํฌ ์ƒ์„ฑ + y_true_c = (y_true_f == c).float() + y_pred_c = (y_pred_f == c).float() + + # Dice score ๊ณ„์‚ฐ + intersection = torch.sum(y_true_c * y_pred_c) + denominator = torch.sum(y_true_c) + torch.sum(y_pred_c) + eps + + # Dice ๊ณ„์‚ฐ ์‹œ, ๋ถ„๋ชจ๊ฐ€ 0์ธ ๊ฒฝ์šฐ 1๋กœ ์ฒ˜๋ฆฌ (True์™€ Pred ๋ชจ๋‘ ์—†๋Š” ๊ฒฝ์šฐ) + dice = (2.0 * intersection) / denominator + + # ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ + dice_scores.append(dice.item()) + + return dice_scores + + + + def process(self, data_batch, data_samples): + """Process one batch of data and data_samples. + + The processed results should be stored in ``self.results``, which will + be used to compute the metrics when all batches have been processed. + + Args: + data_batch (dict): A batch of data from the dataloader. + data_samples (Sequence[dict]): A batch of outputs from the model. + """ + for data_sample in data_samples: + pred_label = data_sample['pred_sem_seg']['data'] + + label = data_sample['gt_sem_seg']['data'].to(pred_label) + self.results.append(self.dice_coef(label, pred_label)) + + + def compute_metrics(self, results): + """Compute the metrics from processed results. + + Args: + results (list): The processed results of each batch. + + Returns: + Dict[str, float]: The computed metrics. The keys are the names of + the metrics, and the values are corresponding results. + """ + logger: MMLogger = MMLogger.get_current_instance() + + results = torch.tensor(results) + dices_per_class = torch.mean(results, 0) + avg_dice = torch.mean(dices_per_class) + + ret_metrics = { + "Dice": dices_per_class.detach().cpu().numpy(), + } + # summary table + ret_metrics_summary = OrderedDict({ + ret_metric: np.round(np.nanmean(ret_metric_value) * 100, 2) + for ret_metric, ret_metric_value in ret_metrics.items() + }) + + # each class table + ret_metrics.pop('aAcc', None) + ret_metrics_class = OrderedDict({ + ret_metric: np.round(ret_metric_value, 2) + for ret_metric, ret_metric_value in ret_metrics.items() + }) + ret_metrics_class.update({'Class': CLASSES}) + ret_metrics_class.move_to_end('Class', last=False) + class_table_data = PrettyTable() + for key, val in ret_metrics_class.items(): + class_table_data.add_column(key, val) + + print(class_table_data) + + metrics = { + "mDice": torch.mean(dices_per_class).item(), + } + + return metrics \ No newline at end of file diff --git a/mmsegmentation/mmseg/evaluation/metrics/iou_metric.py b/mmsegmentation/mmseg/evaluation/metrics/iou_metric.py new file mode 100644 index 0000000..16014c7 --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/metrics/iou_metric.py @@ -0,0 +1,286 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from collections import OrderedDict +from typing import Dict, List, Optional, Sequence + +import numpy as np +import torch +from mmengine.dist import is_main_process +from mmengine.evaluator import BaseMetric +from mmengine.logging import MMLogger, print_log +from mmengine.utils import mkdir_or_exist +from PIL import Image +from prettytable import PrettyTable + +from mmseg.registry import METRICS + + +@METRICS.register_module() +class IoUMetric(BaseMetric): + """IoU evaluation metric. + + Args: + ignore_index (int): Index that will be ignored in evaluation. + Default: 255. + iou_metrics (list[str] | str): Metrics to be calculated, the options + includes 'mIoU', 'mDice' and 'mFscore'. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + beta (int): Determines the weight of recall in the combined score. + Default: 1. + collect_device (str): Device name used for collecting results from + different ranks during distributed training. Must be 'cpu' or + 'gpu'. Defaults to 'cpu'. + output_dir (str): The directory for output prediction. Defaults to + None. + format_only (bool): Only format result for results commit without + perform evaluation. It is useful when you want to save the result + to a specific format and submit it to the test server. + Defaults to False. + prefix (str, optional): The prefix that will be added in the metric + names to disambiguate homonymous metrics of different evaluators. + If prefix is not provided in the argument, self.default_prefix + will be used instead. Defaults to None. + """ + + def __init__(self, + ignore_index: int = 255, + iou_metrics: List[str] = ['mIoU'], + nan_to_num: Optional[int] = None, + beta: int = 1, + collect_device: str = 'cpu', + output_dir: Optional[str] = None, + format_only: bool = False, + prefix: Optional[str] = None, + **kwargs) -> None: + super().__init__(collect_device=collect_device, prefix=prefix) + + self.ignore_index = ignore_index + self.metrics = iou_metrics + self.nan_to_num = nan_to_num + self.beta = beta + self.output_dir = output_dir + if self.output_dir and is_main_process(): + mkdir_or_exist(self.output_dir) + self.format_only = format_only + + def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: + """Process one batch of data and data_samples. + + The processed results should be stored in ``self.results``, which will + be used to compute the metrics when all batches have been processed. + + Args: + data_batch (dict): A batch of data from the dataloader. + data_samples (Sequence[dict]): A batch of outputs from the model. + """ + num_classes = len(self.dataset_meta['classes']) + for data_sample in data_samples: + pred_label = data_sample['pred_sem_seg']['data'].squeeze() + # format_only always for test dataset without ground truth + if not self.format_only: + label = data_sample['gt_sem_seg']['data'].squeeze().to( + pred_label) + self.results.append( + self.intersect_and_union(pred_label, label, num_classes, + self.ignore_index)) + # format_result + if self.output_dir is not None: + basename = osp.splitext(osp.basename( + data_sample['img_path']))[0] + png_filename = osp.abspath( + osp.join(self.output_dir, f'{basename}.png')) + output_mask = pred_label.cpu().numpy() + # The index range of official ADE20k dataset is from 0 to 150. + # But the index range of output is from 0 to 149. + # That is because we set reduce_zero_label=True. + if data_sample.get('reduce_zero_label', False): + output_mask = output_mask + 1 + output = Image.fromarray(output_mask.astype(np.uint8)) + output.save(png_filename) + + def compute_metrics(self, results: list) -> Dict[str, float]: + """Compute the metrics from processed results. + + Args: + results (list): The processed results of each batch. + + Returns: + Dict[str, float]: The computed metrics. The keys are the names of + the metrics, and the values are corresponding results. The key + mainly includes aAcc, mIoU, mAcc, mDice, mFscore, mPrecision, + mRecall. + """ + logger: MMLogger = MMLogger.get_current_instance() + if self.format_only: + logger.info(f'results are saved to {osp.dirname(self.output_dir)}') + return OrderedDict() + # convert list of tuples to tuple of lists, e.g. + # [(A_1, B_1, C_1, D_1), ..., (A_n, B_n, C_n, D_n)] to + # ([A_1, ..., A_n], ..., [D_1, ..., D_n]) + results = tuple(zip(*results)) + assert len(results) == 4 + + total_area_intersect = sum(results[0]) + total_area_union = sum(results[1]) + total_area_pred_label = sum(results[2]) + total_area_label = sum(results[3]) + ret_metrics = self.total_area_to_metrics( + total_area_intersect, total_area_union, total_area_pred_label, + total_area_label, self.metrics, self.nan_to_num, self.beta) + + class_names = self.dataset_meta['classes'] + + # summary table + ret_metrics_summary = OrderedDict({ + ret_metric: np.round(np.nanmean(ret_metric_value) * 100, 2) + for ret_metric, ret_metric_value in ret_metrics.items() + }) + metrics = dict() + for key, val in ret_metrics_summary.items(): + if key == 'aAcc': + metrics[key] = val + else: + metrics['m' + key] = val + + # each class table + ret_metrics.pop('aAcc', None) + ret_metrics_class = OrderedDict({ + ret_metric: np.round(ret_metric_value * 100, 2) + for ret_metric, ret_metric_value in ret_metrics.items() + }) + ret_metrics_class.update({'Class': class_names}) + ret_metrics_class.move_to_end('Class', last=False) + class_table_data = PrettyTable() + for key, val in ret_metrics_class.items(): + class_table_data.add_column(key, val) + + print_log('per class results:', logger) + print_log('\n' + class_table_data.get_string(), logger=logger) + + return metrics + + @staticmethod + def intersect_and_union(pred_label: torch.tensor, label: torch.tensor, + num_classes: int, ignore_index: int): + """Calculate Intersection and Union. + + Args: + pred_label (torch.tensor): Prediction segmentation map + or predict result filename. The shape is (H, W). + label (torch.tensor): Ground truth segmentation map + or label filename. The shape is (H, W). + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + + Returns: + torch.Tensor: The intersection of prediction and ground truth + histogram on all classes. + torch.Tensor: The union of prediction and ground truth histogram on + all classes. + torch.Tensor: The prediction histogram on all classes. + torch.Tensor: The ground truth histogram on all classes. + """ + + mask = (label != ignore_index) + pred_label = pred_label[mask] + label = label[mask] + + intersect = pred_label[pred_label == label] + area_intersect = torch.histc( + intersect.float(), bins=(num_classes), min=0, + max=num_classes - 1).cpu() + area_pred_label = torch.histc( + pred_label.float(), bins=(num_classes), min=0, + max=num_classes - 1).cpu() + area_label = torch.histc( + label.float(), bins=(num_classes), min=0, + max=num_classes - 1).cpu() + area_union = area_pred_label + area_label - area_intersect + return area_intersect, area_union, area_pred_label, area_label + + @staticmethod + def total_area_to_metrics(total_area_intersect: np.ndarray, + total_area_union: np.ndarray, + total_area_pred_label: np.ndarray, + total_area_label: np.ndarray, + metrics: List[str] = ['mIoU'], + nan_to_num: Optional[int] = None, + beta: int = 1): + """Calculate evaluation metrics + Args: + total_area_intersect (np.ndarray): The intersection of prediction + and ground truth histogram on all classes. + total_area_union (np.ndarray): The union of prediction and ground + truth histogram on all classes. + total_area_pred_label (np.ndarray): The prediction histogram on + all classes. + total_area_label (np.ndarray): The ground truth histogram on + all classes. + metrics (List[str] | str): Metrics to be evaluated, 'mIoU' and + 'mDice'. + nan_to_num (int, optional): If specified, NaN values will be + replaced by the numbers defined by the user. Default: None. + beta (int): Determines the weight of recall in the combined score. + Default: 1. + Returns: + Dict[str, np.ndarray]: per category evaluation metrics, + shape (num_classes, ). + """ + + def f_score(precision, recall, beta=1): + """calculate the f-score value. + + Args: + precision (float | torch.Tensor): The precision value. + recall (float | torch.Tensor): The recall value. + beta (int): Determines the weight of recall in the combined + score. Default: 1. + + Returns: + [torch.tensor]: The f-score value. + """ + score = (1 + beta**2) * (precision * recall) / ( + (beta**2 * precision) + recall) + return score + + if isinstance(metrics, str): + metrics = [metrics] + allowed_metrics = ['mIoU', 'mDice', 'mFscore'] + if not set(metrics).issubset(set(allowed_metrics)): + raise KeyError(f'metrics {metrics} is not supported') + + all_acc = total_area_intersect.sum() / total_area_label.sum() + ret_metrics = OrderedDict({'aAcc': all_acc}) + for metric in metrics: + if metric == 'mIoU': + iou = total_area_intersect / total_area_union + acc = total_area_intersect / total_area_label + ret_metrics['IoU'] = iou + ret_metrics['Acc'] = acc + elif metric == 'mDice': + dice = 2 * total_area_intersect / ( + total_area_pred_label + total_area_label) + acc = total_area_intersect / total_area_label + ret_metrics['Dice'] = dice + ret_metrics['Acc'] = acc + elif metric == 'mFscore': + precision = total_area_intersect / total_area_pred_label + recall = total_area_intersect / total_area_label + f_value = torch.tensor([ + f_score(x[0], x[1], beta) for x in zip(precision, recall) + ]) + ret_metrics['Fscore'] = f_value + ret_metrics['Precision'] = precision + ret_metrics['Recall'] = recall + + ret_metrics = { + metric: value.numpy() + for metric, value in ret_metrics.items() + } + if nan_to_num is not None: + ret_metrics = OrderedDict({ + metric: np.nan_to_num(metric_value, nan=nan_to_num) + for metric, metric_value in ret_metrics.items() + }) + return ret_metrics diff --git a/mmsegmentation/mmseg/evaluation/metrics/submission_metric.py b/mmsegmentation/mmseg/evaluation/metrics/submission_metric.py new file mode 100644 index 0000000..4829511 --- /dev/null +++ b/mmsegmentation/mmseg/evaluation/metrics/submission_metric.py @@ -0,0 +1,131 @@ +from collections import defaultdict +import os + +import numpy as np +import pandas as pd +from prettytable import PrettyTable + +import torch +import torch.nn.functional as F +import matplotlib.pyplot as plt + +from mmseg.registry import METRICS + +from mmengine.evaluator import BaseMetric +from mmengine.logging import MMLogger, print_log +from tqdm import tqdm + + + +CLASSES = [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', +] +num_classes = len(CLASSES) + 1 + + +@METRICS.register_module() +class SubmissionMetric(BaseMetric): + def __init__(self, + collect_device='cpu', + prefix=None, + save_path='', + **kwargs): + super().__init__(collect_device=collect_device, prefix=prefix) + self.save_path = save_path + if self.save_path == '': + self.save_path = '/data/ephemeral/home/submission' + + os.makedirs(self.save_path, exist_ok=True) + self.cnt = 0 + + # self.rles = [] + # self.filename_and_class = [] + + + def encode_mask_to_rle(self, mask): + ''' + mask: numpy array binary mask + 1 - mask + 0 - background + Returns encoded run length + ''' + pixels = mask.flatten() + pixels = np.concatenate([[0], pixels, [0]]) + runs = np.where(pixels[1:] != pixels[:-1])[0] + 1 + runs[1::2] -= runs[::2] + return ' '.join(str(x) for x in runs) + + + def convert_to_class_masks(self, mask): + """ + Convert a mask of shape (1, H, W) with values in range [0, 29] to (29, H, W) masks. + + Parameters: + - mask: numpy array of shape (1, H, W) with integer values from 0 to 29 representing class labels. + + Returns: + - class_masks: numpy array of shape (29, H, W) where each slice corresponds to a class mask. + """ + # Get the height and width from the input mask shape + _, H, W = mask.shape + + # Initialize an empty array to hold the class masks (29, H, W) + class_masks = np.zeros((29, H, W), dtype=np.uint8) + + # Iterate over each class (1 to 29) + for class_id in range(1, 30): # Classes 1 to 29 + class_masks[class_id - 1] = (mask[0] == class_id).astype(np.uint8) + + return class_masks + + + def decode_rle_to_mask(self, rle, height, width): + s = rle.split() + starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])] + starts -= 1 + ends = starts + lengths + img = np.zeros(height * width, dtype=np.uint8) + + for lo, hi in zip(starts, ends): + img[lo:hi] = 1 + + return img.reshape(height, width) + + + def process(self, data_batch, data_samples): + for data_sample in data_samples: + img_path = data_sample['img_path'] + img_name = os.path.basename(img_path).split('_')[1] + pred_label = data_sample['pred_sem_seg']['data'] + img_shape = data_sample['img_shape'] + ori_shape = data_sample['ori_shape'] + + # if img_shape != ori_shape: + # pred_label = F.interpolate(pred_label, size=ori_shape, mode="bilinear") + pred_label = pred_label.cpu().numpy() + + + pred_label = self.convert_to_class_masks(pred_label) + for i, pred in enumerate(pred_label): + rle = self.encode_mask_to_rle(pred) + self.results.append((rle, f"{CLASSES[i]}_{img_name}")) + + + def compute_metrics(self, results): + classes, filename = zip(*[x[1].split("_") for x in self.results]) + image_name = [f for f in filename] + + df = pd.DataFrame({ + "image_name": image_name, + "class": classes, + "rle": [x[0] for x in self.results] + }) + print(df.head(30)) + df.to_csv(os.path.join(self.save_path, 'output.csv'), index=False) + + return {"status": 1} \ No newline at end of file diff --git a/mmsegmentation/mmseg/models/__init__.py b/mmsegmentation/mmseg/models/__init__.py new file mode 100644 index 0000000..a989512 --- /dev/null +++ b/mmsegmentation/mmseg/models/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .assigners import * # noqa: F401,F403 +from .backbones import * # noqa: F401,F403 +from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone, + build_head, build_loss, build_segmentor) +from .data_preprocessor import SegDataPreProcessor +from .decode_heads import * # noqa: F401,F403 +from .losses import * # noqa: F401,F403 +from .necks import * # noqa: F401,F403 +from .segmentors import * # noqa: F401,F403 +from .text_encoder import * # noqa: F401,F403 + +__all__ = [ + 'BACKBONES', 'HEADS', 'LOSSES', 'SEGMENTORS', 'build_backbone', + 'build_head', 'build_loss', 'build_segmentor', 'SegDataPreProcessor' +] diff --git a/mmsegmentation/mmseg/models/assigners/__init__.py b/mmsegmentation/mmseg/models/assigners/__init__.py new file mode 100644 index 0000000..d49b1b1 --- /dev/null +++ b/mmsegmentation/mmseg/models/assigners/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_assigner import BaseAssigner +from .hungarian_assigner import HungarianAssigner +from .match_cost import ClassificationCost, CrossEntropyLossCost, DiceCost + +__all__ = [ + 'BaseAssigner', + 'HungarianAssigner', + 'ClassificationCost', + 'CrossEntropyLossCost', + 'DiceCost', +] diff --git a/mmsegmentation/mmseg/models/assigners/base_assigner.py b/mmsegmentation/mmseg/models/assigners/base_assigner.py new file mode 100644 index 0000000..97895cd --- /dev/null +++ b/mmsegmentation/mmseg/models/assigners/base_assigner.py @@ -0,0 +1,18 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod +from typing import Optional + +from mmengine.structures import InstanceData + + +class BaseAssigner(metaclass=ABCMeta): + """Base assigner that assigns masks to ground truth class labels.""" + + @abstractmethod + def assign(self, + pred_instances: InstanceData, + gt_instances: InstanceData, + gt_instances_ignore: Optional[InstanceData] = None, + **kwargs): + """Assign masks to either a ground truth class label or a negative + label.""" diff --git a/mmsegmentation/mmseg/models/assigners/hungarian_assigner.py b/mmsegmentation/mmseg/models/assigners/hungarian_assigner.py new file mode 100644 index 0000000..28868f0 --- /dev/null +++ b/mmsegmentation/mmseg/models/assigners/hungarian_assigner.py @@ -0,0 +1,86 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Union + +import torch +from mmengine import ConfigDict +from mmengine.structures import InstanceData +from scipy.optimize import linear_sum_assignment +from torch.cuda.amp import autocast + +from mmseg.registry import TASK_UTILS +from .base_assigner import BaseAssigner + + +@TASK_UTILS.register_module() +class HungarianAssigner(BaseAssigner): + """Computes one-to-one matching between prediction masks and ground truth. + + This class uses bipartite matching-based assignment to computes an + assignment between the prediction masks and the ground truth. The + assignment result is based on the weighted sum of match costs. The + Hungarian algorithm is used to calculate the best matching with the + minimum cost. The prediction masks that are not matched are classified + as background. + + Args: + match_costs (ConfigDict|List[ConfigDict]): Match cost configs. + """ + + def __init__( + self, match_costs: Union[List[Union[dict, ConfigDict]], dict, + ConfigDict] + ) -> None: + + if isinstance(match_costs, dict): + match_costs = [match_costs] + elif isinstance(match_costs, list): + assert len(match_costs) > 0, \ + 'match_costs must not be a empty list.' + + self.match_costs = [ + TASK_UTILS.build(match_cost) for match_cost in match_costs + ] + + def assign(self, pred_instances: InstanceData, gt_instances: InstanceData, + **kwargs): + """Computes one-to-one matching based on the weighted costs. + + This method assign each query prediction to a ground truth or + background. The assignment first calculates the cost for each + category assigned to each query mask, and then uses the + Hungarian algorithm to calculate the minimum cost as the best + match. + + Args: + pred_instances (InstanceData): Instances of model + predictions. It includes "masks", with shape + (n, h, w) or (n, l), and "cls", with shape (n, num_classes+1) + gt_instances (InstanceData): Ground truth of instance + annotations. It includes "labels", with shape (k, ), + and "masks", with shape (k, h, w) or (k, l). + + Returns: + matched_quiery_inds (Tensor): The indexes of matched quieres. + matched_label_inds (Tensor): The indexes of matched labels. + """ + # compute weighted cost + cost_list = [] + with autocast(enabled=False): + for match_cost in self.match_costs: + cost = match_cost( + pred_instances=pred_instances, gt_instances=gt_instances) + cost_list.append(cost) + cost = torch.stack(cost_list).sum(dim=0) + + device = cost.device + # do Hungarian matching on CPU using linear_sum_assignment + cost = cost.detach().cpu() + if linear_sum_assignment is None: + raise ImportError('Please run "pip install scipy" ' + 'to install scipy first.') + + matched_quiery_inds, matched_label_inds = linear_sum_assignment(cost) + matched_quiery_inds = torch.from_numpy(matched_quiery_inds).to(device) + matched_label_inds = torch.from_numpy(matched_label_inds).to(device) + + return matched_quiery_inds, matched_label_inds diff --git a/mmsegmentation/mmseg/models/assigners/match_cost.py b/mmsegmentation/mmseg/models/assigners/match_cost.py new file mode 100644 index 0000000..560df85 --- /dev/null +++ b/mmsegmentation/mmseg/models/assigners/match_cost.py @@ -0,0 +1,231 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import abstractmethod +from typing import Union + +import torch +import torch.nn.functional as F +from mmengine.structures import InstanceData +from torch import Tensor + +from mmseg.registry import TASK_UTILS + + +class BaseMatchCost: + """Base match cost class. + + Args: + weight (Union[float, int]): Cost weight. Defaults to 1. + """ + + def __init__(self, weight: Union[float, int] = 1.) -> None: + self.weight = weight + + @abstractmethod + def __call__(self, pred_instances: InstanceData, + gt_instances: InstanceData, **kwargs) -> Tensor: + """Compute match cost. + + Args: + pred_instances (InstanceData): Instances of model predictions. + It often includes "labels" and "scores". + gt_instances (InstanceData): Ground truth of instance + annotations. It usually includes "labels". + + Returns: + Tensor: Match Cost matrix of shape (num_preds, num_gts). + """ + pass + + +@TASK_UTILS.register_module() +class ClassificationCost(BaseMatchCost): + """ClsSoftmaxCost. + + Args: + weight (Union[float, int]): Cost weight. Defaults to 1. + + Examples: + >>> from mmseg.models.assigners import ClassificationCost + >>> import torch + >>> self = ClassificationCost() + >>> cls_pred = torch.rand(4, 3) + >>> gt_labels = torch.tensor([0, 1, 2]) + >>> factor = torch.tensor([10, 8, 10, 8]) + >>> self(cls_pred, gt_labels) + tensor([[-0.3430, -0.3525, -0.3045], + [-0.3077, -0.2931, -0.3992], + [-0.3664, -0.3455, -0.2881], + [-0.3343, -0.2701, -0.3956]]) + """ + + def __init__(self, weight: Union[float, int] = 1) -> None: + super().__init__(weight=weight) + + def __call__(self, pred_instances: InstanceData, + gt_instances: InstanceData, **kwargs) -> Tensor: + """Compute match cost. + + Args: + pred_instances (InstanceData): "scores" inside is + predicted classification logits, of shape + (num_queries, num_class). + gt_instances (InstanceData): "labels" inside should have + shape (num_gt, ). + + Returns: + Tensor: Match Cost matrix of shape (num_preds, num_gts). + """ + assert hasattr(pred_instances, 'scores'), \ + "pred_instances must contain 'scores'" + assert hasattr(gt_instances, 'labels'), \ + "gt_instances must contain 'labels'" + pred_scores = pred_instances.scores + gt_labels = gt_instances.labels + + pred_scores = pred_scores.softmax(-1) + cls_cost = -pred_scores[:, gt_labels] + + return cls_cost * self.weight + + +@TASK_UTILS.register_module() +class DiceCost(BaseMatchCost): + """Cost of mask assignments based on dice losses. + + Args: + pred_act (bool): Whether to apply sigmoid to mask_pred. + Defaults to False. + eps (float): Defaults to 1e-3. + naive_dice (bool): If True, use the naive dice loss + in which the power of the number in the denominator is + the first power. If False, use the second power that + is adopted by K-Net and SOLO. Defaults to True. + weight (Union[float, int]): Cost weight. Defaults to 1. + """ + + def __init__(self, + pred_act: bool = False, + eps: float = 1e-3, + naive_dice: bool = True, + weight: Union[float, int] = 1.) -> None: + super().__init__(weight=weight) + self.pred_act = pred_act + self.eps = eps + self.naive_dice = naive_dice + + def _binary_mask_dice_loss(self, mask_preds: Tensor, + gt_masks: Tensor) -> Tensor: + """ + Args: + mask_preds (Tensor): Mask prediction in shape (num_queries, *). + gt_masks (Tensor): Ground truth in shape (num_gt, *) + store 0 or 1, 0 for negative class and 1 for + positive class. + + Returns: + Tensor: Dice cost matrix in shape (num_queries, num_gt). + """ + mask_preds = mask_preds.flatten(1) + gt_masks = gt_masks.flatten(1).float() + numerator = 2 * torch.einsum('nc,mc->nm', mask_preds, gt_masks) + if self.naive_dice: + denominator = mask_preds.sum(-1)[:, None] + \ + gt_masks.sum(-1)[None, :] + else: + denominator = mask_preds.pow(2).sum(1)[:, None] + \ + gt_masks.pow(2).sum(1)[None, :] + loss = 1 - (numerator + self.eps) / (denominator + self.eps) + return loss + + def __call__(self, pred_instances: InstanceData, + gt_instances: InstanceData, **kwargs) -> Tensor: + """Compute match cost. + + Args: + pred_instances (InstanceData): Predicted instances which + must contain "masks". + gt_instances (InstanceData): Ground truth which must contain + "mask". + + Returns: + Tensor: Match Cost matrix of shape (num_preds, num_gts). + """ + assert hasattr(pred_instances, 'masks'), \ + "pred_instances must contain 'masks'" + assert hasattr(gt_instances, 'masks'), \ + "gt_instances must contain 'masks'" + pred_masks = pred_instances.masks + gt_masks = gt_instances.masks + + if self.pred_act: + pred_masks = pred_masks.sigmoid() + dice_cost = self._binary_mask_dice_loss(pred_masks, gt_masks) + return dice_cost * self.weight + + +@TASK_UTILS.register_module() +class CrossEntropyLossCost(BaseMatchCost): + """CrossEntropyLossCost. + + Args: + use_sigmoid (bool): Whether the prediction uses sigmoid + of softmax. Defaults to True. + weight (Union[float, int]): Cost weight. Defaults to 1. + """ + + def __init__(self, + use_sigmoid: bool = True, + weight: Union[float, int] = 1.) -> None: + super().__init__(weight=weight) + self.use_sigmoid = use_sigmoid + + def _binary_cross_entropy(self, cls_pred: Tensor, + gt_labels: Tensor) -> Tensor: + """ + Args: + cls_pred (Tensor): The prediction with shape (num_queries, 1, *) or + (num_queries, *). + gt_labels (Tensor): The learning label of prediction with + shape (num_gt, *). + + Returns: + Tensor: Cross entropy cost matrix in shape (num_queries, num_gt). + """ + cls_pred = cls_pred.flatten(1).float() + gt_labels = gt_labels.flatten(1).float() + n = cls_pred.shape[1] + pos = F.binary_cross_entropy_with_logits( + cls_pred, torch.ones_like(cls_pred), reduction='none') + neg = F.binary_cross_entropy_with_logits( + cls_pred, torch.zeros_like(cls_pred), reduction='none') + cls_cost = torch.einsum('nc,mc->nm', pos, gt_labels) + \ + torch.einsum('nc,mc->nm', neg, 1 - gt_labels) + cls_cost = cls_cost / n + + return cls_cost + + def __call__(self, pred_instances: InstanceData, + gt_instances: InstanceData, **kwargs) -> Tensor: + """Compute match cost. + + Args: + pred_instances (:obj:`InstanceData`): Predicted instances which + must contain ``masks``. + gt_instances (:obj:`InstanceData`): Ground truth which must contain + ``masks``. + + Returns: + Tensor: Match Cost matrix of shape (num_preds, num_gts). + """ + assert hasattr(pred_instances, 'masks'), \ + "pred_instances must contain 'masks'" + assert hasattr(gt_instances, 'masks'), \ + "gt_instances must contain 'masks'" + pred_masks = pred_instances.masks + gt_masks = gt_instances.masks + if self.use_sigmoid: + cls_cost = self._binary_cross_entropy(pred_masks, gt_masks) + else: + raise NotImplementedError + + return cls_cost * self.weight diff --git a/mmsegmentation/mmseg/models/backbones/__init__.py b/mmsegmentation/mmseg/models/backbones/__init__.py new file mode 100644 index 0000000..784d3df --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/__init__.py @@ -0,0 +1,35 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .beit import BEiT +from .bisenetv1 import BiSeNetV1 +from .bisenetv2 import BiSeNetV2 +from .cgnet import CGNet +from .ddrnet import DDRNet +from .erfnet import ERFNet +from .fast_scnn import FastSCNN +from .hrnet import HRNet +from .icnet import ICNet +from .mae import MAE +from .mit import MixVisionTransformer +from .mobilenet_v2 import MobileNetV2 +from .mobilenet_v3 import MobileNetV3 +from .mscan import MSCAN +from .pidnet import PIDNet +from .resnest import ResNeSt +from .resnet import ResNet, ResNetV1c, ResNetV1d +from .resnext import ResNeXt +from .stdc import STDCContextPathNet, STDCNet +from .swin import SwinTransformer +from .timm_backbone import TIMMBackbone +from .twins import PCPVT, SVT +from .unet import UNet +from .vit import VisionTransformer +from .vpd import VPD + +__all__ = [ + 'ResNet', 'ResNetV1c', 'ResNetV1d', 'ResNeXt', 'HRNet', 'FastSCNN', + 'ResNeSt', 'MobileNetV2', 'UNet', 'CGNet', 'MobileNetV3', + 'VisionTransformer', 'SwinTransformer', 'MixVisionTransformer', + 'BiSeNetV1', 'BiSeNetV2', 'ICNet', 'TIMMBackbone', 'ERFNet', 'PCPVT', + 'SVT', 'STDCNet', 'STDCContextPathNet', 'BEiT', 'MAE', 'PIDNet', 'MSCAN', + 'DDRNet', 'VPD' +] diff --git a/mmsegmentation/mmseg/models/backbones/beit.py b/mmsegmentation/mmseg/models/backbones/beit.py new file mode 100644 index 0000000..e5da71e --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/beit.py @@ -0,0 +1,554 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_norm_layer +from mmcv.cnn.bricks.drop import build_dropout +from mmengine.model import BaseModule, ModuleList +from mmengine.model.weight_init import (constant_init, kaiming_init, + trunc_normal_) +from mmengine.runner.checkpoint import _load_checkpoint +from scipy import interpolate +from torch.nn.modules.batchnorm import _BatchNorm +from torch.nn.modules.utils import _pair as to_2tuple + +from mmseg.registry import MODELS +from ..utils import PatchEmbed +from .vit import TransformerEncoderLayer as VisionTransformerEncoderLayer + + +class BEiTAttention(BaseModule): + """Window based multi-head self-attention (W-MSA) module with relative + position bias. + + Args: + embed_dims (int): Number of input channels. + num_heads (int): Number of attention heads. + window_size (tuple[int]): The height and width of the window. + bias (bool): The option to add leanable bias for q, k, v. If bias is + True, it will add leanable bias. If bias is 'qv_bias', it will only + add leanable bias for q, v. If bias is False, it will not add bias + for q, k, v. Default to 'qv_bias'. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + attn_drop_rate (float): Dropout ratio of attention weight. + Default: 0.0 + proj_drop_rate (float): Dropout ratio of output. Default: 0. + init_cfg (dict | None, optional): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + window_size, + bias='qv_bias', + qk_scale=None, + attn_drop_rate=0., + proj_drop_rate=0., + init_cfg=None, + **kwargs): + super().__init__(init_cfg=init_cfg) + self.embed_dims = embed_dims + self.num_heads = num_heads + head_embed_dims = embed_dims // num_heads + self.bias = bias + self.scale = qk_scale or head_embed_dims**-0.5 + + qkv_bias = bias + if bias == 'qv_bias': + self._init_qv_bias() + qkv_bias = False + + self.window_size = window_size + self._init_rel_pos_embedding() + + self.qkv = nn.Linear(embed_dims, embed_dims * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop_rate) + self.proj = nn.Linear(embed_dims, embed_dims) + self.proj_drop = nn.Dropout(proj_drop_rate) + + def _init_qv_bias(self): + self.q_bias = nn.Parameter(torch.zeros(self.embed_dims)) + self.v_bias = nn.Parameter(torch.zeros(self.embed_dims)) + + def _init_rel_pos_embedding(self): + Wh, Ww = self.window_size + # cls to token & token 2 cls & cls to cls + self.num_relative_distance = (2 * Wh - 1) * (2 * Ww - 1) + 3 + # relative_position_bias_table shape is (2*Wh-1 * 2*Ww-1 + 3, nH) + self.relative_position_bias_table = nn.Parameter( + torch.zeros(self.num_relative_distance, self.num_heads)) + + # get pair-wise relative position index for + # each token inside the window + coords_h = torch.arange(Wh) + coords_w = torch.arange(Ww) + # coords shape is (2, Wh, Ww) + coords = torch.stack(torch.meshgrid([coords_h, coords_w])) + # coords_flatten shape is (2, Wh*Ww) + coords_flatten = torch.flatten(coords, 1) + relative_coords = ( + coords_flatten[:, :, None] - coords_flatten[:, None, :]) + # relative_coords shape is (Wh*Ww, Wh*Ww, 2) + relative_coords = relative_coords.permute(1, 2, 0).contiguous() + # shift to start from 0 + relative_coords[:, :, 0] += Wh - 1 + relative_coords[:, :, 1] += Ww - 1 + relative_coords[:, :, 0] *= 2 * Ww - 1 + relative_position_index = torch.zeros( + size=(Wh * Ww + 1, ) * 2, dtype=relative_coords.dtype) + # relative_position_index shape is (Wh*Ww, Wh*Ww) + relative_position_index[1:, 1:] = relative_coords.sum(-1) + relative_position_index[0, 0:] = self.num_relative_distance - 3 + relative_position_index[0:, 0] = self.num_relative_distance - 2 + relative_position_index[0, 0] = self.num_relative_distance - 1 + + self.register_buffer('relative_position_index', + relative_position_index) + + def init_weights(self): + trunc_normal_(self.relative_position_bias_table, std=0.02) + + def forward(self, x): + """ + Args: + x (tensor): input features with shape of (num_windows*B, N, C). + """ + B, N, C = x.shape + + if self.bias == 'qv_bias': + k_bias = torch.zeros_like(self.v_bias, requires_grad=False) + qkv_bias = torch.cat((self.q_bias, k_bias, self.v_bias)) + qkv = F.linear(input=x, weight=self.qkv.weight, bias=qkv_bias) + else: + qkv = self.qkv(x) + + qkv = qkv.reshape(B, N, 3, self.num_heads, -1).permute(2, 0, 3, 1, 4) + q, k, v = qkv[0], qkv[1], qkv[2] + q = q * self.scale + attn = (q @ k.transpose(-2, -1)) + if self.relative_position_bias_table is not None: + Wh = self.window_size[0] + Ww = self.window_size[1] + relative_position_bias = self.relative_position_bias_table[ + self.relative_position_index.view(-1)].view( + Wh * Ww + 1, Wh * Ww + 1, -1) + relative_position_bias = relative_position_bias.permute( + 2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww + attn = attn + relative_position_bias.unsqueeze(0) + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class BEiTTransformerEncoderLayer(VisionTransformerEncoderLayer): + """Implements one encoder layer in Vision Transformer. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + attn_drop_rate (float): The drop out rate for attention layer. + Default: 0.0. + drop_path_rate (float): Stochastic depth rate. Default 0.0. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + bias (bool): The option to add leanable bias for q, k, v. If bias is + True, it will add leanable bias. If bias is 'qv_bias', it will only + add leanable bias for q, v. If bias is False, it will not add bias + for q, k, v. Default to 'qv_bias'. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + window_size (tuple[int], optional): The height and width of the window. + Default: None. + init_values (float, optional): Initialize the values of BEiTAttention + and FFN with learnable scaling. Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + attn_drop_rate=0., + drop_path_rate=0., + num_fcs=2, + bias='qv_bias', + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + window_size=None, + attn_cfg=dict(), + ffn_cfg=dict(add_identity=False), + init_values=None): + attn_cfg.update(dict(window_size=window_size, qk_scale=None)) + + super().__init__( + embed_dims=embed_dims, + num_heads=num_heads, + feedforward_channels=feedforward_channels, + attn_drop_rate=attn_drop_rate, + drop_path_rate=0., + drop_rate=0., + num_fcs=num_fcs, + qkv_bias=bias, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + attn_cfg=attn_cfg, + ffn_cfg=ffn_cfg) + + # NOTE: drop path for stochastic depth, we shall see if + # this is better than dropout here + dropout_layer = dict(type='DropPath', drop_prob=drop_path_rate) + self.drop_path = build_dropout( + dropout_layer) if dropout_layer else nn.Identity() + self.gamma_1 = nn.Parameter( + init_values * torch.ones(embed_dims), requires_grad=True) + self.gamma_2 = nn.Parameter( + init_values * torch.ones(embed_dims), requires_grad=True) + + def build_attn(self, attn_cfg): + self.attn = BEiTAttention(**attn_cfg) + + def forward(self, x): + x = x + self.drop_path(self.gamma_1 * self.attn(self.norm1(x))) + x = x + self.drop_path(self.gamma_2 * self.ffn(self.norm2(x))) + return x + + +@MODELS.register_module() +class BEiT(BaseModule): + """BERT Pre-Training of Image Transformers. + + Args: + img_size (int | tuple): Input image size. Default: 224. + patch_size (int): The patch size. Default: 16. + in_channels (int): Number of input channels. Default: 3. + embed_dims (int): Embedding dimension. Default: 768. + num_layers (int): Depth of transformer. Default: 12. + num_heads (int): Number of attention heads. Default: 12. + mlp_ratio (int): Ratio of mlp hidden dim to embedding dim. + Default: 4. + out_indices (list | tuple | int): Output from which stages. + Default: -1. + qv_bias (bool): Enable bias for qv if True. Default: True. + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0 + drop_path_rate (float): Stochastic depth rate. Default 0.0. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + patch_norm (bool): Whether to add a norm in PatchEmbed Block. + Default: False. + final_norm (bool): Whether to add a additional layer to normalize + final feature map. Default: False. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + pretrained (str, optional): Model pretrained path. Default: None. + init_values (float): Initialize the values of BEiTAttention and FFN + with learnable scaling. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + img_size=224, + patch_size=16, + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + out_indices=-1, + qv_bias=True, + attn_drop_rate=0., + drop_path_rate=0., + norm_cfg=dict(type='LN'), + act_cfg=dict(type='GELU'), + patch_norm=False, + final_norm=False, + num_fcs=2, + norm_eval=False, + pretrained=None, + init_values=0.1, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + if isinstance(img_size, int): + img_size = to_2tuple(img_size) + elif isinstance(img_size, tuple): + if len(img_size) == 1: + img_size = to_2tuple(img_size[0]) + assert len(img_size) == 2, \ + f'The size of image should have length 1 or 2, ' \ + f'but got {len(img_size)}' + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + + self.in_channels = in_channels + self.img_size = img_size + self.patch_size = patch_size + self.norm_eval = norm_eval + self.pretrained = pretrained + self.num_layers = num_layers + self.embed_dims = embed_dims + self.num_heads = num_heads + self.mlp_ratio = mlp_ratio + self.attn_drop_rate = attn_drop_rate + self.drop_path_rate = drop_path_rate + self.num_fcs = num_fcs + self.qv_bias = qv_bias + self.act_cfg = act_cfg + self.norm_cfg = norm_cfg + self.patch_norm = patch_norm + self.init_values = init_values + self.window_size = (img_size[0] // patch_size, + img_size[1] // patch_size) + self.patch_shape = self.window_size + self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dims)) + + self._build_patch_embedding() + self._build_layers() + + if isinstance(out_indices, int): + if out_indices == -1: + out_indices = num_layers - 1 + self.out_indices = [out_indices] + elif isinstance(out_indices, list) or isinstance(out_indices, tuple): + self.out_indices = out_indices + else: + raise TypeError('out_indices must be type of int, list or tuple') + + self.final_norm = final_norm + if final_norm: + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, embed_dims, postfix=1) + self.add_module(self.norm1_name, norm1) + + def _build_patch_embedding(self): + """Build patch embedding layer.""" + self.patch_embed = PatchEmbed( + in_channels=self.in_channels, + embed_dims=self.embed_dims, + conv_type='Conv2d', + kernel_size=self.patch_size, + stride=self.patch_size, + padding=0, + norm_cfg=self.norm_cfg if self.patch_norm else None, + init_cfg=None) + + def _build_layers(self): + """Build transformer encoding layers.""" + + dpr = [ + x.item() + for x in torch.linspace(0, self.drop_path_rate, self.num_layers) + ] + self.layers = ModuleList() + for i in range(self.num_layers): + self.layers.append( + BEiTTransformerEncoderLayer( + embed_dims=self.embed_dims, + num_heads=self.num_heads, + feedforward_channels=self.mlp_ratio * self.embed_dims, + attn_drop_rate=self.attn_drop_rate, + drop_path_rate=dpr[i], + num_fcs=self.num_fcs, + bias='qv_bias' if self.qv_bias else False, + act_cfg=self.act_cfg, + norm_cfg=self.norm_cfg, + window_size=self.window_size, + init_values=self.init_values)) + + @property + def norm1(self): + return getattr(self, self.norm1_name) + + def _geometric_sequence_interpolation(self, src_size, dst_size, sequence, + num): + """Get new sequence via geometric sequence interpolation. + + Args: + src_size (int): Pos_embedding size in pre-trained model. + dst_size (int): Pos_embedding size in the current model. + sequence (tensor): The relative position bias of the pretrain + model after removing the extra tokens. + num (int): Number of attention heads. + Returns: + new_sequence (tensor): Geometric sequence interpolate the + pre-trained relative position bias to the size of + the current model. + """ + + def geometric_progression(a, r, n): + return a * (1.0 - r**n) / (1.0 - r) + + # Here is a binary function. + left, right = 1.01, 1.5 + while right - left > 1e-6: + q = (left + right) / 2.0 + gp = geometric_progression(1, q, src_size // 2) + if gp > dst_size // 2: + right = q + else: + left = q + # The position of each interpolated point is determined + # by the ratio obtained by dichotomy. + dis = [] + cur = 1 + for i in range(src_size // 2): + dis.append(cur) + cur += q**(i + 1) + r_ids = [-_ for _ in reversed(dis)] + x = r_ids + [0] + dis + y = r_ids + [0] + dis + t = dst_size // 2.0 + dx = np.arange(-t, t + 0.1, 1.0) + dy = np.arange(-t, t + 0.1, 1.0) + # Interpolation functions are being executed and called. + new_sequence = [] + for i in range(num): + z = sequence[:, i].view(src_size, src_size).float().numpy() + f = interpolate.interp2d(x, y, z, kind='cubic') + new_sequence.append( + torch.Tensor(f(dx, dy)).contiguous().view(-1, 1).to(sequence)) + new_sequence = torch.cat(new_sequence, dim=-1) + return new_sequence + + def resize_rel_pos_embed(self, checkpoint): + """Resize relative pos_embed weights. + + This function is modified from + https://github.com/microsoft/unilm/blob/master/beit/semantic_segmentation/mmcv_custom/checkpoint.py. # noqa: E501 + Copyright (c) Microsoft Corporation + Licensed under the MIT License + Args: + checkpoint (dict): Key and value of the pretrain model. + Returns: + state_dict (dict): Interpolate the relative pos_embed weights + in the pre-train model to the current model size. + """ + if 'state_dict' in checkpoint: + state_dict = checkpoint['state_dict'] + else: + state_dict = checkpoint + + all_keys = list(state_dict.keys()) + for key in all_keys: + if 'relative_position_index' in key: + state_dict.pop(key) + # In order to keep the center of pos_bias as consistent as + # possible after interpolation, and vice versa in the edge + # area, the geometric sequence interpolation method is adopted. + if 'relative_position_bias_table' in key: + rel_pos_bias = state_dict[key] + src_num_pos, num_attn_heads = rel_pos_bias.size() + dst_num_pos, _ = self.state_dict()[key].size() + dst_patch_shape = self.patch_shape + if dst_patch_shape[0] != dst_patch_shape[1]: + raise NotImplementedError() + # Count the number of extra tokens. + num_extra_tokens = dst_num_pos - ( + dst_patch_shape[0] * 2 - 1) * ( + dst_patch_shape[1] * 2 - 1) + src_size = int((src_num_pos - num_extra_tokens)**0.5) + dst_size = int((dst_num_pos - num_extra_tokens)**0.5) + if src_size != dst_size: + extra_tokens = rel_pos_bias[-num_extra_tokens:, :] + rel_pos_bias = rel_pos_bias[:-num_extra_tokens, :] + new_rel_pos_bias = self._geometric_sequence_interpolation( + src_size, dst_size, rel_pos_bias, num_attn_heads) + new_rel_pos_bias = torch.cat( + (new_rel_pos_bias, extra_tokens), dim=0) + state_dict[key] = new_rel_pos_bias + + return state_dict + + def init_weights(self): + + def _init_weights(m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + self.apply(_init_weights) + + if (isinstance(self.init_cfg, dict) + and self.init_cfg.get('type') == 'Pretrained'): + checkpoint = _load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + state_dict = self.resize_rel_pos_embed(checkpoint) + self.load_state_dict(state_dict, False) + elif self.init_cfg is not None: + super().init_weights() + else: + # We only implement the 'jax_impl' initialization implemented at + # https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py#L353 # noqa: E501 + # Copyright 2019 Ross Wightman + # Licensed under the Apache License, Version 2.0 (the "License") + trunc_normal_(self.cls_token, std=.02) + for n, m in self.named_modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + if 'ffn' in n: + nn.init.normal_(m.bias, mean=0., std=1e-6) + else: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Conv2d): + kaiming_init(m, mode='fan_in', bias=0.) + elif isinstance(m, (_BatchNorm, nn.GroupNorm, nn.LayerNorm)): + constant_init(m, val=1.0, bias=0.) + + def forward(self, inputs): + B = inputs.shape[0] + + x, hw_shape = self.patch_embed(inputs) + + # stole cls_tokens impl from Phil Wang, thanks + cls_tokens = self.cls_token.expand(B, -1, -1) + x = torch.cat((cls_tokens, x), dim=1) + + outs = [] + for i, layer in enumerate(self.layers): + x = layer(x) + if i == len(self.layers) - 1: + if self.final_norm: + x = self.norm1(x) + if i in self.out_indices: + # Remove class token and reshape token for decoder head + out = x[:, 1:] + B, _, C = out.shape + out = out.reshape(B, hw_shape[0], hw_shape[1], + C).permute(0, 3, 1, 2).contiguous() + outs.append(out) + + return tuple(outs) + + def train(self, mode=True): + super().train(mode) + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, nn.LayerNorm): + m.eval() diff --git a/mmsegmentation/mmseg/models/backbones/bisenetv1.py b/mmsegmentation/mmseg/models/backbones/bisenetv1.py new file mode 100644 index 0000000..ca58bf9 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/bisenetv1.py @@ -0,0 +1,332 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize + + +class SpatialPath(BaseModule): + """Spatial Path to preserve the spatial size of the original input image + and encode affluent spatial information. + + Args: + in_channels(int): The number of channels of input + image. Default: 3. + num_channels (Tuple[int]): The number of channels of + each layers in Spatial Path. + Default: (64, 64, 64, 128). + Returns: + x (torch.Tensor): Feature map for Feature Fusion Module. + """ + + def __init__(self, + in_channels=3, + num_channels=(64, 64, 64, 128), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert len(num_channels) == 4, 'Length of input channels \ + of Spatial Path must be 4!' + + self.layers = [] + for i in range(len(num_channels)): + layer_name = f'layer{i + 1}' + self.layers.append(layer_name) + if i == 0: + self.add_module( + layer_name, + ConvModule( + in_channels=in_channels, + out_channels=num_channels[i], + kernel_size=7, + stride=2, + padding=3, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + elif i == len(num_channels) - 1: + self.add_module( + layer_name, + ConvModule( + in_channels=num_channels[i - 1], + out_channels=num_channels[i], + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + else: + self.add_module( + layer_name, + ConvModule( + in_channels=num_channels[i - 1], + out_channels=num_channels[i], + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + def forward(self, x): + for i, layer_name in enumerate(self.layers): + layer_stage = getattr(self, layer_name) + x = layer_stage(x) + return x + + +class AttentionRefinementModule(BaseModule): + """Attention Refinement Module (ARM) to refine the features of each stage. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + Returns: + x_out (torch.Tensor): Feature map of Attention Refinement Module. + """ + + def __init__(self, + in_channels, + out_channel, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.conv_layer = ConvModule( + in_channels=in_channels, + out_channels=out_channel, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.atten_conv_layer = nn.Sequential( + nn.AdaptiveAvgPool2d((1, 1)), + ConvModule( + in_channels=out_channel, + out_channels=out_channel, + kernel_size=1, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None), nn.Sigmoid()) + + def forward(self, x): + x = self.conv_layer(x) + x_atten = self.atten_conv_layer(x) + x_out = x * x_atten + return x_out + + +class ContextPath(BaseModule): + """Context Path to provide sufficient receptive field. + + Args: + backbone_cfg:(dict): Config of backbone of + Context Path. + context_channels (Tuple[int]): The number of channel numbers + of various modules in Context Path. + Default: (128, 256, 512). + align_corners (bool, optional): The align_corners argument of + resize operation. Default: False. + Returns: + x_16_up, x_32_up (torch.Tensor, torch.Tensor): Two feature maps + undergoing upsampling from 1/16 and 1/32 downsampling + feature maps. These two feature maps are used for Feature + Fusion Module and Auxiliary Head. + """ + + def __init__(self, + backbone_cfg, + context_channels=(128, 256, 512), + align_corners=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert len(context_channels) == 3, 'Length of input channels \ + of Context Path must be 3!' + + self.backbone = MODELS.build(backbone_cfg) + + self.align_corners = align_corners + self.arm16 = AttentionRefinementModule(context_channels[1], + context_channels[0]) + self.arm32 = AttentionRefinementModule(context_channels[2], + context_channels[0]) + self.conv_head32 = ConvModule( + in_channels=context_channels[0], + out_channels=context_channels[0], + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.conv_head16 = ConvModule( + in_channels=context_channels[0], + out_channels=context_channels[0], + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.gap_conv = nn.Sequential( + nn.AdaptiveAvgPool2d((1, 1)), + ConvModule( + in_channels=context_channels[2], + out_channels=context_channels[0], + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + def forward(self, x): + x_4, x_8, x_16, x_32 = self.backbone(x) + x_gap = self.gap_conv(x_32) + + x_32_arm = self.arm32(x_32) + x_32_sum = x_32_arm + x_gap + x_32_up = resize(input=x_32_sum, size=x_16.shape[2:], mode='nearest') + x_32_up = self.conv_head32(x_32_up) + + x_16_arm = self.arm16(x_16) + x_16_sum = x_16_arm + x_32_up + x_16_up = resize(input=x_16_sum, size=x_8.shape[2:], mode='nearest') + x_16_up = self.conv_head16(x_16_up) + + return x_16_up, x_32_up + + +class FeatureFusionModule(BaseModule): + """Feature Fusion Module to fuse low level output feature of Spatial Path + and high level output feature of Context Path. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + Returns: + x_out (torch.Tensor): Feature map of Feature Fusion Module. + """ + + def __init__(self, + in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.conv1 = ConvModule( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.gap = nn.AdaptiveAvgPool2d((1, 1)) + self.conv_atten = nn.Sequential( + ConvModule( + in_channels=out_channels, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), nn.Sigmoid()) + + def forward(self, x_sp, x_cp): + x_concat = torch.cat([x_sp, x_cp], dim=1) + x_fuse = self.conv1(x_concat) + x_atten = self.gap(x_fuse) + # Note: No BN and more 1x1 conv in paper. + x_atten = self.conv_atten(x_atten) + x_atten = x_fuse * x_atten + x_out = x_atten + x_fuse + return x_out + + +@MODELS.register_module() +class BiSeNetV1(BaseModule): + """BiSeNetV1 backbone. + + This backbone is the implementation of `BiSeNet: Bilateral + Segmentation Network for Real-time Semantic + Segmentation `_. + + Args: + backbone_cfg:(dict): Config of backbone of + Context Path. + in_channels (int): The number of channels of input + image. Default: 3. + spatial_channels (Tuple[int]): Size of channel numbers of + various layers in Spatial Path. + Default: (64, 64, 64, 128). + context_channels (Tuple[int]): Size of channel numbers of + various modules in Context Path. + Default: (128, 256, 512). + out_indices (Tuple[int] | int, optional): Output from which stages. + Default: (0, 1, 2). + align_corners (bool, optional): The align_corners argument of + resize operation in Bilateral Guided Aggregation Layer. + Default: False. + out_channels(int): The number of channels of output. + It must be the same with `in_channels` of decode_head. + Default: 256. + """ + + def __init__(self, + backbone_cfg, + in_channels=3, + spatial_channels=(64, 64, 64, 128), + context_channels=(128, 256, 512), + out_indices=(0, 1, 2), + align_corners=False, + out_channels=256, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='ReLU'), + init_cfg=None): + + super().__init__(init_cfg=init_cfg) + assert len(spatial_channels) == 4, 'Length of input channels \ + of Spatial Path must be 4!' + + assert len(context_channels) == 3, 'Length of input channels \ + of Context Path must be 3!' + + self.out_indices = out_indices + self.align_corners = align_corners + self.context_path = ContextPath(backbone_cfg, context_channels, + self.align_corners) + self.spatial_path = SpatialPath(in_channels, spatial_channels) + self.ffm = FeatureFusionModule(context_channels[1], out_channels) + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + def forward(self, x): + # stole refactoring code from Coin Cheung, thanks + x_context8, x_context16 = self.context_path(x) + x_spatial = self.spatial_path(x) + x_fuse = self.ffm(x_spatial, x_context8) + + outs = [x_fuse, x_context8, x_context16] + outs = [outs[i] for i in self.out_indices] + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/backbones/bisenetv2.py b/mmsegmentation/mmseg/models/backbones/bisenetv2.py new file mode 100644 index 0000000..32aa498 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/bisenetv2.py @@ -0,0 +1,622 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, + build_activation_layer, build_norm_layer) +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize + + +class DetailBranch(BaseModule): + """Detail Branch with wide channels and shallow layers to capture low-level + details and generate high-resolution feature representation. + + Args: + detail_channels (Tuple[int]): Size of channel numbers of each stage + in Detail Branch, in paper it has 3 stages. + Default: (64, 64, 128). + in_channels (int): Number of channels of input image. Default: 3. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Returns: + x (torch.Tensor): Feature map of Detail Branch. + """ + + def __init__(self, + detail_channels=(64, 64, 128), + in_channels=3, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + detail_branch = [] + for i in range(len(detail_channels)): + if i == 0: + detail_branch.append( + nn.Sequential( + ConvModule( + in_channels=in_channels, + out_channels=detail_channels[i], + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + in_channels=detail_channels[i], + out_channels=detail_channels[i], + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg))) + else: + detail_branch.append( + nn.Sequential( + ConvModule( + in_channels=detail_channels[i - 1], + out_channels=detail_channels[i], + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + in_channels=detail_channels[i], + out_channels=detail_channels[i], + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + in_channels=detail_channels[i], + out_channels=detail_channels[i], + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg))) + self.detail_branch = nn.ModuleList(detail_branch) + + def forward(self, x): + for stage in self.detail_branch: + x = stage(x) + return x + + +class StemBlock(BaseModule): + """Stem Block at the beginning of Semantic Branch. + + Args: + in_channels (int): Number of input channels. + Default: 3. + out_channels (int): Number of output channels. + Default: 16. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Returns: + x (torch.Tensor): First feature map in Semantic Branch. + """ + + def __init__(self, + in_channels=3, + out_channels=16, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.conv_first = ConvModule( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.convs = nn.Sequential( + ConvModule( + in_channels=out_channels, + out_channels=out_channels // 2, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + in_channels=out_channels // 2, + out_channels=out_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.pool = nn.MaxPool2d( + kernel_size=3, stride=2, padding=1, ceil_mode=False) + self.fuse_last = ConvModule( + in_channels=out_channels * 2, + out_channels=out_channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x): + x = self.conv_first(x) + x_left = self.convs(x) + x_right = self.pool(x) + x = self.fuse_last(torch.cat([x_left, x_right], dim=1)) + return x + + +class GELayer(BaseModule): + """Gather-and-Expansion Layer. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + exp_ratio (int): Expansion ratio for middle channels. + Default: 6. + stride (int): Stride of GELayer. Default: 1 + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Returns: + x (torch.Tensor): Intermediate feature map in + Semantic Branch. + """ + + def __init__(self, + in_channels, + out_channels, + exp_ratio=6, + stride=1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + mid_channel = in_channels * exp_ratio + self.conv1 = ConvModule( + in_channels=in_channels, + out_channels=in_channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if stride == 1: + self.dwconv = nn.Sequential( + # ReLU in ConvModule not shown in paper + ConvModule( + in_channels=in_channels, + out_channels=mid_channel, + kernel_size=3, + stride=stride, + padding=1, + groups=in_channels, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.shortcut = None + else: + self.dwconv = nn.Sequential( + ConvModule( + in_channels=in_channels, + out_channels=mid_channel, + kernel_size=3, + stride=stride, + padding=1, + groups=in_channels, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None), + # ReLU in ConvModule not shown in paper + ConvModule( + in_channels=mid_channel, + out_channels=mid_channel, + kernel_size=3, + stride=1, + padding=1, + groups=mid_channel, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ) + self.shortcut = nn.Sequential( + DepthwiseSeparableConvModule( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=3, + stride=stride, + padding=1, + dw_norm_cfg=norm_cfg, + dw_act_cfg=None, + pw_norm_cfg=norm_cfg, + pw_act_cfg=None, + )) + + self.conv2 = nn.Sequential( + ConvModule( + in_channels=mid_channel, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None, + )) + + self.act = build_activation_layer(act_cfg) + + def forward(self, x): + identity = x + x = self.conv1(x) + x = self.dwconv(x) + x = self.conv2(x) + if self.shortcut is not None: + shortcut = self.shortcut(identity) + x = x + shortcut + else: + x = x + identity + x = self.act(x) + return x + + +class CEBlock(BaseModule): + """Context Embedding Block for large receptive filed in Semantic Branch. + + Args: + in_channels (int): Number of input channels. + Default: 3. + out_channels (int): Number of output channels. + Default: 16. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Returns: + x (torch.Tensor): Last feature map in Semantic Branch. + """ + + def __init__(self, + in_channels=3, + out_channels=16, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + self.gap = nn.Sequential( + nn.AdaptiveAvgPool2d((1, 1)), + build_norm_layer(norm_cfg, self.in_channels)[1]) + self.conv_gap = ConvModule( + in_channels=self.in_channels, + out_channels=self.out_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + # Note: in paper here is naive conv2d, no bn-relu + self.conv_last = ConvModule( + in_channels=self.out_channels, + out_channels=self.out_channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x): + identity = x + x = self.gap(x) + x = self.conv_gap(x) + x = identity + x + x = self.conv_last(x) + return x + + +class SemanticBranch(BaseModule): + """Semantic Branch which is lightweight with narrow channels and deep + layers to obtainใ€€high-level semantic context. + + Args: + semantic_channels(Tuple[int]): Size of channel numbers of + various stages in Semantic Branch. + Default: (16, 32, 64, 128). + in_channels (int): Number of channels of input image. Default: 3. + exp_ratio (int): Expansion ratio for middle channels. + Default: 6. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Returns: + semantic_outs (List[torch.Tensor]): List of several feature maps + for auxiliary heads (Booster) and Bilateral + Guided Aggregation Layer. + """ + + def __init__(self, + semantic_channels=(16, 32, 64, 128), + in_channels=3, + exp_ratio=6, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.semantic_channels = semantic_channels + self.semantic_stages = [] + for i in range(len(semantic_channels)): + stage_name = f'stage{i + 1}' + self.semantic_stages.append(stage_name) + if i == 0: + self.add_module( + stage_name, + StemBlock(self.in_channels, semantic_channels[i])) + elif i == (len(semantic_channels) - 1): + self.add_module( + stage_name, + nn.Sequential( + GELayer(semantic_channels[i - 1], semantic_channels[i], + exp_ratio, 2), + GELayer(semantic_channels[i], semantic_channels[i], + exp_ratio, 1), + GELayer(semantic_channels[i], semantic_channels[i], + exp_ratio, 1), + GELayer(semantic_channels[i], semantic_channels[i], + exp_ratio, 1))) + else: + self.add_module( + stage_name, + nn.Sequential( + GELayer(semantic_channels[i - 1], semantic_channels[i], + exp_ratio, 2), + GELayer(semantic_channels[i], semantic_channels[i], + exp_ratio, 1))) + + self.add_module(f'stage{len(semantic_channels)}_CEBlock', + CEBlock(semantic_channels[-1], semantic_channels[-1])) + self.semantic_stages.append(f'stage{len(semantic_channels)}_CEBlock') + + def forward(self, x): + semantic_outs = [] + for stage_name in self.semantic_stages: + semantic_stage = getattr(self, stage_name) + x = semantic_stage(x) + semantic_outs.append(x) + return semantic_outs + + +class BGALayer(BaseModule): + """Bilateral Guided Aggregation Layer to fuse the complementary information + from both Detail Branch and Semantic Branch. + + Args: + out_channels (int): Number of output channels. + Default: 128. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Returns: + output (torch.Tensor): Output feature map for Segment heads. + """ + + def __init__(self, + out_channels=128, + align_corners=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.out_channels = out_channels + self.align_corners = align_corners + self.detail_dwconv = nn.Sequential( + DepthwiseSeparableConvModule( + in_channels=self.out_channels, + out_channels=self.out_channels, + kernel_size=3, + stride=1, + padding=1, + dw_norm_cfg=norm_cfg, + dw_act_cfg=None, + pw_norm_cfg=None, + pw_act_cfg=None, + )) + self.detail_down = nn.Sequential( + ConvModule( + in_channels=self.out_channels, + out_channels=self.out_channels, + kernel_size=3, + stride=2, + padding=1, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None), + nn.AvgPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False)) + self.semantic_conv = nn.Sequential( + ConvModule( + in_channels=self.out_channels, + out_channels=self.out_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None)) + self.semantic_dwconv = nn.Sequential( + DepthwiseSeparableConvModule( + in_channels=self.out_channels, + out_channels=self.out_channels, + kernel_size=3, + stride=1, + padding=1, + dw_norm_cfg=norm_cfg, + dw_act_cfg=None, + pw_norm_cfg=None, + pw_act_cfg=None, + )) + self.conv = ConvModule( + in_channels=self.out_channels, + out_channels=self.out_channels, + kernel_size=3, + stride=1, + padding=1, + inplace=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ) + + def forward(self, x_d, x_s): + detail_dwconv = self.detail_dwconv(x_d) + detail_down = self.detail_down(x_d) + semantic_conv = self.semantic_conv(x_s) + semantic_dwconv = self.semantic_dwconv(x_s) + semantic_conv = resize( + input=semantic_conv, + size=detail_dwconv.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + fuse_1 = detail_dwconv * torch.sigmoid(semantic_conv) + fuse_2 = detail_down * torch.sigmoid(semantic_dwconv) + fuse_2 = resize( + input=fuse_2, + size=fuse_1.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + output = self.conv(fuse_1 + fuse_2) + return output + + +@MODELS.register_module() +class BiSeNetV2(BaseModule): + """BiSeNetV2: Bilateral Network with Guided Aggregation for + Real-time Semantic Segmentation. + + This backbone is the implementation of + `BiSeNetV2 `_. + + Args: + in_channels (int): Number of channel of input image. Default: 3. + detail_channels (Tuple[int], optional): Channels of each stage + in Detail Branch. Default: (64, 64, 128). + semantic_channels (Tuple[int], optional): Channels of each stage + in Semantic Branch. Default: (16, 32, 64, 128). + See Table 1 and Figure 3 of paper for more details. + semantic_expansion_ratio (int, optional): The expansion factor + expanding channel number of middle channels in Semantic Branch. + Default: 6. + bga_channels (int, optional): Number of middle channels in + Bilateral Guided Aggregation Layer. Default: 128. + out_indices (Tuple[int] | int, optional): Output from which stages. + Default: (0, 1, 2, 3, 4). + align_corners (bool, optional): The align_corners argument of + resize operation in Bilateral Guided Aggregation Layer. + Default: False. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels=3, + detail_channels=(64, 64, 128), + semantic_channels=(16, 32, 64, 128), + semantic_expansion_ratio=6, + bga_channels=128, + out_indices=(0, 1, 2, 3, 4), + align_corners=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + if init_cfg is None: + init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm']) + ] + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.out_indices = out_indices + self.detail_channels = detail_channels + self.semantic_channels = semantic_channels + self.semantic_expansion_ratio = semantic_expansion_ratio + self.bga_channels = bga_channels + self.align_corners = align_corners + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.detail = DetailBranch(self.detail_channels, self.in_channels) + self.semantic = SemanticBranch(self.semantic_channels, + self.in_channels, + self.semantic_expansion_ratio) + self.bga = BGALayer(self.bga_channels, self.align_corners) + + def forward(self, x): + # stole refactoring code from Coin Cheung, thanks + x_detail = self.detail(x) + x_semantic_lst = self.semantic(x) + x_head = self.bga(x_detail, x_semantic_lst[-1]) + outs = [x_head] + x_semantic_lst[:-1] + outs = [outs[i] for i in self.out_indices] + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/backbones/cgnet.py b/mmsegmentation/mmseg/models/backbones/cgnet.py new file mode 100644 index 0000000..b74b494 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/cgnet.py @@ -0,0 +1,372 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import ConvModule, build_conv_layer, build_norm_layer +from mmengine.model import BaseModule +from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm + +from mmseg.registry import MODELS + + +class GlobalContextExtractor(nn.Module): + """Global Context Extractor for CGNet. + + This class is employed to refine the joint feature of both local feature + and surrounding context. + + Args: + channel (int): Number of input feature channels. + reduction (int): Reductions for global context extractor. Default: 16. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, channel, reduction=16, with_cp=False): + super().__init__() + self.channel = channel + self.reduction = reduction + assert reduction >= 1 and channel >= reduction + self.with_cp = with_cp + self.avg_pool = nn.AdaptiveAvgPool2d(1) + self.fc = nn.Sequential( + nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), + nn.Linear(channel // reduction, channel), nn.Sigmoid()) + + def forward(self, x): + + def _inner_forward(x): + num_batch, num_channel = x.size()[:2] + y = self.avg_pool(x).view(num_batch, num_channel) + y = self.fc(y).view(num_batch, num_channel, 1, 1) + return x * y + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class ContextGuidedBlock(nn.Module): + """Context Guided Block for CGNet. + + This class consists of four components: local feature extractor, + surrounding feature extractor, joint feature extractor and global + context extractor. + + Args: + in_channels (int): Number of input feature channels. + out_channels (int): Number of output feature channels. + dilation (int): Dilation rate for surrounding context extractor. + Default: 2. + reduction (int): Reduction for global context extractor. Default: 16. + skip_connect (bool): Add input to output or not. Default: True. + downsample (bool): Downsample the input to 1/2 or not. Default: False. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + in_channels, + out_channels, + dilation=2, + reduction=16, + skip_connect=True, + downsample=False, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='PReLU'), + with_cp=False): + super().__init__() + self.with_cp = with_cp + self.downsample = downsample + + channels = out_channels if downsample else out_channels // 2 + if 'type' in act_cfg and act_cfg['type'] == 'PReLU': + act_cfg['num_parameters'] = channels + kernel_size = 3 if downsample else 1 + stride = 2 if downsample else 1 + padding = (kernel_size - 1) // 2 + + self.conv1x1 = ConvModule( + in_channels, + channels, + kernel_size, + stride, + padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + self.f_loc = build_conv_layer( + conv_cfg, + channels, + channels, + kernel_size=3, + padding=1, + groups=channels, + bias=False) + self.f_sur = build_conv_layer( + conv_cfg, + channels, + channels, + kernel_size=3, + padding=dilation, + groups=channels, + dilation=dilation, + bias=False) + + self.bn = build_norm_layer(norm_cfg, 2 * channels)[1] + self.activate = nn.PReLU(2 * channels) + + if downsample: + self.bottleneck = build_conv_layer( + conv_cfg, + 2 * channels, + out_channels, + kernel_size=1, + bias=False) + + self.skip_connect = skip_connect and not downsample + self.f_glo = GlobalContextExtractor(out_channels, reduction, with_cp) + + def forward(self, x): + + def _inner_forward(x): + out = self.conv1x1(x) + loc = self.f_loc(out) + sur = self.f_sur(out) + + joi_feat = torch.cat([loc, sur], 1) # the joint feature + joi_feat = self.bn(joi_feat) + joi_feat = self.activate(joi_feat) + if self.downsample: + joi_feat = self.bottleneck(joi_feat) # channel = out_channels + # f_glo is employed to refine the joint feature + out = self.f_glo(joi_feat) + + if self.skip_connect: + return x + out + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class InputInjection(nn.Module): + """Downsampling module for CGNet.""" + + def __init__(self, num_downsampling): + super().__init__() + self.pool = nn.ModuleList() + for i in range(num_downsampling): + self.pool.append(nn.AvgPool2d(3, stride=2, padding=1)) + + def forward(self, x): + for pool in self.pool: + x = pool(x) + return x + + +@MODELS.register_module() +class CGNet(BaseModule): + """CGNet backbone. + + This backbone is the implementation of `A Light-weight Context Guided + Network for Semantic Segmentation `_. + + Args: + in_channels (int): Number of input image channels. Normally 3. + num_channels (tuple[int]): Numbers of feature channels at each stages. + Default: (32, 64, 128). + num_blocks (tuple[int]): Numbers of CG blocks at stage 1 and stage 2. + Default: (3, 21). + dilations (tuple[int]): Dilation rate for surrounding context + extractors at stage 1 and stage 2. Default: (2, 4). + reductions (tuple[int]): Reductions for global context extractors at + stage 1 and stage 2. Default: (8, 16). + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels=3, + num_channels=(32, 64, 128), + num_blocks=(3, 21), + dilations=(2, 4), + reductions=(8, 16), + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='PReLU'), + norm_eval=False, + with_cp=False, + pretrained=None, + init_cfg=None): + + super().__init__(init_cfg) + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is a deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer=['Conv2d', 'Linear']), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']), + dict(type='Constant', val=0, layer='PReLU') + ] + else: + raise TypeError('pretrained must be a str or None') + + self.in_channels = in_channels + self.num_channels = num_channels + assert isinstance(self.num_channels, tuple) and len( + self.num_channels) == 3 + self.num_blocks = num_blocks + assert isinstance(self.num_blocks, tuple) and len(self.num_blocks) == 2 + self.dilations = dilations + assert isinstance(self.dilations, tuple) and len(self.dilations) == 2 + self.reductions = reductions + assert isinstance(self.reductions, tuple) and len(self.reductions) == 2 + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + if 'type' in self.act_cfg and self.act_cfg['type'] == 'PReLU': + self.act_cfg['num_parameters'] = num_channels[0] + self.norm_eval = norm_eval + self.with_cp = with_cp + + cur_channels = in_channels + self.stem = nn.ModuleList() + for i in range(3): + self.stem.append( + ConvModule( + cur_channels, + num_channels[0], + 3, + 2 if i == 0 else 1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + cur_channels = num_channels[0] + + self.inject_2x = InputInjection(1) # down-sample for Input, factor=2 + self.inject_4x = InputInjection(2) # down-sample for Input, factor=4 + + cur_channels += in_channels + self.norm_prelu_0 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + # stage 1 + self.level1 = nn.ModuleList() + for i in range(num_blocks[0]): + self.level1.append( + ContextGuidedBlock( + cur_channels if i == 0 else num_channels[1], + num_channels[1], + dilations[0], + reductions[0], + downsample=(i == 0), + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + with_cp=with_cp)) # CG block + + cur_channels = 2 * num_channels[1] + in_channels + self.norm_prelu_1 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + # stage 2 + self.level2 = nn.ModuleList() + for i in range(num_blocks[1]): + self.level2.append( + ContextGuidedBlock( + cur_channels if i == 0 else num_channels[2], + num_channels[2], + dilations[1], + reductions[1], + downsample=(i == 0), + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + with_cp=with_cp)) # CG block + + cur_channels = 2 * num_channels[2] + self.norm_prelu_2 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + def forward(self, x): + output = [] + + # stage 0 + inp_2x = self.inject_2x(x) + inp_4x = self.inject_4x(x) + for layer in self.stem: + x = layer(x) + x = self.norm_prelu_0(torch.cat([x, inp_2x], 1)) + output.append(x) + + # stage 1 + for i, layer in enumerate(self.level1): + x = layer(x) + if i == 0: + down1 = x + x = self.norm_prelu_1(torch.cat([x, down1, inp_4x], 1)) + output.append(x) + + # stage 2 + for i, layer in enumerate(self.level2): + x = layer(x) + if i == 0: + down2 = x + x = self.norm_prelu_2(torch.cat([down2, x], 1)) + output.append(x) + + return output + + def train(self, mode=True): + """Convert the model into training mode will keeping the normalization + layer freezed.""" + super().train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmsegmentation/mmseg/models/backbones/ddrnet.py b/mmsegmentation/mmseg/models/backbones/ddrnet.py new file mode 100644 index 0000000..4508aad --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/ddrnet.py @@ -0,0 +1,222 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule, build_norm_layer +from mmengine.model import BaseModule + +from mmseg.models.utils import DAPPM, BasicBlock, Bottleneck, resize +from mmseg.registry import MODELS +from mmseg.utils import OptConfigType + + +@MODELS.register_module() +class DDRNet(BaseModule): + """DDRNet backbone. + + This backbone is the implementation of `Deep Dual-resolution Networks for + Real-time and Accurate Semantic Segmentation of Road Scenes + `_. + Modified from https://github.com/ydhongHIT/DDRNet. + + Args: + in_channels (int): Number of input image channels. Default: 3. + channels: (int): The base channels of DDRNet. Default: 32. + ppm_channels (int): The channels of PPM module. Default: 128. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + norm_cfg (dict): Config dict to build norm layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU', inplace=True). + init_cfg (dict, optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels: int = 3, + channels: int = 32, + ppm_channels: int = 128, + align_corners: bool = False, + norm_cfg: OptConfigType = dict(type='BN', requires_grad=True), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + + self.in_channels = in_channels + self.ppm_channels = ppm_channels + + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + + # stage 0-2 + self.stem = self._make_stem_layer(in_channels, channels, num_blocks=2) + self.relu = nn.ReLU() + + # low resolution(context) branch + self.context_branch_layers = nn.ModuleList() + for i in range(3): + self.context_branch_layers.append( + self._make_layer( + block=BasicBlock if i < 2 else Bottleneck, + inplanes=channels * 2**(i + 1), + planes=channels * 8 if i > 0 else channels * 4, + num_blocks=2 if i < 2 else 1, + stride=2)) + + # bilateral fusion + self.compression_1 = ConvModule( + channels * 4, + channels * 2, + kernel_size=1, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.down_1 = ConvModule( + channels * 2, + channels * 4, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=None) + + self.compression_2 = ConvModule( + channels * 8, + channels * 2, + kernel_size=1, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.down_2 = nn.Sequential( + ConvModule( + channels * 2, + channels * 4, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + ConvModule( + channels * 4, + channels * 8, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=None)) + + # high resolution(spatial) branch + self.spatial_branch_layers = nn.ModuleList() + for i in range(3): + self.spatial_branch_layers.append( + self._make_layer( + block=BasicBlock if i < 2 else Bottleneck, + inplanes=channels * 2, + planes=channels * 2, + num_blocks=2 if i < 2 else 1, + )) + + self.spp = DAPPM( + channels * 16, ppm_channels, channels * 4, num_scales=5) + + def _make_stem_layer(self, in_channels, channels, num_blocks): + layers = [ + ConvModule( + in_channels, + channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + ConvModule( + channels, + channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + ] + + layers.extend([ + self._make_layer(BasicBlock, channels, channels, num_blocks), + nn.ReLU(), + self._make_layer( + BasicBlock, channels, channels * 2, num_blocks, stride=2), + nn.ReLU(), + ]) + + return nn.Sequential(*layers) + + def _make_layer(self, block, inplanes, planes, num_blocks, stride=1): + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d( + inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, planes * block.expansion)[1]) + + layers = [ + block( + in_channels=inplanes, + channels=planes, + stride=stride, + downsample=downsample) + ] + inplanes = planes * block.expansion + for i in range(1, num_blocks): + layers.append( + block( + in_channels=inplanes, + channels=planes, + stride=1, + norm_cfg=self.norm_cfg, + act_cfg_out=None if i == num_blocks - 1 else self.act_cfg)) + + return nn.Sequential(*layers) + + def forward(self, x): + """Forward function.""" + out_size = (x.shape[-2] // 8, x.shape[-1] // 8) + + # stage 0-2 + x = self.stem(x) + + # stage3 + x_c = self.context_branch_layers[0](x) + x_s = self.spatial_branch_layers[0](x) + comp_c = self.compression_1(self.relu(x_c)) + x_c += self.down_1(self.relu(x_s)) + x_s += resize( + comp_c, + size=out_size, + mode='bilinear', + align_corners=self.align_corners) + if self.training: + temp_context = x_s.clone() + + # stage4 + x_c = self.context_branch_layers[1](self.relu(x_c)) + x_s = self.spatial_branch_layers[1](self.relu(x_s)) + comp_c = self.compression_2(self.relu(x_c)) + x_c += self.down_2(self.relu(x_s)) + x_s += resize( + comp_c, + size=out_size, + mode='bilinear', + align_corners=self.align_corners) + + # stage5 + x_s = self.spatial_branch_layers[2](self.relu(x_s)) + x_c = self.context_branch_layers[2](self.relu(x_c)) + x_c = self.spp(x_c) + x_c = resize( + x_c, + size=out_size, + mode='bilinear', + align_corners=self.align_corners) + + return (temp_context, x_s + x_c) if self.training else x_s + x_c diff --git a/mmsegmentation/mmseg/models/backbones/erfnet.py b/mmsegmentation/mmseg/models/backbones/erfnet.py new file mode 100644 index 0000000..2c5ec67 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/erfnet.py @@ -0,0 +1,329 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import build_activation_layer, build_conv_layer, build_norm_layer +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize + + +class DownsamplerBlock(BaseModule): + """Downsampler block of ERFNet. + + This module is a little different from basical ConvModule. + The features from Conv and MaxPool layers are + concatenated before BatchNorm. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN', eps=1e-3), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.conv = build_conv_layer( + self.conv_cfg, + in_channels, + out_channels - in_channels, + kernel_size=3, + stride=2, + padding=1) + self.pool = nn.MaxPool2d(kernel_size=2, stride=2) + self.bn = build_norm_layer(self.norm_cfg, out_channels)[1] + self.act = build_activation_layer(self.act_cfg) + + def forward(self, input): + conv_out = self.conv(input) + pool_out = self.pool(input) + pool_out = resize( + input=pool_out, + size=conv_out.size()[2:], + mode='bilinear', + align_corners=False) + output = torch.cat([conv_out, pool_out], 1) + output = self.bn(output) + output = self.act(output) + return output + + +class NonBottleneck1d(BaseModule): + """Non-bottleneck block of ERFNet. + + Args: + channels (int): Number of channels in Non-bottleneck block. + drop_rate (float): Probability of an element to be zeroed. + Default 0. + dilation (int): Dilation rate for last two conv layers. + Default 1. + num_conv_layer (int): Number of 3x1 and 1x3 convolution layers. + Default 2. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + channels, + drop_rate=0, + dilation=1, + num_conv_layer=2, + conv_cfg=None, + norm_cfg=dict(type='BN', eps=1e-3), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.act = build_activation_layer(self.act_cfg) + + self.convs_layers = nn.ModuleList() + for conv_layer in range(num_conv_layer): + first_conv_padding = (1, 0) if conv_layer == 0 else (dilation, 0) + first_conv_dilation = 1 if conv_layer == 0 else (dilation, 1) + second_conv_padding = (0, 1) if conv_layer == 0 else (0, dilation) + second_conv_dilation = 1 if conv_layer == 0 else (1, dilation) + + self.convs_layers.append( + build_conv_layer( + self.conv_cfg, + channels, + channels, + kernel_size=(3, 1), + stride=1, + padding=first_conv_padding, + bias=True, + dilation=first_conv_dilation)) + self.convs_layers.append(self.act) + self.convs_layers.append( + build_conv_layer( + self.conv_cfg, + channels, + channels, + kernel_size=(1, 3), + stride=1, + padding=second_conv_padding, + bias=True, + dilation=second_conv_dilation)) + self.convs_layers.append( + build_norm_layer(self.norm_cfg, channels)[1]) + if conv_layer == 0: + self.convs_layers.append(self.act) + else: + self.convs_layers.append(nn.Dropout(p=drop_rate)) + + def forward(self, input): + output = input + for conv in self.convs_layers: + output = conv(output) + output = self.act(output + input) + return output + + +class UpsamplerBlock(BaseModule): + """Upsampler block of ERFNet. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN', eps=1e-3), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.conv = nn.ConvTranspose2d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=3, + stride=2, + padding=1, + output_padding=1, + bias=True) + self.bn = build_norm_layer(self.norm_cfg, out_channels)[1] + self.act = build_activation_layer(self.act_cfg) + + def forward(self, input): + output = self.conv(input) + output = self.bn(output) + output = self.act(output) + return output + + +@MODELS.register_module() +class ERFNet(BaseModule): + """ERFNet backbone. + + This backbone is the implementation of `ERFNet: Efficient Residual + Factorized ConvNet for Real-time SemanticSegmentation + `_. + + Args: + in_channels (int): The number of channels of input + image. Default: 3. + enc_downsample_channels (Tuple[int]): Size of channel + numbers of various Downsampler block in encoder. + Default: (16, 64, 128). + enc_stage_non_bottlenecks (Tuple[int]): Number of stages of + Non-bottleneck block in encoder. + Default: (5, 8). + enc_non_bottleneck_dilations (Tuple[int]): Dilation rate of each + stage of Non-bottleneck block of encoder. + Default: (2, 4, 8, 16). + enc_non_bottleneck_channels (Tuple[int]): Size of channel + numbers of various Non-bottleneck block in encoder. + Default: (64, 128). + dec_upsample_channels (Tuple[int]): Size of channel numbers of + various Deconvolution block in decoder. + Default: (64, 16). + dec_stages_non_bottleneck (Tuple[int]): Number of stages of + Non-bottleneck block in decoder. + Default: (2, 2). + dec_non_bottleneck_channels (Tuple[int]): Size of channel + numbers of various Non-bottleneck block in decoder. + Default: (64, 16). + drop_rate (float): Probability of an element to be zeroed. + Default 0.1. + """ + + def __init__(self, + in_channels=3, + enc_downsample_channels=(16, 64, 128), + enc_stage_non_bottlenecks=(5, 8), + enc_non_bottleneck_dilations=(2, 4, 8, 16), + enc_non_bottleneck_channels=(64, 128), + dec_upsample_channels=(64, 16), + dec_stages_non_bottleneck=(2, 2), + dec_non_bottleneck_channels=(64, 16), + dropout_ratio=0.1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='ReLU'), + init_cfg=None): + + super().__init__(init_cfg=init_cfg) + assert len(enc_downsample_channels) \ + == len(dec_upsample_channels)+1, 'Number of downsample\ + block of encoder does not \ + match number of upsample block of decoder!' + assert len(enc_downsample_channels) \ + == len(enc_stage_non_bottlenecks)+1, 'Number of \ + downsample block of encoder does not match \ + number of Non-bottleneck block of encoder!' + assert len(enc_downsample_channels) \ + == len(enc_non_bottleneck_channels)+1, 'Number of \ + downsample block of encoder does not match \ + number of channels of Non-bottleneck block of encoder!' + assert enc_stage_non_bottlenecks[-1] \ + % len(enc_non_bottleneck_dilations) == 0, 'Number of \ + Non-bottleneck block of encoder does not match \ + number of Non-bottleneck block of encoder!' + assert len(dec_upsample_channels) \ + == len(dec_stages_non_bottleneck), 'Number of \ + upsample block of decoder does not match \ + number of Non-bottleneck block of decoder!' + assert len(dec_stages_non_bottleneck) \ + == len(dec_non_bottleneck_channels), 'Number of \ + Non-bottleneck block of decoder does not match \ + number of channels of Non-bottleneck block of decoder!' + + self.in_channels = in_channels + self.enc_downsample_channels = enc_downsample_channels + self.enc_stage_non_bottlenecks = enc_stage_non_bottlenecks + self.enc_non_bottleneck_dilations = enc_non_bottleneck_dilations + self.enc_non_bottleneck_channels = enc_non_bottleneck_channels + self.dec_upsample_channels = dec_upsample_channels + self.dec_stages_non_bottleneck = dec_stages_non_bottleneck + self.dec_non_bottleneck_channels = dec_non_bottleneck_channels + self.dropout_ratio = dropout_ratio + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.encoder.append( + DownsamplerBlock(self.in_channels, enc_downsample_channels[0])) + + for i in range(len(enc_downsample_channels) - 1): + self.encoder.append( + DownsamplerBlock(enc_downsample_channels[i], + enc_downsample_channels[i + 1])) + # Last part of encoder is some dilated NonBottleneck1d blocks. + if i == len(enc_downsample_channels) - 2: + iteration_times = int(enc_stage_non_bottlenecks[-1] / + len(enc_non_bottleneck_dilations)) + for j in range(iteration_times): + for k in range(len(enc_non_bottleneck_dilations)): + self.encoder.append( + NonBottleneck1d(enc_downsample_channels[-1], + self.dropout_ratio, + enc_non_bottleneck_dilations[k])) + else: + for j in range(enc_stage_non_bottlenecks[i]): + self.encoder.append( + NonBottleneck1d(enc_downsample_channels[i + 1], + self.dropout_ratio)) + + for i in range(len(dec_upsample_channels)): + if i == 0: + self.decoder.append( + UpsamplerBlock(enc_downsample_channels[-1], + dec_non_bottleneck_channels[i])) + else: + self.decoder.append( + UpsamplerBlock(dec_non_bottleneck_channels[i - 1], + dec_non_bottleneck_channels[i])) + for j in range(dec_stages_non_bottleneck[i]): + self.decoder.append( + NonBottleneck1d(dec_non_bottleneck_channels[i])) + + def forward(self, x): + for enc in self.encoder: + x = enc(x) + for dec in self.decoder: + x = dec(x) + return [x] diff --git a/mmsegmentation/mmseg/models/backbones/fast_scnn.py b/mmsegmentation/mmseg/models/backbones/fast_scnn.py new file mode 100644 index 0000000..6ff7a31 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/fast_scnn.py @@ -0,0 +1,408 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmengine.model import BaseModule + +from mmseg.models.decode_heads.psp_head import PPM +from mmseg.registry import MODELS +from ..utils import InvertedResidual, resize + + +class LearningToDownsample(nn.Module): + """Learning to downsample module. + + Args: + in_channels (int): Number of input channels. + dw_channels (tuple[int]): Number of output channels of the first and + the second depthwise conv (dwconv) layers. + out_channels (int): Number of output channels of the whole + 'learning to downsample' module. + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + dw_act_cfg (dict): In DepthwiseSeparableConvModule, activation config + of depthwise ConvModule. If it is 'default', it will be the same + as `act_cfg`. Default: None. + """ + + def __init__(self, + in_channels, + dw_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + dw_act_cfg=None): + super().__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.dw_act_cfg = dw_act_cfg + dw_channels1 = dw_channels[0] + dw_channels2 = dw_channels[1] + + self.conv = ConvModule( + in_channels, + dw_channels1, + 3, + stride=2, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.dsconv1 = DepthwiseSeparableConvModule( + dw_channels1, + dw_channels2, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + dw_act_cfg=self.dw_act_cfg) + + self.dsconv2 = DepthwiseSeparableConvModule( + dw_channels2, + out_channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + dw_act_cfg=self.dw_act_cfg) + + def forward(self, x): + x = self.conv(x) + x = self.dsconv1(x) + x = self.dsconv2(x) + return x + + +class GlobalFeatureExtractor(nn.Module): + """Global feature extractor module. + + Args: + in_channels (int): Number of input channels of the GFE module. + Default: 64 + block_channels (tuple[int]): Tuple of ints. Each int specifies the + number of output channels of each Inverted Residual module. + Default: (64, 96, 128) + out_channels(int): Number of output channels of the GFE module. + Default: 128 + expand_ratio (int): Adjusts number of channels of the hidden layer + in InvertedResidual by this amount. + Default: 6 + num_blocks (tuple[int]): Tuple of ints. Each int specifies the + number of times each Inverted Residual module is repeated. + The repeated Inverted Residual modules are called a 'group'. + Default: (3, 3, 3) + strides (tuple[int]): Tuple of ints. Each int specifies + the downsampling factor of each 'group'. + Default: (2, 2, 1) + pool_scales (tuple[int]): Tuple of ints. Each int specifies + the parameter required in 'global average pooling' within PPM. + Default: (1, 2, 3, 6) + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + in_channels=64, + block_channels=(64, 96, 128), + out_channels=128, + expand_ratio=6, + num_blocks=(3, 3, 3), + strides=(2, 2, 1), + pool_scales=(1, 2, 3, 6), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + super().__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + assert len(block_channels) == len(num_blocks) == 3 + self.bottleneck1 = self._make_layer(in_channels, block_channels[0], + num_blocks[0], strides[0], + expand_ratio) + self.bottleneck2 = self._make_layer(block_channels[0], + block_channels[1], num_blocks[1], + strides[1], expand_ratio) + self.bottleneck3 = self._make_layer(block_channels[1], + block_channels[2], num_blocks[2], + strides[2], expand_ratio) + self.ppm = PPM( + pool_scales, + block_channels[2], + block_channels[2] // 4, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=align_corners) + + self.out = ConvModule( + block_channels[2] * 2, + out_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def _make_layer(self, + in_channels, + out_channels, + blocks, + stride=1, + expand_ratio=6): + layers = [ + InvertedResidual( + in_channels, + out_channels, + stride, + expand_ratio, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + ] + for i in range(1, blocks): + layers.append( + InvertedResidual( + out_channels, + out_channels, + 1, + expand_ratio, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + return nn.Sequential(*layers) + + def forward(self, x): + x = self.bottleneck1(x) + x = self.bottleneck2(x) + x = self.bottleneck3(x) + x = torch.cat([x, *self.ppm(x)], dim=1) + x = self.out(x) + return x + + +class FeatureFusionModule(nn.Module): + """Feature fusion module. + + Args: + higher_in_channels (int): Number of input channels of the + higher-resolution branch. + lower_in_channels (int): Number of input channels of the + lower-resolution branch. + out_channels (int): Number of output channels. + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + dwconv_act_cfg (dict): Config of activation layers in 3x3 conv. + Default: dict(type='ReLU'). + conv_act_cfg (dict): Config of activation layers in the two 1x1 conv. + Default: None. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + """ + + def __init__(self, + higher_in_channels, + lower_in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dwconv_act_cfg=dict(type='ReLU'), + conv_act_cfg=None, + align_corners=False): + super().__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.dwconv_act_cfg = dwconv_act_cfg + self.conv_act_cfg = conv_act_cfg + self.align_corners = align_corners + self.dwconv = ConvModule( + lower_in_channels, + out_channels, + 3, + padding=1, + groups=out_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.dwconv_act_cfg) + self.conv_lower_res = ConvModule( + out_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.conv_act_cfg) + + self.conv_higher_res = ConvModule( + higher_in_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.conv_act_cfg) + + self.relu = nn.ReLU(True) + + def forward(self, higher_res_feature, lower_res_feature): + lower_res_feature = resize( + lower_res_feature, + size=higher_res_feature.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + lower_res_feature = self.dwconv(lower_res_feature) + lower_res_feature = self.conv_lower_res(lower_res_feature) + + higher_res_feature = self.conv_higher_res(higher_res_feature) + out = higher_res_feature + lower_res_feature + return self.relu(out) + + +@MODELS.register_module() +class FastSCNN(BaseModule): + """Fast-SCNN Backbone. + + This backbone is the implementation of `Fast-SCNN: Fast Semantic + Segmentation Network `_. + + Args: + in_channels (int): Number of input image channels. Default: 3. + downsample_dw_channels (tuple[int]): Number of output channels after + the first conv layer & the second conv layer in + Learning-To-Downsample (LTD) module. + Default: (32, 48). + global_in_channels (int): Number of input channels of + Global Feature Extractor(GFE). + Equal to number of output channels of LTD. + Default: 64. + global_block_channels (tuple[int]): Tuple of integers that describe + the output channels for each of the MobileNet-v2 bottleneck + residual blocks in GFE. + Default: (64, 96, 128). + global_block_strides (tuple[int]): Tuple of integers + that describe the strides (downsampling factors) for each of the + MobileNet-v2 bottleneck residual blocks in GFE. + Default: (2, 2, 1). + global_out_channels (int): Number of output channels of GFE. + Default: 128. + higher_in_channels (int): Number of input channels of the higher + resolution branch in FFM. + Equal to global_in_channels. + Default: 64. + lower_in_channels (int): Number of input channels of the lower + resolution branch in FFM. + Equal to global_out_channels. + Default: 128. + fusion_out_channels (int): Number of output channels of FFM. + Default: 128. + out_indices (tuple): Tuple of indices of list + [higher_res_features, lower_res_features, fusion_output]. + Often set to (0,1,2) to enable aux. heads. + Default: (0, 1, 2). + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + dw_act_cfg (dict): In DepthwiseSeparableConvModule, activation config + of depthwise ConvModule. If it is 'default', it will be the same + as `act_cfg`. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels=3, + downsample_dw_channels=(32, 48), + global_in_channels=64, + global_block_channels=(64, 96, 128), + global_block_strides=(2, 2, 1), + global_out_channels=128, + higher_in_channels=64, + lower_in_channels=128, + fusion_out_channels=128, + out_indices=(0, 1, 2), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + dw_act_cfg=None, + init_cfg=None): + + super().__init__(init_cfg) + + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm']) + ] + + if global_in_channels != higher_in_channels: + raise AssertionError('Global Input Channels must be the same \ + with Higher Input Channels!') + elif global_out_channels != lower_in_channels: + raise AssertionError('Global Output Channels must be the same \ + with Lower Input Channels!') + + self.in_channels = in_channels + self.downsample_dw_channels1 = downsample_dw_channels[0] + self.downsample_dw_channels2 = downsample_dw_channels[1] + self.global_in_channels = global_in_channels + self.global_block_channels = global_block_channels + self.global_block_strides = global_block_strides + self.global_out_channels = global_out_channels + self.higher_in_channels = higher_in_channels + self.lower_in_channels = lower_in_channels + self.fusion_out_channels = fusion_out_channels + self.out_indices = out_indices + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + self.learning_to_downsample = LearningToDownsample( + in_channels, + downsample_dw_channels, + global_in_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + dw_act_cfg=dw_act_cfg) + self.global_feature_extractor = GlobalFeatureExtractor( + global_in_channels, + global_block_channels, + global_out_channels, + strides=self.global_block_strides, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.feature_fusion = FeatureFusionModule( + higher_in_channels, + lower_in_channels, + fusion_out_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dwconv_act_cfg=self.act_cfg, + align_corners=self.align_corners) + + def forward(self, x): + higher_res_features = self.learning_to_downsample(x) + lower_res_features = self.global_feature_extractor(higher_res_features) + fusion_output = self.feature_fusion(higher_res_features, + lower_res_features) + + outs = [higher_res_features, lower_res_features, fusion_output] + outs = [outs[i] for i in self.out_indices] + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/backbones/hrnet.py b/mmsegmentation/mmseg/models/backbones/hrnet.py new file mode 100644 index 0000000..2da755e --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/hrnet.py @@ -0,0 +1,642 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmengine.model import BaseModule, ModuleList, Sequential +from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm + +from mmseg.registry import MODELS +from ..utils import Upsample, resize +from .resnet import BasicBlock, Bottleneck + + +class HRModule(BaseModule): + """High-Resolution Module for HRNet. + + In this module, every branch has 4 BasicBlocks/Bottlenecks. Fusion/Exchange + is in this module. + """ + + def __init__(self, + num_branches, + blocks, + num_blocks, + in_channels, + num_channels, + multiscale_output=True, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + block_init_cfg=None, + init_cfg=None): + super().__init__(init_cfg) + self.block_init_cfg = block_init_cfg + self._check_branches(num_branches, num_blocks, in_channels, + num_channels) + + self.in_channels = in_channels + self.num_branches = num_branches + + self.multiscale_output = multiscale_output + self.norm_cfg = norm_cfg + self.conv_cfg = conv_cfg + self.with_cp = with_cp + self.branches = self._make_branches(num_branches, blocks, num_blocks, + num_channels) + self.fuse_layers = self._make_fuse_layers() + self.relu = nn.ReLU(inplace=False) + + def _check_branches(self, num_branches, num_blocks, in_channels, + num_channels): + """Check branches configuration.""" + if num_branches != len(num_blocks): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_BLOCKS(' \ + f'{len(num_blocks)})' + raise ValueError(error_msg) + + if num_branches != len(num_channels): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_CHANNELS(' \ + f'{len(num_channels)})' + raise ValueError(error_msg) + + if num_branches != len(in_channels): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_INCHANNELS(' \ + f'{len(in_channels)})' + raise ValueError(error_msg) + + def _make_one_branch(self, + branch_index, + block, + num_blocks, + num_channels, + stride=1): + """Build one branch.""" + downsample = None + if stride != 1 or \ + self.in_channels[branch_index] != \ + num_channels[branch_index] * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + self.in_channels[branch_index], + num_channels[branch_index] * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, num_channels[branch_index] * + block.expansion)[1]) + + layers = [] + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=self.block_init_cfg)) + self.in_channels[branch_index] = \ + num_channels[branch_index] * block.expansion + for i in range(1, num_blocks[branch_index]): + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=self.block_init_cfg)) + + return Sequential(*layers) + + def _make_branches(self, num_branches, block, num_blocks, num_channels): + """Build multiple branch.""" + branches = [] + + for i in range(num_branches): + branches.append( + self._make_one_branch(i, block, num_blocks, num_channels)) + + return ModuleList(branches) + + def _make_fuse_layers(self): + """Build fuse layer.""" + if self.num_branches == 1: + return None + + num_branches = self.num_branches + in_channels = self.in_channels + fuse_layers = [] + num_out_branches = num_branches if self.multiscale_output else 1 + for i in range(num_out_branches): + fuse_layer = [] + for j in range(num_branches): + if j > i: + fuse_layer.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=1, + stride=1, + padding=0, + bias=False), + build_norm_layer(self.norm_cfg, in_channels[i])[1], + # we set align_corners=False for HRNet + Upsample( + scale_factor=2**(j - i), + mode='bilinear', + align_corners=False))) + elif j == i: + fuse_layer.append(None) + else: + conv_downsamples = [] + for k in range(i - j): + if k == i - j - 1: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[i])[1])) + else: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[j], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[j])[1], + nn.ReLU(inplace=False))) + fuse_layer.append(nn.Sequential(*conv_downsamples)) + fuse_layers.append(nn.ModuleList(fuse_layer)) + + return nn.ModuleList(fuse_layers) + + def forward(self, x): + """Forward function.""" + if self.num_branches == 1: + return [self.branches[0](x[0])] + + for i in range(self.num_branches): + x[i] = self.branches[i](x[i]) + + x_fuse = [] + for i in range(len(self.fuse_layers)): + y = 0 + for j in range(self.num_branches): + if i == j: + y += x[j] + elif j > i: + y = y + resize( + self.fuse_layers[i][j](x[j]), + size=x[i].shape[2:], + mode='bilinear', + align_corners=False) + else: + y += self.fuse_layers[i][j](x[j]) + x_fuse.append(self.relu(y)) + return x_fuse + + +@MODELS.register_module() +class HRNet(BaseModule): + """HRNet backbone. + + This backbone is the implementation of `High-Resolution Representations + for Labeling Pixels and Regions `_. + + Args: + extra (dict): Detailed configuration for each stage of HRNet. + There must be 4 stages, the configuration for each stage must have + 5 keys: + + - num_modules (int): The number of HRModule in this stage. + - num_branches (int): The number of branches in the HRModule. + - block (str): The type of convolution block. + - num_blocks (tuple): The number of blocks in each branch. + The length must be equal to num_branches. + - num_channels (tuple): The number of channels in each branch. + The length must be equal to num_branches. + in_channels (int): Number of input image channels. Normally 3. + conv_cfg (dict): Dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Use `BN` by default. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. Default: -1. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. Default: False. + multiscale_output (bool): Whether to output multi-level features + produced by multiple branches. If False, only the first level + feature will be output. Default: True. + pretrained (str, optional): Model pretrained path. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + + Example: + >>> from mmseg.models import HRNet + >>> import torch + >>> extra = dict( + >>> stage1=dict( + >>> num_modules=1, + >>> num_branches=1, + >>> block='BOTTLENECK', + >>> num_blocks=(4, ), + >>> num_channels=(64, )), + >>> stage2=dict( + >>> num_modules=1, + >>> num_branches=2, + >>> block='BASIC', + >>> num_blocks=(4, 4), + >>> num_channels=(32, 64)), + >>> stage3=dict( + >>> num_modules=4, + >>> num_branches=3, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4), + >>> num_channels=(32, 64, 128)), + >>> stage4=dict( + >>> num_modules=3, + >>> num_branches=4, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4, 4), + >>> num_channels=(32, 64, 128, 256))) + >>> self = HRNet(extra, in_channels=1) + >>> self.eval() + >>> inputs = torch.rand(1, 1, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 32, 8, 8) + (1, 64, 4, 4) + (1, 128, 2, 2) + (1, 256, 1, 1) + """ + + blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck} + + def __init__(self, + extra, + in_channels=3, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + with_cp=False, + frozen_stages=-1, + zero_init_residual=False, + multiscale_output=True, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg) + + self.pretrained = pretrained + self.zero_init_residual = zero_init_residual + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + # Assert configurations of 4 stages are in extra + assert 'stage1' in extra and 'stage2' in extra \ + and 'stage3' in extra and 'stage4' in extra + # Assert whether the length of `num_blocks` and `num_channels` are + # equal to `num_branches` + for i in range(4): + cfg = extra[f'stage{i + 1}'] + assert len(cfg['num_blocks']) == cfg['num_branches'] and \ + len(cfg['num_channels']) == cfg['num_branches'] + + self.extra = extra + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + self.frozen_stages = frozen_stages + + # stem net + self.norm1_name, norm1 = build_norm_layer(self.norm_cfg, 64, postfix=1) + self.norm2_name, norm2 = build_norm_layer(self.norm_cfg, 64, postfix=2) + + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + self.conv_cfg, + 64, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.relu = nn.ReLU(inplace=True) + + # stage 1 + self.stage1_cfg = self.extra['stage1'] + num_channels = self.stage1_cfg['num_channels'][0] + block_type = self.stage1_cfg['block'] + num_blocks = self.stage1_cfg['num_blocks'][0] + + block = self.blocks_dict[block_type] + stage1_out_channels = num_channels * block.expansion + self.layer1 = self._make_layer(block, 64, num_channels, num_blocks) + + # stage 2 + self.stage2_cfg = self.extra['stage2'] + num_channels = self.stage2_cfg['num_channels'] + block_type = self.stage2_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition1 = self._make_transition_layer([stage1_out_channels], + num_channels) + self.stage2, pre_stage_channels = self._make_stage( + self.stage2_cfg, num_channels) + + # stage 3 + self.stage3_cfg = self.extra['stage3'] + num_channels = self.stage3_cfg['num_channels'] + block_type = self.stage3_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition2 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage3, pre_stage_channels = self._make_stage( + self.stage3_cfg, num_channels) + + # stage 4 + self.stage4_cfg = self.extra['stage4'] + num_channels = self.stage4_cfg['num_channels'] + block_type = self.stage4_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition3 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage4, pre_stage_channels = self._make_stage( + self.stage4_cfg, num_channels, multiscale_output=multiscale_output) + + self._freeze_stages() + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: the normalization layer named "norm2" """ + return getattr(self, self.norm2_name) + + def _make_transition_layer(self, num_channels_pre_layer, + num_channels_cur_layer): + """Make transition layer.""" + num_branches_cur = len(num_channels_cur_layer) + num_branches_pre = len(num_channels_pre_layer) + + transition_layers = [] + for i in range(num_branches_cur): + if i < num_branches_pre: + if num_channels_cur_layer[i] != num_channels_pre_layer[i]: + transition_layers.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + num_channels_pre_layer[i], + num_channels_cur_layer[i], + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + num_channels_cur_layer[i])[1], + nn.ReLU(inplace=True))) + else: + transition_layers.append(None) + else: + conv_downsamples = [] + for j in range(i + 1 - num_branches_pre): + in_channels = num_channels_pre_layer[-1] + out_channels = num_channels_cur_layer[i] \ + if j == i - num_branches_pre else in_channels + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + out_channels, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, out_channels)[1], + nn.ReLU(inplace=True))) + transition_layers.append(nn.Sequential(*conv_downsamples)) + + return nn.ModuleList(transition_layers) + + def _make_layer(self, block, inplanes, planes, blocks, stride=1): + """Make each layer.""" + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, planes * block.expansion)[1]) + + layers = [] + block_init_cfg = None + if self.pretrained is None and not hasattr( + self, 'init_cfg') and self.zero_init_residual: + if block is BasicBlock: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm2')) + elif block is Bottleneck: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm3')) + + layers.append( + block( + inplanes, + planes, + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=block_init_cfg)) + inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append( + block( + inplanes, + planes, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=block_init_cfg)) + + return Sequential(*layers) + + def _make_stage(self, layer_config, in_channels, multiscale_output=True): + """Make each stage.""" + num_modules = layer_config['num_modules'] + num_branches = layer_config['num_branches'] + num_blocks = layer_config['num_blocks'] + num_channels = layer_config['num_channels'] + block = self.blocks_dict[layer_config['block']] + + hr_modules = [] + block_init_cfg = None + if self.pretrained is None and not hasattr( + self, 'init_cfg') and self.zero_init_residual: + if block is BasicBlock: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm2')) + elif block is Bottleneck: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm3')) + + for i in range(num_modules): + # multi_scale_output is only used for the last module + if not multiscale_output and i == num_modules - 1: + reset_multiscale_output = False + else: + reset_multiscale_output = True + + hr_modules.append( + HRModule( + num_branches, + block, + num_blocks, + in_channels, + num_channels, + reset_multiscale_output, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + block_init_cfg=block_init_cfg)) + + return Sequential(*hr_modules), in_channels + + def _freeze_stages(self): + """Freeze stages param and norm stats.""" + if self.frozen_stages >= 0: + + self.norm1.eval() + self.norm2.eval() + for m in [self.conv1, self.norm1, self.conv2, self.norm2]: + for param in m.parameters(): + param.requires_grad = False + + for i in range(1, self.frozen_stages + 1): + if i == 1: + m = getattr(self, f'layer{i}') + t = getattr(self, f'transition{i}') + elif i == 4: + m = getattr(self, f'stage{i}') + else: + m = getattr(self, f'stage{i}') + t = getattr(self, f'transition{i}') + m.eval() + for param in m.parameters(): + param.requires_grad = False + t.eval() + for param in t.parameters(): + param.requires_grad = False + + def forward(self, x): + """Forward function.""" + + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.conv2(x) + x = self.norm2(x) + x = self.relu(x) + x = self.layer1(x) + + x_list = [] + for i in range(self.stage2_cfg['num_branches']): + if self.transition1[i] is not None: + x_list.append(self.transition1[i](x)) + else: + x_list.append(x) + y_list = self.stage2(x_list) + + x_list = [] + for i in range(self.stage3_cfg['num_branches']): + if self.transition2[i] is not None: + x_list.append(self.transition2[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage3(x_list) + + x_list = [] + for i in range(self.stage4_cfg['num_branches']): + if self.transition3[i] is not None: + x_list.append(self.transition3[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage4(x_list) + + return y_list + + def train(self, mode=True): + """Convert the model into training mode will keeping the normalization + layer freezed.""" + super().train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmsegmentation/mmseg/models/backbones/icnet.py b/mmsegmentation/mmseg/models/backbones/icnet.py new file mode 100644 index 0000000..8ff3448 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/icnet.py @@ -0,0 +1,166 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..decode_heads.psp_head import PPM +from ..utils import resize + + +@MODELS.register_module() +class ICNet(BaseModule): + """ICNet for Real-Time Semantic Segmentation on High-Resolution Images. + + This backbone is the implementation of + `ICNet `_. + + Args: + backbone_cfg (dict): Config dict to build backbone. Usually it is + ResNet but it can also be other backbones. + in_channels (int): The number of input image channels. Default: 3. + layer_channels (Sequence[int]): The numbers of feature channels at + layer 2 and layer 4 in ResNet. It can also be other backbones. + Default: (512, 2048). + light_branch_middle_channels (int): The number of channels of the + middle layer in light branch. Default: 32. + psp_out_channels (int): The number of channels of the output of PSP + module. Default: 512. + out_channels (Sequence[int]): The numbers of output feature channels + at each branches. Default: (64, 256, 256). + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. Default: (1, 2, 3, 6). + conv_cfg (dict): Dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN'). + act_cfg (dict): Dictionary to construct and config act layer. + Default: dict(type='ReLU'). + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + backbone_cfg, + in_channels=3, + layer_channels=(512, 2048), + light_branch_middle_channels=32, + psp_out_channels=512, + out_channels=(64, 256, 256), + pool_scales=(1, 2, 3, 6), + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='ReLU'), + align_corners=False, + init_cfg=None): + if backbone_cfg is None: + raise TypeError('backbone_cfg must be passed from config file!') + if init_cfg is None: + init_cfg = [ + dict(type='Kaiming', mode='fan_out', layer='Conv2d'), + dict(type='Constant', val=1, layer='_BatchNorm'), + dict(type='Normal', mean=0.01, layer='Linear') + ] + super().__init__(init_cfg=init_cfg) + self.align_corners = align_corners + self.backbone = MODELS.build(backbone_cfg) + + # Note: Default `ceil_mode` is false in nn.MaxPool2d, set + # `ceil_mode=True` to keep information in the corner of feature map. + self.backbone.maxpool = nn.MaxPool2d( + kernel_size=3, stride=2, padding=1, ceil_mode=True) + + self.psp_modules = PPM( + pool_scales=pool_scales, + in_channels=layer_channels[1], + channels=psp_out_channels, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + align_corners=align_corners) + + self.psp_bottleneck = ConvModule( + layer_channels[1] + len(pool_scales) * psp_out_channels, + psp_out_channels, + 3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + self.conv_sub1 = nn.Sequential( + ConvModule( + in_channels=in_channels, + out_channels=light_branch_middle_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg), + ConvModule( + in_channels=light_branch_middle_channels, + out_channels=light_branch_middle_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg), + ConvModule( + in_channels=light_branch_middle_channels, + out_channels=out_channels[0], + kernel_size=3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg)) + + self.conv_sub2 = ConvModule( + layer_channels[0], + out_channels[1], + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg) + + self.conv_sub4 = ConvModule( + psp_out_channels, + out_channels[2], + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg) + + def forward(self, x): + output = [] + + # sub 1 + output.append(self.conv_sub1(x)) + + # sub 2 + x = resize( + x, + scale_factor=0.5, + mode='bilinear', + align_corners=self.align_corners) + x = self.backbone.stem(x) + x = self.backbone.maxpool(x) + x = self.backbone.layer1(x) + x = self.backbone.layer2(x) + output.append(self.conv_sub2(x)) + + # sub 4 + x = resize( + x, + scale_factor=0.5, + mode='bilinear', + align_corners=self.align_corners) + x = self.backbone.layer3(x) + x = self.backbone.layer4(x) + psp_outs = self.psp_modules(x) + [x] + psp_outs = torch.cat(psp_outs, dim=1) + x = self.psp_bottleneck(psp_outs) + + output.append(self.conv_sub4(x)) + + return output diff --git a/mmsegmentation/mmseg/models/backbones/mae.py b/mmsegmentation/mmseg/models/backbones/mae.py new file mode 100644 index 0000000..a1f243f --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/mae.py @@ -0,0 +1,260 @@ +# Copyright (c) OpenMMLab. All rights reserved.import math +import math + +import torch +import torch.nn as nn +from mmengine.model import ModuleList +from mmengine.model.weight_init import (constant_init, kaiming_init, + trunc_normal_) +from mmengine.runner.checkpoint import _load_checkpoint +from torch.nn.modules.batchnorm import _BatchNorm + +from mmseg.registry import MODELS +from .beit import BEiT, BEiTAttention, BEiTTransformerEncoderLayer + + +class MAEAttention(BEiTAttention): + """Multi-head self-attention with relative position bias used in MAE. + + This module is different from ``BEiTAttention`` by initializing the + relative bias table with zeros. + """ + + def init_weights(self): + """Initialize relative position bias with zeros.""" + + # As MAE initializes relative position bias as zeros and this class + # inherited from BEiT which initializes relative position bias + # with `trunc_normal`, `init_weights` here does + # nothing and just passes directly + + pass + + +class MAETransformerEncoderLayer(BEiTTransformerEncoderLayer): + """Implements one encoder layer in Vision Transformer. + + This module is different from ``BEiTTransformerEncoderLayer`` by replacing + ``BEiTAttention`` with ``MAEAttention``. + """ + + def build_attn(self, attn_cfg): + self.attn = MAEAttention(**attn_cfg) + + +@MODELS.register_module() +class MAE(BEiT): + """VisionTransformer with support for patch. + + Args: + img_size (int | tuple): Input image size. Default: 224. + patch_size (int): The patch size. Default: 16. + in_channels (int): Number of input channels. Default: 3. + embed_dims (int): embedding dimension. Default: 768. + num_layers (int): depth of transformer. Default: 12. + num_heads (int): number of attention heads. Default: 12. + mlp_ratio (int): ratio of mlp hidden dim to embedding dim. + Default: 4. + out_indices (list | tuple | int): Output from which stages. + Default: -1. + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0 + drop_path_rate (float): stochastic depth rate. Default 0.0. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + patch_norm (bool): Whether to add a norm in PatchEmbed Block. + Default: False. + final_norm (bool): Whether to add a additional layer to normalize + final feature map. Default: False. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + pretrained (str, optional): model pretrained path. Default: None. + init_values (float): Initialize the values of Attention and FFN + with learnable scaling. Defaults to 0.1. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + img_size=224, + patch_size=16, + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + out_indices=-1, + attn_drop_rate=0., + drop_path_rate=0., + norm_cfg=dict(type='LN'), + act_cfg=dict(type='GELU'), + patch_norm=False, + final_norm=False, + num_fcs=2, + norm_eval=False, + pretrained=None, + init_values=0.1, + init_cfg=None): + super().__init__( + img_size=img_size, + patch_size=patch_size, + in_channels=in_channels, + embed_dims=embed_dims, + num_layers=num_layers, + num_heads=num_heads, + mlp_ratio=mlp_ratio, + out_indices=out_indices, + qv_bias=False, + attn_drop_rate=attn_drop_rate, + drop_path_rate=drop_path_rate, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + patch_norm=patch_norm, + final_norm=final_norm, + num_fcs=num_fcs, + norm_eval=norm_eval, + pretrained=pretrained, + init_values=init_values, + init_cfg=init_cfg) + + self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dims)) + + self.num_patches = self.patch_shape[0] * self.patch_shape[1] + self.pos_embed = nn.Parameter( + torch.zeros(1, self.num_patches + 1, embed_dims)) + + def _build_layers(self): + dpr = [ + x.item() + for x in torch.linspace(0, self.drop_path_rate, self.num_layers) + ] + self.layers = ModuleList() + for i in range(self.num_layers): + self.layers.append( + MAETransformerEncoderLayer( + embed_dims=self.embed_dims, + num_heads=self.num_heads, + feedforward_channels=self.mlp_ratio * self.embed_dims, + attn_drop_rate=self.attn_drop_rate, + drop_path_rate=dpr[i], + num_fcs=self.num_fcs, + bias=True, + act_cfg=self.act_cfg, + norm_cfg=self.norm_cfg, + window_size=self.patch_shape, + init_values=self.init_values)) + + def fix_init_weight(self): + """Rescale the initialization according to layer id. + + This function is copied from https://github.com/microsoft/unilm/blob/master/beit/modeling_pretrain.py. # noqa: E501 + Copyright (c) Microsoft Corporation + Licensed under the MIT License + """ + + def rescale(param, layer_id): + param.div_(math.sqrt(2.0 * layer_id)) + + for layer_id, layer in enumerate(self.layers): + rescale(layer.attn.proj.weight.data, layer_id + 1) + rescale(layer.ffn.layers[1].weight.data, layer_id + 1) + + def init_weights(self): + + def _init_weights(m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + self.apply(_init_weights) + self.fix_init_weight() + + if (isinstance(self.init_cfg, dict) + and self.init_cfg.get('type') == 'Pretrained'): + checkpoint = _load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + state_dict = self.resize_rel_pos_embed(checkpoint) + state_dict = self.resize_abs_pos_embed(state_dict) + self.load_state_dict(state_dict, False) + elif self.init_cfg is not None: + super().init_weights() + else: + # We only implement the 'jax_impl' initialization implemented at + # https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py#L353 # noqa: E501 + # Copyright 2019 Ross Wightman + # Licensed under the Apache License, Version 2.0 (the "License") + trunc_normal_(self.cls_token, std=.02) + for n, m in self.named_modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + if 'ffn' in n: + nn.init.normal_(m.bias, mean=0., std=1e-6) + else: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Conv2d): + kaiming_init(m, mode='fan_in', bias=0.) + elif isinstance(m, (_BatchNorm, nn.GroupNorm, nn.LayerNorm)): + constant_init(m, val=1.0, bias=0.) + + def resize_abs_pos_embed(self, state_dict): + if 'pos_embed' in state_dict: + pos_embed_checkpoint = state_dict['pos_embed'] + embedding_size = pos_embed_checkpoint.shape[-1] + num_extra_tokens = self.pos_embed.shape[-2] - self.num_patches + # height (== width) for the checkpoint position embedding + orig_size = int( + (pos_embed_checkpoint.shape[-2] - num_extra_tokens)**0.5) + # height (== width) for the new position embedding + new_size = int(self.num_patches**0.5) + # class_token and dist_token are kept unchanged + if orig_size != new_size: + extra_tokens = pos_embed_checkpoint[:, :num_extra_tokens] + # only the position tokens are interpolated + pos_tokens = pos_embed_checkpoint[:, num_extra_tokens:] + pos_tokens = pos_tokens.reshape(-1, orig_size, orig_size, + embedding_size).permute( + 0, 3, 1, 2) + pos_tokens = torch.nn.functional.interpolate( + pos_tokens, + size=(new_size, new_size), + mode='bicubic', + align_corners=False) + pos_tokens = pos_tokens.permute(0, 2, 3, 1).flatten(1, 2) + new_pos_embed = torch.cat((extra_tokens, pos_tokens), dim=1) + state_dict['pos_embed'] = new_pos_embed + return state_dict + + def forward(self, inputs): + B = inputs.shape[0] + + x, hw_shape = self.patch_embed(inputs) + + # stole cls_tokens impl from Phil Wang, thanks + cls_tokens = self.cls_token.expand(B, -1, -1) + x = torch.cat((cls_tokens, x), dim=1) + x = x + self.pos_embed + + outs = [] + for i, layer in enumerate(self.layers): + x = layer(x) + if i == len(self.layers) - 1: + if self.final_norm: + x = self.norm1(x) + if i in self.out_indices: + out = x[:, 1:] + B, _, C = out.shape + out = out.reshape(B, hw_shape[0], hw_shape[1], + C).permute(0, 3, 1, 2).contiguous() + outs.append(out) + + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/backbones/mit.py b/mmsegmentation/mmseg/models/backbones/mit.py new file mode 100644 index 0000000..66556bd --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/mit.py @@ -0,0 +1,450 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings + +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import Conv2d, build_activation_layer, build_norm_layer +from mmcv.cnn.bricks.drop import build_dropout +from mmcv.cnn.bricks.transformer import MultiheadAttention +from mmengine.model import BaseModule, ModuleList, Sequential +from mmengine.model.weight_init import (constant_init, normal_init, + trunc_normal_init) + +from mmseg.registry import MODELS +from ..utils import PatchEmbed, nchw_to_nlc, nlc_to_nchw + + +class MixFFN(BaseModule): + """An implementation of MixFFN of Segformer. + + The differences between MixFFN & FFN: + 1. Use 1X1 Conv to replace Linear layer. + 2. Introduce 3X3 Conv to encode positional information. + Args: + embed_dims (int): The feature dimension. Same as + `MultiheadAttention`. Defaults: 256. + feedforward_channels (int): The hidden dimension of FFNs. + Defaults: 1024. + act_cfg (dict, optional): The activation config for FFNs. + Default: dict(type='ReLU') + ffn_drop (float, optional): Probability of an element to be + zeroed in FFN. Default 0.0. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + feedforward_channels, + act_cfg=dict(type='GELU'), + ffn_drop=0., + dropout_layer=None, + init_cfg=None): + super().__init__(init_cfg) + + self.embed_dims = embed_dims + self.feedforward_channels = feedforward_channels + self.act_cfg = act_cfg + self.activate = build_activation_layer(act_cfg) + + in_channels = embed_dims + fc1 = Conv2d( + in_channels=in_channels, + out_channels=feedforward_channels, + kernel_size=1, + stride=1, + bias=True) + # 3x3 depth wise conv to provide positional encode information + pe_conv = Conv2d( + in_channels=feedforward_channels, + out_channels=feedforward_channels, + kernel_size=3, + stride=1, + padding=(3 - 1) // 2, + bias=True, + groups=feedforward_channels) + fc2 = Conv2d( + in_channels=feedforward_channels, + out_channels=in_channels, + kernel_size=1, + stride=1, + bias=True) + drop = nn.Dropout(ffn_drop) + layers = [fc1, pe_conv, self.activate, drop, fc2, drop] + self.layers = Sequential(*layers) + self.dropout_layer = build_dropout( + dropout_layer) if dropout_layer else torch.nn.Identity() + + def forward(self, x, hw_shape, identity=None): + out = nlc_to_nchw(x, hw_shape) + out = self.layers(out) + out = nchw_to_nlc(out) + if identity is None: + identity = x + return identity + self.dropout_layer(out) + + +class EfficientMultiheadAttention(MultiheadAttention): + """An implementation of Efficient Multi-head Attention of Segformer. + + This module is modified from MultiheadAttention which is a module from + mmcv.cnn.bricks.transformer. + Args: + embed_dims (int): The embedding dimension. + num_heads (int): Parallel attention heads. + attn_drop (float): A Dropout layer on attn_output_weights. + Default: 0.0. + proj_drop (float): A Dropout layer after `nn.MultiheadAttention`. + Default: 0.0. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. Default: None. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + batch_first (bool): Key, Query and Value are shape of + (batch, n, embed_dim) + or (n, batch, embed_dim). Default: False. + qkv_bias (bool): enable bias for qkv if True. Default True. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + sr_ratio (int): The ratio of spatial reduction of Efficient Multi-head + Attention of Segformer. Default: 1. + """ + + def __init__(self, + embed_dims, + num_heads, + attn_drop=0., + proj_drop=0., + dropout_layer=None, + init_cfg=None, + batch_first=True, + qkv_bias=False, + norm_cfg=dict(type='LN'), + sr_ratio=1): + super().__init__( + embed_dims, + num_heads, + attn_drop, + proj_drop, + dropout_layer=dropout_layer, + init_cfg=init_cfg, + batch_first=batch_first, + bias=qkv_bias) + + self.sr_ratio = sr_ratio + if sr_ratio > 1: + self.sr = Conv2d( + in_channels=embed_dims, + out_channels=embed_dims, + kernel_size=sr_ratio, + stride=sr_ratio) + # The ret[0] of build_norm_layer is norm name. + self.norm = build_norm_layer(norm_cfg, embed_dims)[1] + + # handle the BC-breaking from https://github.com/open-mmlab/mmcv/pull/1418 # noqa + from mmseg import digit_version, mmcv_version + if mmcv_version < digit_version('1.3.17'): + warnings.warn('The legacy version of forward function in' + 'EfficientMultiheadAttention is deprecated in' + 'mmcv>=1.3.17 and will no longer support in the' + 'future. Please upgrade your mmcv.') + self.forward = self.legacy_forward + + def forward(self, x, hw_shape, identity=None): + + x_q = x + if self.sr_ratio > 1: + x_kv = nlc_to_nchw(x, hw_shape) + x_kv = self.sr(x_kv) + x_kv = nchw_to_nlc(x_kv) + x_kv = self.norm(x_kv) + else: + x_kv = x + + if identity is None: + identity = x_q + + # Because the dataflow('key', 'query', 'value') of + # ``torch.nn.MultiheadAttention`` is (num_query, batch, + # embed_dims), We should adjust the shape of dataflow from + # batch_first (batch, num_query, embed_dims) to num_query_first + # (num_query ,batch, embed_dims), and recover ``attn_output`` + # from num_query_first to batch_first. + if self.batch_first: + x_q = x_q.transpose(0, 1) + x_kv = x_kv.transpose(0, 1) + + out = self.attn(query=x_q, key=x_kv, value=x_kv)[0] + + if self.batch_first: + out = out.transpose(0, 1) + + return identity + self.dropout_layer(self.proj_drop(out)) + + def legacy_forward(self, x, hw_shape, identity=None): + """multi head attention forward in mmcv version < 1.3.17.""" + + x_q = x + if self.sr_ratio > 1: + x_kv = nlc_to_nchw(x, hw_shape) + x_kv = self.sr(x_kv) + x_kv = nchw_to_nlc(x_kv) + x_kv = self.norm(x_kv) + else: + x_kv = x + + if identity is None: + identity = x_q + + # `need_weights=True` will let nn.MultiHeadAttention + # `return attn_output, attn_output_weights.sum(dim=1) / num_heads` + # The `attn_output_weights.sum(dim=1)` may cause cuda error. So, we set + # `need_weights=False` to ignore `attn_output_weights.sum(dim=1)`. + # This issue - `https://github.com/pytorch/pytorch/issues/37583` report + # the error that large scale tensor sum operation may cause cuda error. + out = self.attn(query=x_q, key=x_kv, value=x_kv, need_weights=False)[0] + + return identity + self.dropout_layer(self.proj_drop(out)) + + +class TransformerEncoderLayer(BaseModule): + """Implements one encoder layer in Segformer. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + drop_rate (float): Probability of an element to be zeroed. + after the feed forward layer. Default 0.0. + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0. + drop_path_rate (float): stochastic depth rate. Default 0.0. + qkv_bias (bool): enable bias for qkv if True. + Default: True. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + batch_first (bool): Key, Query and Value are shape of + (batch, n, embed_dim) + or (n, batch, embed_dim). Default: False. + init_cfg (dict, optional): Initialization config dict. + Default:None. + sr_ratio (int): The ratio of spatial reduction of Efficient Multi-head + Attention of Segformer. Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + qkv_bias=True, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + batch_first=True, + sr_ratio=1, + with_cp=False): + super().__init__() + + # The ret[0] of build_norm_layer is norm name. + self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1] + + self.attn = EfficientMultiheadAttention( + embed_dims=embed_dims, + num_heads=num_heads, + attn_drop=attn_drop_rate, + proj_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + batch_first=batch_first, + qkv_bias=qkv_bias, + norm_cfg=norm_cfg, + sr_ratio=sr_ratio) + + # The ret[0] of build_norm_layer is norm name. + self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1] + + self.ffn = MixFFN( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + act_cfg=act_cfg) + + self.with_cp = with_cp + + def forward(self, x, hw_shape): + + def _inner_forward(x): + x = self.attn(self.norm1(x), hw_shape, identity=x) + x = self.ffn(self.norm2(x), hw_shape, identity=x) + return x + + if self.with_cp and x.requires_grad: + x = cp.checkpoint(_inner_forward, x) + else: + x = _inner_forward(x) + return x + + +@MODELS.register_module() +class MixVisionTransformer(BaseModule): + """The backbone of Segformer. + + This backbone is the implementation of `SegFormer: Simple and + Efficient Design for Semantic Segmentation with + Transformers `_. + Args: + in_channels (int): Number of input channels. Default: 3. + embed_dims (int): Embedding dimension. Default: 768. + num_stags (int): The num of stages. Default: 4. + num_layers (Sequence[int]): The layer number of each transformer encode + layer. Default: [3, 4, 6, 3]. + num_heads (Sequence[int]): The attention heads of each transformer + encode layer. Default: [1, 2, 4, 8]. + patch_sizes (Sequence[int]): The patch_size of each overlapped patch + embedding. Default: [7, 3, 3, 3]. + strides (Sequence[int]): The stride of each overlapped patch embedding. + Default: [4, 2, 2, 2]. + sr_ratios (Sequence[int]): The spatial reduction rate of each + transformer encode layer. Default: [8, 4, 2, 1]. + out_indices (Sequence[int] | int): Output from which stages. + Default: (0, 1, 2, 3). + mlp_ratio (int): ratio of mlp hidden dim to embedding dim. + Default: 4. + qkv_bias (bool): Enable bias for qkv if True. Default: True. + drop_rate (float): Probability of an element to be zeroed. + Default 0.0 + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0 + drop_path_rate (float): stochastic depth rate. Default 0.0 + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + pretrained (str, optional): model pretrained path. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + in_channels=3, + embed_dims=64, + num_stages=4, + num_layers=[3, 4, 6, 3], + num_heads=[1, 2, 4, 8], + patch_sizes=[7, 3, 3, 3], + strides=[4, 2, 2, 2], + sr_ratios=[8, 4, 2, 1], + out_indices=(0, 1, 2, 3), + mlp_ratio=4, + qkv_bias=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN', eps=1e-6), + pretrained=None, + init_cfg=None, + with_cp=False): + super().__init__(init_cfg=init_cfg) + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + + self.embed_dims = embed_dims + self.num_stages = num_stages + self.num_layers = num_layers + self.num_heads = num_heads + self.patch_sizes = patch_sizes + self.strides = strides + self.sr_ratios = sr_ratios + self.with_cp = with_cp + assert num_stages == len(num_layers) == len(num_heads) \ + == len(patch_sizes) == len(strides) == len(sr_ratios) + + self.out_indices = out_indices + assert max(out_indices) < self.num_stages + + # transformer encoder + dpr = [ + x.item() + for x in torch.linspace(0, drop_path_rate, sum(num_layers)) + ] # stochastic num_layer decay rule + + cur = 0 + self.layers = ModuleList() + for i, num_layer in enumerate(num_layers): + embed_dims_i = embed_dims * num_heads[i] + patch_embed = PatchEmbed( + in_channels=in_channels, + embed_dims=embed_dims_i, + kernel_size=patch_sizes[i], + stride=strides[i], + padding=patch_sizes[i] // 2, + norm_cfg=norm_cfg) + layer = ModuleList([ + TransformerEncoderLayer( + embed_dims=embed_dims_i, + num_heads=num_heads[i], + feedforward_channels=mlp_ratio * embed_dims_i, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=dpr[cur + idx], + qkv_bias=qkv_bias, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + with_cp=with_cp, + sr_ratio=sr_ratios[i]) for idx in range(num_layer) + ]) + in_channels = embed_dims_i + # The ret[0] of build_norm_layer is norm name. + norm = build_norm_layer(norm_cfg, embed_dims_i)[1] + self.layers.append(ModuleList([patch_embed, layer, norm])) + cur += num_layer + + def init_weights(self): + if self.init_cfg is None: + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=.02, bias=0.) + elif isinstance(m, nn.LayerNorm): + constant_init(m, val=1.0, bias=0.) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[ + 1] * m.out_channels + fan_out //= m.groups + normal_init( + m, mean=0, std=math.sqrt(2.0 / fan_out), bias=0) + else: + super().init_weights() + + def forward(self, x): + outs = [] + + for i, layer in enumerate(self.layers): + x, hw_shape = layer[0](x) + for block in layer[1]: + x = block(x, hw_shape) + x = layer[2](x) + x = nlc_to_nchw(x, hw_shape) + if i in self.out_indices: + outs.append(x) + + return outs diff --git a/mmsegmentation/mmseg/models/backbones/mobilenet_v2.py b/mmsegmentation/mmseg/models/backbones/mobilenet_v2.py new file mode 100644 index 0000000..1c21b5d --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/mobilenet_v2.py @@ -0,0 +1,197 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule +from torch.nn.modules.batchnorm import _BatchNorm + +from mmseg.registry import MODELS +from ..utils import InvertedResidual, make_divisible + + +@MODELS.register_module() +class MobileNetV2(BaseModule): + """MobileNetV2 backbone. + + This backbone is the implementation of + `MobileNetV2: Inverted Residuals and Linear Bottlenecks + `_. + + Args: + widen_factor (float): Width multiplier, multiply number of + channels in each layer by this amount. Default: 1.0. + strides (Sequence[int], optional): Strides of the first block of each + layer. If not specified, default config in ``arch_setting`` will + be used. + dilations (Sequence[int]): Dilation of each layer. + out_indices (None or Sequence[int]): Output from which stages. + Default: (7, ). + frozen_stages (int): Stages to be frozen (all param fixed). + Default: -1, which means not freezing any parameters. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + # Parameters to build layers. 3 parameters are needed to construct a + # layer, from left to right: expand_ratio, channel, num_blocks. + arch_settings = [[1, 16, 1], [6, 24, 2], [6, 32, 3], [6, 64, 4], + [6, 96, 3], [6, 160, 3], [6, 320, 1]] + + def __init__(self, + widen_factor=1., + strides=(1, 2, 2, 2, 1, 2, 1), + dilations=(1, 1, 1, 1, 1, 1, 1), + out_indices=(1, 2, 4, 6), + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + norm_eval=False, + with_cp=False, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg) + + self.pretrained = pretrained + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is a deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + self.widen_factor = widen_factor + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == len(self.arch_settings) + self.out_indices = out_indices + for index in out_indices: + if index not in range(0, 7): + raise ValueError('the item in out_indices must in ' + f'range(0, 7). But received {index}') + + if frozen_stages not in range(-1, 7): + raise ValueError('frozen_stages must be in range(-1, 7). ' + f'But received {frozen_stages}') + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + + self.in_channels = make_divisible(32 * widen_factor, 8) + + self.conv1 = ConvModule( + in_channels=3, + out_channels=self.in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.layers = [] + + for i, layer_cfg in enumerate(self.arch_settings): + expand_ratio, channel, num_blocks = layer_cfg + stride = self.strides[i] + dilation = self.dilations[i] + out_channels = make_divisible(channel * widen_factor, 8) + inverted_res_layer = self.make_layer( + out_channels=out_channels, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + expand_ratio=expand_ratio) + layer_name = f'layer{i + 1}' + self.add_module(layer_name, inverted_res_layer) + self.layers.append(layer_name) + + def make_layer(self, out_channels, num_blocks, stride, dilation, + expand_ratio): + """Stack InvertedResidual blocks to build a layer for MobileNetV2. + + Args: + out_channels (int): out_channels of block. + num_blocks (int): Number of blocks. + stride (int): Stride of the first block. + dilation (int): Dilation of the first block. + expand_ratio (int): Expand the number of channels of the + hidden layer in InvertedResidual by this ratio. + """ + layers = [] + for i in range(num_blocks): + layers.append( + InvertedResidual( + self.in_channels, + out_channels, + stride if i == 0 else 1, + expand_ratio=expand_ratio, + dilation=dilation if i == 0 else 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + with_cp=self.with_cp)) + self.in_channels = out_channels + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + + if len(outs) == 1: + return outs[0] + else: + return tuple(outs) + + def _freeze_stages(self): + if self.frozen_stages >= 0: + for param in self.conv1.parameters(): + param.requires_grad = False + for i in range(1, self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super().train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmsegmentation/mmseg/models/backbones/mobilenet_v3.py b/mmsegmentation/mmseg/models/backbones/mobilenet_v3.py new file mode 100644 index 0000000..1efb6e0 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/mobilenet_v3.py @@ -0,0 +1,267 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +from mmcv.cnn import ConvModule +from mmcv.cnn.bricks import Conv2dAdaptivePadding +from mmengine.model import BaseModule +from mmengine.utils import is_tuple_of +from torch.nn.modules.batchnorm import _BatchNorm + +from mmseg.registry import MODELS +from ..utils import InvertedResidualV3 as InvertedResidual + + +@MODELS.register_module() +class MobileNetV3(BaseModule): + """MobileNetV3 backbone. + + This backbone is the improved implementation of `Searching for MobileNetV3 + `_. + + Args: + arch (str): Architecture of mobilnetv3, from {'small', 'large'}. + Default: 'small'. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + out_indices (tuple[int]): Output from which layer. + Default: (0, 1, 12). + frozen_stages (int): Stages to be frozen (all param fixed). + Default: -1, which means not freezing any parameters. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. + Default: False. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + # Parameters to build each block: + # [kernel size, mid channels, out channels, with_se, act type, stride] + arch_settings = { + 'small': [[3, 16, 16, True, 'ReLU', 2], # block0 layer1 os=4 + [3, 72, 24, False, 'ReLU', 2], # block1 layer2 os=8 + [3, 88, 24, False, 'ReLU', 1], + [5, 96, 40, True, 'HSwish', 2], # block2 layer4 os=16 + [5, 240, 40, True, 'HSwish', 1], + [5, 240, 40, True, 'HSwish', 1], + [5, 120, 48, True, 'HSwish', 1], # block3 layer7 os=16 + [5, 144, 48, True, 'HSwish', 1], + [5, 288, 96, True, 'HSwish', 2], # block4 layer9 os=32 + [5, 576, 96, True, 'HSwish', 1], + [5, 576, 96, True, 'HSwish', 1]], + 'large': [[3, 16, 16, False, 'ReLU', 1], # block0 layer1 os=2 + [3, 64, 24, False, 'ReLU', 2], # block1 layer2 os=4 + [3, 72, 24, False, 'ReLU', 1], + [5, 72, 40, True, 'ReLU', 2], # block2 layer4 os=8 + [5, 120, 40, True, 'ReLU', 1], + [5, 120, 40, True, 'ReLU', 1], + [3, 240, 80, False, 'HSwish', 2], # block3 layer7 os=16 + [3, 200, 80, False, 'HSwish', 1], + [3, 184, 80, False, 'HSwish', 1], + [3, 184, 80, False, 'HSwish', 1], + [3, 480, 112, True, 'HSwish', 1], # block4 layer11 os=16 + [3, 672, 112, True, 'HSwish', 1], + [5, 672, 160, True, 'HSwish', 2], # block5 layer13 os=32 + [5, 960, 160, True, 'HSwish', 1], + [5, 960, 160, True, 'HSwish', 1]] + } # yapf: disable + + def __init__(self, + arch='small', + conv_cfg=None, + norm_cfg=dict(type='BN'), + out_indices=(0, 1, 12), + frozen_stages=-1, + reduction_factor=1, + norm_eval=False, + with_cp=False, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg) + + self.pretrained = pretrained + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is a deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + assert arch in self.arch_settings + assert isinstance(reduction_factor, int) and reduction_factor > 0 + assert is_tuple_of(out_indices, int) + for index in out_indices: + if index not in range(0, len(self.arch_settings[arch]) + 2): + raise ValueError( + 'the item in out_indices must in ' + f'range(0, {len(self.arch_settings[arch])+2}). ' + f'But received {index}') + + if frozen_stages not in range(-1, len(self.arch_settings[arch]) + 2): + raise ValueError('frozen_stages must be in range(-1, ' + f'{len(self.arch_settings[arch])+2}). ' + f'But received {frozen_stages}') + self.arch = arch + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.reduction_factor = reduction_factor + self.norm_eval = norm_eval + self.with_cp = with_cp + self.layers = self._make_layer() + + def _make_layer(self): + layers = [] + + # build the first layer (layer0) + in_channels = 16 + layer = ConvModule( + in_channels=3, + out_channels=in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=dict(type='Conv2dAdaptivePadding'), + norm_cfg=self.norm_cfg, + act_cfg=dict(type='HSwish')) + self.add_module('layer0', layer) + layers.append('layer0') + + layer_setting = self.arch_settings[self.arch] + for i, params in enumerate(layer_setting): + (kernel_size, mid_channels, out_channels, with_se, act, + stride) = params + + if self.arch == 'large' and i >= 12 or self.arch == 'small' and \ + i >= 8: + mid_channels = mid_channels // self.reduction_factor + out_channels = out_channels // self.reduction_factor + + if with_se: + se_cfg = dict( + channels=mid_channels, + ratio=4, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))) + else: + se_cfg = None + + layer = InvertedResidual( + in_channels=in_channels, + out_channels=out_channels, + mid_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + se_cfg=se_cfg, + with_expand_conv=(in_channels != mid_channels), + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=dict(type=act), + with_cp=self.with_cp) + in_channels = out_channels + layer_name = f'layer{i + 1}' + self.add_module(layer_name, layer) + layers.append(layer_name) + + # build the last layer + # block5 layer12 os=32 for small model + # block6 layer16 os=32 for large model + layer = ConvModule( + in_channels=in_channels, + out_channels=576 if self.arch == 'small' else 960, + kernel_size=1, + stride=1, + dilation=4, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=dict(type='HSwish')) + layer_name = f'layer{len(layer_setting) + 1}' + self.add_module(layer_name, layer) + layers.append(layer_name) + + # next, convert backbone MobileNetV3 to a semantic segmentation version + if self.arch == 'small': + self.layer4.depthwise_conv.conv.stride = (1, 1) + self.layer9.depthwise_conv.conv.stride = (1, 1) + for i in range(4, len(layers)): + layer = getattr(self, layers[i]) + if isinstance(layer, InvertedResidual): + modified_module = layer.depthwise_conv.conv + else: + modified_module = layer.conv + + if i < 9: + modified_module.dilation = (2, 2) + pad = 2 + else: + modified_module.dilation = (4, 4) + pad = 4 + + if not isinstance(modified_module, Conv2dAdaptivePadding): + # Adjust padding + pad *= (modified_module.kernel_size[0] - 1) // 2 + modified_module.padding = (pad, pad) + else: + self.layer7.depthwise_conv.conv.stride = (1, 1) + self.layer13.depthwise_conv.conv.stride = (1, 1) + for i in range(7, len(layers)): + layer = getattr(self, layers[i]) + if isinstance(layer, InvertedResidual): + modified_module = layer.depthwise_conv.conv + else: + modified_module = layer.conv + + if i < 13: + modified_module.dilation = (2, 2) + pad = 2 + else: + modified_module.dilation = (4, 4) + pad = 4 + + if not isinstance(modified_module, Conv2dAdaptivePadding): + # Adjust padding + pad *= (modified_module.kernel_size[0] - 1) // 2 + modified_module.padding = (pad, pad) + + return layers + + def forward(self, x): + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + return outs + + def _freeze_stages(self): + for i in range(self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super().train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmsegmentation/mmseg/models/backbones/mscan.py b/mmsegmentation/mmseg/models/backbones/mscan.py new file mode 100644 index 0000000..7150cb7 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/mscan.py @@ -0,0 +1,467 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Originally from https://github.com/visual-attention-network/segnext +# Licensed under the Apache License, Version 2.0 (the "License") +import math +import warnings + +import torch +import torch.nn as nn +from mmcv.cnn import build_activation_layer, build_norm_layer +from mmcv.cnn.bricks import DropPath +from mmengine.model import BaseModule +from mmengine.model.weight_init import (constant_init, normal_init, + trunc_normal_init) + +from mmseg.registry import MODELS + + +class Mlp(BaseModule): + """Multi Layer Perceptron (MLP) Module. + + Args: + in_features (int): The dimension of input features. + hidden_features (int): The dimension of hidden features. + Defaults: None. + out_features (int): The dimension of output features. + Defaults: None. + act_cfg (dict): Config dict for activation layer in block. + Default: dict(type='GELU'). + drop (float): The number of dropout rate in MLP block. + Defaults: 0.0. + """ + + def __init__(self, + in_features, + hidden_features=None, + out_features=None, + act_cfg=dict(type='GELU'), + drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Conv2d(in_features, hidden_features, 1) + self.dwconv = nn.Conv2d( + hidden_features, + hidden_features, + 3, + 1, + 1, + bias=True, + groups=hidden_features) + self.act = build_activation_layer(act_cfg) + self.fc2 = nn.Conv2d(hidden_features, out_features, 1) + self.drop = nn.Dropout(drop) + + def forward(self, x): + """Forward function.""" + + x = self.fc1(x) + + x = self.dwconv(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + + return x + + +class StemConv(BaseModule): + """Stem Block at the beginning of Semantic Branch. + + Args: + in_channels (int): The dimension of input channels. + out_channels (int): The dimension of output channels. + act_cfg (dict): Config dict for activation layer in block. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Defaults: dict(type='SyncBN', requires_grad=True). + """ + + def __init__(self, + in_channels, + out_channels, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='SyncBN', requires_grad=True)): + super().__init__() + + self.proj = nn.Sequential( + nn.Conv2d( + in_channels, + out_channels // 2, + kernel_size=(3, 3), + stride=(2, 2), + padding=(1, 1)), + build_norm_layer(norm_cfg, out_channels // 2)[1], + build_activation_layer(act_cfg), + nn.Conv2d( + out_channels // 2, + out_channels, + kernel_size=(3, 3), + stride=(2, 2), + padding=(1, 1)), + build_norm_layer(norm_cfg, out_channels)[1], + ) + + def forward(self, x): + """Forward function.""" + + x = self.proj(x) + _, _, H, W = x.size() + x = x.flatten(2).transpose(1, 2) + return x, H, W + + +class MSCAAttention(BaseModule): + """Attention Module in Multi-Scale Convolutional Attention Module (MSCA). + + Args: + channels (int): The dimension of channels. + kernel_sizes (list): The size of attention + kernel. Defaults: [5, [1, 7], [1, 11], [1, 21]]. + paddings (list): The number of + corresponding padding value in attention module. + Defaults: [2, [0, 3], [0, 5], [0, 10]]. + """ + + def __init__(self, + channels, + kernel_sizes=[5, [1, 7], [1, 11], [1, 21]], + paddings=[2, [0, 3], [0, 5], [0, 10]]): + super().__init__() + self.conv0 = nn.Conv2d( + channels, + channels, + kernel_size=kernel_sizes[0], + padding=paddings[0], + groups=channels) + for i, (kernel_size, + padding) in enumerate(zip(kernel_sizes[1:], paddings[1:])): + kernel_size_ = [kernel_size, kernel_size[::-1]] + padding_ = [padding, padding[::-1]] + conv_name = [f'conv{i}_1', f'conv{i}_2'] + for i_kernel, i_pad, i_conv in zip(kernel_size_, padding_, + conv_name): + self.add_module( + i_conv, + nn.Conv2d( + channels, + channels, + tuple(i_kernel), + padding=i_pad, + groups=channels)) + self.conv3 = nn.Conv2d(channels, channels, 1) + + def forward(self, x): + """Forward function.""" + + u = x.clone() + + attn = self.conv0(x) + + # Multi-Scale Feature extraction + attn_0 = self.conv0_1(attn) + attn_0 = self.conv0_2(attn_0) + + attn_1 = self.conv1_1(attn) + attn_1 = self.conv1_2(attn_1) + + attn_2 = self.conv2_1(attn) + attn_2 = self.conv2_2(attn_2) + + attn = attn + attn_0 + attn_1 + attn_2 + # Channel Mixing + attn = self.conv3(attn) + + # Convolutional Attention + x = attn * u + + return x + + +class MSCASpatialAttention(BaseModule): + """Spatial Attention Module in Multi-Scale Convolutional Attention Module + (MSCA). + + Args: + in_channels (int): The dimension of channels. + attention_kernel_sizes (list): The size of attention + kernel. Defaults: [5, [1, 7], [1, 11], [1, 21]]. + attention_kernel_paddings (list): The number of + corresponding padding value in attention module. + Defaults: [2, [0, 3], [0, 5], [0, 10]]. + act_cfg (dict): Config dict for activation layer in block. + Default: dict(type='GELU'). + """ + + def __init__(self, + in_channels, + attention_kernel_sizes=[5, [1, 7], [1, 11], [1, 21]], + attention_kernel_paddings=[2, [0, 3], [0, 5], [0, 10]], + act_cfg=dict(type='GELU')): + super().__init__() + self.proj_1 = nn.Conv2d(in_channels, in_channels, 1) + self.activation = build_activation_layer(act_cfg) + self.spatial_gating_unit = MSCAAttention(in_channels, + attention_kernel_sizes, + attention_kernel_paddings) + self.proj_2 = nn.Conv2d(in_channels, in_channels, 1) + + def forward(self, x): + """Forward function.""" + + shorcut = x.clone() + x = self.proj_1(x) + x = self.activation(x) + x = self.spatial_gating_unit(x) + x = self.proj_2(x) + x = x + shorcut + return x + + +class MSCABlock(BaseModule): + """Basic Multi-Scale Convolutional Attention Block. It leverage the large- + kernel attention (LKA) mechanism to build both channel and spatial + attention. In each branch, it uses two depth-wise strip convolutions to + approximate standard depth-wise convolutions with large kernels. The kernel + size for each branch is set to 7, 11, and 21, respectively. + + Args: + channels (int): The dimension of channels. + attention_kernel_sizes (list): The size of attention + kernel. Defaults: [5, [1, 7], [1, 11], [1, 21]]. + attention_kernel_paddings (list): The number of + corresponding padding value in attention module. + Defaults: [2, [0, 3], [0, 5], [0, 10]]. + mlp_ratio (float): The ratio of multiple input dimension to + calculate hidden feature in MLP layer. Defaults: 4.0. + drop (float): The number of dropout rate in MLP block. + Defaults: 0.0. + drop_path (float): The ratio of drop paths. + Defaults: 0.0. + act_cfg (dict): Config dict for activation layer in block. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Defaults: dict(type='SyncBN', requires_grad=True). + """ + + def __init__(self, + channels, + attention_kernel_sizes=[5, [1, 7], [1, 11], [1, 21]], + attention_kernel_paddings=[2, [0, 3], [0, 5], [0, 10]], + mlp_ratio=4., + drop=0., + drop_path=0., + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='SyncBN', requires_grad=True)): + super().__init__() + self.norm1 = build_norm_layer(norm_cfg, channels)[1] + self.attn = MSCASpatialAttention(channels, attention_kernel_sizes, + attention_kernel_paddings, act_cfg) + self.drop_path = DropPath( + drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = build_norm_layer(norm_cfg, channels)[1] + mlp_hidden_channels = int(channels * mlp_ratio) + self.mlp = Mlp( + in_features=channels, + hidden_features=mlp_hidden_channels, + act_cfg=act_cfg, + drop=drop) + layer_scale_init_value = 1e-2 + self.layer_scale_1 = nn.Parameter( + layer_scale_init_value * torch.ones(channels), requires_grad=True) + self.layer_scale_2 = nn.Parameter( + layer_scale_init_value * torch.ones(channels), requires_grad=True) + + def forward(self, x, H, W): + """Forward function.""" + + B, N, C = x.shape + x = x.permute(0, 2, 1).view(B, C, H, W) + x = x + self.drop_path( + self.layer_scale_1.unsqueeze(-1).unsqueeze(-1) * + self.attn(self.norm1(x))) + x = x + self.drop_path( + self.layer_scale_2.unsqueeze(-1).unsqueeze(-1) * + self.mlp(self.norm2(x))) + x = x.view(B, C, N).permute(0, 2, 1) + return x + + +class OverlapPatchEmbed(BaseModule): + """Image to Patch Embedding. + + Args: + patch_size (int): The patch size. + Defaults: 7. + stride (int): Stride of the convolutional layer. + Default: 4. + in_channels (int): The number of input channels. + Defaults: 3. + embed_dims (int): The dimensions of embedding. + Defaults: 768. + norm_cfg (dict): Config dict for normalization layer. + Defaults: dict(type='SyncBN', requires_grad=True). + """ + + def __init__(self, + patch_size=7, + stride=4, + in_channels=3, + embed_dim=768, + norm_cfg=dict(type='SyncBN', requires_grad=True)): + super().__init__() + + self.proj = nn.Conv2d( + in_channels, + embed_dim, + kernel_size=patch_size, + stride=stride, + padding=patch_size // 2) + self.norm = build_norm_layer(norm_cfg, embed_dim)[1] + + def forward(self, x): + """Forward function.""" + + x = self.proj(x) + _, _, H, W = x.shape + x = self.norm(x) + + x = x.flatten(2).transpose(1, 2) + + return x, H, W + + +@MODELS.register_module() +class MSCAN(BaseModule): + """SegNeXt Multi-Scale Convolutional Attention Network (MCSAN) backbone. + + This backbone is the implementation of `SegNeXt: Rethinking + Convolutional Attention Design for Semantic + Segmentation `_. + Inspiration from https://github.com/visual-attention-network/segnext. + + Args: + in_channels (int): The number of input channels. Defaults: 3. + embed_dims (list[int]): Embedding dimension. + Defaults: [64, 128, 256, 512]. + mlp_ratios (list[int]): Ratio of mlp hidden dim to embedding dim. + Defaults: [4, 4, 4, 4]. + drop_rate (float): Dropout rate. Defaults: 0. + drop_path_rate (float): Stochastic depth rate. Defaults: 0. + depths (list[int]): Depths of each Swin Transformer stage. + Default: [3, 4, 6, 3]. + num_stages (int): MSCAN stages. Default: 4. + attention_kernel_sizes (list): Size of attention kernel in + Attention Module (Figure 2(b) of original paper). + Defaults: [5, [1, 7], [1, 11], [1, 21]]. + attention_kernel_paddings (list): Size of attention paddings + in Attention Module (Figure 2(b) of original paper). + Defaults: [2, [0, 3], [0, 5], [0, 10]]. + norm_cfg (dict): Config of norm layers. + Defaults: dict(type='SyncBN', requires_grad=True). + pretrained (str, optional): model pretrained path. + Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels=3, + embed_dims=[64, 128, 256, 512], + mlp_ratios=[4, 4, 4, 4], + drop_rate=0., + drop_path_rate=0., + depths=[3, 4, 6, 3], + num_stages=4, + attention_kernel_sizes=[5, [1, 7], [1, 11], [1, 21]], + attention_kernel_paddings=[2, [0, 3], [0, 5], [0, 10]], + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='SyncBN', requires_grad=True), + pretrained=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + + self.depths = depths + self.num_stages = num_stages + + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) + ] # stochastic depth decay rule + cur = 0 + + for i in range(num_stages): + if i == 0: + patch_embed = StemConv(3, embed_dims[0], norm_cfg=norm_cfg) + else: + patch_embed = OverlapPatchEmbed( + patch_size=7 if i == 0 else 3, + stride=4 if i == 0 else 2, + in_channels=in_channels if i == 0 else embed_dims[i - 1], + embed_dim=embed_dims[i], + norm_cfg=norm_cfg) + + block = nn.ModuleList([ + MSCABlock( + channels=embed_dims[i], + attention_kernel_sizes=attention_kernel_sizes, + attention_kernel_paddings=attention_kernel_paddings, + mlp_ratio=mlp_ratios[i], + drop=drop_rate, + drop_path=dpr[cur + j], + act_cfg=act_cfg, + norm_cfg=norm_cfg) for j in range(depths[i]) + ]) + norm = nn.LayerNorm(embed_dims[i]) + cur += depths[i] + + setattr(self, f'patch_embed{i + 1}', patch_embed) + setattr(self, f'block{i + 1}', block) + setattr(self, f'norm{i + 1}', norm) + + def init_weights(self): + """Initialize modules of MSCAN.""" + + print('init cfg', self.init_cfg) + if self.init_cfg is None: + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=.02, bias=0.) + elif isinstance(m, nn.LayerNorm): + constant_init(m, val=1.0, bias=0.) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[ + 1] * m.out_channels + fan_out //= m.groups + normal_init( + m, mean=0, std=math.sqrt(2.0 / fan_out), bias=0) + else: + super().init_weights() + + def forward(self, x): + """Forward function.""" + + B = x.shape[0] + outs = [] + + for i in range(self.num_stages): + patch_embed = getattr(self, f'patch_embed{i + 1}') + block = getattr(self, f'block{i + 1}') + norm = getattr(self, f'norm{i + 1}') + x, H, W = patch_embed(x) + for blk in block: + x = blk(x, H, W) + x = norm(x) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + return outs diff --git a/mmsegmentation/mmseg/models/backbones/pidnet.py b/mmsegmentation/mmseg/models/backbones/pidnet.py new file mode 100644 index 0000000..0b711a3 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/pidnet.py @@ -0,0 +1,522 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule +from mmengine.runner import CheckpointLoader +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.utils import OptConfigType +from ..utils import DAPPM, PAPPM, BasicBlock, Bottleneck + + +class PagFM(BaseModule): + """Pixel-attention-guided fusion module. + + Args: + in_channels (int): The number of input channels. + channels (int): The number of channels. + after_relu (bool): Whether to use ReLU before attention. + Default: False. + with_channel (bool): Whether to use channel attention. + Default: False. + upsample_mode (str): The mode of upsample. Default: 'bilinear'. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(typ='ReLU', inplace=True). + init_cfg (dict): Config dict for initialization. Default: None. + """ + + def __init__(self, + in_channels: int, + channels: int, + after_relu: bool = False, + with_channel: bool = False, + upsample_mode: str = 'bilinear', + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(typ='ReLU', inplace=True), + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + self.after_relu = after_relu + self.with_channel = with_channel + self.upsample_mode = upsample_mode + self.f_i = ConvModule( + in_channels, channels, 1, norm_cfg=norm_cfg, act_cfg=None) + self.f_p = ConvModule( + in_channels, channels, 1, norm_cfg=norm_cfg, act_cfg=None) + if with_channel: + self.up = ConvModule( + channels, in_channels, 1, norm_cfg=norm_cfg, act_cfg=None) + if after_relu: + self.relu = MODELS.build(act_cfg) + + def forward(self, x_p: Tensor, x_i: Tensor) -> Tensor: + """Forward function. + + Args: + x_p (Tensor): The featrue map from P branch. + x_i (Tensor): The featrue map from I branch. + + Returns: + Tensor: The feature map with pixel-attention-guided fusion. + """ + if self.after_relu: + x_p = self.relu(x_p) + x_i = self.relu(x_i) + + f_i = self.f_i(x_i) + f_i = F.interpolate( + f_i, + size=x_p.shape[2:], + mode=self.upsample_mode, + align_corners=False) + + f_p = self.f_p(x_p) + + if self.with_channel: + sigma = torch.sigmoid(self.up(f_p * f_i)) + else: + sigma = torch.sigmoid(torch.sum(f_p * f_i, dim=1).unsqueeze(1)) + + x_i = F.interpolate( + x_i, + size=x_p.shape[2:], + mode=self.upsample_mode, + align_corners=False) + + out = sigma * x_i + (1 - sigma) * x_p + return out + + +class Bag(BaseModule): + """Boundary-attention-guided fusion module. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + kernel_size (int): The kernel size of the convolution. Default: 3. + padding (int): The padding of the convolution. Default: 1. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU', inplace=True). + conv_cfg (dict): Config dict for convolution layer. + Default: dict(order=('norm', 'act', 'conv')). + init_cfg (dict): Config dict for initialization. Default: None. + """ + + def __init__(self, + in_channels: int, + out_channels: int, + kernel_size: int = 3, + padding: int = 1, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + conv_cfg: OptConfigType = dict(order=('norm', 'act', 'conv')), + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + + self.conv = ConvModule( + in_channels, + out_channels, + kernel_size, + padding=padding, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg) + + def forward(self, x_p: Tensor, x_i: Tensor, x_d: Tensor) -> Tensor: + """Forward function. + + Args: + x_p (Tensor): The featrue map from P branch. + x_i (Tensor): The featrue map from I branch. + x_d (Tensor): The featrue map from D branch. + + Returns: + Tensor: The feature map with boundary-attention-guided fusion. + """ + sigma = torch.sigmoid(x_d) + return self.conv(sigma * x_p + (1 - sigma) * x_i) + + +class LightBag(BaseModule): + """Light Boundary-attention-guided fusion module. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. Default: None. + init_cfg (dict): Config dict for initialization. Default: None. + """ + + def __init__(self, + in_channels: int, + out_channels: int, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = None, + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + self.f_p = ConvModule( + in_channels, + out_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.f_i = ConvModule( + in_channels, + out_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x_p: Tensor, x_i: Tensor, x_d: Tensor) -> Tensor: + """Forward function. + Args: + x_p (Tensor): The featrue map from P branch. + x_i (Tensor): The featrue map from I branch. + x_d (Tensor): The featrue map from D branch. + + Returns: + Tensor: The feature map with light boundary-attention-guided + fusion. + """ + sigma = torch.sigmoid(x_d) + + f_p = self.f_p((1 - sigma) * x_i + x_p) + f_i = self.f_i(x_i + sigma * x_p) + + return f_p + f_i + + +@MODELS.register_module() +class PIDNet(BaseModule): + """PIDNet backbone. + + This backbone is the implementation of `PIDNet: A Real-time Semantic + Segmentation Network Inspired from PID Controller + `_. + Modified from https://github.com/XuJiacong/PIDNet. + + Licensed under the MIT License. + + Args: + in_channels (int): The number of input channels. Default: 3. + channels (int): The number of channels in the stem layer. Default: 64. + ppm_channels (int): The number of channels in the PPM layer. + Default: 96. + num_stem_blocks (int): The number of blocks in the stem layer. + Default: 2. + num_branch_blocks (int): The number of blocks in the branch layer. + Default: 3. + align_corners (bool): The align_corners argument of F.interpolate. + Default: False. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU', inplace=True). + init_cfg (dict): Config dict for initialization. Default: None. + """ + + def __init__(self, + in_channels: int = 3, + channels: int = 64, + ppm_channels: int = 96, + num_stem_blocks: int = 2, + num_branch_blocks: int = 3, + align_corners: bool = False, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + init_cfg: OptConfigType = None, + **kwargs): + super().__init__(init_cfg) + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + + # stem layer + self.stem = self._make_stem_layer(in_channels, channels, + num_stem_blocks) + self.relu = nn.ReLU() + + # I Branch + self.i_branch_layers = nn.ModuleList() + for i in range(3): + self.i_branch_layers.append( + self._make_layer( + block=BasicBlock if i < 2 else Bottleneck, + in_channels=channels * 2**(i + 1), + channels=channels * 8 if i > 0 else channels * 4, + num_blocks=num_branch_blocks if i < 2 else 2, + stride=2)) + + # P Branch + self.p_branch_layers = nn.ModuleList() + for i in range(3): + self.p_branch_layers.append( + self._make_layer( + block=BasicBlock if i < 2 else Bottleneck, + in_channels=channels * 2, + channels=channels * 2, + num_blocks=num_stem_blocks if i < 2 else 1)) + self.compression_1 = ConvModule( + channels * 4, + channels * 2, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None) + self.compression_2 = ConvModule( + channels * 8, + channels * 2, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None) + self.pag_1 = PagFM(channels * 2, channels) + self.pag_2 = PagFM(channels * 2, channels) + + # D Branch + if num_stem_blocks == 2: + self.d_branch_layers = nn.ModuleList([ + self._make_single_layer(BasicBlock, channels * 2, channels), + self._make_layer(Bottleneck, channels, channels, 1) + ]) + channel_expand = 1 + spp_module = PAPPM + dfm_module = LightBag + act_cfg_dfm = None + else: + self.d_branch_layers = nn.ModuleList([ + self._make_single_layer(BasicBlock, channels * 2, + channels * 2), + self._make_single_layer(BasicBlock, channels * 2, channels * 2) + ]) + channel_expand = 2 + spp_module = DAPPM + dfm_module = Bag + act_cfg_dfm = act_cfg + + self.diff_1 = ConvModule( + channels * 4, + channels * channel_expand, + kernel_size=3, + padding=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None) + self.diff_2 = ConvModule( + channels * 8, + channels * 2, + kernel_size=3, + padding=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None) + + self.spp = spp_module( + channels * 16, ppm_channels, channels * 4, num_scales=5) + self.dfm = dfm_module( + channels * 4, channels * 4, norm_cfg=norm_cfg, act_cfg=act_cfg_dfm) + + self.d_branch_layers.append( + self._make_layer(Bottleneck, channels * 2, channels * 2, 1)) + + def _make_stem_layer(self, in_channels: int, channels: int, + num_blocks: int) -> nn.Sequential: + """Make stem layer. + + Args: + in_channels (int): Number of input channels. + channels (int): Number of output channels. + num_blocks (int): Number of blocks. + + Returns: + nn.Sequential: The stem layer. + """ + + layers = [ + ConvModule( + in_channels, + channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + ConvModule( + channels, + channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + ] + + layers.append( + self._make_layer(BasicBlock, channels, channels, num_blocks)) + layers.append(nn.ReLU()) + layers.append( + self._make_layer( + BasicBlock, channels, channels * 2, num_blocks, stride=2)) + layers.append(nn.ReLU()) + + return nn.Sequential(*layers) + + def _make_layer(self, + block: BasicBlock, + in_channels: int, + channels: int, + num_blocks: int, + stride: int = 1) -> nn.Sequential: + """Make layer for PIDNet backbone. + Args: + block (BasicBlock): Basic block. + in_channels (int): Number of input channels. + channels (int): Number of output channels. + num_blocks (int): Number of blocks. + stride (int): Stride of the first block. Default: 1. + + Returns: + nn.Sequential: The Branch Layer. + """ + downsample = None + if stride != 1 or in_channels != channels * block.expansion: + downsample = ConvModule( + in_channels, + channels * block.expansion, + kernel_size=1, + stride=stride, + norm_cfg=self.norm_cfg, + act_cfg=None) + + layers = [block(in_channels, channels, stride, downsample)] + in_channels = channels * block.expansion + for i in range(1, num_blocks): + layers.append( + block( + in_channels, + channels, + stride=1, + act_cfg_out=None if i == num_blocks - 1 else self.act_cfg)) + return nn.Sequential(*layers) + + def _make_single_layer(self, + block: Union[BasicBlock, Bottleneck], + in_channels: int, + channels: int, + stride: int = 1) -> nn.Module: + """Make single layer for PIDNet backbone. + Args: + block (BasicBlock or Bottleneck): Basic block or Bottleneck. + in_channels (int): Number of input channels. + channels (int): Number of output channels. + stride (int): Stride of the first block. Default: 1. + + Returns: + nn.Module + """ + + downsample = None + if stride != 1 or in_channels != channels * block.expansion: + downsample = ConvModule( + in_channels, + channels * block.expansion, + kernel_size=1, + stride=stride, + norm_cfg=self.norm_cfg, + act_cfg=None) + return block( + in_channels, channels, stride, downsample, act_cfg_out=None) + + def init_weights(self): + """Initialize the weights in backbone. + + Since the D branch is not initialized by the pre-trained model, we + initialize it with the same method as the ResNet. + """ + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_( + m.weight, mode='fan_out', nonlinearity='relu') + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + if self.init_cfg is not None: + assert 'checkpoint' in self.init_cfg, f'Only support ' \ + f'specify `Pretrained` in ' \ + f'`init_cfg` in ' \ + f'{self.__class__.__name__} ' + ckpt = CheckpointLoader.load_checkpoint( + self.init_cfg['checkpoint'], map_location='cpu') + self.load_state_dict(ckpt, strict=False) + + def forward(self, x: Tensor) -> Union[Tensor, Tuple[Tensor]]: + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor or tuple[Tensor]: If self.training is True, return + tuple[Tensor], else return Tensor. + """ + w_out = x.shape[-1] // 8 + h_out = x.shape[-2] // 8 + + # stage 0-2 + x = self.stem(x) + + # stage 3 + x_i = self.relu(self.i_branch_layers[0](x)) + x_p = self.p_branch_layers[0](x) + x_d = self.d_branch_layers[0](x) + + comp_i = self.compression_1(x_i) + x_p = self.pag_1(x_p, comp_i) + diff_i = self.diff_1(x_i) + x_d += F.interpolate( + diff_i, + size=[h_out, w_out], + mode='bilinear', + align_corners=self.align_corners) + if self.training: + temp_p = x_p.clone() + + # stage 4 + x_i = self.relu(self.i_branch_layers[1](x_i)) + x_p = self.p_branch_layers[1](self.relu(x_p)) + x_d = self.d_branch_layers[1](self.relu(x_d)) + + comp_i = self.compression_2(x_i) + x_p = self.pag_2(x_p, comp_i) + diff_i = self.diff_2(x_i) + x_d += F.interpolate( + diff_i, + size=[h_out, w_out], + mode='bilinear', + align_corners=self.align_corners) + if self.training: + temp_d = x_d.clone() + + # stage 5 + x_i = self.i_branch_layers[2](x_i) + x_p = self.p_branch_layers[2](self.relu(x_p)) + x_d = self.d_branch_layers[2](self.relu(x_d)) + + x_i = self.spp(x_i) + x_i = F.interpolate( + x_i, + size=[h_out, w_out], + mode='bilinear', + align_corners=self.align_corners) + out = self.dfm(x_p, x_i, x_d) + return (temp_p, out, temp_d) if self.training else out diff --git a/mmsegmentation/mmseg/models/backbones/resnest.py b/mmsegmentation/mmseg/models/backbones/resnest.py new file mode 100644 index 0000000..3cc380b --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/resnest.py @@ -0,0 +1,318 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer + +from mmseg.registry import MODELS +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNetV1d + + +class RSoftmax(nn.Module): + """Radix Softmax module in ``SplitAttentionConv2d``. + + Args: + radix (int): Radix of input. + groups (int): Groups of input. + """ + + def __init__(self, radix, groups): + super().__init__() + self.radix = radix + self.groups = groups + + def forward(self, x): + batch = x.size(0) + if self.radix > 1: + x = x.view(batch, self.groups, self.radix, -1).transpose(1, 2) + x = F.softmax(x, dim=1) + x = x.reshape(batch, -1) + else: + x = torch.sigmoid(x) + return x + + +class SplitAttentionConv2d(nn.Module): + """Split-Attention Conv2d in ResNeSt. + + Args: + in_channels (int): Same as nn.Conv2d. + out_channels (int): Same as nn.Conv2d. + kernel_size (int | tuple[int]): Same as nn.Conv2d. + stride (int | tuple[int]): Same as nn.Conv2d. + padding (int | tuple[int]): Same as nn.Conv2d. + dilation (int | tuple[int]): Same as nn.Conv2d. + groups (int): Same as nn.Conv2d. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels. Default: 4. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. Default: None. + dcn (dict): Config dict for DCN. Default: None. + """ + + def __init__(self, + in_channels, + channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + radix=2, + reduction_factor=4, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None): + super().__init__() + inter_channels = max(in_channels * radix // reduction_factor, 32) + self.radix = radix + self.groups = groups + self.channels = channels + self.with_dcn = dcn is not None + self.dcn = dcn + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if self.with_dcn and not fallback_on_stride: + assert conv_cfg is None, 'conv_cfg must be None for DCN' + conv_cfg = dcn + self.conv = build_conv_layer( + conv_cfg, + in_channels, + channels * radix, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups * radix, + bias=False) + self.norm0_name, norm0 = build_norm_layer( + norm_cfg, channels * radix, postfix=0) + self.add_module(self.norm0_name, norm0) + self.relu = nn.ReLU(inplace=True) + self.fc1 = build_conv_layer( + None, channels, inter_channels, 1, groups=self.groups) + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, inter_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.fc2 = build_conv_layer( + None, inter_channels, channels * radix, 1, groups=self.groups) + self.rsoftmax = RSoftmax(radix, groups) + + @property + def norm0(self): + """nn.Module: the normalization layer named "norm0" """ + return getattr(self, self.norm0_name) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def forward(self, x): + x = self.conv(x) + x = self.norm0(x) + x = self.relu(x) + + batch, rchannel = x.shape[:2] + batch = x.size(0) + if self.radix > 1: + splits = x.view(batch, self.radix, -1, *x.shape[2:]) + gap = splits.sum(dim=1) + else: + gap = x + gap = F.adaptive_avg_pool2d(gap, 1) + gap = self.fc1(gap) + + gap = self.norm1(gap) + gap = self.relu(gap) + + atten = self.fc2(gap) + atten = self.rsoftmax(atten).view(batch, -1, 1, 1) + + if self.radix > 1: + attens = atten.view(batch, self.radix, -1, *atten.shape[2:]) + out = torch.sum(attens * splits, dim=1) + else: + out = atten * x + return out.contiguous() + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeSt. + + Args: + inplane (int): Input planes of this block. + planes (int): Middle planes of this block. + groups (int): Groups of conv2. + width_per_group (int): Width per group of conv2. 64x4d indicates + ``groups=64, width_per_group=4`` and 32x8d indicates + ``groups=32, width_per_group=8``. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Key word arguments for base class. + """ + expansion = 4 + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + """Bottleneck block for ResNeSt.""" + super().__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.avg_down_stride = avg_down_stride and self.conv2_stride > 1 + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + self.with_modulated_dcn = False + self.conv2 = SplitAttentionConv2d( + width, + width, + kernel_size=3, + stride=1 if self.avg_down_stride else self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + radix=radix, + reduction_factor=reduction_factor, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=self.dcn) + delattr(self, self.norm2_name) + + if self.avg_down_stride: + self.avd_layer = nn.AvgPool2d(3, self.conv2_stride, padding=1) + + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + def forward(self, x): + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + + if self.avg_down_stride: + out = self.avd_layer(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@MODELS.register_module() +class ResNeSt(ResNetV1d): + """ResNeSt backbone. + + This backbone is the implementation of `ResNeSt: + Split-Attention Networks `_. + + Args: + groups (int): Number of groups of Bottleneck. Default: 1 + base_width (int): Base width of Bottleneck. Default: 4 + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Keyword arguments for ResNet. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)), + 200: (Bottleneck, (3, 24, 36, 3)) + } + + def __init__(self, + groups=1, + base_width=4, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + self.groups = groups + self.base_width = base_width + self.radix = radix + self.reduction_factor = reduction_factor + self.avg_down_stride = avg_down_stride + super().__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + radix=self.radix, + reduction_factor=self.reduction_factor, + avg_down_stride=self.avg_down_stride, + **kwargs) diff --git a/mmsegmentation/mmseg/models/backbones/resnet.py b/mmsegmentation/mmseg/models/backbones/resnet.py new file mode 100644 index 0000000..9226c90 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/resnet.py @@ -0,0 +1,712 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer, build_plugin_layer +from mmengine.model import BaseModule +from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm + +from mmseg.registry import MODELS +from ..utils import ResLayer + + +class BasicBlock(BaseModule): + """Basic block for ResNet.""" + + expansion = 1 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None, + init_cfg=None): + super().__init__(init_cfg) + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + 3, + stride=stride, + padding=dilation, + dilation=dilation, + bias=False) + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + conv_cfg, planes, planes, 3, padding=1, bias=False) + self.add_module(self.norm2_name, norm2) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + self.with_cp = with_cp + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.norm2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +class Bottleneck(BaseModule): + """Bottleneck block for ResNet. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if it is + "caffe", the stride-two layer is the first 1x1 conv layer. + """ + + expansion = 4 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None, + init_cfg=None): + super().__init__(init_cfg) + assert style in ['pytorch', 'caffe'] + assert dcn is None or isinstance(dcn, dict) + assert plugins is None or isinstance(plugins, list) + if plugins is not None: + allowed_position = ['after_conv1', 'after_conv2', 'after_conv3'] + assert all(p['position'] in allowed_position for p in plugins) + + self.inplanes = inplanes + self.planes = planes + self.stride = stride + self.dilation = dilation + self.style = style + self.with_cp = with_cp + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.dcn = dcn + self.with_dcn = dcn is not None + self.plugins = plugins + self.with_plugins = plugins is not None + + if self.with_plugins: + # collect plugins for conv1/conv2/conv3 + self.after_conv1_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv1' + ] + self.after_conv2_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv2' + ] + self.after_conv3_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv3' + ] + + if self.style == 'pytorch': + self.conv1_stride = 1 + self.conv2_stride = stride + else: + self.conv1_stride = stride + self.conv2_stride = 1 + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + norm_cfg, planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + conv_cfg, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + dcn, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + conv_cfg, + planes, + planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + + if self.with_plugins: + self.after_conv1_plugin_names = self.make_block_plugins( + planes, self.after_conv1_plugins) + self.after_conv2_plugin_names = self.make_block_plugins( + planes, self.after_conv2_plugins) + self.after_conv3_plugin_names = self.make_block_plugins( + planes * self.expansion, self.after_conv3_plugins) + + def make_block_plugins(self, in_channels, plugins): + """make plugins for block. + + Args: + in_channels (int): Input channels of plugin. + plugins (list[dict]): List of plugins cfg to build. + + Returns: + list[str]: List of the names of plugin. + """ + assert isinstance(plugins, list) + plugin_names = [] + for plugin in plugins: + plugin = plugin.copy() + name, layer = build_plugin_layer( + plugin, + in_channels=in_channels, + postfix=plugin.pop('postfix', '')) + assert not hasattr(self, name), f'duplicate plugin {name}' + self.add_module(name, layer) + plugin_names.append(name) + return plugin_names + + def forward_plugin(self, x, plugin_names): + """Forward function for plugins.""" + out = x + for name in plugin_names: + out = getattr(self, name)(x) + return out + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + @property + def norm3(self): + """nn.Module: normalization layer after the third convolution layer""" + return getattr(self, self.norm3_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + out = self.norm2(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@MODELS.register_module() +class ResNet(BaseModule): + """ResNet backbone. + + This backbone is the improved implementation of `Deep Residual Learning + for Image Recognition `_. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Default: 3. + stem_channels (int): Number of stem channels. Default: 64. + base_channels (int): Number of base channels of res layer. Default: 64. + num_stages (int): Resnet stages, normally 4. Default: 4. + strides (Sequence[int]): Strides of the first block of each stage. + Default: (1, 2, 2, 2). + dilations (Sequence[int]): Dilation of each stage. + Default: (1, 1, 1, 1). + out_indices (Sequence[int]): Output from which stages. + Default: (0, 1, 2, 3). + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. Default: 'pytorch'. + deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv. + Default: False. + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. Default: False. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. Default: -1. + conv_cfg (dict | None): Dictionary to construct and config conv layer. + When conv_cfg is None, cfg will be set to dict(type='Conv2d'). + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + dcn (dict | None): Dictionary to construct and config DCN conv layer. + When dcn is not None, conv_cfg must be None. Default: None. + stage_with_dcn (Sequence[bool]): Whether to set DCN conv for each + stage. The length of stage_with_dcn is equal to num_stages. + Default: (False, False, False, False). + plugins (list[dict]): List of plugins for stages, each dict contains: + + - cfg (dict, required): Cfg dict to build plugin. + + - position (str, required): Position inside block to insert plugin, + options: 'after_conv1', 'after_conv2', 'after_conv3'. + + - stages (tuple[bool], optional): Stages to apply plugin, length + should be same as 'num_stages'. + Default: None. + multi_grid (Sequence[int]|None): Multi grid dilation rates of last + stage. Default: None. + contract_dilation (bool): Whether contract first dilation of each layer + Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. Default: True. + pretrained (str, optional): model pretrained path. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + + Example: + >>> from mmseg.models import ResNet + >>> import torch + >>> self = ResNet(depth=18) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 64, 8, 8) + (1, 128, 4, 4) + (1, 256, 2, 2) + (1, 512, 1, 1) + """ + + arch_settings = { + 18: (BasicBlock, (2, 2, 2, 2)), + 34: (BasicBlock, (3, 4, 6, 3)), + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, + depth, + in_channels=3, + stem_channels=64, + base_channels=64, + num_stages=4, + strides=(1, 2, 2, 2), + dilations=(1, 1, 1, 1), + out_indices=(0, 1, 2, 3), + style='pytorch', + deep_stem=False, + avg_down=False, + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + dcn=None, + stage_with_dcn=(False, False, False, False), + plugins=None, + multi_grid=None, + contract_dilation=False, + with_cp=False, + zero_init_residual=True, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg) + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for resnet') + + self.pretrained = pretrained + self.zero_init_residual = zero_init_residual + block_init_cfg = None + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is a deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + block = self.arch_settings[depth][0] + if self.zero_init_residual: + if block is BasicBlock: + block_init_cfg = dict( + type='Constant', + val=0, + override=dict(name='norm2')) + elif block is Bottleneck: + block_init_cfg = dict( + type='Constant', + val=0, + override=dict(name='norm3')) + else: + raise TypeError('pretrained must be a str or None') + + self.depth = depth + self.stem_channels = stem_channels + self.base_channels = base_channels + self.num_stages = num_stages + assert num_stages >= 1 and num_stages <= 4 + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == num_stages + self.out_indices = out_indices + assert max(out_indices) < num_stages + self.style = style + self.deep_stem = deep_stem + self.avg_down = avg_down + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.with_cp = with_cp + self.norm_eval = norm_eval + self.dcn = dcn + self.stage_with_dcn = stage_with_dcn + if dcn is not None: + assert len(stage_with_dcn) == num_stages + self.plugins = plugins + self.multi_grid = multi_grid + self.contract_dilation = contract_dilation + self.block, stage_blocks = self.arch_settings[depth] + self.stage_blocks = stage_blocks[:num_stages] + self.inplanes = stem_channels + + self._make_stem_layer(in_channels, stem_channels) + + self.res_layers = [] + for i, num_blocks in enumerate(self.stage_blocks): + stride = strides[i] + dilation = dilations[i] + dcn = self.dcn if self.stage_with_dcn[i] else None + if plugins is not None: + stage_plugins = self.make_stage_plugins(plugins, i) + else: + stage_plugins = None + # multi grid is applied to last layer only + stage_multi_grid = multi_grid if i == len( + self.stage_blocks) - 1 else None + planes = base_channels * 2**i + res_layer = self.make_res_layer( + block=self.block, + inplanes=self.inplanes, + planes=planes, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + avg_down=self.avg_down, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + dcn=dcn, + plugins=stage_plugins, + multi_grid=stage_multi_grid, + contract_dilation=contract_dilation, + init_cfg=block_init_cfg) + self.inplanes = planes * self.block.expansion + layer_name = f'layer{i+1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self._freeze_stages() + + self.feat_dim = self.block.expansion * base_channels * 2**( + len(self.stage_blocks) - 1) + + def make_stage_plugins(self, plugins, stage_idx): + """make plugins for ResNet 'stage_idx'th stage . + + Currently we support to insert 'context_block', + 'empirical_attention_block', 'nonlocal_block' into the backbone like + ResNet/ResNeXt. They could be inserted after conv1/conv2/conv3 of + Bottleneck. + + An example of plugins format could be : + >>> plugins=[ + ... dict(cfg=dict(type='xxx', arg1='xxx'), + ... stages=(False, True, True, True), + ... position='after_conv2'), + ... dict(cfg=dict(type='yyy'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='1'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='2'), + ... stages=(True, True, True, True), + ... position='after_conv3') + ... ] + >>> self = ResNet(depth=18) + >>> stage_plugins = self.make_stage_plugins(plugins, 0) + >>> assert len(stage_plugins) == 3 + + Suppose 'stage_idx=0', the structure of blocks in the stage would be: + conv1-> conv2->conv3->yyy->zzz1->zzz2 + Suppose 'stage_idx=1', the structure of blocks in the stage would be: + conv1-> conv2->xxx->conv3->yyy->zzz1->zzz2 + + If stages is missing, the plugin would be applied to all stages. + + Args: + plugins (list[dict]): List of plugins cfg to build. The postfix is + required if multiple same type plugins are inserted. + stage_idx (int): Index of stage to build + + Returns: + list[dict]: Plugins for current stage + """ + stage_plugins = [] + for plugin in plugins: + plugin = plugin.copy() + stages = plugin.pop('stages', None) + assert stages is None or len(stages) == self.num_stages + # whether to insert plugin into current stage + if stages is None or stages[stage_idx]: + stage_plugins.append(plugin) + + return stage_plugins + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer(**kwargs) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def _make_stem_layer(self, in_channels, stem_channels): + """Make stem layer for ResNet.""" + if self.deep_stem: + self.stem = nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels // 2, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels // 2, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels)[1], + nn.ReLU(inplace=True)) + else: + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels, + kernel_size=7, + stride=2, + padding=3, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, stem_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + def _freeze_stages(self): + """Freeze stages param and norm stats.""" + if self.frozen_stages >= 0: + if self.deep_stem: + self.stem.eval() + for param in self.stem.parameters(): + param.requires_grad = False + else: + self.norm1.eval() + for m in [self.conv1, self.norm1]: + for param in m.parameters(): + param.requires_grad = False + + for i in range(1, self.frozen_stages + 1): + m = getattr(self, f'layer{i}') + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def forward(self, x): + """Forward function.""" + if self.deep_stem: + x = self.stem(x) + else: + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.maxpool(x) + outs = [] + for i, layer_name in enumerate(self.res_layers): + res_layer = getattr(self, layer_name) + x = res_layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super().train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + +@MODELS.register_module() +class ResNetV1c(ResNet): + """ResNetV1c variant described in [1]_. + + Compared with default ResNet(ResNetV1b), ResNetV1c replaces the 7x7 conv in + the input stem with three 3x3 convs. For more details please refer to `Bag + of Tricks for Image Classification with Convolutional Neural Networks + `_. + """ + + def __init__(self, **kwargs): + super().__init__(deep_stem=True, avg_down=False, **kwargs) + + +@MODELS.register_module() +class ResNetV1d(ResNet): + """ResNetV1d variant described in [1]_. + + Compared with default ResNet(ResNetV1b), ResNetV1d replaces the 7x7 conv in + the input stem with three 3x3 convs. And in the downsampling block, a 2x2 + avg_pool with stride 2 is added before conv, whose stride is changed to 1. + """ + + def __init__(self, **kwargs): + super().__init__(deep_stem=True, avg_down=True, **kwargs) diff --git a/mmsegmentation/mmseg/models/backbones/resnext.py b/mmsegmentation/mmseg/models/backbones/resnext.py new file mode 100644 index 0000000..67a244a --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/resnext.py @@ -0,0 +1,150 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +from mmcv.cnn import build_conv_layer, build_norm_layer + +from mmseg.registry import MODELS +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNet + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeXt. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if it is + "caffe", the stride-two layer is the first 1x1 conv layer. + """ + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + **kwargs): + super().__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm2_name, norm2 = build_norm_layer( + self.norm_cfg, width, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + self.conv_cfg, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + self.dcn, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + +@MODELS.register_module() +class ResNeXt(ResNet): + """ResNeXt backbone. + + This backbone is the implementation of `Aggregated + Residual Transformations for Deep Neural + Networks `_. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Normally 3. + num_stages (int): Resnet stages, normally 4. + groups (int): Group of resnext. + base_width (int): Base width of resnext. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import ResNeXt + >>> import torch + >>> self = ResNeXt(depth=50) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 256, 8, 8) + (1, 512, 4, 4) + (1, 1024, 2, 2) + (1, 2048, 1, 1) + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, groups=1, base_width=4, **kwargs): + self.groups = groups + self.base_width = base_width + super().__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + **kwargs) diff --git a/mmsegmentation/mmseg/models/backbones/stdc.py b/mmsegmentation/mmseg/models/backbones/stdc.py new file mode 100644 index 0000000..758a3c9 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/stdc.py @@ -0,0 +1,422 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Modified from https://github.com/MichaelFan01/STDC-Seg.""" +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule, ModuleList, Sequential + +from mmseg.registry import MODELS +from ..utils import resize +from .bisenetv1 import AttentionRefinementModule + + +class STDCModule(BaseModule): + """STDCModule. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels before scaling. + stride (int): The number of stride for the first conv layer. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): The activation config for conv layers. + num_convs (int): Numbers of conv layers. + fusion_type (str): Type of fusion operation. Default: 'add'. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + stride, + norm_cfg=None, + act_cfg=None, + num_convs=4, + fusion_type='add', + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert num_convs > 1 + assert fusion_type in ['add', 'cat'] + self.stride = stride + self.with_downsample = True if self.stride == 2 else False + self.fusion_type = fusion_type + + self.layers = ModuleList() + conv_0 = ConvModule( + in_channels, out_channels // 2, kernel_size=1, norm_cfg=norm_cfg) + + if self.with_downsample: + self.downsample = ConvModule( + out_channels // 2, + out_channels // 2, + kernel_size=3, + stride=2, + padding=1, + groups=out_channels // 2, + norm_cfg=norm_cfg, + act_cfg=None) + + if self.fusion_type == 'add': + self.layers.append(nn.Sequential(conv_0, self.downsample)) + self.skip = Sequential( + ConvModule( + in_channels, + in_channels, + kernel_size=3, + stride=2, + padding=1, + groups=in_channels, + norm_cfg=norm_cfg, + act_cfg=None), + ConvModule( + in_channels, + out_channels, + 1, + norm_cfg=norm_cfg, + act_cfg=None)) + else: + self.layers.append(conv_0) + self.skip = nn.AvgPool2d(kernel_size=3, stride=2, padding=1) + else: + self.layers.append(conv_0) + + for i in range(1, num_convs): + out_factor = 2**(i + 1) if i != num_convs - 1 else 2**i + self.layers.append( + ConvModule( + out_channels // 2**i, + out_channels // out_factor, + kernel_size=3, + stride=1, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + def forward(self, inputs): + if self.fusion_type == 'add': + out = self.forward_add(inputs) + else: + out = self.forward_cat(inputs) + return out + + def forward_add(self, inputs): + layer_outputs = [] + x = inputs.clone() + for layer in self.layers: + x = layer(x) + layer_outputs.append(x) + if self.with_downsample: + inputs = self.skip(inputs) + + return torch.cat(layer_outputs, dim=1) + inputs + + def forward_cat(self, inputs): + x0 = self.layers[0](inputs) + layer_outputs = [x0] + for i, layer in enumerate(self.layers[1:]): + if i == 0: + if self.with_downsample: + x = layer(self.downsample(x0)) + else: + x = layer(x0) + else: + x = layer(x) + layer_outputs.append(x) + if self.with_downsample: + layer_outputs[0] = self.skip(x0) + return torch.cat(layer_outputs, dim=1) + + +class FeatureFusionModule(BaseModule): + """Feature Fusion Module. This module is different from FeatureFusionModule + in BiSeNetV1. It uses two ConvModules in `self.attention` whose inter + channel number is calculated by given `scale_factor`, while + FeatureFusionModule in BiSeNetV1 only uses one ConvModule in + `self.conv_atten`. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + scale_factor (int): The number of channel scale factor. + Default: 4. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): The activation config for conv layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + scale_factor=4, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + channels = out_channels // scale_factor + self.conv0 = ConvModule( + in_channels, out_channels, 1, norm_cfg=norm_cfg, act_cfg=act_cfg) + self.attention = nn.Sequential( + nn.AdaptiveAvgPool2d((1, 1)), + ConvModule( + out_channels, + channels, + 1, + norm_cfg=None, + bias=False, + act_cfg=act_cfg), + ConvModule( + channels, + out_channels, + 1, + norm_cfg=None, + bias=False, + act_cfg=None), nn.Sigmoid()) + + def forward(self, spatial_inputs, context_inputs): + inputs = torch.cat([spatial_inputs, context_inputs], dim=1) + x = self.conv0(inputs) + attn = self.attention(x) + x_attn = x * attn + return x_attn + x + + +@MODELS.register_module() +class STDCNet(BaseModule): + """This backbone is the implementation of `Rethinking BiSeNet For Real-time + Semantic Segmentation `_. + + Args: + stdc_type (int): The type of backbone structure, + `STDCNet1` and`STDCNet2` denotes two main backbones in paper, + whose FLOPs is 813M and 1446M, respectively. + in_channels (int): The num of input_channels. + channels (tuple[int]): The output channels for each stage. + bottleneck_type (str): The type of STDC Module type, the value must + be 'add' or 'cat'. + norm_cfg (dict): Config dict for normalization layer. + act_cfg (dict): The activation config for conv layers. + num_convs (int): Numbers of conv layer at each STDC Module. + Default: 4. + with_final_conv (bool): Whether add a conv layer at the Module output. + Default: True. + pretrained (str, optional): Model pretrained path. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + + Example: + >>> import torch + >>> stdc_type = 'STDCNet1' + >>> in_channels = 3 + >>> channels = (32, 64, 256, 512, 1024) + >>> bottleneck_type = 'cat' + >>> inputs = torch.rand(1, 3, 1024, 2048) + >>> self = STDCNet(stdc_type, in_channels, + ... channels, bottleneck_type).eval() + >>> outputs = self.forward(inputs) + >>> for i in range(len(outputs)): + ... print(f'outputs[{i}].shape = {outputs[i].shape}') + outputs[0].shape = torch.Size([1, 256, 128, 256]) + outputs[1].shape = torch.Size([1, 512, 64, 128]) + outputs[2].shape = torch.Size([1, 1024, 32, 64]) + """ + + arch_settings = { + 'STDCNet1': [(2, 1), (2, 1), (2, 1)], + 'STDCNet2': [(2, 1, 1, 1), (2, 1, 1, 1, 1), (2, 1, 1)] + } + + def __init__(self, + stdc_type, + in_channels, + channels, + bottleneck_type, + norm_cfg, + act_cfg, + num_convs=4, + with_final_conv=False, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert stdc_type in self.arch_settings, \ + f'invalid structure {stdc_type} for STDCNet.' + assert bottleneck_type in ['add', 'cat'],\ + f'bottleneck_type must be `add` or `cat`, got {bottleneck_type}' + + assert len(channels) == 5,\ + f'invalid channels length {len(channels)} for STDCNet.' + + self.in_channels = in_channels + self.channels = channels + self.stage_strides = self.arch_settings[stdc_type] + self.prtrained = pretrained + self.num_convs = num_convs + self.with_final_conv = with_final_conv + + self.stages = ModuleList([ + ConvModule( + self.in_channels, + self.channels[0], + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + self.channels[0], + self.channels[1], + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + ]) + # `self.num_shallow_features` is the number of shallow modules in + # `STDCNet`, which is noted as `Stage1` and `Stage2` in original paper. + # They are both not used for following modules like Attention + # Refinement Module and Feature Fusion Module. + # Thus they would be cut from `outs`. Please refer to Figure 4 + # of original paper for more details. + self.num_shallow_features = len(self.stages) + + for strides in self.stage_strides: + idx = len(self.stages) - 1 + self.stages.append( + self._make_stage(self.channels[idx], self.channels[idx + 1], + strides, norm_cfg, act_cfg, bottleneck_type)) + # After appending, `self.stages` is a ModuleList including several + # shallow modules and STDCModules. + # (len(self.stages) == + # self.num_shallow_features + len(self.stage_strides)) + if self.with_final_conv: + self.final_conv = ConvModule( + self.channels[-1], + max(1024, self.channels[-1]), + 1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def _make_stage(self, in_channels, out_channels, strides, norm_cfg, + act_cfg, bottleneck_type): + layers = [] + for i, stride in enumerate(strides): + layers.append( + STDCModule( + in_channels if i == 0 else out_channels, + out_channels, + stride, + norm_cfg, + act_cfg, + num_convs=self.num_convs, + fusion_type=bottleneck_type)) + return Sequential(*layers) + + def forward(self, x): + outs = [] + for stage in self.stages: + x = stage(x) + outs.append(x) + if self.with_final_conv: + outs[-1] = self.final_conv(outs[-1]) + outs = outs[self.num_shallow_features:] + return tuple(outs) + + +@MODELS.register_module() +class STDCContextPathNet(BaseModule): + """STDCNet with Context Path. The `outs` below is a list of three feature + maps from deep to shallow, whose height and width is from small to big, + respectively. The biggest feature map of `outs` is outputted for + `STDCHead`, where Detail Loss would be calculated by Detail Ground-truth. + The other two feature maps are used for Attention Refinement Module, + respectively. Besides, the biggest feature map of `outs` and the last + output of Attention Refinement Module are concatenated for Feature Fusion + Module. Then, this fusion feature map `feat_fuse` would be outputted for + `decode_head`. More details please refer to Figure 4 of original paper. + + Args: + backbone_cfg (dict): Config dict for stdc backbone. + last_in_channels (tuple(int)), The number of channels of last + two feature maps from stdc backbone. Default: (1024, 512). + out_channels (int): The channels of output feature maps. + Default: 128. + ffm_cfg (dict): Config dict for Feature Fusion Module. Default: + `dict(in_channels=512, out_channels=256, scale_factor=4)`. + upsample_mode (str): Algorithm used for upsampling: + ``'nearest'`` | ``'linear'`` | ``'bilinear'`` | ``'bicubic'`` | + ``'trilinear'``. Default: ``'nearest'``. + align_corners (str): align_corners argument of F.interpolate. It + must be `None` if upsample_mode is ``'nearest'``. Default: None. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + + Return: + outputs (tuple): The tuple of list of output feature map for + auxiliary heads and decoder head. + """ + + def __init__(self, + backbone_cfg, + last_in_channels=(1024, 512), + out_channels=128, + ffm_cfg=dict( + in_channels=512, out_channels=256, scale_factor=4), + upsample_mode='nearest', + align_corners=None, + norm_cfg=dict(type='BN'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.backbone = MODELS.build(backbone_cfg) + self.arms = ModuleList() + self.convs = ModuleList() + for channels in last_in_channels: + self.arms.append(AttentionRefinementModule(channels, out_channels)) + self.convs.append( + ConvModule( + out_channels, + out_channels, + 3, + padding=1, + norm_cfg=norm_cfg)) + self.conv_avg = ConvModule( + last_in_channels[0], out_channels, 1, norm_cfg=norm_cfg) + + self.ffm = FeatureFusionModule(**ffm_cfg) + + self.upsample_mode = upsample_mode + self.align_corners = align_corners + + def forward(self, x): + outs = list(self.backbone(x)) + avg = F.adaptive_avg_pool2d(outs[-1], 1) + avg_feat = self.conv_avg(avg) + + feature_up = resize( + avg_feat, + size=outs[-1].shape[2:], + mode=self.upsample_mode, + align_corners=self.align_corners) + arms_out = [] + for i in range(len(self.arms)): + x_arm = self.arms[i](outs[len(outs) - 1 - i]) + feature_up + feature_up = resize( + x_arm, + size=outs[len(outs) - 1 - i - 1].shape[2:], + mode=self.upsample_mode, + align_corners=self.align_corners) + feature_up = self.convs[i](feature_up) + arms_out.append(feature_up) + + feat_fuse = self.ffm(outs[0], arms_out[1]) + + # The `outputs` has four feature maps. + # `outs[0]` is outputted for `STDCHead` auxiliary head. + # Two feature maps of `arms_out` are outputted for auxiliary head. + # `feat_fuse` is outputted for decoder head. + outputs = [outs[0]] + list(arms_out) + [feat_fuse] + return tuple(outputs) diff --git a/mmsegmentation/mmseg/models/backbones/swin.py b/mmsegmentation/mmseg/models/backbones/swin.py new file mode 100644 index 0000000..67b28a9 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/swin.py @@ -0,0 +1,757 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from collections import OrderedDict +from copy import deepcopy + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_norm_layer +from mmcv.cnn.bricks.transformer import FFN, build_dropout +from mmengine.logging import print_log +from mmengine.model import BaseModule, ModuleList +from mmengine.model.weight_init import (constant_init, trunc_normal_, + trunc_normal_init) +from mmengine.runner import CheckpointLoader +from mmengine.utils import to_2tuple + +from mmseg.registry import MODELS +from ..utils.embed import PatchEmbed, PatchMerging + + +class WindowMSA(BaseModule): + """Window based multi-head self-attention (W-MSA) module with relative + position bias. + + Args: + embed_dims (int): Number of input channels. + num_heads (int): Number of attention heads. + window_size (tuple[int]): The height and width of the window. + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Default: 0.0 + proj_drop_rate (float, optional): Dropout ratio of output. Default: 0. + init_cfg (dict | None, optional): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + window_size, + qkv_bias=True, + qk_scale=None, + attn_drop_rate=0., + proj_drop_rate=0., + init_cfg=None): + + super().__init__(init_cfg=init_cfg) + self.embed_dims = embed_dims + self.window_size = window_size # Wh, Ww + self.num_heads = num_heads + head_embed_dims = embed_dims // num_heads + self.scale = qk_scale or head_embed_dims**-0.5 + + # define a parameter table of relative position bias + self.relative_position_bias_table = nn.Parameter( + torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), + num_heads)) # 2*Wh-1 * 2*Ww-1, nH + + # About 2x faster than original impl + Wh, Ww = self.window_size + rel_index_coords = self.double_step_seq(2 * Ww - 1, Wh, 1, Ww) + rel_position_index = rel_index_coords + rel_index_coords.T + rel_position_index = rel_position_index.flip(1).contiguous() + self.register_buffer('relative_position_index', rel_position_index) + + self.qkv = nn.Linear(embed_dims, embed_dims * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop_rate) + self.proj = nn.Linear(embed_dims, embed_dims) + self.proj_drop = nn.Dropout(proj_drop_rate) + + self.softmax = nn.Softmax(dim=-1) + + def init_weights(self): + trunc_normal_(self.relative_position_bias_table, std=0.02) + + def forward(self, x, mask=None): + """ + Args: + + x (tensor): input features with shape of (num_windows*B, N, C) + mask (tensor | None, Optional): mask with shape of (num_windows, + Wh*Ww, Wh*Ww), value should be between (-inf, 0]. + """ + B, N, C = x.shape + qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, + C // self.num_heads).permute(2, 0, 3, 1, 4) + # make torchscript happy (cannot use tensor as tuple) + q, k, v = qkv[0], qkv[1], qkv[2] + + q = q * self.scale + attn = (q @ k.transpose(-2, -1)) + + relative_position_bias = self.relative_position_bias_table[ + self.relative_position_index.view(-1)].view( + self.window_size[0] * self.window_size[1], + self.window_size[0] * self.window_size[1], + -1) # Wh*Ww,Wh*Ww,nH + relative_position_bias = relative_position_bias.permute( + 2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww + attn = attn + relative_position_bias.unsqueeze(0) + + if mask is not None: + nW = mask.shape[0] + attn = attn.view(B // nW, nW, self.num_heads, N, + N) + mask.unsqueeze(1).unsqueeze(0) + attn = attn.view(-1, self.num_heads, N, N) + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + @staticmethod + def double_step_seq(step1, len1, step2, len2): + seq1 = torch.arange(0, step1 * len1, step1) + seq2 = torch.arange(0, step2 * len2, step2) + return (seq1[:, None] + seq2[None, :]).reshape(1, -1) + + +class ShiftWindowMSA(BaseModule): + """Shifted Window Multihead Self-Attention Module. + + Args: + embed_dims (int): Number of input channels. + num_heads (int): Number of attention heads. + window_size (int): The height and width of the window. + shift_size (int, optional): The shift step of each window towards + right-bottom. If zero, act as regular window-msa. Defaults to 0. + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Defaults: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Defaults: 0. + proj_drop_rate (float, optional): Dropout ratio of output. + Defaults: 0. + dropout_layer (dict, optional): The dropout_layer used before output. + Defaults: dict(type='DropPath', drop_prob=0.). + init_cfg (dict, optional): The extra config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + window_size, + shift_size=0, + qkv_bias=True, + qk_scale=None, + attn_drop_rate=0, + proj_drop_rate=0, + dropout_layer=dict(type='DropPath', drop_prob=0.), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.window_size = window_size + self.shift_size = shift_size + assert 0 <= self.shift_size < self.window_size + + self.w_msa = WindowMSA( + embed_dims=embed_dims, + num_heads=num_heads, + window_size=to_2tuple(window_size), + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop_rate=attn_drop_rate, + proj_drop_rate=proj_drop_rate, + init_cfg=None) + + self.drop = build_dropout(dropout_layer) + + def forward(self, query, hw_shape): + B, L, C = query.shape + H, W = hw_shape + assert L == H * W, 'input feature has wrong size' + query = query.view(B, H, W, C) + + # pad feature maps to multiples of window size + pad_r = (self.window_size - W % self.window_size) % self.window_size + pad_b = (self.window_size - H % self.window_size) % self.window_size + query = F.pad(query, (0, 0, 0, pad_r, 0, pad_b)) + H_pad, W_pad = query.shape[1], query.shape[2] + + # cyclic shift + if self.shift_size > 0: + shifted_query = torch.roll( + query, + shifts=(-self.shift_size, -self.shift_size), + dims=(1, 2)) + + # calculate attention mask for SW-MSA + img_mask = torch.zeros((1, H_pad, W_pad, 1), device=query.device) + h_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + w_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + cnt = 0 + for h in h_slices: + for w in w_slices: + img_mask[:, h, w, :] = cnt + cnt += 1 + + # nW, window_size, window_size, 1 + mask_windows = self.window_partition(img_mask) + mask_windows = mask_windows.view( + -1, self.window_size * self.window_size) + attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) + attn_mask = attn_mask.masked_fill(attn_mask != 0, + float(-100.0)).masked_fill( + attn_mask == 0, float(0.0)) + else: + shifted_query = query + attn_mask = None + + # nW*B, window_size, window_size, C + query_windows = self.window_partition(shifted_query) + # nW*B, window_size*window_size, C + query_windows = query_windows.view(-1, self.window_size**2, C) + + # W-MSA/SW-MSA (nW*B, window_size*window_size, C) + attn_windows = self.w_msa(query_windows, mask=attn_mask) + + # merge windows + attn_windows = attn_windows.view(-1, self.window_size, + self.window_size, C) + + # B H' W' C + shifted_x = self.window_reverse(attn_windows, H_pad, W_pad) + # reverse cyclic shift + if self.shift_size > 0: + x = torch.roll( + shifted_x, + shifts=(self.shift_size, self.shift_size), + dims=(1, 2)) + else: + x = shifted_x + + if pad_r > 0 or pad_b: + x = x[:, :H, :W, :].contiguous() + + x = x.view(B, H * W, C) + + x = self.drop(x) + return x + + def window_reverse(self, windows, H, W): + """ + Args: + windows: (num_windows*B, window_size, window_size, C) + H (int): Height of image + W (int): Width of image + Returns: + x: (B, H, W, C) + """ + window_size = self.window_size + B = int(windows.shape[0] / (H * W / window_size / window_size)) + x = windows.view(B, H // window_size, W // window_size, window_size, + window_size, -1) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) + return x + + def window_partition(self, x): + """ + Args: + x: (B, H, W, C) + Returns: + windows: (num_windows*B, window_size, window_size, C) + """ + B, H, W, C = x.shape + window_size = self.window_size + x = x.view(B, H // window_size, window_size, W // window_size, + window_size, C) + windows = x.permute(0, 1, 3, 2, 4, 5).contiguous() + windows = windows.view(-1, window_size, window_size, C) + return windows + + +class SwinBlock(BaseModule): + """" + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + window_size (int, optional): The local window scale. Default: 7. + shift (bool, optional): whether to shift window or not. Default False. + qkv_bias (bool, optional): enable bias for qkv if True. Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + drop_rate (float, optional): Dropout rate. Default: 0. + attn_drop_rate (float, optional): Attention dropout rate. Default: 0. + drop_path_rate (float, optional): Stochastic depth rate. Default: 0. + act_cfg (dict, optional): The config dict of activation function. + Default: dict(type='GELU'). + norm_cfg (dict, optional): The config dict of normalization. + Default: dict(type='LN'). + with_cp (bool, optional): Use checkpoint or not. Using checkpoint + will save some memory while slowing down the training speed. + Default: False. + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + window_size=7, + shift=False, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + with_cp=False, + init_cfg=None): + + super().__init__(init_cfg=init_cfg) + + self.with_cp = with_cp + + self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1] + self.attn = ShiftWindowMSA( + embed_dims=embed_dims, + num_heads=num_heads, + window_size=window_size, + shift_size=window_size // 2 if shift else 0, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop_rate=attn_drop_rate, + proj_drop_rate=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + init_cfg=None) + + self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1] + self.ffn = FFN( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + num_fcs=2, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + act_cfg=act_cfg, + add_identity=True, + init_cfg=None) + + def forward(self, x, hw_shape): + + def _inner_forward(x): + identity = x + x = self.norm1(x) + x = self.attn(x, hw_shape) + + x = x + identity + + identity = x + x = self.norm2(x) + x = self.ffn(x, identity=identity) + + return x + + if self.with_cp and x.requires_grad: + x = cp.checkpoint(_inner_forward, x) + else: + x = _inner_forward(x) + + return x + + +class SwinBlockSequence(BaseModule): + """Implements one stage in Swin Transformer. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + depth (int): The number of blocks in this stage. + window_size (int, optional): The local window scale. Default: 7. + qkv_bias (bool, optional): enable bias for qkv if True. Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + drop_rate (float, optional): Dropout rate. Default: 0. + attn_drop_rate (float, optional): Attention dropout rate. Default: 0. + drop_path_rate (float | list[float], optional): Stochastic depth + rate. Default: 0. + downsample (BaseModule | None, optional): The downsample operation + module. Default: None. + act_cfg (dict, optional): The config dict of activation function. + Default: dict(type='GELU'). + norm_cfg (dict, optional): The config dict of normalization. + Default: dict(type='LN'). + with_cp (bool, optional): Use checkpoint or not. Using checkpoint + will save some memory while slowing down the training speed. + Default: False. + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + depth, + window_size=7, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + downsample=None, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + with_cp=False, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + if isinstance(drop_path_rate, list): + drop_path_rates = drop_path_rate + assert len(drop_path_rates) == depth + else: + drop_path_rates = [deepcopy(drop_path_rate) for _ in range(depth)] + + self.blocks = ModuleList() + for i in range(depth): + block = SwinBlock( + embed_dims=embed_dims, + num_heads=num_heads, + feedforward_channels=feedforward_channels, + window_size=window_size, + shift=False if i % 2 == 0 else True, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=drop_path_rates[i], + act_cfg=act_cfg, + norm_cfg=norm_cfg, + with_cp=with_cp, + init_cfg=None) + self.blocks.append(block) + + self.downsample = downsample + + def forward(self, x, hw_shape): + for block in self.blocks: + x = block(x, hw_shape) + + if self.downsample: + x_down, down_hw_shape = self.downsample(x, hw_shape) + return x_down, down_hw_shape, x, hw_shape + else: + return x, hw_shape, x, hw_shape + + +@MODELS.register_module() +class SwinTransformer(BaseModule): + """Swin Transformer backbone. + + This backbone is the implementation of `Swin Transformer: + Hierarchical Vision Transformer using Shifted + Windows `_. + Inspiration from https://github.com/microsoft/Swin-Transformer. + + Args: + pretrain_img_size (int | tuple[int]): The size of input image when + pretrain. Defaults: 224. + in_channels (int): The num of input channels. + Defaults: 3. + embed_dims (int): The feature dimension. Default: 96. + patch_size (int | tuple[int]): Patch size. Default: 4. + window_size (int): Window size. Default: 7. + mlp_ratio (int | float): Ratio of mlp hidden dim to embedding dim. + Default: 4. + depths (tuple[int]): Depths of each Swin Transformer stage. + Default: (2, 2, 6, 2). + num_heads (tuple[int]): Parallel attention heads of each Swin + Transformer stage. Default: (3, 6, 12, 24). + strides (tuple[int]): The patch merging or patch embedding stride of + each Swin Transformer stage. (In swin, we set kernel size equal to + stride.) Default: (4, 2, 2, 2). + out_indices (tuple[int]): Output from which stages. + Default: (0, 1, 2, 3). + qkv_bias (bool, optional): If True, add a learnable bias to query, key, + value. Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + patch_norm (bool): If add a norm layer for patch embed and patch + merging. Default: True. + drop_rate (float): Dropout rate. Defaults: 0. + attn_drop_rate (float): Attention dropout rate. Default: 0. + drop_path_rate (float): Stochastic depth rate. Defaults: 0.1. + use_abs_pos_embed (bool): If True, add absolute position embedding to + the patch embedding. Defaults: False. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LN'). + norm_cfg (dict): Config dict for normalization layer at + output of backone. Defaults: dict(type='LN'). + with_cp (bool, optional): Use checkpoint or not. Using checkpoint + will save some memory while slowing down the training speed. + Default: False. + pretrained (str, optional): model pretrained path. Default: None. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + pretrain_img_size=224, + in_channels=3, + embed_dims=96, + patch_size=4, + window_size=7, + mlp_ratio=4, + depths=(2, 2, 6, 2), + num_heads=(3, 6, 12, 24), + strides=(4, 2, 2, 2), + out_indices=(0, 1, 2, 3), + qkv_bias=True, + qk_scale=None, + patch_norm=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + use_abs_pos_embed=False, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + with_cp=False, + pretrained=None, + frozen_stages=-1, + init_cfg=None): + self.frozen_stages = frozen_stages + + if isinstance(pretrain_img_size, int): + pretrain_img_size = to_2tuple(pretrain_img_size) + elif isinstance(pretrain_img_size, tuple): + if len(pretrain_img_size) == 1: + pretrain_img_size = to_2tuple(pretrain_img_size[0]) + assert len(pretrain_img_size) == 2, \ + f'The size of image should have length 1 or 2, ' \ + f'but got {len(pretrain_img_size)}' + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + init_cfg = init_cfg + else: + raise TypeError('pretrained must be a str or None') + + super().__init__(init_cfg=init_cfg) + + num_layers = len(depths) + self.out_indices = out_indices + self.use_abs_pos_embed = use_abs_pos_embed + + assert strides[0] == patch_size, 'Use non-overlapping patch embed.' + + self.patch_embed = PatchEmbed( + in_channels=in_channels, + embed_dims=embed_dims, + conv_type='Conv2d', + kernel_size=patch_size, + stride=strides[0], + padding='corner', + norm_cfg=norm_cfg if patch_norm else None, + init_cfg=None) + + if self.use_abs_pos_embed: + patch_row = pretrain_img_size[0] // patch_size + patch_col = pretrain_img_size[1] // patch_size + num_patches = patch_row * patch_col + self.absolute_pos_embed = nn.Parameter( + torch.zeros((1, num_patches, embed_dims))) + + self.drop_after_pos = nn.Dropout(p=drop_rate) + + # set stochastic depth decay rule + total_depth = sum(depths) + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, total_depth) + ] + + self.stages = ModuleList() + in_channels = embed_dims + for i in range(num_layers): + if i < num_layers - 1: + downsample = PatchMerging( + in_channels=in_channels, + out_channels=2 * in_channels, + stride=strides[i + 1], + norm_cfg=norm_cfg if patch_norm else None, + init_cfg=None) + else: + downsample = None + + stage = SwinBlockSequence( + embed_dims=in_channels, + num_heads=num_heads[i], + feedforward_channels=int(mlp_ratio * in_channels), + depth=depths[i], + window_size=window_size, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=dpr[sum(depths[:i]):sum(depths[:i + 1])], + downsample=downsample, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + with_cp=with_cp, + init_cfg=None) + self.stages.append(stage) + if downsample: + in_channels = downsample.out_channels + + self.num_features = [int(embed_dims * 2**i) for i in range(num_layers)] + # Add a norm layer for each output + for i in out_indices: + layer = build_norm_layer(norm_cfg, self.num_features[i])[1] + layer_name = f'norm{i}' + self.add_module(layer_name, layer) + + def train(self, mode=True): + """Convert the model into training mode while keep layers freezed.""" + super().train(mode) + self._freeze_stages() + + def _freeze_stages(self): + if self.frozen_stages >= 0: + self.patch_embed.eval() + for param in self.patch_embed.parameters(): + param.requires_grad = False + if self.use_abs_pos_embed: + self.absolute_pos_embed.requires_grad = False + self.drop_after_pos.eval() + + for i in range(1, self.frozen_stages + 1): + + if (i - 1) in self.out_indices: + norm_layer = getattr(self, f'norm{i-1}') + norm_layer.eval() + for param in norm_layer.parameters(): + param.requires_grad = False + + m = self.stages[i - 1] + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def init_weights(self): + if self.init_cfg is None: + print_log(f'No pre-trained weights for ' + f'{self.__class__.__name__}, ' + f'training start from scratch') + if self.use_abs_pos_embed: + trunc_normal_(self.absolute_pos_embed, std=0.02) + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=.02, bias=0.) + elif isinstance(m, nn.LayerNorm): + constant_init(m, val=1.0, bias=0.) + else: + assert 'checkpoint' in self.init_cfg, f'Only support ' \ + f'specify `Pretrained` in ' \ + f'`init_cfg` in ' \ + f'{self.__class__.__name__} ' + ckpt = CheckpointLoader.load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + if 'state_dict' in ckpt: + _state_dict = ckpt['state_dict'] + elif 'model' in ckpt: + _state_dict = ckpt['model'] + else: + _state_dict = ckpt + + state_dict = OrderedDict() + for k, v in _state_dict.items(): + if k.startswith('backbone.'): + state_dict[k[9:]] = v + else: + state_dict[k] = v + + # strip prefix of state_dict + if list(state_dict.keys())[0].startswith('module.'): + state_dict = {k[7:]: v for k, v in state_dict.items()} + + # reshape absolute position embedding + if state_dict.get('absolute_pos_embed') is not None: + absolute_pos_embed = state_dict['absolute_pos_embed'] + N1, L, C1 = absolute_pos_embed.size() + N2, C2, H, W = self.absolute_pos_embed.size() + if N1 != N2 or C1 != C2 or L != H * W: + print_log('Error in loading absolute_pos_embed, pass') + else: + state_dict['absolute_pos_embed'] = absolute_pos_embed.view( + N2, H, W, C2).permute(0, 3, 1, 2).contiguous() + + # interpolate position bias table if needed + relative_position_bias_table_keys = [ + k for k in state_dict.keys() + if 'relative_position_bias_table' in k + ] + for table_key in relative_position_bias_table_keys: + table_pretrained = state_dict[table_key] + if table_key in self.state_dict(): + table_current = self.state_dict()[table_key] + L1, nH1 = table_pretrained.size() + L2, nH2 = table_current.size() + if nH1 != nH2: + print_log(f'Error in loading {table_key}, pass') + elif L1 != L2: + S1 = int(L1**0.5) + S2 = int(L2**0.5) + table_pretrained_resized = F.interpolate( + table_pretrained.permute(1, 0).reshape( + 1, nH1, S1, S1), + size=(S2, S2), + mode='bicubic') + state_dict[table_key] = table_pretrained_resized.view( + nH2, L2).permute(1, 0).contiguous() + + # load state_dict + self.load_state_dict(state_dict, strict=False) + + def forward(self, x): + x, hw_shape = self.patch_embed(x) + + if self.use_abs_pos_embed: + x = x + self.absolute_pos_embed + x = self.drop_after_pos(x) + + outs = [] + for i, stage in enumerate(self.stages): + x, hw_shape, out, out_hw_shape = stage(x, hw_shape) + if i in self.out_indices: + norm_layer = getattr(self, f'norm{i}') + out = norm_layer(out) + out = out.view(-1, *out_hw_shape, + self.num_features[i]).permute(0, 3, 1, + 2).contiguous() + outs.append(out) + + return outs diff --git a/mmsegmentation/mmseg/models/backbones/timm_backbone.py b/mmsegmentation/mmseg/models/backbones/timm_backbone.py new file mode 100644 index 0000000..1eef302 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/timm_backbone.py @@ -0,0 +1,63 @@ +# Copyright (c) OpenMMLab. All rights reserved. +try: + import timm +except ImportError: + timm = None + +from mmengine.model import BaseModule +from mmengine.registry import MODELS as MMENGINE_MODELS + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class TIMMBackbone(BaseModule): + """Wrapper to use backbones from timm library. More details can be found in + `timm `_ . + + Args: + model_name (str): Name of timm model to instantiate. + pretrained (bool): Load pretrained weights if True. + checkpoint_path (str): Path of checkpoint to load after + model is initialized. + in_channels (int): Number of input image channels. Default: 3. + init_cfg (dict, optional): Initialization config dict + **kwargs: Other timm & model specific arguments. + """ + + def __init__( + self, + model_name, + features_only=True, + pretrained=True, + checkpoint_path='', + in_channels=3, + init_cfg=None, + **kwargs, + ): + if timm is None: + raise RuntimeError('timm is not installed') + super().__init__(init_cfg) + if 'norm_layer' in kwargs: + kwargs['norm_layer'] = MMENGINE_MODELS.get(kwargs['norm_layer']) + self.timm_model = timm.create_model( + model_name=model_name, + features_only=features_only, + pretrained=pretrained, + in_chans=in_channels, + checkpoint_path=checkpoint_path, + **kwargs, + ) + + # Make unused parameters None + self.timm_model.global_pool = None + self.timm_model.fc = None + self.timm_model.classifier = None + + # Hack to use pretrained weights from timm + if pretrained or checkpoint_path: + self._is_init = True + + def forward(self, x): + features = self.timm_model(x) + return features diff --git a/mmsegmentation/mmseg/models/backbones/twins.py b/mmsegmentation/mmseg/models/backbones/twins.py new file mode 100644 index 0000000..b6a6eea --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/twins.py @@ -0,0 +1,588 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_norm_layer +from mmcv.cnn.bricks.drop import build_dropout +from mmcv.cnn.bricks.transformer import FFN +from mmengine.model import BaseModule, ModuleList +from mmengine.model.weight_init import (constant_init, normal_init, + trunc_normal_init) +from torch.nn.modules.batchnorm import _BatchNorm + +from mmseg.models.backbones.mit import EfficientMultiheadAttention +from mmseg.registry import MODELS +from ..utils.embed import PatchEmbed + + +class GlobalSubsampledAttention(EfficientMultiheadAttention): + """Global Sub-sampled Attention (Spatial Reduction Attention) + + This module is modified from EfficientMultiheadAttention๏ผŒ + which is a module from mmseg.models.backbones.mit.py. + Specifically, there is no difference between + `GlobalSubsampledAttention` and `EfficientMultiheadAttention`, + `GlobalSubsampledAttention` is built as a brand new class + because it is renamed as `Global sub-sampled attention (GSA)` + in paper. + + + Args: + embed_dims (int): The embedding dimension. + num_heads (int): Parallel attention heads. + attn_drop (float): A Dropout layer on attn_output_weights. + Default: 0.0. + proj_drop (float): A Dropout layer after `nn.MultiheadAttention`. + Default: 0.0. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. Default: None. + batch_first (bool): Key, Query and Value are shape of + (batch, n, embed_dims) + or (n, batch, embed_dims). Default: False. + qkv_bias (bool): enable bias for qkv if True. Default: True. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + sr_ratio (int): The ratio of spatial reduction of GSA of PCPVT. + Default: 1. + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + embed_dims, + num_heads, + attn_drop=0., + proj_drop=0., + dropout_layer=None, + batch_first=True, + qkv_bias=True, + norm_cfg=dict(type='LN'), + sr_ratio=1, + init_cfg=None): + super().__init__( + embed_dims, + num_heads, + attn_drop=attn_drop, + proj_drop=proj_drop, + dropout_layer=dropout_layer, + batch_first=batch_first, + qkv_bias=qkv_bias, + norm_cfg=norm_cfg, + sr_ratio=sr_ratio, + init_cfg=init_cfg) + + +class GSAEncoderLayer(BaseModule): + """Implements one encoder layer with GSA. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + drop_rate (float): Probability of an element to be zeroed + after the feed forward layer. Default: 0.0. + attn_drop_rate (float): The drop out rate for attention layer. + Default: 0.0. + drop_path_rate (float): Stochastic depth rate. Default 0.0. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + qkv_bias (bool): Enable bias for qkv if True. Default: True + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + sr_ratio (float): Kernel_size of conv in Attention modules. Default: 1. + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + num_fcs=2, + qkv_bias=True, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + sr_ratio=1., + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.norm1 = build_norm_layer(norm_cfg, embed_dims, postfix=1)[1] + self.attn = GlobalSubsampledAttention( + embed_dims=embed_dims, + num_heads=num_heads, + attn_drop=attn_drop_rate, + proj_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + qkv_bias=qkv_bias, + norm_cfg=norm_cfg, + sr_ratio=sr_ratio) + + self.norm2 = build_norm_layer(norm_cfg, embed_dims, postfix=2)[1] + self.ffn = FFN( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + num_fcs=num_fcs, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + act_cfg=act_cfg, + add_identity=False) + + self.drop_path = build_dropout( + dict(type='DropPath', drop_prob=drop_path_rate) + ) if drop_path_rate > 0. else nn.Identity() + + def forward(self, x, hw_shape): + x = x + self.drop_path(self.attn(self.norm1(x), hw_shape, identity=0.)) + x = x + self.drop_path(self.ffn(self.norm2(x))) + return x + + +class LocallyGroupedSelfAttention(BaseModule): + """Locally-grouped Self Attention (LSA) module. + + Args: + embed_dims (int): Number of input channels. + num_heads (int): Number of attention heads. Default: 8 + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: False. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Default: 0.0 + proj_drop_rate (float, optional): Dropout ratio of output. Default: 0. + window_size(int): Window size of LSA. Default: 1. + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + embed_dims, + num_heads=8, + qkv_bias=False, + qk_scale=None, + attn_drop_rate=0., + proj_drop_rate=0., + window_size=1, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + assert embed_dims % num_heads == 0, f'dim {embed_dims} should be ' \ + f'divided by num_heads ' \ + f'{num_heads}.' + self.embed_dims = embed_dims + self.num_heads = num_heads + head_dim = embed_dims // num_heads + self.scale = qk_scale or head_dim**-0.5 + + self.qkv = nn.Linear(embed_dims, embed_dims * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop_rate) + self.proj = nn.Linear(embed_dims, embed_dims) + self.proj_drop = nn.Dropout(proj_drop_rate) + self.window_size = window_size + + def forward(self, x, hw_shape): + b, n, c = x.shape + h, w = hw_shape + x = x.view(b, h, w, c) + + # pad feature maps to multiples of Local-groups + pad_l = pad_t = 0 + pad_r = (self.window_size - w % self.window_size) % self.window_size + pad_b = (self.window_size - h % self.window_size) % self.window_size + x = F.pad(x, (0, 0, pad_l, pad_r, pad_t, pad_b)) + + # calculate attention mask for LSA + Hp, Wp = x.shape[1:-1] + _h, _w = Hp // self.window_size, Wp // self.window_size + mask = torch.zeros((1, Hp, Wp), device=x.device) + mask[:, -pad_b:, :].fill_(1) + mask[:, :, -pad_r:].fill_(1) + + # [B, _h, _w, window_size, window_size, C] + x = x.reshape(b, _h, self.window_size, _w, self.window_size, + c).transpose(2, 3) + mask = mask.reshape(1, _h, self.window_size, _w, + self.window_size).transpose(2, 3).reshape( + 1, _h * _w, + self.window_size * self.window_size) + # [1, _h*_w, window_size*window_size, window_size*window_size] + attn_mask = mask.unsqueeze(2) - mask.unsqueeze(3) + attn_mask = attn_mask.masked_fill(attn_mask != 0, + float(-1000.0)).masked_fill( + attn_mask == 0, float(0.0)) + + # [3, B, _w*_h, nhead, window_size*window_size, dim] + qkv = self.qkv(x).reshape(b, _h * _w, + self.window_size * self.window_size, 3, + self.num_heads, c // self.num_heads).permute( + 3, 0, 1, 4, 2, 5) + q, k, v = qkv[0], qkv[1], qkv[2] + # [B, _h*_w, n_head, window_size*window_size, window_size*window_size] + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn + attn_mask.unsqueeze(2) + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + attn = (attn @ v).transpose(2, 3).reshape(b, _h, _w, self.window_size, + self.window_size, c) + x = attn.transpose(2, 3).reshape(b, _h * self.window_size, + _w * self.window_size, c) + if pad_r > 0 or pad_b > 0: + x = x[:, :h, :w, :].contiguous() + + x = x.reshape(b, n, c) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class LSAEncoderLayer(BaseModule): + """Implements one encoder layer in Twins-SVT. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + drop_rate (float): Probability of an element to be zeroed + after the feed forward layer. Default: 0.0. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Default: 0.0 + drop_path_rate (float): Stochastic depth rate. Default 0.0. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + qkv_bias (bool): Enable bias for qkv if True. Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + window_size (int): Window size of LSA. Default: 1. + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + num_fcs=2, + qkv_bias=True, + qk_scale=None, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + window_size=1, + init_cfg=None): + + super().__init__(init_cfg=init_cfg) + + self.norm1 = build_norm_layer(norm_cfg, embed_dims, postfix=1)[1] + self.attn = LocallyGroupedSelfAttention(embed_dims, num_heads, + qkv_bias, qk_scale, + attn_drop_rate, drop_rate, + window_size) + + self.norm2 = build_norm_layer(norm_cfg, embed_dims, postfix=2)[1] + self.ffn = FFN( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + num_fcs=num_fcs, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + act_cfg=act_cfg, + add_identity=False) + + self.drop_path = build_dropout( + dict(type='DropPath', drop_prob=drop_path_rate) + ) if drop_path_rate > 0. else nn.Identity() + + def forward(self, x, hw_shape): + x = x + self.drop_path(self.attn(self.norm1(x), hw_shape)) + x = x + self.drop_path(self.ffn(self.norm2(x))) + return x + + +class ConditionalPositionEncoding(BaseModule): + """The Conditional Position Encoding (CPE) module. + + The CPE is the implementation of 'Conditional Positional Encodings + for Vision Transformers '_. + + Args: + in_channels (int): Number of input channels. + embed_dims (int): The feature dimension. Default: 768. + stride (int): Stride of conv layer. Default: 1. + """ + + def __init__(self, in_channels, embed_dims=768, stride=1, init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.proj = nn.Conv2d( + in_channels, + embed_dims, + kernel_size=3, + stride=stride, + padding=1, + bias=True, + groups=embed_dims) + self.stride = stride + + def forward(self, x, hw_shape): + b, n, c = x.shape + h, w = hw_shape + feat_token = x + cnn_feat = feat_token.transpose(1, 2).view(b, c, h, w) + if self.stride == 1: + x = self.proj(cnn_feat) + cnn_feat + else: + x = self.proj(cnn_feat) + x = x.flatten(2).transpose(1, 2) + return x + + +@MODELS.register_module() +class PCPVT(BaseModule): + """The backbone of Twins-PCPVT. + + This backbone is the implementation of `Twins: Revisiting the Design + of Spatial Attention in Vision Transformers + `_. + + Args: + in_channels (int): Number of input channels. Default: 3. + embed_dims (list): Embedding dimension. Default: [64, 128, 256, 512]. + patch_sizes (list): The patch sizes. Default: [4, 2, 2, 2]. + strides (list): The strides. Default: [4, 2, 2, 2]. + num_heads (int): Number of attention heads. Default: [1, 2, 4, 8]. + mlp_ratios (int): Ratio of mlp hidden dim to embedding dim. + Default: [4, 4, 4, 4]. + out_indices (tuple[int]): Output from which stages. + Default: (0, 1, 2, 3). + qkv_bias (bool): Enable bias for qkv if True. Default: False. + drop_rate (float): Probability of an element to be zeroed. + Default 0. + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0 + drop_path_rate (float): Stochastic depth rate. Default 0.0 + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + depths (list): Depths of each stage. Default [3, 4, 6, 3] + sr_ratios (list): Kernel_size of conv in each Attn module in + Transformer encoder layer. Default: [8, 4, 2, 1]. + norm_after_stage๏ผˆbool): Add extra norm. Default False. + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + in_channels=3, + embed_dims=[64, 128, 256, 512], + patch_sizes=[4, 2, 2, 2], + strides=[4, 2, 2, 2], + num_heads=[1, 2, 4, 8], + mlp_ratios=[4, 4, 4, 4], + out_indices=(0, 1, 2, 3), + qkv_bias=False, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + norm_cfg=dict(type='LN'), + depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], + norm_after_stage=False, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + self.depths = depths + + # patch_embed + self.patch_embeds = ModuleList() + self.position_encoding_drops = ModuleList() + self.layers = ModuleList() + + for i in range(len(depths)): + self.patch_embeds.append( + PatchEmbed( + in_channels=in_channels if i == 0 else embed_dims[i - 1], + embed_dims=embed_dims[i], + conv_type='Conv2d', + kernel_size=patch_sizes[i], + stride=strides[i], + padding='corner', + norm_cfg=norm_cfg)) + + self.position_encoding_drops.append(nn.Dropout(p=drop_rate)) + + self.position_encodings = ModuleList([ + ConditionalPositionEncoding(embed_dim, embed_dim) + for embed_dim in embed_dims + ]) + + # transformer encoder + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) + ] # stochastic depth decay rule + cur = 0 + + for k in range(len(depths)): + _block = ModuleList([ + GSAEncoderLayer( + embed_dims=embed_dims[k], + num_heads=num_heads[k], + feedforward_channels=mlp_ratios[k] * embed_dims[k], + attn_drop_rate=attn_drop_rate, + drop_rate=drop_rate, + drop_path_rate=dpr[cur + i], + num_fcs=2, + qkv_bias=qkv_bias, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + sr_ratio=sr_ratios[k]) for i in range(depths[k]) + ]) + self.layers.append(_block) + cur += depths[k] + + self.norm_name, norm = build_norm_layer( + norm_cfg, embed_dims[-1], postfix=1) + + self.out_indices = out_indices + self.norm_after_stage = norm_after_stage + if self.norm_after_stage: + self.norm_list = ModuleList() + for dim in embed_dims: + self.norm_list.append(build_norm_layer(norm_cfg, dim)[1]) + + def init_weights(self): + if self.init_cfg is not None: + super().init_weights() + else: + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=.02, bias=0.) + elif isinstance(m, (_BatchNorm, nn.GroupNorm, nn.LayerNorm)): + constant_init(m, val=1.0, bias=0.) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[ + 1] * m.out_channels + fan_out //= m.groups + normal_init( + m, mean=0, std=math.sqrt(2.0 / fan_out), bias=0) + + def forward(self, x): + outputs = list() + + b = x.shape[0] + + for i in range(len(self.depths)): + x, hw_shape = self.patch_embeds[i](x) + h, w = hw_shape + x = self.position_encoding_drops[i](x) + for j, blk in enumerate(self.layers[i]): + x = blk(x, hw_shape) + if j == 0: + x = self.position_encodings[i](x, hw_shape) + if self.norm_after_stage: + x = self.norm_list[i](x) + x = x.reshape(b, h, w, -1).permute(0, 3, 1, 2).contiguous() + + if i in self.out_indices: + outputs.append(x) + + return tuple(outputs) + + +@MODELS.register_module() +class SVT(PCPVT): + """The backbone of Twins-SVT. + + This backbone is the implementation of `Twins: Revisiting the Design + of Spatial Attention in Vision Transformers + `_. + + Args: + in_channels (int): Number of input channels. Default: 3. + embed_dims (list): Embedding dimension. Default: [64, 128, 256, 512]. + patch_sizes (list): The patch sizes. Default: [4, 2, 2, 2]. + strides (list): The strides. Default: [4, 2, 2, 2]. + num_heads (int): Number of attention heads. Default: [1, 2, 4]. + mlp_ratios (int): Ratio of mlp hidden dim to embedding dim. + Default: [4, 4, 4]. + out_indices (tuple[int]): Output from which stages. + Default: (0, 1, 2, 3). + qkv_bias (bool): Enable bias for qkv if True. Default: False. + drop_rate (float): Dropout rate. Default 0. + attn_drop_rate (float): Dropout ratio of attention weight. + Default 0.0 + drop_path_rate (float): Stochastic depth rate. Default 0.2. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + depths (list): Depths of each stage. Default [4, 4, 4]. + sr_ratios (list): Kernel_size of conv in each Attn module in + Transformer encoder layer. Default: [4, 2, 1]. + windiow_sizes (list): Window size of LSA. Default: [7, 7, 7], + input_features_slice๏ผˆbool): Input features need slice. Default: False. + norm_after_stage๏ผˆbool): Add extra norm. Default False. + strides (list): Strides in patch-Embedding modules. Default: (2, 2, 2) + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + in_channels=3, + embed_dims=[64, 128, 256], + patch_sizes=[4, 2, 2, 2], + strides=[4, 2, 2, 2], + num_heads=[1, 2, 4], + mlp_ratios=[4, 4, 4], + out_indices=(0, 1, 2, 3), + qkv_bias=False, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.2, + norm_cfg=dict(type='LN'), + depths=[4, 4, 4], + sr_ratios=[4, 2, 1], + windiow_sizes=[7, 7, 7], + norm_after_stage=True, + pretrained=None, + init_cfg=None): + super().__init__(in_channels, embed_dims, patch_sizes, strides, + num_heads, mlp_ratios, out_indices, qkv_bias, + drop_rate, attn_drop_rate, drop_path_rate, norm_cfg, + depths, sr_ratios, norm_after_stage, pretrained, + init_cfg) + # transformer encoder + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) + ] # stochastic depth decay rule + + for k in range(len(depths)): + for i in range(depths[k]): + if i % 2 == 0: + self.layers[k][i] = \ + LSAEncoderLayer( + embed_dims=embed_dims[k], + num_heads=num_heads[k], + feedforward_channels=mlp_ratios[k] * embed_dims[k], + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=dpr[sum(depths[:k])+i], + qkv_bias=qkv_bias, + window_size=windiow_sizes[k]) diff --git a/mmsegmentation/mmseg/models/backbones/unet.py b/mmsegmentation/mmseg/models/backbones/unet.py new file mode 100644 index 0000000..545921d --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/unet.py @@ -0,0 +1,436 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer +from mmengine.model import BaseModule +from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm + +from mmseg.registry import MODELS +from ..utils import UpConvBlock, Upsample + + +class BasicConvBlock(nn.Module): + """Basic convolutional block for UNet. + + This module consists of several plain convolutional layers. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + num_convs (int): Number of convolutional layers. Default: 2. + stride (int): Whether use stride convolution to downsample + the input feature map. If stride=2, it only uses stride convolution + in the first convolutional layer to downsample the input feature + map. Options are 1 or 2. Default: 1. + dilation (int): Whether use dilated convolution to expand the + receptive field. Set dilation rate of each convolutional layer and + the dilation rate of the first convolutional layer is always 1. + Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + dcn (bool): Use deformable convolution in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + num_convs=2, + stride=1, + dilation=1, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + dcn=None, + plugins=None): + super().__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.with_cp = with_cp + convs = [] + for i in range(num_convs): + convs.append( + ConvModule( + in_channels=in_channels if i == 0 else out_channels, + out_channels=out_channels, + kernel_size=3, + stride=stride if i == 0 else 1, + dilation=1 if i == 0 else dilation, + padding=1 if i == 0 else dilation, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + self.convs = nn.Sequential(*convs) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.convs, x) + else: + out = self.convs(x) + return out + + +@MODELS.register_module() +class DeconvModule(nn.Module): + """Deconvolution upsample module in decoder for UNet (2X upsample). + + This module uses deconvolution to upsample feature map in the decoder + of UNet. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + kernel_size (int): Kernel size of the convolutional layer. Default: 4. + """ + + def __init__(self, + in_channels, + out_channels, + with_cp=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + *, + kernel_size=4, + scale_factor=2): + super().__init__() + + assert (kernel_size - scale_factor >= 0) and\ + (kernel_size - scale_factor) % 2 == 0,\ + f'kernel_size should be greater than or equal to scale_factor '\ + f'and (kernel_size - scale_factor) should be even numbers, '\ + f'while the kernel size is {kernel_size} and scale_factor is '\ + f'{scale_factor}.' + + stride = scale_factor + padding = (kernel_size - scale_factor) // 2 + self.with_cp = with_cp + deconv = nn.ConvTranspose2d( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding) + + norm_name, norm = build_norm_layer(norm_cfg, out_channels) + activate = build_activation_layer(act_cfg) + self.deconv_upsamping = nn.Sequential(deconv, norm, activate) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.deconv_upsamping, x) + else: + out = self.deconv_upsamping(x) + return out + + +@MODELS.register_module() +class InterpConv(nn.Module): + """Interpolation upsample module in decoder for UNet. + + This module uses interpolation to upsample feature map in the decoder + of UNet. It consists of one interpolation upsample layer and one + convolutional layer. It can be one interpolation upsample layer followed + by one convolutional layer (conv_first=False) or one convolutional layer + followed by one interpolation upsample layer (conv_first=True). + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + conv_first (bool): Whether convolutional layer or interpolation + upsample layer first. Default: False. It means interpolation + upsample layer followed by one convolutional layer. + kernel_size (int): Kernel size of the convolutional layer. Default: 1. + stride (int): Stride of the convolutional layer. Default: 1. + padding (int): Padding of the convolutional layer. Default: 1. + upsample_cfg (dict): Interpolation config of the upsample layer. + Default: dict( + scale_factor=2, mode='bilinear', align_corners=False). + """ + + def __init__(self, + in_channels, + out_channels, + with_cp=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + *, + conv_cfg=None, + conv_first=False, + kernel_size=1, + stride=1, + padding=0, + upsample_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False)): + super().__init__() + + self.with_cp = with_cp + conv = ConvModule( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + upsample = Upsample(**upsample_cfg) + if conv_first: + self.interp_upsample = nn.Sequential(conv, upsample) + else: + self.interp_upsample = nn.Sequential(upsample, conv) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.interp_upsample, x) + else: + out = self.interp_upsample(x) + return out + + +@MODELS.register_module() +class UNet(BaseModule): + """UNet backbone. + + This backbone is the implementation of `U-Net: Convolutional Networks + for Biomedical Image Segmentation `_. + + Args: + in_channels (int): Number of input image channels. Default" 3. + base_channels (int): Number of base channels of each stage. + The output channels of the first stage. Default: 64. + num_stages (int): Number of stages in encoder, normally 5. Default: 5. + strides (Sequence[int 1 | 2]): Strides of each stage in encoder. + len(strides) is equal to num_stages. Normally the stride of the + first stage in encoder is 1. If strides[i]=2, it uses stride + convolution to downsample in the correspondence encoder stage. + Default: (1, 1, 1, 1, 1). + enc_num_convs (Sequence[int]): Number of convolutional layers in the + convolution block of the correspondence encoder stage. + Default: (2, 2, 2, 2, 2). + dec_num_convs (Sequence[int]): Number of convolutional layers in the + convolution block of the correspondence decoder stage. + Default: (2, 2, 2, 2). + downsamples (Sequence[int]): Whether use MaxPool to downsample the + feature map after the first stage of encoder + (stages: [1, num_stages)). If the correspondence encoder stage use + stride convolution (strides[i]=2), it will never use MaxPool to + downsample, even downsamples[i-1]=True. + Default: (True, True, True, True). + enc_dilations (Sequence[int]): Dilation rate of each stage in encoder. + Default: (1, 1, 1, 1, 1). + dec_dilations (Sequence[int]): Dilation rate of each stage in decoder. + Default: (1, 1, 1, 1). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + upsample_cfg (dict): The upsample config of the upsample module in + decoder. Default: dict(type='InterpConv'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + dcn (bool): Use deformable convolution in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Notice: + The input image size should be divisible by the whole downsample rate + of the encoder. More detail of the whole downsample rate can be found + in UNet._check_input_divisible. + """ + + def __init__(self, + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False, + dcn=None, + plugins=None, + pretrained=None, + init_cfg=None): + super().__init__(init_cfg) + + self.pretrained = pretrained + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is a deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + assert len(strides) == num_stages, \ + 'The length of strides should be equal to num_stages, '\ + f'while the strides is {strides}, the length of '\ + f'strides is {len(strides)}, and the num_stages is '\ + f'{num_stages}.' + assert len(enc_num_convs) == num_stages, \ + 'The length of enc_num_convs should be equal to num_stages, '\ + f'while the enc_num_convs is {enc_num_convs}, the length of '\ + f'enc_num_convs is {len(enc_num_convs)}, and the num_stages is '\ + f'{num_stages}.' + assert len(dec_num_convs) == (num_stages-1), \ + 'The length of dec_num_convs should be equal to (num_stages-1), '\ + f'while the dec_num_convs is {dec_num_convs}, the length of '\ + f'dec_num_convs is {len(dec_num_convs)}, and the num_stages is '\ + f'{num_stages}.' + assert len(downsamples) == (num_stages-1), \ + 'The length of downsamples should be equal to (num_stages-1), '\ + f'while the downsamples is {downsamples}, the length of '\ + f'downsamples is {len(downsamples)}, and the num_stages is '\ + f'{num_stages}.' + assert len(enc_dilations) == num_stages, \ + 'The length of enc_dilations should be equal to num_stages, '\ + f'while the enc_dilations is {enc_dilations}, the length of '\ + f'enc_dilations is {len(enc_dilations)}, and the num_stages is '\ + f'{num_stages}.' + assert len(dec_dilations) == (num_stages-1), \ + 'The length of dec_dilations should be equal to (num_stages-1), '\ + f'while the dec_dilations is {dec_dilations}, the length of '\ + f'dec_dilations is {len(dec_dilations)}, and the num_stages is '\ + f'{num_stages}.' + self.num_stages = num_stages + self.strides = strides + self.downsamples = downsamples + self.norm_eval = norm_eval + self.base_channels = base_channels + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + for i in range(num_stages): + enc_conv_block = [] + if i != 0: + if strides[i] == 1 and downsamples[i - 1]: + enc_conv_block.append(nn.MaxPool2d(kernel_size=2)) + upsample = (strides[i] != 1 or downsamples[i - 1]) + self.decoder.append( + UpConvBlock( + conv_block=BasicConvBlock, + in_channels=base_channels * 2**i, + skip_channels=base_channels * 2**(i - 1), + out_channels=base_channels * 2**(i - 1), + num_convs=dec_num_convs[i - 1], + stride=1, + dilation=dec_dilations[i - 1], + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + upsample_cfg=upsample_cfg if upsample else None, + dcn=None, + plugins=None)) + + enc_conv_block.append( + BasicConvBlock( + in_channels=in_channels, + out_channels=base_channels * 2**i, + num_convs=enc_num_convs[i], + stride=strides[i], + dilation=enc_dilations[i], + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + dcn=None, + plugins=None)) + self.encoder.append(nn.Sequential(*enc_conv_block)) + in_channels = base_channels * 2**i + + def forward(self, x): + self._check_input_divisible(x) + enc_outs = [] + for enc in self.encoder: + x = enc(x) + enc_outs.append(x) + dec_outs = [x] + for i in reversed(range(len(self.decoder))): + x = self.decoder[i](enc_outs[i], x) + dec_outs.append(x) + + return dec_outs + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super().train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + def _check_input_divisible(self, x): + h, w = x.shape[-2:] + whole_downsample_rate = 1 + for i in range(1, self.num_stages): + if self.strides[i] == 2 or self.downsamples[i - 1]: + whole_downsample_rate *= 2 + assert (h % whole_downsample_rate == 0) \ + and (w % whole_downsample_rate == 0),\ + f'The input image size {(h, w)} should be divisible by the whole '\ + f'downsample rate {whole_downsample_rate}, when num_stages is '\ + f'{self.num_stages}, strides is {self.strides}, and downsamples '\ + f'is {self.downsamples}.' diff --git a/mmsegmentation/mmseg/models/backbones/vit.py b/mmsegmentation/mmseg/models/backbones/vit.py new file mode 100644 index 0000000..dd0f688 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/vit.py @@ -0,0 +1,501 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings + +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import build_norm_layer +from mmcv.cnn.bricks.transformer import FFN, MultiheadAttention +from mmengine.logging import print_log +from mmengine.model import BaseModule, ModuleList +from mmengine.model.weight_init import (constant_init, kaiming_init, + trunc_normal_) +from mmengine.runner.checkpoint import CheckpointLoader, load_state_dict +from torch.nn.modules.batchnorm import _BatchNorm +from torch.nn.modules.utils import _pair as to_2tuple + +from mmseg.registry import MODELS +from ..utils import PatchEmbed, resize + + +class TransformerEncoderLayer(BaseModule): + """Implements one encoder layer in Vision Transformer. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + drop_rate (float): Probability of an element to be zeroed + after the feed forward layer. Default: 0.0. + attn_drop_rate (float): The drop out rate for attention layer. + Default: 0.0. + drop_path_rate (float): stochastic depth rate. Default 0.0. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + qkv_bias (bool): enable bias for qkv if True. Default: True + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + batch_first (bool): Key, Query and Value are shape of + (batch, n, embed_dim) + or (n, batch, embed_dim). Default: True. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + num_fcs=2, + qkv_bias=True, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + batch_first=True, + attn_cfg=dict(), + ffn_cfg=dict(), + with_cp=False): + super().__init__() + + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, embed_dims, postfix=1) + self.add_module(self.norm1_name, norm1) + + attn_cfg.update( + dict( + embed_dims=embed_dims, + num_heads=num_heads, + attn_drop=attn_drop_rate, + proj_drop=drop_rate, + batch_first=batch_first, + bias=qkv_bias)) + + self.build_attn(attn_cfg) + + self.norm2_name, norm2 = build_norm_layer( + norm_cfg, embed_dims, postfix=2) + self.add_module(self.norm2_name, norm2) + + ffn_cfg.update( + dict( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + num_fcs=num_fcs, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate) + if drop_path_rate > 0 else None, + act_cfg=act_cfg)) + self.build_ffn(ffn_cfg) + self.with_cp = with_cp + + def build_attn(self, attn_cfg): + self.attn = MultiheadAttention(**attn_cfg) + + def build_ffn(self, ffn_cfg): + self.ffn = FFN(**ffn_cfg) + + @property + def norm1(self): + return getattr(self, self.norm1_name) + + @property + def norm2(self): + return getattr(self, self.norm2_name) + + def forward(self, x): + + def _inner_forward(x): + x = self.attn(self.norm1(x), identity=x) + x = self.ffn(self.norm2(x), identity=x) + return x + + if self.with_cp and x.requires_grad: + x = cp.checkpoint(_inner_forward, x) + else: + x = _inner_forward(x) + return x + + +@MODELS.register_module() +class VisionTransformer(BaseModule): + """Vision Transformer. + + This backbone is the implementation of `An Image is Worth 16x16 Words: + Transformers for Image Recognition at + Scale `_. + + Args: + img_size (int | tuple): Input image size. Default: 224. + patch_size (int): The patch size. Default: 16. + patch_pad (str | int | None): The padding method in patch embedding. + Default: 'corner'. + in_channels (int): Number of input channels. Default: 3. + embed_dims (int): embedding dimension. Default: 768. + num_layers (int): depth of transformer. Default: 12. + num_heads (int): number of attention heads. Default: 12. + mlp_ratio (int): ratio of mlp hidden dim to embedding dim. + Default: 4. + out_origin (bool): Whether to output the original input embedding. + Default: False + out_indices (list | tuple | int): Output from which stages. + Default: -1. + qkv_bias (bool): enable bias for qkv if True. Default: True. + drop_rate (float): Probability of an element to be zeroed. + Default 0.0 + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0 + drop_path_rate (float): stochastic depth rate. Default 0.0 + with_cls_token (bool): Whether concatenating class token into image + tokens as transformer input. Default: True. + output_cls_token (bool): Whether output the cls_token. If set True, + `with_cls_token` must be True. Default: False. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + patch_bias (dict): Whether use bias in convolution of PatchEmbed Block. + Default: True. + patch_norm (bool): Whether to add a norm in PatchEmbed Block. + Default: False. + pre_norm (bool): Whether to add a norm before Transformer Layers. + Default: False. + final_norm (bool): Whether to add a additional layer to normalize + final feature map. Default: False. + interpolate_mode (str): Select the interpolate mode for position + embeding vector resize. Default: bicubic. + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. Default: False. + frozen_exclude (List): List of parameters that are not to be frozen. + Default: ["all"], "all" means there are no frozen parameters. + pretrained (str, optional): model pretrained path. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + img_size=224, + patch_size=16, + patch_pad='corner', + in_channels=3, + embed_dims=768, + num_layers=12, + num_heads=12, + mlp_ratio=4, + out_origin=False, + out_indices=-1, + qkv_bias=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + with_cls_token=True, + output_cls_token=False, + norm_cfg=dict(type='LN'), + act_cfg=dict(type='GELU'), + patch_norm=False, + patch_bias=False, + pre_norm=False, + final_norm=False, + interpolate_mode='bicubic', + num_fcs=2, + norm_eval=False, + with_cp=False, + frozen_exclude=['all'], + pretrained=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + if isinstance(img_size, int): + img_size = to_2tuple(img_size) + elif isinstance(img_size, tuple): + if len(img_size) == 1: + img_size = to_2tuple(img_size[0]) + assert len(img_size) == 2, \ + f'The size of image should have length 1 or 2, ' \ + f'but got {len(img_size)}' + + if output_cls_token: + assert with_cls_token is True, f'with_cls_token must be True if' \ + f'set output_cls_token to True, but got {with_cls_token}' + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + + self.img_size = img_size + self.patch_size = patch_size + self.interpolate_mode = interpolate_mode + self.norm_eval = norm_eval + self.with_cp = with_cp + self.pretrained = pretrained + self.out_origin = out_origin + self.frozen_exclude = frozen_exclude + + self.patch_embed = PatchEmbed( + in_channels=in_channels, + embed_dims=embed_dims, + conv_type='Conv2d', + kernel_size=patch_size, + stride=patch_size, + padding=patch_pad, + bias=patch_bias, + norm_cfg=norm_cfg if patch_norm else None, + init_cfg=None, + ) + + num_patches = (img_size[0] // patch_size) * \ + (img_size[1] // patch_size) + + self.with_cls_token = with_cls_token + self.output_cls_token = output_cls_token + self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dims)) + self.pos_embed = nn.Parameter( + torch.zeros(1, num_patches + 1, embed_dims)) + self.drop_after_pos = nn.Dropout(p=drop_rate) + self.pre_norm = pre_norm + + if self.pre_norm: + self.pre_ln_name, pre_ln = build_norm_layer( + norm_cfg, embed_dims, postfix='_pre') + self.add_module(self.pre_ln_name, pre_ln) + + if isinstance(out_indices, int): + if out_indices == -1: + out_indices = num_layers - 1 + self.out_indices = [out_indices] + elif isinstance(out_indices, list) or isinstance(out_indices, tuple): + self.out_indices = out_indices + else: + raise TypeError('out_indices must be type of int, list or tuple') + + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, num_layers) + ] # stochastic depth decay rule + + self.layers = ModuleList() + for i in range(num_layers): + self.layers.append( + TransformerEncoderLayer( + embed_dims=embed_dims, + num_heads=num_heads, + feedforward_channels=mlp_ratio * embed_dims, + attn_drop_rate=attn_drop_rate, + drop_rate=drop_rate, + drop_path_rate=dpr[i], + num_fcs=num_fcs, + qkv_bias=qkv_bias, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + with_cp=with_cp, + batch_first=True)) + + self.final_norm = final_norm + if final_norm: + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, embed_dims, postfix=1) + self.add_module(self.norm1_name, norm1) + + self._freeze() + + @property + def pre_ln(self): + return getattr(self, self.pre_ln_name) + + @property + def norm1(self): + return getattr(self, self.norm1_name) + + def init_weights(self): + if isinstance(self.init_cfg, dict) and \ + self.init_cfg.get('type') in ['Pretrained', 'Pretrained_Part']: + checkpoint = CheckpointLoader.load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + + if self.init_cfg.get('type') == 'Pretrained': + if 'state_dict' in checkpoint: + state_dict = checkpoint['state_dict'] + else: + state_dict = checkpoint + + elif self.init_cfg.get('type') == 'Pretrained_Part': + state_dict = checkpoint.copy() + para_prefix = 'image_encoder' + prefix_len = len(para_prefix) + 1 + for k, v in checkpoint.items(): + state_dict.pop(k) + if para_prefix in k: + state_dict[k[prefix_len:]] = v + + if 'pos_embed' in state_dict.keys(): + if self.pos_embed.shape != state_dict['pos_embed'].shape: + print_log(msg=f'Resize the pos_embed shape from ' + f'{state_dict["pos_embed"].shape} to ' + f'{self.pos_embed.shape}') + h, w = self.img_size + pos_size = int( + math.sqrt(state_dict['pos_embed'].shape[1] - 1)) + state_dict['pos_embed'] = self.resize_pos_embed( + state_dict['pos_embed'], + (h // self.patch_size, w // self.patch_size), + (pos_size, pos_size), self.interpolate_mode) + + load_state_dict(self, state_dict, strict=False, logger=None) + elif self.init_cfg is not None: + super().init_weights() + else: + # We only implement the 'jax_impl' initialization implemented at + # https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py#L353 # noqa: E501 + trunc_normal_(self.pos_embed, std=.02) + trunc_normal_(self.cls_token, std=.02) + for n, m in self.named_modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + if 'ffn' in n: + nn.init.normal_(m.bias, mean=0., std=1e-6) + else: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Conv2d): + kaiming_init(m, mode='fan_in', bias=0.) + elif isinstance(m, (_BatchNorm, nn.GroupNorm, nn.LayerNorm)): + constant_init(m, val=1.0, bias=0.) + + def _freeze(self): + if 'all' in self.frozen_exclude: + return + for name, param in self.named_parameters(): + if not any([exclude in name for exclude in self.frozen_exclude]): + param.requires_grad = False + + def _pos_embeding(self, patched_img, hw_shape, pos_embed): + """Positioning embeding method. + + Resize the pos_embed, if the input image size doesn't match + the training size. + Args: + patched_img (torch.Tensor): The patched image, it should be + shape of [B, L1, C]. + hw_shape (tuple): The downsampled image resolution. + pos_embed (torch.Tensor): The pos_embed weighs, it should be + shape of [B, L2, c]. + Return: + torch.Tensor: The pos encoded image feature. + """ + assert patched_img.ndim == 3 and pos_embed.ndim == 3, \ + 'the shapes of patched_img and pos_embed must be [B, L, C]' + x_len, pos_len = patched_img.shape[1], pos_embed.shape[1] + if x_len != pos_len: + if pos_len == (self.img_size[0] // self.patch_size) * ( + self.img_size[1] // self.patch_size) + 1: + pos_h = self.img_size[0] // self.patch_size + pos_w = self.img_size[1] // self.patch_size + else: + raise ValueError( + 'Unexpected shape of pos_embed, got {}.'.format( + pos_embed.shape)) + pos_embed = self.resize_pos_embed(pos_embed, hw_shape, + (pos_h, pos_w), + self.interpolate_mode) + return self.drop_after_pos(patched_img + pos_embed) + + @staticmethod + def resize_pos_embed(pos_embed, input_shpae, pos_shape, mode): + """Resize pos_embed weights. + + Resize pos_embed using bicubic interpolate method. + Args: + pos_embed (torch.Tensor): Position embedding weights. + input_shpae (tuple): Tuple for (downsampled input image height, + downsampled input image width). + pos_shape (tuple): The resolution of downsampled origin training + image. + mode (str): Algorithm used for upsampling: + ``'nearest'`` | ``'linear'`` | ``'bilinear'`` | ``'bicubic'`` | + ``'trilinear'``. Default: ``'nearest'`` + Return: + torch.Tensor: The resized pos_embed of shape [B, L_new, C] + """ + assert pos_embed.ndim == 3, 'shape of pos_embed must be [B, L, C]' + pos_h, pos_w = pos_shape + cls_token_weight = pos_embed[:, 0] + pos_embed_weight = pos_embed[:, (-1 * pos_h * pos_w):] + pos_embed_weight = pos_embed_weight.reshape( + 1, pos_h, pos_w, pos_embed.shape[2]).permute(0, 3, 1, 2) + pos_embed_weight = resize( + pos_embed_weight, size=input_shpae, align_corners=False, mode=mode) + cls_token_weight = cls_token_weight.unsqueeze(1) + pos_embed_weight = torch.flatten(pos_embed_weight, 2).transpose(1, 2) + pos_embed = torch.cat((cls_token_weight, pos_embed_weight), dim=1) + return pos_embed + + def forward(self, inputs): + B = inputs.shape[0] + + x, hw_shape = self.patch_embed(inputs) + + # stole cls_tokens impl from Phil Wang, thanks + cls_tokens = self.cls_token.expand(B, -1, -1) + x = torch.cat((cls_tokens, x), dim=1) + x = self._pos_embeding(x, hw_shape, self.pos_embed) + + if not self.with_cls_token: + # Remove class token for transformer encoder input + x = x[:, 1:] + + if self.pre_norm: + x = self.pre_ln(x) + + outs = [] + if self.out_origin: + if self.with_cls_token: + # Remove class token and reshape token for decoder head + out = x[:, 1:] + else: + out = x + B, _, C = out.shape + out = out.reshape(B, hw_shape[0], hw_shape[1], + C).permute(0, 3, 1, 2).contiguous() + if self.output_cls_token: + out = [out, x[:, 0]] + outs.append(out) + + for i, layer in enumerate(self.layers): + x = layer(x) + if i == len(self.layers) - 1: + if self.final_norm: + x = self.norm1(x) + if i in self.out_indices: + if self.with_cls_token: + # Remove class token and reshape token for decoder head + out = x[:, 1:] + else: + out = x + B, _, C = out.shape + out = out.reshape(B, hw_shape[0], hw_shape[1], + C).permute(0, 3, 1, 2).contiguous() + if self.output_cls_token: + out = [out, x[:, 0]] + outs.append(out) + + return tuple(outs) + + def train(self, mode=True): + super().train(mode) + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, nn.LayerNorm): + m.eval() diff --git a/mmsegmentation/mmseg/models/backbones/vpd.py b/mmsegmentation/mmseg/models/backbones/vpd.py new file mode 100644 index 0000000..e0536d3 --- /dev/null +++ b/mmsegmentation/mmseg/models/backbones/vpd.py @@ -0,0 +1,395 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# ------------------------------------------------------------------------------ +# Adapted from https://github.com/wl-zhao/VPD/blob/main/vpd/models.py +# Original licence: MIT License +# ------------------------------------------------------------------------------ + +import math +from typing import List, Optional, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import BaseModule +from mmengine.runner import CheckpointLoader, load_checkpoint + +from mmseg.registry import MODELS +from mmseg.utils import ConfigType, OptConfigType + +try: + from ldm.modules.diffusionmodules.util import timestep_embedding + from ldm.util import instantiate_from_config + has_ldm = True +except ImportError: + has_ldm = False + + +def register_attention_control(model, controller): + """Registers a control function to manage attention within a model. + + Args: + model: The model to which attention is to be registered. + controller: The control function responsible for managing attention. + """ + + def ca_forward(self, place_in_unet): + """Custom forward method for attention. + + Args: + self: Reference to the current object. + place_in_unet: The location in UNet (down/mid/up). + + Returns: + The modified forward method. + """ + + def forward(x, context=None, mask=None): + h = self.heads + is_cross = context is not None + context = context or x # if context is None, use x + + q, k, v = self.to_q(x), self.to_k(context), self.to_v(context) + q, k, v = ( + tensor.view(tensor.shape[0] * h, tensor.shape[1], + tensor.shape[2] // h) for tensor in [q, k, v]) + + sim = torch.matmul(q, k.transpose(-2, -1)) * self.scale + + if mask is not None: + mask = mask.flatten(1).unsqueeze(1).repeat(h, 1, 1) + max_neg_value = -torch.finfo(sim.dtype).max + sim.masked_fill_(~mask, max_neg_value) + + attn = sim.softmax(dim=-1) + attn_mean = attn.view(h, attn.shape[0] // h, + *attn.shape[1:]).mean(0) + controller(attn_mean, is_cross, place_in_unet) + + out = torch.matmul(attn, v) + out = out.view(out.shape[0] // h, out.shape[1], out.shape[2] * h) + return self.to_out(out) + + return forward + + def register_recr(net_, count, place_in_unet): + """Recursive function to register the custom forward method to all + CrossAttention layers. + + Args: + net_: The network layer currently being processed. + count: The current count of layers processed. + place_in_unet: The location in UNet (down/mid/up). + + Returns: + The updated count of layers processed. + """ + if net_.__class__.__name__ == 'CrossAttention': + net_.forward = ca_forward(net_, place_in_unet) + return count + 1 + if hasattr(net_, 'children'): + return sum( + register_recr(child, 0, place_in_unet) + for child in net_.children()) + return count + + cross_att_count = sum( + register_recr(net[1], 0, place) for net, place in [ + (child, 'down') if 'input_blocks' in name else ( + child, 'up') if 'output_blocks' in name else + (child, + 'mid') if 'middle_block' in name else (None, None) # Default case + for name, child in model.diffusion_model.named_children() + ] if net is not None) + + controller.num_att_layers = cross_att_count + + +class AttentionStore: + """A class for storing attention information in the UNet model. + + Attributes: + base_size (int): Base size for storing attention information. + max_size (int): Maximum size for storing attention information. + """ + + def __init__(self, base_size=64, max_size=None): + """Initialize AttentionStore with default or custom sizes.""" + self.reset() + self.base_size = base_size + self.max_size = max_size or (base_size // 2) + self.num_att_layers = -1 + + @staticmethod + def get_empty_store(): + """Returns an empty store for holding attention values.""" + return { + key: [] + for key in [ + 'down_cross', 'mid_cross', 'up_cross', 'down_self', 'mid_self', + 'up_self' + ] + } + + def reset(self): + """Resets the step and attention stores to their initial states.""" + self.cur_step = 0 + self.cur_att_layer = 0 + self.step_store = self.get_empty_store() + self.attention_store = {} + + def forward(self, attn, is_cross: bool, place_in_unet: str): + """Processes a single forward step, storing the attention. + + Args: + attn: The attention tensor. + is_cross (bool): Whether it's cross attention. + place_in_unet (str): The location in UNet (down/mid/up). + + Returns: + The unmodified attention tensor. + """ + key = f"{place_in_unet}_{'cross' if is_cross else 'self'}" + if attn.shape[1] <= (self.max_size)**2: + self.step_store[key].append(attn) + return attn + + def between_steps(self): + """Processes and stores attention information between steps.""" + if not self.attention_store: + self.attention_store = self.step_store + else: + for key in self.attention_store: + self.attention_store[key] = [ + stored + step for stored, step in zip( + self.attention_store[key], self.step_store[key]) + ] + self.step_store = self.get_empty_store() + + def get_average_attention(self): + """Calculates and returns the average attention across all steps.""" + return { + key: [item for item in self.step_store[key]] + for key in self.step_store + } + + def __call__(self, attn, is_cross: bool, place_in_unet: str): + """Allows the class instance to be callable.""" + return self.forward(attn, is_cross, place_in_unet) + + @property + def num_uncond_att_layers(self): + """Returns the number of unconditional attention layers (default is + 0).""" + return 0 + + def step_callback(self, x_t): + """A placeholder for a step callback. + + Returns the input unchanged. + """ + return x_t + + +class UNetWrapper(nn.Module): + """A wrapper for UNet with optional attention mechanisms. + + Args: + unet (nn.Module): The UNet model to wrap + use_attn (bool): Whether to use attention. Defaults to True + base_size (int): Base size for the attention store. Defaults to 512 + max_attn_size (int, optional): Maximum size for the attention store. + Defaults to None + attn_selector (str): The types of attention to use. + Defaults to 'up_cross+down_cross' + """ + + def __init__(self, + unet, + use_attn=True, + base_size=512, + max_attn_size=None, + attn_selector='up_cross+down_cross'): + super().__init__() + + assert has_ldm, 'To use UNetWrapper, please install required ' \ + 'packages via `pip install -r requirements/optional.txt`.' + + self.unet = unet + self.attention_store = AttentionStore( + base_size=base_size // 8, max_size=max_attn_size) + self.attn_selector = attn_selector.split('+') + self.use_attn = use_attn + self.init_sizes(base_size) + if self.use_attn: + register_attention_control(unet, self.attention_store) + + def init_sizes(self, base_size): + """Initialize sizes based on the base size.""" + self.size16 = base_size // 32 + self.size32 = base_size // 16 + self.size64 = base_size // 8 + + def forward(self, x, timesteps=None, context=None, y=None, **kwargs): + """Forward pass through the model.""" + diffusion_model = self.unet.diffusion_model + if self.use_attn: + self.attention_store.reset() + hs, emb, out_list = self._unet_forward(x, timesteps, context, y, + diffusion_model) + if self.use_attn: + self._append_attn_to_output(out_list) + return out_list[::-1] + + def _unet_forward(self, x, timesteps, context, y, diffusion_model): + hs = [] + t_emb = timestep_embedding( + timesteps, diffusion_model.model_channels, repeat_only=False) + emb = diffusion_model.time_embed(t_emb) + h = x.type(diffusion_model.dtype) + for module in diffusion_model.input_blocks: + h = module(h, emb, context) + hs.append(h) + h = diffusion_model.middle_block(h, emb, context) + out_list = [] + for i_out, module in enumerate(diffusion_model.output_blocks): + h = torch.cat([h, hs.pop()], dim=1) + h = module(h, emb, context) + if i_out in [1, 4, 7]: + out_list.append(h) + h = h.type(x.dtype) + out_list.append(h) + return hs, emb, out_list + + def _append_attn_to_output(self, out_list): + avg_attn = self.attention_store.get_average_attention() + attns = {self.size16: [], self.size32: [], self.size64: []} + for k in self.attn_selector: + for up_attn in avg_attn[k]: + size = int(math.sqrt(up_attn.shape[1])) + up_attn = up_attn.transpose(-1, -2).reshape( + *up_attn.shape[:2], size, -1) + attns[size].append(up_attn) + attn16 = torch.stack(attns[self.size16]).mean(0) + attn32 = torch.stack(attns[self.size32]).mean(0) + attn64 = torch.stack(attns[self.size64]).mean(0) if len( + attns[self.size64]) > 0 else None + out_list[1] = torch.cat([out_list[1], attn16], dim=1) + out_list[2] = torch.cat([out_list[2], attn32], dim=1) + if attn64 is not None: + out_list[3] = torch.cat([out_list[3], attn64], dim=1) + + +class TextAdapter(nn.Module): + """A PyTorch Module that serves as a text adapter. + + This module takes text embeddings and adjusts them based on a scaling + factor gamma. + """ + + def __init__(self, text_dim=768): + super().__init__() + self.fc = nn.Sequential( + nn.Linear(text_dim, text_dim), nn.GELU(), + nn.Linear(text_dim, text_dim)) + + def forward(self, texts, gamma): + texts_after = self.fc(texts) + texts = texts + gamma * texts_after + return texts + + +@MODELS.register_module() +class VPD(BaseModule): + """VPD (Visual Perception Diffusion) model. + + .. _`VPD`: https://arxiv.org/abs/2303.02153 + + Args: + diffusion_cfg (dict): Configuration for diffusion model. + class_embed_path (str): Path for class embeddings. + unet_cfg (dict, optional): Configuration for U-Net. + gamma (float, optional): Gamma for text adaptation. Defaults to 1e-4. + class_embed_select (bool, optional): If True, enables class embedding + selection. Defaults to False. + pad_shape (Optional[Union[int, List[int]]], optional): Padding shape. + Defaults to None. + pad_val (Union[int, List[int]], optional): Padding value. + Defaults to 0. + init_cfg (dict, optional): Configuration for network initialization. + """ + + def __init__(self, + diffusion_cfg: ConfigType, + class_embed_path: str, + unet_cfg: OptConfigType = dict(), + gamma: float = 1e-4, + class_embed_select=False, + pad_shape: Optional[Union[int, List[int]]] = None, + pad_val: Union[int, List[int]] = 0, + init_cfg: OptConfigType = None): + + super().__init__(init_cfg=init_cfg) + + assert has_ldm, 'To use VPD model, please install required packages' \ + ' via `pip install -r requirements/optional.txt`.' + + if pad_shape is not None: + if not isinstance(pad_shape, (list, tuple)): + pad_shape = (pad_shape, pad_shape) + + self.pad_shape = pad_shape + self.pad_val = pad_val + + # diffusion model + diffusion_checkpoint = diffusion_cfg.pop('checkpoint', None) + sd_model = instantiate_from_config(diffusion_cfg) + if diffusion_checkpoint is not None: + load_checkpoint(sd_model, diffusion_checkpoint, strict=False) + + self.encoder_vq = sd_model.first_stage_model + self.unet = UNetWrapper(sd_model.model, **unet_cfg) + + # class embeddings & text adapter + class_embeddings = CheckpointLoader.load_checkpoint(class_embed_path) + text_dim = class_embeddings.size(-1) + self.text_adapter = TextAdapter(text_dim=text_dim) + self.class_embed_select = class_embed_select + if class_embed_select: + class_embeddings = torch.cat( + (class_embeddings, class_embeddings.mean(dim=0, + keepdims=True)), + dim=0) + self.register_buffer('class_embeddings', class_embeddings) + self.gamma = nn.Parameter(torch.ones(text_dim) * gamma) + + def forward(self, x): + """Extract features from images.""" + + # calculate cross-attn map + if self.class_embed_select: + if isinstance(x, (tuple, list)): + x, class_ids = x[:2] + class_ids = class_ids.tolist() + else: + class_ids = [-1] * x.size(0) + class_embeddings = self.class_embeddings[class_ids] + c_crossattn = self.text_adapter(class_embeddings, self.gamma) + c_crossattn = c_crossattn.unsqueeze(1) + else: + class_embeddings = self.class_embeddings + c_crossattn = self.text_adapter(class_embeddings, self.gamma) + c_crossattn = c_crossattn.unsqueeze(0).repeat(x.size(0), 1, 1) + + # pad to required input shape for pretrained diffusion model + if self.pad_shape is not None: + pad_width = max(0, self.pad_shape[1] - x.shape[-1]) + pad_height = max(0, self.pad_shape[0] - x.shape[-2]) + x = F.pad(x, (0, pad_width, 0, pad_height), value=self.pad_val) + + # forward the denoising model + with torch.no_grad(): + latents = self.encoder_vq.encode(x).mode().detach() + t = torch.ones((x.shape[0], ), device=x.device).long() + outs = self.unet(latents, t, context=c_crossattn) + + return outs diff --git a/mmsegmentation/mmseg/models/builder.py b/mmsegmentation/mmseg/models/builder.py new file mode 100644 index 0000000..081c646 --- /dev/null +++ b/mmsegmentation/mmseg/models/builder.py @@ -0,0 +1,52 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +from mmseg.registry import MODELS + +BACKBONES = MODELS +NECKS = MODELS +HEADS = MODELS +LOSSES = MODELS +SEGMENTORS = MODELS + + +def build_backbone(cfg): + """Build backbone.""" + warnings.warn('``build_backbone`` would be deprecated soon, please use ' + '``mmseg.registry.MODELS.build()`` ') + return BACKBONES.build(cfg) + + +def build_neck(cfg): + """Build neck.""" + warnings.warn('``build_neck`` would be deprecated soon, please use ' + '``mmseg.registry.MODELS.build()`` ') + return NECKS.build(cfg) + + +def build_head(cfg): + """Build head.""" + warnings.warn('``build_head`` would be deprecated soon, please use ' + '``mmseg.registry.MODELS.build()`` ') + return HEADS.build(cfg) + + +def build_loss(cfg): + """Build loss.""" + warnings.warn('``build_loss`` would be deprecated soon, please use ' + '``mmseg.registry.MODELS.build()`` ') + return LOSSES.build(cfg) + + +def build_segmentor(cfg, train_cfg=None, test_cfg=None): + """Build segmentor.""" + if train_cfg is not None or test_cfg is not None: + warnings.warn( + 'train_cfg and test_cfg is deprecated, ' + 'please specify them in model', UserWarning) + assert cfg.get('train_cfg') is None or train_cfg is None, \ + 'train_cfg specified in both outer field and model field ' + assert cfg.get('test_cfg') is None or test_cfg is None, \ + 'test_cfg specified in both outer field and model field ' + return SEGMENTORS.build( + cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg)) diff --git a/mmsegmentation/mmseg/models/data_preprocessor.py b/mmsegmentation/mmseg/models/data_preprocessor.py new file mode 100644 index 0000000..8d32bc6 --- /dev/null +++ b/mmsegmentation/mmseg/models/data_preprocessor.py @@ -0,0 +1,151 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from numbers import Number +from typing import Any, Dict, List, Optional, Sequence + +import torch +from mmengine.model import BaseDataPreprocessor + +from mmseg.registry import MODELS +from mmseg.utils import stack_batch + + +@MODELS.register_module() +class SegDataPreProcessor(BaseDataPreprocessor): + """Image pre-processor for segmentation tasks. + + Comparing with the :class:`mmengine.ImgDataPreprocessor`, + + 1. It won't do normalization if ``mean`` is not specified. + 2. It does normalization and color space conversion after stacking batch. + 3. It supports batch augmentations like mixup and cutmix. + + + It provides the data pre-processing as follows + + - Collate and move data to the target device. + - Pad inputs to the input size with defined ``pad_val``, and pad seg map + with defined ``seg_pad_val``. + - Stack inputs to batch_inputs. + - Convert inputs from bgr to rgb if the shape of input is (3, H, W). + - Normalize image with defined std and mean. + - Do batch augmentations like Mixup and Cutmix during training. + + Args: + mean (Sequence[Number], optional): The pixel mean of R, G, B channels. + Defaults to None. + std (Sequence[Number], optional): The pixel standard deviation of + R, G, B channels. Defaults to None. + size (tuple, optional): Fixed padding size. + size_divisor (int, optional): The divisor of padded size. + pad_val (float, optional): Padding value. Default: 0. + seg_pad_val (float, optional): Padding value of segmentation map. + Default: 255. + padding_mode (str): Type of padding. Default: constant. + - constant: pads with a constant value, this value is specified + with pad_val. + bgr_to_rgb (bool): whether to convert image from BGR to RGB. + Defaults to False. + rgb_to_bgr (bool): whether to convert image from RGB to RGB. + Defaults to False. + batch_augments (list[dict], optional): Batch-level augmentations + test_cfg (dict, optional): The padding size config in testing, if not + specify, will use `size` and `size_divisor` params as default. + Defaults to None, only supports keys `size` or `size_divisor`. + """ + + def __init__( + self, + mean: Sequence[Number] = None, + std: Sequence[Number] = None, + size: Optional[tuple] = None, + size_divisor: Optional[int] = None, + pad_val: Number = 0, + seg_pad_val: Number = 255, + bgr_to_rgb: bool = False, + rgb_to_bgr: bool = False, + batch_augments: Optional[List[dict]] = None, + test_cfg: dict = None, + ): + super().__init__() + self.size = size + self.size_divisor = size_divisor + self.pad_val = pad_val + self.seg_pad_val = seg_pad_val + + assert not (bgr_to_rgb and rgb_to_bgr), ( + '`bgr2rgb` and `rgb2bgr` cannot be set to True at the same time') + self.channel_conversion = rgb_to_bgr or bgr_to_rgb + + if mean is not None: + assert std is not None, 'To enable the normalization in ' \ + 'preprocessing, please specify both ' \ + '`mean` and `std`.' + # Enable the normalization in preprocessing. + self._enable_normalize = True + self.register_buffer('mean', + torch.tensor(mean).view(-1, 1, 1), False) + self.register_buffer('std', + torch.tensor(std).view(-1, 1, 1), False) + else: + self._enable_normalize = False + + # TODO: support batch augmentations. + self.batch_augments = batch_augments + + # Support different padding methods in testing + self.test_cfg = test_cfg + + def forward(self, data: dict, training: bool = False) -> Dict[str, Any]: + """Perform normalizationใ€padding and bgr2rgb conversion based on + ``BaseDataPreprocessor``. + + Args: + data (dict): data sampled from dataloader. + training (bool): Whether to enable training time augmentation. + + Returns: + Dict: Data in the same format as the model input. + """ + data = self.cast_data(data) # type: ignore + inputs = data['inputs'] + data_samples = data.get('data_samples', None) + # TODO: whether normalize should be after stack_batch + if self.channel_conversion and inputs[0].size(0) == 3: + inputs = [_input[[2, 1, 0], ...] for _input in inputs] + + inputs = [_input.float() for _input in inputs] + if self._enable_normalize: + inputs = [(_input - self.mean) / self.std for _input in inputs] + + if training: + assert data_samples is not None, ('During training, ', + '`data_samples` must be define.') + inputs, data_samples = stack_batch( + inputs=inputs, + data_samples=data_samples, + size=self.size, + size_divisor=self.size_divisor, + pad_val=self.pad_val, + seg_pad_val=self.seg_pad_val) + + if self.batch_augments is not None: + inputs, data_samples = self.batch_augments( + inputs, data_samples) + else: + img_size = inputs[0].shape[1:] + assert all(input_.shape[1:] == img_size for input_ in inputs), \ + 'The image size in a batch should be the same.' + # pad images when testing + if self.test_cfg: + inputs, padded_samples = stack_batch( + inputs=inputs, + size=self.test_cfg.get('size', None), + size_divisor=self.test_cfg.get('size_divisor', None), + pad_val=self.pad_val, + seg_pad_val=self.seg_pad_val) + for data_sample, pad_info in zip(data_samples, padded_samples): + data_sample.set_metainfo({**pad_info}) + else: + inputs = torch.stack(inputs, dim=0) + + return dict(inputs=inputs, data_samples=data_samples) diff --git a/mmsegmentation/mmseg/models/decode_heads/__init__.py b/mmsegmentation/mmseg/models/decode_heads/__init__.py new file mode 100644 index 0000000..eef905a --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/__init__.py @@ -0,0 +1,57 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .ann_head import ANNHead +from .apc_head import APCHead +from .aspp_head import ASPPHead +from .cc_head import CCHead +from .da_head import DAHead +from .ddr_head import DDRHead +from .dm_head import DMHead +from .dnl_head import DNLHead +from .dpt_head import DPTHead +from .ema_head import EMAHead +from .enc_head import EncHead +from .fcn_head import FCNHead +from .fpn_head import FPNHead +from .gc_head import GCHead +from .ham_head import LightHamHead +from .isa_head import ISAHead +from .knet_head import IterativeDecodeHead, KernelUpdateHead, KernelUpdator +from .lraspp_head import LRASPPHead +from .mask2former_head import Mask2FormerHead +from .maskformer_head import MaskFormerHead +from .nl_head import NLHead +from .ocr_head import OCRHead +from .pid_head import PIDHead +from .point_head import PointHead +from .psa_head import PSAHead +from .psp_head import PSPHead +from .san_head import SideAdapterCLIPHead +from .segformer_head import SegformerHead +from .segmenter_mask_head import SegmenterMaskTransformerHead +from .sep_aspp_head import DepthwiseSeparableASPPHead +from .sep_fcn_head import DepthwiseSeparableFCNHead +from .setr_mla_head import SETRMLAHead +from .setr_up_head import SETRUPHead +from .stdc_head import STDCHead +from .uper_head import UPerHead +from .vpd_depth_head import VPDDepthHead +from .custom import ( + ASPPHeadWithoutAccuracy, + FCNHeadWithoutAccuracy, + SegformerHeadWithoutAccuracy, + UPerHeadWithoutAccuracy, +) + +__all__ = [ + 'FCNHead', 'PSPHead', 'ASPPHead', 'PSAHead', 'NLHead', 'GCHead', 'CCHead', + 'UPerHead', 'DepthwiseSeparableASPPHead', 'ANNHead', 'DAHead', 'OCRHead', + 'EncHead', 'DepthwiseSeparableFCNHead', 'FPNHead', 'EMAHead', 'DNLHead', + 'PointHead', 'APCHead', 'DMHead', 'LRASPPHead', 'SETRUPHead', + 'SETRMLAHead', 'DPTHead', 'SETRMLAHead', 'SegmenterMaskTransformerHead', + 'SegformerHead', 'ISAHead', 'STDCHead', 'IterativeDecodeHead', + 'KernelUpdateHead', 'KernelUpdator', 'MaskFormerHead', 'Mask2FormerHead', + 'LightHamHead', 'PIDHead', 'DDRHead', 'VPDDepthHead', 'SideAdapterCLIPHead', "ASPPHeadWithoutAccuracy", + "FCNHeadWithoutAccuracy", + "SegformerHeadWithoutAccuracy", + "UPerHeadWithoutAccuracy", +] diff --git a/mmsegmentation/mmseg/models/decode_heads/ann_head.py b/mmsegmentation/mmseg/models/decode_heads/ann_head.py new file mode 100644 index 0000000..2b40ef5 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/ann_head.py @@ -0,0 +1,245 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class PPMConcat(nn.ModuleList): + """Pyramid Pooling Module that only concat the features of each layer. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. + """ + + def __init__(self, pool_scales=(1, 3, 6, 8)): + super().__init__( + [nn.AdaptiveAvgPool2d(pool_scale) for pool_scale in pool_scales]) + + def forward(self, feats): + """Forward function.""" + ppm_outs = [] + for ppm in self: + ppm_out = ppm(feats) + ppm_outs.append(ppm_out.view(*feats.shape[:2], -1)) + concat_outs = torch.cat(ppm_outs, dim=2) + return concat_outs + + +class SelfAttentionBlock(_SelfAttentionBlock): + """Make a ANN used SelfAttentionBlock. + + Args: + low_in_channels (int): Input channels of lower level feature, + which is the key feature for self-attention. + high_in_channels (int): Input channels of higher level feature, + which is the query feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + share_key_query (bool): Whether share projection weight between key + and query projection. + query_scale (int): The scale of query feature map. + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, low_in_channels, high_in_channels, channels, + out_channels, share_key_query, query_scale, key_pool_scales, + conv_cfg, norm_cfg, act_cfg): + key_psp = PPMConcat(key_pool_scales) + if query_scale > 1: + query_downsample = nn.MaxPool2d(kernel_size=query_scale) + else: + query_downsample = None + super().__init__( + key_in_channels=low_in_channels, + query_in_channels=high_in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=share_key_query, + query_downsample=query_downsample, + key_downsample=key_psp, + key_query_num_convs=1, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + +class AFNB(nn.Module): + """Asymmetric Fusion Non-local Block(AFNB) + + Args: + low_in_channels (int): Input channels of lower level feature, + which is the key feature for self-attention. + high_in_channels (int): Input channels of higher level feature, + which is the query feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + and query projection. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, low_in_channels, high_in_channels, channels, + out_channels, query_scales, key_pool_scales, conv_cfg, + norm_cfg, act_cfg): + super().__init__() + self.stages = nn.ModuleList() + for query_scale in query_scales: + self.stages.append( + SelfAttentionBlock( + low_in_channels=low_in_channels, + high_in_channels=high_in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=False, + query_scale=query_scale, + key_pool_scales=key_pool_scales, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottleneck = ConvModule( + out_channels + high_in_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, low_feats, high_feats): + """Forward function.""" + priors = [stage(high_feats, low_feats) for stage in self.stages] + context = torch.stack(priors, dim=0).sum(dim=0) + output = self.bottleneck(torch.cat([context, high_feats], 1)) + return output + + +class APNB(nn.Module): + """Asymmetric Pyramid Non-local Block (APNB) + + Args: + in_channels (int): Input channels of key/query feature, + which is the key feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, in_channels, channels, out_channels, query_scales, + key_pool_scales, conv_cfg, norm_cfg, act_cfg): + super().__init__() + self.stages = nn.ModuleList() + for query_scale in query_scales: + self.stages.append( + SelfAttentionBlock( + low_in_channels=in_channels, + high_in_channels=in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=True, + query_scale=query_scale, + key_pool_scales=key_pool_scales, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottleneck = ConvModule( + 2 * in_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, feats): + """Forward function.""" + priors = [stage(feats, feats) for stage in self.stages] + context = torch.stack(priors, dim=0).sum(dim=0) + output = self.bottleneck(torch.cat([context, feats], 1)) + return output + + +@MODELS.register_module() +class ANNHead(BaseDecodeHead): + """Asymmetric Non-local Neural Networks for Semantic Segmentation. + + This head is the implementation of `ANNNet + `_. + + Args: + project_channels (int): Projection channels for Nonlocal. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): The pooling scales of key feature map. + Default: (1, 3, 6, 8). + """ + + def __init__(self, + project_channels, + query_scales=(1, ), + key_pool_scales=(1, 3, 6, 8), + **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + assert len(self.in_channels) == 2 + low_in_channels, high_in_channels = self.in_channels + self.project_channels = project_channels + self.fusion = AFNB( + low_in_channels=low_in_channels, + high_in_channels=high_in_channels, + out_channels=high_in_channels, + channels=project_channels, + query_scales=query_scales, + key_pool_scales=key_pool_scales, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + high_in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.context = APNB( + in_channels=self.channels, + out_channels=self.channels, + channels=project_channels, + query_scales=query_scales, + key_pool_scales=key_pool_scales, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + low_feats, high_feats = self._transform_inputs(inputs) + output = self.fusion(low_feats, high_feats) + output = self.dropout(output) + output = self.bottleneck(output) + output = self.context(output) + output = self.cls_seg(output) + + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/apc_head.py b/mmsegmentation/mmseg/models/decode_heads/apc_head.py new file mode 100644 index 0000000..728f396 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/apc_head.py @@ -0,0 +1,159 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + + +class ACM(nn.Module): + """Adaptive Context Module used in APCNet. + + Args: + pool_scale (int): Pooling scale used in Adaptive Context + Module to extract region features. + fusion (bool): Add one conv to fuse residual feature. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, pool_scale, fusion, in_channels, channels, conv_cfg, + norm_cfg, act_cfg): + super().__init__() + self.pool_scale = pool_scale + self.fusion = fusion + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.pooled_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.input_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.global_info = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.gla = nn.Conv2d(self.channels, self.pool_scale**2, 1, 1, 0) + + self.residual_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + if self.fusion: + self.fusion_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, x): + """Forward function.""" + pooled_x = F.adaptive_avg_pool2d(x, self.pool_scale) + # [batch_size, channels, h, w] + x = self.input_redu_conv(x) + # [batch_size, channels, pool_scale, pool_scale] + pooled_x = self.pooled_redu_conv(pooled_x) + batch_size = x.size(0) + # [batch_size, pool_scale * pool_scale, channels] + pooled_x = pooled_x.view(batch_size, self.channels, + -1).permute(0, 2, 1).contiguous() + # [batch_size, h * w, pool_scale * pool_scale] + affinity_matrix = self.gla(x + resize( + self.global_info(F.adaptive_avg_pool2d(x, 1)), size=x.shape[2:]) + ).permute(0, 2, 3, 1).reshape( + batch_size, -1, self.pool_scale**2) + affinity_matrix = F.sigmoid(affinity_matrix) + # [batch_size, h * w, channels] + z_out = torch.matmul(affinity_matrix, pooled_x) + # [batch_size, channels, h * w] + z_out = z_out.permute(0, 2, 1).contiguous() + # [batch_size, channels, h, w] + z_out = z_out.view(batch_size, self.channels, x.size(2), x.size(3)) + z_out = self.residual_conv(z_out) + z_out = F.relu(z_out + x) + if self.fusion: + z_out = self.fusion_conv(z_out) + + return z_out + + +@MODELS.register_module() +class APCHead(BaseDecodeHead): + """Adaptive Pyramid Context Network for Semantic Segmentation. + + This head is the implementation of + `APCNet `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Adaptive Context + Module. Default: (1, 2, 3, 6). + fusion (bool): Add one conv to fuse residual feature. + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), fusion=True, **kwargs): + super().__init__(**kwargs) + assert isinstance(pool_scales, (list, tuple)) + self.pool_scales = pool_scales + self.fusion = fusion + acm_modules = [] + for pool_scale in self.pool_scales: + acm_modules.append( + ACM(pool_scale, + self.fusion, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.acm_modules = nn.ModuleList(acm_modules) + self.bottleneck = ConvModule( + self.in_channels + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + acm_outs = [x] + for acm_module in self.acm_modules: + acm_outs.append(acm_module(x)) + acm_outs = torch.cat(acm_outs, dim=1) + output = self.bottleneck(acm_outs) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/aspp_head.py b/mmsegmentation/mmseg/models/decode_heads/aspp_head.py new file mode 100644 index 0000000..6d7185d --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/aspp_head.py @@ -0,0 +1,122 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + + +class ASPPModule(nn.ModuleList): + """Atrous Spatial Pyramid Pooling (ASPP) Module. + + Args: + dilations (tuple[int]): Dilation rate of each layer. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, dilations, in_channels, channels, conv_cfg, norm_cfg, + act_cfg): + super().__init__() + self.dilations = dilations + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + for dilation in dilations: + self.append( + ConvModule( + self.in_channels, + self.channels, + 1 if dilation == 1 else 3, + dilation=dilation, + padding=0 if dilation == 1 else dilation, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def forward(self, x): + """Forward function.""" + aspp_outs = [] + for aspp_module in self: + aspp_outs.append(aspp_module(x)) + + return aspp_outs + + +@MODELS.register_module() +class ASPPHead(BaseDecodeHead): + """Rethinking Atrous Convolution for Semantic Image Segmentation. + + This head is the implementation of `DeepLabV3 + `_. + + Args: + dilations (tuple[int]): Dilation rates for ASPP module. + Default: (1, 6, 12, 18). + """ + + def __init__(self, dilations=(1, 6, 12, 18), **kwargs): + super().__init__(**kwargs) + assert isinstance(dilations, (list, tuple)) + self.dilations = dilations + self.image_pool = nn.Sequential( + nn.AdaptiveAvgPool2d(1), + ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.aspp_modules = ASPPModule( + dilations, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + (len(dilations) + 1) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def _forward_feature(self, inputs): + """Forward function for feature maps before classifying each pixel with + ``self.cls_seg`` fc. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + feats (Tensor): A tensor of shape (batch_size, self.channels, + H, W) which is feature map for last layer of decoder head. + """ + x = self._transform_inputs(inputs) + aspp_outs = [ + resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ] + aspp_outs.extend(self.aspp_modules(x)) + aspp_outs = torch.cat(aspp_outs, dim=1) + feats = self.bottleneck(aspp_outs) + return feats + + def forward(self, inputs): + """Forward function.""" + output = self._forward_feature(inputs) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/cascade_decode_head.py b/mmsegmentation/mmseg/models/decode_heads/cascade_decode_head.py new file mode 100644 index 0000000..fe2bcb9 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/cascade_decode_head.py @@ -0,0 +1,62 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod +from typing import List + +from torch import Tensor + +from mmseg.utils import ConfigType +from .decode_head import BaseDecodeHead + + +class BaseCascadeDecodeHead(BaseDecodeHead, metaclass=ABCMeta): + """Base class for cascade decode head used in + :class:`CascadeEncoderDecoder.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @abstractmethod + def forward(self, inputs, prev_output): + """Placeholder of forward function.""" + pass + + def loss(self, inputs: List[Tensor], prev_output: Tensor, + batch_data_samples: List[dict], train_cfg: ConfigType) -> Tensor: + """Forward function for training. + + Args: + inputs (List[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + batch_data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logits = self.forward(inputs, prev_output) + losses = self.loss_by_feat(seg_logits, batch_data_samples) + + return losses + + def predict(self, inputs: List[Tensor], prev_output: Tensor, + batch_img_metas: List[dict], tese_cfg: ConfigType): + """Forward function for testing. + + Args: + inputs (List[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + batch_img_metas (dict): List Image info where each dict may also + contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + seg_logits = self.forward(inputs, prev_output) + + return self.predict_by_feat(seg_logits, batch_img_metas) diff --git a/mmsegmentation/mmseg/models/decode_heads/cc_head.py b/mmsegmentation/mmseg/models/decode_heads/cc_head.py new file mode 100644 index 0000000..e9075a2 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/cc_head.py @@ -0,0 +1,43 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmseg.registry import MODELS +from .fcn_head import FCNHead + +try: + from mmcv.ops import CrissCrossAttention +except ModuleNotFoundError: + CrissCrossAttention = None + + +@MODELS.register_module() +class CCHead(FCNHead): + """CCNet: Criss-Cross Attention for Semantic Segmentation. + + This head is the implementation of `CCNet + `_. + + Args: + recurrence (int): Number of recurrence of Criss Cross Attention + module. Default: 2. + """ + + def __init__(self, recurrence=2, **kwargs): + if CrissCrossAttention is None: + raise RuntimeError('Please install mmcv-full for ' + 'CrissCrossAttention ops') + super().__init__(num_convs=2, **kwargs) + self.recurrence = recurrence + self.cca = CrissCrossAttention(self.channels) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + for _ in range(self.recurrence): + output = self.cca(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/custom.py b/mmsegmentation/mmseg/models/decode_heads/custom.py new file mode 100644 index 0000000..8995296 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/custom.py @@ -0,0 +1,74 @@ +from torch import nn + +from mmseg.registry import MODELS +from mmseg.models.utils.wrappers import resize +from mmseg.models.decode_heads import ASPPHead, FCNHead, SegformerHead, UPerHead + + +class LossByFeatMixIn: + def loss_by_feat(self, seg_logits, batch_data_samples) -> dict: + """Compute segmentation loss. + + Args: + seg_logits (Tensor): The output from decode head forward function. + batch_data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + seg_label = self._stack_batch_gt(batch_data_samples) + loss = dict() + seg_logits = resize( + input=seg_logits, + size=seg_label.shape[2:], + mode="bilinear", + align_corners=self.align_corners, + ) + if self.sampler is not None: + seg_weight = self.sampler.sample(seg_logits, seg_label) + else: + seg_weight = None + + if not isinstance(self.loss_decode, nn.ModuleList): + losses_decode = [self.loss_decode] + else: + losses_decode = self.loss_decode + for loss_decode in losses_decode: + if loss_decode.loss_name not in loss: + loss[loss_decode.loss_name] = loss_decode( + seg_logits, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index, + ) + else: + loss[loss_decode.loss_name] += loss_decode( + seg_logits, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index, + ) + + return loss + + +@MODELS.register_module() +class ASPPHeadWithoutAccuracy(LossByFeatMixIn, ASPPHead): + pass + + +@MODELS.register_module() +class FCNHeadWithoutAccuracy(LossByFeatMixIn, FCNHead): + pass + + +@MODELS.register_module() +class SegformerHeadWithoutAccuracy(LossByFeatMixIn, SegformerHead): + pass + +@MODELS.register_module() +class UPerHeadWithoutAccuracy(LossByFeatMixIn, UPerHead): + pass \ No newline at end of file diff --git a/mmsegmentation/mmseg/models/decode_heads/da_head.py b/mmsegmentation/mmseg/models/decode_heads/da_head.py new file mode 100644 index 0000000..d872143 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/da_head.py @@ -0,0 +1,184 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +import torch.nn.functional as F +from mmcv.cnn import ConvModule, Scale +from torch import Tensor, nn + +from mmseg.registry import MODELS +from mmseg.utils import SampleList, add_prefix +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class PAM(_SelfAttentionBlock): + """Position Attention Module (PAM) + + Args: + in_channels (int): Input channels of key/query feature. + channels (int): Output channels of key/query transform. + """ + + def __init__(self, in_channels, channels): + super().__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=None, + key_downsample=None, + key_query_num_convs=1, + key_query_norm=False, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=False, + with_out=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None) + + self.gamma = Scale(0) + + def forward(self, x): + """Forward function.""" + out = super().forward(x, x) + + out = self.gamma(out) + x + return out + + +class CAM(nn.Module): + """Channel Attention Module (CAM)""" + + def __init__(self): + super().__init__() + self.gamma = Scale(0) + + def forward(self, x): + """Forward function.""" + batch_size, channels, height, width = x.size() + proj_query = x.view(batch_size, channels, -1) + proj_key = x.view(batch_size, channels, -1).permute(0, 2, 1) + energy = torch.bmm(proj_query, proj_key) + energy_new = torch.max( + energy, -1, keepdim=True)[0].expand_as(energy) - energy + attention = F.softmax(energy_new, dim=-1) + proj_value = x.view(batch_size, channels, -1) + + out = torch.bmm(attention, proj_value) + out = out.view(batch_size, channels, height, width) + + out = self.gamma(out) + x + return out + + +@MODELS.register_module() +class DAHead(BaseDecodeHead): + """Dual Attention Network for Scene Segmentation. + + This head is the implementation of `DANet + `_. + + Args: + pam_channels (int): The channels of Position Attention Module(PAM). + """ + + def __init__(self, pam_channels, **kwargs): + super().__init__(**kwargs) + self.pam_channels = pam_channels + self.pam_in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.pam = PAM(self.channels, pam_channels) + self.pam_out_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.pam_conv_seg = nn.Conv2d( + self.channels, self.num_classes, kernel_size=1) + + self.cam_in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.cam = CAM() + self.cam_out_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.cam_conv_seg = nn.Conv2d( + self.channels, self.num_classes, kernel_size=1) + + def pam_cls_seg(self, feat): + """PAM feature classification.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.pam_conv_seg(feat) + return output + + def cam_cls_seg(self, feat): + """CAM feature classification.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.cam_conv_seg(feat) + return output + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + pam_feat = self.pam_in_conv(x) + pam_feat = self.pam(pam_feat) + pam_feat = self.pam_out_conv(pam_feat) + pam_out = self.pam_cls_seg(pam_feat) + + cam_feat = self.cam_in_conv(x) + cam_feat = self.cam(cam_feat) + cam_feat = self.cam_out_conv(cam_feat) + cam_out = self.cam_cls_seg(cam_feat) + + feat_sum = pam_feat + cam_feat + pam_cam_out = self.cls_seg(feat_sum) + + return pam_cam_out, pam_out, cam_out + + def predict(self, inputs, batch_img_metas: List[dict], test_cfg, + **kwargs) -> List[Tensor]: + """Forward function for testing, only ``pam_cam`` is used.""" + seg_logits = self.forward(inputs)[0] + return self.predict_by_feat(seg_logits, batch_img_metas, **kwargs) + + def loss_by_feat(self, seg_logit: Tuple[Tensor], + batch_data_samples: SampleList, **kwargs) -> dict: + """Compute ``pam_cam``, ``pam``, ``cam`` loss.""" + pam_cam_seg_logit, pam_seg_logit, cam_seg_logit = seg_logit + loss = dict() + loss.update( + add_prefix( + super().loss_by_feat(pam_cam_seg_logit, batch_data_samples), + 'pam_cam')) + loss.update( + add_prefix(super().loss_by_feat(pam_seg_logit, batch_data_samples), + 'pam')) + loss.update( + add_prefix(super().loss_by_feat(cam_seg_logit, batch_data_samples), + 'cam')) + return loss diff --git a/mmsegmentation/mmseg/models/decode_heads/ddr_head.py b/mmsegmentation/mmseg/models/decode_heads/ddr_head.py new file mode 100644 index 0000000..ba26d65 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/ddr_head.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple, Union + +import torch.nn as nn +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer +from torch import Tensor + +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.models.losses import accuracy +from mmseg.models.utils import resize +from mmseg.registry import MODELS +from mmseg.utils import OptConfigType, SampleList + + +@MODELS.register_module() +class DDRHead(BaseDecodeHead): + """Decode head for DDRNet. + + Args: + in_channels (int): Number of input channels. + channels (int): Number of output channels. + num_classes (int): Number of classes. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict, optional): Config dict for activation layer. + Default: dict(type='ReLU', inplace=True). + """ + + def __init__(self, + in_channels: int, + channels: int, + num_classes: int, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + **kwargs): + super().__init__( + in_channels, + channels, + num_classes=num_classes, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **kwargs) + + self.head = self._make_base_head(self.in_channels, self.channels) + self.aux_head = self._make_base_head(self.in_channels // 2, + self.channels) + self.aux_cls_seg = nn.Conv2d( + self.channels, self.out_channels, kernel_size=1) + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_( + m.weight, mode='fan_out', nonlinearity='relu') + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + def forward( + self, + inputs: Union[Tensor, + Tuple[Tensor]]) -> Union[Tensor, Tuple[Tensor]]: + if self.training: + c3_feat, c5_feat = inputs + x_c = self.head(c5_feat) + x_c = self.cls_seg(x_c) + x_s = self.aux_head(c3_feat) + x_s = self.aux_cls_seg(x_s) + + return x_c, x_s + else: + x_c = self.head(inputs) + x_c = self.cls_seg(x_c) + return x_c + + def _make_base_head(self, in_channels: int, + channels: int) -> nn.Sequential: + layers = [ + ConvModule( + in_channels, + channels, + kernel_size=3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + order=('norm', 'act', 'conv')), + build_norm_layer(self.norm_cfg, channels)[1], + build_activation_layer(self.act_cfg), + ] + + return nn.Sequential(*layers) + + def loss_by_feat(self, seg_logits: Tuple[Tensor], + batch_data_samples: SampleList) -> dict: + loss = dict() + context_logit, spatial_logit = seg_logits + seg_label = self._stack_batch_gt(batch_data_samples) + + context_logit = resize( + context_logit, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + spatial_logit = resize( + spatial_logit, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + seg_label = seg_label.squeeze(1) + + loss['loss_context'] = self.loss_decode[0](context_logit, seg_label) + loss['loss_spatial'] = self.loss_decode[1](spatial_logit, seg_label) + loss['acc_seg'] = accuracy( + context_logit, seg_label, ignore_index=self.ignore_index) + + return loss diff --git a/mmsegmentation/mmseg/models/decode_heads/decode_head.py b/mmsegmentation/mmseg/models/decode_heads/decode_head.py new file mode 100644 index 0000000..fd53afe --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/decode_head.py @@ -0,0 +1,366 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from abc import ABCMeta, abstractmethod +from typing import List, Tuple + +import torch +import torch.nn as nn +from mmengine.model import BaseModule +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.structures import build_pixel_sampler +from mmseg.utils import ConfigType, SampleList +from ..losses import accuracy +from ..utils import resize + + +class BaseDecodeHead(BaseModule, metaclass=ABCMeta): + """Base class for BaseDecodeHead. + + 1. The ``init_weights`` method is used to initialize decode_head's + model parameters. After segmentor initialization, ``init_weights`` + is triggered when ``segmentor.init_weights()`` is called externally. + + 2. The ``loss`` method is used to calculate the loss of decode_head, + which includes two steps: (1) the decode_head model performs forward + propagation to obtain the feature maps (2) The ``loss_by_feat`` method + is called based on the feature maps to calculate the loss. + + .. code:: text + + loss(): forward() -> loss_by_feat() + + 3. The ``predict`` method is used to predict segmentation results, + which includes two steps: (1) the decode_head model performs forward + propagation to obtain the feature maps (2) The ``predict_by_feat`` method + is called based on the feature maps to predict segmentation results + including post-processing. + + .. code:: text + + predict(): forward() -> predict_by_feat() + + Args: + in_channels (int|Sequence[int]): Input channels. + channels (int): Channels after modules, before conv_seg. + num_classes (int): Number of classes. + out_channels (int): Output channels of conv_seg. Default: None. + threshold (float): Threshold for binary segmentation in the case of + `num_classes==1`. Default: None. + dropout_ratio (float): Ratio of dropout layer. Default: 0.1. + conv_cfg (dict|None): Config of conv layers. Default: None. + norm_cfg (dict|None): Config of norm layers. Default: None. + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU') + in_index (int|Sequence[int]): Input feature index. Default: -1 + input_transform (str|None): Transformation type of input features. + Options: 'resize_concat', 'multiple_select', None. + 'resize_concat': Multiple feature maps will be resize to the + same size as first one and than concat together. + Usually used in FCN head of HRNet. + 'multiple_select': Multiple feature maps will be bundle into + a list and passed into decode head. + None: Only one select feature map is allowed. + Default: None. + loss_decode (dict | Sequence[dict]): Config of decode loss. + The `loss_name` is property of corresponding loss function which + could be shown in training log. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_ce'. + e.g. dict(type='CrossEntropyLoss'), + [dict(type='CrossEntropyLoss', loss_name='loss_ce'), + dict(type='DiceLoss', loss_name='loss_dice')] + Default: dict(type='CrossEntropyLoss'). + ignore_index (int | None): The label index to be ignored. When using + masked BCE loss, ignore_index should be set to None. Default: 255. + sampler (dict|None): The config of segmentation map sampler. + Default: None. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + channels, + *, + num_classes, + out_channels=None, + threshold=None, + dropout_ratio=0.1, + conv_cfg=None, + norm_cfg=None, + act_cfg=dict(type='ReLU'), + in_index=-1, + input_transform=None, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + ignore_index=255, + sampler=None, + align_corners=False, + init_cfg=dict( + type='Normal', std=0.01, override=dict(name='conv_seg'))): + super().__init__(init_cfg) + self._init_inputs(in_channels, in_index, input_transform) + self.channels = channels + self.dropout_ratio = dropout_ratio + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.in_index = in_index + + self.ignore_index = ignore_index + self.align_corners = align_corners + + if out_channels is None: + if num_classes == 2: + warnings.warn('For binary segmentation, we suggest using' + '`out_channels = 1` to define the output' + 'channels of segmentor, and use `threshold`' + 'to convert `seg_logits` into a prediction' + 'applying a threshold') + out_channels = num_classes + + if out_channels != num_classes and out_channels != 1: + raise ValueError( + 'out_channels should be equal to num_classes,' + 'except binary segmentation set out_channels == 1 and' + f'num_classes == 2, but got out_channels={out_channels}' + f'and num_classes={num_classes}') + + if out_channels == 1 and threshold is None: + threshold = 0.3 + warnings.warn('threshold is not defined for binary, and defaults' + 'to 0.3') + self.num_classes = num_classes + self.out_channels = out_channels + self.threshold = threshold + + if isinstance(loss_decode, dict): + self.loss_decode = MODELS.build(loss_decode) + elif isinstance(loss_decode, (list, tuple)): + self.loss_decode = nn.ModuleList() + for loss in loss_decode: + self.loss_decode.append(MODELS.build(loss)) + else: + raise TypeError(f'loss_decode must be a dict or sequence of dict,\ + but got {type(loss_decode)}') + + if sampler is not None: + self.sampler = build_pixel_sampler(sampler, context=self) + else: + self.sampler = None + + self.conv_seg = nn.Conv2d(channels, self.out_channels, kernel_size=1) + if dropout_ratio > 0: + self.dropout = nn.Dropout2d(dropout_ratio) + else: + self.dropout = None + + def extra_repr(self): + """Extra repr.""" + s = f'input_transform={self.input_transform}, ' \ + f'ignore_index={self.ignore_index}, ' \ + f'align_corners={self.align_corners}' + return s + + def _init_inputs(self, in_channels, in_index, input_transform): + """Check and initialize input transforms. + + The in_channels, in_index and input_transform must match. + Specifically, when input_transform is None, only single feature map + will be selected. So in_channels and in_index must be of type int. + When input_transform + + Args: + in_channels (int|Sequence[int]): Input channels. + in_index (int|Sequence[int]): Input feature index. + input_transform (str|None): Transformation type of input features. + Options: 'resize_concat', 'multiple_select', None. + 'resize_concat': Multiple feature maps will be resize to the + same size as first one and than concat together. + Usually used in FCN head of HRNet. + 'multiple_select': Multiple feature maps will be bundle into + a list and passed into decode head. + None: Only one select feature map is allowed. + """ + + if input_transform is not None: + assert input_transform in ['resize_concat', 'multiple_select'] + self.input_transform = input_transform + self.in_index = in_index + if input_transform is not None: + assert isinstance(in_channels, (list, tuple)) + assert isinstance(in_index, (list, tuple)) + assert len(in_channels) == len(in_index) + if input_transform == 'resize_concat': + self.in_channels = sum(in_channels) + else: + self.in_channels = in_channels + else: + assert isinstance(in_channels, int) + assert isinstance(in_index, int) + self.in_channels = in_channels + + def _transform_inputs(self, inputs): + """Transform inputs for decoder. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + Tensor: The transformed inputs + """ + + if self.input_transform == 'resize_concat': + inputs = [inputs[i] for i in self.in_index] + upsampled_inputs = [ + resize( + input=x, + size=inputs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) for x in inputs + ] + inputs = torch.cat(upsampled_inputs, dim=1) + elif self.input_transform == 'multiple_select': + inputs = [inputs[i] for i in self.in_index] + else: + inputs = inputs[self.in_index] + + return inputs + + @abstractmethod + def forward(self, inputs): + """Placeholder of forward function.""" + pass + + def cls_seg(self, feat): + """Classify each pixel.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.conv_seg(feat) + return output + + def loss(self, inputs: Tuple[Tensor], batch_data_samples: SampleList, + train_cfg: ConfigType) -> dict: + """Forward function for training. + + Args: + inputs (Tuple[Tensor]): List of multi-level img features. + batch_data_samples (list[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `img_metas` or `gt_semantic_seg`. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logits = self.forward(inputs) + losses = self.loss_by_feat(seg_logits, batch_data_samples) + return losses + + def predict(self, inputs: Tuple[Tensor], batch_img_metas: List[dict], + test_cfg: ConfigType) -> Tensor: + """Forward function for prediction. + + Args: + inputs (Tuple[Tensor]): List of multi-level img features. + batch_img_metas (dict): List Image info where each dict may also + contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Outputs segmentation logits map. + """ + seg_logits = self.forward(inputs) + + return self.predict_by_feat(seg_logits, batch_img_metas) + + def _stack_batch_gt(self, batch_data_samples: SampleList) -> Tensor: + gt_semantic_segs = [ + data_sample.gt_sem_seg.data for data_sample in batch_data_samples + ] + return torch.stack(gt_semantic_segs, dim=0) + + def loss_by_feat(self, seg_logits: Tensor, + batch_data_samples: SampleList) -> dict: + """Compute segmentation loss. + + Args: + seg_logits (Tensor): The output from decode head forward function. + batch_data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + seg_label = self._stack_batch_gt(batch_data_samples) + loss = dict() + seg_logits = resize( + input=seg_logits, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + if self.sampler is not None: + seg_weight = self.sampler.sample(seg_logits, seg_label) + else: + seg_weight = None + seg_label = seg_label.squeeze(1) + + if not isinstance(self.loss_decode, nn.ModuleList): + losses_decode = [self.loss_decode] + else: + losses_decode = self.loss_decode + for loss_decode in losses_decode: + if loss_decode.loss_name not in loss: + loss[loss_decode.loss_name] = loss_decode( + seg_logits, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index) + else: + loss[loss_decode.loss_name] += loss_decode( + seg_logits, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index) + + loss['acc_seg'] = accuracy( + seg_logits, seg_label, ignore_index=self.ignore_index) + return loss + + def predict_by_feat(self, seg_logits: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Transform a batch of output seg_logits to the input shape. + + Args: + seg_logits (Tensor): The output from decode head forward function. + batch_img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + + Returns: + Tensor: Outputs segmentation logits map. + """ + + if isinstance(batch_img_metas[0]['img_shape'], torch.Size): + # slide inference + size = batch_img_metas[0]['img_shape'] + elif 'pad_shape' in batch_img_metas[0]: + size = batch_img_metas[0]['pad_shape'][:2] + else: + size = batch_img_metas[0]['img_shape'] + + seg_logits = resize( + input=seg_logits, + size=size, + mode='bilinear', + align_corners=self.align_corners) + return seg_logits diff --git a/mmsegmentation/mmseg/models/decode_heads/dm_head.py b/mmsegmentation/mmseg/models/decode_heads/dm_head.py new file mode 100644 index 0000000..7694abd --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/dm_head.py @@ -0,0 +1,141 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer + +from mmseg.registry import MODELS +from .decode_head import BaseDecodeHead + + +class DCM(nn.Module): + """Dynamic Convolutional Module used in DMNet. + + Args: + filter_size (int): The filter size of generated convolution kernel + used in Dynamic Convolutional Module. + fusion (bool): Add one conv to fuse DCM output feature. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, filter_size, fusion, in_channels, channels, conv_cfg, + norm_cfg, act_cfg): + super().__init__() + self.filter_size = filter_size + self.fusion = fusion + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.filter_gen_conv = nn.Conv2d(self.in_channels, self.channels, 1, 1, + 0) + + self.input_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + if self.norm_cfg is not None: + self.norm = build_norm_layer(self.norm_cfg, self.channels)[1] + else: + self.norm = None + self.activate = build_activation_layer(self.act_cfg) + + if self.fusion: + self.fusion_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, x): + """Forward function.""" + generated_filter = self.filter_gen_conv( + F.adaptive_avg_pool2d(x, self.filter_size)) + x = self.input_redu_conv(x) + b, c, h, w = x.shape + # [1, b * c, h, w], c = self.channels + x = x.view(1, b * c, h, w) + # [b * c, 1, filter_size, filter_size] + generated_filter = generated_filter.view(b * c, 1, self.filter_size, + self.filter_size) + pad = (self.filter_size - 1) // 2 + if (self.filter_size - 1) % 2 == 0: + p2d = (pad, pad, pad, pad) + else: + p2d = (pad + 1, pad, pad + 1, pad) + x = F.pad(input=x, pad=p2d, mode='constant', value=0) + # [1, b * c, h, w] + output = F.conv2d(input=x, weight=generated_filter, groups=b * c) + # [b, c, h, w] + output = output.view(b, c, h, w) + if self.norm is not None: + output = self.norm(output) + output = self.activate(output) + + if self.fusion: + output = self.fusion_conv(output) + + return output + + +@MODELS.register_module() +class DMHead(BaseDecodeHead): + """Dynamic Multi-scale Filters for Semantic Segmentation. + + This head is the implementation of + `DMNet `_. + + Args: + filter_sizes (tuple[int]): The size of generated convolutional filters + used in Dynamic Convolutional Module. Default: (1, 3, 5, 7). + fusion (bool): Add one conv to fuse DCM output feature. + """ + + def __init__(self, filter_sizes=(1, 3, 5, 7), fusion=False, **kwargs): + super().__init__(**kwargs) + assert isinstance(filter_sizes, (list, tuple)) + self.filter_sizes = filter_sizes + self.fusion = fusion + dcm_modules = [] + for filter_size in self.filter_sizes: + dcm_modules.append( + DCM(filter_size, + self.fusion, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.dcm_modules = nn.ModuleList(dcm_modules) + self.bottleneck = ConvModule( + self.in_channels + len(filter_sizes) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + dcm_outs = [x] + for dcm_module in self.dcm_modules: + dcm_outs.append(dcm_module(x)) + dcm_outs = torch.cat(dcm_outs, dim=1) + output = self.bottleneck(dcm_outs) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/dnl_head.py b/mmsegmentation/mmseg/models/decode_heads/dnl_head.py new file mode 100644 index 0000000..248c118 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/dnl_head.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.cnn import NonLocal2d +from torch import nn + +from mmseg.registry import MODELS +from .fcn_head import FCNHead + + +class DisentangledNonLocal2d(NonLocal2d): + """Disentangled Non-Local Blocks. + + Args: + temperature (float): Temperature to adjust attention. Default: 0.05 + """ + + def __init__(self, *arg, temperature, **kwargs): + super().__init__(*arg, **kwargs) + self.temperature = temperature + self.conv_mask = nn.Conv2d(self.in_channels, 1, kernel_size=1) + + def embedded_gaussian(self, theta_x, phi_x): + """Embedded gaussian with temperature.""" + + # NonLocal2d pairwise_weight: [N, HxW, HxW] + pairwise_weight = torch.matmul(theta_x, phi_x) + if self.use_scale: + # theta_x.shape[-1] is `self.inter_channels` + pairwise_weight /= torch.tensor( + theta_x.shape[-1], + dtype=torch.float, + device=pairwise_weight.device)**torch.tensor( + 0.5, device=pairwise_weight.device) + pairwise_weight /= torch.tensor( + self.temperature, device=pairwise_weight.device) + pairwise_weight = pairwise_weight.softmax(dim=-1) + return pairwise_weight + + def forward(self, x): + # x: [N, C, H, W] + n = x.size(0) + + # g_x: [N, HxW, C] + g_x = self.g(x).view(n, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + # theta_x: [N, HxW, C], phi_x: [N, C, HxW] + if self.mode == 'gaussian': + theta_x = x.view(n, self.in_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + if self.sub_sample: + phi_x = self.phi(x).view(n, self.in_channels, -1) + else: + phi_x = x.view(n, self.in_channels, -1) + elif self.mode == 'concatenation': + theta_x = self.theta(x).view(n, self.inter_channels, -1, 1) + phi_x = self.phi(x).view(n, self.inter_channels, 1, -1) + else: + theta_x = self.theta(x).view(n, self.inter_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + phi_x = self.phi(x).view(n, self.inter_channels, -1) + + # subtract mean + theta_x -= theta_x.mean(dim=-2, keepdim=True) + phi_x -= phi_x.mean(dim=-1, keepdim=True) + + pairwise_func = getattr(self, self.mode) + # pairwise_weight: [N, HxW, HxW] + pairwise_weight = pairwise_func(theta_x, phi_x) + + # y: [N, HxW, C] + y = torch.matmul(pairwise_weight, g_x) + # y: [N, C, H, W] + y = y.permute(0, 2, 1).contiguous().reshape(n, self.inter_channels, + *x.size()[2:]) + + # unary_mask: [N, 1, HxW] + unary_mask = self.conv_mask(x) + unary_mask = unary_mask.view(n, 1, -1) + unary_mask = unary_mask.softmax(dim=-1) + # unary_x: [N, 1, C] + unary_x = torch.matmul(unary_mask, g_x) + # unary_x: [N, C, 1, 1] + unary_x = unary_x.permute(0, 2, 1).contiguous().reshape( + n, self.inter_channels, 1, 1) + + output = x + self.conv_out(y + unary_x) + + return output + + +@MODELS.register_module() +class DNLHead(FCNHead): + """Disentangled Non-Local Neural Networks. + + This head is the implementation of `DNLNet + `_. + + Args: + reduction (int): Reduction factor of projection transform. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + sqrt(1/inter_channels). Default: False. + mode (str): The nonlocal mode. Options are 'embedded_gaussian', + 'dot_product'. Default: 'embedded_gaussian.'. + temperature (float): Temperature to adjust attention. Default: 0.05 + """ + + def __init__(self, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + temperature=0.05, + **kwargs): + super().__init__(num_convs=2, **kwargs) + self.reduction = reduction + self.use_scale = use_scale + self.mode = mode + self.temperature = temperature + self.dnl_block = DisentangledNonLocal2d( + in_channels=self.channels, + reduction=self.reduction, + use_scale=self.use_scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + mode=self.mode, + temperature=self.temperature) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.dnl_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/dpt_head.py b/mmsegmentation/mmseg/models/decode_heads/dpt_head.py new file mode 100644 index 0000000..d2cfd89 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/dpt_head.py @@ -0,0 +1,294 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, Linear, build_activation_layer +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + + +class ReassembleBlocks(BaseModule): + """ViTPostProcessBlock, process cls_token in ViT backbone output and + rearrange the feature vector to feature map. + + Args: + in_channels (int): ViT feature channels. Default: 768. + out_channels (List): output channels of each stage. + Default: [96, 192, 384, 768]. + readout_type (str): Type of readout operation. Default: 'ignore'. + patch_size (int): The patch size. Default: 16. + init_cfg (dict, optional): Initialization config dict. Default: None. + """ + + def __init__(self, + in_channels=768, + out_channels=[96, 192, 384, 768], + readout_type='ignore', + patch_size=16, + init_cfg=None): + super().__init__(init_cfg) + + assert readout_type in ['ignore', 'add', 'project'] + self.readout_type = readout_type + self.patch_size = patch_size + + self.projects = nn.ModuleList([ + ConvModule( + in_channels=in_channels, + out_channels=out_channel, + kernel_size=1, + act_cfg=None, + ) for out_channel in out_channels + ]) + + self.resize_layers = nn.ModuleList([ + nn.ConvTranspose2d( + in_channels=out_channels[0], + out_channels=out_channels[0], + kernel_size=4, + stride=4, + padding=0), + nn.ConvTranspose2d( + in_channels=out_channels[1], + out_channels=out_channels[1], + kernel_size=2, + stride=2, + padding=0), + nn.Identity(), + nn.Conv2d( + in_channels=out_channels[3], + out_channels=out_channels[3], + kernel_size=3, + stride=2, + padding=1) + ]) + if self.readout_type == 'project': + self.readout_projects = nn.ModuleList() + for _ in range(len(self.projects)): + self.readout_projects.append( + nn.Sequential( + Linear(2 * in_channels, in_channels), + build_activation_layer(dict(type='GELU')))) + + def forward(self, inputs): + assert isinstance(inputs, list) + out = [] + for i, x in enumerate(inputs): + assert len(x) == 2 + x, cls_token = x[0], x[1] + feature_shape = x.shape + if self.readout_type == 'project': + x = x.flatten(2).permute((0, 2, 1)) + readout = cls_token.unsqueeze(1).expand_as(x) + x = self.readout_projects[i](torch.cat((x, readout), -1)) + x = x.permute(0, 2, 1).reshape(feature_shape) + elif self.readout_type == 'add': + x = x.flatten(2) + cls_token.unsqueeze(-1) + x = x.reshape(feature_shape) + else: + pass + x = self.projects[i](x) + x = self.resize_layers[i](x) + out.append(x) + return out + + +class PreActResidualConvUnit(BaseModule): + """ResidualConvUnit, pre-activate residual unit. + + Args: + in_channels (int): number of channels in the input feature map. + act_cfg (dict): dictionary to construct and config activation layer. + norm_cfg (dict): dictionary to construct and config norm layer. + stride (int): stride of the first block. Default: 1 + dilation (int): dilation rate for convs layers. Default: 1. + init_cfg (dict, optional): Initialization config dict. Default: None. + """ + + def __init__(self, + in_channels, + act_cfg, + norm_cfg, + stride=1, + dilation=1, + init_cfg=None): + super().__init__(init_cfg) + + self.conv1 = ConvModule( + in_channels, + in_channels, + 3, + stride=stride, + padding=dilation, + dilation=dilation, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + bias=False, + order=('act', 'conv', 'norm')) + + self.conv2 = ConvModule( + in_channels, + in_channels, + 3, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + bias=False, + order=('act', 'conv', 'norm')) + + def forward(self, inputs): + inputs_ = inputs.clone() + x = self.conv1(inputs) + x = self.conv2(x) + return x + inputs_ + + +class FeatureFusionBlock(BaseModule): + """FeatureFusionBlock, merge feature map from different stages. + + Args: + in_channels (int): Input channels. + act_cfg (dict): The activation config for ResidualConvUnit. + norm_cfg (dict): Config dict for normalization layer. + expand (bool): Whether expand the channels in post process block. + Default: False. + align_corners (bool): align_corner setting for bilinear upsample. + Default: True. + init_cfg (dict, optional): Initialization config dict. Default: None. + """ + + def __init__(self, + in_channels, + act_cfg, + norm_cfg, + expand=False, + align_corners=True, + init_cfg=None): + super().__init__(init_cfg) + + self.in_channels = in_channels + self.expand = expand + self.align_corners = align_corners + + self.out_channels = in_channels + if self.expand: + self.out_channels = in_channels // 2 + + self.project = ConvModule( + self.in_channels, + self.out_channels, + kernel_size=1, + act_cfg=None, + bias=True) + + self.res_conv_unit1 = PreActResidualConvUnit( + in_channels=self.in_channels, act_cfg=act_cfg, norm_cfg=norm_cfg) + self.res_conv_unit2 = PreActResidualConvUnit( + in_channels=self.in_channels, act_cfg=act_cfg, norm_cfg=norm_cfg) + + def forward(self, *inputs): + x = inputs[0] + if len(inputs) == 2: + if x.shape != inputs[1].shape: + res = resize( + inputs[1], + size=(x.shape[2], x.shape[3]), + mode='bilinear', + align_corners=False) + else: + res = inputs[1] + x = x + self.res_conv_unit1(res) + x = self.res_conv_unit2(x) + x = resize( + x, + scale_factor=2, + mode='bilinear', + align_corners=self.align_corners) + x = self.project(x) + return x + + +@MODELS.register_module() +class DPTHead(BaseDecodeHead): + """Vision Transformers for Dense Prediction. + + This head is implemented of `DPT `_. + + Args: + embed_dims (int): The embed dimension of the ViT backbone. + Default: 768. + post_process_channels (List): Out channels of post process conv + layers. Default: [96, 192, 384, 768]. + readout_type (str): Type of readout operation. Default: 'ignore'. + patch_size (int): The patch size. Default: 16. + expand_channels (bool): Whether expand the channels in post process + block. Default: False. + act_cfg (dict): The activation config for residual conv unit. + Default dict(type='ReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + """ + + def __init__(self, + embed_dims=768, + post_process_channels=[96, 192, 384, 768], + readout_type='ignore', + patch_size=16, + expand_channels=False, + act_cfg=dict(type='ReLU'), + norm_cfg=dict(type='BN'), + **kwargs): + super().__init__(**kwargs) + + self.in_channels = self.in_channels + self.expand_channels = expand_channels + self.reassemble_blocks = ReassembleBlocks(embed_dims, + post_process_channels, + readout_type, patch_size) + + self.post_process_channels = [ + channel * math.pow(2, i) if expand_channels else channel + for i, channel in enumerate(post_process_channels) + ] + self.convs = nn.ModuleList() + for channel in self.post_process_channels: + self.convs.append( + ConvModule( + channel, + self.channels, + kernel_size=3, + padding=1, + act_cfg=None, + bias=False)) + self.fusion_blocks = nn.ModuleList() + for _ in range(len(self.convs)): + self.fusion_blocks.append( + FeatureFusionBlock(self.channels, act_cfg, norm_cfg)) + self.fusion_blocks[0].res_conv_unit1 = None + self.project = ConvModule( + self.channels, + self.channels, + kernel_size=3, + padding=1, + norm_cfg=norm_cfg) + self.num_fusion_blocks = len(self.fusion_blocks) + self.num_reassemble_blocks = len(self.reassemble_blocks.resize_layers) + self.num_post_process_channels = len(self.post_process_channels) + assert self.num_fusion_blocks == self.num_reassemble_blocks + assert self.num_reassemble_blocks == self.num_post_process_channels + + def forward(self, inputs): + assert len(inputs) == self.num_reassemble_blocks + x = self._transform_inputs(inputs) + x = self.reassemble_blocks(x) + x = [self.convs[i](feature) for i, feature in enumerate(x)] + out = self.fusion_blocks[0](x[-1]) + for i in range(1, len(self.fusion_blocks)): + out = self.fusion_blocks[i](out, x[-(i + 1)]) + out = self.project(out) + out = self.cls_seg(out) + return out diff --git a/mmsegmentation/mmseg/models/decode_heads/ema_head.py b/mmsegmentation/mmseg/models/decode_heads/ema_head.py new file mode 100644 index 0000000..ab8dbb0 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/ema_head.py @@ -0,0 +1,169 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.distributed as dist +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from .decode_head import BaseDecodeHead + + +def reduce_mean(tensor): + """Reduce mean when distributed training.""" + if not (dist.is_available() and dist.is_initialized()): + return tensor + tensor = tensor.clone() + dist.all_reduce(tensor.div_(dist.get_world_size()), op=dist.ReduceOp.SUM) + return tensor + + +class EMAModule(nn.Module): + """Expectation Maximization Attention Module used in EMANet. + + Args: + channels (int): Channels of the whole module. + num_bases (int): Number of bases. + num_stages (int): Number of the EM iterations. + """ + + def __init__(self, channels, num_bases, num_stages, momentum): + super().__init__() + assert num_stages >= 1, 'num_stages must be at least 1!' + self.num_bases = num_bases + self.num_stages = num_stages + self.momentum = momentum + + bases = torch.zeros(1, channels, self.num_bases) + bases.normal_(0, math.sqrt(2. / self.num_bases)) + # [1, channels, num_bases] + bases = F.normalize(bases, dim=1, p=2) + self.register_buffer('bases', bases) + + def forward(self, feats): + """Forward function.""" + batch_size, channels, height, width = feats.size() + # [batch_size, channels, height*width] + feats = feats.view(batch_size, channels, height * width) + # [batch_size, channels, num_bases] + bases = self.bases.repeat(batch_size, 1, 1) + + with torch.no_grad(): + for i in range(self.num_stages): + # [batch_size, height*width, num_bases] + attention = torch.einsum('bcn,bck->bnk', feats, bases) + attention = F.softmax(attention, dim=2) + # l1 norm + attention_normed = F.normalize(attention, dim=1, p=1) + # [batch_size, channels, num_bases] + bases = torch.einsum('bcn,bnk->bck', feats, attention_normed) + # l2 norm + bases = F.normalize(bases, dim=1, p=2) + + feats_recon = torch.einsum('bck,bnk->bcn', bases, attention) + feats_recon = feats_recon.view(batch_size, channels, height, width) + + if self.training: + bases = bases.mean(dim=0, keepdim=True) + bases = reduce_mean(bases) + # l2 norm + bases = F.normalize(bases, dim=1, p=2) + self.bases = (1 - + self.momentum) * self.bases + self.momentum * bases + + return feats_recon + + +@MODELS.register_module() +class EMAHead(BaseDecodeHead): + """Expectation Maximization Attention Networks for Semantic Segmentation. + + This head is the implementation of `EMANet + `_. + + Args: + ema_channels (int): EMA module channels + num_bases (int): Number of bases. + num_stages (int): Number of the EM iterations. + concat_input (bool): Whether concat the input and output of convs + before classification layer. Default: True + momentum (float): Momentum to update the base. Default: 0.1. + """ + + def __init__(self, + ema_channels, + num_bases, + num_stages, + concat_input=True, + momentum=0.1, + **kwargs): + super().__init__(**kwargs) + self.ema_channels = ema_channels + self.num_bases = num_bases + self.num_stages = num_stages + self.concat_input = concat_input + self.momentum = momentum + self.ema_module = EMAModule(self.ema_channels, self.num_bases, + self.num_stages, self.momentum) + + self.ema_in_conv = ConvModule( + self.in_channels, + self.ema_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + # project (0, inf) -> (-inf, inf) + self.ema_mid_conv = ConvModule( + self.ema_channels, + self.ema_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=None, + act_cfg=None) + for param in self.ema_mid_conv.parameters(): + param.requires_grad = False + + self.ema_out_conv = ConvModule( + self.ema_channels, + self.ema_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.bottleneck = ConvModule( + self.ema_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if self.concat_input: + self.conv_cat = ConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + feats = self.ema_in_conv(x) + identity = feats + feats = self.ema_mid_conv(feats) + recon = self.ema_module(feats) + recon = F.relu(recon, inplace=True) + recon = self.ema_out_conv(recon) + output = F.relu(identity + recon, inplace=True) + output = self.bottleneck(output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/enc_head.py b/mmsegmentation/mmseg/models/decode_heads/enc_head.py new file mode 100644 index 0000000..2bba73b --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/enc_head.py @@ -0,0 +1,196 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_norm_layer +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.utils import ConfigType, SampleList +from ..utils import Encoding, resize +from .decode_head import BaseDecodeHead + + +class EncModule(nn.Module): + """Encoding Module used in EncNet. + + Args: + in_channels (int): Input channels. + num_codes (int): Number of code words. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, in_channels, num_codes, conv_cfg, norm_cfg, act_cfg): + super().__init__() + self.encoding_project = ConvModule( + in_channels, + in_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + # TODO: resolve this hack + # change to 1d + if norm_cfg is not None: + encoding_norm_cfg = norm_cfg.copy() + if encoding_norm_cfg['type'] in ['BN', 'IN']: + encoding_norm_cfg['type'] += '1d' + else: + encoding_norm_cfg['type'] = encoding_norm_cfg['type'].replace( + '2d', '1d') + else: + # fallback to BN1d + encoding_norm_cfg = dict(type='BN1d') + self.encoding = nn.Sequential( + Encoding(channels=in_channels, num_codes=num_codes), + build_norm_layer(encoding_norm_cfg, num_codes)[1], + nn.ReLU(inplace=True)) + self.fc = nn.Sequential( + nn.Linear(in_channels, in_channels), nn.Sigmoid()) + + def forward(self, x): + """Forward function.""" + encoding_projection = self.encoding_project(x) + encoding_feat = self.encoding(encoding_projection).mean(dim=1) + batch_size, channels, _, _ = x.size() + gamma = self.fc(encoding_feat) + y = gamma.view(batch_size, channels, 1, 1) + output = F.relu_(x + x * y) + return encoding_feat, output + + +@MODELS.register_module() +class EncHead(BaseDecodeHead): + """Context Encoding for Semantic Segmentation. + + This head is the implementation of `EncNet + `_. + + Args: + num_codes (int): Number of code words. Default: 32. + use_se_loss (bool): Whether use Semantic Encoding Loss (SE-loss) to + regularize the training. Default: True. + add_lateral (bool): Whether use lateral connection to fuse features. + Default: False. + loss_se_decode (dict): Config of decode loss. + Default: dict(type='CrossEntropyLoss', use_sigmoid=True). + """ + + def __init__(self, + num_codes=32, + use_se_loss=True, + add_lateral=False, + loss_se_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=0.2), + **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + self.use_se_loss = use_se_loss + self.add_lateral = add_lateral + self.num_codes = num_codes + self.bottleneck = ConvModule( + self.in_channels[-1], + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if add_lateral: + self.lateral_convs = nn.ModuleList() + for in_channels in self.in_channels[:-1]: # skip the last one + self.lateral_convs.append( + ConvModule( + in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.fusion = ConvModule( + len(self.in_channels) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.enc_module = EncModule( + self.channels, + num_codes=num_codes, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if self.use_se_loss: + self.loss_se_decode = MODELS.build(loss_se_decode) + self.se_layer = nn.Linear(self.channels, self.num_classes) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + feat = self.bottleneck(inputs[-1]) + if self.add_lateral: + laterals = [ + resize( + lateral_conv(inputs[i]), + size=feat.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + feat = self.fusion(torch.cat([feat, *laterals], 1)) + encode_feat, output = self.enc_module(feat) + output = self.cls_seg(output) + if self.use_se_loss: + se_output = self.se_layer(encode_feat) + return output, se_output + else: + return output + + def predict(self, inputs: Tuple[Tensor], batch_img_metas: List[dict], + test_cfg: ConfigType): + """Forward function for testing, ignore se_loss.""" + if self.use_se_loss: + seg_logits = self.forward(inputs)[0] + else: + seg_logits = self.forward(inputs) + return self.predict_by_feat(seg_logits, batch_img_metas) + + @staticmethod + def _convert_to_onehot_labels(seg_label, num_classes): + """Convert segmentation label to onehot. + + Args: + seg_label (Tensor): Segmentation label of shape (N, H, W). + num_classes (int): Number of classes. + + Returns: + Tensor: Onehot labels of shape (N, num_classes). + """ + + batch_size = seg_label.size(0) + onehot_labels = seg_label.new_zeros((batch_size, num_classes)) + for i in range(batch_size): + hist = seg_label[i].float().histc( + bins=num_classes, min=0, max=num_classes - 1) + onehot_labels[i] = hist > 0 + return onehot_labels + + def loss_by_feat(self, seg_logit: Tuple[Tensor], + batch_data_samples: SampleList, **kwargs) -> dict: + """Compute segmentation and semantic encoding loss.""" + seg_logit, se_seg_logit = seg_logit + loss = dict() + loss.update(super().loss_by_feat(seg_logit, batch_data_samples)) + + seg_label = self._stack_batch_gt(batch_data_samples) + se_loss = self.loss_se_decode( + se_seg_logit, + self._convert_to_onehot_labels(seg_label, self.num_classes)) + loss['loss_se'] = se_loss + return loss diff --git a/mmsegmentation/mmseg/models/decode_heads/fcn_head.py b/mmsegmentation/mmseg/models/decode_heads/fcn_head.py new file mode 100644 index 0000000..3418018 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/fcn_head.py @@ -0,0 +1,96 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from .decode_head import BaseDecodeHead + + +@MODELS.register_module() +class FCNHead(BaseDecodeHead): + """Fully Convolution Networks for Semantic Segmentation. + + This head is implemented of `FCNNet `_. + + Args: + num_convs (int): Number of convs in the head. Default: 2. + kernel_size (int): The kernel size for convs in the head. Default: 3. + concat_input (bool): Whether concat the input and output of convs + before classification layer. + dilation (int): The dilation rate for convs in the head. Default: 1. + """ + + def __init__(self, + num_convs=2, + kernel_size=3, + concat_input=True, + dilation=1, + **kwargs): + assert num_convs >= 0 and dilation > 0 and isinstance(dilation, int) + self.num_convs = num_convs + self.concat_input = concat_input + self.kernel_size = kernel_size + super().__init__(**kwargs) + if num_convs == 0: + assert self.in_channels == self.channels + + conv_padding = (kernel_size // 2) * dilation + convs = [] + convs.append( + ConvModule( + self.in_channels, + self.channels, + kernel_size=kernel_size, + padding=conv_padding, + dilation=dilation, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + for i in range(num_convs - 1): + convs.append( + ConvModule( + self.channels, + self.channels, + kernel_size=kernel_size, + padding=conv_padding, + dilation=dilation, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + if num_convs == 0: + self.convs = nn.Identity() + else: + self.convs = nn.Sequential(*convs) + if self.concat_input: + self.conv_cat = ConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def _forward_feature(self, inputs): + """Forward function for feature maps before classifying each pixel with + ``self.cls_seg`` fc. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + feats (Tensor): A tensor of shape (batch_size, self.channels, + H, W) which is feature map for last layer of decoder head. + """ + x = self._transform_inputs(inputs) + feats = self.convs(x) + if self.concat_input: + feats = self.conv_cat(torch.cat([x, feats], dim=1)) + return feats + + def forward(self, inputs): + """Forward function.""" + output = self._forward_feature(inputs) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/fpn_head.py b/mmsegmentation/mmseg/models/decode_heads/fpn_head.py new file mode 100644 index 0000000..25f481f --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/fpn_head.py @@ -0,0 +1,68 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import Upsample, resize +from .decode_head import BaseDecodeHead + + +@MODELS.register_module() +class FPNHead(BaseDecodeHead): + """Panoptic Feature Pyramid Networks. + + This head is the implementation of `Semantic FPN + `_. + + Args: + feature_strides (tuple[int]): The strides for input feature maps. + stack_lateral. All strides suppose to be power of 2. The first + one is of largest resolution. + """ + + def __init__(self, feature_strides, **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + assert len(feature_strides) == len(self.in_channels) + assert min(feature_strides) == feature_strides[0] + self.feature_strides = feature_strides + + self.scale_heads = nn.ModuleList() + for i in range(len(feature_strides)): + head_length = max( + 1, + int(np.log2(feature_strides[i]) - np.log2(feature_strides[0]))) + scale_head = [] + for k in range(head_length): + scale_head.append( + ConvModule( + self.in_channels[i] if k == 0 else self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + if feature_strides[i] != feature_strides[0]: + scale_head.append( + Upsample( + scale_factor=2, + mode='bilinear', + align_corners=self.align_corners)) + self.scale_heads.append(nn.Sequential(*scale_head)) + + def forward(self, inputs): + + x = self._transform_inputs(inputs) + + output = self.scale_heads[0](x[0]) + for i in range(1, len(self.feature_strides)): + # non inplace + output = output + resize( + self.scale_heads[i](x[i]), + size=output.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/gc_head.py b/mmsegmentation/mmseg/models/decode_heads/gc_head.py new file mode 100644 index 0000000..14f0ef0 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/gc_head.py @@ -0,0 +1,48 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.cnn import ContextBlock + +from mmseg.registry import MODELS +from .fcn_head import FCNHead + + +@MODELS.register_module() +class GCHead(FCNHead): + """GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond. + + This head is the implementation of `GCNet + `_. + + Args: + ratio (float): Multiplier of channels ratio. Default: 1/4. + pooling_type (str): The pooling type of context aggregation. + Options are 'att', 'avg'. Default: 'avg'. + fusion_types (tuple[str]): The fusion type for feature fusion. + Options are 'channel_add', 'channel_mul'. Default: ('channel_add',) + """ + + def __init__(self, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + **kwargs): + super().__init__(num_convs=2, **kwargs) + self.ratio = ratio + self.pooling_type = pooling_type + self.fusion_types = fusion_types + self.gc_block = ContextBlock( + in_channels=self.channels, + ratio=self.ratio, + pooling_type=self.pooling_type, + fusion_types=self.fusion_types) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.gc_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/ham_head.py b/mmsegmentation/mmseg/models/decode_heads/ham_head.py new file mode 100644 index 0000000..073d801 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/ham_head.py @@ -0,0 +1,255 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Originally from https://github.com/visual-attention-network/segnext +# Licensed under the Apache License, Version 2.0 (the "License") +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmengine.device import get_device + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + + +class Matrix_Decomposition_2D_Base(nn.Module): + """Base class of 2D Matrix Decomposition. + + Args: + MD_S (int): The number of spatial coefficient in + Matrix Decomposition, it may be used for calculation + of the number of latent dimension D in Matrix + Decomposition. Defaults: 1. + MD_R (int): The number of latent dimension R in + Matrix Decomposition. Defaults: 64. + train_steps (int): The number of iteration steps in + Multiplicative Update (MU) rule to solve Non-negative + Matrix Factorization (NMF) in training. Defaults: 6. + eval_steps (int): The number of iteration steps in + Multiplicative Update (MU) rule to solve Non-negative + Matrix Factorization (NMF) in evaluation. Defaults: 7. + inv_t (int): Inverted multiple number to make coefficient + smaller in softmax. Defaults: 100. + rand_init (bool): Whether to initialize randomly. + Defaults: True. + """ + + def __init__(self, + MD_S=1, + MD_R=64, + train_steps=6, + eval_steps=7, + inv_t=100, + rand_init=True): + super().__init__() + + self.S = MD_S + self.R = MD_R + + self.train_steps = train_steps + self.eval_steps = eval_steps + + self.inv_t = inv_t + + self.rand_init = rand_init + + def _build_bases(self, B, S, D, R, device=None): + raise NotImplementedError + + def local_step(self, x, bases, coef): + raise NotImplementedError + + def local_inference(self, x, bases): + # (B * S, D, N)^T @ (B * S, D, R) -> (B * S, N, R) + coef = torch.bmm(x.transpose(1, 2), bases) + coef = F.softmax(self.inv_t * coef, dim=-1) + + steps = self.train_steps if self.training else self.eval_steps + for _ in range(steps): + bases, coef = self.local_step(x, bases, coef) + + return bases, coef + + def compute_coef(self, x, bases, coef): + raise NotImplementedError + + def forward(self, x, return_bases=False): + """Forward Function.""" + B, C, H, W = x.shape + + # (B, C, H, W) -> (B * S, D, N) + D = C // self.S + N = H * W + x = x.view(B * self.S, D, N) + if not self.rand_init and not hasattr(self, 'bases'): + bases = self._build_bases(1, self.S, D, self.R, device=x.device) + self.register_buffer('bases', bases) + + # (S, D, R) -> (B * S, D, R) + if self.rand_init: + bases = self._build_bases(B, self.S, D, self.R, device=x.device) + else: + bases = self.bases.repeat(B, 1, 1) + + bases, coef = self.local_inference(x, bases) + + # (B * S, N, R) + coef = self.compute_coef(x, bases, coef) + + # (B * S, D, R) @ (B * S, N, R)^T -> (B * S, D, N) + x = torch.bmm(bases, coef.transpose(1, 2)) + + # (B * S, D, N) -> (B, C, H, W) + x = x.view(B, C, H, W) + + return x + + +class NMF2D(Matrix_Decomposition_2D_Base): + """Non-negative Matrix Factorization (NMF) module. + + It is inherited from ``Matrix_Decomposition_2D_Base`` module. + """ + + def __init__(self, args=dict()): + super().__init__(**args) + + self.inv_t = 1 + + def _build_bases(self, B, S, D, R, device=None): + """Build bases in initialization.""" + if device is None: + device = get_device() + bases = torch.rand((B * S, D, R)).to(device) + bases = F.normalize(bases, dim=1) + + return bases + + def local_step(self, x, bases, coef): + """Local step in iteration to renew bases and coefficient.""" + # (B * S, D, N)^T @ (B * S, D, R) -> (B * S, N, R) + numerator = torch.bmm(x.transpose(1, 2), bases) + # (B * S, N, R) @ [(B * S, D, R)^T @ (B * S, D, R)] -> (B * S, N, R) + denominator = coef.bmm(bases.transpose(1, 2).bmm(bases)) + # Multiplicative Update + coef = coef * numerator / (denominator + 1e-6) + + # (B * S, D, N) @ (B * S, N, R) -> (B * S, D, R) + numerator = torch.bmm(x, coef) + # (B * S, D, R) @ [(B * S, N, R)^T @ (B * S, N, R)] -> (B * S, D, R) + denominator = bases.bmm(coef.transpose(1, 2).bmm(coef)) + # Multiplicative Update + bases = bases * numerator / (denominator + 1e-6) + + return bases, coef + + def compute_coef(self, x, bases, coef): + """Compute coefficient.""" + # (B * S, D, N)^T @ (B * S, D, R) -> (B * S, N, R) + numerator = torch.bmm(x.transpose(1, 2), bases) + # (B * S, N, R) @ (B * S, D, R)^T @ (B * S, D, R) -> (B * S, N, R) + denominator = coef.bmm(bases.transpose(1, 2).bmm(bases)) + # multiplication update + coef = coef * numerator / (denominator + 1e-6) + + return coef + + +class Hamburger(nn.Module): + """Hamburger Module. It consists of one slice of "ham" (matrix + decomposition) and two slices of "bread" (linear transformation). + + Args: + ham_channels (int): Input and output channels of feature. + ham_kwargs (dict): Config of matrix decomposition module. + norm_cfg (dict | None): Config of norm layers. + """ + + def __init__(self, + ham_channels=512, + ham_kwargs=dict(), + norm_cfg=None, + **kwargs): + super().__init__() + + self.ham_in = ConvModule( + ham_channels, ham_channels, 1, norm_cfg=None, act_cfg=None) + + self.ham = NMF2D(ham_kwargs) + + self.ham_out = ConvModule( + ham_channels, ham_channels, 1, norm_cfg=norm_cfg, act_cfg=None) + + def forward(self, x): + enjoy = self.ham_in(x) + enjoy = F.relu(enjoy, inplace=True) + enjoy = self.ham(enjoy) + enjoy = self.ham_out(enjoy) + ham = F.relu(x + enjoy, inplace=True) + + return ham + + +@MODELS.register_module() +class LightHamHead(BaseDecodeHead): + """SegNeXt decode head. + + This decode head is the implementation of `SegNeXt: Rethinking + Convolutional Attention Design for Semantic + Segmentation `_. + Inspiration from https://github.com/visual-attention-network/segnext. + + Specifically, LightHamHead is inspired by HamNet from + `Is Attention Better Than Matrix Decomposition? + `. + + Args: + ham_channels (int): input channels for Hamburger. + Defaults: 512. + ham_kwargs (int): kwagrs for Ham. Defaults: dict(). + """ + + def __init__(self, ham_channels=512, ham_kwargs=dict(), **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + self.ham_channels = ham_channels + + self.squeeze = ConvModule( + sum(self.in_channels), + self.ham_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.hamburger = Hamburger(ham_channels, ham_kwargs, **kwargs) + + self.align = ConvModule( + self.ham_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + + inputs = [ + resize( + level, + size=inputs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) for level in inputs + ] + + inputs = torch.cat(inputs, dim=1) + # apply a conv block to squeeze feature map + x = self.squeeze(inputs) + # apply hamburger module + x = self.hamburger(x) + + # apply a conv block to align feature map + output = self.align(x) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/isa_head.py b/mmsegmentation/mmseg/models/decode_heads/isa_head.py new file mode 100644 index 0000000..355f215 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/isa_head.py @@ -0,0 +1,143 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class SelfAttentionBlock(_SelfAttentionBlock): + """Self-Attention Module. + + Args: + in_channels (int): Input channels of key/query feature. + channels (int): Output channels of key/query transform. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict | None): Config of activation layers. + """ + + def __init__(self, in_channels, channels, conv_cfg, norm_cfg, act_cfg): + super().__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=None, + key_downsample=None, + key_query_num_convs=2, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=True, + with_out=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + self.output_project = self.build_project( + in_channels, + in_channels, + num_convs=1, + use_conv_module=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x): + """Forward function.""" + context = super().forward(x, x) + return self.output_project(context) + + +@MODELS.register_module() +class ISAHead(BaseDecodeHead): + """Interlaced Sparse Self-Attention for Semantic Segmentation. + + This head is the implementation of `ISA + `_. + + Args: + isa_channels (int): The channels of ISA Module. + down_factor (tuple[int]): The local group size of ISA. + """ + + def __init__(self, isa_channels, down_factor=(8, 8), **kwargs): + super().__init__(**kwargs) + self.down_factor = down_factor + + self.in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.global_relation = SelfAttentionBlock( + self.channels, + isa_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.local_relation = SelfAttentionBlock( + self.channels, + isa_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.out_conv = ConvModule( + self.channels * 2, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x_ = self._transform_inputs(inputs) + x = self.in_conv(x_) + residual = x + + n, c, h, w = x.size() + loc_h, loc_w = self.down_factor # size of local group in H- and W-axes + glb_h, glb_w = math.ceil(h / loc_h), math.ceil(w / loc_w) + pad_h, pad_w = glb_h * loc_h - h, glb_w * loc_w - w + if pad_h > 0 or pad_w > 0: # pad if the size is not divisible + padding = (pad_w // 2, pad_w - pad_w // 2, pad_h // 2, + pad_h - pad_h // 2) + x = F.pad(x, padding) + + # global relation + x = x.view(n, c, glb_h, loc_h, glb_w, loc_w) + # do permutation to gather global group + x = x.permute(0, 3, 5, 1, 2, 4) # (n, loc_h, loc_w, c, glb_h, glb_w) + x = x.reshape(-1, c, glb_h, glb_w) + # apply attention within each global group + x = self.global_relation(x) # (n * loc_h * loc_w, c, glb_h, glb_w) + + # local relation + x = x.view(n, loc_h, loc_w, c, glb_h, glb_w) + # do permutation to gather local group + x = x.permute(0, 4, 5, 3, 1, 2) # (n, glb_h, glb_w, c, loc_h, loc_w) + x = x.reshape(-1, c, loc_h, loc_w) + # apply attention within each local group + x = self.local_relation(x) # (n * glb_h * glb_w, c, loc_h, loc_w) + + # permute each pixel back to its original position + x = x.view(n, glb_h, glb_w, c, loc_h, loc_w) + x = x.permute(0, 3, 1, 4, 2, 5) # (n, c, glb_h, loc_h, glb_w, loc_w) + x = x.reshape(n, c, glb_h * loc_h, glb_w * loc_w) + if pad_h > 0 or pad_w > 0: # remove padding + x = x[:, :, pad_h // 2:pad_h // 2 + h, pad_w // 2:pad_w // 2 + w] + + x = self.out_conv(torch.cat([x, residual], dim=1)) + out = self.cls_seg(x) + + return out diff --git a/mmsegmentation/mmseg/models/decode_heads/knet_head.py b/mmsegmentation/mmseg/models/decode_heads/knet_head.py new file mode 100644 index 0000000..82d3a28 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/knet_head.py @@ -0,0 +1,461 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer +from mmcv.cnn.bricks.transformer import (FFN, MultiheadAttention, + build_transformer_layer) +from mmengine.logging import print_log +from torch import Tensor + +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.registry import MODELS +from mmseg.utils import SampleList + + +@MODELS.register_module() +class KernelUpdator(nn.Module): + """Dynamic Kernel Updator in Kernel Update Head. + + Args: + in_channels (int): The number of channels of input feature map. + Default: 256. + feat_channels (int): The number of middle-stage channels in + the kernel updator. Default: 64. + out_channels (int): The number of output channels. + gate_sigmoid (bool): Whether use sigmoid function in gate + mechanism. Default: True. + gate_norm_act (bool): Whether add normalization and activation + layer in gate mechanism. Default: False. + activate_out: Whether add activation after gate mechanism. + Default: False. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='LN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + """ + + def __init__( + self, + in_channels=256, + feat_channels=64, + out_channels=None, + gate_sigmoid=True, + gate_norm_act=False, + activate_out=False, + norm_cfg=dict(type='LN'), + act_cfg=dict(type='ReLU', inplace=True), + ): + super().__init__() + self.in_channels = in_channels + self.feat_channels = feat_channels + self.out_channels_raw = out_channels + self.gate_sigmoid = gate_sigmoid + self.gate_norm_act = gate_norm_act + self.activate_out = activate_out + self.act_cfg = act_cfg + self.norm_cfg = norm_cfg + self.out_channels = out_channels if out_channels else in_channels + + self.num_params_in = self.feat_channels + self.num_params_out = self.feat_channels + self.dynamic_layer = nn.Linear( + self.in_channels, self.num_params_in + self.num_params_out) + self.input_layer = nn.Linear(self.in_channels, + self.num_params_in + self.num_params_out, + 1) + self.input_gate = nn.Linear(self.in_channels, self.feat_channels, 1) + self.update_gate = nn.Linear(self.in_channels, self.feat_channels, 1) + if self.gate_norm_act: + self.gate_norm = build_norm_layer(norm_cfg, self.feat_channels)[1] + + self.norm_in = build_norm_layer(norm_cfg, self.feat_channels)[1] + self.norm_out = build_norm_layer(norm_cfg, self.feat_channels)[1] + self.input_norm_in = build_norm_layer(norm_cfg, self.feat_channels)[1] + self.input_norm_out = build_norm_layer(norm_cfg, self.feat_channels)[1] + + self.activation = build_activation_layer(act_cfg) + + self.fc_layer = nn.Linear(self.feat_channels, self.out_channels, 1) + self.fc_norm = build_norm_layer(norm_cfg, self.out_channels)[1] + + def forward(self, update_feature, input_feature): + """Forward function of KernelUpdator. + + Args: + update_feature (torch.Tensor): Feature map assembled from + each group. It would be reshaped with last dimension + shape: `self.in_channels`. + input_feature (torch.Tensor): Intermediate feature + with shape: (N, num_classes, conv_kernel_size**2, channels). + Returns: + Tensor: The output tensor of shape (N*C1/C2, K*K, C2), where N is + the number of classes, C1 and C2 are the feature map channels of + KernelUpdateHead and KernelUpdator, respectively. + """ + + update_feature = update_feature.reshape(-1, self.in_channels) + num_proposals = update_feature.size(0) + # dynamic_layer works for + # phi_1 and psi_3 in Eq.(4) and (5) of K-Net paper + parameters = self.dynamic_layer(update_feature) + param_in = parameters[:, :self.num_params_in].view( + -1, self.feat_channels) + param_out = parameters[:, -self.num_params_out:].view( + -1, self.feat_channels) + + # input_layer works for + # phi_2 and psi_4 in Eq.(4) and (5) of K-Net paper + input_feats = self.input_layer( + input_feature.reshape(num_proposals, -1, self.feat_channels)) + input_in = input_feats[..., :self.num_params_in] + input_out = input_feats[..., -self.num_params_out:] + + # `gate_feats` is F^G in K-Net paper + gate_feats = input_in * param_in.unsqueeze(-2) + if self.gate_norm_act: + gate_feats = self.activation(self.gate_norm(gate_feats)) + + input_gate = self.input_norm_in(self.input_gate(gate_feats)) + update_gate = self.norm_in(self.update_gate(gate_feats)) + if self.gate_sigmoid: + input_gate = input_gate.sigmoid() + update_gate = update_gate.sigmoid() + param_out = self.norm_out(param_out) + input_out = self.input_norm_out(input_out) + + if self.activate_out: + param_out = self.activation(param_out) + input_out = self.activation(input_out) + + # Gate mechanism. Eq.(5) in original paper. + # param_out has shape (batch_size, feat_channels, out_channels) + features = update_gate * param_out.unsqueeze( + -2) + input_gate * input_out + + features = self.fc_layer(features) + features = self.fc_norm(features) + features = self.activation(features) + + return features + + +@MODELS.register_module() +class KernelUpdateHead(nn.Module): + """Kernel Update Head in K-Net. + + Args: + num_classes (int): Number of classes. Default: 150. + num_ffn_fcs (int): The number of fully-connected layers in + FFNs. Default: 2. + num_heads (int): The number of parallel attention heads. + Default: 8. + num_mask_fcs (int): The number of fully connected layers for + mask prediction. Default: 3. + feedforward_channels (int): The hidden dimension of FFNs. + Defaults: 2048. + in_channels (int): The number of channels of input feature map. + Default: 256. + out_channels (int): The number of output channels. + Default: 256. + dropout (float): The Probability of an element to be + zeroed in MultiheadAttention and FFN. Default 0.0. + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + ffn_act_cfg (dict): Config of activation layers in FFN. + Default: dict(type='ReLU'). + conv_kernel_size (int): The kernel size of convolution in + Kernel Update Head for dynamic kernel updation. + Default: 1. + feat_transform_cfg (dict | None): Config of feature transform. + Default: None. + kernel_init (bool): Whether initiate mask kernel in mask head. + Default: False. + with_ffn (bool): Whether add FFN in kernel update head. + Default: True. + feat_gather_stride (int): Stride of convolution in feature transform. + Default: 1. + mask_transform_stride (int): Stride of mask transform. + Default: 1. + kernel_updator_cfg (dict): Config of kernel updator. + Default: dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')). + """ + + def __init__(self, + num_classes=150, + num_ffn_fcs=2, + num_heads=8, + num_mask_fcs=3, + feedforward_channels=2048, + in_channels=256, + out_channels=256, + dropout=0.0, + act_cfg=dict(type='ReLU', inplace=True), + ffn_act_cfg=dict(type='ReLU', inplace=True), + conv_kernel_size=1, + feat_transform_cfg=None, + kernel_init=False, + with_ffn=True, + feat_gather_stride=1, + mask_transform_stride=1, + kernel_updator_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'))): + super().__init__() + self.num_classes = num_classes + self.in_channels = in_channels + self.out_channels = out_channels + self.fp16_enabled = False + self.dropout = dropout + self.num_heads = num_heads + self.kernel_init = kernel_init + self.with_ffn = with_ffn + self.conv_kernel_size = conv_kernel_size + self.feat_gather_stride = feat_gather_stride + self.mask_transform_stride = mask_transform_stride + + self.attention = MultiheadAttention(in_channels * conv_kernel_size**2, + num_heads, dropout) + self.attention_norm = build_norm_layer( + dict(type='LN'), in_channels * conv_kernel_size**2)[1] + self.kernel_update_conv = build_transformer_layer(kernel_updator_cfg) + + if feat_transform_cfg is not None: + kernel_size = feat_transform_cfg.pop('kernel_size', 1) + transform_channels = in_channels + self.feat_transform = ConvModule( + transform_channels, + in_channels, + kernel_size, + stride=feat_gather_stride, + padding=int(feat_gather_stride // 2), + **feat_transform_cfg) + else: + self.feat_transform = None + + if self.with_ffn: + self.ffn = FFN( + in_channels, + feedforward_channels, + num_ffn_fcs, + act_cfg=ffn_act_cfg, + dropout=dropout) + self.ffn_norm = build_norm_layer(dict(type='LN'), in_channels)[1] + + self.mask_fcs = nn.ModuleList() + for _ in range(num_mask_fcs): + self.mask_fcs.append( + nn.Linear(in_channels, in_channels, bias=False)) + self.mask_fcs.append( + build_norm_layer(dict(type='LN'), in_channels)[1]) + self.mask_fcs.append(build_activation_layer(act_cfg)) + + self.fc_mask = nn.Linear(in_channels, out_channels) + + def init_weights(self): + """Use xavier initialization for all weight parameter and set + classification head bias as a specific value when use focal loss.""" + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + else: + # adopt the default initialization for + # the weight and bias of the layer norm + pass + if self.kernel_init: + print_log( + 'mask kernel in mask head is normal initialized by std 0.01') + nn.init.normal_(self.fc_mask.weight, mean=0, std=0.01) + + def forward(self, x, proposal_feat, mask_preds, mask_shape=None): + """Forward function of Dynamic Instance Interactive Head. + + Args: + x (Tensor): Feature map from FPN with shape + (batch_size, feature_dimensions, H , W). + proposal_feat (Tensor): Intermediate feature get from + diihead in last stage, has shape + (batch_size, num_proposals, feature_dimensions) + mask_preds (Tensor): mask prediction from the former stage in shape + (batch_size, num_proposals, H, W). + + Returns: + Tuple: The first tensor is predicted mask with shape + (N, num_classes, H, W), the second tensor is dynamic kernel + with shape (N, num_classes, channels, K, K). + """ + N, num_proposals = proposal_feat.shape[:2] + if self.feat_transform is not None: + x = self.feat_transform(x) + + C, H, W = x.shape[-3:] + + mask_h, mask_w = mask_preds.shape[-2:] + if mask_h != H or mask_w != W: + gather_mask = F.interpolate( + mask_preds, (H, W), align_corners=False, mode='bilinear') + else: + gather_mask = mask_preds + + sigmoid_masks = gather_mask.softmax(dim=1) + + # Group Feature Assembling. Eq.(3) in original paper. + # einsum is faster than bmm by 30% + x_feat = torch.einsum('bnhw,bchw->bnc', sigmoid_masks, x) + + # obj_feat in shape [B, N, C, K, K] -> [B, N, C, K*K] -> [B, N, K*K, C] + proposal_feat = proposal_feat.reshape(N, num_proposals, + self.in_channels, + -1).permute(0, 1, 3, 2) + obj_feat = self.kernel_update_conv(x_feat, proposal_feat) + + # [B, N, K*K, C] -> [B, N, K*K*C] -> [N, B, K*K*C] + obj_feat = obj_feat.reshape(N, num_proposals, -1).permute(1, 0, 2) + obj_feat = self.attention_norm(self.attention(obj_feat)) + # [N, B, K*K*C] -> [B, N, K*K*C] + obj_feat = obj_feat.permute(1, 0, 2) + + # obj_feat in shape [B, N, K*K*C] -> [B, N, K*K, C] + obj_feat = obj_feat.reshape(N, num_proposals, -1, self.in_channels) + + # FFN + if self.with_ffn: + obj_feat = self.ffn_norm(self.ffn(obj_feat)) + + mask_feat = obj_feat + + for reg_layer in self.mask_fcs: + mask_feat = reg_layer(mask_feat) + + # [B, N, K*K, C] -> [B, N, C, K*K] + mask_feat = self.fc_mask(mask_feat).permute(0, 1, 3, 2) + + if (self.mask_transform_stride == 2 and self.feat_gather_stride == 1): + mask_x = F.interpolate( + x, scale_factor=0.5, mode='bilinear', align_corners=False) + H, W = mask_x.shape[-2:] + else: + mask_x = x + # group conv is 5x faster than unfold and uses about 1/5 memory + # Group conv vs. unfold vs. concat batch, 2.9ms :13.5ms :3.8ms + # Group conv vs. unfold vs. concat batch, 278 : 1420 : 369 + # but in real training group conv is slower than concat batch + # so we keep using concat batch. + # fold_x = F.unfold( + # mask_x, + # self.conv_kernel_size, + # padding=int(self.conv_kernel_size // 2)) + # mask_feat = mask_feat.reshape(N, num_proposals, -1) + # new_mask_preds = torch.einsum('bnc,bcl->bnl', mask_feat, fold_x) + # [B, N, C, K*K] -> [B*N, C, K, K] + mask_feat = mask_feat.reshape(N, num_proposals, C, + self.conv_kernel_size, + self.conv_kernel_size) + # [B, C, H, W] -> [1, B*C, H, W] + new_mask_preds = [] + for i in range(N): + new_mask_preds.append( + F.conv2d( + mask_x[i:i + 1], + mask_feat[i], + padding=int(self.conv_kernel_size // 2))) + + new_mask_preds = torch.cat(new_mask_preds, dim=0) + new_mask_preds = new_mask_preds.reshape(N, num_proposals, H, W) + if self.mask_transform_stride == 2: + new_mask_preds = F.interpolate( + new_mask_preds, + scale_factor=2, + mode='bilinear', + align_corners=False) + + if mask_shape is not None and mask_shape[0] != H: + new_mask_preds = F.interpolate( + new_mask_preds, + mask_shape, + align_corners=False, + mode='bilinear') + + return new_mask_preds, obj_feat.permute(0, 1, 3, 2).reshape( + N, num_proposals, self.in_channels, self.conv_kernel_size, + self.conv_kernel_size) + + +@MODELS.register_module() +class IterativeDecodeHead(BaseDecodeHead): + """K-Net: Towards Unified Image Segmentation. + + This head is the implementation of + `K-Net:ใ€€`_. + + Args: + num_stages (int): The number of stages (kernel update heads) + in IterativeDecodeHead. Default: 3. + kernel_generate_head:(dict): Config of kernel generate head which + generate mask predictions, dynamic kernels and class predictions + for next kernel update heads. + kernel_update_head (dict): Config of kernel update head which refine + dynamic kernels and class predictions iteratively. + + """ + + def __init__(self, num_stages, kernel_generate_head, kernel_update_head, + **kwargs): + # ``IterativeDecodeHead`` would skip initialization of + # ``BaseDecodeHead`` which would be called when building + # ``self.kernel_generate_head``. + super(BaseDecodeHead, self).__init__(**kwargs) + assert num_stages == len(kernel_update_head) + self.num_stages = num_stages + self.kernel_generate_head = MODELS.build(kernel_generate_head) + self.kernel_update_head = nn.ModuleList() + self.align_corners = self.kernel_generate_head.align_corners + self.num_classes = self.kernel_generate_head.num_classes + self.input_transform = self.kernel_generate_head.input_transform + self.ignore_index = self.kernel_generate_head.ignore_index + self.out_channels = self.num_classes + + for head_cfg in kernel_update_head: + self.kernel_update_head.append(MODELS.build(head_cfg)) + + def forward(self, inputs): + """Forward function.""" + feats = self.kernel_generate_head._forward_feature(inputs) + sem_seg = self.kernel_generate_head.cls_seg(feats) + seg_kernels = self.kernel_generate_head.conv_seg.weight.clone() + seg_kernels = seg_kernels[None].expand( + feats.size(0), *seg_kernels.size()) + + stage_segs = [sem_seg] + for i in range(self.num_stages): + sem_seg, seg_kernels = self.kernel_update_head[i](feats, + seg_kernels, + sem_seg) + stage_segs.append(sem_seg) + if self.training: + return stage_segs + # only return the prediction of the last stage during testing + return stage_segs[-1] + + def loss_by_feat(self, seg_logits: List[Tensor], + batch_data_samples: SampleList, **kwargs) -> dict: + losses = dict() + for i, logit in enumerate(seg_logits): + loss = self.kernel_generate_head.loss_by_feat( + logit, batch_data_samples) + for k, v in loss.items(): + losses[f'{k}.s{i}'] = v + + return losses diff --git a/mmsegmentation/mmseg/models/decode_heads/lraspp_head.py b/mmsegmentation/mmseg/models/decode_heads/lraspp_head.py new file mode 100644 index 0000000..ba2465f --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/lraspp_head.py @@ -0,0 +1,91 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.utils import is_tuple_of + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + + +@MODELS.register_module() +class LRASPPHead(BaseDecodeHead): + """Lite R-ASPP (LRASPP) head is proposed in Searching for MobileNetV3. + + This head is the improved implementation of `Searching for MobileNetV3 + `_. + + Args: + branch_channels (tuple[int]): The number of output channels in every + each branch. Default: (32, 64). + """ + + def __init__(self, branch_channels=(32, 64), **kwargs): + super().__init__(**kwargs) + if self.input_transform != 'multiple_select': + raise ValueError('in Lite R-ASPP (LRASPP) head, input_transform ' + f'must be \'multiple_select\'. But received ' + f'\'{self.input_transform}\'') + assert is_tuple_of(branch_channels, int) + assert len(branch_channels) == len(self.in_channels) - 1 + self.branch_channels = branch_channels + + self.convs = nn.Sequential() + self.conv_ups = nn.Sequential() + for i in range(len(branch_channels)): + self.convs.add_module( + f'conv{i}', + nn.Conv2d( + self.in_channels[i], branch_channels[i], 1, bias=False)) + self.conv_ups.add_module( + f'conv_up{i}', + ConvModule( + self.channels + branch_channels[i], + self.channels, + 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=False)) + + self.conv_up_input = nn.Conv2d(self.channels, self.channels, 1) + + self.aspp_conv = ConvModule( + self.in_channels[-1], + self.channels, + 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=False) + self.image_pool = nn.Sequential( + nn.AvgPool2d(kernel_size=49, stride=(16, 20)), + ConvModule( + self.in_channels[2], + self.channels, + 1, + act_cfg=dict(type='Sigmoid'), + bias=False)) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + + x = inputs[-1] + + x = self.aspp_conv(x) * resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + x = self.conv_up_input(x) + + for i in range(len(self.branch_channels) - 1, -1, -1): + x = resize( + x, + size=inputs[i].size()[2:], + mode='bilinear', + align_corners=self.align_corners) + x = torch.cat([x, self.convs[i](inputs[i])], 1) + x = self.conv_ups[i](x) + + return self.cls_seg(x) diff --git a/mmsegmentation/mmseg/models/decode_heads/mask2former_head.py b/mmsegmentation/mmseg/models/decode_heads/mask2former_head.py new file mode 100644 index 0000000..0135af0 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/mask2former_head.py @@ -0,0 +1,163 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import BaseModule + +try: + from mmdet.models.dense_heads import \ + Mask2FormerHead as MMDET_Mask2FormerHead +except ModuleNotFoundError: + MMDET_Mask2FormerHead = BaseModule + +from mmengine.structures import InstanceData +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.structures.seg_data_sample import SegDataSample +from mmseg.utils import ConfigType, SampleList + + +@MODELS.register_module() +class Mask2FormerHead(MMDET_Mask2FormerHead): + """Implements the Mask2Former head. + + See `Mask2Former: Masked-attention Mask Transformer for Universal Image + Segmentation `_ for details. + + Args: + num_classes (int): Number of classes. Default: 150. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + ignore_index (int): The label index to be ignored. Default: 255. + """ + + def __init__(self, + num_classes, + align_corners=False, + ignore_index=255, + **kwargs): + super().__init__(**kwargs) + + self.num_classes = num_classes + self.align_corners = align_corners + self.out_channels = num_classes + self.ignore_index = ignore_index + + feat_channels = kwargs['feat_channels'] + self.cls_embed = nn.Linear(feat_channels, self.num_classes + 1) + + def _seg_data_to_instance_data(self, batch_data_samples: SampleList): + """Perform forward propagation to convert paradigm from MMSegmentation + to MMDetection to ensure ``MMDET_Mask2FormerHead`` could be called + normally. Specifically, ``batch_gt_instances`` would be added. + + Args: + batch_data_samples (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + + Returns: + tuple[Tensor]: A tuple contains two lists. + + - batch_gt_instances (list[:obj:`InstanceData`]): Batch of + gt_instance. It usually includes ``labels``, each is + unique ground truth label id of images, with + shape (num_gt, ) and ``masks``, each is ground truth + masks of each instances of a image, shape (num_gt, h, w). + - batch_img_metas (list[dict]): List of image meta information. + """ + batch_img_metas = [] + batch_gt_instances = [] + + for data_sample in batch_data_samples: + batch_img_metas.append(data_sample.metainfo) + gt_sem_seg = data_sample.gt_sem_seg.data + classes = torch.unique( + gt_sem_seg, + sorted=False, + return_inverse=False, + return_counts=False) + + # remove ignored region + gt_labels = classes[classes != self.ignore_index] + + masks = [] + for class_id in gt_labels: + masks.append(gt_sem_seg == class_id) + + if len(masks) == 0: + gt_masks = torch.zeros( + (0, gt_sem_seg.shape[-2], + gt_sem_seg.shape[-1])).to(gt_sem_seg).long() + else: + gt_masks = torch.stack(masks).squeeze(1).long() + + instance_data = InstanceData(labels=gt_labels, masks=gt_masks) + batch_gt_instances.append(instance_data) + return batch_gt_instances, batch_img_metas + + def loss(self, x: Tuple[Tensor], batch_data_samples: SampleList, + train_cfg: ConfigType) -> dict: + """Perform forward propagation and loss calculation of the decoder head + on the features of the upstream network. + + Args: + x (tuple[Tensor]): Multi-level features from the upstream + network, each is a 4D-tensor. + batch_data_samples (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + train_cfg (ConfigType): Training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components. + """ + # batch SegDataSample to InstanceDataSample + batch_gt_instances, batch_img_metas = self._seg_data_to_instance_data( + batch_data_samples) + + # forward + all_cls_scores, all_mask_preds = self(x, batch_data_samples) + + # loss + losses = self.loss_by_feat(all_cls_scores, all_mask_preds, + batch_gt_instances, batch_img_metas) + + return losses + + def predict(self, x: Tuple[Tensor], batch_img_metas: List[dict], + test_cfg: ConfigType) -> Tuple[Tensor]: + """Test without augmentaton. + + Args: + x (tuple[Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + batch_img_metas (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + test_cfg (ConfigType): Test config. + + Returns: + Tensor: A tensor of segmentation mask. + """ + batch_data_samples = [ + SegDataSample(metainfo=metainfo) for metainfo in batch_img_metas + ] + + all_cls_scores, all_mask_preds = self(x, batch_data_samples) + mask_cls_results = all_cls_scores[-1] + mask_pred_results = all_mask_preds[-1] + if 'pad_shape' in batch_img_metas[0]: + size = batch_img_metas[0]['pad_shape'] + else: + size = batch_img_metas[0]['img_shape'] + # upsample mask + mask_pred_results = F.interpolate( + mask_pred_results, size=size, mode='bilinear', align_corners=False) + cls_score = F.softmax(mask_cls_results, dim=-1)[..., :-1] + mask_pred = mask_pred_results.sigmoid() + seg_logits = torch.einsum('bqc, bqhw->bchw', cls_score, mask_pred) + return seg_logits diff --git a/mmsegmentation/mmseg/models/decode_heads/maskformer_head.py b/mmsegmentation/mmseg/models/decode_heads/maskformer_head.py new file mode 100644 index 0000000..6e61a7f --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/maskformer_head.py @@ -0,0 +1,174 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import BaseModule + +try: + from mmdet.models.dense_heads import MaskFormerHead as MMDET_MaskFormerHead +except ModuleNotFoundError: + MMDET_MaskFormerHead = BaseModule + +from mmengine.structures import InstanceData +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.structures.seg_data_sample import SegDataSample +from mmseg.utils import ConfigType, SampleList + + +@MODELS.register_module() +class MaskFormerHead(MMDET_MaskFormerHead): + """Implements the MaskFormer head. + + See `Per-Pixel Classification is Not All You Need for Semantic Segmentation + `_ for details. + + Args: + num_classes (int): Number of classes. Default: 150. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + ignore_index (int): The label index to be ignored. Default: 255. + """ + + def __init__(self, + num_classes: int = 150, + align_corners: bool = False, + ignore_index: int = 255, + **kwargs) -> None: + super().__init__(**kwargs) + + self.out_channels = kwargs['out_channels'] + self.align_corners = True + self.num_classes = num_classes + self.align_corners = align_corners + self.out_channels = num_classes + self.ignore_index = ignore_index + + feat_channels = kwargs['feat_channels'] + self.cls_embed = nn.Linear(feat_channels, self.num_classes + 1) + + def _seg_data_to_instance_data(self, batch_data_samples: SampleList): + """Perform forward propagation to convert paradigm from MMSegmentation + to MMDetection to ensure ``MMDET_MaskFormerHead`` could be called + normally. Specifically, ``batch_gt_instances`` would be added. + + Args: + batch_data_samples (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + + Returns: + tuple[Tensor]: A tuple contains two lists. + + - batch_gt_instances (list[:obj:`InstanceData`]): Batch of + gt_instance. It usually includes ``labels``, each is + unique ground truth label id of images, with + shape (num_gt, ) and ``masks``, each is ground truth + masks of each instances of a image, shape (num_gt, h, w). + - batch_img_metas (list[dict]): List of image meta information. + """ + batch_img_metas = [] + batch_gt_instances = [] + for data_sample in batch_data_samples: + # Add `batch_input_shape` in metainfo of data_sample, which would + # be used in MaskFormerHead of MMDetection. + metainfo = data_sample.metainfo + metainfo['batch_input_shape'] = metainfo['img_shape'] + data_sample.set_metainfo(metainfo) + batch_img_metas.append(data_sample.metainfo) + gt_sem_seg = data_sample.gt_sem_seg.data + classes = torch.unique( + gt_sem_seg, + sorted=False, + return_inverse=False, + return_counts=False) + + # remove ignored region + gt_labels = classes[classes != self.ignore_index] + + masks = [] + for class_id in gt_labels: + masks.append(gt_sem_seg == class_id) + + if len(masks) == 0: + gt_masks = torch.zeros((0, gt_sem_seg.shape[-2], + gt_sem_seg.shape[-1])).to(gt_sem_seg) + else: + gt_masks = torch.stack(masks).squeeze(1) + + instance_data = InstanceData( + labels=gt_labels, masks=gt_masks.long()) + batch_gt_instances.append(instance_data) + return batch_gt_instances, batch_img_metas + + def loss(self, x: Tuple[Tensor], batch_data_samples: SampleList, + train_cfg: ConfigType) -> dict: + """Perform forward propagation and loss calculation of the decoder head + on the features of the upstream network. + + Args: + x (tuple[Tensor]): Multi-level features from the upstream + network, each is a 4D-tensor. + batch_data_samples (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + train_cfg (ConfigType): Training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components. + """ + # batch SegDataSample to InstanceDataSample + batch_gt_instances, batch_img_metas = self._seg_data_to_instance_data( + batch_data_samples) + + # forward + all_cls_scores, all_mask_preds = self(x, batch_data_samples) + + # loss + losses = self.loss_by_feat(all_cls_scores, all_mask_preds, + batch_gt_instances, batch_img_metas) + + return losses + + def predict(self, x: Tuple[Tensor], batch_img_metas: List[dict], + test_cfg: ConfigType) -> Tuple[Tensor]: + """Test without augmentaton. + + Args: + x (tuple[Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + batch_img_metas (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + test_cfg (ConfigType): Test config. + + Returns: + Tensor: A tensor of segmentation mask. + """ + + batch_data_samples = [] + for metainfo in batch_img_metas: + metainfo['batch_input_shape'] = metainfo['img_shape'] + batch_data_samples.append(SegDataSample(metainfo=metainfo)) + # Forward function of MaskFormerHead from MMDetection needs + # 'batch_data_samples' as inputs, which is image shapeใ€€actually. + all_cls_scores, all_mask_preds = self(x, batch_data_samples) + mask_cls_results = all_cls_scores[-1] + mask_pred_results = all_mask_preds[-1] + + # upsample masks + img_shape = batch_img_metas[0]['batch_input_shape'] + mask_pred_results = F.interpolate( + mask_pred_results, + size=img_shape, + mode='bilinear', + align_corners=False) + + # semantic inference + cls_score = F.softmax(mask_cls_results, dim=-1)[..., :-1] + mask_pred = mask_pred_results.sigmoid() + seg_logits = torch.einsum('bqc,bqhw->bchw', cls_score, mask_pred) + return seg_logits diff --git a/mmsegmentation/mmseg/models/decode_heads/nl_head.py b/mmsegmentation/mmseg/models/decode_heads/nl_head.py new file mode 100644 index 0000000..0ffcc2a --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/nl_head.py @@ -0,0 +1,50 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.cnn import NonLocal2d + +from mmseg.registry import MODELS +from .fcn_head import FCNHead + + +@MODELS.register_module() +class NLHead(FCNHead): + """Non-local Neural Networks. + + This head is the implementation of `NLNet + `_. + + Args: + reduction (int): Reduction factor of projection transform. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + sqrt(1/inter_channels). Default: True. + mode (str): The nonlocal mode. Options are 'embedded_gaussian', + 'dot_product'. Default: 'embedded_gaussian.'. + """ + + def __init__(self, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + **kwargs): + super().__init__(num_convs=2, **kwargs) + self.reduction = reduction + self.use_scale = use_scale + self.mode = mode + self.nl_block = NonLocal2d( + in_channels=self.channels, + reduction=self.reduction, + use_scale=self.use_scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + mode=self.mode) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.nl_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/ocr_head.py b/mmsegmentation/mmseg/models/decode_heads/ocr_head.py new file mode 100644 index 0000000..9afe37b --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/ocr_head.py @@ -0,0 +1,127 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from ..utils import resize +from .cascade_decode_head import BaseCascadeDecodeHead + + +class SpatialGatherModule(nn.Module): + """Aggregate the context features according to the initial predicted + probability distribution. + + Employ the soft-weighted method to aggregate the context. + """ + + def __init__(self, scale): + super().__init__() + self.scale = scale + + def forward(self, feats, probs): + """Forward function.""" + batch_size, num_classes, height, width = probs.size() + channels = feats.size(1) + probs = probs.view(batch_size, num_classes, -1) + feats = feats.view(batch_size, channels, -1) + # [batch_size, height*width, num_classes] + feats = feats.permute(0, 2, 1) + # [batch_size, channels, height*width] + probs = F.softmax(self.scale * probs, dim=2) + # [batch_size, channels, num_classes] + ocr_context = torch.matmul(probs, feats) + ocr_context = ocr_context.permute(0, 2, 1).contiguous().unsqueeze(3) + return ocr_context + + +class ObjectAttentionBlock(_SelfAttentionBlock): + """Make a OCR used SelfAttentionBlock.""" + + def __init__(self, in_channels, channels, scale, conv_cfg, norm_cfg, + act_cfg): + if scale > 1: + query_downsample = nn.MaxPool2d(kernel_size=scale) + else: + query_downsample = None + super().__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=query_downsample, + key_downsample=None, + key_query_num_convs=2, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=True, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.bottleneck = ConvModule( + in_channels * 2, + in_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, query_feats, key_feats): + """Forward function.""" + context = super().forward(query_feats, key_feats) + output = self.bottleneck(torch.cat([context, query_feats], dim=1)) + if self.query_downsample is not None: + output = resize(query_feats) + + return output + + +@MODELS.register_module() +class OCRHead(BaseCascadeDecodeHead): + """Object-Contextual Representations for Semantic Segmentation. + + This head is the implementation of `OCRNet + `_. + + Args: + ocr_channels (int): The intermediate channels of OCR block. + scale (int): The scale of probability map in SpatialGatherModule in + Default: 1. + """ + + def __init__(self, ocr_channels, scale=1, **kwargs): + super().__init__(**kwargs) + self.ocr_channels = ocr_channels + self.scale = scale + self.object_context_block = ObjectAttentionBlock( + self.channels, + self.ocr_channels, + self.scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.spatial_gather_module = SpatialGatherModule(self.scale) + + self.bottleneck = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs, prev_output): + """Forward function.""" + x = self._transform_inputs(inputs) + feats = self.bottleneck(x) + context = self.spatial_gather_module(feats, prev_output) + object_context = self.object_context_block(feats, context) + output = self.cls_seg(object_context) + + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/pid_head.py b/mmsegmentation/mmseg/models/decode_heads/pid_head.py new file mode 100644 index 0000000..c092cb3 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/pid_head.py @@ -0,0 +1,183 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Tuple, Union + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer +from mmengine.model import BaseModule +from torch import Tensor + +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.models.losses import accuracy +from mmseg.models.utils import resize +from mmseg.registry import MODELS +from mmseg.utils import OptConfigType, SampleList + + +class BasePIDHead(BaseModule): + """Base class for PID head. + + Args: + in_channels (int): Number of input channels. + channels (int): Number of output channels. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU', inplace=True). + init_cfg (dict or list[dict], optional): Init config dict. + Default: None. + """ + + def __init__(self, + in_channels: int, + channels: int, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + self.conv = ConvModule( + in_channels, + channels, + kernel_size=3, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + order=('norm', 'act', 'conv')) + _, self.norm = build_norm_layer(norm_cfg, num_features=channels) + self.act = build_activation_layer(act_cfg) + + def forward(self, x: Tensor, cls_seg: Optional[nn.Module]) -> Tensor: + """Forward function. + Args: + x (Tensor): Input tensor. + cls_seg (nn.Module, optional): The classification head. + + Returns: + Tensor: Output tensor. + """ + x = self.conv(x) + x = self.norm(x) + x = self.act(x) + if cls_seg is not None: + x = cls_seg(x) + return x + + +@MODELS.register_module() +class PIDHead(BaseDecodeHead): + """Decode head for PIDNet. + + Args: + in_channels (int): Number of input channels. + channels (int): Number of output channels. + num_classes (int): Number of classes. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU', inplace=True). + """ + + def __init__(self, + in_channels: int, + channels: int, + num_classes: int, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + **kwargs): + super().__init__( + in_channels, + channels, + num_classes=num_classes, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **kwargs) + self.i_head = BasePIDHead(in_channels, channels, norm_cfg, act_cfg) + self.p_head = BasePIDHead(in_channels // 2, channels, norm_cfg, + act_cfg) + self.d_head = BasePIDHead( + in_channels // 2, + in_channels // 4, + norm_cfg, + ) + self.p_cls_seg = nn.Conv2d(channels, self.out_channels, kernel_size=1) + self.d_cls_seg = nn.Conv2d(in_channels // 4, 1, kernel_size=1) + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_( + m.weight, mode='fan_out', nonlinearity='relu') + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + def forward( + self, + inputs: Union[Tensor, + Tuple[Tensor]]) -> Union[Tensor, Tuple[Tensor]]: + """Forward function. + Args: + inputs (Tensor | tuple[Tensor]): Input tensor or tuple of + Tensor. When training, the input is a tuple of three tensors, + (p_feat, i_feat, d_feat), and the output is a tuple of three + tensors, (p_seg_logit, i_seg_logit, d_seg_logit). + When inference, only the head of integral branch is used, and + input is a tensor of integral feature map, and the output is + the segmentation logit. + + Returns: + Tensor | tuple[Tensor]: Output tensor or tuple of tensors. + """ + if self.training: + x_p, x_i, x_d = inputs + x_p = self.p_head(x_p, self.p_cls_seg) + x_i = self.i_head(x_i, self.cls_seg) + x_d = self.d_head(x_d, self.d_cls_seg) + return x_p, x_i, x_d + else: + return self.i_head(inputs, self.cls_seg) + + def _stack_batch_gt(self, batch_data_samples: SampleList) -> Tuple[Tensor]: + gt_semantic_segs = [ + data_sample.gt_sem_seg.data for data_sample in batch_data_samples + ] + gt_edge_segs = [ + data_sample.gt_edge_map.data for data_sample in batch_data_samples + ] + gt_sem_segs = torch.stack(gt_semantic_segs, dim=0) + gt_edge_segs = torch.stack(gt_edge_segs, dim=0) + return gt_sem_segs, gt_edge_segs + + def loss_by_feat(self, seg_logits: Tuple[Tensor], + batch_data_samples: SampleList) -> dict: + loss = dict() + p_logit, i_logit, d_logit = seg_logits + sem_label, bd_label = self._stack_batch_gt(batch_data_samples) + p_logit = resize( + input=p_logit, + size=sem_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + i_logit = resize( + input=i_logit, + size=sem_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + d_logit = resize( + input=d_logit, + size=bd_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + sem_label = sem_label.squeeze(1) + bd_label = bd_label.squeeze(1) + loss['loss_sem_p'] = self.loss_decode[0]( + p_logit, sem_label, ignore_index=self.ignore_index) + loss['loss_sem_i'] = self.loss_decode[1](i_logit, sem_label) + loss['loss_bd'] = self.loss_decode[2](d_logit, bd_label) + filler = torch.ones_like(sem_label) * self.ignore_index + sem_bd_label = torch.where( + torch.sigmoid(d_logit[:, 0, :, :]) > 0.8, sem_label, filler) + loss['loss_sem_bd'] = self.loss_decode[3](i_logit, sem_bd_label) + loss['acc_seg'] = accuracy( + i_logit, sem_label, ignore_index=self.ignore_index) + return loss diff --git a/mmsegmentation/mmseg/models/decode_heads/point_head.py b/mmsegmentation/mmseg/models/decode_heads/point_head.py new file mode 100644 index 0000000..e8e433d --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/point_head.py @@ -0,0 +1,367 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Modified from https://github.com/facebookresearch/detectron2/tree/master/projects/PointRend/point_head/point_head.py # noqa + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +try: + from mmcv.ops import point_sample +except ModuleNotFoundError: + point_sample = None + +from typing import List + +from mmseg.registry import MODELS +from mmseg.utils import SampleList +from ..losses import accuracy +from ..utils import resize +from .cascade_decode_head import BaseCascadeDecodeHead + + +def calculate_uncertainty(seg_logits): + """Estimate uncertainty based on seg logits. + + For each location of the prediction ``seg_logits`` we estimate + uncertainty as the difference between top first and top second + predicted logits. + + Args: + seg_logits (Tensor): Semantic segmentation logits, + shape (batch_size, num_classes, height, width). + + Returns: + scores (Tensor): T uncertainty scores with the most uncertain + locations having the highest uncertainty score, shape ( + batch_size, 1, height, width) + """ + top2_scores = torch.topk(seg_logits, k=2, dim=1)[0] + return (top2_scores[:, 1] - top2_scores[:, 0]).unsqueeze(1) + + +@MODELS.register_module() +class PointHead(BaseCascadeDecodeHead): + """A mask point head use in PointRend. + + This head is implemented of `PointRend: Image Segmentation as + Rendering `_. + ``PointHead`` use shared multi-layer perceptron (equivalent to + nn.Conv1d) to predict the logit of input points. The fine-grained feature + and coarse feature will be concatenate together for predication. + + Args: + num_fcs (int): Number of fc layers in the head. Default: 3. + in_channels (int): Number of input channels. Default: 256. + fc_channels (int): Number of fc channels. Default: 256. + num_classes (int): Number of classes for logits. Default: 80. + class_agnostic (bool): Whether use class agnostic classification. + If so, the output channels of logits will be 1. Default: False. + coarse_pred_each_layer (bool): Whether concatenate coarse feature with + the output of each fc layer. Default: True. + conv_cfg (dict|None): Dictionary to construct and config conv layer. + Default: dict(type='Conv1d')) + norm_cfg (dict|None): Dictionary to construct and config norm layer. + Default: None. + loss_point (dict): Dictionary to construct and config loss layer of + point head. Default: dict(type='CrossEntropyLoss', use_mask=True, + loss_weight=1.0). + """ + + def __init__(self, + num_fcs=3, + coarse_pred_each_layer=True, + conv_cfg=dict(type='Conv1d'), + norm_cfg=None, + act_cfg=dict(type='ReLU', inplace=False), + **kwargs): + super().__init__( + input_transform='multiple_select', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + init_cfg=dict( + type='Normal', std=0.01, override=dict(name='fc_seg')), + **kwargs) + if point_sample is None: + raise RuntimeError('Please install mmcv-full for ' + 'point_sample ops') + + self.num_fcs = num_fcs + self.coarse_pred_each_layer = coarse_pred_each_layer + + fc_in_channels = sum(self.in_channels) + self.num_classes + fc_channels = self.channels + self.fcs = nn.ModuleList() + for k in range(num_fcs): + fc = ConvModule( + fc_in_channels, + fc_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.fcs.append(fc) + fc_in_channels = fc_channels + fc_in_channels += self.num_classes if self.coarse_pred_each_layer \ + else 0 + self.fc_seg = nn.Conv1d( + fc_in_channels, + self.num_classes, + kernel_size=1, + stride=1, + padding=0) + if self.dropout_ratio > 0: + self.dropout = nn.Dropout(self.dropout_ratio) + delattr(self, 'conv_seg') + + def cls_seg(self, feat): + """Classify each pixel with fc.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.fc_seg(feat) + return output + + def forward(self, fine_grained_point_feats, coarse_point_feats): + x = torch.cat([fine_grained_point_feats, coarse_point_feats], dim=1) + for fc in self.fcs: + x = fc(x) + if self.coarse_pred_each_layer: + x = torch.cat((x, coarse_point_feats), dim=1) + return self.cls_seg(x) + + def _get_fine_grained_point_feats(self, x, points): + """Sample from fine grained features. + + Args: + x (list[Tensor]): Feature pyramid from by neck or backbone. + points (Tensor): Point coordinates, shape (batch_size, + num_points, 2). + + Returns: + fine_grained_feats (Tensor): Sampled fine grained feature, + shape (batch_size, sum(channels of x), num_points). + """ + + fine_grained_feats_list = [ + point_sample(_, points, align_corners=self.align_corners) + for _ in x + ] + if len(fine_grained_feats_list) > 1: + fine_grained_feats = torch.cat(fine_grained_feats_list, dim=1) + else: + fine_grained_feats = fine_grained_feats_list[0] + + return fine_grained_feats + + def _get_coarse_point_feats(self, prev_output, points): + """Sample from fine grained features. + + Args: + prev_output (list[Tensor]): Prediction of previous decode head. + points (Tensor): Point coordinates, shape (batch_size, + num_points, 2). + + Returns: + coarse_feats (Tensor): Sampled coarse feature, shape (batch_size, + num_classes, num_points). + """ + + coarse_feats = point_sample( + prev_output, points, align_corners=self.align_corners) + + return coarse_feats + + def loss(self, inputs, prev_output, batch_data_samples: SampleList, + train_cfg, **kwargs): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + batch_data_samples (list[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `img_metas` or `gt_semantic_seg`. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + x = self._transform_inputs(inputs) + with torch.no_grad(): + points = self.get_points_train( + prev_output, calculate_uncertainty, cfg=train_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, points) + coarse_point_feats = self._get_coarse_point_feats(prev_output, points) + point_logits = self.forward(fine_grained_point_feats, + coarse_point_feats) + + losses = self.loss_by_feat(point_logits, points, batch_data_samples) + + return losses + + def predict(self, inputs, prev_output, batch_img_metas: List[dict], + test_cfg, **kwargs): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + + x = self._transform_inputs(inputs) + refined_seg_logits = prev_output.clone() + for _ in range(test_cfg.subdivision_steps): + refined_seg_logits = resize( + refined_seg_logits, + scale_factor=test_cfg.scale_factor, + mode='bilinear', + align_corners=self.align_corners) + batch_size, channels, height, width = refined_seg_logits.shape + point_indices, points = self.get_points_test( + refined_seg_logits, calculate_uncertainty, cfg=test_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, points) + coarse_point_feats = self._get_coarse_point_feats( + prev_output, points) + point_logits = self.forward(fine_grained_point_feats, + coarse_point_feats) + + point_indices = point_indices.unsqueeze(1).expand(-1, channels, -1) + refined_seg_logits = refined_seg_logits.reshape( + batch_size, channels, height * width) + refined_seg_logits = refined_seg_logits.scatter_( + 2, point_indices, point_logits) + refined_seg_logits = refined_seg_logits.view( + batch_size, channels, height, width) + + return self.predict_by_feat(refined_seg_logits, batch_img_metas, + **kwargs) + + def loss_by_feat(self, point_logits, points, batch_data_samples, **kwargs): + """Compute segmentation loss.""" + gt_semantic_seg = self._stack_batch_gt(batch_data_samples) + point_label = point_sample( + gt_semantic_seg.float(), + points, + mode='nearest', + align_corners=self.align_corners) + point_label = point_label.squeeze(1).long() + + loss = dict() + if not isinstance(self.loss_decode, nn.ModuleList): + losses_decode = [self.loss_decode] + else: + losses_decode = self.loss_decode + for loss_module in losses_decode: + loss['point' + loss_module.loss_name] = loss_module( + point_logits, point_label, ignore_index=self.ignore_index) + + loss['acc_point'] = accuracy( + point_logits, point_label, ignore_index=self.ignore_index) + return loss + + def get_points_train(self, seg_logits, uncertainty_func, cfg): + """Sample points for training. + + Sample points in [0, 1] x [0, 1] coordinate space based on their + uncertainty. The uncertainties are calculated for each point using + 'uncertainty_func' function that takes point's logit prediction as + input. + + Args: + seg_logits (Tensor): Semantic segmentation logits, shape ( + batch_size, num_classes, height, width). + uncertainty_func (func): uncertainty calculation function. + cfg (dict): Training config of point head. + + Returns: + point_coords (Tensor): A tensor of shape (batch_size, num_points, + 2) that contains the coordinates of ``num_points`` sampled + points. + """ + num_points = cfg.num_points + oversample_ratio = cfg.oversample_ratio + importance_sample_ratio = cfg.importance_sample_ratio + assert oversample_ratio >= 1 + assert 0 <= importance_sample_ratio <= 1 + batch_size = seg_logits.shape[0] + num_sampled = int(num_points * oversample_ratio) + point_coords = torch.rand( + batch_size, num_sampled, 2, device=seg_logits.device) + point_logits = point_sample(seg_logits, point_coords) + # It is crucial to calculate uncertainty based on the sampled + # prediction value for the points. Calculating uncertainties of the + # coarse predictions first and sampling them for points leads to + # incorrect results. To illustrate this: assume uncertainty func( + # logits)=-abs(logits), a sampled point between two coarse + # predictions with -1 and 1 logits has 0 logits, and therefore 0 + # uncertainty value. However, if we calculate uncertainties for the + # coarse predictions first, both will have -1 uncertainty, + # and sampled point will get -1 uncertainty. + point_uncertainties = uncertainty_func(point_logits) + num_uncertain_points = int(importance_sample_ratio * num_points) + num_random_points = num_points - num_uncertain_points + idx = torch.topk( + point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1] + shift = num_sampled * torch.arange( + batch_size, dtype=torch.long, device=seg_logits.device) + idx += shift[:, None] + point_coords = point_coords.view(-1, 2)[idx.view(-1), :].view( + batch_size, num_uncertain_points, 2) + if num_random_points > 0: + rand_point_coords = torch.rand( + batch_size, num_random_points, 2, device=seg_logits.device) + point_coords = torch.cat((point_coords, rand_point_coords), dim=1) + return point_coords + + def get_points_test(self, seg_logits, uncertainty_func, cfg): + """Sample points for testing. + + Find ``num_points`` most uncertain points from ``uncertainty_map``. + + Args: + seg_logits (Tensor): A tensor of shape (batch_size, num_classes, + height, width) for class-specific or class-agnostic prediction. + uncertainty_func (func): uncertainty calculation function. + cfg (dict): Testing config of point head. + + Returns: + point_indices (Tensor): A tensor of shape (batch_size, num_points) + that contains indices from [0, height x width) of the most + uncertain points. + point_coords (Tensor): A tensor of shape (batch_size, num_points, + 2) that contains [0, 1] x [0, 1] normalized coordinates of the + most uncertain points from the ``height x width`` grid . + """ + + num_points = cfg.subdivision_num_points + uncertainty_map = uncertainty_func(seg_logits) + batch_size, _, height, width = uncertainty_map.shape + h_step = 1.0 / height + w_step = 1.0 / width + + uncertainty_map = uncertainty_map.view(batch_size, height * width) + num_points = min(height * width, num_points) + point_indices = uncertainty_map.topk(num_points, dim=1)[1] + point_coords = torch.zeros( + batch_size, + num_points, + 2, + dtype=torch.float, + device=seg_logits.device) + point_coords[:, :, 0] = w_step / 2.0 + (point_indices % + width).float() * w_step + point_coords[:, :, 1] = h_step / 2.0 + (point_indices // + width).float() * h_step + return point_indices, point_coords diff --git a/mmsegmentation/mmseg/models/decode_heads/psa_head.py b/mmsegmentation/mmseg/models/decode_heads/psa_head.py new file mode 100644 index 0000000..13ee5c5 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/psa_head.py @@ -0,0 +1,197 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + +try: + from mmcv.ops import PSAMask +except ModuleNotFoundError: + PSAMask = None + + +@MODELS.register_module() +class PSAHead(BaseDecodeHead): + """Point-wise Spatial Attention Network for Scene Parsing. + + This head is the implementation of `PSANet + `_. + + Args: + mask_size (tuple[int]): The PSA mask size. It usually equals input + size. + psa_type (str): The type of psa module. Options are 'collect', + 'distribute', 'bi-direction'. Default: 'bi-direction' + compact (bool): Whether use compact map for 'collect' mode. + Default: True. + shrink_factor (int): The downsample factors of psa mask. Default: 2. + normalization_factor (float): The normalize factor of attention. + psa_softmax (bool): Whether use softmax for attention. + """ + + def __init__(self, + mask_size, + psa_type='bi-direction', + compact=False, + shrink_factor=2, + normalization_factor=1.0, + psa_softmax=True, + **kwargs): + if PSAMask is None: + raise RuntimeError('Please install mmcv-full for PSAMask ops') + super().__init__(**kwargs) + assert psa_type in ['collect', 'distribute', 'bi-direction'] + self.psa_type = psa_type + self.compact = compact + self.shrink_factor = shrink_factor + self.mask_size = mask_size + mask_h, mask_w = mask_size + self.psa_softmax = psa_softmax + if normalization_factor is None: + normalization_factor = mask_h * mask_w + self.normalization_factor = normalization_factor + + self.reduce = ConvModule( + self.in_channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.attention = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Conv2d( + self.channels, mask_h * mask_w, kernel_size=1, bias=False)) + if psa_type == 'bi-direction': + self.reduce_p = ConvModule( + self.in_channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.attention_p = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Conv2d( + self.channels, mask_h * mask_w, kernel_size=1, bias=False)) + self.psamask_collect = PSAMask('collect', mask_size) + self.psamask_distribute = PSAMask('distribute', mask_size) + else: + self.psamask = PSAMask(psa_type, mask_size) + self.proj = ConvModule( + self.channels * (2 if psa_type == 'bi-direction' else 1), + self.in_channels, + kernel_size=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + self.in_channels * 2, + self.channels, + kernel_size=3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + identity = x + align_corners = self.align_corners + if self.psa_type in ['collect', 'distribute']: + out = self.reduce(x) + n, c, h, w = out.size() + if self.shrink_factor != 1: + if h % self.shrink_factor and w % self.shrink_factor: + h = (h - 1) // self.shrink_factor + 1 + w = (w - 1) // self.shrink_factor + 1 + align_corners = True + else: + h = h // self.shrink_factor + w = w // self.shrink_factor + align_corners = False + out = resize( + out, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + y = self.attention(out) + if self.compact: + if self.psa_type == 'collect': + y = y.view(n, h * w, + h * w).transpose(1, 2).view(n, h * w, h, w) + else: + y = self.psamask(y) + if self.psa_softmax: + y = F.softmax(y, dim=1) + out = torch.bmm( + out.view(n, c, h * w), y.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + else: + x_col = self.reduce(x) + x_dis = self.reduce_p(x) + n, c, h, w = x_col.size() + if self.shrink_factor != 1: + if h % self.shrink_factor and w % self.shrink_factor: + h = (h - 1) // self.shrink_factor + 1 + w = (w - 1) // self.shrink_factor + 1 + align_corners = True + else: + h = h // self.shrink_factor + w = w // self.shrink_factor + align_corners = False + x_col = resize( + x_col, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + x_dis = resize( + x_dis, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + y_col = self.attention(x_col) + y_dis = self.attention_p(x_dis) + if self.compact: + y_dis = y_dis.view(n, h * w, + h * w).transpose(1, 2).view(n, h * w, h, w) + else: + y_col = self.psamask_collect(y_col) + y_dis = self.psamask_distribute(y_dis) + if self.psa_softmax: + y_col = F.softmax(y_col, dim=1) + y_dis = F.softmax(y_dis, dim=1) + x_col = torch.bmm( + x_col.view(n, c, h * w), y_col.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + x_dis = torch.bmm( + x_dis.view(n, c, h * w), y_dis.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + out = torch.cat([x_col, x_dis], 1) + out = self.proj(out) + out = resize( + out, + size=identity.shape[2:], + mode='bilinear', + align_corners=align_corners) + out = self.bottleneck(torch.cat((identity, out), dim=1)) + out = self.cls_seg(out) + return out diff --git a/mmsegmentation/mmseg/models/decode_heads/psp_head.py b/mmsegmentation/mmseg/models/decode_heads/psp_head.py new file mode 100644 index 0000000..a40ec41 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/psp_head.py @@ -0,0 +1,117 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead + + +class PPM(nn.ModuleList): + """Pooling Pyramid Module used in PSPNet. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + align_corners (bool): align_corners argument of F.interpolate. + """ + + def __init__(self, pool_scales, in_channels, channels, conv_cfg, norm_cfg, + act_cfg, align_corners, **kwargs): + super().__init__() + self.pool_scales = pool_scales + self.align_corners = align_corners + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + for pool_scale in pool_scales: + self.append( + nn.Sequential( + nn.AdaptiveAvgPool2d(pool_scale), + ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + **kwargs))) + + def forward(self, x): + """Forward function.""" + ppm_outs = [] + for ppm in self: + ppm_out = ppm(x) + upsampled_ppm_out = resize( + ppm_out, + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ppm_outs.append(upsampled_ppm_out) + return ppm_outs + + +@MODELS.register_module() +class PSPHead(BaseDecodeHead): + """Pyramid Scene Parsing Network. + + This head is the implementation of + `PSPNet `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. Default: (1, 2, 3, 6). + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super().__init__(**kwargs) + assert isinstance(pool_scales, (list, tuple)) + self.pool_scales = pool_scales + self.psp_modules = PPM( + self.pool_scales, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.bottleneck = ConvModule( + self.in_channels + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def _forward_feature(self, inputs): + """Forward function for feature maps before classifying each pixel with + ``self.cls_seg`` fc. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + feats (Tensor): A tensor of shape (batch_size, self.channels, + H, W) which is feature map for last layer of decoder head. + """ + x = self._transform_inputs(inputs) + psp_outs = [x] + psp_outs.extend(self.psp_modules(x)) + psp_outs = torch.cat(psp_outs, dim=1) + feats = self.bottleneck(psp_outs) + return feats + + def forward(self, inputs): + """Forward function.""" + output = self._forward_feature(inputs) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/san_head.py b/mmsegmentation/mmseg/models/decode_heads/san_head.py new file mode 100644 index 0000000..d20da80 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/san_head.py @@ -0,0 +1,736 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from functools import partial +from typing import Dict, List, Tuple + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, build_norm_layer +from mmcv.cnn.bricks.transformer import BaseTransformerLayer +from mmcv.ops import point_sample +from mmengine.dist import all_reduce +from mmengine.model.weight_init import (caffe2_xavier_init, normal_init, + trunc_normal_) +from mmengine.runner.checkpoint import CheckpointLoader, load_state_dict +from mmengine.structures import InstanceData +from torch import Tensor +from torch.nn import functional as F + +from mmseg.models.backbones.vit import TransformerEncoderLayer +from mmseg.registry import MODELS +from mmseg.utils import (ConfigType, MatchMasks, SampleList, + seg_data_to_instance_data) +from ..utils import (MLP, LayerNorm2d, PatchEmbed, cross_attn_layer, + get_uncertain_point_coords_with_randomness, resize) +from .decode_head import BaseDecodeHead + + +class MLPMaskDecoder(nn.Module): + """Module for decoding query and visual features with MLP layers to + generate the attention biases and the mask proposals.""" + + def __init__( + self, + *, + in_channels: int, + total_heads: int = 1, + total_layers: int = 1, + embed_channels: int = 256, + mlp_channels: int = 256, + mlp_num_layers: int = 3, + rescale_attn_bias: bool = False, + ): + super().__init__() + self.total_heads = total_heads + self.total_layers = total_layers + + dense_affine_func = partial(nn.Conv2d, kernel_size=1) + # Query Branch + self.query_mlp = MLP(in_channels, mlp_channels, embed_channels, + mlp_num_layers) + # Pixel Branch + self.pix_mlp = MLP( + in_channels, + mlp_channels, + embed_channels, + mlp_num_layers, + affine_func=dense_affine_func, + ) + # Attention Bias Branch + self.attn_mlp = MLP( + in_channels, + mlp_channels, + embed_channels * self.total_heads * self.total_layers, + mlp_num_layers, + affine_func=dense_affine_func, + ) + if rescale_attn_bias: + self.bias_scaling = nn.Linear(1, 1) + else: + self.bias_scaling = nn.Identity() + + def forward(self, query: torch.Tensor, + x: torch.Tensor) -> Tuple[torch.Tensor, List[torch.Tensor]]: + """Forward function. + Args: + query (Tensor): Query Tokens [B,N,C]. + x (Tensor): Visual features [B,C,H,W] + + Return: + mask_preds (Tensor): Mask proposals. + attn_bias (List[Tensor]): List of attention bias. + """ + query = self.query_mlp(query) + pix = self.pix_mlp(x) + b, c, h, w = pix.shape + # preidict mask + mask_preds = torch.einsum('bqc,bchw->bqhw', query, pix) + # generate attn bias + attn = self.attn_mlp(x) + attn = attn.reshape(b, self.total_layers, self.total_heads, c, h, w) + attn_bias = torch.einsum('bqc,blnchw->blnqhw', query, attn) + attn_bias = self.bias_scaling(attn_bias[..., None]).squeeze(-1) + attn_bias = attn_bias.chunk(self.total_layers, dim=1) + attn_bias = [attn.squeeze(1) for attn in attn_bias] + return mask_preds, attn_bias + + +class SideAdapterNetwork(nn.Module): + """Side Adapter Network for predicting mask proposals and attention bias. + + Args: + in_channels (int): Number of input channels. Default: 3. + clip_channels (int): Number of channels of visual features. + Default: 768. + embed_dims (int): embedding dimension. Default: 240. + patch_size (int): The patch size. Default: 16. + patch_bias (bool): Whether use bias in patch embedding. + Default: True. + num_queries (int): Number of queries for mask proposals. + Default: 100. + fusion_index (List[int]): The layer number of the encode + transformer to fuse with the CLIP feature. + Default: [0, 1, 2, 3]. + cfg_encoder (ConfigType): Configs for the encode layers. + cfg_decoder (ConfigType): Configs for the decode layers. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + """ + + def __init__( + self, + in_channels: int = 3, + clip_channels: int = 768, + embed_dims: int = 240, + patch_size: int = 16, + patch_bias: bool = True, + num_queries: int = 100, + fusion_index: list = [0, 1, 2, 3], + cfg_encoder: ConfigType = ..., + cfg_decoder: ConfigType = ..., + norm_cfg: dict = dict(type='LN'), + ): + super().__init__() + + self.patch_embed = PatchEmbed( + in_channels=in_channels, + embed_dims=embed_dims, + conv_type='Conv2d', + kernel_size=patch_size, + stride=patch_size, + padding=0, + input_size=(640, 640), + bias=patch_bias, + norm_cfg=None, + init_cfg=None, + ) + ori_h, ori_w = self.patch_embed.init_out_size + num_patches = ori_h * ori_w + self.pos_embed = nn.Parameter( + torch.randn(1, num_patches, embed_dims) * .02) + self.query_pos_embed = nn.Parameter( + torch.zeros(1, num_queries, embed_dims)) + self.query_embed = nn.Parameter( + torch.zeros(1, num_queries, embed_dims)) + encode_layers = [] + for i in range(cfg_encoder.num_encode_layer): + encode_layers.append( + TransformerEncoderLayer( + embed_dims=embed_dims, + num_heads=cfg_encoder.num_heads, + feedforward_channels=cfg_encoder.mlp_ratio * embed_dims, + norm_cfg=norm_cfg)) + self.encode_layers = nn.ModuleList(encode_layers) + conv_clips = [] + for i in range(len(fusion_index)): + conv_clips.append( + nn.Sequential( + LayerNorm2d(clip_channels), + ConvModule( + clip_channels, + embed_dims, + kernel_size=1, + norm_cfg=None, + act_cfg=None))) + self.conv_clips = nn.ModuleList(conv_clips) + self.fusion_index = fusion_index + self.mask_decoder = MLPMaskDecoder( + in_channels=embed_dims, + total_heads=cfg_decoder.num_heads, + total_layers=cfg_decoder.num_layers, + embed_channels=cfg_decoder.embed_channels, + mlp_channels=cfg_decoder.mlp_channels, + mlp_num_layers=cfg_decoder.num_mlp, + rescale_attn_bias=cfg_decoder.rescale) + + def init_weights(self): + trunc_normal_(self.pos_embed, std=0.02) + nn.init.normal_(self.query_embed, std=0.02) + nn.init.normal_(self.query_pos_embed, std=0.02) + for i in range(len(self.conv_clips)): + caffe2_xavier_init(self.conv_clips[i][1].conv) + + def fuse_clip(self, fused_index: int, x: torch.Tensor, + clip_feature: torch.Tensor, hwshape: Tuple[int, + int], L: int): + """Fuse CLIP feature and visual tokens.""" + fused_clip = (resize( + self.conv_clips[fused_index](clip_feature.contiguous()), + size=hwshape, + mode='bilinear', + align_corners=False)).permute(0, 2, 3, 1).reshape(x[:, -L:, + ...].shape) + x = torch.cat([x[:, :-L, ...], x[:, -L:, ...] + fused_clip], dim=1) + return x + + def encode_feature(self, image: torch.Tensor, + clip_features: List[torch.Tensor], + deep_supervision_idxs: List[int]) -> List[List]: + """Encode images by a lightweight vision transformer.""" + assert len(self.fusion_index) == len(clip_features) + x, hwshape = self.patch_embed(image) + ori_h, ori_w = self.patch_embed.init_out_size + pos_embed = self.pos_embed + if self.pos_embed.shape[1] != x.shape[1]: + # resize the position embedding + pos_embed = ( + resize( + self.pos_embed.reshape(1, ori_h, ori_w, + -1).permute(0, 3, 1, 2), + size=hwshape, + mode='bicubic', + align_corners=False, + ).flatten(2).permute(0, 2, 1)) + pos_embed = torch.cat([ + self.query_pos_embed.expand(pos_embed.shape[0], -1, -1), pos_embed + ], + dim=1) + x = torch.cat([self.query_embed.expand(x.shape[0], -1, -1), x], dim=1) + x = x + pos_embed + L = hwshape[0] * hwshape[1] + fused_index = 0 + if self.fusion_index[fused_index] == 0: + x = self.fuse_clip(fused_index, x, clip_features[0][0], hwshape, L) + fused_index += 1 + outs = [] + for index, block in enumerate(self.encode_layers, start=1): + x = block(x) + if index < len(self.fusion_index + ) and index == self.fusion_index[fused_index]: + x = self.fuse_clip(fused_index, x, + clip_features[fused_index][0], hwshape, L) + fused_index += 1 + x_query = x[:, :-L, ...] + x_feat = x[:, -L:, ...].permute(0, 2, 1)\ + .reshape(x.shape[0], x.shape[-1], hwshape[0], hwshape[1]) + + if index in deep_supervision_idxs or index == len( + self.encode_layers): + outs.append({'query': x_query, 'x': x_feat}) + + if index < len(self.encode_layers): + x = x + pos_embed + return outs + + def decode_feature(self, features): + mask_embeds = [] + attn_biases = [] + for feature in features: + mask_embed, attn_bias = self.mask_decoder(**feature) + mask_embeds.append(mask_embed) + attn_biases.append(attn_bias) + return mask_embeds, attn_biases + + def forward( + self, image: torch.Tensor, clip_features: List[torch.Tensor], + deep_supervision_idxs: List[int] + ) -> Tuple[List[torch.Tensor], List[List[torch.Tensor]]]: + """Forward function.""" + features = self.encode_feature(image, clip_features, + deep_supervision_idxs) + mask_embeds, attn_biases = self.decode_feature(features) + return mask_embeds, attn_biases + + +class RecWithAttnbias(nn.Module): + """Mask recognition module by applying the attention biases to rest deeper + CLIP layers. + + Args: + sos_token_format (str): The format of sos token. It should be + chosen from ["cls_token", "learnable_token", "pos_embedding"]. + Default: 'cls_token'. + sos_token_num (int): Number of sos token. It should be equal to + the number of quries. Default: 100. + num_layers (int): Number of rest CLIP layers for mask recognition. + Default: 3. + cross_attn (bool): Whether use cross attention to update sos token. + Default: False. + embed_dims (int): The feature dimension of CLIP layers. + Default: 768. + num_heads (int): Parallel attention heads of CLIP layers. + Default: 768. + mlp_ratio (int): Ratio of mlp hidden dim to embedding dim. + Default: 4. + qkv_bias (bool): Whether to use bias in multihead-attention. + Default: True. + out_dims (int): Number of channels of the output mask proposals. + It should be equal to the out_dims of text_encoder. + Default: 512. + final_norm (True): Whether use norm layer for sos token. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + frozen_exclude (List): List of parameters that are not to be frozen. + """ + + def __init__(self, + sos_token_format: str = 'cls_token', + sos_token_num: int = 100, + num_layers: int = 3, + cross_attn: bool = False, + embed_dims: int = 768, + num_heads: int = 12, + mlp_ratio: int = 4, + num_fcs: int = 2, + qkv_bias: bool = True, + out_dims: int = 512, + final_norm: bool = True, + act_cfg: dict = dict(type='GELU'), + norm_cfg: dict = dict(type='LN'), + frozen_exclude: List = []): + super().__init__() + + assert sos_token_format in [ + 'cls_token', 'learnable_token', 'pos_embedding' + ] + self.sos_token_format = sos_token_format + self.sos_token_num = sos_token_num + self.frozen_exclude = frozen_exclude + self.cross_attn = cross_attn + self.num_layers = num_layers + self.num_heads = num_heads + if sos_token_format in ['learnable_token', 'pos_embedding']: + self.sos_token = nn.Parameter( + torch.randn(sos_token_num, 1, self.proj.shape[0])) + self.frozen.append('sos_token') + + layers = [] + for i in range(num_layers): + layers.append( + BaseTransformerLayer( + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=embed_dims, + num_heads=num_heads, + batch_first=False, + bias=qkv_bias), + ffn_cfgs=dict( + type='FFN', + embed_dims=embed_dims, + feedforward_channels=mlp_ratio * embed_dims, + act_cfg=act_cfg), + operation_order=('norm', 'self_attn', 'norm', 'ffn'))) + self.layers = nn.ModuleList(layers) + + self.ln_post = build_norm_layer(norm_cfg, embed_dims)[1] + self.proj = nn.Linear(embed_dims, out_dims, bias=False) + + self.final_norm = final_norm + self._freeze() + + def init_weights(self, rec_state_dict): + if hasattr(self, 'sos_token'): + normal_init(self.sos_token, std=0.02) + if rec_state_dict is not None: + load_state_dict(self, rec_state_dict, strict=False, logger=None) + else: + super().init_weights() + + def _freeze(self): + if 'all' in self.frozen_exclude: + return + for name, param in self.named_parameters(): + if not any([exclude in name for exclude in self.frozen_exclude]): + param.requires_grad = False + + def _build_attn_biases(self, attn_biases, target_shape): + formatted_attn_biases = [] + for attn_bias in attn_biases: + # convert it to proper format: N*num_head,L,L + # attn_bias: [N, num_head/1, num_sos,H,W] + n, num_head, num_sos, h, w = attn_bias.shape + # reshape and downsample + attn_bias = F.adaptive_max_pool2d( + attn_bias.reshape(n, num_head * num_sos, h, w), + output_size=target_shape) + attn_bias = attn_bias.reshape(n, num_head, num_sos, *target_shape) + + true_num_head = self.num_heads + assert (num_head == 1 or num_head + == true_num_head), f'num_head={num_head} is not supported.' + if num_head == 1: + attn_bias = attn_bias.repeat(1, true_num_head, 1, 1, 1) + attn_bias = attn_bias.reshape(n * true_num_head, num_sos, -1) + L = attn_bias.shape[-1] + if self.cross_attn: + # [n*num_head, num_sos, L] + formatted_attn_biases.append(attn_bias) + else: + # [n*num_head, num_sos+1+L, num_sos+1+L] + new_attn_bias = attn_bias.new_zeros(num_sos + 1 + L, + num_sos + 1 + L) + new_attn_bias[:, :num_sos] = -100 + new_attn_bias[torch.arange(num_sos), torch.arange(num_sos)] = 0 + new_attn_bias[:num_sos, num_sos] = -100 + new_attn_bias = ( + new_attn_bias[None, ...].expand(n * true_num_head, -1, + -1).clone()) + new_attn_bias[..., :num_sos, -L:] = attn_bias + formatted_attn_biases.append(new_attn_bias) + + if len(formatted_attn_biases) == 1: + formatted_attn_biases = [ + formatted_attn_biases[0] for _ in range(self.num_layers) + ] + return formatted_attn_biases + + def forward(self, bias: List[Tensor], feature: List[Tensor]): + """Forward function to recognize the category of masks + Args: + bias (List[Tensor]): Attention bias for transformer layers + feature (List[Tensor]): Output of the image encoder, + including cls_token and img_feature. + """ + cls_token = feature[1].unsqueeze(0) + img_feature = feature[0] + b, c, h, w = img_feature.shape + # construct clip shadow features + x = torch.cat( + [cls_token, + img_feature.reshape(b, c, -1).permute(2, 0, 1)]) + + # construct sos token + if self.sos_token_format == 'cls_token': + sos_token = cls_token.repeat(self.sos_token_num, 1, 1) + elif self.sos_token_format == 'learnable_token': + sos_token = self.sos_token.expand(-1, b, -1) + elif self.sos_token_format == 'pos_embedding': + sos_token = self.sos_token.expand(-1, b, -1) + cls_token + + # construct attn bias + attn_biases = self._build_attn_biases(bias, target_shape=(h, w)) + + if self.cross_attn: + for i, block in enumerate(self.layers): + if self.cross_attn: + sos_token = cross_attn_layer( + block, + sos_token, + x[1:, ], + attn_biases[i], + ) + if i < len(self.layers) - 1: + x = block(x) + else: + x = torch.cat([sos_token, x], dim=0) + for i, block in enumerate(self.layers): + x = block(x, attn_masks=[attn_biases[i]]) + sos_token = x[:self.sos_token_num] + + sos_token = sos_token.permute(1, 0, 2) # LND -> NLD + sos_token = self.ln_post(sos_token) + sos_token = self.proj(sos_token) + if self.final_norm: + sos_token = F.normalize(sos_token, dim=-1) + return sos_token + + +@MODELS.register_module() +class SideAdapterCLIPHead(BaseDecodeHead): + """Side Adapter Network (SAN) for open-vocabulary semantic segmentation + with pre-trained vision-language model. + + This decode head is the implementation of `Side Adapter Network + for Open-Vocabulary Semantic Segmentation` + . + Modified from https://github.com/MendelXu/SAN/blob/main/san/model/side_adapter/side_adapter.py # noqa:E501 + Copyright (c) 2023 MendelXu. + Licensed under the MIT License + + Args: + num_classes (int): the number of classes. + san_cfg (ConfigType): Configs for SideAdapterNetwork module + maskgen_cfg (ConfigType): Configs for RecWithAttnbias module + """ + + def __init__(self, num_classes: int, san_cfg: ConfigType, + maskgen_cfg: ConfigType, deep_supervision_idxs: List[int], + train_cfg: ConfigType, **kwargs): + super().__init__( + in_channels=san_cfg.in_channels, + channels=san_cfg.embed_dims, + num_classes=num_classes, + **kwargs) + assert san_cfg.num_queries == maskgen_cfg.sos_token_num, \ + 'num_queries in san_cfg should be equal to sos_token_num ' \ + 'in maskgen_cfg' + del self.conv_seg + self.side_adapter_network = SideAdapterNetwork(**san_cfg) + self.rec_with_attnbias = RecWithAttnbias(**maskgen_cfg) + self.deep_supervision_idxs = deep_supervision_idxs + self.train_cfg = train_cfg + if train_cfg: + self.match_masks = MatchMasks( + num_points=train_cfg.num_points, + num_queries=san_cfg.num_queries, + num_classes=num_classes, + assigner=train_cfg.assigner) + + def init_weights(self): + + rec_state_dict = None + if isinstance(self.init_cfg, dict) and \ + self.init_cfg.get('type') == 'Pretrained_Part': + checkpoint = CheckpointLoader.load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + + rec_state_dict = checkpoint.copy() + para_prefix = 'decode_head.rec_with_attnbias' + prefix_len = len(para_prefix) + 1 + for k, v in checkpoint.items(): + rec_state_dict.pop(k) + if para_prefix in k: + rec_state_dict[k[prefix_len:]] = v + + self.side_adapter_network.init_weights() + self.rec_with_attnbias.init_weights(rec_state_dict) + + def forward(self, inputs: Tuple[Tensor], + deep_supervision_idxs) -> Tuple[List]: + """Forward function. + + Args: + inputs (Tuple[Tensor]): A triplet including images, + list of multi-level visual features from image encoder and + class embeddings from text_encoder. + + Returns: + mask_props (List[Tensor]): Mask proposals predicted by SAN. + mask_logits (List[Tensor]): Class logits of mask proposals. + """ + imgs, clip_feature, class_embeds = inputs + # predict mask proposals and attention bias + mask_props, attn_biases = self.side_adapter_network( + imgs, clip_feature, deep_supervision_idxs) + + # mask recognition with attention bias + mask_embeds = [ + self.rec_with_attnbias(att_bias, clip_feature[-1]) + for att_bias in attn_biases + ] + # Obtain class prediction of masks by comparing the similarity + # between the image token and the text embedding of class names. + mask_logits = [ + torch.einsum('bqc,nc->bqn', mask_embed, class_embeds) + for mask_embed in mask_embeds + ] + return mask_props, mask_logits + + def predict(self, inputs: Tuple[Tensor], batch_img_metas: List[dict], + test_cfg: ConfigType) -> Tensor: + """Forward function for prediction. + + Args: + inputs (Tuple[Tensor]): Images, visual features from image encoder + and class embedding from text encoder. + batch_img_metas (dict): List Image info where each dict may also + contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Outputs segmentation logits map. + """ + mask_props, mask_logits = self.forward(inputs, []) + + return self.predict_by_feat([mask_props[-1], mask_logits[-1]], + batch_img_metas) + + def predict_by_feat(self, seg_logits: List[Tensor], + batch_img_metas: List[dict]) -> Tensor: + """1. Transform a batch of mask proposals to the input shape. + 2. Generate segmentation map with mask proposals and class logits. + """ + mask_pred = seg_logits[0] + cls_score = seg_logits[1] + if isinstance(batch_img_metas[0]['img_shape'], torch.Size): + # slide inference + size = batch_img_metas[0]['img_shape'] + elif 'pad_shape' in batch_img_metas[0]: + size = batch_img_metas[0]['pad_shape'][:2] + else: + size = batch_img_metas[0]['img_shape'] + # upsample mask + mask_pred = F.interpolate( + mask_pred, size=size, mode='bilinear', align_corners=False) + + mask_cls = F.softmax(cls_score, dim=-1)[..., :-1] + mask_pred = mask_pred.sigmoid() + seg_logits = torch.einsum('bqc,bqhw->bchw', mask_cls, mask_pred) + return seg_logits + + def loss(self, x: Tuple[Tensor], batch_data_samples: SampleList, + train_cfg: ConfigType) -> dict: + """Perform forward propagation and loss calculation of the decoder head + on the features of the upstream network. + + Args: + x (tuple[Tensor]): Multi-level features from the upstream + network, each is a 4D-tensor. + batch_data_samples (List[:obj:`SegDataSample`]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + train_cfg (ConfigType): Training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components. + """ + # batch SegDataSample to InstanceDataSample + batch_gt_instances = seg_data_to_instance_data(self.ignore_index, + batch_data_samples) + + # forward + all_mask_props, all_mask_logits = self.forward( + x, self.deep_supervision_idxs) + + # loss + losses = self.loss_by_feat(all_mask_logits, all_mask_props, + batch_gt_instances) + + return losses + + def loss_by_feat( + self, all_cls_scores: Tensor, all_mask_preds: Tensor, + batch_gt_instances: List[InstanceData]) -> Dict[str, Tensor]: + """Loss function. + + Args: + all_cls_scores (Tensor): Classification scores for all decoder + layers with shape (num_decoder, batch_size, num_queries, + cls_out_channels). Note `cls_out_channels` should includes + background. + all_mask_preds (Tensor): Mask scores for all decoder layers with + shape (num_decoder, batch_size, num_queries, h, w). + batch_gt_instances (list[obj:`InstanceData`]): each contains + ``labels`` and ``masks``. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_dec_layers = len(all_cls_scores) + batch_gt_instances_list = [ + batch_gt_instances for _ in range(num_dec_layers) + ] + + losses = [] + for i in range(num_dec_layers): + cls_scores = all_cls_scores[i] + mask_preds = all_mask_preds[i] + # matching N mask predictions to K category labels + (labels, mask_targets, mask_weights, + avg_factor) = self.match_masks.get_targets( + cls_scores, mask_preds, batch_gt_instances_list[i]) + cls_scores = cls_scores.flatten(0, 1) + labels = labels.flatten(0, 1) + num_total_masks = cls_scores.new_tensor([avg_factor], + dtype=torch.float) + all_reduce(num_total_masks, op='mean') + num_total_masks = max(num_total_masks, 1) + + # extract positive ones + # shape (batch_size, num_queries, h, w) -> (num_total_gts, h, w) + mask_preds = mask_preds[mask_weights > 0] + + if mask_targets.shape[0] != 0: + with torch.no_grad(): + points_coords = get_uncertain_point_coords_with_randomness( + mask_preds.unsqueeze(1), None, + self.train_cfg.num_points, + self.train_cfg.oversample_ratio, + self.train_cfg.importance_sample_ratio) + # shape (num_total_gts, h, w) + # -> (num_total_gts, num_points) + mask_point_targets = point_sample( + mask_targets.unsqueeze(1).float(), + points_coords).squeeze(1) + # shape (num_queries, h, w) -> (num_queries, num_points) + mask_point_preds = point_sample( + mask_preds.unsqueeze(1), points_coords).squeeze(1) + + if not isinstance(self.loss_decode, nn.ModuleList): + losses_decode = [self.loss_decode] + else: + losses_decode = self.loss_decode + loss = dict() + for loss_decode in losses_decode: + if 'loss_cls' in loss_decode.loss_name: + if loss_decode.loss_name == 'loss_cls_ce': + loss[loss_decode.loss_name] = loss_decode( + cls_scores, labels) + else: + assert False, "Only support 'CrossEntropyLoss' in" \ + ' classification loss' + + elif 'loss_mask' in loss_decode.loss_name: + if mask_targets.shape[0] == 0: + loss[loss_decode.loss_name] = mask_preds.sum() + elif loss_decode.loss_name == 'loss_mask_ce': + loss[loss_decode.loss_name] = loss_decode( + mask_point_preds, + mask_point_targets, + avg_factor=num_total_masks * + self.train_cfg.num_points) + elif loss_decode.loss_name == 'loss_mask_dice': + loss[loss_decode.loss_name] = loss_decode( + mask_point_preds, + mask_point_targets, + avg_factor=num_total_masks) + else: + assert False, "Only support 'CrossEntropyLoss' and" \ + " 'DiceLoss' in mask loss" + else: + assert False, "Only support for 'loss_cls' and 'loss_mask'" + + losses.append(loss) + + loss_dict = dict() + # loss from the last decoder layer + loss_dict.update(losses[-1]) + # loss from other decoder layers + for i, loss in enumerate(losses[:-1]): + for k, v in loss.items(): + loss_dict[f'd{self.deep_supervision_idxs[i]}.{k}'] = v + return loss_dict diff --git a/mmsegmentation/mmseg/models/decode_heads/segformer_head.py b/mmsegmentation/mmseg/models/decode_heads/segformer_head.py new file mode 100644 index 0000000..f9eb0b3 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/segformer_head.py @@ -0,0 +1,66 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.registry import MODELS +from ..utils import resize + + +@MODELS.register_module() +class SegformerHead(BaseDecodeHead): + """The all mlp Head of segformer. + + This head is the implementation of + `Segformer ` _. + + Args: + interpolate_mode: The interpolate mode of MLP head upsample operation. + Default: 'bilinear'. + """ + + def __init__(self, interpolate_mode='bilinear', **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + + self.interpolate_mode = interpolate_mode + num_inputs = len(self.in_channels) + + assert num_inputs == len(self.in_index) + + self.convs = nn.ModuleList() + for i in range(num_inputs): + self.convs.append( + ConvModule( + in_channels=self.in_channels[i], + out_channels=self.channels, + kernel_size=1, + stride=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + self.fusion_conv = ConvModule( + in_channels=self.channels * num_inputs, + out_channels=self.channels, + kernel_size=1, + norm_cfg=self.norm_cfg) + + def forward(self, inputs): + # Receive 4 stage backbone feature map: 1/4, 1/8, 1/16, 1/32 + inputs = self._transform_inputs(inputs) + outs = [] + for idx in range(len(inputs)): + x = inputs[idx] + conv = self.convs[idx] + outs.append( + resize( + input=conv(x), + size=inputs[0].shape[2:], + mode=self.interpolate_mode, + align_corners=self.align_corners)) + + out = self.fusion_conv(torch.cat(outs, dim=1)) + + out = self.cls_seg(out) + + return out diff --git a/mmsegmentation/mmseg/models/decode_heads/segmenter_mask_head.py b/mmsegmentation/mmseg/models/decode_heads/segmenter_mask_head.py new file mode 100644 index 0000000..85d2773 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/segmenter_mask_head.py @@ -0,0 +1,132 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_norm_layer +from mmengine.model import ModuleList +from mmengine.model.weight_init import (constant_init, trunc_normal_, + trunc_normal_init) + +from mmseg.models.backbones.vit import TransformerEncoderLayer +from mmseg.registry import MODELS +from .decode_head import BaseDecodeHead + + +@MODELS.register_module() +class SegmenterMaskTransformerHead(BaseDecodeHead): + """Segmenter: Transformer for Semantic Segmentation. + + This head is the implementation of + `Segmenter: `_. + + Args: + backbone_cfg:(dict): Config of backbone of + Context Path. + in_channels (int): The number of channels of input image. + num_layers (int): The depth of transformer. + num_heads (int): The number of attention heads. + embed_dims (int): The number of embedding dimension. + mlp_ratio (int): ratio of mlp hidden dim to embedding dim. + Default: 4. + drop_path_rate (float): stochastic depth rate. Default 0.1. + drop_rate (float): Probability of an element to be zeroed. + Default 0.0 + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0 + num_fcs (int): The number of fully-connected layers for FFNs. + Default: 2. + qkv_bias (bool): Enable bias for qkv if True. Default: True. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + init_std (float): The value of std in weight initialization. + Default: 0.02. + """ + + def __init__( + self, + in_channels, + num_layers, + num_heads, + embed_dims, + mlp_ratio=4, + drop_path_rate=0.1, + drop_rate=0.0, + attn_drop_rate=0.0, + num_fcs=2, + qkv_bias=True, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + init_std=0.02, + **kwargs, + ): + super().__init__(in_channels=in_channels, **kwargs) + + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, num_layers)] + self.layers = ModuleList() + for i in range(num_layers): + self.layers.append( + TransformerEncoderLayer( + embed_dims=embed_dims, + num_heads=num_heads, + feedforward_channels=mlp_ratio * embed_dims, + attn_drop_rate=attn_drop_rate, + drop_rate=drop_rate, + drop_path_rate=dpr[i], + num_fcs=num_fcs, + qkv_bias=qkv_bias, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + batch_first=True, + )) + + self.dec_proj = nn.Linear(in_channels, embed_dims) + + self.cls_emb = nn.Parameter( + torch.randn(1, self.num_classes, embed_dims)) + self.patch_proj = nn.Linear(embed_dims, embed_dims, bias=False) + self.classes_proj = nn.Linear(embed_dims, embed_dims, bias=False) + + self.decoder_norm = build_norm_layer( + norm_cfg, embed_dims, postfix=1)[1] + self.mask_norm = build_norm_layer( + norm_cfg, self.num_classes, postfix=2)[1] + + self.init_std = init_std + + delattr(self, 'conv_seg') + + def init_weights(self): + trunc_normal_(self.cls_emb, std=self.init_std) + trunc_normal_init(self.patch_proj, std=self.init_std) + trunc_normal_init(self.classes_proj, std=self.init_std) + for n, m in self.named_modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=self.init_std, bias=0) + elif isinstance(m, nn.LayerNorm): + constant_init(m, val=1.0, bias=0.0) + + def forward(self, inputs): + x = self._transform_inputs(inputs) + b, c, h, w = x.shape + x = x.permute(0, 2, 3, 1).contiguous().view(b, -1, c) + + x = self.dec_proj(x) + cls_emb = self.cls_emb.expand(x.size(0), -1, -1) + x = torch.cat((x, cls_emb), 1) + for layer in self.layers: + x = layer(x) + x = self.decoder_norm(x) + + patches = self.patch_proj(x[:, :-self.num_classes]) + cls_seg_feat = self.classes_proj(x[:, -self.num_classes:]) + + patches = F.normalize(patches, dim=2, p=2) + cls_seg_feat = F.normalize(cls_seg_feat, dim=2, p=2) + + masks = patches @ cls_seg_feat.transpose(1, 2) + masks = self.mask_norm(masks) + masks = masks.permute(0, 2, 1).contiguous().view(b, -1, h, w) + + return masks diff --git a/mmsegmentation/mmseg/models/decode_heads/sep_aspp_head.py b/mmsegmentation/mmseg/models/decode_heads/sep_aspp_head.py new file mode 100644 index 0000000..9dba68c --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/sep_aspp_head.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule + +from mmseg.registry import MODELS +from ..utils import resize +from .aspp_head import ASPPHead, ASPPModule + + +class DepthwiseSeparableASPPModule(ASPPModule): + """Atrous Spatial Pyramid Pooling (ASPP) Module with depthwise separable + conv.""" + + def __init__(self, **kwargs): + super().__init__(**kwargs) + for i, dilation in enumerate(self.dilations): + if dilation > 1: + self[i] = DepthwiseSeparableConvModule( + self.in_channels, + self.channels, + 3, + dilation=dilation, + padding=dilation, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + +@MODELS.register_module() +class DepthwiseSeparableASPPHead(ASPPHead): + """Encoder-Decoder with Atrous Separable Convolution for Semantic Image + Segmentation. + + This head is the implementation of `DeepLabV3+ + `_. + + Args: + c1_in_channels (int): The input channels of c1 decoder. If is 0, + the no decoder will be used. + c1_channels (int): The intermediate channels of c1 decoder. + """ + + def __init__(self, c1_in_channels, c1_channels, **kwargs): + super().__init__(**kwargs) + assert c1_in_channels >= 0 + self.aspp_modules = DepthwiseSeparableASPPModule( + dilations=self.dilations, + in_channels=self.in_channels, + channels=self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if c1_in_channels > 0: + self.c1_bottleneck = ConvModule( + c1_in_channels, + c1_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + else: + self.c1_bottleneck = None + self.sep_bottleneck = nn.Sequential( + DepthwiseSeparableConvModule( + self.channels + c1_channels, + self.channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + DepthwiseSeparableConvModule( + self.channels, + self.channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + aspp_outs = [ + resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ] + aspp_outs.extend(self.aspp_modules(x)) + aspp_outs = torch.cat(aspp_outs, dim=1) + output = self.bottleneck(aspp_outs) + if self.c1_bottleneck is not None: + c1_output = self.c1_bottleneck(inputs[0]) + output = resize( + input=output, + size=c1_output.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + output = torch.cat([output, c1_output], dim=1) + output = self.sep_bottleneck(output) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/sep_fcn_head.py b/mmsegmentation/mmseg/models/decode_heads/sep_fcn_head.py new file mode 100644 index 0000000..3b15983 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/sep_fcn_head.py @@ -0,0 +1,60 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn import DepthwiseSeparableConvModule + +from mmseg.registry import MODELS +from .fcn_head import FCNHead + + +@MODELS.register_module() +class DepthwiseSeparableFCNHead(FCNHead): + """Depthwise-Separable Fully Convolutional Network for Semantic + Segmentation. + + This head is implemented according to `Fast-SCNN: Fast Semantic + Segmentation Network `_. + + Args: + in_channels(int): Number of output channels of FFM. + channels(int): Number of middle-stage channels in the decode head. + concat_input(bool): Whether to concatenate original decode input into + the result of several consecutive convolution layers. + Default: True. + num_classes(int): Used to determine the dimension of + final prediction tensor. + in_index(int): Correspond with 'out_indices' in FastSCNN backbone. + norm_cfg (dict | None): Config of norm layers. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + loss_decode(dict): Config of loss type and some + relevant additional options. + dw_act_cfg (dict):Activation config of depthwise ConvModule. If it is + 'default', it will be the same as `act_cfg`. Default: None. + """ + + def __init__(self, dw_act_cfg=None, **kwargs): + super().__init__(**kwargs) + self.convs[0] = DepthwiseSeparableConvModule( + self.in_channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg, + dw_act_cfg=dw_act_cfg) + + for i in range(1, self.num_convs): + self.convs[i] = DepthwiseSeparableConvModule( + self.channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg, + dw_act_cfg=dw_act_cfg) + + if self.concat_input: + self.conv_cat = DepthwiseSeparableConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg, + dw_act_cfg=dw_act_cfg) diff --git a/mmsegmentation/mmseg/models/decode_heads/setr_mla_head.py b/mmsegmentation/mmseg/models/decode_heads/setr_mla_head.py new file mode 100644 index 0000000..1975991 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/setr_mla_head.py @@ -0,0 +1,62 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import Upsample +from .decode_head import BaseDecodeHead + + +@MODELS.register_module() +class SETRMLAHead(BaseDecodeHead): + """Multi level feature aggretation head of SETR. + + MLA head of `SETR `_. + + Args: + mlahead_channels (int): Channels of conv-conv-4x of multi-level feature + aggregation. Default: 128. + up_scale (int): The scale factor of interpolate. Default:4. + """ + + def __init__(self, mla_channels=128, up_scale=4, **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + self.mla_channels = mla_channels + + num_inputs = len(self.in_channels) + + # Refer to self.cls_seg settings of BaseDecodeHead + assert self.channels == num_inputs * mla_channels + + self.up_convs = nn.ModuleList() + for i in range(num_inputs): + self.up_convs.append( + nn.Sequential( + ConvModule( + in_channels=self.in_channels[i], + out_channels=mla_channels, + kernel_size=3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + ConvModule( + in_channels=mla_channels, + out_channels=mla_channels, + kernel_size=3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + Upsample( + scale_factor=up_scale, + mode='bilinear', + align_corners=self.align_corners))) + + def forward(self, inputs): + inputs = self._transform_inputs(inputs) + outs = [] + for x, up_conv in zip(inputs, self.up_convs): + outs.append(up_conv(x)) + out = torch.cat(outs, dim=1) + out = self.cls_seg(out) + return out diff --git a/mmsegmentation/mmseg/models/decode_heads/setr_up_head.py b/mmsegmentation/mmseg/models/decode_heads/setr_up_head.py new file mode 100644 index 0000000..9c796d8 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/setr_up_head.py @@ -0,0 +1,81 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule, build_norm_layer + +from mmseg.registry import MODELS +from ..utils import Upsample +from .decode_head import BaseDecodeHead + + +@MODELS.register_module() +class SETRUPHead(BaseDecodeHead): + """Naive upsampling head and Progressive upsampling head of SETR. + + Naive or PUP head of `SETR `_. + + Args: + norm_layer (dict): Config dict for input normalization. + Default: norm_layer=dict(type='LN', eps=1e-6, requires_grad=True). + num_convs (int): Number of decoder convolutions. Default: 1. + up_scale (int): The scale factor of interpolate. Default:4. + kernel_size (int): The kernel size of convolution when decoding + feature information from backbone. Default: 3. + init_cfg (dict | list[dict] | None): Initialization config dict. + Default: dict( + type='Constant', val=1.0, bias=0, layer='LayerNorm'). + """ + + def __init__(self, + norm_layer=dict(type='LN', eps=1e-6, requires_grad=True), + num_convs=1, + up_scale=4, + kernel_size=3, + init_cfg=[ + dict(type='Constant', val=1.0, bias=0, layer='LayerNorm'), + dict( + type='Normal', + std=0.01, + override=dict(name='conv_seg')) + ], + **kwargs): + + assert kernel_size in [1, 3], 'kernel_size must be 1 or 3.' + + super().__init__(init_cfg=init_cfg, **kwargs) + + assert isinstance(self.in_channels, int) + + _, self.norm = build_norm_layer(norm_layer, self.in_channels) + + self.up_convs = nn.ModuleList() + in_channels = self.in_channels + out_channels = self.channels + for _ in range(num_convs): + self.up_convs.append( + nn.Sequential( + ConvModule( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=kernel_size, + stride=1, + padding=int(kernel_size - 1) // 2, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + Upsample( + scale_factor=up_scale, + mode='bilinear', + align_corners=self.align_corners))) + in_channels = out_channels + + def forward(self, x): + x = self._transform_inputs(x) + + n, c, h, w = x.shape + x = x.reshape(n, c, h * w).transpose(2, 1).contiguous() + x = self.norm(x) + x = x.transpose(1, 2).reshape(n, c, h, w).contiguous() + + for up_conv in self.up_convs: + x = up_conv(x) + out = self.cls_seg(x) + return out diff --git a/mmsegmentation/mmseg/models/decode_heads/stdc_head.py b/mmsegmentation/mmseg/models/decode_heads/stdc_head.py new file mode 100644 index 0000000..1c1c21e --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/stdc_head.py @@ -0,0 +1,97 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn.functional as F +from mmengine.structures import PixelData +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.structures import SegDataSample +from mmseg.utils import SampleList +from .fcn_head import FCNHead + + +@MODELS.register_module() +class STDCHead(FCNHead): + """This head is the implementation of `Rethinking BiSeNet For Real-time + Semantic Segmentation `_. + + Args: + boundary_threshold (float): The threshold of calculating boundary. + Default: 0.1. + """ + + def __init__(self, boundary_threshold=0.1, **kwargs): + super().__init__(**kwargs) + self.boundary_threshold = boundary_threshold + # Using register buffer to make laplacian kernel on the same + # device of `seg_label`. + self.register_buffer( + 'laplacian_kernel', + torch.tensor([-1, -1, -1, -1, 8, -1, -1, -1, -1], + dtype=torch.float32, + requires_grad=False).reshape((1, 1, 3, 3))) + self.fusion_kernel = torch.nn.Parameter( + torch.tensor([[6. / 10], [3. / 10], [1. / 10]], + dtype=torch.float32).reshape(1, 3, 1, 1), + requires_grad=False) + + def loss_by_feat(self, seg_logits: Tensor, + batch_data_samples: SampleList) -> dict: + """Compute Detail Aggregation Loss.""" + # Note: The paper claims `fusion_kernel` is a trainable 1x1 conv + # parameters. However, it is a constant in original repo and other + # codebase because it would not be added into computation graph + # after threshold operation. + seg_label = self._stack_batch_gt(batch_data_samples).to( + self.laplacian_kernel) + boundary_targets = F.conv2d( + seg_label, self.laplacian_kernel, padding=1) + boundary_targets = boundary_targets.clamp(min=0) + boundary_targets[boundary_targets > self.boundary_threshold] = 1 + boundary_targets[boundary_targets <= self.boundary_threshold] = 0 + + boundary_targets_x2 = F.conv2d( + seg_label, self.laplacian_kernel, stride=2, padding=1) + boundary_targets_x2 = boundary_targets_x2.clamp(min=0) + + boundary_targets_x4 = F.conv2d( + seg_label, self.laplacian_kernel, stride=4, padding=1) + boundary_targets_x4 = boundary_targets_x4.clamp(min=0) + + boundary_targets_x4_up = F.interpolate( + boundary_targets_x4, boundary_targets.shape[2:], mode='nearest') + boundary_targets_x2_up = F.interpolate( + boundary_targets_x2, boundary_targets.shape[2:], mode='nearest') + + boundary_targets_x2_up[ + boundary_targets_x2_up > self.boundary_threshold] = 1 + boundary_targets_x2_up[ + boundary_targets_x2_up <= self.boundary_threshold] = 0 + + boundary_targets_x4_up[ + boundary_targets_x4_up > self.boundary_threshold] = 1 + boundary_targets_x4_up[ + boundary_targets_x4_up <= self.boundary_threshold] = 0 + + boundary_targets_pyramids = torch.stack( + (boundary_targets, boundary_targets_x2_up, boundary_targets_x4_up), + dim=1) + + boundary_targets_pyramids = boundary_targets_pyramids.squeeze(2) + boudary_targets_pyramid = F.conv2d(boundary_targets_pyramids, + self.fusion_kernel) + + boudary_targets_pyramid[ + boudary_targets_pyramid > self.boundary_threshold] = 1 + boudary_targets_pyramid[ + boudary_targets_pyramid <= self.boundary_threshold] = 0 + + seg_labels = boudary_targets_pyramid.long() + batch_sample_list = [] + for label in seg_labels: + seg_data_sample = SegDataSample() + seg_data_sample.gt_sem_seg = PixelData(data=label) + batch_sample_list.append(seg_data_sample) + + loss = super().loss_by_feat(seg_logits, batch_sample_list) + return loss diff --git a/mmsegmentation/mmseg/models/decode_heads/uper_head.py b/mmsegmentation/mmseg/models/decode_heads/uper_head.py new file mode 100644 index 0000000..b1ccc31 --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/uper_head.py @@ -0,0 +1,139 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.registry import MODELS +from ..utils import resize +from .decode_head import BaseDecodeHead +from .psp_head import PPM + + +@MODELS.register_module() +class UPerHead(BaseDecodeHead): + """Unified Perceptual Parsing for Scene Understanding. + + This head is the implementation of `UPerNet + `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module applied on the last feature. Default: (1, 2, 3, 6). + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super().__init__(input_transform='multiple_select', **kwargs) + # PSP Module + self.psp_modules = PPM( + pool_scales, + self.in_channels[-1], + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.bottleneck = ConvModule( + self.in_channels[-1] + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + # FPN Module + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + for in_channels in self.in_channels[:-1]: # skip the top layer + l_conv = ConvModule( + in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + inplace=False) + fpn_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + inplace=False) + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + self.fpn_bottleneck = ConvModule( + len(self.in_channels) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def psp_forward(self, inputs): + """Forward function of PSP module.""" + x = inputs[-1] + psp_outs = [x] + psp_outs.extend(self.psp_modules(x)) + psp_outs = torch.cat(psp_outs, dim=1) + output = self.bottleneck(psp_outs) + + return output + + def _forward_feature(self, inputs): + """Forward function for feature maps before classifying each pixel with + ``self.cls_seg`` fc. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + feats (Tensor): A tensor of shape (batch_size, self.channels, + H, W) which is feature map for last layer of decoder head. + """ + inputs = self._transform_inputs(inputs) + + # build laterals + laterals = [ + lateral_conv(inputs[i]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + laterals.append(self.psp_forward(inputs)) + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] = laterals[i - 1] + resize( + laterals[i], + size=prev_shape, + mode='bilinear', + align_corners=self.align_corners) + + # build outputs + fpn_outs = [ + self.fpn_convs[i](laterals[i]) + for i in range(used_backbone_levels - 1) + ] + # append psp feature + fpn_outs.append(laterals[-1]) + + for i in range(used_backbone_levels - 1, 0, -1): + fpn_outs[i] = resize( + fpn_outs[i], + size=fpn_outs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) + fpn_outs = torch.cat(fpn_outs, dim=1) + feats = self.fpn_bottleneck(fpn_outs) + return feats + + def forward(self, inputs): + """Forward function.""" + output = self._forward_feature(inputs) + output = self.cls_seg(output) + return output diff --git a/mmsegmentation/mmseg/models/decode_heads/vpd_depth_head.py b/mmsegmentation/mmseg/models/decode_heads/vpd_depth_head.py new file mode 100644 index 0000000..65bdfbd --- /dev/null +++ b/mmsegmentation/mmseg/models/decode_heads/vpd_depth_head.py @@ -0,0 +1,253 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict, List, Optional, Sequence, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_conv_layer, build_norm_layer, build_upsample_layer +from mmengine.model import BaseModule +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.utils import SampleList +from ..utils import resize +from .decode_head import BaseDecodeHead + + +class VPDDepthDecoder(BaseModule): + """VPD Depth Decoder class. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + num_deconv_layers (int): Number of deconvolution layers. + num_deconv_filters (List[int]): List of output channels for + deconvolution layers. + init_cfg (Optional[Union[Dict, List[Dict]]], optional): Configuration + for weight initialization. Defaults to Normal for Conv2d and + ConvTranspose2d layers. + """ + + def __init__(self, + in_channels: int, + out_channels: int, + num_deconv_layers: int, + num_deconv_filters: List[int], + init_cfg: Optional[Union[Dict, List[Dict]]] = dict( + type='Normal', + std=0.001, + layer=['Conv2d', 'ConvTranspose2d'])): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + + self.deconv_layers = self._make_deconv_layer( + num_deconv_layers, + num_deconv_filters, + ) + + conv_layers = [] + conv_layers.append( + build_conv_layer( + dict(type='Conv2d'), + in_channels=num_deconv_filters[-1], + out_channels=out_channels, + kernel_size=3, + stride=1, + padding=1)) + conv_layers.append(build_norm_layer(dict(type='BN'), out_channels)[1]) + conv_layers.append(nn.ReLU(inplace=True)) + self.conv_layers = nn.Sequential(*conv_layers) + + self.up_sample = nn.Upsample( + scale_factor=2, mode='bilinear', align_corners=False) + + def forward(self, x): + """Forward pass through the decoder network.""" + out = self.deconv_layers(x) + out = self.conv_layers(out) + + out = self.up_sample(out) + out = self.up_sample(out) + + return out + + def _make_deconv_layer(self, num_layers, num_deconv_filters): + """Make deconv layers.""" + + layers = [] + in_channels = self.in_channels + for i in range(num_layers): + + num_channels = num_deconv_filters[i] + layers.append( + build_upsample_layer( + dict(type='deconv'), + in_channels=in_channels, + out_channels=num_channels, + kernel_size=2, + stride=2, + padding=0, + output_padding=0, + bias=False)) + layers.append(nn.BatchNorm2d(num_channels)) + layers.append(nn.ReLU(inplace=True)) + in_channels = num_channels + + return nn.Sequential(*layers) + + +@MODELS.register_module() +class VPDDepthHead(BaseDecodeHead): + """Depth Prediction Head for VPD. + + .. _`VPD`: https://arxiv.org/abs/2303.02153 + + Args: + max_depth (float): Maximum depth value. Defaults to 10.0. + in_channels (Sequence[int]): Number of input channels for each + convolutional layer. + embed_dim (int): Dimension of embedding. Defaults to 192. + feature_dim (int): Dimension of aggregated feature. Defaults to 1536. + num_deconv_layers (int): Number of deconvolution layers in the + decoder. Defaults to 3. + num_deconv_filters (Sequence[int]): Number of filters for each deconv + layer. Defaults to (32, 32, 32). + fmap_border (Union[int, Sequence[int]]): Feature map border for + cropping. Defaults to 0. + align_corners (bool): Flag for align_corners in interpolation. + Defaults to False. + loss_decode (dict): Configurations for the loss function. Defaults to + dict(type='SiLogLoss'). + init_cfg (dict): Initialization configurations. Defaults to + dict(type='TruncNormal', std=0.02, layer=['Conv2d', 'Linear']). + """ + + num_classes = 1 + out_channels = 1 + input_transform = None + + def __init__( + self, + max_depth: float = 10.0, + in_channels: Sequence[int] = [320, 640, 1280, 1280], + embed_dim: int = 192, + feature_dim: int = 1536, + num_deconv_layers: int = 3, + num_deconv_filters: Sequence[int] = (32, 32, 32), + fmap_border: Union[int, Sequence[int]] = 0, + align_corners: bool = False, + loss_decode: dict = dict(type='SiLogLoss'), + init_cfg=dict( + type='TruncNormal', std=0.02, layer=['Conv2d', 'Linear']), + ): + + super(BaseDecodeHead, self).__init__(init_cfg=init_cfg) + + # initialize parameters + self.in_channels = in_channels + self.max_depth = max_depth + self.align_corners = align_corners + + # feature map border + if isinstance(fmap_border, int): + fmap_border = (fmap_border, fmap_border) + self.fmap_border = fmap_border + + # define network layers + self.conv1 = nn.Sequential( + nn.Conv2d(in_channels[0], in_channels[0], 3, stride=2, padding=1), + nn.GroupNorm(16, in_channels[0]), + nn.ReLU(), + nn.Conv2d(in_channels[0], in_channels[0], 3, stride=2, padding=1), + ) + self.conv2 = nn.Conv2d( + in_channels[1], in_channels[1], 3, stride=2, padding=1) + + self.conv_aggregation = nn.Sequential( + nn.Conv2d(sum(in_channels), feature_dim, 1), + nn.GroupNorm(16, feature_dim), + nn.ReLU(), + ) + + self.decoder = VPDDepthDecoder( + in_channels=embed_dim * 8, + out_channels=embed_dim, + num_deconv_layers=num_deconv_layers, + num_deconv_filters=num_deconv_filters) + + self.depth_pred_layer = nn.Sequential( + nn.Conv2d( + embed_dim, embed_dim, kernel_size=3, stride=1, padding=1), + nn.ReLU(inplace=False), + nn.Conv2d(embed_dim, 1, kernel_size=3, stride=1, padding=1)) + + # build loss + if isinstance(loss_decode, dict): + self.loss_decode = MODELS.build(loss_decode) + elif isinstance(loss_decode, (list, tuple)): + self.loss_decode = nn.ModuleList() + for loss in loss_decode: + self.loss_decode.append(MODELS.build(loss)) + else: + raise TypeError(f'loss_decode must be a dict or sequence of dict,\ + but got {type(loss_decode)}') + + def _stack_batch_gt(self, batch_data_samples: SampleList) -> Tensor: + gt_depth_maps = [ + data_sample.gt_depth_map.data for data_sample in batch_data_samples + ] + return torch.stack(gt_depth_maps, dim=0) + + def forward(self, x): + x = [ + x[0], x[1], + torch.cat([x[2], F.interpolate(x[3], scale_factor=2)], dim=1) + ] + x = torch.cat([self.conv1(x[0]), self.conv2(x[1]), x[2]], dim=1) + x = self.conv_aggregation(x) + + x = x[:, :, :x.size(2) - self.fmap_border[0], :x.size(3) - + self.fmap_border[1]].contiguous() + x = self.decoder(x) + out = self.depth_pred_layer(x) + + depth = torch.sigmoid(out) * self.max_depth + + return depth + + def loss_by_feat(self, pred_depth_map: Tensor, + batch_data_samples: SampleList) -> dict: + """Compute depth estimation loss. + + Args: + pred_depth_map (Tensor): The output from decode head forward + function. + batch_data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_dpeth_map`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + gt_depth_map = self._stack_batch_gt(batch_data_samples) + loss = dict() + pred_depth_map = resize( + input=pred_depth_map, + size=gt_depth_map.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + + if not isinstance(self.loss_decode, nn.ModuleList): + losses_decode = [self.loss_decode] + else: + losses_decode = self.loss_decode + for loss_decode in losses_decode: + if loss_decode.loss_name not in loss: + loss[loss_decode.loss_name] = loss_decode( + pred_depth_map, gt_depth_map) + else: + loss[loss_decode.loss_name] += loss_decode( + pred_depth_map, gt_depth_map) + + return loss diff --git a/mmsegmentation/mmseg/models/losses/__init__.py b/mmsegmentation/mmseg/models/losses/__init__.py new file mode 100644 index 0000000..0467cb3 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .accuracy import Accuracy, accuracy +from .boundary_loss import BoundaryLoss +from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy, + cross_entropy, mask_cross_entropy) +from .dice_loss import DiceLoss +from .focal_loss import FocalLoss +from .huasdorff_distance_loss import HuasdorffDisstanceLoss +from .lovasz_loss import LovaszLoss +from .ohem_cross_entropy_loss import OhemCrossEntropy +from .silog_loss import SiLogLoss +from .tversky_loss import TverskyLoss +from .utils import reduce_loss, weight_reduce_loss, weighted_loss + +__all__ = [ + 'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy', + 'mask_cross_entropy', 'CrossEntropyLoss', 'reduce_loss', + 'weight_reduce_loss', 'weighted_loss', 'LovaszLoss', 'DiceLoss', + 'FocalLoss', 'TverskyLoss', 'OhemCrossEntropy', 'BoundaryLoss', + 'HuasdorffDisstanceLoss', 'SiLogLoss' +] diff --git a/mmsegmentation/mmseg/models/losses/accuracy.py b/mmsegmentation/mmseg/models/losses/accuracy.py new file mode 100644 index 0000000..1d9e2d7 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/accuracy.py @@ -0,0 +1,92 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn + + +def accuracy(pred, target, topk=1, thresh=None, ignore_index=None): + """Calculate accuracy according to the prediction and target. + + Args: + pred (torch.Tensor): The model prediction, shape (N, num_class, ...) + target (torch.Tensor): The target of each prediction, shape (N, , ...) + ignore_index (int | None): The label index to be ignored. Default: None + topk (int | tuple[int], optional): If the predictions in ``topk`` + matches the target, the predictions will be regarded as + correct ones. Defaults to 1. + thresh (float, optional): If not None, predictions with scores under + this threshold are considered incorrect. Default to None. + + Returns: + float | tuple[float]: If the input ``topk`` is a single integer, + the function will return a single float as accuracy. If + ``topk`` is a tuple containing multiple integers, the + function will return a tuple containing accuracies of + each ``topk`` number. + """ + assert isinstance(topk, (int, tuple)) + if isinstance(topk, int): + topk = (topk, ) + return_single = True + else: + return_single = False + + maxk = max(topk) + if pred.size(0) == 0: + accu = [pred.new_tensor(0.) for i in range(len(topk))] + return accu[0] if return_single else accu + assert pred.ndim == target.ndim + 1 + assert pred.size(0) == target.size(0) + assert maxk <= pred.size(1), \ + f'maxk {maxk} exceeds pred dimension {pred.size(1)}' + pred_value, pred_label = pred.topk(maxk, dim=1) + # transpose to shape (maxk, N, ...) + pred_label = pred_label.transpose(0, 1) + correct = pred_label.eq(target.unsqueeze(0).expand_as(pred_label)) + if thresh is not None: + # Only prediction values larger than thresh are counted as correct + correct = correct & (pred_value > thresh).t() + if ignore_index is not None: + correct = correct[:, target != ignore_index] + res = [] + eps = torch.finfo(torch.float32).eps + for k in topk: + # Avoid causing ZeroDivisionError when all pixels + # of an image are ignored + correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True) + eps + if ignore_index is not None: + total_num = target[target != ignore_index].numel() + eps + else: + total_num = target.numel() + eps + res.append(correct_k.mul_(100.0 / total_num)) + return res[0] if return_single else res + + +class Accuracy(nn.Module): + """Accuracy calculation module.""" + + def __init__(self, topk=(1, ), thresh=None, ignore_index=None): + """Module to calculate the accuracy. + + Args: + topk (tuple, optional): The criterion used to calculate the + accuracy. Defaults to (1,). + thresh (float, optional): If not None, predictions with scores + under this threshold are considered incorrect. Default to None. + """ + super().__init__() + self.topk = topk + self.thresh = thresh + self.ignore_index = ignore_index + + def forward(self, pred, target): + """Forward function to calculate accuracy. + + Args: + pred (torch.Tensor): Prediction of models. + target (torch.Tensor): Target for each prediction. + + Returns: + tuple[float]: The accuracies under different topk criterions. + """ + return accuracy(pred, target, self.topk, self.thresh, + self.ignore_index) diff --git a/mmsegmentation/mmseg/models/losses/boundary_loss.py b/mmsegmentation/mmseg/models/losses/boundary_loss.py new file mode 100644 index 0000000..e86b850 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/boundary_loss.py @@ -0,0 +1,62 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import Tensor + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class BoundaryLoss(nn.Module): + """Boundary loss. + + This function is modified from + `PIDNet `_. # noqa + Licensed under the MIT License. + + + Args: + loss_weight (float): Weight of the loss. Defaults to 1.0. + loss_name (str): Name of the loss item. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_boundary'. + """ + + def __init__(self, + loss_weight: float = 1.0, + loss_name: str = 'loss_boundary'): + super().__init__() + self.loss_weight = loss_weight + self.loss_name_ = loss_name + + def forward(self, bd_pre: Tensor, bd_gt: Tensor) -> Tensor: + """Forward function. + Args: + bd_pre (Tensor): Predictions of the boundary head. + bd_gt (Tensor): Ground truth of the boundary. + + Returns: + Tensor: Loss tensor. + """ + log_p = bd_pre.permute(0, 2, 3, 1).contiguous().view(1, -1) + target_t = bd_gt.view(1, -1).float() + + pos_index = (target_t == 1) + neg_index = (target_t == 0) + + weight = torch.zeros_like(log_p) + pos_num = pos_index.sum() + neg_num = neg_index.sum() + sum_num = pos_num + neg_num + weight[pos_index] = neg_num * 1.0 / sum_num + weight[neg_index] = pos_num * 1.0 / sum_num + + loss = F.binary_cross_entropy_with_logits( + log_p, target_t, weight, reduction='mean') + + return self.loss_weight * loss + + @property + def loss_name(self): + return self.loss_name_ diff --git a/mmsegmentation/mmseg/models/losses/cross_entropy_loss.py b/mmsegmentation/mmseg/models/losses/cross_entropy_loss.py new file mode 100644 index 0000000..988fb78 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/cross_entropy_loss.py @@ -0,0 +1,311 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmseg.registry import MODELS +from .utils import get_class_weight, weight_reduce_loss + + +def cross_entropy(pred, + label, + weight=None, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=-100, + avg_non_ignore=False): + """cross_entropy. The wrapper function for :func:`F.cross_entropy` + + Args: + pred (torch.Tensor): The prediction with shape (N, 1). + label (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + Default: None. + class_weight (list[float], optional): The weight for each class. + Default: None. + reduction (str, optional): The method used to reduce the loss. + Options are 'none', 'mean' and 'sum'. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. Default: None. + ignore_index (int): Specifies a target value that is ignored and + does not contribute to the input gradients. When + ``avg_non_ignore `` is ``True``, and the ``reduction`` is + ``''mean''``, the loss is averaged over non-ignored targets. + Defaults: -100. + avg_non_ignore (bool): The flag decides to whether the loss is + only averaged over non-ignored targets. Default: False. + `New in version 0.23.0.` + """ + + # class_weight is a manual rescaling weight given to each class. + # If given, has to be a Tensor of size C element-wise losses + loss = F.cross_entropy( + pred, + label, + weight=class_weight, + reduction='none', + ignore_index=ignore_index) + + # apply weights and do the reduction + # average loss over non-ignored elements + # pytorch's official cross_entropy average loss over non-ignored elements + # refer to https://github.com/pytorch/pytorch/blob/56b43f4fec1f76953f15a627694d4bba34588969/torch/nn/functional.py#L2660 # noqa + if (avg_factor is None) and reduction == 'mean': + if class_weight is None: + if avg_non_ignore: + avg_factor = label.numel() - (label + == ignore_index).sum().item() + else: + avg_factor = label.numel() + + else: + # the average factor should take the class weights into account + label_weights = torch.stack([class_weight[cls] for cls in label + ]).to(device=class_weight.device) + + if avg_non_ignore: + label_weights[label == ignore_index] = 0 + avg_factor = label_weights.sum() + + if weight is not None: + weight = weight.float() + loss = weight_reduce_loss( + loss, weight=weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def _expand_onehot_labels(labels, label_weights, target_shape, ignore_index): + """Expand onehot labels to match the size of prediction.""" + bin_labels = labels.new_zeros(target_shape) + valid_mask = (labels >= 0) & (labels != ignore_index) + inds = torch.nonzero(valid_mask, as_tuple=True) + + if inds[0].numel() > 0: + if labels.dim() == 3: + bin_labels[inds[0], labels[valid_mask], inds[1], inds[2]] = 1 + else: + bin_labels[inds[0], labels[valid_mask]] = 1 + + valid_mask = valid_mask.unsqueeze(1).expand(target_shape).float() + + if label_weights is None: + bin_label_weights = valid_mask + else: + bin_label_weights = label_weights.unsqueeze(1).expand(target_shape) + bin_label_weights = bin_label_weights * valid_mask + + return bin_labels, bin_label_weights, valid_mask + + +def binary_cross_entropy(pred, + label, + weight=None, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=-100, + avg_non_ignore=False, + **kwargs): + """Calculate the binary CrossEntropy loss. + + Args: + pred (torch.Tensor): The prediction with shape (N, 1). + label (torch.Tensor): The learning label of the prediction. + Note: In bce loss, label < 0 is invalid. + weight (torch.Tensor, optional): Sample-wise loss weight. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (int): The label index to be ignored. Default: -100. + avg_non_ignore (bool): The flag decides to whether the loss is + only averaged over non-ignored targets. Default: False. + `New in version 0.23.0.` + + Returns: + torch.Tensor: The calculated loss + """ + if pred.size(1) == 1: + # For binary class segmentation, the shape of pred is + # [N, 1, H, W] and that of label is [N, H, W]. + # As the ignore_index often set as 255, so the + # binary class label check should mask out + # ignore_index + assert label[label != ignore_index].max() <= 1, \ + 'For pred with shape [N, 1, H, W], its label must have at ' \ + 'most 2 classes' + pred = pred.squeeze(1) + if pred.dim() != label.dim(): + assert (pred.dim() == 2 and label.dim() == 1) or ( + pred.dim() == 4 and label.dim() == 3), \ + 'Only pred shape [N, C], label shape [N] or pred shape [N, C, ' \ + 'H, W], label shape [N, H, W] are supported' + # `weight` returned from `_expand_onehot_labels` + # has been treated for valid (non-ignore) pixels + label, weight, valid_mask = _expand_onehot_labels( + label, weight, pred.shape, ignore_index) + else: + # should mask out the ignored elements + valid_mask = ((label >= 0) & (label != ignore_index)).float() + if weight is not None: + weight = weight * valid_mask + else: + weight = valid_mask + # average loss over non-ignored and valid elements + if reduction == 'mean' and avg_factor is None and avg_non_ignore: + avg_factor = valid_mask.sum().item() + + loss = F.binary_cross_entropy_with_logits( + pred, label.float(), pos_weight=class_weight, reduction='none') + # do the reduction for the weighted loss + loss = weight_reduce_loss( + loss, weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def mask_cross_entropy(pred, + target, + label, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=None, + **kwargs): + """Calculate the CrossEntropy loss for masks. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the number + of classes. + target (torch.Tensor): The learning label of the prediction. + label (torch.Tensor): ``label`` indicates the class label of the mask' + corresponding object. This will be used to select the mask in the + of the class which the object belongs to when the mask prediction + if not class-agnostic. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (None): Placeholder, to be consistent with other loss. + Default: None. + + Returns: + torch.Tensor: The calculated loss + """ + assert ignore_index is None, 'BCE loss does not support ignore_index' + # TODO: handle these two reserved arguments + assert reduction == 'mean' and avg_factor is None + num_rois = pred.size()[0] + inds = torch.arange(0, num_rois, dtype=torch.long, device=pred.device) + pred_slice = pred[inds, label].squeeze(1) + return F.binary_cross_entropy_with_logits( + pred_slice, target, weight=class_weight, reduction='mean')[None] + + +@MODELS.register_module() +class CrossEntropyLoss(nn.Module): + """CrossEntropyLoss. + + Args: + use_sigmoid (bool, optional): Whether the prediction uses sigmoid + of softmax. Defaults to False. + use_mask (bool, optional): Whether to use mask cross entropy loss. + Defaults to False. + reduction (str, optional): . Defaults to 'mean'. + Options are "none", "mean" and "sum". + class_weight (list[float] | str, optional): Weight of each class. If in + str format, read them from a file. Defaults to None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + loss_name (str, optional): Name of the loss item. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_ce'. + avg_non_ignore (bool): The flag decides to whether the loss is + only averaged over non-ignored targets. Default: False. + `New in version 0.23.0.` + """ + + def __init__(self, + use_sigmoid=False, + use_mask=False, + reduction='mean', + class_weight=None, + loss_weight=1.0, + loss_name='loss_ce', + avg_non_ignore=False): + super().__init__() + assert (use_sigmoid is False) or (use_mask is False) + self.use_sigmoid = use_sigmoid + self.use_mask = use_mask + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = get_class_weight(class_weight) + self.avg_non_ignore = avg_non_ignore + if not self.avg_non_ignore and self.reduction == 'mean': + warnings.warn( + 'Default ``avg_non_ignore`` is False, if you would like to ' + 'ignore the certain label and average loss over non-ignore ' + 'labels, which is the same with PyTorch official ' + 'cross_entropy, set ``avg_non_ignore=True``.') + + if self.use_sigmoid: + self.cls_criterion = binary_cross_entropy + elif self.use_mask: + self.cls_criterion = mask_cross_entropy + else: + self.cls_criterion = cross_entropy + self._loss_name = loss_name + + def extra_repr(self): + """Extra repr.""" + s = f'avg_non_ignore={self.avg_non_ignore}' + return s + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + ignore_index=-100, + **kwargs): + """Forward function.""" + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = cls_score.new_tensor(self.class_weight) + else: + class_weight = None + # Note: for BCE loss, label < 0 is invalid. + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + weight, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + avg_non_ignore=self.avg_non_ignore, + ignore_index=ignore_index, + **kwargs) + return loss_cls + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/dice_loss.py b/mmsegmentation/mmseg/models/losses/dice_loss.py new file mode 100644 index 0000000..fb2ffdb --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/dice_loss.py @@ -0,0 +1,202 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Union + +import torch +import torch.nn as nn + +from mmseg.registry import MODELS +from .utils import weight_reduce_loss + + +def _expand_onehot_labels_dice(pred: torch.Tensor, + target: torch.Tensor) -> torch.Tensor: + """Expand onehot labels to match the size of prediction. + + Args: + pred (torch.Tensor): The prediction, has a shape (N, num_class, H, W). + target (torch.Tensor): The learning label of the prediction, + has a shape (N, H, W). + + Returns: + torch.Tensor: The target after one-hot encoding, + has a shape (N, num_class, H, W). + """ + num_classes = pred.shape[1] + one_hot_target = torch.clamp(target, min=0, max=num_classes) + one_hot_target = torch.nn.functional.one_hot(one_hot_target, + num_classes + 1) + one_hot_target = one_hot_target[..., :num_classes].permute(0, 3, 1, 2) + return one_hot_target + + +def dice_loss(pred: torch.Tensor, + target: torch.Tensor, + weight: Union[torch.Tensor, None], + eps: float = 1e-3, + reduction: Union[str, None] = 'mean', + naive_dice: Union[bool, None] = False, + avg_factor: Union[int, None] = None, + ignore_index: Union[int, None] = 255) -> float: + """Calculate dice loss, there are two forms of dice loss is supported: + + - the one proposed in `V-Net: Fully Convolutional Neural + Networks for Volumetric Medical Image Segmentation + `_. + - the dice loss in which the power of the number in the + denominator is the first power instead of the second + power. + + Args: + pred (torch.Tensor): The prediction, has a shape (n, *) + target (torch.Tensor): The learning label of the prediction, + shape (n, *), same shape of pred. + weight (torch.Tensor, optional): The weight of loss for each + prediction, has a shape (n,). Defaults to None. + eps (float): Avoid dividing by zero. Default: 1e-3. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. + Options are "none", "mean" and "sum". + naive_dice (bool, optional): If false, use the dice + loss defined in the V-Net paper, otherwise, use the + naive dice loss in which the power of the number in the + denominator is the first power instead of the second + power.Defaults to False. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + ignore_index (int, optional): The label index to be ignored. + Defaults to 255. + """ + if ignore_index is not None: + num_classes = pred.shape[1] + pred = pred[:, torch.arange(num_classes) != ignore_index, :, :] + target = target[:, torch.arange(num_classes) != ignore_index, :, :] + assert pred.shape[1] != 0 # if the ignored index is the only class + input = pred.flatten(1) + target = target.flatten(1).float() + a = torch.sum(input * target, 1) + if naive_dice: + b = torch.sum(input, 1) + c = torch.sum(target, 1) + d = (2 * a + eps) / (b + c + eps) + else: + b = torch.sum(input * input, 1) + eps + c = torch.sum(target * target, 1) + eps + d = (2 * a) / (b + c) + + loss = 1 - d + if weight is not None: + assert weight.ndim == loss.ndim + assert len(weight) == len(pred) + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +@MODELS.register_module() +class DiceLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=False, + loss_weight=1.0, + ignore_index=255, + eps=1e-3, + loss_name='loss_dice'): + """Compute dice loss. + + Args: + use_sigmoid (bool, optional): Whether to the prediction is + used for sigmoid or softmax. Defaults to True. + activate (bool): Whether to activate the predictions inside, + this will disable the inside sigmoid operation. + Defaults to True. + reduction (str, optional): The method used + to reduce the loss. Options are "none", + "mean" and "sum". Defaults to 'mean'. + naive_dice (bool, optional): If false, use the dice + loss defined in the V-Net paper, otherwise, use the + naive dice loss in which the power of the number in the + denominator is the first power instead of the second + power. Defaults to False. + loss_weight (float, optional): Weight of loss. Defaults to 1.0. + ignore_index (int, optional): The label index to be ignored. + Default: 255. + eps (float): Avoid dividing by zero. Defaults to 1e-3. + loss_name (str, optional): Name of the loss item. If you want this + loss item to be included into the backward graph, `loss_` must + be the prefix of the name. Defaults to 'loss_dice'. + """ + + super().__init__() + self.use_sigmoid = use_sigmoid + self.reduction = reduction + self.naive_dice = naive_dice + self.loss_weight = loss_weight + self.eps = eps + self.activate = activate + self.ignore_index = ignore_index + self._loss_name = loss_name + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + ignore_index=255, + **kwargs): + """Forward function. + + Args: + pred (torch.Tensor): The prediction, has a shape (n, *). + target (torch.Tensor): The label of the prediction, + shape (n, *), same shape of pred. + weight (torch.Tensor, optional): The weight of loss for each + prediction, has a shape (n,). Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Options are "none", "mean" and "sum". + + Returns: + torch.Tensor: The calculated loss + """ + one_hot_target = target + if (pred.shape != target.shape): + one_hot_target = _expand_onehot_labels_dice(pred, target) + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.activate: + if self.use_sigmoid: + pred = pred.sigmoid() + elif pred.shape[1] != 1: + # softmax does not work when there is only 1 class + pred = pred.softmax(dim=1) + loss = self.loss_weight * dice_loss( + pred, + one_hot_target, + weight, + eps=self.eps, + reduction=reduction, + naive_dice=self.naive_dice, + avg_factor=avg_factor, + ignore_index=self.ignore_index) + + return loss + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/focal_loss.py b/mmsegmentation/mmseg/models/losses/focal_loss.py new file mode 100644 index 0000000..6507ed7 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/focal_loss.py @@ -0,0 +1,337 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Modified from https://github.com/open-mmlab/mmdetection +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.ops import sigmoid_focal_loss as _sigmoid_focal_loss + +from mmseg.registry import MODELS +from .utils import weight_reduce_loss + + +# This method is used when cuda is not available +def py_sigmoid_focal_loss(pred, + target, + one_hot_target=None, + weight=None, + gamma=2.0, + alpha=0.5, + class_weight=None, + valid_mask=None, + reduction='mean', + avg_factor=None): + """PyTorch version of `Focal Loss `_. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the + number of classes + target (torch.Tensor): The learning label of the prediction with + shape (N, C) + one_hot_target (None): Placeholder. It should be None. + weight (torch.Tensor, optional): Sample-wise loss weight. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float | list[float], optional): A balanced form for Focal Loss. + Defaults to 0.5. + class_weight (list[float], optional): Weight of each class. + Defaults to None. + valid_mask (torch.Tensor, optional): A mask uses 1 to mark the valid + samples and uses 0 to mark the ignored samples. Default: None. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + if isinstance(alpha, list): + alpha = pred.new_tensor(alpha) + pred_sigmoid = pred.sigmoid() + target = target.type_as(pred) + one_minus_pt = (1 - pred_sigmoid) * target + pred_sigmoid * (1 - target) + focal_weight = (alpha * target + (1 - alpha) * + (1 - target)) * one_minus_pt.pow(gamma) + + loss = F.binary_cross_entropy_with_logits( + pred, target, reduction='none') * focal_weight + final_weight = torch.ones(1, pred.size(1)).type_as(loss) + if weight is not None: + if weight.shape != loss.shape and weight.size(0) == loss.size(0): + # For most cases, weight is of shape (N, ), + # which means it does not have the second axis num_class + weight = weight.view(-1, 1) + assert weight.dim() == loss.dim() + final_weight = final_weight * weight + if class_weight is not None: + final_weight = final_weight * pred.new_tensor(class_weight) + if valid_mask is not None: + final_weight = final_weight * valid_mask + loss = weight_reduce_loss(loss, final_weight, reduction, avg_factor) + return loss + + +def sigmoid_focal_loss(pred, + target, + one_hot_target, + weight=None, + gamma=2.0, + alpha=0.5, + class_weight=None, + valid_mask=None, + reduction='mean', + avg_factor=None): + r"""A wrapper of cuda version `Focal Loss + `_. + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the number + of classes. + target (torch.Tensor): The learning label of the prediction. It's shape + should be (N, ) + one_hot_target (torch.Tensor): The learning label with shape (N, C) + weight (torch.Tensor, optional): Sample-wise loss weight. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float | list[float], optional): A balanced form for Focal Loss. + Defaults to 0.5. + class_weight (list[float], optional): Weight of each class. + Defaults to None. + valid_mask (torch.Tensor, optional): A mask uses 1 to mark the valid + samples and uses 0 to mark the ignored samples. Default: None. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + # Function.apply does not accept keyword arguments, so the decorator + # "weighted_loss" is not applicable + final_weight = torch.ones(1, pred.size(1)).type_as(pred) + if isinstance(alpha, list): + # _sigmoid_focal_loss doesn't accept alpha of list type. Therefore, if + # a list is given, we set the input alpha as 0.5. This means setting + # equal weight for foreground class and background class. By + # multiplying the loss by 2, the effect of setting alpha as 0.5 is + # undone. The alpha of type list is used to regulate the loss in the + # post-processing process. + loss = _sigmoid_focal_loss(pred.contiguous(), target.contiguous(), + gamma, 0.5, None, 'none') * 2 + alpha = pred.new_tensor(alpha) + final_weight = final_weight * ( + alpha * one_hot_target + (1 - alpha) * (1 - one_hot_target)) + else: + loss = _sigmoid_focal_loss(pred.contiguous(), target.contiguous(), + gamma, alpha, None, 'none') + if weight is not None: + if weight.shape != loss.shape and weight.size(0) == loss.size(0): + # For most cases, weight is of shape (N, ), + # which means it does not have the second axis num_class + weight = weight.view(-1, 1) + assert weight.dim() == loss.dim() + final_weight = final_weight * weight + if class_weight is not None: + final_weight = final_weight * pred.new_tensor(class_weight) + if valid_mask is not None: + final_weight = final_weight * valid_mask + loss = weight_reduce_loss(loss, final_weight, reduction, avg_factor) + return loss + + +@MODELS.register_module() +class FocalLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + gamma=2.0, + alpha=0.5, + reduction='mean', + class_weight=None, + loss_weight=1.0, + loss_name='loss_focal'): + """`Focal Loss `_ + Args: + use_sigmoid (bool, optional): Whether to the prediction is + used for sigmoid or softmax. Defaults to True. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float | list[float], optional): A balanced form for Focal + Loss. Defaults to 0.5. When a list is provided, the length + of the list should be equal to the number of classes. + Please be careful that this parameter is not the + class-wise weight but the weight of a binary classification + problem. This binary classification problem regards the + pixels which belong to one class as the foreground + and the other pixels as the background, each element in + the list is the weight of the corresponding foreground class. + The value of alpha or each element of alpha should be a float + in the interval [0, 1]. If you want to specify the class-wise + weight, please use `class_weight` parameter. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. Options are "none", "mean" and + "sum". + class_weight (list[float], optional): Weight of each class. + Defaults to None. + loss_weight (float, optional): Weight of loss. Defaults to 1.0. + loss_name (str, optional): Name of the loss item. If you want this + loss item to be included into the backward graph, `loss_` must + be the prefix of the name. Defaults to 'loss_focal'. + """ + super().__init__() + assert use_sigmoid is True, \ + 'AssertionError: Only sigmoid focal loss supported now.' + assert reduction in ('none', 'mean', 'sum'), \ + "AssertionError: reduction should be 'none', 'mean' or " \ + "'sum'" + assert isinstance(alpha, (float, list)), \ + 'AssertionError: alpha should be of type float' + assert isinstance(gamma, float), \ + 'AssertionError: gamma should be of type float' + assert isinstance(loss_weight, float), \ + 'AssertionError: loss_weight should be of type float' + assert isinstance(loss_name, str), \ + 'AssertionError: loss_name should be of type str' + assert isinstance(class_weight, list) or class_weight is None, \ + 'AssertionError: class_weight must be None or of type list' + self.use_sigmoid = use_sigmoid + self.gamma = gamma + self.alpha = alpha + self.reduction = reduction + self.class_weight = class_weight + self.loss_weight = loss_weight + self._loss_name = loss_name + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + ignore_index=255, + **kwargs): + """Forward function. + + Args: + pred (torch.Tensor): The prediction with shape + (N, C) where C = number of classes, or + (N, C, d_1, d_2, ..., d_K) with Kโ‰ฅ1 in the + case of K-dimensional loss. + target (torch.Tensor): The ground truth. If containing class + indices, shape (N) where each value is 0โ‰คtargets[i]โ‰คCโˆ’1, + or (N, d_1, d_2, ..., d_K) with Kโ‰ฅ1 in the case of + K-dimensional loss. If containing class probabilities, + same shape as the input. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to + average the loss. Defaults to None. + reduction_override (str, optional): The reduction method used + to override the original reduction method of the loss. + Options are "none", "mean" and "sum". + ignore_index (int, optional): The label index to be ignored. + Default: 255 + Returns: + torch.Tensor: The calculated loss + """ + assert isinstance(ignore_index, int), \ + 'ignore_index must be of type int' + assert reduction_override in (None, 'none', 'mean', 'sum'), \ + "AssertionError: reduction should be 'none', 'mean' or " \ + "'sum'" + assert pred.shape == target.shape or \ + (pred.size(0) == target.size(0) and + pred.shape[2:] == target.shape[1:]), \ + "The shape of pred doesn't match the shape of target" + + original_shape = pred.shape + + # [B, C, d_1, d_2, ..., d_k] -> [C, B, d_1, d_2, ..., d_k] + pred = pred.transpose(0, 1) + # [C, B, d_1, d_2, ..., d_k] -> [C, N] + pred = pred.reshape(pred.size(0), -1) + # [C, N] -> [N, C] + pred = pred.transpose(0, 1).contiguous() + + if original_shape == target.shape: + # target with shape [B, C, d_1, d_2, ...] + # transform it's shape into [N, C] + # [B, C, d_1, d_2, ...] -> [C, B, d_1, d_2, ..., d_k] + target = target.transpose(0, 1) + # [C, B, d_1, d_2, ..., d_k] -> [C, N] + target = target.reshape(target.size(0), -1) + # [C, N] -> [N, C] + target = target.transpose(0, 1).contiguous() + else: + # target with shape [B, d_1, d_2, ...] + # transform it's shape into [N, ] + target = target.view(-1).contiguous() + valid_mask = (target != ignore_index).view(-1, 1) + # avoid raising error when using F.one_hot() + target = torch.where(target == ignore_index, target.new_tensor(0), + target) + + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.use_sigmoid: + num_classes = pred.size(1) + if torch.cuda.is_available() and pred.is_cuda: + if target.dim() == 1: + one_hot_target = F.one_hot( + target, num_classes=num_classes + 1) + if num_classes == 1: + one_hot_target = one_hot_target[:, 1] + target = 1 - target + else: + one_hot_target = one_hot_target[:, :num_classes] + else: + one_hot_target = target + target = target.argmax(dim=1) + valid_mask = (target != ignore_index).view(-1, 1) + calculate_loss_func = sigmoid_focal_loss + else: + one_hot_target = None + if target.dim() == 1: + target = F.one_hot(target, num_classes=num_classes + 1) + if num_classes == 1: + target = target[:, 1] + else: + target = target[:, num_classes] + else: + valid_mask = (target.argmax(dim=1) != ignore_index).view( + -1, 1) + calculate_loss_func = py_sigmoid_focal_loss + + loss_cls = self.loss_weight * calculate_loss_func( + pred, + target, + one_hot_target, + weight, + gamma=self.gamma, + alpha=self.alpha, + class_weight=self.class_weight, + valid_mask=valid_mask, + reduction=reduction, + avg_factor=avg_factor) + + if reduction == 'none': + # [N, C] -> [C, N] + loss_cls = loss_cls.transpose(0, 1) + # [C, N] -> [C, B, d1, d2, ...] + # original_shape: [B, C, d1, d2, ...] + loss_cls = loss_cls.reshape(original_shape[1], + original_shape[0], + *original_shape[2:]) + # [C, B, d1, d2, ...] -> [B, C, d1, d2, ...] + loss_cls = loss_cls.transpose(0, 1).contiguous() + else: + raise NotImplementedError + return loss_cls + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/huasdorff_distance_loss.py b/mmsegmentation/mmseg/models/losses/huasdorff_distance_loss.py new file mode 100644 index 0000000..d950ba7 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/huasdorff_distance_loss.py @@ -0,0 +1,160 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Modified from https://github.com/JunMa11/SegWithDistMap/blob/ +master/code/train_LA_HD.py (Apache-2.0 License)""" +import torch +import torch.nn as nn +import torch.nn.functional as F +from scipy.ndimage import distance_transform_edt as distance +from torch import Tensor + +from mmseg.registry import MODELS +from .utils import get_class_weight, weighted_loss + + +def compute_dtm(img_gt: Tensor, pred: Tensor) -> Tensor: + """ + compute the distance transform map of foreground in mask + Args: + img_gt: Ground truth of the image, (b, h, w) + pred: Predictions of the segmentation head after softmax, (b, c, h, w) + + Returns: + output: the foreground Distance Map (SDM) + dtm(x) = 0; x in segmentation boundary + inf|x-y|; x in segmentation + """ + + fg_dtm = torch.zeros_like(pred) + out_shape = pred.shape + for b in range(out_shape[0]): # batch size + for c in range(1, out_shape[1]): # default 0 channel is background + posmask = img_gt[b].byte() + if posmask.any(): + posdis = distance(posmask) + fg_dtm[b][c] = torch.from_numpy(posdis) + + return fg_dtm + + +@weighted_loss +def hd_loss(seg_soft: Tensor, + gt: Tensor, + seg_dtm: Tensor, + gt_dtm: Tensor, + class_weight=None, + ignore_index=255) -> Tensor: + """ + compute huasdorff distance loss for segmentation + Args: + seg_soft: softmax results, shape=(b,c,x,y) + gt: ground truth, shape=(b,x,y) + seg_dtm: segmentation distance transform map, shape=(b,c,x,y) + gt_dtm: ground truth distance transform map, shape=(b,c,x,y) + + Returns: + output: hd_loss + """ + assert seg_soft.shape[0] == gt.shape[0] + total_loss = 0 + num_class = seg_soft.shape[1] + if class_weight is not None: + assert class_weight.ndim == num_class + for i in range(1, num_class): + if i != ignore_index: + delta_s = (seg_soft[:, i, ...] - gt.float())**2 + s_dtm = seg_dtm[:, i, ...]**2 + g_dtm = gt_dtm[:, i, ...]**2 + dtm = s_dtm + g_dtm + multiplied = torch.einsum('bxy, bxy->bxy', delta_s, dtm) + hd_loss = multiplied.mean() + if class_weight is not None: + hd_loss *= class_weight[i] + total_loss += hd_loss + + return total_loss / num_class + + +@MODELS.register_module() +class HuasdorffDisstanceLoss(nn.Module): + """HuasdorffDisstanceLoss. This loss is proposed in `How Distance Transform + Maps Boost Segmentation CNNs: An Empirical Study. + + `_. + Args: + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. + class_weight (list[float] | str, optional): Weight of each class. If in + str format, read them from a file. Defaults to None. + loss_weight (float): Weight of the loss. Defaults to 1.0. + ignore_index (int | None): The label index to be ignored. Default: 255. + loss_name (str): Name of the loss item. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_boundary'. + """ + + def __init__(self, + reduction='mean', + class_weight=None, + loss_weight=1.0, + ignore_index=255, + loss_name='loss_huasdorff_disstance', + **kwargs): + super().__init__() + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = get_class_weight(class_weight) + self._loss_name = loss_name + self.ignore_index = ignore_index + + def forward(self, + pred: Tensor, + target: Tensor, + avg_factor=None, + reduction_override=None, + **kwargs) -> Tensor: + """Forward function. + + Args: + pred (Tensor): Predictions of the segmentation head. (B, C, H, W) + target (Tensor): Ground truth of the image. (B, H, W) + avg_factor (int, optional): Average factor that is used to + average the loss. Defaults to None. + reduction_override (str, optional): The reduction method used + to override the original reduction method of the loss. + Options are "none", "mean" and "sum". + Returns: + Tensor: Loss tensor. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = pred.new_tensor(self.class_weight) + else: + class_weight = None + + pred_soft = F.softmax(pred, dim=1) + valid_mask = (target != self.ignore_index).long() + target = target * valid_mask + + with torch.no_grad(): + gt_dtm = compute_dtm(target.cpu(), pred_soft) + gt_dtm = gt_dtm.float() + seg_dtm2 = compute_dtm( + pred_soft.argmax(dim=1, keepdim=False).cpu(), pred_soft) + seg_dtm2 = seg_dtm2.float() + + loss_hd = self.loss_weight * hd_loss( + pred_soft, + target, + seg_dtm=seg_dtm2, + gt_dtm=gt_dtm, + reduction=reduction, + avg_factor=avg_factor, + class_weight=class_weight, + ignore_index=self.ignore_index) + return loss_hd + + @property + def loss_name(self): + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/kldiv_loss.py b/mmsegmentation/mmseg/models/losses/kldiv_loss.py new file mode 100644 index 0000000..496ef97 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/kldiv_loss.py @@ -0,0 +1,99 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class KLDivLoss(nn.Module): + + def __init__(self, + temperature: float = 1.0, + reduction: str = 'mean', + loss_name: str = 'loss_kld'): + """Kullback-Leibler divergence Loss. + + + + Args: + temperature (float, optional): Temperature param + reduction (str, optional): The method to reduce the loss into a + scalar. Default is "mean". Options are "none", "sum", + and "mean" + """ + + assert isinstance(temperature, (float, int)), \ + 'Expected temperature to be' \ + f'float or int, but got {temperature.__class__.__name__} instead' + assert temperature != 0., 'Temperature must not be zero' + + assert reduction in ['mean', 'none', 'sum'], \ + 'Reduction must be one of the options ("mean", ' \ + f'"sum", "none"), but got {reduction}' + + super().__init__() + self.temperature = temperature + self.reduction = reduction + self._loss_name = loss_name + + def forward(self, input: torch.Tensor, target: torch.Tensor): + """Forward function. Calculate KL divergence Loss. + + Args: + input (Tensor): Logit tensor, + the data type is float32 or float64. + The shape is (N, C) where N is batchsize and C is number of + channels. + If there more than 2 dimensions, shape is (N, C, D1, D2, ... + Dk), k>= 1 + target (Tensor): Logit tensor, + the data type is float32 or float64. + input and target must be with the same shape. + + Returns: + (Tensor): Reduced loss. + """ + assert isinstance(input, torch.Tensor), 'Expected input to' \ + f'be Tensor, but got {input.__class__.__name__} instead' + assert isinstance(target, torch.Tensor), 'Expected target to' \ + f'be Tensor, but got {target.__class__.__name__} instead' + + assert input.shape == target.shape, 'Input and target ' \ + 'must have same shape,' \ + f'but got shapes {input.shape} and {target.shape}' + + input = F.softmax(input / self.temperature, dim=1) + target = F.softmax(target / self.temperature, dim=1) + + loss = F.kl_div(input, target, reduction='none', log_target=False) + loss = loss * self.temperature**2 + + batch_size = input.shape[0] + + if self.reduction == 'sum': + # Change view to calculate instance-wise sum + loss = loss.view(batch_size, -1) + return torch.sum(loss, dim=1) + + elif self.reduction == 'mean': + # Change view to calculate instance-wise mean + loss = loss.view(batch_size, -1) + return torch.mean(loss, dim=1) + + return loss + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/lovasz_loss.py b/mmsegmentation/mmseg/models/losses/lovasz_loss.py new file mode 100644 index 0000000..b47f9d8 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/lovasz_loss.py @@ -0,0 +1,323 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Modified from https://github.com/bermanmaxim/LovaszSoftmax/blob/master/pytor +ch/lovasz_losses.py Lovasz-Softmax and Jaccard hinge loss in PyTorch Maxim +Berman 2018 ESAT-PSI KU Leuven (MIT License)""" + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.utils import is_list_of + +from mmseg.registry import MODELS +from .utils import get_class_weight, weight_reduce_loss + + +def lovasz_grad(gt_sorted): + """Computes gradient of the Lovasz extension w.r.t sorted errors. + + See Alg. 1 in paper. + """ + p = len(gt_sorted) + gts = gt_sorted.sum() + intersection = gts - gt_sorted.float().cumsum(0) + union = gts + (1 - gt_sorted).float().cumsum(0) + jaccard = 1. - intersection / union + if p > 1: # cover 1-pixel case + jaccard[1:p] = jaccard[1:p] - jaccard[0:-1] + return jaccard + + +def flatten_binary_logits(logits, labels, ignore_index=None): + """Flattens predictions in the batch (binary case) Remove labels equal to + 'ignore_index'.""" + logits = logits.view(-1) + labels = labels.view(-1) + if ignore_index is None: + return logits, labels + valid = (labels != ignore_index) + vlogits = logits[valid] + vlabels = labels[valid] + return vlogits, vlabels + + +def flatten_probs(probs, labels, ignore_index=None): + """Flattens predictions in the batch.""" + if probs.dim() == 3: + # assumes output of a sigmoid layer + B, H, W = probs.size() + probs = probs.view(B, 1, H, W) + B, C, H, W = probs.size() + probs = probs.permute(0, 2, 3, 1).contiguous().view(-1, C) # B*H*W, C=P,C + labels = labels.view(-1) + if ignore_index is None: + return probs, labels + valid = (labels != ignore_index) + vprobs = probs[valid.nonzero().squeeze()] + vlabels = labels[valid] + return vprobs, vlabels + + +def lovasz_hinge_flat(logits, labels): + """Binary Lovasz hinge loss. + + Args: + logits (torch.Tensor): [P], logits at each prediction + (between -infty and +infty). + labels (torch.Tensor): [P], binary ground truth labels (0 or 1). + + Returns: + torch.Tensor: The calculated loss. + """ + if len(labels) == 0: + # only void pixels, the gradients should be 0 + return logits.sum() * 0. + signs = 2. * labels.float() - 1. + errors = (1. - logits * signs) + errors_sorted, perm = torch.sort(errors, dim=0, descending=True) + perm = perm.data + gt_sorted = labels[perm] + grad = lovasz_grad(gt_sorted) + loss = torch.dot(F.relu(errors_sorted), grad) + return loss + + +def lovasz_hinge(logits, + labels, + classes='present', + per_image=False, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=255): + """Binary Lovasz hinge loss. + + Args: + logits (torch.Tensor): [B, H, W], logits at each pixel + (between -infty and +infty). + labels (torch.Tensor): [B, H, W], binary ground truth masks (0 or 1). + classes (str | list[int], optional): Placeholder, to be consistent with + other loss. Default: None. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + class_weight (list[float], optional): Placeholder, to be consistent + with other loss. Default: None. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. This parameter only works when per_image is True. + Default: None. + ignore_index (int | None): The label index to be ignored. Default: 255. + + Returns: + torch.Tensor: The calculated loss. + """ + if per_image: + loss = [ + lovasz_hinge_flat(*flatten_binary_logits( + logit.unsqueeze(0), label.unsqueeze(0), ignore_index)) + for logit, label in zip(logits, labels) + ] + loss = weight_reduce_loss( + torch.stack(loss), None, reduction, avg_factor) + else: + loss = lovasz_hinge_flat( + *flatten_binary_logits(logits, labels, ignore_index)) + return loss + + +def lovasz_softmax_flat(probs, labels, classes='present', class_weight=None): + """Multi-class Lovasz-Softmax loss. + + Args: + probs (torch.Tensor): [P, C], class probabilities at each prediction + (between 0 and 1). + labels (torch.Tensor): [P], ground truth labels (between 0 and C - 1). + classes (str | list[int], optional): Classes chosen to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + class_weight (list[float], optional): The weight for each class. + Default: None. + + Returns: + torch.Tensor: The calculated loss. + """ + if probs.numel() == 0: + # only void pixels, the gradients should be 0 + return probs * 0. + C = probs.size(1) + losses = [] + class_to_sum = list(range(C)) if classes in ['all', 'present'] else classes + for c in class_to_sum: + fg = (labels == c).float() # foreground for class c + if (classes == 'present' and fg.sum() == 0): + continue + if C == 1: + if len(classes) > 1: + raise ValueError('Sigmoid output possible only with 1 class') + class_pred = probs[:, 0] + else: + class_pred = probs[:, c] + errors = (fg - class_pred).abs() + errors_sorted, perm = torch.sort(errors, 0, descending=True) + perm = perm.data + fg_sorted = fg[perm] + loss = torch.dot(errors_sorted, lovasz_grad(fg_sorted)) + if class_weight is not None: + loss *= class_weight[c] + losses.append(loss) + return torch.stack(losses).mean() + + +def lovasz_softmax(probs, + labels, + classes='present', + per_image=False, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=255): + """Multi-class Lovasz-Softmax loss. + + Args: + probs (torch.Tensor): [B, C, H, W], class probabilities at each + prediction (between 0 and 1). + labels (torch.Tensor): [B, H, W], ground truth labels (between 0 and + C - 1). + classes (str | list[int], optional): Classes chosen to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + class_weight (list[float], optional): The weight for each class. + Default: None. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. This parameter only works when per_image is True. + Default: None. + ignore_index (int | None): The label index to be ignored. Default: 255. + + Returns: + torch.Tensor: The calculated loss. + """ + + if per_image: + loss = [ + lovasz_softmax_flat( + *flatten_probs( + prob.unsqueeze(0), label.unsqueeze(0), ignore_index), + classes=classes, + class_weight=class_weight) + for prob, label in zip(probs, labels) + ] + loss = weight_reduce_loss( + torch.stack(loss), None, reduction, avg_factor) + else: + loss = lovasz_softmax_flat( + *flatten_probs(probs, labels, ignore_index), + classes=classes, + class_weight=class_weight) + return loss + + +@MODELS.register_module() +class LovaszLoss(nn.Module): + """LovaszLoss. + + This loss is proposed in `The Lovasz-Softmax loss: A tractable surrogate + for the optimization of the intersection-over-union measure in neural + networks `_. + + Args: + loss_type (str, optional): Binary or multi-class loss. + Default: 'multi_class'. Options are "binary" and "multi_class". + classes (str | list[int], optional): Classes chosen to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + class_weight (list[float] | str, optional): Weight of each class. If in + str format, read them from a file. Defaults to None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + loss_name (str, optional): Name of the loss item. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_lovasz'. + """ + + def __init__(self, + loss_type='multi_class', + classes='present', + per_image=False, + reduction='mean', + class_weight=None, + loss_weight=1.0, + loss_name='loss_lovasz'): + super().__init__() + assert loss_type in ('binary', 'multi_class'), "loss_type should be \ + 'binary' or 'multi_class'." + + if loss_type == 'binary': + self.cls_criterion = lovasz_hinge + else: + self.cls_criterion = lovasz_softmax + assert classes in ('all', 'present') or is_list_of(classes, int) + if not per_image: + assert reduction == 'none', "reduction should be 'none' when \ + per_image is False." + + self.classes = classes + self.per_image = per_image + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = get_class_weight(class_weight) + self._loss_name = loss_name + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function.""" + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = cls_score.new_tensor(self.class_weight) + else: + class_weight = None + + # if multi-class loss, transform logits to probs + if self.cls_criterion == lovasz_softmax: + cls_score = F.softmax(cls_score, dim=1) + + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + self.classes, + self.per_image, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_cls + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/ohem_cross_entropy_loss.py b/mmsegmentation/mmseg/models/losses/ohem_cross_entropy_loss.py new file mode 100644 index 0000000..a519b4d --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/ohem_cross_entropy_loss.py @@ -0,0 +1,94 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Optional, Union + +import torch.nn as nn +import torch.nn.functional as F +from torch import Tensor + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class OhemCrossEntropy(nn.Module): + """OhemCrossEntropy loss. + + This func is modified from + `PIDNet `_. # noqa + + Licensed under the MIT License. + + Args: + ignore_label (int): Labels to ignore when computing the loss. + Default: 255 + thresh (float, optional): The threshold for hard example selection. + Below which, are prediction with low confidence. If not + specified, the hard examples will be pixels of top ``min_kept`` + loss. Default: 0.7. + min_kept (int, optional): The minimum number of predictions to keep. + Default: 100000. + loss_weight (float): Weight of the loss. Defaults to 1.0. + class_weight (list[float] | str, optional): Weight of each class. If in + str format, read them from a file. Defaults to None. + loss_name (str): Name of the loss item. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_boundary'. + """ + + def __init__(self, + ignore_label: int = 255, + thres: float = 0.7, + min_kept: int = 100000, + loss_weight: float = 1.0, + class_weight: Optional[Union[List[float], str]] = None, + loss_name: str = 'loss_ohem'): + super().__init__() + self.thresh = thres + self.min_kept = max(1, min_kept) + self.ignore_label = ignore_label + self.loss_weight = loss_weight + self.loss_name_ = loss_name + self.class_weight = class_weight + + def forward(self, score: Tensor, target: Tensor) -> Tensor: + """Forward function. + Args: + score (Tensor): Predictions of the segmentation head. + target (Tensor): Ground truth of the image. + + Returns: + Tensor: Loss tensor. + """ + # score: (N, C, H, W) + pred = F.softmax(score, dim=1) + if self.class_weight is not None: + class_weight = score.new_tensor(self.class_weight) + else: + class_weight = None + + pixel_losses = F.cross_entropy( + score, + target, + weight=class_weight, + ignore_index=self.ignore_label, + reduction='none').contiguous().view(-1) # (N*H*W) + mask = target.contiguous().view(-1) != self.ignore_label # (N*H*W) + + tmp_target = target.clone() # (N, H, W) + tmp_target[tmp_target == self.ignore_label] = 0 + # pred: (N, C, H, W) -> (N*H*W, C) + pred = pred.gather(1, tmp_target.unsqueeze(1)) + # pred: (N*H*W, C) -> (N*H*W), ind: (N*H*W) + pred, ind = pred.contiguous().view(-1, )[mask].contiguous().sort() + if pred.numel() > 0: + min_value = pred[min(self.min_kept, pred.numel() - 1)] + else: + return score.new_tensor(0.0) + threshold = max(min_value, self.thresh) + + pixel_losses = pixel_losses[mask][ind] + pixel_losses = pixel_losses[pred < threshold] + return self.loss_weight * pixel_losses.mean() + + @property + def loss_name(self): + return self.loss_name_ diff --git a/mmsegmentation/mmseg/models/losses/silog_loss.py b/mmsegmentation/mmseg/models/losses/silog_loss.py new file mode 100644 index 0000000..ecc07aa --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/silog_loss.py @@ -0,0 +1,122 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Union + +import torch +import torch.nn as nn +from torch import Tensor + +from mmseg.registry import MODELS +from .utils import weight_reduce_loss + + +def silog_loss(pred: Tensor, + target: Tensor, + weight: Optional[Tensor] = None, + eps: float = 1e-4, + reduction: Union[str, None] = 'mean', + avg_factor: Optional[int] = None) -> Tensor: + """Computes the Scale-Invariant Logarithmic (SI-Log) loss between + prediction and target. + + Args: + pred (Tensor): Predicted output. + target (Tensor): Ground truth. + weight (Optional[Tensor]): Optional weight to apply on the loss. + eps (float): Epsilon value to avoid division and log(0). + reduction (Union[str, None]): Specifies the reduction to apply to the + output: 'mean', 'sum' or None. + avg_factor (Optional[int]): Optional average factor for the loss. + + Returns: + Tensor: The calculated SI-Log loss. + """ + pred, target = pred.flatten(1), target.flatten(1) + valid_mask = (target > eps).detach().float() + + diff_log = torch.log(target.clamp(min=eps)) - torch.log( + pred.clamp(min=eps)) + + valid_mask = (target > eps).detach() & (~torch.isnan(diff_log)) + diff_log[~valid_mask] = 0.0 + valid_mask = valid_mask.float() + + diff_log_sq_mean = (diff_log.pow(2) * valid_mask).sum( + dim=1) / valid_mask.sum(dim=1).clamp(min=eps) + diff_log_mean = (diff_log * valid_mask).sum(dim=1) / valid_mask.sum( + dim=1).clamp(min=eps) + + loss = torch.sqrt(diff_log_sq_mean - 0.5 * diff_log_mean.pow(2)) + + if weight is not None: + weight = weight.float() + + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +@MODELS.register_module() +class SiLogLoss(nn.Module): + """Compute SiLog loss. + + Args: + reduction (str, optional): The method used + to reduce the loss. Options are "none", + "mean" and "sum". Defaults to 'mean'. + loss_weight (float, optional): Weight of loss. Defaults to 1.0. + eps (float): Avoid dividing by zero. Defaults to 1e-3. + loss_name (str, optional): Name of the loss item. If you want this + loss item to be included into the backward graph, `loss_` must + be the prefix of the name. Defaults to 'loss_silog'. + """ + + def __init__(self, + reduction='mean', + loss_weight=1.0, + eps=1e-6, + loss_name='loss_silog'): + super().__init__() + self.reduction = reduction + self.loss_weight = loss_weight + self.eps = eps + self._loss_name = loss_name + + def forward( + self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + ): + + assert pred.shape == target.shape, 'the shapes of pred ' \ + f'({pred.shape}) and target ({target.shape}) are mismatch' + + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + + loss = self.loss_weight * silog_loss( + pred, + target, + weight, + eps=self.eps, + reduction=reduction, + avg_factor=avg_factor, + ) + + return loss + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/tversky_loss.py b/mmsegmentation/mmseg/models/losses/tversky_loss.py new file mode 100644 index 0000000..bfca1af --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/tversky_loss.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Modified from +https://github.com/JunMa11/SegLoss/blob/master/losses_pytorch/dice_loss.py#L333 +(Apache-2.0 License)""" +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import get_class_weight, weighted_loss + + +@weighted_loss +def tversky_loss(pred, + target, + valid_mask, + alpha=0.3, + beta=0.7, + smooth=1, + class_weight=None, + ignore_index=255): + assert pred.shape[0] == target.shape[0] + total_loss = 0 + num_classes = pred.shape[1] + for i in range(num_classes): + if i != ignore_index: + tversky_loss = binary_tversky_loss( + pred[:, i], + target[..., i], + valid_mask=valid_mask, + alpha=alpha, + beta=beta, + smooth=smooth) + if class_weight is not None: + tversky_loss *= class_weight[i] + total_loss += tversky_loss + return total_loss / num_classes + + +@weighted_loss +def binary_tversky_loss(pred, + target, + valid_mask, + alpha=0.3, + beta=0.7, + smooth=1): + assert pred.shape[0] == target.shape[0] + pred = pred.reshape(pred.shape[0], -1) + target = target.reshape(target.shape[0], -1) + valid_mask = valid_mask.reshape(valid_mask.shape[0], -1) + + TP = torch.sum(torch.mul(pred, target) * valid_mask, dim=1) + FP = torch.sum(torch.mul(pred, 1 - target) * valid_mask, dim=1) + FN = torch.sum(torch.mul(1 - pred, target) * valid_mask, dim=1) + tversky = (TP + smooth) / (TP + alpha * FP + beta * FN + smooth) + + return 1 - tversky + + +@LOSSES.register_module() +class TverskyLoss(nn.Module): + """TverskyLoss. This loss is proposed in `Tversky loss function for image + segmentation using 3D fully convolutional deep networks. + + `_. + Args: + smooth (float): A float number to smooth loss, and avoid NaN error. + Default: 1. + class_weight (list[float] | str, optional): Weight of each class. If in + str format, read them from a file. Defaults to None. + loss_weight (float, optional): Weight of the loss. Default to 1.0. + ignore_index (int | None): The label index to be ignored. Default: 255. + alpha(float, in [0, 1]): + The coefficient of false positives. Default: 0.3. + beta (float, in [0, 1]): + The coefficient of false negatives. Default: 0.7. + Note: alpha + beta = 1. + loss_name (str, optional): Name of the loss item. If you want this loss + item to be included into the backward graph, `loss_` must be the + prefix of the name. Defaults to 'loss_tversky'. + """ + + def __init__(self, + smooth=1, + class_weight=None, + loss_weight=1.0, + ignore_index=255, + alpha=0.3, + beta=0.7, + loss_name='loss_tversky'): + super().__init__() + self.smooth = smooth + self.class_weight = get_class_weight(class_weight) + self.loss_weight = loss_weight + self.ignore_index = ignore_index + assert (alpha + beta == 1.0), 'Sum of alpha and beta but be 1.0!' + self.alpha = alpha + self.beta = beta + self._loss_name = loss_name + + def forward(self, pred, target, **kwargs): + if self.class_weight is not None: + class_weight = pred.new_tensor(self.class_weight) + else: + class_weight = None + + pred = F.softmax(pred, dim=1) + num_classes = pred.shape[1] + one_hot_target = F.one_hot( + torch.clamp(target.long(), 0, num_classes - 1), + num_classes=num_classes) + valid_mask = (target != self.ignore_index).long() + + loss = self.loss_weight * tversky_loss( + pred, + one_hot_target, + valid_mask=valid_mask, + alpha=self.alpha, + beta=self.beta, + smooth=self.smooth, + class_weight=class_weight, + ignore_index=self.ignore_index) + return loss + + @property + def loss_name(self): + """Loss Name. + + This function must be implemented and will return the name of this + loss function. This name will be used to combine different loss items + by simple sum operation. In addition, if you want this loss item to be + included into the backward graph, `loss_` must be the prefix of the + name. + Returns: + str: The name of this loss item. + """ + return self._loss_name diff --git a/mmsegmentation/mmseg/models/losses/utils.py b/mmsegmentation/mmseg/models/losses/utils.py new file mode 100644 index 0000000..0478034 --- /dev/null +++ b/mmsegmentation/mmseg/models/losses/utils.py @@ -0,0 +1,129 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import functools + +import numpy as np +import torch +import torch.nn.functional as F +from mmengine.fileio import load + + +def get_class_weight(class_weight): + """Get class weight for loss function. + + Args: + class_weight (list[float] | str | None): If class_weight is a str, + take it as a file name and read from it. + """ + if isinstance(class_weight, str): + # take it as a file path + if class_weight.endswith('.npy'): + class_weight = np.load(class_weight) + else: + # pkl, json or yaml + class_weight = load(class_weight) + + return class_weight + + +def reduce_loss(loss, reduction) -> torch.Tensor: + """Reduce loss as specified. + + Args: + loss (Tensor): Elementwise loss tensor. + reduction (str): Options are "none", "mean" and "sum". + + Return: + Tensor: Reduced loss tensor. + """ + reduction_enum = F._Reduction.get_enum(reduction) + # none: 0, elementwise_mean:1, sum: 2 + if reduction_enum == 0: + return loss + elif reduction_enum == 1: + return loss.mean() + elif reduction_enum == 2: + return loss.sum() + + +def weight_reduce_loss(loss, + weight=None, + reduction='mean', + avg_factor=None) -> torch.Tensor: + """Apply element-wise weight and reduce loss. + + Args: + loss (Tensor): Element-wise loss. + weight (Tensor): Element-wise weights. + reduction (str): Same as built-in losses of PyTorch. + avg_factor (float): Average factor when computing the mean of losses. + + Returns: + Tensor: Processed loss values. + """ + # if weight is specified, apply element-wise weight + if weight is not None: + assert weight.dim() == loss.dim() + if weight.dim() > 1: + assert weight.size(1) == 1 or weight.size(1) == loss.size(1) + loss = loss * weight + + # if avg_factor is not specified, just reduce the loss + if avg_factor is None: + loss = reduce_loss(loss, reduction) + else: + # if reduction is mean, then average the loss by avg_factor + if reduction == 'mean': + # Avoid causing ZeroDivisionError when avg_factor is 0.0, + # i.e., all labels of an image belong to ignore index. + eps = torch.finfo(torch.float32).eps + loss = loss.sum() / (avg_factor + eps) + # if reduction is 'none', then do nothing, otherwise raise an error + elif reduction != 'none': + raise ValueError('avg_factor can not be used with reduction="sum"') + return loss + + +def weighted_loss(loss_func): + """Create a weighted version of a given loss function. + + To use this decorator, the loss function must have the signature like + `loss_func(pred, target, **kwargs)`. The function only needs to compute + element-wise loss without any reduction. This decorator will add weight + and reduction arguments to the function. The decorated function will have + the signature like `loss_func(pred, target, weight=None, reduction='mean', + avg_factor=None, **kwargs)`. + + :Example: + + >>> import torch + >>> @weighted_loss + >>> def l1_loss(pred, target): + >>> return (pred - target).abs() + + >>> pred = torch.Tensor([0, 2, 3]) + >>> target = torch.Tensor([1, 1, 1]) + >>> weight = torch.Tensor([1, 0, 1]) + + >>> l1_loss(pred, target) + tensor(1.3333) + >>> l1_loss(pred, target, weight) + tensor(1.) + >>> l1_loss(pred, target, reduction='none') + tensor([1., 1., 2.]) + >>> l1_loss(pred, target, weight, avg_factor=2) + tensor(1.5000) + """ + + @functools.wraps(loss_func) + def wrapper(pred, + target, + weight=None, + reduction='mean', + avg_factor=None, + **kwargs): + # get element-wise loss + loss = loss_func(pred, target, **kwargs) + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + return wrapper diff --git a/mmsegmentation/mmseg/models/necks/__init__.py b/mmsegmentation/mmseg/models/necks/__init__.py new file mode 100644 index 0000000..ff03186 --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .featurepyramid import Feature2Pyramid +from .fpn import FPN +from .ic_neck import ICNeck +from .jpu import JPU +from .mla_neck import MLANeck +from .multilevel_neck import MultiLevelNeck + +__all__ = [ + 'FPN', 'MultiLevelNeck', 'MLANeck', 'ICNeck', 'JPU', 'Feature2Pyramid' +] diff --git a/mmsegmentation/mmseg/models/necks/featurepyramid.py b/mmsegmentation/mmseg/models/necks/featurepyramid.py new file mode 100644 index 0000000..dc1250d --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/featurepyramid.py @@ -0,0 +1,67 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import build_norm_layer + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class Feature2Pyramid(nn.Module): + """Feature2Pyramid. + + A neck structure connect ViT backbone and decoder_heads. + + Args: + embed_dims (int): Embedding dimension. + rescales (list[float]): Different sampling multiples were + used to obtain pyramid features. Default: [4, 2, 1, 0.5]. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='SyncBN', requires_grad=True). + """ + + def __init__(self, + embed_dim, + rescales=[4, 2, 1, 0.5], + norm_cfg=dict(type='SyncBN', requires_grad=True)): + super().__init__() + self.rescales = rescales + self.upsample_4x = None + for k in self.rescales: + if k == 4: + self.upsample_4x = nn.Sequential( + nn.ConvTranspose2d( + embed_dim, embed_dim, kernel_size=2, stride=2), + build_norm_layer(norm_cfg, embed_dim)[1], + nn.GELU(), + nn.ConvTranspose2d( + embed_dim, embed_dim, kernel_size=2, stride=2), + ) + elif k == 2: + self.upsample_2x = nn.Sequential( + nn.ConvTranspose2d( + embed_dim, embed_dim, kernel_size=2, stride=2)) + elif k == 1: + self.identity = nn.Identity() + elif k == 0.5: + self.downsample_2x = nn.MaxPool2d(kernel_size=2, stride=2) + elif k == 0.25: + self.downsample_4x = nn.MaxPool2d(kernel_size=4, stride=4) + else: + raise KeyError(f'invalid {k} for feature2pyramid') + + def forward(self, inputs): + assert len(inputs) == len(self.rescales) + outputs = [] + if self.upsample_4x is not None: + ops = [ + self.upsample_4x, self.upsample_2x, self.identity, + self.downsample_2x + ] + else: + ops = [ + self.upsample_2x, self.identity, self.downsample_2x, + self.downsample_4x + ] + for i in range(len(inputs)): + outputs.append(ops[i](inputs[i])) + return tuple(outputs) diff --git a/mmsegmentation/mmseg/models/necks/fpn.py b/mmsegmentation/mmseg/models/necks/fpn.py new file mode 100644 index 0000000..ddab74c --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/fpn.py @@ -0,0 +1,212 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize + + +@MODELS.register_module() +class FPN(BaseModule): + """Feature Pyramid Network. + + This neck is the implementation of `Feature Pyramid Networks for Object + Detection `_. + + Args: + in_channels (list[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale). + num_outs (int): Number of output scales. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool | str): If bool, it decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, its actual mode is specified by `extra_convs_on_inputs`. + If str, it specifies the source feature map of the extra convs. + Only the following options are allowed + + - 'on_input': Last feat map of neck inputs (i.e. backbone feature). + - 'on_lateral': Last feature map after lateral convs. + - 'on_output': The last output feature map after fpn convs. + extra_convs_on_inputs (bool, deprecated): Whether to apply extra convs + on the original feature from the backbone. If True, + it is equivalent to `add_extra_convs='on_input'`. If False, it is + equivalent to set `add_extra_convs='on_output'`. Default to True. + relu_before_extra_convs (bool): Whether to apply relu before the extra + conv. Default: False. + no_norm_on_lateral (bool): Whether to apply norm on lateral. + Default: False. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): Config dict for activation layer in ConvModule. + Default: None. + upsample_cfg (dict): Config dict for interpolate layer. + Default: dict(mode='nearest'). + init_cfg (dict or list[dict], optional): Initialization config dict. + + Example: + >>> import torch + >>> in_channels = [2, 3, 5, 7] + >>> scales = [340, 170, 84, 43] + >>> inputs = [torch.rand(1, c, s, s) + ... for c, s in zip(in_channels, scales)] + >>> self = FPN(in_channels, 11, len(in_channels)).eval() + >>> outputs = self.forward(inputs) + >>> for i in range(len(outputs)): + ... print(f'outputs[{i}].shape = {outputs[i].shape}') + outputs[0].shape = torch.Size([1, 11, 340, 340]) + outputs[1].shape = torch.Size([1, 11, 170, 170]) + outputs[2].shape = torch.Size([1, 11, 84, 84]) + outputs[3].shape = torch.Size([1, 11, 43, 43]) + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False, + extra_convs_on_inputs=False, + relu_before_extra_convs=False, + no_norm_on_lateral=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + upsample_cfg=dict(mode='nearest'), + init_cfg=dict( + type='Xavier', layer='Conv2d', distribution='uniform')): + super().__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.relu_before_extra_convs = relu_before_extra_convs + self.no_norm_on_lateral = no_norm_on_lateral + self.fp16_enabled = False + self.upsample_cfg = upsample_cfg.copy() + + if end_level == -1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level < inputs, no extra level is allowed + self.backbone_end_level = end_level + assert end_level <= len(in_channels) + assert num_outs == end_level - start_level + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + assert isinstance(add_extra_convs, (str, bool)) + if isinstance(add_extra_convs, str): + # Extra_convs_source choices: 'on_input', 'on_lateral', 'on_output' + assert add_extra_convs in ('on_input', 'on_lateral', 'on_output') + elif add_extra_convs: # True + if extra_convs_on_inputs: + # For compatibility with previous release + # TODO: deprecate `extra_convs_on_inputs` + self.add_extra_convs = 'on_input' + else: + self.add_extra_convs = 'on_output' + + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + + for i in range(self.start_level, self.backbone_end_level): + l_conv = ConvModule( + in_channels[i], + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg if not self.no_norm_on_lateral else None, + act_cfg=act_cfg, + inplace=False) + fpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + # add extra conv layers (e.g., RetinaNet) + extra_levels = num_outs - self.backbone_end_level + self.start_level + if self.add_extra_convs and extra_levels >= 1: + for i in range(extra_levels): + if i == 0 and self.add_extra_convs == 'on_input': + in_channels = self.in_channels[self.backbone_end_level - 1] + else: + in_channels = out_channels + extra_fpn_conv = ConvModule( + in_channels, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + self.fpn_convs.append(extra_fpn_conv) + + def forward(self, inputs): + assert len(inputs) == len(self.in_channels) + + # build laterals + laterals = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + # In some cases, fixing `scale factor` (e.g. 2) is preferred, but + # it cannot co-exist with `size` in `F.interpolate`. + if 'scale_factor' in self.upsample_cfg: + laterals[i - 1] = laterals[i - 1] + resize( + laterals[i], **self.upsample_cfg) + else: + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] = laterals[i - 1] + resize( + laterals[i], size=prev_shape, **self.upsample_cfg) + + # build outputs + # part 1: from original levels + outs = [ + self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels) + ] + # part 2: add extra levels + if self.num_outs > len(outs): + # use max pool to get more levels on top of outputs + # (e.g., Faster R-CNN, Mask R-CNN) + if not self.add_extra_convs: + for i in range(self.num_outs - used_backbone_levels): + outs.append(F.max_pool2d(outs[-1], 1, stride=2)) + # add conv layers on top of original feature maps (RetinaNet) + else: + if self.add_extra_convs == 'on_input': + extra_source = inputs[self.backbone_end_level - 1] + elif self.add_extra_convs == 'on_lateral': + extra_source = laterals[-1] + elif self.add_extra_convs == 'on_output': + extra_source = outs[-1] + else: + raise NotImplementedError + outs.append(self.fpn_convs[used_backbone_levels](extra_source)) + for i in range(used_backbone_levels + 1, self.num_outs): + if self.relu_before_extra_convs: + outs.append(self.fpn_convs[i](F.relu(outs[-1]))) + else: + outs.append(self.fpn_convs[i](outs[-1])) + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/necks/ic_neck.py b/mmsegmentation/mmseg/models/necks/ic_neck.py new file mode 100644 index 0000000..9763541 --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/ic_neck.py @@ -0,0 +1,148 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize + + +class CascadeFeatureFusion(BaseModule): + """Cascade Feature Fusion Unit in ICNet. + + Args: + low_channels (int): The number of input channels for + low resolution feature map. + high_channels (int): The number of input channels for + high resolution feature map. + out_channels (int): The number of output channels. + conv_cfg (dict): Dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN'). + act_cfg (dict): Dictionary to construct and config act layer. + Default: dict(type='ReLU'). + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + + Returns: + x (Tensor): The output tensor of shape (N, out_channels, H, W). + x_low (Tensor): The output tensor of shape (N, out_channels, H, W) + for Cascade Label Guidance in auxiliary heads. + """ + + def __init__(self, + low_channels, + high_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.align_corners = align_corners + self.conv_low = ConvModule( + low_channels, + out_channels, + 3, + padding=2, + dilation=2, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.conv_high = ConvModule( + high_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x_low, x_high): + x_low = resize( + x_low, + size=x_high.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + # Note: Different from original paper, `x_low` is underwent + # `self.conv_low` rather than another 1x1 conv classifier + # before being used for auxiliary head. + x_low = self.conv_low(x_low) + x_high = self.conv_high(x_high) + x = x_low + x_high + x = F.relu(x, inplace=True) + return x, x_low + + +@MODELS.register_module() +class ICNeck(BaseModule): + """ICNet for Real-Time Semantic Segmentation on High-Resolution Images. + + This head is the implementation of `ICHead + `_. + + Args: + in_channels (int): The number of input image channels. Default: 3. + out_channels (int): The numbers of output feature channels. + Default: 128. + conv_cfg (dict): Dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN'). + act_cfg (dict): Dictionary to construct and config act layer. + Default: dict(type='ReLU'). + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels=(64, 256, 256), + out_channels=128, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert len(in_channels) == 3, 'Length of input channels \ + must be 3!' + + self.in_channels = in_channels + self.out_channels = out_channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + self.cff_24 = CascadeFeatureFusion( + self.in_channels[2], + self.in_channels[1], + self.out_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + + self.cff_12 = CascadeFeatureFusion( + self.out_channels, + self.in_channels[0], + self.out_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + + def forward(self, inputs): + assert len(inputs) == 3, 'Length of input feature \ + maps must be 3!' + + x_sub1, x_sub2, x_sub4 = inputs + x_cff_24, x_24 = self.cff_24(x_sub4, x_sub2) + x_cff_12, x_12 = self.cff_12(x_cff_24, x_sub1) + # Note: `x_cff_12` is used for decode_head, + # `x_24` and `x_12` are used for auxiliary head. + return x_24, x_12, x_cff_12 diff --git a/mmsegmentation/mmseg/models/necks/jpu.py b/mmsegmentation/mmseg/models/necks/jpu.py new file mode 100644 index 0000000..3ea0fe2 --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/jpu.py @@ -0,0 +1,131 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from ..utils import resize + + +@MODELS.register_module() +class JPU(BaseModule): + """FastFCN: Rethinking Dilated Convolution in the Backbone + for Semantic Segmentation. + + This Joint Pyramid Upsampling (JPU) neck is the implementation of + `FastFCN `_. + + Args: + in_channels (Tuple[int], optional): The number of input channels + for each convolution operations before upsampling. + Default: (512, 1024, 2048). + mid_channels (int): The number of output channels of JPU. + Default: 512. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + dilations (tuple[int]): Dilation rate of each Depthwise + Separable ConvModule. Default: (1, 2, 4, 8). + align_corners (bool, optional): The align_corners argument of + resize operation. Default: False. + conv_cfg (dict | None): Config of conv layers. + Default: None. + norm_cfg (dict | None): Config of norm layers. + Default: dict(type='BN'). + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels=(512, 1024, 2048), + mid_channels=512, + start_level=0, + end_level=-1, + dilations=(1, 2, 4, 8), + align_corners=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + assert isinstance(in_channels, tuple) + assert isinstance(dilations, tuple) + self.in_channels = in_channels + self.mid_channels = mid_channels + self.start_level = start_level + self.num_ins = len(in_channels) + if end_level == -1: + self.backbone_end_level = self.num_ins + else: + self.backbone_end_level = end_level + assert end_level <= len(in_channels) + + self.dilations = dilations + self.align_corners = align_corners + + self.conv_layers = nn.ModuleList() + self.dilation_layers = nn.ModuleList() + for i in range(self.start_level, self.backbone_end_level): + conv_layer = nn.Sequential( + ConvModule( + self.in_channels[i], + self.mid_channels, + kernel_size=3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.conv_layers.append(conv_layer) + for i in range(len(dilations)): + dilation_layer = nn.Sequential( + DepthwiseSeparableConvModule( + in_channels=(self.backbone_end_level - self.start_level) * + self.mid_channels, + out_channels=self.mid_channels, + kernel_size=3, + stride=1, + padding=dilations[i], + dilation=dilations[i], + dw_norm_cfg=norm_cfg, + dw_act_cfg=None, + pw_norm_cfg=norm_cfg, + pw_act_cfg=act_cfg)) + self.dilation_layers.append(dilation_layer) + + def forward(self, inputs): + """Forward function.""" + assert len(inputs) == len(self.in_channels), 'Length of inputs must \ + be the same with self.in_channels!' + + feats = [ + self.conv_layers[i - self.start_level](inputs[i]) + for i in range(self.start_level, self.backbone_end_level) + ] + + h, w = feats[0].shape[2:] + for i in range(1, len(feats)): + feats[i] = resize( + feats[i], + size=(h, w), + mode='bilinear', + align_corners=self.align_corners) + + feat = torch.cat(feats, dim=1) + concat_feat = torch.cat([ + self.dilation_layers[i](feat) for i in range(len(self.dilations)) + ], + dim=1) + + outs = [] + + # Default: outs[2] is the output of JPU for decoder head, outs[1] is + # the feature map from backbone for auxiliary head. Additionally, + # outs[0] can also be used for auxiliary head. + for i in range(self.start_level, self.backbone_end_level - 1): + outs.append(inputs[i]) + outs.append(concat_feat) + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/necks/mla_neck.py b/mmsegmentation/mmseg/models/necks/mla_neck.py new file mode 100644 index 0000000..db250ae --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/mla_neck.py @@ -0,0 +1,118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule, build_norm_layer + +from mmseg.registry import MODELS + + +class MLAModule(nn.Module): + + def __init__(self, + in_channels=[1024, 1024, 1024, 1024], + out_channels=256, + norm_cfg=None, + act_cfg=None): + super().__init__() + self.channel_proj = nn.ModuleList() + for i in range(len(in_channels)): + self.channel_proj.append( + ConvModule( + in_channels=in_channels[i], + out_channels=out_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.feat_extract = nn.ModuleList() + for i in range(len(in_channels)): + self.feat_extract.append( + ConvModule( + in_channels=out_channels, + out_channels=out_channels, + kernel_size=3, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + def forward(self, inputs): + + # feat_list -> [p2, p3, p4, p5] + feat_list = [] + for x, conv in zip(inputs, self.channel_proj): + feat_list.append(conv(x)) + + # feat_list -> [p5, p4, p3, p2] + # mid_list -> [m5, m4, m3, m2] + feat_list = feat_list[::-1] + mid_list = [] + for feat in feat_list: + if len(mid_list) == 0: + mid_list.append(feat) + else: + mid_list.append(mid_list[-1] + feat) + + # mid_list -> [m5, m4, m3, m2] + # out_list -> [o2, o3, o4, o5] + out_list = [] + for mid, conv in zip(mid_list, self.feat_extract): + out_list.append(conv(mid)) + + return tuple(out_list) + + +@MODELS.register_module() +class MLANeck(nn.Module): + """Multi-level Feature Aggregation. + + This neck is `The Multi-level Feature Aggregation construction of + SETR `_. + + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale). + norm_layer (dict): Config dict for input normalization. + Default: norm_layer=dict(type='LN', eps=1e-6, requires_grad=True). + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): Config dict for activation layer in ConvModule. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + norm_layer=dict(type='LN', eps=1e-6, requires_grad=True), + norm_cfg=None, + act_cfg=None): + super().__init__() + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + + # In order to build general vision transformer backbone, we have to + # move MLA to neck. + self.norm = nn.ModuleList([ + build_norm_layer(norm_layer, in_channels[i])[1] + for i in range(len(in_channels)) + ]) + + self.mla = MLAModule( + in_channels=in_channels, + out_channels=out_channels, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, inputs): + assert len(inputs) == len(self.in_channels) + + # Convert from nchw to nlc + outs = [] + for i in range(len(inputs)): + x = inputs[i] + n, c, h, w = x.shape + x = x.reshape(n, c, h * w).transpose(2, 1).contiguous() + x = self.norm[i](x) + x = x.transpose(1, 2).reshape(n, c, h, w).contiguous() + outs.append(x) + + outs = self.mla(outs) + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/necks/multilevel_neck.py b/mmsegmentation/mmseg/models/necks/multilevel_neck.py new file mode 100644 index 0000000..c997125 --- /dev/null +++ b/mmsegmentation/mmseg/models/necks/multilevel_neck.py @@ -0,0 +1,79 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.model.weight_init import xavier_init + +from mmseg.registry import MODELS +from ..utils import resize + + +@MODELS.register_module() +class MultiLevelNeck(nn.Module): + """MultiLevelNeck. + + A neck structure connect vit backbone and decoder_heads. + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale). + scales (List[float]): Scale factors for each input feature map. + Default: [0.5, 1, 2, 4] + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): Config dict for activation layer in ConvModule. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + scales=[0.5, 1, 2, 4], + norm_cfg=None, + act_cfg=None): + super().__init__() + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.scales = scales + self.num_outs = len(scales) + self.lateral_convs = nn.ModuleList() + self.convs = nn.ModuleList() + for in_channel in in_channels: + self.lateral_convs.append( + ConvModule( + in_channel, + out_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + for _ in range(self.num_outs): + self.convs.append( + ConvModule( + out_channels, + out_channels, + kernel_size=3, + padding=1, + stride=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + # default init_weights for conv(msra) and norm in ConvModule + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + xavier_init(m, distribution='uniform') + + def forward(self, inputs): + assert len(inputs) == len(self.in_channels) + inputs = [ + lateral_conv(inputs[i]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + # for len(inputs) not equal to self.num_outs + if len(inputs) == 1: + inputs = [inputs[0] for _ in range(self.num_outs)] + outs = [] + for i in range(self.num_outs): + x_resize = resize( + inputs[i], scale_factor=self.scales[i], mode='bilinear') + outs.append(self.convs[i](x_resize)) + return tuple(outs) diff --git a/mmsegmentation/mmseg/models/segmentors/__init__.py b/mmsegmentation/mmseg/models/segmentors/__init__.py new file mode 100644 index 0000000..80bced1 --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base import BaseSegmentor +from .cascade_encoder_decoder import CascadeEncoderDecoder +from .depth_estimator import DepthEstimator +from .encoder_decoder import EncoderDecoder +from .multimodal_encoder_decoder import MultimodalEncoderDecoder +from .seg_tta import SegTTAModel +from .custom import EncoderDecoderWithoutArgmax + +__all__ = [ + 'BaseSegmentor', 'EncoderDecoder', 'CascadeEncoderDecoder', 'SegTTAModel', + 'MultimodalEncoderDecoder', 'DepthEstimator', 'EncoderDecoderWithoutArgmax' +] diff --git a/mmsegmentation/mmseg/models/segmentors/base.py b/mmsegmentation/mmseg/models/segmentors/base.py new file mode 100644 index 0000000..17a0bb2 --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/base.py @@ -0,0 +1,200 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod +from typing import List, Tuple + +from mmengine.model import BaseModel +from mmengine.structures import PixelData +from torch import Tensor + +from mmseg.structures import SegDataSample +from mmseg.utils import (ForwardResults, OptConfigType, OptMultiConfig, + OptSampleList, SampleList) +from ..utils import resize + + +class BaseSegmentor(BaseModel, metaclass=ABCMeta): + """Base class for segmentors. + + Args: + data_preprocessor (dict, optional): Model preprocessing config + for processing the input data. it usually includes + ``to_rgb``, ``pad_size_divisor``, ``pad_val``, + ``mean`` and ``std``. Default to None. + init_cfg (dict, optional): the config to control the + initialization. Default to None. + """ + + def __init__(self, + data_preprocessor: OptConfigType = None, + init_cfg: OptMultiConfig = None): + super().__init__( + data_preprocessor=data_preprocessor, init_cfg=init_cfg) + + @property + def with_neck(self) -> bool: + """bool: whether the segmentor has neck""" + return hasattr(self, 'neck') and self.neck is not None + + @property + def with_auxiliary_head(self) -> bool: + """bool: whether the segmentor has auxiliary head""" + return hasattr(self, + 'auxiliary_head') and self.auxiliary_head is not None + + @property + def with_decode_head(self) -> bool: + """bool: whether the segmentor has decode head""" + return hasattr(self, 'decode_head') and self.decode_head is not None + + @abstractmethod + def extract_feat(self, inputs: Tensor) -> bool: + """Placeholder for extract features from images.""" + pass + + @abstractmethod + def encode_decode(self, inputs: Tensor, batch_data_samples: SampleList): + """Placeholder for encode images with backbone and decode into a + semantic segmentation map of the same size as input.""" + pass + + def forward(self, + inputs: Tensor, + data_samples: OptSampleList = None, + mode: str = 'tensor') -> ForwardResults: + """The unified entry for a forward process in both training and test. + + The method should accept three modes: "tensor", "predict" and "loss": + + - "tensor": Forward the whole network and return tensor or tuple of + tensor without any post-processing, same as a common nn.Module. + - "predict": Forward and return the predictions, which are fully + processed to a list of :obj:`SegDataSample`. + - "loss": Forward and return a dict of losses according to the given + inputs and data samples. + + Note that this method doesn't handle neither back propagation nor + optimizer updating, which are done in the :meth:`train_step`. + + Args: + inputs (torch.Tensor): The input tensor with shape (N, C, ...) in + general. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_sem_seg`. Default to None. + mode (str): Return what kind of value. Defaults to 'tensor'. + + Returns: + The return type depends on ``mode``. + + - If ``mode="tensor"``, return a tensor or a tuple of tensor. + - If ``mode="predict"``, return a list of :obj:`DetDataSample`. + - If ``mode="loss"``, return a dict of tensor. + """ + if mode == 'loss': + return self.loss(inputs, data_samples) + elif mode == 'predict': + return self.predict(inputs, data_samples) + elif mode == 'tensor': + return self._forward(inputs, data_samples) + else: + raise RuntimeError(f'Invalid mode "{mode}". ' + 'Only supports loss, predict and tensor mode') + + @abstractmethod + def loss(self, inputs: Tensor, data_samples: SampleList) -> dict: + """Calculate losses from a batch of inputs and data samples.""" + pass + + @abstractmethod + def predict(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> SampleList: + """Predict results from a batch of inputs and data samples with post- + processing.""" + pass + + @abstractmethod + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tuple[List[Tensor]]: + """Network forward process. + + Usually includes backbone, neck and head forward without any post- + processing. + """ + pass + + def postprocess_result(self, + seg_logits: Tensor, + data_samples: OptSampleList = None) -> SampleList: + """ Convert results list to `SegDataSample`. + Args: + seg_logits (Tensor): The segmentation results, seg_logits from + model of each input image. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_sem_seg`. Default to None. + Returns: + list[:obj:`SegDataSample`]: Segmentation results of the + input images. Each SegDataSample usually contain: + + - ``pred_sem_seg``(PixelData): Prediction of semantic segmentation. + - ``seg_logits``(PixelData): Predicted logits of semantic + segmentation before normalization. + """ + batch_size, C, H, W = seg_logits.shape + + if data_samples is None: + data_samples = [SegDataSample() for _ in range(batch_size)] + only_prediction = True + else: + only_prediction = False + + for i in range(batch_size): + if not only_prediction: + img_meta = data_samples[i].metainfo + # remove padding area + if 'img_padding_size' not in img_meta: + padding_size = img_meta.get('padding_size', [0] * 4) + else: + padding_size = img_meta['img_padding_size'] + padding_left, padding_right, padding_top, padding_bottom =\ + padding_size + # i_seg_logits shape is 1, C, H, W after remove padding + i_seg_logits = seg_logits[i:i + 1, :, + padding_top:H - padding_bottom, + padding_left:W - padding_right] + + flip = img_meta.get('flip', None) + if flip: + flip_direction = img_meta.get('flip_direction', None) + assert flip_direction in ['horizontal', 'vertical'] + if flip_direction == 'horizontal': + i_seg_logits = i_seg_logits.flip(dims=(3, )) + else: + i_seg_logits = i_seg_logits.flip(dims=(2, )) + + # resize as original shape + i_seg_logits = resize( + i_seg_logits, + size=img_meta['ori_shape'], + mode='bilinear', + align_corners=self.align_corners, + warning=False).squeeze(0) + else: + i_seg_logits = seg_logits[i] + + if C > 1: + i_seg_pred = i_seg_logits.argmax(dim=0, keepdim=True) + else: + i_seg_logits = i_seg_logits.sigmoid() + i_seg_pred = (i_seg_logits > + self.decode_head.threshold).to(i_seg_logits) + data_samples[i].set_data({ + 'seg_logits': + PixelData(**{'data': i_seg_logits}), + 'pred_sem_seg': + PixelData(**{'data': i_seg_pred}) + }) + + return data_samples diff --git a/mmsegmentation/mmseg/models/segmentors/cascade_encoder_decoder.py b/mmsegmentation/mmseg/models/segmentors/cascade_encoder_decoder.py new file mode 100644 index 0000000..0184a35 --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/cascade_encoder_decoder.py @@ -0,0 +1,138 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Optional + +from torch import Tensor, nn + +from mmseg.registry import MODELS +from mmseg.utils import (ConfigType, OptConfigType, OptMultiConfig, + OptSampleList, SampleList, add_prefix) +from .encoder_decoder import EncoderDecoder + + +@MODELS.register_module() +class CascadeEncoderDecoder(EncoderDecoder): + """Cascade Encoder Decoder segmentors. + + CascadeEncoderDecoder almost the same as EncoderDecoder, while decoders of + CascadeEncoderDecoder are cascaded. The output of previous decoder_head + will be the input of next decoder_head. + + Args: + + num_stages (int): How many stages will be cascaded. + backbone (ConfigType): The config for the backnone of segmentor. + decode_head (ConfigType): The config for the decode head of segmentor. + neck (OptConfigType): The config for the neck of segmentor. + Defaults to None. + auxiliary_head (OptConfigType): The config for the auxiliary head of + segmentor. Defaults to None. + train_cfg (OptConfigType): The config for training. Defaults to None. + test_cfg (OptConfigType): The config for testing. Defaults to None. + data_preprocessor (dict, optional): The pre-process config of + :class:`BaseDataPreprocessor`. + pretrained (str, optional): The path for pretrained model. + Defaults to None. + init_cfg (dict, optional): The weight initialized config for + :class:`BaseModule`. + """ + + def __init__(self, + num_stages: int, + backbone: ConfigType, + decode_head: ConfigType, + neck: OptConfigType = None, + auxiliary_head: OptConfigType = None, + train_cfg: OptConfigType = None, + test_cfg: OptConfigType = None, + data_preprocessor: OptConfigType = None, + pretrained: Optional[str] = None, + init_cfg: OptMultiConfig = None): + self.num_stages = num_stages + super().__init__( + backbone=backbone, + decode_head=decode_head, + neck=neck, + auxiliary_head=auxiliary_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + data_preprocessor=data_preprocessor, + pretrained=pretrained, + init_cfg=init_cfg) + + def _init_decode_head(self, decode_head: ConfigType) -> None: + """Initialize ``decode_head``""" + assert isinstance(decode_head, list) + assert len(decode_head) == self.num_stages + self.decode_head = nn.ModuleList() + for i in range(self.num_stages): + self.decode_head.append(MODELS.build(decode_head[i])) + self.align_corners = self.decode_head[-1].align_corners + self.num_classes = self.decode_head[-1].num_classes + self.out_channels = self.decode_head[-1].out_channels + + def encode_decode(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Encode images with backbone and decode into a semantic segmentation + map of the same size as input.""" + x = self.extract_feat(inputs) + out = self.decode_head[0].forward(x) + for i in range(1, self.num_stages - 1): + out = self.decode_head[i].forward(x, out) + seg_logits_list = self.decode_head[-1].predict(x, out, batch_img_metas, + self.test_cfg) + + return seg_logits_list + + def _decode_head_forward_train(self, inputs: Tensor, + data_samples: SampleList) -> dict: + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + + loss_decode = self.decode_head[0].loss(inputs, data_samples, + self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode_0')) + # get batch_img_metas + batch_size = len(data_samples) + batch_img_metas = [] + for batch_index in range(batch_size): + metainfo = data_samples[batch_index].metainfo + batch_img_metas.append(metainfo) + + for i in range(1, self.num_stages): + # forward test again, maybe unnecessary for most methods. + if i == 1: + prev_outputs = self.decode_head[0].forward(inputs) + else: + prev_outputs = self.decode_head[i - 1].forward( + inputs, prev_outputs) + loss_decode = self.decode_head[i].loss(inputs, prev_outputs, + data_samples, + self.train_cfg) + losses.update(add_prefix(loss_decode, f'decode_{i}')) + + return losses + + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tensor: + """Network forward process. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_semantic_seg`. + + Returns: + Tensor: Forward output of model without any post-processes. + """ + x = self.extract_feat(inputs) + + out = self.decode_head[0].forward(x) + for i in range(1, self.num_stages): + # TODO support PointRend tensor mode + out = self.decode_head[i].forward(x, out) + + return out diff --git a/mmsegmentation/mmseg/models/segmentors/custom.py b/mmsegmentation/mmseg/models/segmentors/custom.py new file mode 100644 index 0000000..3a03d50 --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/custom.py @@ -0,0 +1,86 @@ +from mmseg.registry import MODELS +from mmseg.models.segmentors import EncoderDecoder +from mmseg.structures.seg_data_sample import SegDataSample +from mmseg.models.utils.wrappers import resize + +from mmengine.structures import PixelData + + +class PostProcessResultMixin: + def postprocess_result(self, seg_logits, data_samples): + """Convert results list to `SegDataSample`. + Args: + seg_logits (Tensor): The segmentation results, seg_logits from + model of each input image. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_sem_seg`. Default to None. + Returns: + list[:obj:`SegDataSample`]: Segmentation results of the + input images. Each SegDataSample usually contain: + + - ``pred_sem_seg``(PixelData): Prediction of semantic segmentation. + - ``seg_logits``(PixelData): Predicted logits of semantic + segmentation before normalization. + """ + batch_size, C, H, W = seg_logits.shape + + if data_samples is None: + data_samples = [SegDataSample() for _ in range(batch_size)] + only_prediction = True + else: + only_prediction = False + + for i in range(batch_size): + if not only_prediction: + img_meta = data_samples[i].metainfo + # remove padding area + if "img_padding_size" not in img_meta: + padding_size = img_meta.get("padding_size", [0] * 4) + else: + padding_size = img_meta["img_padding_size"] + padding_left, padding_right, padding_top, padding_bottom = padding_size + # i_seg_logits shape is 1, C, H, W after remove padding + i_seg_logits = seg_logits[ + i : i + 1, + :, + padding_top : H - padding_bottom, + padding_left : W - padding_right, + ] + + flip = img_meta.get("flip", None) + if flip: + flip_direction = img_meta.get("flip_direction", None) + assert flip_direction in ["horizontal", "vertical"] + if flip_direction == "horizontal": + i_seg_logits = i_seg_logits.flip(dims=(3,)) + else: + i_seg_logits = i_seg_logits.flip(dims=(2,)) + + # resize as original shape + i_seg_logits = resize( + i_seg_logits, + size=img_meta["ori_shape"], + mode="bilinear", + align_corners=self.align_corners, + warning=False, + ).squeeze(0) + else: + i_seg_logits = seg_logits[i] + + i_seg_logits = i_seg_logits.sigmoid() + i_seg_pred = (i_seg_logits > 0.5).to(i_seg_logits) + + data_samples[i].set_data( + { + "seg_logits": PixelData(**{"data": i_seg_logits}), + "pred_sem_seg": PixelData(**{"data": i_seg_pred}), + } + ) + + return data_samples + + +@MODELS.register_module() +class EncoderDecoderWithoutArgmax(PostProcessResultMixin, EncoderDecoder): + pass \ No newline at end of file diff --git a/mmsegmentation/mmseg/models/segmentors/depth_estimator.py b/mmsegmentation/mmseg/models/segmentors/depth_estimator.py new file mode 100644 index 0000000..1020637 --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/depth_estimator.py @@ -0,0 +1,392 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +from typing import List, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.logging import print_log +from mmengine.structures import PixelData +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.structures import SegDataSample +from mmseg.utils import (ConfigType, OptConfigType, OptMultiConfig, + OptSampleList, SampleList, add_prefix) +from ..utils import resize +from .encoder_decoder import EncoderDecoder + + +@MODELS.register_module() +class DepthEstimator(EncoderDecoder): + """Encoder Decoder depth estimator. + + EncoderDecoder typically consists of backbone, decode_head, auxiliary_head. + Note that auxiliary_head is only used for deep supervision during training, + which could be dumped during inference. + + 1. The ``loss`` method is used to calculate the loss of model, + which includes two steps: (1) Extracts features to obtain the feature maps + (2) Call the decode head loss function to forward decode head model and + calculate losses. + + .. code:: text + + loss(): extract_feat() -> _decode_head_forward_train() -> _auxiliary_head_forward_train (optional) + _decode_head_forward_train(): decode_head.loss() + _auxiliary_head_forward_train(): auxiliary_head.loss (optional) + + 2. The ``predict`` method is used to predict depth estimation results, + which includes two steps: (1) Run inference function to obtain the list of + depth (2) Call post-processing function to obtain list of + ``SegDataSample`` including ``pred_depth_map``. + + .. code:: text + + predict(): inference() -> postprocess_result() + inference(): whole_inference()/slide_inference() + whole_inference()/slide_inference(): encoder_decoder() + encoder_decoder(): extract_feat() -> decode_head.predict() + + 3. The ``_forward`` method is used to output the tensor by running the model, + which includes two steps: (1) Extracts features to obtain the feature maps + (2)Call the decode head forward function to forward decode head model. + + .. code:: text + + _forward(): extract_feat() -> _decode_head.forward() + + Args: + + backbone (ConfigType): The config for the backnone of depth estimator. + decode_head (ConfigType): The config for the decode head of depth estimator. + neck (OptConfigType): The config for the neck of depth estimator. + Defaults to None. + auxiliary_head (OptConfigType): The config for the auxiliary head of + depth estimator. Defaults to None. + train_cfg (OptConfigType): The config for training. Defaults to None. + test_cfg (OptConfigType): The config for testing. Defaults to None. + data_preprocessor (dict, optional): The pre-process config of + :class:`BaseDataPreprocessor`. + pretrained (str, optional): The path for pretrained model. + Defaults to None. + init_cfg (dict, optional): The weight initialized config for + :class:`BaseModule`. + """ # noqa: E501 + + def __init__(self, + backbone: ConfigType, + decode_head: ConfigType, + neck: OptConfigType = None, + auxiliary_head: OptConfigType = None, + train_cfg: OptConfigType = None, + test_cfg: OptConfigType = None, + data_preprocessor: OptConfigType = None, + pretrained: Optional[str] = None, + init_cfg: OptMultiConfig = None): + super().__init__( + backbone=backbone, + decode_head=decode_head, + neck=neck, + auxiliary_head=auxiliary_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + data_preprocessor=data_preprocessor, + pretrained=pretrained, + init_cfg=init_cfg) + + def extract_feat(self, + inputs: Tensor, + batch_img_metas: Optional[List[dict]] = None) -> Tensor: + """Extract features from images.""" + + if getattr(self.backbone, 'class_embed_select', False) and \ + isinstance(batch_img_metas, list) and \ + 'category_id' in batch_img_metas[0]: + cat_ids = [meta['category_id'] for meta in batch_img_metas] + cat_ids = torch.tensor(cat_ids).to(inputs.device) + inputs = (inputs, cat_ids) + + x = self.backbone(inputs) + if self.with_neck: + x = self.neck(x) + return x + + def encode_decode(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Encode images with backbone and decode into a depth map of the same + size as input.""" + x = self.extract_feat(inputs, batch_img_metas) + depth = self.decode_head.predict(x, batch_img_metas, self.test_cfg) + + return depth + + def _decode_head_forward_train(self, inputs: List[Tensor], + data_samples: SampleList) -> dict: + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + loss_decode = self.decode_head.loss(inputs, data_samples, + self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode')) + return losses + + def _auxiliary_head_forward_train(self, inputs: List[Tensor], + data_samples: SampleList) -> dict: + """Run forward function and calculate loss for auxiliary head in + training.""" + losses = dict() + if isinstance(self.auxiliary_head, nn.ModuleList): + for idx, aux_head in enumerate(self.auxiliary_head): + loss_aux = aux_head.loss(inputs, data_samples, self.train_cfg) + losses.update(add_prefix(loss_aux, f'aux_{idx}')) + else: + loss_aux = self.auxiliary_head.loss(inputs, data_samples, + self.train_cfg) + losses.update(add_prefix(loss_aux, 'aux')) + + return losses + + def loss(self, inputs: Tensor, data_samples: SampleList) -> dict: + """Calculate losses from a batch of inputs and data samples. + + Args: + inputs (Tensor): Input images. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_depth_map`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + if data_samples is not None: + batch_img_metas = [ + data_sample.metainfo for data_sample in data_samples + ] + else: + batch_img_metas = [ + dict( + ori_shape=inputs.shape[2:], + img_shape=inputs.shape[2:], + pad_shape=inputs.shape[2:], + padding_size=[0, 0, 0, 0]) + ] * inputs.shape[0] + + x = self.extract_feat(inputs, batch_img_metas) + + losses = dict() + + loss_decode = self._decode_head_forward_train(x, data_samples) + losses.update(loss_decode) + + if self.with_auxiliary_head: + loss_aux = self._auxiliary_head_forward_train(x, data_samples) + losses.update(loss_aux) + + return losses + + def predict(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> SampleList: + """Predict results from a batch of inputs and data samples with post- + processing. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`], optional): The seg data + samples. It usually includes information such as `metainfo` + and `gt_depth_map`. + + Returns: + list[:obj:`SegDataSample`]: Depth estimation results of the + input images. Each SegDataSample usually contain: + + - ``pred_depth_max``(PixelData): Prediction of depth estimation. + """ + if data_samples is not None: + batch_img_metas = [ + data_sample.metainfo for data_sample in data_samples + ] + else: + batch_img_metas = [ + dict( + ori_shape=inputs.shape[2:], + img_shape=inputs.shape[2:], + pad_shape=inputs.shape[2:], + padding_size=[0, 0, 0, 0]) + ] * inputs.shape[0] + + depth = self.inference(inputs, batch_img_metas) + + return self.postprocess_result(depth, data_samples) + + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tensor: + """Network forward process. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_depth_map`. + + Returns: + Tensor: Forward output of model without any post-processes. + """ + x = self.extract_feat(inputs) + return self.decode_head.forward(x) + + def slide_flip_inference(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Inference by sliding-window with overlap and flip. + + If h_crop > h_img or w_crop > w_img, the small patch will be used to + decode without padding. + + Args: + inputs (tensor): the tensor should have a shape NxCxHxW, + which contains all images in the batch. + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The depth estimation results. + """ + + h_stride, w_stride = self.test_cfg.stride + h_crop, w_crop = self.test_cfg.crop_size + batch_size, _, h_img, w_img = inputs.size() + out_channels = self.out_channels + h_grids = max(h_img - h_crop + h_stride - 1, 0) // h_stride + 1 + w_grids = max(w_img - w_crop + w_stride - 1, 0) // w_stride + 1 + preds = inputs.new_zeros((batch_size, out_channels, h_img, w_img)) + count_mat = inputs.new_zeros((batch_size, 1, h_img, w_img)) + for h_idx in range(h_grids): + for w_idx in range(w_grids): + y1 = h_idx * h_stride + x1 = w_idx * w_stride + y2 = min(y1 + h_crop, h_img) + x2 = min(x1 + w_crop, w_img) + y1 = max(y2 - h_crop, 0) + x1 = max(x2 - w_crop, 0) + crop_img = inputs[:, :, y1:y2, x1:x2] + # change the image shape to patch shape + batch_img_metas[0]['img_shape'] = crop_img.shape[2:] + # the output of encode_decode is depth tensor map + # with shape [N, C, H, W] + crop_depth_map = self.encode_decode(crop_img, batch_img_metas) + + # average out the original and flipped prediction + crop_depth_map_flip = self.encode_decode( + crop_img.flip(dims=(3, )), batch_img_metas) + crop_depth_map_flip = crop_depth_map_flip.flip(dims=(3, )) + crop_depth_map = (crop_depth_map + crop_depth_map_flip) / 2.0 + + preds += F.pad(crop_depth_map, + (int(x1), int(preds.shape[3] - x2), int(y1), + int(preds.shape[2] - y2))) + + count_mat[:, :, y1:y2, x1:x2] += 1 + assert (count_mat == 0).sum() == 0 + depth = preds / count_mat + + return depth + + def inference(self, inputs: Tensor, batch_img_metas: List[dict]) -> Tensor: + """Inference with slide/whole style. + + Args: + inputs (Tensor): The input image of shape (N, 3, H, W). + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', 'pad_shape', and 'padding_size'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The depth estimation results. + """ + assert self.test_cfg.get('mode', 'whole') in ['slide', 'whole', + 'slide_flip'], \ + f'Only "slide", "slide_flip" or "whole" test mode are ' \ + f'supported, but got {self.test_cfg["mode"]}.' + ori_shape = batch_img_metas[0]['ori_shape'] + if not all(_['ori_shape'] == ori_shape for _ in batch_img_metas): + print_log( + 'Image shapes are different in the batch.', + logger='current', + level=logging.WARN) + if self.test_cfg.mode == 'slide': + depth_map = self.slide_inference(inputs, batch_img_metas) + if self.test_cfg.mode == 'slide_flip': + depth_map = self.slide_flip_inference(inputs, batch_img_metas) + else: + depth_map = self.whole_inference(inputs, batch_img_metas) + + return depth_map + + def postprocess_result(self, + depth: Tensor, + data_samples: OptSampleList = None) -> SampleList: + """ Convert results list to `SegDataSample`. + Args: + depth (Tensor): The depth estimation results. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_depth_map`. Default to None. + Returns: + list[:obj:`SegDataSample`]: Depth estomation results of the + input images. Each SegDataSample usually contain: + + - ``pred_depth_map``(PixelData): Prediction of depth estimation. + """ + batch_size, C, H, W = depth.shape + + if data_samples is None: + data_samples = [SegDataSample() for _ in range(batch_size)] + only_prediction = True + else: + only_prediction = False + + for i in range(batch_size): + if not only_prediction: + img_meta = data_samples[i].metainfo + # remove padding area + if 'img_padding_size' not in img_meta: + padding_size = img_meta.get('padding_size', [0] * 4) + else: + padding_size = img_meta['img_padding_size'] + padding_left, padding_right, padding_top, padding_bottom =\ + padding_size + # i_depth shape is 1, C, H, W after remove padding + i_depth = depth[i:i + 1, :, padding_top:H - padding_bottom, + padding_left:W - padding_right] + + flip = img_meta.get('flip', None) + if flip: + flip_direction = img_meta.get('flip_direction', None) + assert flip_direction in ['horizontal', 'vertical'] + if flip_direction == 'horizontal': + i_depth = i_depth.flip(dims=(3, )) + else: + i_depth = i_depth.flip(dims=(2, )) + + # resize as original shape + i_depth = resize( + i_depth, + size=img_meta['ori_shape'], + mode='bilinear', + align_corners=self.align_corners, + warning=False).squeeze(0) + else: + i_depth = depth[i] + + data_samples[i].set_data( + {'pred_depth_map': PixelData(**{'data': i_depth})}) + + return data_samples diff --git a/mmsegmentation/mmseg/models/segmentors/encoder_decoder.py b/mmsegmentation/mmseg/models/segmentors/encoder_decoder.py new file mode 100644 index 0000000..fa4050e --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/encoder_decoder.py @@ -0,0 +1,364 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +from typing import List, Optional + +import torch.nn as nn +import torch.nn.functional as F +from mmengine.logging import print_log +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.utils import (ConfigType, OptConfigType, OptMultiConfig, + OptSampleList, SampleList, add_prefix) +from .base import BaseSegmentor + + +@MODELS.register_module() +class EncoderDecoder(BaseSegmentor): + """Encoder Decoder segmentors. + + EncoderDecoder typically consists of backbone, decode_head, auxiliary_head. + Note that auxiliary_head is only used for deep supervision during training, + which could be dumped during inference. + + 1. The ``loss`` method is used to calculate the loss of model, + which includes two steps: (1) Extracts features to obtain the feature maps + (2) Call the decode head loss function to forward decode head model and + calculate losses. + + .. code:: text + + loss(): extract_feat() -> _decode_head_forward_train() -> _auxiliary_head_forward_train (optional) + _decode_head_forward_train(): decode_head.loss() + _auxiliary_head_forward_train(): auxiliary_head.loss (optional) + + 2. The ``predict`` method is used to predict segmentation results, + which includes two steps: (1) Run inference function to obtain the list of + seg_logits (2) Call post-processing function to obtain list of + ``SegDataSample`` including ``pred_sem_seg`` and ``seg_logits``. + + .. code:: text + + predict(): inference() -> postprocess_result() + infercen(): whole_inference()/slide_inference() + whole_inference()/slide_inference(): encoder_decoder() + encoder_decoder(): extract_feat() -> decode_head.predict() + + 3. The ``_forward`` method is used to output the tensor by running the model, + which includes two steps: (1) Extracts features to obtain the feature maps + (2)Call the decode head forward function to forward decode head model. + + .. code:: text + + _forward(): extract_feat() -> _decode_head.forward() + + Args: + + backbone (ConfigType): The config for the backnone of segmentor. + decode_head (ConfigType): The config for the decode head of segmentor. + neck (OptConfigType): The config for the neck of segmentor. + Defaults to None. + auxiliary_head (OptConfigType): The config for the auxiliary head of + segmentor. Defaults to None. + train_cfg (OptConfigType): The config for training. Defaults to None. + test_cfg (OptConfigType): The config for testing. Defaults to None. + data_preprocessor (dict, optional): The pre-process config of + :class:`BaseDataPreprocessor`. + pretrained (str, optional): The path for pretrained model. + Defaults to None. + init_cfg (dict, optional): The weight initialized config for + :class:`BaseModule`. + """ # noqa: E501 + + def __init__(self, + backbone: ConfigType, + decode_head: ConfigType, + neck: OptConfigType = None, + auxiliary_head: OptConfigType = None, + train_cfg: OptConfigType = None, + test_cfg: OptConfigType = None, + data_preprocessor: OptConfigType = None, + pretrained: Optional[str] = None, + init_cfg: OptMultiConfig = None): + super().__init__( + data_preprocessor=data_preprocessor, init_cfg=init_cfg) + if pretrained is not None: + assert backbone.get('pretrained') is None, \ + 'both backbone and segmentor set pretrained weight' + backbone.pretrained = pretrained + self.backbone = MODELS.build(backbone) + if neck is not None: + self.neck = MODELS.build(neck) + self._init_decode_head(decode_head) + self._init_auxiliary_head(auxiliary_head) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + assert self.with_decode_head + + def _init_decode_head(self, decode_head: ConfigType) -> None: + """Initialize ``decode_head``""" + self.decode_head = MODELS.build(decode_head) + self.align_corners = self.decode_head.align_corners + self.num_classes = self.decode_head.num_classes + self.out_channels = self.decode_head.out_channels + + def _init_auxiliary_head(self, auxiliary_head: ConfigType) -> None: + """Initialize ``auxiliary_head``""" + if auxiliary_head is not None: + if isinstance(auxiliary_head, list): + self.auxiliary_head = nn.ModuleList() + for head_cfg in auxiliary_head: + self.auxiliary_head.append(MODELS.build(head_cfg)) + else: + self.auxiliary_head = MODELS.build(auxiliary_head) + + def extract_feat(self, inputs: Tensor) -> List[Tensor]: + """Extract features from images.""" + x = self.backbone(inputs) + if self.with_neck: + x = self.neck(x) + return x + + def encode_decode(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Encode images with backbone and decode into a semantic segmentation + map of the same size as input.""" + x = self.extract_feat(inputs) + seg_logits = self.decode_head.predict(x, batch_img_metas, + self.test_cfg) + + return seg_logits + + def _decode_head_forward_train(self, inputs: List[Tensor], + data_samples: SampleList) -> dict: + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + loss_decode = self.decode_head.loss(inputs, data_samples, + self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode')) + return losses + + def _auxiliary_head_forward_train(self, inputs: List[Tensor], + data_samples: SampleList) -> dict: + """Run forward function and calculate loss for auxiliary head in + training.""" + losses = dict() + if isinstance(self.auxiliary_head, nn.ModuleList): + for idx, aux_head in enumerate(self.auxiliary_head): + loss_aux = aux_head.loss(inputs, data_samples, self.train_cfg) + losses.update(add_prefix(loss_aux, f'aux_{idx}')) + else: + loss_aux = self.auxiliary_head.loss(inputs, data_samples, + self.train_cfg) + losses.update(add_prefix(loss_aux, 'aux')) + + return losses + + def loss(self, inputs: Tensor, data_samples: SampleList) -> dict: + """Calculate losses from a batch of inputs and data samples. + + Args: + inputs (Tensor): Input images. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_sem_seg`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + x = self.extract_feat(inputs) + + losses = dict() + + loss_decode = self._decode_head_forward_train(x, data_samples) + losses.update(loss_decode) + + if self.with_auxiliary_head: + loss_aux = self._auxiliary_head_forward_train(x, data_samples) + losses.update(loss_aux) + + return losses + + def predict(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> SampleList: + """Predict results from a batch of inputs and data samples with post- + processing. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`], optional): The seg data + samples. It usually includes information such as `metainfo` + and `gt_sem_seg`. + + Returns: + list[:obj:`SegDataSample`]: Segmentation results of the + input images. Each SegDataSample usually contain: + + - ``pred_sem_seg``(PixelData): Prediction of semantic segmentation. + - ``seg_logits``(PixelData): Predicted logits of semantic + segmentation before normalization. + """ + if data_samples is not None: + batch_img_metas = [ + data_sample.metainfo for data_sample in data_samples + ] + else: + batch_img_metas = [ + dict( + ori_shape=inputs.shape[2:], + img_shape=inputs.shape[2:], + pad_shape=inputs.shape[2:], + padding_size=[0, 0, 0, 0]) + ] * inputs.shape[0] + + seg_logits = self.inference(inputs, batch_img_metas) + + return self.postprocess_result(seg_logits, data_samples) + + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tensor: + """Network forward process. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + + Returns: + Tensor: Forward output of model without any post-processes. + """ + x = self.extract_feat(inputs) + return self.decode_head.forward(x) + + def slide_inference(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Inference by sliding-window with overlap. + + If h_crop > h_img or w_crop > w_img, the small patch will be used to + decode without padding. + + Args: + inputs (tensor): the tensor should have a shape NxCxHxW, + which contains all images in the batch. + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The segmentation results, seg_logits from model of each + input image. + """ + + h_stride, w_stride = self.test_cfg.stride + h_crop, w_crop = self.test_cfg.crop_size + batch_size, _, h_img, w_img = inputs.size() + out_channels = self.out_channels + h_grids = max(h_img - h_crop + h_stride - 1, 0) // h_stride + 1 + w_grids = max(w_img - w_crop + w_stride - 1, 0) // w_stride + 1 + preds = inputs.new_zeros((batch_size, out_channels, h_img, w_img)) + count_mat = inputs.new_zeros((batch_size, 1, h_img, w_img)) + for h_idx in range(h_grids): + for w_idx in range(w_grids): + y1 = h_idx * h_stride + x1 = w_idx * w_stride + y2 = min(y1 + h_crop, h_img) + x2 = min(x1 + w_crop, w_img) + y1 = max(y2 - h_crop, 0) + x1 = max(x2 - w_crop, 0) + crop_img = inputs[:, :, y1:y2, x1:x2] + # change the image shape to patch shape + batch_img_metas[0]['img_shape'] = crop_img.shape[2:] + # the output of encode_decode is seg logits tensor map + # with shape [N, C, H, W] + crop_seg_logit = self.encode_decode(crop_img, batch_img_metas) + preds += F.pad(crop_seg_logit, + (int(x1), int(preds.shape[3] - x2), int(y1), + int(preds.shape[2] - y2))) + + count_mat[:, :, y1:y2, x1:x2] += 1 + assert (count_mat == 0).sum() == 0 + seg_logits = preds / count_mat + + return seg_logits + + def whole_inference(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Inference with full image. + + Args: + inputs (Tensor): The tensor should have a shape NxCxHxW, which + contains all images in the batch. + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The segmentation results, seg_logits from model of each + input image. + """ + + seg_logits = self.encode_decode(inputs, batch_img_metas) + + return seg_logits + + def inference(self, inputs: Tensor, batch_img_metas: List[dict]) -> Tensor: + """Inference with slide/whole style. + + Args: + inputs (Tensor): The input image of shape (N, 3, H, W). + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', 'pad_shape', and 'padding_size'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The segmentation results, seg_logits from model of each + input image. + """ + assert self.test_cfg.get('mode', 'whole') in ['slide', 'whole'], \ + f'Only "slide" or "whole" test mode are supported, but got ' \ + f'{self.test_cfg["mode"]}.' + ori_shape = batch_img_metas[0]['ori_shape'] + if not all(_['ori_shape'] == ori_shape for _ in batch_img_metas): + print_log( + 'Image shapes are different in the batch.', + logger='current', + level=logging.WARN) + if self.test_cfg.mode == 'slide': + seg_logit = self.slide_inference(inputs, batch_img_metas) + else: + seg_logit = self.whole_inference(inputs, batch_img_metas) + + return seg_logit + + def aug_test(self, inputs, batch_img_metas, rescale=True): + """Test with augmentations. + + Only rescale=True is supported. + """ + # aug_test rescale all imgs back to ori_shape for now + assert rescale + # to save memory, we get augmented seg logit inplace + seg_logit = self.inference(inputs[0], batch_img_metas[0], rescale) + for i in range(1, len(inputs)): + cur_seg_logit = self.inference(inputs[i], batch_img_metas[i], + rescale) + seg_logit += cur_seg_logit + seg_logit /= len(inputs) + seg_pred = seg_logit.argmax(dim=1) + # unravel batch dim + seg_pred = list(seg_pred) + return seg_pred diff --git a/mmsegmentation/mmseg/models/segmentors/multimodal_encoder_decoder.py b/mmsegmentation/mmseg/models/segmentors/multimodal_encoder_decoder.py new file mode 100644 index 0000000..75aa8b9 --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/multimodal_encoder_decoder.py @@ -0,0 +1,350 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Optional + +import torch.nn.functional as F +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.utils import (ConfigType, OptConfigType, OptMultiConfig, + OptSampleList, SampleList, add_prefix) +from .base import BaseSegmentor + + +@MODELS.register_module() +class MultimodalEncoderDecoder(BaseSegmentor): + """Multimodal Encoder-Decoder segmentors. + + Multimodal segmentation architecture is used for open-vocabulary + semantic segmentation with combining the visual and language + pretrain models. It consists of a image_encoder (backbone) to extract + visual feature, a text encoder to extract text feature, and a decode + head to generate semantic maps. + Note that the deep supervision during training is implemented in decode head. + + 1. The ``loss`` method is used to calculate the loss of model, + which includes two steps: (1) Extracts features to obtain the feature maps + (2) Call the decode head loss function to forward decode head model and + calculate losses. + + .. code:: text + + loss(): extract_feat() -> _decode_head_forward_train() + _decode_head_forward_train(): decode_head.loss() + + 2. The ``predict`` method is used to predict segmentation results, + which includes two steps: (1) Run inference function to obtain the list of + seg_logits (2) Call post-processing function to obtain list of + ``SegDataSampel`` including ``pred_sem_seg`` and ``seg_logits``. + + .. code:: text + + predict(): inference() -> postprocess_result() + inference(): whole_inference()/slide_inference() + whole_inference()/slide_inference(): encoder_decoder() + encoder_decoder(): extract_feat() -> decode_head.predict() + + 3. The ``_forward`` method is used to output the tensor by running the model, + which includes two steps: (1) Extracts features to obtain the feature maps + (2)Call the decode head forward function to forward decode head model. + + .. code:: text + + _forward(): extract_feat() -> _decode_head.forward() + + Args: + + image_encoder (ConfigType): The config for the visual encoder of segmentor. + text_encoder ((ConfigType): The config for the text encoder of segmentor. + decode_head (ConfigType): The config for the decode head of segmentor. + train_cfg (OptConfigType): The config for training. Defaults to None. + test_cfg (OptConfigType): The config for testing. Defaults to None. + data_preprocessor (dict, optional): The pre-process config of + :class:`BaseDataPreprocessor`. + pretrained (str, optional): The path for pretrained model. + Defaults to None. + asymetric_input (bool): whether to use different size of input for image encoder + and decode head. Defaults to False. + encoder_resolution (float): resize scale of input images for image encoder. + Defaults to None. + init_cfg (dict, optional): The weight initialized config for + :class:`BaseModule`. + """ # noqa: E501 + + def __init__(self, + image_encoder: ConfigType, + text_encoder: ConfigType, + decode_head: ConfigType, + train_cfg: OptConfigType = None, + test_cfg: OptConfigType = None, + data_preprocessor: OptConfigType = None, + pretrained: Optional[str] = None, + asymetric_input: bool = True, + encoder_resolution: float = None, + init_cfg: OptMultiConfig = None): + super().__init__( + data_preprocessor=data_preprocessor, init_cfg=init_cfg) + if pretrained is not None: + image_encoder.init_cfg = dict( + type='Pretrained_Part', checkpoint=pretrained) + text_encoder.init_cfg = dict( + type='Pretrained_Part', checkpoint=pretrained) + decode_head.init_cfg = dict( + type='Pretrained_Part', checkpoint=pretrained) + + if asymetric_input: + assert encoder_resolution is not None, \ + 'if asymetric_input set True, ' \ + 'clip_resolution must be a certain value' + self.asymetric_input = asymetric_input + self.encoder_resolution = encoder_resolution + self.image_encoder = MODELS.build(image_encoder) + self.text_encoder = MODELS.build(text_encoder) + self._init_decode_head(decode_head) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + assert self.with_decode_head + + def _init_decode_head(self, decode_head: ConfigType) -> None: + """Initialize ``decode_head``""" + self.decode_head = MODELS.build(decode_head) + self.align_corners = self.decode_head.align_corners + self.num_classes = self.decode_head.num_classes + self.out_channels = self.decode_head.out_channels + + def extract_feat(self, inputs: Tensor) -> List[Tensor]: + """Extract visual features from images.""" + x = self.image_encoder(inputs) + return x + + def encode_decode(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Encode the name of classes with text_encoder and encode images with + image_encoder. + + Then decode the class embedding and visual feature into a semantic + segmentation map of the same size as input. + """ + classifier_embeds = self.text_encoder() + clip_inputs = inputs + if self.asymetric_input: + clip_inputs = F.interpolate( + inputs, scale_factor=self.encoder_resolution, mode='bilinear') + x = self.image_encoder(clip_inputs) + seg_logits = self.decode_head.predict([inputs, x, classifier_embeds], + batch_img_metas, self.test_cfg) + + return seg_logits + + def _decode_head_forward_train(self, inputs: List[Tensor], + data_samples: SampleList) -> dict: + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + loss_decode = self.decode_head.loss(inputs, data_samples, + self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode')) + return losses + + def loss(self, inputs: Tensor, data_samples: SampleList) -> dict: + """Calculate losses from a batch of inputs and data samples. + + Args: + inputs (Tensor): Input images. + data_samples (list[:obj:`SegDataSample`]): The seg data samples. + It usually includes information such as `metainfo` and + `gt_sem_seg`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + classifier_embeds = self.text_encoder() + clip_inputs = inputs + if self.asymetric_input: + clip_inputs = F.interpolate( + inputs, scale_factor=self.encoder_resolution, mode='bilinear') + x = self.image_encoder(clip_inputs) + + losses = dict() + + loss_decode = self._decode_head_forward_train( + [inputs, x, classifier_embeds], data_samples) + losses.update(loss_decode) + + return losses + + def predict(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> SampleList: + """Predict results from a batch of inputs and data samples with post- + processing. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`], optional): The seg data + samples. It usually includes information such as `metainfo` + and `gt_sem_seg`. + + Returns: + list[:obj:`SegDataSample`]: Segmentation results of the + input images. Each SegDataSample usually contain: + + - ``pred_sem_seg``(PixelData): Prediction of semantic segmentation. + - ``seg_logits``(PixelData): Predicted logits of semantic + segmentation before normalization. + """ + if data_samples is not None: + batch_img_metas = [ + data_sample.metainfo for data_sample in data_samples + ] + else: + batch_img_metas = [ + dict( + ori_shape=inputs.shape[2:], + img_shape=inputs.shape[2:], + pad_shape=inputs.shape[2:], + padding_size=[0, 0, 0, 0]) + ] * inputs.shape[0] + + seg_logits = self.inference(inputs, batch_img_metas) + + return self.postprocess_result(seg_logits, data_samples) + + def _forward(self, + inputs: Tensor, + data_samples: OptSampleList = None) -> Tensor: + """Network forward process. + + Args: + inputs (Tensor): Inputs with shape (N, C, H, W). + data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + + Returns: + Tensor: Forward output of model without any post-processes. + """ + x = self.extract_feat(inputs) + return self.decode_head.forward(x) + + def slide_inference(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Inference by sliding-window with overlap. + + If h_crop > h_img or w_crop > w_img, the small patch will be used to + decode without padding. + + Args: + inputs (tensor): the tensor should have a shape NxCxHxW, + which contains all images in the batch. + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The segmentation results, seg_logits from model of each + input image. + """ + + h_stride, w_stride = self.test_cfg.stride + h_crop, w_crop = self.test_cfg.crop_size + batch_size, _, h_img, w_img = inputs.size() + out_channels = self.out_channels + h_grids = max(h_img - h_crop + h_stride - 1, 0) // h_stride + 1 + w_grids = max(w_img - w_crop + w_stride - 1, 0) // w_stride + 1 + preds = inputs.new_zeros((batch_size, out_channels, h_img, w_img)) + count_mat = inputs.new_zeros((batch_size, 1, h_img, w_img)) + for h_idx in range(h_grids): + for w_idx in range(w_grids): + y1 = h_idx * h_stride + x1 = w_idx * w_stride + y2 = min(y1 + h_crop, h_img) + x2 = min(x1 + w_crop, w_img) + y1 = max(y2 - h_crop, 0) + x1 = max(x2 - w_crop, 0) + crop_img = inputs[:, :, y1:y2, x1:x2] + # change the image shape to patch shape + batch_img_metas[0]['img_shape'] = crop_img.shape[2:] + # the output of encode_decode is seg logits tensor map + # with shape [N, C, H, W] + crop_seg_logit = self.encode_decode(crop_img, batch_img_metas) + preds += F.pad(crop_seg_logit, + (int(x1), int(preds.shape[3] - x2), int(y1), + int(preds.shape[2] - y2))) + + count_mat[:, :, y1:y2, x1:x2] += 1 + assert (count_mat == 0).sum() == 0 + seg_logits = preds / count_mat + + return seg_logits + + def whole_inference(self, inputs: Tensor, + batch_img_metas: List[dict]) -> Tensor: + """Inference with full image. + + Args: + inputs (Tensor): The tensor should have a shape NxCxHxW, which + contains all images in the batch. + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', and 'pad_shape'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The segmentation results, seg_logits from model of each + input image. + """ + + seg_logits = self.encode_decode(inputs, batch_img_metas) + + return seg_logits + + def inference(self, inputs: Tensor, batch_img_metas: List[dict]) -> Tensor: + """Inference with slide/whole style. + + Args: + inputs (Tensor): The input image of shape (N, 3, H, W). + batch_img_metas (List[dict]): List of image metainfo where each may + also contain: 'img_shape', 'scale_factor', 'flip', 'img_path', + 'ori_shape', 'pad_shape', and 'padding_size'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:PackSegInputs`. + + Returns: + Tensor: The segmentation results, seg_logits from model of each + input image. + """ + + assert self.test_cfg.mode in ['slide', 'whole'] + ori_shape = batch_img_metas[0]['ori_shape'] + assert all(_['ori_shape'] == ori_shape for _ in batch_img_metas) + if self.test_cfg.mode == 'slide': + seg_logit = self.slide_inference(inputs, batch_img_metas) + else: + seg_logit = self.whole_inference(inputs, batch_img_metas) + + return seg_logit + + def aug_test(self, inputs, batch_img_metas, rescale=True): + """Test with augmentations. + + Only rescale=True is supported. + """ + # aug_test rescale all imgs back to ori_shape for now + assert rescale + # to save memory, we get augmented seg logit inplace + seg_logit = self.inference(inputs[0], batch_img_metas[0], rescale) + for i in range(1, len(inputs)): + cur_seg_logit = self.inference(inputs[i], batch_img_metas[i], + rescale) + seg_logit += cur_seg_logit + seg_logit /= len(inputs) + seg_pred = seg_logit.argmax(dim=1) + # unravel batch dim + seg_pred = list(seg_pred) + return seg_pred diff --git a/mmsegmentation/mmseg/models/segmentors/seg_tta.py b/mmsegmentation/mmseg/models/segmentors/seg_tta.py new file mode 100644 index 0000000..63ef61d --- /dev/null +++ b/mmsegmentation/mmseg/models/segmentors/seg_tta.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List + +import torch +from mmengine.model import BaseTTAModel +from mmengine.structures import PixelData + +from mmseg.registry import MODELS +from mmseg.utils import SampleList + + +@MODELS.register_module() +class SegTTAModel(BaseTTAModel): + + def merge_preds(self, data_samples_list: List[SampleList]) -> SampleList: + """Merge predictions of enhanced data to one prediction. + + Args: + data_samples_list (List[SampleList]): List of predictions + of all enhanced data. + + Returns: + SampleList: Merged prediction. + """ + predictions = [] + for data_samples in data_samples_list: + seg_logits = data_samples[0].seg_logits.data + logits = torch.zeros(seg_logits.shape).to(seg_logits) + for data_sample in data_samples: + seg_logit = data_sample.seg_logits.data + if self.module.out_channels > 1: + logits += seg_logit.softmax(dim=0) + else: + logits += seg_logit.sigmoid() + logits /= len(data_samples) + if self.module.out_channels == 1: + seg_pred = (logits > self.module.decode_head.threshold + ).to(logits).squeeze(1) + else: + seg_pred = logits.argmax(dim=0) + data_sample.set_data({'pred_sem_seg': PixelData(data=seg_pred)}) + if hasattr(data_samples[0], 'gt_sem_seg'): + data_sample.set_data( + {'gt_sem_seg': data_samples[0].gt_sem_seg}) + data_sample.set_metainfo({'img_path': data_samples[0].img_path}) + predictions.append(data_sample) + return predictions diff --git a/mmsegmentation/mmseg/models/text_encoder/__init__.py b/mmsegmentation/mmseg/models/text_encoder/__init__.py new file mode 100644 index 0000000..199856d --- /dev/null +++ b/mmsegmentation/mmseg/models/text_encoder/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .clip_text_encoder import CLIPTextEncoder + +__all__ = ['CLIPTextEncoder'] diff --git a/mmsegmentation/mmseg/models/text_encoder/clip_text_encoder.py b/mmsegmentation/mmseg/models/text_encoder/clip_text_encoder.py new file mode 100644 index 0000000..1a18b86 --- /dev/null +++ b/mmsegmentation/mmseg/models/text_encoder/clip_text_encoder.py @@ -0,0 +1,229 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List + +import numpy as np +import torch +import torch.nn as nn +from mmcv.cnn import build_norm_layer +from mmcv.cnn.bricks.transformer import BaseTransformerLayer +from mmengine.model import BaseModule, ModuleList +from mmengine.runner.checkpoint import CheckpointLoader, load_state_dict +from torch.nn import functional as F + +from mmseg.registry import MODELS +from mmseg.utils import get_classes, get_predefined_templates, tokenizer + + +@MODELS.register_module() +class CLIPTextEncoder(BaseModule): + """A text encoder with transformer architecture to encode the label text. + + Modified from https://github.com/MendelXu/SAN/blob/main/san/model/clip_utils/classifier.py # noqa:E501 + Copyright (c) 2023 MendelXu. + Licensed under the MIT License + + Args: + dataset_name: (str|None): The name of the dataset to which + the data belongs. + vocabulary: (List[str]|None): The list of class names. Default: None. + templates: (List[str]|None): The prompt template used for labels. + Default: None. + total_vocab_size: (int): Number of all words used by the pre-trained + model. Default: 49408 (CLIP). + context_length: (int): The max length of prompt text. + Default: 77 (CLIP). + embed_dims: (int): Width of transformer model. Default: 512. + num_layers: (int): Depth of transformer. Default: 12, + num_heads: (int): Number of attention heads in transformer. + Default: 8, + mlp_ratio: (int) Ratio of mlp hidden dim to embedding dim in + transformer. Default: 4, + output_dims: (int) Dim of output text embeddings. Default: 512, + cache_feature: (bool) Whether to save class embeddings in cache. + Default: True, + cat_bg: (bool) Whether to add background embedding. Default: True. + norm_cfg (dict|None): Config for norm layer. Default: dict(type='LN') + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + dataset_name: str = None, + vocabulary: List[str] = None, + templates: str = 'vild', + total_vocab_size: int = 49408, + context_length: int = 77, + embed_dims: int = 512, + num_layers: int = 12, + num_heads: int = 8, + mlp_ratio: int = 4, + output_dims: int = 512, + cache_feature: bool = True, + cat_bg: bool = True, + norm_cfg: dict = dict(type='LN'), + init_cfg: dict = None): + super().__init__(init_cfg) + if isinstance(templates, List): + self.templates = templates + else: + self.templates = get_predefined_templates(templates) + + assert dataset_name is not None or vocabulary is not None, \ + "text_encoder required either 'dataset_name' or 'vocabulary'" + assert dataset_name is None or vocabulary is None, \ + "there is conflict between 'dataset_name' and 'vocabulary'" + self.dataset_name = dataset_name + self.vocabulary = vocabulary + self.num_pos = context_length + self.token_embedding = nn.Embedding(total_vocab_size, embed_dims) + self.positional_embedding = nn.Parameter( + torch.empty(context_length, embed_dims)) + self.text_projection = nn.Parameter( + torch.empty(embed_dims, output_dims)) + self.logit_scale = nn.Parameter(torch.ones([]) * np.log(1 / 0.07)) + self.transformer = ModuleList() + self.register_buffer( + 'attn_mask', self.build_attention_mask(), persistent=False) + for i in range(num_layers): + self.transformer.append( + BaseTransformerLayer( + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=embed_dims, + num_heads=num_heads, + batch_first=False, + bias=True), + ffn_cfgs=dict( + type='FFN', + embed_dims=embed_dims, + feedforward_channels=mlp_ratio * embed_dims, + act_cfg=dict(type='QuickGELU')), + operation_order=('norm', 'self_attn', 'norm', 'ffn'))) + self.ln_final = build_norm_layer( + norm_cfg, embed_dims, postfix='_final')[1] + + self.cache_feature = cache_feature + if self.cache_feature: + self.cache = {} + + self._freeze() + + self.cat_bg = cat_bg + if self.cat_bg: + self.bg_embed = nn.Parameter( + torch.randn(1, self.text_projection.shape[1])) + + @property + def ln_final(self): + return getattr(self, self.final_name) + + def build_attention_mask(self): + """lazily create causal attention mask, with full attention between the + tokens. + + pytorch uses additive attention mask; fill with -inf + """ + mask = torch.empty(self.num_pos, self.num_pos) + mask.fill_(float('-inf')) + mask.triu_(1) # zero out the lower diagonal + return mask + + def _freeze(self): + for param in self.parameters(): + param.requires_grad = False + + def init_weights(self): + if self.cat_bg: + nn.init.normal_( + self.bg_embed, + std=self.bg_embed.shape[1]**-0.5, + ) + if isinstance(self.init_cfg, dict) and \ + self.init_cfg.get('type') == 'Pretrained_Part': + checkpoint = CheckpointLoader.load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + + state_dict = checkpoint.copy() + para_prefix = 'text_encoder' + prefix_len = len(para_prefix) + 1 + for k, v in checkpoint.items(): + state_dict.pop(k) + if para_prefix in k: + state_dict[k[prefix_len:]] = v + + load_state_dict(self, state_dict, strict=False, logger=None) + + else: + super().init_weights() + + @torch.no_grad() + def encode_text(self, text, normalize=False): + """encode class token.""" + + embed_device = self.token_embedding.weight.device + x = self.token_embedding( + text.to(embed_device)) # [batch_size, n_ctx, d_model] + x = x + self.positional_embedding + x = x.permute(1, 0, 2) # NLD -> LND + for block in self.transformer: + x = block(query=x, attn_masks=self.attn_mask) + x = x.permute(1, 0, 2) # LND -> NLD + x = self.ln_final(x) # [batch_size, n_ctx, transformer.width] + # take features from the eot embedding + # (eot_token is the highest number in each sequence) + x = x[torch.arange(x.shape[0]), + text.argmax(dim=-1)] @ self.text_projection + return F.normalize(x, dim=-1) if normalize else x + + def template_encode(self, vocabulary): + """Prompt engineering.""" + text_embed_bucket = [] + for template in self.templates: + text_inputs = tokenizer.tokenize( + [template.format(noun) for noun in vocabulary]) + text_embed = self.encode_text(text_inputs, normalize=True) + text_embed_bucket.append(text_embed) + text_embed = torch.stack(text_embed_bucket).mean(dim=0) + text_embed = text_embed / text_embed.norm(dim=-1, keepdim=True) + return text_embed + + def forward(self): + """Forward function.""" + if self.dataset_name is None: # encoding vocabulary directly + class_names = self.vocabulary + if self.cache_feature: + new_classes = [ + word for word in class_names if word not in self.cache + ] + if len(new_classes) > 0: + class_embeds = self.template_encode(new_classes) + self.cache.update(dict(zip(new_classes, class_embeds))) + class_embeds = torch.stack( + [self.cache[word] for word in class_names]) + else: + class_embeds = self.template_encode(class_names) + + else: # encoding the classes of the dataset + class_names = get_classes(self.dataset_name) + if class_names[0] == 'background': + class_names = class_names[1:] + if self.cache_feature: + if self.dataset_name not in self.cache: + class_embeds = self.template_encode(class_names) + self.cache[self.dataset_name] = class_embeds + else: + class_embeds = self.cache[self.dataset_name] + else: + class_embeds = self.template_encode(class_names) + + if self.cat_bg: + class_embeds = torch.cat([class_embeds, self.bg_embed]) + class_embeds = F.normalize(class_embeds, p=2, dim=-1) + return self.logit_scale.exp() * class_embeds + + +@MODELS.register_module() +class QuickGELU(nn.Module): + # From https://github.com/openai/CLIP/blob/main/clip/model.py + def forward(self, x: torch.Tensor): + return x * torch.sigmoid(1.702 * x) diff --git a/mmsegmentation/mmseg/models/utils/__init__.py b/mmsegmentation/mmseg/models/utils/__init__.py new file mode 100644 index 0000000..c0751b1 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/__init__.py @@ -0,0 +1,27 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .basic_block import BasicBlock, Bottleneck +from .embed import PatchEmbed +from .encoding import Encoding +from .inverted_residual import InvertedResidual, InvertedResidualV3 +from .make_divisible import make_divisible +from .point_sample import get_uncertain_point_coords_with_randomness +from .ppm import DAPPM, PAPPM +from .res_layer import ResLayer +from .se_layer import SELayer +from .self_attention_block import SelfAttentionBlock +from .shape_convert import (nchw2nlc2nchw, nchw_to_nlc, nlc2nchw2nlc, + nlc_to_nchw) +from .up_conv_block import UpConvBlock + +# isort: off +from .wrappers import Upsample, resize +from .san_layers import MLP, LayerNorm2d, cross_attn_layer + +__all__ = [ + 'ResLayer', 'SelfAttentionBlock', 'make_divisible', 'InvertedResidual', + 'UpConvBlock', 'InvertedResidualV3', 'SELayer', 'PatchEmbed', + 'nchw_to_nlc', 'nlc_to_nchw', 'nchw2nlc2nchw', 'nlc2nchw2nlc', 'Encoding', + 'Upsample', 'resize', 'DAPPM', 'PAPPM', 'BasicBlock', 'Bottleneck', + 'cross_attn_layer', 'LayerNorm2d', 'MLP', + 'get_uncertain_point_coords_with_randomness' +] diff --git a/mmsegmentation/mmseg/models/utils/basic_block.py b/mmsegmentation/mmseg/models/utils/basic_block.py new file mode 100644 index 0000000..4e1ad81 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/basic_block.py @@ -0,0 +1,143 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule +from torch import Tensor + +from mmseg.registry import MODELS +from mmseg.utils import OptConfigType + + +class BasicBlock(BaseModule): + """Basic block from `ResNet `_. + + Args: + in_channels (int): Input channels. + channels (int): Output channels. + stride (int): Stride of the first block. Default: 1. + downsample (nn.Module, optional): Downsample operation on identity. + Default: None. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict, optional): Config dict for activation layer in + ConvModule. Default: dict(type='ReLU', inplace=True). + act_cfg_out (dict, optional): Config dict for activation layer at the + last of the block. Default: None. + init_cfg (dict, optional): Initialization config dict. Default: None. + """ + + expansion = 1 + + def __init__(self, + in_channels: int, + channels: int, + stride: int = 1, + downsample: nn.Module = None, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + act_cfg_out: OptConfigType = dict(type='ReLU', inplace=True), + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + self.conv1 = ConvModule( + in_channels, + channels, + kernel_size=3, + stride=stride, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.conv2 = ConvModule( + channels, + channels, + kernel_size=3, + padding=1, + norm_cfg=norm_cfg, + act_cfg=None) + self.downsample = downsample + if act_cfg_out: + self.act = MODELS.build(act_cfg_out) + + def forward(self, x: Tensor) -> Tensor: + residual = x + out = self.conv1(x) + out = self.conv2(out) + + if self.downsample: + residual = self.downsample(x) + + out += residual + + if hasattr(self, 'act'): + out = self.act(out) + + return out + + +class Bottleneck(BaseModule): + """Bottleneck block from `ResNet `_. + + Args: + in_channels (int): Input channels. + channels (int): Output channels. + stride (int): Stride of the first block. Default: 1. + downsample (nn.Module, optional): Downsample operation on identity. + Default: None. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict, optional): Config dict for activation layer in + ConvModule. Default: dict(type='ReLU', inplace=True). + act_cfg_out (dict, optional): Config dict for activation layer at + the last of the block. Default: None. + init_cfg (dict, optional): Initialization config dict. Default: None. + """ + + expansion = 2 + + def __init__(self, + in_channels: int, + channels: int, + stride: int = 1, + downsample: Optional[nn.Module] = None, + norm_cfg: OptConfigType = dict(type='BN'), + act_cfg: OptConfigType = dict(type='ReLU', inplace=True), + act_cfg_out: OptConfigType = None, + init_cfg: OptConfigType = None): + super().__init__(init_cfg) + self.conv1 = ConvModule( + in_channels, channels, 1, norm_cfg=norm_cfg, act_cfg=act_cfg) + self.conv2 = ConvModule( + channels, + channels, + 3, + stride, + 1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.conv3 = ConvModule( + channels, + channels * self.expansion, + 1, + norm_cfg=norm_cfg, + act_cfg=None) + if act_cfg_out: + self.act = MODELS.build(act_cfg_out) + self.downsample = downsample + + def forward(self, x: Tensor) -> Tensor: + residual = x + + out = self.conv1(x) + out = self.conv2(out) + out = self.conv3(out) + + if self.downsample: + residual = self.downsample(x) + + out += residual + + if hasattr(self, 'act'): + out = self.act(out) + + return out diff --git a/mmsegmentation/mmseg/models/utils/embed.py b/mmsegmentation/mmseg/models/utils/embed.py new file mode 100644 index 0000000..aef0a40 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/embed.py @@ -0,0 +1,330 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +from typing import Sequence + +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmengine.model import BaseModule +from mmengine.utils import to_2tuple + + +class AdaptivePadding(nn.Module): + """Applies padding to input (if needed) so that input can get fully covered + by filter you specified. It support two modes "same" and "corner". The + "same" mode is same with "SAME" padding mode in TensorFlow, pad zero around + input. The "corner" mode would pad zero to bottom right. + + Args: + kernel_size (int | tuple): Size of the kernel: + stride (int | tuple): Stride of the filter. Default: 1: + dilation (int | tuple): Spacing between kernel elements. + Default: 1. + padding (str): Support "same" and "corner", "corner" mode + would pad zero to bottom right, and "same" mode would + pad zero around input. Default: "corner". + Example: + >>> kernel_size = 16 + >>> stride = 16 + >>> dilation = 1 + >>> input = torch.rand(1, 1, 15, 17) + >>> adap_pad = AdaptivePadding( + >>> kernel_size=kernel_size, + >>> stride=stride, + >>> dilation=dilation, + >>> padding="corner") + >>> out = adap_pad(input) + >>> assert (out.shape[2], out.shape[3]) == (16, 32) + >>> input = torch.rand(1, 1, 16, 17) + >>> out = adap_pad(input) + >>> assert (out.shape[2], out.shape[3]) == (16, 32) + """ + + def __init__(self, kernel_size=1, stride=1, dilation=1, padding='corner'): + + super().__init__() + + assert padding in ('same', 'corner') + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + self.padding = padding + self.kernel_size = kernel_size + self.stride = stride + self.dilation = dilation + + def get_pad_shape(self, input_shape): + input_h, input_w = input_shape + kernel_h, kernel_w = self.kernel_size + stride_h, stride_w = self.stride + output_h = math.ceil(input_h / stride_h) + output_w = math.ceil(input_w / stride_w) + pad_h = max((output_h - 1) * stride_h + + (kernel_h - 1) * self.dilation[0] + 1 - input_h, 0) + pad_w = max((output_w - 1) * stride_w + + (kernel_w - 1) * self.dilation[1] + 1 - input_w, 0) + return pad_h, pad_w + + def forward(self, x): + pad_h, pad_w = self.get_pad_shape(x.size()[-2:]) + if pad_h > 0 or pad_w > 0: + if self.padding == 'corner': + x = F.pad(x, [0, pad_w, 0, pad_h]) + elif self.padding == 'same': + x = F.pad(x, [ + pad_w // 2, pad_w - pad_w // 2, pad_h // 2, + pad_h - pad_h // 2 + ]) + return x + + +class PatchEmbed(BaseModule): + """Image to Patch Embedding. + + We use a conv layer to implement PatchEmbed. + + Args: + in_channels (int): The num of input channels. Default: 3 + embed_dims (int): The dimensions of embedding. Default: 768 + conv_type (str): The config dict for embedding + conv layer type selection. Default: "Conv2d". + kernel_size (int): The kernel_size of embedding conv. Default: 16. + stride (int, optional): The slide stride of embedding conv. + Default: None (Would be set as `kernel_size`). + padding (int | tuple | string ): The padding length of + embedding conv. When it is a string, it means the mode + of adaptive padding, support "same" and "corner" now. + Default: "corner". + dilation (int): The dilation rate of embedding conv. Default: 1. + bias (bool): Bias of embed conv. Default: True. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: None. + input_size (int | tuple | None): The size of input, which will be + used to calculate the out size. Only work when `dynamic_size` + is False. Default: None. + init_cfg (`mmengine.ConfigDict`, optional): The Config for + initialization. Default: None. + """ + + def __init__(self, + in_channels=3, + embed_dims=768, + conv_type='Conv2d', + kernel_size=16, + stride=None, + padding='corner', + dilation=1, + bias=True, + norm_cfg=None, + input_size=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.embed_dims = embed_dims + if stride is None: + stride = kernel_size + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + if isinstance(padding, str): + self.adap_padding = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + # disable the padding of conv + padding = 0 + else: + self.adap_padding = None + padding = to_2tuple(padding) + + self.projection = build_conv_layer( + dict(type=conv_type), + in_channels=in_channels, + out_channels=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + if norm_cfg is not None: + self.norm = build_norm_layer(norm_cfg, embed_dims)[1] + else: + self.norm = None + + if input_size: + input_size = to_2tuple(input_size) + # `init_out_size` would be used outside to + # calculate the num_patches + # when `use_abs_pos_embed` outside + self.init_input_size = input_size + if self.adap_padding: + pad_h, pad_w = self.adap_padding.get_pad_shape(input_size) + input_h, input_w = input_size + input_h = input_h + pad_h + input_w = input_w + pad_w + input_size = (input_h, input_w) + + # https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html + h_out = (input_size[0] + 2 * padding[0] - dilation[0] * + (kernel_size[0] - 1) - 1) // stride[0] + 1 + w_out = (input_size[1] + 2 * padding[1] - dilation[1] * + (kernel_size[1] - 1) - 1) // stride[1] + 1 + self.init_out_size = (h_out, w_out) + else: + self.init_input_size = None + self.init_out_size = None + + def forward(self, x): + """ + Args: + x (Tensor): Has shape (B, C, H, W). In most case, C is 3. + + Returns: + tuple: Contains merged results and its spatial shape. + + - x (Tensor): Has shape (B, out_h * out_w, embed_dims) + - out_size (tuple[int]): Spatial shape of x, arrange as + (out_h, out_w). + """ + + if self.adap_padding: + x = self.adap_padding(x) + + x = self.projection(x) + out_size = (x.shape[2], x.shape[3]) + x = x.flatten(2).transpose(1, 2) + if self.norm is not None: + x = self.norm(x) + return x, out_size + + +class PatchMerging(BaseModule): + """Merge patch feature map. + + This layer groups feature map by kernel_size, and applies norm and linear + layers to the grouped feature map. Our implementation uses `nn.Unfold` to + merge patch, which is about 25% faster than original implementation. + Instead, we need to modify pretrained models for compatibility. + + Args: + in_channels (int): The num of input channels. + out_channels (int): The num of output channels. + kernel_size (int | tuple, optional): the kernel size in the unfold + layer. Defaults to 2. + stride (int | tuple, optional): the stride of the sliding blocks in the + unfold layer. Default: None. (Would be set as `kernel_size`) + padding (int | tuple | string ): The padding length of + embedding conv. When it is a string, it means the mode + of adaptive padding, support "same" and "corner" now. + Default: "corner". + dilation (int | tuple, optional): dilation parameter in the unfold + layer. Default: 1. + bias (bool, optional): Whether to add bias in linear layer or not. + Defaults: False. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='LN'). + init_cfg (dict, optional): The extra config for initialization. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=2, + stride=None, + padding='corner', + dilation=1, + bias=False, + norm_cfg=dict(type='LN'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + if stride: + stride = stride + else: + stride = kernel_size + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + if isinstance(padding, str): + self.adap_padding = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + # disable the padding of unfold + padding = 0 + else: + self.adap_padding = None + + padding = to_2tuple(padding) + self.sampler = nn.Unfold( + kernel_size=kernel_size, + dilation=dilation, + padding=padding, + stride=stride) + + sample_dim = kernel_size[0] * kernel_size[1] * in_channels + + if norm_cfg is not None: + self.norm = build_norm_layer(norm_cfg, sample_dim)[1] + else: + self.norm = None + + self.reduction = nn.Linear(sample_dim, out_channels, bias=bias) + + def forward(self, x, input_size): + """ + Args: + x (Tensor): Has shape (B, H*W, C_in). + input_size (tuple[int]): The spatial shape of x, arrange as (H, W). + Default: None. + + Returns: + tuple: Contains merged results and its spatial shape. + + - x (Tensor): Has shape (B, Merged_H * Merged_W, C_out) + - out_size (tuple[int]): Spatial shape of x, arrange as + (Merged_H, Merged_W). + """ + B, L, C = x.shape + assert isinstance(input_size, Sequence), f'Expect ' \ + f'input_size is ' \ + f'`Sequence` ' \ + f'but get {input_size}' + + H, W = input_size + assert L == H * W, 'input feature has wrong size' + + x = x.view(B, H, W, C).permute([0, 3, 1, 2]) # B, C, H, W + # Use nn.Unfold to merge patch. About 25% faster than original method, + # but need to modify pretrained model for compatibility + + if self.adap_padding: + x = self.adap_padding(x) + H, W = x.shape[-2:] + + x = self.sampler(x) + # if kernel_size=2 and stride=2, x should has shape (B, 4*C, H/2*W/2) + + out_h = (H + 2 * self.sampler.padding[0] - self.sampler.dilation[0] * + (self.sampler.kernel_size[0] - 1) - + 1) // self.sampler.stride[0] + 1 + out_w = (W + 2 * self.sampler.padding[1] - self.sampler.dilation[1] * + (self.sampler.kernel_size[1] - 1) - + 1) // self.sampler.stride[1] + 1 + + output_size = (out_h, out_w) + x = x.transpose(1, 2) # B, H/2*W/2, 4*C + x = self.norm(x) if self.norm else x + x = self.reduction(x) + return x, output_size diff --git a/mmsegmentation/mmseg/models/utils/encoding.py b/mmsegmentation/mmseg/models/utils/encoding.py new file mode 100644 index 0000000..ee4f057 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/encoding.py @@ -0,0 +1,75 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from torch import nn +from torch.nn import functional as F + + +class Encoding(nn.Module): + """Encoding Layer: a learnable residual encoder. + + Input is of shape (batch_size, channels, height, width). + Output is of shape (batch_size, num_codes, channels). + + Args: + channels: dimension of the features or feature channels + num_codes: number of code words + """ + + def __init__(self, channels, num_codes): + super().__init__() + # init codewords and smoothing factor + self.channels, self.num_codes = channels, num_codes + std = 1. / ((num_codes * channels)**0.5) + # [num_codes, channels] + self.codewords = nn.Parameter( + torch.empty(num_codes, channels, + dtype=torch.float).uniform_(-std, std), + requires_grad=True) + # [num_codes] + self.scale = nn.Parameter( + torch.empty(num_codes, dtype=torch.float).uniform_(-1, 0), + requires_grad=True) + + @staticmethod + def scaled_l2(x, codewords, scale): + num_codes, channels = codewords.size() + batch_size = x.size(0) + reshaped_scale = scale.view((1, 1, num_codes)) + expanded_x = x.unsqueeze(2).expand( + (batch_size, x.size(1), num_codes, channels)) + reshaped_codewords = codewords.view((1, 1, num_codes, channels)) + + scaled_l2_norm = reshaped_scale * ( + expanded_x - reshaped_codewords).pow(2).sum(dim=3) + return scaled_l2_norm + + @staticmethod + def aggregate(assignment_weights, x, codewords): + num_codes, channels = codewords.size() + reshaped_codewords = codewords.view((1, 1, num_codes, channels)) + batch_size = x.size(0) + + expanded_x = x.unsqueeze(2).expand( + (batch_size, x.size(1), num_codes, channels)) + encoded_feat = (assignment_weights.unsqueeze(3) * + (expanded_x - reshaped_codewords)).sum(dim=1) + return encoded_feat + + def forward(self, x): + assert x.dim() == 4 and x.size(1) == self.channels + # [batch_size, channels, height, width] + batch_size = x.size(0) + # [batch_size, height x width, channels] + x = x.view(batch_size, self.channels, -1).transpose(1, 2).contiguous() + # assignment_weights: [batch_size, channels, num_codes] + assignment_weights = F.softmax( + self.scaled_l2(x, self.codewords, self.scale), dim=2) + # aggregate + encoded_feat = self.aggregate(assignment_weights, x, self.codewords) + return encoded_feat + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(Nx{self.channels}xHxW =>Nx{self.num_codes}' \ + f'x{self.channels})' + return repr_str diff --git a/mmsegmentation/mmseg/models/utils/inverted_residual.py b/mmsegmentation/mmseg/models/utils/inverted_residual.py new file mode 100644 index 0000000..56190b3 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/inverted_residual.py @@ -0,0 +1,213 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn import ConvModule +from torch import nn +from torch.utils import checkpoint as cp + +from .se_layer import SELayer + + +class InvertedResidual(nn.Module): + """InvertedResidual block for MobileNetV2. + + Args: + in_channels (int): The input channels of the InvertedResidual block. + out_channels (int): The output channels of the InvertedResidual block. + stride (int): Stride of the middle (first) 3x3 convolution. + expand_ratio (int): Adjusts number of channels of the hidden layer + in InvertedResidual by this amount. + dilation (int): Dilation rate of depthwise conv. Default: 1 + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + stride, + expand_ratio, + dilation=1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + with_cp=False, + **kwargs): + super().__init__() + self.stride = stride + assert stride in [1, 2], f'stride must in [1, 2]. ' \ + f'But received {stride}.' + self.with_cp = with_cp + self.use_res_connect = self.stride == 1 and in_channels == out_channels + hidden_dim = int(round(in_channels * expand_ratio)) + + layers = [] + if expand_ratio != 1: + layers.append( + ConvModule( + in_channels=in_channels, + out_channels=hidden_dim, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **kwargs)) + layers.extend([ + ConvModule( + in_channels=hidden_dim, + out_channels=hidden_dim, + kernel_size=3, + stride=stride, + padding=dilation, + dilation=dilation, + groups=hidden_dim, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **kwargs), + ConvModule( + in_channels=hidden_dim, + out_channels=out_channels, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None, + **kwargs) + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + + def _inner_forward(x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class InvertedResidualV3(nn.Module): + """Inverted Residual Block for MobileNetV3. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + mid_channels (int): The input channels of the depthwise convolution. + kernel_size (int): The kernel size of the depthwise convolution. + Default: 3. + stride (int): The stride of the depthwise convolution. Default: 1. + se_cfg (dict): Config dict for se layer. Default: None, which means no + se layer. + with_expand_conv (bool): Use expand conv or not. If set False, + mid_channels must be the same with in_channels. Default: True. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + mid_channels, + kernel_size=3, + stride=1, + se_cfg=None, + with_expand_conv=True, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + with_cp=False): + super().__init__() + self.with_res_shortcut = (stride == 1 and in_channels == out_channels) + assert stride in [1, 2] + self.with_cp = with_cp + self.with_se = se_cfg is not None + self.with_expand_conv = with_expand_conv + + if self.with_se: + assert isinstance(se_cfg, dict) + if not self.with_expand_conv: + assert mid_channels == in_channels + + if self.with_expand_conv: + self.expand_conv = ConvModule( + in_channels=in_channels, + out_channels=mid_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.depthwise_conv = ConvModule( + in_channels=mid_channels, + out_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + padding=kernel_size // 2, + groups=mid_channels, + conv_cfg=dict( + type='Conv2dAdaptivePadding') if stride == 2 else conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + if self.with_se: + self.se = SELayer(**se_cfg) + + self.linear_conv = ConvModule( + in_channels=mid_channels, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, x): + + def _inner_forward(x): + out = x + + if self.with_expand_conv: + out = self.expand_conv(out) + + out = self.depthwise_conv(out) + + if self.with_se: + out = self.se(out) + + out = self.linear_conv(out) + + if self.with_res_shortcut: + return x + out + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out diff --git a/mmsegmentation/mmseg/models/utils/make_divisible.py b/mmsegmentation/mmseg/models/utils/make_divisible.py new file mode 100644 index 0000000..ed42c2e --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/make_divisible.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +def make_divisible(value, divisor, min_value=None, min_ratio=0.9): + """Make divisible function. + + This function rounds the channel number to the nearest value that can be + divisible by the divisor. It is taken from the original tf repo. It ensures + that all layers have a channel number that is divisible by divisor. It can + be seen here: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py # noqa + + Args: + value (int): The original channel number. + divisor (int): The divisor to fully divide the channel number. + min_value (int): The minimum value of the output channel. + Default: None, means that the minimum value equal to the divisor. + min_ratio (float): The minimum ratio of the rounded channel number to + the original channel number. Default: 0.9. + + Returns: + int: The modified output channel number. + """ + + if min_value is None: + min_value = divisor + new_value = max(min_value, int(value + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than (1-min_ratio). + if new_value < min_ratio * value: + new_value += divisor + return new_value diff --git a/mmsegmentation/mmseg/models/utils/point_sample.py b/mmsegmentation/mmseg/models/utils/point_sample.py new file mode 100644 index 0000000..1afc957 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/point_sample.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.ops import point_sample +from torch import Tensor + + +def get_uncertainty(mask_preds: Tensor, labels: Tensor) -> Tensor: + """Estimate uncertainty based on pred logits. + + We estimate uncertainty as L1 distance between 0.0 and the logits + prediction in 'mask_preds' for the foreground class in `classes`. + + Args: + mask_preds (Tensor): mask predication logits, shape (num_rois, + num_classes, mask_height, mask_width). + + labels (Tensor): Either predicted or ground truth label for + each predicted mask, of length num_rois. + + Returns: + scores (Tensor): Uncertainty scores with the most uncertain + locations having the highest uncertainty score, + shape (num_rois, 1, mask_height, mask_width) + """ + if mask_preds.shape[1] == 1: + gt_class_logits = mask_preds.clone() + else: + inds = torch.arange(mask_preds.shape[0], device=mask_preds.device) + gt_class_logits = mask_preds[inds, labels].unsqueeze(1) + return -torch.abs(gt_class_logits) + + +def get_uncertain_point_coords_with_randomness( + mask_preds: Tensor, labels: Tensor, num_points: int, + oversample_ratio: float, importance_sample_ratio: float) -> Tensor: + """Get ``num_points`` most uncertain points with random points during + train. + + Sample points in [0, 1] x [0, 1] coordinate space based on their + uncertainty. The uncertainties are calculated for each point using + 'get_uncertainty()' function that takes point's logit prediction as + input. + + Args: + mask_preds (Tensor): A tensor of shape (num_rois, num_classes, + mask_height, mask_width) for class-specific or class-agnostic + prediction. + labels (Tensor): The ground truth class for each instance. + num_points (int): The number of points to sample. + oversample_ratio (float): Oversampling parameter. + importance_sample_ratio (float): Ratio of points that are sampled + via importnace sampling. + + Returns: + point_coords (Tensor): A tensor of shape (num_rois, num_points, 2) + that contains the coordinates sampled points. + """ + assert oversample_ratio >= 1 + assert 0 <= importance_sample_ratio <= 1 + batch_size = mask_preds.shape[0] + num_sampled = int(num_points * oversample_ratio) + point_coords = torch.rand( + batch_size, num_sampled, 2, device=mask_preds.device) + point_logits = point_sample(mask_preds, point_coords) + # It is crucial to calculate uncertainty based on the sampled + # prediction value for the points. Calculating uncertainties of the + # coarse predictions first and sampling them for points leads to + # incorrect results. To illustrate this: assume uncertainty func( + # logits)=-abs(logits), a sampled point between two coarse + # predictions with -1 and 1 logits has 0 logits, and therefore 0 + # uncertainty value. However, if we calculate uncertainties for the + # coarse predictions first, both will have -1 uncertainty, + # and sampled point will get -1 uncertainty. + point_uncertainties = get_uncertainty(point_logits, labels) + num_uncertain_points = int(importance_sample_ratio * num_points) + num_random_points = num_points - num_uncertain_points + idx = torch.topk( + point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1] + shift = num_sampled * torch.arange( + batch_size, dtype=torch.long, device=mask_preds.device) + idx += shift[:, None] + point_coords = point_coords.view(-1, 2)[idx.view(-1), :].view( + batch_size, num_uncertain_points, 2) + if num_random_points > 0: + rand_roi_coords = torch.rand( + batch_size, num_random_points, 2, device=mask_preds.device) + point_coords = torch.cat((point_coords, rand_roi_coords), dim=1) + return point_coords diff --git a/mmsegmentation/mmseg/models/utils/ppm.py b/mmsegmentation/mmseg/models/utils/ppm.py new file mode 100644 index 0000000..5fe6ff2 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/ppm.py @@ -0,0 +1,193 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict, List + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmengine.model import BaseModule, ModuleList, Sequential +from torch import Tensor + + +class DAPPM(BaseModule): + """DAPPM module in `DDRNet `_. + + Args: + in_channels (int): Input channels. + branch_channels (int): Branch channels. + out_channels (int): Output channels. + num_scales (int): Number of scales. + kernel_sizes (list[int]): Kernel sizes of each scale. + strides (list[int]): Strides of each scale. + paddings (list[int]): Paddings of each scale. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU', inplace=True). + conv_cfg (dict): Config dict for convolution layer in ConvModule. + Default: dict(order=('norm', 'act', 'conv'), bias=False). + upsample_mode (str): Upsample mode. Default: 'bilinear'. + """ + + def __init__(self, + in_channels: int, + branch_channels: int, + out_channels: int, + num_scales: int, + kernel_sizes: List[int] = [5, 9, 17], + strides: List[int] = [2, 4, 8], + paddings: List[int] = [2, 4, 8], + norm_cfg: Dict = dict(type='BN', momentum=0.1), + act_cfg: Dict = dict(type='ReLU', inplace=True), + conv_cfg: Dict = dict( + order=('norm', 'act', 'conv'), bias=False), + upsample_mode: str = 'bilinear'): + super().__init__() + + self.num_scales = num_scales + self.unsample_mode = upsample_mode + self.in_channels = in_channels + self.branch_channels = branch_channels + self.out_channels = out_channels + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.conv_cfg = conv_cfg + + self.scales = ModuleList([ + ConvModule( + in_channels, + branch_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg) + ]) + for i in range(1, num_scales - 1): + self.scales.append( + Sequential(*[ + nn.AvgPool2d( + kernel_size=kernel_sizes[i - 1], + stride=strides[i - 1], + padding=paddings[i - 1]), + ConvModule( + in_channels, + branch_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg) + ])) + self.scales.append( + Sequential(*[ + nn.AdaptiveAvgPool2d((1, 1)), + ConvModule( + in_channels, + branch_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg) + ])) + self.processes = ModuleList() + for i in range(num_scales - 1): + self.processes.append( + ConvModule( + branch_channels, + branch_channels, + kernel_size=3, + padding=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg)) + + self.compression = ConvModule( + branch_channels * num_scales, + out_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg) + + self.shortcut = ConvModule( + in_channels, + out_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **conv_cfg) + + def forward(self, inputs: Tensor): + feats = [] + feats.append(self.scales[0](inputs)) + + for i in range(1, self.num_scales): + feat_up = F.interpolate( + self.scales[i](inputs), + size=inputs.shape[2:], + mode=self.unsample_mode) + feats.append(self.processes[i - 1](feat_up + feats[i - 1])) + + return self.compression(torch.cat(feats, + dim=1)) + self.shortcut(inputs) + + +class PAPPM(DAPPM): + """PAPPM module in `PIDNet `_. + + Args: + in_channels (int): Input channels. + branch_channels (int): Branch channels. + out_channels (int): Output channels. + num_scales (int): Number of scales. + kernel_sizes (list[int]): Kernel sizes of each scale. + strides (list[int]): Strides of each scale. + paddings (list[int]): Paddings of each scale. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', momentum=0.1). + act_cfg (dict): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU', inplace=True). + conv_cfg (dict): Config dict for convolution layer in ConvModule. + Default: dict(order=('norm', 'act', 'conv'), bias=False). + upsample_mode (str): Upsample mode. Default: 'bilinear'. + """ + + def __init__(self, + in_channels: int, + branch_channels: int, + out_channels: int, + num_scales: int, + kernel_sizes: List[int] = [5, 9, 17], + strides: List[int] = [2, 4, 8], + paddings: List[int] = [2, 4, 8], + norm_cfg: Dict = dict(type='BN', momentum=0.1), + act_cfg: Dict = dict(type='ReLU', inplace=True), + conv_cfg: Dict = dict( + order=('norm', 'act', 'conv'), bias=False), + upsample_mode: str = 'bilinear'): + super().__init__(in_channels, branch_channels, out_channels, + num_scales, kernel_sizes, strides, paddings, norm_cfg, + act_cfg, conv_cfg, upsample_mode) + + self.processes = ConvModule( + self.branch_channels * (self.num_scales - 1), + self.branch_channels * (self.num_scales - 1), + kernel_size=3, + padding=1, + groups=self.num_scales - 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + **self.conv_cfg) + + def forward(self, inputs: Tensor): + x_ = self.scales[0](inputs) + feats = [] + for i in range(1, self.num_scales): + feat_up = F.interpolate( + self.scales[i](inputs), + size=inputs.shape[2:], + mode=self.unsample_mode, + align_corners=False) + feats.append(feat_up + x_) + scale_out = self.processes(torch.cat(feats, dim=1)) + return self.compression(torch.cat([x_, scale_out], + dim=1)) + self.shortcut(inputs) diff --git a/mmsegmentation/mmseg/models/utils/res_layer.py b/mmsegmentation/mmseg/models/utils/res_layer.py new file mode 100644 index 0000000..3dd7a6f --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/res_layer.py @@ -0,0 +1,96 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmengine.model import Sequential +from torch import nn as nn + + +class ResLayer(Sequential): + """ResLayer to build ResNet style backbone. + + Args: + block (nn.Module): block used to build ResLayer. + inplanes (int): inplanes of block. + planes (int): planes of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. Default: False + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='BN') + multi_grid (int | None): Multi grid dilation rates of last + stage. Default: None + contract_dilation (bool): Whether contract first dilation of each layer + Default: False + """ + + def __init__(self, + block, + inplanes, + planes, + num_blocks, + stride=1, + dilation=1, + avg_down=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + multi_grid=None, + contract_dilation=False, + **kwargs): + self.block = block + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = [] + conv_stride = stride + if avg_down: + conv_stride = 1 + downsample.append( + nn.AvgPool2d( + kernel_size=stride, + stride=stride, + ceil_mode=True, + count_include_pad=False)) + downsample.extend([ + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=conv_stride, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1] + ]) + downsample = nn.Sequential(*downsample) + + layers = [] + if multi_grid is None: + if dilation > 1 and contract_dilation: + first_dilation = dilation // 2 + else: + first_dilation = dilation + else: + first_dilation = multi_grid[0] + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + dilation=first_dilation, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + inplanes = planes * block.expansion + for i in range(1, num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=1, + dilation=dilation if multi_grid is None else multi_grid[i], + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + super().__init__(*layers) diff --git a/mmsegmentation/mmseg/models/utils/san_layers.py b/mmsegmentation/mmseg/models/utils/san_layers.py new file mode 100644 index 0000000..2267686 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/san_layers.py @@ -0,0 +1,418 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Modified from https://github.com/MendelXu/SAN/blob/main/san/model/attn_helper.py # noqa: E501 +# Copyright (c) 2023 MendelXu. +# Licensed under the MIT License + +import warnings +from typing import Optional + +import torch +from mmcv.cnn.bricks.transformer import BaseTransformerLayer +from torch import Tensor, nn +from torch.nn import functional as F + + +def cross_attn_with_self_bias( + query: Tensor, + key: Tensor, + value: Tensor, + embed_dim_to_check: int, + num_heads: int, + in_proj_weight: Tensor, + in_proj_bias: Tensor, + bias_k: Optional[Tensor], + bias_v: Optional[Tensor], + add_zero_attn: bool, + dropout_p: float, + out_proj_weight: Tensor, + out_proj_bias: Tensor, + training: bool = True, + key_padding_mask: Optional[Tensor] = None, + need_weights: bool = True, + attn_mask: Optional[Tensor] = None, + use_separate_proj_weight: bool = False, + q_proj_weight: Optional[Tensor] = None, + k_proj_weight: Optional[Tensor] = None, + v_proj_weight: Optional[Tensor] = None, + static_k: Optional[Tensor] = None, + static_v: Optional[Tensor] = None, +): + """Forward function of multi-head attention. Modified from + multi_head_attention_forward in + https://github.com/pytorch/pytorch/blob/main/torch/nn/functional.py. + + Args: + query, key, value: map a query and a set of key-value pairs to an output. + See "Attention Is All You Need" for more details. + embed_dim_to_check: total dimension of the model. + num_heads: parallel attention heads. + in_proj_weight, in_proj_bias: input projection weight and bias. + bias_k, bias_v: bias of the key and value sequences to be added at dim=0. + add_zero_attn: add a new batch of zeros to the key and + value sequences at dim=1. + dropout_p: probability of an element to be zeroed. + out_proj_weight, out_proj_bias: the output projection weight and bias. + training: apply dropout if is ``True``. + key_padding_mask: if provided, specified padding elements in the key will + be ignored by the attention. This is an binary mask. When the value is True, + the corresponding value on the attention layer will be filled with -inf. + need_weights: output attn_output_weights. + Default: `True` + Note: `needs_weight` defaults to `True`, but should be set to `False` + For best performance when attention weights are not needed. + *Setting needs_weights to `True` + leads to a significant performance degradation.* + attn_mask: 2D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all + the batches while a 3D mask allows to specify a different mask for the entries of each batch. + use_separate_proj_weight: the function accept the proj. weights for query, key, + and value in different forms. If false, in_proj_weight will be used, which is + a combination of q_proj_weight, k_proj_weight, v_proj_weight. + q_proj_weight, k_proj_weight, v_proj_weight, in_proj_bias: input projection weight and bias. + static_k, static_v: static key and value used for attention operators. + """ # noqa: E501 + tgt_len, bsz, embed_dim = query.size() + assert embed_dim == embed_dim_to_check + # allow MHA to have different sizes for the feature dimension + assert key.size(0) == value.size(0) and key.size(1) == value.size(1) + + head_dim = embed_dim // num_heads + assert head_dim * num_heads == embed_dim, \ + 'embed_dim must be divisible by num_heads' + scaling = float(head_dim)**-0.5 + + if not use_separate_proj_weight: + if (query is key or torch.equal( + query, key)) and (key is value or torch.equal(key, value)): + # self-attention + raise NotImplementedError('self-attention is not implemented') + + elif key is value or torch.equal(key, value): + # encoder-decoder attention + # This is inline in_proj function + # with in_proj_weight and in_proj_bias + _b = in_proj_bias + _start = 0 + _end = embed_dim + _w = in_proj_weight[_start:_end, :] + if _b is not None: + _b = _b[_start:_end] + q = F.linear(query, _w, _b) + + if key is None: + assert value is None + k = None + v = None + q_k = None + q_v = None + else: + # This is inline in_proj function with + # in_proj_weight and in_proj_bias + _b = in_proj_bias + _start = embed_dim + _end = None + _w = in_proj_weight[_start:, :] + if _b is not None: + _b = _b[_start:] + k, v = F.linear(key, _w, _b).chunk(2, dim=-1) + q_k, q_v = F.linear(query, _w, _b).chunk(2, dim=-1) + else: + # This is inline in_proj function with + # in_proj_weight and in_proj_bias + _b = in_proj_bias + _start = 0 + _end = embed_dim + _w = in_proj_weight[_start:_end, :] + if _b is not None: + _b = _b[_start:_end] + q = F.linear(query, _w, _b) + + # This is inline in_proj function with + # in_proj_weight and in_proj_bias + _b = in_proj_bias + _start = embed_dim + _end = embed_dim * 2 + _w = in_proj_weight[_start:_end, :] + if _b is not None: + _b = _b[_start:_end] + k = F.linear(key, _w, _b) + q_k = F.linear(query, _w, _b) + # This is inline in_proj function with + # in_proj_weight and in_proj_bias + _b = in_proj_bias + _start = embed_dim * 2 + _end = None + _w = in_proj_weight[_start:, :] + if _b is not None: + _b = _b[_start:] + v = F.linear(value, _w, _b) + q_v = F.linear(query, _w, _b) + else: + q_proj_weight_non_opt = \ + torch.jit._unwrap_optional(q_proj_weight) + len1, len2 = q_proj_weight_non_opt.size() + assert len1 == embed_dim and len2 == query.size(-1) + + k_proj_weight_non_opt = \ + torch.jit._unwrap_optional(k_proj_weight) + len1, len2 = k_proj_weight_non_opt.size() + assert len1 == embed_dim and len2 == key.size(-1) + + v_proj_weight_non_opt = \ + torch.jit._unwrap_optional(v_proj_weight) + len1, len2 = v_proj_weight_non_opt.size() + assert len1 == embed_dim and len2 == value.size(-1) + + if in_proj_bias is not None: + q = F.linear(query, q_proj_weight_non_opt, + in_proj_bias[0:embed_dim]) + k = F.linear(key, k_proj_weight_non_opt, + in_proj_bias[embed_dim:(embed_dim * 2)]) + v = F.linear(value, v_proj_weight_non_opt, + in_proj_bias[(embed_dim * 2):]) + else: + q = F.linear(query, q_proj_weight_non_opt, in_proj_bias) + k = F.linear(key, k_proj_weight_non_opt, in_proj_bias) + v = F.linear(value, v_proj_weight_non_opt, in_proj_bias) + q = q * scaling + + if attn_mask is not None: + assert ( + attn_mask.dtype == torch.float32 + or attn_mask.dtype == torch.float64 + or attn_mask.dtype == torch.float16 + or attn_mask.dtype == torch.uint8 or attn_mask.dtype == torch.bool + ), 'Only float, byte, and bool types are supported for ' \ + 'attn_mask, not {}'.format(attn_mask.dtype) + if attn_mask.dtype == torch.uint8: + warnings.warn('Byte tensor for attn_mask in nn.MultiheadAttention ' + 'is deprecated. Use bool tensor instead.') + attn_mask = attn_mask.to(torch.bool) + + if attn_mask.dim() == 2: + attn_mask = attn_mask.unsqueeze(0) + if list(attn_mask.size()) != [1, query.size(0), key.size(0)]: + raise RuntimeError( + 'The size of the 2D attn_mask is not correct.') + elif attn_mask.dim() == 3: + if list(attn_mask.size()) != [ + bsz * num_heads, + query.size(0), key.size(0) + ]: + raise RuntimeError( + 'The size of the 3D attn_mask is not correct.') + else: + raise RuntimeError( + "attn_mask's dimension {} is not supported".format( + attn_mask.dim())) + # attn_mask's dim is 3 now. + + # convert ByteTensor key_padding_mask to bool + if key_padding_mask is not None and key_padding_mask.dtype == torch.uint8: + warnings.warn( + 'Byte tensor for key_padding_mask in nn.MultiheadAttention ' + 'is deprecated. Use bool tensor instead.') + key_padding_mask = key_padding_mask.to(torch.bool) + + if bias_k is not None and bias_v is not None: + if static_k is None and static_v is None: + k = torch.cat([k, bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = F.pad(attn_mask, (0, 1)) + if key_padding_mask is not None: + key_padding_mask = F.pad(key_padding_mask, (0, 1)) + else: + assert static_k is None, 'bias cannot be added to static key.' + assert static_v is None, 'bias cannot be added to static value.' + else: + assert bias_k is None + assert bias_v is None + + q = q.contiguous().view(tgt_len, bsz * num_heads, head_dim).transpose(0, 1) + if k is not None: + k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1) + q_k = q_k.contiguous().view(tgt_len, bsz * num_heads, + head_dim).transpose(0, 1) + if v is not None: + v = v.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1) + q_v = q_v.contiguous().view(tgt_len, bsz * num_heads, + head_dim).transpose(0, 1) + + if static_k is not None: + assert static_k.size(0) == bsz * num_heads + assert static_k.size(2) == head_dim + k = static_k + + if static_v is not None: + assert static_v.size(0) == bsz * num_heads + assert static_v.size(2) == head_dim + v = static_v + + src_len = k.size(1) + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if add_zero_attn: + src_len += 1 + k = torch.cat( + [ + k, + torch.zeros( + (k.size(0), 1) + k.size()[2:], + dtype=k.dtype, + device=k.device), + ], + dim=1, + ) + v = torch.cat( + [ + v, + torch.zeros( + (v.size(0), 1) + v.size()[2:], + dtype=v.dtype, + device=v.device), + ], + dim=1, + ) + if attn_mask is not None: + attn_mask = F.pad(attn_mask, (0, 1)) + if key_padding_mask is not None: + key_padding_mask = F.pad(key_padding_mask, (0, 1)) + + attn_output_weights = torch.bmm(q, k.transpose(1, 2)) + assert list( + attn_output_weights.size()) == [bsz * num_heads, tgt_len, src_len] + + if attn_mask is not None: + if attn_mask.dtype == torch.bool: + attn_output_weights.masked_fill_(attn_mask, float('-inf')) + else: + attn_output_weights += attn_mask + + if key_padding_mask is not None: + attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, + src_len) + attn_output_weights = attn_output_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2), + float('-inf'), + ) + attn_output_weights = attn_output_weights.view(bsz * num_heads, + tgt_len, src_len) + # attn_out_weights: [bsz * num_heads, tgt_len, src_len] + # ->[bsz * num_heads, tgt_len, src_len+1] + self_weight = (q * q_k).sum( + dim=-1, keepdim=True) # [bsz * num_heads, tgt_len, 1] + total_attn_output_weights = torch.cat([attn_output_weights, self_weight], + dim=-1) + total_attn_output_weights = F.softmax(total_attn_output_weights, dim=-1) + total_attn_output_weights = F.dropout( + total_attn_output_weights, p=dropout_p, training=training) + attn_output_weights = \ + total_attn_output_weights[:, :, : -1] + # [bsz * num_heads, tgt_len, src_len] + self_weight = \ + total_attn_output_weights[:, :, -1:] # [bsz * num_heads, tgt_len, 1] + + attn_output = torch.bmm(attn_output_weights, + v) # [bsz * num_heads, tgt_len, head_dim] + attn_output = (attn_output + self_weight * q_v + ) # [bsz * num_heads, tgt_len, head_dim] + assert list(attn_output.size()) == [bsz * num_heads, tgt_len, head_dim] + attn_output = attn_output.transpose(0, 1).contiguous().view( + tgt_len, bsz, embed_dim) + attn_output = F.linear(attn_output, out_proj_weight, out_proj_bias) + + if need_weights: + # average attention weights over heads + attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, + src_len) + return attn_output, attn_output_weights # .sum(dim=1) / num_heads + else: + return attn_output, None + + +def cross_attn_layer(tf_layer: BaseTransformerLayer, x, mem, attn_bias): + """Implementation of transformer layer with cross attention. The cross + attention shares the embedding weights with self-attention of tf_layer. + Args: + tf_layer: (TransformerEncoderLayer): The Module of transformer layer. + x (Tensor): query [K,N,C] + mem (Tensor): key and value [L,N,C] + attn_bias (Tensor): attention bias [N*num_head,K,L] + + Return: + x (Tensor): cross attention output [K,N,C] + """ + self_attn_layer = tf_layer.attentions[0].attn + attn_layer_paras = { + 'embed_dim_to_check': self_attn_layer.embed_dim, + 'num_heads': self_attn_layer.num_heads, + 'in_proj_weight': self_attn_layer.in_proj_weight, + 'in_proj_bias': self_attn_layer.in_proj_bias, + 'bias_k': self_attn_layer.bias_k, + 'bias_v': self_attn_layer.bias_v, + 'add_zero_attn': self_attn_layer.add_zero_attn, + 'dropout_p': self_attn_layer.dropout, + 'out_proj_weight': self_attn_layer.out_proj.weight, + 'out_proj_bias': self_attn_layer.out_proj.bias, + 'training': self_attn_layer.training + } + + q_x = tf_layer.norms[0](x) + k_x = v_x = tf_layer.norms[0](mem) + x = x + cross_attn_with_self_bias( + q_x, + k_x, + v_x, + attn_mask=attn_bias, + need_weights=False, + **attn_layer_paras)[0] + x = tf_layer.ffns[0](tf_layer.norms[1](x), identity=x) + return x + + +class LayerNorm2d(nn.Module): + """A LayerNorm variant, popularized by Transformers, that performs point- + wise mean and variance normalization over the channel dimension for inputs + that have shape (batch_size, channels, height, width). + + https://github.com/facebookresearch/ConvNeXt/blob/d1fa8f6fef0a165b27399986cc2bdacc92777e40/models/convnext.py#L119 # noqa B950 + """ + + def __init__(self, normalized_shape, eps=1e-6): + super().__init__() + self.weight = nn.Parameter(torch.ones(normalized_shape)) + self.bias = nn.Parameter(torch.zeros(normalized_shape)) + self.eps = eps + self.normalized_shape = (normalized_shape, ) + + def forward(self, x: torch.Tensor): + u = x.mean(1, keepdim=True) + s = (x - u).pow(2).mean(1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.eps) + x = self.weight[:, None, None] * x + self.bias[:, None, None] + return x + + +class MLP(nn.Module): + """Very simple multi-layer perceptron (also called FFN)""" + + def __init__(self, + input_dim, + hidden_dim, + output_dim, + num_layers, + affine_func=nn.Linear): + super().__init__() + self.num_layers = num_layers + h = [hidden_dim] * (num_layers - 1) + self.layers = nn.ModuleList( + affine_func(n, k) + for n, k in zip([input_dim] + h, h + [output_dim])) + + def forward(self, x: torch.Tensor): + for i, layer in enumerate(self.layers): + x = F.relu(layer(x)) if i < self.num_layers - 1 else layer(x) + return x diff --git a/mmsegmentation/mmseg/models/utils/se_layer.py b/mmsegmentation/mmseg/models/utils/se_layer.py new file mode 100644 index 0000000..0ff632c --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/se_layer.py @@ -0,0 +1,58 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmengine.utils import is_tuple_of + +from .make_divisible import make_divisible + + +class SELayer(nn.Module): + """Squeeze-and-Excitation Module. + + Args: + channels (int): The input (and output) channels of the SE layer. + ratio (int): Squeeze ratio in SELayer, the intermediate channel will be + ``int(channels/ratio)``. Default: 16. + conv_cfg (None or dict): Config dict for convolution layer. + Default: None, which means using conv2d. + act_cfg (dict or Sequence[dict]): Config dict for activation layer. + If act_cfg is a dict, two activation layers will be configured + by this dict. If act_cfg is a sequence of dicts, the first + activation layer will be configured by the first dict and the + second activation layer will be configured by the second dict. + Default: (dict(type='ReLU'), dict(type='HSigmoid', bias=3.0, + divisor=6.0)). + """ + + def __init__(self, + channels, + ratio=16, + conv_cfg=None, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))): + super().__init__() + if isinstance(act_cfg, dict): + act_cfg = (act_cfg, act_cfg) + assert len(act_cfg) == 2 + assert is_tuple_of(act_cfg, dict) + self.global_avgpool = nn.AdaptiveAvgPool2d(1) + self.conv1 = ConvModule( + in_channels=channels, + out_channels=make_divisible(channels // ratio, 8), + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[0]) + self.conv2 = ConvModule( + in_channels=make_divisible(channels // ratio, 8), + out_channels=channels, + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[1]) + + def forward(self, x): + out = self.global_avgpool(x) + out = self.conv1(out) + out = self.conv2(out) + return x * out diff --git a/mmsegmentation/mmseg/models/utils/self_attention_block.py b/mmsegmentation/mmseg/models/utils/self_attention_block.py new file mode 100644 index 0000000..5bb6e82 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/self_attention_block.py @@ -0,0 +1,161 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.cnn import ConvModule +from mmengine.model.weight_init import constant_init +from torch import nn as nn +from torch.nn import functional as F + + +class SelfAttentionBlock(nn.Module): + """General self-attention block/non-local block. + + Please refer to https://arxiv.org/abs/1706.03762 for details about key, + query and value. + + Args: + key_in_channels (int): Input channels of key feature. + query_in_channels (int): Input channels of query feature. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + share_key_query (bool): Whether share projection weight between key + and query projection. + query_downsample (nn.Module): Query downsample module. + key_downsample (nn.Module): Key downsample module. + key_query_num_convs (int): Number of convs for key/query projection. + value_num_convs (int): Number of convs for value projection. + matmul_norm (bool): Whether normalize attention map with sqrt of + channels + with_out (bool): Whether use out projection. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, key_in_channels, query_in_channels, channels, + out_channels, share_key_query, query_downsample, + key_downsample, key_query_num_convs, value_out_num_convs, + key_query_norm, value_out_norm, matmul_norm, with_out, + conv_cfg, norm_cfg, act_cfg): + super().__init__() + if share_key_query: + assert key_in_channels == query_in_channels + self.key_in_channels = key_in_channels + self.query_in_channels = query_in_channels + self.out_channels = out_channels + self.channels = channels + self.share_key_query = share_key_query + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.key_project = self.build_project( + key_in_channels, + channels, + num_convs=key_query_num_convs, + use_conv_module=key_query_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if share_key_query: + self.query_project = self.key_project + else: + self.query_project = self.build_project( + query_in_channels, + channels, + num_convs=key_query_num_convs, + use_conv_module=key_query_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.value_project = self.build_project( + key_in_channels, + channels if with_out else out_channels, + num_convs=value_out_num_convs, + use_conv_module=value_out_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if with_out: + self.out_project = self.build_project( + channels, + out_channels, + num_convs=value_out_num_convs, + use_conv_module=value_out_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + else: + self.out_project = None + + self.query_downsample = query_downsample + self.key_downsample = key_downsample + self.matmul_norm = matmul_norm + + self.init_weights() + + def init_weights(self): + """Initialize weight of later layer.""" + if self.out_project is not None: + if not isinstance(self.out_project, ConvModule): + constant_init(self.out_project, 0) + + def build_project(self, in_channels, channels, num_convs, use_conv_module, + conv_cfg, norm_cfg, act_cfg): + """Build projection layer for key/query/value/out.""" + if use_conv_module: + convs = [ + ConvModule( + in_channels, + channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + ] + for _ in range(num_convs - 1): + convs.append( + ConvModule( + channels, + channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + else: + convs = [nn.Conv2d(in_channels, channels, 1)] + for _ in range(num_convs - 1): + convs.append(nn.Conv2d(channels, channels, 1)) + if len(convs) > 1: + convs = nn.Sequential(*convs) + else: + convs = convs[0] + return convs + + def forward(self, query_feats, key_feats): + """Forward function.""" + batch_size = query_feats.size(0) + query = self.query_project(query_feats) + if self.query_downsample is not None: + query = self.query_downsample(query) + query = query.reshape(*query.shape[:2], -1) + query = query.permute(0, 2, 1).contiguous() + + key = self.key_project(key_feats) + value = self.value_project(key_feats) + if self.key_downsample is not None: + key = self.key_downsample(key) + value = self.key_downsample(value) + key = key.reshape(*key.shape[:2], -1) + value = value.reshape(*value.shape[:2], -1) + value = value.permute(0, 2, 1).contiguous() + + sim_map = torch.matmul(query, key) + if self.matmul_norm: + sim_map = (self.channels**-.5) * sim_map + sim_map = F.softmax(sim_map, dim=-1) + + context = torch.matmul(sim_map, value) + context = context.permute(0, 2, 1).contiguous() + context = context.reshape(batch_size, -1, *query_feats.shape[2:]) + if self.out_project is not None: + context = self.out_project(context) + return context diff --git a/mmsegmentation/mmseg/models/utils/shape_convert.py b/mmsegmentation/mmseg/models/utils/shape_convert.py new file mode 100644 index 0000000..cce1e22 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/shape_convert.py @@ -0,0 +1,107 @@ +# Copyright (c) OpenMMLab. All rights reserved. +def nlc_to_nchw(x, hw_shape): + """Convert [N, L, C] shape tensor to [N, C, H, W] shape tensor. + + Args: + x (Tensor): The input tensor of shape [N, L, C] before conversion. + hw_shape (Sequence[int]): The height and width of output feature map. + + Returns: + Tensor: The output tensor of shape [N, C, H, W] after conversion. + """ + H, W = hw_shape + assert len(x.shape) == 3 + B, L, C = x.shape + assert L == H * W, 'The seq_len doesn\'t match H, W' + return x.transpose(1, 2).reshape(B, C, H, W) + + +def nchw_to_nlc(x): + """Flatten [N, C, H, W] shape tensor to [N, L, C] shape tensor. + + Args: + x (Tensor): The input tensor of shape [N, C, H, W] before conversion. + + Returns: + Tensor: The output tensor of shape [N, L, C] after conversion. + """ + assert len(x.shape) == 4 + return x.flatten(2).transpose(1, 2).contiguous() + + +def nchw2nlc2nchw(module, x, contiguous=False, **kwargs): + """Flatten [N, C, H, W] shape tensor `x` to [N, L, C] shape tensor. Use the + reshaped tensor as the input of `module`, and the convert the output of + `module`, whose shape is. + + [N, L, C], to [N, C, H, W]. + + Args: + module (Callable): A callable object the takes a tensor + with shape [N, L, C] as input. + x (Tensor): The input tensor of shape [N, C, H, W]. + contiguous: + contiguous (Bool): Whether to make the tensor contiguous + after each shape transform. + + Returns: + Tensor: The output tensor of shape [N, C, H, W]. + + Example: + >>> import torch + >>> import torch.nn as nn + >>> norm = nn.LayerNorm(4) + >>> feature_map = torch.rand(4, 4, 5, 5) + >>> output = nchw2nlc2nchw(norm, feature_map) + """ + B, C, H, W = x.shape + if not contiguous: + x = x.flatten(2).transpose(1, 2) + x = module(x, **kwargs) + x = x.transpose(1, 2).reshape(B, C, H, W) + else: + x = x.flatten(2).transpose(1, 2).contiguous() + x = module(x, **kwargs) + x = x.transpose(1, 2).reshape(B, C, H, W).contiguous() + return x + + +def nlc2nchw2nlc(module, x, hw_shape, contiguous=False, **kwargs): + """Convert [N, L, C] shape tensor `x` to [N, C, H, W] shape tensor. Use the + reshaped tensor as the input of `module`, and convert the output of + `module`, whose shape is. + + [N, C, H, W], to [N, L, C]. + + Args: + module (Callable): A callable object the takes a tensor + with shape [N, C, H, W] as input. + x (Tensor): The input tensor of shape [N, L, C]. + hw_shape: (Sequence[int]): The height and width of the + feature map with shape [N, C, H, W]. + contiguous (Bool): Whether to make the tensor contiguous + after each shape transform. + + Returns: + Tensor: The output tensor of shape [N, L, C]. + + Example: + >>> import torch + >>> import torch.nn as nn + >>> conv = nn.Conv2d(16, 16, 3, 1, 1) + >>> feature_map = torch.rand(4, 25, 16) + >>> output = nlc2nchw2nlc(conv, feature_map, (5, 5)) + """ + H, W = hw_shape + assert len(x.shape) == 3 + B, L, C = x.shape + assert L == H * W, 'The seq_len doesn\'t match H, W' + if not contiguous: + x = x.transpose(1, 2).reshape(B, C, H, W) + x = module(x, **kwargs) + x = x.flatten(2).transpose(1, 2) + else: + x = x.transpose(1, 2).reshape(B, C, H, W).contiguous() + x = module(x, **kwargs) + x = x.flatten(2).transpose(1, 2).contiguous() + return x diff --git a/mmsegmentation/mmseg/models/utils/up_conv_block.py b/mmsegmentation/mmseg/models/utils/up_conv_block.py new file mode 100644 index 0000000..4fa3b59 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/up_conv_block.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, build_upsample_layer + + +class UpConvBlock(nn.Module): + """Upsample convolution block in decoder for UNet. + + This upsample convolution block consists of one upsample module + followed by one convolution block. The upsample module expands the + high-level low-resolution feature map and the convolution block fuses + the upsampled high-level low-resolution feature map and the low-level + high-resolution feature map from encoder. + + Args: + conv_block (nn.Sequential): Sequential of convolutional layers. + in_channels (int): Number of input channels of the high-level + skip_channels (int): Number of input channels of the low-level + high-resolution feature map from encoder. + out_channels (int): Number of output channels. + num_convs (int): Number of convolutional layers in the conv_block. + Default: 2. + stride (int): Stride of convolutional layer in conv_block. Default: 1. + dilation (int): Dilation rate of convolutional layer in conv_block. + Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + upsample_cfg (dict): The upsample config of the upsample module in + decoder. Default: dict(type='InterpConv'). If the size of + high-level feature map is the same as that of skip feature map + (low-level feature map from encoder), it does not need upsample the + high-level feature map and the upsample_cfg is None. + dcn (bool): Use deformable convolution in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + """ + + def __init__(self, + conv_block, + in_channels, + skip_channels, + out_channels, + num_convs=2, + stride=1, + dilation=1, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + dcn=None, + plugins=None): + super().__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.conv_block = conv_block( + in_channels=2 * skip_channels, + out_channels=out_channels, + num_convs=num_convs, + stride=stride, + dilation=dilation, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + dcn=None, + plugins=None) + if upsample_cfg is not None: + self.upsample = build_upsample_layer( + cfg=upsample_cfg, + in_channels=in_channels, + out_channels=skip_channels, + with_cp=with_cp, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + else: + self.upsample = ConvModule( + in_channels, + skip_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, skip, x): + """Forward function.""" + + x = self.upsample(x) + out = torch.cat([skip, x], dim=1) + out = self.conv_block(out) + + return out diff --git a/mmsegmentation/mmseg/models/utils/wrappers.py b/mmsegmentation/mmseg/models/utils/wrappers.py new file mode 100644 index 0000000..abbd0c0 --- /dev/null +++ b/mmsegmentation/mmseg/models/utils/wrappers.py @@ -0,0 +1,51 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +import torch.nn.functional as F + + +def resize(input, + size=None, + scale_factor=None, + mode='nearest', + align_corners=None, + warning=True): + if warning: + if size is not None and align_corners: + input_h, input_w = tuple(int(x) for x in input.shape[2:]) + output_h, output_w = tuple(int(x) for x in size) + if output_h > input_h or output_w > output_h: + if ((output_h > 1 and output_w > 1 and input_h > 1 + and input_w > 1) and (output_h - 1) % (input_h - 1) + and (output_w - 1) % (input_w - 1)): + warnings.warn( + f'When align_corners={align_corners}, ' + 'the output would more aligned if ' + f'input size {(input_h, input_w)} is `x+1` and ' + f'out size {(output_h, output_w)} is `nx+1`') + return F.interpolate(input, size, scale_factor, mode, align_corners) + + +class Upsample(nn.Module): + + def __init__(self, + size=None, + scale_factor=None, + mode='nearest', + align_corners=None): + super().__init__() + self.size = size + if isinstance(scale_factor, tuple): + self.scale_factor = tuple(float(factor) for factor in scale_factor) + else: + self.scale_factor = float(scale_factor) if scale_factor else None + self.mode = mode + self.align_corners = align_corners + + def forward(self, x): + if not self.size: + size = [int(t * self.scale_factor) for t in x.shape[-2:]] + else: + size = self.size + return resize(x, size, None, self.mode, self.align_corners) diff --git a/mmsegmentation/mmseg/registry/__init__.py b/mmsegmentation/mmseg/registry/__init__.py new file mode 100644 index 0000000..ee514d1 --- /dev/null +++ b/mmsegmentation/mmseg/registry/__init__.py @@ -0,0 +1,15 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .registry import (DATA_SAMPLERS, DATASETS, EVALUATOR, HOOKS, INFERENCERS, + LOG_PROCESSORS, LOOPS, METRICS, MODEL_WRAPPERS, MODELS, + OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS, OPTIMIZERS, + PARAM_SCHEDULERS, RUNNER_CONSTRUCTORS, RUNNERS, + TASK_UTILS, TRANSFORMS, VISBACKENDS, VISUALIZERS, + WEIGHT_INITIALIZERS) + +__all__ = [ + 'HOOKS', 'DATASETS', 'DATA_SAMPLERS', 'TRANSFORMS', 'MODELS', + 'WEIGHT_INITIALIZERS', 'OPTIMIZERS', 'OPTIM_WRAPPER_CONSTRUCTORS', + 'TASK_UTILS', 'PARAM_SCHEDULERS', 'METRICS', 'MODEL_WRAPPERS', + 'VISBACKENDS', 'VISUALIZERS', 'RUNNERS', 'RUNNER_CONSTRUCTORS', 'LOOPS', + 'EVALUATOR', 'LOG_PROCESSORS', 'OPTIM_WRAPPERS', 'INFERENCERS' +] diff --git a/mmsegmentation/mmseg/registry/registry.py b/mmsegmentation/mmseg/registry/registry.py new file mode 100644 index 0000000..37b6a77 --- /dev/null +++ b/mmsegmentation/mmseg/registry/registry.py @@ -0,0 +1,118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""MMSegmentation provides 21 registry nodes to support using modules across +projects. Each node is a child of the root registry in MMEngine. + +More details can be found at +https://mmengine.readthedocs.io/en/latest/advanced_tutorials/registry.html. +""" + +from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS +from mmengine.registry import DATASETS as MMENGINE_DATASETS +from mmengine.registry import EVALUATOR as MMENGINE_EVALUATOR +from mmengine.registry import HOOKS as MMENGINE_HOOKS +from mmengine.registry import INFERENCERS as MMENGINE_INFERENCERS +from mmengine.registry import LOG_PROCESSORS as MMENGINE_LOG_PROCESSORS +from mmengine.registry import LOOPS as MMENGINE_LOOPS +from mmengine.registry import METRICS as MMENGINE_METRICS +from mmengine.registry import MODEL_WRAPPERS as MMENGINE_MODEL_WRAPPERS +from mmengine.registry import MODELS as MMENGINE_MODELS +from mmengine.registry import \ + OPTIM_WRAPPER_CONSTRUCTORS as MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS +from mmengine.registry import OPTIM_WRAPPERS as MMENGINE_OPTIM_WRAPPERS +from mmengine.registry import OPTIMIZERS as MMENGINE_OPTIMIZERS +from mmengine.registry import PARAM_SCHEDULERS as MMENGINE_PARAM_SCHEDULERS +from mmengine.registry import \ + RUNNER_CONSTRUCTORS as MMENGINE_RUNNER_CONSTRUCTORS +from mmengine.registry import RUNNERS as MMENGINE_RUNNERS +from mmengine.registry import TASK_UTILS as MMENGINE_TASK_UTILS +from mmengine.registry import TRANSFORMS as MMENGINE_TRANSFORMS +from mmengine.registry import VISBACKENDS as MMENGINE_VISBACKENDS +from mmengine.registry import VISUALIZERS as MMENGINE_VISUALIZERS +from mmengine.registry import \ + WEIGHT_INITIALIZERS as MMENGINE_WEIGHT_INITIALIZERS +from mmengine.registry import Registry + +# manage all kinds of runners like `EpochBasedRunner` and `IterBasedRunner` +RUNNERS = Registry('runner', parent=MMENGINE_RUNNERS) +# manage runner constructors that define how to initialize runners +RUNNER_CONSTRUCTORS = Registry( + 'runner constructor', parent=MMENGINE_RUNNER_CONSTRUCTORS) +# manage all kinds of loops like `EpochBasedTrainLoop` +LOOPS = Registry('loop', parent=MMENGINE_LOOPS) +# manage all kinds of hooks like `CheckpointHook` +HOOKS = Registry( + 'hook', parent=MMENGINE_HOOKS, locations=['mmseg.engine.hooks']) + +# manage data-related modules +DATASETS = Registry( + 'dataset', parent=MMENGINE_DATASETS, locations=['mmseg.datasets']) +DATA_SAMPLERS = Registry('data sampler', parent=MMENGINE_DATA_SAMPLERS) +TRANSFORMS = Registry( + 'transform', + parent=MMENGINE_TRANSFORMS, + locations=['mmseg.datasets.transforms']) + +# mangage all kinds of modules inheriting `nn.Module` +MODELS = Registry('model', parent=MMENGINE_MODELS, locations=['mmseg.models']) +# mangage all kinds of model wrappers like 'MMDistributedDataParallel' +MODEL_WRAPPERS = Registry( + 'model_wrapper', + parent=MMENGINE_MODEL_WRAPPERS, + locations=['mmseg.models']) +# mangage all kinds of weight initialization modules like `Uniform` +WEIGHT_INITIALIZERS = Registry( + 'weight initializer', + parent=MMENGINE_WEIGHT_INITIALIZERS, + locations=['mmseg.models']) + +# mangage all kinds of optimizers like `SGD` and `Adam` +OPTIMIZERS = Registry( + 'optimizer', + parent=MMENGINE_OPTIMIZERS, + locations=['mmseg.engine.optimizers']) +# manage optimizer wrapper +OPTIM_WRAPPERS = Registry( + 'optim_wrapper', + parent=MMENGINE_OPTIM_WRAPPERS, + locations=['mmseg.engine.optimizers']) +# manage constructors that customize the optimization hyperparameters. +OPTIM_WRAPPER_CONSTRUCTORS = Registry( + 'optimizer wrapper constructor', + parent=MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS, + locations=['mmseg.engine.optimizers']) +# mangage all kinds of parameter schedulers like `MultiStepLR` +PARAM_SCHEDULERS = Registry( + 'parameter scheduler', + parent=MMENGINE_PARAM_SCHEDULERS, + locations=['mmseg.engine.schedulers']) + +# manage all kinds of metrics +METRICS = Registry( + 'metric', parent=MMENGINE_METRICS, locations=['mmseg.evaluation']) +# manage evaluator +EVALUATOR = Registry( + 'evaluator', parent=MMENGINE_EVALUATOR, locations=['mmseg.evaluation']) + +# manage task-specific modules like ohem pixel sampler +TASK_UTILS = Registry( + 'task util', parent=MMENGINE_TASK_UTILS, locations=['mmseg.models']) + +# manage visualizer +VISUALIZERS = Registry( + 'visualizer', + parent=MMENGINE_VISUALIZERS, + locations=['mmseg.visualization']) +# manage visualizer backend +VISBACKENDS = Registry( + 'vis_backend', + parent=MMENGINE_VISBACKENDS, + locations=['mmseg.visualization']) + +# manage logprocessor +LOG_PROCESSORS = Registry( + 'log_processor', + parent=MMENGINE_LOG_PROCESSORS, + locations=['mmseg.visualization']) + +# manage inferencer +INFERENCERS = Registry('inferencer', parent=MMENGINE_INFERENCERS) diff --git a/mmsegmentation/mmseg/structures/__init__.py b/mmsegmentation/mmseg/structures/__init__.py new file mode 100644 index 0000000..63d118d --- /dev/null +++ b/mmsegmentation/mmseg/structures/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .sampler import BasePixelSampler, OHEMPixelSampler, build_pixel_sampler +from .seg_data_sample import SegDataSample + +__all__ = [ + 'SegDataSample', 'BasePixelSampler', 'OHEMPixelSampler', + 'build_pixel_sampler' +] diff --git a/mmsegmentation/mmseg/structures/sampler/__init__.py b/mmsegmentation/mmseg/structures/sampler/__init__.py new file mode 100644 index 0000000..91d762d --- /dev/null +++ b/mmsegmentation/mmseg/structures/sampler/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_pixel_sampler import BasePixelSampler +from .builder import build_pixel_sampler +from .ohem_pixel_sampler import OHEMPixelSampler + +__all__ = ['build_pixel_sampler', 'BasePixelSampler', 'OHEMPixelSampler'] diff --git a/mmsegmentation/mmseg/structures/sampler/base_pixel_sampler.py b/mmsegmentation/mmseg/structures/sampler/base_pixel_sampler.py new file mode 100644 index 0000000..03672cd --- /dev/null +++ b/mmsegmentation/mmseg/structures/sampler/base_pixel_sampler.py @@ -0,0 +1,13 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + + +class BasePixelSampler(metaclass=ABCMeta): + """Base class of pixel sampler.""" + + def __init__(self, **kwargs): + pass + + @abstractmethod + def sample(self, seg_logit, seg_label): + """Placeholder for sample function.""" diff --git a/mmsegmentation/mmseg/structures/sampler/builder.py b/mmsegmentation/mmseg/structures/sampler/builder.py new file mode 100644 index 0000000..48e1479 --- /dev/null +++ b/mmsegmentation/mmseg/structures/sampler/builder.py @@ -0,0 +1,14 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +from mmseg.registry import TASK_UTILS + +PIXEL_SAMPLERS = TASK_UTILS + + +def build_pixel_sampler(cfg, **default_args): + """Build pixel sampler for segmentation map.""" + warnings.warn( + '``build_pixel_sampler`` would be deprecated soon, please use ' + '``mmseg.registry.TASK_UTILS.build()`` ') + return TASK_UTILS.build(cfg, default_args=default_args) diff --git a/mmsegmentation/mmseg/structures/sampler/ohem_pixel_sampler.py b/mmsegmentation/mmseg/structures/sampler/ohem_pixel_sampler.py new file mode 100644 index 0000000..a974273 --- /dev/null +++ b/mmsegmentation/mmseg/structures/sampler/ohem_pixel_sampler.py @@ -0,0 +1,85 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .base_pixel_sampler import BasePixelSampler +from .builder import PIXEL_SAMPLERS + + +@PIXEL_SAMPLERS.register_module() +class OHEMPixelSampler(BasePixelSampler): + """Online Hard Example Mining Sampler for segmentation. + + Args: + context (nn.Module): The context of sampler, subclass of + :obj:`BaseDecodeHead`. + thresh (float, optional): The threshold for hard example selection. + Below which, are prediction with low confidence. If not + specified, the hard examples will be pixels of top ``min_kept`` + loss. Default: None. + min_kept (int, optional): The minimum number of predictions to keep. + Default: 100000. + """ + + def __init__(self, context, thresh=None, min_kept=100000): + super().__init__() + self.context = context + assert min_kept > 1 + self.thresh = thresh + self.min_kept = min_kept + + def sample(self, seg_logit, seg_label): + """Sample pixels that have high loss or with low prediction confidence. + + Args: + seg_logit (torch.Tensor): segmentation logits, shape (N, C, H, W) + seg_label (torch.Tensor): segmentation label, shape (N, 1, H, W) + + Returns: + torch.Tensor: segmentation weight, shape (N, H, W) + """ + with torch.no_grad(): + assert seg_logit.shape[2:] == seg_label.shape[2:] + assert seg_label.shape[1] == 1 + seg_label = seg_label.squeeze(1).long() + batch_kept = self.min_kept * seg_label.size(0) + valid_mask = seg_label != self.context.ignore_index + seg_weight = seg_logit.new_zeros(size=seg_label.size()) + valid_seg_weight = seg_weight[valid_mask] + if self.thresh is not None: + seg_prob = F.softmax(seg_logit, dim=1) + + tmp_seg_label = seg_label.clone().unsqueeze(1) + tmp_seg_label[tmp_seg_label == self.context.ignore_index] = 0 + seg_prob = seg_prob.gather(1, tmp_seg_label).squeeze(1) + sort_prob, sort_indices = seg_prob[valid_mask].sort() + + if sort_prob.numel() > 0: + min_threshold = sort_prob[min(batch_kept, + sort_prob.numel() - 1)] + else: + min_threshold = 0.0 + threshold = max(min_threshold, self.thresh) + valid_seg_weight[seg_prob[valid_mask] < threshold] = 1. + else: + if not isinstance(self.context.loss_decode, nn.ModuleList): + losses_decode = [self.context.loss_decode] + else: + losses_decode = self.context.loss_decode + losses = 0.0 + for loss_module in losses_decode: + losses += loss_module( + seg_logit, + seg_label, + weight=None, + ignore_index=self.context.ignore_index, + reduction_override='none') + + # faster than topk according to https://github.com/pytorch/pytorch/issues/22812 # noqa + _, sort_indices = losses[valid_mask].sort(descending=True) + valid_seg_weight[sort_indices[:batch_kept]] = 1. + + seg_weight[valid_mask] = valid_seg_weight + + return seg_weight diff --git a/mmsegmentation/mmseg/structures/seg_data_sample.py b/mmsegmentation/mmseg/structures/seg_data_sample.py new file mode 100644 index 0000000..ce68b54 --- /dev/null +++ b/mmsegmentation/mmseg/structures/seg_data_sample.py @@ -0,0 +1,92 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.structures import BaseDataElement, PixelData + + +class SegDataSample(BaseDataElement): + """A data structure interface of MMSegmentation. They are used as + interfaces between different components. + + The attributes in ``SegDataSample`` are divided into several parts: + + - ``gt_sem_seg``(PixelData): Ground truth of semantic segmentation. + - ``pred_sem_seg``(PixelData): Prediction of semantic segmentation. + - ``seg_logits``(PixelData): Predicted logits of semantic segmentation. + + Examples: + >>> import torch + >>> import numpy as np + >>> from mmengine.structures import PixelData + >>> from mmseg.structures import SegDataSample + + >>> data_sample = SegDataSample() + >>> img_meta = dict(img_shape=(4, 4, 3), + ... pad_shape=(4, 4, 3)) + >>> gt_segmentations = PixelData(metainfo=img_meta) + >>> gt_segmentations.data = torch.randint(0, 2, (1, 4, 4)) + >>> data_sample.gt_sem_seg = gt_segmentations + >>> assert 'img_shape' in data_sample.gt_sem_seg.metainfo_keys() + >>> data_sample.gt_sem_seg.shape + (4, 4) + >>> print(data_sample) + + ) at 0x1c2aae44d60> + + >>> data_sample = SegDataSample() + >>> gt_sem_seg_data = dict(sem_seg=torch.rand(1, 4, 4)) + >>> gt_sem_seg = PixelData(**gt_sem_seg_data) + >>> data_sample.gt_sem_seg = gt_sem_seg + >>> assert 'gt_sem_seg' in data_sample + >>> assert 'sem_seg' in data_sample.gt_sem_seg + """ + + @property + def gt_sem_seg(self) -> PixelData: + return self._gt_sem_seg + + @gt_sem_seg.setter + def gt_sem_seg(self, value: PixelData) -> None: + self.set_field(value, '_gt_sem_seg', dtype=PixelData) + + @gt_sem_seg.deleter + def gt_sem_seg(self) -> None: + del self._gt_sem_seg + + @property + def pred_sem_seg(self) -> PixelData: + return self._pred_sem_seg + + @pred_sem_seg.setter + def pred_sem_seg(self, value: PixelData) -> None: + self.set_field(value, '_pred_sem_seg', dtype=PixelData) + + @pred_sem_seg.deleter + def pred_sem_seg(self) -> None: + del self._pred_sem_seg + + @property + def seg_logits(self) -> PixelData: + return self._seg_logits + + @seg_logits.setter + def seg_logits(self, value: PixelData) -> None: + self.set_field(value, '_seg_logits', dtype=PixelData) + + @seg_logits.deleter + def seg_logits(self) -> None: + del self._seg_logits diff --git a/mmsegmentation/mmseg/utils/__init__.py b/mmsegmentation/mmseg/utils/__init__.py new file mode 100644 index 0000000..8743e78 --- /dev/null +++ b/mmsegmentation/mmseg/utils/__init__.py @@ -0,0 +1,72 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# yapf: disable +from .class_names import (ade_classes, ade_palette, bdd100k_classes, + bdd100k_palette, cityscapes_classes, + cityscapes_palette, cocostuff_classes, + cocostuff_palette, dataset_aliases, get_classes, + get_palette, isaid_classes, isaid_palette, + loveda_classes, loveda_palette, potsdam_classes, + potsdam_palette, stare_classes, stare_palette, + synapse_classes, synapse_palette, vaihingen_classes, + vaihingen_palette, voc_classes, voc_palette, xray_classes, xray_palette) +# yapf: enable +from .collect_env import collect_env +from .get_templates import get_predefined_templates +from .io import datafrombytes +from .misc import add_prefix, stack_batch +from .set_env import register_all_modules +from .tokenizer import tokenize +from .typing_utils import (ConfigType, ForwardResults, MultiConfig, + OptConfigType, OptMultiConfig, OptSampleList, + SampleList, TensorDict, TensorList) + +# isort: off +from .mask_classification import MatchMasks, seg_data_to_instance_data + +__all__ = [ + 'collect_env', + 'register_all_modules', + 'stack_batch', + 'add_prefix', + 'ConfigType', + 'OptConfigType', + 'MultiConfig', + 'OptMultiConfig', + 'SampleList', + 'OptSampleList', + 'TensorDict', + 'TensorList', + 'ForwardResults', + 'cityscapes_classes', + 'ade_classes', + 'voc_classes', + 'cocostuff_classes', + 'loveda_classes', + 'potsdam_classes', + 'vaihingen_classes', + 'isaid_classes', + 'stare_classes', + 'cityscapes_palette', + 'ade_palette', + 'voc_palette', + 'cocostuff_palette', + 'loveda_palette', + 'potsdam_palette', + 'vaihingen_palette', + 'isaid_palette', + 'stare_palette', + 'dataset_aliases', + 'get_classes', + 'get_palette', + 'datafrombytes', + 'synapse_palette', + 'synapse_classes', + 'get_predefined_templates', + 'tokenize', + 'seg_data_to_instance_data', + 'MatchMasks', + 'bdd100k_classes', + 'bdd100k_palette', + 'xray_classes', + 'xray_palette' +] diff --git a/mmsegmentation/mmseg/utils/bpe_simple_vocab_16e6.txt.gz b/mmsegmentation/mmseg/utils/bpe_simple_vocab_16e6.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b5088a527f720063f044eb928eee315f63b2fc0 GIT binary patch literal 1356917 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%0D-8anuzg!0hrX~L}M*$l~SOpZ7=I+%ag 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

Rp5@H-63rPkl?5M!`%e$q5M^(XmdeOwiW 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%0D+{l&4Elf+RUJ>DPlT<0vI!uxp-LitG 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

nj;X-C@gua07)qPBmS6kxKbsrp_1VbHQ%kr&^ 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�J#6HekB- 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%0DQu49$GwTP{0?>4l_B{}_v8!N|W%zC&9> z8RY~ssE=R2qK8T{Doiw#V{mG~-8N~7=E@{d0y13QZ-L_na$8k$AzGkiL@(J4*Qytf0z*783v)RHW)+dz6>AptOH=dPY=A%Z6wC z1>In?qUYe)-siyT<=CI4D&FCY1AkowjG~py0-n@NLIlKzr4#zhxx^-v%uI!D^AQIq zn@`IDYzmR4i8BA}n)9)GG%;RtCXjQpKV^`$(hM3(D@ip8)+^shXCsmGx)1hrR}{;| z)ph-sBChgNJvOY#pEgoG5-Ju|&mH1`XDZQd;9Fo<=|O<%5|ayqDjjgvK;OAbBS)9* zX3Bz{4G>WFK+juX39&&>rav_DScf5bD-UXF48(0PQG_>1oQeBU2{1df1`G4-(>8;F zqi{1W6($@eRp%N>?tFqhow`zZ2yu@5--hp}g!KWti9av^eE8>o4(S(QoPMqn7!c$6 z;p@lptBR)l5;LdPZk39$`6vSq#QOTAiopf>wr3sK4IJML?%q03HLns88h|6Y;)l7r zG>CRyuvc`cVJQpBxb?AU_87ANj04Tq;&SmJ2e5NK%eIbrdDLxCe4BKtbLScjQ?*Sq zJmUEj#CT!-qFrxP!o3 zOaT^^$xsWy2=vbO!04AM9i|SJYL(Z?5Am{x!R}sjH!e=IOU_y?k)L}VTT6ooF&nn) zD2eGPUrigJSpCGE(M>`9ZXtktY2i6iGz`t1^)zLL8oTszuxN><{eJjf`p^@l_Z#Pe zq^~9>KzjW{$Pq~>J{`q17_V7P+ac4J-YI;>>c#yU%vjtm&mEw=A%jg>KcSm&RfRG4 z+G*2U4;2J1?g?p6qDDaXwz^8*c*h{E*%_1D{U|UQOc395)`moX7 zSNgb(C*ba6pzTmM49f2(K~5-?`4LxfD~tx^iBwPvec*>-?|v?Lb4OUYatDjl+w|`({W1F?4gM>>m~O7x zZPnUe?fTO)u99f>7KQV9(t?CP!x>SWJ>$7>-){-S zWc^D`Oj%VxX z=i9h*_k=0@sa~*f+oX$@bO`E0DCN(p;6k-to!SNK+{T$&9s0kL zlVzYQxdAMeCAcC#z#*GdI?L%%RTc}&N5dZILYVr)N(iO2;(?$RXzkme7kpUiB}?W| zm?iDQ>N<-|&#EdoJ0mPhR%yhWM`Kx-)ZxC-;jEGqS|y!`u7@XVpchd^;z$+Fwzz<$MwZRoA;sD` z{-Mizu1c!V^8~u{}(JvWne#~I=W3557awhW3PuU?!L(`R^RKvT8x9`WMiI`OSvvOTxI4O z6KGcoiiO%PEjzP|l789=Kz}FIHVveWpImqi-A23jk%%to)<%@}7U?%c7RVT!$?n}b z%28IQm0SglUxDQSs#J9mU3XCxT`DvL!elteNUVG^P8__jpo@cTyTnyS%zWmEM;nP^Kn%dw~P)!xl^tUquQQ3R_q7yxPR1 z=hi^Lk>x~4gL`TP8PxGNGM#Ga1B~CNjgo!x zxF&MY0r2W0gzVJDM7j(B5Z4Loa$@$d0B{r?K6w%d3Kf=mOs#MKUlF@M4= zDEwo(9GIrhTzB3vOriQd6!O%j&{ua5yEwXfPVH^ZI z#rIt^z8AtobIv8wtUynrnF?tOif1Ahm15Nb6z4#zv(yv4g;hYFP*$BX8W`-kL_{5i6C_-L z%b1Hu0t7aCwv&-=Rr0+5ZFMkZrb?;NqccOX0o>gSLSdx+aZ&^77-*Ov&qwu~R5zQv zyaihwDh7tO8{i}RA^som5B>Uqb(A#MPk~^-iCKA9JJoYs+-@ECa1%d3(RB9+*J=Dv}=hMc|6PEN#gQKYC_F*asX>=;YYnJmZTtK)@>mT-QF|^#cg5jJkVO6nbiSvUh_9EY30Rqqj zly9}Oi<^PV0EU9xa>+{=re^?9K(D_P+gQmDutvAG1f4+H1dnyYSO7VXLJ=xZ_B;D7 zyUJc6>|hnYTUCR?Wvv%{A>3~VF^g^E!^r#GoeP^JpH=j}a~f`a(L{Do><9ds&^_qw zhWI2EyRpF_dl{S=-%X)?=-@z>FyZbgxz!fs)GiOB++0g2NGoj*G1w?rDf{^DyzN=dJK@5ucb_2yqx*2@cPG)(;H|= z{|{`j(?t`_Y}Z+;jvMq7S4MHD>6?y1Z?Net0=07sM|`t)8Fep}r4$4lxzwHHD~dD2 zqRTIG@*%&Ea&N(L*ovAayWpI~Rqn5rem3lerOUxq;-~NL?+yT@qq@hq`muW~$^!!h zYFqYU4qR=(M5gTD188oOMy~f)AUX+NF8f$^m!6{wxsmz-^eXi0gxWc9GrOXCsa!X~ zeM%Pd+w+vWKRQwNDkVOR44yNrl}^I~_}4fdr3)&`b<}2lTJp0$)S;*&HedjAbfHsL zM^5lHlL)U^h0tPI^^C89D@EM#5)T(b>UP)Q-W7;UbgTGu^*eMq%Z9YTYQSeW`i(3}~$L`+~ z+Wnj&u1N{{Q%XW7!05Yw4li$k($CT7?%uq&?wZ`DsZYDFeo;3w!%1(@V%yz@51UjE z_W1zAPv9Laes4u@o8+~bR9+6dy#S#JtCQaBs@6;$xC3wO6p%Lw(QXhq?4hq7$%if* zU&akpa95$B)J#5D2xvi@OM!o{&^!@{wXH}Ha#TuIau{&hZ`FqSs_ZZ@?iDRKojNG6 zO3xw(1%r%*+OQ2CH*r7bVpC|A0<^dyhz|LUV{;3X9O_-B4#ON``xc-w^Uzpsp~}p< zSVB@FyB-EGEHO*hL1GF16TyES1mohsnEk!)h3|bY&GbJCuQvPtZ{hV8{0D#%)*B>u%5Rh}+H&SBT}5atV#g={ZE9ApE7<5p(WIxIU4juW0WmXH<)qs(&I(thd!vG0(!5z6CliK|) znIsC)PCE#@yBbwUT(u(m2>U^!sxOOU+MeHKa44tY*;vk2s&1iF$^k>6xHAo z%B+*50yM31J(t*Y4}4m%Il%~=S;)mr3P*QAmS7IlV*!AU@fc^jwcQYgE@zyod;=CYeZM&Sy z8NXTj25{U*1@_arx1_AuhqQ+PTk1 zcAy-`sIa5-8WbA&L#!2ea9;V_?}qQ2 zVCaa7T01?tbe7apYSs~Pto8w(m8^_r2z8uY@Eh)dz=4iB44;h1<5RnL&nRM!wu@!kl2Zci(xJFTD+D|ln%!=j>2&?H;8@d`9 zS}`sL(Se4rj~S%%UOVuP3PPptu4_|*5Nq{JshXXLx4<*l6h$#jZd`Q^)dQQyeIkEl zh8$)yDygq~cI}h(>PxRpn$|swf=I3lSE4UA2`CdM`8#}3dKxAJuZ$9SA$ZBy)#XHs z&>f*$y>BM;%v*E-ok}TAOSTUkrriNLJ=P+TgAuhCxaS6YtXBX(dzw#Up2NjDOpj3* za2y+{Dcn)tbYD-PB$pPY&k1Em(EnMbiPOUZ!@Y@Pw-ZENOMfGQeB+xYYhB?Z@Ei*U zq`gF$;BL)Tk(f|4cvP?@Q3s`br_>?@IBqRkllJ=SzYc#*W58eWUj3SD&)+!4;ytXz z9U6JuWZc6zB@i;KD$|ibBy|vyeBOia)Ui=dI?v!h6w-XU1D*6Qq-M9s?-+adUKldF zB-}uQzu;7CjxM84v%s~tSIk>k(|}fhbl3^OK+aq3@Pw%D^tCwKg-haqwyaT5RVHIEQlDeX+Y(#W>hxN0>m!#aE-b(4W zNZjsxZZ9$Q8PZ%Mm0eI`ayqjj;!nOs#`RoVc^)=Otsy-{D0LlGNx7@I-l!?VSd9e# zL75m!N6H>z(ojxhnpefVyQVni;|2Ha=(4dUSCvA3t=8yiM-f4Pr&l^w9TswC=(F4F z5rLs4C`j6`y5?W~efLHD_OCf!eIbX~EI>Yd{p96e|MH*V@eQ)cSK;Ne^k4jU`L{1g zh7qhkRN&N&mwNMw_Z*N9+5+v1uc+Mz4q$rw@Yj7--T2YA)LHdRT9yu4;~g*fTHFsL zn}rsIilxC7Lh)M=x1vLd0(J$2sn1=7C2spPIv1tXOPHZ|}BbW0yT>G-)&x zj4!Yad!}xY4@D$ZprjgHYgf%w(1ge**FXrtHdKmo zl)m%t^P&0GtC^(!)>y;u-b(fH)9~(RuU}iw2`s{OA_U|h&}a#b+z+D1RUTzz8jKj~ zkSzxLOQ{J-0o9wZ+7wb4M6nNeUJYGKwLg{OeB|^Y$&k1$BskDeHoi>~-@9Sx z8a3LHq$oEBbxr6jz{$^>$5BZn@~|KFtPFH=1{7I{Yp?y~C7C`Q~jzy9x3>c-X-S#9k4EUkoULt-H zd{8ZTcC3!21U|baP<$|Vf#1BdP2BSla^Qpq0096{s==@2*eg0}UnmTI-X0bP@)M_w zeT9JmY2H_rl1O(58PepQPl0P1Lk#O$7T!XlMsT*9@MFEWKh9_E> zZu)ps@W*vH_yC|9gmAeYMCD3S%%!7Xg4Xu(9bdU`51Xw>fF*YiE^tGpY)Ynj$!xzg zox6=tt(0+SsqD+5Ld(?Rg}O!IHclY0)u=M0h){55Wir|*#(RmE&Xbm;4E1%=aSF(Y zFm#5|w(xgHZQ-ZPFs(xQw=Cl5wD4`m1^)u&7JpCK#s9DG!~fqu0KFmY-Ht5Ro@Aup zYszqNFV>dO-m5Q;^@#cYsJNojuDSgmJu0EMgQRxeF0@O2rhuZ2r@0BWS*jLSpQTDT zv7up7v9&=tbTKF~AQ5@k88xIUfoLX~cBr;eWKbJ-s=sk1b&cEL@(2h$ZKrO9Qh{Wx`d;VGjfyatE8L+n>?rPe z{sA(jK6j1l65NZ_+@$POOWhxi2U)^?+F?>DRis->#QZl^3LkFhE`)(kvBa$WW`dPm z4*(CnPUlUfC;z0V@Yk=C!_*ge_cpxz(ZUiYR5n{cu`ao7Wip?VV(*!=KAfzsZkRtF z&;}}zERT6oab(lx?%*}P(=<*3T#DAZVZb;a_GAw8D8j8v%VZ|#P*^k5qT&L2*H>hh z3Ln5FMA{N}7|l@Ur{)Z{-Aj4uX7VEqCx@sll+k@>l%z|1R-7dH`%^sz5;1}I@zl{5 znU+#@p~Dmcy0Juv7J)zy%)%_zKy7FTZZ1cc-?L4X7g=9~TO<8_&+>6>6L|W%2-+;G zOL{AOE4V0sNhc88?wR;@R>Ieg)}#!VozlZeSy{eKhiqpd>v00W3{Rm7%I)!oLVM6O zKvEi+J(Fp9SmeI1TXcz>^1`k!`xV3o`2*N(%Aq(XV;@LHBC>Y%?z=U74W{Kl9brV)Kdd+O%_v%Rpk?~ zVr7F?Q~(46f^8xgFdVbgXmWy2!CJ3dhph)j>$lE<9r8#)Jy^0@f$E)5&ndm@*yeOs z*W|-qzV&AfbieOlfIB6Kw}pl}-$eRarRD3zhGipAFGNa6`g7bcZofox`MLREz(-@O zxAD&DB1w8$8efqmmFZL4yASd*5mwX04cc@zgjK)>R1(i;iN6KA3z#Eiw{kh^a!PG; zY9$?<^A7E89J5pd&!Gbo%XtqoKS?jsIuYV+Yqa+@HRS}T`3z}SeWMgs3+)wzc}j>7 zBBa`ZNT6_O{4j^n6oo2}t4{pJiUw@gFg>4upXL{!tH9PGDRG5Y8^(i3^@Bvx`vx9c z;1wYqrc^nFON77^?ks#f=hH0^jRYKyZ=Zq2pt3SVy7n0f@Hq_mFP>qxwi~B=-0_Ev z-4z3<6jJ)#`AAKp0pL+y13B^l`Q3I2d9Z? zPSRPKb|UE;1prijK=~DR1m<~M!kyRCU0)>2Eg&%uspdvr%*n{N#RBglJK+U5G>r|O zzW@F2ha|52kQ7;J|LXOt{M9d@wQMg=#{pTZ;!JkN9a3dWgqV2+SrPlIAXos@L9BcC zyq>uuS4;CviOkaltuNt_ps?(Nc1~H9o&gfi*wi(Joh4}k6Itb+W}{Yq=gX(~jw z!uHz%?vkih`-U-ealgVfPz0h>B_dV*&kmtQH)Ovp2$dFT`kY?Mt1uZUpuoRLarT1` z_^dvAe1f0-MT-3c)U{z1AV;E=2rEAz9E%^!i_bKgAcJx4{W8t!>*ZsK^{xhyzyu7H z!$no2L<-1>`zHCkZip`>Jg$zM+hDq5dZRfAYs&w6rE5B!uFJA$40R$wN9Y>wqKxr2w>K&iHH7mh>CmS&d~P0gUhDf8?8 zUHa<3y!;}(`)}Ak!`cO`H3Bj2Kz>ZpHtA}*B&rZ2mi}SSVZnKubos}*gnX;#Ex5;x z`Z3`e!H-GGu*~^i2V}_DJ9P}cep$s2c>sxunI5-so+EHrRTgR~G8`=e_kEmZ66B_7 z-CF3>+n*1^cn5<*pq{=zsz23`z9eTG*>o}$Bs&?t? zZm-pcY~oT<4be8Rg#x)A00vS%T-$M{Ka>)y48t!?xwMvG&3F|nrz{fG1SiOjm5b|w zs`Q)umQzu-Sg!^1M=e68eLituxl5;Thob+(g~euI-A>!SN=7HOO38jRYm&j8BBV@B z!t{nDPMATrivavd+mWte2NHaOq^7>SmmaGjusBDxSA(u;x`uK_nsnU832 z5q!7sJEHYYO=ckwuArp3LNz2r$Tz#8q#Q{xk`tsN=r${e?mYp~bNUi)WWJI>hd4cME!EgyWlUZoY$yziECKavG7MF*AmYU^GgCXk{CdGAkd<)D|_x?|DFB+5NqW_ zH)#+{(M4)zG4QdJ1EqZ`NEC~Xx2=Iy&rWv@1y>k*R0%&8h}XjvD=`T=DCSihT02?& z`B#7c58>~>n*;FMzx-$TxBi7f%U(ZBv%HT^_oK=m>>W&TM1xfc6;9m6m}r2DGmEE9 zryyxou`0qdi^1WyjXZ9PRDfqD)_JO+yj0S0clQ0LhHx1cUDydl2j){3pQ- zAUOPl7Rx~s3x!jr|AyH(X+fJPn7qKl{uNbQpSvbB`+^Jqlp$F6R;t3oX8%&g9H(1X zW^sZ|rDpGIdgT1xx8g$JtU@e70CCxTEba^HcVrFTIm=1`0B&qjf1e+A?6;s>i1bz( zg(j$&p5%by-4CQRB|Ldhx^Q$4MpSWj)*v6mo_A~u-veJE8SqsaHnJ}32e&JIeG#rv7$G_3-Q(3Z&;d#4oKA(NfR&gNWnIqxXTAn&dv_xgcQuxJ6RN?DIaH^!@1v`1M1Dz$M*K$eJ3BK zKfHb(zD;lc^5rLq{m%dJ*XeLQ`%}5?Y3O48(G970bwRNWX#|RWzB(#xWRDCY0U$o_ zk@^J_99EaPSb2ip_cXHGmciZ)f^aP!q&Hg!h z{))F^o*vXs0lg&-PI3}AXmT*5s?7SFN^468VLDcYm#OvJlm=Py(Kma4`p(~m|K&UO zz`u|GrRy)B?o(R~@`4UhK-rOcu{{`&;s@@$(3dFdN{Z_ilhUC*BV;Y(mnul!cFO=4 zwvf}Kj1)$+MjFYkxYIh#t^L?4$e1s%-2gUJCF&ic={E$7IaWV85Q}ifXEx;%g zLzBk^CcT)fdj2p;7>V!T?gC%H;Br^ybnxc)<xzAhO=UQ?91}; z*ya)&7|tJ{jK6gywTLI4ocIKPty2V}R?6`R7IR^Lh4eMugh}?1xa-}@h6fcC=R)$G z(S@y)N(uE4RW?B6wblwfa zcH|X%Ew%B^Dio0ZVnI2Irqc2XnoGLG0_#jRifPfilHmj(3Mp#~l95D)G8wY)H%;}S z)=CQMw#A-;89^MyxZH9q#6NLYgo}ecVp!h|qg`;16d7b!hu84Eqttfb_Js zn>^>OxKlT9!61s`8|YSqiTd9CLtS0s@TW6Y$`20%{U{Ip4!9MDN@cJ?2$ke0(L&5`%y)+rYX6@k$+5!3leXn4%nvBHFvGE%c zeLU;c)knSAB$v>?HqNcWREUZOE6L_U_*OaOl|%EsY4tea<|^lP48Fd+$zOw(0JH7% z2-kHFbd{rsi(JdIrUbi}hZ;Rw;tsim-ybSv9Ak^BK(8~oOQ6{}@(sj9)px9hYc`Hr zVAKmO=H=$DfRnQ#1TT!tvO?=W>mfmK;3Eb?OcFxxyCQ%+%g#)03K*|R0o5rik`);O zpITTc3dB)Wg>)s6OBrZHTYR#$m!X5-{mYB04u5_+iqWG|avgjisof(SC-73* z6Z$G8th#h2m>eZk{N!I8IB7(bs*X5`6@?prt@kd)eiE2BxJj%TNr29ljCuLFZ*p>$ z8{A8%h}xPE$L_esu|v-)zi*=bA?Xe}cjif(r46?1&=&^|9q3MkRm#^;F8NRv8eMYF z*9JVqgv(B2>D zFm$+itjZ%{4Xexx&Ni^{-vU~^DxP*N%K(fGgo zWK3jSt&OV@xN9?V0Z0iEj8)x(FQq2@!<8b+a6TK!4McdFyrb`2NcyId#qUn< zK6?2E5anl_zSGlFcQzc( z7a}$2fi1FKM0m4zRFjpGpTHRjv<(AY)9s2=(?yrv|E6o?qb(}$ezdG-w_o>xXIDLL zAwfqn%W`1Ji$zPHam^r5>TCf^>f|^}@6sL|Y&c!(J*UjIlo4lX%6huVMS`im8~!K# z^{>KrlQkIfL8=z;`=A!bc959jYmb2N3W!5M-gs zHxj%F0051kt59zA$|>Qxzsqo82_#s_TPqM7GP!y;*0@SQyqLtb>S-J3ZI_Z{I%Ag% zKHdomWiVUk2y%it9_*}1o|h!**7g}TXck+!%)N)29U0ceba_!RS)S7Eu}s<`7(J5xQ}I_jTvK{E^)Pe& zE-4Zv3X}6G--T@wD@2CL>Z_?t(gbJAs9VeHJYdhk>5uACa&~xxC@sC*g6;wAbtw+i z5%plUfzN@JxVoN=3e1=cF4iXCslD!2k0ElT%aZxld>*AixHy&ItnQlp?eb2241Xl? zEd`z^pUFu1xiK%W>o`kZJJeumj6~`{z=*Wqq)Je6ej}|AaPOQYP8lMf)G^RMKrD{p zVzYZYNT3*)mEL{)^4phRNI?JB*FQqe{^jT4-6yYq{PRD(`{?zvmk(9p{_VR@UVi=Z z>vtc&{^Io)`jyX_mVX&ulBS6o6Jjr(-l;dRucvOhHnmXx#O_tC#Ox&8b*e!ifvVoQ zxzqzlL7hPI7*?8~s8`6!#3sjzc`ti)0}Jb&M5i&86uFJDO6+2ss*exeCsuo7_CdIXh_<{rFNkxh;SSp9DU&c>?I6X z6h&!U!|#Xhm`ml`KmW5FlDDsa0*Lu%uU}*75W_je;~VHVr1K(QyHz<#dq`eTwnjd^ z_5PqKw+@rbX|7kG&$Qt3fpM!ccGMh<3iaRIM&?dN5;~{@ratbc1ZLO-<22uf+KOr- zJOkz=g-!m3s}(Og0rCm6TOAtIcPMnx=C`unEbCv#@FcOP*;#F0q)EV&W0XwO&d^Ob z6{DgZYQ~SPIRTABnlt$CYKZahfK+tSM+Z?FRtcXR9z4PGgdFKsZjWRW$La!TAdTU7 z!vBg@LAD%)DE-e*Fz78^=;|0Ac7Lfab7T8^t6GEh@7g5MZXC#am>o7=?SCt<-KazUR1iC}k@5yIl zvsB0r;Q?_O4Wy5dRL)njO+lBEVOORa(oF4AC!p;cWI#egrHqE5b7QlWGNfrGn7qBllUYtgk z*hDK^RHv!~OOg&2FgrqJflbrlX9<=b?mmH*PU;RQI@t8347Hh}EMd13C@n_1}kokpIasd;OCMkmJRP(c`n%pS`@ro7dkb;5`VB()`JROvm#_Qk}@} z|3~v)g~kE+r`G4m$C~aX#{U}_%sw?nYyO@Fo>Z+4XkM!po_la1^hv>!YdyT#mEPd# z<;^aIF`1}9SIPOvRl|sELNX-CmV~uPF_76!5^Oqu{Ly*g@+2T8$%S4VX3%gXQWeiW zZjw$1gM9gZ_L9=IJ%uh6kUKfz8p%FDnPz}Q(lj=wBqneF7NTg+e_=oMjam|f*Ke53 zzX*T+Cw=|ASJ#Ke@gSa2N<~cFY^8dKPA?!b(r(|~B@kH!CM6ueL%$Mh5@HLyhs7WU z#ru6hwtkPEI6IPmQZPW^!f?7m^JkD6QS!h9-qK7VRXEg0az~5E>i&j3uC1P=6qmbP zDTS3QCv2jn)P@YbBp9kw$?w=_7Vv6E;{*I|m|Z8R&8VMdA9*GlxLu}lr zsz4ngZQy9Me~Br!Y%kP-mSy_8PXN(9cC-Lm=g%=~pl_1I0O_ z%TN~0NsDW$(nrPq`F!jgau*6op1kB4@!cQT7-o1$=xgN<4x#gQs8^sJSuA({_|j_J zPuJ<1#H9c*GL0trI~rA+RQ_j|wl=GlXGA6GYx`*$Fbx;7Z1J2Q=A5oro}Mte#F|)p zk`uu|o?ro?34QYUO|hWg>6UAj9RgM-b63$X7Q6L)9o9?-_5$jFje8Ek2|n4rkP@ny zc)ULN;DZNa@k}EPFBV*X_WJwq`djJske_TFwH@JRn;RTI#gMqX?+WQG-55`H_ty!8 zVy@tBsNRRzXT1~Pf=@~}RTc7S?U3wUS~z06e_9|MG@T}Vu5WhR;lWoBqg=1z1}uL3M)38e`G?2u=<3t zcmsKD3P&_iwF%^c7(wz(<-S@4fWV`e#xz~>LICcAU>{;2haZmD@L4*DNU5nYxX*E+ zB7WSqma29E?&luP(fhc!uRnYJQ;=WY8nxn1r{$Yc^Gia5^dJ_t|CC~zR;qiscC{-Z z!s%&z)Eg_#@nL+4g$k{wVu(W$o{CgY#CFb6V(!>AM}H>M8RrXU#$q*;<}7WFFp5*0 zhl}5gH508`P>p#N+i~xw&Ots;>x=6EoVqlJ(|D(23{LFn0?L7cL%(GX*sZxBmD+Ky za!1-gg5Ex9dE{8wV}xucwkZ@FWPx4|y|Jgp=Wt+JnDP^fs=?N+@;T?i7=MoZZ$cEb<<%6LveZFD6cma=wN$Kg_yfaVmVb9=nbxRYv@Um zW;0INDSLVXvYX@%n{JIz%}3*g=|?G79Bu*W@mEUw_Hhut;YYgGfB}7*ohek3qKuF) zOV=N3)2rus2q5|dN%Fi4QYvluBypp%!Ov7YD$ZiT=eNJ#F$ha69a|HZrOAGvB0m#K zuHMgkP-sfp3tpKgnMy z`HNg`IlwC<+G95RJ}|=ZcK}7(6CWRZq+EwSEqU*N%)2yz1J0!t@Iql;56prgi|;N{ zYKWY-`M3|}KvBUTcbK-sys?J`;2z=V@}!%jpy~1bUhtVa9ZR}G)OJ$66(Q1Wtb^I3 zN^LoG{N|suE>7vSX*v zE^E)wv-pgktanU4vkQWb#{r^9?_6B2*f)$dq(SBSBzf47TmEyC7EFt;X|?_D3LE*Y z&2}@IgP@8qcr#RDw`MVXncA+*%2_DhB+y6{2U*jqa}W*->RMvDDj)e&s*;;MkLTbz z@jYwAUV)hw3nA`CCFn^-OKtRb!KB_G6&KebhUXi|bfpCf<SgiknYgLNWQ3b+B(0N?ug?sxL*cCY5^3zG=uJVft;ixa{D> zOh>Ci#rLIwz`CAO@I%p!_Kfu7xytU!)A8j1KKWA z#veNDGo&)C9>v9b5Oi7zyU&3d^00*pF1yjM|J84limHUN#KixpH7`fc2Vz?3>-I6VPSoB zN1Rm!9o9oaxx;LV$B{XBzaYJ$NNFw3toYzg%gv^n3wX1O>o3T~C;l5)@OdlTDs_Rp zD3;>(p}yIRTK{DG_iuvTY7ENk$--58@#8o^MsiEpniFts`vTBx04lm6oFs@H(rl)X z3nAI!s=Rn9F5OiKsJn$gi4EFaD5G`~Js~z{hX`#--TBU_NuDv=9Hjb_;vL3XwV~ZE&kndYo>L((j)A?#0CK~>(O21j~;O{Ls>1vF+Q3b@X1@d^M zLLOZ-6cL{uB0Y_c7A5Vd6@;@aVXNCk>%FA+9#vmYFRrdTF^G}0!SK}1xp4!oSKpR3;+%*q**C^D-foAvj_vW=?I+RZ1G zh@lQ+9n6>^)$--!wnCwC=NQ-~Hjqk)$%5uGsXiQq|9Yr7?k@g^elE?o?K}*fYkokn zsiD>Lge}Z+z=;8dB1`uKB@73| z#)nBMq-&(RH6`}71vgfHW_JkfR$kj@2~z7+b$QN%)hN`4z{?_JsvM_f&{$;{8Vn?J zT5eG6Jnk-c%3R^e4;YRtne>-fm~ve<-)Ae$-wq>W0IE)19DABcp_a6f#f+|*NYfFb zL6&ZH49P79#5Cl}Fx&1~z~>q%gmf)xI1!~AaoK0ZF{LM|u5F`^ywU}r*%tI~b5LhX zTl9|Q0Eo@jt!Lagh*p< z9mQfZ%|gePi>v$C@BaXE@DCoCabLcEK_i|o{PKRJ=+c*u^q;>>NYmd~*4AN}T(P~c zC43{R*k`7bbH_I}fnj~GgEjTr_P*$%gB_G;%X_Zm_}$-x!RIK_74ur7MtQRn)W1M2 zi>xSQh-X`b7kYKnA;=agl?}?|d|=|-PZTRj6 z_bjO3A|PQVD^?K;`>(EaW52%rmJZH`uO9}p8j!Q~Wq3`_*YE!KVC2nb)d;Y$A3ULY zJHDwn^fE(A!wH&d`(jVgEHD)HnYHaS`y?~3ECGPJryz4PT$!R*weF@y^GMs^WbbXM zVWGvSvNEKhs9lJ8f`x_!;ql;#Wt{dKusul|ypBo%96GABj8ths0($WNKF1rIIH=1{ z8;VLWCOLjdfGc~6&BRiW>LH&KoPCQtu7@CxwC)_q4?c{oeen;Pxds>dQ`B85QkTP7 zQMHb(?Gz#x0#**$Zi9eSa54v_!P(=*8OeG?F=SD0@sYODJo~~NuR-u6$rAlaP(}50 zI(z7lq?ct_7n6!Ub|twVL||MocD&{rR3N`%(BjFh3Ka>&uuVwc#{U@p;U6GvCT(&@ zki^|ZJybz!?R>nC$-k6Ar!8D0@?*%3*+RAuD8rhiI5vZhyt(hZ~HySgF2Z~$Lm|`S=a?cJ&-xX>R;EMo6 zhPeg(qM}Ynm@7LxE2bM{VRagiVIpe234!`r=SRJA?69E`;LS{wBBt0+5vtAf8Gscd z!_D5iT(QH$N_FrVQ{SO=3JI0-tnYjhBHa;(s8Wm6eElpb0%N}#L&cT18%v$^pr+(g zo!)@k^{H&v-^f zK$zXbNOh)gOUD z24)2PL>FRMaKg>JFTlr#Hge?!wOkme0+ux7#*)T_zllT3rIr9p4OLs?DPf=~%Ln`8CbQ8V(Xo0Jc! z5);5j$`AT%hXUeKC+xmP$OLImWG5P+$2%o6aidbXmNwK!)=sb1%w{<9_VpW-!uuMor(KIq zy3;~CesJxm4b)PEv++H5taj?M+5}pqSfAq4tXG)5I=I|G9F0XO53>&joq>^-HTpGNm7ro# zkvkk$DBo{!O@8!TT_CH&x^z(s^md+`VsspYzCZ1!n6uZGtmQWT8IG-}+>a5><<}x~&a8LCWxMw!^$j3Ki3KSPR`! z774juY$r5d&ioE_4LJrme3IV`MUu;oGjxyWb){SxyMTZJY9m`N1h1$H_YzfBRZ5Ub zvd~Cu-=@s1tCWj09qJPe-^~nGpfEEJwv?0z>a8P&7FPq5IMqVRGYv*Zvg%amouwRF z1Gubsip7wtdWf*77a$PTb8FD4a<+YDs}2M>F@&;ol-s9$F-yPxfZbql7$@+m5?dwS z7Eg+mo)Ya(Vs?h$*XmzKH(@|o3_3KpWOBl7*4!yWR9zYgx{jiLVZug^p!*r-2~r$l zmPFmOE5{EB0tmWxvrr}Ora5tGI{Wdsh*I0mlN40w! z7>Q6#dy+%vFa;3B93iKM##V_!JkbVHg-%##D4-+zfh`24?~@f|MIj&bV6Ke@GyDzh zEk0%f`P0j<9--cVr~Tyh=kldbUVof^&wm9R`MG|F*E|LQdkusd@ySztr zdjZj8*nFP)X2)g}Gh+OrlnbaYlg`^E4&aJs^gt+)&*UWKBs16&Vg7QKfb;-REGH?i z0eT=ATrVjF5e_|>LmJIa*09q}_7v6s=XH@E7 zP(;VPgW4uE2@e9<+qKAji2~623A3$Nxb@=V-( z5sqhzmx3zbBTb9?YhF1smrmU_;Mmo)(Gpe?m!79#js{8E<=ePYM_LE}Ft*1eN*M)f zo)u(Y2CX}@MvnT%Y>*QjH#l9TFJ41O_XK%R4@#2KvnatQIY=()MBl)A@)Na9O;kHq zHMa)8kJ?jUg21a9_GJjPU8TH!7V}s|1v2R8Y4Wv%g#LZRvq{atbOrAtbO%qw1ZKdn^jSKoL(>=GxpSBaU_0q4V_x4UTS<%IC>DrL7!{A}GrLNgcWaI+BxaRgBtHNfcghU| zoCK*XHB(G~^xuXDN5J1^V-pyF;O?CEr7Y5rA%$hUO+#B{)v$tuwI(#*M?b%yM)PHf zhj-ePzPm5Udv3OJQPo8?YO5n^`r;PlAZ?($u1kI=Z$ib<6c8+fgB#NDP6B{3igarY zw(L}KAEA!79`51gd|HERjH`Y1NvaCk5UEk)45>SZhqD7QMPkktdtgp6>a<%f*{F}% zryj-@S^I4$V2F!jfi*4~8R8Q$+dj2rNPRt~0UGj{v7^L%N9@ERurJ)hrNbOKy#-(= zxN2FYh>2$&n-yKrp8G)g<0EkLo{AFFsM-kuK+O-!LVDpr)gc`uC?GuOos>#G_IEwJ zOiwUS47HpLDh>>Luz_uHRgd+dkVYhK;pmx0>Yn~bKcWB8Pfmb_TK9Rt5Jb+;J_n!n zVsDXU41rOL{f*Y_$P@#d5NT__UsY=$y@4Hu{BA}dfDNOkR zODV=fb_kN!si zuMUXVrjHl;p&s?57A5H*B3c@hWm_n=zG4%#2Gzv2FSM$CHG6q~n36=Ij&lsCWusP& z(%y6W1OX^Ftz5BA=nvqgDjiwFCemP*QsLQp{(!$|dbtBtFHQKvij0K>>~VJ-4o(6F z=tJgl$B^xWJe&DO$o`qdC-uD%psS4JGpP1LgZ#jO^>C>(4ul6vQFs=JT+Kr!3@R_C6I)aZZw?TR-5v6sK7MiPv7UQae zR+X2~S2*J7AS`CjN~s9Q3thQZgFY2D>5V%3O|CH+{P$Prbg`nO5^0tZh|C8AL<94Q`rHX=nsz*bNKe{e1#Sgp#I; ziTNbxFFyv-l?r_~o$oqj8cQ21;WynXpTG;xnjMm^j?}nIM#ThpRYn5&0{AhF>W8K2 z6`y#7S(_z)eCDpb6_bbQb5>kv(`T={8WOnVR`gUIzV18$mnle-dXXD6A+lO~EGLUz zhsjeIeWU%LQh3dJ@`xv1`~#Ij6C^z)=~#U<-v6S2F2lW(e>8S!Ad+tFRx>$=uW7pY zzBH0G*F=-Ne3ZVbbo~$Y_5Gkogv5O4{|BWI!tK>0w-y(!*mMPH=@UFpES~AOl+tO* zR(b@F!g5}G)UVS?3#IJjyG;*lcOs6d=veoR7=`xQW+4@NJfMs)C>{G>gxvQ zaAHqxb^T>mHNx~-@0%sZuuA2HiV4Kx4$?Ytm{eH0bB3ne-i3D=iWyG^FCJ^Htlo3< zfdY9PsjAc$_}J8$X|%pV71%77?Of0mI&@~K1nr8KABX>_Zw`P_`sCUXW*6SQcYUqe zDiG!FAaZ8W48v@Yx!J<5yWv@!0^-Dvu5lG7KnG`Lv3RWTGf6fniOM(GZ!oK zE~k+b8F?!SEK&=opxuY`+2d6$D(lvTR;r*MoTfK9=j0?M9H>WU1uEKqG?nsb4a?zl zEC7wreM7P;ldc8?qB0VZtnQCA0FH1@`d0gX$$Gn}tW6Q21v(v&D{qvxV+9-wb&=}}2(g(eLwsRFycHgG##6^cT5+zClV)+l*LBDfmn z7BeYyxLeMS!L-BOxQZIGHB!;o>ab#5`@0Xq-#uU^zb2yXYwiRS1mO4YC3r(q{`sHq z)jzU~)33qaHh=9d`PL=Wfi)UVAi)+a0(!cWNu@ALE4q->w{GKu9QCT{KrW+Z9sYA8t^D!_R-2j`z_iQW!q`Usc}>Pg8%gWCbV@ic zeUY>THQud$2*)V(`!2=8s6v$_$H`Mv-&h(Kzz#aA3tY#2%LC)KaC^c_LR^PSaY)d( z*l|@2&AB)lb3bm9lVdug64jb`0?U4po)0V+J5N{-8991yteuv_pV{#{n8HuKR za-S3T4=lZ{lveGiGG&e$O(?H0Ve(Prg$H6l3!0uNuqa$FM@>pn>m|osiAuFPIbP!m zz_~7kD(0l;XNsR)!W&G49!4=K#B{dLg9+YgcMG-y8w38LAkX(hQMM8IFVf{gZdb)UO9)-x3y>KwDI5B z;P#Lt1{)EpHcL5=kXW(lYuEIszF{I&N`-)>GCBg4U*glj8s}7;l{h%vYyqGyQN|#L zzK6mE7+CMceh2VtCE5LG2oG&GbCOqQ6mX~Oy>M>i z6{Mog@#ohOGZLr0sMlVn3V#KMW@<>4!g3)cmrHjYu8A!j88#_N&qWQ6&sZMA0``84 z)9B*r4+pM-4%@>`Ca?^vg5;#rvZpDkCEX{VcQ3746uBJ1jENgsoT(?RUXry*w?TG(l_O%1 zO}U;2s*C;1@8^n%kL_I}glr;LuN`w3NID}YJ&i6C>;S;&Zzsq*9*l7?(^l&q2J+ZT zyhmG>ZO*4mvQTjs3|+9%&bZoYw9x}*>*;bopmb*|Kuhc@SDqO3@taEf(iW?{+UE*> zT&;3ov;27k<~+-X(R0!37P<%=w$xAWi$nsN>bsqWq{IJetNhPR`|l`fCz`AH#K7_L zU0DPz1f^V7Q<1#G=@y>22p+;vojEl}7gVF6ZMvjSzI5EKY=s6Q)@EAJ*g;w6^8FT0 z%D`D}9N-!!rHe212_6?f?z0K)R8nB^x?t|2&l_j>98E>dh;OtRlrE3OkLtH;r80X@) zFo0D+U=C6VuqKaV8}&T(w0Hq}54t>f4xHi@C6ERap<@5Zyd_`0dXNSD_3Kxr68Icr z5=Mp>GO?p~C~Yq`2u^;J>0<@Ya2lm;kMxntpB=y+3tREQH+Jw^jMzB$?X-DK(SjoY z)8UW|JJYA%)$j?gJ1+3SJH&XZmI`rV1Al-)Zm+|Gt^2$;QA#RTGMTi0wmYJpFvRD; z@GWwN0>q8&0FEAjKO0Hyi~9LuO7AXprTQW-X`Q#yNoGLAUco*oci{Y_MuUgT0d(n^ zqF-0gx))lGtB|G@Cm@>5w&Q7!;(hm2gL0FlPrnT?E&eHgFG3g3tTl5ITZ%ZL6*i^=%0V`9w%-YD1 z1?qT~77_ZMUToHTX%eOO)IWRuB)oj3grJu%l@J7a(2rk#0cqL0uM}>|ea&$tT@6?= z(f7p-p4SZ(qWkb{&}0qSNn!>hzs79FSc)k9?U2uod7f3g=tk+J8QZ4yG{LkESg!QL znc)Oh8^qZ|-=gQ?fW8o;hOP1k>7;maMn?ak(?qhF8Ls0*Fj88F?s|>=>R3Zq$EQ3Z zNp|ryiewcW(vCSsH7FKoekK>X4d(Tug-1aQ@mh2|^j#S)msIa$FM&1Hy%WdUl0VK; z>sq2x6$b1Xu|_||2whM7FCDgIY7Ndc`m#Rj;X>ap5EioOd1Xi_Lsu6MjmK}o%P-TV zmm@%kFXRccy64t*ORa882sOK&(uMM~=w4IEAy5o3YWd0R@k8rVB~BE-jqUK7ZDfj} zd>~N(BgU=-+LY3~s(KaU-#jU1%zD{wnAPsp7A1wxXvRs3rDTaMKf|-L5hV5&lr2=x zmcG*ju@L8eiH-ujI6b=ErCx+fDChpIlzU{DVG~0;2u>goag1XKd&8nX0XPgn0k8@j zjV3J%>I`fkuH+qIAZoG{* z-BEN)T^Xz>nIk3!5iDB6+O5)B(tn^=>$zSXEVA~ca|VcbL0|q103jthzz8zlDkf@o z7JaaT1^ak)f*{ycKATUD0O}M3@2H8efpgL)xfA|;hPj+^DbFg1AD`c6{?&{U805?o zRQ&j8o%vk?uWgzxc^0UW4LQ>SUbiLV<f_QfII+ImBpAEETVrAzuT0aKzIL4HZtc+tWUh5vN=w ziQttL!Q-y>cihsBP1sh3`d*Kd)Wz0f4hhyGQb9Nwf5^-la+bPOsp%7+?`&-!vDd!0 zm7`Ga_&3~LtJiUke}MCcl42POYg)nY7@=5rrF;Nm4o}(BK1u?Kl*J^Rp-7acFTJtsM zptIao?M(9rfwK+Jqp@sWH@9V1aDH3sE4*M#!Ajy(mhHfnk^+n33UYEzeE&?$;Rty$ zo5;6lA{-pAd(js@x3)p)8%no21$U_s;G`S@ioyg|gwzQ&TmUOITxiJ&Mu0-5qGbIX(p?d<)?bv?XH=aX||Ls^Kt^KQOU? zD`9_l$^&2;iCwG3`K3k1?^^>KUzv3@l0*o;6$ixLflxwwv~@I+L(O^$h!Zd$h~8tL#&TWkT>BZpJ%U zk>k^R*|tWtEn#Gw1@P{U_U!YjGQYV(Y0!tzZ5^a*4B{<=oHR*Ed_GcAXwq2nwFyxH zNH81deV#HllU1aOaTxw7#Gx$QU#Dy5FuF+$sG&9^Xllv$rdtZZ7KlpVUvs@&OL*er ze9v-k7G5T(L6Uf0vsX|$OVz$!jKBtPv-!-TcXXy~3BS^dXp7XfcjlCKykwYA(-1c7 z1AcAkt9HZ&7&q44x=+y2?NeQY@;#I@JuTAxDHWx4mGOs*r@(VVGHX3L<_}~543jtk zD1*ZvH+fP}#c}z$!baEa1{-ilXBXL%Cz^H!@{Ly3fn5-M;h7KGtX^DXY|Ozo?+~bQ z=07t2Cd~s>DLB6xU~ou7saPfT!l}=xA>=gSyx|Q-H_cQzf?tU7K&AOL<4`Pl++0vH z%cpNhF%_w90R|H05jn=*(RPiEl@GHOqiJSOo$k=9_hAE)j|Y}#Ix>o&zyXom!^kqs z6Es>*#Xe=Yr;({0m!pZ!LECLntd!4qF0B62uySwm>7l8t&VJ`Hk?U`tA#Y)}lQ4)1 z5Z?eRe5B2dCmJfb@d*a7?ni7+qiVOkQ$^%v*ZT;5$4=W^tVW&(2ltCM!1fq(xiu$+ zhJ=fdh+RjW4_jbh*&T|fWf)LK8>u%sDqn%{PL61+YOo76?&Sih;m8eI@x_GSQRP@8 zrrvmI1@!j?7QsEcMo59?7Qs3MEvVd;4DW)KQgXR~zilS0IeWmDaK(-(^0%F;EvI#F-75$MbfXT7MhzosoL^v+7;#bNKgUY=DRLMPAbS*f6-v^0{cs?Yi3A^R9<{k8&#jDc-|f?u%uV-kgM!nd0BU3;qfG4CKC*afCw*p zSW{GOTi^$*T$o6uTO^y3 zX9%Uv@P+rd7_wwFge6uGHHkwuKo=v42?MkobCoED~?mHZHs+F zR>58a%_~>2Lz^&fc12bAAhMHD4JD=M4jF8YnX^>9H%B{nc;;*(8Auz%7&YJT9h}d0 zG=@Y^dvaVPI+{Qtwn{*s5t~9)cBL?G=PU%;uWDYRBF!8?nGir|_Q4C%i$;C1S9NkZ z?qUbkkT9x6)r7qX#w3L=YX`RFaSM}TkraVGQTJl>rX^!0&~x<-cL;fp^;`BT(9pJ} z4Qkmtcd^Jbax_+{L%PTT2X^BaLY*S_@+NE!N(CRDdyURv0noIg{=Al_lgjbiQH#0( z&W8pxc+%h)$idLL}%XSn5C$z8(A28056QeSUyY{sh!+_L8^}MN2H9MPPrU@_` z`&PSz1#tp6?o_m>S}URvk5;NYyhxR74+VzZ_A`K{sog-MYf+QW0WX9`d=LT!dafNk z2+i1adk~Ujbzi`@_pJlfMJX7z0Ml8KHHh7*$Tf;Xgqk*dbEjlt?PS;^5hgx01)lW^7W@T7v@P-nykw;@g{K zg(qW(L|x=B+9~69!cG&*M7MEKOyqKl5|1JCV3iD5o>m?h*Y!)2*L!PEhmkilh4~0A zWSF43wa6+3Z8qCg?+4#(I5ee4xJl=PXT?$?yigVA3(2U|!|9=ssB1lULs}+O_$N!4 z=w~;08T}EPmr2dt0Cjdg1W=Yc$Pkn2nYh;{FqrlVlvfK@YL7OlFS+ENr`0jxP9HXq z!F;vJ{taqEtEP17vi1(rkn6AeJURfEIEacdxI zHK}qGz0s1CwSfY6NqVw|&I<`Yk@4zxHx9Rryn7x%!b@=jE`3v_@=}Te0McE9m(6zp z+*j2vAU_|@LUf){dG8f7&3dm?AAus8WdaDhR}aDX(t?>CYvP2KO?lYSFqm<9ij_g~BZe=h(3PWbdcKE8K*!x|dkpth9ritO5F0LSFJIHh@@F#_&bP7?RG z_{JQ~F|?HudTbsXYp25F@X9AuG&i}|@dTyLvpk72xO6!}J(Mug4qgKR05mf@t89L_ zYWFL(cd|wBP^yyB=nI<)PGa_&BR)lbA&}c4&5m-Lh1Xtzs8*7zV0BelGyZ7PlMzxX zyVjT<^*S(U)jFd$nm`>XM08&uJ(S!#wSw-5odd^=U8P(nhD!9=MWXgw$EN--!e3mZ zVSWkvj=uQg-{qX9_EBu6pCgqHA5#_Y6U;e@uUjB((|W?Q`GM9z7d@x@MBl&ypEfIv z(^d#knI526V#--uDvVJ}V8FnRB7k#~zRgwi^(}SpN0$PP{i!-RJ$>E+A^TG0*eW@$ zNPh>^P?l4hD}o_l@}F|CH*=z^br4YZpD&x9TV)H?;@qya_9sZUEXo zL-O6F6qS>F@ADLti8`qmKOs>N3^WR$l*p5Vl*>u&WY0~k)ba}Ae(w`i03#MkcS-N@bcpVEE|h`!MHIC>(qs>- zS?cZn&2BP?4V#1kj6~OiyJAbdNRhHzy5(3(TcwtD5>Bm|0yD|& zPULdEd3bNL>$#hgNj(e=@r%}MgqFwogn#w%D{l0Dr5}~z#(wsvT$CHc2~g*)bO^xk zk);W!3*m(LK!yk?Hrvj@(kwqV=vIdbb>~1si@alhN_*Vg;G4!iVNs(73(!(36^e?z zEiQaFPndGsO;5_NU~!@m9#${}%MVivXxMT(f)7bWu0fK+vtf_;0-QzbK^z&X;_KeZ zSxkrnq3hE6rr`$7i~v4uzR#d8_b53yCd7{mpQfzqH0}e}_6xdecY=;qI?9cF+Koi< z=u3JjNPZuBlqJMs9PqIl+zuF|W{4741-e#uti&VatVV$T(S_L1q#!j<@A>z!*u_@G zaRdie68X_yX?XR3HZhM6mJ#^d(xz0Ft)DG@#P+VEZ9L$m@vWseEZU9RvR7@ms@^OZ zD^O1quqtjw5ageBy8$d@H1AEZ4`gXaJ&% z)ZrQdrTNktvqW)2Stc0v$f=30{95zqU_8I6F|&$&UwzV`%W@~69|l4TZQ}i6*Ndq! zRLi7Vx_|@NSao>;k7zoBU)9C|w;h5$a+K_mU-nWBWL(>eBSa_^j6jNT_^MER)y~N8 z!DBW90(DU%dh;=nSrGT2?g~6s01c{ikHv>KUGZ`yr*^XI4pp)-mC)<7kC)+eDN%b7 ztL$EbB3iS0r^S1?w*;8KZfWsY12)s1#ub!dci1 zEuPsYA0yx~wjlWQjX(bPK)g0ESvs)UY}MW;D74yrYis3A&;fi%zC1_8q@ue{yv8Fe zmkYb%jECcXwZ`3dnY|HL_bV96Y1GYEf51r9!L>MRI|mUx2^$K+8OZEUdAkUjTwH-GlZ8!{o1;^3f2kJ5W)B8`Qyvq-< zq*KVPrQpP8lysAqYpZ*btj~yjBSF?0?@GJQu*;DGk=t`Qz=m~OQMgEi;eD5Huip^W z=b1BtMTgbC>i}an-BeP2yR#3M*Adu6Uv8WlhaJ}a_UZA&fMbn^L!R?#&esGxWa!6} zlq>Zva&i@v$9Hyox*?w_`k5XeuJ)(=F>doybtcG{mYed01!B}^7J8v*w38_N<=v%3_gbqex{SDTZyF9r!0E1s8 zR$~k#MWjlEmDqmEHQT+QksG@@;BJvWnCaWOA_jKHZIzH=L32}3hF_>f3Apv4N&7k7 zP*cN@)n+ zoCw((-@e1vR23Qjn(16Q=pweYxoiotf~Cv}zVo^^#qck=Q2JrGKxE3}7F)u)qY<{7 zi_!X5A3ysOh@8$!0`&{>`uclZUuP)uu{-zZ70Y%~x}FGqqd~=X1jbDjBJ#tj1HKDU zUXJstJ%1A!*-G1hX|vLs64jgL1Y;nRkCoe9P2+Hcjp~+jyku&56YU_NA8fg`mWH;t z4JD)qI>y(qIX({aaY{D<$r9E?`7`V%2FhDYJwrBqv1UrW?Xz3XIA7$a#Ll3j7=H!& zL}EF{PODK^gS~`QX>_z&BR|kI-D*hdxQPxXdlIRAswz41el8G7fNi*=k_e7{tna8= zwE-b>Mml3M85b1L7Qq*_fg!D@06MRi`go_NLJsR3CF8Yqp7H|j zxW1^y4)Bp`hLlbrOm_0Zqy0=yN8k8De1R@c4}Hv+dTq=UE@+ZU6R<4m@lk?>K2KHy`8<2xeXLY1x>%^lu<`bdSQDH z93Gp}%w_yGUQ9D8Rm|;4e}&4b+}OdFCK&U!TBY?Qh2+UEF`V(p7#g|DZgx+hZUQmxOaA`p0IayR_ZqC zK-6FXTHC2qah)aPMukIe%or-fR&pdK4@Hlg1~IA!Z=n~z*qBpYLrU)6Zc3lBVukK2mz%;;b`ArzkrlP{Uppo)q+RfIe%9;&DE4g4e$=XWFPubV2 zk&5slgnN-cEi?Sx0zviJz^&x@QzUA*c(y6oeNu${@YyittIy4|R@KfArDrlOhIuPRp*mifg$Nim{HqR z%ez+PwmTiPVr^The!+S{906pXpX+u2ymbo~iThbsf)KIUQ9z7z5rGG&Zz*fYiZmok zKOh)rC1Z^}j802oihP4x%xO)UwnKSoXcg!Tt|vh525kT|}O)uG|iUD#Y;MJ!-ZuB+bZj>cCCdKmV(9WM+o+oT#M_8#i# z7H2oe3{c=;-g`jt#6qe0XJp?ox;7aTAdTv-K}5_P=R|eL`l_n zM5n8;DNAzold*A#njIxx=|UYGDO#WcF6vMuovx}=qwZ@#MR)w88Z}ZrZy7G?3#b7o zqAI0LXm+^eoNFrW#@_!~UmyD$+%o0Iw#MynhnXX~z4nu^91K^a6(w_x3kg7e z(A(#eL<}s5@mQCJelOkL5yMlXwYKU{1anU9WbFQjbiVDfD(poL5bLK+& z@a#Rn`E>ykm~sxB6yK$Sl~e5qV^D}TuP>_y^SKl&jUN2`ZfxDTUG;PW*MYXOg**0H z6;_}I6A*(vZ8U~Sc^U5Fh1mazBu&hY{d>I96}~QXmOcFRo??&Qvs5zynAwY zBxeZ@ENad~vPeWo?Lk-VIhy&G_g{W|89x2+{kx{N_C$!Gi&XYw;m^H2g3S*t@n3g# zy>nNvm2DU0TLY+KrwLwkCWT ze@nm>xHOe7Ur=fF&`MS%H7S2NhcEi`8!Vv5_W;2EfE-5Z9qkIBEO7)yQQ|msj1`WF zRCREh;N!&Ev5FP2%2umo5^Vl8T;JHODxJl;sQU?rVk>CK=$+?%m^)X>9QMn)bXA+4 z#D~7TH22F@l0Z6x3Eg~t`jhT^+L2OsVDa$jmZ-Ac86<2Cb3iS4%W`%WHcq8;B}mpF zM?Xl6kq6`68&VqtcUWxHT4zb#yh9c@S#Z8z?A0VsQ&ZxO>6x91@svW9j_}fHRNyO1 zW!Rf-p&fx?Rv{7fVVUk>Jt|Kn3iH!sff*e#0YQZrO1Zgf;l}URZ+G(w}-BZqst3m?D1dH4-^^eRC7-H?CFzgkY|q)kv& zxN5@O1rSmf@vb%HZOgu{7Y+(iN)46u4YPY78Jm_|z1W@$0hP%CTr-Yt3G6nTu<6WC zHc%Q1c-45ra%h%&8^fysGbAZL<;+P<^2TKk+83RuP53XijxW9+YZx4l3pVZYT)-D_f za;U)BKVbai;-rA&48uk0s|$$vQ=P)Wu`m)t(%+%v4gtAHcRnerR`Nk4F3Hu6(tJ+_ zhJe&avw0PL_QbUyc%B-m?6xg8?5EH?yg>f zlQNb_Bfy^i-*PAo`K6V|vXc5&!lW#kAG%bux=}Aru~8|`o{+hx6d{WNz+oYWKzLmN z>j;Tm4T@GrgPz}W710CqK#aYP!QecjU z6vzX}zmHg+I=Zp?EF@%xtz@#v^@w;+d;d{z@>?TFl`~9<;~v2Cg>OSuL%zXS4{_A zp1c)#nuFA1)Sugj)@)aeN_vF;ZiqCb)tl1L&iGO50y)3bTm`8_dz*$(TQ7rU+L+hX z*fkNqiK-Lz|3qG5;HoioVT-rKz#_-{R85D;E|()!c4t%C5v?gfPTNOwEpp$Q024XL z9GthS(ALKy!`$wOfsFnE-vU1V4ZlC@cD2hWd8#!E}%+;}5TlDG8I$ zm=Q!Oq*$!gZFs8ImGmbA<$)=&$Brn}}w)Ch~N0j+|SuS>-< z;12Rj^rMBHW~??`D-8K)2meEgRe0DD_z2+>n-KN2!Es)IC6`bEtLn4e`-@ z_eR5|qvDo3tS$Jyczr0(ITtZUI{CN2y=5^2klBX9kuAI4!6C^rMOUS=X*;>N5|b>Y z;|cdkPbmAmf+^98QNRR1OG`=XXL}Yjl&)a*fL@lp#;nsO#h?D?$9F&d!}}lP_iyX( z|M30`dHtn&6#q}?VElvRwSO=TgSUKYT5B;uJm&y)olpW8;zZH|R3ROOADgUqn{TDc z*_ndC5l9V#pp)IoKE7aKYH8un`AA-moRXr_=N4%r-RD(DLd|j@Tw?>Mqx`8?k>yfI$ZQg=uCd6^Wu1o0% zj$cWy;leCdJt>1e=Z}8#{d=Fj8Qy<%+h2T32FSsoyI7C1ShlBUZmeB!Kmk}J+H8oj z8z;O{h#=Z0f4lVdV#tyJEJ0{0D697QV z?ki=G{iNG_>&n%_nhsctTtYikZO4Z}3XDmerR?C8*l*$S&w*htuGm3mX!+(;Brl{9YIMWW zx%gCA@XKsEJ=lBLT?e>l!1qEWWT2QGcM(;SONt5z)c;#hUrKuxASGsT2X0E#sf);@ z4`R_C!TkmAA%2l{YMcW)asas~Qgmknv7jTfst2+n@`ysq;op|=A}EpS_!d}tOO^G^ zcN`wI6kB_dMv0vgrf&`=vtyjihVx6wyO>vf-)=}!sEK>lCd_p>0J|fM=U3D6rh^RtmhJiC*;z4=u6kgA;8HqRDF zlx8BEuTVD!P+O#2qm+<#Rk2L!xD`jvM1i`Y9vk!pU>=lBO5Jfyq0|p|CEeVleui9z zB?>s^dZE0mYmiV6JSYO`aB{1v0kx`CZJl$^4PEHCwnL|Y4h6%-wPQ@)p)@a@fMG@}z8 zCuc$2im85#6$YfVA&JTc(mKH{DO4F)@{SaZ(1f)|dPZX)X9dDjjU9hrdT3gD&(FJh ztI>T@UgTr)uOB}TA74Sl^k*Nx|MbK6pT7U#(~mxWjJEY(q-`}Llk2?g>vnwbR2ppt zfGpZ)LsUvF4^_x}!zPg#1*uOu-nY(;+LSg9wKTUdRE+F4^(o&Ll}=;#N@EGdcWHW- zun5gt%ME$nmtT)1OwwV#XX`=)gKtAQUA}LNL`&?@sVvcW_W%o&CsZS}=Z1TRu0R0D z=%(4DzKv-Iq_e-lEKg1AMh$oQo{}M@6;Z}UM)_3M6I5wYCkq#At+16e2kui6 z6ns46LAEZAg55=AEW;;}yWw^wrJm$B9&AqPF-XQjEpkPK`IGFrd>_^80qPg) zlwac2$q3IF!x=%o<9vT@kJv~?JCGiqpyRMMTv5H}SAo{&hQwL+;P{61+&*&7V)?TI z(y?tT6qs$NyVQ0bg*P?6Lv2(6=on)TU!J}{)3ZA0O$lN;U)@_Dv#a}$ zkGRvTVl5H|tJ%^#pIwR6`$Wtm_&B#s0&L7{6&j$?quQEm4daFfzcB8WnF zYVowk)x=e9rU^nO4zXVX&9Aea_Ygh5W)5f$3^)fYKHJbznwgJj4gAiWXf7oGXounV zfHdyPZ%x>_pKxg>JVom4xn*W(fZ>2sMWn-GD1y!=Hm>>30@T|f61^Fky$G{eT(;B{ z#w6c@3kY@F8Bc!j{wv~Ke+xy|ufoUAZ=b&V@xR`GCcpmn{deKh_ujwr$G_9bucXs# z;cU@HJ&H+1lX9zQNgGC~ykfLO;O(XZs}ZgOW-AUEXLKJ=cfea=)@F}<53bfi9`ZE9 z-*H<`p!bCEtgj?%ouk4rg}u8CvmL=9xrjoiD715d4x%6yjfp3{WB7kj&j1^oz~`ou z42I=e7^vDDD-L<@swS;KbQpE)17NLIBDbqNQVZ6hRvOJXL3Xq8^HDNK%Bt2Ff`7(h z=7%?WYP-3%8NR&#hQ9~C$oCU7&u`^v{kLwfNc=O2p}p>AmV^{horZlYHh-jg?VZcL z!Z@C-z%CWFp_zBcS6SaIH8LFQQm&HgNqr<7nvxg;)Rvn4baekdc%KmxHS6l1Mnb^Q z`JPuQ>t-T3^i4z8kvKpFfSrISH5lu5`BX!MHmv-KuaGd;#S|VZ6e)Qk)er`GVyZ}K zE`Tv+*W2;%f^&Gf$f%92WeU~XX>YKj4eM-3#->$|9QE^-v`H(NOefBAjWj0>TikB< zvUAz*9@qp#94hv!ZoA=9(<7i{bh&}ib)PY0rR)VR5H~+r_B`H-e!mL0(Z3@qq=)w& z00Frea{T_w|9O?_3Ln3`TDCxt>yQ5(zkfUMWB>T^J-Yn?X-C0N#eCNdMqTpSUY_S) z(JU--AU9#sz8%@rdbdjeOa=9cMtZX0vl6yAq6p2+|Kx#!bfC+k=yxs{; zUE{-j3gjpvws?OAwInW$Q72c^Yj8*~rZ6-cofK;YXJ9*sC6M?oQCyh>Tb7e9+~K&7 zZ3jG@ZF*X{5(B%s6@Ds*W2_VbV>*D4=WE&lLxGkA4GaiebVcQ(Y_9{1LnJaA7RB<6 z-tXaV?cZI&NTz|YP|H=W)Q-TlwsW|krlRuIvAvNe$Wqb}8naxMkRn-WRxfk)r#LmZ z3qV3@U){(d^IRRVNVZweIQfR`4UCv}TMr5YZqmR@8)*8GC#GMWHpo;&Kqenbi3k$c zM|+KzQa+UAPp;FQ`&P8;2VDuJ>*QutQMx=PYQts6M5kou;xG}{ZPF>E#)f*yHy(DP zUGl-kthFhrvcC30+W>=iOKl78*3?$abdma`kM^^oWN172!%z8?u$FJ# z0~#=QcSe*BQ?a^~^*Y&$>ojA@W39NtYUSqEIhIq)fPotFv4}2-zSuYrG?bB_f1QTG zyOS`L%r>fo?TZ^63Czh|#Nd%G5wDMX-KY;HwkHO|4O@P4<&i3huV3IBdZ#N*QpexI zo_G`{t~oB<^izRNx6G9cL@s5(0zmW-Ds^4!S1^fF_Gn*-xJ#q-%ZLK3>QuIXNK83A zM~~p4z&2cREB(haHcE91{N8sA%N=uFdneSL`+H_Ao;UP8Ji`zxaEkLMFv(vS;s+a?uO7-%- zEg`9Gi$3Wqm`6ZSk;uHXLqAc)e9N%q{4irD-x6L6Y=YryA;3PXa4ZzDtb0u>^dvuX zg6N{#`YQ0&!L>zy8lvF_5X}-{&0vqW0$VwL$$ zz~&PoyZ$fotS{ESpe{gB_E=v`;MDjxQp6dsT-R?4FMCGpTdM{JYO732;!$G1DT`xE z*!x0{JqvXu$FIktgs{d~VL(@%vBW(}era@CRa{Pe+jS;*Bb})gP!IVQU+iE3D%Ngo z?WWlqfJUuS0JeQ$C$~j)SKu3nn=`k-sMRg`ly-iRD{e;*;71bqFeN5H&-IC)m$#U1U@tD;e7z5@X#@)+D+g=XP*UO+v|pFl z#tGeT_fY3g2&d%P0j$-hZ~XBa!2qI_3J_Uoh{4F?CPl>tHPbo`1dbx4V-rPVdXAppESna}Y_AM`u=SA?V@)QMJW}H8Qy8*d zU&F~-vQbTo@eE;6*0SC+?#ncEu^M}eciVr-!#)~3=MJyUq!w>%q7XxG)#Y~(;sCn7B#i?!=;tnIk<%sQL5Ka>AVeO-~nhGmer_Aj=AeW)uS zuqRSjvR@xiEIfmfn|RWwiP4|r0Vg})=s{&2M&4-H_kvh=)%WUd>HuQaI)-KfxZ%YL z5a2k0ew%`qs5(S(wYCcSSk&+;KvRPQEY|(f^wSzoTJh?@4ja8pj!g*{o`hroS9Tkv z<4tcj9*n@2DNq&Oc#GC3H%7jT!~8fl$se(M!9@jCT&wf_7Tia z(BxqUZL)nya0GnJP(XkvtJk||N9T&{x`DBmB@i3l{vO)Zs^*(ibr+z$WKu-=dE)wa z*NO-;aPW3EEiti%HI1!9dP~I2m6kYJJvzT0029Ly$UP4NUupDE@wL$O3aIXP^DH~J zw-UDE3mRo|@aHw{V0KTVgRa|$S`fJBGE`#nOY9=$+}u=Kg{zE7ZmX@$$4d7?D{t!n zl_xy#(07z`0U9t(^Ds$q5k{Q}84?9vk%hdv1tZbCGShH3Fx=l5C?LaOtcRz9r`T6@#17GCG@=b~8pT7CW zZ`|H6?s>>TB(LZh?k4I4%fq%K-X-Ypz@1iL-_|e#BA|Tk{JKKpMQ0r^x}CeA;Fowu zKbkD7&bx}K`nkcJ4n(PZOa||4M>vmEbX~S}EuN64FYjQovSb$x@NU$VRsNB;p3p7! zT4BPPi1-*7$3rtp8h`?>TLExnxtZB!H zwy#ud)VdSFuD&Z6+pELdxuUzra$Du>O;XY)YylWntNr4rs077?lY;f=rXx~IUWz>m znnzjVtt%G$v<8PzeZG#-Lu46G>E;50f!LMCEmxoGrP*DgGWRY9?7#Z>p8J8z9msw8 z0eh4Y6L|E`7vR+syS68>aS=bC`GKqAB}ud@Oq2!nN1eEq3><1b$dd!YhEsKxbVpK1 zvbu5%xlSq5O5@eDRV7R_TN%=MrIhF04 z!yB>*#yax1PhBVwq2Y-!@GvQ$@a>L{6d#IcpD$z_Y$vZRA= zGVy|F=>V{!#T7N{BI4Zz!oh@yJ5;G8AApxwHhYIjeC9^9L^~*zl~dPBrSD2-rHwU+ ztD%}ChGRPFpcFVpn&z3Rs)z9R2?h;2(DWMol^@Igh1koT+aslO?*{w>80?5Qlh00<@=jmX9JM{9Wljo;O zr4fR30KZEMhPXw=n%$j#zS!mIUv-Xo`Woo0<)#93datrCGsYAS6_gE@Wk&0EXhJ!Fe)ZrfOQh+F@G2n!2;|Rs>@& z_10%3cHPTFe_e4ZdzqgU1@^{r%#LgjwQw*hv5INT}w@1$8N{xdq+Mci@oS&ENhUM*5nT$PY-k zPV7WVfn)$SJyJ-x>XQ~tV|BZ@HxU98DzG0phdB z`1(opv0XO5X`Nu-gjY+j3vI<}wK`|K44s!*^1aXp*G(|{_z14Hq@kb2nJI9=hdgWH zu)UR)RFo6}(5LBq28(^{vX+&-RfNi|fMoc_6I=P*p@1v`u{h#@J_|p$iy8ZW=p!Dz89XtL6R=l@QfB*hNciDquK|bqJlbnfK zx(uWmWqfeO4X`}bT6Gw%y5I)xf&fuKuD@^~3dh;)D_5y-8bz@fuMs%C;fMIxZ886y*zAW##&GvvK0>yosqlKye@3esDiq3x$t zq6l~ZmhUgdhP^7B1H;W?zfUS{fR08Ug3@|TMQteSA>DM+DnI*CGSJp)m`&q!)tbC} z(FJ~U%RIgkl4oCOsKiMw4fEZG_s zG}hL~)!^)G=geEen|zG>3rt9**04WHKD8)Aa?cv9c5I=)o<;^M0L;J0{5ZAh!{#lG ztUcxIY)IN=%q|%25RJW1#di>Oav(C0_R#mz*`x#ar$T+Ir0jwAMU&8_4up4%5}&LH zMG@z-odLx{epPTLpd76k>^jFD>d?Dup{2w{=*t42*tA@({tHySrH6|WU!@{9*&=o7 zMXy7b6o}jy9H~*oGb>hV*v6fc?CeB5z|~BenM(fNUU~q8bome+0G*J8tXKe{)T8dW zeXc%(?cG_8N_KJvA26qsufN~1V@`6wAxLgRlOh_aHH&EHmpaDd=2YEzfjvBTH#pgnF(d$vOuE>W~mz?cj1p+j-dm`8eoxyXp2ZcxqEKBk* zJ^_3UY*s!RUbh1-sFh}iCFu+2#EO8v0qZcGFi&I(c;2GBmSf&i&r#tFe0tTi+qObuReru6x?iHoCuH@`e25@yUv_j{Mty;nz$#u<21u4uy{z6+#Bpq$d zLb_yez=kjL4}o}=X6OdMCDu8k#Mc$b^TeF}W%&AeNPqe9TMEVgfsOpl(A6pm5Y_V>Fm@&wR(`e-IISXPEwB%TPrQj)YINJz?RDi zBrHK+i#zTt%EYiwIOCC(4Ak}9!>hr1 zLP`VkUE2C-fQV!qR(ZoYW1v3xh`mluu+QXbR?^Wta(DPP?5w*?G^X6a%e_ptU;P~4VwpB)^nae(zxw$19P66niF$=fZBOiq4P3rl z;AQfl9wZn_$_7abd93#t_jW-Cth4qYrIh(RQkY~NGK7_h7EwqeASDp zr4b=lP-~Oi81Dx2YaCjy#5Sep4i>3a2>* zWED$^LkrtyX}iAI+k|y0CNlIDN6AA$ms-xHlfbv2j2)@j%KenA0wqgQsJy7_z-eHW z?iexATtU5Spxooe@``k@n9<^!G?|t=P%{=De*7mo4o2hs-|%{EW%k+X3@`Lg|0euR zPJ~l{8R4>{SOT9`N+gW$XpRN0N__L~Tb*rOBW;DpU2#_JC7eziO_gPRKu25snCO0F zDS6BkG(7N>e*vEiJ00OoBhV^=r!@2t;IjFyFRJW=EeL?@PM913SI~*Y29qPTQY0@) z&fZ&Oxt-Z1v9GyXsxvE|u_LrEoWMyAF&t<=ty?wGQZs_64s}$tc+w0GTw+1{nU*Nc zE^%eHFI)7Wd2v_OXVX}hz$mm}YY%pan1-Y8fjvs6))?9Ej@TxYFZniqFMRys#_{h} zXnV)4hFQ+;yTW~18n;E=8#4CSOG?l#1ARZq>Nrnn)pQujKz(NF!=KcUA8qU zu`ffRU&^E8W8eWr%yHH$i&B;&F*{SGE)hOPQ-+eXG51pk@{WwYsOTqW74lD%Luv;M zKHRnRX*&1kk`uv1OWNT_Ff5z9$V+m;#X zRszj7e?ntNpTTvIfIH8m8~~9>@14>6Ae9v#?T18Oum$R&R&#c8dY;+gBH<6vw@x-Uo7%fS-EsO?a6oLgt|I7fjS#f(Q-MWMa zT`t?{P%8bJcc~br+5BmOZ2bx|tk2!f02;*z0Xvn8!gs2aYuXz2xRoMz4I~5aWyxnG&eo`IDMo{}zV6srn9Hp!wY_M$ z6%A674+q2_;z?gpHSu_npF4$jvX8_C*azY~Dy@8~uu?iv)rz_vuoF&~ZK(pm$h<^d z47BJA=1m7{T5#>Sr*sM>*DM@cSkxBvF_@ZYj}@V7sHZR08Mo!Hhs zT{;s-j?KI3fqt=bASh*ghQ}KNH~YQe2lp{tKA&MNsJ5q@q0>%8<-yepI={t$^&D@? zQv;oa@uXUUI0^ae-lj8BVV{PcFe>5g9q=SpltJ4z6;tT_Ty^puuGB19`^vhRPP$6- z9f!ac*=ZeA2(6lcyb^hm`071xQr*@N03N9Yf7h*orKNi~i7Ztc<_7)ItZkvITlSEO z1PgM@hO~B&k~WQ)K+1jW50j-R_ERhcO%YmNqYeNkkUw6lgtWbpZ$V-VcYaAtxVWKv zs!DZq5bBDtNPeSkzj+llw68lC;^)PA#PuqHuYJ>+Ml?tZRI-P|ZMV>U>S%P$rtu0% z?Kp7UL%{(vG!F~1=h8AO-ay)K`ddMGf;7n>{W7%c^otXP{7>7SRZ6 z!j^}Hlscbz@RH+|KMZ*lVpStIOd~Td6fse*tX|x|faANi!1yqarB~hcM=BbEC(==S z3sBA)fFrkzspCFwr!3+cx*i; zVEo-n!^x<-JKPr)PQR~A>fL3E4JMyO!xu$B zknmm7rLcu6sWY17vBaQS?e;9w(WYEc@YLLc)`+fXEO$0RU6}01qQ>QbsUSn)4zZ5K z6`bI(26R*l=N?QI^H34xU(cii$h2KIIoQM_VO_sa9KAx0ru?f!kp0s)-hW2o=T13q zdB)gKf_Smp%g@n@8MbDpyOM`~zSym`134JKS~?|J%qFRSgUu9N+gB z0KWUIeMC+#45DgU-=!JCId-V_9&ATBM6cdDYI}ImpJKBouA;=_#fPBS z^0GixF`#&+%=Dhz5g@wZ!!2!wstVW+0PgSD^}9qR3X776Y7LcNv%|4~CrpopMsdj< z<^@g6nKg?7GOvD4r9d`ZRYexuj=4t)V!B>p4Np6}hH?b4(XePW%_z8OU4axy#X5CA zMh|6(vZzn@$O3+JtAc(~!|F{=;~I%r?UQp3u`hNZ!jdD&29?W_hKVdi#G&Nk2~3Wc zbx3^2^rC~D={20113ZR<!Uiae&M> zbQM}(WN%^S%_`)X_M4@e3Wk1=irp?wsc+P5grA>Z9&IPH}s zu(NVNK`_?079;VMx0K8bgM`KbrryE2M`;Q;pavh0s-w`H%v$dj4is`_^FE0&J6SI{ zrczHE)+g;42pq6d2Mw$(p;(;5!Q_UeCAh$)LGCaUu;?$J=a65~HAzs+DEM^N)Rm+J zJH05K90Usex^snui4^+V)wliiWD|nCi3soCx;@nl%#m`>?0C#~2z1UPc_gWBfn8;7 z@JPG%~aszfLZ=hrGnJ3yDTSahV z23;aRIQL&7&Yc7e2vgs87n^x;1Y8G8x89YrupYsR*cz{1S&jVi-2@^04y(}i){Uvi z3#a^N?Zp_gJB=?&*zo~8A%Su{sx&#pSN)Oa*-;@N+F4v7-}m0f{jAEMtz=wM0OkTM zTpbfXVN15y#87Gr`TIn_l!)5{u`fDxKA;g?oVGf;1Pfi4nP7Hvl+TRe)J^jqyG7W) zIoAlMjxH<}=6?F}ufpH{RX$$d`S>yXqTVoqhNDO>Rm-?>qx_tt&@$f3GeMaiij*A( z1kzPG=a_5%ZQ8H?Y|47Er~;8Cj*XfV=BHq}k=XYvbwTyoC2h*o!&A`$qu0pu z%y=n(pK@l43#i*$+ypub0-40l6{b`=3b1!z&vGh&-Q;a1&RvQehzOtT$8pj}UZWkd z0FJ8MrI~CYDP5!k%AzYOeq%Pw{$H7_dKx zy$wd()8?KkrO~qO>Y!1d;$!O(y3=t zkCw*=5f9u3Xfdq@L7r9|w{r##)C+xQGUQExAT|%TjG7cM$8B3gk(2k(YA(Tn_dFjO zAE?_Vk6jP2ffMwW#j_Q*SA`c2ou}Q&+dB54S$QSj-sFluWt;uOn zZD}@J%??F}$@Y`}b@;D#*WQ2h@q^q7Utfp+-5&s4mb1WvVHJChcHDhbgQv$;av=B} zva=o&hHCB;B6e71zZRk6JSH12DYu=&jTu)xzbbiJCavEg+rIL>f@Bcz(AaF}1_D0G zt_8?+Yjg}OdmUiE`Qfj%K=>o8FF^WWrzQV z+UlUo_8Zu$n)<0GH4ug!bEd4XS8tskkgNWK z_uph7qTye4YQntmg!S1FJ5=8G4d{gRw4sxjRWs?ZT!ij6_Q|uvV9P=fi&Pi$G|cJ_ zYW)#zB?r>&tRq!oGb)w-{=(iBJQrBFxwI*&RqMReFeltOp`L+(x9&&24>Tj>ZS`TR z7)9jN-!N8{ue5vV4LSd6FXa7p3KlE#0E9jSla|$QPg+j5Lu}94sNh-khp8@ESj&{*JKziPu$uo1bjj-jjBe4eo^ju(2$wrUe`W&MFjbXm(4i+ij`7zkqjpV#Xjz^4ssfII}!48#5ND zKPY6$&hP~P?UwbCGTKbW&B=bHuSqWJuT@m`HEgwxITyswq#deWjn? z8FV>3azvSgKVb5Ba~h{A)yP(xBSYlbsL|l$w+(#BGYBh3BSoU|RNp0-IAH4@3jp#s zf59lHRU0$!zo4<@L{#8UNVoM}v4x?nC!jXfc zFQ&g9zVUWcO=@cpTLjQNb~4=a;hA=|g1Eb-S#>~)J(s9CNaYY@{qP3s2! zz-aN1-y&g*s^n0T>ffYsftlOx2d?)G2Na@I4UV{i$I>Y#MrsHEtDyW|Xr zPB^zn;<6IkDf^P6yCo)7W0Jd4=-_a@topG$%C7*6u&w{&bUK8s^mg1b09+BY)GUnZ zK}J_Bm9RN;F}7BJ!8CSZ7D-O~_=#H7Loii;%fDI@lS;ehg812vz?E^3=`%8QuPdpB ziS>_U2P!1Ubz3oTZ$X8P`zzz6WCANZR4oljTzxjF*1b)@E&vxd`eZ%UBUzY}3Zp@z zaP2S7+-qB%Z2~;}d_f_%oCd#uL3$itqVu=_ns*Ig%$%@gzOV`A3CmgXN@h3jf-*-k z9@0uI3O>+ zVpI+`JT%g+9YQCWNBKz>3tQdu23-r-iI;D0MR<*GTOvfDg>B2Nmi{{$;s72DEyUx) z%FCM|onr}EO8o6Ki7R3Ecfq#Qjd^AMSM#sJ~Bf~tohY&^{a zrs5^(@^17&>J+=Y*1uuKv_`meh29D-sa8A6&A?Mkx3WE~NURHisF_p?B@)<8MZ;Rg zx1|82lQ9aioK|t=lIlcBqIt~VM%L00UB_eXe+gL8q%nt5F_ZFbAP!6I_vB4n#60}m zsYnm~l;5k|)-H8Nl)LgJGcK_t zdjdPC`*3?e5*`nU2@zp>*wQ8P)L+BYq4#x}I<=7kw;nyA(yI4ddzl843VDcMElXl3 zr`XASg}z{To71LrW)`uE%Dgm(?QME(!Ioxv1cP|7v8I^<<4rtAG~_ChYcg*KcR##8XSRmgljH+QXS)Vn|1s25zq0pg&qwkIC?FC)zfPKa{Q)e|k*967;V2!DZRXk?XxkDkdyt9xmjJ ziXF&)Kf;9sG%0@ld`OJm2nDZwrvB+WAHRV6&UfB_XF#Gi1fO`1CiHb=ZR6)_cq(^< zTNXuf18Mq=2~qiFzKh2WG@Bn6><%g?54dP5xYjI4|;Nha7rr^r+&Ij z*w*SQ@07@Md4x?WM;#(q(UZa*m;qEKfFR11lAF(p9QV(sE?|@485kQcM{4%t zjGg+v%_L9k>jf7&CPn8NmLtB&lXY-GJGOGQdz&T8rT8BQen+fd5F?) zv2fQTlx|g}?t7p68_uYiSHQ5l^L8Lt(PVMzW4Kf0J1S$9E*FC_9w7O9zdI22lUItV)Y=ioCX+*1>MQLw)tFJOo0~I94`1pIkfTM(`}C+-c3c)$`cG@}X#={lsKX9c zIXVm2_;024wZ#ddagS}u(?*8HIxVN&)PIy~_~pkR_$RLP#XtEy&lsgKus*4P4b6wB zt)QDvm5)bI?XG;N6#tQf%rmH)34#)6$QF69+gOt4xb>;_d(DL5jhz)mluGsBz9ufA z4d@M&{1z-LfFlWLQf}%t$sDz4&vGg;?SRH`XOCLIdj3AsD(#B^<2h5Ee3D+Su_2gL zLILCQSmiN%K1=w9ZN)P{&Dgf{=$I@jVLP+Bs1pf^XkSGb2BY{diE8m~LpX zv_VSJG)y<(irLdZ65fLtAan!9kMRGdysKjPi{vb|N;Acag`!ehdd!VZB>zac*7$V# zgLX9ojuXA-AS&v&2tH6#4l-Z=^W3BV+LZsPM01g=`NfB;*T~-sA3sCeBT0VrLy#G* zuoj>Ii2Mi;s^#Dr+gs^j@z-*1KJYScctS>onLS{tEzxU^d%uP(y=u`2=Jo{(T@cjn z23f+~BcCpy;3|1$&$Wnz8692^=bpqLPB|k~eVBl&z5!#rOTmjH?(E0W*oFfj7s&>ONjn|7<0 z-%N}(xGZwMu=|q!v}z^{Q7!o?>CxR>0DPQDy_TAU11TLcX{8}I#YYxptD7=zLgZ=g z6y{n+Z3I_JrfK=0dxH$lumiaSuawpe6U|&_P{jbb^}&f!s~#I}7dS|S-F%P&d22Il zlHwBPZ>eE%m+odqycK=6aznOBTMY}5lG67xXu?K=s*TH zW8zp$P?D1eH-CwGX>-K`tZA#Ma- ziCaSe5A57wwxqLK?B}4wKUV5e3)SplTI>ibq)WSfHD&k{kzy&FA`-<;{fNZF3F59@ zX9N0v{L&mKe<&TeMj%C3|rumFsF~M5Heph zht&(u(&qAjc=V8l(_~WBj3j}spt&ss2*+~;2R;3bK~aTb;9ixgY2YQ8C&X$3$0SW= zlH(-pl=(@v;PK~|3BB(qnPOoFxFs7hQVs-=7YlgFh3d zP?L^=18$wB59-D+?kMBj4*9O0YF?*JVRpwcmB~1TZnF^`T@_yEa4IrOrE^H*LY9xT zePK>@XwbrkwE1@bQ z@4pV$+Kp-S_u)O0)?QgNKjRk!6#!6f=p#E$VLWbY2Q9S(K`E6?EjTIEiY&iY*;>hU z^`)klMn>gkb_V?=yCF$^9`P8?4ju(dz}@KQX~vY+Iw(n`?UgY&7jkfmwJcmoKyqKk ztSI2X$}GimnFmyc4m~Mz0yxV_hegh%w}*Q30X}sEPhf-2H5llmv^2OBMkQ8D=NSV= z4CmJWg+3!7&EJ5Ga}+sHe9lRg!*yJzk*X;HE08u(Lqf$(W@lw$%#`dYQR_o69TYbu zosrZxt!qh4u4WeZ2BUwNBNSN$6 z*c<>s#zX7{T13Fb5q+b?CazMX0s{0pzX9%kRGyWUf~`vnH>d6Z%9IezctN^Qn9kf5 zDJ@4PPfT+5^62B!@$pM|mhwwk)(nC3s^ldl|He1hag$0y4NqOcZz$!6J{aRlWm{4F zvJc#rJY7(=%W8QxJeMOqQ2jc*MB1lH;Y#f;`P&-+#_O#qEOj*D%|hMkj*ild)>1MV z4ivMxd_c7lly)OrSnO!Nq`D~g(`N`GT)ds73QsZd21gx9K!7GbsOK#=#f2J)DWANO zpO8|PKV!Hv<@ELnW{6=nn^(OH8&{_&n9U z9-*>%#;jfrM4`a7xB?P>ePRA>R4M_(SO9%p=nYHFJSkYT;_o$o6307*1|C;fZA%)& zAb+k5{|nK;?Nq=U-=wf3MN%;jmlfP}PJD*8?*g462AxdX={Z%NaldxZ)SA{XdkI1- z&L>xMD`UbO^Eh1{E}H}HsIR8Km3F_LjoN~{{F~fox34*nq+JUTs0Imww>wn%sf8n< zA|v{(ElxGTps7$$;zDE$sJ{2{!73YvDE2o1Y zOhD${jpApu&~g|1K~)dlEa@JGCz>GrojpbjiO$k|l(gF@CSvR9CER0)#$*d;;T?NU z#r;*u`16Bm*BEz84v3mj5+AChcx7i|07IVEz1KF<_?JB`8mj5yuO?9{=^|!4NB12E z9~W>)2{Ngh0+gr~3c9mP-L|Sg8q`$Sqn$q)!TgY*hiW42?WD9?K8O82lP z#@-iQr|NBR^cPQvNUW#~^0(nH|JEXxG>fHDS2y)Bw!`znn(Wa&$n<hmBg)fjj{s zNgvml0(ZV1!Uv~)^iwPW7z>!nO73_n(aD5_V7Fr)fl^~u>L>JUc`9HRE%3ktC zBQ`0nfcYw!2&(TjXiHLnY{b|>{~cI#dR0l6xciJ}fY^(@mP1ZzKA0BP4SQ$575??bnC~a z%cNck4tYAB2^=)2%&0Jk87?RFNchUoYkeOB^=NwZgIX92(=wVJM^BF`={GW}Bj25! z{XZOK4&OJG&EadzVw$!*W|~>GK>mSRcOlMPj`f;SRVD7t;xkyk`pUYH_ityLZDSLY+`9(zKikwal2_c>;r0Qri`;YWW`*4-dg{%xFlX=+Vh8lZ~4oFr=4N7Tlw z;)7b3w_Zt}w;sDsHQ{mmmBJsUMJ3L?LWVjXmm@Wxy~+;EZ&3jj6J=bUR9?JqhBM6^ zdZ}=3(8Pnxb^h?YBKpKK0byYes470&gIuX~n|oS9Ip@S=j3M1Gq6*WXLQJ^*k`sW{ zj1=7Okr|g0&^WEdL}e@If&~*ZP)@ELtkzDn93d-=F1C}g*IZ|d%l|91UP19|Vs8y(iN zPq*q&S{k*8jSejvlI3eB!6pnaeU;LLkppUI>=M2`s5MKzRQKuC>ks6YmOQ_tqeft+ zrlq=gEp9Uf6(Kt*j z)}#)VkT~5U;F@+S|2%wM|H~2Y%a1>V_g_lExag69l9CkL(K6H}^2uYi7nm1rtzRS+ zNwMrTUis5_^eRZj%)q;HV(SU=5sDN;A{!Ysda>nTi5!x2wjeEu0mYsgkF* z%n$7t?$+f>t_5^AQGyR7IcXde_-99+3UiF20mK}g7^ zVy?cggc#RCKVbQ3M_^LSUVa_6!XlUtm9QMEP60>VI}G40UOYBcCdDdEI2{BUZU7Rt z`<*Viie0g2EZJOSL)V_0*h^$Y^;4z`4eejUM+Su*a`nzJ%D%$P`s9^Kdp(*-I^-m_ zhvJ2XSgV@5E%1@!zYS=}%bzUd(VtEOJ5kJx$(YAJZiM8bl7roRYq3^%2Ii>r)2?Wa zJ`b}pz-v`f9gH`Zx*? zV@_csD-A@p6oSt^xa$~DH~R!}tn?o`qdP8p+?KZM;NL|7Wm5 zDAweV_C7RQP!ZQ;8tdAEYk*n0$*43vGD2pk0j1|{3@5iJ)H`DoJWCT#-nPNsX(e1~ zQ1>DFjK_V+YOf|I*GCsNg5!bQSSpmY4uz`W$4EpzR=%4KN_G{SJzc*OU89GMq9EsYX**mnBEcn`+qQQ`tU7l3wP8C2nBsB1g|?TCLL?`F18TFOY2I)X z85!_cx;SW|paoLi6v$3_fFpYaDOtgenij6Uj8HOs$ZUAG*h-s9XQApLp7KIR>_JZT zwR+c3YNee%hZ{i5CJwFEP)Ns}!_}}s0bsHr2E2w_RSgf}9H90~hD1FA=2@itJEQ}& zi3<0ny#z1G$XQ*bXC9rN5|iZ4+E*zKeyatL;uT8?sQ1z(7+SRpVdGL2NtdKGQDx$b z;p4aY2xXBY4#^+zqnN;d1*#}YhydBw15(lvi&~ns8DEa@Mh>5isWl zDqGjsG)HHDV2mM;*8Qw9p!a#kDQMcHgvGuDZYo}kZPj)P?c|fH;v{Lb|G%7ix0E(LwimJo< zAi9B*Z12knSGUWig{A_fBPkitvV>W0ciDDu~p3Td~( zYbl#{Ly5l94Bb-dk%ATZ&o*iMof>XTQvq}^0wDp28I@^ey?L-E46~0F=>B;&a+kq2?yPS5EP*w?mF*!;^?VR)BfYS19%4+_q z&6z*EC|z&VQhaq-{s=k5&8OD~A(qN2=EoD%!s|M+RNK`2iQ5dR;$H)ow5qt1UqR1h zl9Y4yRvq}(FY>9P4Zm7YnXS%8-kNARiG55(g9_EVl=gbG_6<^kjh)5{dI44}Qgam) z#1k@pahHXNanS;pS;7=+a3Jwh_Chsx|x%mWUp4=L(_AF>bgx|fs zhztJo{fEJ3Url>PY^l;p?AJIqcxXvRnQ?HE_&0GyX43y`akXY2RM)pvd}+Ffy-}J6 zhm#!L=(sG**~)1nVrxB}Ua(7*CI*8FIjI?FzWK;8FOlwcfR$~tc{B_!(le;fltC*2 zuqbw0Jp&7_mRW$ijj`eW9_k`14`CBu^pLe7?HFdL=9&#Ey9QceFLo3=^#HPIm^}OP zPo#ymYN{JJjbZZvP+wO%DPPy-Y(I` zZ+uCZQkf-hTy46LpFyIB@1HgqF)xZfIunCvpm;IpI zkp-m=o|8c2b1E2<>r=L(TW)vbZ!0*mw!%P-SANA96X z->hZ1OM+k)-IngXr!B`g`5r}09xYhN{QJFMhb>X4z^uE!JAKLc$9EC5z4IaUvJ(VOX9u`TF6D_MIScdOzSGDTs(E^ji ztF?)9{lJ}wpsM0;f+}7Aqot3(dh5hbC%#Q4i$P@f%3mDH@ zPQLE|xU>tYQ1|v#KI85>v-eg3zo<6sAE@V5Qa^zF9P28{>QGmi#p0|-?6)aO*|&qb zBx>OaTTV}NCE(^9Jj)NNcA4dLn&nAVds9&5n5{Iegit|{tT&Ziu_b#Zviu>gv$jTm z+t)KPtIC3#{A|;#n4O(Oc8$lDt@RF1AO)8mfS+M-S?T3Ty$0>;fv!kZq)a(P-O$am zsYa1cvjcG6B>A`7$w)KHvppp>KJ+-DHJtMuIds7K8lKAXYfph%-GxlaZl4RML z*t`FVO9~K%!jO8W0CN7vKp?IyZf`)!o3MF zBPEn-cg>jT<^=Jk9Z=<_*Q(KD@u4DW$hJI_KE9 znhLj*NPlqrq6-Yd@7##@d+7*pJ@7=@jT{ zT=Nk88wFL&)KMsy5yHxq7>uVdD<-LOMrjv1w&Ak^>8#Tl)#YAYGgi5@4>>h#nh_9P z4<@^I*Us`;7~hlvVDdbOgVY*j`d9H2RicRgQ0|m9<^5IAC{~|5JkLA~|!OHtudWIjpeew45^yj_|KAt0gtb?8vkM^f0*OrB;_a`Z{wq`4J5hzBNj zeSb(Xy3wo!NB5O6?L>=~`o#C6<;j7k%R08*IC-Y%Fg3um%?u~*;K*L?b=Y4_E2O^w za&t@I2bIFIb3l28|F(V?^gCYK&$m`vg*8uBhAV zX^vm1B#alNm4xe^3?2YR7%jDXUbBA4&Awq{v-&YEd&t~9Qau_UxCR{2tK)MRN}-6c^8bw>K}G= z93Nx+f@Yo2m41i({xsS$um^BH9bx&#Q4U*~-Hi!%Z^s+gB)x>n=XmL;>~NQ)BjuSb z!f$eh3Wi65`ayA*D`{`!sh<}3k0ef7dAZg#fX!tmwOy}tEj9r!v8SYB?9kN>t z_;PKU77Gn21#N7u&cfP~vUr}Q&9c)tDx zLu?I`bHN79@+c&Uc|7hVa+p=>tIGDd-!%rls<7TO-%9^wvjGX?;D})ppFW}P>=wA7 z7yo1sQ#Eu7@K#lDL5R#slgolZI`z8bTGm$#YqFZrf}i_jAqz!)=~;T89e|(|KO#YY z?_);RBbNI<(3C~Tv;YWc*LA2uKcp`JII`Azi$IM-UVy`XFrc-bgfgHZm^L@GC))PXh-9uUXxx2H~Fy$ySf)q+f!T1kkG+ZLrzzu%3AF6`9! z2$4WvsrQC>#)0Nzg0cecniG+SNt#%Xm)i+tm83qdG>U?D zL;K1p!!!q_-rCzp<-xVg!-O?HG0dU(5f+QvUXuEw+H&i};(MT$tHx?0Ck`(`MJp^ujjay( z_eimZ5-m~yO+d20TtG^OhTDUTHaUaxcy4H1OMXHUnOt;-j+9-e)#%Er2ti#tT0=N` zWt<$gasT@LpFa|edHZePi*%e8^(U2Yc4ABRh`x`&N`y$|6$m_-52gX9JUM1p4FRf} zG0OCZa_z1Q;%8oh-VD3Eqy42VFu8tVOSbVE&zv^FgnikYS@GJ zxTemm?68itX}4OSJlx{(rpiXHK$M=)CarnUs7X3@5Z|?49^S7&PcSL|qQKefPRWfG{mbo5brOf^S&})fxs88fnR^$ZNRCQ?sIV5uF zLO?5>j7%}rQBEWy9S0oHP&0*!vGUWss%#F z)!2YQnUy!w{~6@4SosP!GglRttke{80p*+N_r^z6a-}T^U9q(txxTfKa>Yiss!!vy zKmOzJ@6$+8(NjgE4?dV(ohXw^8|Code8u`E`mL(FozAF$3mI8Wo)L| z21*CFY=fJRqFaTlGV>4~69!sHc_3}<3s?DiR;dUMpeC0dK>fhMph+6*KBR7xN}kTd z1QuY)h*8UhKpyEm7lmT)h>llyM7saW9-vjW@t_dvY!M==t#gD23|nsWbaD@@5m2#$ z4U8#3Ql-0C+2L$AxHvh3qiRpeKt3>dRby=FvDX@+?DaT1j^WAx0s$|JcMo;DyvQZH z$D0&jBy}m7bZy#)0^?g~(#!WW*P!fl#MMI-uFC!+Qn46wf2lXnqPIPJ11>e{S`H!P za!zFlL*3B>kp0#tyZpTrB^1}yR`iBF;NJyLdV|pK+a4iUM`y(Wov9riq?9@>Ukx=N zrHC{d7FiTqVV9$;Vet*>BJ_MEgQ7Krh_(fh_PVVIAUBJ!4H?td9SyR9ldch>CLm5g zy;9m`>vJ)N@4U|)ocLcN3iJ+^*|K$|5`looRoO)z3QUu3=xnoLR`HQofx1~hBI5*S zD~b}1$&BLzR{r0O@d7KB^ z=O0spJ9cZA3yfji6yt#KdYEjfjk{WpBQNMSISXV{zh(mT6j}TcFI`pZfizgG@d19wDR?w39 zeL+n=whOVst@=@2`i~k0P{U4C%T8+n4&U%|52d`A+3t37p158J6X5`G{(W zN=Ac|b;KLiVxP&O(7jkf7W?J7dc?`g{bU%CW4WGX)O48t(umr=$gVhA-S8j_rt5xb!CU zg{q%$3+lqvB7>H3B((N$sG$nUsypcw{)I3yjl_V<^90FCwMQzV%D#!n+dTpekN3-mxfOdb-!;#6c_B#dX@jes{x~4>y6?gPjHdyBU@LZJp&*NWy{?$=F>IY2R9IBvG?V$E6^%$ZLp)*O!Ub+{aXbBzb6VN)M zDO75e!>SJ3NFbRwXhP!~&o0xqBaB==?rMBv<5=D5QmsgDjNR#Y4M)Yb&ca=0x~qF% zxFL73R}}$L#dI*FLIoULOc;tU>PAz@FE^~x<6{017#y{x7oV)AsY?g1p2-r`AA~>4 zC*_;>&(cTA-=044k%ZfaFW-L^-hO*|!F}+||4`*=1J}yElhZ(lX;V(pp(M%hW(}~ zWlTD!hXn4!QVLL|P`9e2v*pw#nd?H6zAanMu2dz%7zJuNZv8z}*6{c3on#0KUZpn4 zPR*t(Hy94A6GyUGNl&)mDtL8cFERSGornp@a(RUn+~x?GcDy^$d+)+4as92|I1Hf( zvNj=J-v+AA)a0w~4OmwLXUYrgkWP~tcup#K-yZ2fp)n5A!urZ(aOsY*+@@;6VQfn5?cC6&<&VjFks*VGr}YY+#z8BN8cfzT{B&7vYu9n=1D%(geI!2J=HB$-(qi0uMoL#qU*5;A3 z=+GJH5w)-t_W**VwuWmpm|M@(`#@>P0kmW|IRXJfS={b;jc8>&> z>LjK(;jYmv)Li$121o&N1Y{%4Jmcc3V$ZCYt5Wpf4A|01$J3+YDC7}yjE~0DHH(Fx z*x71|NCA4_KfH8E(?K9Vv1EwzMJ1#&-2HoR-wWwO`ZXQAHoV%F;1%*y&zfD~qkWa) z)1>E&-dDf0B|T$tpw7dc4SS+jQnTcI-6z++f=qPbl2R*rj0d&d7Jw_D147DQoxD#u zc+LX6D9E5nOs9<~brkgn!J=kO7C@&`M7M`b>G2Z&#qV}AZ4jD-U~zGt1k`b5N0&|6 zyD(dTeFaI=7@g8mgzE(Yi-@LHZ>l%U0699xoO*VIeV+}oIXHoE38_jyn6ekYL9;U{%v^s`Nu-wzfJ<- z@*#ajiuSi32K|uGkAOv#(OtftKzag*Y=>g%F_pHy`%$Z2LQp>Zj8ZJP!srf@*#68u z!U2Ifaa~E?mJXIUF16ilFY9ah3h{jm94)0obZ5md?<~tu_ms+Cap3kWMGk7e!F{9+ zg9fv^F~fbkx{PIvsL`9&v!xSWoMxZ|<%QCF^008!KRo17ka#B152GGV zu?Q$amtjDRz2a3$js=WC3l{Q{H?i*l_a{rDXl|1X0wsU)i60K+nJ^L{l(imJ(_~ut zKKWb`vp7QN1rH*1p^Ir(R#OpM)_&??&NQ#00W2)!bYn~%GepbEDLXhnKdCEAZS@6< ztS>IFSd-a5d3ZonB@L7?lUGk&>YCE{nZ8rCZlbeJ&=R%gLi4GBChksq7YtieB-E)K zYuDVk)wL@0Tg)1`Bnh!kW;?jUDkwU4X(Ra_RPkPd71wu1eg-PAU;uAD2+w@GpG zU~0+f;s!80J=9`*YP=9tfYeh>?S`4-ok9ZZ0=+wGw_sA8&B>#J#9QeurGJy!2D@Eu z*Ok~Qr82RYQAg);>E!TO{QuwVzrYs~Wx~C5EF4y0-9>H}oZ|@R#n53Uks;9la~RoF zD(VWsE?cWhGs-Cv2&|~;O24gg2Mkk>BThv{m0ZbghZB_8$&Vc4L@xFymwEB$o(2Gk z&Ow8Eg*(^FWNLPxV@P|byrr7|0K~pn&t{exyip6gU$-TgLoFsxG-bOUwn(qlVM>n5 z>+69Ejf5IBYT0*JiWSr<^4!6vZmZp`DQamz=Ufw9bS$Ree+Htq zeQybZ-s{gWtk_$Qt}Y^pDQQJgq0a7IucETtD-Ev4)9t<5nppL=CaD*n3bf;0?kENc zaEni$jl+(|pF3E2{^_@3Djr}1F=mq{Z)d*aT&3zKCFR6MxLrnj)Im8@a_=1?DRCWwjRaQ zlS-GE#!~Vzc|yc;ajd(9ZMmSAt4?#7ysnrOO{612?*zT!{Q|}Mczd9kSZSlNdbhU|0)txseMCi1u5YN}2roY|4R2u2}f?8xR%oo~{L8qyN#4+`l%` z{8n4@@ctu$b^iM8E6e7G#0vS3;&mv2@6$rE{T?R5zWAwa#d9eYaSd{)!;7{&&Ozm= z?jsxnWjd&?&ijaF{pkuKs}^M(6QTc8V4*dupIB3VmoOE_w_VmZ;cJDxAQ9a zV#qPb%&H4cU8q7>hTOY#D_!Uyi8NX?>|2tgwS;Z#GGJjl%{7br1Xk5CE(Y>)y?P>t zc9-kHNM})cgeTF1>q$U~Ft)ZgP*alF;01K4+IDgg${ylTcI4Zvm0f~iNCx(b@i!EZ zTAGSu4;bklqq`!kh{3bF{7>>xWSWeS+8QkISDB_dvP zZh2rnn-GgD+cumz(i9S#+qI7m3*{=a&aoMsmTd&PJwv;AY)<-Q_Cx?=Zj-K5(b^f`ftVm%3g+_HiBy7V z8IF*E?N-oAa8|UQJB0uod?MS}u*uOAs}4$;*VYITKrC1x<)!oejfjM$FvgJ<`t}zv z8$dK%q5}vyv`bIICwrdb!9?JstDOvf1Cv{a>7P!0EqisLNMGq5wv?!pLOZl-9Ysr{2JCVLK&A%_ z!zc;+*ujIIpz4a;dW8uRl@bp7?S>bcU-H_kX7z#)P4t%PqT5UaKecqW_XueaTgP8x zhUMT8(=v4f(z0#jP-BH^*_@OoKP<-W^+~Q4;;AEjXAyh({iCDN z@D02cw=-AO+)Vd(0EmnuTqxGt$QF`UuD1trw%uo4TW&S(IE8mgSbnI@5QnjeS~RGW z+;p|i(eoCXAcpV2C^y}%KMa5V=YO69*vYZX7M>rKq2Ki$lkoPN_fO^5Ux&9Z?MxXg zM~Yu_B^yz{Lm{-!Y~2~vNx8+Mbz}6+#f>&KwF^KIruVSyT$79iBoWj386}!Eb{x>b zV}MFr`Jm_0yPrt8R&M^D9^RL$RBIa;8t%0CK*^gPF)-PuSf&~8lS+~5wzdK< z(vk0}DfL#LlsQl`0+@<9Lxy3fS%@k@U)Jy>_ak{rP>M&+G-mjuXoIH^G;~{W6Klcp`sb{Zn`0HtFSAvTHa-C%NT_W|a2l2Ge2K^*Rekp*`R%G1+c^XE|oC0>|v z@TRypETJ3st7*_oer-PC~MY+qP8MJ<++ zQV>kQgybq)&BW-1s*<-AmL(4r!P>2dgBP_tiWlhtta!K`s&gzYQ_`6sEbtx{cSY58 z(X~J8@?kGf*Cz!!9T_wlVOzKj*HCO`bpWM@w(+{P(&Y%HAykyaMxrWZZnptrxuNXZ zqHsGx9Y}qtFLnue=xyY=i#VIWm`BJOFRqM+`8A{R^ERDU5y=5u%90HOd|LTnHUzQA z*7x_4n81cWA6{mFE$Sx?t&+C3)80CT*ma2Ot?)2g-kvq)E0+FYw}qo(?e_!(*g8x^ z-VIa2bxPW}?-0Uzf*k}}=;AY)xwWMf;>&V7$J1 z`aM#p6C#?@)^$3GXMxv|y>g#az`-^rAtOq!xbW$fiXo<#m^Dd_bWyAhcL;T|29)Pp zsRp#%z%YYmEUnMvluu?e1ngH~y8u8hbOr68EExi<8q#(`uJBi5^|DiOtnLe*VxKamB^F_k`T@9Wb(E+r;(o$aev;kdrpiXsZszULl%5JYp zERRGx!{*NJGtfb`2i8Mf#kfJc9f-6oBP{0r<9Qw;cTt{^2{R6}ySVmyTT!VAv%>RI z8JUwq7t?{U1c~&Iq$n?-Ooc{~EanJuj*k*`{*qN!TG0DC5Dbc?9ytfR*E*w7J3>N( zZ;ID3MHYat?N+1dFwY`XZ**E{Vz{Rx1lC|=x2SXv;+Sf=t2x+fYdrQIYUpmc67gR^9w0)uUYC;+D`2{<)T`M+~P}{ z^sMYpC_nG@>NYS5OYMU=LJmq{Q zRah!(srXUuF+}MkK~BzLacI$lQ`_!YzCvS3O2GnF&n?oJtz)LQ4v-gE>f9tC_3+I-BR?qJrEO#DFox);9BC?V{r- zt9LIaa%dk%66=$KMC-&7xjf2g-|jZ`fd891rE@g5wAZuFK=MB;VIP#luPq{mnPrWn z=5Ilqo^my0}v;A&&s39Ie6)$f?wp?R!^l`^e}oz z&jJvM_EaE`p;Jo5pFKDoNbALpX`6+g`#vAOE`{}rJ%hI$fJO>J$o)&81TZ03$=#@C zZ`E^yy$f0aDOPL@lYEw#rBu~E__QVh@NFkux9_vGRjJ4hf`y<#Zt+xy zG#CP8$DXM2B@SnDa#O_q9V%6raRZ1b=Y4}F2$~r3hFsqv5{w(*y)3=$CzfreIiLv4 z5lJoS$PEh!3CZuRqk!!A|tR zsago(DL>f>(|Z6`Y)|aI!U_VKYmUnW?@K!Rv?SaB*Y*v`RXPDV1`=s8{j(=QEimXX zxr5akpu<5Kj&%>NzP?JrsC3^<$WI*MfxO@mD5u%`6i77hjvs)8SWUyX2QocbcApU7 zC2{$h6YUJ;klImTFo+`V4}yu)a?)FxcQ^)0CV<6sByRcX2jZLZfi?*W0clp zu?}H43fR+P?4u44St4eb0I=p$vVfF&dP+*vQ@m&Is{>C4Le}A&!I?cpQ=l4f%a+p8-`2ELkpMChr`xo$m zc*2W?$yqUri|+1D(txT_o6c=`KJ5jyQu%QM4J>645vLd&6mPRCAYesTdGf0hS z)ATgW&IlY>zEu;+Gw7)>9$n+fb!tFhf$kc3a5IVX66@KV;CP)(un~-V_vQs72u3tk zIkbvtFr2+NSMrp-SX@4Q>fP*6Z>jsi490g7D;2waz!%B04MuAOU6_;v6Gn~ptA>K1 z{28L6pv+5-?GtW1s;pt37+b%xfI3U`>@Q^tlrbr4P0@A)Vud7aog!@Qi{=du=j=rwv`SRlDnSH8Mm5RA--Tl|OIonn6!nODT1Or} z+y#0FP{#BooV-{iGiCG^yjYm8ugS6^@gD?@Sy|c4=(~mCMyhKuaJ* zY>?-WnlR;|k8yNPu2B_0pTy8ReIJ0dfl6_aWOX&X1;^XPqdJtR;<-2F?}bL0D5e6XBsnqX^i&(GfkK#te76f;%&l7L zu!gK|x^4fL}}w;Ip@H!rPDkE%4*p&r)iAaZ&N-l&#yI@Fc`( zyRkOfMmhiKEX-gwWsK4~U9sxpj0qD8_h(jIR0D)b!WFT{niVUQUP58te#mj!wEMXX zrAjl@i)XObWm$>fg054v%L+dI2w5qBUSPpzVFP%1bNG3L$=8%n95h!pIWgAeN(y!o zd!x3@jZXTxz{R?mL}@7SfUlG-yrIuH!t2kv)tmf;(%t=tcYTbYcELfCc`#}Ev_!FD zgI-HCEEQ9kJ~?FKoP4cc2fG{xO&6XCjV}FKxx_04y<>77=IR~ZN)e+K2(U}k81P(s zb)O{YEzhXpd~vL5wFk{kslL$yRkhk`5pb}^bYDF-l&VBLjal|vF1yWVa( z<|+KEYFAPcuYh9XkfqL)sWC|Cq_<>6DXXP*Oife>$B|5=JRgF4z8e||3DL?4=kA;2 z>ZkADynS);0oDPSx!CQTpJotTD z$SISv(=hVj5upVj%vhlrWj9=RR_SFO_m_mgXB&AE?gV_=&V_2qVdT0p6IPkgh2vy* zUSlN=NbFB5NYv00Jer$NNK_ND4|0I~XU8X@o|m^9rQ=Xm0Dz>fCR+c&2Nd%nV}~G6 zO9r5BTbwx9iv56i6R{Zy{yjvsT2C*lRj%Re#aqPijqH*S|K;tZ|M0W-p9H>0gAfxb z|M2&3zXmS8LSD@ltFfF3!7 z7f9wxvaOd*cZU<`Dnq;JtQfkYL19t@18!&=;#d}63{)+yus*H#erc?L1zBy9fRtuj2A88?R$3aMmli_PjBC9kox_9 zVRrnTOVq&5B}}`)Y!W1Cwsva>{Xxq zs?O&zxR9M3%Q8@2c19#%xWFl=mC){wlhpN}?0ii)H!8L^%YUNX8yqdrEG?B}YXxah z7;&h5$qUMXbiBo-dj@;1uxv&*jnq zfUZoLTu65<(eSs>H5{<6ssW2;RkzmQR+|qROfe~JRAR}=2?GSB3|zEAQitoi6-Z*N z3Dh-}c@ILz5iORTw}ujJlggUf1WHQ6ZE`qK7hwNJ>Ld=-Gx}Bvs&7QCW8R`esA9rU zfn4=oKcIVsFQ zmyv%*D*B?oD3$l3Ix`rIF8l_f&ug)7!Yax*l79zr^S^!j(gKrSW(;tj&(L2~fDd0^ zxBf@kYDfuXP=;r%t!Z%p%_K#t{CYbQ+h$yoMkKaW@-_CJgd30;Tq+CU$s86q06WdU zSh(uLXmfDs+Dafh)idx4SD9(m5pkqgq-n1gHMv*XJPWww*>=rP8Hw4d5V)m*aJCiyK#iFc#}^Wa?^EmJjB>$PoE<6l8n7Ke zv!F((OngeFf@)>ER9@W`?*9iw;pS>^_>xn<=fYiTfMMpb)Y$gh_n-1(`0gi?OpS%a z{~Z4Ke@^EQQ!*1YRga0=Zj|x9b*J+e7^y#DDy(ZGn9$hwu&->|B~(^4rw5-xA_t`o zM>WoScEL+6X`Hh8+^XB1(>QsB<^V8Q_U<;F@pu63xi;5;=RGw2R4|spiN%3N5W%I> z`dSZi&kRQpUd_h={lPGVi~(CxSWBwoFr%XKfci=-EzMeHIKRm8pY@5-d2NcX$Qx?1 zw(tp1Vx2tzkG7VqK5+$)PuL?jlwoPXJhR2d9v#P+R)p*xXnU2N*iBP2P@O;=~qN-Q* zMWytIslSxNbR*{+ymi>Rr{gRM!nnJw8m2)y)DC*?;);ZBN=N(%dv%G=dQBeMP&WLK~$F3#m2oT z2Gw?)3&3Q}`K*mA(8_ub|7c836N}=@!Q) zTu%pD4#4S0Dr&%*Z6Mru5&z-GZ$A%jHm&%(_wNV!CB0J~d}GA!X@s~^;JteQ(zb(y zBl)DJT(2&SmH3I&swlZDT|ogBHyE8n3$qyk$I6p$;VEaGHASV@sO{3ju{avJqp~~CfkE}(vXj8lP89$LjvpOWyD}Y^T^=7e-f)Nk34nAK z_8x755Ap`7Oe}Frp5nssK84Ium4D;Ob;79qM?+lcIyi*1#VT=W@9mvM;OLfl)G2WI zFo@TZOw_VN`cg=>08(SaJ>bs>AD$#>4pZf`Jf8;wT*}Ld#I?}BHm$fE@QyBY&d|>e z9z~dJTj-Lmz96i)E^7k%qUY7=e z5Fezs)qeb0h20rv(6PI19{fWbvjeF=`H)#%1IoxsxhR{Pq{7^Pk z1qr1Ap_m~aa(4zC)bog~$9LJL>zpnJPxe6I4EXv>)^-Dl@T5`o3Ece%+SE>5+T@*r zLDIp|r4;RkR7gX{)T^}gxjAtq-Z)>z8$=4_%e~?}%Pp0E)hamY@I0zHk_Wa5);MD# zQQ5#FId1o*L&F~1;G4PYT8sO`L60=PXYxvSRmc;EA3#6O=qSxA< zBq>ZfIe|BduOwOMpnPo?_yn)BVo;7P_Vm2z&nw5-8^yoZ1M^4@Z;HEOtsGENU=eg> zz)*w;5Fc5^Lho*n0FvX!s+0oiyu_S;))HuDIdV_esEAj^EoX#W1rHLlTCGbt89how zEW=LLBNGfpoa zxo}@-4K-0tpTmokLu{F7M;c-t+JUXh5+HEJvVnIGPC0>f;PNbrGd{99ZJD&wCDdB7 zkob2SKa$^6J`|}Yhan9$^nd^TTXVGf@B;{S{gR2`H}7AlO2Yd;U!FkoNgd#W>j#K@ zc1ib);M!Lx^E^qQ*ml)gB71UaC1Bvz#!u`MF(Hs}d~$D(r@VmxNv#RuP6$|1<*{6# zDdJ|zjzH)k6tAw_rChwmIaF%GWKUY*q_kx$hoJVg=`HB`lKt(C$}LlVZrlJ!usI@% zA|rRqDo9Q_FsujwVNdUHaNVg`8l-79!@rgWMU`={)3q4H$Cq>D_PKzw)9=#X=$F_8UPbUmhf1R1cGkB#(Qz1kSB zYJA3pokaad3r9go>oy+3V{rksf?rU|dDlS16KOMzYm1t^jE>{Gg6)FBgqT4S1?}83 zOhRf2&E}TV-YPbpg3A;kZ9LE;1i8f)hGQpJvl1B7$!ldr3Q8434#R(P`TNvl9v|v|LpvC|OD(7)+ zZJgBY(%rne59l4Uzw{~$cfPP(3HNqqG~6caG?OSGVP9n^ZGO2ZoYpo_? zFw&VXgy(>=-I2op%>0M{`u@H2o&0h5lRwGv^4swCDex4nZ9`vG-FCB(xU1vA<$177 zLB0jLy~QfgT`C~04oSf&)Pv8xt6QtC))eGa?1cn3s(%B=pF%IF>jqAaGs=)1lSOR z83ByF!<|qDzL2fHbc%vlR9!~p3xM;pthK2Vz{vISAYIHFvzK6x{(uAN%YH(r+Cb+OQkE0$FHHaIMt4>}7$; zF|2ZkYL`@$`r=z%`t%>`CDko-kY$OJ7I)52$}&{QRaHwOK%{Cp;Jhczzj%`rj6Pt@ z_Hs95a+;K4P;4%J=@U3yh3(VeOJOs_QjH>lZUgMjPW;bqZy4N~O!Di#EOf8c6_^`w zsYqhOq6%c$a4eY{*g+h@@W^n=k=#U@wpvBhk@^n9hCv=WDdG*z1MD87!&O?n`qhqx zlvOrK+(YBqY0C4n8^3X;qO8H*pulo(uA4mHY6V02q4t1lQ5RZ{8IvR^xM_a38yCJV zp^zGqLmd>FeO^3{VW&zb1~KxNJIdee>i*aBO&3=Q4^_28ci0|%^l&htqdOt03#v{OVaK(Osa0kpp-Unw7VSGpZ07|NCl8L~;?1Rlr$vafMw-uAv^sawW9 zBpshs%TY%BVXU)Hth6q~Zfr9^+cXN;9))DpuRZXt&OXqc;y!!W4Sw1aA1#Ssy2f;k&Ak} zxTql?lS(K{yxA{F=qp*AwAFOc2rG|HCiM)*6s~dgE_`s)(g7Bogi@7P$wG(yj9sz{ z>D0K&O7kwx&}6n{?0GYc_D$MN>**v@(&?#Pu>6Ts8CG2bo1M{m+#g(sL7vo>ky?oH ztLsY6H&Us62ErYt(US}k-9TK*fDw8(EA7Emj<$TQ!*iuuQ&RF`im$Ds(aIl** zOJo+#pB5^8b-4l%dtwy?t_UeWCOGyQ8U1kkBZM~RU^@kdJPHpbzu43)@Pe4 zJIuf0ss0tPGv5pEKfwnKD834B|Db>Jb!u**Fe?^GvGxK`wBA=IuWcr1rN^N}LZu(n ztp?&pzUStm`T%$W-1xI2KW1$e!$}LDa79(GJ3D;Aoq%@$XZq;4q!rp76*Y(;0^sGB zLf^A3VqGq~y5vFm76UlgP;OrP!_GoA>Ll;EA49KGNV2lyqKoi4eD6!lE8lrDo;DcQ-vB(=e|a# zuH}A$(CBk`N#SkUI7X@VO3ovI*`*dMxF5}F!BpLo-PB5tpapaGmlt~nN;}sc+>lEV z&afSQ6@;XnU1uUnd9T@1nG%Z|;4FlsN+?S>SzQT3m<r40o*iQnjEpyin5+Tm^K{N#WOs)|j@K6_($7P|^`K&*LnmNG>c2HI8`&4lm z2$u3kMzF|Q!81jNr)*<*1LJJ~E7pzxFY6tC*hF z_==p2S^CeLDpc8w@TSH+auqqo_qM;UOY8(^c&u^DRqN>2IL_@EK|qOfN$GK(f%8N3 zVz8?rQH?1-E|Fw~L7Wm{c&Me&6Lya-RL!``09y zeNBVKpVMIRXP2iUu-Q#N<+4jTfEX6sD&vV)05v`89^@i6G-WkKICxTL#J7!5@f=iln_#`Yg6wJOb1{NO07a-vP{}eR^wz$31X04LZ;s{f zRn@8YxFU~Adw0EBNE~$iY>QJYet~SwGn{I%xi=~rOhxU4mq;64sljYFy?|MvcR679 zOc`OddEI9^oYE$`Q6YMnq3|OP;mS$}aqMWSJ>0FQ(X-=1kT0OhuZ)UMDBv zK(+t~;>3drkB6KzS9_enWPuETTVnx!E#1bk0K0O%TI^~pmtB`u{eNP~c%`!0cqkig zdkTXR`+fyxyA3lWh^?)<5UUcbjbsXt(}q*ba{jfvMK7^RFT8Kv!kX&k#hm;Yc(@R2jY&!Fv{UVLV;DH&G{COY$sdT%8v zy?S)nR-H&jE`t>Mxcd}V4nRny3Eif#{vav}5V}4Bx<(oqPD>;}e7Rv9;jrS&}fj({^aMoeU0E*tztcEC2yHpL_CSA`6tP=kX`U3c0V14H#m2iq*kV}pDC#VwyyZ_V><>tg017`uubpf zYPn)NaAQ)$ARTQdXc6e`u5k;o$V$0Dc0bqeSWv8!u7IT(^I7*=g_1a;2TZi=HP{Vk z{hE`-L@DPKiblHfbV(y6`N@rTm?ktrF~uOHwBqJ;39r@}LJ2<|fvC>a(>NBkK`a3~ zs)+x5sBt(@y*nZgFyIYWh8^ABQM*Q$JC2c4yiXe6rV~?H7%vaZwQqbq6s?NT0J_gXY;p$Nu3R^Ou8k4)|f^Wo5%_{EdL*Df$ zZ>KRG@?Y21@==GW^naVBxig^)l`500=PadhFMC(98>fe47jt&etwaypl^XU;#!RcS zF?A)yXJn@Un64GyNa8WO*2>u?Dgcgrc8Xw|QtTb!-)-faOrV_IVLmD7=Vf{&`PR;q zavbRlIYEHbe#lb69WK z5$3rS!%Ae3LieDpy_RRoWINX@T5hN%!>JVW7QS=+M~j(nq^7hn%B>3oiwtlvHJb zkxn%&oLqn`G6C=icR)vMqtiH~-o3e~E^M)a+hc?K1?pEIwkXPXIOY@gtMF!;BtL%p z-rKhye)Rrjc>f}W%gC{l6cvaxgi}81rgnWD+!;HB&^WX}_QWg*k`Z0)i%*z`O;1Rj z1D?Ltk^L2xT`d$?RZ0+Rx)nHs?^xifRik}*EORfIWPf7GS^lsbW$-L5;z@NT7i=J| zTi!!~#JhMk$-s=RS0%`WLt7;8bxfW-P7WFmBGpHA#N(Nhd$mkg`VjP4n+B>-<3Tft z7wJLVuVTNolGR1>*JlxbxgTIv)w6(%dEBhU^K-0r(;3S$ZB*I07J#xmGM*dIv!ja5vT#o3$r5!u3#}?BX{7 z2(se#4Q#$uRV>r-teaLra1bA}==X_SicS*pBUx8KdejhON!0w*JfsGJ?NE;d8Ld3( zeG}WCrmG!F{T43qbxN~WIUjN*?-Je}7!CxZZuGhFLR+8rt|yCiP+lUIY&s`qbCHSW z&6MouQ)t9A1l9Y}aA#P*C=fF{P66{R-$qW}r8=>Ky>EGX7<9*R!i(J$&0Hy?*Y{8O3rqaP-zsd2Pnkx|qgdPS4Sf#y%TOU9)_V$Fjl_J;H0)KA*1-`gY7b7Ir zko@}F_wU-|zI_?q^3?9_v$r1yzW6uP5eep%>QwT|Yp5TN|JG$edX4K+k1WhrETo)S zF$K_@u>i~N8yLvJ34&}u98NaJbrK*=Z%RzY33i`>Ly2>4TpjOmJEE{`@kOvV?0=!GpLT;S!)jiq!#iXg$?>rHGk=MrQy-Y6F6M@ zah!#Xfe@W*iI8(VnKRv{Zs(W@4;%R9j~YqcVy{wyP*c#;{vH$wb0R-P4Nd5-l1C8H z%%!Sbai@y7Q7gMBbBNSL0{vl_uJCxBvjpsJ@xAA^DKqGHh}u$I*hxS&ujmX?%6z3G6Mi{VhT)Rx}>NF`F5kgA}7 zHCM0L;a}PYLrqqp@;B#wyqk=JZUCNjqe||Tl%3WkNm+1(@N;L+!j^nPxJx-gZHNX) z+3pu9lp6WPf#|41l5@3j-r6zbMK1F$+6PI7Ph>BW%Z#V zB!BT2e-Zu{Ru{hw@89zEuZeazxvRea=5okEv6^Fo?1Nm|b^|@WX`Ie8IA4D#!M22+hMjuI;6Gbq zVruSze1JU!MBd*3Z9kc_Cr5%5*FXIA+pjRx$1wj6AIqp^K1G2loax(Pnmi*h^zQ*bM{<}JM$Okju*sxDqoZhKLCuzn@Y%qDtMa03NxAsbK zu_Gm6$))uXN^iM}c(Q*1%W}_}jth?_+UQ6l=skA<>Iyy6KNAu<$_TR>B2#%rolDzf z>I~=_Mw_}1x`eeVqV`E5jZ>quFGmCEoVbNO+Ie{bsOvmEPe48(4c%!^@$YL{mKJ}3 z^_mJ_{eaMAce6vQaseh5B1?|C9wkI`nou1Ic;(@(lV}!7>n1`6T0vOXrB>q}S`12! zVzXipr3ZV3zK5jbmo$>Lf2H29xZu{+Ng|!*&=MJhk>6>PSxtamwl-9$>aoD$6GR*f z-SD-YF#N4jD7I=`dYUS}%6&h%-ohnJ>ErfbD1(8xpH0WIHUg1e0E~Kz!OV$8QYj$3 zd&ROZYuw~L1k3o@`_G7#6h&@+`u>maU#DL~`oIYNE5u_I?{A;75c>PKf297&3-EvN z!cGD8**5tAB0$3mFa2l`Vq#2{ZZXhUR+Um}6z?m{*E`xXRaSwt)XoJb78|2O_YO;2 z(`g2b+rgn{tx`X4js~2easm7dRY3qC%_hQd6p=@zBTrzI=N$Kgmb5zc;OHWSW86I& zuHS4&J;av~Uze7>r*0%9nxIO-2u#koJpItpgrVBQsqtV(3@R%vWilK)6NpSVHg-&v zv2H-%T?L=aHz6((dvhF+3=EFIvewnfm^rnKNYF|zl75hf5v;(?cMr<41Zol*Rk(;a zV^C4I;EbQA-EKbh?d3AIBWP|?cS!=|AgypM(*o!>x^rN3RiJA;fExl}QUR%bWSAQs^yF*xGlrX!1S zD3mBlFMJ0r%$X1fn;)V}CCh=^Hf6q8ZHz(oB4sCD4Pa|<)G>s~{>2*e3=-z+0oa~3 zIDP{tklrfG3cJIdYi6l<;UUI@P^xJV<%|^(x6uEmG>aYSkRYSX1`-Yl=_P7j2lGPt z?j(O+;KQ|j;oL)YUo!3KY5?6ILgoJlVZ*Qbdk1D9YvKimbur>otIGI?V~St`a z&#t8_%f>~z72pzm#M8*1`1LiksnV5hiM|TZ!8Xw5uC{g* ztA&{9Y)Z&Ys@)TTZ%C!X-axjW{NV-Le&?1;oDV+A$O_r8RgGGY+FRtW1x%lhR_1ED zk+rjtymZE4?@IR^hvX2x{R!A$lWu6GH@A(YYUlah3@#X#I5cXaUGfmiEwuF&gzIKA ziu~|j!~5q@BzZo~g6oMX_5&hu=@deeRc_qWyVk-^5oZ-sSSq@6WvxRc;C7fOXls5_ zPH?l@9g)zFYP_r#dMfz@~-aGPL}Xex&26N zLe}Mg)J?8tuk`>q{Oh!54Cz&U%hOreq5oL5sP}6!dB$8eSE_PrCj`41Z{kN)T_M-! zh6O6iY0cJQ0NW#zK>JLZENV4rrh$FzNkfiMRkMRtK#x*iLTUXEjTDUD(6DW%boZ1> z#>$>&e7Gewel|NHSY}yV0ycnKf7P3?*RC`smy6i7BXun49hfYRNB}I-l4+ig%{*Et z>1L47Ik>>KG(D_XP|5R}PK-QsYaz!2U=9E`$m8lxEUW>#{wt8Xc&ciPG%iZf(Pj`h zF(OC1kV%5I^0i4%yN9y4v}&JpbN0Y(Y5@DTb_P&d4w}lmONfKw`r5(YV|L3&qnV)Q zK4(ZTl~b;18Dy_pbvR5k^-L~RWzKj}OocN^)l9t9>Cm;`Q4r=Opk&giJM}l{qBwh9 z6j%bagQh;KZWWP8vIw!{lSZA|WZH}T*cziK7b-{1lxlhYwNFFb+9e1K~y{!Re?C7ssSFQkR zQqB~3m=Ne!;j3p$TQ4+`8^aZl>)92&8E7kgU3|e&9VR11=+TBHzl|j1=I^LJC{3sG zP(FHxGHcsR5YD>W$Zx$tgE78Rn4oGQ@4Y;M~shFCG$4V zNb=)y)dPz0CQS}^G>2r*9p0pwzk#7QCL^E)1UfXJbLi18b995|49tSyqdyzisK|IJ zU*Jj)+54~Y} zMJv|Q8DIcGH87_^rwqGqH#w{8jiL_00j<+jY0E41k8kS%A84foP^@8Rm3(AL!@FBL+9R@o?pq;G29G_7zt& za}-EjKiP?UTy^-ISnBN-@_UKw^}zg=5$kVj(2TyjZLPt}L>n z9e`itW?HRw-D$LhQtLv*4-_u|mFc;~>z)yISn0rkmZI(hk@r!ucw0`hszWx}=MhA# zEve=qz8=uRhew`UIKl?fYnOEU8e1)>z)1F@P(Rv@1PYw?z2IPLM7h*96qVF*zJ-`a zwjx(8eb>%|)FzNOEcam?gT;idEc7!ks)l00MsE34%G-s3rNKboK)4XziJtwELYTju zCu=cQxJ%R=x~}nM0*#jWc9x5`LNPE2H}bmz2^xk_nV>$pkT}^M(7LFmhPNWQf~J=) zIhbVXfI)&uOk6K!73BMglzGF@R=#QIb=;aF25#x#5;*M$*5-0nIcN(&xi2u*uH%67 z&`U6s6Ef8H2sb!Tm+KCurqnI!yFjH3U`wU8#W?CEVG;pJ@Tyo6{6$?`c^WIY>bPtO z(hsMym?GBLzt;OTM-E+C)jl$X2+S4CXP%#Mi;qmNoL;=XM$chKMm5J9l8PO z^%W=v;5$k1t+F=FhcDlM4okJq-@kePk=lZQd8r@L??aaU@7}*i79oFU!0+c|52)i{ zp6yD$5zJTAg<-5PJjLu+H+H7}BsWF^EYyOk)9hBFXHvno_yWhvaA0J01anlh0JS6< zI8E4w=_7yLWlB=5N_cyK(=ba%Y&!N+iN*3vY|?~jN#i5^8t|+Z7(@%u=#JG|CX+rS z0Mfw)JWRE(g-+JMI021OV|vzJjpHKppcDs&y8CoXtmeC}j9G7WUT@X5=m0fCj@+$2 zMr3H4PGL1Qtr28mR938QZdu^7f!u;aYNEm?on20CvkK!wIX45y^gOPBViQ)Y26^^! z4IPU5vIDBz2gk*v7#a(FI-#Y9?NU-?OebjZgwFoO+t+kH`uZYg?{{$P`+m$U@3 z4RxN>Uy%YlN!qpF+{+A&-k~o*WHZ`p7q$j)xhW9tt~>5TfzqW%BZaIRSPWsDCI=c* z?5A58iIh7eY0J{n9lcbEj#32$+l5_LaI0u}9BK@G>J>~Q%dyQK+%0d*77tf7Ywb;} z7Q@l#h(^g*6W!b@ESZaz@@$n}Q9BC|+jfE^md&xuY}h7BSl)YBSRL&B>osR12?|>e zEQpJrpjOsJxU#QPu=wyfwBNtMsrWj)nG4GQ8Q#9S9Po+639;w!i4_e9_0PHpo7p5M zGDvH06fmiV$Z~#OU1$*Oxmqiovj~}F7ic#OT!Kid$n$8_?bE1|shl;!RcahrD8(6? zT5S8rKnAw_6Y1MsfQ+)G9hPkDt1$XwPt`VBpE$q`FjK6Jx3-sRx5R3xCPV^D;(^Lw z1Dv44la+A~XFGct8@EVMvyjp?Pn2O@WGf66=Qo*t`-EKB$vh2o4Rli3X=+#?+@4@^ zn$JZI6C5RxazBTTj%1j6NSi4`s$n>2L8J~gF0PJny)G*1u1gSk0Or%MQT~b!;&jPb zn@O?SB4K83!+{o>;yv2RbjkoZ$|tVGk+C-tpI&WscW@RImjRFoK5PhLIG*zK?@wQH zX`}V~zq%Zin+rc7U-?QtEuug_L4o3>Rv`*`s3Ad-RBNOPk_h2?Kro?NAOMlx;lZqQ zB>BQ|3}!H$JXS??@;1&e8UIO>gajm{ZX)18Afqp+%IHa?BxVQ@pq{Nid_pOXAtzHk zo~<03*fUHW@rF}Y(i>kf2NFurye<(Y(wL;$ zi5(YZtPoN^Ldqbnr9bHC62X4)%?hMMNcWU)6Pka_KnRz8O+C`Yv+$J!N+^&8?M;~M zUKH)rgXJy}zVx*kgo3aZBG}{+h=e8bfz7BN|)51ynhbQRF$Ple;U@#cDjyw#q2Bn za}twn(LJ5uMv~t;kFgHWlm`s_7Iv`@O!+ya#i+8pY`qDxNeC{i*g;T$CxDdw1d|n7 ziWq%(RUHpZeMVQj!fdl`;z0AsmRR{!?Ir7xfpCs}?82~@w;MTfJABDi2*_n(B-U%Z z+*;LF*MV@JlDNQH@0@V;*OW7TP%>dkOHwIMyMV0Ygg2^!$^pM&r`LJ>5M zF>q`R%&0l2WT-=s{cegjECe(ID3aiE%mrZUD~V6VHE`_qbm(1_uFP@TDe8o`FU%ss z%poj%%vAox&nBH3>c3WRcJw@|a;Xy7<nppRo$2=qUL)mMMtRM_sVO;W< z9<2R`GT^hc*OilWtg5lStM^*^Ll|?g8j)C>;%cYDE)!X|N~J}KrxFq-Ni1)5ZEd0} zZQ<-ZYjMcE1wCU*TzR|A(7Cs25J23MS;+$b4@9d?I~;js224QCou<0ruv@=_v(-(P za>-(8*!_ggiINM2^i}*|;5jU${b(=dS|hg+FreZX>YB}88pywGk^#et(4!w+r8r)k7 zTO`rRF=IWGZJy7`Yu=iL3!T^)J-VoOA^$)k_H8h z*?O$$x}d_SVMEeovxw)cQL`GHB1(g)ynr**iV3wkfazj$20m!2m>L84F(KAXo>Wa^X82Zta~Cxb}P*knk5nZ5r^xjUEJ zh1|gA#=0F^I6Q)`4Oh@(45nl*%M(A@Aws}$$pHF@y@o%i$+EPKr~3$~kc1*P%ZSz^@XbXiv4$Aci5T& zd-WN#&DKrP^;?v_0qFYVl4X4D)|Z}Yw!U6;`)FrvJn=5N*si+mXzMG-9aVj4u~|=J zl}w##M=dOhT)^WNWpl@()((TQ5am4RPY=1R`{i1zppEvGXRV&A#Mw*T+37E#D{GZ$ z*_0mv96&zlk6ezsJ~&hYBtniHY{2BC1Vd(`pbv;ya95=48RlZ`bdpN^)@`xB_x|PE zXaD`bhX0;Fq=ozYkM!5i_17PU4`06hlE6aL{=Yo4mVWji_Jy1pbZ-+MX7267tI4cu7b3_y<9eD-JJvur#;TSId4@|S-{Wtnnu6m963}$+i zih9UHsIZGv`+MoH#D4_v7AI_+sKbRi&WOqy_Bi`d0Sn(-beK78_FXJ+GohSHTA>%0 zPhez8hUo&rA^J^9Q7IYA{4G>~gu*hz_JDn3EeW`gy5!km3(e+2F22-yKt6X-^2(0@eQ! z2rGnfCJM$H$@;Zbu+YTKkJN`c%11J&4YMejW>us<2gk`^()v=U&p5dgZZW=)kpqWE z&i~;O)NHq=D*C7#TPr+@wgJf90Jx|X@q_W_!ccOQ6Lpi8{WaRgy)1XAfVk-SzY8D! zcdXh{WcxGy+}l^6Gao8}XzPp`C?qUI0YHn4WKhhDv{4KCc@D>}HsoQ6diaP;c{|4N^!B>^8)bbMcV@UGS7qxbbGMLne~g!i!Z?ASzk zuxaEwmTqOORTR3}4`xhY^P~Hw00CeXmpYKW)^1Hv^aM%S*u!RZ{Hj z{Us47fi63cQWCEr#mmg09ng}S+d|Hvuu~E|1Gn{NK%$zZNnZPNg8ISILeXlE--V@;mU3Y zX*u=V2R>HHLhmjS_F``73+Jqd`XR96gkgzfk*wt{M`ZdX{$2Q+bO`?U;eVC?a4<>+ z{A0?C|ML3VZ@#CS|JR?Z8i8%7)%pn=d+bjyypJq@G2LKvC-0R3$c9eQiCVT(KRfpK z5FK_nD+Xs`5}z?%?n>k$$%s&|kUqF|X14*B9fzimtq55m?n*QE_WD}CG@Y1b#iE{i#5zw4raB)bl*sxY{% zuZjrrmcE8BK^K)y8+~-N9LsgAms=~ zR5uRrM0GVp6jTrXB5_rZ0P5LoK@}yWv%W<6s#b(m62VY)W7VK3?04by_t5N;%I4Uq zgpHV`)+Ac+$-Q9qu|@-bpNQgxO|L>k^bM;j8mOu~Ru95t43w8&_cRvu1JumOws3uh zbWt<_hMcC?YDq#9WpvVr&Xr0Rnr$NHW+R3H(?Wp94k3h*BoL`<#w0JtXp&ZmLi0*Z z^F>h%@#&(Yu#EiZaSizM_KHZrvVCDJ^pb8bw+a57)`Hw{2}@?SEfddfDd&(2kUUx> zxgl;_6Xn!7mUAcNeUrDHsO)wKS3}!kV1Bzahf{yB;4DbkY;;9-Q7vanO|`bV()D|l zFF!|a5Q!J{MOo@gS#JrXM_%VF@h08%WvmDY!26^BOj}^Rg#GLfYy&v>h=VU3j8?MX{D}4p+m?RSj8^ zlNV6lE8ev%e1*n(mmXql?0u6)vJcszLwd;)xJ)}NAr1i%@RYy`{R$6 zJ=X5W2ELGzl_W#+*1dI*mc*sf%m=FN3@TiB84|TM4>3;QnL$}Mk=aC|c9xJ-xUf?$ z<=weEk=NV|o+jrSK_j%zXSXD`1AQD3Uj}4{(YV!S+ICwdH(eD9Y)>#bwd&xSW|!&l zv|Q^93$17QUh+!;hwR}0`YNANZeSk7>!vEC1b;}zUN@hVkjfOUQK@z_B;i!$#-ege zl=M7Ean1!2YS||OUU=Gh7R5OXY7GikGWU;)Cg7qm`ODX@ZM62HFI!SvFaQjXx*D^@ zHtd~j#nokiuT*|7FV4hOaJNekj#E~>0XoCAeqwgBS+R1h>bsq{A--IuElaPd8a;i( zmmrC&Q^GTFL5<3$S|n%+Gb@%pv*S+20hcG}8pX#&rx_^((!KwDQCi#O+IMoGps=y| zVBIu0!zlky)tzdPWLbbJxzNflDG%Y8tL%TKk%hp$5~{LGRAnB;oTOJH1QZB$O@Pqs z-PP+Px(1N)$up0-BBEu7@ia4oPPQtyhKS>s49%&9GH5eGqp4l;#auZA^5BD|2H41r zlrS;38P5i)gqhp`oQtkfDP7dvY1JNU%wp~BR21EYvFV^%kjbtB8X1&KT2(_ITdFO| zlTptcBxcMiDF?k`=Q+k!4!Esl|Gh@wQ?YAUrbBCltQajN+#q#l9HeJdWlOt9fNzvq zEQQjvZ(8*_r)ffc0;Fx$VBglu@cw(Re;9MOjvq|T3YQhOLC@ME*BP_z{ z1BP^Lbh_ub8W7)-(>fCbs8RxBH;|p70L!bSgi2jNoM4Foa2Ya>sj7?Oklvky6!|K< z4tJFV=uy8oBpx~IN$xQs+WLM%O~q~56dc7+YR}5gVhQ5p)~~$B8vmWTY7{&zc9o9!qcXN9jaP zLWR%N%DQ7^_=qD@+dkN3)dTezVkIVmwn1(QY$?UbuhE^3onNet>T5yXQc)qroofXhXH|sGzXgx=mEIK9n=AA zTy}%XAl^GUm+3+~%~G_tdlNG0Gr_~hT7?aYDXU-rJC?$$2^2*w!cMEYiIYO`Bks9E z>$7!l8KoZ?Yv~2z4!WiLBKDF9T+krgZT20d9+BIOPCn}G3exH5ihJO}NZki`B&=Y# zWi0`AsNK-6464hPPET+_j#X0E)?N8~C zqM3yjc(2E1C8xJMco(`t7(ZrDLo4P^z#O0txLv z*Th_-v^pZ;Pz^_o)%@ydy27#t_HmZ=kRErcL(0JifX^b?hHHTS=2{?9CKS`jf3#Zs z04@)d`(A*e_;R)gtSey1%W?}yf%LG(89>9Z0)mrm*SjMkQkV&-$k}Iu;xdUBX588P zpS=AkyncbYYTLuKX4c$fx5hfFvN8Vwc25|{xLJXksRxGuLzxug5qe|xGbEdrjRPgr z9eE}>=Q;|IASI*)7v-DPcYe^dB_|%}JuzUNMl~LH)g9FgvBwoxnh+VRCJy)e6W|_= zCZ+w0Cn)fA77h|^K}6p(d5j#MUH+s3D=zN>QO?{&>B1559*Os;F7^m z*2i3TtOMe1dSI|%3r3J; zSEQgm6VQkh*4aS%^AqUostlq)KV5X8)j2K=?$Wjm|L51=fd>2qWb7)C$I_c{WH=qn z#%_6WWP$a7%ar1g9vWnYi`8L9UbD*_v^}#lv_zF5C3Ew%1YZ#?^)UveKY%z;n z$sfT!)P7buhLzWxV)TH0U=Mp4?!;#1gZho-ly1Ww`8I3ZT-#QC-+w zt5m$G-Np{Au{5A4XAxpI3Onclsp;afDAtUkERz+6iTMW*2HkYfJrW!@K=Y(a-Icu% zOc8V_;I3F(aWLdMLGF34@A{g%+M9es&}zDa&sj6bu}Eb9G^jqgGR6<1S~hz0u{CJJ z-ec&$bSijB^TtNr2pdu0U|y8MGG1k<=( zqL)IS>NvgLIs^A??g(bStkU|_tf+!|=NSUy4!W#E^}{<$VVzWS{b@+MGyqYp+=HXi zpuS2k#i1^(2U7)s+X=D81kkG1FcMwO@w^`7>pGPsUkDGW@n}FK zEw?oYsQye)u7dtv?D-30SlB=w`3N&sJRnQB?Re@EId?-eQV6Y$O}tAn*L1eZEHGEk zF0nNrH-HBxjQ&Y;3=WzLRAKr`5ez!VNPh#Y0BNmNwJ5OE{i!ibk{fzyCIxsTGTS2z zw!N1dG!-QGILt0bv!UZVNdh-AFYR zxoK`br$uPsrbuCi?Nz%kb~-1QdY1pA>T~85Ae1f?n8`}8&!X&Lue4OwQk6zxhrpV# z#S<7eWClnphaACY=o<;4ZuYYRRH8ylEi zVrv=j))m+j$}x;y;6^jMzG8?fZN{Zy;zQBo8(~)%3R;ND^>3Q==1BQcLv)tb?$a~y z;$w7NtfaD;s3hf;+?;J%qb~j+7Y=>)Pe*;LqQvW_B`3lYl!42WDge_cY|}FA#E22SD>a^B!o|fiZ;3_!U|{MpvAb-{!_#m!}@9m-0&e;Hsfh930-9 z#tG9jLH@7(82($o0Dpon_?14-Ki99r>nE%}eiYt*d3m&%bN|2*xJh1)MM35dpg6V; z-BX0R{`xM5$K&PNeY^;nDKGW3wW^ zUq$K3_g}pJ98P;*y#4O=S3C!P8h9pr1mA@;rhb9fgB<}!Ut#n?_pwJ<_NJizVD_RX z#~Khhw51evmh!{-7gSwb7cuP7_$>`GflNmMK zdB+TZ{+eq!=n4DqeI4%bLmKj9i3o{xq%6y84MTlXSS zUt;O%r?54*Ql@*BSZyfv(p8z?t`3pV3+MnhVu2zDWObk$t3EJT(l`$jkY0q5Ey>+U zNxgBsfQrm@jgI2g(8Ed$_0l6iR6${#8qh%HP*tUwRsbw*cJ3AZ1bG6%?3o)zN^!SK za2ql9)1cbc+&VNH zM}#(!Tye@|XLpHVQmy!w3@yyhY5VCnc&&!`V+bQZF~v!m=tz`Np6d zs{yWWCM%peC2?K~ePrTB_5`)bhZD^);C8dP?ywnwe5^l*$$$xFRH(s+NCOcm=z#7; z5}szjvLV#0o;Dj=jc7#Dvcub|6@2=!?97La2zTajkea-q0s`n;`>Ik!k^UhEqq-!7>>EwVId9fQxA%D6sywi0ObIO`?cTy|4T)J*F_t^#oA3Gb3flL1 zxPj3qD`JVJ2ffMxG$NE%&Nr|>xesNr1yfd9MxghfobeQFCemV}aZ&8grNRD%tvU*X z>ZIz0dC`OM*C{}5T8AC8RTiQuTE{9=;bRg%!yUq$eD3mS6X!!Q1GVA)W6N zmxO6}mXx6OvX9ehtZ1@FXMswUA&Eil1=va8k8I|FEOD)SqgwoJ_&0x@L-7}HpE#Eu zYtgU5o5=-z@%9JEl78{}>Dv#}E1$pqBD{T?9{BHrK6yz99jSU6RiJ9`4 z3b{)BVIOq|u^_2N?j4rIOQ-JW)Z^LvQXw>~*yKQaa8-sIZo?W)9_fQ{Gg18&l2~dk zqtM?DH2q#qSGVZ}3?6c5z7hjUpyQSajAO$>L8Yk1a=$WUg*0Y%c*~U0V^Wmf&ptVN|*e6&a>mA6tca+RbzePUV+I4_kBBOudE~cSU!D@DV|s zx6q{DzXNPQWu2kotm6>sCts6_83H@OFH>AUZ<<+`OAYvwvt#-@e!@x74<@vwc&<^m zU#2TF$u*Miw{gl6>K)77OcVf$$R1qt+G22_a|HAz*#UI=Twf?*&C1;8+@C`1OpzfV z+;_l$yptq*g#q0CteW*{c>RU??HKwDHqc8;F6zF(J;PN7)fi4w=_UuR_UM1%t;ZUZV&}9<1Fw>*_N0)s8$TF|R*?F^ z47=LbZK3AO36L!3JvRDHZ+L*cPn>Jdy$H%oa~@Qv0~@tTH)@@n@0~OV(sCU5*=!5j z?kJ#-(_Dab|2XK_n9n#>l+0aWZ0eSdJB=%#7Oc)%OLoXA+IS~c9^_IQj*dVe0Xz?u z&W^GRq*eK;C3X712I^V%bsjAdk9T#gS!@N@M;{{4pcIBt#|o_5O|@^y@#;~ae*c1* z=%(8+j@^?&X3aDGohzr$O&ENk-|U^v&N)iJy2*ThQ#=DIW!D#2erMMQW6nXo;ifmP zKP`QIGU(!b8dZYM*IP}5YLdL!-f?0MD{pbC*#X#1zuXOT!+In`8jA({HYix_j#d3F z`Sr6C17-wvxv|;sg7A7J$4^~wCwI!wx4`0C${4Z+L2Q;wQlavv7-0uRGAzX{+sg|; zy}@VEoya#Ms+Cf9&Vc+R+_-}>CeLJkHF%=7+j^uE9x$Rf)%v0x95<^OAl+R#-wsp zf+hKE?3eXGB1e?U<=3?a0WU3FbFkZ$SYrc);>yY(#b2XsdQyli1sfnG7&wevYCsTo zFUVB&Yq-3_SH={p0byOip$}bA+G(qHG6upsRBW;YodWGyOuOsBp;*JzA4R1)vKG0B z35z1NjR`dmCP+AqzU-5>s(T@h52w3th;E9;DA_$-4Y!6ph%4$860K55Sp%aa*J~$f z#D=n{hKPB917joaF+5$2`jcKy)XEb6my~ryv#j${`IS~?w56HCVQCjvO{%rnG>eXT z?)CVA{M)Zyf55faC;8Q%zgk%-4=(S26kb1-lJT4Gg}0xj&w(ds@1CG9q-#MIb5Wvf%;kLisFA2G!N=Ld6JI{R>7d-c6zhL!auTd0$Ia z8A{J2E$kIGa6Eiw#j8!WY;dtxxdEI?d${e8EGWp7A_ra{V*)UtP)xZDbz5Zlnhz2GUzaQg|$dZnNoS2^tjW? zzMLu|2Z4F$h!TbEDz=m~2nAk4YSITC&TwpY$&E{K2qC(tL>=1mIc>z@c+f5&PNCxt z7!DI{j^Lku^Y{E1zWsvbxCN?Ope;VnNJ({d*)Z^=JhQ~yx+j>`9EmZ3a7$mOw7+0% z^7LUDw8X1~mEqBMW_LB9DXk+x)hbuYmsBvibtU3ikzsjPOL6PFLUuVqlM|p(za}P5 z`S&%^A6^_vb{=m?eQVd>fzq;?bMS1pu;kYXQX9L}$PX6)qcGR7bSGcJ&Trr7fs=hB zWrOehll;c_`l9lP<3TOfMGF8r)z(V^k|?25_%^frsbVuK^>6c66bCj{iW`QWYu}j# z_%6v(?n(>A%mu9Ol*6hfNk#ZsM%C0Lc3YhQ;4f*1E-lySaRokhb_RJl04_~=s;FW0 zr*<}&Te)(uYLi+0SkOX7&ugeAHsjR$OJ^~$*+;lKDCZd&<@U91H1?w$v`h;|hx|Q1 zhHt-+KI{9hzmu-swcmdpUQ@n)sN8@7YE(a109Zh$zs@=Nl`>aNCCD})2WQ8KN&Ta> z*y`$xRmy|x2Ho^qdRdq9nfuHOvOh%Jht6U7ad zPNY*bs{duOF1r9aO)dzGR?;IViHu(8$6_suF*)1Xr-E)PZ-H8r^78#{_%|mtm#-+E z@%y)*rdL0G{b7K1@jnBc^Pk^-e0g!zCJb5~^NIo^S*MIs zUE0D}sLd8v2>4~qovWH&T1S-O@Y1<-yEidybX%SBrshD>6=Psk)b%yH<)XGyu>qQR z#0A4sQdr|n$ERc$K>>U?i4DAd^7e7M_CKTEIkbpB4kzB2T>Ey9+XV=wo@0e%l!U5r zpyKB-rpb_vE>^i{YkNYPN~PSXr4eL4*FEXQT2+`hUi9KYm)-F(Gy$YBU!uZ6rQjg4 zd_I<(x&SJjC#n6WK%Bj6xcZT=@*~;sd%3MD|4{~7H-TLVV3nWuXx%MI9Z+Ef6}*{j z-YBPa67WH@ZR5@!Q;Ch#xL#$QRs;?5$r4>n;)cm;+ey-TcKuMvS^Edb6M#4Pci1vq zdq2CUNivkYPr8VLj|b1jdOV4YB2YGOJnA~UU^rA;V3x}QGCjo2+oTw^=2$*RYkeI&OtEp#hld+Brb8 z8l*^=GK=Abssk1kl8Z@0g}T=|Y=ZDu6<6yMuvP;g)!m*(Z6d8l*mXP2e=q%my0cQK z0xIA)U3V$(=cCgWL&rYCTpNkeg$JoT_QyuxtHSu4g#TJsiE>Sif@PKz-(R;aeQJzGjJ_oU{?Yj&rC z#l6`rIfG($l8%eGyMsFlqs(#5koR9;`SL?>U;E1)%)z^)1zP4x0SzvlQ?@qgH?RR5 zn9x9fBEJzpG-tJ85sdwZ3ko2J7-;}i(TM}itLHNL1?u}nNzGgCOu-3f_K9*-E7oGP zgrssF01Gv>rUsy@?OA#f+(~EOmNT6mY$3IQnJO>Fv?6qAi^l1eP~z`i_aq+U;bqO!l$d22gN3@6;4vl&rd}ZtGuBtutgU4Jd4}=e)y~7` zv@GYu5I4g_-(7WKxPV2=DPau{MeLc$6Ym53cbW36G^%`VTm@H53G1P8CI2U%oTXzk zR)BvwnuUoJ;p#gEx|)F&wHe2bGJ!EZdixCz%s(hD=vy9`FH$b=$@3Dtg%7NAI>|V9 z$-1FZhn$7Yl<80bD>lKo5i)MX2^$ZyY3@}^Bwb!Fl~s4Hkeh_Z9;{N` z@b+%ZR-eA(ExS z$bir{s#1YItv6Z~3a@QFH+h_(^wB!a%TcY8=e!`D|5B_aF zG=Ki~W6q0JR~Q<^pS*r{(eK1ae*sL_SVc+I>jdBeP;5`Y$aZCBX9C`J zGK<{WJ$vlQZ$h-BR01>H>qBL|q?$Neu-)7aSXX-$druI;sZEzgromx?QV2I}GxNp| z_x9awZWkZs&ziM+Fx&#S!1Bw=RrgPxaIU&nI)IZZERErQHVRH+0qjlXSVvWlk#c?& zds5c`g+TG)o)RlpB$Cco65guVsRsf*CfwSfGisuJ;jSlTu#2N&34OMVo3*OlgmbiC z`g&k*ekJe%7>YJV?@-`5(-G`mFXu-Cm8IxXlx2x$KEvg{-xlJ?7sb37XL#pG(5#j=vq z!pYxSl~f5tNr>OE(qszzrCbt*#)N^oJAVO-$09G4Z_CTEO71fH_)Xy}W^__=LI5Xc zGV9uy=JVXnOEBK$U~AnkM{4pU`^%9?1!1~@ScqwPkt(KM7J4Q~5eKaoOQ+SYrq{N6 zHYs4nGlcy~gbUBkFj;Gt@2hkf1{js=xg_`{EHw6^;4Y#}?wgj+QA*K7bTgeIZIoRl zD-lbiKeI`qrUl9$tm;^1cY|(*9n{W6in>{TAS|VIv)v!yB0i*?e5vc)%O88#<;cGg zfbzh^a!&G(Nx43(c^39Sdt62X?SX&LP!NiE?*bRa$2NiRHst$INw+E)wvEWdKD-w!Eh9~xZzSBlAF9| zE~Ty~C_s%hTB;9}ZLN}f_5_BBxz~Z!U;*%?+}R9R4H1`^gniShdaCw3wsQ5PWBXJZ z)Z2}|2uY`(<8vs%!++}+ zuzl$_fA`^m^8Wj;zflXVe|r6OkUxHTd5JDE3I_gqnwXEPtzkJ3gounS>m=Cc_ULik zmL+FdU0U*Iz96JNIvD&osF^;oD8y@Z=>xYl7|3F+Z$L@d4jz7fgo#|O^E-6QPRn1p z5eJ=)+4Kth`>}`%@3$pPHz1xQ@6ta>N{qz>k%}^uB>qdq=>7_2*l|-N;-2KjWh?D2 zNaBfBC*Zi;4d*29;j}qBqOBnn41QPU$wJ(6qQ=RlTJ=g>X$I|bh`mRHcB2JPHPz@u zusOfN%V1)nM>&`jE?s=<#MXoNa`0IJjnPW11*P}d-9TYcxE;ZFklR+Nb&4%%~AA(*MOo*SjR zH|b($*pc)7g%GyG>o?zlO6?um6U@@**bv$RVjSB`(l`Kja`wzT)h8h|kmlVjVC*y` zcW!F>kVgTM_9slwkMY@(YnA1=(iGD|sz<%Z1!NZv%dsuAz9q!QeYwEUY=LH>1BW|H zZ0VVlw5%$jjk?laSMI<|JR@#oysUmC)$9l8) zqD8$PT_H?LITnz82YJ1U;B=s*EiE+o9^z8AfJyUW z=WC5sc4abOu{{ac$bH?NcC*k4SxzL2FW-Ltp)Pu_kO-agTNwoddlh@QI3OITWs zT!|es%fcO@rL5#ZYg+EzO^!549CB-=P?ILcPCMNHh$IM8CSmG?Z9~Unfw(Ic#$vPw z{`MrBkzPoWqS!R<7T19wt+iIqH}^Zbn%AU~0_>tL-O1}=p5_{Jxz?pApeZKj#)|_p z4aJEzqF`gEI}lL&N#j3>F%F&DjR4AF5ifV_YAIAMU155f>Z`1VCOs@S@0X`Ihs@Z7 zzm1>E*Qu9$D*Zz%Nk92|T9B(wKq=*>k^1G@)@w={QoBl}3F?J9SFdce#_(cVK{%tP zYiOrsnW%g&=~V%BDfo7nZP8f<@?bU1!r5HNwSK|y5C9f0lqCZ)1*XvYRr17DkJE4d z;k;H<^xVQD6^ZQ5DrVc4gu*o#8Wu6r)kRRZyerg|5XB%9vC=|dN0C62>s1vs&k1#{ zrJs_6+>cf*`0`4K74HH1Dnxa>A{1m59}b)je3zt@Yp| z*YH%cr-6f@Qz|Pe<-xz@DCN4#O>Ou46=*Qp683JX zd&OZf_q=2{=xE$oO%37@h=8nNf>Ir@uyR`D>n#=cNn?)4QaOOku1W3Ej{NX!^Ddo+ zIgtyT{-$v}@I%TQ7h?s7^VX3jG;W~14AW^SpfFyqHpdzZ=|Xa?9cReRf%E8yZQso4 zf*L}+C5O02=!O}1U(%pf9Qy0(O-X?T58pMw`Jp{*PjHwq=t#VXFEPCT-@o~LH*cQT z52P^H7KUSy7@$JVVwbHeP?WfsdY6Yh52qbvNl9Aj1#@$uN=uGx#MZ#l@-;kWJE1!%grTlXxVHN4mJ`hc zDjnKdvDg|?woF}mi5{6OiG zvFIpv_NhC3oS7%K#~HP!RNxWNU9L4@S*u4%Nkd`)F_%sa;j~nBF1n=q9oT^rD0-b{ zRd?rpO3yaCoGWx>>~34-i{gNo!Ch$Pof0)%<--Gj;8rHk!5fiV!j9uCSuJ)^X~K)Y#c8O9;o+RO1$q35oYln#}&lLAiJlkXl? zI-LxJH57xwm1u|qy4;EQEA1NM$wfrrW?b#I{)8md^F{UPInz{SJX8TKm58wzdLnJyRlb%T z`dtswn4^)JR$=fq-l})#MkwX(f|~1)BmNFphx}#(S0{C)`N|0tPdB+I)?o@PPFI)! zCx-&;Q+rA|ChG&F*wJZfJti>4=|Q|`_tPm!#97&98FhDv@J`5-Y@zjtd~@| zWBxy5EN&;V;=?okZ&h)~lF|s0!X!&lC~pF02i^CxSEeMOWzB5B10^|TnPJe~)eF&{ zA;c#}AHUF4!a0w}=qNuypsN9l)hW6Tr}}v78I6N2Y++`{mtY!o(u>;Y?s zi}Ix~Xsk3IJN1~Zxt*(20=b+(l4J?mLWF2!9#v3&<$ERAlUpn1Z!PjM9hu;^SgQt9 z=Pe90%aXcm*4%E?tjvc0F}6EET2gr4>E7sy7+B5Hp79gel zRUZ~%>-h-*2tPzu_Vw$JQUt?A(BvQwtSX=x@qnPsOHLZeJQi~WjB!&Q1B`0Ih(!9G zQci|#X6L*CKjr!su+re3WF39{v);l)eKGi`I@M?0CN6e>8W`YyR-@s1kn<57N&Rl` zvZ~{J#h_^R7dxcKcvnjp63*k(BLbL5 zt^QJ;;+@5+yExQZA;;5*o zQo`1WN`LVATiXYbe=Yf17-5m-n`#l1BEjz1LLxS;qOxEZD@Guyr{kh>vy!|qLGQJ| zAN;aNFqaDuP3ak^tT|QxA-pA$oZ^{3vN|I%k>FnoF$nKr4?wAyogTU_m&AnJ4c`j~ zJKj;-P|e`ZK7E-e%!EA%B(Jb&MOZ+q@ySB9)JaKgfwDlQzu!2rpP>zA5=?MvwG1}P znOAvKtNu_5J7}6)074&BwR@}`TkKHDx80z_hW?zhYZY%|hJagN<5&&=n2XxSR^>@U zy4U$5mrHU(-rb0_4|5|OpvsrfFGd|?9fkA+H`IC|tK}(}wNE#>oO7pBGKdkWydLF8 zx}+qQ0)D6bR0C&Q$l)4Eb6SQI$mv?ChQ0F^>wBD2HsQT6TfGk@5;A*LV)bOXAm^Zs z%j8ElNd^qjY|@}9*H-Zu@n+qTP$y|9(3&8w3YAqU#3qgqLfawwyNk*s*nS4zn@b;f zAyp(=sIRyLIE}3hO!hfZWuMzT*Jw#!lBe_~=ei2?4{!ep0_mqAzW-0({5=#!pjq#g zf>tf5Xz{7p*5M{e!&|spU6i?w0^B;r+3Rzy6+x~r1i#wA#*`h^Y)}_1;wuy>qu7gxorKFe0IJ1 zFdpk>QqvE3Fpy@Bl-3zD023Bzac2zd`x6*m4^N;9{V>lqLy}-u>2B?qmJ6N9K*K>C zuv`)y7P!4~mv@ffqh)v90WJnFK5m8W^dKkpJ_mx4F+92vVFI*!E{$3^)#BD^n5i~4 z=FO5sBpRJor33}g6di9>18o7>3>#2zEqdf$S`TBP6eWBB$9{HUM(0{34#YMukP zUyt^Hn!qDvk;g^t%^y>Lm7v6m*s4g}pEfE4h7;!(r~NQD(y;5C%d$<})MK_y*HUbB zF#TY`x!4?Fom@_8&9)h+Jh461)FrGd?-c`Iffb z@)(5!aRSIO$97F;T#-AddB5{MQq{RBhVq#0)oI0~U>o^&;a2>Fs-<*9@P zR4N)}xp82QcF2w=Nu9G2FSlu@oRGWfDFfFbL;(02;;2?GjCULBJ`fw1M?)$TXh4$K zuj>Eft%u>oVk`-*#oPxHSa}hoYFJ++QLG z?;#LAe*0Gh!pEGt{L||na+E+RpNuE~ZEe!1ni`pF` zG1qC@3UZ;*RW9B{tjasQoNcJqt!r@q+Qm-e>X|k`9f0Jl`~%--#AkI;Q1n9ehPj>O z(m#W5SyCf*M(>DCE>uT-HCX9l+Ts8+$&6G3t;{j3BUH&$9EgHv!DpU8zJptZc|4ng zvDEOFbFIN9o>K0qaHj(TNG(0etB3n6t0@U(1hM9VgpVONAP0iIEi59j`{}4D3}OP` z)vg!};ojD|+P&9~MV@ClSMleimIUnJd6)rO$SS>zM;{ywjOYQN)(#YALjq$5%T!k5 z08;V^u_VAyI)$&0O5ZMBa@x=}kTYqa-I`^2is-6hacOo{_RRu&sL|A$1Y1b@A+%H@ zw?pw0ehlA!0U`gdy6UMp!G2UrC_Irqs7nozWGkJdMGV^xoV<#W0h4Aw`Zl48ksvpY zWj&4#S>KR_Yrx`HDJwZ{0xBNh`gIJwfh)KeUuuZd^{3hX$$o56wem1l#+-QvYiiYi z-%RRw?r8Wpqe?Nn!C26YW%A8oSLLE+=)i@yv9YHW2ECDG=pgEZvWwe7Fnb4k0<4mXpqgYE)m;`pgN$ zNvUPhvumwB$ej(eYN-$om%bV#7*&F~^9D1Rf?Cy`95X9viAiCTUl=OIut8g`h`=sF z3Y2mq+Pdt|`WYJ7(n3odD`OlBqlNnP%6RjdJ*f+z9C6X%r2}|eM+oVq((dEG34irJ z<=Fn}?FSz!2b^BusQgn7(0vZ`TO@J)kp9%yU(~FTD+zh;;bY&PV(_m#s$PUmm0g7BvGdLtkiU`J(Tk9A&`bgt>HQDfeP6Yzg^ zCK-Vo%(`>wq*j(@ujKmcDp{$8NwU116OfE+Xvmyrn825flsv}n(8CaS$4w-tOr|0Yt2ykLaqy-9Q zI{j|%Ufk1SzMJs(Jl$%{Ez>ML-3v(JhRBl>Q;t5e|L&P(H&8izh)-m|NR@Nrh)wFk zclg78xtod*PcY?5$3z&cvKcV}l4RPASKKq5_xnp;S;>9i5I8wPbX9uQN0|GfW#?a2 zQnCO~VSQ`^DUcd_tvF&)sCT&`T$a^=5Q(O|pd1>dUy<4=DCN^`0ltG^p66m6h=M^< ztHd%EF}LWpu<}!Y0=uMQpP1*xWk{o(xd5Bg-~y$0Q5m!l;7kED0l5xxV==zYGtsu7TdW2(WQ;<&rNCh)rqC!*8mo-tET z$mDP=m_uQDg$wU{0Ik`p50aj<_WywEll$`loHM8=qU3m|Zeh|Z3=niP~tVSoztEV|IwgW?3#tkD7j;>)wSOLl`;Y(KaYyN5ZA%oU*BvziGYxs(U$tU#C#5i86{sG}L#sa|0v^ECn`^e=({3fVm4i2Sn9s4keJDOzL43Iyh?3O zB~(&Lt*Dgl&LinN;V<-~VI@9y(FS|qRxDphKaO&PP7)g3Ip;q zSyc?5ln4_Fd~7tuf~r);Uy^Duw-R_gq-mrf)%I8pUHVhYQw*D-=6bTCFi<`OW7vT7 zO2tdBKS8Qs2A*LmBPRS%YoNQd+~iGbKLqB{{CSne$)E0uy>-S6C$wcPwI0+67? zwJI_1E?WngcSEwBdtv@Av3;&GSy$az>a^y~TRphP?Yi#8Scu%jKDOI4|LUt(@@rocPxkfWx8DRl`1VKtchV%hnmNUP zMjMfw*|~Xr)Vhc7xHw$Fvl|O60LCM_b)r)?)zv*MmYA4IkL2cO+K?vqV_S zMNKY9K7(dLEmb3q*>@IdB-YQUP5`9dA{CE`xMGwp{ux>UZJ|lS(=VebuQJ1&X?66$kPtom_tXrvw7i3 zap9I|`10{2U<0bgi{r%FGznwMA@#J26UH8$u(M)oQhu3jr&F&%+i z09!Zt>=7-yl;RYPdk*t7$bAI7FCIvNw7L+cWBR0XHhWMt45|-x{WK+EH0%a32&V5AnMc>{C@q^R-QdPdQO$fIp%TxD?20%IR&)U`sZg zvL?;8CN5@1xjqFan1`%1u>ymH1Ig};yQ#rjPKN;BEpH*-?U4Dhqj^!$3mbo{Yx3%w zbj-HW89J?~Idq%T5&brV@e!^9~VX%;)XyfRST*RI2sK zwQF{pl6{v_@~%_%dw3F@P2+xs1;pAVX343G1#?}=D_eaz8Ii&y$hk#n**WcfmRiUrA*9M(mWJ+}mjP-AHtTHk?wg*wua+Gx=ImMtDem#!a@N=7j`d=Ch> zWqN2qJZ2?KNy1lbwoX_$=q&c~nSB?!PNGl~n8l%1RLsZVhD+t5N=cTDr#nPWEL4*z z!&58*wF6ry{oCLVz5 z518`s4r#vh5N>ZC)@3ijBK;P5>*z4@zAN6i-~yw)F-eCaR93IdEZZP_=bH2Y-+H0h<#@9Iui5QE?95|=If#KnI4hACEoz4s$vR-<=a(7NR0 zs7P!}gD}9`nH)PFxX{0GElcp{?AE7x-g!dZ*K?Ym(li^Wqh?a6>!*5hT%^=nvs^d3 z3$#Vcvz8Xkyn0&|eIy>Qtvk#*tRjHKQ%}sjcH$0oO)D=9jnM3?0|95K(!*tuPuR04 zuiv;$wJwt@i5)6@z~E_7vw`#RB06VF>p-4qW${ zSNi(o=X>8twtq(!I}GM<<`5|Y+h(_M$5d$HFCza)5?qCE63TtHKtjJ@0i!z}deb6) zEL+|H55QD85{Nbu(FA9A*YN5vqNt<$==hq1u(1WglQ-{ej+n$(_56aA`bg<6$ZfIH z!9KC)b#ZKX#7K(>GPInX!WN-$9Mx`~R){E*b)NbXd25sqc-eHiK-hPO-Wmxza zOowy8ezi$b_hp{i*cMRAg#kSJhu_;bVke%Br%3Go8pt!fftWLNOQ&ODLrvHP>OqXP z{D2xJs;IF&RhwPhp0}(|($o{qz`4yr&J9X`z{a439uG*4%h$bja>!hj;CqDUE)C1E zTd+3(R!dWr?ZV}X*wVGCXCRW#qIBq&m+bakCgUuabt~u<2O39v5@y8_^rMB2q|{5H z2;{hBVyT>a6A#=%nVAn$^Jyp7_6gDO7SM`b$o-EC20^u|Vffp{&Y63(Kk=0xvB~~X z{=6^WKKoYx@Y%N;jL$x7C_WFb-@m;7VR-!tjG167Yq*D8fNz9<p#9dWW-?J8hn$8se~=#R zYRaB-7wnN*!a|7M?M?>*x?@%KI*l^%I5%utHaT|2gyzFIgbjIpjE<9?u~Q}FJKS2( z%E1hzW>Ia6nyFBJ;>nl_?QO3Dw9YC+$YJo=cBekQ1V0PHo){W)==ALU=pYA={p8p{ zQ&XicNj|wvK#J5HfDf=}f0}SpmK935joZHs@@{Se*nmWQ$o)rJz4}x?7}&ZwPuwsj z7?p((debhmlqZ9fU$UzxEw(YiQM=LgoT7zP!Mv zg*}40tDVH@^eEUDsEaBoitg-SnS(NOV$86EC%nWAu)cWvI?z}32XCLK3HC?Q#FOEZ z{^tJ(ufGK&ld0(*QNN6reNL9AHjKfGRLM{U3f*w6y2iw^6{D>>k8ELoSry*(1FOBM z7%n~Bp#h#A#pf<>5;hnsJGKx=!s^JKzVZ(!(0_$lZCCRq!h!OV!=-jRn*!K7a$n|mc@or8R`c0sq-VHk7{?{cS1D0 zVOa_j9XmSEG7*zCp2xBf3Ww`gx*t%aUctg`raoLt(q|g4yw)}mGNRC|GiecdLEc*M z>*e=lJH7yT!jq~A?uG-*^P0Jr(>^L0nRS4Kb>AeDVXKxpm_w1!S#`{;m~|BsO|~lc zH7YRgr$&raKGH5UC#2z*WVU_v_VNGA&GU=buXRlk3`TOO#3%ks$B?}BaE4Qv7)6Fi z>b5QQU9M@`RkXWnM$3&5vez>*P&nNrb=H$O#$?Rs_W_J{7q<_F=~6}NXIH7h+CvYc z5|qy=CglV`4pm~6Ahvg>!BBE3QpK@Fm#9wD9d^}Bsi=dG1Bfh5+_Nfj4)n2{AmsuF zt^-6l9oxDX58UlnA8(=bm>oSr4d>fJKVc}Kge|8(Ii(Fx(^C1T0j-z=sXlnAb?srX zShiB3DG3W%^I>@Z&K`>g@jYD5sz*G>%1@fqPx|5IK6nn&-hANNs@ucUCQAUYz z&y}9ikL({`=T2;{;pM3Lc^qhO|&Oz{B4r^ zl+GZMBYDpo{FDQz0+tC(-9;_miF>ggtoz36gd3_$Rtb<6CWr~dkyB*;`t@JK|CXMb z?(0{H5JDjI0R0s^gjGG>)}qHS>txmL=Jnxc#kw!|I^0~u8Ct=v8Wvnc6o#pAeC@l- zycbwSK^)dgT&w>u1m{Fi6?aEn&+ipRj(z5U2lhriD5NVnIky;0dKXy40Rj*T_D!US$0i~?)p-`)Frb)TA)*H z0UjoBsv1@NsW#Ypjjvemlzr9Hw(JmP(%%dri4$4~Zn^eCSmii?6fPU zYF%}=qO$YMKrggU8<8fgi;TUNZRxSp-)&OR7%zVn{wyb@FW)}pfZ$Vq_4Q-2C4cey z2S{uFIK2Jo0uB?h*4OX<32e!ZxA^09i*PQm)i!HFan|l>Sgvl|7z{MKbO{^{NYfAJ z14($}WPFmucufx>%QdYODF92ZJ9$0J$yP>U(HG1VblGUdC(ucKTq#P}=~Mv9XBbIt zy4!>3w3JF1ePO`XtBg`6;>M?7GHghEoQ(m-MQ5QXCw$*!Il~gX%v;>AS7q@%)spmV zbp8}f5?f&jc69UP?yg>7bSg?=l#h0D5&K4=>~K}#A`nW)w(SF`GO;nQeKHAO8ObYl zUzN%lPIepA&n1Xdu4;&><&=T$&4I0doe4yj&dT0`3iZsmIe4=*wSk1K zhX};zRo@sZ==0fB#D^jU{MS?itTNRmNNJJGw7Jow>eE>tB0+ENGKnEQ$*+i8hvtEO zr%tPOXWZKK%&N%5ri=wOY9u&^ln%cu{{{J99)vS%+kuYmClavJNxqU*{x2^9T8f@9g28&q64e? z4$>-b207z&{{rB*6F18llk%D9IH@XHOq#j-fZiuYJ`&+i+7YIxJeFkS1^BxCYI66? zLW-0MXmo_wjh$^%UOMb0>bwxqp8VS7ppR(&519NnWf6WDc# zDm1VvgPqF>oOP>oQ5Uo1QYn3lF~B8V?o?s{0~-!nV~-kKsz8D>7FUg(>lIgS2`{l9 z*y=R=%>j5u;U-QGDP3DUQAEF{D=I)dkUx5}NYN{ooTL3lyIva^wbQz($}A{4#&No) zqbg%OLS^Hkr26C@HIRm?DJ!d_N-Qx6x#$~gM=t*^{H6StveXaWJ_d^DMQzIL$Oaaj z*I?7*n@%K9DzHatLNBdIxK311+4c$*k#EG4?3==7H3v0`V~!c(odwZ5%!$Yz+Z`M* zEsZt^ws zHnJdC@P!d*?dLs`Q@?{FKRE$>!`#QRoZ8fVARW8F0m~=g@Ai0trL1a?NthP)QACZ{ z3ysI7@^<7+sNd}>)4_b_nG)iNfL-jX4}Fk0Gvt>NeR4$xCcjDEa8Bg0u{$LsX}OwO z|5nao?wJlr4+Mg?yv}m&)jr$YeZmWTXvqCMDCMUJ21n^LvFZStH&cQT>_?5=j0&60oJ z6UFAGTb`WED!fVg!@7WfSW)u_p0-CY2;m5f2XWAc_WkK`;X*2y8{Fiu=CfeV88BBO zodn#q!e^^bFoaBB=c$&S4GKJmdTm=omyk#tD-5q9Mk_WRALhOPfN(MllYDEkrlgxA zp|ZyyXC+ZN?O@YcfK^H{nSPU8F6o zo%;*{sM<@SxTf%db=$#eQYjJ~9HWwq{Y9tckFH+jh;6A`5^B>ZIYPNzAm9rF>{0E; zUB4Kh*E2i3M+HpZWQZMFOM^0wZ)K~ZS}FsWQO+&4W~;X!Sux=%_r7JjHn7I42MaVT z!Ve#kt3eBPOcqy_i-1EC2RU!le09CZ)l?ZWyOK+ECOuBZ-fulS_2rbgcP>ncO?sc# zb*~@4{hAbwEPK4AL@O%6pbNfFuxh6$0fB> zdCiVkh^x{l5HciHpoF$zj~YTz%u7*HoO0q9^l@vvwb{`U=@lK6eL0X<6!vvYSK@y^ zF_W|pm(IU>{c(Qvm#<$3KHx`-_fgI5;dxwNUL0|9)Jh(odX`WRNu4mv3@%opY0weD z)LgKj*PSqOpQbyL`~XOp&QuV+BSs2{HPAaV@lIZYd|`!Z^^jA8a&r3ziX7`Spz6IE z^m?r^B5@P=2ne6uGtE7`Ow-WilOC#|Qup36zFZ2}yBgbju61W*P+I%T9Jm9(ou11h zy~nIv-3`7xw*3e8g{oT&n5}h(pgGrc(i$WZq12icV-XHs4X7*&YXN7uLk3^c^yUMz z8}#!Y9J?T6q{Dxbv!~-?Ny6KlH>X7J&0>;meMORT(^}l#eVy_2_2lNmYS;zsP6=l< z8ZA4oMU;KaITJX}NcmQu15jafco%Cx)WGg%aufJ1WD;(nvTsx?De^=a)O6dOzYB)1 z*W}-g*FFvdx?j3;!MoLIe-I|g+l4^6P^=Xw3;#d-|NIyD!0y0rzUSzV4^bfB3$I^8 zN@q(ADq3q|2P7%o)JxonW4KwKawSWN&tt$IPJKWe&opIW28eU4=Ib)pY<6Wyi}$sR zL^9Q;0JWZd>oHe#`kmYmcPzN}ar4zYwU8k{FYn?-Wo9{M>fEj>Ap)aY!(!^$*GZ<1 zj)A?(h~#Y6*Qy~5=8K~bZx7|ez&&>LVhZbi`BqSaSSBjhTjiAqU2gEGGkj^DW(V9a z4v@t3+)yALlEsGVt$D3-|?}~Q-1JM0T!>bv-gLyMOurLGt+Q^+z1qn^w&~y#6#Ksamz3jg?CF zP1IXb{M?8<3`fh&6@|AG!w8De5rRoA$M9g=0BA}U8dt8Gqy~e)CA$l^JeEx6qT5nU zSayYG*5G7Ps5a;})!u$=odG98{Sk|ua__a=OkB#1(iOx$lAUC`SY3jGVH%!nI4}9n z2t*^WZ`-2L)k>-}IMS_+s&>sZ+H)p9idZg)t_R#94bYj}B(V5-YoM1>MD`Cvx<=09&D!lrLl_tzncx=N2A| zH(PNIt@KmX(;hbJe(AOsDMB7im=?NA>W5NhKY#l?z54mvuivC@`TX^Vl0^GTg(g#` z-$%@yBpk}@)~G-xH8reVe=b4Zip~X-wSvIP)RH1Fkg6{N)~`i9#7c-o0DV)A%DgWK zJ=aqs+jxw~=9c|hE*jim9Ui@O_?+Nsy+uN;<;;gJ&Xa_C=Y8`itt*t}$%Th3DeePH zy3@FYr(HfKUZZ8=RbHzamsx^gFul^T0LBjCL&8&Jjf$#2032q|fD4lxcGLX;na~vV z0B)6gFDP8tO{1DF>1OD#{Ia2%Vv(W)64d0*XAckn2fk1_QfM#(@BW6#{i;M>qed*9 z@*5s(@TCS19CB)Z?5aChggjOhC1vg6bg{adg9PuA z&sc1H#?1d?dg6SQJ_2m|(W`okeD(U(f7Gv|s*$z|+V55gNG=?^Dr%!`FQA>CGO$+i z^|z6)<&{;OdiP=#09`-)!jAx=B3MbYG$KyYVDZttNwqLQYfp_xYs( z=mvWzmBQnMrkIpN#sP|Iv8o>we$I|}QFY|);Z06}-tHu~GLgH-f)85jm98tp4xu^LB*Mw-=C2eTdZIZ#EFnd%`$MuDVZLz)tF#@-0( z6)4>X4O-AANzMh`h>=l|%mUre%?U)1^dkspkP~HrU(V>(r4XqnOgm!zWgD3OfXZDP zm$VRup8t2hYo$&;B7PIze$PVaCq(@GgdfxA{ipEu=|!bd9(CdNM%z-qU|UL(s&WXk z_ky7Bq#UvlNQY)R6h)h_K zZ%9&+(_zT|Gtcjk0?o68VKO@gK81W>7Kt5jhr_wdo8l$ZtYNdwHq$@VLW4qSR>dNfa>vB|D zX2Xe?TOUj0~&;EdX3VqrZDXCuDVf0RS*D=~+5|p`W%|)i4J)3`x$l zR>qhrqD_yd0?Uuns>DdGE!!P=qofs6;po6s#6fWVJwU{I0nVq5PPa7SysLqaB=_Ag z+euGU02D%6a7(^o;j=Ia<{t~ghb;mH*0k_F-XJbvKM;2LTm^xXOQn^5>wxF-NZCOs zpjHrYt@@{gX4X%U#vJgKj>yOx0%33=6v#r9tacCF?~mwYefeh3mbSuEtZLIj#M+iP z{KC8rTg-uNtlVjNKol5A#}K{i-F85yWwsB#F4K!j0Ph?w`?#!v!nBVEq0FG2%`|YP zJUdMvIPZ}&KQ$~*Q@@kZkB#41jh%>CTK;VA%Ea$ED~$ zVEWhivd|8DqO!XJ!d$g9<~3ea8otj0p|t6q6%r=R9jE&rUjO)k;+4MiIX#x}i7d6g&y+3K0Q)Ef7S|}B@G?;d+I?1^mE%lP1;VcCyf|&3?T6f z9HP4(wlD;$SE9?IkJDN(%2|j1Qs6Bew6P34*eDv+av1U;dY@hwUk4u5$X}g1AAn@q zoYJx!o(*;xfN55k#l=nf@$4OBRE%fGa=z((RI1We?k6Fah>*A5>q1s zT@#PQ^c{2ck#gxHaN|?Y!2!4j(kOt*hi=~`Z!y>6PjXf3+bOH)ERNur&k0o*Bs*Fu zo(C=vXfXl+GzFyq_F;<`J8Hq2Hx>n!-?EM8>nGOgBe6>Z=s930TWXzMPR$HgJH-7zE%`;GvsMhRRkL%)kM&-_|{tJ(QF5f+;&Lx&f`FN`LCA z8qn%Wx*rUxR2yid?bnip+y*rj95N{$s25*z4bYg9b{fJw7Y2n|5#+r^<{?#2`ZyIs=K(vqP{&B%+_UTZyTv!$o4d;3N>tchR1 z(5*MlR^;%kYL!M??ve&B<>*qpkbaouw3Q#u`T66q2kh`{$%W&q*{7UOe;QuD&x7?} z-+r0?4Cf~jnlBNu9trQ8ViQhuRvAG~QqQB~qQ(=84)04F2mz2x46XEV7^W_8Gq6P2 z&1CYsME+#%8&2Ip5UyH^txK+hutx zR2np_|AjKdC;AC5wL82?E5moYAj|F1N~dSz-G@?SARrELk7#`5M`SMzo|PmhYg&M+ zu>1b5s#Vx5y2}+&-_|kUEXwEz^#Ns|v{DTYwX-V0f9|QU(qJ6~ zUdN_uG~_(P)!GWVD}jGY1}`1cU!>9X(EXCTz-{%YegNL*N!-z$u1v>u%uU1v=u!CPNDJ3)~$5nu&elXaEvkR&` zQKzm`IluxSj7`*!@>@{K7up(jYOCXPs2bfqb)y1Yd?JOr0ScwmVt?9k2XxYngP>h4 zXqV~}8Ih_(U?Mj8uAtmq0wJ*iU8u0uL~x7jK7kanGz1efbnVoL3JS~_g?6LlTf7n; zfp%OjzIH-jT2K1VD;KE5Wm}YIvAVY%eZCM(OmdrJ1v3PJ8$l8P}@_2t@GhluSd)|sqeI6_) zPpxk+0$XKAE%PYVX;Nfux4`#N-B9GCM2+2IQ@Mc%veb?f#|%}9IP}{)mq^3e6?TBX z%c3PHE7nM(>f7#Ne@leg3H%!@2APi^o^N-#6|en%y&jTZsk5HoaOsI|QB$FGRScfw z=xvo=eo}d8$mpn-1-vmV7Sfar1qw%@^{iW@+JvM5ea|b*9d`i9!R4X=$`|;S0Oqhj z)pV)PfQV9pFzn@}#IZ*?;$nY!N$@gSmLL?KENI=K9!e-uYvLoys*ApV+@AJ2)jBS* zg<k?J>6B!BaF;hVopufg{8cOOhmUkI7T z`00MRm%Old6z?h4aZj@3P+zl<{LBE)AjSw);xKz|my0?oCsl4?CqYRT*J8!i0&SpA zQ>T+UDb#?XSyhJC|B(c)G`os@@}&hv6mmLd@4*C}u~QTr*tp+pz^0;8JvDHqYC0>k zL&~N%6^CJ$tYAz@4H9zKN=P%2XfuNJFNqv+lp-8&O*kCL*w;s$dDNWr4Zv^soqBMu^Zp-SeIx(v0Yky6T|TJ5^AU;9up1hctVnB=e=6X&zDP?pOO(QvB%bc!joen5*! z2`MdQ-DcQKF%2JDEoD#ULuw)XXNkSHp7H@-$BSbavMv{vrPzK-BUU%sQM$?ChFsJ# zsGvbjxPanz3;`tddZ$9Z9Fo+2drIiQ3z`T5IOiNNyOVb*zR31TkLCYtCY@st{`v-(KwYfmgRCPjFzqS(_ zw?=a7etCv%&><}Om zjFECfCH**1U+RZfZ31L%usS?b5ToXwFK%Y6@q`SmMc8nO8rJrQ(u+f!RaJ ziC%wbA<-^SnJahc6^D};ucSz+gc>Q>3{V~iOtY|3r*HPNl+bh_z*&D+MD8Zw&I5)Df z1aF)uoiNr9q#IIQ7PV920^4z;tKJQJlR;c?Tag5~)4m;KmqzvcfK?}S>ePd1??c84 z!atf|s$(=tXy1XCcaVGscKS)x136jGB<+TT!%n@MdeYeG4tc0RK~98O=-5#)St>|~ zONL6N4P7(rLG<|umosEiL`JF^OEEoj1{Y_|>eIQ8Ia=>}VY~dQOO=wh9s;8lcFPZ# zcqIl;IQbYWuoYJA+Lg+^TNS(PyJG{CbK70Ku>@NFgzH+)&ULk%2qyUulei3QLL})e zAyBlhS?(B8`3|r}hiC9^W?b8p0;Ol5#F!A%tmm&TTGhWWp6Lv9T?#gk9<@gZX%29| z2B1PzpXBxTkVk%%>=$1WgZTZwy#6-4eGMVcPlB1k+#RF`2u>$8wW|+obS9OSml+!6q-G{p1@>-mE7zcsLDGT~e&#<7LdfZur}xq*tA%YN0`EIp9~ z`NbX$!Ft^QQrvAqqOvyV)6IQ&xy-?I@JHx)!R~UKjGrudU6Y$Sqk1gZm`5k5gCuh_ z!X9>IgZYL^jtPe*H<1{Qp)A#FmUErEBh-6I1Tk;7eJ2sW;YbO*5Do<~J%weKK6%>v ztU{%9dTonar71D$3awBu*39rrrEM>@*5UPL$ylw1*(^}29gXwN?Sl0jGn%oi{%gn4 zNr{0fRXun0!QzFI4J&DgEHBJ&PIP84JwJ4=JH3#CH^!CZamu>a7AQ}BH6XqysrH(B zF|Iqka~_BJ>8Ki}T$-{3`~#pg!3^4rZQOP%`fPbIQjMpK$*ffOPk<2o-%0iQ3^ofJSR^rQn+4Q9i z9OD4G^JE=}(?A_MJC!YlWELDY3SZznmJBZqgX@{Qv_7X;N+@V$flbQ7;A&F~k`K&RETe0l#* zuV2CO@TcM4dj0Wu!DMjUEh7XY4ekft!pQM}K?|P~IcU>Wrr9!3^%s0G%mP8NT$PW%l z7m1Pca+ST|KrVH8yD){@O!qM)&l9U~X;_rl+NFD;Xg-u^ATr5gSH|1G7AESbb;S2`oJszV!6 zK^7 zYrIbjIrhW8g5#2hSjxvg&Hg4R7x^%8fU^zGcr>}wD@c7&np@h39y1D}=zbp(^BPA7 zm)buj@kZX=E~kb2dajZAr#u-_qaEWI#IPH&1xhTwqFL6}N<4BqpdzbI$=2*7;wE89 z@X@hCTU`q)ok|QowgD*S3uL`M|tb3Y9!joMX$J4lCn*DSZBG< z-AeF?mI44W0Fg$3zNY3-g?YsH&ecI(QQM+1{c8VcRo-3d1dJ7deB{)-swXY{R*X8V z;@4`>NgxvQ;7uX7fo{7S!t;3cdjs4tJ%Z2J?uTg-hPQ3<2!v{{I|i#WgF&)u$y$`_ zoc#<|4B6~Nhk>W-f~a9Z^qt!7V?M(rwZF=b>#Bo@OkGzU5jBceUoUHQ(qdd_mX&!AK0KV9-EzwVP2;@BX5u(RNv3Rm03g>j?!483Z9tov7OIIgRi4zw z_g<^}GyQY|1lOA_5s}jFSk!g|&1xcykuh7fSi@c2N7Zt54mPdpcRN(LZU4%xG|ms4 z9)XNcvVd3ee=4aHDiB9*p1YV-1mUV^O!b`FJF%J1ka4Fir3gXWUQ&8so^erIdi?EmFT2G7&>41NOmx_gFxywNr^>L z#BYD3U?$LZ4<$+R_?st~`laE-B44Y{lf+StxU-KZzz(p4iogKeNg4{3#MPaaJK)W; z(+yB137{}ZMD#$6NiRs@KVOuDjHzdH57ZM?i)YKw8)c_Qa>qi^mo)mU@0y3&GFouJ z?cV$yYuq2%a(>)Z^~q}d^m07Vt&Jy2Fl1W!%_@uJsR$YAzEW>k$ew`92N8-AvvPo3 zGgu=^x(F!($(BG~G2W8wC_-q?ojKXL|Aq?QEy#N2-W$C-sBw+-MPY9ZyMro_ zq^-cU9-U0d^l1(^vstRD6U!5A#1n(#w)p4_E-IF?hg+Y6>Pc1t%qX8~fEpkPhXuLj z!7lJLDHJF@=_WPWzN$Tsfjf{la(7>|pEf$f`_?jpfF4ws$#pA^?A;BHLuQr9dHX^J z8Q|~$48w^c@o7P)r38d7rQZjVWIqdUpI#)KeT)Xx&(V_lufdA9|JBr_4$swrl7rV> z-z?MJD>NzWZ=JK&9>_ip2De94+pA|=ZkVE@#Sm^cq~tE1x$_W}S#$ga>~W+$@nrMk14yl zcrp*#GR*7Y`W*q>W!Q^`vSFn zn4aSPH1!!))SnWjqLw6v{{{J9+6+H_ z`vp<;hsra;Zq|5#K;u&}2j12cAT8A%RXfORJ^->z2q(sioDT1~1q<9J`5!Ahfr*k^ z!GGh?w@ild%gXnmm~EYv2}GdSwzSaDw+^dMKBordTv}xeW3r7=8?M=QW+=hO zvqcA}|HLE~UR!c(SxSK1cLN|ldRJ>B0i!Ow|Fvap9%QkIPAN6*x7ma=u|AU|(lIMX4-d1)D*d2U8G}$m0;ZYY!s=u-Q zAje?I)aouvHf^m{k^)@ylf;3XGW1y0fTkMuDfp*Xr%H`{tTr5Xp5UugOWCL(d5UwY zShz`$j>Ok}aPY?h3i6KF-jP1H)VVD^*L_@I9zoxsIpi1$#eRc20;14Ec(pNT4=9D~ zqiE%I61X1T1!}>QZ)JQz;tN{!#v#p7Z0S(alHo zzE&#=l2DXsfu6=Po+SUUU1W=Vz!j2cehV%wQs1))8BA%4 z8U{&$>iwfubS_1Y3o&$V%Luxjt!Wj6H=)cMnsqTklWMwq0VRpVh}jfw>`)#roHk%^%~e@L_p>XV0NA zbF|p0Zm%gqK$-i}E!wA-lHgXK&_4+jGz_c1H0nTyO@|{*g~qMxGm#1VHyW}-vJ#Bk zoRkeES&Z5jFq=2%0T~zoTPed;k#-aFgLY5jL`$&r%F{3ok+|I02(0QJ@UES}{fQiP zpp6vTmbCl4TU9&(o&n{9cJ)hQrQ7G!XZZhSXYD%ZI>mcC#buZGgRIkEyl{a++Uw`x z{pW8Vzb2&R{}z6bVs%YV*aspa(fx8V%_PHwrXfQMl$*Bh2QHFF*oKq|-;ZFq^&MLA zW$;Y~Yfutc?@)kqLZ=kvWs)T2b2)w4;(#G9jeanznIVYXjVI;Lbw&nkJ8;&-!$&u& z;&z5Fq8gNPTlb=DUo`w+K1;$(4FeG={Qw6vk^MErP7uG~XpqeyA&_oW$FfRpn~o#d ze5U~}NQUl8I9>q*O^(Gmyy~cS$K?Q5iX8f*<(e za!`uZmK|S78a1eaYt|M3U@5o)^Zx~X+~RbQm!-c9WV&gY}{bIOi564+k5v6l)NL>nhw_uhTJFv+aBO`E`Rg&K=k z?J!b`99Czic}0!-S+dFs!^z%7o|9EAIz1@9P98;j@DW)VrJ&&$OmeqdPm2+#Z`;WR zBuLF{Yz=D$sme2{raCXUpKVMEsm6MsRj{VbD%r*rZ%84*OULp05!h&59~c}@-X~Q2IL|5^E>>#U z0NwDy;gd-P#$1kmcB2n4tW-v0p9!3nz&_|SW91qL0eV*9#FIVU z93|zQT?!0i)`pfYQ-Pwh8!s>zj1WZ(^=tJcHzxSc*}0;RTDd!px6B7|;;C0elu%E1=g8 z4^*VaVWnBNc5`uoHc!MLkYH`e8&u+#eD-{8esJv2ViwF=!E!uJ92FC&L^s@Of4EN|kN zT-C6+BdVl+#>6bk;sf%+PK^{?oiZq$+Z!y+jwO0xLua|v>(3!_N#x0|&B)>XN8kSF z?aS0CKR*utqi;xtC)lf>B8peXh(n{gP_RBC|1R?b?5o*f)--T|IOzatnj zg`%hXm&6xLL3zHX*OmrKI}_^1ZbPpI^D`)ID>i0hb8A4-v2ai>7iuiqjCMl2gSlD1 z>!@S&1ARwMMM7fX5$^Utc)ZDG;V!t1c>sC~g}HsoX4+Gm^J$Xh0?_?VQRI*fGoSP* z(ueY*sVmYBwi_h<3G_;pO{r+=X_b?*10G6tg90d%ic+Qpn>f)DPiDJDuA?P{i52g`abU6ouO7w0&C}^ z$J2Bb!|rrbs|ec$a>(%3709uOm{INs_nZN!zM+=FH>h%dA8gD6h@Gq|P89`YYc(tp6up^id|~uYr%FM3h~O6b;t;eA&Y7u z9<<~}!Hk?EScz|H@XLvp{0O*fSn*PO77X=!j{a1-`ckd=NUM5M){&pZs^GhjkbFC_ zRi;rD*Ku~SngH9twmE>YT#?;Wb$1CEAR5}blxqVxDOK=L6OER70ph@VC((X?02Qu( z^PGULBR_rnV|e`&@LFHLeVru;{R#9GX6PQJYo0_1dsmt1v{{z8Bn9;Z(U8J)-b%q8 z1NJ2Mhb3Bb=F?7CFR(@j5ZMMIeqjLXjyfn#nJxHmN zbtji>DCA*mLwPJDTa|&bt6P>~kl0%z2L(kY9b1E>Wqs#L0nphi)e?sNcd1p39|N%i z_RfpYSSAYU-XigJ-C-luvmXwSs;nx^BH?lmkcaGTC~#V3-|j9=f%wM3s%&SLUXof( zP|F!~*Br##g9HcHM}Umd;+Es-Ze;MQ=J4>0vr|JZ=~U_Q&eh6X%HdE^d6gj{SZ!6J zURx>S3e4${xK!*k$<@7DRBfuLZ9p3XO%m=h@AWurC98wsMVVkU_gF&~>Oj!t>u3>p z<1FFBtO*GZo*O#pl(2)6=AW50B^Y77z#d|?_)&)jk!-+C=R`=QFF;){^cY{pjD41%a91IL)t&;}3GCax zY&y#1YFAJyBYuZ9b=`e;UMDKn$x%eN_|$Ei$XeiZY?JT@wK_yoPXXKvELNFMaoa z4oMB3vUf~7lD49x9zP3j$v))u^Y@>H*DocfKzB)}n)N{z#IIZppw&)Xv%W3i1p$$ zS49zA>Yj6;qS5Nh^ngD7g9~?LbMAv+X0XKXOcuCq*$JvMjm8 z-fw8x1-IOm%7m#Od-m8wypJ=H?kdx|WzAN!ZtVwEXOJ{<%ZAAGH5LkN-Z)E{5u0uo z`AMZVS`lR{^?yfir(1fL4Z#LnE_0yvnH(PBrJGFNX;jy3D02D!^Tma@S1*1xt4oP? zk)SbiJ7GFaD5URPx*Q;{iI1AedP@5ceRu-fS!+9~8z7=wWn~uHhP~HMC^{_h&O%?E zE5mnki*1Rj?ga4JC1 z9D9}IZ#hGRr?QK@qUw{~FSp%rn-bdVVQ^Xs*onymuOKWWTb6)iz!n33YE6ces#y{= zhaUNg?rgH)fbF>Av{erV6GGK`S#~z6T0aS4&}=Y}CoA3LoGj=#APaTax)gOUJtFJ*JupPL8aJ9mCAQ82MbQEAk6P(>_gdLwGJX#Y8 zNuYLHZy78R8unsv{CG#8tvh$EZ$WCNsfl#9lgA@!;3E^tPj%qnksuIcdS8BB9kV}Bwz(m81Vvt)7 zKA$Bq5&0G2D~O|Bf5?#|_uBzhI;J0GS>pXk#$jY=6d}en{lBm<|LOIo@*sJ1KU8wv zf&^4+Ib6e>6>^#P4z7iib%$(omiXC{b)_BIq}FBQO*ye7NesW}L5!CZq%>`r0oRZ@1B>6ZOPVTz(nU9vf3 zF8WpF~&|bs5-T@EuDn%&bW;J=~6CTGe=(AbHyqfL+TuH=BqX)?4K@ zmg)>kj*qx(iGoD(onuv~X|Y}QoF%NT*!|uP8zFwf)|mWmxjL;@lJ;87iJ#K7B(q$( zrHH;td@`geZYM0P+uXT& zR$GAu$Oc$;&@n;Bb=fx8(Wo=cq$VJeZ|0;6J&mR&rU?^M!V;?B7=)Fz&8?3vV|~*% zwCUK=)S7EYS3XUwmL&i|W{3XvqsC;VLvlir`pi;L1Dj>}bwj7`?ko-tx^7z6*biM9 zK$Gb`F_9c)r5qYsX6_?!oknK_*SJUN)4(-EW#23{hhYO8VUscMx}A2RTnzNbz)8bu zHB1UnI2^h?ra&_WOy6vhdxV<3FdUj}g+U>r@9PsPZvmBRIaJfl(vxb+LK5E%-~Z2P zC4v{`jxnRr!c{->g?0-OSDac{po3&@LA9a*w=X@L>kq|YZiK?5w}6wyKPU*= zJ?#NkdZ9j>s$%sjBWlYQYMbf1Pk^l0V%t{q4j{eU*N{fF-=xN*7Gd{F=>s%sM~ZS| z!xn_xdQ_uPhG2IgX|g;${32JX;ar0Y(Ltf*P~mb;CUB@Rj6OvmnX;<_6+DzXcH<;# z3y<#EsyUTya}T3c_NJMxLPIdqB?|yPnhQ!pw?K?{iYy&x-5(pk*`kNpQ~V(%!7?fV<>4 zn+Y{yHZ#<&M(zwr$h3N^*5+m3dvNH{!j<~}fXuA5iI5vpDS1*L`>7?y>5oLo)sovz z`L5j!!Z6dQos`xVQ_`zQ*)OgcvkDzrb4=ghHxp|-$%U}>wJTDN_?J;ZtDEGzlFf!^ zr;L>0fj^`iA>d_~NRFOr*-5q*n?eI+PUzn=x zEfn3$Wt&Le1ocdov*D&yW{M2dk)8N;K;IK>3C72@Q{}we<=qFM6gQ$LXStXc1(;U{ zvIaNqcpw011wAazG!N%Y{PB8XtwgHo_*=$gH`-ueqZSSVT#j!v?}GnN`6+ z(3N`HQ->=^`A{Bcq{@f7I-ac4Ig{@hmiVPkNesCIdILt_>Qv_nhNE+YCEY=NLbF{d zNt9r335DEyH~k#7A!*J}oG(0bv7)OS!EveO@eo|G5V(6;m}{--oz|gN@!ewQ5DnPj z4mqye*yk*+j|(UVWfB@#B9OtF%o<@@77qda5@eAG*^ZMOdXB*NmU3_8x_8vd2S}o( z24_F5a`WEj#(eoJ7Jq9Nkdkv3c((sjK=2D2*XB|xB;!LQHfX* zo8gseOspF0h?{;cwnv^OcdPG4IM1R)?K7IbYC@tV+JaIi-y=UOyOryzQf2FoJm?$R zGb4w)rKYkgW!rp@m3;*GK8ab=s56eK&xlwIY$ZT17syJe*JWB80RCsSX!ToR7kFX( zmWzw=7sLm3S_^(i%T`+#mfFQ=B7`*@nhuz2IG9a1u;lOlF8tl!Ov*`{Uae zA7b=RFEE^c!EkOqWj}uVIK2HNnJ#~01LBk}zrgOzY-MR341lOOHvw{5(yAWxU(#Q6<|_&H-OoWZ_%LJ} zP!i7)FqqRcCpX!0+L!IfMzxZ5 zR5htyX!c5ONWMZL#nl~<0aFe@E#VX0PPy@t08$YK>!p{xuVfAmC%Wat zb4DK}E$gEDh@(E{Ua)-&oKATC=<@!*e)|u#Zz@SbV&$;hLGF$ za9wfMUQ|u^Y1i)Y6mHZRoP!oUwt)9s&B44H$krtj^;by%P8KgRA(&2;uWfa0-?U6N@k z6v0l;f>;ZcMh;2tvS%!VfCof+gp~mN!pqA6<0&5psnOH}Ut*=a2?vs8n@GqJv^!@Q zg|>@;t%;T{BE$k@mlTVirh;t*Rba6=`R$Kblwor5_IrH&jEY`3^V5;9LRXf;Vr=$8 zy>2Amc6{zH@`kG2y0jpPs?cRy_J{39Sx?6qS-6LGptgXUc59!aSvXsMK}WR`vuJvR%b<3p1CxwO!YG!MhRCEh`uXj}6J zSIgICa_c>mvO|{X>Z&|0k@XEAP2W$NiAW%476G$lw~_=M^g*6~AEDH@SruwSK`7J& zs4ZD?J+&&6FgN74A_hx9=Q{1i5=38H{ z?Xa}dgVDcicO9jot;PTjLBP(*+L&=xso}xNABtS%Xsb3q+i8{Cj>biqoS6wkenn#g z_8)}5OLfrUqq5hsRcErK2kyW&@M8?I28or4k$tGEEJpxCm90VpR1HVjsT=NAV;&3?$L)bcPB;4v+8=Ts9_DU!Efm`zmRv@>25djXi- zsHp5&9b{LPqQVflE8Nrpu5FV#TcxKG%B+_&W4T|Zs~i2uMe2GAngYG$YkWV^$=Vf%xA2_~bq^6qAfThWKtYkm%HBTNA2M6*<1B?zv)9QNI~hpY zcjSCyp^IhDZKSk5qCe%9Xt{+}mYk)~)XlUKw^F$#f{dhr+&R;v+v)(_ZF zB@YjZ5S$lcC|&jK?=ZqH(= z<>=XohYpkgE|QG5S4%}J8Isgu4>heb;kW`Hs0Wk*vM)=>L#3!#MQ``Z8Fie`oImp< zI#tL2`t~RL`VCK{Kibzn1G@5Qc>AertFklMavVrI*7hc8VgXOHwEB{YX{M0^dgF$} zlA4(Ez>EyaYtzo@v9dNL@tN779xFNf_Zt(hQBL8GHU#iMl^keD4RgQ*YvA`PALoL5 zx18uwP%p8E%ZaTQsqliaFr}Sj9ZAf^P+c8I?)62<@QNha;FsrNqJbv)J`9ur!&80g5|KyCrU7WIK1wO$^)&K;`&OBcSx!{O&C?@(*Sr9 zR&FWG7wtqVJs!%UD+a|vRqCH(>#zPmo4tU%7rY&0{b6ElK=J6JO%gtAnjBr8PMd-s zzkU5d)8+g^`dg}h7t+Y*Io><#I_K8-9GcQ%yo8RG1j>B|9wdMI4fPNQI~i*)+b?!w zLRDwXp1f*AYi-VaAo98?->sAsr&1C;dZ8R^ZfH|;OoDze(Ip9X!b1XzIXeVC*Vyk4 zk3|oCu##b^ZKqsKzXtda*~uUnmbP=?Y`9H@>krVE3~X!b@J?F|HaHO^QXy2V-A6TY zk56Q&;ymC=kdHfMIp_g`(u6Rf=*2KWp|BLbMvBI|7h$w6ZKQv-c6GHrs#HA^5<|wBs3;Ty{&j!#bSH zdfCUaRXN;Jsop$_q(IK?m|PK(W+EcZ{cSbY9R) z!|;g36(j{x z`P0X&ahQ8_@ZlV~=gTxG*f1@2nB!Gcpo4Hm(#?>4 z&xHyLybjm`uH|VeTck5oj|RG`;=*;kY3;hp>aoFr7O+5^p|P%n6u@KP&}~v?vN4RX zcwky7dC5l7ln(MeQ^(zx?>7ML-Q=*+c~8Tu58?rvT$;Jh>;cs(i*k`bm42gKrdzF6 z6VT3ue(eqbogD*kwK}zG%V}_?qh#&eA-#@uCLFGXrCcgD;DAMCxx(eda}{~l(Uo@l z9uA9R1318n__h&9i{?pys3Em=>8uTkm zmZ6K^*P*sbU~aJ-qgQ}HVU=w4kLP<*K($*btG0cl+yxcDzy({2@t(Jk z1}N0))a%ecIc!B{2KTmeK(Id%|9dhhB905*;fKGN)kAa4iisnB+Id7se)$6nljAIN$0=r9crg~+!E!{rM z?b(8E8YS?@hsn^(8buQjNc&l8Lxm|k`R?gmI1tGpSz9ZV%xOOtRaHk;9YmjS;$-jy z2r}rFq-H#7>mZ9+w%F=o-#B(CuZ$_Yy=^pB+$9Ddots4R>>9`5+SX2^kobI{;?PF$ zgIy$v5DH8f9a)C=SRy}|B`rMz9MMir8#0|iXob&&t919{Jlg1blK#~Ovb!{ekKC`G zL&2A6Asz;rm?#qmV#J}r9;*ALL_gy}HB7ZxiO%>%J|~B_+l@#)v4*FUfK1{q=)yev z&%J&5YNOOI34v7sG!~cgK$lx5*GCtYD?I~Wp8NO@DJ*t-RAD^Lo%}#5Kr+Ov>b}5j z#!TT!RtFi}B%w^gs`sie&#%*+72XilmmV%`qLfHm%| zw6-dz%arLZx7yaPq>kqdhwkU4iHW5Db)r-V^HEX4+n58B7d8TGFZ%? zRF+K&zHA+#05*<*1L07ksu(YgU$L?=EWP(Xdi{cB#WRQ-w)PioAr*3mUaVk1 zEm62(fm{%X=hPcWq3pB*OxUo#7zsxhq8n|=PI-3G;~L)feZ`{O7QjuR&gr3EU*jQ# z;R?;dULq*@^YYPbIQ~RMQdmXXgr_0+;EExRA5B*!|5!r^G$FUQL;JgI=|v!KPOrWm zCKewGh>F|{^k8DU=HIKuzf6;D z_ZK;`fzFkMXj<@h7@x};znKv;iO^AK8OC3({48&OW5lMyvYeZ8?n{OPoytoK1c0K!&`V;r(1vojD9C^y zUs$-ON71XiYnOWlFyGZ_dX(G;ClYB6b(YDldmV>dsx8bQQXs}>5h$17tDp+|K=zbO zeQjyOo6nZHWNpT6Z#zk|@+24>t!coLKUOg0_Q6#FCDiTx<^9hjMS*nXCm+d+1+i-beBIcf{A$Pi%H*^PU4SYDhZT&wCT6FBuy0ho8J z$!vQtCn?eM!j!KB+^D{kRnQEZGETtnM(Tw^JYY{6A4DG}7g$t_s}t0I`SxY__8;}J zj(y5~%XAn7l5J6<`rdmPj6PpPzj9RDIDG_3iLImgkt?ii5pq4&2GL>LyiDe42|ZvG zaBTD~cj|7YtTQE@f%AK{JM_l|rUe-nKzL2DdvXfsf%SOb?cN2~n#djwDt6da>ZWB; zPUXpQ2=(2P9W8s9Z+eE)LrXXDbn9BBevgybMpI|UAJoT<8vPhVHIz#_9qpWq?i+gT z!aEZkx@z-mA&Tu9(Wx3IN2u0NZ!)IWoWznPA|3oC$!SYsDJF_eGp}l>?V)qP_lgO? zII^aL!l~SwYA?5$wDF|1AiwTXblSFgl4_B2{Si1VJEi3ku2ewMjNdMNgj9IZo`Bu| z`uZz=4S)H9|1GJte#N5eS5jUDQ(J$*uY_&g!}``LC9lSZ5^jd8cSF9cu?#2c zL7=FX1Z#0Quc&9GJ87k!!`)V`Y?oqs2GgbkiJ?Q|Oksku3}?rGNfowx)dS(2`XU?G z!qk)wj}`gfvlLQtva+feI%ubm&4rj*y6n-)nc0v$i6CSodtE9_=zg6Ufwvn+BR5oo zvN~0yFs(@?#ZPk!R3Kc*mJ@#nL$ra)2u-J02xIML6;~YTdB$Rl1ZHh=l!vmOJ&8lZ zj7wLW$6-~F^yWPPi0(zO4OoH{Q#K()qZlDhReu0ub?Q@uF=`Rov^L-WAK~q@WT9e; z758bYp8!1y*Ln6^UB^m&qe`2lO2m4SymL6zD9m1p;|&Ih@;MWG`?Or-x!l@X0-U+uYeD1T>vFH*JIzfBo18_XBB*unaop;RFXLtsWCyTimbmwv>bXujQ z(n69qF>ZSQY>Q1ehE?+=J(VE&tOfRq+N=RRU&J1>PPcU60@b28r!;gH)xnLk2826I0e?NTFGC6R;1(t7RMD3 z<43cy5Gl}{4;ImL;2LV6cX;yiT^0P&x*hjy?2h6^b&IOSGHDo7Ak+eGrqV+Tfr zt96;8`5*a}o)R|J`)3J?Uj_a0>-5S$L1Pw;DDeGc&ytA>wiSUE%KvAveD9e20YleB zXJ}(_IxdJ!4HGIvb=ulr)q_HI{j)vml8<0Y`sn&F7^Dt$og^!mx!%@Joix#8O^cCq zZ%D>L!D!F|`RB`JXaWrYpCHHQ>Ecj3l`z`}qSYqvuDm%??j_XLHI+g|!Ou2FMx($W zPI5+5S)i&Q~wb-Bh{D*dsg;o_Dw*)fb zX;cPo0O+B!w5Ik%q>_l$OfAKDswcGyL3M%1!ZRB`-}? zqERe00bdBQM*hGt#R60^XYEdH19w}1P$m;Yo0#qWggruOR#H17?hG*KV+(MH+(2l*^Z7CM9);!M?4 zrM586A0Y$nO#DM1PMApmdnEg%lofwj!CfqP_;XOU&g~J#=gSi2hlT0nzAXzL%9o7^ zc-ycDB~!s8J$@W?|FA#Z?iUu7< zGOIvKGWZ*+f%d2tZ`#=c?WywIg26nhJ)}LC^pisaKsRcJUW^2CQKS|0iZm0;m{G1q zZ;d}n!a=il-q*p~>g(N|fV>UbLrPC>LKD+%Dr?odr;hwkE2_7Ccqo;%2(l+l9s#9BwLC3WBL5TJ1@?c{%|o{}9EGUjR9&Q5fa zYnG3TT#Bouma+VY=W zEwx?_l^SsE9863bd3QK3Y8VL&67zbuUImV(@MNh{L5T%ghNa>%l@3V3LOGQ~gVPzH zY&3A@47DsFx>BfZ6oE3b7U}bV%?+bUjp9DypXDXU>Gr4L=C7DH{t6tt&t88VUVnxl z_ouf{!>P-C>~~2FpWsNtczO@fB<|$46*~-Y=>4wQfGoCWWUoBMA!}$;mq!w+u>PUs zA?PM#L`(w|^X7JxQoBzJ1ymrnsak~@nz^FGI%RaPk~*y=F6B4CXOjsAuPP_gOr%0Z z3WLX} z0t6ddxw5qnR}5AQp1eRo+xYAJ^o#KJJIJgGJ=If&aeEd+3 zzudY<>rz^^)6XzfunTkFu}9eB-W`Svo0ttIkW3assgf1Ymf>36G&Ntn1quKTwSk{M za8+7rg-Qc(SZbb6IC^N)n|rrs-4sbAq4QzE6`Bz%2j6q2NEQRZPa039#6%rJg3e?z zwX&<`NEXJvWogL~^u+YYOSeHgpq5o0fb#jEPM-3b^d0{kD7AtOW$Noy ztus@M_PVcy8|12B69w8F)Luv)0pSX&ML1aU>w^>fl!hUfn#bX&I&09 zAd!$oJ|Kk3>5$5M14Snfn{GQFjc}YXG`4&;dF!-s*8pKDGpyL70dq{YiWKw2;d?mg zS8)v#$C3bp!4zROh0?)PC=n)S+Sf|zf^1~9Aw%2aO`gW%15EDc9}L!!i2N=|C~LoE zsP!YIAC|229vC4a2cb$P3@L9wWZJY+E3d0XYEX)kMy#ruoq_0AWGZ2d$#(Kqr^PtW z)EulbSZ#(0yv1XyXHvsEJ%j*D#S#^ERqX4HPqL#o=DUxumbte(+`~Ynm2n4+Jv{+t zmxvA=)AXF|bzDl`Cnif0Z#QbQsZ5(yY)|O#vwsCV)-rj|YD=OeX^9?{8f4tm%7CB7 zqOg>aT*#f0JsSAtY;{JZV~tlqHJ zfZ7pi)u6VF7!A?$3KD|UBa#rlsofUm1(LBtSj)7Crmco_a3IT~4|I0NO0J_z4l3Q+ z6gihhk@&mS=D66Fn3UP|HWoWN#6`yz>=$gkevyVu4~kB12Kclmz{t4%#15h$wI`MG z4`Crjz^;~q4;QX%mF*nZwNo!7kRl`_u>HNl=-l!dN#AG$!lDdxwscXSJ<*kAg6S zpx)Pv$Rq37M%z)=PRKMpNnol9tnQAw0GiUYm@q(55Vo|D^0crZskiuSOSx9$xzvC| zp`G$fr=Z4g1*w-0<2j{%%3~-{-B4?DRROE4&UHgT+o?ZZ;_@=%STKsNCU1|`COld6 znBIG+rPiOB=JVdJOK+E=5986MOW49ta9Wtj9t=;*t`QI@zc|IV~;*bjISNR$+8{F z$;vWs?*a$3Uvvyi8SFJh!&@I6)~bT8CgsNC$p6nr8nE^z*5{My)T0+)eH- z6&s%vyJX!F$;@W-)vlM0sM;abE_I+23%j| z+FY){a#02b$i2lUZScgIx#*|fVNrt%2+3J=kG%~Y!M>6|ZazY$3jkUMt_uuT5IHzW z*#i+Us7sn!$=|(Sw_t4E$A@tci{w~eNaB>$ZRMHL>$w9q6{<+{A!@E-%N-i;l9~M={HIg>`t{qdgZ7Yrc{aGg31`_&RD*(B#|3hSmQZ>W;#GSs z(}Rr`c*q({VhC+cY918hLcPkP2(!$Qwe=QnlI5qIew8SL)Rs^m-4wsHYr!|2Vfn+haG zsrFmyC1!6M@aD2_aq>*bri9p@Bl!Dr%$lmp(1%g^&r+v5by#UWhI_r5>g(h_S<}g- z4Ipc*L0FOjxJ`cBzOtdA4HKum?Lb5jAq_ZQivG92lJjX&Exr}*j*`JNAXZz{j`zBP zQ7o+6x_7GbmSm>)oBvGp&*2mf_HCBS$OT;htsO=K);5rs>CG~<0prKlNK+%d+v(pY zMdEk_v)iymyd1C-yOD7KfKPRl98ZH72-RhPd|ihWk|(Y{+Bh_|E>9j-)eh^Vk&n3= zDwQ6!IF2Kk-NeN|V3~kp4B==b+d|#_s4L*pKAUxO)hdbCi6$4#HB8(>Una1vl^C4S?f-9B8l3CTG)$8 zjxy(|(f{zSB|u>eA>y;D^&KX;Ji^PhwJsg z7bi@kR8TUqMS9g&ii6VNFba`FjCNLihxg9EC-?0RtMz0fnB{oCWB-Nk_ zFDOqg=eB!WV%Vvqqe8gjwG9L5is%?=>{jBK3Yc z6}Xj;ZXuzSAJlLVVcQ50S38zA09yca?ksAnvAISR>cyZI(OQnp%PXsaYJwfi#v|nJ z?IlzUlvCa3#1*xt3;Gw`nxOEIr5?yMjVGL+RL9DC%0f!A_o5^~ckUl3L;_Zno(^H= z(HDW{X1O0#-tGh4Y8N_9;Jg={7za2+ro?ct&!vhpTpA|n8c_@!b_(trWd@-MLs-cs z=V6OBC}t&#)u*W|x=JZTOiJ%zEm>JqYG@1(xsmBuVFe;8B9-+^GNs)(UwSUCd4 zIrs_Nss%aV@GKq{OyFi)(dQfs=s7A9r1D;1J?ajm6 zIDuWrVnUC%1#qct-8ni!YfACC=~)r34^-V#o@(?eTjB5-?6%#3N2$i9Im{OPD)nJ0 zKr)dyRAw^>BGoYOGZe+X`XEs$O?H5?tk@fk&z>|0uPAK^)Zf?cvg?cqV0N zwJQu$0*B24WF6YN?^bo$%^Z?@-A@X)2A01|w$N^$jXPTKL&4k#@X8`X3<0#hMSs|| zlI=%X+IFO@EhoLnU2O4K91CTaf-h90RsZYo`l%cTCq0h`oa6>@v>pk$c;6Eg?gD{; zih!2j9f@rkF`4TYx?_xL4Qb5Yvijz?{|jkc9*kSm_xOhZ3%M1pi5rqt0!UYgb74Ujc|`D+o+zlL>=-q>~14 zd_%p$o>Z1OR?}W=xlf7dz+w*8fHf-RXIQP76td?W@k!0cAzjS;M=$pRZ3eH5e! zJrL^(jqpHsc}t+`4=P&L&+1dFUSCFzi@1Q7*r0sxrEaxpu?uOa75MMnL)jmP^ON*9 z|0TSsuFcPb!NFf7d2GTqAU63QH5=x(GLDD-QuXTC^*p92>S`q5U^rhH}hgzniS9+s@iU z{TD~B{HG@<>oaEp$J6NNT^HIx8?AW91A({GcthQ7A+eFgxfX})pFK1%F2c;x-7qD% zOFeHDLMfj_mh+Y6!2|`NftwPtOU~^qlndrY9ZR=usP<)7+HqPy(SQ?2_%MbmVcJN% zSWIgZ(KT3;4vR^{{49MX3G1PHd<2W3?%)o*12Qs63YL@k4!z79InOQqLM`jSP~x2h zW(14LwC)h5CnCGhh~6btQ-|M`FNWgjvSwj+P!t(H7(LM4-_XBeI<9$Rr8c0J&&=(C z*0HT5TxEiCXQ}L;opvw{lLJo136Lo%CT$1|NwjKO3=lhk%L4c``_s1_)F!J&(Y~@r z;r6H{Vi$5X9+wUQ2rlF%;59&$ObQjCX=J_nzzV0%#zxVCDye4RZsBVY?TBga_Inx( z-JC-M{LZ>5ayEKC?xY+E--*a<{r75VI0+sj5VMNur?!QHDIz6*K?cZ5 z6Ui@TGt83p-mN(Wn;XQKGNaE5c-}$mXz3h9gZ9Bjk{o>e>_;O>+1P50J$^P2ia8Pd zP$2k^jG4(DG(G;&>%U;?kuJQHks~ErkPknQ`_|T!g=7%Uv8IOUw)xwd^G{me&nS!K zy>?#9ZEkpk**Zlu;!VBO?O%n#x;ZKt?Q`R(>dUpm#uZ6Jc+JZTmn|*<`I;I+B&Cr; zQ}U`6PylNA0v)n*p)Uj`BFP@mbxO}lPYx%ys2qWRsJar?8lZnFo&oh+fDI;l60$!U z4vlZvvXTwj34fDHceY1~;x9p-IWu^T|7hVXorU{9Dv50N3|Xu0Mum7iQ;+^R=49T6lA zxP4%qB}c=%y^{<8?`Lh5LAeotmpTFq#qE~V%_m(Fi1N!??BQ9~W7)2%U_KHoIkIi2 zI7txWKhQI!2$!U&>>+{+sqEM3&cRZNuHxvqyoBJVZoG^o6BM^5huo3_!$8KYdkJCy zhh~bS3J)k2hxMQQAcN>m@N&@rrq2OZ7|`K2abHl&QX9#cTAij-ws5^0Ez53(T3zZK zN?l@Iq~-&GQ+1$gV`W*uHMHq)tkWE=!g2_m`gy{&Y zj=s)8TVk1^BI|H!$rt;mLsXmhLD#XGHlV-Za<(A9{S>^G`9%DVpGRkW=y|t=7 zff55;GW>6Vlq3NzEoE;t%*s`guzPn^X*SHH^eoxUJ3>JXgOq8 zg)6!)!2sa8n>zNg{2tyw>K$cslX|3(K+0Wuo49vw?QXsBr^(yGs;W@{i|3F!$@7e0 z-bw_ncuq8%iR8dUqq4#ez3``t`V2P^31hzkWS~1$E+m%K%SoTNM9o$n@-?b}bd!BG z_GO3=(;%B{(%@P43bA0dtu}UWv4f!r`{GM(kvBRpW5*ROZ-kr05VxGgxx<2X^T-L2 zPI4f+4-DZ`AV5cGtxHKNqnd}<%EeNQ`%OoCT&+QF8SHp`brR*HEOfL9s+JS{>q$Ge zhNrdMB?-C%db^Yh0@1Yg$G}8eEf(msH|*dN3^k1CE|7C>c5|^EN(?^lH90<8>q@^` zQk4+yH-PO___6;amyCGU&KrIT5$ zO6_Qfv0H4Flp*9&PuFk$RPtu$T7DwSk!Llp(nMEf21@&omSz>J^(acUDNx6X3a7pcRU z!6N;TbPoPQI~VD|_1YnD1-E}z8zPQ-!7L{h7l09YUzc8e$|W=P>O{pd?NC?0@a()2 z>gP7@7x@6TG;39|7#*W1$E{2IHYmXcH$o1TS!(Sg@CD8vkd&b4P`?GpE7qKkuoDX+ z)+AM;qD+9tNUIa(^+aGvHF}^m-t}P3E;g&Kpd{~YWcjcIbJ}4lmk$g}R3O3hkdw-% zBo$ByWk<4@j#B45>k=(RDFDB|E$p>b^8ausYuFl;q|yNK-^VQeqqjer9m{vZ556P+ zmsj_1UVp~G{0+R~-hO4++`t@n^g`;P6Jhcv6=%El)&ROI^G8B5ybyQUo2FnZ6=RnJ z2vCkESShA1N?GuR*g*B_-90Qf70{6UkA<6ZeeH35y@vWs{0*{{FUn11zZ&*hFsHCH z05Y-gp@GcpgVp^?SpsyzMW>Q59Re0Kb)=99aTrZ_nv0v_1)U~9gmj3Kv0_whk zfiY=&rtko>^$*a$P%N;fZODpxzbr{$ zCoU?NxZf@jE%#qtz8AieH(@rc_|soHSR|tSOSqw7(vtiEKEwo79jI z%<%@>io9$bsSn$#0ON1T*&8TFWu{Yl86|6<1Uc!H)Il7ht#2I@Cv=)lxEJ-HhiHAs z;?hdMmnFOLsRX5t+WVvYM5#=mtUDkP9Jp*{Ij16|cY*jD_!-7&)X{azhed7Zw5LfK zQG_`n5pL~qX-WhV9xMrImGN)O8Fa}+FtVjQCIb|nNgyCFds-&$JBWIs`k~UP+L`8;8R`++tSxV+)Db?+~%J zH{ueg<)*mX#}p@aB`r!4VI`|v7FD$>6okta(QA;Fbty6D*_NmTevazVnd+uZlcWh| z#LSWmrwXlqvJunx(UtP95IIfj?0!<(s?alDbD$;i98>^!rcZJLTLVOXwx#LQ2Yg|S z9l@W>;BZt_nD=a%Nr#4=q3eY<2W`X*v}awqA&-|Apx<@!BcHtMLBs9}Th)?^)zG3} zn7_c5W*P|40?R`_$?Vc8QoY-{Q9L__-81yPGmvFO3#CKJQPmDOgFnpXC$wz&R%HU< zkApdpbtNbIDfTE&vpCh*Wt!UE>{? z&ZCJ za{Vzp%pzEJw48~k%0s*pcMm(&Ow`6ei2?<1fQEBwDgVkc9wc`$*V;`RYP8x1HqzS& zrTC44LDPb3Jk8dQYP>wScF$n`k_mK$o{LADYt&)?C0TSKznQGBPqs{$q05O`k2s3cXQ7&~G3m7_W8NrP%#+H|^IjTU^eVO*zp|_L!7R)F(YVf@a z^pko(f(=|7D9SR7gq`)1j+JWKn(C;)9s_As6U!x+{usgb-e=VKQiMLq&EE)2AG4L% z6S{HyiJDFW82N@%iWonA@#B#`97^qp1Xz<|9>KKGwS zjQy7Qg8GzXR<&NR)Kq)*Bo<~xAGt=}!4+CvWgsC? z%4y<$+QaqX5pP?8|K1>`M(HfMWQ>C=WXh;V)Jighm8qmBo=kHxqRS)A0mdqwi7d|m z?%arZm1}@JpzPdfw9jxishHBg8R5jeNm4P^c;o7ipb{6gPc^0LGPN>bn@+yFuBj{4 z;siccT7zhGrbivz2cc$7yRN8yAspOK*YMn#sxZta29AsZX%~f@X_Cm_LTSgXEGaha zVdmh-5UV1K%Tah+XGPA07<|!qv@pl{J`b&+9|}+o)p1H`}K=!7S$uj z+7kr2B%rg(0q1Uv9+)3CM4Bk-ilKr!J%)nJyXt|Ct;@eXyq8yiuOaV>83cyW@d}5p zQxp!5ya@pAJ@s`9rI~c-jRwcp6bfa_ke9P&+xO(Z@V)Puanb9SbSnDj+rNMP7sCer z=M=R8Gponc4Rxy%D3y&El+M6UWE;D-Zgd`PTL8sYD0aJVtE81SySUPF0wR8D!pm|L z)L%aA&r`Tn6cC<=jf1Z>!UXTGx3!h}A`RTBUu66RGPsD;WG!3Mb?ss%ntZnFR zxZ#k+B^kK7#tIW5Kx-WE=0Q{o;} zj3s>=MwhuAz(SY$h9P!Q!eRPhhRz0{0|8r&+Gu}Ub)gw4)&YG&3O&c5o7+(%41<~zFGV!*~RtOnSCkk4rhg3G`DUx`u|+%wXSym- znh6k8;VVEnENx3v1Ed4?z(U~LpTg@O(z;VAn*(iR_B2|R)L%ixr#;&jXI&!yO43 zCFVljnkb>w&jAtK2kh^KXw7rgC2AmrRdJY|EX1!iltCWK9v`HT`9-V=nsk>JGv(Msw;@7Qm9SYkMYv$!)6!~ty%;3wM7@erhBp$bN)FTX~1>aljA9nOJ zoV!11?qQT0Ioo)&A#HA%FAh>nWqGd1^c}_y1QGa0MvQf&R2qAdG2P__mp@0B+$=YQsrkXakcfQ?}vjGEd#eCA_E`_D)8a{MyP2G!SVz zkMdb+qE^B6o`HVpq>gk6O^MP2L`pbbM2nUIxrJIQ(A*OL4k!qL0K#bqW{DMK4j_?& zBRQ?u1wG8OD|AGxawb^?dxCQ~|M}}zY+?TN{ZyNoUIB##T~hTS2VI@z|1(s|hPGRr<;;a8OT9h`Iqhc^+rbUnfI~cXj_a4*)7E7#(CP*QV9guB1QtOCpp&gUEPG(JLRTlx z&GKePMX_hIH`$BoPh#t44mZ-&(78r6qUeH^dj`XF`?vCL<(FLhy`u>)l8UaJ)VG#= zODIWlnErtApyeY{D6X>k$)Bk=Oxij7>y|7t+)n-WBA>-(Wq`*3f-K>-zS;&s;ci+c zH9#-psdCZJfN`z5YpFPM?K%ar7a;1msG@iq4u?Gbka}gn-qrl*!@DcA_g6eK^LC@(7lD)ZR_3%j9L)GNt z9CC2wy%gJrY~FcAE|H}tpfSnG)?&KmwS)tt+xO%GnUU~r$eu0c2XSRW>Au(l?-b7X@7Z?`T@2<%%Sdo z!5UYO^vV0VL+x&q$oG$4_kq12@7QD=(I!fdrqt*x{W$Dl$1Pckr6fHXAk?@8p)|gb zDFpkY^f2rz9Xb6U>iC{V3KsRm(LI1kNw1<#JBWZ#_zC;a16cFB&hwU9#q*i=)tQ)* z8YaV~$}S^vGXa?*Evm!}%DR%0SuGPL#Mwio#583pC+>iZudHqRvORi!s;3aOC7a*b|>r%NnkGhhh z)&=+h5qPnO^1;}y*(H^gL}YjJ)wW+{OFE&=<(?E5iCtr0-kC4AeYg!_9S}g#*5M+)aLpl32ruKDwW+;u& zcX`f-Ls;xxXV>$~Sd3Em`9)< zx|f&U8;Z0XtueP;VCv{rNm$zxr?NF{ghzfPC_P$9-Mfc*RfB@hvZ9A8>fYl~rbw$# zGQAsBmls+h-pWz4k`;=lp06c;UIGK!72!uB$}!tb`2Kf;X8FJMJs`EhpFix*y#McS zABFe-=j)&4!H+NR|6BO>AEajP-OC-?Ee@$j;Fe*B&mJBQn)miAU3TwN4?Od9x#Mtm zN7TCx?+j}^0*f`PsJ>z-glE(<89kOP4s45QR#{b}B^Ed)bsVC*u#Co6V8_aGRSh6vF`jTL;J zHs@XtpKr>QXx}}4y?*29xauA#=Q?9V z)1aEI>Ufp1xMPi_7P>BH3FL9-e5zV`c3n>{dr_~L3Ui#RLsfem<+pM!`*=Ju^)PPX zHa*BaL6ya81dpw!lK{quw@1Dji+}VZ$Lrt^myX zVY32nZbvqpY^AuGm`~y~uv~S)Z{N@|uV`7VfX#LqI&3=lImA&77%fwV(reL8?*0om zcn_y+yPy+QPSjf}Anj*cVb|TV()R=8tn6wGA&S^c*gtB3$yX6k*3}K{N}mfO4|Iw_ zG7lW1z0n(Ru-4Fk*CPosja*O6xM?QQs^Dg+lHQg^Di7w-)@Pq<8aP}d4DWgu=x74P zMI{F;YD?NxyqkRq_Xh${GrBt#6y{H2X(i@Z-iIqBdKOt1zlcd^G(E{kF^w$jXTAMv zTCQLTev}$jpI%-j?-agB;<(%K6m_7pW%uYifLSNI*ID+8l_Ohy%lybqGJigD`yDws zR-JPYTmTpWXUDRjlJT-d^4UcnwOImVxOxGJ`3ezKqpOUNrU5%O%1R6rsU4>E_JMdX z@(n7f4<$<`R2frA?RdcCP{Mkhs}Py`#9%4n9SAYY`TB@%LF=+4H{AqMPu>(#LP>ae z$3}0>0^3QQzw$`i*!AudsIn6iwz!IJinlH#BgICbRqz$$VgN)rvUpb0H$63MUCE-R zaT0U|X=2dHPDI?!Ls-ZFr!F~RH7z8M!dhKQNm8>7TnTAwR|rPCIXX{2O=njlLE9?b zp3Z_`Ey^qE0|#rdsfg8)E`$p2cnm&&ny8z>7WI-v-r}_f^nASh@Q2}tHoiqq>sP6@ zmD*n~d$76G3v6c(TdSCz#X|!0HT`z&%I?bhL=~cX#Oo~YIm0e#VyM1B#Kp+nO9C3cEDK^k&EYhkpIG0WXpvo~Fu)uvG`q=dJYwG+w(tro~yMht}D6Ba2Vge^%G z(1f9ZMDA;^rWtbo%_QYXdHlVX%So)aia95cBX?ibF%twdxwZ`%)_}bYb!2@kf1y4# zjoX^sKv24B`qQbrjp_j|%sQ`tY-90e>)8+dit2`Q<<`f6tW|YTMZWYdRdVwD@TM# zMi5QB#9fhAx|0pI4z)=nISyp0%Ka@uMwKjeH@dTp!cg3X0!ElAp=@%MDhJvU^>zO+tpm1Lj%F_8KE512*tucazDaYw+mB5CV#7gM_SQ>51hK^GUEw?$P`G@Hc;BAh%E6{*3X)CvRUF3G$Ad!+`+%Dw!t# z89+g6*I%F;m|pOX-g;jp=nM{&TGb@Q4`hUF$Pi|(*xK(OI2Npu8V{VuNhwc>jAaN9 z8_q?_%%(F|idY~-7P!jKEMws*%Z|>hc6j}L65f2Wy*Xd$R$S;s`*&`y1kd`a$f1SE5sYuHheeZGvaY%^mMTzav<~(7Lf)3StoHQArdgWGGipPL!k0xkz*Y_)^veM%?lP zHs}8MDH7rhG(np&#FpNoTBV$-P3^j7vXmq;Kb2GB|JOgm`HB9P*UwZq#CD4s^8i_y zo}m)pXOuJLb_B2Z@AS2mfO|t-&`ftKGXN8`Y4s_Y?~qoaH;aw~!l<(I*r{LtAI9FS zNtWa~6MN5J;TV}@Lo*S4AI^w>L^8-@$%x2|?Z%Q>Q4cZ=Aw5YCdL-Y-?nW=f)>sKN z0K%-g@V|7vf4~!*DAit8U#~+>f8-Tkhy#g6HbT#TcMjJ=(DkXM&KRL^NDm zo>WMk)OA#n&?*-a@o|F2CGOu0w~~!Xy1GjPkNg4}8elbPOW^>xOxShXq@SW4DrLFP znoIRb5;;8@qz=A}5I5>8c&|r?PXeyyV-B@~?$hpwR-*LN!x@~ARAtons{jmwK zG-UlhVb#P=Z4D4i=liLu;fI-aM3QZg;;qQXx5`abr~!E9LNEvdWp_<(qnyAWY->DH zJjGVU!aV99DzdBdX5DT~wEXB?;o&_u_>*6XOiw1OGWSlO+S!4 z^!SR`mIAnxUw70}ly|y=SmG!FO>a~gkVcA5dKr+Fy!*`e(ydwXO=^fi z;k_h$)hC#kWV9EvY48YF#hlZ~ zCtP@|buA&jkbSK|GOziuVXj~-kI4o8mO9}g@QW@3x8=+#-E1?V2FCF;F1YAG#dIi9A*4+42Jp7D^?{)%FZ z?g+hPrxFJt*6g!q2~s`&OLq!%w%x&J^6fwT<%i$? z+8mr;K}}@tVdzt37^ya)8g!%NrAq$2?1P*-wU_GZUl=d4V=bq`SO+%r?tU=F`#vkQ zdm{;;9^@QYA@B+bd(U*R<1lsYZL=y1#rQGt2$h2~B$v1YCqs!erQIKAccNRkrKi)4 zNTHaVwD5WFD&u;#+V-{YbUx7pFpxt@IV3v=q+h{hadgH5I4%2*f`Dar*_#56^Q3g3 zqzms^f9+Oqs6eyH7y2u7-%)`89yZgmWc^RfR$s#{s){vEu_O1&^n-C=4_Y8guae!l!M8M zGGHP6Xxk>lZU9k0uD?ZRXqdGPZ_9o=;9r*Mr>jc0bMOnyunjuad+^+GP2w~(|CKMcQwKNIzle+X2~zo+)XhT*(G{}Z-yf!z+$O5NkR`( z3s(7QgB{5+BBfpe9ksx^N>p`Ro;IlJ1)vH#|K21ZM=1ipf?u)(8(#innwFMR)egLq z5(${QVRqwHl?XgRL0c9LS^5u-qt8j&qflhP$zi^k`YQ2hw_1(9>rA4RfD0hEY%U2K z+z&8BA!=6hhP?d150hiSG+jUsgLb0sjdGefxmL+fsg@ClCUrbwnGjA`n+h;GE##Q7 zsbYbFYGV`VGNQhQksc-`W-xLl+45f?P62@U5bn|N#%S3NJe#2Nqhv2js}5PcL{mnL zf>a@H?8vahey30SbvP}gQvi$m=O z!65l07gzj*y)kSvoZ{1j+$!C?c@9X_6au zQp=vS&mwXjdAaE)zW?t~MPIXc{o1%Uhva>`BsD;fTKH0IssiEUY3?IOc8@Mw)GLcT zLwx8E=&MOWUUO0JNVfo-Rh)z{Vqmx&%mboL!RHJ(f#R-gMM?29U)I9$V~K2(>#+sC zr4=%$h250}?(~*IFO=#2z!U%gf~(Zvo3}oZJ1k&~nO+{Wd53O{X{DQ&tI;o+T-Hlk6p`tk%T-Wlw8a7*M8FjlHjg+%=2pOp`oI*?UNSEfN={ zDoRc`Jkuj?V5f>5&dMvoQwrWWLTe2P^WF9Z1|*JDivVV(C-67nf680ooA=+b(UZ1< zd6S=Ex{#$J%AKE)O^%pu+;oJ^*r_&=+mdU0=YC4Qnf{4+44|>x~ zj{%`_Q$8#b2~|&r-b^R^V!ZG|m6K?bQ=l}q%rHJ3{f8s_DnBhr%q+(;(khSI5=PxN zTPImB#@L9cxv#ECi=u)G#wd3z33+wM>#L-sR)@;FEoHY>A)DjO)QOF~I!R@AbpwIo zjT0RKm>faDC!082H!C`iFh;U!IJ1?iw5)Tsw}OjGz8O;F$%2>EfS~@e#o3sQZTCph zXOMxgo@hz-;k--n_z@UjPJ)3a0YHh-uAYH}D=nwAjJNhf538_eF&%7#V%?p~JhVWq zt_8Y>1ns_?ygCAfz}jVD1Y>rUdxY7Ob` zlZX{H|Bhr&w>>l`Ya94xZ6~K)2!A`0TWxbBe6dUn_1!mxqRr?m8~5hpMsbATHdzC4 z@j-AbI-U60O@Pe!<*&|q%bK?QDbTMWF*3gjcJXzR!vC@2)BZWZ)V}&}K!JYsZs0X_ zp-v%Q3Ni^+P*+7oWuX~r6zVZ~XLcva)`pn@JCndy!v2_y$r0T$D%v2D`&1ES!qEpP zx%j>8=eBcxnJl2OM&fU5EZLAmp?=s^UVO4HkNVk{I_k5n09OUW@=Pc&D0F$pG{xfk zzV-4?q;zuZ;0R?&%GlMtYucm4>}3Zlrap6EHfN&tDxhLXeGQ%r6^mt=0CWa1O;D-o z(ur3+`dNqRMwsgKaJl6i zAOTknO2zJVqDYvJI5%|@3DLerz?CHw=-z72Jmf2VEMffaVm&HYLIYv!uc7E-2Ue!q zz`>q?`hgP3K42cO*r1@m30y&7L!NMt-YBz{L{>`Bj)kHoTYyg^i^ zDpnBV)QA5|_?xsTegYGdl;wQ;MR@<|&(kmKd2e?iBUf-AQW>I&g!hO_Yi(f;1C0%6|$LjQly8&SzKU?EFAm}<-M*`Tin)q zu4DSF8-z6FkeAl%2Pe4zH;o1=0Mllm7MoPjw$%3p+!r||VN+a$7VBMJ=iOJi)dtZK zQa6Q-pK#3(D#+HOCK#4q{pftEdc^ADB3v>QAN2Wp`M1XCyV%M8_Vkwnj!l2|D? zRge)z=2)GSLbYy^F~D)sW@LyO26AYn;*pBQwr~MgA~b+vc(K52D8;J1#VfM>`k^X4Zk1owVUp-fN+={6+ODU=3xw#s;Pv%BH z5$wJuk`U@gNm6m(8G_@FBtYz!dxusJ1emNl2#jI$8mKA>OHx=QxB@DsAE8RO*O+9A)x{xv<%e-@5 z?>b=yYv;s=-POldRsTzui4tQlfA%}{XWg4Y!J8a6q=%%;YIZq!@;%(_FR9a*cGLtQ z94kr~jo6}2X%4|;d%vM|x;TG-h?Ne3R$D!Ae^Q|c3T8H0B_H6M284%k(-y5oba|U? z^a|Y%#4;)SNu=&J6=1T!4QQB3rH~9Ts>nVLGL+V78+D5$X>CEnpcr1QD7b>FyO1c~ z13R8`_^Zu3(kAQYR;BGY>#F5;RoTJLfjxmLub5a+Dja=WdB5Piwo*4}su4o91;o)R zcpNUcf?gLNZ%FtDsE3rnhosyb!NJ;QtuN6<)g@g2&a8qz3-7U>ivBlf!WBtq*^VXL8(CB@PWfCQo^A zXNR>!qjO-pK%U0_qVGj!d7(JN?k<*cZy(6jKL??d;8N**GxD@s4|;@)`Db%dB1# z0b1#CR_Al(Uvqi<{^$4Kzx^?!3w73R_?El|>b-ADEC6N7jtI~)=>fYeQPq-iBU855 zIN__Sr>HPXv-kO9(kyh`X}Aey7+Y)Wc(5ZW;j~bLXN~|`r%6H)oQ-|pQY;gyrMzZ4 zXqoYrMZ%2{NI;S!9b}H&6mo2ADh_XD{dk~LWE9z}S~L!vIiWIe;rcyP4n}y?DTPfE zoJ9>mM4~vA`I8wUikg(S6zE}-umx|by0rU{Jqab0q>b1jt*|BvEdRi(%3A~f=Q(0FRs1yjLr<(0X`iQ-Gp{oTAI$? zNoO9Sq8-Wpat{LmZ|*2EdQA9YNOikTTq$S3me=XmZ(ndC`&(O*(MBaljk@3|;o1)W zXHt<|xBW_d=B_%|PpoN6yPr-tdtl98cBf7Qu4~2a1ha9x0{PG^b?V%mMiOQ~`F3TW z5DvMjtK=!^m9qi7zp;avY4(a>sVqm>;1#ZNxMMpgS92#v5e-)6oPZx*rm=^dR*fOm z@Ey(6QIQwp9R;i{pJ55+4vWcax6mn$(nm;=ymzD`$<8J1q4E%Xaom9?v1(LV{+7Me zFK8mEUZXt#lK0Zh)HNAh_4qc)-!z9gv?hz`s2lRHwp?N+l5W}WDX>eqI+YRJNVva1 zbxZy&w@St|NHd@*IG-v!Ra6leiF)?XFCWZ!Np$&DB}AcZG4y?X!AjTNQzcj3a);r#7;SO)Oi+F^tQ8;4vDypxtNNMD~sfzOXnm^ zh1Q38Ls~Sm6zM9FX)wi67~Pi(mp(ieYl$nvE^pJd`(TOcu&m(oRd$>Win+uSgB_0% zt?I*DLIX7gdif1N0&J6GY@Wx7p9U%qB@%XvB`6^J`UF72MzTT@G_C4D|L3(+&t}^< zH#EkK*S@WoG1Ut3ze`D=Bov}QnqbCSO>(n;Mml1Fu2t~-)6sC63^P9B&6+bU1{{%{ zrdf&FWjAUx?r9ZN%p4SJsMVkt& z!(S2?$l9=w`J(LP7Vb82+ms{Dy(q`blEGwXPqi*X>Y#T>i%M>y&>!u}4ITYGXQ^!^ zu9ZFYjq!kQJoKE7i`pZ~&g>c9$KZ6@c?8O)UM`LHYK@+bZRyF1RLJPncptH>vGCP> z$<`SFm1-607`8e(qgS~oX+=vBM>tuxV$L-x9R<^um9o!p&u(#OAcnh+l@z<(oQK>6 zTFLMebC#tp!6&=>MIpw zJ*Sfl%M)*MmM~U`Jt)X(bw%*yQ<=zVt*SDVg^@=WZWqZ!Z?c?TEJFu71*}n9TQRso z5c-0|OK&Pkw^j`?X^Oos^ZCAZy}F=eQRsRDsMQ^>MpZgqjvcTGrsL3Z$?q+kK}W<= zHYc&t54zySEzW_ekBJpnxxIMN`FII*2{qfX=3|=Q7$$yFR}L}&7fJCSQbkY>8mFv_ zLrWyulb%hR4Mhg?lC+yfr?gk%D|$IRPD(K9x@koWtS}QRTTtI@;Q4Z@s`Ll zhFV*wQhM+~WJjz~Wl?K120DP&TXGyZ`v>V20+TiBe@Y4H|Lgsm@KJF>g9f%iGMvG6{Yp}8n>WrI>Q^k#{=mkMKw4pvKAx@Vt>ZbhJB zmef)N1CDl71A+~Oca3x8p+*22De6jrn8KgZ2imhjiO|QxL1wwg^BnwPz$PdUVN4 z*4BFcNNVWG!`Wg#r?!ArP6U@-16_V5lz^2ra5zxXo{g)UC@z8BoIWcumKd;4$q@+1 zn%+}nXuq)-#w37X1@-;fK{y<0`QeY`b)y_uM_eY19Eo54SlrN^fb{0=UpNx@d4BY( zw{Pt0@4kB<{=a_UyZ7n0X7UR06hD0X+@{_SZGY4a zI3g;MC~^MA3i??pzY`AZm8#ml*bV|LT;4I@;;2arvSiCGgR-}0A7+LBPra=qvOtEJ zG7xQS-Sn*pROFR{e5ucFZ#}qt6BN|0^1{%d%hO5>=|iICrA@a%sAP!Li9oJsed)QL zAlD0$OkWd=1iQ1eH9coml$7nt`jG`kccrA;Ce^v~BwyjFK{7wU?DfVI2t&ze%?b_u zfo=$T97!R5X5!o?h^q2$cMvnjFu}UB+EfO1+HU*)Be5dDOe5h)vaC@jNF7^~w+?VM zpUvW7Ox=vMZ$N-XwH}fPCmyASG0rgfknYDdS$aR4|=4(o@z4&>;)3jp2_?-%fdFd9?qQK;mAipRou z!R)Qh%$8Z+wJkF0&S0$DYKQbCCTD)c4*Q)N!vkU?M+(5TIZ6iXfC2g1l5EMjNuhqF zvJ_P7TvQb=IIFjxAd0|#Y$%zt_exo}UGb_eY`{{iK6}G#L&bNkwFMmlTl5G&oojB& z*|d*v?!_q5s%M~~nw_O{+yR%)@<-Sf_zb7VsZEQmGP_6lRmIjB0%-LCo5XICqPZZt z8u$Ze9-v+X9@Fk5vBcg{Xe3aiEoWx(yZhQYNi#&&qLeWErl zU?y;SQhqxjL8FQ?8rMY=eIlCyS>d9PPqxf+eDHTu!_jrBbS#`h(>hJzwsUMSgv~mo z+HmhmSK*Yt zxq>pg%Sx`8=3gr{IR3321DDn0oG^kc~-#n5yh)Z1siswqWecDf=bfG@=_M^ z(MnOT70KwmHeu#E5$AIC7f+x6}dXMgR4{O$xM%12EL5RHrm*J=QXr0e%8q6lJ>;TrmPL zZsmK}TtqQLm|;;yM~u9W>X91jHH?~>T;5%${0HEC4v=Y-|EWxvwc~JM0MAa2U_UoYRgQBg5`^8Y9knlT7n&_( zEBipJk^{I#qV)^N7TO*I7tGdg(AW-TA+THSU`Qg%A^c={QGM$E^pkMoM&-#3m07)(PEal4&Az z>NYYBCI!4D0Y5DeAPu#|oFm;1G@1*#dT0ix2E5REctIP*sEkvB`Q|471aU-D8LHZN z$B=QOe%Xr=~n+kL>fWKg|`j>Bv8;@~bj=kQ5F;Z;0rD-{6a zx`vaBnYU=FTclsq$-!z~MILdifJ0x~4%6VolqQL<%V{u#dS%*!H{7QK*K2s;WZ^n3 z<=#6SywW~px&(ZvOh3U={6JS4eO!pmuojRt0+iGeDXan*x>fjvMt_9kY-NoX(09si zmmmo43MIfUcDA%O>gMF zKZNf-@ZJ0Tx4wEaYs#TcrTINp7itsofx1z?L=Vrh^EO>50SIc9E2IW)TwD?;5%dN~EY1BpV}f8kme4Qc4S- z=>25vfl+;=+T$%8o*`+I*>;KgbV{OZk*d40uZP6Q>*ac#F+gO=j6G#}R2ZI@By~i9 zqMSSO6v;a{DQh<2SdlnkI%qRCsTV2?&K#BZ5{Ph`!H#F#N zA>!JGX%^LF<$eI^Gt=ysS*Ju?8fC;-y^swo&r6O&n`ZACJ6p9`>#1xib@;tjq?qi} zwEFi-DUy~R#1Fx_n#buSDpLAVKl`tl^-?zQ8cms zHA$~zXTbO0s>UL{1b+DT8-9XMK+Q0{#rWh^D{mFp&U|E9rJ6`hXdBv5b4Y>@=}0T1 zfyySBdm4{~^@J>^VIfyihtr+p%>Wvv8#{wfJhQdNTrKkLLMPjkkrnu85bvz;A2C;3xC(yX}m4?7{K#j!!QqNCa$zq~j!>uEg= zy?MB_;XVVbLDgV?=X5mV7?wK(1uT109&W_(r4G@)wQ&BhJ3MR4OJ$IT&T=D3`^M3i z;|fNKGgM=a^{dL8*%sP3KY-^=soKdpJ!iOr`ZZe*=xE*L3+8RMXC6w1sZPih&&4JH zd9%!mw;!&u)s>AwqQ`()Yo7kgA=A_!CC)=EPQD#3Omk1Jwyt%h=u*2$V>8{o<4&=Q7r0ee}EbX{~zq=Xb z*aMlQ3&_lfrd@^KSNGSfc}as#$zzGc5dZ?xv(*!Q5GDB$@e@d}gncfPqIw5lbbyR=jc#iG)#t;3&1eCt|AO=5iIW-+*Dz zIDe-UCb%e6z6Dzmq2V5~Db;@p|Isi9|M2z&&^n(bhsCWkO@+sF;u@e}^r-#N-FJC} zhr@2lP{#@am-UuVmvT*XohsKD?W11db!0oB$K-UDy>IP{@$fn77&r7;xwSaqjijK#%a`Y?}<;A+NfGs1K!ncq2Y-79!Q+nO!TA&wA{vg-ay_f^=q9sv{uW#a*AW3H+dvI#v*Odh6= zXUNbs&X%YaNxD=8&~Bk$6V_#K3PN8_rl6gq1kP8-L}hjv{CVEc>1M4pgeIpGL$t+a|#)+|X+w{E;clPF3qMd!;Hm3S?c7=|b(jKDYV zUx%}3LH^D!-VG=4i}x@6QJ9AQ3d#qcP#Z7FQ+~ti&wx3QFQ)AZ9s?J{vmOpYNRqZ$ zTF~+{NNQAESQ1)r#akD4UBdpr5mZvQepQiP>YxCsvM4fy&=`)IBwx|;8sb}p=OH(M&fDFAF~2JG3vATR7$P0UAwWn*zZR}C`wem+_*qVfLMtJr7UsN`bt5tY34&)r=vZz+Sqyd>EMaa5_3E5<4;(3Y z6x1t#9`XffCIT?z)7_>*_HE~?eD~amy@RdNm>xj~!-xj51;9~`@LaQYnj+geNqB8U zC@GtnhNz$`0Y92k83qJ6b*b%Av)HDPP0ap%P?P`~u46h~zszU)9x5H8e>FpN=}15v zIpZxBHP&e($%i1KEE%*dB?P!^UOOlsf`08-(fgg;?^5FQv9B$r6KP_YBKE%RgO1;6 z{0!h4ba`7eU;Gg_FaVVS^o3-{WN|jiQE3Cf(vK;*l#?O7`Tr^W^o3}4m(_fa>8jz1xgN+Wsmea#=?01 zULUGR!2PN2lojeJ=GV$?wE+Hbb+%b5T3&W#nK)w|?*UizZ4n!2PsW-Z;#heqne3&| zMp)&#L%m+^J+wXQ<)L{4pT!7GpW2w-`m1czCiCeq}N;omJ<#~X zbgXURbr5)##9cK}Nc3|(0L5#A;FnlSS6H7(9xl)Cgc~VMTMFHPTJs!mTTjBiw+`kf z^l^ihuM6qf1ip%k9Ed9U=uqCoL6!HsJTiw9*fu5m+SWjduYC(uCo@nH`WhIGmw7RV zOdCW1pyL`Stg%whDEVOG$x!D@ju5}JeB-qnhC_M1cJRGQs!BZJJ?sNPw=jPsBSOU@ zT|EV+%7Z&dL2l8i;iG?Gl)co)$VTA`Li*VSO=x13{p7f1 zxt+X)B(F_bpOz01rY^thMwyurjq!Eo-l$!t7l6V>iJsJH!T@t90S=(cro8)Cm+Hd0 zuq?k=A)@b+AUF-u6`BHGWhdi%+3e6P+sKTSH=Xk#SW8Q6l4{R(*P`nk_4E6I*9~IctQeTJIJR5Ty)cil9-6 z<7x6ObN5gnSuEtE4GO=*f7;z3WFKMZ=A=5wvP*yy$C`veSv(uuus~C^Wa<{$o?Ax} z#bMG?)6(*x_cmz_{b8rfR%Bi$tyeW$c9jKeJ3tR6M|<6Zd6D#St>_^N?-{VfsZMbp zL3$y>7JfYsbbr!oQIycA^(5yMXiU-RbAk*O_%28EmMf(k>PNz2))0X;m?5lmcy>Tc z0OtmJB1LT^Dwxk~?)s^tgb3gtb!3bE0B?LF2)j@K+B96^D~7jSxl?#5?kWxFFfU1- zu63S@S4?k^-^hn!1C_t~UiiE3;eUGfH{pNG$H-T2pQo?E@J`QmN~$F3PF6B3ig?$! zP#o0lpyJ0MC<$5^+m_-MB|%V~eRpn5stT%jx?Ish zjA>h5nP&b=oEv6RjiRr3gBMq#k;JAyCPv1hI6<>K#IV2X>+)B zR}!0n!Zv~wL)x`h+9gZzs|p@jiVnK%(_OC61xpuL8TPr=AA+f+)o77lDoCfME`LNB ztC*9Ljn+~r!Y)>>+8`lX2?TUUv0Tb9voEN?=1k*Ta9(#P)M1`t>OvB8F-cTKVf_j! z?$RM=u|)1QG8cU5&?b(f4XU6jSQEir>ge7UAcqnAcnx#JpkUXAAk;z#xF4eCA#rD<7Y)r zsDHP6r=oRYXYjqo++&E%DDm4~@-4d--9YOmYaq$V21gNS0~=(=n)p#rc8vLkLAw-* z@N{-5g=z=8#-^l;wkh)IZw7wA{LlT_LZX0PsEB(7=m5 zU}V$7KD7w96(Rx)sYOZKQt{NEyKJf?A5ws7D>0Ru2WFf6;Y@CSs5T9d;}7|+J@b8w zaw4Y}tDbBd|j7n;|1}3zt#mS`QY7H}JU%$T6X%io3x>{sKEL z5*0S6#xXm*;?&Cnu5MT3C>wC00l;DaHRIsNYdMnU2XnWQXAq=KU26<`-(M73#9{s3?2mz!k6%JiC4T`7u7?TQ!xvAVwK+`Sx2Pkl(2{lI^rzDl%D} z6Em}EnSq|Rp6=i?S3Ds3!@e|>ZgXLYMFPg?r3j|G2V@APV4L^QxM1K6QN^xQVU62P zg~F%@C#)3Q%WMQh0gj4lU22=LQoBDlN*L4w*hPwmti`LbZCL)a#|zS%Ktv55x3GZ9d{-DIo(YzYAv+i!)B#{8p+7)aF-~7l{pw zMxt%cD%|4ir!B@DSII9{CJOS9(x=mn(=rP+Joc?zAk`+?Nkip!=4RLQt2I|$CK@D;4)#)qp{p7Uxv)rIQwtstkP#iPu1vFwEWzB>8QGDNCA((F zb&wc_p?3BU^>KR(9-S;yDd91Gvx=k{d34r_Xpm~SK*yZ9-yVD@Jh4F_XY5eqg{0O< zs4PN4^D$sI`!IMIzC(cMBhsp#dAF%3`?p`beNIu4 zSBR}57NaLQK?M_0ck!_qtnJvzh2SnVBv4b2k~aI~X?r2mZU>#8f;32|s;-eArA+aj zctp&1JFAbSjTQv-}BmRc0pcJPcx!~Ch%rdJizW% zAQ<9+@l0$$f_N-hY7pwm z+ARSa`kQr?U3n0*F-8ZuLm{uD+mm+#TdpH&2D=`(@BsUCr*JvUkEgX6qzvlMPSsVtiM?5ZJA9W2(+{DC|b&KhzQ0StiSoh$N@bp_#=2%P9yGMeo_xM z;31u8Frp(2^F?04Ab*s$NY`g@L1y%$x&^>J5GgY&L)H`IDtv_)nIZIwppef@Pej`+ zWhb>{P&2G2J2TT#xWE$n%mgF%U7QfWv^EtSb)8E%>qNVsHncHajAc)p^ar<~q zIgC)828P5k3V@%u%~a_pC1%{(0NedB5DtNHg-cSP(wIB)y;E=YN;)0T>e~g69rEss zY|^56hHj7Fs=QD`e7Ry_1|mVmL-wy>8EREUQxy~)ajL+f{n|>0TS?UrL&<7-LXC)x z5T~vn{XHYA;8h`SzbUNuJ0uOUo*vT?JeV5BNq)CI%hL7Sirt5)g~}J3F8GU;kGXZvzwr^m$O3S%bQhdo|+(!EjN}rd0 z_qg*=zF}do2u;A!p?)mVPQMlKMVtR|zv61`0E+XCacbw&{Gi%292}z^Z(L1A~lBqB2t8jnZdY zVJouEQg|F{&U^?jlK;y>TIWQ#DOvdf0R_p%R|kTtu%?s?Po69lAQ{_*-A$k^EHj$` zn$C!Tkw7geq#ts^Ad4jg5I6_5{e7}6iM zFz#*)e6Nw|ByroTe1X_NeMbTYF>E8+jt@|$9n@XFv{CyW?%RT~Jrv`Xq$HiTpfWDf z#+yRX$5&>+xa}JFr?XWKVwFw07c~;2O_98sF0%ouq^v4&M~>cBb~pm;*U;18?_fBTAG123?L z|24e*O!jXTb~aoeXim@6Swq{ZqIx1&bTN?xpTI9HdI{Z1D|9!t=s7laoe#_^y4=x{ z^JE2c4w%DfK~q6CAJ7`jKHEPJ#petNL@?WuLXaIYYF0<<-})Mez>s=$_j$95*g>s| z&MC^ZjW4LXdv`cbpwQ{6BDxq8sVan>Ne=Upzi8H{$Rb7@N-L#)N;I{7G7g;=**I7P zX%D5&RkRAEpR^*EFA*p}0CrC!p!*Wxel)Q-S_w~r$|B504Zx1fPPXD5t|vVuW7WCqnYR0+}0)e&F&IMn6jz))ZCjb0ea|q>oT^*rS@G zjuL%6c`sGviU@c4WLk8Uu^ku3V#sG?$<)W4sb9T+kskf=+t;Ab{^b47Z@ICgoBcHK)q+2y|r^DhMF%IQ9Fu$V* z=ynR#n;b1J(~1%ZKy3)cg&Va}mK96W#$ENes>mYAf3Stsb_ca>>p>DfZ6!FmSAq|X z0jloxm7i;k=V(3Eyj_SrOLj0QRuMazT*O0lSjAigy2WmhX8nPl*9$F@rh*I z%6QZ13`>)WO9YMB0?uE_e?k8L-`Kq0y#F{oDjDhf7wONCzSvG2z!;>m*E8TlAoI4% zyxK>w>U&>-EVoDZ5p95k9X_}xB~zmn%GP11u}~ltMLboA%kK=e(8KW23EGIzGC0^? zR;gU(uET)k;MB&xM(cQy#Px+7+*MVuALvFyw5skdi|QWM#A=qUtYY~cA9g~L!8(M` z{WPPeM8U2($?3w_0v%}dFr<`8pOWGyEM4s6GrHmQLwhoxdOcOw`UwqPaA0g>K9I-v zaJ8jL8Wxijbg3lUoYpm zZp1Yz)TUD@VDA(_lcH0DScN>&AU%yRfg(z`l7rUlSr=$-*$%-_;X&7s5tCn@b%0Y~ z9KTDsLgjfheXb5?D7ury$gjfNznIy``yWC&!{8+X(qbOCJ*QA5=O}yI^}3iAZ`C|Q zHQTm9eoYOaofPkV^8;qvVdys=vOgY3m~69{8MuxtX<{#j41JPmCa&raOTD@5HZVXB zJFKJzguvfZ&ZCR!7nhRj;Y!!l4Cp~_0WR<}t4Pu92A})jID>wdy8zG1dcp}cJG*)6 zUCC~0Rg?2@kUex<6yrgVv0G~!q9O|u-gd9x zk(S4~@CQMA6{V0Y8D;_vOm$L91{c@XI@^>2(upiHv1^Z0kSpw}U`pE=+j>B)dUM7J zhB^>skSf?Uv+*Le?{2wS4WCJLG)q5`%Wf)BT@lR#iG~k*T`B?}u4xz@%YJ|{I0Rf} z2bcyOB8*K!t!$B)Gn^jKNV_z5Kb_t<;%%G7U%y3x^-cBUhdFL zk=oW&8tZz7rC-+rdVbb)K@qf)f^^%}0ySOB;( z56&PZ_4cld9BG?T-{hu|6|-;bM8k?vs*qH#Y4&kwo1w{gyCym?4?%sOy|^tA)4-#J zVvZdOJ6OL2w1FAHkXD@B)KH)x?@mtQZAZh=*l*Zl!%mi(^0zDP)qz5L%Vs*?3x9V? zjs6(kf0V9%6W;!0@m}wLNfoYNn%b7m|4rC>^n@cRq}G?GHgD7717~oe0|7Aoqi?(w zelNh%%R9?4X;;eeJuj)--$B`lKu;JkDe4%SO~lOiui3e44Y$es1(zpMf!NVd5QB>8 zi3vOsWR@>I(B&S-!6;Fqv#hMOE5paC{(F)cWLTHC-o}N=CDuh1sL3*{_ozgW!Zyh( zI;`oshWycjW#+YsI__CYq*AFcu^}J=hBb9<#r0C7UYS;cxg@~bB29Xtlp8@AJ+P>T z!rYEdVwCl936RVzn9sm zW|=hQkvBe%3FLu0_!KSENi62wK>@NOlwzo6KU~%iOhY)X+~7=YkgQ%2il8rA%i(Xs z4}S22zfBAKN0QaQeW}@e#nBbUjd!9t9w=vyd|BH&@#qkzn#Q2$JETN8SCv{xK$XB8nNMHrlc*bQAKj-;;dF=x`G}R7lT4Roxs&Q`}sj7=-m4$G_z)_+mnioEB z#7P0%BY>Tq@29Op4g_VKtax42yQ`-c5e}-6*EFPsEO=C#oRZga8K%=Av0tLIonKY< zDV@o%t%2tCorvUEh4z5z)Cz2y#ra)5Hx0+6+ro8d6>2DT(h6kK7B8z>+CCV>VMR(z zvAoZ|dZ9x&HcX{e{R6wJ^wq7lES}O~Hb7EgXr;0Z!)kH8WU!coN$RUdl#cgZ7 zU}#8D-vnZwc1R*7&^`o==IE8JnvpFoR64{~Y3=peJ|jih(MB;yFM1*#X!{+_{DHy0 zp&kH)tT9mFn0}EQEIzX`<9&ioPLv#Hn9ume8(QSDe9lerTZC~#9J#W)V9EfU>pHa$ z*m>Cw@uWj*YILH;uDstC-vcPP?bKPagJy$vI4pQjJ)GR}t`qu$yzcM4>gw9aUy6%r zFD%|%YlXC>YoycLq}FL22Bi;T2r7B1PQcnRNLv;17~QJ`c86k`rWZ+i=lYH$u|tCwsx)i1IN5QTY<@9 zfGUIE)~dM;=+Wso$wF>57B;&0HBCgcm+ps;Z27GIljMFSXw8b*dbP;E@caNyCK$01 zh!_KYPCD9%1i%19W02gjmIPphhu_LQXH5yPP6OkJ>KNXVV-veWv+D)i_b|=2jqa1A z3#DWn-qUTe`tM!6plpDG65FNU@A8?FuwvlJ(c*S;`)z=PHpqF?(cbzh ze}lyIY1d)S*fLO7p1`YN4|4zJQk~vvHEL9?Yp`dU2-zoXz!CreaTOc{3Ios{)Rq2h z9sGW;HN^=Jkk*n&-+Efg@~i5SX%*-t%T{N7LL(M}$MVOZtd_LGzx}7Tp9h0^sSUz+ zJg=WRHcpo<+L>v!q8;Ya#Sg_+dPB77k5c_qeNchoas3ELOJO*~x7Bkle1LYy$cm=& zTdRbvk1;DSx^grmL=DSM*ZwF+6+tT~L1~Z!=_ET(PQ4hoTRF=XlOfBh!fYKQY&MlP zoYswp^*q39j7A`+Xba5zXHVF4zQ~4Z9X{+6?cNq;mh!boRS_{JB=TiU2!j&utDQZE zHo(2-Ce?@HCB|@HYO+#LG@xl{NP4_zc5nu@6ypix%~=oyZGzb5<^nW3B{u-PGHJ1% z(Urz-fKK+x9TeQrwb=&lKyY_?o*;@4tTkBfp04K9GLuC*kc6 zm}7kM_Idg{)BNW_@%?WrGvs@6@7P0qx+iBhMvqe&ra5T_LNGV?!xCopmUm5;)AX=9QuXo5P(9 zcQu_>)C#q6G2ENg5=WV%#1sy)`D>%!O9G};RQKn^N$~Jd)Lmr+T|`%Qip|U=r)nwY zBc}`v-$sS}0J5l#0YtI{q$3y%)+NlFP-j4m5=5)kjnZrbAmia-f33CSjY6LyZjFbw z>cJP_OM@@}ob0 z`zm?dR{me)}2F{HK8Pglz<`SlZX_3`JFEv^E>7_Aup@ z_{%XP!jIXoLEqhiDL%fwmh<0r(4imScV>gMp#imDw#?t&l$~pv0n3;2hLY=}`)LOh ze#)~OW$jtY)gFPL44|`CjmszOR>w1xL(_(t8PBGX`Y)5D!88_;Z2PWXsOr!up37>M zQtcI~4-c*gC6s%3>^vxpB0sgBdI+GvNS&VcOY%ijd&IX-B^#?;Bl_Oc?LyHiZ0rVh z$ZuWtq`#rx`-FXu>&AzQnHL~lEbAI2({soXRUW`5>@b(gsO77Y^XdT~UfQ{J59=$) zB7%psSc{^Xw8>t{Pi~5>f0fIQ_KBwvy0%uH?#2f$HMlJ^sT z^zBD)-vnNyM}PG8tMK;Qv}Ja+A-od~`6O)l2~zHO5uCvms{Nzri{*eitDZf+1>GDoJQ?7ON|g=vGN$7i4B zq26G{0=)5d^cfeXHYC3J(0&=9e2O-19){mJ7+0mnZas|+J7*8hbpvmB$95+f>pGew zo!-J#?bK`DcV5lZw^kUH?d}n5KjiO2ZcIEK$DB}R4L7hlM^LX|V=w>!X1X)W+X431 zW;1axpl><^GdQBA*~6*zyp}QZh*hnUn=Za!Coz~`PHcW&G zuU2%jZ|oR@VCti*v>Q$2Wu-{@D?z7Ktz&=L9M%G?>H@B3 zSOwYDqCQhZXzq>k$|VUzI!ExHoOeZ|Ge$$cp~Db3CsJM3Ok#Zd498NkDM`87G2N%| zy0b|z!Ss;jkere)zQU&=L6>DC_=xW*&#|rD-w%hi3tmXx<&85rjl-2IZ*8I3aw3!| ziHrktDQ?rhX(fGCkDb+-3xt2H;DO3W-RBw=l69w%6S~Q)B;ZA2i3gj{G0sI#o3UjXQP#MLd>r!8B5%ymRzsxEU3 z^(tUwH|Xqeu7Z7+%?i+Go4MvIjzA=s9~|0#@Z(kmrvqX6ii0mG(=D}q<3d}q;&Ggj z+>XWV5p~wyT9+5TJDW+uj$$DcwzJ^lW1DblG<{|(T0Ytom4QcDLC=Hx*VW*PyP-ufZ z(*9cB9UK~mwSdh7!F_ucS!xoeWQQyrz=)VG@@-ceP-If;oo%!oza6p&%p9v4TwNmh z%_$>0BL+wZkoXRyLjz<%TI(2@eAsIxsXsYmyj~U5#x8K>+t5U}zNF~ZuXVgAiy?Qv ztR3)-2r4G00`@n^grl$7O?ALziORq9bT4O#iqm#k>lcXlwNf41I}7LxCnK75x;8%g z*dKOTj(Y}=%056>y(HJ9Mqho1_Y7RxFhJ9)4DO=^Jm*}A@{kID@mJEfYJ2nJ~60&7=p=5T*6YB%0ZIKJt zZIfe^I^{pA>s(r6N2Tl=m*H>2JX-+XLJ1QN9H+r3i0K>pm?gG4!_YpWWib$_9VrD; zOG>*d1laDiiN0l_yBhRDTW(KRQ-qO$7Yy;)pPq0jTNTqxiCm-u!*b7sfH7Bfm$coj zYR7Psm<|js=M4%&d%eI_T>{#1Dx<%8`-y%1;=A|ZyAPzl^^+hc17f$;2CzER@4V;~ zZy(brLsB??4%?#5Pjya2wmx;q#nam<@|iOFD;EW?r+tHPQDFB4K1@UB z+0LL$Q>zyT^hqEWjzKh@k}YMh%Ivhbw~-=8@=2yBecRC&whr1268u-Tc5Xlnaa&@| zU)nB^;m=&1lp&ccZR-U^w^)x%?>AK&2sa(;;mbIb?*tlGP{DAb~7_J5> z2Xit(S)rE&^GyirCfj9OvuE9+QvTJZomQ9qf=!x9B#x3D$Lm70IcTzl^-D^OzFq2b zU!l;NnXd*c=>}32d)trjMsuSI(J2VC19pxQ7* z*{c3Ld_Uj*F1-Ib-+lf5WBdAPunTKKee(W?w;zT7kZ%47{sEs|;CiFhH{>R6?(6|F ziNPDeiJBPrc?tvkABIB`cxCZHl{@VR5W22DDv;yg2p(cpy}9GJ$}UmT_&1Bdi73oa z(`SSB28XeeQm3o>GD6biZv8Q24)Vrdb7aRM0}f^Sq-1;6Wi5+)V)}Ehz5KYvoYmh@ zh{$(LUQAVUq!xB(v6wSO*db(Hx>mMpSjVa8IKgVL^n7nL6Ha8DKk2q3K?hB9DFQCF za;2vEQdQTpQxJGTEYVbfeYkGe|grh*SC9TA) ztSGf$mPJ%MWaVh4GNK(Fj!{Y#Th<*4qmAHNwrG@#@Rp1!o)8&7p{wQifRLhwTdRj% z+w2jxv<&2(17|CGe`9YsKz<31qTluv(bJ}Ei$z6KlA2KY>K93ltT7{R2vQ*q?8ZZ< zaL{~a)-E}xtZFE7E*Awu5!{#6Lcs}KX*i!ax6X!u&1^x@z$6~>q)^RT!n{p#zRf_U zI_d}H+iF(K5+aN=l|MMI8JLTynYqe@@QV+ord9SXg9x1vO9d9J|a}1{>B3jN!f`v*q0c2n>Z;6j2 zAW~GY@>T$`9HELOEl+;rGZR7=I4IP`2SPs?xhvtc6 zgC(!woNUbXTa?4@@cML4PZb)L2JfXaEVK1A%|3L|JtjgdpYG(M^Mn3?E5O33Fm@fR zl;8n~j&YtSyFI#I!jMGl*|1eVaZ*JkPt(z)seH&k9@*AI z`y6_JioPApr>9k9el z*PI#^Doj&nu^5QyAveFXKW+LWPOp-EK8Q zOuKLL1wD>u7TCK@^&oMtSD)pI9Z7j&)!yGDhdCXUT2;0dQr7fH+RVlB(k5$bO`)`b z1FZybj3k4?;{d(Y@EFG+n>f`2x*{a|$Y;>>E@q0{&OWB5B`A(+?{E)v|~kBOD` z_2s3*fI0<&XDi9o<}y>5va1BTjiMfb%WenP|FSESu}aol*;adtPdP0=_lc0 zJRHOJOWlHclxM@L-FNH4EKvd3=>{gcR;0#Y-YApgH1-!Imx5Pi$QZ!{^qG*0yT-(* zzh$Ek`54u9^4ur_3E>$BPKHo5*_xMfw6#8ZXt!dm1L}q|i%9}_+yHbBNlqE+F9(Nkp^o@g60K(uPmf7=p+=?TF*$7rJrq>uI-mgy;r z_Yu7VqjfA90(xw_{LZZHk_(WLm@8P~9HjP(vTD~lvn@u@0-wm7rzver~+fYCua&SDj+G>{@kptu&R7*VzEap@Sgj z_gw3UwN*|&{kY;dwr_@eO0en|opGS8CYL>y^N_+#t^LbOYTj}(1WfQr86E>*Iac6* z3-ypHIwD#=WO;FWhMQu>4N`&Bx9HaE6eWG9S8}L0)X+qQ?JDaDp{ zu#T^&wTFUYRPqQ?=;Ur(uZ`5NrXdA3Q4{@!;TG6c^urx}4J${9riQ4L17@HIRfK?@ z4}8`-`*+u+x?I?FOeIj{-|sKWLq#7f_1fV|lrH5L`FvLg4B4*wP+xR(|WaIDxF zH(jBjAO{hJ3C^P!Z2`^^(uJMLG~j7ud?6B9s3=#E**7AKC}}h z9=sg5O;G-d8_J}jxODM)RRo-*tSS1UuJ+?hsuPvYaU)A$R;}-=q|&uqAYh#~_G3D` zu}fwDG$H83tu_}w)YJxZkoN%fkYie52ukF7q3{vQWDA7m@-9`wv0fz$gI9QZ;Rj$kwlv|l zmjbnEy%8L){NhZ6Zl>y*MPN4&wTasU1Bv2L5$Y1MVDE8sCmZBxN|;Z1T2E7^Sr$B0 zMO{xrNk6-_j8V%>3r+k&*H1bfj=O|zvLfIbW%~skYwnQOS7`hJrMC{Us%r@nsw9@q zMW|ES328+aw38?r^-3vhDSdHr%fI{J0}C_8Q9kxv3K+%dE(hwA5lx1u4g=LrxhSz* z?U08QWOg{oerG4DfW$H-){3qIG}67nz9;{M?|qMD%{MG-z9Gc*8$w)($$S5Ec>gSI z9&}{Ng|N~m3@Ry7BQcBSC)&HGM2$*W_UIl|>g-NXo}42STfL4{(L@pOquz#4df1;F za1uPJ=EMR@cqdapFmVa`hRZItVB8pTmR7|AU|rmzyI|N<(4#Iuli0G~vgHi;Zw=e4 zi*kQRx0C&ib9eM2zB#F>-gj42yUU7_rQddN4l=+gz$3=UxudkQsYNBl)-5cQcv@AS zW0-O`NL40ziJb9j*OGlL!=)vRqS4MYTBZj3xpGoaB?)&a(IEwp(pF!qJy_XJEWmA` zP-9VWAGP9Ay-;r1wia0JJAU^nfZsx?D1s0a)8fq27jd z_yoEDNpJr(5CXe9mv=iB?{aL<1Qty_?QpCF8gg;JWCAzKI-Ew+l}j`v)nJX9VxG{-7VB#3F?fi)HHC;nK>m-v4Z4`e`0L*!IZjFam=X`~J zz=~!NuWO&|xsEg>Q_(uIRgY<`nb1c|!)}3)txi6n1O}{kd+)mnz?HOQ(JzzjdYzev z)}>Z?276Y?WZJADG&hqrgQO5nYreuj-vRF_OlS8PccaF9*==AF+?Dnef%`xOqF6{I zi>BVK;d=>HmgC5ifO6%dOXX=5$r4uwGYX)?zSg4kkVG($Go|%SYK^Iy|I^!-bkTc_ z!PUm^s{KDeza@I>1vJqHBd$=l-HMA^{oqQNCZT&9O9-{h9aN=czw6X?cMO{R^^+3_ z&^>MD?JL0ggv*(CWrNW1E_4s_#-z03!0BUqc%T}#^gcB9u1pf2OwJ$5mc40807L_< zp&G8RAYZj9?CTfCKP=oZyPABCKv~O}H^1bPcZiVR<*0vN?%QaS$9rGTACYNQav7Rh z=JALb;aEwMEpHyM6}92PZ{bFwjjR}&$v0zC7*g^6cmc;!7o1#GP4c0_`>Eq^QE5*V1-7Fb|9<-p%UT}5d^uMpC7srKDzoonhxH;gruP8NXIbtxhA z=C(0v2*3HILER(tG~7<0bP*Ef*j4t#&xNAhS5nHhM<_FbE^kO1cgQDjN#e%o9s+do=QiB^NGt{)`uZXGhixXar}9S3+E`iUkXuGk!3! z&7?FHyanhqJ`r{3axDd1~2tyykw?F*L4?Qe2>`TirR>g{^*a!55=!^!EI7rr66u}Lr`@PU^ zKi?G{me(kO(rsLr+}we1vQtjd6E-O^LMg!&MO9=W0$g1Oek%S1?7N-;B(xoS(Jq95 z+4y#W_zEx~m$s8EFj58=&{3&qc8O~8Ijqr8iH(kFQ#3)gGbrhS=Vkpe!f7`3LL3+$Wt&>Ii2Jj)1Imu9fRV#$Qad8(De@n*e>uS z-76`Z5$Dxw#lb4@-5p8g(~-MZIbZ`n$6E zTTvxq+205M!d*XgMyqTB;_NI1gc=E{~+3m$irGK&ffI`4DklO)uv0+>+o zftsA_Ks1Z;@~MozK$?MiCRa3E_}*M=e**B9P3$)yd0%rSJq*Z>Q>z%5AI|?Ik(Mys zvDuSKlIUo^%EiD7>u1-PhOdTm#L7s#avA`C#dwP zIaEk|UPr^WXNm4~(sYv>JmH+j;C$K_Ck!#vWe$%;B2sKm?fc` zewX+7l`S=N*XG!xyKqMvA<79ebj{+-fp%9ZM$9=CAWnW<3luFL?>2LLCtbFU-iDV$ zSPogG=ncfxaZhNG1-=6+XWP^DtqSqp zdZt$dX0@AZYemLPe)8?Jx6hs02Qb3>&w&hnKhKY(nEbs27q|ew{}y)=Xui69`;W+x|KaURx%l$( z3M@%^xB3CfbO1s!_XPx}ll(vd3|BbX=rs%|wkh*RSV4MD3?r+Iet zD}Yq{#wNP_PyI#NhAHLaAORQYE1NcOF=ABe1IynPKt<*P+WAB9#1)(a8KKm{&tk|V zS=v0I)NQEbx4?lz+p)5=?U1gkr7H?qM}SEHyr{A;+2L&}A&fR+0#~|L;h=v(D*f4Z zbj)O_KEn0Vw$Z&??&|r8%?m^eHG-5jo-XD0S}$CR)q8!pNfDP33PqI72aSQW54+v1 z9hx?iZqj~t1 z_B{BP3|GZ$kK?65p>LGmE!4%?Hfs;`6b%mnBU{jd{N3B1{@3tVf5Tn%dHBnJ)$2ng zU^dtHd8&uiViV~nW|YtZN71h8~`IbFHZ2|2$X~;oJ~6Q(zUWpZL{p5EH792bsxh6t`J1LtG=ST z$Xq+9cW*XJPfohtNta-G#C}s*!v))=iU!=SfVRC#J&Q?`iuY#iUZ5y?I(=7hd3ITt zPHOuVIZ|rxEJW)w^N~IA&PIL93$9 z&7&QLBytcnJAs4y9Fmc6+Dy+7tIFlAA%W0z`QTY5Z~PB=IJ559C-5;HIaOP8cDQ2c zD$$o2uS8q2*)ds;5Y8$2K<~DyP)qfbs?>s^(fJc_1#`sJEXN=D?T1dUux=wy9yAM1 z8Rb$p3H3yL{=E0{dLj6(FfHq1!ZCQg6BwlyH<8qWEJiq@R>(3XgKXO%HJ#lo%*luD zG`AmW#L&n(X;6(B3Li!E1lggL*Z7#0ns*qg0wo03LfBys_p~uj9`}8x#!F~_B|{XW zYV~k|rWsM&x@SrR`nY2=Wz|Ga;!c=ED9Q$G@2z_#BC%sN>9AO8nB;GA_uwDn)Jq7=BQtR9+@O$bVLqF@xHD* ztiiekX2!c`z*4kO-$m+G$+af!v()g3m0%((dB{eOnvoDd6(L1gqSXsQF^&h35K*|Z z)Md-cUpu{s2E?i#C))i4T!GX$B|lkJz6bLfvSN_{_G!=B)i9vfkO&}B+u_YM zlq(W0(H?Qo%X;ssj7sWyJWCe_dju-rtq_pxN|iv)ohk$MP`pBdaXs&ayjP|Hf@BiM zE~h9U1G7Sv?rlP@yiz&Y9lC?v(JbT|icK|IkrB zXInYPiGec!Er!pDEe(}|qIbel1|@+hI%v<;_aJZG71%a;dM%CyYMnuoml=8wx2f1y zS&*$yLQ~e6uN%dJsf*QT09BOTc)4TrZG}}UhmCyiE3V%3!E_@sHfqy!5=QJyC?yxA zb4mWpCD|Qy1ZM#po=OuHk*?wBljYT=mih|4@x|wJ)f|qg@#2LPGaC3BfC3TXL@tVp zvJD}{weg_=x?BXIs=Z?mh9PBE(D5zn5{0_O^RV`*n^CqHNpl>eBQ$7`=b8ud&?e`*hSm z(mq}M^Vt!!p*cG>i1wwJO#XnNyF20<(@QN|;K9TyX!|H4PY~=W=nMpzyCN^96~arI z&m0jvWleRLWtRhRCX=n%jW4R+DVYp817t=K7IaQO@*SSl(TQAtdDYibKQ?*vSVH#y za`rB}vK&{I;5@##(T1x0R zsztbsyXZ4)d_J%%z*0^RO_%fbT0+0Ny*+^b4~U3z!WG=v0eW_hLzSQ53T=FGuX;+xzVJBkoJHrn9a;@&;R`O;KJw>lL5=73lyNjE2qG4@v> zwh}6j-1-oG4sP5Np%?@?S4dZKdmn_Aub?!5{AfMQAN}Y@;UCOg<-f7*_)Pt-vigwH z&^DvgEfki$H|qUTAriv#mdFBiL!Ye6az~; z+3GGxO)^8117y|qICXnQa0lU?mtVQt2*%airgfNrgiXr2rR$?4E7tpOT6qqW<5Q3j zxH}OtGLoU>@p3MwSUIT=(I1JBJwD4RXoJ9;`l}n*D)j74U6T^-8hJo!#sxB=?po zUYqxTs?SKiU~N*_PVd&n2O07*GX$wv37sA7X#i#j=j`b=+$CSJmcHC(b3xLRJsdn= zfCcCqwKXyLS18VkGPpxX;J#(6@28a7RPS*a5fpN`&3z#EXav?>uX^wn*8p~yQaral9 z0mizLXaQvzM8Yam>=de{la1AGVMq95bmtNt@VocJOy&0NU$ie|mzUkINY$cqz0=Te z5Fo~e^EHE-O1!?uN~c{gmcqx{PW}%0*$3eIDRW8glCK#Q2^&!vw~?je4FsI0T~^AJ zytRNvtj=+zMsh@pDW5h_vB|MSo$e?)fRm%dBx-@c{>&%_gVH4xr*bHuu-&UW${;)S zsI;NlGzYWNuuzsmp4d6kjJrM!Ht;nx;EKDX zBWS`leN^?$JhKO1__k_>7h;At_!7o2=y!PmXUpub2zL5#fA>o|YX9c-yF5P1z`fLDX|#$@l=;MH%4B5?z;PSy|`+dE2d1RAP6z?%D1Pr{kJW0}hH$ZIIbg zE76)IHVHDe!~ny4o)ck-HOd3JnIF(Qz#(aIGv;oW&v@~|%vI19n}(K669X+7xE69r z*7F7zKy_x+7O+M()>QQw#V&@XphyJM#!@ySduFj~4q_jj@+NFycG)7Em5>}#mqt=3 zh$yq4lW9YJcGs3e(7NTabf$8xoCDh)C8%!k8AyOtt1pJC>#)m~$>Dv%`Qt)ZP?Z`b z3L%_>43RfRa*s|acrqNUVE};oi0p|Ax@Kr=XAKC}M-UdYTbxu19LJjEkfUPmDP2>m z)S~SQbt!IeL8|tYUgVbqrOl3V*?ULS^%(;b`1)cPZ597rTVR`SEAUEN@G&hR0{@R) z)Bj1`v7dz3pXRF{L*)Bk-+rbFsccl&;roBVTha5uRfW^?Wp|zwa@!5}9W}dvu?)Iq zay9Q7X>D_GDH=`KYkp*hIol0@>NMp*$p~m&8pdwYSWn8`IOrd~8-(VgWw=4UWZ1~s z8b&DUhv$Lbh~`0QL!{xdJEltpYt1sL{4a*C1W6d8Tm|5+T`HTkL({N}EdATCd+R#h z$bfgJ_Ryeil^HNvMb~Dlz1mJesZb<(I^G=J=Bi$H>f9{>CoC1`!a3^=oj?%B>sW2n zg&LiEazh6Oe<-y5bV^^k-YP~jdHo~215Hsy9iT`-=_jUsQa&IRiPsr1IK(Rn4YSS=!E>uADRu1$VCH{)0hXW}xB4Z5IIMbYJgf=J! zPg3;1J9GEIXeV*+l-oh1MIBk7ts&)D!Oeta>U1abxm$*48JZj`)I656ZiL3!?z2m{e7CB9AmLme;m=Y2!|imr~oGFQj%Ka&9TF?{SlfBo?LU&?>~ zz%cZOx1Z<0^jm$AKmVaU!ewGs`+&PVZR@*XXDCevRMJDK^BjKK235^IRxMrDV;Hpd zX9F2%JeN9dl~3hVG|8$Yr^SbcBUy}|_~{u2b>Y4abVYr@-gdDF2Ul^4ZfB<$?tTb% z0LV>$!QQv%CWrh@>JyI9h9}}iQ?PwEL|1n1A9R`O(J9JTuzkj)sg_NyY6g$Mj9k+bWRRC#`i?xeksZ~Qp89f)E#xcZ`VXM_5y zk_q#uS4nlOh5>rEUIGkV8qXqX=<3)pfTktFD*pKdjpmRT?pl{Ws3gZGM&gFwrCe>P zUvL~VSy6d@?_Pm-1&SIV`3eh>oZ%*^kjW4ZN`vz*0NfDTM$wDIZdQtzcry<=ph%9| zsBjG#**1{J^t8QPx$x*YEe}|Vb4z0-Lzy9&< z!~ee@!~f_X_V51t@cP02>Z`X8_%ZzO4aYxyeN=IV9jT3;)u!8vC&1rwa)v`oN(`IZ zERZj_Ko`qFknl~$ zSnSA)ZC1H*ITeZ<^IHiH@@bff+c#4e_^jG&GA;eEu^->pK%3v0vU-D1?uq2ThC1tc zC_~1PLtcm(p1Pq1;GNhEB!a&6C0bV%+xhJd&1&Iq1VwHiAa#gPJ4)jww{P9eYasg+ zH|DK3;93n%m|oDN>WLeMh^jUAFk^x`aY3p~5$Z*D;XSapQb9-$g$X8k5Tnpe3>z^j zB#OQ)BX|iB0LIcMyUu{Er)uw?6*#GOk$Tm}Vw(-*E)ZhR2dnwKF=w~wvdAx8VtXC`%c2%$Kmzc)A#@K`Wx#AZBaFkW>YwL2?h{( zG~my~12gKrceB<&7}AnuZmp@_(92HJO;c3v&)#mBsHiiqD#)T5`17)Ah0qQ@V7)bR zsL0kR<<@9Q)k@4H5)bMQ)o@36yEXd+QO(E{kYdTH1RzK3jB=Xg3yDGmGod@4)$4}J zZHz`GJP$&Y z4dF^9#Z;qOvRzVOsdLB3qi|KOwQ!K%pv@KE9rE{BcMZP7ayZ-$V-Km`V7+8#MCQdy zNU(^OP)h9*&vi=tI*CWKBq?TQ21tWi{gvJek7~o9q7Nm7@;dgw)TV~|EvWKl4n-x; zh{*YNFy9M04Ef7aqhrb?Stu`G*h~k8-oa858s8H=Mc(QoEqP#yC7!VF;2(|%2ytQR zyP&~vRy*k&)YJ*PP1^qhelov1K$wFZ5+JG2#w?AnIZCAnR*AllYr85;?F2x**ls<- zqDeNYaB%O_Ow~Mc!9}?Ng?;5&>azTM!654Y0lMKg;q`OboMmzp@I&s!7)KTVF$B`2 z0M&^(XEhMnm;D6GY&ftRWuQk8xpgE4ai9tHHt&_!80nNlwda}ueYhz>@t$Tv4p`G* zxl_iz0!_JkiG>Wa(Y-HUYh9J0-RwsLLr?FFq&zVTNx)J+ zO3teM&9D0@03nIeS1Jl-boS^->)2aGoIyW-r$|(T#2Y6GRBTc~q1((Z`Bn~h_-za`Wlm9BN)cK2bD`o_&8!9H z;4R-mtrv01XoVS?`=M=FIUZ0#$$7XPX8T2Qw`QP!D)q~CU@dCZBmChEJJ-oeB%tj* zABAZQ0Co~bO&0MSF)~H|%S2V3@sfVrZ5Lx(td8qKb1@J?5LMeuFaKjO39{eo%kO^< z3G6J$m$Ss&Ri3?ZhH-baB@P3-J5@^7>Qm zd!{1Ll(7xo_>`-G{VxSQy8%j?h63mp^ib%sO^7}DZX2LXC3ikY#^ta$`lY4zoF8RTQi~j*f|sy|Wi$c~#@e z{d3Ffu$o|P-j2Da`Z4v6Kl68AKXgY$7>54x?T_K@J9K@1{rYox_0ikMk{*8wnWwi; zmrJQ2e|vgJU9rvsq4zDwu^Y;~4rO6#2_S~h>YTh&3|)*I z&eqDtL~E$))3PQ+tze|Oym<$RqA}R2!O@O}o$*Kug>5BnN4bl#?=T+C`*47?I3MCv zH%}L3mjtDkqd~G7WXbeSfQ13fh8rS7`!HJMEC3WDNK{gnqu^e950m+dCL~%8(!ITx ztYJ>jB@&VE$v_&q1#lk7>d!njj{TntCzBYF>y5U1Y^ZF`v8Gnaif|Xt= zTuo!OoDE-BA~9$GgzH%z7A40pQ3=!{DOLoect@{f4*h!I6xXr6D1g29{y%K^2*izj z282?(3*$Ux+yJT?_)(5_j_HBm;DW9ovM#kvb6n1Dw)3mJ+Jc=yz(s&SPK^KxMY-B?3qfN@}h+GI8P>z!Pt)a$gQO!>dM1H(;m-gL$RTiK&b>>=k{ zts@!8Nsd5Ok>oPV@B%&rbIJ z*Mk`##{W!;JCv_b`aURo$e*UQhx;DMPmfwlv6=s#E85LXS(-W!pIZ_rmg6pgd;>a^IE;uj^*8>lp zKwcBk-1B--PeY`0VD2C%O5bK|Y{_yFx=T<)ook7!lF3M}ax(w}z^4&t zg}ZE!y&*iSqlAyj=IDkD>Qb1+3C5LLF;Hb1EgMJk20SY^&O>E%iB;|u+&JDajP)joz}g$|1Bz;_))c{(V&?7J*N zQiEULLepEDPxewC+9I_Ql{aH`h1wk&0@ZgwY9sdC#_*{9H}LKQUXgfLAD#PuD_mr&d3bF|&3 zNwVxbN5`KvPkT7g0lDbZP}lVnI`e#-rCom)@`sG1_yCit@cL8mpgsZN_80R1Z%*I; zm@<`*Bu|jTW#n)YwJr|BbKd2mP$Lu(BdJ3Ru>5Bp_W%bqE&vPA1xk8ay<%$>s@~xb zdhRG|wokAmk{V3CQ3cak;-k9)DyPy3vv*aG%P-;$*{)tgxdj9?w*rvumWPW+^%j+m z*>mf$3B>0P<2cM&Psz5Js^3$1HFVZ~OJ!gMD?e{h%Lyox%}FAtQNPf6ddOY?V~8U5 z{XML$TB4UpepjPTHKnq|^J?D4?2_x9#d>u?9?6W(+IY40rS{w8V3qYtR4G(ZFyBEr zphe@mm7}B?je%W`yi{)`YfxjR*EZOakAX2u@+2OHa_Rgw5F-KR--JK@OtKxGPx$H`Y6$orMhCE}G`um0 zfHASF9x_3cc9N2h>p0@>jPoY-EC)83IM06u>};YspiUdOJZ*wx)c7yoezm{*+t;r- zaQY&@Dpv^q{q-*x8h`kna^<>Y{nw6JW;T9h>aZ#X!!3)zKen>IM$@g@@vAk+ z2ulW|!kont8s)SVzOhi^cP?o?XF`c0^e72?+xCtU)CBuNA{c(dS)m+xpE*xTGdBzh zHJWu^!Y{x`552>iRx}ojVHC5hQhpK6?FqhghEWG^mwgq8yS6~=0im;aI;LFllI5L* zq^pWTVep&0Y7gaLGD!x(zgVL_@Jrge4| z*X-yQ23fII%H#zseX3)JA6{bVc~ z)vUB#*;LK$qF2W02CZ3FovAaIoHixrtO$S6>9p;jwQbSBJJ{C4H98R*)%aLk0(~fb z+yoGf6)MnjcA<$-vzm-jH>wMkA5fGee_xvX@Wu~6=CAtv?VGpX8U{nvmS4YAiJI46 zpEhK@&wVdRQDqQ|+GYTc^Z+KF)|2v}RXg3#PFWFomsV9lo6avU>JsqSN95RCI_Nyj z_dzmzYAfFw^(>%TA&4DXnAhvF`|ZX_DYv^Cz#PMEmQXf1^W7E~HvF{fLF_EyDIT1N zMtI1X1>@=!T?er^%WBm^ps%PD(^}&PI&vyn3n^#2==v~nSn9xR zp$3*L-)gWnRW^UO%Nyj7Bm+3z;4@4$n5Nt<=p|pU7I{M&hFrxb`1c*5D*Jw@*V*wS zIecq2aJt}#K$}YrA?tEOA#I?Pp<0!l(ppHp#7RQ_CkY+-7cZu!YcQ{dC1vA;)KH776Hpi4lzR|eD{Nh^Ru@PBsRIm|2N?+Q(eFRX^_-#L)0{<3a%_r?AoU3!K0(z>|g2v6Y<49>^wcB}gsB zEh|jSfTQjT6YP+ng-pYlaAS!i@p#j!2mpD%7dy|jeySn*rMDPnv-899bMQcbuHRPTQ3%O z8ucQx?^|{a^1F@kMUf1){M`{r>gb0;!|bR7LE9tV8NL2z@;!ha(d=^jhAoqXV4f}E zi;k@Zdoz}FA(I{7TW?Q-!FL(7@JAx@Brb%vZy`|&{B>S6kLD#R#&NVT-;$EzibD!GIkqsl=ng(h!3%{oBt zaZIj9+ec4Nb*gIXQwg6^pI%7l>jP6MIdMYGkw`&(QY~n_VnbXEP*Lm)min-MJxO7V z-j~yK+NfAf+VDc1ie+`T%PgoLv-h%K%Q3}@%`6N~25_?50rSQZPOb`*QH29rM=%;< zH@r+2jEtNm4)H(A9Gh{(xO;q&*Em$!K`R0h{gBW}>E5CLdroneD1jCM zlbWoQ<>Lqtch1Ohl;m@kLeQIFlMZ%f9K2k!7gTQfy3Jaxch@Edq)ZN7k8rb^BikkY z<)COFTdUoH=D|^}a;FwL`{?x`x+8Nm@I{=tR58@UP>!UT86-;n~u--&?Dv&{Er{l#M z9(Ypy`1lh=gh6u#IdYPcp+RPi%jr5m4VYrM*GTP1s7(&`EoBiS9t{>KI&d^j@WokO z{vPAQxruuRdcl^hs!c^&(N$E6MS4lfm^S^^QlSt`Zs4;3GeFG0nx0fwkg5UwEwqW) z(=SzobFO6{+uKzU0m?8wV9!8w+7FZ+70sDZLD8}($L0~1IVd2Bety~aHDBWt z^~ubjDWP)So$`(oHDWV%T7nW0-Wu_vag6xw2g)N6>in~}1|Tkmyw0NjO)|ExfzQf| z0ABGc^R~y13kN==IW_W~=xfw5)2QJz+w>n6h#i$OQWeDIKH+Idlx_~bWVTuMnYM!*(v8;|8kHgKp#6?Aa>QM zxjk<(0<;k}Zeb-kw!n5g{nI~%e>iN$*FSJGIw|AB@Ynwg%uKZ#!#`4T?!ZG!HB0;2 zy?n-fs%cbTvQ-e`m}e&$d05LHgueiOl<6q_ zi+RiF`xLr%)~be%R<#d5lZk;~ab9v|b6`5$jDsZKTw;PVbI-%BYYizMTX{n!O6C{x ztHV`JAxx)paJ@KyWBF@Iu67`B{OCvjhCh&(o0{XjuZ_AP*yiu}5^8T#KcMpg=cvs( z>>#WTXhJ^lFw4|Xld z3~+JO+M1qukXgCOdm0zByO%enB$}-X<;puiDf6wn6Uzz!Jm1)G z_?FQ@1?komQUO~$vS3Qh3-e;cObd#T)$c>Z}dDJFzZPg84QU z&@^|AuX%%+O3u{pY6DoI2j7OVg>Ypl$5@1f81>2hCS(e6|dxZB+6Lls%iNJ6f#5JkqkwGYkpX z2$R3_Fn0tVb8d-&rkg+ha$pY(E{Wb34 zY5?O)xSy6eyxbXYWT$VkPsd1}IFv6X=p;OHHyOh0YE8o>sCTHHxe|foFwXn}Zr+H2 z6EtyTJ&QMkN1{%UvY>BXg5c=m# z+PYItvdwK;I||LErU?ozKU}ZDP zY>k8sFc=!VK*)`c3OcKKx2~w+9$NUtxWjYsLFXnbtXKVCC-g|&wYMU&S+f-> z5@4{mllg|)C70tl^-n#Eo~rUNH(j@@plAh{RZkQgbwc0L{XnB?tJua4?61L@HStsa zefZx!I=_Ar-u{ej`rYfNYoSs*DtkVuA86kQMGp<3hYBf7c1h z)pjYngzyu|e#}RPGM57+LfBIPP=2;jSLK(bNbK&E+d@lik*Cu^JXo>}$OfY>S<*=n zz-n}Wq*8vGA#?yY%vVXlDg^EvK$f!LD>njdm0jj&kK6Xpv;W|W45i|py3UB0u{(2b zEudK2ZONfeoCzgTs8ci;~9cFy6CP zeNuIT9RXQjnxT$fZf%GriD@SlgDQpuuURtsO-l&ad4_nQz{Cp8zlOX|uzb#&n$mho zjt;_;t-XVyI}piU;RPa#p${PeEZ!O?$%2q42b9gB`)&2Ayn<_n7R1L7M$nkUx+8(sMvfhvryS}UZ_V7qtn#(|z^a5Mz z2PL=~D97zEQ%Q->wpC{Jom%oU!ZO1d8yqu)DS^&^F0i z3(#q9O~HJMRlPdu55~v~g}0z^;q0$bT?=eGtBE6~=sAMIhZcGdNA-$sgOHQ$+<8{k zys3Bq#;P8qG*VN<%z};|{t64Fia%x$UEx<@oCI0-u%qlH|KRut_G;6EyeVK9JQB7V zKZsfFZ`)ZaHd%aR%|Xy6V2sC6CqNHuqe!gnp^pTGV5J1QhOyc^R`!A$`nro@YkLL! z#Wt?qVi~;AxZ3GoCv7D$y{#4B?_CxywoJm6d~TC;S0Xt~vzaJ^dV6lv2WKKIP#FsD z{D@_;oRZQ8t^7`5C6_|}Ng^_>e$egr`JUW|4Q+oL-xr(u+vaO+CRA}(qv&Tv%MhZA z47_1w49TTE%!B{MK{E8Y9n+O@7Z1!2;E!UB|6y%C!b$kw{i-$M%gyi{UgiDl_)zYP zUH8jA4$VotjsA42xdP2gqt+@G?_ulk_Pg-*-SGtZj()1|i&Fgczwl%J*N@N zrm#7l0@+AfE@~BDC))N2t0#%Z`A~l+VUm~&JW_XOZ8y1Fmbo9GfrQm|IQnO1)#;(1 zEcvvK-WIp?$U94$^(~#~Zm8!0=R@Dbe12E;la~5aqEE}!eg(0J+OId#V;aRJD{u@z zM#f?|s9xmPuv1qRAuStjDi{GR1dyu(>ds2aP*tQE++z)ZhPE%Uy$%{gm)1NpFKPhX z$;UQO_w)i6Os%o=o&s!yqOh~tTKc>@BN!?jiGha{lv`&T13aUo{ZP!(oWD_SyR+X} z;vXRy&{RdxXVB~@fF4^|tWuH*V|f~$I{x5?f-6Rj`~3A22&sJj_6tJ#Fth$V53oPy zTK_7%W{to{LothomdAE^b7eEhB5VufU^qc~MndMQ-iJg#%kwt$Z# zYQnKh%nX#;G#r&4W>qMTW1k513nr~UH!W=F;#rEI86t~pV9kYF8iN#4;_PK z%N5kKlfT~`*VzELA5;=0FjDRR9@HLnf!j}<)fF{PvOO<8QiHg@d`{PBTIxuGF1f`~ zr;F58nJ}Um;^Z(ZWd(Y53RE|uo{rVwerQlAh&hcE#;sxgQ}QNhv*5utX(dNvto@Nx z>s7vo?W;+v+oer_04|dr7L|i||H5D~# z)CA#yWwl)cy`;IAl7|;Lk*J;o?Q0Im&wxNdDnj-gyx;As(fgnVr&E<7A*)!EU=t?f zc1UO~*RA?30^Jtxk=7~^fj@PSL}S}S)zBYG=Cl2BPwfD6Cl+P*h-$@-XvtwZ`MJZU z=&0qCsg0129l8Vk8c<|Fg$8#ChTw~wbT>+yX{&qQLdR@&J@^95&5KJM)pEuUEJJ&s zc$*moDWvF$R0ntceTw?nObzwSFkD+(Ekg^k5QD1j6wF$|Qkw6x64VGQyeRC;kRH7< zVId?jK;614G|aeBJ%&H@l^RsC%;2!YEnwvLaQij*k;<3=1~0dKMQpyZ9k1o1l)}shr#3 zY(kih0dtb47zJ9Btl`$Mdj-f*HjGl7x?lIm+UE=y8I%0;x<|Fl`qu8WDvir0fvsw> zXNtSAp8CT$(5j$!Dn<+IDWb^>!l2nkmK?MtS+*B-AEhD=L_8-*o0>ns9ablnHcAe; z66f04h+Co@9kR0u3WpE)%UMqK>g1aMxj-o9!c_FAw-upE)Vtbicv5g5_GSDTF#TlZ z+PTeew}y4iM!9)CK)4qjZdMoSD-b)_O~AmtC%zi-vbQCFi;}7lv2=wPwXKvZDkyd) zHaWj~6=BU@-BMW^52?%j`(tw)-cVb(>c{BPZ?#&h*n|!6^?}&QdY9Qk0cxBFlg{&F z_kzDx{@x21#E-_NJ(5Wc>i2A`quiy@;77FUY(vh@`r7~o&U-jNuZpn@Pm1;cO5`O2 za9i9Q22xd{O;2p@O%{)pj7q+*ZES0?e?WBg=da&}w+~KFuSqv}KiQ-$DQ&PvUu5Qi zEyr<;Jog{9DhXTGeh*b%jmo?`ig2Us^CWXo7acz(bvo|iYx9a3_zp4!c7oi~8Mc>k zH^bHGzbz>Yb%~goz!PhEC{GAegxw{HZ3hh41SqKW_vEf`SQB<|u5#dR9dOx!Mf8X^ z`VuK@59SycHN#S0R;oxw%`NbG3aq|q^FrH2b>`+Sg(}SlGrJEHoMO8u2V+p z-YJe-N=5nRgL?s9WJ&d>C^2gclCjz1hlOr40ed@xy!0NE@Au*L*GHS$Lzgc%`GWF} zzR2vO{5c=IefRbWXYHW)z5VvIL4aeT!3=OQh6jB}{b+qob)63Mo|2q*WbBe>FGm#B zxh+Qifxk;F!k8OiogVO&K+>etN zIe;pi#s*3^5Q-k5YGxC2Vt`GSAzuR|Y|4`INU>X~{G41~Qj!KBl3n(E4p+sNgo;CR z(6G_Pwk{ux;9P_m6YoX|y6902Eh-TgEz*bdOe6C=-yQR_Ef(D|iWe7%JmQP<)BX`QGm3FDll3O4WFyJ%)G-k);mk#J zJYa~hiL4`7mGW#T)qimaZ$`UIC@!el(2bKCLZjg}pmCYEQSQ31k5k4D-|^x`9!KF` z#Jsh4+cjXv)HTtII3nIU`~Hj^ZU-^$ed-uEGCc#A!jl_&YCwMg=ziENO`8)q zM6?L zCYdt+QVca$&z=>{L~8u7wn(27w6lOJppX_?uNDZCt>_ul139N$Slw@{I&-SPKz<2+ zs07a!DsdHne*5o^3EKz;=|n5UwW@&iw}>_kQrrPw=$Ww;^77wX+M8!%Y`Y8;H?&x0 zQIXmTpoqo4&3)bbK`CWB&bp5o3e~Jg=^qW@dK$a8ZFfkbGMO zm~#4XX?pw?Ht?3M4BVUK0gf(A@6>%+?qHd+^-CMGOk_u6W6Ln8uu7_uGa;aEQ?fU#TnT$enBK3Ci((2fRGyz3y2PH zCcvKVfDl9#ST)0GDxFL(F@8AdEnYmnsDSI8E;i_=t=5hh6vq*UhsiSZ68UXa*1@nh zUDkgk6sJRWc8TkY#fDBw%7LAEXt1LF@q*E@7Z0~a4oL-Xw9R5uRv<`$6!W?*p^Jgk zwej(;JksWdHk+lFw}9~H-c4p)HZPuvW4p7-0qR)=YiHLK*VbYuE41BV!YIDHZ``Hn zxhqc>xbsK^IL(CO7Y0E2B?xp$g?{FRmf(^~IUqG6WNjSTq(CiO$sqD4{8RY%|J&(5 zgunlHd3B+r`B>o#xs3TbbQ-hhj4|`jXIc|# z1_S@08mR+f5}!hlN^H zpwU1s>VlTj!Ab2ROY1mw3`GKXj?}%lD0INWqTfOUZa36|?LjKxKyPQ!WH zu`rdaf>uWa(%HD*}~z)-}XL<~_>K%PIw$ z>2JyzQZ;nF?0pj0XWF0YEy%6~38)b!kJW@Q#3_lEXD#l^lnI4r63i0eS-Ve~DVT~?~d z;}aJ~8>FtW>#I%qiaU zuit(zpZfc^KjOcyU**Gi1}+nY>C+y@*4gY@cE3*!Ho{IHT29ZNhe}b3*pOW6<$)z@ z=QoYH#I+=Hm1gbjdFS0|Dk|FmJ=Z(TS&Ux{BxBcMhtJ6SkY528EeI-%w*;DlK2X+3k@60$Tn zN$90o!Yr1JX>^Wzl{}RqQpK&D=>hbV(tPZwIFuur!xMjZc5x&rtbm|irIvGUmhu=B z=l}_8AmsBuXu~eww0{@A|7Y9WdQ5y9jz`E>M&tSl`VK#M;}{{yLw|Ey%x}WmXDa+a z=)Y8LqtRP?za3IX_s~Zv>W0EO3$QB%u)sd%Q;G*0U{KJ^dvOcp9lO+NFml}#)Tx?p zOytma;k*}Z5)!toWS(8~2MUs7_7yu1FmgTmkdLypp+6yu=f*cw!In#5?C3}iu4g>V zhp5++^^zu#E>i!_-<0r0Je>kmxI1A|H9QDV?jriX)VbPvmT?jgt_?K@TX<0Vm>*Kz zL$4sxO%l?jVR3N}Y%ojKfn|cz;|dFgd$J@$`BUzk)UVU5+TZ!#@>qySEO|Of{-@Sr zlyK1cz;;}gdbE*fT4e{RYwTenk4a9w;RCG)lZx2GN^o~=CY8xHkx+71cm;90&-L6B}bC7?I8MY8|-{On3Dq#fvn^(;J~al zUI%p=KM2fys}k;+82+b_iBU&Kh0V>TkN6hw;P_^m!oN!5w6!T|mc9&Nyc=y4AR% z$G~3fcUmIqIH~X0o(l8ob6TwCi^`!c&ElkQl}*|~We^azYbj7sLAM!=T{kp88Qn8R zY9O$c){<=`AS!G=0=CU?>Q@Lo5NrUVEpZ2Oqo2=pvU9DMUwdV+D}nM-jYwd@SFZHg zW`{TRwDlqA*tF{MB9$qJGuL5OAtOR!fh&@V1S-{Z=>sbTG_+~QVJ^F0M?Jto^gxwR zegoiniTnltScolQv`d#r}Dfn#z+3+-Bw zo-Sc9%NfD8Jimvig|Qii#6BXOTy_(2Y(%+{&=aC2uw&%2Ef__&aL);=?ix&R8Sf^w zO#zhp#%PDlENPv5t8L^AHA=?I(o5C2UTjC98M-+&VqUINY9zNv0kVePCJQiD7O-~T zSG6jajJh7i9NGE?n6tRjElDcLo-RUCR@%Lr zF}sG^QKu9F0?|~!mrBQwOet;|X{Iqrc8&ciG20kY3;L31(*>n3T8$Xg%)B?Zl>u2#h#O!^EdD@5?4unFtDLho z<$|g=RoNRQi(80`?E+I7%|^$@l98$jXYS`owS`CtRs-kDs=}oCAO<%oKpWZ;=u290 zB%LmDTRp_7c@WNP3wSN$e_K1eOF(~j2Tkbz%1#@?qs;i}rsKdB0z%C7uwNRm1gBsF zh%72>a*_F+jw%f5soF}mSn720eb18Lz5bpsqn!5rnvD@-{eJ$}e|DO|Pu@PEq&LPe z8BF|aN)|K^RJp0WG?bu_TBDHC~pie!vRT-%n?C* zxF`jI4HPV8t|a(c+Eu@cQRJ_)9X}1Ajb#q6zVU8F?}GY6*b_Ivb}_G>QPYE+Gd!#WCuti zf1i=#G3RvoyrEOFKZi^;I=?3GU9EDe-Rx|w)-X_IZ_=4Qd#@FAdH9=F(51AB41RZ> z>|Y=X#>V*NA{ipwE1OA`E_Kpobv`D#Eu$%frWky%dX`hEO*|tomg(XWhamJh=|~<) z$7rOZPD=}Gh@O(pW4biZWFcC5xVo95S6n!bz4AOO_nV9O~~p1S2{Y>!mr5?8ft`*;M2RZC!N0BnT}yvz?49S1_}vLM;6!LQUGEqMi8pV4aR*$kuCLJw*}DeObMoh%aldFGRf{l zPlf7!iU*d!rp7a+%0;+mpGqU|wBe$~T}{ELD?9|q3@o(mq-K5`E2#d!nYbg+qDX`o zlqO>PJ35dshx>dfL3!a->N#D_EsVSDCL4rltIz(?57_6>z&Duf(WZr{>`KvatpTE~ zYXn8tv%eoyxMeq8xk<9A8^aGaO+j=ElzRG}dq%RJQ|5k1^=9WGh&|@L9yM#w*arQL zp#!-`KcK6iTll2qxWWhX7ASz$I`z+iiH4?xlDt79@erXgX^k|5kpm`Cj|s@PylvKI zI;eDk&T~$+9QnP+#W>s3>+1eg$|$H$cN;3F$@h zMu3ADFSVHSPWJ_m&zdN$=XWI%d?MCBttWN>te@D@^h5zc6;<>gfntSr(GCa|YpTW!oeFUc9%W1i+J=8|YR) z>ChT4B!VLJS%{*#%y09s_?ygi|3ZV{Fh;wZFRUJ3q;fWNs}wnAAOj-`&L$tbFq-6- z?@sGEuyT_c7Is?RTLQqx6y+7$z?OhETkdYGep5#*7|kvNkQs~<3-0bXk}Z!$E@oa9 z{nn}3;zf->Tk`>(r!ZO|8+4K|_eu4Upc-b|y4`Jbp=wXC5GXezWI{m$K_{`f_@99a z(~7%w8V49b;vm(tTf#NxF_1O7KJowqhO^O)r-2N51Gmw$S zCdu2iRljYE7pcF>#wXMfYS(9}vLLOBSV)0d)XvEZPQHQ5Mnf5gX+1G(sj*69y_N|vd)2gOh3+oU4W zbY`#??UFku+}NSd-chhxIAv2?2c1u0b$MG^p(o37R+$Gp)g?CmtR@`Y0|LvaPCSg@FrFm{B z%eJ`W`oI)j;w6>`^`GKPcp)HNvf*tY(Nz*UxV3u1+A2yDlW%*YL<@AC3d**1fp{7@ z%u5Uc#@g+opL@iI7=(EYRLc%C(khbB;7YCJ&@O67ZI}GeovaWHF?KJVFeqPGs0moP z7WO}uI+ipOt`;@XovSoo31nB}EY>BYEEu0%u zk1*bZHcg-hJ@}m8xca~j5xtEjZV7y>oVo98Q>nikn=dF${Q4|OWC5mszWaX{{&wFb zU%k=Q>GgyB?*IGxsr>(U^8ep_|C6`R_nylJPdOXbOKN6E(1zye+MXU{<^suRqb3D4 za!#NQVRENWm@I}D>wMlcgSR>{OJDf>9j!GBZ|9{2P}v3BhcPThU7A}JbfB+O3%3#W zXQY&QG(-eS1?rOPYDzEh-mYV|W45q_fexFlaHcuu{W1=U6y&zUFsfq4t6NVsek@~M zsdd*6_W`Aen@X6x;SP93w^DxX7uz};!jD5%0Yz+AH8mrC3j%}`a%q!oQcw)z%?Xo$ zkl9q@I`k3TF1gQ~K~Mu*s0<3fbD?1HW#T5z2f*k_UM*cX7;N~zQCfOD=5C?{EflKgXx+#Ew+(ufvm zXC%i3Gr4{jK_XYmr+V?4W%TDmNTA8!XWR(iSo85WkU{#yG2olxAM_wsntfjDI8w;O zmFKtE+J%Gzo_Cpu=?W&Og+)9U1LYDVZZw|VtKo*6r)ylOlea(~*|vi+y%6~&0e8!J zuplix?6uVZ*^_-M$WEh5lH5wVmk$86b(qBE*O;pmJSn79yA8Ya(R{!UsXjBt>-2OS zrCQ?NC?KtW0?U^Xp-+#TAwnREx}Up6eTR7}v5{!W8-Agc#a9!Z)v3Vg#XboRLa5r8m8@O)ohPS>++-IlF+)%T3s>56*Av;twtz*epqM=TEn9K$PWh1b}g z!XS&{4b`9`d!YZyLs_5~KrAa@vfZf0O-!>dl1oW0uC~r6(13fUW`k=rmbErTxCbzH zKkt~aI*iJzC}?Fi^v~ob##uzle z0H+Y$i8Lw2({31Erm$}{?O3RE5737*+B}rLTqJLb$*~qHn`76=7(>>oqIeH_d3z+l zc!~2P`90PiYqd#I?R4uj*~xVcx8>A8ET9J3uR)%af893Ep7W}NUBiPZ5wPd3G7EAk z(=BZc9ONV}3UP6RX8AX5sK-^6_IFvv)Pnu0R;L@6?~ub}8FzR?3B@Zr0*c{DQLqBj zH6C?Ely9s(8Zh+~X#@q%n_77u95G$oK%Ul$1vyEAV3Nvcu6P^o+)Vl_TN#4Ch*?t) z+R@^>pao*tuF>CtS#m+NB;=~8)2|9y5kerS_bq~yE>Zk9e`9!z{OaH6s=u$V4u#B* z933Uw=nto7M0ahI-%d`D!FJWV(*ubTe@N!n-cuDJudc4*mT<`f#Q17zY-+B!D2hIG zoL)c*2S;}8My3cdZitB&py9HW56J>oJ4KHlusjPtQuC6OJ+Ga+$V=T01ns03aXN7I zM<1JH!)Xgxm_Ev(YFXE|+k8op-8DFAKDBQ>UM}Q_1NYI{@eZwdylkr00@@&-IJrD( zzfuRIPcNABTDXCFyDR+67zCm}k-!>K{rdO5Wfv>?KDLGcU!>NFWS&yJ!|B1U(ImfG z7eS|Y(}7o@zOa(a*BlCiR9rc*qq$;B7`9$EJasZJml1=Tm1;mhFp#M$r>aZd^^${K zZBwte)jAPi+de}x->6k9n+C{V=jO^`@MP9lBJ3qeeK`?3#4U6VyrUpF>P5NlJ@kQF zWA@_&(u&jeb$CL}@_mM{&X+X_@XdLRbX!9Tdw@XM{taaT?D7ycf;h$&m zE}U^FB+K?`A#tE`c~^KT#ltN6k8j^nqxSdvyWfP@FTIWMm(v5}ZrMmDIo&(mD&U27 z>PrhtONqHGO&(#fVHFyCw&tb!G?@M1Sm0a8*q!_ea{waoAy~ljqfrN`e4QW#B)6fD11H zxOhm)fS`unkm*x4fPxScixfB#9oV||bRH&NQ-K|zW2V-rSzy&stXU3_nUH!67u@Th zN(Y+zYpw zC6#Q3c;&<$mI*fLy{pzBp%^73xvrS`P9-7!AyFCYZ2XTOy)VH_vFzGhcWvn92s0<^YOa;0IE6{OXplnG>7aE%MUw?$HR>KD`(tR`+Y(^A z08qchhAiS>JEB&u{kFgGtYS_DEMg!qIBmNo_yi0NN{+bWEubN$<$Qh(A@drI>v{EI z%qXjlzv!rVZEKmKnGLJl!@vpOuWJ^Jm?BTco*n<}{E-`Q7C4@iD{1ur@qz2jl@v}l zi6|zTI)rP!NPXXECN{{~!V0dDZ?+vwHPt?x!jJW=j_Ks-ZBZ4xYT{};ltedWr&2{3 zF#Fx936LNiDV0*t)`}to-wLOw(yZ2Y&~dA5*aSTBV4cIFS(;~pN0`f06q-6o70J>h z&vNooMhLtSAThu=B;8Q6RJ(C=24Hcqvv3D=0pK?W5=C`^8tjaSXBEG)qv!9!|Mhpr z6aMRe3zvODG{xwEU@qAH*jiiH56tmF4qWz5I^;WhPHXQBu`58{yUUcEsiP5dv?mOi zm~{t8^pKHnW{n{!((6k0f$SqW!tDHz3Llh>n**CcIwpJ%!(q>q0OD)+SLuS;*zUX; zgPe(yXF!J6DcYbBxDMQ;bQ`;d?D$wi?FIg1z9rm5K~;=;T7QsK2GK0D$9N#JwX zQh1*7SwP?mWX?(B!epM(aTpA#m8X%j63*&|`dfhMwh1OVvJAk7v3-QDqKoR>q-dgI z@p+%(fFwKtgx3{gZQT@L;3*0L8S{3Q4=^G_>A{2M8WM;VR|p6>oOc@B#=) z6&O*;HUV0D9Zjl!BbV?I8SQ=;Ep2Q^Xy83XJz1~1-%IX94}1|CK&5}tU~D1V7eO;8l7+#A;?I$(2WHKN~p61$7XQ3!5{6uZ`nINqtwHp zJMs3_U;h(7h9ACR>M7y%7e`^SAHV)u{X%nWmE{Wb-Nd3l8~DyO26OgKVMEPF1eLcK z;=;WssacuKk_W2%c7~xiv7NJOo+YsY5E*%i>fI<>5X$ks1H|#HV_rZrxA4K}j5giT zn0NIrLf7GESq^+A&f$zcv`%;I4g4((0;7%wOIQ3Iv2q95vpNxCk}1W11!)@%SPRQx ziH~*AHXD_6|h zlXF+XJNWC$Nm{F-MRTgd-E@ZGZ*-YVnN|`j#5gA(t4E|!93>})q`L7y6cH{lw6GL7 z!4{}zNC{33N`=(XaKxq{K6J_>e8$}EdMIL%+sOG`t8!4%A4y4>9S!w z`0;`XBfs*J8pwA)!sEex(+vv$>!a;2v^#9dx*m<@(JFGrlkB_P7PdQyE>;bFAg~1U ze$x7L$fwc`g%Ff1`$fBtAU1Ml-SiM4qFR7dTT)HY3FktipQdbvdF$2t72*wqBUWg* z-3d!rC}g3r4GsLl74$pIKxeyO`g_{9P>2Bcq68(|uaF&Zg-Z_05Wh;fV>aa}bWqz8 zyE=s3Un0`|;0#f+;CkB+7f_08xS!$zH4f;1I@3O0$sdxFXBZHaws>%$`Q7U`;Xmlh z%{5N%p?CY*X@xsz!F+29zPbS{1>$nPCw62Z3VTzV_6y~1l?JXx1f22DuiY! z@Nb7+#_X@uRaA~!yH@~55>BfQ>`KfZTHVBC98}2tr@QyqKnh5tM7h zRmw(5jW_bNzB=S~7@*rL^>fGgdYxR)IlZX2F_rEi;_s6vXX+G~x_hXRlV3t7$q@3i z>w(i%Wum!d=|$m-m`F*UyrL7Qz8Jg3D<-Ad#IOKUA8b{e{%hgmH*bcp`RVJ|;PO7B z$Kq}1v~x9Bz6ZVkeMonQ^J@Vjpq<(4PU4r8^AcGvEkIz|Mn@k4uvmF|h>AsI=tw#V zSGonukF`H49D~SPKwT~I5zUG=on&JmPiS0>ULw+I8URe_50us^Z9O_kyIO~uoriv1 zAooofad;j;F8$Drt{`w{LPpr2>U(2neu7jkeiG_nf4jv4@@bF3#3AuNqESRQrQr@P zRN`n2uClgfOeC&Ux2M7u7?)`WVtRgcX`qF2*{zuiN9W&06#R8rn(~jj7>< zJkcq~7f>gvP1qj-js(D^{cxq#;f%MkOYtaoMbty8xBF+GS5%;Dra6qJo-m!0Acm zGz^kmCVlci{Nh_%Fbbw2r@ub_@LUciN`Jr+Kf{*N4D#Tgpb?1uqdLY;A z1S4q*wf!NT1}vQ&x86wEWHq>0b6EDnBx|%&tEW|GWp01yE_Ww+UiRtNVUyizQKZq9 z!+KK9aE!yI#S4OZJwpoZRIQ!VTO5?F>eFXiyB?6Gt4e82gpAaF)=0&+F1p9c@)5Wh>76rccZ+~p-r){Q44w}IUbn2dN+TGFL>_8(^%zHgYe!- zZJs3aUX5QfJ0Vr!O5_|6HlRRbTh^UUVDdGHRaw>CLTeGu=BorTChJ;6KM6)2=#WO0 z<>RB60m_XoHv=Q2^3fFaZf~DG3~w~g(!o$qkQrj+=<4f8R-1Uwd_`^FR@&3IJ93k? zO6_vs`7Wev-S&hE87XO&%B__gP?9=>Pe`pha-TpdsyV^!+11b_V#4TY_w%3&bcIRw zbgEF;(0Qx^m~?Q7VpXYpK&aXBP-Hh~J;`s`JQec7IqXID_9OK!P`KE!bqRyPmD7v* z)9$e{NgRD9qGweqE;Eyj%LuIEU?g7PsR-77@VGEt>2ZA{eO62& zhBaI2wW=I=g5fqpD$*Ren=G&A4GxtoO!Kg>X}vK$cTqJ&>s*FHPHG2=$iZvhM3rH9 zKy2tMZit8#3p!I0RYXH}C2?DfQ47tMsFhJ}#2n($P)%+mbcyT$>zhoaukFl`bk7bA z82kYyLTJ^{%y1xa$wc%oC7FhW+D@!e1PPik%4Oww0g+V3t4=aTTi7u0;*1baaf}Xy zKPMlYwBcq$J8UTUHOw?8@$o*aLDT`+HRR-U$AL@aJC5_(atlDC2HjCP?;)TT)7msCVI ziY@ld&hu_lIsa~5d@hHMikvU-1dxN`yw3X^sf(+7$Y%YGSvMu1b_zVqD;RVDTi7@r z>{`mmc*RDpoZp9Nd9GI=T~whX(%=&*RnK&>RC1)h%otn7b`X{brD%3-_F7KO8{NPF zxeCs_YFibO;|7Ilm0eKYIRmvG0R2-~5t0>6FB=OG-}cbdp{~Luyu3i9jnKkDAFo4# zN&+*0Ka?j01BS{t7GO%TK3g&C&8WmKqVy_iFR`RpmpB5Glgg)+z-|qv2`(5;G?L>| zjksWCQ$cHphFM{YIkQH)6Nx7?Qn-=x3KQ#jc4*Gn+b$Wb%R13|Ovh4=F`TJoBh?ht z*RKZE4V5)U5&4R}BJa``)Vj?!5;nOvRJ?p`dNuZRlTTVVkEF1ZAh878369@~GQ_2C8 zuo=v$w!K89%iIpV)CI$807WBw;@5unfKIOIjEs%GTJpPHh|7r=)d0``@Q?p!rp*tX zL(8ukC$2$>^A1yc)TXnZc^aqn0p1$qKB%Ci4nhTbxqjH?L`fl0w1!)TZE!Id3=qZ> zxcaQ(=MlJn&v5GD(V094MzisG%J~ty{5$mq0@ZQXr2xCz8bSDmwFHLQAaxT|J1n4q zz@15x@7A0%&wNFA+&dn7@08m(VsO2LTTjs;vjdpDk+8C=S|Nh~E;?~CaJxwAlp-gH z&8b4xIJdBY4rW7idB2}T?eGlVQIRmPs7(gEl~^FJUq~vWA!TU^33dt_XeL)+ZDC8S@S4P;#e+V1yQ*cFH zxw+_{c83X9y6sb;4E58QH@4b1ZzwdL^}r|tLo^OdHAxGOJWxrGIzH6Xd9#g{y-RHa z9(%(QX<+_C5hhld$^OSLHjq#-xd}tLkqN;qZB}k~~J}ZrA$!O9TD9 ze+qnQtVBBnzW4#Te9pq0_sKMW9@ZUYepI;`P;O46ka6N;;bK2Imm!2iG^Pg zn;W=(Qm5iluP{Wm!y@UO$E1AG78fO*AR@7sC=jBckfG8D518UEW1l>~LyfG>c>+Yb zu&uX~{;`rSO;BdvZES&rlq|>Ma)J{Yn{X3A^q?$S!&9~fbSSHYJaeqA8k>eOR{LrI zV!1f_I!WCZhM5Qq9VB)kF>;Km%p{qovTAp~Rrw9=1X1rOyjZONi9(VF$&Fev*>wq- zT05g!=vK%Z&S3|l`9=uCwFq~1O}7m0>T3@6aoB+43`@R~0&Q}-mJc&TAuHw7Dlea5 znx#O)rfqcaRqlzn<_EoO6m_STvt`+V1{Zi?@+^}R6Zm7PfK~qY?roS7?QHZXnK=yW z4tJKvat7~$ni(nuZzr!B)uTh|rLj_j50+LX>fV-!V;GUT6TCVtx?t=19G08}!JWPV z53l(I|vGp)n6u9eV=%>wBt z7swwy@rLnH-k>`B&r20%U1>bQVHb~wlfT+&1eQ8)Cz<+6~G)LrH~RXWd%6-D`y)UNMydo&d@-TUA&6cYWtIR=@13-dk9!j~!(7uz;yYTD8O z2FFpzn`8k7eu4G*Ea@ZvNjsZ6i8k}~ZF*tz^4ozZ3bW=J$$v*-*IDfssbmUWKEm4M zAzNfdW45IwnZoH0spXXLEaU<3(1-a1OnI_ZOnwWNr_Ay>l~SX7y^@VRK@zqD*f~6b z)07kc%(1}`e5x4c$zm-0Bu9t8)p5ysvAaA@3o)_iQ5u;$kLGqoTzW9 zYFv_th=T%ldBA`1jvT-FZS z#XC60q)z9Ze9sgsm2j%)7zI^qr?~0XWHbb*{elVlqzpe?_2?n%_b1!Eh)SorSnhpR zC_cub%+67_oiLMtDgc^B1B6#6dK9-RZgk*G7sHCDw@X9BbBPW@Jb_~a4aJ`^5B~!{ zh9ADcj~?a}1(Q2b-+%De|MdD(n@8k8xZ!Are8{FKA;!9q?NekOs}Cf=rpY(+?ig}t zV9fI1T1@7q`M?@rL{ldDCPzl14)_ck);pnh$b~sE1c^YNzwIbl5)v;Tj!>x^4ov1K z#cP|Y#_{q~<9hUyB4o`wH6!7C5es&*I9ef4FKyTQb? zXb@T_Gx6vWYNZR;b(hd}VyO;5I&%Gikd{sziyo@508%wivvw^uNMezGq^hUZAyemA zoBv@iOserSOObVgG9u3><h( zivPCx?(fMILk8QV6?;fyyobn_uRQ>lpu%b;#E-)NsUQDWlY{#k*3Umb?9cG}ZNB<~ zowP3y9rMLUeCMN_w0<1$Z~y%IYsIgy8fcU5#@AOCtDcK7NQ0UZD4Xhw% z_C4fw+iuRzo69y_f*F{s2l?hTa4v+XTdnNBnKI*fHBE!%B6r9PDv-M}QOCeYkI8j} zC?Hk+FZi|?!-HfwE3S-V`g%W@W@X0u(J;1qb$m%db*Y>p(O^IWA32(2wAL?BU9otX zn9Kn6ipr>3Z5WApx2f@GSPrBjHB?S+c(G^AD6X4IS+)agK7ki^uUOgTb$hy{2MRsg zX<$|4%p?~QlKieG7!6vG18^mQEws5RYqeh02{Qpm!=88cH+Iwt8k_wq9&j;es#W$FQbR5)A`>THWg4M>>N|=I^c7a4goK_U&Euyi-=K;cSBiKRM<4MhuS5VwQMw2&6?-xVs$lIlWS`?L(YKR`ql6x3Z$O1 z5(HTz6$BbEOk5$xJY%@nWzD6vCH@)J1myssCL+55(WBlZoGiQcj%vT`5?ejY7Zqe8 z@m&uEBy|=>B&Vg186^JUaq8v=pkzsjXT#d_fLcV&$k+%Oy!wR0l99L?mnCU;Z_IP( zjCl{!j(#uEx&}feidQ}aPh0}@_;cl!S0x6i`cFQqPf z`}FNk-+%J<-CzH+y!X}XuaJHI4B00>sQL5HK)I825*es|$lvQ<5uG+jTGap`G-O`L z8FN0pNS;M~@2EYLwxO=jBktn~49(r293&RoSlgs+v8l5pQrjmMRSrf~DqOm)>~zmS z#dR9hI4Ygd<>T(3Z-|K0gs6uRK}2rvUJ2ICT~=dhv(@?BHq`KzQ~+JahQ-6n)9i*^3avJAuZvsYqD7p2D;cwgsKx@Lle8WIu)%qO@r2WULlU{i-=`BFPicaJ-z1m||^#-?x~ zsB?n{WNDq6&yUR6k0gn{h?D9w+Ugo0q@OPn zc=O;HKpm7LEigIFwidkic*%!5&UPEiqmjNRF@+=u`SZJ6>>I^x4VU7SWe9l|-iBaA z1G#GMkipf?bY4DCaL0iD)JzwJ5iWE&l57V?>${4V#LbnNdiDeayG{Pc(d~q4#SOd5 zYzs+WIX;arJ*5f-xKrE^`EA_y5(;D0w1ev2{n_ZDdx|KyfstzEt^p8DwHFv(jgw!_8FV0*|Y&2*+1V zZ38BYw%q&iQq!~qqHw44Gm5{EhA*8mb9u#fw{e8uhbht~s+;H%ePur(Nd_(uM$ zPt+OkzlOJ8oN&W}r%BI!^r3FklBAi^=>wP{qGg)GI8p9`*Nw@BDw zKU1Ead&Bp^F9S3^PfO~?mQ+Bwxh_^83C^0e+PDIK=$#Mf(kF(dy@8*A5^y^BvQ9_+ z1)Q;7*_gK&6V7*mu65%Yu7(;?`!mxF93|*b6GDZD25n@=ac^$aN;MtHrk(3Wa#YZ= zx;S|SHF16ms^9njVl^zX`K7mS56SR#K7lagS*5ZbK@C@CKtGd~Blm8QpuGb-OHv7o z8>U8mLtw#6P;(x8Rc`P_nh`$pF$8(C6_Y#o*B|ESH`I~1d-ClXN;q8M%V(c(mBY2w z_-F0;1`t;WpY2rh3v4FjTb}al67~YFOmq#MR6zuCg8Z=GSRPpoPs<8Ob{9UA47IYe zs<}2kC`vDQwpN<~Fv%lHYD{)I6jNB*;Z*pkRYny8<~f80&^|1Hx|o~Y%Tmgw)#%n# ztS6Cb#^=n)I3@VpH!jt>?vgIql2A^njg-d-b5zsL3&TzJtL)L&KWe@R%m6+pyYAEQ z_N5w5zkMM8{X=-mh@of3G+E0+R;%FzRQFQCf=aP2HSb1Nj)tB|eu?%3AaP~bWrL!u zX0{*TA!L1d=;9Fr*X-c98i@bh)kP97*P2u|g+*O;7DVAq(%e+2t*OfZO)AxBm&nId z?0Dypju7STA~u|)SEunn7l(jZR#vItIY*WNSi&ZM-@5_2O1I||v=+Ey? zLx|pM99qxyk4Q|8@z^2h)FJfdBzcJ2ark74L>E}VP#PSPwzElFUW)CXlLPZ0Y}qPGNh_@2BwS~=Fcq$RcS4lscKKCgwxdlc2&wA-666# zzM)7{9=Hf#9u^Vm=?79wVYqXP@sc3zl%gpMZk};+zO3vOpA*0z1ubFJ^Fcm9)vrP+ z7`SJlU$Mj8BK*+-7_>hFh)4`rVmy;%q@#9=>g~Rp;u(6xC6Bd#2>*xt?}Xmuhp*q{ z82H{Mv~{JRD>0+8Xirly0@-pjybOa1@8%&^VHl( z1%g{5a~kE?1N0>o1qqf5Dir(Yf=^Ns%PotUTLhj!xSL1h?K{{tp8YJqeYDvCx!HN= zL*V-ks2Y^cOEi3~RXnBRMn>mFKfz@yR;ntE0Qek4#`-?P$DoC--E0rQ3fPhJp+Dmc zAau3gLUortoebpKEup=ix|`}}NeLif*9Db}y@4awN*q3^%Msf9#nAQ+XKn#iAUHP8 zNzWX6)mJNcWK5lIjia(*KS=cdb(qsw?{fha|L^2(4Gg18HkK@yX(=YUJASSi?n#e|e2pT>G6J|>vJQpyXX6qSQUpYGD3wxFcG0)B6aXosi0F8j$9<;yk`%CQ zrZrjL(l_7b|0C_)dSuD2GqLyl6}x4RC5>h3eLN%jfB3=J5wSBeG9zL~$0f6(UBb)=g*wOth^Yr+17^vh=Dhvygoo=FPEv#}UKcEw{JV`j$Dh>W* zcnB&Nj|-p;Q1D~H3&T;HEmTBoVRk#ctN7;A8^GcXGmL>9`&^1NVvRabTz-L7_<3oAOGJwHLRO&2*I19@izgUK4 z_BLVmI)(?;&lQUyH)(Y77$Csf!xR|I7dIs}G`db{(E>@LZ^PhoN9DQK)C5$V%BES~ zaW6}}DO`1iIWa#$HKk?&0`hE@dujz3otRyTTBsuTx|pZamt@=l8v=kgR`4dM(otJV|?Yjxgc1i-k=l?<_h+u$P)7s zJD<9>o9-Q2>}rTP+XCHcpni8)CxWb7W1YQGTm@nEl+)4+TB9zU9fB`Mq_mdK1`zH5eo1nGAWC12s|QW+cYDk_dq~ zjBi~q=siP`%W*Q$<)mb944)cocPF$YVv{x1$}TS;X&@vnxL8yXoF*`j`Pl< zwe+7QTS^tW!^FX>)vMGhXG%+twJM3xbD(=Nl_|*fI&zQssD5_P*Dwu zeluDFbFJ}a^l(hU_Gy5+UGvjC4o6#-2=t*RM2wk|=;7L`hsv~gwaFCleCRkvH^ zj>&F>RD(;q2b+#SKTT@c^nzpGMCoH4^5m?S+C|Y&0PM^9P_ZFb@HD-4W50aOzsk_? zoDu(%KD*0rpKP$PEBu=4%N;0#&>1D;fnah$5NzhJkh@qGR%2!-0<{TCg{l>BEYq=! zLoK__6ot{{Vw@$6veUMKRZEqGkT&rOfngy4w3uB1!%aECyi$99lHOJBHRO`{kY1Yu z*DI>#UQ4CAn2d79GOa`mS`vqiL40D4)&~z$s3mloVs~>G2g`9UcL(%yDX}%Adj#Wz z12piwHcO2oeA9@!=(pvmi_p-vFr;Ue0z4M#gIurj67(Ocm>`=&uDx3i6n~qQ7+9{u zWGN9Uc!al~(Rdxw7Uw`VC142tLz86Z{iNiNJNbwzMs4*|BcG3bD;9RD*7!tKEK70E zNAepgfS>TQy!&{d!l(caD_rqZoh}5}JxboLeN-&Dv8xZYFL?&5bgLxqzWj-Dvb{S0 z5lDUvgek_Pf|l@yE$`ANpFHhQBtE{N^Jn<_6UTRb`TjX$>uEInWqA8G+Q(mncWE^L zHvI9g8DSul*zWL!{$Y>ITVBi6tVkHUKkm6v+bpbUy0h<3@1ZdrTmVAjz{s16j*50h~QWO`5DHZ@+AuX^H#rtbIxPYU2a?9w-USEkCmD}w?O`7^5x2r@hN|!@4x5NE# z0t06xULek@nT*$z$Qjmc9wBTE)65Kc$(pmM0aRP#U#cExNF2FL(3Y^l(x}zl(~w$H zT^i_1I-_)2JVG1EVTVG|ppq31{w|ewkJSXa8Vmg%dn^2DKl3VW-KeBpC#76r;f8Wf zy02f_z6cmznwE4JZA#wc>E59*Gk4=SUhJu18V%3Aw-3^w@%lAp*Y`14K2afRhc za=SST4b0V*XNmn$=aTJHs-I2JP(oVcHg4g3CKmgGw*Wt&mfIMs!7x5-OpEe_Oep7^ zO$zw2OGt^N&89OLc>sWFaImIt&8*kIy=Ey@MtKY{u}z-J~fV= zuypDAm@!Z^VQMWV{U*d1^lWgljmE_1ycwWQ<={c4jK{7Pn^wZS z6(nj12@E{uoAbt`!-HSLddyZp+{ZGZfrxId=cu)HiIQ1bXFD%yV2P2N=#vn^{_uTA zaw=Gj`K&y?S>p!#$d9;|fZ|l9aDcqY;=RI}+X$MeKm1AJBdJrO9R*mz+Ojk*j=K9d z;ZOdgGp88 zk3x2le}aM=CB`lSLET1JQ&B@S|`mj`y7|PHs}f5)%A1zxqFX-N612Uw?f3S6{vTf`8Km>=(yZe?h9WT$E?Oc>9j7 zL_d4~EWG^!;D&DpY7my`BPr8Ge6&e-K9lA~#VQgzn)@xh7)4;+aR68@oy zh-(uRn(7R7!nppA-?IF?xqhsXl_j_*V&p(#wZm8XRFFuHyyqg<2JD&!GzVZ9sHA&Me34SA}~v;*d{bo4>y#E5&$!cL51QO5O0iU^SB*$qPT{r zsv*RD3?Po93c{$!sxc|#msX`JSTLUfo5IKIEX7`$NBeDhEDl~@jV76K46?ypEhpdT zmv)sq>N~2ZU2r4iN!X@5EAqaAT#%`Ao$eSUDU~Y~b8CPUB ztF`Ok2lA2-#^B^hhefGiNMNy|gucn1yg~@IW8ra<&)r1T%em-+Q`ZF#uP!&7oP6@> zCbd7b(K~C*i+}-&z2KlGXb>#`b(~OqO|1UAbv-876YQN!>?SZ9Gv`_*$X&ZjO=~y5 zl+yo%-6e_(6GOrJ)!9ra5b-S_HDGL3stiIQF(h_*#Zel!Csbpf9?B(p5PE@4mmL!> zjv!YRB@KcVUedaixdOmb#N9*w5b*n`#sTvC&9NrWM2cGH6SM$vS+uj~h4Uw}j*pBL zEKk!JM1M3$(K&OEah9f}+T_-F%|pe8@f>fYydzGp9iUCserk4_jY*P-z~WPRynavw zQ7LxmP(@YI@g|=5trY@x`6a3L4{$~-8v3U)rXOiOPmeJWTsg%Kma7$ zjWS@qtn+Bl&ehO{tV(&m2W&Jg(lW#-E&Kr1p=Lqhx@FrpUvp6hAM!o9(#tgt2boiG znDW9YD7Gn`$>C4kadKVaYkG3Il4?Fto6}^4_c+gKQrt+a6KL79A7%>SR zy+{De5sMI4D*)<=3JOi4EsuRoN)m%I$iHR1Y`wDDGTP;oGVe&Wr^XOdlK+D=_7L~M<1c*}ZS8v5Xt+YM7k6&{l|9z;&x zoTv#fwrbYvqks4B!e9NBUVYD$J++#^nMbXtWV>23m2D%Uk9 z2WwP(0*B_YhjL{0!r*+sUf|^s>&_jQ;dF&k8HdGdcS0HNiCZ<#Sj+-;zO%hHdG)p^`=!XRnKz4O=m2k<;SUF_h!YXP$$y zfpQh~s?H8@P?>|q8lYa9fn5Gq9v8g7UDqtBi?w|(h5Sk@`?Z*&dgtAFQ{T>oM$l@5 zMxEtZJ=RR^_N=uN^Dz!GBmAbCQaO!8;;4A(Mn0|*CR>H3*!p&ej8GtGQ%a&em@RB- zh~W}Gfd)x|ck>M;e5ri#g21M&$aSB2BT=@WwZ2(s%vI&C(OfBe1*(G(j)jlJ6*U@c|<9KvFVC~T%Ua( z_JAiwi5akx&8B#>)u-h0*(J?k`iJwYyTMdWnypx`XuO}$MJUZ5xp&WQbU_!Yi^&Z~ z3oU?BwiBeQv3GK-tRpdp)&#s@rMhb1*a4&37eW4QqnE+HCL6sJB{87^MIFBc#+3vF z6r`5-uq9IIG8DNs`yA@jUlcEFWAeIIMDNZ~IA*?}ak~upO`2+O>bjcBBMv+r0{b1+ zeUA>t@1-UKME9I~T8|Z>!G?YOt=L@If_EF89Mmndl&?}%m0Pci7fDlQdeg~UT3NQ0 z1JkJA7x^up@D&)ZU8Fcf_O1v#SDsKU@dOP~>eGT&2_3Y zb)fo4JaSeOyMC7-pk7n0I+1D7K&pWyM&hAi2C|u@vUvmW&axF~=$wuL$X)y1cAs%$ zE@@;B{2-DtY99$*YzwdtUxc?`pFaHW;r+L#{~7e2-<)=6YpU9(eR{YZ-!s0spxjB<;N$Ps1d4d!)e&T z<&?uLIRh4?0^@*6QETh3yvaKS*w0dvP(E@g1@djQLC;Oz;d7DhqGmsU#h@M7qp+9; zyL6ax4;iQiv;Bi)ScE&XKQ1CW8|Ur)!DG2VSLyK8yla9tN0K@UNQeifFIWDv8bk@!jk_SCdqe z=8y@mKsr77TNyD8w-T{?m4CpN$<0;mgA9Ev&A^!^K(Guxy@CZn65p{o-V=2a_9qvC zJ;Gq?1PkEj^W%Y?{}Z|69_wRcb(j2h!pi^5v!stz>JQl>3nX>Z^gVT$Y%i=LDUg+a zl6p|{SC{)o3+>F#C8OeVpDhO&BAN#nS&mqo_}w$hAq+4I=2r3+?!ni3lCsys^4dzkx4Ckxl7^iC4a1U*-4o6>_X(;X%10`M(a0y@BX{XrD{#*^LuF z*9+tgT4;sZLm>4R_Asq#4faq(!Jw;^8;m{dGU15lj!Y*y(#Jkwy^9G@at%H(NV|Kc z03Pz~wB3sE!w4=B*^AhFrMd13>e<3>hH}#5N%#aDB}RaLc=SSscz@mv32 z{|^6ue}FBf=z1r8K$hWGEAJS~zmO{TY0VJdYDp=Z!>i>Y zWmg`2Q{GN3WOR86Z5Gr`?Tk=s_5LbfQswvA#;0-=)o`xD+^CtKOBc8$%BkjKu_oz6 z#RVod4qg1#uTictx>mGYKu|yjnmt>kAd^G%HLp;oX^9yG4aRqns28Qv8n%-HRd$?QN0sWBmQ%ES5JhX1-m3=+rh!ut=7N56Xi3I7gXf1-TX6D8%pVl~GOiET=Ph?@$Ri?NF7mn+bV3+*pCEIxdw?=1B@-n6x5<_^n=$7Ky#fWaD3e z9(=vp1mCCuh!bj853|Z~Lazvg6A8Veth@{xH+u`FX~bfwANCA0kkoT@0*T=Tf06`H z<~pt)W2h=QA`aJdzXl}+V0!Gt-P8VcAh1ri@vqn^gsFw>RQS=GblpyXjYpM&e~ zA-oa8y|Z9+YsJRC$Mgetd$+KJE0*Y{D1$BC%`W9%V<)Yy8jT8ttL4YBgPfP=)? z#3Ub7XBBoU6YWSx~tA5v^~i;gjQH-J@stXTlXpZ&~GmYatE zoC&*@k9w$pm#}S~a>lPV$HbW8*exqX9D2@DrV{9Q|WL8343A6MJsC+s?L2Tv& zq>KeJ=aDLIQstD1oUtrY#yDhBzNtBZP)#WcouS*Myw@%xk)SMXM}T@SpoBibk|C|9 zEH}v2d`>_aJh?cH^iXATId0)aidU#JS|OX}COFqjKFF*GgB6)$9U9+Ytmp$thkzRL z&8N2A=w#I%vLl|s6*Ozf9N3?_^Ntld<=vdo6Iu)0jkw3rNXlXB_c=gEP4~nAzwGim z+a=IE7Q1*sj!No~T&b<%if<6((M{#;5O)fk>ZO;YlM5~}(P<{S);Ayw4vrHmLIg^5 zI;8*lCsK|=9WlVmlhaLmWDamP6#W>9TYx%BsOR`_q$$7yhi_bc*`Br~c&FK8VR5P6 zbFd=2s0Ir`n3qE2FAq{-)jKo*cuM(Y+Uz5wj4f^EK~$;6j-3lFhPEWHs-c-8M=RWN zeX)gd&E5Eb{*3X(=k66FHYpphIZCvH1g`qf!)?^%4d@IxAU&trsqlNsQ5Q<;KZUQW zM16VC?0)ny-R_I`-@SeL;fuG=-+mY5!4KYl`r*g#-=_iR59MdQ{|cpmlYi+4P)V=!mjxbou}zG2Mx60TucTUZ~n9D!{H`LG-Nl0 zYU>VPNIAS6RdGq%5H(xKIsYVqf}3zVT1$murbCQLD&#vEcyRSTN#p9GF)Qe?RD$c9 z#oZq=ZnBv$CY;MqfFToCz68P-ldIg0S9s>kjCtwnZ=NWNP3%E1uGk_ zpi`;%N;!9kL+pQ!k@xpf(|;9BVudd|5D zxB&xP-x9Z>HhSK?0R#6e>3~e$?~=$>Vc1SGsgr8MQ#RcM2X7L7?$VE8eQak+I^*=i zhovG>b}kh8hw%xpkbUM@)}w>`Yi)O4C7I6_ni=%Vtn}N=2EJ1 zDBjYcVS!M-QthcH{%Vy1Kt+5fms#vP409)l#;y*JGDOrf+Z$9O?%!t|>NjUCKwekk zjD+bqUqE_bFhl1bC{2`Wz1uEHy*tseFk=o@;;z^lQlhRA_NSGoHrTeF2`^^1@@%(uma^UDM#nintIPm#ZmAxo#HXgA)OVew z3WVZA@A0d8p2?*h!7%4Kqv$x!nviP>H|W%)UJpDG5O{pq05d#kEz3I<9?>^j#_fem z+o0eg2xbp4_`XGD#>hFkIh`g}l}3b}o~0P4($as1i15YRFT?vUEc|X(c)zHI+6zDv z00@Nxpz=_x(|A%OS_v_!vafl$6q`}2ym3^R$Z2$l*$P$k!F8CBY^;X9QMvcx%_*Ai zkL*^Iy9Fk*+_W%gm%?~(3E$|_*~^pd?p%hLMr#3OrFXnxz9t~j;w*vo@M*?`Hl4`- zQ46e+D$nUfx-C>&HB0J;B-#U=ZO{mX_BbCl4;(s`$9)BqPVKz+!f`hr2kdt@@-3jf zg$mINL^Rd4q$&d?sh||$6Lp#o;yf1m3T`5VI0l~|-!@>L#<=fR0!VF=zz1@xMwpV6 zs{)#_+&xC@Yo>`SRz=TcUz`Gl7}gg?xHQTjOSgHxT~vyEo~90p!Bgx{jS6{Gk(lx(_Yg>?*8{jPmY*fn>9FgXxj%2>#|}lN z#&*apNm|W?nFPlOz>$mAwAJ0xvS(ko);B$DkbfUx1Z*iRJOet&ixVYS$>&!NFcsA` z>VXU1-=viT8>D>qtGxX7^a9m?f+eVcganyXT|*8Cn2g<|w2}TZxK1Eu&I)#b1}Y^` zi<6?F7I3S2Cry1H$)^Weesw&qj;-r_jEnzgn(|Zv> z+PU?ah$J2#0MAG~s~Tb`PK4zv)dILd!|YmPuv@O-5fKUXcZteDXB1Wv@4>_o0r&$! z+g*k+{Gw&jvD}3Nnu3f7*Y61=yM?KHvB;AEt&@u;&rcXgxf7&t=05`QJ2{jA<%bIl zhSYFliR#Tk&j{rOCJDwyZi97^?pV8BvZNab22SJ(&aoZRfv#%QNu4$;f%17xXl4_S zuH}SA?cjjk(8l9h@w-f*K#ug9KbM84B_Om+zjDbPPn8tMi>e2T6!gzhaS98iUR|bW z!!6zHp>z3-@LYH5Q=b%d;%|TS)SvwMku<+%Z2aZh(~SFP;qCjU4?q6nUt>%3#rr?K znbj%OX%=ZEdm;yQKaOSs2!q)*o#o?z!=uzTmM*acf(UGRq>?*O39dVaPA0)_l&1Yo zZE*SLB%GQuykxq2*2kW6rD#q-fK1Ybl&VsL$_-+Xaie5QuFe}wFAfEy#rOatgdi@5 zK*V$*u6A~}n?Zv%sCw}s>ypV#Soj#Th8K*QIz$CaS$Qb$gXPw`4S8#s`T!rq%_qOb znZ0Tq_CT4GZacePVGl7vc5bZ-!Ao#TT}&yNS#cRA z8gR}p&=GS$&{;8;?dcr$zDW=M@KR)8F`+z=L`ohm?bs4V?TcJ@Z&K-PMj?-0Iy zmV>Fc=HR~9DrgR-3=sx^(LER?YeG#Vxwl2O zX+cy7S4Wq$LuI@h@sr9GxV0N7ZOO=nDHg>U_hja)H^ZWEm&mWt7rvKCce&Uoh@_o*v1Y zBrgf-8*Y|X#uA$(Rn_5Qr6BKXs1Kg4qw)a^ZdMVv&Dp2HLS^_!v%{M@(pj?5##%Bj+S(t%ZUy51xaZf2a z6Tk+aB`N<^qm}OktS_^bxttBxtzB?liOZ5YEpI)eO) zQ&~JLyjlosCbs{ofFZZ&N>W?};?2Z)J>)Hn{eWq=#ek9*II4v$L+I?c0b8or4qkK8 ztqv9Q8mKQhYGQK2jCArVurh_TpxhXB`IUnCAl^@?U;_cVaxh5$IVKw^Yul!f;4?wi z@aBD`@I?n(1YNzWf^hAmi%R$QR7b;HiAtes0rpItgM!gA5SBlnM7`ZkuYj5GSAx2r zLHLrAyBdixLzUdYC$#zLT?Jw~BI<$ADoY>LVfLkgyd$PWvcg7Ze!}3csul9&X}x5X zhqhfzC+8iMW#xQbAcLoj7#3nnd8)asoSYASD37*9&h&|YKFfFAs&|l*TfSq791={7y zQv^47gV@GFF^PMLCN1dX_Dt0?5D};qCBINSHBX-D@=>W>);9R#8ko}|9yv;fsjyFA zbBBSu1Dz^N=%^$S8f2w|?I3SJe!*RS{EKn}1qx*AF^bG7bq(gCa=V?dgo4N@aeYmZ z+UQ9u{GaT9Dw18YkwNVK{^UAnPh-c&#&i2{d4+7{` zThqMm^3em#>B^jQyn{&}5f{X_V`WOsYb4n;l~{nj0^tX`$djy1LcXMq1BZp?gG%?( zd4aE`8j&PxW7F5>r_ls-S@S4W-NqK=(@ha=W5vP7G^-dFnY7q!Oola+4`SXmLpij0 ziW7F?Ju{$0Y2DIR(Mc98I{fTYtKJPs3D}Yu zX=S!a@SJXv%=5zvmYa7Zm^WMwNNoY1<2`CSf|9#of=J7g5)2K`;teggi@m%$3r5eJ zS(O*8Q3M3R%b2q!K+AZr`@1kN4e`ZN5k!QKWDaF&wrJQW&;g*%Do-u-p}W~EZd4P& z_hxejU?U<12&4%Nqn?(ylaD5Al~s`=tAc)Mm0y@qwx*+nZd^eHSlw58;V>k6CX^om z?{)ThSsN^Zl~mOeAyTU#KzSCvl_N~x<=-)>3ZRAFzjr{2zIy-eQ}6ehd|A9pp*0`* zDp<9EPaB2Z0GBnYc3V}IF)3V>2yA1_iCTYq)OZUww82v-9QBb(<&3ub$yb~zH|UX!oHE!X4mUFoqD*^Zmo9& zGUkp~ zphyJ!Hfa)xF)9wW1`fo9v6Q82&VB2nfCuJlTmsf;qdV(ew}u7N3M;)1_5{ud8yBt1 zQ*3ba9^*^Epbxtwm6OODfa)&Y4l9^U8I&Ylgd`^j;$D1Z$B>b7{RIMK-6|E?hi|?8 zEO4@)6|6Qu7M+`UWyAv;guAzPpUWXmDCwMAC^uj?>&CtzCm5k?Yxh8Rl0vdz$}xe7 zTc{0&bd6IHbEHOS2OHb?l!=rpRBlkIR-s1?B(P&{igT*3;kkRlJU>5byVk|BHANft zdM&ayYVCB^f90nY9qQ2NnsCqSTVc;cNKiA1z4&y&`Ol;remxeT6Y*m46*=)XVXt$qG z@AfgS9A2f;|fX_r`Q&g&zwKz1WyFUp_Z6l0DC%bV~$QhcFmT`be zaXx;hN)C&IRV6hqT;za~2|Qq;5D&okGo}T}?bB=5nS?5|lebu>1rMHER>sj*3c!*Mu@QakQ zma-jTm^HpK#Wxh#v#KpK@EQ#r#iZjn9R2hNmmBSbr8f>I*xE{GiosyiCHc4!po05A zYO`n-MHh%|C4_`)nY4S@)b)}=(Ab;Va8D8?AtrfSPv`SN&W5;woe)VHDcdxn0+SrW za~Gm~R`NDjGb^|0p4^YBA=9uyO=6d!SQM2zUg^Gm|6_9=JLeUqGdi=pIq*#0mt3a0 zHS8iRobmT8@oC!!DG?@y zq4Y1$s?6)G=GE0ku(->Uuf@T!T*tl7db5*CiwSAf5f-*p^DzzVmQU?REa}rNbdzIN zm!y&q#i-8#L`@Q00X8Xqp*em9Pk+y^KSpBgcMBpTD@#b}~d5@?-hHm#E1SzE~=b|wOJ$26YdC^fd^mOJc0X46h;Hcd5-wQf2T2vSJf zG1w$YFgIR96_}robV942eho;iE{S=U)P+Nbt_SfIu7hh&J?0t(fbGLj@u}}PHeEYO zxOL2-gA>>Q2a%o=T-;vRfLvUQT^n&)ggpBURdP4(uz_YC>u-=S0WlYM0@wEN_VoRJ z?2Bl$s?JoWKM7C6iC@3};-8@~-K+Cg@4x30<*VO$`wIRduf90|PcUFQMqaLd*s124 z;{i(+i#vFbnzrI2w$#fA*Mt%dbm`nN;YBcuE#FB#zPPGg*A|q((Tiy-#+}X@eN3UE z?(DWQvDalRcenTh=?@UDMZLM$n_Yaa3r8?U3vk-jg~|0m0h&1-aLi7VM(M6*q8O*J z55Q>hBpUMuc-1D26xjYeC?Ua@mXg+tmy0%ogk9j=E^!!+A%;9tiaC(lW@Ql^s%1kh zopHI6ccdI^CC0jAsnetDmdq>Jv^Tvti2c|^BP<(*skVX&3zDn}1CeIJipNgV*1iPR`ONkk_chR5?j(QZaJv`d@_)fBp8kUVidP_~e`aVuCa-RQcNH@85m< zA^fP{zJu#P1NOgr`y!YN$twmhCT9Z)D9i`P%o^(fX2@pRf!jE{at%16mfG|_u#ihH zSR>16y0z^={E=Q&(re#YpS*mk_&}S;<3D$;*f3H7HrKigS;qZoJbzQO#G5~ewZx}o z%3dv&0Ts5GF7ta&nDcg1>}?6OUJ)+#b0=^cRw}l`Lmh*_&3>uz_0Gd_%*rl7EcPH$ z#Njkb*LUTLYD7*pVQ4_i3`0GDe9Qs-F{M=9$LzB3Gt_z{C%iHi(Z$+L(SzU*4VBKd z9bdRLzRlh1E3nX=wI2YM$H^j6erN>G;_`&xx_8dlxv9iiiDJpN?5(e1C_|x6Gf%l3 z;5^?Rv>CWF#deblIPZiQLzsMGV56yrSy;Y@f~9{-!s*n4148lXEvzLOC%7}6;WBMb zjFNEW9)-0658b5tb3Vhx=ZulA)z3h95G>e~_QzHT*~QkHRPZd3h)?Viq)o-3Q);$z zJRo2h@(1zYTr`*gSbj$Tgx>_7bU0Qm1wUD=pcs2d5v-(3J@6})#Bc(+27w^9hMz4C^ZgTHg^&{Oot$T~28;es(w&$P{mnEPV zLnVO=(tBarQj&kUClw@?tSC3CB9*)$T`p=3BE1B+Y)!Zq%LO+8T6D6`K}xYNDPbw^ z?tc0-^jxFMCo@H*mrDMHa=cux^q!c;NjkE*!TgUzWa%xzWSrs(@y9y!TQRuhfPE}8 zmoYt5i3qnu?zcmg5b9B+E}}f{czIw>!Yz}qpFo(h4RveUX18t7oLC-=UbHGyYv;{# z!%1sE>2`F&?j;3R%f@tNaOk2seCdSH0L~b!AfD9gOKRyRXJ;K_iLYA@KK3a9RxSBh zqifO6Ms!*5hiwIdX(LE{L+TF8f!RvbMD%Dnz{yQ1?}4K=uotN1hnqAQH4+yaaUF+nIzN;DL=wMZda*6cFIDnm`}rIyH#Iz%;3OL!Vo3a5Mfn&DVu9p*0r-}ec&y%#vD=DP*}8;f5kXHZEgrEXfbUXsAkhDLVCT>krv#eCmYR0%Ch}* zt}Dq8^GF3d>;ZHQ0JS$h2YRO23`qf3IqIUBmBxvAQ3GBO+S!4z40xp5qwHv7I2ek- zx_L=-D7`#ek8UXT=_w+D-QN`{r!$=576j}K1Hf| z8R2KuLo#Z^>K(osz@3$Q?Y{}%D0#66uzzk3cNd9&sq)J)bSvVg`V$84kh}(#wiWr# z#cjYRUsks$dKA9qp%5Td!Eq9=1>S0hhqP(-sjPA;4TnzHvQ;2{n0*3IujM8g;2?z; zY-e?yEbRilVZtN|D{LZRp931O)R6m7%kk&Pl~r9cdN;COf+_`oQ0&J8#sgRPI_R`7 zGB~wPg-RH!dSoJb__2J9o*!`F5T-t)3oJ#3Mt&Gru}_lRSjzzezOL!{iC(_#Rj$t+ zNn1d34%tOKKOFC84jKj@-!8#t3EN(w~*ri?qTsqBp1lMqZ zh$HsZlHY8clz}FAVQL*fWwwyjnkq4VuXF^fN9aDP0}xy2^Bn5aS!oY^MsZnn@kTlb z59f&Vb5Kam$nDZk^M*W!b*JN4(~S@plRGX>4s^i*-7S*nX@dk(D5cV!Enn+z-r_EC zVUWY97SJMFh4dK;Z3c3yR9UegbOO{&u>5c(D zW)H82GEdYB#F4MCcr4%fN%-dJgY>iisAHzLuR{3?9q(svU)qrB^x;3feIHU)^7k+0 z|9=DdWBL1MDqSTPWgz?Ee|!736nG7XRGf7yn_&rZR+~6GD(2xJ2R`J)Cmv)QyL&#D zQ(<=NCAfH>Bs)KLE)`KBK~fUC7&%fX=u-tffl5Gr_}1I64>c@+`>bl7VD-x)0v?98 zDU{fsl2q4hqc6wSMgk20^Jbf=sU~f)x`Ea@qOl_YVyd)rf-e(o7Y1P8MogQmK*qgq zhs?C~50KB`piH$`g%y-bX$g{x>`l@fcgvv7i&yFO+N@* z@!3G`Qs4LS0ns)`MUFeAE=HvD16JN*TXC0)gbKAy z!?Ju}azqcO9-#VC^DhqA2TWkPk+CsKP0`V{4c6%-Y&iZ)!`*YrC5#LDWYu$~p=bmp z+iLRjmS-LJkt}oWHq{E11m7;UGZ4#GT>(cQm$ZkA{Mc?aHxsX8LxE$;lvYMmNyBCu> zi*59lj#rn|0W!?WmBK`6?i5E@>q&Ow*@4D6^Vb%6$qI9OSBc z1MHo15uU3$cm#R4DPJt{v1*}H9{@d!1D5o)Y#v>Jclu{2f9dnD&iZ}nIPHAQT?@O6qcMI!c@o92Q8I$TmZdtq z>}{7uJ6;SLQLd%>XUbV~n^cHOLfV&3tB*0)%e)=@$KtI~{sVhP-Umu?ffv^#n@De3 z;%fO`o&a@86&Fy)OA9UOQZ7L;pRI0O+=f#^8j@P>_j|*J1nw$Ta^e;oGt(R!aJY2# z4cG2mdO7_TL($rQ0DgyxEVUlUQ=0r9nxcxa4b>y9U&S4EkoB!{wZ#9 zrII1hO9dcQ6jSbKHgZg=Hl@E5HHo zoVYcvPbwofDU{B!Itu*JyL*;gighBmME6<{bh5^#8-N^HINJfD&n9wPI7HwNp|FPY zj6;<6bUD9BQI(g3(Sps!G4I~xuR*=_;I^db(G0!#Q}K~3$Bp;8@~VvQ452`Ioj9}Y z^K8&$SJAzZB-ErW1_LO|hZr%HPJNh&RRX}B2^c$5?|`bTj=AL;bQB8J$^mLPzZ9e_ zhCE0a*OcJi(Wjo!E~8yj-{5*ve>5mZDh(47mc4<+z?PPeQodtQ<+VAIhuJ)d?8Gk6 zRx)aH#nR-zdtOBQ3G%D=Cs)N^+7|2yIsX~7e(aF>Pj5dD=m_}e2l@z4BYT(ReK`C) zYT6da0S)n_gV1%yTHgSaE!vE*m z;d|P|rkkaDk6(%0X(?~eubQ1wT`QV(J*jaCP<2o{I8I`?V;c`tZ_N_d$frC8Uer?0 z_tS=t>*5P#lDi(o){CA)@UgQ(!a@*^cauG#yTg-KolN6kPExI11v!fp z0T3@MHcFpbu%XjKP+aR-0KeA4#7%`61mrOL>AHu>7tTC zTVL=&JXGy=0l6smavvUbnPsSg=He&FO~ridQo6kL=4J|o_hTF4bf~mTpT5`*`HJeV z-2sum#7OT2uu)Lw$bF0HIr{gdV~3#Hg$+nVe2gXmw3m5RY@nR|zzv@_7)81uR~SqO z=-gqZOxGrP2cWDeIVip0ClnD;U6YlsE4dvoDGNxzNaaP3#yA_mc81;w4}Tp9sGuuY zn8fTfskYTv=g{NLO^wiE5Q1DQ2{at41~_T8*m#mPuN4+=n-uUsUo4UVR)Ncz(NYwN z>A*_4=PJMq?Ki3R1{l*SZLZ#`s<$c)lqb*<9=1$B ze*3;Fk(@sK=VHI-P4|-ByS(t%N|}& z4;7z>LN;N&Ywn+%an_NyX3U$r`~K5PJ$Bf~io zURyVv204UiUo=7oX|p>9*jd&@z*0Wx=Yi0Z$=!q&=8WCpU~fkcxkzrMTu|fCaDX?q zoB|U6nQG*HLt~Y2$tz^J`b;vK>)c!=Pi_WMxXK+GULggUmN8NvI3#qw1ekN2=Gl1%uj8pntXYE$9l(mm^MDmKH)hLd}EphxR)t% z?~tVd-~@v@DN&$k=g&F~6|l`E&LpAAXW!|cb;qO&%l9~VeHe^ zgRe$d=1{U$zalSqN5wp3NrY0Zr z9M$WY*K+b%=b4paZP7U2p4Ou}YF-9_G3Ce1G^~J{n;irrBmr0Xv>wS_jAmd{3SD%` zGmXfkB&c?&0CVenQmL#$Pt4;Gs7ha=Zu1fKZOn2<+|ps4c#8l5kq>#r=w>2tb@;Jn>@uuWTTG@T5p8PlJd_GGH zQIn`$V;ctXbrK;Gy_T!FYvCqQcCeN);htxM>mGF{Jcp=ki~66Y;}}HsT~Q(dTVmJ6 zawfJ5QVb~O;6+8~NgZ0djR4ZCp14Opd@JJ8KMZfbDbIfP{`+T^xKqYUUz!O_X^-Rvd{w}Y|+p%kFXA>dk>`%+b2r_rWsTY7PwsclX5F9 z>Ly^v|X5`4eUZbrTMOv`eHoB2e&tt_)%drd4pT3eY6ZaxmqJ#`N$5<_|QFF6((6DB;5JB=FT`U!n$deoF&Ekchk8YI?}r5j>4RFS%4oMc4n8gR&~8CbWd)2Vx@Z)WK)7{!hgHSp} z+8IDMER9YbDnJL^Vtz-gSQCzz#cdDm8$dYam#HqDfw3wm14kWE9SxcsnOH2nUHY8a}FwId_U`Z|t=Mz4cOP-#_ zPCkEJk_wu*1jwQzb=J`}^l;0i>VeKr;6NyJ&aD(*%faZMz;0WgCbj7GUo)grc)LlF zt*jOfr{F3e%v}_~iy!V89qh@O;Hv|a^5vao_^p*Uo6@bH? zd)s&L&FOo~%h%YVlXo&gm8^{E);r?}*=an%GqgdVS(~mTDLG&q2zlTj5$kk?kk6;9 z238&+~hTnx&k zUMeioK|hF{vzLPJ3##HyW!HUyTr?aT-=!~Kt?N{Y{9bC7PT`yVZr~Hl1tg!TJ+Pd* zoGjPijFSsBC^mTs?Q~?@-@W}RJdx!;Baq9ak$w+0p{1l9gE=BF(GE#0-o37rI8=lN zSO`9!+Msp=+W50|Fs5@DN7~!34o{VZ{T*-9n)++Gqhq^ypD^MQ>~Xx^wJBj@DJ5E(2PbCaBeENOUc zX;2li+qmW`>gie)dO03S*asQ{8m^U8ib;NAONE;V6CE-Pkn~C1Of5E>4FOJy$q2yevr2pyky7gy}s>?^eC*Py&b!e7~VcjT3$)X(g zh_@q7F~gKXamBXYM!5)5z;uYsh|)gA8*N$SV>qLADi0--5Lbz&S$?4fqFWrugZ|I} ztD!#I##PD^gP~%UQUnG77?h!r`^_DF5vj5EPZ?)0$$Th4LEkCyw)Ify^)D8qHusXA z0KRpF=t&(!964E|MIxagzntY!Ti&|jUu0|x$h-$zA45I2lx_Wn6^zfCGV%SWGdpWd zr21UdvW2BN%$g&kuL_q<|GogPA;sH92boT3Z}eDf_Mm5gp&(E(Niv8CR!= zU5eHpAGTeiWxNwfr1Hh9g4Xz1iBOhXCE3f_N%R!cEcq`fxOm24zSZbZT#A`SsWBlo zcgDOtb6CgMQ1pkFBz38A_(T3l6EBAr@MX#5fx*?UPY)fJTLrv@>o!zuQL0&u@;G!- z*-I<1tE?WY>J{M!r#_l6vv%*b*_F`nmM#RX#!Fc8>3=LS`1b@^6?=zYvNHbMo|Ojn zH?S@J@ZI(AdUY z$*&#6zUM24LBO5A!CY1+P)M7B7a+=i;+5D4=;{c2&Vr;vTT_*3jCUnYa{r zm?i}~Ni-9FER6*i#mVk=2nf9D;$u1Z3$Q#iVqi&WDmfuP2rw>Eb~}0PkPQLN9?h)s z8qz`Ty-Mwcym)scQ%%rvpUeLo&!pQ5J8o_&nv68HIeBn~>>G+>LaxEj3WO-B>s-e| z=AxJoVi(|`yF)e_wu7i)`V^PVSqFV5?}!xfE)EEXKg!d}%NR;}vYJ(Dcd}{2tgOT76NfsvS!KnijIEyRB=@Xdq(3+Fa%w?A@=t1th z^Hs#x3rh^MAFgI0w+PWhI;nr^&m<#c_?7}L{}dJ!lKJiXPYpu!yXUWd5k4sov8(Lu z9C?N1CctBMa=)T*D!;`Z9wn+Dzy(JfqPT>Zz1>KU(G+^*m;}HXj=y=MDXzlYv|f~) zmQb+*omE3W!`%MTb?AR?OS*S{1D3)SXnJ8g3ASbEti*PG-Tc-_HB}G^bx=(V@PX_8x z35;VVshYvcGPOB-o{F0bED-Rz&1|9d{ur;E*WpgQUIshfjM%d^pG2@jGSB~ z?^-Mbp&0|*tjX8X9hRa+PMFZen~L+;A&r3y3Ily36yq>dgeP>+Gqy{NjSBsp3Z9U` zF8Gr!hH`;Js|@%_1fC^bfC9+JQp29vv0nfkYtSKEKRBrJ*9=ogbvZ`*0y=3_` zg0DoAGHDm+z}jOBa)~Eg$|h%**fqCdq(o*)IlDWpOE=^P@R3t+iQ1@gYvmW-an_>Ihq=+MOX{hjtpS6zzp;{f;0&?lN?y};v$z3C+CKH| zl>xo2F#QD)5*)xg)d(*gKB;spPF3dAkAPNHmC$LryZf?R#+SDGyg5Hxjmkn=It-S` z7DOA;yIz|Lr`w_hg`f462`kz)az=|Pq>WD^573oV%5SFSpj@|v2Tq)9sMsN|J80|_ zHeq>YjB?P-n^v+G!Bc|tr=&b$mof+r7O|b4XOSqu6+*gpjmZS(wVz7#TMFyZhFHKt zZKSAd*%P@YTXd>P>@q#HP7QdYwJ z>oYfB^4@=B-uXMJD0$(}N^NPnYkc&Rlf>aaz5TxY8J-^iu<$cL5PovZaN*Y}oudjQ z+Kv2Bl>@heh7^2q7=qk1w`f%jraA-UQc21M#46vo8d31Ht0tz|x2s@7IbTt4N*j(Ew zvx5$mH?$Clr(%s#!%~9-(x_9Y@wK)bWHR-K7jf>1A8cydk} zxv6e9AdirBjavxN*m`j9fQ7i{5n3BNPJ8*V-LD!6*p{-&^L?JJoI~B8&{l@D&#q@v zXUvG9nay)!h84K{l5($Aras$TfajKTqzVbctN+K-s#LU@e-(s|z zB#EaZAF3M;-&gvW46Q$=o8yHo}W0g*Dy(SywQ-iNxDhpjRpWQ zIluA}&fDTMq}Ar#Fcp>WsfZUWnt@i8OWRYBe5;FdX#qUBL~6X3&65NhIz8W(UODiJ znDW8Jm&*jzjA!OX(a)Rt&%(c#z>*t!Img}bML3eccrl!SRI;Y%aZYn<{{qlI4_lPT ziAjkI+}V)C$MI@YRr#`2ibK`% zLuS)3g-9_S1l92-%V$;~w{F|g-IPTa;nur`#hVf-ggYZ}s!I!O1Fr6NGc7wh90(t9 zf;7XobyEtRg%fTWyMlr22<0ij{kTr)E@(@cL2*#nP)QEjhA#Es$T$QCgKhWXg)fIq zl3Za`qGj2rXam}ZF;8!O^ptiB=W?F`3;3c;e~QjY0jl=ol&e?YK&P#M8beed@SYZS zI#i#5Ork?CdItG?ROk)ORL>v-tSSJ}U@dEc&}MTXRCEOx8I4nH0u9e)~Q;+aJCEu$0Ggoyku7X<@NIin^D)%&nlB5-M<2n;* zT=H3NWU{?&nuO03BaAaJTN` za>8zZ-y4fBUii`EC8a z*90MXX?{rElv{@KrTCO#^Ih-WFVcx9dDgf_@7z;=z7rVM(vGyFmI(R zBnY=JGqA%FQ0|o0nP|i0gGZdBlHr|W@-zv>%U^AbA=S+a+*0XFEyIC~ci_#i^_6ht z19!lFV9jD_Px0%$+kZZT6^2dPH4bEFYzGccvUEGnPIbeOf@^XpI0E*7?r0ZJU#?!o zwd@+Ln+aNX5NOi0wknVja!a7Z~9-!~?+$4wau_1dOB< zgPC!`zOC5A1ZY(+}(Jl&nU`e%twOl_L89ks|NgX076%I`;+uC^>roDDjm6Vb?AL1>a!uTrP(5-Muxr5dP zp}R_7fbw1eFWpYrmv(M-pV4Cw!aR0IQiY$p+;>_k_Sqx>h9PjBXeucOg&uOm!?Sob zxFeDpM)p)?*(l}3Q4h{LAs;~t;hlm&g9ID+C-M%Mf)OEi^7;Tqm*f3HRE?Zf@@DOa zL<=32hgfaF`bjx-&goQep_V0Mv%?+E6Ja(!W|u8tLRE$v$uaE!+4v!a(dDuA2OGtq ztpfxE+6aSP+GU^yH| z%Vww=QibRIg4aSfP3Y6n`<<-8!sVp!i5y0_Ip*u;JV+NPE4~Ia(nJ)%$xL!r>~~HF zA!EJx(0J;AQkM74W+E5Z(+y%7lQg5qix<47)sr1D5V2$CDbAeD~B|B!}bvUmXjV<(+vH^?S|_&Jfgz>sFt*L z=%sTwZ>Lm)OGC%wrjS!h9Bo4t=IEHgA?l zrjDQ1l-$%bPu($ymeL_pGei;ZQV>fo<1SBL>JO;f?u55x3~}7yVpP(Ft7_bwT6>$q z*$}9>J7ZHshFq8Ws!76h5dcJ>qa|ReV_xTE7#%76PO2K!VZ$HpF22<2#5B)5h|W=o zkmqDYY*N|QL;;ZG4XU(Lme@7`bQiXT0N7xT+$3q}u|2LFbs9-|h1bj>f?P_89mS}; z?==H(R;dj#TI#Y!wjkQULg8W_3L*x%fEcJ0>P5>aR=N+C&)-WM5w6;uL>JNOjGs?XYVar@RwxyIN7NQ?NHY5U0L0&%#lI(FGD--EItw*{wI4O}uZyZ@$}fNZ{D zQaPE!R08*TF3}08$`V+>u9wfXJkE#^ceD=Bb+VvUojyyKQX*n?5DE5&O-#}4x=^g^*mA@( z*e~@dx?tA73V(XUu4C6K0$kD{+@d{}pZz6j0U)FuPX$f?bG(tRW>gB9e%Hx;8PWVRUjL?u|CeLtuI zV@d*{QZ=C1$Qd^3k;CbvF!_af`9X!<0pHsB3Dh9uja3b3UdJ{{r9Y*oaJ)KBgV;M9 zXuNm#F1Rbrc!;;*K@GwoI|evHN_h>j*dxnJMk?$u{#PjTY}^E)>KVgc1GiKc!f}Da zkW{|aH64HJBDLi64fuj~39Jy5?1Vx|k^q0-qYflyvPZx9&G5}n3ZC|p@aKR2d@}sR zPln^!pX0nR8rYA+`%m9L)2}^Th6k1tYiPDAdgr^%zUSzwP*J-awQzdLbItsKinvdT zu~lPI%y#X2mxt6pKH6Ef@Y*G{?vUdedT`$Sx-f$Dge_P4s_g~Bv)hm>xI7$1^GHn< zWoCsm+$}R}xo**|=7P|~F%e!x)j`rOt5}K6qqwi1jmJN3x;Nx}USfUdAi=AgeGZbw z;DFfGt&|4s1@UL3dLL@vX@Vl})5x|57&LjXVt8{?BkL#ddLj0^?&e~PQ<$%W9a|Bc zSOC~uHYGp9*JrY5gq6m*PcNOE4VJmf4m^7r*JH&VjX}B_^~dDC7RE}us(Ve8(L$1z z*SaaMsVUQcfRHBdPoa}9z3&P0PGVwUyrpnSM zB8!#_5>tQ+NZC9&>_^r-bV2t08|l3rF=w2({;Fwh{G zGCoPnDE~_S3k$EU!U4e%wDKpZmbI!$K)GJRK1$_f&1`|W`UYdsjXQa?MzHLC0=J|p z!g>xiqp4!5t>rrm9JFAlfbF7H%xcBd(l3k9ST0YJ;{QzRMTgC|F0oPv12c@AG6P^Q zFTL{ZfvUkhqEoFW`sbhxv2t6NCp>U+9oEzM8m!foBO6__#RgxG~4_z!}70+Zu`2RLM z**|{&$@1d!_wNJ=qk4%iAu@WPgNk2-$o=1m}H{@O;Hj%VOt6ml;1?`Ry)|@?9jkU z0wW^TEH+ogJ=-O4(G}4n%N|~L%i!tQk>Vh~A6VY*$yjnN?x-D)Bg}+O3yNVZsjz{9 zFz*H2n3XABf{BL;#zG^Hlt68FxdG@JJ#D?txHrpL(vhQ#@7bRN+-m?`Py)=?U<$(( zs3Nx*R#Bu9@)^np{kT zX=J;}XXUx{lD#3gME%7UPEk}JFw=Bg`i{Kys_LJ5`a|fL&4skin4MUkU+2Po0p$Dc z*4IVq2*4o93|1LHZtJjd>Jj0(`>-36e~S0@)h1O`zWW9z`NBNbDi})z&N?jCkxI32 zyTn(mn`=r=J-5bRzW=y9_aDRiZ$JD;Xz1?6u||HzULTAVt#B6|liic9dMVm|KS(pk zo14A;DpJ7Vid1K{;^S}d#gVsa$FO{rb3iJDXGSF^V=bJfJ)+de1yM6Zs@}gm70wz; zU9qv?PJIEYp)!!$a$qPYDU?dKK*CS(dKs@u-#iZcG10eYte{VN7>G(@gsuwV5yP@b zaSFqvt#=55VuC)3P;|PEPFHDHE&sS2|s%ma_X*`Oai2Ukr8 zOn(y(tqu9rA=&XHh0uf3ZyCABgZcm&Y_mG{OwXHR_{{pNu7ZCWRcgUD0)MKfDI_Ss zzSY8a$|tCqyae2+{v6cwYjT;3`YIFjBDTkW8vgWu(2GyPpO(SatDJGKs!_MkiFR z)Cn`ZW~)fy62%?ovOveja?BaS&vF^sQEE@M!j!*T`2w`xS7$It&W4|gTR*@vtjKJE zmQTSD5IKQN;LP|{zGi~dowQ#H|Bjv>)C~Z8EFa^;1n-te^zc*#KUKriU*&8I4Ul%Q zR5P+Ps8>g?Rx=%@m6+(BLMDeE%rUu!}miFmRa2eT20m zMa0^UcP2Qy)&R%BJxjF!bfF?x< z4M7rFdIPow7%W{lik2g~O(cupRqUatuh=t%&?zM)QCt;jhk-Pq3SPK!m|3=z&u+>e zGd(2_e&l%mGiccU0|v!E)g95d!dsaa?F!qooEQLx!mYPnwpLZRpimCjqJD$Chx$5n z8(yACFF@7KlCU0NGPq*Fs0P{Q!8pwdq_hfi0{(5@#-jkmh;7A8b*8S~{K78EB3d_h zFzzsHM7)P@+; zmAXuDy(4eLa8ei}SF^g-p=Wihx`to*I!qT$=RbR@d?$7`pA|jnAMu&Lmv}7Ke+!o< zvt}&mQ~IRkw5RmCgQLT4Qtpsi!ZgyI3ydvrX)V3ZB)Y-qN%IE34-21R$Rqh(5(BLC zR=jO5jPiN-Na9{?S?G76H#pGqYf0QBKP^)INO^zZ$0Y}!%5^T%0$~pu20Cd--#Ez| z>u#;V2wh`)i2g+#L=by1LpW!QOx;u2=$@t(VqHsQGpRIGmw+lHK=@8sC7frN1>aml zXoNao#QN5nzfn!cKC<2{5e|~34J}6LX$_EscV(pgd4H^@)b!l;Nl?o>pV(-HTON3a(Jp^}8XFBAIh637O+LQ-))Y&fqHd{blz1$C6+EYa`qixE_W zpiQf!dpX4O-Qs>$g-@sxTV4j#C@{?fE+Sc23Pw2*9tJ|x|3->d`5ZT!x!f0H~R4r3CH_=`TQ56fFUgUR*^88uXjJ zZ;;(xx>}_c)JM)jrviT6mbuvbd2FNa^^sGHNsf}Ym#1WEJK7Se-;of0|H%m&uH$LN z5F@q}E6DQ`R|qxX;&x>Z_bFL6D(I=8U8tj%y6BMX637P&i183{hbA>f2LxXXxJ$^* zk@K%R>|3Ci2w?@ECxdxL#->{95Gn~PH8L;dSFZ^hOf0;WeP>AE2>E(UX;n*@rf6p# z1$n}!R4$u^%eip}EPb$$E~2ww>&e|>OH|yITXg26oKA7F>oAym-B9rbNi`(pFIm*^ zLjf|Ek+U(O_nG3!x1E&^;7khx>Jj;M`MoV^f+Rw?VAlIjBkI*uZ5x~XtB(tT6H;W` zYQ~2%SoF<2O4N{)Z$7}So7B_tj6_zLE_PsmGseL&x>2iCFY!=DyAZ+;xAgc*XXU|y zOl|58bu8&j-#wOiS=X+Rqy@de`&)HqK z%MA8;Q~{wfn>0h4uOR#E3H@Xw=r=n6u&b*%m2`X7Zl}pNAcF1odt7p(P)`3; z%B*U{4j21C_@}B)l^s7xp2+BEmW?~wITY}k#XS~IauW98rML0XqMP0uJxv$jCz2A@ zIKGwY)4eCUNpEaBL}1vcmxV_DWZ_b-urwWbd8J7*it(iclF$mBNGx^!wBhY9V3 z;|gnC;unEPV4jf-wDp+kk|uyQ;Mnhi_1$_j4M6aQxQ)sC~QQ%-TVce1-jq9UhV@j&<|}>V{^PTa3~; zD@#7ry#Vgh4SreH0cot;h_b z*e^^ZVMR{h8OF?)P6bQJeoaFSS9ALeQitD@P6Kv_7iB@EfL6M5nO+raJcgD~1cU_IysO7Mi0FvXjw8O* zo}{=~@xO8|WgVB*d6vrwP}%>7vNu_lCb`bU_W2Y}ZknPsp*-_+$jFST zV#vIC7qo6t(n1@tcTKGbR29ZTVJ-p%0x-M(#e3;|$Io{>{vz9CDg*u-nRm<#_v2^y zhW?xdoM^WMSsDms5?LZIWif@AzRQxM(4&yD`9Z$y=-y$T-cVo=(FCw;04u|8L)K4r z7%fss3b{?Un0_=`2n?u+_(=v_0 zu#2~Gg2M-_A3JrZTMU&bY0Us5$3^a)Ewan5KXU`yW~6V@MGj!dLg{gDX}&hS3NTbQWLSSvr_ z>JPM&^vVs1by^e`7Yt(z`cm~OX3OTdl1I->l&a#XQ^A%5^*+I0as)v*a!sm7?<>dIBMh&V}rxu|z2RlJhSfJOCh z^QF8McOzRR_%hE$lV{p~gf z$Z87_#(1{H67*@Hoh=3a7OuO4*b|Q6l?VX|VdugL!^o9iyu!(M@LQ~)=bo?7SGh1);eM_d;N~ZQH?*Gy2R}7;ho*0k9KdUr=-_Y0mNHz!+LyrM8rTj! zFz2y=h@EB#oJ*41js}ESZ=n2<@3g8P=1$c5^dOQ)&Ae#8_d;+rxJgu-g*n`q1$3OJ zDtVua3t+-;Oa?U1ke-yKJ5N&G6k*v}w)RFq91N63=rHA7AG^593y}({V>&U%(||gg zB6G0S;6|_HJK1B&^Zng1F7o~o_Ku-kJmUf%!|t#Z2|g#hMZb{+G+yGJ8nNTH*Kqct zm0nV{4p~?CMBWA1&0T+j?t={jT}lT));9K#X&cz&wRG!7{)Qe1PvIbJLcxdO2{M&Hy!7U?Pz_XMy&tX-2TtUxcerK-TbCo@wE zV#_u_H6!+-!hB)NLv?8U`i>4`g?aX5D|PyJiIsMweTpelbjxEBWqZ3^y!0V4D&?`vTl^!w|L?XR2|KwSF9CD zg?$4l!F=R60^zYa;k+guba(JUuU@y3+YPV&xTqn*{gt55Cdi6HU(%(SZXMF}*ihnp zg^T0nuf7YFH8>@^u_hp-aU*ds_u%dXt-OmJl8q2&$Av<2VcJh;%mYoQ6}h)%M9JOB z8cAKf`@ZZ*M4+dbmP$QG`Ucv`c_a8&0rl<0zXk1N1dF4ztu5eOUG zW~L1vnt@^NX2;QKXO_vgY6Ndi@Wj|3vp{r^jO@0c_0XtYwm}M#V-3RDsMW~4Yz0FL zfwlUKvnRF?u7fi|K40}GyV^kp zK)|iA?=}D<;1rA2f5ESq@wdZ(Fu+TI`MK=uMGDzbgJ(5a|E1OG4f}SJ%3jhqw3TQE zFcLP5J(F}Yyhjv6-pkcts1hW@Us>6KW`pt;jP%h~hRBVcCR-D_hTc&B(o=yf4jge0`}Ah4Oh$_&`EE1M*%^?4Y>~Gw!sjwjr++Sw^CZG zr_dAnMvLL^Rz>(bEi}2e?iy=CpJ%XQfC7fPw;kIBn725Se1anig&{}f5-fX-#d~Ip z7ejxzPv-~eIRO(f`!IEoB?bo<@;ZS;8!ZVKU8@G_<%iN4?FIRw)S;Vc5dai+yM(u< zt8_KmGv8MUBX&~;PN}j40}uaUlG?cq>?7YGEo~D?$#$$RuEW!=P_#|HyRn53rku_1JvW7j;`X>N{VDCy^L+OV1XLiJrtU-(5a+J6xdjNN{EC) z72H*{3q6%9gqW)dxdHGTw#zX9)SX3-(R!M0T~bL-#+VutUC$U)t*^eR4pFd?dL6Hz zf2tAuZlfd=)^TOU2&>HjQtyNVXva^2EB9KZULIg`1|xP#8YM*$Mu`y?^zh~@)j!x3 za`p_W2uCrw%-DYanSHb}`O8C^{`MIR7xKmL56`}NTmJX|p4Z<&`8_A~FZ#AVD%$xx zqFbFmoKSWL-LyaL@?Vhudl-=8#)mDt)P$<8{SBv|O=&ENX));F4i`#F!Yr+K6^oZM z*lP3WMx2nGEI3}Lk)jc|oRpXaHNpscvV0ta-q7lsoQH>$PnoO>H&4N^05kkiAvG(R z@!bngsgEm+i4Yjj7q@-C^g-2C4Y@b5zo+``?6E_uv#9Yo$9(AgmBZw`^Cp|@8K$5E zY7@Hrg$FOrHrj*oR&S7-+amFKRQ88Su+!yeWuNqRW9@#6$X1OdwyTb8z8)=rVl*f_ zr=Q?f-x1^+FOn`>Qib_2YF5j)vaXOF^_Pp)MVF-DL632lB(KzD^^3gy zo&dd4Fc!k4BP>om5mdbf$x5WQ1|qr)J!#{G**utKHS+OygnjSM7TraxXt|UuCZBxS8xXTIK?wB)MOB><= z2Cwo_KFDxA;Nn(&}s$iner zTqiI`HG*l~gSyHAe{VPBJnCb^8;`rnoi?ySj5rP#HD`%mGS6!vbp5 zwv}=pbM^)4ERXj-&o(I=(J3~uff|cFk@W~`chbZWe|cuj&hT9A=!DiF`vQ1x^KOJf zve8~|suqG>ZsQgy3<_Nm#;NRw_a>eQkK0*^U&P_}cP0Ol(bC(S*7oW&G!lQ*_AZ*B z&^>_nk(uB`fyAJlspmx!fuZ<;f|k{kYV@4QDo8H?>0^Ug>aW^;ylir$!XO9}LlVm} zw-X?~xG(DQLsTD_P3ehbUn!9zCL0 zC2H?B5{lHzO_OR2LN1`cD~~>Zs#^-x7Dtaaj$(D|pjxw>{wDly=KCaR$X_v({pS65 z8G`(?@{DQ6{6Zgm%IAL(-o8A2`1`j%2K=MX-a~IWL$dQU2PwQO)4)_9L1AtnBFWj& zxMWX04YQr+D>`q1@I_@_M+zkZ4oAxKdiKfyYeg~#exeEEOgETW4YOUv4^8F#Rmwz{ zWpVlhq2EH$J&<<_gug{A$!QTsUOg%yL{oKThKP9agvk0u?*C9rzV7BPX~c-%&Nb{U zM$-P^o&x!Ly7559Wuc=Q*p(}2;8J+Fs1X9upwzd9<1k?TER$EO=}<@7Zw-1wBJi)4;~Y5vXT}il!(F{3J&YQmYLP)4fnlHb`aw7|_!!RDNk4AgGnm?L{L7>BeDWh8asFVg&nW?7pn5w z;(UPx@-H;&Ru_^4Qr=uRgiCrB3_iwXm~7ImWl;kG%PaP(cbTQ^269*FCknbvYmHH0 z^dfXrg)nO{srzB%3mr6ZU`uRJ>sDvo575&^)Qu*{IMfL5#bRyqIoU{v%@Ap$g?>sn zkSNt%P(sXPs2pJQ@|Ci~*HcDT=~IyCuBh&E!#kt>trSV`zonrHK5rj_1zmYH6DR9{ zQn2?gj{vcg_>ir9xv)V{{%Mc@RaEC4!)s54gYEX}HH9eE!AEPczQ%_N-{(^44Bn9ctDPW_yfb}23 zeaf8#S4frU0zn!!21DB>WdiN;OaQf}Y%bj?*6P@iqlkj)fn`<%9_|MdO?`TvhHE9k$! z{US#gaMpK7F42Vk0qd#FS$vhU3ChG^u^jLoZAMxo-$2Bb#8%#$r%IJ;>vb&cRN3X{ zJ{4)y+1^cPO!#!YC?lYLxpy4q^+)ah6~pZU1KJkbKx-ZnIfqEfTNEM)O7=&L51>R!51_BeE8Rh_5WMg4WWAnzc&%VQ79b0i=g8qM0G zu*_MuwFES4Ni3i*C;*Cg5l#2{=lN6-9x6C2#!Q>+d(21ju3x>km!jzxg z9E=abI@D^0QyfDOaHzj5C9=}ca*&{t^FbJ>S};(8RiINJ(gR8m5;(xLR@Hi!Rf1An z^Bkk+j}c;j97_UrF?eV(_{Lv{|0TzX|2w?@5WdT*l*AF}%Zru5FQGYhEr95dwdeB% z`1hbODj$tdtiV7ioR|?mx&+0fwZ4qq_G&ls0Z<@hpsZHCcXAI~IOIuw(x;QI!X3&r zbmz$CI{kF8K0x-SW;@zE-a^*;^}t|ze#3mwr~ZJR6~ylZV(@C(l zjuPagIU-Qg6?&GP^rv?OW5v@d9kn-%JohvrY$gN$fAb|YeWm9odxFiBh;v+mr3HVEsSfst^$CN}`a z<}gzCCazQ(KnXayR`&05ke@?^9(|AxWhhyFqt56dxy0ZM|D_?G7LBqrAxU)MkQ>Af z%T(FWQquj~HAtODTz%(k-LcZjv{aVh7kY~?Dd}tQhcG6x;}oVR;iHJqw{rP)ZyB7 zl5jS##TmEgu!A)% zO+ha;+QT$FT~b+=O=V|bX5FH#UnCZ4d96y$d*NXT{azOA&>@5D)+$C%Db2*$>2AV6xAW!j$axQXKA?y9Xx?k z3kS+^tTq+Yp@^OQC+TWDefVzx0{!FL*QX~;(ydF7B!T1Et9s;;kAqdnso4{UJbP$6 zR3Z517YN5&o*mQ=7RGasUdfJfD4<*<676vBt(BJ6 zlDamyN)Ekn0GDA$jgqXBDj=P~-h(pDX}(Np>|O}#k;AZ4wz0idl_`48t8@1nY*?R| zjG8JDQsAPFM92>NtK12c0u^N(Ax9x+pw#9!iBLW4VHCrPjU1#l*r@+9fK8DdS18Dw z)GSuLAq~{23T)JzDiX*r)|*g8V@24+s8a<~8>VRjOu{a?$rAqH>p^oU9E{Zzx$PEr zF41l0B?`o#@s?t8CZ~_>!NOBVI^r{|28FEUq8hzx5YOf4XY~t*97n9exsU$G7~Bos zA*(jWluwZ72Jh?D5qBW3+iu*`dPuSr^2Lpe_zS%-K>7Cq-9t`_e*KO?VKcZ6Fd4;KCYpBvkdyy*rCY-1 z7;dU6v%}W3b>{PdOVYydw!6k>(>*NrLdUCHv+7O1vx4m* z4m8Ssh93fy)Z_wvtE#fLd5a1Ma2W&d10m-T598mIEaU+XBYFL~mzP`taBO94w^%iT z7&Nh#Wp7!I8mXusc3mgUXl&1V1G?F>Un^|5!Z7Noxwu6Xs#Z72gH7wrwHazy(}Dzf z5Tt5SIihqxiq{PrlST#I`5B<#>e4WWXtfK4)jqwG^Esgj)RL{zLzJU>mR6avUqOC# zpf!NmI$f`(5ou#bLhFRV1ux?rLPq(K%DO^JMG7O5^FT~sIa_6)T7Y%&VsbXm2xSc-Lm=0jJ*?LD`c~+}Nn2R>YR4#LT zu`$P}AtmuR86@L}HmlMiIZRVMF@VOY4w40e=#MsZii}}qu;`q*^`)gLf@TOvxY@*i z7OzcswVD0O)WX*yU#t3$ChCBActWAoTOvB>rkq&2oF#6aZc5m*xd*5=jdgnotl4o2FOZ-nBF6Ya4M-2>|)MXYn6R1KCz0>)O&zOYPJ z6YTZymV<{Qrw02dXPOC~`@MyNk-bu=2p*kp&X95|Ug2j@A|+uN=}Cx^iG*NP1D0LH z?q0y+V#f}K+o1-nK+fOMBchaRQYqNj1o%PETJQkfni^@fq*ljxmq`TB;DZSo@q-sM z7~x@P4+HZNB@Bm!F7pk)LshLU$W-VGQR1gUiU~m~H-B2PDue{Qs+LtHMTSMMO^O*{ zl3+cNpIIucrw$`(&eODr{>j_g8-NvB=co5iDjm~Y*1%tbV*pwZB} z&k<9d;Auy;uMXuPU6G))e$ZvuQW36K6{xuPnQGTF*+tt9B7^88FvDG|k0pIqHEdvF z)jeHhLQdP+e!((rfN~P5u4?tv(#7=VtnJ##dJP?5s_C$CXIYW>^Kc=j1PX0f{!;sK zF3N)%W05S&Rh>-{DcA~$j~dLnX@r*AodN7dMB?S_?l$fb3mrU6j|=)>FKo+N0hr!YjK%snZRI`EzCt1f1DOgSt^$ ztPW9J)Go|5cRM+nr7m<@QOW!N(bw*I) zNWLFY>Zp|ph#!6g(ZTTHi?{E;e^0@U!6>`0(*b$^8sNBkQfmsT5XtEPlP5`UMw+WW z6z4YBHMr0Drrl90f@TB+Ob!e%Vx%{?S`J~hgLu(Z${4^DyfpG9L%Fd*2(@wa*E`G! zb!gA#BjgFTf}2<;wQ+o&);@43*o{Zusg!h7Z5gxNBDHsaMg?`jl3%Pj1^pqo>01=!0@wYhIBTH!R9b zN`wuJu%_uaa*@YSP2eDL**rB!yN5@Oj?=>7;0|2Dww;=7MpMe2y`VoDKO!eA&Xj9p zGk;>mWCIaJ3j&gdFVq670iIfT*&!;_Y7YBDR#qy%?E&S|O&;wGO(^lw5+yii%xrk} ztwaZF?pBb%lM<*>n{`eNv1(Ni7YbZ=QSv1tUSwtg>DU z`dw0=TkG;_oyQp2+|vx?U*3NGZ>@4Z`v%t-mDF!eAAb1uUFH0L4(|W2PA`&|Niq0x zm{+`@TMf3qQyhVz$k*9zo$19RQ|4UL`!44%8UT&S!GM`#&BA-AS9mwioXT(eQ0&lv zc{-mt1MH*Zu=v5+C$=bYdn%jU9t2lDlebw>!W=Jl>iLRZLhA(oC6eGj$R517-`WBh z=%+;g8zYLUZ#iJPlVx*&H<^+#8exeOX0R49YxPqYJ*A>ilXS_f0UZ0m;7B##5=#()G#B%m7J~()L{~mJzl~^j=gWgg!mYCt?{*{Mo@GV=TDEYS}uyP)8w@BE!UdP=sF5dQOKx~mKHX)l7sk4|3R zrpJrZ4&l)bAtjDYQhgbx;u*GLWU>0l4mN}Jv3i(nJiEG7pIQlcfSNBZr<*GQ@3v10 zGuSJ@7%J|c4zi9)8QzLB?2a-N{V#+6CeRrMr~PQWaHOAivv2CUQ9K2%ii>VqPxEgX zy5Ff%G6D8-T6YyJ2Nt#xv>j#}K=K)XE5HGmUmPJY-)%i(M#hgz32$SD}v^# z(#V!R$IQ%#J@vgnc&J={8k!cbukfQ7VMygCqbkyno;%EHRqop=%%isF1ZteTp6p0rGtd!k4Y@GbW~S1PJ&Dc=%TM&&NglyKgwkWI>F#uTFQg zf(%lpQ|KH>0C+)7XAc7DjcDa?6tF$AWQ~g)Z7abh>OnAod0WW%S$P}jav%m*jZ}SX zw}Dau4UA8A80nQ-c*YC!LB|S|IVrd*2aGfAmJWktiD2^_{ASHyMC2~jEdkCV-*&cO zr6V46C2gJWDrAy&C{#JU4!mxg^j(nX&47$KBHG7$*~?hjIq2t%%wC}vOVlogD!{&M z-ou2-rp=NERGvLyy!{?7PjYPTDtHDnbJ(h`+o9U%@h12x#0H0mzwGYG?L(nZ-Zkpu zh#N-O@GabJ5+Qkj4d*v>U-px(IJq0^N!=ofqFdJlPI52%T12PhKsrl)cIn!PA>c{# z$=^WWcT?k;j%uGMhgD!~X8GL9SAIt#Tg&~b5DQbjxg&|7*&BL&HV1R#IRJY)j`2rO z3LtkiL7l%=ds45FAA2a9b$Q|rbO!~_&^R=%>l;;+Dw0=F++Epyufw>@b_SS3XNgV< zsL*(zU`~XOddE8V5gt_XRY+M5(HtYn@?|<0!LF0MDqyeK3jS93_Fqz~>U-ai@0N22 z<3xPOXOAA^w~5fU$s|MX&^&nh?k+6)d#vT;@GMQ`b4R+7tx}`8)-I-ycc^+x$^}=Z z;J~|8*7!6Nb^o%k>Pcd3o*?)_!m|1gIHr!SG$qFhVvqGc^1~Jg2Oe(fWIF==;h5IZxvmnj1~qy2V|GA@+FYv% zqfXvo}Q6){wGED$f|X$C5ASOE)0t21$=9u4QCOwtqLm8!k!ZJ*>C27&9(E z0(Zccbc;oKf)J|*=d-4aR^s;EJbPc^tdg{OUtXlvvt*-D*n{FzyE3{3aqFdpjvRSCX#O$}g^T#t5w)p3lNYiuYor7&p}aTeqI#JSlXeXb_?u^|UYR)R%~p zrf-2O_9?g7AKyM>DVaCm*Z=ObKb2B2Nd)?a@INAWgBoD+d7k$s2?YunN>Y+dKdHIKDtih0`<; zoGfY0OdOm+tIDg`&(&BU!5y7)kF-nLi={c@gyAQYn#`44SanNOg%+vuU_`ikJ~68x zVK-#HJdmjXTXzS!7-)OnQgfPC+1IAUH>m_YSK$PV?D+)fSkVKWDz&kqztwmJ1%}7< zF0qqN7#LAr$%v^DWn5k^5G$9V8WjWmO`E~;VeStmEE3-v3Hn!zN0X(!6B2w=F@P}t zB)fMHue<7Dhe84aDa?lZ_n%AkIFWXL1S=rgpm40iJ}AFyQUe6Z4m zI2NYz0Ht5$=t2LgNLDwUyzT3niUmyrl0D_JkdzT1hq=7r2kW##-U6_6qUWB4)PgB& zBv8AK-Af=fZhh!vYEuamiwD5(R7yhGNhHwAX|HPA3xwn0Ddb~VeKhi18(l!oOcxV>`g0s*( zNb4h7SK@xq$=gSj-6@tfm_qpOy`*fYuEta){Z;lw7z+e-0|w#PCzhHmoYj8}ZaPu!)^QcY&v8z6y;sak^rw(P}lDp?BxSI{fFw-zp5b zr#?cFa)J270x+)~&uBt0;T}g=>-NB&V{WNsn{4oXgV$}b%77N^z9mmpKsg~ER~aYN zw~3~&TFX(menio$7HAk+b`KnE2Nfn1u%oI_A@gGI2FDliBLHDoz7=H)&1+PzR5zUZ z?{H21e<1ewzrTNKQ{orEHfhNGfMywat&Pk4-UDR`^ND+ug+Qn4a`E`Op24C_ z?K8YFvZk{iwrJ6i+@(reBLl~b9ACm7UCDQVjU~7CzR5HPD-c;9j%y5L8jKkHT5K2- z2V+CF-C;kdho~*IL1`r{X`fvwy28sZFhivVAP!Ep2K;Y`;J-qV@(fbO#nWDGRnjhX zJgdP2GujchE>adKbA|RmcvcDKH^YCRPjb>8GhVnCv3w75=l4K)GSn^Rq4s#5f%_fi zNE7pM!LY>&+YHd)^&nX~^XV?6a~7(jU}e`+l3ZTNShC(sD`l%SJe}IEB%S;~H?Gvb zPZCbsq6`98Wfk7Gj6r?giY7^;r*Gbwd!>$kH*Vxk)qW`_1)}j-rdKr(#{k+c6E-Lt zUR#9eH8nAT2T{xK4ICwQ!DbVDuATJ-b-JWnZ7@?PAOUPxj&usw$~Bu@%f>%&p3rfe zCn*pr}FS;AGzNA^!>YZy@7$m+xJc%{!hw1KQvss z;w#wCrZTF`V(6#roD+xM2-+J`@r%7;C~7q(cL(<98r;uDib(dqG{tu-6rSaa?n-LP zLG$#G3}6bdEE5nWJM36Do$mllKyMK+q);-d(1XY6Pk3G!c%NQlaQ1#bOLZ@P7g5uaVV~(qr6^1@t6cz zT=HvGci$BT)#JQfQf`RJADjDT#*|yE#fvOTn;?T#e>a_j`@1$>4&lAo>^ zGj9D<;DK@iPbaOEApLbwp}2kUBXNMHfdemUPkiM>z6Dq6tJPW(_7Jdkb?v0A29?E} z+>Dh|Gw)lOqe6ag3&en>GQ_O{n~=UUOGCK^xSn7TfUALk1%cdlUe7wLQsbgxBAIXi z7q%?6C|6OGgiiR*9?#Dr}LplFdDE+kK;y{y8nB z&=+c~bbFP$+8`Z>&sbztU*Ar5iGb<=y0@3n?!jGc6Hs)^ane&nQa9$=kMvP>M!2~F z2Uzr@Y#2EU+m7P_+3MpKo}*XMaGnCV_zW5JuGgNdR98|Cca2oV?o6lV@4lT;V%Nmd z&#CTIQJr)&$x0+XNO)M>-yRr{ak}_kwScX{6oo9bz*VNs1K8mDE-GB%ssgfqpXr2v zeUm*kUnE0)l|3ez^#r{m2vW)`I2?cq6M;aI?{0Zvw>%$`xE^c5I;R0fuZw{}YR^u` zt)Sju15xcYeIH~s4E#iZ*n;f$7a)1v76vkvmrf2&9P87uohrdmyF$(t?}&GclV#enQ*S^xUfcpg_Eo&00ysJ~USlsAH?=aZ&{I~Le1*~z)BkGTgex_ zJ0sU$Xyn@8A;k zoUBhQwJOG|2g}x7lapgq-W(_coQo{WodnkN6kKTnEG5Z>J1a~jjJsuh*2}q@fFf*V z%-S|TzI9Y+gaPJuaKNk>5IU6`Z4d^^>5TRo#$F7{Dj)@bdAa={i9=;KKcLk1j6=~U z$`XDr`7d!;#x=63Ji(IK?%eo#mt)2H>)j0s2L)MC0bgpn`r&P>enJx(lrSzfXy_(q zaBEjE`77u#ROl1@F0A5)tivg5aWWou;F6+3bdoN>8q=V@m9Sd4KnszXS4*!AP~N;% zu5PP@LZAb4`1w|0+qi0|z(*l28}Lts5za+;L3Y9p_}Y2Sw1lX5Ui?AnWx&n(Bkpg^(Kd1@6PW1AEO;gi%kNU?DI zvs~ovvyc zf?MVtf>D?LqBxN4NuPL(if=9()f)MrS3SXAwzqE1)o0b~h;H}BapM*J`K})n2GVh0 zg|zx4aWHq0GQQtV!qoVn_JUFUqMWy4dE8DjL1!KF#s=we8iRBwwMq1Rwi zv#87Cpi~fT+2tBDZ(xZDq$5jw=EmipT(j{gn@_PC_Q02G9j?2&ws(c0D#3GdUUY?a zH^ZQWK9=SY9b<}uL$eNETq!HNe)nVAsNAP#;DPw)S{0SB9gzys;sM{MEW7VEtdJ98 zs=EU%-*kp*@UD+$8tvFgoU?{C$gr+BqppY*vtEZi*STX29wE(!kPf$MNQIbvLsR*G#1)ja%%GT(BGIVCw)Yt0!>?fVGBOXfAAC0F9V}nbvTxk3p zff&jvw*}CU(nAK7bfWkABCB@ODU@?M&wM7sVt{AUWXg3hx!o&q<06+pstx?GRnMGuko) zBHCCPH*b@Dh@#tCUl`YV&-ff`#YuLCW`;Oq&#`5?OCFH0KP!r@H9o1p$?EbeDNEI| z7Z%0^*{l+($vw?3TCx)eTSUZD9F3y&^G01@qj|7=)*hg{(^X5n48Z2e#^vb>@SLfX zLyhAOiWqBdRX#1Aj?kDSzX*-66$30uxY+WEY7e%{;d%o}V(8qX<$L+Sgu~JMXZiZ? z-+qAq2VUfZ)ALD|(5Rq8JyaG8o>CJ-ubSlZG0Um2@G=^d(mmH56p`-Wy|->9z~(`d zx2}rg+d54S+QI0Sf@mGIzaZeSIE%c6Ydb+kYTUub3`{9^o_#8pbCLwRE7b99sG+$l zx@ts&B{WklC5MfjJr6Cp13hYt>d>~Ya)mi)7{Fy>l))QtvuO@We|#&$=XF=EU@N=h z%J$~vsY=n=!v4;>`LauPa7mt6U-mGWSTTHr$bE!_%h47Y;&8pYBs~u#1fF+j2Qb>V zio>@32V0hd zc!Wtpm?pkp4h)4#8+lcVW3{AEjW&vwDa@VZJ?S4jIAf*C0yy%p(0}*-C4spAk{7v( z0*Cj1p*P77KE^t}PA*uGHN#*BxD~}P%1u9ROQ46Ja({iUyFd?_4I{}ZDL!#W6Y>_@ zBbZfPixz5$0wfNA;ytTIl|1>Ga|wgn7Q)+=9i*Q&ZH-IBT{v6WAi3dI3}3uNH(?Xw(W?` z-m|GTezW1JLW8y+G3El<;?WgIhiT>+)7tSPLtGDb>DNFMmjrWft^&Qeo>UXoPS@_W zaCdJ#e6?*f1LQvR9MEJnk+L+QXte>9{$=2#(ZGBk=1W*;D40}Oo~f;DTK;J*c(0SA z`z0~b161zosqI~yP%T%AX?ZFFJZRk<4pYfcYZTOZ&ljSp;{JTc%UvVxtBH3xQ*Ux) zJ~*|mCubR{nX&w-_K8Y@m4csO2q64iIhXe?gs$6dX&_&C0l?X*oWSUgKkJoll2 zTX)Y*43V8oJ5zkS;Ox_&BKt%s|< z=d687js=w5F}YC|Q2KQBKvPyetPBZPIqL>?urRxIN#1T*vY(XWiIs99rRUmJFef+) z1>6DE_Gf@)kkgaR)kc1)m0{2WuH%gdq0VhPYmHGgzz41^)Ptx>*kaw-Rj5yGTZ{yT zKuUQVwaQs=K0+0;!A|jcN3$f5z0e`4JJP3=`!DwiZE1p<6y@Q5xk}=aT2n1U#=r=T z4Pj_GxL+|z(%Fk0n2^l1vvMC5Bhk;203{#BNQGQz?D7X-UK++HD@Z67J!&M9sYPS` z6eFEdW3YAh?eOQhru?%%Bd+nYvYCGO{#oD!VaY$?*Zt(1AM^Kp`u^FU{vpVR&)+^p zlKQ>y{%h<$2`Io-jq=u$9jPjw2E>6WqpbdsCBK}nx6A3H)-?3`Y3U6&7}{znnNVKZ zaxXGuaOTOQn^03YAET^(e?c({h_~_RW?7c$v|b+aZo)6m&d-Hn^()+BfIuB7wxl{5 ztYwexd|G1U%h;(x)SB)*J0s+ZLAtfPwR1SF{E=sr$18U}+C>&J0@LkD3V!CY>KlBT zoE-s7VczKI^KcWR)mSCknMirWLBW7CB9PfVz)gzeHn5KE5=B_SWDnr-#5?&5z(rYJ zH^{jLa3s+vy+RKXDcim8tQ;5VTO0uhqrr-!QeezNWk4jEc}qm)%Rw(KJ;U>v|Cppo_91JA=Vu@p z+rZm%!U+lq9oz3uoM@84_>>nSRGf~$Xj~El304RUDnboII*Sy*9AV7C2`=&Y)lT?! z1yX*?A}Nk_hj$a{0>M)#rzJUKh>T#%*f02V-{AjtqkoMpt7qw-{!4ilsvg#@bxVOi z!lhR~=rb?QJVtE9it84Nb*c`~W9fL1Y>*#v80ZG?CWX{WjRmK7dsdFM)q>%MlH7Kw z3gQ@UUGb6|?~bUVwsoo?CopTwWkV@Zz+0l}KFE%JdXEtW;zIEs2}RvZ(6Z!< z*8)^N2Op0}6?+D0inFb)8I~Cko>S&9g?!}(vj5)kzSSf z&+>1!TXDM|+=Z)bz5NAFK32T{So2+c%+W!kKte>Dmg7lWx;)ys zt1q1oQ2<1;epol?kl=RSd*>La-jDTLHM8&uZwpwB6HO-w8=g0ZMj)M~h6a8Ffm4`( z>;&&2C5WChoD)*>6{3nHr&fSu9FC7OJP5~=gkQK^9(+;KU8j2J_lBXa0m88yE{$i^ z^J!F=16e>1>kA_d0!d*>au*>iEvYhXZJN{{G2rz**f23aRG}Sr4;k??ZHxCxZsZ(w znyr44UH&XMYPE8T-{EMZS9F=_U3cBD|u#s5xPB*W*a3#w6ylYF( zScj|Q7O;ehZy=&obNbux*M|V{Ztj1-IGS_+5?Vibwqq1p$qC+miA##l{KMPN zWih@&zEBc__Vkb-GM*kvv!c1*DmMpQdGJ4SEC2_;$!b2{uGpseBRfARpeV*qE*mnR zHZ)8Sz)5GkK;^42g_O(b>SI`EuEqieMIi6?S+s%WPT9K)Y5zf4QJXg$*URoUzi3$B z9FaAKo3rqPnpT{aEW5YNvR7TSTaqG)Ca}|iAgmz>@S*|! z0j}NukQ2VkGKlsw&^znYV!$yoSE=hUhj8rZb)p^VH7beEA`xa=`-;xlt91g%m%F(Fr@ zG+`PPgCY?wwp0)UC+1mdZFPABbjcp$v@UWspiEV#dK{13q#B~lnfx|;P`Jp?q4z?K z(a4^qhUe7mwqPpgM><9E8pHKeWvV9l5^_#YS~mGqcZGfVC?B&4o&^9oS0r_6_r8?A zU@T8^Y+dA)JUVL?#Zlt=v-Zpchwkamf&nq!Kg}LpnK^%WkORiQhIi{}|C2*8<;T6S zdELv3g)vcnn8Mjo<+~il_YRgq`C$TGz&x#8 zD6!h#RwKuKhH{P^{M_*v?K;xNj0q_&w_pw%^K(;(&)2e>c5zNFexd`k%(dImKPhM4ZTOxJ>e zx$2NE87z|b_f*%~TOhpZo~UdgE8Y{Jo9f`$-j(&#S}))_RV&0MC2CpUK#uRo&Wwso zBcaYxXJ4W#q1I`F*!H1>Yu<--T~b8U021G#f@A7GKdW*QR8WEZhR{oA} z^CNK=sG=ysC+XtOJx357!~^bxBHSmy5y@)8@!OpCmeSx4BuGac{0(e-bRsCQg~1lu zl(r4434NKd>`Sos(%}@}c}Sye4}i7YGal5C^(_oX4B#5KAXT$IU#6?7#ui27o+O90 z4unL5Ilb0Y*g;Rv96(mvhrpcMO`gF-Y$wX1XdkYty{|u~q0*H}95u=!0x9NbtZg~N zxp$x+*%5g#OxoU1R*^k%lmi8pg1$QdUPjUu`*4%eT+Rh(?>TL0UDc=!(i{013KrZH z@zJx-*N5kv_wadnN~kDjt3e9pMA(YlVdFd~ot{T6(woMLZD?*IqyZ_Fk$sJiSu_zh zNxA$)@8sV`0tVzdaD%uLwc&SxpppE{KfiqsR$Z?cpUcg(jN=Ia zrg?AVw!C%bbj_{9^8~d**(#g*(vz_JU|@bo9%5R0_@T1imc={DYN^9n*CNT3mH4|F zd8>WLO!vUt!CN1a^uF?`0O_!`q(`fQuly0LnK498{aJzptZWvy15nx&<`r7j6FZ%d z#UNv#jqM`$k)q9+Tq&mqxg0ucwp|L^9jjY8X6A&MTs}R~qFbK1FP8DqsP1ibjGdHq zy&MANgczP-wyuT>aoxRLr%Wfi_EtRL(Nf~IqgUn`J8fhUBEZqQ+vSkX6bfZf`1HS5 z5&%bDk78oc!!IT|vJz2hb1_hG9BCBQBjOSngF!E8I5)YkJNb;0RFq~9EaB@01_tg+ z(;W0GVGaykO3M<$N@E@yon7Fo5vdEWLcvm5VCQ1tF3i*~X=g+Vyzq;{mM_77he=@83KO}*1h2q0;jx*HE!=jD+SlAo zuVqDG{&_^N)nKi3MX?WTN*ypXjqyAvHU!C~+X?zvvN+j3l;6-%Pw#6M@xNzG`6`&r zE-Xb2o%)=7lnHYv3{WIp_y+9k4$XNg3nB2@IlZk@JD~`)d;sPF1eqOj`E62>p+He~ zWcJp_%j#9LIt0?G#fZ|8$^@(Y7w`|Pc`+joUbxDu2mf$XUImEz3&w36-1Ua3T+$ht z?a2BZ-N#+x!<_I^bVnv&jMmWvc-X)tmCCQtiwqnOJB8U{54esWQshMoevp2*wUq3Y$`zeasGVu_I z9HT7=mk=^DYN=S%z*W&FJM3o<3@X$LCleRPA+0(B)8KU|WKqL7kxd&PX+>=2R*bm` zQS4=8Q$$G$lXjZ|PSWX70cMaG?C(^Zk>En@>gNQ{y2_48iJY*r+%Qh$oU01w zexj+z%*G{3)!V_&QcG3pd#H1vQ?8@W8xSfl9}RP*$~u#|F9!7r4ol=FZt9%CGYno*%sSN+OJ0>dQZrB{*tn*L z9YVf!r~30#ilRGtN6lW};MTZqPnx(llaiO5R$Pa>Y`@*LxND3FZ2Do2bAT71Rp*o+ zml>^9Sz&dW@V!`RZK(wW&)e`I3ENCdepHYYd&1dDkyWjVIiUkO@=StMTwoLbDqFCF zS&_W}UqGP0;j#yzKl2gbAXm1misj<;;fwblynp%O$M4^l-1v+4pS=I!!;i!Jm+#*_ zX>a=NOCEH8kgswvS$}Z6&d1=#sq{^q-yW);Q?r-zkXj<_vr5P|$*VX#1c20XO$mD# z5ZkN2yJoM^_A~rsV*`o(Is9Wu-i9p)&0@l3Oeu)Y`}Py54m|3cEPZV@Ug5 zv3FhJ1ZN~}F{47>L0P@*U1?WK z(wd{|Ex5?Q7JLu}5U3pyouf56he0a>w5xYcqI=Te<)t=P+u3LXBKYYsOL#N@jL(V9 z=q9}6uRbG{tOKnV&e)z49WxZ=RZu}T2`hBCl;MK~`h|>j0!>L0*OSs6@z-{!yXEBm zzC?scO-gplYW;;tf-{4Je?*S4qt>LNQq)LLwF`=_Lu6oJQ@O?|1Am&>c;YDw96DiS zDIGlT<>j<6E9fkqRyae<_1T`N)qs-vwp9C%80=qJ^NsWKuZ@E!9~ojkd;22%&-uYW zOTJ|2nI{r!Ij21bdAiKt17@c1h#^}0rr6_$lD;wef-WTmI!%VaLPKTA7SaZWDzOIx7Ap@z)l zXZe&!A+fe8YeaZ zh?guFfnmwiyB%Xm+0Z{cOzAN7e)$+R0M%dDnu0WLT-H;n6mnJOX^5>ByznPIB6*jR zNO}GxDPAs#8aW{_F-Q+`y(R@-1jyBqi-~5ckMg%gDI;AOK}*U^d9o_5y&Y z)d8#HD4*q6rC{tP)gDF>tb#Tglu;5$(^Mk~Wl?7ZZ;N6O!J%_w72897Qo+uC2}5OO zKG;tSC5W4Id%1>N56U%1I)*D!g&O}#n4}tI0VB|L*CkHOfPCrBVD_8vo|}>nBnDDb ztLTn5Umw{L)oPMQ>a{FI&2!ojhzv51zBT{=k@#FWF(sqqbaM;CCZXweV;>@?4j$3u zG>J@KKyYW%FsW<2g87ttOZy72NSs3^8FRl!Pu9UJQD24mz>`+4BTTX(I1Vh)w6FYQ zCr}7oq#N{Isj3ehys7F{f1(6gEJp3j%Qk74?<|FEGXNqEd}4V$ zpNz3Sdw+FkRMAn1dbZ0qtyi?oP=uP)0GPtJnB+O=7u|a^;EDBw`m}hIDSOiHEKW)T z7Y$PFsOdTDonh`ZEph%ewU#8omDR*P#84D))Y5EI zH8!Yq@P`G5Z$h@nvx{@s9wz|yyj2&j-lwZQGi`w00v2^Lm>L`-!gE!V!~B`PZTssiSZ748eUW=+vftf~mR8&3FPOk=xVuAsK$zXWSLu+fR!M|M1?ieH33&-)z@ ze;eL@aGW)Kqk#H&zVQG^$7lKS&OOW`JcdtlgBH~6ygGJyWj6D}YUs^!)}V!G`fyAz zozV)hzg2@p3ltELv=T$DjTl3bYg?c7bdV2S_dLi~9Zbmy=AF;WB6bWSP(Jw@BCpQ% zPVnL8ME|ZJz^T3<%3M3Cr`ISa&rL#1I*6SwAe$R`Tcu$nxuVQHnu$8i$4gd~zXCcsyKJQ@_76%9n8V6~|;2FBHPm7R&7 zM;6V9!Mz)h$4)yh5(Fu>0;dm8Kf=uE!4jq#LxGC>@s?h+sBOtdmDDTE-Rvcp{NSff zs^kxC7<}Xnf?`fp8uFTyWl1Oo#_k$6q6skUIc4n(slOf)5r z{_Q2eS`|qq#I%4{M6);!%Bb1cTgebW`x{boOj(uD)OV*wvX`?bea#r|CT847tPBq} zX)y3vR|ynF%}s|^j7urdHb~(DbDXHS9IEkDtA~9KFp_wq4ZnHLhxFx6p}*Rpht)F$ zU@B{uV10u3YS%BE%~U;*GljXMb_*Mjt%O~Jy}&|h>nLOwGmOrJBkbT;TTALiw4__c zssV&OTFGf}!XNu20xcZLFRZ2d>HBBl{SRQj{wkPoYntc4PQ_E|gpT~JP4%ls_x;=? z>CG3HWR^o%CDeY1DYPCn{JyS_gQu|U*iK!`*i#2@cc+B4f2JG5wuP0O0(Bsy#L z<9f8K0*C-pC8eNo#00Qp;M}@0!wjD)$x~e_z0)n~O;xw*d9sc3ZuUW`GA`~^ z9~6*#cuCt*px*KUFV_Q{2E>%5EM1lrW()x+$SqAF9zVLv(G~R991^nqde=cX%{ETg zatPiv*3|9%#JogGDYcN>zmPTnMkfGGOg4HbF|FE{oeYn8R#x-~DuHFG`3xuHIst=h zKtbwvG?PZ&QmA+=Z`3S<40aX$WFdm?2Lveq7B1!mKt#toF;Ad+5oxR*Jq7k~ftEd! zlC20q)atoz!GaT+YFq73g|NlNJtnG(wS9b%yFwC^vfNEDE}{&eDC3|0UY~rOWPO=n zgskI*hFW8%Zs>mM-J#fVi?8${Ue%>)qYuf0cW^_8@McLvH>8h1>|6E^Wl4cDkbTy$ z`Pg(rGt2JFdeCphAp&eR-5xVVn$gx3b)2AugU0oCr&;bOTd^b4(I`*qNRc#+$^VRbn43=K!^9N43HJ_BOVvxmG6;h>+Y!!jP* zUD9k<>Q+Yx#wA|D745|}dp9`?9@)6hsg^iHJdp-k3d2^i*=YvT=H{Zymlrk=M)~&3 zNFf*Y{e zsIfFAcdt`@H#sQ>9L!iA%&_6Da+$bLRExY=cqL~Gz{sGL<8r*mj|2}jqfQ|8J7K6| zZ6PNn`+)L#&paMqRFi$XoYV|5_!wVpaHEIi2Fmgz)Za*j|B~dkc2Bu;aipHC~p|_By-uCsC9PqTVQ`?ftqhFo5WgFY8 zTH}X^gII3LE9=Z!xtf(MvqMuGXDCitHNj5(IU{uJe3c(+ew^X7`w!nt z_VtHvhEx7rV#@m;t!-cv*VA(c=ho5!0?!{(76L9L_m0!mj5{?wk5~qFc>p4D{Kv;EZIn z-ANH`5B3~K2lx#s(R^o6`_hpWy&94YY)bbX+N?X>#^6WE=|VyhsXbwP92XTsW$V0e zXnQGNXuzWzw8tkhf?m*|(J_qcukOtgZfkzlTx%pNanG*@v>*$7>@F))Xr&%OVD^Bl zka!G?L_%}03|H&UPHC1pxv=sXUDPM&tQV-MXTnm|B_bm(dN}d-wo_SGn8SnJ%6t$V zQoAqe-=MZZMWw^tg`sv;lpE9RdWwk!WwX!dCf`4T5_T(z2|x{&=|nbN_W>;CKpzJ; zxev-qMdCoEPjZwc9Sz2nu8-2t=#I0KD3K7FV(X9`hgnIandrfxAdZ^GvvC-ec5ky& zIdj$81en9ggb>sYE?|!(@ST>mtPeTWAPm=c0~O)c zC47=EKH1~r7V6PlvsXZy=ACKCCFk|PUllPK*m^EeNrIJw5hcePSQ~2&5C)GHkkOk6 zMVvt);e+rrN$KgurxWX?1OIrkf??7m0j;*cM584r) zl`}Z1>se)8nnq&s&T2u)MH~ipvzG$e?hMW<3KkJ6Nw7%7RgkG$JXFY+;?uT1P8Kiu zq}H2N25jyD=E~2dR6rB%kYo?x1JF=b1XGA2FoL+YzHLT=%VpU3| zYUC%~$v14((%XWFokDAXdZ@zdNxODfL9(Sz567pgP-_v{-BI!DEEDBa-n<~1E{fAa z2yGS~i5t4zah#z2y8Ad)g}Ee{#Ub+`{YiuIy?YNkvXC+c8Qm@#(kk;=Iu~B zse+d+oK?~8Nq$7CqK@JYkS(oq&1Pw;puPc616w^y_xcL2_KsrmiyTwX$yktjs1nAS z&7tyVF|Ix<-@xStKOrOwo~Ipb2o8pf(DZ05kYLGypFptA+$o_uZj3pydnRQ_Kh=Cj z^?`tn?pn4pTF_+c+Qbot(CU9V(!4^>m|ny^l|e?#sYo;!!CGe50RWkXxUwcF*uW>G zXd09tm2N1e#s*CY_)qw)%M>ZjEegA@hn>Y(tBFn3$GxVR_h7&YXqQL?M|*L*NSL?k zXkB;LoB-%^(0qeJ36PB3c02NNzQM^vS6o(O)d5r^cj>ZY?m|gG$QY}j0{!7AM|uW6 zu5}wN3>u+3+5p%Efg+4w2hKSmePGdQEW9sml!X$mTw_BY)MQFF_97dLQN2k$MZRO3VF~WgfkE{u-aFP$uyRg1ZR4t%o4)y)_AHV-7eE8nmzr6ii3Xsp<|M20{_fOxxlu!KOPyhA9 z=kGs$`xMW-fAQh_Z@+%~^@s1tkNvqmV?3_t?FlRrTYGde}ZM}KfV9(^x+?9 z82$u`wLQHcrM83vqMO@emaCa1A0X~s4Qctje(kNjt2C97rocwp@~&j}UfwRkf>yLK zUIIjvJcGgL67HfatC>M|lf~DyE7}0iGl~w6urBXf1B}R-=0X!h$XC7OnMUlE4~E`pp`eP+QMeiR43IPiF^VsTNY{00L=Yg1reTm)t(~UT&Bx>(zCK z#cpS#lGAm%j6to6-88F%!uZzZOI(G=l6N>n`$o&9CDQ`9(J{hknMzz+-TXwo$a+6J zwZ>UJJRuKb8x+6>S+kHBM?Y-Aj4_iX2+;Dg9ex$)vdV(+EUFLFu7WR;6uBh#P%wmN z2_f|fjqQ%(9tBUA>bjA83*V6Z0Eg`Bt944Dl-4~gziHClw@JPCz+X|ArPl-3nw}El zR-M{jfY(4FYVmEos5_$j+NEq7LkMt$E0yvi<*r&v1-%hoRZ<9&-Q9%eAcc?$WYGib z<_CL(#oq!4O919zoAo#0KX_Ps`<^*MgRHh;AOZp7q{R=V52Y~b57ev( z&!D$o56?Iw#f=x;30Nq`-S6+*L%piQ!G2j&r~doY5Ph2)c?R(F5THS`H%zWg8K z%Q`W~mIqQ_H1ejs6wFaib!YI1ml#!pjD$mH9^jUU!rJ>EFW(LOA{C(iL&g@86~LRGrejW5f_1puCnbD|cEjf1KR;81y211?%k%|T+NNROYT6z`zVly5z9Zi=l{uvWBdP7|T5 zl1|O}fx89nPkt7t0{5LoM%`QpSWpInDg*K{gh1e8m>)}t>{eN*cG;GwBG^WGi*Arm zqkaW0DqWLvPHwKWW&NdA<6vG}?L9<>{a0&l?qQ2{%2LvMn=wgEte8z>R8 zW81V_ASK3{q)`E8I~f{P3G#udyc5x+WN9>7(xG}Rp!=6F~DDp zwmC74V>4G(IL9JCgLWlSWVC^N{#f<9l34;8fUIl*_1yN2@a|9ODOF)jq~+C2HjSE+ zNv_`Z&smN|Y84-D?0){I@U3qhdOU|=&riy;zjW8Ww?AglR!Kw~C9f{Tz1)?v5UJvV z>cPSdut%h*q0cou|+xBSAYK5-X9J`iM@$+6C@lz9Q8WP7c=tVsedf3+Z@J^LZS;muU zva>BR^~JlolI7WUgr3S*(QII^r!^D`YhxU&0XY}Oyo(}o$PfeSiZE|G#Rp?&zU$e>l{Owoa{b#2qn9z_^80p^kNZzDHT>`?+ zMX^$#TBy1GjUv+$l`T1xVrf7V0Tti@e*#HXJjp$&BIrKjfNDho-A&D{17TCRQ?Gzy z%rH6jgf_rzs}~ zZ3%4530HC{Sj~sBdwuohU%X}f!m~FMK#XK(av&Z+b3Nz;`B1I)yKTgg9cjJ9G%?9$Koj3QI1PL@{I#$e=C73ep4V*24qXh)YdWp^SFyOnSzcimqnB>Ug z2b4Nr?T}C{WWQoA4In7XfmJn9?6RUp+Ad*^*ux+e-S2TU%<3WMZv$9+AY50;yh@SDHUFdJD9=8Nk1!FFr8uT^S zie&Ldb_>PSvd)t71*+62s1T4txLH!rK$yBh3^6zz+F$se*QB>P14 zp^o4q7FC2hQfH8~(sD00oA+)7p7v%OnjQL`{eiHtBfV)to|sV#c^{S7wOc!V*EgBo zt+L1Q&Tz+e+IW}Hw_#CRdaCpSAK@y0$o5*l2Ptan#c^*^fJwA;I*@vGkA4@I4&2xL zr=p+U*?^85043UuWI@1q#_}%JLdUrV$@PC@&~7J`92XB@gW7PLXx%#EM^?7MT13{J zC7Y>{L8sh>#O~PSht5u~DSeoEEXua)pQsU_$PiOO?vQ680VM7u6>jL;jp_rz#G->( z{%8|4h&kHO3_3NGoly6uVh5R7=7|PeS@a>E+C~lil8Oq(t`W6Eq5GAK8{5fs z6XawMUjv1M`~aD%L-R91p_k1Y7W|i=J*&RU;(nAV?otjziM`vRV+%3uv-b6fMv%Ni znHsYi$go9HEAP9!cX`YHhU(uRdAR=i?Q4VMeE30l`)T&C{Hm}4{lN*1gn{l{*__*~ z1RyY7oERSJDZQZsWE&hhPqtw1=UzVBpG%P29$+`rlef6m8_T2(aNdT>NRrgTWC9St zHb`y>Y7Iqx=L8NH&s%h`b$kWC<<8GMYwZC1@2cBUyc6^%M@tQ-y0c`R*3?AGWxwJh zDPC5BW2=?p2rBI~%%?GJ=e~P6fQ?w4+D)1%Cn11(x((5-d|BlYQBX zjz8Q!ImezB%2c&5h1pqbHm}O^8KygR$>Ke`tn=ZP;IuODBYRj1vO@<2Gw}(&U3<&w z{)`ZA73T}|M3?kDrK}HU`mL%|D|JuK5~!RKrgFCR3EJpk+a?Uh zS0|5EfSI@%I~qGjdPFAIl_W}yv5Ms~8klwpBjlfLT23q#T(>Cf2b6<5>P_&avj<=% z4XnszBR7$_b{gvak3NR~uP;ymrMF+IjFQ>$sZVo)C?MuH!!uiv*$YB_WhQ;q#7%B^ z!$-WubB_W~{(j0Mg?M_%?J%v;4sTulNxS@nyqh~Ip&*zf?~d==XA$2&s$fEiUsg#? z=78d(oEi{b_Y-UmnQ}sn<_UdJlvouhW@vJ9kPW%BKrr6kt2nXJd?blCiq8aA>WzbM z^97q)(LK3zhs0VhbS^eV0llf#}HUgIjwe(Q&wS(CwA`?dTNQNaN{m!(V(m zuTP{m){@axy;a3`aw?OcEFx1VeY?IXc4|Rx@<}5LP}6O2(&*F^R*}JOBk0bM$5wsBLvqw@nDvo^Ij8|MC7) zUH9^ao~}1}Z4ZZQUnQ-*owAGIKIH6lE#_U_nB9m<&!8L6NE_|*isf3+GY;$NvRE;u z>a{tMCi-iE67}^XO+(->;>}FZlTTh&z%HnYgI?a@Y@9~PvD#CsvNn6yc9OMjl8a-s z$-yPWbI^NGm`*QnBB%CRCeSvPpPC)q`#3ehjCaJo;mjVF%>Z7s=di?Mf zwqs03P#8VJ8vUS}2raRJrUDYT9Gt z-LT_tp;p!0(wcx)=f(~xj1v1Edpp;oQ2PV_pz2<24`-@dh;ELB)j7htBKQ9;lS=dz zejN%-)tdFgvfY>cW0BH!+R!Xd6;j^Dv|;QsW#pXOtP+FN>a}x?EDTR9OIFc8c$4Sd z_kt5LouuGw?EF3WE^E?v=)YqCy<_gl87D;iWi?G_$xo;~hrS>{QBoplktsXf3h4@T zd{^6*P4#pPdT)H6Dz}+AK~dMY-~koW8~LfF)elYKhkH?VVW><1v_Hkky)hw?gXK%f zszC=i`Mb;x<0s(&{xk&|dc^*Q9e1N!4^=i8%`W#2m+j~FO%wnP3~g} z#PH~DR0+%9@ysfr>#Wx$E8Z`jLr9R7-N|U7bXk{ao4YVkcLJu;eYg6fo@ny4d3KVZ zsi^$kGJ~BKJ^$`bU0DcTo?zr@du^(K5y+Vh1_+*vjBFEk;pxEeE2n!ylr!o^_A)SA zfbvu}VwI&xG_LF*Nfe+|(pBuB+(tr?01s%^=?^u?O-sR=;T!#e5 zE3Z*D5@>!O-havI($9~oSU-FJv3>jzjp{!;e)dy7`)PUh z%lDs!48eHqsH^x$)kn$UJ{NKvV5fH4Z5{Z@w&=Gk7Rqtb1!`}xa;=M4@AGMWD$r@| zD20l4=K%z!sy#EcFQ(p;o)rob2TAbab_YMrR)@0~6ET`VJG0Sx`IXY&+X@9GyDz9V zkfhbUOM@d@u){6a%GKnDBM2tYTb(bZCkhEF$!bT5)T1^_uD0i&=<3}Fsn~qzGE6|Y zTLl7F88zBiXTXSDd|&Z74~20SInK7z($tm4V+&tQ#*gBs(x*pg7OT5c7YYLW9*D`8 zIC92x(@o~bDco+19>7fzvviFPZ389=^IQNfZTGJ{JTGa+kgHpL8ql_Z=GH0@plvZI zHG?{BJNb@iS-jzE$nfL`Jv`9KPmxFA<&=s5m=dQ7UaNt#cGLBTVzarRkt|!&;seTL zigRisjbQ+YtP34F>g}!-+^HVc&>DZR#tO+-%7fo7&OkYWgCrq&b?M+hDrzVdDNRF50Lb$S24bZ~owru{HW9_)TzKtfv_Spn1^ z5852D*G@*P552co&k%)!8^K3HS6^B?{a;C*GnDAB(MA8)@cz~5?MLD52d4*8DA}jh za_BS};PeWaV`fRna(5^PC~=c&TrE^{+~9SvIEQtGxHf0PIJoagKC;8R?h-!NOE$~i z@<__Xe>(@r$gg$?=14`16&9uW>Lz7lA_t{7J*^oS!CIz4$Y>EdfXpab92H>F_7|hT z3yXUz&QibBlXl%;4c==u@}$GIeBW*9)NI#8I`V||J?Vu=&dY2ufeuyo{&dgnzS$UnjRGm5x4g-+h9AW5p%@Aw0@GR5-KXo4dtJZFv2z@tv2aoszwTps@YILcHP|b#Ly^zb z2x5B`tSIZ?8D$j!wLwAslKwjoBl0p`{}L0*?8{*jt zk5Q#EI8`7GkOhZiMH9w-LC$uzOzo>#0KO%C(?kF)WrpKg0)@83`B6)RTCGEq2r0Ze zr9&AGHk!Ts@r!&&M}G)|uS1DYwc~2vdrvylW0e959>tRL^d!fhsCylYl~Pl59Kzox z-ln={^D8Mv4?mr0gu?H!f-iel2iA#`e1{e*RtnR>JGVJDmV(%ICK@ zwHaPo^ZGF?RbGWHr9)(CFFn)DwKOP%c8RLZ2w#%DX4EIo6UalpqqYvbpFJjM}h`pBM&dw6sc>m7W~wlLnX>f467vjE0WsD=a~uNb3=&KwT{bB5pLI*fEZ^Q z>}20WXQKwP`rc9(xDl$5x0NbxMSfgCBF-MCOCX!F&_7NVH%+2k06 z25YR)I;|%)r8rO0_&&pIAH2>SV;L*V3`uV-(0%4lF5_Un{&wI+e)h}o_I+SqetqCx zUYNljQSvbhdbz`Et`+a-&G~Zgaql;cxp1)br-C;RcNLqglVV(+Dm044I)!r=Xy98b zj`F|mBbE^zo2Fbo6q1Udu`7u|UX+REDJk1J2e<&9q8t=RdHmK%WvHOmWn)s5ORLYz z*S5k)in6>-3-7R2y^F%I*KV_mJ#x6W(;@z_ro=CKjT=C3;bH%RD(+C?PVPWX0d;Rj zWava>Nz5^oG$vCT|A>9v+urDqzAZFPz`e(Dof>zWG7v zY7C_nq_E)zMsB38-qM9fYx4;8|0;^GBSa2~idPX)fs_51lMBF8=K9N}9^T*!@>|b5{Ak<%} zlIGsYF9TXxD?qZ4x(!Ri74uGQbgnt=pA-c2;GycoGV$2;RG6kfW7*w|;8?<EY0Rk9&<9c7tT@2Jxl#5}{Fb>Kqi;`sw>WzJ2};irL4? zUEh@AHmQ!^{I}ThJ}~{+`)?4Ce)|50_pkJCy@uQ62^0cJJdd_({jBR6BrU4e!A0AB zze`s}+#)c&$LxN4N~-CO?TA!rD%-uYG11!*TCKgp%fnJS9TXf9@<)M7!3K-LKmx}h z(A@@K{G(O0iOB+T2*~EWO_3LskfaTO{2rK=n0VgNo)(McLliaUu`Lx~wM|8m#($&` zgM#sZ+PuKpP;PnZ9iHB)x&eD`Ddk`MB+Ip>7azvM?l3W)W)YUu`1ii zVg~%^B_o(Po7O3-|rP~61jnHg(FSPN>im%|pQ7ZtXnceXGsaYTEj&r;?qD|YmbW34I}!;#|Z zJ4c8Xf^-vW?n%KRl=N;L3j%JEo^lK)`npmn`uI}&nrpDZ1js{)ig1P!0FS#X>N zvmn|C$RB;F0scEQeeKb7ELEWJvJoIKN7we9q@L}C+&BJ3TeJER8V z&NGe!koyvSGWWJONxQ^e^sU}TV1wSNF9=Q4r^k?Kz?N3cW;&lM-m*<^WvYIA=sHr_ zR~nNr_(~_#$l)#<#s8uKH_~0bB)Bace(B?_m!^!aas(V zTjC3pLV&ZxQoWYah^0tF0UpT4@Mt&Dg@X$f!t(1t7HEMR=}_&fxZi+oF;XrVEQ$V$ zeLanz>#NDQ|ws2*4Qo&=K9b2V4FuG^&p;uXggUD{M*uPrm? z43IMn4{dg$I?Oqe<^8Xs-RO~iHF%HQHtUSF&m36#jFTJY=7JU`;YVew^Ual$jCxV5 z5F??(Cu=RtsbUH*8Q!GSo0YZb72%TODk9B4GGeWR!Yw~+5?1-% znyx;>T~%9{bY^faPsV84!@ArWblvyU8(!LN2f+BU$Qv+9N_ufA;U%GTbf4uV!PPF7 zPTj>5U{15!T;g563qzShgDy;k$=iBn`XWirhSdz6>wT+=UIxU~&G5IIp2 zrR-YmN|+vYZH}um^K*m^B_!HdiN?B8{R;H6tCb)9^a}d{0s|ez*zGy%=>sV!>n94H z#xl?i&fX)7%2AqWYa->7ld5b!q57!JUc)GbI2$yqCg&VpOq=8dZm0Mlqth~>ghWzb zwd{j(a3mNGzJ4iTxDI^deDZb}^Tf35!y{)Fooz1DegFsX2Rs45Z7R5F4zgiTBvyKv zCk8X9`dE{AFuJqy)=iQLeeQLKYS&$_x>&1E2Qk}jXp~zZJxCl2-;)37Q?ID=E%LqM zCdzN|IoLn^3>+B&I?Br6q3UI5`Jm*yT)F3}w-N4bk~v?<5~B;H)@SaED|g$h3M7EH zPN!B-tz2qOov7TfsiL5&lo-kfC;yqO>4ScY9q(-SkRNo4ES0(sbZfGw8|ZSOx3ZJp zgjl!<<

p;h0vKEhXpGSKyBfF!Kn-^P=N`qf5vJGtRJ1m9`#4=&3@0#4<>R*h$5k zg?q)E2Mhj#W^9Y=C$(Eqs4JpIZV|)rZmudafuADfm36Em+8SGdspV5#+(kxWY3o|@ z2UP{l_e)+uXMazu@hE9AwHii7d+dt(e&e!2z`VBkdy}{EKMXGREpXB2SAizdHZk6tcJ?x&S z0<8>eeA$V(0P)oMfxu5SQPWjYvt`w zrcfPgiznrW!p&3_BrPNp$XK@%U{ zEw1d-T~Y9%nzquwNQ&nNWhCWM5y5=0kLu=2#*1^ zEnl{BR{+PE2h481Q=o+CpIDxkTps|S*|`9ce0Nc6dij$UW12vkj>?1CjVHCmzdORq zNuBIZ`Pnakko)09_h8@8{|)B{`M)`KNLYQM2~mQY4~AhEcU>aiw;U~~;A5_FS)X#^ z75EA9cn=R?*N&y5XxJ`GDbVSM9q+f6dxI6x%NN_Kn1_ntR4^b8H|^a^@mU>4Pqny< zD7RyoqUx^GYeAw2)-{CUXQL{Pe|umu37=K$4NT?MV=_6LQmH*a)qQMSfUK7ji#y!v zg3SJ#FB3_x;HiSyaZK4I4Bc!VIi^R5Popnm>UtTrdmlBB)Dx{`r88*cUhfljCM~DK z-C=5=PPQ$_C_b+Q)R>~fx2aO>5Afv_MO9iVL9_!$GB>%QFRenfZ1J=#;mVFnqUL;Q z!(*3F)2cQPrR{XB)UKC$IUJ=CJdQ129o5^Lp@e#9(jzFg!~%;P5tg>smW29i+7GU1 zQXLQ0A*rEBeS0!)?33HdA7CW_Wxbz>D)*%h)G&_W2POHY0H45uNIW)8C53tmZCvee z%YiOAe8EIHe~3CaRth4|y2^)4{s<5Nr`T<(AF*Oz#;4>KZFro28Ej&45{3B(dPV)3 zLye!j{SxEfpS=A&1X6#ffSFIf{(r*T-{*s^Tjvu_M!Eng!kOXn*x`x7;41eL?H-51 zt2ecdhRab~0R)Tmn$IRWhExH{0z*k9JK9mlcAEN1s4M9}wI+Ej!_-eTAD7`E)!egN zy*AufRToDGF12Vmoy_5v2=~?!G+2cTceGLmvLc5V8I%O?#~ zn5fuldZxp~B4`E>*BoQ8%)F=@g3W37knWRu+Fh*;fZQ21kF{IZ&zFzWq6&ysjP!*< zeCvi3oKfFE4@$8e_xAO*%|_tH&=$xVk|0%kO7^M;P$dL`c$+x~`lCHY!g zNhbqR+SOVDY{nQR2ww|UlVoigb3tAOewdnhf7cmr3bZx!Bmj5BZxTV z6H@8Q-{LA7K8lhr68kEt>tNz6=Wvo#k6R1&+DE`IrP6~(qyKZL^Ru!Y9a=Gwpnzd> zIJ^P}fw@cBro*{OA=Z~dZb(dP8;S%L>JaYvT7KS6CZ2R+rWeW+yJGD_C~Mt-O~btq zK=3^?V6^{HbvpaII1KjD;!~xN8nzr(eB6=QB&u}sPHDUfxrdFmD?4a-#*ANf7xb|^ zD||$?m5ML*hs$#{vHO?8&`Lx!NSF%SZ^);8%=wgQcgWwZd#-ME6o5`N^YH1mFm2Ku zTS$nMFE6pTI|g?U3AZT&nmL1^OzV2K3zu&gTL28=>A#}OT%utCx@DqP;xoWPRBr;% zzdMLR1upB*T9tV^i87V5p0%;;OPem~UG zkgEqWs#+-VwK;YA@JK-!$PW2YyXpkSel{>v(35@GqYA{4+LWcSu_&2%(DR2QLIq3ACwl<^jx6Zzq>lv?uHv-$n-BPouF&-nEHkKygh%M(K=JDyJnTpR+LS=6HJ_u~Ap znV`P0rNf{pC{NM=grVa|#LTcdI3)3e~7h^+xHTJT`%AmYK3gmLF6r($|a17M63sY+82c)F(nj6M$6C?VoZrOdl!gLnQ-Bxr^&0wgZ-| z`^LBi<+kTVwZ!BTKiSnnY*w1geUmGoj%MW7$ghhUe*1ZTIN20pg+88?M_tM-p4|Hj6~1xe z{Z`hE2fOE5Rjo-+{j>1re=c?N`=8!__x@GL7cdd{!P`#*elg9{SBy@Xm4V=MZI8zc zaQ@(<_&kkSt;c&PUke_y8S#n5xFI^%!$eWq04r7iNv-Jm1QIcjx^w25WM_h)C8e@m0(D5O*%+u>MPXNohXoj3qsmZ7SRV5r3Dnj+y zlY+i&Jw#_zJGy(3w{w@1-$_xL96kLOiQB zosuQqTjZo6yDRy5uZ>h5OmTa3qY3o z$fOvsW4CehQ!9wns-G*sKRj;B zu?7Poo}_>hcY#?FUt?ig>?s_I*HCWju-w^vKD`-R9n+~2^?DhGfv_Dc1$>kM;sriD zCSS!cOQV5(*6xCC613#D8(4k-)+HbM-0)!yG%>c6FhV7U2R11bjgg%C(LU?9;q7Lqc00jVa|^HSP{hJI5s-%B%K>dUzB#tIz+AiCUqJ~6m~8Ev z57IU`3X?B^KE@G+K$xgtL4JHlh-W!O?zJ$8#wx-#5=VBm1>@3Q!*#kK5c!y@pYR>Y zS-MaCehjM;it%={X*FMbK7p(ExPZ?{dt`+o002IV#)BuT?wDIepi-45|&V^1MO=IA5a@RkaonDs3qZb3%)> zptlDEdTog7y|n;QNn0J;#T)x7b#h<}aIH}S45dU1E5R#*XCOBPl@OMj z>nfY<3YDp%CNq2lJQXUim@t{Fr$5p?a16JGST``zEn4jb%%v*%G45Qds98+r){^4t z=rUOB_hGORN8Vhc?uY!uMDI99GdFwfI?Vg^y2HzB<49f76EZCj%rJ%=KqRdoH<8e4 zlaAcMtCdm*(2z+5`{k~$HF8Xr20JJdX9H1bM5S_NUwH!_`eSNVI3H^%cO=?2p_>{u z=BTfr6cH#{rF(TrSah<$-#W(c0139 zD3%WHg!3rIOarw?;KWT_iX)`a6&Y*Fr>a4GBGIqBWCb@@cX{S88MvH;?26_Z%NWkEzBuH~rApVWem+c+-2dRNMa%BG3=5Qf*WVgw7hHd zOr$HJdR}qJx+MZY(yN{eScwq^=I|*2VO0|J2yOUd_FbTMyQn@rV>KYkQcBpLI5wT{ ze+qAwy)hX3m7J){hyO3U|5%@Ug;47!`@~!2HO;D)hG{(mRGU?_IjHi0 zZMdEQj^s<-a|MKm!!lDM)ViIDy(76q?CY|P63U3-``bGHG}O}iQ;C9ZkaeK-pN zPTGI-v9fs6wppK{xhi5sXK9cc;LR#bT(fA&(Rn>A*LT+)Fdt z+(%k+2D%E$-63y%+&5ey5Lu9dzY#5fpOOzL_M)mVLxNLQenN@a%c|~~d`}S|sjt7A zujd8Z{)LrDRy?uww^RrF;(Zo0GD3vBQ)>$fs778bLfyHtr#|F2bt3%I{;DQi5^Joq!GK$mX|T!-WjkSG3F3H*1^Xs}8y|FadeY&%`P9Qq6VRF7L5# zvFnzvjP6AE^bgrTBz+Txgon-J5Sc9xy0juleP&nEU=u)gm8z2$&b{TVN-8#lhY>S; z?;|;CGc-&b&hlK@uuB7^i0DH@N^&`d3V(N*Hf-yxbWq_yRusMa3P3T|XAMLtj0FHZ zDh5uv{Zh2%mA zELb>_uZ#TY454>xKnU2mYoOAdAV9osDfD0JWYb5G^JYv8 z%poh{a)3X0?yPRe>9_ zke4kpYlKLqFKljC1KF88RTi-a&D$R9P8@ggRn2%@@eU%{L`$f-upD7aL)YlPqjiR% za3PCc5@C%Pz7?=BTo1ao#KtBnUfBM| z1EBebsjuXu8%xV|%L0=Z%yGH-n^xKwH=}T$wj>u21o|>vQ||RXVrjglJCD|H$WQ9GD%S#p1y`i0H<)L zfLN=D3DF?yaal;5Gyr)%6g5(A2H+SHhImIL7{b>+g?j87`ai~gvOV0A5S z{+HDw=k}7cL%Z#}5Mgl${;q0fJ4*y@>JrEXJrA;;UIONmaQYVRb zUN2?u()#KdyaB~vYXyJ|3Jm?^gB|u|iL?dBKt>MoPKmtoIF);@NTuRKE6$@+Ogmn} z*q&gsukNy3Bv(KN$ese25!-Pd)oqhha?-{Ij)hE`xORtY>L>2sF8#QD5t-T_Ob6u& z6F__AkEgsyw@F)D?ix28DcVJcbs>;>`kPX|qp4BdqNy?CrmUxsFU!DYA%iO;+}bzI zJ2vK@K8DuX5Mq}|_9CsMJ)C`xrA13;FdyAED&Pxg+eI16!%R3;o_t;GM{PnR+Xh++ zg7KnSbCaEtS+b(^m1H$QhYhk#^jB-4*S8YuG=qv0SIBrwT+Pj~2$biOH(Qb9rPTD6 zeK!jDcJYKu!}dX9_$vpY(rL@jnkIHC7+<{FRcH)PFoZ{M2Ol4&SxZ1S{%Hkz%g?V% zP~D`^BUT-DhM`9fppMaEv-ey+x=Ta~EWt5lu0u^it_eJwEpc4&O<;7L57%h&KN8oo zN9E9#B{e*d>SJ}97y{NSdP8{RUjc>L|OTd#`H{ ze&r68d;4KALpvl(B{o9*`n#78U&8V5m-*RG-~agbBPtgCQ$CV%Gdl$aVHjFh2Tt0kv=SF`t~9+*L|5T3kkUlf$m-R10ERSy{sI;NqwH zjFd^MyK|RvwpWdvHb7PX6~@6Hx<-@+!}h*l{KYK)B%Y!MP(Gb+(>-uBpC0YW-l$K> zESePN)gQ2}UV`hxhZxd*cjnuJOS^&r#(c@cU7FM0zz>u@epBFQy4sUfUIM6W2vCmp z?pnwfpC}zo?10FR$xuLo9Jf{$_mLvjVk6 z7DS1`tO_HNK%Z*Y*^vtWkWq<)wtFQ3w({9-CZCF;>GB`L|Mee_jQZu<@AI$W?N_?i z|N1-s{J$aplK<9!{`%Wtu>k%WuYm>%^0iqD3hjxH%q;K0GSaRXJ7ij%*+VdFKWc3S zy)s-#P@v6AkT>MIgbHS>0hhy{4cj#J#MvXrNqAvC*0rfgSsaIFg*rU&7xqXCQtY=} zgn5fwI0OxygSAe+>0E)WBCkbGEpH#4sy^UfNa8eNLW`|?tvV*uoRst}uS%j|vA`GB zi}Zy!KREcP3=V0jklz}jD_PDe0L@{aw!5L$me#BH`J>`;8l{Mq-!7Ps#`LnuYqb&e zScZbbx(W!-t3#m%^?r5xhY=ol3^x#XsU%5qH_>AZLzlTRudpm_!-v|9DT8Vqah*^B zAbM=iZt7;_9QWs}@ce^>HmN8dAHcSQbom5k8Me%P7=h~APqHobE-x7Qrg!u$UoW!8 z!WoS8ybDb>6a3YvT%+7o0))U)3T${G_#S+B3q8n&DBJNscFWh(V@bWj$+@F{i_EAkb+Nz-bwN{uc)A-S~aO0yBjQo7XoTK6XB2|Y15j(Mr!aBjVFx2 zho6E%`qK|Tktpzgo9n{kHEibb245TaUrblrK3KHn=P?qS9{5#$aRaG`QW<8efiPQ< zuhzh{>l|7K`$?87MoGXPEF|u&P`6;tp3|5BQ=DvmqGbPAU_q zE+<=ZU7^`EOj#{w)EJ?S*vmmLDP?elokaK&&_n?!CEVzb$mvqGWF22SP+$wSqb|K% zEM{;G8N~y;ekcTtAAT+&2NaH@wP?YhYd>J!i@kE5Is}a^Ru;Ni;sU?5F-_5`6GK3y zVhOy!-V4eS=w2iIR~6Dkm`i%eUK$(ov;0&qu(7Se;k2?f$`Jug9@+bU5C6xJwtt^> zWB$3C`TOs}+wa{r=~wyrFW-N!>HWKJUvlsCibg4)NoDC32O&n@O*QqiIXa>)V-RS! zjS#vyTup^06Na~8BA`#Y!^22*sSG$o2(eD;M%0BaPgVlS}Y`h3YV^7eAZ?2?Yw)UEp(+es-js2WTq+%zjV(*;;!29j zOhBbD>_9PbpEbpo&|e;;j&Uvwrn{0WkD%~xj!5w9_dnRqiKvE5wEI2W<$w9Q-IQ+1Pyt2k#3KM|tP96&@Y-sx2PqaKaJw#5d#9)J?-M|nYE>h~ zG2WwbDdy=>srjCPFrdDv$Uz^Df3hDsF>(}ol`fPlo^N&qWS*~ZOJHpSNDeC3r6mqey|vcNadlbq9?7@C?y4n2 z7XC}O(v4B5$#|P^Hj$=o6Yh1XzJ(MoOOjqQi_fhCj;1! z8702)cDX?NDbcL)*-$Y#=M03otywOnC=_(8qS6!%2N6X$1W}<2I%KCNo9sbJb->V| zU{e5#Z$Pjy16+40J22TKQ#2Nsw&nNsm-4^xm-@dWYJ3GN=ySnA>8YPyKK#Go?KhXF zlzzFMd;+s)EP92VuMMTq@1Yo=PRsnSOO(}la!*CG=PyZJnAicx`#7+BfZLk~8`}HX z7pv>u$xTD@JG_>yeTRrGaF8@q0TX@hC+kDkuAQaEdAc~NWP(GaWldzHz!0wNoN*sr zT}n6UetlI{H!6Dot>VIpT1(p5UZy8v=-nPj3b8?DJAvJ6_rWJStlN*ohAGC~S`74l zyp-3%{&!Y*w_$@Jd%=%~0&-Gd*m}ZY?jS^f_%fiJkomU_9Zx1w8I|6pgJvdJ#*OUFbOoPgT1O# zko&nZQ7d5i*UL>lq_#wPvO_7882p=q?UjUD18QS;60ED%cu^H(h>1%abV`4njWY;x zsGZgaotxD(UEm9sD27>n19Jd*%+Xi1X;fp}JK^rBlLp0t4L;sTv*~h~KH2lqP8G*t z5aWMKU0x-x7)}X5{kX7ffWm=)Wd(pckn?cusf}lSZ36E?6{6cMLO{g>*s!B32D0MG z+TxEq@+W_SFDXy;C4J<7_Wom?BdC|#4=x}6=KYKC;jh2`E-pU&wRs!BgmiKx4ejzc z>j%t+nk)c8*AT=RVO<-mSdUyc-WB7lmkMc5>>e5w3aFlknLD0R(=IcCjGI4QmHXHp za6xplyL%?dBLw(x^&t%KqtlploFNacVXH6e0JI!e{!oOKRJtnkix8Fd8eSB2!}291 zfC++UD(wFQnL2H$3S!HILBoq-0U+TmE$RXbqqb(P@d+ef^Pva0&KLL(wQJ)%F@ldz zQzxMKt!e={X@on|QD#BJPP!SiCnxnSq&hB6hXia42M|lE+Byn3#%$mK9N&prjyJVt z%4ZmuY}?>Lw#j6zQrO4UD*q0GKFjmcfp}pR3M9+%AC=j#wA?(a1136BG^i4Qn!$pZmmn*O`D~<+Hb7%=xc*t4^ zSl8XL*lHVD>{d?z*~|Go%-5cZlk2HffP!N68X+Y%+GU)fu?U<^SZ`3HY!0kxkEI)SilnFAc4!LQtgYX^#iAqpZwOh z!pHLbzkf5=qu(1?_`^@%zIgvM=r2Fa&w#x5RsL@{KY-=qFC=aR)8~srm*9^B#&!i`S0p%(Ay`h%+?${MkoR+OqU#FISzKA zjA#!Q*Tq8A`e;=L3n8Kg_?{6117<+p7%nh|u8FWy4JA$@q-AKY&m1SlSYUH`jVg-b zsUGS*?W$aVHIHA_BGQ%|%d|c)E_dg>rJYrY1DV_fJ;2x1X`@LDE%Cv*)(n&BqXMg$j6@Lxie1ZZAzs|q&^Y@=J;GOUg`Df(;>%A?{ zEbAu_XB0}k%Xg=uzZSYAeP&w_c}HNYaVCPBmPmG>jJc89uj@Lt&48E>LI*6EZ z0DGY$n@35&6=)=dT}QCP@_iL0HOvy3*_l(h%8%A+IktPgW&cA*8?c1;L z-|+TDjw-vqzXxRVC9I0vf?4l6DHK*;QiDyg)kMWs9a+ceMEd zI-F@d<{#ioNru<@h2GW}k9L-lps!NwZSSi~c)}~1tSM;|G*u4u9FoG`sX&&EMWp$` z20ds*a7h)piKRdXju|6*3RJu%|Z-^7xEbv21jl7)%lW8OPnZE zB*z0*^MQiBT8lO@3j*h(*n^>U7`Wa+n0cjdPXbB2cZF{Bf0hNV%GfaASXvI!nB@Ih zK7vH;-WXnAxdp1)tRaFEY3CCy3RkZUaOjvu(u6}L>+A&1THz_WAuTkS_O(;dP6HI_ zc}fbb0oQYqmwRjCLB-E7umglqD&pZ(cz-r|qZObDiLI|3hQQ#!&br@DNZ)*$Jwr?3=$lIQp_lV?>-ND~Yn4ahOhXkQE^ECI@Uj+!P(y2UJFI)w$QkPL zoGAGK0WTVK>D15uL|X;I&85elpyCe&O1%#IMtxue2P}-DbB};frULje6`R#s6+lxC zNd3N(l*q<;1f(+;;{&){+`J}9OFQNr0FobMbd?t}jCTJ-$r z)~w!{s@qhkkg&bmN=mesIJnMjc@JKpmYLUBPSKYzz@ag=U@LaqSWq^Z^~E{)Aw&~* zD@!R>)c|O;6?Li7B&109B}fm2>!(Tarwg3Ceyt`4PU-8Z-Pje=v-oN^h=Nt8g{{Wb zN$&qH{GUf$`O-aCfAaOW!`m;VO9)?o`|{!Y;r;iQSI|o>ojj9-DQ=v$M~l(AJ2=CJ z4Eb=}xE5&=^eyE?;Ic+aLw@&QV3g4o)p&jmP-I_6fg#pS`KDi$c9$EG zS&V?a`auu@qQX5LFt~pt)EVw!OcAF*!-bFU(piAK0tJy`1Twmn8Q! z&S$}yMx)9n1Y4n%4$8I4k2Qm;3h0s87sYDOu0pSkbkkl+0fBrxpK*d;!>zoa5gFTSdj%$$jey~VxQ*> z{|hUy-@fECKgD43_uOXu;O(En`>)W)Lqhm}J!N_?!(97&ARg!e5x(VepF?#f9p2le zZnQ~J`H`qRS zZeK#b@F0)sKx6%oJeF>6cTQqDd9I;)CrC(DG2lAe~`t`Q19{t_(N$_95)u z;$fkUi3b225CX4vOOL#H0ElWG8ztX1P)~P-RX3V}Cyh(Yz^Hu+o_kb|q#^d{q)mI3 zX5wa&;F$YJ@s?j}$|N-;`o!&|Diho(6Ot+rIFU|PQYCWbDK8lQ0tv1iV-@`ybah(9fxB0=B>7ESY_#Q>PMq;< z_K4sIv<7?0?FZJt){djDp(vEJjR`V-j4(LDaVYdH7E|vM#VF#Er228~q5q6OrC!oo zjv&8z`#ooeCbsmm_aB9?zjOKUJxCCI@9mHB|6faY@ZmqdexatFKq zd1QL{lr7X3MqqHB6ePQcrz#EBE-Q!|CCf^X-+;+~aVX$p+V_cFMUYk@TLoCWvHNgw3QpdjvU4ab+u-`0t9m_Pn=M1e))mPq#%PjX@1#izzca+M2WnmBy z?e8a~bqP2^>1xKxM3xW0f`?QR5Z$JPs%|poCMnH%v#r+LLQe-8LLO9(j(l3$jk}3y zIWiZd$R)KVBg2h2R1fPI2Kd>;%P^9>G$@MaRpFKrFCj%fCMy*_}LTsBBOdtsUq}3d-CNHf&Z0=No{#)uG#-k{~C+>_o3>!#x*gQVvQDQIh?S zFOz?!-njb*^=fR#fFfzJk`(Ufh)&+gRhaS7!W|Yu+5nPcVG9bmn=L2-l_#$&atBtxxSMeb zg9iqkk3>&^Vt?lPT5ToDv(*ja5Lgv*F+78EgtJ4S1*V9JiVAD7FzRpdHLTK4Nxhl) z9H|?z#f-`jFtJieDo!~*eg8+rX#DNlZ@>O-9vpstd4()nf*e5pI$v9tS9tDSXa{PB z0mGnB5h@casG(Zuy75Tio|GbD((F>;<(nFRj5DxZ8Rb^l;0K(5a~txlD>7Bo?O*pw z*@P_${|PlHWh_Z$iR z#M)9COuiC%qL6-OC(PjHVjb;brOXBMPL$#jr}75Z;t^MGAZ9`RX7t(=toTk-SkMl#M?y2BWTlCafVuCfN6s7J73H??4q6qR{6At zt)NdkaR4j6_fkIcK9vgK<{?!~#z&5<1-5!*p2J^wbiV_oYf0#bsklV|=s!x+)nczO z=>T;F9onlM2vm9%%8Lw*5(u zIL^f=$B2ltxfe*TZ=|fT@#tsL9sPaKUw$Y5{XCnl{1&is{RJ`PetCWp zmdiskuK6<@i0+59zJ>Sh>N*IYvAbFU<~XsrSkVsSP4(q28|jANgn2)xVPy&8?@7s0 zeH6xWi3S8EfL5BJdvIjk+F?Xi<~oMp9>6kGejfTQdl-&3DcTfC2OFu!P?Nj)RY#BZ zM`1*pLkjL>lqP^(DH#OikH2LoYtGz`Ld3xUS^Po)c}cik6S4zZ&xtlr1$B8{lsL!V?6Mw??VS z_-zH0AI(_}U$K0mPz6)Z6d;JDmG+vP2cY{}t4AyOP+-7m573#kcbt`>WhE{-4*v0XpqKBY~-_r z3EVeKuKy8Ipx=A@hw$OQzJGRkIr;QSK7YvHzSdJ+hd_V)W zhyei4CH-~{?t|N_0$XC8y~SIQYLT>{^$7~kN}mxhZ70ezu2{F%u5CPnqj1*1Sog5+ zNI5q&$#WwqCAp3xqPC8t7^K6s|m*LelmXD*ThTP*T)ZXwb}%FI7%Z$2p4R-u6KJ zjghV*Qr^xji2#xq@ZUI6O5lna6C_@2ZG*e)g?D#1YWh zH^uz9gkd|j4h6t2oc3?1KxxL8KoZ6flf`NEfKaLAz^r|+QOVfh!WfM&MB!ziFc(*# zUSA2TON+t)>>$G95sDoWLAh_L5*l&tq|wc$lElPPa}kr5zguZef0sP#)kG3o0cJdZqO=wl2rtSv za{(S>P;p>~c;Q3auxA9&E^!qkNT9@dM?htJ=C^!|?@zIgxR*Wdo| z!}njm{anh-&)z-@`pXYddA|P)HRo5sY_g&EVh!Sxb~BG`Uq6!m@zBMEL0o2_Z!7N7 zR>^)>8W3UC2H6?s8!xB;4)Z_k-QfvbqGq;;q7c)q4u{Gx%Lj-TtZmQ9oMecgKQKR@ zAP1$-=Eq7^YO$%~x_)wRc&zSiycVlQ>NdMBNMS$@NYoI7T&TqIlSqMd(8|SR&)c`^ zJ8X|sR3%?$AEQN=b+)dD2olovjl_$2>YNxb-HGa%vU@JJ)C@dv^Jab0;{^?pTFuF3 zX6y#=9*5sSL5qNN^Sd#-Zv6{NBuX6s zd8Z3_M-ZnT21C-dK7A|oTeOH+Vrch!U~)0J3DBS7%1;`QS6&j#B&G8RZ?`d0T}uK9 zn7R~*DAb{EsW6`}rAhcm2n9Ql_yCS~oVbIh3{Skmy@-s*>($}H|0(>Z%!~dH;lp>{ zKG(}{VbS-8w}1MEe!|=5Z@&z@P&yO5Lx24CtM{LS)TEF3Fuecb{j2;p|MuL92@v3t z{+jsV8A6>1?CY$f5688v>UZZOoE4@$7Wcp^wpf<5e6W898ZJ`WNGN+?Za|LIm=&}a zmpYw+8gh9XP;qyz>gGlY`3uxSkI*?jT2-I11UOE(shr2)15cPq&xf}f43(@ehbYr! zC<8kAzMY++;E*6pUm|o*q-yG)W1vR)7#meYvIae6c{L=Aj?TwjMi@eR6Rbuo8pl|< z*KkrHv6T-1E%W|J-qE0arMsr>D&zzlfR#1U=^kWDHB|$2-fAGVg*~?9*rr*87-j;R zC5-42%5;%>iA+S`RBf$mK7cX~oM)xZIve5%0d}Qg3tet)@fJ+ogr)S+0X=C0Q8lwI zrpP^HLv<8~1|KWJ^$9azskJbU`W$B#nDM~E zFYUf6VGtrphXU7{xTWYx`^mJQFJ)Jf+Jwc9-v&k1!!) zyN-=&L(SzSx>~NB{zZv~>?pu8Oyt&qeI&QeY!6VgI?_$o_e*PqwWbIw0N~GHJGUpI zhAn2LT|jMU=MjCh<@ZraEt~V2*5Wj7i+U~F5tJUainRF{qEsl8R{^iDyjopdM5pM( z)3scC9p2nqiX5va_u{x844^M^gO`v-T$?chOSv^Bv7m3;%7RXs2WwJW`Cn*l3InA| z<0E6`Yv&H|98^OR9vrC$)DC9@xIToI3N$8*)CAb|qVzYFh2-kf3Dt_+5DD^bmh(p( z&68IY7%<$Xsj#z?-lfK`eGgy38$5m7!z5VD6p@un1wvGWDDfJ01H@L)KZf9Gb&5V} zJ~nc!0>DpR6%Y@sCaDn!g7)lDvOdT%DliZ(JI>h^EZ0UG%<7tlBfF_t7<-0|Rn_zeB04}hST9W!mF)F=2 zc~w;xr6uWDeMYql6EjQw5OuSVRJIs$OeH&(38QsR@ut~CQm4Ya^qBPTz`Yxg5V}~# zeLkDVs^U)zuW7b~gT80)KM=`VIuWR>zr`NV_K;&u!la*$zlBDSomwAn*l*|SaE)sG z>s|w)%Cjp_E!u8c8!8|6ETb@~7}6^`j6>BDaxxF)7hY5xaJ;bq!NO@#_N!b*>h-}~ zrsh8BiUp{77@l2PHSVayIaOFBJ|}dFBY?raQo{T@ayJimLW(Puu0LIYlXQsw!7NvO z_c(u&I3Vw4htg}g?l1Cp$!Cz$NyP#9s>nxj3hEHX(lkke!;E=N?9Y)z{V-2|1sVXW!ITeIL4TCgo5pq4X^Uba=@+m4fDKg-|8!#k|YCmjBN7IQ^9k3hZvu z6x`t)3Xg$wNJ$x;G)I(j;VK`5JDT<)nae+7z@*G^x4$e+w92s9_b-=Mn`oel<+EWP zXn6_^Gj6?Moukz?dI~3c%t^rqdg z@$^hF+P!caV%(qvQ!D?-csGRdD|2ogz=E@&fLZeI3}hIOgdP>VzBtm^XwrCK#*^5P!9R z2xMW3>k}U~Rb+RyxU)Q?7#eIw2Gx_D6!_FK>dE1EeL0k))~l6I0H&qeEH|k_HL{t@ zJWM+$PRi^l^$Bk{&2e+9GE%`$zWf!{*RB=~tiGm>%HSFc0a3D;B}2uKM!*H_)K^ z@WuNNgG8hc^4~vZSi%p`4TkrhTwY7pTgUQsRc&}nT91d^XMH=I5RzG`Zp;nC9co;0 zOis0~Ytmn~_SmUxl0Vcxrq)UcBOH4k)Sb1ttPjXHxdb&ZGz-?mz*L^f;5-DLjf)|7 z^$0&+$uopwN?y3L!$bexv!c`4Z#4mBDSgS@a10DGKLK*KS!$8@unaF+7GApXyz>zx z#OXT`U0iCJY6vK{SckHVpOecm%nFNM-JDR`O1YCieE0497WpuQseQ{J_kS67r%<=f zK*?Pdm8jH@gbMq;ge(?W&{xKw9gs|^k*Jjye7q&sc36A7iXSloVP?Y1K#XCB<5W@C zA%KivQ{7-OZaBa080tJyxg&Mlj1B!5!4{>Sk4 zqkMfVZ@&IEbmM2@eo!^rH4`(GL>iw#x|UErVbVJ2sMFRgQCnQX1flk>S~+%XuuCav z#{xW!N)1o|p^2{qKdtJ@bK^BYLPSMNlARBS^?SDksQ48OKpeOa zq|tn+5FjGUD{oI)P3Tl+io=GY;jp764pC|*loiqmVCspx#r03FlCpPK|0tyGT6($n z4#lE~dpnXkh0Tq5NA!w3gJ%2{<*YKa^6w;{dq+rCJh{;NGn~{R`f7+YD^v$3#w7TZEPuX#+5NZ@?e0bGyg~HkOzK_yiTI z)s%j#BYY+?+(Z{FQN>v4M>oEb^?M=8$106yA#7|+;N zVjpH(Lo_u#R-{gsubgFi9J{`so>h1pLrjflm6w=OhU+52Rgr);VWVF?u}m0B`4fX% zpQE_tVmfG_5YKkcRN6&CmKp!)^smYyw)R@JAZUsZBI{i-A zwo82IjAdr0j}&0XS*j5Vih$&Q05h#c|NLM2HT?Jfz(+sD&iO~`(F)2?t)t)NXTS6I z8!T0S1MO(yi5|LksIUxiS;D(Cr3thNgq`47RELuE<@gA(r6rqu%@4AkvqC?=4iwKezRM9>6|Es7 z9p(PQA}CS4HL3-R?-D-=jTOQw7>uJs3IV2>MoPl$|G;U<)2dSdCQOJvpp+V*nw&a*nvPs3Bo3aGGLrJ#(qZyVZ|;PPyh`VqPi zY{Hfrl8QbhNb3;166i5f2D)Nr4C)Yh{7aE)`_>S;^$hW9EGVZF+@y-iaI=&9%MD}% zR@w6Xd30(U^?a77*h=z;GNP3g7#;RWT8jLRn)b$RK%EnySFQS(lK|ChS^4GFs)jOO zYHeUJ|CHO#O2lguuC@Su1x!$meOl*{s#0(oxS(WK%YsX#vaQrklhiiTUTRm_1`tL1 zzO7wk5<~Iav0LDoAYXhkZ~^=a6^X~9*`|(V1!1Z~!WGgguaN-kGHeCKrZe@skRp(T zAk>K`&BQ`IH;aAqssqj^@ql&u8aYbo3elZO4#Z-E3Vbme_AQ6$45k4~I=Y9!r+u*j z#Fq5#>>sAr{}w&Or*Ebo`8|*;zh^j$$1@m8O4|3k??`llE*J6zs02$IE_XnVqx$p? zvEeT2epdC_u_JaH$ZQ%!owX+0+_UdcyWwm-MTo(=cWBWE))s}+OY}}VTTQ{Fy zX-1coW8~bjxKOMbPh~0(h0uwPVHS>R`Ygwea&ULouHDQr$Y? zhL_x8HEVfMgQ>JaX#vf1MzIh2B_h=zjk=W`u)W!wZ>**_ZexYp+OpKN9WsIAB-sik zcWkM~k+4>~=S8V%aSAMLTnxkL)3>Tu*jK)ciUDE!A3Jza!!ydp zms0g54OFcoJfxoL@j)-Cr7l?qC2)))$ZqTsaKQkfLUsS9Q_b-FhzfLz>Q1_}_P%aF z)nM#*7$4k%*#|dIY-AS94FD)KNi(Z^0Je3;g@odv1?Yz0(}Wg<*K*_79ib8sjcxpO zePiQPbJvylr`p1rpelU$FYmtqq7}E|-tU)kD-Ll;Y0;zyzo%CxW-cyRJZTZVguxCJyCm)ol5=C0TZ%~BXOXs1mUOaLru)ut27cOBSvoqBZ9WZ+3B=Yc#Tph15w4aU;_U{}XWI2}{{SWwx*6Lz`B@*a zDs%{!9M1vcjJmzrsG`Q8IYAsEC412|$bHw{vdL9Nda1kEtCFw^S7)Kc&Q5s2s^}W( z!Y&FaTrh*b^ZNnw)_|IF-}n2=MJuh2w9U$f-V{B*^A&!ID)0EOB8j(P|ReJ10qi79l(SEoYrV6 z=Q7Ag&?%~WO_JyvLrP50+Bk7c=c#nCG?tisIuL?0!fb_IF@)V``uZjaEhU3(uxF% zcb#~(^N#(X#lE=dfNpZ;EjDeE4Y(3ibrO#N-lwmb-noS!~S?p(N>y zw@g?i^4Nl%bW3G^34a;>;_~O=-(CKdYpQWI|(ks%w#i z#D0yVn?`Q(G1D_!X)9ON{+6W;qgsC+0Ckgq}tx? zJpp{0y!Brph3Z*+_sw^bIuos_T0SHjSVI{Xzrhk>k!ps>+5vb{iObxYvieNq}LabHx$r7!GPkFv!o}5W*y@_V9U~0=LqEm4L}FJQStsz4K*bsY%&6u$)`hr-QRz?^Kav^iOni! zu4RcYVF&6KC3l{fUMxnnRv|RK`YXal|2_v3JotyV-+Uzh`1UJS_P@A%_^AY*&jQ?c zO%zfgHy}+A3k@Gk6mBY~(qB|6!qfXbsU67EqeQz7F2^ikOUh@I4pGYmmP#8uB0}0Y zc`$EmIf^O_btAYQM438x5~SlZYG8j8+QWzg!=QLpxbL{^=OT_zljSta8d{F zj5*zIs}1;GP4=mEm}_8H`>=+hU0?t-9==#E)X`y4W-x`oETUqtAkh$X)GAh=-kd}a z15Z`&EGl$2;r4x@J}g=5UGe)pQ@C0bTH~_WdC z*dz(0E<6n)QgK?BtXX>^KY<>eJ^MWccVL)Z=Wm7Pk(8Gsal*^AW%BEwr0zB{;Pe1RAW*IARCNk?lhfg?10vAUp5^00-p~XF!sCrS?fbpQNZ47 zdYSb-`b$g-h$S9UYAzoy;PW>qxVmj--ZB@mnO%nYp${Xa)gRIPV)T_T$Fne?@V-OC z3mmdUOZPHsthw|{A~LXqow?ks3?>pN^NT6A^+mFkjT5J$c*3Hm;(QTvaEg`{+6rtc zPEQCM*1NHWH8?EpITYLh564gvN&xs4sp*7iQQSFsohYK02ab_1g0}~kFFDWPhcy% zdIj`PvD;8@tvMzn)i^zH3@_Zf zsx)v=;cCifWGvNdAYL~wWRA#$SuGU}yQy<-ayQy>msB8kvNfQc0$Nt@9#qjbJa!C9 zs3f5vBea9|Q0a8G^TrYuN)uf{U8QEPPSm?bMQWzaiZCqQN(le>R4(=A=!IoxB$tv&}=}=G+4=y zmBZ*UVFqL+1bB-UC9rK7uSu7y@)Nj51q76;$r2Vy2(?EEb@EwhnE1rvftsaA-6OH8 zd&)V7g!zKCX}A$4oggNfLgVa%SRG4DrLBMQ^|!-`fA)hjP8!VE9|!%#uv>rq_Qi+4 zdH*52_kN5WgXR8L`6i+@!4IGe%xbUer^(DO^l_1nu?1_YN6`7VkH7a7JLR2$LaRkw zP#Xs|UMavBvV79N$3C8$w($kDGp)ff$$kqh&`p!?N8B}4=yLzes zL}sOpiSDROYZVt>rYDtmuL)~Y=wQ;k8=+sG^bQ}yKqx-}*Y5K*a^B zztc9I;1X3E0k;?i=dj|7rfM#PMNS}Q>EjF}4RTPi=WT|ka}@yR@dmlx&iW*=7j^bg zAA^uyLL!4GE*$)|bByL8=AnvN4bHh#U(~h0AR4tIwhg{nTvU0W!g7-)BTpehHpNBb;Ykj=Ayp+8oP_jhyNl$VKsn~s@1I+n-I!{ z(a0DtJ9@jr#SVhu9B`@!1?o#5cB>Dse5YF)X7!(Xs_BHs2^GcxYL>@N5@V?X)xmi? z>m+frg3Adp-HC!V(-XWZ*T6tIxX9gGxkF5io^hZBBT6WE-nCwo&gj#b*LCTY(Uc^( z1J4aCX4#=P@^olup$D}hnCXG07YEd2gJW}tdSdHCsRUoLa29-0g?(m zFeW+f14HH64n@6>`37>TR#r{50sv)fzLM9tGyTgCatyQt6jn37C?YJftobz zGkQ4Cfg8u-0s0YXATZ(Y2;nAw<0FILUr?dz7w?~e&hcq@{}ZU7e+Xvp`x>tK$3Eqs zFeZB(;g%|2y{k7v8$=P5`4QkeL3ywe9TkLm=7l|y&X(jpl@g<>(pqI#daKm$AHMtc z10AfWS2*o_vg99tiq>Q3cv_n3O|9w~Z#ET_mwN+yk15QK991gi*_<+xzuv0)+uote zsHF+^Wh_i@xkgb4+s->1YOuw-(#+QEDy><}Kv6)s|V=i!M zGcZ1F8$q3cRFFm`R$G_2XTzC~3YluKV6TDR zue$JBeBsw*IO_%PPC9u=6mTTb=*r~UbDY?yz%IxBm9``RAGDj2Zx_R&n<<<;dwMdj z0$Uy^`Oa2;+@N7dc1gq@>c2u@;o88y&Jt#Ns!t6y6Y!AYZ)nqJyOO|uC!P?9cfu1? zuA+C`g}ednM!nciI$e6IDQr7py(s?_80bCErjG0Eqbs-j*>pffZ?op@0oyHgPuSAY zScPgv4hc7yRqxm9q#`;FMnsoa%=mX#2T)HFRQM0&kU~s9RU6XKpN6;JUnEO@6MfCbM%ezg4Bng8J>0`?P#u2qz#odi8|uILN?5tT;*!U z%+X%R6xe}IhquM}4C{*jMhq5!F0!f|I@acK1vDS!;W6tY7H!08n(|B7P00DjGGaB5 z%CI|?3wskMREJT4jzIlzi3u<{mF%QHCe#mT>HOlMezidxFFvg2k&o3#FkOScpF?#Q ziUkQ@hwqT8dB7*)1^u7zE3QyO!w6E<>HslUIh6xL1&x!}sYk|ldZ*fNNxrVt_HSrS zEPHxAlv}a8u$4y@48Kzs#RP;Bg>h_8Fbx(AQszWf3zriMqF7?&K{2giu4&gp-wdYb zAa&5Hv(gg6;}P8M+btV6*)vdeP_;R$4%C){52EKBmCKqE#b`#zAwjYg@^~LfDVFM3 zih!f&?;J>$^#2p~X3Mf1*OlOVeub-AZGvPH>s@W#RUguAYL5udjK~-fL*|Kml9Byb zW?gzyy-5%Tf&f8^07(EGWOnYsfAwD5_u7${C0T>Udm{4QGiA7M-@_WJ!%0<*Bjg9o zOQFDc*#An6BL-V&MebJmbwOB9A*b4OfaM`uv!Y^NoWy|=*ZCZ>^QE+^OdKox@RJ;T z6zTBpi`QQTN@srb_HVCNS$uE*>LF{lqZFn}ujUxELsZIgiKKH`%2?(?&duzR0p4BK zPy%YW1EXNzlMmOH~!$d=45oue+`Z?G89NX&L<>{X~}(Llz@q@zx|lrZP+wHS0CIAt4IHUvva)s5IY3@24g zaEU#OVq@h5=v)#|j|S)}cfLhS%Ey?UAtMn&*;enBnF|P~ylaG6Dok3^3Rh>z+UfZ+ z!WTYYhWp(VtwK?r+I=L2p#?6N(hERSkxHSt*lIU$&@qD7(xvfy*Xr=hW4W0j>q!mp z{1P5jggG?_6e#lZWqdlRz-xjt*vv@=yi5%YdV%<;3N}Jb##-^0Ay@~rmdgG-kC!96 zKhLmIm;D!87h99eR`#_vk@CHw-mUowiV!jOsk#^q)`q9b8%8^7oca8e+n&yzg1{R^ zV}NENSxe{%^|T#2nfRGNdAFD#vF!v85FE~f+RzYSUEqD9a3n;n2G%BW1R6F1rh#YM z?=jRi?36HJS>JyOKg!}Qk0_x^&MGsc0QOfh2)U5Zd$naEYr%%~cWA)jG$y#~K2i(v zuFfO*5-qyQCV-efsHcQG>FLWi%%G)ERcMrDshhS{)JYpWiX1*B_X3dBavr@zQKT0V ziG>7oICDsVk;A8PAs6^4JuCj`wj_T%1tzhJWCdm&j!vz7S*lXW7loOf3%p2}v$|!I zilAvXbPO;Q#(SEwjwG5}e-e)Ma%R6+3>Xw7b7PmFaEF*7 z<#CRIqh#Ig1a}7ys(n|$5Y~C(ZJ_E%-;h_MgwQ1hsA;>HHn1V>@aZ{5aq8Agnz<@;Hy zUS7gvrZ8WQ#${s~_3z7Mh2hWdmN-)}h-#ZO(ge6ndosw&vo2n#l6T3jQMR726W`rj=?j=_;x5Q$8Yf zFOn+%vL%Fa4r|{r5CK~zD00;{W-U_(n&(41cFpZ-NMhwE?lT;%oyVVU}!wvSJcu3kHmBQ!R?Ph9Zw!Y{yP1 zJi}44AUR}AsnIOA#75S$^+b?c9FCguk373rc0BngdC|_H_ax~rY6Z(MAYQVnu}P5=a{@=bu_>^ZN1|j%rBS6-4~ilcNJ|Q-+*O+9D0~2%$?;;lN<6hu z>Bg3mk_n`GrGH79k6*Dbi3EmQLf$Oes{|I9@M`b8Va5eiNJ6P2G0l<_1X!4GT{pBe z=;$MXRtpt2Rls~B8w-+L&r8tX%(gw&H8aBVw2-pQw2q3`N%Gp zQ)nf1ys(7_48Sh`=#tRi*p*TeV0h@(-a0t6Awik@-o!mX;Ii*k9#gUWmPN>^vVbps zQ>>2RuJY>_QXFC6Mr@QSJeuY5^^%F|zkzdW&|2)V>Chb-K@eU<+V`GbDi z1ET!r6U>S%r+@_idAyrLor;`UCJKyvC0Rvt15bJ-Z@lT@Ui{?2x6XD5UC53?W-yJk zqkvISToEgDHm<*eFd8Z?l5WG7d^{e-cxq7H3kDF_^ZQglqTwxM=H~3^8nE9ZU5V8k@3Y=r>y-08b zZqx=%vRRDj41yV_$5k$+_A$1R_)FxT<4#i$DQ=X>#;GX8!_C7Y8-FDDOGCG16MKcnjJUZumr$7kWd1QRerifr`D~9sR&4JJ~M%3VQ5{v zPJ0?UEm0t9e=4AFXhG$Y@P_M>TWtPFyS4`$Yop^uq9ysf_r$^I=n^aN`8-9e*lC;OO zdL*i=iv(P2o=6s$Uw>)hD4DrV*K!b31ee+$#ydVx`DnMzntIH)U2*r~3EKtpOk|I|~dbgDgo4Hd=I3l;L37j`igFos{*s`sgW5_gx}?-e8$0d`i!=#ca4=L@B5Kdq)*!q;?FSvu zs%RMEw4Fb|0HKbu=Gzn*2YS@ImVftU3DHO}faIqeo*CL0ZTKWgiPB--Al-#S+{-Qn zR>hrPJ9A3X>bX*_B1DcZH_Nd+AL>SGC&@Nfwn*k_wH}(b*mjG&a7zq8DKK50qk1wVxoMW!=>2R71ffBx398s3af% z<54eDv7P z_d%J7N5^D_CNekij;_ct>eYrtz5zvYD`1~E_K@qtyKCXUXvnwCU<`DN^R4Rk?c9^< zfV0gN`=ghGa}xVqGQ|_5VrS5(X0Xi!v?BQ@ zNiROi8AR4xmXq}HKzCIVnEtdU6#*h_8(1v1P?3X?ou1GwThj~AR>;e&koTfe#~lH9 zM`Bg^zQ1s{E4ydo=9lFNKsSQ^3EiU>nttlS?9<@k@hpvJ17398VZke<V zLB0=-OX|i&1TGfce_r=fhn!Sg{r`5JyL5Ui0z|04Abl$shg9;^PQ-qSh zCxdD<<#X2py$JdejXv7x8kpel7wTlQ99Bl^hx#PpCIwNihnD5I_|ln&ZTViIqAbMfP++{comD z&3AFFWOY?|bj$IjObUhuTNNELYE}i zS)NE!|2#*QFJC`{_~(~ze|Yd)8|JJ@WpEtICLuM^8NKPJ z4yrB`4Te5EYgtg`V;8nALsEL=&KZ!y=T`D<;sCB(ya|se@09RdpG(@H$573!~u3d z&NJ+(#iG8ov!FEmk+ycs|f7%39hXy~v@PPl4_0zT=KWiy@NCMfck zi{>`aoP)N%r0SQ0@_3f71DcM@3e^VgLnU3SB@P6L3{} z2w*gWx5=!I9z?A-uEQ?h7+x?+MIroWPF2V$1_IWQB(HCdGk4lL^jnwM&s6mQ z$u1GVD!&V?!vKEwZ3HUqk{G|hzOg8pYp!yfJj<87$!tN#DXT{$TDeJ$MNOcN_ zkEv|d`+$Of@*q1Dpg{5&!uu5vR+O10lh&uGa`2eds$;D)W{S}rDZ0>4My8dZv+-)N z3Q;cGR_d~9kiy~4d`fa`^x@fgZEo&3FU7MHW)^Z^& zBnt^+X#!bgEab^z8ZSrV`OM}@SWI+D3-26OHVl9zEV56mX#R1D+ia_{P=w5Z!vVg< z#C#yQ0qn{aqQzWzu&pdX)R65C`Hx$CkF63HH4i83)}J!sWz{&{2VAm3D_wbmeElj4 zjf72*p9-2T*bn?c_}_A1`h9r&q_|wvD;j$9a=%&>{^vf2#Jdo$Dp256eF9!I3cVCVnD=@Y5fPxV&Aw4l9K*c zMd1M?lQd=8;;eSIlE&GrO42b|Vfa|62xm%!WWf}1J7pr*0hyWoRQyn>x=IGTz|jp6 z2sr6eHhq?FVzr_s?s3+-a5BpII3YVjG}}N7e6nvHtJL3BtBcLuxolvmr1DaLYV~9s zba_IQ?<63Mu@tZ%unw##N3cBTAC-X1%N{yqiiS+}C(RyIg5` z5MxdBfdckMep`hZN-}4w_p%4_sxPBs)lEDkNa;nG8(1%lvd|j6C3i)0-eX!H&Zz;? zXCMPFx`RL}>oE&|KFgq2^v$RgH6R&Kk9oBHW%N#$7L^nei^EPaL&@vH^fZ=|Cp%7y z-{J|d`f3z=JC9zC?Y3^8iUD8X4G(;3ybd#nM)Z2QUDwmKF*Cg{`G-y^w^nDSejdGA}`IlD_1 zVCoe+hSzq;?9Ot&YjNSI5G4jo?$H7nHoDar6K3P#364u}>eQ&nTHeUp;npgt1=V1NjK!!M;@!4>k*Kz6 z#sI34wQyZ^rpGD-Nf(0os!-sGdymjYFEfm7Mz>qBZ$dTmJPETK*^|(3poTeUZX4Ud z;c7GZ7E_4%`RHhoXjo&TGSxvfqSgR`Zq(hDR@1>QV~Re>Qrs(GuN)#Y+zh9SaSK& zB*sQJmxZ1w4}HlJmgPXpVJ6nhj>zw!NvW~vd=8-WmPE(l-LQho%jD8k@C$us2F*(R zFu;v9n}Ed_^-s^z!Hrk44HZoX`7apyK{arxB~+=Hja>&fY_vM)tN&0D1b_e2@Mc~v zU%dV^v`@c$`~B-L6%bP=Y9K?1fe`{2NTkLJyDe#(0O!Vh1^O*0E z1YtI4l3yw70HB4ox=j@-(G*R2ka#I;3d0|1W_Gb`ug>snFOf(M0)&pFp}$4*zLn4JcuD z?C_^ehEyhm`Sx&zi}SF?#egn5#)}tZO%qs%k`p1S+h<`~ zD{m2lOB}A-(Nh7Q-r~l#QmayVVx}Rohh1VcWCurLW7HO%LnM%LItni}kenk3Zb*xw zn4HZ6wsa|B*g)b<0af<;Dd((PFxuSA9>7n_F#yR$*U5H0m{s`-S^=7QU21s`*?dKa zu+W`(qjI*d3=1JL3rP*}men?m1Ju^XAvuyB3b*shu+Wbs8ty>aL88LMB2}m~bI~m( zNB}|K_mCmWLZ_T-6}wWv3k*&dSjEgPMFIfJa+pVBJauLOa2;@HRUIj*R`WxI^Yi#L z62)1}jSe&s?OZ{=MnT%bY|nYXvxDdm&t$WyV((~gG1|J}?KctvB%1&~=Ucgx51+n% zDX+c#`t6T;^Lq&nuipbfs}2U%2zmGahPThuLcVWW@&KW@a#6jW2AUu1ng$gX%YO}| zsr(^3A9(KkS~!>J%p!QZUMRd&)PmU^7*~KXUE@d2vwIEy_)b+pDTBB`8lKG)&^8ZK z!9_K1o{0OkQ`nZ6&12@Vz|_GNV$gq`$7(Ab&5kxHODffG z$^0G57ZmbC6@Wxr*fLEuexPY|^Ee1OH><{nB0gMAkgSCQ)zO?zsAAayL6b|VxWI$}qdYD%Jnodm_Q#KfV;M83LHFa$p&-HX8PHzf~6%6^vtv)|=E^XvbB zumQ5^CIv-p?DYGN0TPtM+U%a04n>dDDxA@trK+4;1~EzabJkKWL*#P-;G}>6#`ktL z_Jz7i)+1X>cw#-;g4;w)KJwe(&{xcmpAaQOv`H<>LLjG4i#!8Y5SQRkZ&>6shyw-z z^gn0}U_r5PoKsb4F3Dhl$xw6Io+gg+O!3pf#iU%b-s$StFcoQc33NGXVb6OetX}ob z9}hxGkmj96Rp#hZvz*4^LMa&J3WHr?93|NUnw$<41HUHH8lgW+w6uC0M#>1*Fv^s( znX2RC#fJ->)D%kXCIna|`hlEB+rQ#mrG^xkSAQx}r)ptnA6%jX#Go2q?m8GrFQ*G= zNU9xPxY^X9KT`&&qrj0jE(!(M06e#|BBKe0>kTQB_kQ zUoS8K#^RlA4i%Ty#l}>6+Y(Fddtp|Y*&gsZ~7PE^>gs-Vr{Nz!^jXT(M@(6lS!#1q3JA7nS0Vvits|0EPCW-l;RZfj_mrV z0Kg^osxka>v;_~tMm2b`QyzO83n(Z5Gm)wSn z3OC#wAl9q%>xCUfc((Rn1iY81&+&fMu=Xg~e7Te^V z_l{vn#PoQAT}9`f1xAi3ZkYw4eOK#%`PlXDmYPsMBvGvg$&-SEa&|tTJ9r5s`C}B^ z;p1f2L{sw%BCoG~|20&HEChp#v$vg{ANQ$SCEwlVQs zmvPJ@^@Nj+RmE~y(uISb4;@iCzb_yT7{*MwXcl|s4>#3QmU9gH9-IYal&R)?HdoR9 zL*qS%i3J_B2jOmeQZHHq9!X?s;OdA_$l*x?hjjqZpjA9KrK*msNfD%IuV;GyphNWn zCcm9EXN$(O+ajSCZ7<`!ujXjL)`*(qq)sa;{KfvGUYpnmR<)ZU<>tZLN8vAz+h4qX z&yRr@`nS70L&J(GQW#m@Y)5&HD96crhm9^9B+v`WT78wfn1KGr>1mAw*U3HFJkVhj zJ>P5feR#@tP-wVX7U*21{dST7%;0SCd>^O4$tkJFiz3az*;5PWp5q4{g7Dhg-=JT? zIiVvm6ae4xjO^eTiB<^}MGRYK@kA2Sy!GWwD4+BOQAjgWL^EQ-Z|2(MDRvz<6{2jXhswl zkI}J^ZBElz?~*f|}jB%z3xH*n1CPJ~D4fnZ_4;Mazk18c}sQQoKv|XB8Oz zQ7a=*x3b-=Z-JivuCB8M(QD|uNN7Ew?_dfYEfCo&A#NXm%@<86ysG)95*gH-Mr z&fg4+B9tUH)nKnfUwwLNU_wx+Y)=<-uol-F%<8D>o|*6AXk7 z_{nLwU?~R21IU+h)1=f}?wWu{%RIAuubPIuW+^EJQ;S|lK!;->nGo}BYlFmnk%hbN zlY`qK0C2!$A$22Z?eJs}i6%qkaUYV$%f@h2xKLq1rwDaWp~{mi4A-f|BH5Ax)FiU? zI$AAh{Sl`nWchK9K6;m~iXG(j!MKJypCZ5V>t}FcZBqKf-v?ggDE8UgFW-Lt?h{Fh zz5wa>m;a6o$v1DmQ*_AdA5ian@%m{FfOmKR)QoZAeF$5Hu_`p6R@Xt_pfEtW62O)z zRwD1`hnS=)Mao_RzAUXiPgqCg;uUFbDU7++v#E5iatd4IGB2l@&Z^#aC{ud*{#n~ke6AsD^QF+A;l!+f$~Lvfkaue`_{qm7F;s+s8k2s%@R;fh*WevF63 z3)#x+te6Q)P+;&HT)MDW-t&yry|iqTqGM;Yix?(WgsuznN(>;aJ+X68C1sNwX%k@_ zTc5HUVBYmQLm#P4sN*WY$xykxCtn0j>)N3>Rmvx9o=DqET{dcJqyl%sX!WEF(4{A{ z1w{xfZ1|RHkqN;?=Fs7wDtj7v!^B`SaYDbb8O zzmmVg=Zf+8=eN(o4?o7trMhVsg~pL6SU81=UAtiJzeblmm2`uR9VyF-0wY-!u91)D z4b51-U2E-rnaH57pd{%E#02?c3OSAl>E{igcbpufo zVi*9mhxybAh+N2M&t&)@BozdrVfBYArn?F`IgJX()DKx=X1E6^R2(X`18k5xFAlYI z4qgXl0fQ`Ofh3CXjoJcYpEif)fbxS;hJ*j*of^F%ixc6nqXJNA2A40nXDF(oBl}eP z^VmvI!~4CG(F|Px3t4ppns&2@MGyMG3=rTDpIJ4Td(Vsq8pF)d>k-v$eN1!jjq(6< zvrSc#NKeoK&eK%)K9UDG_Qd!n%m?e_*0kkn;p}CEl9zfeSr)YD%#~RwB*!|&I?2U( z=|QK$Nj9D##C(kI6~~L=iK{Y}%?vQXlRPU7pn2U-vi#*>CZJ8;@Qq#&^P$U}1x@aZ zXBFW01nZ-mut7^%`XBxkiG!xV1DM2s0x7vB9p5=moQdr|cl z;lJbv1~aLraqmYGt7!e8;*kHQ*DA4Qr@{SY8p4^>K7cLCD0u>D8R!O~Rmb)>#xCgM z-S8#s6=<8Hu7jrE0o@OvN}zFzrsSa#kBFlmixDOPlo``*kqw68C8X0D@{EmP2*<~_ zDBWIMWfxlevc1w%Dr8|wU9PM<6zAgV&N1jk8p1BoZP!F_uG9qcBx?le1Zi^FHazcisM5m3QUY7r6J00J z-04PYq|gp*h&QPPohp2@#%aIl$$LOvdzEXZ8f2)eQ$K8>b&vDD(>XI_ z7r9cCX;rxe;JBWx9Fk3q;lIVDilbGDNkvnjJwyvTjG&R-Ihg?RTD=~YXSCPv^qDy8 z*zA;c=z1zcb9HIvgc;{dk0IFEFvUoHnTQ`s7`Fu<0P93f4pDku4UT3~{eBx&U)(~r zlCXAn$6hJMfa?$El&T|M$-49S)Tw?YyVr^*H`v(>z#zysgvYKXid=MCGVg_apX9)3 z$U+7WK3~$DBrec%xG2L>(!#%b_v6=}hQC5YdHv{+UHPv$&SaADvm@p=Qj|UY z$bIVXk5~T{sQjFtnGc>5kUlj}?U&{T{v4#EEp{pO=yHv_f}bdSf$?^^{dSp2%>*{J1P5hgG5T1)kY zhC-daH6PKzZt<91*R#1C=?cZugNzuNA*)E>9dL~`0ul?rjN5R%Y_7Zaz19}QKx$_By)z)ib`E0hYICjj`!ydz?j3M0%BXA3*jv4=({3=WHX4#GvcSfY?Q zjx7Fk?CG`)5o-Gzk}|6SG107LfiAMpb~~-#J`M~)pT2z`UOzeA!E&+~p#$lIud^+f z;*<{7lZtB^>3fIj!L~bWX_(ZElROiHje}kd4p1+tO~(;fUmPw}84>&78@Rlu1-k&% zNqnrlVF@GXvesGHAv7Vm2dMpgqDv84lumA5gTYn9#BJ8|cp09@))-+qly1=mY@M`V zN=_zR%kfa(g1IwX-12T7YbYC9I0)XAp2kIfRWFa0%<;{)r31y>5f7Vep+z@(q}<*f z^}4MDf;p8V+Q(#agwP7J;ML-hLKu4-28CcBo{ZPASeyuZJxsK( zIzDID_^QH1Ido*VuDGA-eHvvG4a&?ZEt*J;V~Tq9R`?XX9s@In8gvYZ)^TERfmvd{ zk`-$5|FW=IN?yS0w0{bo`K;m$)51d%4b3MXi}W(NW|^=3&8vrW2fCls2?0+Pb)gs`3%JxR#P20du1UJLN32V z93nuzVW{fZ%E7VPueBg4I>^w?vDi_EaW`dD?jd2fG%uRD0E!p8?m*RGo=n}b1@td~ zUl-4aq55IEn{vE*;h&p?PdZKW=;W)~>|GJl zEVbOL8ef?BJB9yKBMOI*eP&oXYXN~)=CNZvJm4e+gj$UyAebI`m7Kh-Qe7MLMt#?Z zvl%QxVks$ZN4xc4L<&ZwqD+?(p^&VbhLH>ry`$IUaZzVfe*&8T&fWJq3 z7?6;WgKZf}uwF3Rr|a^IVuaqy7>9l21aLJI6j z)JYHgS-M9Y)WOL@l8kRUI%F=lHKrx!p!sG+K7ze{k+SKv#4 zW3dwXjI7M3T6zB5l*G4Uox=$U<=CX;KV3iyKm=6)T@`qZ!H%)+L%2 z`7IEb^X;%;Z4SyquxDP6cd1xTYW6x%jZ-_{J?%#UBc>+J*1)w30&@mo0y(sY%jO_ybEL|uogNo4 zBjW7v5~_^PtSCZ&IGunzaBcr(o6nwVfR%xSM$vF=N+IAVC16otap8q*1`h*NwL-BV zhpo}aPIE#g_Jk^cT`>~PBiw2DqdE>Cl-xWj1M4_cn)*}beQ$ee4jaFz*RmG!>--MQ74tU%dhC{z|f%J$eyYje?~a75!ixGHQB0=qghG_l3P5% zxN=7=wk*%OnUa8^eQhvV@F&t-=HiRtL*6jUyJ{G#0{Yh+L$1JdbkBnr@T&IA;Xb=~XQz&a)^W+TuGKD39X}D15 zsBV=iy-WKw9CK(&L34nXM=DXSpikKZD0E6R=ldpwYy%vFLHA~w^P%;mGOCO;N zAqN=4NCy?y674X4+w?k-4CF9dg_FNybZ*FGc`Mx z`z^HTv5pFMTuudmDMs}`)|{{Agk5`Y*4k?}RgG=Z!;?^Dc9f$RZe3LT*i0Qd6&Auz z#3=J;fA%MHvwwR13OtSn1SX`Q%+DJ-G5JgG8#uLHJl(gBUaEJAQpo3cI~ZABG2864 zNFiJ3z>LX(5FZXpDDhAVik@vsy@&S6!% z>hj6kXVv|Jl!upSeVnphch>+Aa2Za^HCQ-l`aT?vvUoOjot@@upb^-bQp09>CcXa~ zAX~<8e(I-#jAEB^5RzHG936~#D(5PY1`fx_mf&zXDDNlaithHD&PrG~bpFci5XW*d zX$^}i>$2iG?pDoI{Cc=Q+t0_nO(FV2BvQYQp zj`tcP0bvx8_k86ab&2#C`;OnF@;CP|9^yvY{3l4H0-7oa+g zx-2pQktAT=G(*2&rj-p!)S0D>*KJVOBMdS5%X}zb!LZ5OQUiJj`QII|>ilZcL8YLV zjfS&CGfUfTD`5lK{wPTSO-#VpJJ=Fp@OK!S7z&JHo>}e~h(Ck_YcY(W zLf-Qox|m~b{@TtnCT^ojsK`AoEvgu=IpnvNr$Q@fyjLT7FiJ%;C18p)N&aQfd=z^i$4)KKkMBU;jDe5BZft65OUqaN6ilMy#7W zaCIU1S@t5yn|s6%xu)dJ9ZG~tP;5=!$%+bGMwFMEyWu;Rng~hh)oa(F~Laxl|EVRm))~kBAgYWrE8Sk-~@vI_if8 z3US%MXo<&HD76FUPOqhI-+|P(S@+zbY$@dv^iW}zRn`ZN&Q#Ro;(kn!D(k!qfgX&0#vE49UptCNC@Ipn26;pFm zG@Mfo+N0X-I_&g}MkCIE$h(|JS#>U6YE(eYqQ*J4zch zw+FPLWgekNA3j_fj>NjKOEdzNDn}c9JvWR+v%!u9%+0OzYH>h-xwW6JJM^yR(^ZM^ z9GK&c@77_dv-Umnko>ddix^E-Mn+?8a2s1c;OKOJ4_8? zX7}1PCR%_8aqt3bt)&51D!N-jEDC5D8aHw$L&vGwg%vrmvMK1nbzH~p0olr1VI4i$^P}suW!Kfbn3Lq9 z-r$q{iiImn`y`Qfv{8pt5?Iw}p^>Z(ZTfmtD^d`F7f<+W7acmsZc(!%PE#QlFku!! zv?^p#^GY5i8``(wvKY>|LS5-=U-I+O+By}i5WS@&B|N&3*0?DpqqC)2)~d5>1$RBF zo8X#y6ysTX=?w~6+ zzNP_oP2D9i11LcGZXjitR$8Jf<%PYyc{oJd;hw%{u%$(s>*P>pjxCqfvFO(;Y%2gyyL>n~Tz`0rJJ?u5kjA z!F=#;VLHgwVArz|jd9_4LmCc@wVcSZZx16=sh)E}e)MXW2()e9rZ-D#P&=zG?6@9% zxh~y_hL?nGh1A?M)0a<9Ml{^YP4THE2!G^uPYp<8o^)eImgPYuSb^?hhvmehM1p`7 z(IdF`sEjWS`WO)MFy!eTDl3X_`1QarJew91lvSMtGC*p`&eG7!`M3klr+5OZ2l^Z2 z9o-Qb5?mu=%5c;hJ>VeAsV~gV84~#DYGFj$qVHq{q6AktZ_8HUA(m@&Dkfm(Aw-c% z%j{K-f$~VR0?wbS5h-|(0D)cz8o1@hVCGzS6n2{dgf3Yp*D`XQ>iDI+dpEm5=?yH* z(ImUz*Oc#QLj|-PlH`dNxX;*f%c)W`1&C0i9SC~|_>Wa{0n}s2?(&fx9XooyX%?DK{n7}wgyZ{LTxUt4nA#p0i z=1{Gc#MHuBR9T+j9yReEnO)0ce)5NjokC_~389#+Q;C>K+4##5VZQ$1$AK6A>g&g^ zpK^Zr$0rfVkDe=#Pu@NYuixbBkKTU&`Uln`{|LLHe*~lPzrX$}$RB@{|9^AZAw2qQ z76Q|zWgjYpdN&yx55s{wtQ6=y2DE%t?Amm-_GE-~MmjV*;U=P%32_+vH9vrD)=mLc zY}EBGL&+`HnH&vg6Enhvv!a$^R2E+cd!a+&cxlIb4bUa^Wx_V`IET@o$rH}#D?AM} zn;w%=SD`)|MLtVWE3;?zQIc#IeMuq)3JobJyv}GhL}=Kw6{I6USMf;8WaT`R_Siu2 z50vUE6>N=9ws`VQa!VD7Y1XCy(}b~hoOD2Kp%4>LH2Z4~Du&oDwaPu%Z8)QpSk#rA z-G?4%j!4jg6dIVrN)b>U_bBA8+L(w1>apK?svxMS1oi4!H-L2_g2WjRD0T)+-lTWxGmQ zMmJQybUP5Aa|XJ(-h*mUda`iFM!#74e}+=2&07HO!q>NGw}Hyc)EpZJIUbZ1o3klw zRlosP%wMaf*shr7Fog@P<6J>Z$bBZh;IldHI%#yuw{kiZZb_o}4Ow^&kZop#b{O6e zX)CUID`wV0_naItUg_;jN^VivuVWoM5_?va}}aWV)4iY{avj($K6ay~>2 z)~3K(EnI{vyG@^#U4^7+H4jzI!-R24Ky0;78oh8(z4*I@cF+wrYyf6B0YQB}p9FH$ z*&JRqSy+pt?XAU8-JA|;>YBkBB znxI5Em+W(39Be3H`Ocdp_LiLOF6#i90c_th6>CbEiYXc}zkvCtpQ_03j{VbSeHn#} z&rH1n^%~j;fFlQz*9~<`so0DfwjMqFp|R2xXPTh!YA7~c{uzs|T__NNu*rbshYoWi zXCqjS50ZfJHLcG9aoS>AxgrpbmP47QgUr8FCEKRyUa!6&hwrpHz%{(?wf}oMZ&x%q z>>bUW*fxtnpVI8u{^{ z6iJE6tEzh9A3)%b+zUBL!SUW!vbs?iR$;jl+%CDg^)VOeNhEd_+-|R*5Z> zT|z&k)cPnC1&cSHvl$5FYu>|(d?A?{q%URQ>!Y_{hu2T+ z`t{4V&-0%lf5@-@ljLi!Ss6zXu@dG~^V|?{ic&^#`%h0$@*uQkW)jZi6J(dctoZlT zR=VwSL`0{S)3``at3l_>{C#h+s=tGUiG zp+a8@x-}Ns7Rn+k-3pK;y8}k;S<^xup%XwX8zeHNnVW5S0rFre4{zGuyebwr<>+u( zQ6}DTcB4dH!jcc(wRPO)vDH<%t&)LE`6ge7d8=sfmYkwHfs+rFz@Eb>Z2OD7({gke z!DPf4PHtuxE6RqlD=bG7*R~o~HZYkE_Y>L}m<0|cq(al-8qsaRt1?rY$k!1)R5L*C zFvhoBt5KYpQ7avHcO7dWbA1Gy7NE+cB)kx|o;{EZ6x@t~U=>+|`zimZO@G4K_mIL( z6#|de7vf_{6(x1V1C^H?SQYe_q|(Hz;M%5Y$I4q6Dv6r$hV{npu0gU*X>u~998#G# z-e6uHZNfwmqouJ>l-4D$L%W?MDeuAK99@+daU761Or-~}P?21m^lSzgwK(RFloxkc zit55TVm2%{og>FvY`R!99mm?}crp7?C`*(A6RH$Xa$Zk<0%#rQ$MB;c{V4ojM-2Mr z^$UI^Rr`oH0ctrgOUptO`&LPUk(Yr{2A%~0<*0z^Y{LWkhdUm#Y8L={Ghu9L z#x!oHA-9sSC1*b@Kmc^}d`7k9?WTkd8n-f7n*@uX+)=fNNIe_*$?%`;_{Zpz;SJUjdTMOSKVt!7wjy zOA<1~)wuCJwdbjhnO&!1HBzNF6eR%akF>qI!M~Q zlQ+qltOgsxt!*C=>_Uf~3+y5<0oB98Zgp>ZfF#3mND8&uA}vGdphR&TcZC~TKN&-`$aliF^rK`6LGPuRW^ z{0RuGy^SxfO^OBtrxucAxABCwPx+pVnxbBVep$W$ui-C_aAoG%zkB`UPsiuKe*Gx$ zf*+s4+?%;Ze*N}!e)Y)^A^Rb~7U65N#g*4T3$H)T*Z=+XSMvXF(e{%6|5|%sIpm?I zD>)DFwU=X}CTCM*M^!=rPk48*996i6~Es{pqbCD^3YKYd7Dh*?T{`INqekkx4 zjvUb?rJq$u;?h9W;d+AcC7IsJ*6gSwEI-S1H1RJ8b9_@_EH97LGO>b_Z_{ySd8Y*- z%vtOr+p{QGNIsl$-`+f+P}_YPe)viLOb7xM5 zLeXVQ1l{zsYR-im(ef?T<1>9zG8Ra`%~s^?C9`vvKegM?!rumw2^AK!wl_F^QrNU}Y!#hm z!3;ePCh4tYMGu|HSkThi1qxlLPYsn2rF=dYj8P++MyWU|vd%S6E}Pn=NUj57xvJf6 zXr`+ngGCuRvfA;!9FjK``vMo2yO8=%zC1%upY+-0J9)Ip^|7ElZOihUy5^zefy&qo zaBTw8!|t@_AZJK=fj``#YEfc%&6NY7_L{7TfC_;8O9@sRjVs_9oP2r-<$!`mZH7+F zZhZ(KfC1$zAiDbA%Fq&0Hluuy12i{JE$9s(w=*BYoKGI&%Q4%;iiB!wLIeIFW&%pO zX+bGZQbNFBQWeFld=-))#uoZ87SqxGQW0yYD%Lz5wXs=n*bnR*g#HOn+B-NUj_Vb*)h5u+6iGTIEHSRxW4{Jw}zp>$RA1PI>Zc}Li zOgt_tNSMwB1KXPiCls>+>QZK5@?#P*fioaqVwF|sw5#jZ5reIcXAH zPX?FPNMQR6KI&Owpr;HpMx2B&A4DLW_mO&T%G<&0FI2{NG<<|XD8Uf*8LWR=SbZSTCaW<69k#N6TPT!VbLf=3ra3RGu&YOyX3{`DA>53}Vi|=N}a22^h zc(STn^bJQBsXo<>;-+JvAmodGCPGQa*a5X#AK>YCJmdpaI^~9jg|Vu}$72uv)DUWB z2I6zLlXZZ;H~@xlzNil{Sf%h0mp7IlQ$^%ZpRNoIon%PBDXjA2dLmSyM_NaV;@$#qR57BR9T$3g2XZlrZV0sgBc zFA_iRkZ$rfQ-Xu669u<26AEf=aO~aRynRXdKrX(%3v77jSHFDyg*w%J8D76Rz5Dcs zzYlNU$w$dwkm!8>_F4WjD5FW7EZh~{;+%Ezjkp*2Bwvx8Gm#8PJQl%T!&P!6b#kl&!1 z?P`o`V|%oQFk!X7Yua=;9;$RsInu?wKxD+%X5)HSpZINX0BF?dO)3uY<$XNG9aI2}HQ z$ucTr)vy|r^O5%3K)Wys-Nx`xB<4Ac0W}A}I{0W`N|~`QPv?qbGNRh6^=D8@MM~XhKkKT>0jP$%;HW zmnNOrHUcy3VXGM}YuP#$q+2=kx3dMD=pgaUez&#^wAR|Xtof4f8uZ=ltiC2x(L|`@ zP7QX{-h--v!GTQ*JUFaSZkvPO-VH^ciOtge))(TagAWo*ccu0c0f=fcVq00v;0t z21p#Bbi_>#uX^k)8_K>?7EM%aj-zr61Bm359}TvHl9?h~Vq57f8O!N^4}V87z^^H( z{Bx;@egm20Z{NOlTN}0O&42&V+aHM5-1XeP+0)oZm5#RZ2Q9S>e9&?K{zSorF$C-l z&}cV#uO?V2pc>0=d$X+)sAY#-UC0N(UIS#Jy^ZqpXl{e)F^_0%?@yMPCewOp3U3=h z#3ss?RcJc?ywaU(mEXv7CIlW=jK^CVEn8pEC*F7+yqh4!ZJQ2NV!$>eF}5!FSpysD z+k7uI;aw8AMtS10CeIW#S%4)vW$l^qW_+=+QVSrJho`&ihZ}IpR?9)Ft2F70X_f@z zggRYf(0SmoJE{2}oda=zlmFF+%SwYlG~h^9LjQ@0(*g_w9X|oyq}F=`OP0rFcMCQ_ zd}@BfKV@|VKIo*Rf!D~gIt5i)K$Dg0CS4bvqAe=@vSt&%Rfl+MOK)=rU0wFJ=b=Ea zg`Md6C|Ge*jGKJCB&10OJ0E3D#TNjZs?m>*OB!MRin+)Weg~i{8@o+Bek#fAID(Nd zBCDNzZwUqmr=`!Rqc~Glv_Tt;2@!tni5WQ%&%iF(%*I(yG_HVL>g<0f$^!jCZ`$KN|yhm>RI7cx_dGtc+*yb5z zE+x%nX1RVlIK3!`XRdy!ujzEUX2)y!*m#n)!bH*iO3~MsfHR|0EyuWIQp#-eW^@$> z)?R8=q`*kmVn&;mZ_}cK`7UlV0q655tHZmjfN+C8FmHwq!wcXJQM$QAat`!3o6BlW zZCG9 z1794(jV9-1gUbk2g05T@kTcDXS~k~{Z(cpFdPF=aKC9nK7j6toVbwovzt#zCsf7PA zHdRm7<|;PtPOVbcz4yP6Kje_4Rupl;%q&n65U|W0I$iJ@OoSD5s%0SWnbN(|%LMnI z!HSl&sb>mVRB~eXr<~4)!>S0_0T^`jhw`8LqHjrxy|hTY<4mGbXZEa}+Qn1ZjL+`e zI!2wy)$8F*3hoq0Etr#y^vuPIcHKerVWi|q>Kk!XQSz=4^N9W*L-F7JUHH2!cl;OO zZ=S~Z-@JWKaASB@0?(xYXX_d7-xq3DTC1?bPCuq*H&68xn%VZ5-6q(JSAK8Un zW+cQY#(K6)fzMVc;&Pl0$Tkjah7y>-$@|PIO;w3WP=V}4+H@*xf87QLJe7!+huTe` zx`R?>+|&<8^%IBv!!1^-n`_Vi!$6DYNw%SJ0H&>#mC!+M4{lg$ctH-|1b!YVe2|c` z>&kW}43-Wz3GSh>fNFO*jMInBVaV!=EGOm=EZx#jrC*2lp>w|!sqA(a%>dI~qSbH^ zxB3R05J>`O-s3#KsQ$l&E);sC3l9sXfTQ!#5ZIzB8nH*E-18lSHS;qBN2R3|>bQq0 z3joHFSONtw%F1ZL>#z!}h05nBnbX!rDT*xyDo@*jU_Ho|zeW`a%&+Ol5Y2D={A{x} zI_L+|uHku6Z(0XVE@M_VgEP+S)K6NX9+*lcuc+JDRIvX&Dn#I76`PctY2X|np*Tzu zu5&lS?7UP*vm_^6?UOGv)C-w@Ctp|?pUp`H!{DbZ#oX2z&Jt{2*Xs$b>o{*vJw6=X zXXwg84UEGK&C6C7^;1qh!RQbMvzc!($HSmUN5fZ7WG+%yss5( z4`)6@!-aX&61EGfy*oQhXwoAgXdo684<9w4id;@q1( zpPQ72ITFHdgvG`>C&(kWruDy$2d)Gd=15Egs9+XVRp%BX4#K}{wH|lQa(BG#5Ij`{ z(r4*=m4T&`VUs~|=)cb>&RQwowgu$}txA_|QYiR}2*6Tu3nM|Laa%MmC}xIi6zeB1I*D@A7H#Gg8L|8f6$QJeeH=7e;SG#7K&0 z6d;(pW&$Kzsa}uh#D;ZzG%oLr69-zdmI}(=I6K@pHg2OHFTtihHt+uhflR+SUi}6W zJ=amj#jnEKN2;Ry_A!|)KY9I(O@#;0%_BF!osyM{o8-WSx#3dpM9U>sM$Wg1@Qcyk)WjXO%pBqsrloqQ-FRv8Z$) zWRV6iv6?rMhI9aF;@HeDL79_LX+pZ)xKA_WaTiF~OVUIGu>{GEv{AFL?x4SWKn#%c zb*&bo=o#q8BNLi;W6;hJyc?nSJl~odv6}Vn)hyW3o?p%J0iL_$AqM)9Dg^Lo!*d>F zS*RQ;{lV^ZRary>tJSemO;#3ORdTH_%NbC1yb}j9-Mati)bA2uhp27+NIo(e;8)&U zInC~|O5|Zy*7H^0F{@`)AK5O8X3Qy?tN{xt4V*tL94SX%LYs=Nc#Eqfl%z$eZ&y`t zyVV&mBA#66^yTcg-l#QOg8>N_`e<#w%eF&dpdQb1=2RpcClc%OoWEqI0P+MJ7%jnq zJU!tD5*)6h1Jr?TsmCKfKI50GEe4>g8MMJ+w^7eupCz1?=hZ9+w+X&srBwVX({7PT zqLhs#FFZ(+eAi?ahX{RawBbn|?YKL#uRHp3FE0?K$Ghg_S76sUv6OF7pQ_3=N->7I zHS*!&lmn#km4~^w-I~LuNynBPVag9{ac-McSqM)Q)?f&8a)WBq9nYUL#Ly zXn4OiE6n()kssl!ny-dKm`Md=)Kk*QH*!J)_?f6_kIccEb(qkd0JpH8?r#E(I$pnd z#z%e3W*H|1W>>9~f;=d|yx_anU*a{$#J$fUl#n^N#3;lY@>_^Wc{;rW8?fZinOkj} z!CoOX~AExJ?J(l@?<=_sxcG znx)Z_4KyICPz|=MkzGCxs)aj|22 zQmB$%N)lF$D3fV@gx0a7Uc<50hfO8FE%>QkW7rw~9OeLLoy*PAnYL~^V73gu6$c+b0;I)3WOW=%@Sin zOq^|i4V>ryI zWaxo`4v5`is8586-l;dn1w@&itvvbF#$luv2v)DbFd{re^CkKk77K>~I>eUAN@#S( z8`y6MQuKw*6Qe^HM@0f%!K74C1dDc3#kQURm)fcQX<2)ugv9~|Dt12{ayO%DO${8a zLYuE`@lg_+rvXPdQbijba5?TR2#y87Wi$H*g-#f4#)1B5UUYUZ3B&9SR0)tK-4C;l zr~?S~E~UT&nJw|MCs!qi8k7Fd58nMahrn-N|L}kR<$uoM&T>l5NuRJ{{~m7a-9Nql zG`!`p1+W@j0!og?93AKbH*mNvL}DnR7dDYn9XM54Rc}3EyM?&BLu8n|Dg|bIflwuK z>d-v0HzYP~vAF@qpkfxRN0HCwODX4VBO^{pUcpglJ%U%w05xShl^j+^)oQ%kO(9Qc zC+7-^mBq+`BcjO&tj6l3nF*k*#uGDO-_ED0l(Z}dAb?bK)!5e<9VrNm2Yp<@k#iaj zz&K&)>FWq>dP1_~%i3kky@&y9K8#_lQ`O4%dcYy*5immgz13%`%g7kRAO+C`Q_zPM zMl-9Aqs1TX*m$UshXFksd8EC{>A}Ka_G#cH59>JZQeK`ukfq=F`9{EgU z)|GE?lwA)Qw!uj+0NUAQeb~-QUXIbOi?&BO8V~b9d6?xmZ|UFNQd}K*TQPsfnzNXAlcY|blBr~Adgv0?g=-Ro z=7Nd9(kwg()Up*-qk8V8k}r4jIC;l z791O(C4Zn07J#;WWe*Z7Ej0oDoLzaHb!Dzz&ggpANYLVI@$P||P0c*OS}lRfT5X!g zZk#p8Fd^Y9S{SibI^C0@gSN@>m>U=Dx}rq&N^)@fhy)3wm zbuPv7fJ}xC677X&8J^2_lu?p9oP#4ZVL^{91LOi?Y0gr~v$uK<7xPM08%1<` zv+%=DplJVHc>VhH*xW7ae&ogXbQs~TU|*5|q1$)WMzeM$yIW&3=M_mIu>b`H-7&yJ z_0e)aBIR4%5C{BOp4EyrJc0797^?j8h-NZOD`1z}E1}=ALAjM(i?bXh`pnZjw%!X> z^O+SY61%pnG2HB36FcHJbjQ>sLg2wzB#`L9NUKX_P0WE0+rU6l%@?my4&{RIaKI8| z!7S&WQ0+ITDI29Ad(SUpWT%pxv6Bx-TP)0~m#SJ-93nE3ijdM9YW9ZZbAVog0(gGq zAj0K-2i>MA-Am__zP!knVFmMeD9LSZ6M8iE5PQY$TZmEaKU%VE@t~k_TvN($pnRj^ zSKLH!DYRBmivlD6n^uh>EJCSDpIs7fepM_kapZ`8hA-Dap45sBL)G1V?9fJrE@E|3 z4XY&Krhq)8g%=J@aE4xG1=nFIfX9T}uRE{8s)Q{Ao!4l?$2E1&ot&Af$ZQ$Ixw#eL z2Gz0MMQqPUQY(4!OszU8@KNfI%A&qN&x+p`WxW0S&ZWFkQ^AR*v4Sgs1TzqU?x|0; zxd}U*3*lu;C2mWn&=-=`w|U?|+9to5k(f$Jerx**lJi_q%+3a0g3{d4-6}>0=^~?{ zW0;C`)?=3r#exe@RuxbgT}>s0hn?n-ijp-TfeSM24QrX_Lr7!5d^j3IT88|$sH!#< zq`M_R)=HIoGHwNibxK}5#S)HxSUOBMb%dj{q{i#3o2rN+p*-eUtMot290<7MoK{TAghu9JLaUWc?pY`u8SQ2Mc~8HP%I=$!Mb z#;8RFFO`rg7*^hQDsdo!AxQ7)5~BGQ1dzfkhw2xA0a7!|+6LMQA{7i9WA$VR zSwNQM1^QhHYStDrnxm;xM4-yor=%zNPY4qQ6`jStqA`mk(r3lpUIXdwB84 z>L6P3;%Zs_xViH^iyrKp6GhGAl{@F2AQiY2-qwWoHCtFJ(=cTF zYsLYSEC(c;a>m8sBC0i}JWMF`#nx>*PzBuH7bxnrbL5Cf)qdpRFSRg^`|iMU$J+7N zrFy(N`FttH`&yf7#V9ReBqutKfZL z!b_yj&IrvWNiAjY#_2iy<}Cau&mZWyYdyttVKs5||@-LsT^g=g-MEMV8-7qOoyA6p|G(m~hp+l5K1)4%C^(&V|ZUi4LFh zF9)DP%#1X@P{z1O3@g2vYp9-PIl|naU_1uM-YHQ12&-C*_3ZXJo7z=({mCX?0ynzA z5^Y(#$#P*I2)*A99}8A#X$$NM!5F=>V2`S-r+$Do<;ikuQ*y_gR?%U0*#>J8wD2!6 zT_&hgC4jM|MC(;A0-3pyn4k-po^j;Bm*vQa9;bZUO3l$AyyBXJb#sZ1e!;@4q>iHt z#YNI9O)T00?JjnZX9ppI3ta6I1h>R7IS}E!b&2qO^7B<<-%y>>0L~FXXz1Y8%Ft5D zxrz-CRSgF|j+Isd%eLio{jL}}P=Y&&W?>|E2F^4&MDC@V(w4iu3FQW)EUaE!imQYK z&l%KlC$ngIwbUt1r$Tl>2NLglI+wxKf6)-SpiaVAMMGxKDbN5o0UIA0-+uA>yFbwm z&=B|bUC6ldhwMGW1OZuZW*s{`5^`XB_6e2)Y3o(#jK0Y!Oo%whk1XCuEZ@oJhh;>G z*n+XB(_}vk^f~UKZ>)R~pV7#P{IE;KPB0N(>L<+lat;uQpv2m)Mr_(zwpWI7MGq-7 zqz!)v$bjYbABM9-Z%U+4sH+B$@)|cHgCP(fJSb>NG~w_kW;midAWEra3t$4-?xezm z_r?oTqymJ%4kMHVcEt2cNNmPW8HM>&rKrHYD-f z!f>oPp~R8rbUs~Eo5D@vmP@Lk{;}>0#t){xT`*99p1{mT-LDm0VcZ}oT!9v^b$)%i zY!Gwc61}8wNZU(xgER$bP{Yt*8&Ks&;Wpq3*=Sm}zXV^FQ}c&gh{Qj48Tc<*z7}oy z#kSf4ezB+Dt6H8K&|t+LR!kVM(_#S5Wl6`x7kkGmB(Vi&y;%b?y*!Z|GimB_bbAU& zW!P2M$(J{}iAo0r?U01C`lY8?oeqNvE8F}AQ4pACh&T4}p_Wezi$we^*3Cd8`1IG| zM?d<}e>%4Fuirj>RtEW+IKi*YxA5KPZ@&vB-1q_Wpi; z9gWX4_-G8HUrb~cGnmA^`W$VE?W*-rDWF?Oci;iop?J*;5xr`2)Q#;{#8U0>zhK-xN)&9Gs z3M2XP@SlAeSBwy}0I8)s*7A4_HHD)~sg*_t#OTC_B>c-UryHQ_oj39h(T5|j^_jP2 ztcu1-Up>6|tV}9``T)53+Kz@X^MU~r*{~9j+-C`6gSEgE!@wzeA77m^!Ta489bYh=3) z$Pi2-yw0rne4Qbk&;_|E`^8Rug|lfwZINQZaLj%yV3jPPK1)2=dH$0UUnPJcOMfJw z$kS;}z9CL3d~9Cqh+gUgH&|wqz5;6x>OqoXt?p%o*|5JmMR7njhC?S`^+CG^kl!BM z1}*NM_wm0H*!!pV;s5U+9AD*^Z~wxx{%23GhPR*RJ9rQM!`nyi{((Hv2PO=&E)lx6fxO&n;&7nZ-=n=7o7ObkuTTKaJLri-Q zQbOPfut@3y#*y_+n#Tk7DJoqkWx7-kS`e7?1|pJe{Bb2oNfn{D<EmAJ)`MF-{2HTbg`@V`8m4l^xsR=8C5&%O=M^z!}u9PF1 zsb$vNXvlMi$}tfkXdI#EN}CKHnBllVs}U|e^z1pSR6TW3Lt!nS7Lz2FH$r?;(up+Qv}xaH-)nNp*Y+<fa&&?AiVkO3xBNI5wDjn~zYX}FH1+b4smq3phq$Yngn(WMiDD3Q%Axa8MeLEE8p4TQybFk=;VV+L4`up=yK zsV!?{L5nxvpecQ&Tb82I4}C>2b;#8#K;f(%vIvcueMhct=~+|_INM;dmS`}%1=SVf z#vCy&hFc>D-6P%NBs}f!JJh^>OCHb1{_5)|0oclqpziQ*`Doo`0o`}YwnJsQeCS!T zxVlC3stu`;ZQmf^sMV1Db40=H*&K3H>O1x2}MGG-A(ewRSglX9&-q|grXo=*IWeyI< zei$)VQmi9az*_Ja1?WDdL)C<@fKof?Ie43A+w|GgiHo@d=$)Cs_>leRia(7a%>hAy zcm*dMSts3Y)B%du#gfsU_|7&7yo_BRvoupfmfj7R2$OA4G~emGk~aZ2;B35M_f45w zso3bSLj{@y&RUmEioX;dyZoUd0I_rdmI?z4N#~(F4&H8lF-f9$#K1}wU~VY+<#8;| zl9edX@X*ehD0YfLAvI0FSjs~_*w7O?Ycz%c44G2%gEzPo^=-YYC-nv;fo;^DJ2wk-QH4Hd&avb z=z2B^tyt&77qAPJ74{O`piA%3O%7Rz7vbbF^EB2Db9IB-Ip*uQn zX&qG;tFtjE;$k_@vXQN_sO4;hsM>+4SW}B1aj?2iele-GF9dlE8<;m%ajb``IgBDo zif2I)g@95}IL4QgdLSzdIjjfTR0VFvtyzFVqs{#EM1+AnF?K=CcO>B=};bfPoy4#xUeaU3h|ByBw5e^`Lm|hIP15AsmqO_37OzK`q zWxXkqIWd{cfn>6hSscvnyZOI#zT@XR9xtn^(=6YOz#RYt!jGTf8z@*)E6m;Q&+eh* zEet0{b+^lpwhGnFKF(@M!*;`UBzpP^1VhWw1F`|<%E)#H_sDAGCA&hSoT#!suORh~ zkevc${>g3Qfw%o;hGRUN1>YMX#KV&4w#Zv~T?aMdA3sLva5tar)8 zl{eGsVBo|SY3I(5r!81ga+=2q3^s}$oHWtwUDgJf*Sf+7q9U{f&J(RV1(Z4RF=cJ} zql5q;O(gr9DairD)Yv5R+XciL(z2Go$TNp+ur6+c7W2+Y2e4JDX2QmP8@yW&`P0$L z7P*PQe?@?;*)BzX7+C5^SR5#&=K(SEVslwmgv$j;4830N^wZDD5obE~49&aOk2&F86UOS)%QbKJ_pj^j) z4*#nJJy=S7b$D*I%5tz1epmiOv0p}Ec3t2}RVRP2hbw^lBHuypo@~N^w`WlIGN4hG^9-DONr-lo5u91U5t_i8aVs&#|K_Ad+Tu5zj1efo8c`2OrF(VLi<4 zlksbA9hCsVu6`;Ml&n@r;$Lr_+7@u909TS7=FPpn&?p7?KgUaCr9j+*nQcK80~(28 z7O~)?ZS9+D8Fj!>2Ri6ONAzu4Rlvqay^`kNTYiXuF#KM%&r!=Xl{}n)4c)!D1zzc@Nn$mRmCWjG+>j*OIYu<#mHOwuUt`ap~PR57ZhdV9|m6R=m~0Z4(p?xm)b zNUR8ZtPaYk4yT*fGf9heR@cqOG^?3o-s32&I=jDlBXzL(5E|uhF)u z1I3b{#dTdy?M)E|Btk1kiQv2jpat1rMw>Gslxk_Jlewjxr3krFjK1v@cbDS+^k_bT zODnrF`XlF!3s364<3s1tHPSsKukP-ps;3skM)NUy z-4Ynl%WG!WA5#@-&l)8Nf)&QBO@&b>`&qS5bG)rOhqa7^o5w`1#PQtWX>3G3o}_%> z9w#sUp}jO!OqpFMOCsa*Nyby*$iWHm(G*?i<7iUNYBIqFGidK{x$2{<(SlrUiII+~ zU~QGp+N(#`4yx1Z&MKr!se!CVeP!Ff0}`FByLc>Q1$-cMV8vEOObkLiOJrB`1&6^T zV?jS(lH{Dn&hEF1no3_l1{^l86qN6F03E3!Dfm3bQxSGPy9BG`g_0N%a4cI>33`OO z;5J8*bGAQqyf~TjC<%-TYVBOYBHqG)U=|X&*UdOhI#89oPp2_0amSE*n(1{f zY2*Z%U1+}gYOQCbb^;d0ekriG<+hW=N)b=PQaA|EkY|Rs1qzJ;?7HNbW?7y3QA?&r z`S~Slujdo|&2&(g0LkNtNQ|K8v@krx5FG{x29QBXBsWe6cwpeJ7Mv8s6dFwLevL$mf8+^m<$K^`B9Tc|)JnQR| zR(lLJkSiJ;h&RB?c0P2wVRR?I%X+d?<&CAzLw9=!$SihLt`ACkUnL1z0LH=clZxe9 zR>dVLk?SJ4lPrIbIap_IkTm9U!>Ft}n3kLURTvb)AuModoT@;;F#Lz)wj-r_)FGaU z-9Qi75OHrdY&)y^UF4g^B1gnB+GA)oit6C7_ehbz=Iku18P(D)AA_kLna#)xai}wF z2PGMHYG(x(UCO;ct}EFF?P-J!xj!$Dx}O#0l6McFZ2RWr%Xc5Xd>&r@lAW$h+z434x_?p}ROXxc0UGT#&KRJ!wR(EL84n37j( zuN-j90RS98H}i^_$0Hgc6$>Z5_qZz2KZfsU+eoFXN}jgPbTY%btEZ0^pcGO@Pq=qw z^UIJ>Tcj8jvAGo=I+ZmLZgl~Qr!9bi;UZ7AQsNTnr;;7(m?_YGOV{9D^AN)y_azI| zX876NOCdVG*>S)?#5VlLup_r)MpjBBh-}EE=VHE6;`Lhc|0{6Ct<~mN_|wF@18F66 z=9~ATJTl7*K()LxDo6zJPDraJR$ZdKGoV-SKE?=;rd;%pKR+meqGXzqz?|V!U5ys= zAkXCb_^O+Pq6if}!4i;F=13jFS8k1U>|m^nB@%nfzK)%gG{{+zoIAKC0;>S;W=(tD zg<{E_af={5Iu4^mh&6?s0D1!eVuvqN1oW=qj#qDGs!_WZeXSBQlUI<&u$HHn&Ae$h z7ps!@9ME^!8R2a38*>NNs#Ez2vXBNg}nb4hzH+wRs>_&^;`3!skRgzir9A zHhE3?qmJEljzs;U*)+0OA7hB_e)BisC;IgVKls7Fk#v0Z`XMF#jKTe@@BZ%Pvv?0qQOPU}(T6ipL{>fZpzVq6eQW zHn!_C%RX2zljf2QdULE zIJuclh8Rx0itEZ6djkN1vGY~>$b#?YGxr6>)lm~EFz^>u>xhS0b=u~{=_GtFt+@pK zT-j;a)|zeinedX%91jd?Jz{AI`o;&TuxHxkRJb?&=0|Xoz1?z5Ds z3Ra1MVIOkIX2W@D!zCZU70<#^wmm~RTT{YeYnZ*A+X<5o$WrA-&^g;V*zvHawK=~P zsP8VD>|EpD>Tr6f-7WZ&=9|-vI~T5#_5vvZ+NsF3=d zTW^(0d^RMGO37@N1ih`123TucClYR6+Vb8{@X?MmO+_tfZ6#0-ijWZUs5P09JOI%w zKO4ZBz!G&k!&!GfyijkpBXm&3IjNsL#h)5X>l^FX*2?5^sS59u)m>7wmQ`5i4V|5` zD%1_qiSv27ET6FbuDt6Fd!dgtu@iNcKvsZ;S>)VShfh^oNavYg3Jj_aReGQ&kg_Y; z-o{=v!r3^B=u)k~OGwG;y?fbW!yATC^o3KqNEDqZ1fXNbKatIC=^?-KZTRkQ5AS{k zE5rwg3Yo2S=WZ@9g}7jt)JRQ~Wlde==N@Q>1n4prFm309RHrLKBdav%0NYEJ{N)(c zUaD!xT1OIi9jrjtOz<&ol2$0nWma$pE{?ccF<7D$8pVAbIBQT<@CYvt>nn-$J0z+}X}BmL;bY{kK9RRgfY==Rk)XiJSb{ z-~y*HGuu2&&hXEmw$|vZBWR@CJ&Wjh^pi&RH%R2eMC|dY)1%YN8 z;9UsK=7o8t%946Rt3jy=BH(BhcLQVs73pgOt!ASg<>4}kOGnJ;uW2q+ry4gfFl82S z<{{(t;t5JQ=&HFaM>PUGNpUUth>-$pZr!>#7YSWL*3ebDA{AU=TEC$I5>;ri8z;rW zbF8n5e}$Q--h8d=H3LU`h|Q+rgE=0VAoGXi?5mgG=E!A2q?vH~Y54DbQ|*4ji;=Z{ z`tm`@FXySkK>4X2BW%8#c73QPg+6wB1Uh;{V;oF75cA?n$9dVO4>y#Dh-QJxaLON@ zg7>gSot@h!|rn0Fxui?WL^8(`hA?U3wF5_?%0@cg0h7Fwa0*AX>_Y=!+P z7{;mKhg*e7w&VD-$^shNqO##-8`eg_k-YccP&f-Ef_jAY*Knh;hK3(*xl=?xGJ?Wp z7>V2-jfE9ju@^q}-V7ZpS-nybTh!4GJ|SN6_m)VeXE-w5>!H<>7khsNb#XDc4_NOu zG3Z-YYsQT_&hjOxTsb%$1)!<@@f#zUY#oykZDhNaSU2Yo)#b+P;d+M;5*Uper+C<8 zCi=kwOfhGPjP5GQO&oeA1eoxlnQP3Au?BVAK5CU@%lOL`_=z38b5Po?PT?f+IS(ql zWZ!~Ju%yM4T+V2d$Ma)?qDfmL_Q_TOV+~LoWgE>;b#A-tg&Nr%hfdqhMko}U!V{!& zC&DJ=zC>~&e_dYENfrI_H`FqL-xhjtdb>hvtJ@i>Xv$)hzNCElQ)nPr zuvwsk04>aTU2;@5-pv+a6X)wSC}|ZYnCpyN2Nl5ayxhyJ|sv~M=MvPh3HV3VkF_?y2D zKgxRY|33WWC;13P?0+h;4Ib71QlkFr@cQd4upyb*%a`&KuYY;{_VCb2S6c6!4|kStmy zj}1(R7VC1flo{2lfhYr?BFTBK@geCEE?&iCNy;PKN_O9NwQMu_2+n=0E4{;fsh5vU zg34V|rOmaz)c;BT`c=in$u^nCo_y4uL43AiouHsKxL$-DZdIYuowFzJ9ex1po2NmF zqFdV*Z)pz~$wZ%lnqN)HGEV^PIiX@W>#B>TWp#wXwkG5jHJmGU97jvEk3&4t+WOc% z3Z&=Q;x@7fqyA)SqK6AI2J*|G7N;T+3jhE@ zyQ7KIL0MaVH*U%Ys@<4JZ%!rj=fla zd_mcJ8i1?JhrMbJ9rlW2a0Fg}^vgfd-Y|ws=!7u)I_vB`A1Bz26aJtW!{DvEC7!o9 zyLbf%)Ip_aIGBuXXEaMXh1Y1DT)ah^Tg>QmKo+L9Q;42v-loR)U9#Iojj-3&)r%mQ z$iD5Av1O}68-TcutSXU@seFz_PLNOg7Kt6?s3?1;QWGUpD;-MklIo3?W>AE-!vQ`Y zjG7B9BpOvtM2a*XdX>ANJ)?dPcI{FdhtiRm#QU9q-mWlk|r?d&sESfKK0e z{xt{;WwRLEeo7yA7n30;#HDtJq`KNV!Ur&6`~VHopl z@&$$^uEhqI*gf}M71~=j;{e*K!w@<(1m{ckxoNW1tJ~QyBwn99Oyu!YhU(ZkVQOO` z>`(j}zW+dpc)ttZ{XHY&*Nli?=kI^^`Wc3zpS}K>ETd0eBoX@!#-e`;uYb-u?|)(0 z`RDvIKYjVeQ0sE|DZ?LHd5uYbJfuc}^R;)ZpbtwKcX)CD(|CqD#O(f$Ev721CS3Bd z+525HfPLDlVlnBS)HMrVKST<~WTd51f#Mvz{C!oJqK$^q-tV{_t789pWug zM`7x@$h9U7DpOk*I6pgH^4K2rvYCqh-rhq*Cug(3iT#D9v}j6X=f)5 zjXN=#4Vd|s%FU1`E26%u6c`mI7zEuX0G2f_Ay81t@xB}K{=8L%E&Sc&0&yR z=tO1MXPAxo;@l$n%nGqc`#})u?9uwmwqjk8Ku`vD54?tg&6xS(vbp+6tOH6R3nBmq zEY^-!dnD5v0cjujOq*fiGgd8{&9$THsih*2OT5WSr)bb^{+K+;VSk$mO2Ni(BQM)C>SV8o8&W!GSF4eor!$(f-5LRrh zN-10!cgb>?+`n)V^SoC#sIqXbMF3R@9T)`UX0dtvC@JovWp}v}Nm4s#4 zTU%xny*TZ;vlpK61@=`^+0b6Z=;_jZ0No7dGB&b+SN4B>|^xFpYd$A3@V+J^41bR;d z8%h!aOk9e)>LYTD)zJ;0Z?z2r!-AR)7`kk*BvmYv-5Yr=rgR7qxarV6z%KzBzyZ*3 zD&1qGqZ_Tsu3kkrAJSWf&dd-XlTZl(4d~P@_7TGWgew)Pmf^+Kyc%{-BQcedZ@s-8 z5(;Tf8Bkxe9U;h1-u&nbOp}xGn;FU}7}&e;jucgriTOwz71B-WgA-Ycjb`Jrgyg7l zZv?baAP5?Z42@DXD0Mozz)kL+ECs{@I#O|@K*AP|TOt<)-7{OaH8bWK4fK#)DG05T zL!EEAZUV;nEw*+dALU9s4%Ob@0MmumXI53$s^E)70bJhA_B-56R|5oqMSL$@BFM6} z@Qb3g-k@@!Z27ADmQAkU^vyAZvRvrF=QshYKK}eY;lN+Leuhc=yHCQ)=Lh)=ABTtJ z8$H`ncMKO#K19xTcd;@_M`)bZapxb}C~nZnUR$qrz}8f`p4wxeTBuwM5>z=jiD*Iz6z?U%urA1|7)eTnx13k&_{xzd z(0E_l3zf)DcU##5#P!HqOWJ9XwXk~sqg&fsX2ce_(b7_XFwjY2EWWpBHBs96EnWB2 zC^Y4~x!=i&DrI=bgp57wXml~)8I;Pu!f3$9}ws9IB@%_C1Dm4ksymahaxeU=| zQ$=KBsg3FZUxDbpK1twfVFicz0}z*bV|Wv&9gga^b7*B($~(A}C!jN8j=xw~Q=ekx zz4M+u>x4iJZBR=dpruZz0%$>yYVkfTAUg{K-*L4hoHYZ(#v_1sE8JJawA{NuZl|P z0~U7;(Lq}U6?uxbNCLARj|WhPfE(tZ z<9b%=t`g3>k-1J6PUBsQ9JwkMsZ^;rA7XjB2pC)mAc5eMR4IZ~a!bPEWDlrAqm$)2 zNZfe1M=zWHH?qG&X~{kHM#-JRMfUms5dPZ6V84C&b9nvw@a~u4g#d_u_u$_^CL<>hH{OvX0p)IinMqK`quW%D0d}b>^mWRz%;7v z0X?jT##(z=7llf`r#dUX^JOmgxZ?vY*vcK>2i9&dx;jJ@)~waLsC61eWFat`11RFb zdF)#LX$h`SB{{iM^DnM@^QNq~n?0B0h!}aZjsol* zV0Xnjy2mJ_TV}9j*WK7op@eo`6TLl*A=;owJ{vgG(=Ov7A&sE+4Os~UUJ-a{xiP5Q zZ`{eoQAecP>h`GYpdqct&SouLt7eM_ohYg*+*Y*q;Jg7%y)%5?wTI%8ma@__a3Y6S zXfRp1)vhbB33o~}%yK(g&~=N<3si(2Now0mQkO;QFUYoyVF+QlEl6JYNZO2hmwfer z3(y9aT9F_#nIu0Aqw*zG`_o0eG2Gw4{0ch^vgxXiR^&h1&)^KulHrR}XhQ?=W#E(rgkPJVfI3*?sYLN?+2Qp3o7EZ-7OU3al zJG=)=-Q@_qG<6Aroy-|@28b>>I1^hMQ0}U&P@%CdRh)efm`na4+5Sy75edx^njWr) z1>8|H9w47ARVD~NorVbBrAVU@`bmERb%W|T+PVhJAaa`>CWZIpW43%Cf@Sfyf9!0= z+GWYCMrc+61ldFDU~ItEIklbkc3S3#;kF#Gi&z{}6HJRcs4*?Y0}I&TxtC2MYtLLy ziq=TXpoO3+G8V6B3s`?^t$oB%|yk zVX1SCt4zbmK=i{A^g+MFkFn4U5%W}}icY2%LxPifH|tFyZ{tiE2Vjn-?JqCjKhy|lTmphlXP|28+t8Sh}+4x>2#!lV*?E|4uFN8XF<9^A8+ zq-qTrD8&!}lFkC9I<{<~mX{!9gSn2?#emo#sdI@Ps1`F+9HIB-P35GHmdX#1WT*)> zzWA3TRZN6Kxkq+c^}x)z*jhY7HoaO53A6LDs&0G>0qHZ(G7V$pxhfv*C6OzD4Y`q2ErvSQ zrXEyiRO)d@Z^*Ml!;+?bvAg-MDL2r#Xf?t8>Omg)p?^!4<8~b1k$p+1$NFLDO=Ei zJDwflVq2C0TSVpmS@JT@@&UKK$_~Kb5CzK70F{`1)$*_ETDDA&L!yqRFJ!G zy?a}&uF=RS8sFiV;^N>2q(lR_dAv@bt3(@hN*qHlgLav!=cxsc%RfPdPGVQJTV%4p zObAbbT<}Mt&HD^d#6hCgQ_W&5PT_V_8jUrxRP7W{M4qF+$8MI2Yg-(fn?Ng?Gujqs zN;qxa>Vv$eim=V8PnhU24Qh*yl1Ia4EHXH7KXqP<6jgv`y6$eRnV$u*cnUig!?eUH zLE;R31oo&<+?bvc)VH_VD5Z7WNh2^UFx+ZEv$@MELl~Rh2~=L;UjF%zfj;5gr!U{U z*w6f7JGk03po1Co zQS!sV_xKfL%b@|xx-PQAE;28z-z;&Wjht9 zA;5JOL%OiJdx?Cq9cM0!@)(!XJl+UbRIiyUCxLPw8}$~ty%uvY4E9+P)DM^!PwGu3 zZ*78OCpr+L6v1vg1}&_p+EaWjLshGjSD9}^QE_&f$Fg$5mj)C*K3?i;MU?C_n4OhJ zSSX{JZtfJ`g|iR7Q-o$3X&x=bC8bo7PZ%xlBaMCPYX(zm_n%_)ay{=h{0`@w4xJSU zu(NJQTN$!$2{c_o5P?FW&OVHBij7(3+u32SGEZ$sk1r_3-_v_GKxYN3mgkcys}Ig& zbLG_&B<>7tQvd=dpTuBIc_w~TOYNl`TT}HI22+N6JE_2?MInqK&_cgqCZG_Rj+U_b z2L{y}Hs_(~{8-vTacKaxH!jGGkw6aN7RlVvL3uFoikNjabfTI{LClx4#l=U6NvcPQ zQ5pz6dcl-gmTRSfc{i2L>69+%e13tUH*PX&iKrK20WIRR8;NIZT$dzfO?Sp#xlxzF zCxdmUXM^KHy&%_G|5QTK*8#kaaqHS^QXT(|?jeIbkm|!7^dMHacl5KY(SkId#zEN~ zu?(4SQWrCJgI+=bR|!W!8TAGFAmy0qSjgqE;LxY{RKwOOXpjNBGRCrOyc7K!vQuZA?-J z+T^LkwcfKP-48Wp7SW}_&k+}Stsblck) zAfMS}i!p}10XVmXc*StNs%`9E?q9u&N{dqh6pT*2Z#lpLB)ta^^8N-0*M?)zIRM#Z z{fGh-J83@cOroGipt_Rh>q2RLT9i9oGu$eWiQj{GGwZ{*#T5yAl8wnaK*0Exua8lR zwB<}jFttFXN|fl36jN*>3R(FgSUQ~D6qRb1n!{yWlt`B&?TShgz`J}3i$3db54Eb_ z-&`hUaBv3FYX}lMr&9-#$R%xyQy&$JsL&v^f+*`GxD-shwJSS!cOPw?aIeeKJe*Et z2zta0hN(HaSh^cpu#{9e&V_yh0b+?t$*Jc_#dxJiT_~I2Qd3d&0Ia4>Dj`Ft2jcg2 zl~VSmj3yw&YqTVs*wx4-oh+u*4@WH25LN98*fRHKiyADVZ15@sDDhyDrFDA)@}Zq4 z*~@L_lJi2-d#I#H=qMAa(@NOgTSNu=Ag*q8JA)olq-07TO%h_mAXU)UhP@qbD3`38 z)yE$7n?0cXdCo5-b2~!k4%(a&Y3R_gpp+eLZwF6rcuMdFS^Ht2jwVjBf`1(T`tZY` zeB$5lT4`T_E%UF+&wLVI|5?%EufGZJK7RS=)!~^R0J5oVG|n>rpYWQy@9>ZFwC~}I zM=5m!t526_0bt!?|G-klqyFrePsSomK%Mk$b6m<&*YNrLWkQypWeA1vH1@U(aLI*{Wi;@Mk-?Vzu!wn>DB;9?um zuox^{w_%aD9hp61Ua(4*rE>#9L#~07%lWFDr7KJDtExy#0eiUCgdzZxZXi=&{tp-A z*yx2yirB6J`kbZ_ug|>ZmY^xzz-Dqp=}axCv(!}F+7&QTZL802&$JlK;>YS1ubXv@0-GDPKa zz{Sq@P)uH0P?SS6%tCPkbb%>@I)q=bAH<-8m!o@%di}Ig7+XBcDR5Xcz>&k4+YdQ#;&;c)BFJFl?FaT^8i*Y z5%~51hCeQ}42&IaK+Z1Jo|7TF;gl6jt)0u(x33@l8)5ZdkQcw=G(t-Bm*3<<{Wlgh z=RVw1BWZuZ+d>J4X`sA&S@uv!h8ziK3k3oaRlb;^81@>5(z;f97v9mi3Osf|j0C^Yc>O#?<1j-->1s3`z> zG$Gx+?+VQ9Xv<@P+<&|}8W`9X>Uzni-a>D=-;gS|odJ2(EeOMVpqCsV(kjivXC8e9 zi|oYrFf)-?QAC*8dYIL46Ms@RxY^=#TA#7QEPn0yh>zf=$2`*%6vd__uzUlPd@hoZ z5Bz4hZU+brTgVump!Ql){6JxiE}*^WVRYTD0hRz9s9-B3+Z&!rJ*@0vX)GWvu8>lc z5U~(0yu!lUj^(j7)i0 zm(MjTY!ONCxTbd(&XJAejlD2P9Su^Gd7jWnsffgr;kh2?X$xc(j8iHGn2;T#t{3J> z1chYD4p#)jY#neA`z0mKbEAPuYdCs?uToQ{bSkdoFdk4%EwC&rrow^Cr&2C1_iV|u zi*Fj66B0>BS{Fh4pXCOa3HH-~D|nYL5>Fc;V<0t^24h8TAc{yx0>oCXiLb>-)!vR-e<*1dUAGeahn%%g8@b$4Tg>170d1*C)gHq)6_LK ztr7cg>@BTQm^q?t-a3^Q5@Zo8(rO->qSyP(9dBBj?5- zk^3!?l`+Gj9z=4JC*?~_*@DI*CN3U{+XECTEFLQI-P)l^CESbYIbxw>qY(+gu4W=u!fTUOS#DT+yql{^)$o`x;K4XEk(AQ=)6 z$o?{Vj4D$u*hftrSEpU$>B*amEpc}nRf}Ic@R1Om7iJlp7}ZF-OFw?4)ev`ePb3adnwh+zl4~u#;^o z5W<0#JAfrE+ncR+0;QN}Ts9AStT8u6nhgNGDH`IlnTofIip-!?;V^dwJvz`xTFy~C zNMMx=ANf*V#u$s4EE$}5Wm&0CUrSU*R`W;zuh&= zlz{%V#SzoO#0bi`;i6`%%xpxS6&|0IxfGI|=mJ%FniRYsmkL1?hO`#b{-45n` zPgS9}L1n_C!DCPZk5$DCGA6gU(yuB+powv7xRWEW^`t6nbqy-S=B7Pcg~{b{W2JD>&@|eWeQJ&)xYM%E^ z6OfkJh<_3-Ef$^;%d3&P)~l)vK1YZ55`fr__n0pLTaNQhE}Qa{mx;D#(*zgQbIHGf zQkl-9WN!=LGG|_N=u`}#jHxszK~6xM2i|kq1$*5WFyBIw-8Dp)5ozt-^fydH8oF$b9+o0VTJ- z$&dc}^^d_s^55*CuCxSX>Xl1_bo-DzS`zr5K6N`us8n>Kb0)RxB?y^(f` zu*VR0Y6X(7Sf2|p5>6<_6`e(nG%D~k9=7n!<#mpaU2H(%@hl5{A%U}2O}0Y^V`nKo zrINRwlDY-re+h_PRDZUlQF_{TFPk_CQBaS{tLD=73e?|Okf^~|Bh_0(1C#X|d;uY* z=$6%Bb6ReL8l*j(w+B4yYI?Yyog{YJFy9S5OK;R|B)FYoAmZ})HdID*f|i*S3S&Wz z96?kx1YGu}hDbMyJ&aMz@i7Mj*u_YxRXu`>&d+iJ`b(-!ey9PpG!Q8Vw7QogjVBmz z9bP6DR%2VIZ04(tKn2=MR+sMRKy7Gd`Cv7ihJy|leV+RCDHC)Jh_i|da8z~(+udQM zc-AyYf>Z5=4SK+Vz>aR*%`0dLljt(i0{stZVpTB(ex>v<| z_u0!Al9&KO^7>JJ1RSN$4Iq1X_xJcM`3L{&_aDJBGtF7LRz+aCQTd%paRnqcFH6mc z-M>}ts)rFcA>k?sl*_)ZbGnt0jjI1H%n4SA>$ct*jYq_c?NDf3IKMdtp*KT*$du)E@FwA zcAl@TScJqWxsRa38qq1iyx0GGh*l?XeUlmR*66n zroK|d+`W2obZvyxl!YB^ngnQOVvvQ6OcaMg*BmLNiwP&<1wgEGs~|Ff?SKWjyV&tr zd&-<%Mz|7UT{_f6+i=7?LD7gAy_W&t=2#E1478YHFAvvh}}H! z+t*L_X~oxJ-@E=Tbv@q$pzS)@e`479@Z}fb2NoJ6CYZ2irqm_KYHLRtNvFh$?5Axn zKXb$T*javg!w|ey0PN|o0XxA2WG-cZ?1NP*A~~y;jf9!0DBsCGRy9kXXucqcPo;f+ z^fKj^QE(g}_E5zIQsYSm&Un}EYc;+t@nIY_kxFX#v@lQ%DpRIp(^-9DEl5Bx3pz!M zpBH-hJSv}r!V|aF1?6Ej!f}*jkXind4yn@^Tox~`5>zDtCT=56K1UwXgvrlZq$Yqt zC?KI8CIy774rpeLlVe(eo6NkO(s@zVfh>(ap77I02@H*@a5GHQS5%}BAKXgMqZDcem?u(O&9A8EXN?pQRC-!Vm$~d$t>4P501W!HHaw5ZeG6BySZW$!) zj5bj`skah%fGCgHM~2Thl!2XLtrp$oLpmn)9U}DnD3R){mOyY>EIXLwX#5jU_J; z!NzzeD~z7ny8OaAx=9D7a3@NIVP&FCydH2vnhNw1?B!EZeUZbQy z79b(IY+azJnII0qwDz`G*#Lj0&XI2$j@NKoYsf z@=Rt?Gme3lr1zkTW~}dy;Z2cXfA~=bjPBfg9@)qq=XEY-5=z%=QaK&9#e@Xz+_L3_-jw~sG$Nsy(l`;Vb%C1i z!(ic{72FD`Ai!S}-6gll!JZGg6~{Y^{P+wX`)kYo5_+SK8j$?Rs+l=AhKTtJrcrCo zs0Fb;&0%4BH-;mne*j{c7`rx%`z@@2QhFGtGbTvRq%s&+&z)k#D1V|-5J=dD$}LW< zYCCc08!3o~r-!V*20x$d1++TS3FZ{4|D2P79&^Biespi`N^MgaX|IDNPjOcU569(G zAuJ)sRvV65$yTfsA>w`}*&fI%?T1G5qk#K(o8;@!SFNh}fcL{G+ky_6$A1hoP`2~C z0m?G@xYH8Tc@Plvrfj@(A3&iq9G6660A|BRh(e!jyh-MS9I27OHz>1Uhcs}P&abQ% zy)ob;7+SF^NwVawmh~LN>KyB4Bru_Yfv+TiH)_3Ma?o+MsyX16eG(p)R^9LJm zN}G`j^dyf!8Ac4eAQADi-=$$&p&~5z}!(C83Sje<et$ThYX3~;hfjUpUn&Mq*2<}B^quU|ifiEMcJ^yQPoQzBJyY|BT#g+7|arG5g1`F^JJH3m-BhX--n?(12BLiw;wWo7`_XC2hO zZ72K%M@8Zb=a`&_JV`1?t3!m@t@rNQOvF;0$d%4%)F^_G-CM%-E5+|S5f}UErTOmq&h*yxhAX%bqqEZ(mdd<%! zseOz!RMiM)IVu{|V#11=ou-4Tfu<5#i+^BEf>;Q;0C}B`J;2H1xYNc`H2HYMB`Em7 z8bhjlbjG0BCMq?|Xj!rOcungv{-V4AcKxe|g>zU(G-I}kxG%N|R=`IoHr3YsSQx5V z`eHZx$v7w-X12~H!T`-TFWL2jr%c!vWmQW2$F9j5@r1FWdRHo-h~N;S?lDmC|^*LomY=4QO2vErjq- z^$3%e;t2n-^K1j?5f{BBU9v%(O%(pqv0}-d776G_MQGA$20m6j_>chg?>(O*^tCKQ zUnJkV$V+W^Wa9;u!%aP!tB3~E(MaKtQ=uqMt0=kVaZoldn$`L7V8E6cTxv*8NX_Y; z_iaX!kG437l(A7I3fKYCZ5U=>#6Gq|Zd`c#3YCOP6XtWZpCUG?wp$PBvMRAV3_{i} z+I0^SsCrrN4~ZgccY?G#H`cygz|3GHqtD88RME-UgN89fN4;1o<48KToxYbvS7 z5NWU#>vP3I3eQ}aKA`M!{(i-}py!y{!o$K4SwgHM_lZlm8<_{HzEojqfhDPn9IO-$ zP)|iS?$BN}C$;jj(GGUW3|eTWo$(yx|FpmfQc$c89ywKR(FdB_CCr{u!F3(DQX5fp znGt^Aw7dadU^pPH zV5o0eibpr9W5yTMAaZ77j2;JQ9ZtFLHDlHQ5%L-ocBu!evC25)G)t;?=-zh43P54tX*k@f9wpUqI;gG6GXXgv#S~0GGAKw_kbwR zHMkwv93G02pd_fI#tp!pS9b9+EIVOanYsiF3==bUNTw`hs9^UwIyeIPW(H7LXH2P& zi`-Xrg2d{T+v-?q1s#TB7SORLAG=CfGU|!hd0>=V5Kf65?ik`Su{&8S3=Di?Adz{6 zc!1_-Yt1N(_G|!;P6ZUlK$o}l&pM+kjr&~@Yk$cfm;DZmOcc#F%NqY-v83IR!Z z5-0gug}XfhQ-`;1pStE95dcj>pp;gqbi?yFE{HPjmE`Hf9U```diCYPkvaWiom1C@Q_wfu;D zV221@7}5;KEcd8qfAb%L1i>5(Io!;%&VNTw9aH7_#p{RRH&%R&2q2wG(tmb3%imevwO%q5>52;mhpp{bXDPm=w?*@QaSbbV-O zX&lxXLVvwV_Y)!U2&xH~PrxmUn`%x{AsVdGMp9ilzyy2pD1;U$k?mJZ8OV+S7s_i< zL`+LX7TLzk>wXN+C%W@DcDJXoYa#oycm*(Z@Gl?8D2E5(gKR!G9vF{)gAH>B_SyPy z?!}N)+Xt7CAvy;5#{2Sf_6cG&(wH-?PkW&SCL+V;Ufk;cr4yqT~|Iu%&ic3Rgli z%X^CYj3I3^bQfiTcSXGnV-NQ5(K2SKs?yf0dK@Bp#x9GRB?6!7sHz9R)m@puRNLYl z!D_=C0R<{cUb%7u&~$d+D*kMhAQhh_jG;WUJpr_q|My^F=d15YuBs}lYTth*KZnrs zQwcpc+u7g!{mbX!M>(PlhLE^Ru9ySKsF7!H_;u4>S0#yz4@B@#*bb2VAh2OOu8Q_o zHHnn~(uXRR*vZyoxjNBK(yO6xInDp(k)AI<4BYbTv55>4UG&q>k6R>4|2 zh2FHoBy5pRTcJxqzI8Fo3_RxCsSwGg8f>vB4Y#~WXm>pWBl7vIK(+Mtfa&C&U4gMn zewV35Qm73EHazx;7=%B)fYo}91*YU;4jqHzY zi>0x=NijEBozyp_;x=$b=dC`gxnbN4SbPq>;VuA?ldE9q((bPuRX&wBXaWK#^U*!I z!WiZRUNTVSu|meQQhXj7H^jJal3BSdytwvSECCh$qEhaYP5@vI$ehz}&7xtA9n9VHeB32(%~s_~q-Duit(2`W0dx zObWj^Ku6I!<&OnsMq4+ntYWa6Q)7OXJs#pViK4vgvxqE=NP(b7rj$p^Uv7|6-R5Ig zAW+*3#vI4yP>nYb*8+IqOkvz@E zJqR}EkwP*OouapNAs$9d)jS>%FjcqKk|UkOSYk01c272LmRES@>9V@q{N#;Sgq3=< zyKTG%8WP&9XOJ)j%)ks!VPak3!(%UWP*e}4VkNI4-u0$cL9fa%7DIfFDV3e%RG5{| zCzf~5r=xN@ZGP1|=@uQ7$sg*~UC@xMQo}5MWX8?(Lp^6Xlza>=#S__qS^T9(`(sG{ z$hC+UK(`3PPDF@G_J-}W&6{Q2N42oJ$$m8wa&@aRmq)5<61|V9y^Id$L;e{c?a;Xw znu<=fH!21sokLU^Ds@Hqs=XN^+p;4ays)3j{h(i=4scjiJk1gm=!sa<`wD(VY2%E}bUDklvQ&Lh znSBcjfoKGsYU`z!qfnfXD^oC-Wr>_1ZplrV590@ouO=vs-SK@K7m2TX1BIF?S~R(dl)LRSG{>-06--| z)H~&X=Jh)&G@H1iiIPt-jO6}n+IpwtW^3thU=1Rw5s0R z5$GnV>@}5vQIl4Hvc|c%<*4~?+MU#D_MTwv)ilgdP*5S6-Uce1NDA1lTS?|6X5JK5 z#OQN|kc}rQfc1GOYFyb1WcXCm!ag>43J(KmS zJ*Dtq4x)LL=tz@5BFec&j$Qvc`&u9QjC09G#(W3{T^S~$-^>qoqe_nx z01lGn1M&iQ@9WgS@j6r$`c^0HI?pKOEOvQ+e1_^Eg-%+f{CT@M_u2Q3uZ=Bxd2{bo zq?6)4-tz7MWdj6>NU>U&8A@QMh_v+~s-v&YZPO)6TH@ie4V7QoTn8E>>)jZtL<0{+r>Y^xU z_;(fxF;Q*nk@ZUpEx!|&Y&)!Id;wreLO`aTM@5V4$)IpUM{I%$wE3*9R_|Oj>^Uj8 zjFvqQINlbLvSg+m@JqA%Y-DMo(8w)^0?SqRK>sZ0y_0gu*}@(r&Pjd+rIn2rHM=jW zY9eH&R!_8mnmTSE{^mzaNieL1bZFu9h}SAH$&{ZKh*wx3l3nx?&xH_}R25}5PidV3 zBTWU(#bEAe9+NT9DA!Rv7Tl0td(3uhJYraSEUpXH&hkTw-6bn%t3ZKb$aIo=jj0bk z)@rFZ;l%NjjjzI(lYtGM4+J<#b{J8RJ(!!RAW5L^w5+A#NQ*X$MXKX5W!d{md2fW_ zn61x;M!6}E{SJ;j-}8|FJkVu+XR7Fm)c^SMQF!_6@PwJR-9b-a0rF*hJT6Fp3CDlH zaGT~G+U%q*ln(w9%;pAy-WPQ9>eN}j4Fel>Zc=ds?Pa4$x@m`ATO>HkLuBap=<>)w#i^zN(YaG>3pK?ya$k+tM;VTWSba*uAwDK=sn;X? zvI&|5mVI@N-x_33^*PU4=Q|llg=8${uf%C{p$-5Noz6to_Y7h6k2 zwH4%YY{Q(T)$Vj4$&$VDu@}M)w#VF<+N&{0YC{S(EQ~Dy#6EjUw;f7BesKc=b}J9H zt^o?T$npU9Y{A<&c{3|1T>{o<`Z_UykaxSNoJ538nx$?Fuzsk;R13yZMF@1z?P;k( zB;9P@j->|C>eeQ9*b;z3@1qK=v(k-Hkx+2q4Ga@4S}Kk$A4}S(Di7U`V>_ur4z<}v zSmfDoSM5~>^uN!o;-D;cZl0SANx^H`q?VcO5Fv*gT>I%^I$jblL7lV+2?e6G%}n%q zwSZ!CypoCt!IE-39YC_A-vES;`j-VdH1BA#jY;n#xK;z^q8A{pz{MK|uX-gI*ebfn z%|y@?ILfEk9~3exx1e>%DVl$lag?ntTP>zBh=AAL^ULql|QL>u$CLlDmNxd&{V5X|g zLLX&`n^Y@)b)4zzAuo(UO0w(D?G<(2t^!dU!9YIdV$n&_=BzunkS5fdkoqeC$4Yjl zQV!lxsCvbCb=@osGp-65l}{2Xb{2R6m}jksrDe>)oHv=D(3h_{sZucbdU%AZ;iPWZ zoATl29n`y&o4JhGkid{bv`y$=c#)m~wMO&$uDK(Ge zQ);zr!!)ha!`?(!9-2b+U}2esV)J)^Y|4KM=u-(}CZ&1x>GjeoH8Dw+74HR5-Up88 zpk{pzi18&#$X)uNjkvY4GMf+Sli{GHCI*6VoJeq)p!7Hchm%iXvjTPsM1Lj2ip7E& z*M`dII`P_>q3BR-g>p;ku1u9c(lO7~_>>iYGX{vfb_o0?DfO-!reb74%MKrCcA?@N z78iPl<6R|0J(!eVVP(qH>1qk|6|cmaXNump%-9Cy$N9-H z-pE95;d19drDFJ<6Cj|sP7f2?L&t_S4HRbBQI)vj{v%S6Y0i)Bo**WzmhD7-va*PR z7WVjHn+mdH43KDAu}oE)psO81EQFpG&DcvqbitJI3{O{*TOb#PM&(1U+r3@glo)e7 zdr3y;`%V5DUjD3)ynOKb+rWbyi!fo>DZQvz!eiXP%#-K4LoTL&NW$YtxQ%i zm<84q8YKHb%cgW}RL|S34`wPD$U<44?!k19V27Dv3smDI2k4U?0!3huALy({Qcj>) zO`oMxTM>x?j|8Wh$mRfTD$^kVPP47I&d0UK_N_M|j$j~Y*O#;J`wHT+P~!5`8clY&1G!w>1s{qJ(HE%YD#}z~<{;HNa<2%7G7>Ci*vb zKqYy`8YEX6Jc@qQAZz@)&GFbV%r%Ou0f z0(fedaSPL|=?I()*y$ND*^cDF$sKiPn1ECP8k=#b*;iZMqRz^P8875RZ8>+#YpJZ@ zxWNpkM{K)TqbJ4e=V@IcAPfTTSxa!_qrNH)$$H%5J-5-Ro|`Cp_GZhlem={zxh=M1l|-#tY5kbi4I27w=da}=*g#CZ152RjP#bRZ$Pcj zyUm4sbq-{)3_?FQ*>8M5S+l(mAi~U8R6hkaV|GTQ!V0yt=*$zi5EP^7J!nOe=b_B` zwkivxmK2Gh5A+l%`AFr39sxW?c_t|=cN>TZn6A~LvM5DHs@Czcee%muc2b+(jc7f% zpcqDdo=`Pzp@ZXEcH_DT?$J4N!T{5XIF88F1mkfShYm4hYoV}Y%HXnn!!vR>my*wn zdKtq^#^10xiMR(J+mgfhuR&?XK++du+jZkO!H z$YyulNcgxWSqA1(HR2iap=@D?1ObIP9?*2jVG%9gOL+Iw@BTiYw+mcOp;=ZZM_ijH zV9Q2whjiDpd=n(!322J4FL--dgXxj;evEHg*A%G1=3p(Q(p-VALy8~J4i2(xh1D8r=7b!#sV{Lhc+6p9foYE3X0+a=( z^B5qcB2j8l)erkPanCrFMv9d+;gOYC+ zHG)aQ!`NkOJ8fN=2y4Yv&zl2DKy8Dj(&j#P$`Z+4!h9~@fHZ*Ab!B!2f_*F=Hwy;( zxp}-b);!*t2RxXbWD6s8w!>g8_@ym~0#ymkC(wWL^6jEvWb00YPvTIDH(}_|N2=Qi z7-5KVzDRBTM^v1F-@Va{jDuljs3`q{IF|F;r#yld0<%SRzGjy}WpkXc1Nk!-qL;ot!T)e%7?$&XM@lJ zQMuy5h|v=!>QqO%CToS}@KV|`viMh7fh$kKN$Is$kk(Xcf_^KAfRs+EgH_8ojF$*L zNa_xt0b8S2XZ2Y-DHgr*X#pK0lF2!Zz=hM?V8ewY7%8pl$~}`FuDvDA2*UXdA3^9F z`TY(MWpX~iRw33(^6s-lp)3t)p&_HP;oh=PE)#z)Uy>ep{MoVmy?o^0&3cAHA zhDdH)3zoQtMjJlh_LSs@dp=50*?g0f@{}>OxTCCd0`h&*(bN4TycG)@>5fQSlaz4^0)MZoC);0D#tZ zSd}9Kc;g_O`i_>Lm&5b60H-)FM+)8bYU1q!wM9us+*C2?FZJvO`3U>Qy!8rl(iV4R zBa#ZhEa%w*>8TDY^9sU1r`>AF!$tzkS;tPY5JncW`N7iI%Y&0cydoNz#C1d~-a@Lf zCRy-e-`F80BUByj2-}Mu{^SRq)%`I1Z~9fL4A`X3#47=Ff*GAnHYB$@=T`@JP)xoW z@^b-(NpCG&Vyt|W%nU;3Xo!*(Cc#i%{ClmQHTDW=F6Ta6SY7J?Bo)XNlcWOv38XkB z7+YkUa$!Qn1WerQf*y|gk1_32yI$yJhxA4N6u5IoTn=*KjG^e7P{IeFR8KY zc0in9elLOLd;o2{MeD|*UJKb@)V-7y?J^cR40Qe1D~ zrpzFep+_reZM(uRNE`lENJ7J*anPUIF;%UEghquAXV@M+n3*WrW$VecMTrO0Pz|1~ zi&RM{Y0fTNi3Ky>W!ToW+7J*VR@nr?GN&)-%D~j>i~V=4fA!r@ z!}lNH%>EB<>yUpBO{;$j*1`JhzxFwpdt|khgHvnT`ygXYdJYlV1^CC7JC2$+n zTZ`0OXj@ZGi>n;yctlI}O%DuS|{-G|JNR^Aycm%P~8XJSW-;08W4E-(t1^i>D zkRGM@12hEYks2p}_^Uba3;>1Ujb!UN;|j+5>I$LxL5Z}L)F$o5nIV8kW2e=n{0bz3 zJB$S06Fj<(5ZD5+Ttd=7`#BwX=2!<3;8GthZm*&X^JLsQsB6S?Mm4?;B&*#;Yh#ikvrJ&#oGL@1VEO*7MbfqOd$)@jybwEq)9ma{IU9_*bQy+)y zyDJ~sM^y-mH6PXdTQ}IgfCnlVAEMdx&odTW8aJ}7l42qrT(yGdu1kiA*Qi? z6WWI{00(41r6SgWv}D^S(6DY6LbM+UQ#(SYBq=16GAVP@FbAEssld?#=c_d48?Djv zq1>T6W&tFF-J^}Z8pB6R%xGF#R20o^6;EsOtenUm)m!7-4ZR;K&u(Bqhtrwtzy)Pk zK3dhW=>|yiIBZwBP*?ue2#i8%$qQT{Mr177#hi}p#Nl_ScxIRVSc*F~a2b#YKvirh z@)AzlOephvelbNKbp|TC(phxtQ!n}1aqxMVT+(`53h!-z=i!XOMfnw-KN0yTbw5XQ zZ#Lz_XY+5ODOsFPw??Qqt2CH2#|EVAiF_n?A= zVE&;_(lFz9v@nj{Tv;v2>xi^;1Fn(Z2$y_tl}yA!%oT0j%`&?yIJ2gm3vE^Mn@>N<)5>O9-Y&qO>nju^ug06CBwWu4W)WYDlgz>z3Pr+ zykE#oA@!Ks)IdB;ThW9uFDjL6K>@@aY87Qw2QqJ(c$2KC+ggJytEo?p0uLy}dqQ19 z*8>WJ79uuftlX1VOtoPJX2=#6zZ8^WbVPx=xsjG@EKf@C&S>|g)eQ#fGdPvA6lhZL zSwnkPx)d#P)qPwSD~>7SUMX*bXvSx7*{iCRc-rWVNJY)6wT#Lgs^oTgq};xvlABtv zFn4Njec32~MvSx$S({l(VuPf{sdRe=Ab$XE7)ix@-vs=3a3=Wh<@50RtHZnhE4+S| zgC2-Q)|k2{mGnQIv;9B|Od}CAH*}9DLM}lOUq@wmoX7F7$$yYUT7bT5dzYL>^Ea!Q zSy;q0&*I|dVz3z+*>5|AD-7dMGkd&Lj?9jmt4IS0hz}?u-CDu{u$vQ#w1TgzAOPU= zDO3Wb3iO}Z`bD!7{67QhWU{*IWRx(7pf^6Va2uH%h=j0evOs{sn?lmcKVEuDlVE6` z59QSd$N?5P3pM{$lPq?~fpZ>JebO50=%7Umd&uhq5(%BxW8lBep><%SW9wB?U zN(5QUFJB>9P}y`@_U|_V^_~hw+T?D|;U9aZZR+ia-Duv9J`a@-aO@m@)Phy@v3!~4 z1JtTbR1(-Cf_|ak9Et*^oJ1*n^0t8hD%tx9vQ3>WV(@VrFB>2<$+eD{I4AjJT|EF( zWfkjMQ)4~jMm_Pkw$Z{KF~gJ_S2f+tkJ7#g_Os>SO@d%4$Nw1kNK(|3G&{;8K-9ar zOfAuWc8MO${KlX)7J-^TZriM{lgq$fUlqGH$GG+z1N@1zu$cKw*g<| zG1>Fx#PJS#;8(NDgV5?yt6>!emSA9zDVn`RLA;O3o3)?`!HtwiNWt9NkW*Jmcpz(t z43R35Ey)$|2zNqlRtXVD+cR_0hz-z!*(3CQS%PGY^H}I>XpaDWZE0o%l$H0jMo-TW)q>C3S`vNHLv`lZ z3^*Pw1tx%wX<4jguH8|SvfeG<9_zZDl#83=AF6@qhi<|!gbQI!8}P5k7LrWup3&LM z=e98zg1oxOc2SLtmtcCJfwaK}6kT?P++IDNgHIIEx$F?z^|aeCb!|pZ58DP68CORK zP`0Fu%pE!803R5%d5fy+vr*3hlbt3KL-u42CgOh1! z9p$q3JZigyB$A*BP<@}a*P@Ld5693O!58@F;@IFBcaq}Vr|l38cIysAXW8^DA61qj z`~rPk7(vssp%1*P9B09Z2cU%%(Y2QU)RaT*vULissN%)5x*2jG9%SW4Uai2xUz6p~ zz-nDB3drfjc*}-(@~YsW01pzM+i`T0L*~m@VF$JP-OHy|&;Bud|AFtH|EqEHSN8SO z{N10w{&RTwIilb<17hcNbqx%J)tUvY%9kErL7MuyrPN{iBEx zWOzgtos+FW0+}i|LNAmN>(Sj*+ZwGUX7LI@4szJ7Y`qb*CXF zHYD$&YwR7;E_ z2aqr#mOX1`p?ohA?vo%J;8>-q_F^K0H;dPqnEA0SNRg6 zIjNo@jONr`*!5WPy0tp`X;E*oZ+PlPc^&AXTMJT|I}G7TrBwkF?hlv;lAi?|pY_np za2+Jn6OQ%}smEVU{0 ze;R=Ai`2l4wmlF=-iCBA+LC9d3dp6E@(j_1GsE6RK8N#r3L;VV3KYeJMz|8o-{jMO zk-P0vHv@C+-S~b6H`0$GnpeRE89fgPXAgy5<-m1@e!qmAqQwWF=hu3)Z zB5i$~vZb_}DI|ECxETRzQ*=y~H%!NZ4V4lxqpgaiIi{%GI zlT-up4*U%)1q&pp7y6!en+YxvFvduSyjaT?1zSctm86a{#m4#PFdw9>gORu8=lCM8G0EWq=E&R$^T2qYlc5T!&B&WvFmd zA}oPP1c9O1X9BZkk;UO^9Nv@fmFHTwUAw54VhkPM;+)bqI(2-QeGJ?cju<8xr^rDR zlFW5Pwfooc%Kx`XyAmCGcP*i>n zXV_)Yc(CAhy%sy~Q_V@^DX!YIPs%KsM@g=_7Va4K6v(wslyXi|By21h(luNq3rncf ziWpSVmJ@(?q!2>Wz=2ngP%5}9*-QQM*AEpGpB(`&b>j13U6J~{0n{S#5a?=0tV#-C zcM*V)s$so30=Q~1_>W7=IEdh~t)mvF^wNoH8k-L*YE8NwyK!cA@Pj@208oTKz5B1P zzm~6mI6UPKsZM@=vL{ADY??~ItYK*(h52FI98<0PDNsl$p*6^GcQSk zQ_KFoGUSgKkF(*Xa~nHOQ-C5u4Ae9Maqs`9>rIxV$F4N7y+6e*N@mrqA$wnxRrQOg z%`OH9;Ew6X;2wyTs@U4dw9}@_w5dumIVPD!CdcGt78&_oI^VhHI~RX;D`|`XJmQZC z2XN0l!#B)6cAc=v{1D+N$z_b#uH1S9lSfM89cku!86Kc#q>DO$O}lv_l~@GCo8D`k z4l*4`y|<#{U~(zpdc7ke)w=@FY$$*d$nzP1|I9B(V~l*fDy>i*PvOrJSBWvvE^s$q zch5dSX~ZM0O7(0AgV<wq#L^HOA)3UpsAF_0~_uhiDHa-q)B5%20k*kxPwq(E-}GP(*CBy{MaKHcQG zM$;*B>zWQN!+grF#gLU@#fmsc#k;tjD83^SY^+^7+tdcEz#hwxG}=rF8mOS~JAn_O zz~YWePzpw${h0dQZfUpj&z*>ddGBd|I|-6krlr zKtny1WVL0&3x>as?k3MavLQ>Y(@qQ?zIb>XTE3)$=hy; zPM5ONfJGKM=frl08K@>Y|6&BJMyq}rwMS8(e-hiCN#5FxNSldI{C2^NzqT`$qToD zyOq5IAV+WUQpmNma8$#CI57_+^nV>nSJXN%O~*9o1IkbycH1`;KZSv0WO$Ot{qmo} z*Z=hPSq@EqeE(tikLO7B1xv-Br&oSO-082r`N#ZyzXU?o*g`Am?1r(Xe4qV*?OM=Y7|@^@`p)DIncvF?&Bn({l(L=nA<~0X&iyJT;ZV3dw}#T zvWj0f6%|5g%ofz>yjmx0;?iBaK9Q=3#DKPF?d|sHkrT4IY#mANCRLO?UBkeL>58ez zj|k&2J8ace_`yQ)!`^ulAEd;!lOo@wmh44W8FGJQ2af>{mTlOP$J=q(4k;QH0U|X* z3ZQ7Whl%<=sUu^@S0Cw&(<5PmF5|UV>#g9P*xJ2{*)y+ueO1lQisumDR;0ase+}0A z^c?*Z?*;1XQXy_r!L~e-TO?0)pgJks%?cV&E@ zT;3&5k*BwD<|AX`z4$ zP;1oKMb#aNglGeBQgQ_wW0ex{Qlr!+j0JV^mH@4?@vGHH%@%8=tuokf_Xj|#Pk^zR zRiPg2F0#JJ`+2D8bBaOeg;L)Jt;!y>l%6ObG}0|2D{8k1l)wBg!Ot?SRm+1c{fl=3 z)LUr2j&%od$g>&30UHgz8Y(rilu^;$() z0#m2CQ}=O~S~>A6SK#jNge^=nMr__8AJ~5YhK34AAgzx?a&3Vn& zQgEU7x1kW*d*!m&x`Lq2;fjK4PHuaFDJRE_x_9LbjDux4r2Lah z$I*2MTMq+M0it^bi6SMAA0)Yf7AgGJR-+1PPui23TD7OQEsx(ISp&U-Lwh9_=+!_5 zKEx+cSum*Ws~tq_HYzflk)LCdBRZBdMMo)t8)I!3=zwbdnq8rcOXJN-L2hm&<*Wrq+bGRWh5Nz-wE zMj*6Xx;A{WbdkrMNfMrZ3ms>DJcNjyA_48Z=K^u8Z4YofRZ`E0kx!IYJHw6@p}=wGDD&vli5u8e=yXb! ze^G}{OkYN-H@K1zte_f`veNb3_4>I#+h0+_dOb!sbLdWV8yU>VfWJ?X8RYH_^-b1{vE%K)- zr&0xHa7S<Wimp*Htao#lfk4xFY|OIcZzN0+h~S2oc3JBRq)?0A{S;<#QF#@zN38XiH7@kVkOI z-h>Vy`lOIt47SD0ZIC}wYyk9IqwFjvb^!!rTDX+YaDU-bq{qCM#~5iUMAH6DEi;kXUjEnc59e_CS@_Qua?ndK z{i?8zr9~Ma@wkBU0+=IKzm~nOZxCSdYcN1zn|puRl&yA`h`F+ z!-!lLxif3Ls_S`btV?<=59{bMy~{2;JPb$+k2EwtURt#Pcg*{Q*mt9^2(SRPLPpH0 zuT_+Ltq>;KX--?VD`3a_Q8$uvOGz<0++@Hk);dfI$5A!RAl+blhy1Uwe zY@3?aF)x5mEp?Omh3NU~M}1cOQIQB}LM5OPv4>xR!8&idwi8*b)tEDs9~rh-TPq^- zBZ{Jgno^JKY=i%w1v7PJOvk_wIQbAIFjPT@i5Xde7OMrMO(F7J;MlCB1a?TW+S)(^ zxME2kRX_lgogp0dO_Ft>=b0576mQ3nS5Zzl`Iv#od{L>bAxEp6tNl5gGr5nx zqCe@c&Cg0jhgZ8}rT}+`3l-Zguv+L(S=4GvaK{weI(nPph#c>LhHkW3CJI2e9c{r= z?`pY?2zBsSTG4nt6Jyq0g>vhfOzC3*Z%4^xA3FxGT`sXPgFS$3mw@HP^V;eJ5lW^c z>B#oyJgOBc>7xo8vk?jUVLJ(g$URSV{0)keR#xsAL8T z>RfGRti7d@gVJf4Fn5+KZp|b$3aFS@mCseJ4H|^1k~%L zL9buMaMH^)9092}2*+Tl6F6vq3n~r!N=t^Ws5-$<>Mk|t7|=7Ith-XNk&IPx6$gc5 zc_j*qOkgv}$0?U?ojGp=J92RiGqo{|o+4|C=yYr~`EjM=vI9gm9pa5~N~CVen;Xjn z-HX!+(kxn;N^HpD5E9~j3{licWg(pe_uGn_vp14^WyRxrM3yE$?G+hC)iFtgMaKYb zar;iWeNzr@$}>Wv{uk#^2m|%sq4Et@8%t&`PnUChdJSZE4%C5oXO*G#Xm*0op*(?M zZEl9eCF5sNeKs~Te?S6gRnxvZ1{~W23ua5~rZKr=wRVv)SUC>3T%kqa=FIY^O2Vm{ zSvobipe+NjK)9GmiYK3t%A=E3Cap4yqeGa91e4V0#2;M2Dx%b=y6{9rN1NH9JLi=u$(Bph13@unE^E)D)*_0snJ55Go=4|;#RS6O>fy4m=?m~ zGMpO!P%-i4Aq81Ek=hLVrbveBC!d7>J%zbX-+%D-x#=)JRTM5aT``snH)xBv(5bQl z`>tj!i}{LWY`cSO!OoVqc&8~1jAelNkRbG;-U9=i=@BIST(O_HE?SPz~&G!y#^4unLc^u|-Q;9l9 zzSl@k}9g=~B~WhdRlt3cnN11IFLH8BJRb(yQuL0kZWUDEaq8g`Z+H@Pqfi zU^MW9xAddrL22S98JAx8zP2LoB`A6+1q%p`LhbD8ilgf@*q{uOIET9JOxKh0C(w^* zLiz$v`hYu)nJ`G)GFxN4c`Cbhk7V&m2)o=^cDAw5P5To}wd>Wv1fv%wh*%DGo|Aaw ztP@;Y{pb{1?-=iC>eFK}s@ykc{%mc@+nBB>mJc?mG!b&19m=YP&~Si~ik)+>eurlY zTHUiLU*V9DaEDkg*?JT)`%+^7FeGRn_ zFB1rms~6kDqBadXC&qt6+V4;8^zZ*ZFX%sqx1anss(bHWeC+M;<@=BLIq<;03TgF^ z=*Z_67!m&6RoVab?YC6kl6Vl)C=?or(^WGH8=1TW6V!Mn_mO_BvwGjWFPEniy)iOF z71&&)IxL5BqDTIdXr3J%uids1!SHYY+6}oWN z8%anKq)wLhJkTt4ZXu{77i>V9O8mkBAH-G;WNkFv1wg>*B8e^P)9NzaAzo>@_J|2Z zpBS7r+rZ34DZmn&TwMmwx+G#2-3B=4A+x2<`dK$U6=3dAszW^DI6KMNw!?y!DqrRP zPsbDp;^$DrW8!#2o3b8BJ-S6nHWxOUA+KvE*{wz^~U|+g;kDLenjI z@}(fR2aC$+1IfmN4PW67%|ba|bqhXx__sjxYVwn*mzcO<=2LIUJ8*LpII@_j?5Erl z>e$q~?kb?RCY`N3Xn^%Vfc^waQw^AjGoOMY+O*VRm%Pdz^Ln0K#kDRC8mwI;iAAiH z5k|G=dTO~M8yLrtlIZa%>2X!DzEVN-RhC}~N!Hjp_jrV&_kysP8$FYvOeZH3YZfEl z8a-gD6NJRNJ1`O+>m==Y)*bW}J5nj)0kt=G8Q#mgmIAxW&QQfV7S)M>^bhu5kpJro ze;59X+eHLBu(ai8Z`nHH{|fJaNf?ISGR!CDiLxFGu&Pr?0oKVvilq1!PdbP_4>tRx z{&1^`O@@KW;$f@YI{b#mN+h`y3txZln|~zA36(x03h{fYg-hj7NKH(mv4A<*!_C;} z%Lnv1#B$lhfDoJfO18J-s%*CxC}zn2}M6p+yg>*c0aY6nE9H)6HD4?IRTLv7`G3$dV$%&2$| zi_If8`uhxq%q)_l%@}9r)$tbVWz5US-wZR!IVIO5iE$$?hy=|1|rpA7QVsI zit@h?gL9}piqtYaFlgzO-u)-wo#O(g$^Xi*4>cr0p;yNgOE!Y)QtfzrH%M0X!A!DH z-&=&xRAtpjVe-Og_Fl?^oh)?oOiruZy}>M-Ks&DR1)KuKoy&;HPpgt{#inNT$v(k* zDbo>-gU32SfS)kDHTsj8U=v)5r6&#>!g?zWnB!}h*e6bdExS|L=?Ws=qU!%iCLI^W zAJ~f$GY`t`sfs7bdqWl(0*+vXovl?>Qm?fPNnu4w)-!kf`crf7`?v7^1+t)2mmkpw zxA45Tz0VAcr>lWi4NP8F7*prTaEedsgr-hS>Yl_J3s#R4%>$c0y)Kn+Zr5d7vxzWf zc#Q4MESlhv6oK`>3CK1QKgg*M33VMxAnI{0vqO1TI8^;zJ=K;upJq>l*!dz zZjz2z+(Ms79Z)$21lhXE^_|4lt9>WD0f0C#?yHO+ODHj1w2bIRCX#(ry;OqV0~nh(?G432_&$KDsk-gor6}Z>2T`H z7;d#^O3O0_6Umh4&(ox2lgvs`-u=KjkSrJAiD;n(ao9Ya!>mCa)>V9%_BARnj2#X~ zft_(xyIeiZf*|%pG`C!;SoyK{OK%hOCI;mh_wiv2n!)}6_`Ta6-O8%2D7n(Yku7M) z!_G0hVtD)mUWgfX#(Yc9~#t}5p>?4MhmfP=%GG9 z>Y04yP5}fx(kn*JVtP8YxXa$8K#g-jqa*RczVv}QaBJl;v!_=AADvc|U1Pma{VjN# zR&Zk|)~hkf3(wVH*1lWyYtD*)E}>dLs2i>sMW1s%fJq0SwH(@`S=Ji8PAm{*qdQ*5 zLK1OOWkH)UZJw`x@&2no358FkHvH7I+AU@ckfX4%!4rUrdWB(MvYdXBru}TYEKBzU z-PkBHp)V|0ssEvk$|fqPVH;HKe)|GQ)$XLu?FSbd^3%+)(6msE_v{^tl0a3boVub4 zFs}0qz!V?_2sL+BYZ$=Of=l(O`3S9Z<(S^}UY|^A*L#r7iGgGRz`a&cQHa+1Xcfo; z=73RZl$09aG3kjNgX_ac>5)Yd*0x7s*eu13&e1TUbw5cY8+!vsctf&xGoH|;h65LB z#(Ib6vW^NVbg%#+U(=Ae#KygK_EZm2O%%7wfIg%|s$G4WQdl`;Us)9ykSv9*(Cq83 zK+b1#Cqx~|C7G0AQ@7shUGXaxWS|z34r{5mmI~^19P-C?P#<_uV^csue?A?Js)LxR zAZYV5MN^dyvSOq#b)&A9QVDJ7*};k>q)L0^4mN0zb^xSToi?kaN`e7wntt&SxPng5 z?pw)bvNE?u)N4BXG;q|kd}I`S)i@5KvZL80_S&X*1(s-tsY=ToooWHJVkPqGhK)q@-&TzIvvDwH zVihSDP&;0cpkZphpOUj-qVAE>`f}P*R44!10@k{gGbzm`9WEhbr$R|tsR0mqkf@OC zKiLhA4Rrg{VFe>cbTl1D8W*YWR~C)mX3TuS827`sPibKaT>JNx1M{Bx-LJA;UzC~T z74uX39;^z%k5xqps)B6$OOR)X0MGy&xTNr}%1z!8oEmkP>Q5ah;e1Y)zD0)#TS~*8hcY{8sNokCjczBO&;4MS8)pVX6sN(BFyL-+~BcZP>YVmq&!8maYl zqjW4ugw_ZKTdSeno}X@1%|T|Rumr^{z%z^XVaPGe-pf1c!Nx)ph;f#zKtoh6QNv(! zF#Aj+FV6?A0Q$ty&0sM6U=SHxwBj0j+~sv~flc`tA1*c8lCZBVfv;nXupWt~E*>J3 zd9HJ;#C-uj8f+Ge81PI}WFy-*n)b3v0Yl(Yna>?#2?={gZlDkt42 zfv>Le3q;AmZ;=DCWcItYPz3i@cLza@=m>^{uLKRIaZWT@Y~g=Mr$2lDd3gWpN#r+t z^M9nZ{Oa8HS18h3P4ogG5&7lNtw|T@G3oTtMB&tBruJF~MHX7umo0UsZM|Z=9x`*b zf~=Kmx`3>!Fxs-GA|<-ID1v-V&!l;+wYO4L=46g@R^A0IJRM?1FHcK}WKjafAb&8k zhQJZqtPTV&(bh@X-cG%z1Zo0o$eirlqh@6M4ycE?`p5Lj8dEZaS4&Bgj9j4e#kk8> znT~X@d>Qt8-nW6bI+^7RbpuknizLPQL`+HSAX(Qh7;_};fSkbe`c;)VmK9uGZ9t7} zTOQtmLw*NE;z4?N>nF->r3hlXL)f1d_ju+iceZ<#`)ETE{~hN&VCiJIyE%q5Yh@y)dTOvH9P8xLxdWvN;9zKj($-)^xvq|4V-L7jIt~ zn*)v>kg~M*bEwBjIt=mkC+_vm?gkjM*Ng& z69AJ(mkz6>?E}xt^mQe_SEzUZ+&7JIc&uOcuy9bY!Ryk8ftwD`jV#g)GfYDp@6bR7 zp3F6QHtl|FO0q8Dz1b%GWgoK@UhVvvR2M;1tI3{sP%ulD=b1KxUKE~4#T?$_9hDE| zqM=oS45Kb1$C;~6@x09fw}q495%Lq}cxz3Op|ya2u`C

brXZX@VYhc!=SFxwhp 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 z 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

B0o?DtF!VT!YjrDC^S2?RV?P>**rUM?tSk)et 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 literal 0 HcmV?d00001 diff --git a/mmsegmentation/mmseg/utils/class_names.py b/mmsegmentation/mmseg/utils/class_names.py new file mode 100644 index 0000000..cd4392b --- /dev/null +++ b/mmsegmentation/mmseg/utils/class_names.py @@ -0,0 +1,570 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.utils import is_str + +def xray_classes(): + return [ + 'finger-1', 'finger-2', 'finger-3', 'finger-4', 'finger-5', + 'finger-6', 'finger-7', 'finger-8', 'finger-9', 'finger-10', + 'finger-11', 'finger-12', 'finger-13', 'finger-14', 'finger-15', + 'finger-16', 'finger-17', 'finger-18', 'finger-19', 'Trapezium', + 'Trapezoid', 'Capitate', 'Hamate', 'Scaphoid', 'Lunate', + 'Triquetrum', 'Pisiform', 'Radius', 'Ulna', + ] + + +def xray_palette(): + return [ + (220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228), + (0, 60, 100), (0, 80, 100), (0, 0, 70), (0, 0, 192), (250, 170, 30), + (100, 170, 30), (220, 220, 0), (175, 116, 175), (250, 0, 30), (165, 42, 42), + (255, 77, 255), (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157), + (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), (255, 179, 240), + (0, 125, 92), (209, 0, 151), (188, 208, 182), (0, 220, 176), + ] + + +def cityscapes_classes(): + """Cityscapes class names for external use.""" + return [ + 'road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky', + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle' + ] + + +def ade_classes(): + """ADE20K class names for external use.""" + return [ + 'wall', 'building', 'sky', 'floor', 'tree', 'ceiling', 'road', 'bed ', + 'windowpane', 'grass', 'cabinet', 'sidewalk', 'person', 'earth', + 'door', 'table', 'mountain', 'plant', 'curtain', 'chair', 'car', + 'water', 'painting', 'sofa', 'shelf', 'house', 'sea', 'mirror', 'rug', + 'field', 'armchair', 'seat', 'fence', 'desk', 'rock', 'wardrobe', + 'lamp', 'bathtub', 'railing', 'cushion', 'base', 'box', 'column', + 'signboard', 'chest of drawers', 'counter', 'sand', 'sink', + 'skyscraper', 'fireplace', 'refrigerator', 'grandstand', 'path', + 'stairs', 'runway', 'case', 'pool table', 'pillow', 'screen door', + 'stairway', 'river', 'bridge', 'bookcase', 'blind', 'coffee table', + 'toilet', 'flower', 'book', 'hill', 'bench', 'countertop', 'stove', + 'palm', 'kitchen island', 'computer', 'swivel chair', 'boat', 'bar', + 'arcade machine', 'hovel', 'bus', 'towel', 'light', 'truck', 'tower', + 'chandelier', 'awning', 'streetlight', 'booth', 'television receiver', + 'airplane', 'dirt track', 'apparel', 'pole', 'land', 'bannister', + 'escalator', 'ottoman', 'bottle', 'buffet', 'poster', 'stage', 'van', + 'ship', 'fountain', 'conveyer belt', 'canopy', 'washer', 'plaything', + 'swimming pool', 'stool', 'barrel', 'basket', 'waterfall', 'tent', + 'bag', 'minibike', 'cradle', 'oven', 'ball', 'food', 'step', 'tank', + 'trade name', 'microwave', 'pot', 'animal', 'bicycle', 'lake', + 'dishwasher', 'screen', 'blanket', 'sculpture', 'hood', 'sconce', + 'vase', 'traffic light', 'tray', 'ashcan', 'fan', 'pier', 'crt screen', + 'plate', 'monitor', 'bulletin board', 'shower', 'radiator', 'glass', + 'clock', 'flag' + ] + + +def voc_classes(): + """Pascal VOC class names for external use.""" + return [ + 'background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', + 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor' + ] + + +def pcontext_classes(): + """Pascal Context class names for external use.""" + return [ + 'aeroplane', 'bag', 'bed', 'bedclothes', 'bench', 'bicycle', 'bird', + 'boat', 'book', 'bottle', 'building', 'bus', 'cabinet', 'car', 'cat', + 'ceiling', 'chair', 'cloth', 'computer', 'cow', 'cup', 'curtain', + 'dog', 'door', 'fence', 'floor', 'flower', 'food', 'grass', 'ground', + 'horse', 'keyboard', 'light', 'motorbike', 'mountain', 'mouse', + 'person', 'plate', 'platform', 'pottedplant', 'road', 'rock', 'sheep', + 'shelves', 'sidewalk', 'sign', 'sky', 'snow', 'sofa', 'table', 'track', + 'train', 'tree', 'truck', 'tvmonitor', 'wall', 'water', 'window', + 'wood' + ] + + +def cocostuff_classes(): + """CocoStuff class names for external use.""" + return [ + 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', + 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', + 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', + 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', + 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', + 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', + 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', + 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', + 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', + 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', + 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', + 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', + 'scissors', 'teddy bear', 'hair drier', 'toothbrush', 'banner', + 'blanket', 'branch', 'bridge', 'building-other', 'bush', 'cabinet', + 'cage', 'cardboard', 'carpet', 'ceiling-other', 'ceiling-tile', + 'cloth', 'clothes', 'clouds', 'counter', 'cupboard', 'curtain', + 'desk-stuff', 'dirt', 'door-stuff', 'fence', 'floor-marble', + 'floor-other', 'floor-stone', 'floor-tile', 'floor-wood', 'flower', + 'fog', 'food-other', 'fruit', 'furniture-other', 'grass', 'gravel', + 'ground-other', 'hill', 'house', 'leaves', 'light', 'mat', 'metal', + 'mirror-stuff', 'moss', 'mountain', 'mud', 'napkin', 'net', 'paper', + 'pavement', 'pillow', 'plant-other', 'plastic', 'platform', + 'playingfield', 'railing', 'railroad', 'river', 'road', 'rock', 'roof', + 'rug', 'salad', 'sand', 'sea', 'shelf', 'sky-other', 'skyscraper', + 'snow', 'solid-other', 'stairs', 'stone', 'straw', 'structural-other', + 'table', 'tent', 'textile-other', 'towel', 'tree', 'vegetable', + 'wall-brick', 'wall-concrete', 'wall-other', 'wall-panel', + 'wall-stone', 'wall-tile', 'wall-wood', 'water-other', 'waterdrops', + 'window-blind', 'window-other', 'wood' + ] + + +def loveda_classes(): + """LoveDA class names for external use.""" + return [ + 'background', 'building', 'road', 'water', 'barren', 'forest', + 'agricultural' + ] + + +def potsdam_classes(): + """Potsdam class names for external use.""" + return [ + 'impervious_surface', 'building', 'low_vegetation', 'tree', 'car', + 'clutter' + ] + + +def vaihingen_classes(): + """Vaihingen class names for external use.""" + return [ + 'impervious_surface', 'building', 'low_vegetation', 'tree', 'car', + 'clutter' + ] + + +def isaid_classes(): + """iSAID class names for external use.""" + return [ + 'background', 'ship', 'store_tank', 'baseball_diamond', 'tennis_court', + 'basketball_court', 'Ground_Track_Field', 'Bridge', 'Large_Vehicle', + 'Small_Vehicle', 'Helicopter', 'Swimming_pool', 'Roundabout', + 'Soccer_ball_field', 'plane', 'Harbor' + ] + + +def stare_classes(): + """stare class names for external use.""" + return ['background', 'vessel'] + + +def mapillary_v1_classes(): + """mapillary_v1 class names for external use.""" + return [ + 'Bird', 'Ground Animal', 'Curb', 'Fence', 'Guard Rail', 'Barrier', + 'Wall', 'Bike Lane', 'Crosswalk - Plain', 'Curb Cut', 'Parking', + 'Pedestrian Area', 'Rail Track', 'Road', 'Service Lane', 'Sidewalk', + 'Bridge', 'Building', 'Tunnel', 'Person', 'Bicyclist', 'Motorcyclist', + 'Other Rider', 'Lane Marking - Crosswalk', 'Lane Marking - General', + 'Mountain', 'Sand', 'Sky', 'Snow', 'Terrain', 'Vegetation', 'Water', + 'Banner', 'Bench', 'Bike Rack', 'Billboard', 'Catch Basin', + 'CCTV Camera', 'Fire Hydrant', 'Junction Box', 'Mailbox', 'Manhole', + 'Phone Booth', 'Pothole', 'Street Light', 'Pole', 'Traffic Sign Frame', + 'Utility Pole', 'Traffic Light', 'Traffic Sign (Back)', + 'Traffic Sign (Front)', 'Trash Can', 'Bicycle', 'Boat', 'Bus', 'Car', + 'Caravan', 'Motorcycle', 'On Rails', 'Other Vehicle', 'Trailer', + 'Truck', 'Wheeled Slow', 'Car Mount', 'Ego Vehicle', 'Unlabeled' + ] + + +def mapillary_v1_palette(): + """mapillary_v1_ palette for external use.""" + return [[165, 42, 42], [0, 192, 0], [196, 196, 196], [190, 153, 153], + [180, 165, 180], [90, 120, 150], [102, 102, 156], [128, 64, 255], + [140, 140, 200], [170, 170, 170], [250, 170, 160], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], [244, 35, 232], + [150, 100, 100], [70, 70, 70], [150, 120, 90], [220, 20, 60], + [255, 0, 0], [255, 0, 100], [255, 0, 200], [200, 128, 128], + [255, 255, 255], [64, 170, 64], [230, 160, 50], [70, 130, 180], + [190, 255, 255], [152, 251, 152], [107, 142, 35], [0, 170, 30], + [255, 255, 128], [250, 0, 30], [100, 140, 180], [220, 220, 220], + [220, 128, 128], [222, 40, 40], [100, 170, 30], [40, 40, 40], + [33, 33, 33], [100, 128, 160], [142, 0, 0], [70, 100, 150], + [210, 170, 100], [153, 153, 153], [128, 128, 128], [0, 0, 80], + [250, 170, 30], [192, 192, 192], [220, 220, 0], [140, 140, 20], + [119, 11, 32], [150, 0, 255], [0, 60, 100], [0, 0, 142], + [0, 0, 90], [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 192], [32, 32, 32], [120, 10, 10], [0, 0, 0]] + + +def mapillary_v2_classes(): + """mapillary_v2 class names for external use.""" + return [ + 'Bird', 'Ground Animal', 'Ambiguous Barrier', 'Concrete Block', 'Curb', + 'Fence', 'Guard Rail', 'Barrier', 'Road Median', 'Road Side', + 'Lane Separator', 'Temporary Barrier', 'Wall', 'Bike Lane', + 'Crosswalk - Plain', 'Curb Cut', 'Driveway', 'Parking', + 'Parking Aisle', 'Pedestrian Area', 'Rail Track', 'Road', + 'Road Shoulder', 'Service Lane', 'Sidewalk', 'Traffic Island', + 'Bridge', 'Building', 'Garage', 'Tunnel', 'Person', 'Person Group', + 'Bicyclist', 'Motorcyclist', 'Other Rider', + 'Lane Marking - Dashed Line', 'Lane Marking - Straight Line', + 'Lane Marking - Zigzag Line', 'Lane Marking - Ambiguous', + 'Lane Marking - Arrow (Left)', 'Lane Marking - Arrow (Other)', + 'Lane Marking - Arrow (Right)', + 'Lane Marking - Arrow (Split Left or Straight)', + 'Lane Marking - Arrow (Split Right or Straight)', + 'Lane Marking - Arrow (Straight)', 'Lane Marking - Crosswalk', + 'Lane Marking - Give Way (Row)', 'Lane Marking - Give Way (Single)', + 'Lane Marking - Hatched (Chevron)', + 'Lane Marking - Hatched (Diagonal)', 'Lane Marking - Other', + 'Lane Marking - Stop Line', 'Lane Marking - Symbol (Bicycle)', + 'Lane Marking - Symbol (Other)', 'Lane Marking - Text', + 'Lane Marking (only) - Dashed Line', 'Lane Marking (only) - Crosswalk', + 'Lane Marking (only) - Other', 'Lane Marking (only) - Test', + 'Mountain', 'Sand', 'Sky', 'Snow', 'Terrain', 'Vegetation', 'Water', + 'Banner', 'Bench', 'Bike Rack', 'Catch Basin', 'CCTV Camera', + 'Fire Hydrant', 'Junction Box', 'Mailbox', 'Manhole', 'Parking Meter', + 'Phone Booth', 'Pothole', 'Signage - Advertisement', + 'Signage - Ambiguous', 'Signage - Back', 'Signage - Information', + 'Signage - Other', 'Signage - Store', 'Street Light', 'Pole', + 'Pole Group', 'Traffic Sign Frame', 'Utility Pole', 'Traffic Cone', + 'Traffic Light - General (Single)', 'Traffic Light - Pedestrians', + 'Traffic Light - General (Upright)', + 'Traffic Light - General (Horizontal)', 'Traffic Light - Cyclists', + 'Traffic Light - Other', 'Traffic Sign - Ambiguous', + 'Traffic Sign (Back)', 'Traffic Sign - Direction (Back)', + 'Traffic Sign - Direction (Front)', 'Traffic Sign (Front)', + 'Traffic Sign - Parking', 'Traffic Sign - Temporary (Back)', + 'Traffic Sign - Temporary (Front)', 'Trash Can', 'Bicycle', 'Boat', + 'Bus', 'Car', 'Caravan', 'Motorcycle', 'On Rails', 'Other Vehicle', + 'Trailer', 'Truck', 'Vehicle Group', 'Wheeled Slow', 'Water Valve', + 'Car Mount', 'Dynamic', 'Ego Vehicle', 'Ground', 'Static', 'Unlabeled' + ] + + +def mapillary_v2_palette(): + """mapillary_v2_ palette for external use.""" + return [[165, 42, 42], [0, 192, 0], [250, 170, 31], [250, 170, 32], + [196, 196, 196], [190, 153, 153], [180, 165, 180], [90, 120, 150], + [250, 170, 33], [250, 170, 34], [128, 128, 128], [250, 170, 35], + [102, 102, 156], [128, 64, 255], [140, 140, 200], [170, 170, 170], + [250, 170, 36], [250, 170, 160], [250, 170, 37], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], [110, 110, 110], + [244, 35, 232], [128, 196, 128], [150, 100, 100], [70, 70, 70], + [150, 150, 150], [150, 120, 90], [220, 20, 60], [220, 20, 60], + [255, 0, 0], [255, 0, 100], [255, 0, 200], [255, 255, 255], + [255, 255, 255], [250, 170, 29], [250, 170, 28], [250, 170, 26], + [250, 170, 25], [250, 170, 24], [250, 170, 22], [250, 170, 21], + [250, 170, 20], [255, 255, 255], [250, 170, 19], [250, 170, 18], + [250, 170, 12], [250, 170, 11], [255, 255, 255], [255, 255, 255], + [250, 170, 16], [250, 170, 15], [250, 170, 15], [255, 255, 255], + [255, 255, 255], [255, 255, 255], [255, 255, 255], [64, 170, 64], + [230, 160, 50], [70, 130, 180], [190, 255, 255], [152, 251, 152], + [107, 142, 35], [0, 170, 30], [255, 255, 128], [250, 0, 30], + [100, 140, 180], [220, 128, 128], [222, 40, 40], [100, 170, 30], + [40, 40, 40], [33, 33, 33], [100, 128, 160], [20, 20, 255], + [142, 0, 0], [70, 100, 150], [250, 171, 30], [250, 172, 30], + [250, 173, 30], [250, 174, 30], [250, 175, 30], [250, 176, 30], + [210, 170, 100], [153, 153, 153], [153, 153, 153], [128, 128, 128], + [0, 0, 80], [210, 60, 60], [250, 170, 30], [250, 170, 30], + [250, 170, 30], [250, 170, 30], [250, 170, 30], [250, 170, 30], + [192, 192, 192], [192, 192, 192], [192, 192, 192], [220, 220, 0], + [220, 220, 0], [0, 0, 196], [192, 192, 192], [220, 220, 0], + [140, 140, 20], [119, 11, 32], [150, 0, 255], [0, 60, 100], + [0, 0, 142], [0, 0, 90], [0, 0, 230], [0, 80, 100], [128, 64, 64], + [0, 0, 110], [0, 0, 70], [0, 0, 142], [0, 0, 192], [170, 170, 170], + [32, 32, 32], [111, 74, 0], [120, 10, 10], [81, 0, 81], + [111, 111, 0], [0, 0, 0]] + + +def cityscapes_palette(): + """Cityscapes palette for external use.""" + return [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100], + [0, 0, 230], [119, 11, 32]] + + +def ade_palette(): + """ADE20K palette for external use.""" + return [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]] + + +def voc_palette(): + """Pascal VOC palette for external use.""" + return [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], + [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], + [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], + [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], + [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] + + +def pcontext_palette(): + """Pascal Context palette for external use.""" + return [[180, 120, 120], [6, 230, 230], [80, 50, 50], [4, 200, 3], + [120, 120, 80], [140, 140, 140], [204, 5, 255], [230, 230, 230], + [4, 250, 7], [224, 5, 255], [235, 255, 7], [150, 5, 61], + [120, 120, 70], [8, 255, 51], [255, 6, 82], [143, 255, 140], + [204, 255, 4], [255, 51, 7], [204, 70, 3], [0, 102, 200], + [61, 230, 250], [255, 6, 51], [11, 102, 255], [255, 7, 71], + [255, 9, 224], [9, 7, 230], [220, 220, 220], [255, 9, 92], + [112, 9, 255], [8, 255, 214], [7, 255, 224], [255, 184, 6], + [10, 255, 71], [255, 41, 10], [7, 255, 255], [224, 255, 8], + [102, 8, 255], [255, 61, 6], [255, 194, 7], [255, 122, 8], + [0, 255, 20], [255, 8, 41], [255, 5, 153], [6, 51, 255], + [235, 12, 255], [160, 150, 20], [0, 163, 255], [140, 140, 140], + [250, 10, 15], [20, 255, 0], [31, 255, 0], [255, 31, 0], + [255, 224, 0], [153, 255, 0], [0, 0, 255], [255, 71, 0], + [0, 235, 255], [0, 173, 255], [31, 0, 255]] + + +def cocostuff_palette(): + """CocoStuff palette for external use.""" + return [[0, 192, 64], [0, 192, 64], [0, 64, 96], [128, 192, 192], + [0, 64, 64], [0, 192, 224], [0, 192, 192], [128, 192, 64], + [0, 192, 96], [128, 192, 64], [128, 32, 192], [0, 0, 224], + [0, 0, 64], [0, 160, 192], [128, 0, 96], [128, 0, 192], + [0, 32, 192], [128, 128, 224], [0, 0, 192], [128, 160, 192], + [128, 128, 0], [128, 0, 32], [128, 32, 0], [128, 0, 128], + [64, 128, 32], [0, 160, 0], [0, 0, 0], [192, 128, 160], [0, 32, 0], + [0, 128, 128], [64, 128, 160], [128, 160, 0], [0, 128, 0], + [192, 128, 32], [128, 96, 128], [0, 0, 128], [64, 0, 32], + [0, 224, 128], [128, 0, 0], [192, 0, 160], [0, 96, 128], + [128, 128, 128], [64, 0, 160], [128, 224, 128], [128, 128, 64], + [192, 0, 32], [128, 96, 0], [128, 0, 192], [0, 128, 32], + [64, 224, 0], [0, 0, 64], [128, 128, 160], [64, 96, 0], + [0, 128, 192], [0, 128, 160], [192, 224, 0], [0, 128, 64], + [128, 128, 32], [192, 32, 128], [0, 64, 192], [0, 0, 32], + [64, 160, 128], [128, 64, 64], [128, 0, 160], [64, 32, 128], + [128, 192, 192], [0, 0, 160], [192, 160, 128], [128, 192, 0], + [128, 0, 96], [192, 32, 0], [128, 64, 128], [64, 128, 96], + [64, 160, 0], [0, 64, 0], [192, 128, 224], [64, 32, 0], + [0, 192, 128], [64, 128, 224], [192, 160, 0], [0, 192, 0], + [192, 128, 96], [192, 96, 128], [0, 64, 128], [64, 0, 96], + [64, 224, 128], [128, 64, 0], [192, 0, 224], [64, 96, 128], + [128, 192, 128], [64, 0, 224], [192, 224, 128], [128, 192, 64], + [192, 0, 96], [192, 96, 0], [128, 64, 192], [0, 128, 96], + [0, 224, 0], [64, 64, 64], [128, 128, 224], [0, 96, 0], + [64, 192, 192], [0, 128, 224], [128, 224, 0], [64, 192, 64], + [128, 128, 96], [128, 32, 128], [64, 0, 192], [0, 64, 96], + [0, 160, 128], [192, 0, 64], [128, 64, 224], [0, 32, 128], + [192, 128, 192], [0, 64, 224], [128, 160, 128], [192, 128, 0], + [128, 64, 32], [128, 32, 64], [192, 0, 128], [64, 192, 32], + [0, 160, 64], [64, 0, 0], [192, 192, 160], [0, 32, 64], + [64, 128, 128], [64, 192, 160], [128, 160, 64], [64, 128, 0], + [192, 192, 32], [128, 96, 192], [64, 0, 128], [64, 64, 32], + [0, 224, 192], [192, 0, 0], [192, 64, 160], [0, 96, 192], + [192, 128, 128], [64, 64, 160], [128, 224, 192], [192, 128, 64], + [192, 64, 32], [128, 96, 64], [192, 0, 192], [0, 192, 32], + [64, 224, 64], [64, 0, 64], [128, 192, 160], [64, 96, 64], + [64, 128, 192], [0, 192, 160], [192, 224, 64], [64, 128, 64], + [128, 192, 32], [192, 32, 192], [64, 64, 192], [0, 64, 32], + [64, 160, 192], [192, 64, 64], [128, 64, 160], [64, 32, 192], + [192, 192, 192], [0, 64, 160], [192, 160, 192], [192, 192, 0], + [128, 64, 96], [192, 32, 64], [192, 64, 128], [64, 192, 96], + [64, 160, 64], [64, 64, 0]] + + +def loveda_palette(): + """LoveDA palette for external use.""" + return [[255, 255, 255], [255, 0, 0], [255, 255, 0], [0, 0, 255], + [159, 129, 183], [0, 255, 0], [255, 195, 128]] + + +def potsdam_palette(): + """Potsdam palette for external use.""" + return [[255, 255, 255], [0, 0, 255], [0, 255, 255], [0, 255, 0], + [255, 255, 0], [255, 0, 0]] + + +def vaihingen_palette(): + """Vaihingen palette for external use.""" + return [[255, 255, 255], [0, 0, 255], [0, 255, 255], [0, 255, 0], + [255, 255, 0], [255, 0, 0]] + + +def isaid_palette(): + """iSAID palette for external use.""" + return [[0, 0, 0], [0, 0, 63], [0, 63, 63], [0, 63, 0], [0, 63, 127], + [0, 63, 191], [0, 63, 255], [0, 127, 63], [0, 127, + 127], [0, 0, 127], + [0, 0, 191], [0, 0, 255], [0, 191, 127], [0, 127, 191], + [0, 127, 255], [0, 100, 155]] + + +def stare_palette(): + """STARE palette for external use.""" + return [[120, 120, 120], [6, 230, 230]] + + +def synapse_palette(): + """Synapse palette for external use.""" + return [[0, 0, 0], [0, 0, 255], [0, 255, 0], [255, 0, 0], [0, 255, 255], + [255, 0, 255], [255, 255, 0], [60, 255, 255], [240, 240, 240]] + + +def synapse_classes(): + """Synapse class names for external use.""" + return [ + 'background', 'aorta', 'gallbladder', 'left_kidney', 'right_kidney', + 'liver', 'pancreas', 'spleen', 'stomach' + ] + + +def lip_classes(): + """LIP class names for external use.""" + return [ + 'background', 'hat', 'hair', 'glove', 'sunglasses', 'upperclothes', + 'dress', 'coat', 'socks', 'pants', 'jumpsuits', 'scarf', 'skirt', + 'face', 'leftArm', 'rightArm', 'leftLeg', 'rightLeg', 'leftShoe', + 'rightShoe' + ] + + +def lip_palette(): + """LIP palette for external use.""" + return [ + 'Background', 'Hat', 'Hair', 'Glove', 'Sunglasses', 'UpperClothes', + 'Dress', 'Coat', 'Socks', 'Pants', 'Jumpsuits', 'Scarf', 'Skirt', + 'Face', 'Left-arm', 'Right-arm', 'Left-leg', 'Right-leg', 'Left-shoe', + 'Right-shoe' + ] + + +def bdd100k_classes(): + """BDD100K class names for external use(the class name is compatible with + Cityscapes ).""" + return [ + 'road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky', + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle' + ] + + +def bdd100k_palette(): + """bdd100k palette for external use(same with cityscapes)""" + return [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100], + [0, 0, 230], [119, 11, 32]] + + +def hsidrive_classes(): + """HSI Drive 2.0 class names for external use.""" + return [ + 'unlabelled', 'road', 'road marks', 'vegetation', 'painted metal', + 'sky', 'concrete', 'pedestrian', 'water', 'unpainted metal', 'glass' + ] + + +def hsidrive_palette(): + """HSI Drive 2.0 palette for external use.""" + return [[0, 0, 0], [77, 77, 77], [255, 255, 255], [0, 255, 0], [255, 0, 0], + [0, 0, 255], [102, 51, 0], [255, 255, 0], [0, 207, 250], + [255, 166, 0], [0, 204, 204]] + + +dataset_aliases = { + 'cityscapes': ['cityscapes'], + 'ade': ['ade', 'ade20k'], + 'voc': ['voc', 'pascal_voc', 'voc12', 'voc12aug'], + 'pcontext': ['pcontext', 'pascal_context', 'voc2010'], + 'loveda': ['loveda'], + 'potsdam': ['potsdam'], + 'vaihingen': ['vaihingen'], + 'cocostuff': [ + 'cocostuff', 'cocostuff10k', 'cocostuff164k', 'coco-stuff', + 'coco-stuff10k', 'coco-stuff164k', 'coco_stuff', 'coco_stuff10k', + 'coco_stuff164k' + ], + 'isaid': ['isaid', 'iSAID'], + 'stare': ['stare', 'STARE'], + 'lip': ['LIP', 'lip'], + 'mapillary_v1': ['mapillary_v1'], + 'mapillary_v2': ['mapillary_v2'], + 'bdd100k': ['bdd100k'], + 'hsidrive': [ + 'hsidrive', 'HSIDrive', 'HSI-Drive', 'hsidrive20', 'HSIDrive20', + 'HSI-Drive20' + ], + 'xray': ['xray', 'XRay'], +} + + +def get_classes(dataset): + """Get class names of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_classes()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels + + +def get_palette(dataset): + """Get class palette (RGB) of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_palette()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels diff --git a/mmsegmentation/mmseg/utils/collect_env.py b/mmsegmentation/mmseg/utils/collect_env.py new file mode 100644 index 0000000..d5d6ea2 --- /dev/null +++ b/mmsegmentation/mmseg/utils/collect_env.py @@ -0,0 +1,18 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmengine.utils import get_git_hash +from mmengine.utils.dl_utils import collect_env as collect_base_env + +import mmseg + + +def collect_env(): + """Collect the information of the running environments.""" + env_info = collect_base_env() + env_info['MMSegmentation'] = f'{mmseg.__version__}+{get_git_hash()[:7]}' + + return env_info + + +if __name__ == '__main__': + for name, val in collect_env().items(): + print(f'{name}: {val}') diff --git a/mmsegmentation/mmseg/utils/get_templates.py b/mmsegmentation/mmseg/utils/get_templates.py new file mode 100644 index 0000000..7e9032b --- /dev/null +++ b/mmsegmentation/mmseg/utils/get_templates.py @@ -0,0 +1,109 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List + +PREDEFINED_TEMPLATES = { + 'imagenet': [ + 'a bad photo of a {}.', + 'a photo of many {}.', + 'a sculpture of a {}.', + 'a photo of the hard to see {}.', + 'a low resolution photo of the {}.', + 'a rendering of a {}.', + 'graffiti of a {}.', + 'a bad photo of the {}.', + 'a cropped photo of the {}.', + 'a tattoo of a {}.', + 'the embroidered {}.', + 'a photo of a hard to see {}.', + 'a bright photo of a {}.', + 'a photo of a clean {}.', + 'a photo of a dirty {}.', + 'a dark photo of the {}.', + 'a drawing of a {}.', + 'a photo of my {}.', + 'the plastic {}.', + 'a photo of the cool {}.', + 'a close-up photo of a {}.', + 'a black and white photo of the {}.', + 'a painting of the {}.', + 'a painting of a {}.', + 'a pixelated photo of the {}.', + 'a sculpture of the {}.', + 'a bright photo of the {}.', + 'a cropped photo of a {}.', + 'a plastic {}.', + 'a photo of the dirty {}.', + 'a jpeg corrupted photo of a {}.', + 'a blurry photo of the {}.', + 'a photo of the {}.', + 'a good photo of the {}.', + 'a rendering of the {}.', + 'a {} in a video game.', + 'a photo of one {}.', + 'a doodle of a {}.', + 'a close-up photo of the {}.', + 'a photo of a {}.', + 'the origami {}.', + 'the {} in a video game.', + 'a sketch of a {}.', + 'a doodle of the {}.', + 'a origami {}.', + 'a low resolution photo of a {}.', + 'the toy {}.', + 'a rendition of the {}.', + 'a photo of the clean {}.', + 'a photo of a large {}.', + 'a rendition of a {}.', + 'a photo of a nice {}.', + 'a photo of a weird {}.', + 'a blurry photo of a {}.', + 'a cartoon {}.', + 'art of a {}.', + 'a sketch of the {}.', + 'a embroidered {}.', + 'a pixelated photo of a {}.', + 'itap of the {}.', + 'a jpeg corrupted photo of the {}.', + 'a good photo of a {}.', + 'a plushie {}.', + 'a photo of the nice {}.', + 'a photo of the small {}.', + 'a photo of the weird {}.', + 'the cartoon {}.', + 'art of the {}.', + 'a drawing of the {}.', + 'a photo of the large {}.', + 'a black and white photo of a {}.', + 'the plushie {}.', + 'a dark photo of a {}.', + 'itap of a {}.', + 'graffiti of the {}.', + 'a toy {}.', + 'itap of my {}.', + 'a photo of a cool {}.', + 'a photo of a small {}.', + 'a tattoo of the {}.', + ], + 'vild': [ + 'a photo of a {}.', + 'This is a photo of a {}', + 'There is a {} in the scene', + 'There is the {} in the scene', + 'a photo of a {} in the scene', + 'a photo of a small {}.', + 'a photo of a medium {}.', + 'a photo of a large {}.', + 'This is a photo of a small {}.', + 'This is a photo of a medium {}.', + 'This is a photo of a large {}.', + 'There is a small {} in the scene.', + 'There is a medium {} in the scene.', + 'There is a large {} in the scene.', + ], +} + + +def get_predefined_templates(template_set_name: str) -> List[str]: + if template_set_name not in PREDEFINED_TEMPLATES: + raise ValueError(f'Template set {template_set_name} not found') + return PREDEFINED_TEMPLATES[template_set_name] diff --git a/mmsegmentation/mmseg/utils/io.py b/mmsegmentation/mmseg/utils/io.py new file mode 100644 index 0000000..7029c3c --- /dev/null +++ b/mmsegmentation/mmseg/utils/io.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import gzip +import io +import pickle + +import cv2 +import numpy as np + + +def datafrombytes(content: bytes, backend: str = 'numpy') -> np.ndarray: + """Data decoding from bytes. + + Args: + content (bytes): The data bytes got from files or other streams. + backend (str): The data decoding backend type. Options are 'numpy', + 'nifti', 'cv2' and 'pickle'. Defaults to 'numpy'. + + Returns: + numpy.ndarray: Loaded data array. + """ + if backend == 'pickle': + data = pickle.loads(content) + else: + with io.BytesIO(content) as f: + if backend == 'nifti': + f = gzip.open(f) + try: + from nibabel import FileHolder, Nifti1Image + except ImportError: + print('nifti files io depends on nibabel, please run' + '`pip install nibabel` to install it') + fh = FileHolder(fileobj=f) + data = Nifti1Image.from_file_map({'header': fh, 'image': fh}) + data = Nifti1Image.from_bytes(data.to_bytes()).get_fdata() + elif backend == 'numpy': + data = np.load(f) + elif backend == 'cv2': + data = np.frombuffer(f.read(), dtype=np.uint8) + data = cv2.imdecode(data, cv2.IMREAD_UNCHANGED) + else: + raise ValueError + return data diff --git a/mmsegmentation/mmseg/utils/mask_classification.py b/mmsegmentation/mmseg/utils/mask_classification.py new file mode 100644 index 0000000..205d525 --- /dev/null +++ b/mmsegmentation/mmseg/utils/mask_classification.py @@ -0,0 +1,205 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +from mmcv.ops import point_sample +from mmengine.structures import InstanceData +from torch import Tensor + +from mmseg.registry import TASK_UTILS +from mmseg.utils import ConfigType, SampleList + + +def seg_data_to_instance_data(ignore_index: int, + batch_data_samples: SampleList): + """Convert the paradigm of ground truth from semantic segmentation to + instance segmentation. + + Args: + ignore_index (int): The label index to be ignored. + batch_data_samples (List[SegDataSample]): The Data + Samples. It usually includes information such as + `gt_sem_seg`. + + Returns: + tuple[Tensor]: A tuple contains two lists. + - batch_gt_instances (List[InstanceData]): Batch of + gt_instance. It usually includes ``labels``, each is + unique ground truth label id of images, with + shape (num_gt, ) and ``masks``, each is ground truth + masks of each instances of a image, shape (num_gt, h, w). + - batch_img_metas (List[Dict]): List of image meta information. + """ + batch_gt_instances = [] + + for data_sample in batch_data_samples: + gt_sem_seg = data_sample.gt_sem_seg.data + classes = torch.unique( + gt_sem_seg, + sorted=False, + return_inverse=False, + return_counts=False) + + # remove ignored region + gt_labels = classes[classes != ignore_index] + + masks = [] + for class_id in gt_labels: + masks.append(gt_sem_seg == class_id) + + if len(masks) == 0: + gt_masks = torch.zeros( + (0, gt_sem_seg.shape[-2], + gt_sem_seg.shape[-1])).to(gt_sem_seg).long() + else: + gt_masks = torch.stack(masks).squeeze(1).long() + + instance_data = InstanceData(labels=gt_labels, masks=gt_masks) + batch_gt_instances.append(instance_data) + return batch_gt_instances + + +class MatchMasks: + """Match the predictions to category labels. + + Args: + num_points (int): the number of sampled points to compute cost. + num_queries (int): the number of prediction masks. + num_classes (int): the number of classes. + assigner (BaseAssigner): the assigner to compute matching. + """ + + def __init__(self, + num_points: int, + num_queries: int, + num_classes: int, + assigner: ConfigType = None): + assert assigner is not None, "\'assigner\' in decode_head.train_cfg" \ + 'cannot be None' + assert num_points > 0, 'num_points should be a positive integer.' + self.num_points = num_points + self.num_queries = num_queries + self.num_classes = num_classes + self.assigner = TASK_UTILS.build(assigner) + + def get_targets(self, cls_scores: List[Tensor], mask_preds: List[Tensor], + batch_gt_instances: List[InstanceData]) -> Tuple: + """Compute best mask matches for all images for a decoder layer. + + Args: + cls_scores (List[Tensor]): Mask score logits from a single + decoder layer for all images. Each with shape (num_queries, + cls_out_channels). + mask_preds (List[Tensor]): Mask logits from a single decoder + layer for all images. Each with shape (num_queries, h, w). + batch_gt_instances (List[InstanceData]): each contains + ``labels`` and ``masks``. + + Returns: + tuple: a tuple containing the following targets. + + - labels (List[Tensor]): Labels of all images.\ + Each with shape (num_queries, ). + - mask_targets (List[Tensor]): Mask targets of\ + all images. Each with shape (num_queries, h, w). + - mask_weights (List[Tensor]): Mask weights of\ + all images. Each with shape (num_queries, ). + - avg_factor (int): Average factor that is used to + average the loss. `avg_factor` is usually equal + to the number of positive priors. + """ + batch_size = cls_scores.shape[0] + results = dict({ + 'labels': [], + 'mask_targets': [], + 'mask_weights': [], + }) + for i in range(batch_size): + labels, mask_targets, mask_weights\ + = self._get_targets_single(cls_scores[i], + mask_preds[i], + batch_gt_instances[i]) + results['labels'].append(labels) + results['mask_targets'].append(mask_targets) + results['mask_weights'].append(mask_weights) + + # shape (batch_size, num_queries) + labels = torch.stack(results['labels'], dim=0) + # shape (batch_size, num_gts, h, w) + mask_targets = torch.cat(results['mask_targets'], dim=0) + # shape (batch_size, num_queries) + mask_weights = torch.stack(results['mask_weights'], dim=0) + + avg_factor = sum( + [len(gt_instances.labels) for gt_instances in batch_gt_instances]) + + res = (labels, mask_targets, mask_weights, avg_factor) + + return res + + def _get_targets_single(self, cls_score: Tensor, mask_pred: Tensor, + gt_instances: InstanceData) \ + -> Tuple[Tensor, Tensor, Tensor]: + """Compute a set of best mask matches for one image. + + Args: + cls_score (Tensor): Mask score logits from a single decoder layer + for one image. Shape (num_queries, cls_out_channels). + mask_pred (Tensor): Mask logits for a single decoder layer for one + image. Shape (num_queries, h, w). + gt_instances (:obj:`InstanceData`): It contains ``labels`` and + ``masks``. + + Returns: + tuple[Tensor]: A tuple containing the following for one image. + + - labels (Tensor): Labels of each image. \ + shape (num_queries, ). + - mask_targets (Tensor): Mask targets of each image. \ + shape (num_queries, h, w). + - mask_weights (Tensor): Mask weights of each image. \ + shape (num_queries, ). + """ + gt_labels = gt_instances.labels + gt_masks = gt_instances.masks + # when "gt_labels" is empty, classify all queries to background + if len(gt_labels) == 0: + labels = gt_labels.new_full((self.num_queries, ), + self.num_classes, + dtype=torch.long) + mask_targets = gt_labels + mask_weights = gt_labels.new_zeros((self.num_queries, )) + return labels, mask_targets, mask_weights + # sample points + num_queries = cls_score.shape[0] + num_gts = gt_labels.shape[0] + + point_coords = torch.rand((1, self.num_points, 2), + device=cls_score.device) + # shape (num_queries, num_points) + mask_points_pred = point_sample( + mask_pred.unsqueeze(1), point_coords.repeat(num_queries, 1, + 1)).squeeze(1) + # shape (num_gts, num_points) + gt_points_masks = point_sample( + gt_masks.unsqueeze(1).float(), point_coords.repeat(num_gts, 1, + 1)).squeeze(1) + + sampled_gt_instances = InstanceData( + labels=gt_labels, masks=gt_points_masks) + sampled_pred_instances = InstanceData( + scores=cls_score, masks=mask_points_pred) + # assign and sample + matched_quiery_inds, matched_label_inds = self.assigner.assign( + pred_instances=sampled_pred_instances, + gt_instances=sampled_gt_instances) + labels = gt_labels.new_full((self.num_queries, ), + self.num_classes, + dtype=torch.long) + labels[matched_quiery_inds] = gt_labels[matched_label_inds] + + mask_weights = gt_labels.new_zeros((self.num_queries, )) + mask_weights[matched_quiery_inds] = 1 + mask_targets = gt_masks[matched_label_inds] + + return labels, mask_targets, mask_weights diff --git a/mmsegmentation/mmseg/utils/misc.py b/mmsegmentation/mmseg/utils/misc.py new file mode 100644 index 0000000..dfc469e --- /dev/null +++ b/mmsegmentation/mmseg/utils/misc.py @@ -0,0 +1,128 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Optional, Union + +import numpy as np +import torch +import torch.nn.functional as F + +from .typing_utils import SampleList + + +def add_prefix(inputs, prefix): + """Add prefix for dict. + + Args: + inputs (dict): The input dict with str keys. + prefix (str): The prefix to add. + + Returns: + + dict: The dict with keys updated with ``prefix``. + """ + + outputs = dict() + for name, value in inputs.items(): + outputs[f'{prefix}.{name}'] = value + + return outputs + + +def stack_batch(inputs: List[torch.Tensor], + data_samples: Optional[SampleList] = None, + size: Optional[tuple] = None, + size_divisor: Optional[int] = None, + pad_val: Union[int, float] = 0, + seg_pad_val: Union[int, float] = 255) -> torch.Tensor: + """Stack multiple inputs to form a batch and pad the images and gt_sem_segs + to the max shape use the right bottom padding mode. + + Args: + inputs (List[Tensor]): The input multiple tensors. each is a + CHW 3D-tensor. + data_samples (list[:obj:`SegDataSample`]): The list of data samples. + It usually includes information such as `gt_sem_seg`. + size (tuple, optional): Fixed padding size. + size_divisor (int, optional): The divisor of padded size. + pad_val (int, float): The padding value. Defaults to 0 + seg_pad_val (int, float): The padding value. Defaults to 255 + + Returns: + Tensor: The 4D-tensor. + List[:obj:`SegDataSample`]: After the padding of the gt_seg_map. + """ + assert isinstance(inputs, list), \ + f'Expected input type to be list, but got {type(inputs)}' + assert len({tensor.ndim for tensor in inputs}) == 1, \ + f'Expected the dimensions of all inputs must be the same, ' \ + f'but got {[tensor.ndim for tensor in inputs]}' + assert inputs[0].ndim == 3, f'Expected tensor dimension to be 3, ' \ + f'but got {inputs[0].ndim}' + assert len({tensor.shape[0] for tensor in inputs}) == 1, \ + f'Expected the channels of all inputs must be the same, ' \ + f'but got {[tensor.shape[0] for tensor in inputs]}' + + # only one of size and size_divisor should be valid + assert (size is not None) ^ (size_divisor is not None), \ + 'only one of size and size_divisor should be valid' + + padded_inputs = [] + padded_samples = [] + inputs_sizes = [(img.shape[-2], img.shape[-1]) for img in inputs] + max_size = np.stack(inputs_sizes).max(0) + if size_divisor is not None and size_divisor > 1: + # the last two dims are H,W, both subject to divisibility requirement + max_size = (max_size + + (size_divisor - 1)) // size_divisor * size_divisor + + for i in range(len(inputs)): + tensor = inputs[i] + if size is not None: + width = max(size[-1] - tensor.shape[-1], 0) + height = max(size[-2] - tensor.shape[-2], 0) + # (padding_left, padding_right, padding_top, padding_bottom) + padding_size = (0, width, 0, height) + elif size_divisor is not None: + width = max(max_size[-1] - tensor.shape[-1], 0) + height = max(max_size[-2] - tensor.shape[-2], 0) + padding_size = (0, width, 0, height) + else: + padding_size = [0, 0, 0, 0] + + # pad img + pad_img = F.pad(tensor, padding_size, value=pad_val) + padded_inputs.append(pad_img) + # pad gt_sem_seg + if data_samples is not None: + data_sample = data_samples[i] + pad_shape = None + if 'gt_sem_seg' in data_sample: + gt_sem_seg = data_sample.gt_sem_seg.data + del data_sample.gt_sem_seg.data + data_sample.gt_sem_seg.data = F.pad( + gt_sem_seg, padding_size, value=seg_pad_val) + pad_shape = data_sample.gt_sem_seg.shape + if 'gt_edge_map' in data_sample: + gt_edge_map = data_sample.gt_edge_map.data + del data_sample.gt_edge_map.data + data_sample.gt_edge_map.data = F.pad( + gt_edge_map, padding_size, value=seg_pad_val) + pad_shape = data_sample.gt_edge_map.shape + if 'gt_depth_map' in data_sample: + gt_depth_map = data_sample.gt_depth_map.data + del data_sample.gt_depth_map.data + data_sample.gt_depth_map.data = F.pad( + gt_depth_map, padding_size, value=seg_pad_val) + pad_shape = data_sample.gt_depth_map.shape + data_sample.set_metainfo({ + 'img_shape': tensor.shape[-2:], + 'pad_shape': pad_shape, + 'padding_size': padding_size + }) + padded_samples.append(data_sample) + else: + padded_samples.append( + dict( + img_padding_size=padding_size, + pad_shape=pad_img.shape[-2:])) + + return torch.stack(padded_inputs, dim=0), padded_samples diff --git a/mmsegmentation/mmseg/utils/set_env.py b/mmsegmentation/mmseg/utils/set_env.py new file mode 100644 index 0000000..c948950 --- /dev/null +++ b/mmsegmentation/mmseg/utils/set_env.py @@ -0,0 +1,40 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import datetime +import warnings + +from mmengine import DefaultScope + + +def register_all_modules(init_default_scope: bool = True) -> None: + """Register all modules in mmseg into the registries. + + Args: + init_default_scope (bool): Whether initialize the mmseg default scope. + When `init_default_scope=True`, the global default scope will be + set to `mmseg`, and all registries will build modules from mmseg's + registry node. To understand more about the registry, please refer + to https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/registry.md + Defaults to True. + """ # noqa + import mmseg.datasets # noqa: F401,F403 + import mmseg.engine # noqa: F401,F403 + import mmseg.evaluation # noqa: F401,F403 + import mmseg.models # noqa: F401,F403 + import mmseg.structures # noqa: F401,F403 + + if init_default_scope: + never_created = DefaultScope.get_current_instance() is None \ + or not DefaultScope.check_instance_created('mmseg') + if never_created: + DefaultScope.get_instance('mmseg', scope_name='mmseg') + return + current_scope = DefaultScope.get_current_instance() + if current_scope.scope_name != 'mmseg': + warnings.warn('The current default scope ' + f'"{current_scope.scope_name}" is not "mmseg", ' + '`register_all_modules` will force the current' + 'default scope to be "mmseg". If this is not ' + 'expected, please set `init_default_scope=False`.') + # avoid name conflict + new_instance_name = f'mmseg-{datetime.datetime.now()}' + DefaultScope.get_instance(new_instance_name, scope_name='mmseg') diff --git a/mmsegmentation/mmseg/utils/tokenizer.py b/mmsegmentation/mmseg/utils/tokenizer.py new file mode 100644 index 0000000..d56f5fa --- /dev/null +++ b/mmsegmentation/mmseg/utils/tokenizer.py @@ -0,0 +1,240 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""CLIP tokenizer. + +Copied from https://github.com/openai/CLIP. Originally MIT License, Copyright +(c) 2021 OpenAI. +""" +import gzip +import html +import os +from functools import lru_cache +from typing import List, Union + +import ftfy +import regex as re +import torch + +os.environ['TOKENIZERS_PARALLELISM'] = 'false' + + +@lru_cache() +def default_bpe(): + return os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'bpe_simple_vocab_16e6.txt.gz') + + +@lru_cache() +def bytes_to_unicode(): + """Returns list of utf-8 byte and a corresponding list of unicode strings. + + The reversible bpe codes work on unicode strings. This means you need a + large # of unicode characters in your vocab if you want to avoid UNKs. When + you're at something like a 10B token dataset you end up needing around 5K + for decent coverage. This is a significant percentage of your normal, say, + 32K bpe vocab. To avoid that, we want lookup tables between utf-8 bytes and + unicode strings. And avoids mapping to whitespace/control characters the + bpe code barfs on. + """ + bs = list(range(ord('!'), + ord('~') + 1)) + list(range( + ord('ยก'), + ord('ยฌ') + 1)) + list(range(ord('ยฎ'), + ord('รฟ') + 1)) + cs = bs[:] + n = 0 + for b in range(2**8): + if b not in bs: + bs.append(b) + cs.append(2**8 + n) + n += 1 + cs = [chr(n) for n in cs] + return dict(zip(bs, cs)) + + +def get_pairs(word): + """Return set of symbol pairs in a word. + + Word is represented as tuple of symbols (symbols being variable-length + strings). + """ + pairs = set() + prev_char = word[0] + for char in word[1:]: + pairs.add((prev_char, char)) + prev_char = char + return pairs + + +def basic_clean(text): + text = ftfy.fix_text(text) + text = html.unescape(html.unescape(text)) + return text.strip() + + +def whitespace_clean(text): + text = re.sub(r'\s+', ' ', text) + text = text.strip() + return text + + +class SimpleTokenizer: + + def __init__(self, bpe_path: str = default_bpe(), special_tokens=None): + self.byte_encoder = bytes_to_unicode() + self.byte_decoder = {v: k for k, v in self.byte_encoder.items()} + merges = gzip.open(bpe_path).read().decode('utf-8').split('\n') + merges = merges[1:49152 - 256 - 2 + 1] + merges = [tuple(merge.split()) for merge in merges] + vocab = list(bytes_to_unicode().values()) + vocab = vocab + [v + '' for v in vocab] + for merge in merges: + vocab.append(''.join(merge)) + if not special_tokens: + special_tokens = ['', ''] + else: + special_tokens = ['', '' + ] + special_tokens + vocab.extend(special_tokens) + self.encoder = dict(zip(vocab, range(len(vocab)))) + self.decoder = {v: k for k, v in self.encoder.items()} + self.bpe_ranks = dict(zip(merges, range(len(merges)))) + self.cache = {t: t for t in special_tokens} + special = '|'.join(special_tokens) + self.pat = re.compile( + special + + r"""|'s|'t|'re|'ve|'m|'ll|'d|[\p{L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", + re.IGNORECASE) + + self.vocab_size = len(self.encoder) + self.all_special_ids = [self.encoder[t] for t in special_tokens] + + def bpe(self, token): + if token in self.cache: + return self.cache[token] + word = tuple(token[:-1]) + (token[-1] + '', ) + pairs = get_pairs(word) + + if not pairs: + return token + '' + + while True: + bigram = min( + pairs, key=lambda pair: self.bpe_ranks.get(pair, float('inf'))) + if bigram not in self.bpe_ranks: + break + first, second = bigram + new_word = [] + i = 0 + while i < len(word): + try: + j = word.index(first, i) + new_word.extend(word[i:j]) + i = j + except: # noqa: E722, E261 + new_word.extend(word[i:]) + break + + if word[i] == first and i < len(word) - 1 and word[ + i + 1] == second: + new_word.append(first + second) + i += 2 + else: + new_word.append(word[i]) + i += 1 + new_word = tuple(new_word) + word = new_word + if len(word) == 1: + break + else: + pairs = get_pairs(word) + word = ' '.join(word) + self.cache[token] = word + return word + + def encode(self, text): + bpe_tokens = [] + text = whitespace_clean(basic_clean(text)).lower() + for token in re.findall(self.pat, text): + token = ''.join(self.byte_encoder[b] + for b in token.encode('utf-8')) + bpe_tokens.extend(self.encoder[bpe_token] + for bpe_token in self.bpe(token).split(' ')) + return bpe_tokens + + def decode(self, tokens): + text = ''.join([self.decoder[token] for token in tokens]) + text = bytearray([self.byte_decoder[c] for c in text]).decode( + 'utf-8', errors='replace').replace('', ' ') + return text + + +_tokenizer = SimpleTokenizer() + + +def decode(output_ids: torch.Tensor): + output_ids = output_ids.cpu().numpy() + return _tokenizer.decode(output_ids) + + +def tokenize(texts: Union[str, List[str]], + context_length: int = 77) -> torch.LongTensor: + """Returns the tokenized representation of given input string(s) + + Parameters + ---------- + texts : Union[str, List[str]] + An input string or a list of input strings to tokenize + context_length : int + The context length to use; all CLIP models use 77 as the context length + + Returns + ------- + A two-dimensional tensor containing the resulting tokens, + shape = [number of input strings, context_length] + """ + if isinstance(texts, str): + texts = [texts] + + sot_token = _tokenizer.encoder[''] + eot_token = _tokenizer.encoder[''] + all_tokens = [[sot_token] + _tokenizer.encode(text) + [eot_token] + for text in texts] + result = torch.zeros(len(all_tokens), context_length, dtype=torch.long) + + for i, tokens in enumerate(all_tokens): + if len(tokens) > context_length: + tokens = tokens[:context_length] # Truncate + tokens[-1] = eot_token + result[i, :len(tokens)] = torch.tensor(tokens) + + return result + + +class HFTokenizer: + """HuggingFace tokenizer wrapper.""" + + def __init__(self, tokenizer_name: str): + from transformers import AutoTokenizer + self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_name) + + def save_pretrained(self, dest): + self.tokenizer.save_pretrained(dest) + + def __call__(self, + texts: Union[str, List[str]], + context_length: int = 77) -> torch.Tensor: + # same cleaning as for default tokenizer, except lowercasing + # adding lower (for case-sensitive tokenizers) will make it + # more robust but less sensitive to nuance + if isinstance(texts, str): + texts = [texts] + texts = [whitespace_clean(basic_clean(text)) for text in texts] + input_ids = self.tokenizer( + texts, + return_tensors='pt', + max_length=context_length, + padding='max_length', + truncation=True, + ).input_ids + return input_ids diff --git a/mmsegmentation/mmseg/utils/typing_utils.py b/mmsegmentation/mmseg/utils/typing_utils.py new file mode 100644 index 0000000..fba7d3b --- /dev/null +++ b/mmsegmentation/mmseg/utils/typing_utils.py @@ -0,0 +1,25 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Collecting some commonly used type hint in mmflow.""" +from typing import Dict, List, Optional, Sequence, Tuple, Union + +import torch +from mmengine.config import ConfigDict + +from mmseg.structures import SegDataSample + +# Type hint of config data +ConfigType = Union[ConfigDict, dict] +OptConfigType = Optional[ConfigType] +# Type hint of one or more config data +MultiConfig = Union[ConfigType, Sequence[ConfigType]] +OptMultiConfig = Optional[MultiConfig] + +SampleList = Sequence[SegDataSample] +OptSampleList = Optional[SampleList] + +# Type hint of Tensor +TensorDict = Dict[str, torch.Tensor] +TensorList = Sequence[torch.Tensor] + +ForwardResults = Union[Dict[str, torch.Tensor], List[SegDataSample], + Tuple[torch.Tensor], torch.Tensor] diff --git a/mmsegmentation/mmseg/version.py b/mmsegmentation/mmseg/version.py new file mode 100644 index 0000000..b76bb45 --- /dev/null +++ b/mmsegmentation/mmseg/version.py @@ -0,0 +1,18 @@ +# Copyright (c) Open-MMLab. All rights reserved. + +__version__ = '1.2.2' + + +def parse_version_info(version_str): + version_info = [] + for x in version_str.split('.'): + if x.isdigit(): + version_info.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + version_info.append(int(patch_version[0])) + version_info.append(f'rc{patch_version[1]}') + return tuple(version_info) + + +version_info = parse_version_info(__version__) diff --git a/mmsegmentation/mmseg/visualization/__init__.py b/mmsegmentation/mmseg/visualization/__init__.py new file mode 100644 index 0000000..8cbb211 --- /dev/null +++ b/mmsegmentation/mmseg/visualization/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .local_visualizer import SegLocalVisualizer + +__all__ = ['SegLocalVisualizer'] diff --git a/mmsegmentation/mmseg/visualization/local_visualizer.py b/mmsegmentation/mmseg/visualization/local_visualizer.py new file mode 100644 index 0000000..ee3d652 --- /dev/null +++ b/mmsegmentation/mmseg/visualization/local_visualizer.py @@ -0,0 +1,349 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict, List, Optional + +import cv2 +import mmcv +import numpy as np +import torch +from mmengine.dist import master_only +from mmengine.structures import PixelData +from mmengine.visualization import Visualizer + +from mmseg.registry import VISUALIZERS +from mmseg.structures import SegDataSample +from mmseg.utils import get_classes, get_palette + + +@VISUALIZERS.register_module() +class SegLocalVisualizer(Visualizer): + """Local Visualizer. + + Args: + name (str): Name of the instance. Defaults to 'visualizer'. + image (np.ndarray, optional): the origin image to draw. The format + should be RGB. Defaults to None. + vis_backends (list, optional): Visual backend config list. + Defaults to None. + save_dir (str, optional): Save file dir for all storage backends. + If it is None, the backend storage will not save any data. + classes (list, optional): Input classes for result rendering, as the + prediction of segmentation model is a segment map with label + indices, `classes` is a list which includes items responding to the + label indices. If classes is not defined, visualizer will take + `cityscapes` classes by default. Defaults to None. + palette (list, optional): Input palette for result rendering, which is + a list of color palette responding to the classes. Defaults to None. + dataset_name (str, optional): `Dataset name or alias `_ + visulizer will use the meta information of the dataset i.e. classes + and palette, but the `classes` and `palette` have higher priority. + Defaults to None. + alpha (int, float): The transparency of segmentation mask. + Defaults to 0.8. + + Examples: + >>> import numpy as np + >>> import torch + >>> from mmengine.structures import PixelData + >>> from mmseg.structures import SegDataSample + >>> from mmseg.visualization import SegLocalVisualizer + + >>> seg_local_visualizer = SegLocalVisualizer() + >>> image = np.random.randint(0, 256, + ... size=(10, 12, 3)).astype('uint8') + >>> gt_sem_seg_data = dict(data=torch.randint(0, 2, (1, 10, 12))) + >>> gt_sem_seg = PixelData(**gt_sem_seg_data) + >>> gt_seg_data_sample = SegDataSample() + >>> gt_seg_data_sample.gt_sem_seg = gt_sem_seg + >>> seg_local_visualizer.dataset_meta = dict( + >>> classes=('background', 'foreground'), + >>> palette=[[120, 120, 120], [6, 230, 230]]) + >>> seg_local_visualizer.add_datasample('visualizer_example', + ... image, gt_seg_data_sample) + >>> seg_local_visualizer.add_datasample( + ... 'visualizer_example', image, + ... gt_seg_data_sample, show=True) + """ # noqa + + def __init__(self, + name: str = 'visualizer', + image: Optional[np.ndarray] = None, + vis_backends: Optional[Dict] = None, + save_dir: Optional[str] = None, + classes: Optional[List] = None, + palette: Optional[List] = None, + dataset_name: Optional[str] = None, + alpha: float = 0.8, + **kwargs): + super().__init__(name, image, vis_backends, save_dir, **kwargs) + self.alpha: float = alpha + self.set_dataset_meta(palette, classes, dataset_name) + + def _get_center_loc(self, mask: np.ndarray) -> np.ndarray: + """Get semantic seg center coordinate. + + Args: + mask: np.ndarray: get from sem_seg + """ + loc = np.argwhere(mask == 1) + + loc_sort = np.array( + sorted(loc.tolist(), key=lambda row: (row[0], row[1]))) + y_list = loc_sort[:, 0] + unique, indices, counts = np.unique( + y_list, return_index=True, return_counts=True) + y_loc = unique[counts.argmax()] + y_most_freq_loc = loc[loc_sort[:, 0] == y_loc] + center_num = len(y_most_freq_loc) // 2 + x = y_most_freq_loc[center_num][1] + y = y_most_freq_loc[center_num][0] + return np.array([x, y]) + + def _draw_sem_seg(self, + image: np.ndarray, + sem_seg: PixelData, + classes: Optional[List], + palette: Optional[List], + with_labels: Optional[bool] = True) -> np.ndarray: + """Draw semantic seg of GT or prediction. + + Args: + image (np.ndarray): The image to draw. + sem_seg (:obj:`PixelData`): Data structure for pixel-level + annotations or predictions. + classes (list, optional): Input classes for result rendering, as + the prediction of segmentation model is a segment map with + label indices, `classes` is a list which includes items + responding to the label indices. If classes is not defined, + visualizer will take `cityscapes` classes by default. + Defaults to None. + palette (list, optional): Input palette for result rendering, which + is a list of color palette responding to the classes. + Defaults to None. + with_labels(bool, optional): Add semantic labels in visualization + result, Default to True. + + Returns: + np.ndarray: the drawn image which channel is RGB. + """ + num_classes = len(classes) + + sem_seg = sem_seg.cpu().data + ids = np.unique(sem_seg)[::-1] + legal_indices = ids < num_classes + ids = ids[legal_indices] + labels = np.array(ids, dtype=np.int64) + + colors = [palette[label] for label in labels] + + mask = np.zeros_like(image, dtype=np.uint8) + for label, color in zip(labels, colors): + mask[sem_seg[0] == label, :] = color + + if with_labels: + font = cv2.FONT_HERSHEY_SIMPLEX + # (0,1] to change the size of the text relative to the image + scale = 0.05 + fontScale = min(image.shape[0], image.shape[1]) / (25 / scale) + fontColor = (255, 255, 255) + if image.shape[0] < 300 or image.shape[1] < 300: + thickness = 1 + rectangleThickness = 1 + else: + thickness = 2 + rectangleThickness = 2 + lineType = 2 + + if isinstance(sem_seg[0], torch.Tensor): + masks = sem_seg[0].numpy() == labels[:, None, None] + else: + masks = sem_seg[0] == labels[:, None, None] + masks = masks.astype(np.uint8) + for mask_num in range(len(labels)): + classes_id = labels[mask_num] + classes_color = colors[mask_num] + loc = self._get_center_loc(masks[mask_num]) + text = classes[classes_id] + (label_width, label_height), baseline = cv2.getTextSize( + text, font, fontScale, thickness) + mask = cv2.rectangle(mask, loc, + (loc[0] + label_width + baseline, + loc[1] + label_height + baseline), + classes_color, -1) + mask = cv2.rectangle(mask, loc, + (loc[0] + label_width + baseline, + loc[1] + label_height + baseline), + (0, 0, 0), rectangleThickness) + mask = cv2.putText(mask, text, (loc[0], loc[1] + label_height), + font, fontScale, fontColor, thickness, + lineType) + color_seg = (image * (1 - self.alpha) + mask * self.alpha).astype( + np.uint8) + self.set_image(color_seg) + return color_seg + + def _draw_depth_map(self, image: np.ndarray, + depth_map: PixelData) -> np.ndarray: + """Draws a depth map on a given image. + + This function takes an image and a depth map as input, + renders the depth map, and concatenates it with the original image. + Finally, it updates the internal image state of the visualizer with + the concatenated result. + + Args: + image (np.ndarray): The original image where the depth map will + be drawn. The array should be in the format HxWx3 where H is + the height, W is the width. + + depth_map (PixelData): Depth map to be drawn. The depth map + should be in the form of a PixelData object. It will be + converted to a torch tensor if it is a numpy array. + + Returns: + np.ndarray: The concatenated image with the depth map drawn. + + Example: + >>> depth_map_data = PixelData(data=torch.rand(1, 10, 10)) + >>> image = np.random.randint(0, 256, + >>> size=(10, 10, 3)).astype('uint8') + >>> visualizer = SegLocalVisualizer() + >>> visualizer._draw_depth_map(image, depth_map_data) + """ + depth_map = depth_map.cpu().data + if isinstance(depth_map, np.ndarray): + depth_map = torch.from_numpy(depth_map) + if depth_map.ndim == 2: + depth_map = depth_map[None] + + depth_map = self.draw_featmap(depth_map, resize_shape=image.shape[:2]) + out_image = np.concatenate((image, depth_map), axis=0) + self.set_image(out_image) + return out_image + + def set_dataset_meta(self, + classes: Optional[List] = None, + palette: Optional[List] = None, + dataset_name: Optional[str] = None) -> None: + """Set meta information to visualizer. + + Args: + classes (list, optional): Input classes for result rendering, as + the prediction of segmentation model is a segment map with + label indices, `classes` is a list which includes items + responding to the label indices. If classes is not defined, + visualizer will take `cityscapes` classes by default. + Defaults to None. + palette (list, optional): Input palette for result rendering, which + is a list of color palette responding to the classes. + Defaults to None. + dataset_name (str, optional): `Dataset name or alias `_ + visulizer will use the meta information of the dataset i.e. + classes and palette, but the `classes` and `palette` have + higher priority. Defaults to None. + """ # noqa + # Set default value. When calling + # `SegLocalVisualizer().dataset_meta=xxx`, + # it will override the default value. + if dataset_name is None: + dataset_name = 'cityscapes' + classes = classes if classes else get_classes(dataset_name) + palette = palette if palette else get_palette(dataset_name) + assert len(classes) == len( + palette), 'The length of classes should be equal to palette' + self.dataset_meta: dict = {'classes': classes, 'palette': palette} + + @master_only + def add_datasample( + self, + name: str, + image: np.ndarray, + data_sample: Optional[SegDataSample] = None, + draw_gt: bool = True, + draw_pred: bool = True, + show: bool = False, + wait_time: float = 0, + # TODO: Supported in mmengine's Viusalizer. + out_file: Optional[str] = None, + step: int = 0, + with_labels: Optional[bool] = True) -> None: + """Draw datasample and save to all backends. + + - If GT and prediction are plotted at the same time, they are + displayed in a stitched image where the left image is the + ground truth and the right image is the prediction. + - If ``show`` is True, all storage backends are ignored, and + the images will be displayed in a local window. + - If ``out_file`` is specified, the drawn image will be + saved to ``out_file``. it is usually used when the display + is not available. + + Args: + name (str): The image identifier. + image (np.ndarray): The image to draw. + gt_sample (:obj:`SegDataSample`, optional): GT SegDataSample. + Defaults to None. + pred_sample (:obj:`SegDataSample`, optional): Prediction + SegDataSample. Defaults to None. + draw_gt (bool): Whether to draw GT SegDataSample. Default to True. + draw_pred (bool): Whether to draw Prediction SegDataSample. + Defaults to True. + show (bool): Whether to display the drawn image. Default to False. + wait_time (float): The interval of show (s). Defaults to 0. + out_file (str): Path to output file. Defaults to None. + step (int): Global step value to record. Defaults to 0. + with_labels(bool, optional): Add semantic labels in visualization + result, Defaults to True. + """ + classes = self.dataset_meta.get('classes', None) + palette = self.dataset_meta.get('palette', None) + + gt_img_data = None + pred_img_data = None + + if draw_gt and data_sample is not None: + if 'gt_sem_seg' in data_sample: + assert classes is not None, 'class information is ' \ + 'not provided when ' \ + 'visualizing semantic ' \ + 'segmentation results.' + gt_img_data = self._draw_sem_seg(image, data_sample.gt_sem_seg, + classes, palette, with_labels) + + if 'gt_depth_map' in data_sample: + gt_img_data = gt_img_data if gt_img_data is not None else image + gt_img_data = self._draw_depth_map(gt_img_data, + data_sample.gt_depth_map) + + if draw_pred and data_sample is not None: + + if 'pred_sem_seg' in data_sample: + + assert classes is not None, 'class information is ' \ + 'not provided when ' \ + 'visualizing semantic ' \ + 'segmentation results.' + pred_img_data = self._draw_sem_seg(image, + data_sample.pred_sem_seg, + classes, palette, + with_labels) + + if 'pred_depth_map' in data_sample: + pred_img_data = pred_img_data if pred_img_data is not None \ + else image + pred_img_data = self._draw_depth_map( + pred_img_data, data_sample.pred_depth_map) + + if gt_img_data is not None and pred_img_data is not None: + drawn_img = np.concatenate((gt_img_data, pred_img_data), axis=1) + elif gt_img_data is not None: + drawn_img = gt_img_data + else: + drawn_img = pred_img_data + + if show: + self.show(drawn_img, win_name=name, wait_time=wait_time) + + if out_file is not None: + mmcv.imwrite(mmcv.rgb2bgr(drawn_img), out_file) + else: + self.add_image(name, drawn_img, step) diff --git a/mmsegmentation/model-index.yml b/mmsegmentation/model-index.yml new file mode 100644 index 0000000..4026bb9 --- /dev/null +++ b/mmsegmentation/model-index.yml @@ -0,0 +1,53 @@ +Import: +- configs/ann/metafile.yaml +- configs/apcnet/metafile.yaml +- configs/beit/metafile.yaml +- configs/bisenetv1/metafile.yaml +- configs/bisenetv2/metafile.yaml +- configs/ccnet/metafile.yaml +- configs/cgnet/metafile.yaml +- configs/convnext/metafile.yaml +- configs/danet/metafile.yaml +- configs/ddrnet/metafile.yaml +- configs/deeplabv3/metafile.yaml +- configs/deeplabv3plus/metafile.yaml +- configs/dmnet/metafile.yaml +- configs/dnlnet/metafile.yaml +- configs/dpt/metafile.yaml +- configs/emanet/metafile.yaml +- configs/encnet/metafile.yaml +- configs/erfnet/metafile.yaml +- configs/fastfcn/metafile.yaml +- configs/fastscnn/metafile.yaml +- configs/fcn/metafile.yaml +- configs/gcnet/metafile.yaml +- configs/hrnet/metafile.yaml +- configs/icnet/metafile.yaml +- configs/isanet/metafile.yaml +- configs/knet/metafile.yaml +- configs/mae/metafile.yaml +- configs/mask2former/metafile.yaml +- configs/maskformer/metafile.yaml +- configs/mobilenet_v2/metafile.yaml +- configs/mobilenet_v3/metafile.yaml +- configs/nonlocal_net/metafile.yaml +- configs/ocrnet/metafile.yaml +- configs/pidnet/metafile.yaml +- configs/point_rend/metafile.yaml +- configs/poolformer/metafile.yaml +- configs/psanet/metafile.yaml +- configs/pspnet/metafile.yaml +- configs/resnest/metafile.yaml +- configs/san/metafile.yaml +- configs/segformer/metafile.yaml +- configs/segmenter/metafile.yaml +- configs/segnext/metafile.yaml +- configs/sem_fpn/metafile.yaml +- configs/setr/metafile.yaml +- configs/stdc/metafile.yaml +- configs/swin/metafile.yaml +- configs/twins/metafile.yaml +- configs/unet/metafile.yaml +- configs/upernet/metafile.yaml +- configs/vit/metafile.yaml +- configs/vpd/metafile.yaml diff --git a/mmsegmentation/nohup.out b/mmsegmentation/nohup.out new file mode 100644 index 0000000..5856e6a --- /dev/null +++ b/mmsegmentation/nohup.out @@ -0,0 +1,2216 @@ +/bin/sh: 1: gcc: not found +11/14 21:28:56 - mmengine - INFO - +------------------------------------------------------------ +System environment: + sys.platform: linux + Python: 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0] + CUDA available: True + MUSA available: False + numpy_random_seed: 586206344 + GPU 0: Tesla V100-SXM2-32GB + CUDA_HOME: None + GCC: n/a + PyTorch: 2.1.0 + PyTorch compiling details: PyTorch built with: + - GCC 9.3 + - C++ Version: 201703 + - Intel(R) oneAPI Math Kernel Library Version 2023.1-Product Build 20230303 for Intel(R) 64 architecture applications + - Intel(R) MKL-DNN v3.1.1 (Git Hash 64f6bcbcbab628e96f33a62c3e975f8535a7bde4) + - OpenMP 201511 (a.k.a. OpenMP 4.5) + - LAPACK is enabled (usually provided by MKL) + - NNPACK is enabled + - CPU capability usage: AVX512 + - CUDA Runtime 11.8 + - NVCC architecture flags: -gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_90,code=sm_90;-gencode;arch=compute_37,code=compute_37 + - CuDNN 8.7 + - Magma 2.6.1 + - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.8, CUDNN_VERSION=8.7.0, CXX_COMPILER=/opt/rh/devtoolset-9/root/usr/bin/c++, CXX_FLAGS= -D_GLIBCXX_USE_CXX11_ABI=0 -fabi-version=11 -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -DNDEBUG -DUSE_KINETO -DLIBKINETO_NOROCTRACER -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -O2 -fPIC -Wall -Wextra -Werror=return-type -Werror=non-virtual-dtor -Werror=bool-operation -Wnarrowing -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-function -Wno-unused-result -Wno-strict-overflow -Wno-strict-aliasing -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=old-style-cast -Wno-invalid-partial-specialization -Wno-unused-private-field -Wno-aligned-allocation-unavailable -Wno-missing-braces -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Werror=cast-function-type -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_DISABLE_GPU_ASSERTS=ON, TORCH_VERSION=2.1.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, USE_ROCM=OFF, + + TorchVision: 0.16.0 + OpenCV: 4.10.0 + MMEngine: 0.10.5 + +Runtime environment: + cudnn_benchmark: True + mp_cfg: {'mp_start_method': 'fork', 'opencv_num_threads': 0} + dist_cfg: {'backend': 'nccl'} + seed: 586206344 + Distributed launcher: none + Distributed training: False + GPU number: 1 +------------------------------------------------------------ + +11/14 21:28:57 - mmengine - INFO - Config: +auto_scale_lr = dict(base_batch_size=16, enable=False) +backbone_embed_multi = dict(decay_mult=0.0, lr_mult=0.1) +backbone_norm_multi = dict(decay_mult=0.0, lr_mult=0.1) +crop_size = ( + 1536, + 1536, +) +custom_keys = dict({ + 'absolute_pos_embed': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone': + dict(decay_mult=1.0, lr_mult=0.1), + 'backbone.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.patch_embed.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.0.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.0.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.0.downsample.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.1.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.1.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.1.downsample.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.10.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.11.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.12.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.13.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.14.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.15.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.16.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.17.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.2.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.3.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.4.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.5.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.6.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.7.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.8.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.9.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.downsample.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.3.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.3.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'level_embed': + dict(decay_mult=0.0, lr_mult=1.0), + 'query_embed': + dict(decay_mult=0.0, lr_mult=1.0), + 'query_feat': + dict(decay_mult=0.0, lr_mult=1.0), + 'relative_position_bias_table': + dict(decay_mult=0.0, lr_mult=0.1) +}) +data_preprocessor = dict( + bgr_to_rgb=True, + mean=[ + 123.675, + 116.28, + 103.53, + ], + pad_val=0, + seg_pad_val=255, + size=( + 1536, + 1536, + ), + std=[ + 58.395, + 57.12, + 57.375, + ], + test_cfg=dict(size_divisor=32), + type='SegDataPreProcessor') +data_root = '/data/ephemeral/home/cityscapes_format_xlay/' +dataset_type = 'XRayDataset' +default_hooks = dict( + checkpoint=dict( + by_epoch=False, + interval=3000, + rule='greater', + save_best='mDice', + type='CheckpointHook'), + logger=dict(interval=100, log_metric_by_epoch=False, type='LoggerHook'), + param_scheduler=dict(type='ParamSchedulerHook'), + sampler_seed=dict(type='DistSamplerSeedHook'), + timer=dict(type='IterTimerHook'), + visualization=dict(type='SegVisualizationHook')) +default_scope = 'mmseg' +depths = [ + 2, + 2, + 18, + 2, +] +embed_multi = dict(decay_mult=0.0, lr_mult=1.0) +env_cfg = dict( + cudnn_benchmark=True, + dist_cfg=dict(backend='nccl'), + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0)) +fp16 = dict(loss_scale=512.0) +img_ratios = [ + 0.5, + 0.75, + 1.0, + 1.25, + 1.5, + 1.75, +] +launcher = 'none' +load_from = 'https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901-28ad20f1.pth' +log_config = dict( + hooks=[ + dict(by_epoch=False, type='TextLoggerHook'), + dict( + by_epoch=False, + init_kwargs=dict( + entity='frostings', + name='mmsegtest', + project='Boost Camp Lv2-3'), + interval=1, + log_checkpoint=True, + log_checkpoint_metadata=True, + num_eval_images=10, + type='MMSegWandbHook', + with_step=False), + ], + interval=1) +log_level = 'INFO' +log_processor = dict(by_epoch=False) +model = dict( + backbone=dict( + attn_drop_rate=0.0, + depths=[ + 2, + 2, + 18, + 2, + ], + drop_path_rate=0.3, + drop_rate=0.0, + embed_dims=192, + frozen_stages=-1, + init_cfg=dict( + checkpoint= + 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth', + type='Pretrained'), + mlp_ratio=4, + num_heads=[ + 6, + 12, + 24, + 48, + ], + out_indices=( + 0, + 1, + 2, + 3, + ), + patch_norm=True, + pretrain_img_size=384, + qk_scale=None, + qkv_bias=True, + type='SwinTransformer', + window_size=12, + with_cp=False), + data_preprocessor=dict( + bgr_to_rgb=True, + mean=[ + 123.675, + 116.28, + 103.53, + ], + pad_val=0, + seg_pad_val=255, + size=( + 1536, + 1536, + ), + std=[ + 58.395, + 57.12, + 57.375, + ], + test_cfg=dict(size_divisor=32), + type='SegDataPreProcessor'), + decode_head=dict( + align_corners=False, + enforce_decoder_input_project=False, + feat_channels=256, + in_channels=[ + 192, + 384, + 768, + 1536, + ], + loss_cls=dict( + class_weight=[ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1, + ], + loss_weight=2.0, + reduction='mean', + type='mmdet.CrossEntropyLoss', + use_sigmoid=False), + loss_dice=dict( + activate=True, + eps=1.0, + loss_weight=5.0, + naive_dice=True, + reduction='mean', + type='mmdet.DiceLoss', + use_sigmoid=True), + loss_mask=dict( + loss_weight=5.0, + reduction='mean', + type='mmdet.CrossEntropyLoss', + use_sigmoid=True), + num_classes=30, + num_queries=100, + num_transformer_feat_level=3, + out_channels=256, + pixel_decoder=dict( + act_cfg=dict(type='ReLU'), + encoder=dict( + init_cfg=None, + layer_cfg=dict( + ffn_cfg=dict( + act_cfg=dict(inplace=True, type='ReLU'), + embed_dims=256, + feedforward_channels=1024, + ffn_drop=0.0, + num_fcs=2), + self_attn_cfg=dict( + batch_first=True, + dropout=0.0, + embed_dims=256, + im2col_step=64, + init_cfg=None, + norm_cfg=None, + num_heads=8, + num_levels=3, + num_points=4)), + num_layers=6), + init_cfg=None, + norm_cfg=dict(num_groups=32, type='GN'), + num_outs=3, + positional_encoding=dict(normalize=True, num_feats=128), + type='mmdet.MSDeformAttnPixelDecoder'), + positional_encoding=dict(normalize=True, num_feats=128), + strides=[ + 4, + 8, + 16, + 32, + ], + train_cfg=dict( + assigner=dict( + match_costs=[ + dict(type='mmdet.ClassificationCost', weight=2.0), + dict( + type='mmdet.CrossEntropyLossCost', + use_sigmoid=True, + weight=5.0), + dict( + eps=1.0, + pred_act=True, + type='mmdet.DiceCost', + weight=5.0), + ], + type='mmdet.HungarianAssigner'), + importance_sample_ratio=0.75, + num_points=12544, + oversample_ratio=3.0, + sampler=dict(type='mmdet.MaskPseudoSampler')), + transformer_decoder=dict( + init_cfg=None, + layer_cfg=dict( + cross_attn_cfg=dict( + attn_drop=0.0, + batch_first=True, + dropout_layer=None, + embed_dims=256, + num_heads=8, + proj_drop=0.0), + ffn_cfg=dict( + act_cfg=dict(inplace=True, type='ReLU'), + add_identity=True, + dropout_layer=None, + embed_dims=256, + feedforward_channels=2048, + ffn_drop=0.0, + num_fcs=2), + self_attn_cfg=dict( + attn_drop=0.0, + batch_first=True, + dropout_layer=None, + embed_dims=256, + num_heads=8, + proj_drop=0.0)), + num_layers=9, + return_intermediate=True), + type='Mask2FormerHead'), + test_cfg=dict(mode='whole'), + train_cfg=dict(), + type='EncoderDecoder') +num_classes = 30 +optim_wrapper = dict( + clip_grad=dict(max_norm=0.01, norm_type=2), + optimizer=dict( + betas=( + 0.9, + 0.999, + ), + eps=1e-08, + lr=0.0001, + type='AdamW', + weight_decay=0.05), + paramwise_cfg=dict( + custom_keys=dict({ + 'absolute_pos_embed': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone': + dict(decay_mult=1.0, lr_mult=0.1), + 'backbone.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.patch_embed.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.0.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.0.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.0.downsample.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.1.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.1.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.1.downsample.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.10.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.11.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.12.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.13.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.14.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.15.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.16.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.17.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.2.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.3.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.4.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.5.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.6.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.7.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.8.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.blocks.9.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.2.downsample.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.3.blocks.0.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'backbone.stages.3.blocks.1.norm': + dict(decay_mult=0.0, lr_mult=0.1), + 'level_embed': + dict(decay_mult=0.0, lr_mult=1.0), + 'query_embed': + dict(decay_mult=0.0, lr_mult=1.0), + 'query_feat': + dict(decay_mult=0.0, lr_mult=1.0), + 'relative_position_bias_table': + dict(decay_mult=0.0, lr_mult=0.1) + }), + norm_decay_mult=0.0), + type='OptimWrapper') +optimizer = dict( + betas=( + 0.9, + 0.999, + ), + eps=1e-08, + lr=0.0001, + type='AdamW', + weight_decay=0.05) +param_scheduler = [ + dict( + begin=0, + by_epoch=False, + end=90000, + eta_min=0, + power=0.9, + type='PolyLR'), +] +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth' +resize_size = ( + 1748, + 1748, +) +resume = False +test_cfg = dict(type='TestLoop') +test_dataloader = dict( + batch_size=1, + dataset=dict( + data_prefix=dict(img_path='leftImg8bit/test'), + data_root='/data/ephemeral/home/cityscapes_format_xlay/', + img_suffix='.png', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 2048, + ), type='Resize'), + dict(type='PackSegInputs'), + ], + type='XRayDataset'), + num_workers=4, + persistent_workers=True, + sampler=dict(shuffle=False, type='DefaultSampler')) +test_evaluator = dict( + save_path='/data/ephemeral/home/submission', type='SubmissionMetric') +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 2048, + ), type='Resize'), + dict(type='PackSegInputs'), +] +test_size = ( + 2048, + 2048, +) +train_cfg = dict(max_iters=90000, type='IterBasedTrainLoop', val_interval=3000) +train_dataloader = dict( + batch_size=1, + dataset=dict( + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), + data_root='/data/ephemeral/home/cityscapes_format_xlay/', + img_suffix='.png', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(keep_ratio=True, scale=( + 1748, + 1748, + ), type='Resize'), + dict( + cat_max_ratio=0.75, + crop_size=( + 1536, + 1536, + ), + type='RandomCrop'), + dict(prob=0.5, type='RandomFlip'), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs'), + ], + seg_map_suffix='_gtFine_labelIds.png', + type='XRayDataset'), + num_workers=2, + persistent_workers=True, + sampler=dict(shuffle=True, type='InfiniteSampler')) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(keep_ratio=True, scale=( + 1748, + 1748, + ), type='Resize'), + dict(cat_max_ratio=0.75, crop_size=( + 1536, + 1536, + ), type='RandomCrop'), + dict(prob=0.5, type='RandomFlip'), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs'), +] +tta_model = dict(type='SegTTAModel') +tta_pipeline = [ + dict(backend_args=None, type='LoadImageFromFile'), + dict( + transforms=[ + [ + dict(keep_ratio=True, scale_factor=0.5, type='Resize'), + dict(keep_ratio=True, scale_factor=0.75, type='Resize'), + dict(keep_ratio=True, scale_factor=1.0, type='Resize'), + dict(keep_ratio=True, scale_factor=1.25, type='Resize'), + dict(keep_ratio=True, scale_factor=1.5, type='Resize'), + dict(keep_ratio=True, scale_factor=1.75, type='Resize'), + ], + [ + dict(direction='horizontal', prob=0.0, type='RandomFlip'), + dict(direction='horizontal', prob=1.0, type='RandomFlip'), + ], + [ + dict(type='PackSegInputs'), + ], + ], + type='TestTimeAug'), +] +val_cfg = dict(type='ValLoop') +val_dataloader = dict( + batch_size=1, + dataset=dict( + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + data_root='/data/ephemeral/home/cityscapes_format_xlay/', + img_suffix='.png', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 2048, + ), type='Resize'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs'), + ], + seg_map_suffix='_gtFine_labelIds.png', + type='XRayDataset'), + num_workers=4, + persistent_workers=True, + sampler=dict(shuffle=False, type='DefaultSampler')) +val_evaluator = dict(type='DiceMetric') +val_pipeline = [ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 2048, + ), type='Resize'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs'), +] +val_save_interval = 3000 +vis_backends = [ + dict(type='LocalVisBackend'), + dict(type='WandbVisBackend'), +] +visualizer = dict( + name='visualizer', + type='SegLocalVisualizer', + vis_backends=[ + dict(type='LocalVisBackend'), + dict(type='WandbVisBackend'), + ]) +work_dir = '/data/ephemeral/home/parkjunil/mask2former_base_1748_1536' + +wandb: Using wandb-core as the SDK backend. Please refer to https://wandb.me/wandb-core for more information. +wandb: Currently logged in as: june21a (june21a-chung-ang-university). Use `wandb login --relogin` to force relogin +wandb: Tracking run with wandb version 0.18.6 +wandb: Run data is saved locally in /data/ephemeral/home/parkjunil/mask2former_base_1748_1536/20241114_212855/vis_data/wandb/run-20241114_212900-v5mxuanf +wandb: Run `wandb offline` to turn off syncing. +wandb: Syncing run faithful-wave-6 +wandb: โญ๏ธ View project at https://wandb.ai/june21a-chung-ang-university/mmsegmentation-tools +wandb: ๐Ÿš€ View run at https://wandb.ai/june21a-chung-ang-university/mmsegmentation-tools/runs/v5mxuanf +/opt/conda/lib/python3.10/site-packages/albumentations/__init__.py:13: UserWarning: A new version of Albumentations is available: 1.4.21 (you have 1.4.18). Upgrade using: pip install -U albumentations. To disable automatic update checks, set the environment variable NO_ALBUMENTATIONS_UPDATE to 1. + check_for_updates() +11/14 21:29:07 - mmengine - INFO - Distributed training is not used, all SyncBatchNorm (SyncBN) layers in the model will be automatically reverted to BatchNormXd layers if they are used. +/data/ephemeral/home/mmsegmentation/mmseg/engine/hooks/visualization_hook.py:60: UserWarning: The draw is False, it means that the hook for visualization will not take effect. The results will NOT be visualized or stored. + warnings.warn('The draw is False, it means that the ' +11/14 21:29:07 - mmengine - INFO - Hooks will be executed in the following order: +before_run: +(VERY_HIGH ) RuntimeInfoHook +(BELOW_NORMAL) LoggerHook + -------------------- +before_train: +(VERY_HIGH ) RuntimeInfoHook +(NORMAL ) IterTimerHook +(VERY_LOW ) CheckpointHook + -------------------- +before_train_epoch: +(VERY_HIGH ) RuntimeInfoHook +(NORMAL ) IterTimerHook +(NORMAL ) DistSamplerSeedHook + -------------------- +before_train_iter: +(VERY_HIGH ) RuntimeInfoHook +(NORMAL ) IterTimerHook + -------------------- +after_train_iter: +(VERY_HIGH ) RuntimeInfoHook +(NORMAL ) IterTimerHook +(BELOW_NORMAL) LoggerHook +(LOW ) ParamSchedulerHook +(VERY_LOW ) CheckpointHook + -------------------- +after_train_epoch: +(NORMAL ) IterTimerHook +(LOW ) ParamSchedulerHook +(VERY_LOW ) CheckpointHook + -------------------- +before_val: +(VERY_HIGH ) RuntimeInfoHook + -------------------- +before_val_epoch: +(NORMAL ) IterTimerHook + -------------------- +before_val_iter: +(NORMAL ) IterTimerHook + -------------------- +after_val_iter: +(NORMAL ) IterTimerHook +(NORMAL ) SegVisualizationHook +(BELOW_NORMAL) LoggerHook + -------------------- +after_val_epoch: +(VERY_HIGH ) RuntimeInfoHook +(NORMAL ) IterTimerHook +(BELOW_NORMAL) LoggerHook +(LOW ) ParamSchedulerHook +(VERY_LOW ) CheckpointHook + -------------------- +after_val: +(VERY_HIGH ) RuntimeInfoHook + -------------------- +after_train: +(VERY_HIGH ) RuntimeInfoHook +(VERY_LOW ) CheckpointHook + -------------------- +before_test: +(VERY_HIGH ) RuntimeInfoHook + -------------------- +before_test_epoch: +(NORMAL ) IterTimerHook + -------------------- +before_test_iter: +(NORMAL ) IterTimerHook + -------------------- +after_test_iter: +(NORMAL ) IterTimerHook +(NORMAL ) SegVisualizationHook +(BELOW_NORMAL) LoggerHook + -------------------- +after_test_epoch: +(VERY_HIGH ) RuntimeInfoHook +(NORMAL ) IterTimerHook +(BELOW_NORMAL) LoggerHook + -------------------- +after_test: +(VERY_HIGH ) RuntimeInfoHook + -------------------- +after_run: +(BELOW_NORMAL) LoggerHook + -------------------- +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.projection.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.patch_embed.norm.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.0.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.blocks.1.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.norm.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.reduction.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.reduction.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.reduction.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.0.downsample.reduction.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.0.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.blocks.1.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.norm.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.reduction.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.reduction.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.reduction.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.1.downsample.reduction.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.0.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.1.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.2.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.3.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.4.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.5.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.6.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.7.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.8.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.9.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.10.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.11.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.12.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.13.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.14.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.15.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.16.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.blocks.17.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.norm.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.reduction.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.reduction.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.reduction.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.2.downsample.reduction.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.0.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.relative_position_bias_table:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.relative_position_bias_table:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.relative_position_bias_table:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.relative_position_bias_table:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.qkv.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.attn.w_msa.proj.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.0.0.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.weight:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.weight:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.bias:weight_decay=0.05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.stages.3.blocks.1.ffn.layers.1.bias:decay_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm0.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm1.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm2.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.weight:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.weight:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.bias:lr=1e-05 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.bias:lr_mult=0.1 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- backbone.norm3.bias:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.input_convs.0.gn.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.input_convs.0.gn.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.input_convs.1.gn.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.input_convs.1.gn.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.input_convs.2.gn.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.input_convs.2.gn.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.0.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.0.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.0.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.0.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.1.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.1.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.1.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.1.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.2.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.2.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.2.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.2.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.3.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.3.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.3.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.3.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.4.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.4.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.4.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.4.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.5.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.5.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.5.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.encoder.layers.5.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.lateral_convs.0.gn.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.lateral_convs.0.gn.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.output_convs.0.gn.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.pixel_decoder.output_convs.0.gn.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.0.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.0.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.0.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.0.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.0.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.0.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.1.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.1.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.1.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.1.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.1.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.1.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.2.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.2.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.2.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.2.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.2.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.2.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.3.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.3.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.3.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.3.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.3.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.3.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.4.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.4.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.4.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.4.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.4.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.4.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.5.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.5.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.5.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.5.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.5.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.5.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.6.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.6.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.6.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.6.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.6.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.6.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.7.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.7.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.7.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.7.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.7.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.7.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.8.norms.0.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.8.norms.0.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.8.norms.1.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.8.norms.1.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.8.norms.2.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.layers.8.norms.2.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.post_norm.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.transformer_decoder.post_norm.bias:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_embed.weight:lr=0.0001 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_embed.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_embed.weight:lr_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_embed.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_feat.weight:lr=0.0001 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_feat.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_feat.weight:lr_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.query_feat.weight:decay_mult=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.level_embed.weight:lr=0.0001 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.level_embed.weight:weight_decay=0.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.level_embed.weight:lr_mult=1.0 +11/14 21:29:08 - mmengine - INFO - paramwise_options -- decode_head.level_embed.weight:decay_mult=0.0 +11/14 21:29:09 - mmengine - WARNING - The prefix is not set in metric class DiceMetric. +Loads checkpoint by http backend from path: https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth +Loads checkpoint by http backend from path: https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901-28ad20f1.pth +The model and loaded state dict do not match exactly + +size mismatch for decode_head.cls_embed.weight: copying a param with shape torch.Size([20, 256]) from checkpoint, the shape in current model is torch.Size([31, 256]). +size mismatch for decode_head.cls_embed.bias: copying a param with shape torch.Size([20]) from checkpoint, the shape in current model is torch.Size([31]). +11/14 21:29:11 - mmengine - INFO - Load checkpoint from https://download.openmmlab.com/mmsegmentation/v0.5/mask2former/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024/mask2former_swin-l-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024_20221202_141901-28ad20f1.pth +11/14 21:29:11 - mmengine - WARNING - "FileClient" will be deprecated in future. Please use io functions in https://mmengine.readthedocs.io/en/latest/api/fileio.html#file-io +11/14 21:29:11 - mmengine - WARNING - "HardDiskBackend" is the alias of "LocalBackend" and the former will be deprecated in future. +11/14 21:29:11 - mmengine - INFO - Checkpoints will be saved to /data/ephemeral/home/parkjunil/mask2former_base_1748_1536. +/opt/conda/lib/python3.10/site-packages/torch/functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at /opt/conda/conda-bld/pytorch_1695392020201/work/aten/src/ATen/native/TensorShape.cpp:3526.) + return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined] +11/14 21:31:54 - mmengine - INFO - Iter(train) [ 100/90000] base_lr: 9.9901e-05 lr: 9.9901e-06 eta: 1 day, 16:33:54 time: 1.5990 data_time: 0.0178 memory: 28594 grad_norm: 305.1580 loss: 37.3849 decode.loss_cls: 1.7073 decode.loss_mask: 0.1344 decode.loss_dice: 0.9270 decode.d0.loss_cls: 6.4599 decode.d0.loss_mask: 0.1695 decode.d0.loss_dice: 1.5017 decode.d1.loss_cls: 3.7023 decode.d1.loss_mask: 0.1622 decode.d1.loss_dice: 1.1506 decode.d2.loss_cls: 2.6918 decode.d2.loss_mask: 0.1256 decode.d2.loss_dice: 1.0338 decode.d3.loss_cls: 2.2764 decode.d3.loss_mask: 0.1170 decode.d3.loss_dice: 0.8932 decode.d4.loss_cls: 2.0114 decode.d4.loss_mask: 0.1265 decode.d4.loss_dice: 0.9013 decode.d5.loss_cls: 1.9429 decode.d5.loss_mask: 0.1322 decode.d5.loss_dice: 0.9058 decode.d6.loss_cls: 1.8207 decode.d6.loss_mask: 0.1260 decode.d6.loss_dice: 0.8958 decode.d7.loss_cls: 1.7324 decode.d7.loss_mask: 0.1306 decode.d7.loss_dice: 0.9058 decode.d8.loss_cls: 1.6652 decode.d8.loss_mask: 0.1336 decode.d8.loss_dice: 0.9021 +11/14 21:34:34 - mmengine - INFO - Iter(train) [ 200/90000] base_lr: 9.9801e-05 lr: 9.9801e-06 eta: 1 day, 16:17:27 time: 1.6043 data_time: 0.0178 memory: 28552 grad_norm: 139.1402 loss: 14.3850 decode.loss_cls: 0.3627 decode.loss_mask: 0.0540 decode.loss_dice: 0.4288 decode.d0.loss_cls: 5.4133 decode.d0.loss_mask: 0.0604 decode.d0.loss_dice: 0.5897 decode.d1.loss_cls: 0.6901 decode.d1.loss_mask: 0.0603 decode.d1.loss_dice: 0.4657 decode.d2.loss_cls: 0.4056 decode.d2.loss_mask: 0.0563 decode.d2.loss_dice: 0.4811 decode.d3.loss_cls: 0.4355 decode.d3.loss_mask: 0.0544 decode.d3.loss_dice: 0.4227 decode.d4.loss_cls: 0.3797 decode.d4.loss_mask: 0.0569 decode.d4.loss_dice: 0.4430 decode.d5.loss_cls: 0.3940 decode.d5.loss_mask: 0.0556 decode.d5.loss_dice: 0.4528 decode.d6.loss_cls: 0.3936 decode.d6.loss_mask: 0.0548 decode.d6.loss_dice: 0.4532 decode.d7.loss_cls: 0.3870 decode.d7.loss_mask: 0.0567 decode.d7.loss_dice: 0.4517 decode.d8.loss_cls: 0.3207 decode.d8.loss_mask: 0.0563 decode.d8.loss_dice: 0.4482 +11/14 21:37:14 - mmengine - INFO - Iter(train) [ 300/90000] base_lr: 9.9701e-05 lr: 9.9701e-06 eta: 1 day, 16:07:08 time: 1.5979 data_time: 0.0175 memory: 28552 grad_norm: 108.5796 loss: 10.2965 decode.loss_cls: 0.2175 decode.loss_mask: 0.0544 decode.loss_dice: 0.4410 decode.d0.loss_cls: 3.4332 decode.d0.loss_mask: 0.0485 decode.d0.loss_dice: 0.4727 decode.d1.loss_cls: 0.2831 decode.d1.loss_mask: 0.0563 decode.d1.loss_dice: 0.4471 decode.d2.loss_cls: 0.1703 decode.d2.loss_mask: 0.0640 decode.d2.loss_dice: 0.4391 decode.d3.loss_cls: 0.1884 decode.d3.loss_mask: 0.0668 decode.d3.loss_dice: 0.4280 decode.d4.loss_cls: 0.1928 decode.d4.loss_mask: 0.0648 decode.d4.loss_dice: 0.4329 decode.d5.loss_cls: 0.2099 decode.d5.loss_mask: 0.0605 decode.d5.loss_dice: 0.4298 decode.d6.loss_cls: 0.2080 decode.d6.loss_mask: 0.0552 decode.d6.loss_dice: 0.4343 decode.d7.loss_cls: 0.1973 decode.d7.loss_mask: 0.0557 decode.d7.loss_dice: 0.4426 decode.d8.loss_cls: 0.2031 decode.d8.loss_mask: 0.0561 decode.d8.loss_dice: 0.4430 +11/14 21:39:54 - mmengine - INFO - Iter(train) [ 400/90000] base_lr: 9.9601e-05 lr: 9.9601e-06 eta: 1 day, 16:00:23 time: 1.5985 data_time: 0.0177 memory: 28552 grad_norm: 140.5457 loss: 9.6174 decode.loss_cls: 0.2714 decode.loss_mask: 0.0582 decode.loss_dice: 0.4477 decode.d0.loss_cls: 2.0169 decode.d0.loss_mask: 0.0622 decode.d0.loss_dice: 0.5964 decode.d1.loss_cls: 0.2883 decode.d1.loss_mask: 0.0685 decode.d1.loss_dice: 0.5144 decode.d2.loss_cls: 0.2179 decode.d2.loss_mask: 0.0604 decode.d2.loss_dice: 0.5060 decode.d3.loss_cls: 0.2298 decode.d3.loss_mask: 0.0559 decode.d3.loss_dice: 0.4529 decode.d4.loss_cls: 0.2189 decode.d4.loss_mask: 0.0567 decode.d4.loss_dice: 0.4637 decode.d5.loss_cls: 0.2093 decode.d5.loss_mask: 0.0571 decode.d5.loss_dice: 0.4727 decode.d6.loss_cls: 0.2620 decode.d6.loss_mask: 0.0600 decode.d6.loss_dice: 0.4539 decode.d7.loss_cls: 0.2354 decode.d7.loss_mask: 0.0614 decode.d7.loss_dice: 0.4600 decode.d8.loss_cls: 0.2377 decode.d8.loss_mask: 0.0633 decode.d8.loss_dice: 0.4584 +11/14 21:42:34 - mmengine - INFO - Iter(train) [ 500/90000] base_lr: 9.9501e-05 lr: 9.9501e-06 eta: 1 day, 15:54:55 time: 1.5954 data_time: 0.0170 memory: 28552 grad_norm: 37.0008 loss: 5.2917 decode.loss_cls: 0.0460 decode.loss_mask: 0.0408 decode.loss_dice: 0.3249 decode.d0.loss_cls: 1.0061 decode.d0.loss_mask: 0.0421 decode.d0.loss_dice: 0.3511 decode.d1.loss_cls: 0.0856 decode.d1.loss_mask: 0.0433 decode.d1.loss_dice: 0.3465 decode.d2.loss_cls: 0.0669 decode.d2.loss_mask: 0.0411 decode.d2.loss_dice: 0.3340 decode.d3.loss_cls: 0.0478 decode.d3.loss_mask: 0.0427 decode.d3.loss_dice: 0.3442 decode.d4.loss_cls: 0.0357 decode.d4.loss_mask: 0.0421 decode.d4.loss_dice: 0.3434 decode.d5.loss_cls: 0.0388 decode.d5.loss_mask: 0.0418 decode.d5.loss_dice: 0.3501 decode.d6.loss_cls: 0.0374 decode.d6.loss_mask: 0.0410 decode.d6.loss_dice: 0.3282 decode.d7.loss_cls: 0.0376 decode.d7.loss_mask: 0.0424 decode.d7.loss_dice: 0.3410 decode.d8.loss_cls: 0.0670 decode.d8.loss_mask: 0.0414 decode.d8.loss_dice: 0.3405 +11/14 21:45:14 - mmengine - INFO - Iter(train) [ 600/90000] base_lr: 9.9401e-05 lr: 9.9401e-06 eta: 1 day, 15:49:52 time: 1.5952 data_time: 0.0172 memory: 28552 grad_norm: 52.8307 loss: 4.5907 decode.loss_cls: 0.0382 decode.loss_mask: 0.0405 decode.loss_dice: 0.3034 decode.d0.loss_cls: 0.6743 decode.d0.loss_mask: 0.0415 decode.d0.loss_dice: 0.3407 decode.d1.loss_cls: 0.1023 decode.d1.loss_mask: 0.0421 decode.d1.loss_dice: 0.3323 decode.d2.loss_cls: 0.0785 decode.d2.loss_mask: 0.0378 decode.d2.loss_dice: 0.3112 decode.d3.loss_cls: 0.0388 decode.d3.loss_mask: 0.0367 decode.d3.loss_dice: 0.2940 decode.d4.loss_cls: 0.0358 decode.d4.loss_mask: 0.0373 decode.d4.loss_dice: 0.3112 decode.d5.loss_cls: 0.0471 decode.d5.loss_mask: 0.0362 decode.d5.loss_dice: 0.2931 decode.d6.loss_cls: 0.0415 decode.d6.loss_mask: 0.0384 decode.d6.loss_dice: 0.3013 decode.d7.loss_cls: 0.0353 decode.d7.loss_mask: 0.0380 decode.d7.loss_dice: 0.2944 decode.d8.loss_cls: 0.0375 decode.d8.loss_mask: 0.0389 decode.d8.loss_dice: 0.2922 +11/14 21:46:17 - mmengine - INFO - Exp name: mask2former_20241114_212855 +11/14 21:47:53 - mmengine - INFO - Iter(train) [ 700/90000] base_lr: 9.9301e-05 lr: 9.9301e-06 eta: 1 day, 15:45:39 time: 1.5983 data_time: 0.0172 memory: 28552 grad_norm: 23.3135 loss: 4.0187 decode.loss_cls: 0.0280 decode.loss_mask: 0.0343 decode.loss_dice: 0.2815 decode.d0.loss_cls: 0.4558 decode.d0.loss_mask: 0.0355 decode.d0.loss_dice: 0.2945 decode.d1.loss_cls: 0.0485 decode.d1.loss_mask: 0.0348 decode.d1.loss_dice: 0.2924 decode.d2.loss_cls: 0.0629 decode.d2.loss_mask: 0.0361 decode.d2.loss_dice: 0.2880 decode.d3.loss_cls: 0.0411 decode.d3.loss_mask: 0.0348 decode.d3.loss_dice: 0.2779 decode.d4.loss_cls: 0.0184 decode.d4.loss_mask: 0.0358 decode.d4.loss_dice: 0.2872 decode.d5.loss_cls: 0.0197 decode.d5.loss_mask: 0.0351 decode.d5.loss_dice: 0.2766 decode.d6.loss_cls: 0.0346 decode.d6.loss_mask: 0.0348 decode.d6.loss_dice: 0.2810 decode.d7.loss_cls: 0.0356 decode.d7.loss_mask: 0.0348 decode.d7.loss_dice: 0.2891 decode.d8.loss_cls: 0.0675 decode.d8.loss_mask: 0.0355 decode.d8.loss_dice: 0.2872 +11/14 21:50:33 - mmengine - INFO - Iter(train) [ 800/90000] base_lr: 9.9201e-05 lr: 9.9201e-06 eta: 1 day, 15:41:40 time: 1.5919 data_time: 0.0167 memory: 28552 grad_norm: 35.1899 loss: 4.5128 decode.loss_cls: 0.0478 decode.loss_mask: 0.0494 decode.loss_dice: 0.3324 decode.d0.loss_cls: 0.2883 decode.d0.loss_mask: 0.0474 decode.d0.loss_dice: 0.3263 decode.d1.loss_cls: 0.0650 decode.d1.loss_mask: 0.0483 decode.d1.loss_dice: 0.3340 decode.d2.loss_cls: 0.0824 decode.d2.loss_mask: 0.0490 decode.d2.loss_dice: 0.3390 decode.d3.loss_cls: 0.0920 decode.d3.loss_mask: 0.0490 decode.d3.loss_dice: 0.3177 decode.d4.loss_cls: 0.0293 decode.d4.loss_mask: 0.0464 decode.d4.loss_dice: 0.3208 decode.d5.loss_cls: 0.0670 decode.d5.loss_mask: 0.0472 decode.d5.loss_dice: 0.3292 decode.d6.loss_cls: 0.0268 decode.d6.loss_mask: 0.0477 decode.d6.loss_dice: 0.3305 decode.d7.loss_cls: 0.0261 decode.d7.loss_mask: 0.0472 decode.d7.loss_dice: 0.3233 decode.d8.loss_cls: 0.0262 decode.d8.loss_mask: 0.0480 decode.d8.loss_dice: 0.3291 diff --git a/mmsegmentation/projects/Adabins/README.md b/mmsegmentation/projects/Adabins/README.md new file mode 100644 index 0000000..8a23e92 --- /dev/null +++ b/mmsegmentation/projects/Adabins/README.md @@ -0,0 +1,46 @@ +# AdaBins: Depth Estimation Using Adaptive Bins + +## Reference + +> [AdaBins: Depth Estimation Using Adaptive Bins](https://arxiv.org/abs/2011.14141) + +## Introduction + +Official Repo + +Code Snippet + +## Abstract + +We address the problem of estimating a high quality dense depth map from a single RGB input image. We start out with a baseline encoder-decoder convolutional neural network architecture and pose the question of how the global processing of information can help improve overall depth estimation. To this end, we propose a transformer-based architecture block that divides the depth range into bins whose center value is estimated adaptively per image. The final depth values are estimated as linear combinations of the bin centers. We call our new building block AdaBins. Our results show a decisive improvement over the state-of-the-art on several popular depth datasets across all metrics.We also validate the effectiveness of the proposed block with an ablation study and provide the code and corresponding pre-trained weights of the new state-of-the-art model. + +Our main contributions are the following: + +- We propose an architecture building block that performs global processing of the sceneโ€™s information.We propose to divide the predicted depth range into bins where the bin widths change per image. The final depth estimation is a linear combination of the bin center values. +- We show a decisive improvement for supervised single image depth estimation across all metrics for the two most popular datasets, NYU and KITTI. +- We analyze our findings and investigate different modifications on the proposed AdaBins block and study their effect on the accuracy of the depth estimation. + +

+ +
+ +## Performance + +### NYU and KITTI + +| Model | Encoder | Training epoch | Batchsize | Train Resolution | ฮด1 | ฮด2 | ฮด3 | REL | RMS | RMS log | params(M) | Links | +| ------------- | --------------- | -------------- | --------- | ---------------- | ----- | ----- | ----- | ----- | ----- | ------- | --------- | ----------------------------------------------------------------------------------------------------------------------- | +| AdaBins_nyu | EfficientNet-B5 | 25 | 16 | 416x544 | 0.903 | 0.984 | 0.997 | 0.103 | 0.364 | 0.044 | 78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/adabins/adabins_efficient_b5_nyu_third-party-f68d6bd3.pth) | +| AdaBins_kitti | EfficientNet-B5 | 25 | 16 | 352x764 | 0.964 | 0.995 | 0.999 | 0.058 | 2.360 | 0.088 | 78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/adabins/adabins_efficient-b5_kitty_third-party-a1aa6f36.pth) | + +## Citation + +```bibtex +@article{10.1109/cvpr46437.2021.00400, + author = {Bhat, S. A. and Alhashim, I. and Wonka, P.}, + title = {Adabins: depth estimation using adaptive bins}, + journal = {2021 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2021}, + doi = {10.1109/cvpr46437.2021.00400} +} +``` diff --git a/mmsegmentation/projects/Adabins/backbones/__init__.py b/mmsegmentation/projects/Adabins/backbones/__init__.py new file mode 100644 index 0000000..04ae180 --- /dev/null +++ b/mmsegmentation/projects/Adabins/backbones/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .adabins_backbone import AdabinsBackbone + +__all__ = ['AdabinsBackbone'] diff --git a/mmsegmentation/projects/Adabins/backbones/adabins_backbone.py b/mmsegmentation/projects/Adabins/backbones/adabins_backbone.py new file mode 100644 index 0000000..07d7380 --- /dev/null +++ b/mmsegmentation/projects/Adabins/backbones/adabins_backbone.py @@ -0,0 +1,141 @@ +import timm +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_conv_layer +from mmengine.model import BaseModule + +from mmseg.registry import MODELS + + +class UpSampleBN(nn.Module): + """ UpSample module + Args: + skip_input (int): the input feature + output_features (int): the output feature + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict, optional): The activation layer of AAM: + Aggregate Attention Module. + """ + + def __init__(self, + skip_input, + output_features, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='LeakyReLU')): + super().__init__() + + self._net = nn.Sequential( + ConvModule( + in_channels=skip_input, + out_channels=output_features, + kernel_size=3, + stride=1, + padding=1, + bias=True, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ), + ConvModule( + in_channels=output_features, + out_channels=output_features, + kernel_size=3, + stride=1, + padding=1, + bias=True, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + )) + + def forward(self, x, concat_with): + up_x = F.interpolate( + x, + size=[concat_with.size(2), + concat_with.size(3)], + mode='bilinear', + align_corners=True) + f = torch.cat([up_x, concat_with], dim=1) + return self._net(f) + + +class Encoder(nn.Module): + """ the efficientnet_b5 model + Args: + basemodel_name (str): the name of base model + """ + + def __init__(self, basemodel_name): + super().__init__() + self.original_model = timm.create_model( + basemodel_name, pretrained=True) + # Remove last layer + self.original_model.global_pool = nn.Identity() + self.original_model.classifier = nn.Identity() + + def forward(self, x): + features = [x] + for k, v in self.original_model._modules.items(): + if k == 'blocks': + for ki, vi in v._modules.items(): + features.append(vi(features[-1])) + else: + features.append(v(features[-1])) + return features + + +@MODELS.register_module() +class AdabinsBackbone(BaseModule): + """ the backbone of the adabins + Args: + basemodel_name (str):the name of base model + num_features (int): the middle feature + num_classes (int): the classes number + bottleneck_features (int): the bottleneck features + conv_cfg (dict): Config dict for convolution layer. + """ + + def __init__(self, + basemodel_name, + num_features=2048, + num_classes=128, + bottleneck_features=2048, + conv_cfg=dict(type='Conv')): + super().__init__() + self.encoder = Encoder(basemodel_name) + features = int(num_features) + self.conv2 = build_conv_layer( + conv_cfg, + bottleneck_features, + features, + kernel_size=1, + stride=1, + padding=1) + self.up1 = UpSampleBN( + skip_input=features // 1 + 112 + 64, output_features=features // 2) + self.up2 = UpSampleBN( + skip_input=features // 2 + 40 + 24, output_features=features // 4) + self.up3 = UpSampleBN( + skip_input=features // 4 + 24 + 16, output_features=features // 8) + self.up4 = UpSampleBN( + skip_input=features // 8 + 16 + 8, output_features=features // 16) + + self.conv3 = build_conv_layer( + conv_cfg, + features // 16, + num_classes, + kernel_size=3, + stride=1, + padding=1) + + def forward(self, x): + features = self.encoder(x) + x_block0, x_block1, x_block2, x_block3, x_block4 = features[ + 3], features[4], features[5], features[7], features[10] + x_d0 = self.conv2(x_block4) + x_d1 = self.up1(x_d0, x_block3) + x_d2 = self.up2(x_d1, x_block2) + x_d3 = self.up3(x_d2, x_block1) + x_d4 = self.up4(x_d3, x_block0) + out = self.conv3(x_d4) + return out diff --git a/mmsegmentation/projects/Adabins/configs/_base_/datasets/nyu.py b/mmsegmentation/projects/Adabins/configs/_base_/datasets/nyu.py new file mode 100644 index 0000000..1b49ec7 --- /dev/null +++ b/mmsegmentation/projects/Adabins/configs/_base_/datasets/nyu.py @@ -0,0 +1,32 @@ +dataset_type = 'NYUDataset' +data_root = 'data/nyu' + +test_pipeline = [ + dict(dict(type='LoadImageFromFile', to_float32=True)), + dict(dict(type='LoadDepthAnnotation', depth_rescale_factor=1e-3)), + dict( + type='PackSegInputs', + meta_keys=('img_path', 'depth_map_path', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'category_id')) +] + +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + test_mode=True, + data_prefix=dict( + img_path='images/test', depth_map_path='annotations/test'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict( + type='DepthMetric', max_depth_eval=10.0, crop_type='nyu_crop') +test_evaluator = val_evaluator +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') diff --git a/mmsegmentation/projects/Adabins/configs/_base_/default_runtime.py b/mmsegmentation/projects/Adabins/configs/_base_/default_runtime.py new file mode 100644 index 0000000..272b4d2 --- /dev/null +++ b/mmsegmentation/projects/Adabins/configs/_base_/default_runtime.py @@ -0,0 +1,15 @@ +default_scope = 'mmseg' +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +vis_backends = [dict(type='LocalVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +log_processor = dict(by_epoch=False) +log_level = 'INFO' +load_from = None +resume = False + +tta_model = dict(type='SegTTAModel') diff --git a/mmsegmentation/projects/Adabins/configs/_base_/models/Adabins.py b/mmsegmentation/projects/Adabins/configs/_base_/models/Adabins.py new file mode 100644 index 0000000..35cbd8c --- /dev/null +++ b/mmsegmentation/projects/Adabins/configs/_base_/models/Adabins.py @@ -0,0 +1,35 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='DepthEstimator', + data_preprocessor=data_preprocessor, + # pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='AdabinsBackbone', + basemodel_name='tf_efficientnet_b5_ap', + num_features=2048, + num_classes=128, + bottleneck_features=2048, + ), + decode_head=dict( + type='AdabinsHead', + in_channels=128, + n_query_channels=128, + patch_size=16, + embedding_dim=128, + num_heads=4, + n_bins=256, + min_val=0.001, + max_val=10, + norm='linear'), + + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_NYU_416x544.py b/mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_NYU_416x544.py new file mode 100644 index 0000000..5c00ea1 --- /dev/null +++ b/mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_NYU_416x544.py @@ -0,0 +1,15 @@ +_base_ = [ + '../_base_/models/Adabins.py', '../_base_/datasets/nyu.py', + '../_base_/default_runtime.py' +] +custom_imports = dict( + imports=['projects.Adabins.backbones', 'projects.Adabins.decode_head'], + allow_failed_imports=False) +crop_size = (416, 544) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(), + decode_head=dict(), +) diff --git a/mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_kitti_352x704.py b/mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_kitti_352x704.py new file mode 100644 index 0000000..330cdf4 --- /dev/null +++ b/mmsegmentation/projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_kitti_352x704.py @@ -0,0 +1,12 @@ +_base_ = ['../_base_/models/Adabins.py'] +custom_imports = dict( + imports=['projects.Adabins.backbones', 'projects.Adabins.decode_head'], + allow_failed_imports=False) +crop_size = (352, 704) +data_preprocessor = dict(size=crop_size) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(), + decode_head=dict(min_val=0.001, max_val=80), +) diff --git a/mmsegmentation/projects/Adabins/decode_head/__init__.py b/mmsegmentation/projects/Adabins/decode_head/__init__.py new file mode 100644 index 0000000..c7d62df --- /dev/null +++ b/mmsegmentation/projects/Adabins/decode_head/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .adabins_head import AdabinsHead + +__all__ = ['AdabinsHead'] diff --git a/mmsegmentation/projects/Adabins/decode_head/adabins_head.py b/mmsegmentation/projects/Adabins/decode_head/adabins_head.py new file mode 100644 index 0000000..ee04317 --- /dev/null +++ b/mmsegmentation/projects/Adabins/decode_head/adabins_head.py @@ -0,0 +1,179 @@ +from typing import List, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_conv_layer +from torch import Tensor + +from mmseg.registry import MODELS + + +class PatchTransformerEncoder(nn.Module): + """the Patch Transformer Encoder. + + Args: + in_channels (int): the channels of input + patch_size (int): the path size + embedding_dim (int): The feature dimension. + num_heads (int): the number of encoder head + conv_cfg (dict): Config dict for convolution layer. + """ + + def __init__(self, + in_channels, + patch_size=10, + embedding_dim=128, + num_heads=4, + conv_cfg=dict(type='Conv')): + super().__init__() + encoder_layers = nn.TransformerEncoderLayer( + embedding_dim, num_heads, dim_feedforward=1024) + self.transformer_encoder = nn.TransformerEncoder( + encoder_layers, num_layers=4) # takes shape S,N,E + + self.embedding_convPxP = build_conv_layer( + conv_cfg, + in_channels, + embedding_dim, + kernel_size=patch_size, + stride=patch_size) + self.positional_encodings = nn.Parameter( + torch.rand(500, embedding_dim), requires_grad=True) + + def forward(self, x): + embeddings = self.embedding_convPxP(x).flatten( + 2) # .shape = n,c,s = n, embedding_dim, s + embeddings = embeddings + self.positional_encodings[:embeddings.shape[ + 2], :].T.unsqueeze(0) + + # change to S,N,E format required by transformer + embeddings = embeddings.permute(2, 0, 1) + x = self.transformer_encoder(embeddings) # .shape = S, N, E + return x + + +class PixelWiseDotProduct(nn.Module): + """the pixel wise dot product.""" + + def __init__(self): + super().__init__() + + def forward(self, x, K): + n, c, h, w = x.size() + _, cout, ck = K.size() + assert c == ck, 'Number of channels in x and Embedding dimension ' \ + '(at dim 2) of K matrix must match' + y = torch.matmul( + x.view(n, c, h * w).permute(0, 2, 1), + K.permute(0, 2, 1)) # .shape = n, hw, cout + return y.permute(0, 2, 1).view(n, cout, h, w) + + +@MODELS.register_module() +class AdabinsHead(nn.Module): + """the head of the adabins,include mViT. + + Args: + in_channels (int):the channels of the input + n_query_channels (int):the channels of the query + patch_size (int): the patch size + embedding_dim (int):The feature dimension. + num_heads (int):the number of head + n_bins (int):the number of bins + min_val (float): the min width of bin + max_val (float): the max width of bin + conv_cfg (dict): Config dict for convolution layer. + norm (str): the activate method + align_corners (bool, optional): Geometrically, we consider the pixels + of the input and output as squares rather than points. + """ + + def __init__(self, + in_channels, + n_query_channels=128, + patch_size=16, + embedding_dim=128, + num_heads=4, + n_bins=100, + min_val=0.1, + max_val=10, + conv_cfg=dict(type='Conv'), + norm='linear', + align_corners=False, + threshold=0): + super().__init__() + self.out_channels = n_bins + self.align_corners = align_corners + self.norm = norm + self.num_classes = n_bins + self.min_val = min_val + self.max_val = max_val + self.n_query_channels = n_query_channels + self.patch_transformer = PatchTransformerEncoder( + in_channels, patch_size, embedding_dim, num_heads) + self.dot_product_layer = PixelWiseDotProduct() + self.threshold = threshold + self.conv3x3 = build_conv_layer( + conv_cfg, + in_channels, + embedding_dim, + kernel_size=3, + stride=1, + padding=1) + self.regressor = nn.Sequential( + nn.Linear(embedding_dim, 256), nn.LeakyReLU(), nn.Linear(256, 256), + nn.LeakyReLU(), nn.Linear(256, n_bins)) + self.conv_out = nn.Sequential( + build_conv_layer(conv_cfg, in_channels, n_bins, kernel_size=1), + nn.Softmax(dim=1)) + + def forward(self, x): + # n, c, h, w = x.size() + tgt = self.patch_transformer(x.clone()) # .shape = S, N, E + + x = self.conv3x3(x) + + regression_head, queries = tgt[0, + ...], tgt[1:self.n_query_channels + 1, + ...] + + # Change from S, N, E to N, S, E + queries = queries.permute(1, 0, 2) + range_attention_maps = self.dot_product_layer( + x, queries) # .shape = n, n_query_channels, h, w + + y = self.regressor(regression_head) # .shape = N, dim_out + if self.norm == 'linear': + y = torch.relu(y) + eps = 0.1 + y = y + eps + elif self.norm == 'softmax': + return torch.softmax(y, dim=1), range_attention_maps + else: + y = torch.sigmoid(y) + bin_widths_normed = y / y.sum(dim=1, keepdim=True) + out = self.conv_out(range_attention_maps) + + bin_widths = (self.max_val - + self.min_val) * bin_widths_normed # .shape = N, dim_out + bin_widths = F.pad( + bin_widths, (1, 0), mode='constant', value=self.min_val) + bin_edges = torch.cumsum(bin_widths, dim=1) + + centers = 0.5 * (bin_edges[:, :-1] + bin_edges[:, 1:]) + n, dim_out = centers.size() + centers = centers.view(n, dim_out, 1, 1) + + pred = torch.sum(out * centers, dim=1, keepdim=True) + return bin_edges, pred + + def predict(self, inputs: Tuple[Tensor], batch_img_metas: List[dict], + test_cfg, **kwargs) -> Tensor: + """Forward function for testing, only ``pam_cam`` is used.""" + pred = self.forward(inputs)[-1] + final = torch.clamp(pred, self.min_val, self.max_val) + + final[torch.isinf(final)] = self.max_val + final[torch.isnan(final)] = self.min_val + return final diff --git a/mmsegmentation/projects/CAT-Seg/README.md b/mmsegmentation/projects/CAT-Seg/README.md new file mode 100644 index 0000000..890e461 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/README.md @@ -0,0 +1,92 @@ +# CAT-Seg + +> [CAT-Seg: Cost Aggregation for Open-Vocabulary Semantic Segmentation](https://arxiv.org/abs/2303.11797) + +## Introduction + + + +Official Repo + +Code Snippet + +## Abstract + + + +Existing works on open-vocabulary semantic segmentation have utilized large-scale vision-language models, such as CLIP, to leverage their exceptional open-vocabulary recognition capabilities. However, the problem of transferring these capabilities learned from image-level supervision to the pixel-level task of segmentation and addressing arbitrary unseen categories at inference makes this task challenging. To address these issues, we aim to attentively relate objects within an image to given categories by leveraging relational information among class categories and visual semantics through aggregation, while also adapting the CLIP representations to the pixel-level task. However, we observe that direct optimization of the CLIP embeddings can harm its open-vocabulary capabilities. In this regard, we propose an alternative approach to optimize the imagetext similarity map, i.e. the cost map, using a novel cost aggregation-based method. Our framework, namely CATSeg, achieves state-of-the-art performance across all benchmarks. We provide extensive ablation studies to validate our choices. [Project page](https://ku-cvlab.github.io/CAT-Seg). + + + +
+CAT-Seg +CAT-Seg model structure +
+ +## Usage + +CAT-Seg model training needs pretrained `CLIP` model. We have implemented `ViT-B` and `ViT-L` based `CLIP` model. To further use `ViT-bigG` or `ViT-H` ones, you need additional dependencies. Please install [open_clip](https://github.com/mlfoundations/open_clip) first. The pretrained `CLIP` model state dicts are loaded from [Huggingface-OpenCLIP](https://huggingface.co/models?library=open_clip). **If you come up with `ConnectionError` when downloading CLIP weights**, you can manually download them from the given repo and use `custom_clip_weights=/path/to/you/folder` of backbone in config file. Related tools are as shown in [requirements/optional.txt](requirements/optional.txt): + +```shell +pip install ftfy==6.0.1 +pip install huggingface-hub +pip install regex +``` + +In addition to the necessary [data preparation](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md), you also need class texts for clip text encoder. Please download the class text json file first [cls_texts](https://github.com/open-mmlab/mmsegmentation/files/11714914/cls_texts.zip) and arrange the folder as follows: + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ VOCdevkit +โ”‚ โ”‚ โ”œโ”€โ”€ VOC2012 +โ”‚ โ”‚ โ”œโ”€โ”€ VOC2010 +โ”‚ โ”‚ โ”œโ”€โ”€ VOCaug +โ”‚ โ”œโ”€โ”€ ade +โ”‚ โ”œโ”€โ”€ coco_stuff164k +โ”‚ โ”œโ”€โ”€ coco.json +โ”‚ โ”œโ”€โ”€ pc59.json +โ”‚ โ”œโ”€โ”€ pc459.json +โ”‚ โ”œโ”€โ”€ ade150.json +โ”‚ โ”œโ”€โ”€ ade847.json +โ”‚ โ”œโ”€โ”€ voc20b.json +โ”‚ โ”œโ”€โ”€ voc20.json +``` + +```shell +# setup PYTHONPATH +export PYTHONPATH=`pwd`:$PYTHONPATH +# run evaluation +mim test mmsegmentation ${CONFIG} --checkpoint ${CHECKPOINT} --launcher pytorch --gpus=8 +``` + +## Results and models + +### ADE20K-150-ZeroShot + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | Device | mIoU | mIoU(ms+flip) | config | download | +| ------- | ------------- | --------- | ------- | -------: | -------------- | ------- | ---- | ------------: | ------------------------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------- | +| CAT-Seg | R-101 & ViT-B | 384x384 | 80000 | - | - | RTX3090 | 27.2 | - | [config](./configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_ade20k-384x384.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_ade20k-384x384-54194d72.pth) | + +Note: + +- All experiments of CAT-Seg are implemented with 4 RTX3090 GPUs, except the last one with pretrained ViT-bigG CLIP model (GPU Memory insufficient, you may need A100). +- Due to the feature size bottleneck of the CLIP image encoder, the inference and testing can only be done under `slide` mode, the inference time is longer since the test size is much more bigger that training size of `(384, 384)`. +- The ResNet backbones utilized in CAT-Seg models are standard `ResNet` rather than `ResNetV1c`. +- The zero-shot segmentation results on PASCAL VOC and ADE20K are from the original paper. Our results are coming soon. We appreatiate your contribution! +- In additional to zero-shot segmentation performance results, we also provided the evaluation results on the `val2017` set of **COCO-stuff164k** for reference, which is the training dataset of CAT-Seg. The testing was done **without TTA**. +- The number behind the dataset name is the category number for segmentation evaluation (except training data **COCO-stuff 164k**). **PASCAL VOC-20b** defines the "background" as classes present in **PASCAL-Context-59** but not in **PASCAL VOC-20**. + +## Citation + +```bibtex +@inproceedings{cheng2021mask2former, + title={CAT-Seg: Cost Aggregation for Open-Vocabulary Semantic Segmentation}, + author={Seokju Cho and Heeseong Shin and Sunghwan Hong and Seungjun An and Seungjun Lee and Anurag Arnab and Paul Hongsuck Seo and Seungryong Kim}, + journal={CVPR}, + year={2023} +} +``` diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/__init__.py b/mmsegmentation/projects/CAT-Seg/cat_seg/__init__.py new file mode 100644 index 0000000..2c51fba --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/__init__.py @@ -0,0 +1,2 @@ +from .models import * # noqa: F401,F403 +from .utils import * # noqa: F401,F403 diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/models/__init__.py b/mmsegmentation/projects/CAT-Seg/cat_seg/models/__init__.py new file mode 100644 index 0000000..cd0e15d --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/models/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .cat_aggregator import (AggregatorLayer, CATSegAggregator, + ClassAggregateLayer, SpatialAggregateLayer) +from .cat_head import CATSegHead +from .clip_ovseg import CLIPOVCATSeg + +__all__ = [ + 'AggregatorLayer', 'CATSegAggregator', 'ClassAggregateLayer', + 'SpatialAggregateLayer', 'CATSegHead', 'CLIPOVCATSeg' +] diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_aggregator.py b/mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_aggregator.py new file mode 100644 index 0000000..a0483fe --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_aggregator.py @@ -0,0 +1,763 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import build_norm_layer +from mmcv.cnn.bricks.transformer import FFN, build_dropout +from mmengine.model import BaseModule +from mmengine.utils import to_2tuple + +from mmseg.registry import MODELS +from ..utils import FullAttention, LinearAttention + + +class AGWindowMSA(BaseModule): + """Appearance Guidance Window based multi-head self-attention (W-MSA) + module with relative position bias. + + Args: + embed_dims (int): Number of input channels. + appearance_dims (int): Number of appearance guidance feature channels. + num_heads (int): Number of attention heads. + window_size (tuple[int]): The height and width of the window. + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Default: 0.0 + proj_drop_rate (float, optional): Dropout ratio of output. Default: 0. + init_cfg (dict | None, optional): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + appearance_dims, + num_heads, + window_size, + qkv_bias=True, + qk_scale=None, + attn_drop_rate=0., + proj_drop_rate=0., + init_cfg=None): + + super().__init__(init_cfg=init_cfg) + self.embed_dims = embed_dims + self.appearance_dims = appearance_dims + self.window_size = window_size # Wh, Ww + self.num_heads = num_heads + head_embed_dims = embed_dims // num_heads + self.scale = qk_scale or head_embed_dims**-0.5 + + # About 2x faster than original impl + Wh, Ww = self.window_size + rel_index_coords = self.double_step_seq(2 * Ww - 1, Wh, 1, Ww) + rel_position_index = rel_index_coords + rel_index_coords.T + rel_position_index = rel_position_index.flip(1).contiguous() + self.register_buffer('relative_position_index', rel_position_index) + + self.qk = nn.Linear( + embed_dims + appearance_dims, embed_dims * 2, bias=qkv_bias) + self.v = nn.Linear(embed_dims, embed_dims, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop_rate) + self.proj = nn.Linear(embed_dims, embed_dims) + self.proj_drop = nn.Dropout(proj_drop_rate) + + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x, mask=None): + """ + Args: + x (tensor): input features with shape of (num_windows*B, N, C), + C = embed_dims + appearance_dims. + mask (tensor | None, Optional): mask with shape of (num_windows, + Wh*Ww, Wh*Ww), value should be between (-inf, 0]. + """ + B, N, _ = x.shape + qk = self.qk(x).reshape(B, N, 2, self.num_heads, + self.embed_dims // self.num_heads).permute( + 2, 0, 3, 1, + 4) # 2 B NUM_HEADS N embed_dims//NUM_HEADS + v = self.v(x[:, :, :self.embed_dims]).reshape( + B, N, self.num_heads, self.embed_dims // self.num_heads).permute( + 0, 2, 1, 3) # B NUM_HEADS N embed_dims//NUM_HEADS + # make torchscript happy (cannot use tensor as tuple) + q, k = qk[0], qk[1] + + q = q * self.scale + attn = (q @ k.transpose(-2, -1)) + + if mask is not None: + nW = mask.shape[0] + attn = attn.view(B // nW, nW, self.num_heads, N, + N) + mask.unsqueeze(1).unsqueeze(0) + attn = attn.view(-1, self.num_heads, N, N) + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, self.embed_dims) + x = self.proj(x) + x = self.proj_drop(x) + return x + + @staticmethod + def double_step_seq(step1, len1, step2, len2): + """Double step sequence.""" + seq1 = torch.arange(0, step1 * len1, step1) + seq2 = torch.arange(0, step2 * len2, step2) + return (seq1[:, None] + seq2[None, :]).reshape(1, -1) + + +class AGShiftWindowMSA(BaseModule): + """Appearance Guidance Shifted Window Multihead Self-Attention Module. + + Args: + embed_dims (int): Number of input channels. + appearance_dims (int): Number of appearance guidance channels + num_heads (int): Number of attention heads. + window_size (int): The height and width of the window. + shift_size (int, optional): The shift step of each window towards + right-bottom. If zero, act as regular window-msa. Defaults to 0. + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Defaults: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Defaults: 0. + proj_drop_rate (float, optional): Dropout ratio of output. + Defaults: 0. + dropout_layer (dict, optional): The dropout_layer used before output. + Defaults: dict(type='DropPath', drop_prob=0.). + init_cfg (dict, optional): The extra config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + appearance_dims, + num_heads, + window_size, + shift_size=0, + qkv_bias=True, + qk_scale=None, + attn_drop_rate=0, + proj_drop_rate=0, + dropout_layer=dict(type='DropPath', drop_prob=0.), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.window_size = window_size + self.shift_size = shift_size + assert 0 <= self.shift_size < self.window_size + + self.w_msa = AGWindowMSA( + embed_dims=embed_dims, + appearance_dims=appearance_dims, + num_heads=num_heads, + window_size=to_2tuple(window_size), + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop_rate=attn_drop_rate, + proj_drop_rate=proj_drop_rate, + init_cfg=None) + + self.drop = build_dropout(dropout_layer) + + def forward(self, query, hw_shape): + """ + Args: + query: The input query. + hw_shape: The shape of the feature height and width. + """ + B, L, C = query.shape + H, W = hw_shape + assert L == H * W, 'input feature has wrong size' + query = query.view(B, H, W, C) + + # pad feature maps to multiples of window size + pad_r = (self.window_size - W % self.window_size) % self.window_size + pad_b = (self.window_size - H % self.window_size) % self.window_size + query = F.pad(query, (0, 0, 0, pad_r, 0, pad_b)) + H_pad, W_pad = query.shape[1], query.shape[2] + + # cyclic shift + if self.shift_size > 0: + shifted_query = torch.roll( + query, + shifts=(-self.shift_size, -self.shift_size), + dims=(1, 2)) + + # calculate attention mask for SW-MSA + img_mask = torch.zeros((1, H_pad, W_pad, 1), device=query.device) + h_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + w_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + cnt = 0 + for h in h_slices: + for w in w_slices: + img_mask[:, h, w, :] = cnt + cnt += 1 + + # nW, window_size, window_size, 1 + mask_windows = self.window_partition(img_mask) + mask_windows = mask_windows.view( + -1, self.window_size * self.window_size) + attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) + attn_mask = attn_mask.masked_fill(attn_mask != 0, + float(-100.0)).masked_fill( + attn_mask == 0, float(0.0)) + else: + shifted_query = query + attn_mask = None + + # nW*B, window_size, window_size, C + query_windows = self.window_partition(shifted_query) + # nW*B, window_size*window_size, C + query_windows = query_windows.view(-1, self.window_size**2, C) + + # W-MSA/SW-MSA (nW*B, window_size*window_size, C) + attn_windows = self.w_msa(query_windows, mask=attn_mask) + + # merge windows + attn_windows = attn_windows.view(-1, self.window_size, + self.window_size, + self.w_msa.embed_dims) + + # B H' W' self.w_msa.embed_dims + shifted_x = self.window_reverse(attn_windows, H_pad, W_pad) + # reverse cyclic shift + if self.shift_size > 0: + x = torch.roll( + shifted_x, + shifts=(self.shift_size, self.shift_size), + dims=(1, 2)) + else: + x = shifted_x + + if pad_r > 0 or pad_b: + x = x[:, :H, :W, :].contiguous() + + x = x.view(B, H * W, self.w_msa.embed_dims) + + x = self.drop(x) + return x + + def window_reverse(self, windows, H, W): + """ + Args: + windows: (num_windows*B, window_size, window_size, C) + H (int): Height of image + W (int): Width of image + Returns: + x: (B, H, W, C) + """ + window_size = self.window_size + B = int(windows.shape[0] / (H * W / window_size / window_size)) + x = windows.view(B, H // window_size, W // window_size, window_size, + window_size, -1) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) + return x + + def window_partition(self, x): + """ + Args: + x: (B, H, W, C) + Returns: + windows: (num_windows*B, window_size, window_size, C) + """ + B, H, W, C = x.shape + window_size = self.window_size + x = x.view(B, H // window_size, window_size, W // window_size, + window_size, C) + windows = x.permute(0, 1, 3, 2, 4, 5).contiguous() + windows = windows.view(-1, window_size, window_size, C) + return windows + + +class AGSwinBlock(BaseModule): + """Appearance Guidance Swin Transformer Block. + + Args: + embed_dims (int): The feature dimension. + appearance_dims (int): The appearance guidance dimension. + num_heads (int): Parallel attention heads. + mlp_ratios (int): The hidden dimension ratio w.r.t. embed_dims + for FFNs. + window_size (int, optional): The local window scale. + Default: 7. + shift (bool, optional): whether to shift window or not. + Default False. + qkv_bias (bool, optional): enable bias for qkv if True. + Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + drop_rate (float, optional): Dropout rate. Default: 0. + attn_drop_rate (float, optional): Attention dropout rate. + Default: 0. + drop_path_rate (float, optional): Stochastic depth rate. + Default: 0. + act_cfg (dict, optional): The config dict of activation function. + Default: dict(type='GELU'). + norm_cfg (dict, optional): The config dict of normalization. + Default: dict(type='LN'). + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__(self, + embed_dims, + appearance_dims, + num_heads, + mlp_ratios=4, + window_size=7, + shift=False, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1] + self.attn = AGShiftWindowMSA( + embed_dims=embed_dims, + appearance_dims=appearance_dims, + num_heads=num_heads, + window_size=window_size, + shift_size=window_size // 2 if shift else 0, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop_rate=attn_drop_rate, + proj_drop_rate=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + init_cfg=None) + + self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1] + self.ffn = FFN( + embed_dims=embed_dims, + feedforward_channels=embed_dims * mlp_ratios, + num_fcs=2, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + act_cfg=act_cfg, + add_identity=True, + init_cfg=None) + + def forward(self, inputs, hw_shape): + """ + Args: + inputs (list[Tensor]): appearance_guidance (B, H, W, C); + x (B, L, C) + hw_shape (tuple[int]): shape of feature. + """ + x, appearance_guidance = inputs + B, L, C = x.shape + H, W = hw_shape + assert L == H * W, 'input feature has wrong size' + + identity = x + x = self.norm1(x) + + # appearance guidance + x = x.view(B, H, W, C) + if appearance_guidance is not None: + x = torch.cat([x, appearance_guidance], dim=-1).flatten(1, 2) + + x = self.attn(x, hw_shape) + + x = x + identity + + identity = x + x = self.norm2(x) + x = self.ffn(x, identity=identity) + + return x + + +@MODELS.register_module() +class SpatialAggregateLayer(BaseModule): + """Spatial aggregation layer of CAT-Seg. + + Args: + embed_dims (int): The feature dimension. + appearance_dims (int): The appearance guidance dimension. + num_heads (int): Parallel attention heads. + mlp_ratios (int): The hidden dimension ratio w.r.t. embed_dims + for FFNs. + window_size (int, optional): The local window scale. Default: 7. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__(self, + embed_dims, + appearance_dims, + num_heads, + mlp_ratios, + window_size=7, + qk_scale=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.block_1 = AGSwinBlock( + embed_dims, + appearance_dims, + num_heads, + mlp_ratios, + window_size=window_size, + shift=False, + qk_scale=qk_scale) + self.block_2 = AGSwinBlock( + embed_dims, + appearance_dims, + num_heads, + mlp_ratios, + window_size=window_size, + shift=True, + qk_scale=qk_scale) + self.guidance_norm = nn.LayerNorm( + appearance_dims) if appearance_dims > 0 else None + + def forward(self, x, appearance_guidance): + """ + Args: + x (torch.Tensor): B C T H W. + appearance_guidance (torch.Tensor): B C H W. + """ + B, C, T, H, W = x.shape + x = x.permute(0, 2, 3, 4, 1).flatten(0, 1).flatten(1, 2) # BT, HW, C + if appearance_guidance is not None: + appearance_guidance = appearance_guidance.repeat( + T, 1, 1, 1).permute(0, 2, 3, 1) # BT, HW, C + appearance_guidance = self.guidance_norm(appearance_guidance) + else: + assert self.appearance_dims == 0 + x = self.block_1((x, appearance_guidance), (H, W)) + x = self.block_2((x, appearance_guidance), (H, W)) + x = x.transpose(1, 2).reshape(B, T, C, -1) + x = x.transpose(1, 2).reshape(B, C, T, H, W) + return x + + +class AttentionLayer(nn.Module): + """Attention layer for ClassAggregration of CAT-Seg. + + Source: https://github.com/KU-CVLAB/CAT-Seg/blob/main/cat_seg/modeling/transformer/model.py#L310 # noqa + """ + + def __init__(self, + hidden_dim, + guidance_dim, + nheads=8, + attention_type='linear'): + super().__init__() + self.nheads = nheads + self.q = nn.Linear(hidden_dim + guidance_dim, hidden_dim) + self.k = nn.Linear(hidden_dim + guidance_dim, hidden_dim) + self.v = nn.Linear(hidden_dim, hidden_dim) + + if attention_type == 'linear': + self.attention = LinearAttention() + elif attention_type == 'full': + self.attention = FullAttention() + else: + raise NotImplementedError + + def forward(self, x, guidance=None): + """ + Args: + x: B*H_p*W_p, T, C + guidance: B*H_p*W_p, T, C + """ + B, L, _ = x.shape + q = self.q(torch.cat([x, guidance], + dim=-1)) if guidance is not None else self.q(x) + k = self.k(torch.cat([x, guidance], + dim=-1)) if guidance is not None else self.k(x) + v = self.v(x) + + q = q.reshape(B, L, self.nheads, -1) + k = k.reshape(B, L, self.nheads, -1) + v = v.reshape(B, L, self.nheads, -1) + + out = self.attention(q, k, v) + out = out.reshape(B, L, -1) + return out + + +@MODELS.register_module() +class ClassAggregateLayer(BaseModule): + """Class aggregation layer of CAT-Seg. + + Args: + hidden_dims (int): The feature dimension. + guidance_dims (int): The appearance guidance dimension. + num_heads (int): Parallel attention heads. + attention_type (str): Type of attention layer. Default: 'linear'. + pooling_size (tuple[int] | list[int]): Pooling size. + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__( + self, + hidden_dims=64, + guidance_dims=64, + num_heads=8, + attention_type='linear', + pooling_size=(4, 4), + init_cfg=None, + ): + super().__init__(init_cfg=init_cfg) + self.pool = nn.AvgPool2d(pooling_size) + self.attention = AttentionLayer( + hidden_dims, + guidance_dims, + nheads=num_heads, + attention_type=attention_type) + self.MLP = FFN( + embed_dims=hidden_dims, + feedforward_channels=hidden_dims * 4, + num_fcs=2) + self.norm1 = nn.LayerNorm(hidden_dims) + self.norm2 = nn.LayerNorm(hidden_dims) + + def pool_features(self, x): + """Intermediate pooling layer for computational efficiency. + + Args: + x: B, C, T, H, W + """ + B, C, T, H, W = x.shape + x = x.transpose(1, 2).reshape(-1, C, H, W) + x = self.pool(x) + *_, H_, W_ = x.shape + x = x.reshape(B, T, C, H_, W_).transpose(1, 2) + return x + + def forward(self, x, guidance): + """ + Args: + x: B, C, T, H, W + guidance: B, T, C + """ + B, C, T, H, W = x.size() + x_pool = self.pool_features(x) + *_, H_pool, W_pool = x_pool.size() + + x_pool = x_pool.permute(0, 3, 4, 2, 1).reshape(-1, T, C) + # B*H_p*W_p T C + if guidance is not None: + guidance = guidance.repeat(H_pool * W_pool, 1, 1) + + x_pool = x_pool + self.attention(self.norm1(x_pool), + guidance) # Attention + x_pool = x_pool + self.MLP(self.norm2(x_pool)) # MLP + + x_pool = x_pool.reshape(B, H_pool * W_pool, T, + C).permute(0, 2, 3, 1).reshape( + B, T, C, H_pool, + W_pool).flatten(0, 1) # BT C H_p W_p + x_pool = F.interpolate( + x_pool, size=(H, W), mode='bilinear', align_corners=True) + x_pool = x_pool.reshape(B, T, C, H, W).transpose(1, 2) # B C T H W + x = x + x_pool # Residual + + return x + + +@MODELS.register_module() +class AggregatorLayer(BaseModule): + """Single Aggregator Layer of CAT-Seg.""" + + def __init__(self, + embed_dims=64, + text_guidance_dims=512, + appearance_guidance_dims=512, + num_heads=4, + mlp_ratios=4, + window_size=7, + attention_type='linear', + pooling_size=(2, 2), + init_cfg=None) -> None: + super().__init__(init_cfg=init_cfg) + self.spatial_agg = SpatialAggregateLayer( + embed_dims, + appearance_guidance_dims, + num_heads=num_heads, + mlp_ratios=mlp_ratios, + window_size=window_size) + self.class_agg = ClassAggregateLayer( + embed_dims, + text_guidance_dims, + num_heads=num_heads, + attention_type=attention_type, + pooling_size=pooling_size) + + def forward(self, x, appearance_guidance, text_guidance): + """ + Args: + x: B C T H W + """ + x = self.spatial_agg(x, appearance_guidance) + x = self.class_agg(x, text_guidance) + return x + + +@MODELS.register_module() +class CATSegAggregator(BaseModule): + """CATSeg Aggregator. + + This Aggregator is the mmseg implementation of + `CAT-Seg `_. + + Args: + text_guidance_dim (int): Text guidance dimensions. Default: 512. + text_guidance_proj_dim (int): Text guidance projection dimensions. + Default: 128. + appearance_guidance_dim (int): Appearance guidance dimensions. + Default: 512. + appearance_guidance_proj_dim (int): Appearance guidance projection + dimensions. Default: 128. + num_layers (int): Aggregator layer number. Default: 4. + num_heads (int): Attention layer head number. Default: 4. + embed_dims (int): Input feature dimensions. Default: 128. + pooling_size (tuple | list): Pooling size of the class aggregator + layer. Default: (6, 6). + mlp_ratios (int): The hidden dimension ratio w.r.t. input dimension. + Default: 4. + window_size (int): Swin block window size. Default:12. + attention_type (str): Attention type of class aggregator layer. + Default:'linear'. + prompt_channel (int): Prompt channels. Default: 80. + """ + + def __init__(self, + text_guidance_dim=512, + text_guidance_proj_dim=128, + appearance_guidance_dim=512, + appearance_guidance_proj_dim=128, + num_layers=4, + num_heads=4, + embed_dims=128, + pooling_size=(6, 6), + mlp_ratios=4, + window_size=12, + attention_type='linear', + prompt_channel=80, + **kwargs): + super().__init__(**kwargs) + self.num_layers = num_layers + self.embed_dims = embed_dims + + self.layers = nn.ModuleList([ + AggregatorLayer( + embed_dims=embed_dims, + text_guidance_dims=text_guidance_proj_dim, + appearance_guidance_dims=appearance_guidance_proj_dim, + num_heads=num_heads, + mlp_ratios=mlp_ratios, + window_size=window_size, + attention_type=attention_type, + pooling_size=pooling_size) for _ in range(num_layers) + ]) + + self.conv1 = nn.Conv2d( + prompt_channel, embed_dims, kernel_size=7, stride=1, padding=3) + + self.guidance_projection = nn.Sequential( + nn.Conv2d( + appearance_guidance_dim, + appearance_guidance_proj_dim, + kernel_size=3, + stride=1, + padding=1), + nn.ReLU(), + ) if appearance_guidance_dim > 0 else None + + self.text_guidance_projection = nn.Sequential( + nn.Linear(text_guidance_dim, text_guidance_proj_dim), + nn.ReLU(), + ) if text_guidance_dim > 0 else None + + def feature_map(self, img_feats, text_feats): + """Concatenation type cost volume. + + For ablation study of cost volume type. + """ + img_feats = F.normalize(img_feats, dim=1) # B C H W + img_feats = img_feats.unsqueeze(2).repeat(1, 1, text_feats.shape[1], 1, + 1) + text_feats = F.normalize(text_feats, dim=-1) # B T P C + text_feats = text_feats.mean(dim=-2) + text_feats = F.normalize(text_feats, dim=-1) # B T C + text_feats = text_feats.unsqueeze(-1).unsqueeze(-1).repeat( + 1, 1, 1, img_feats.shape[-2], img_feats.shape[-1]).transpose(1, 2) + return torch.cat((img_feats, text_feats), dim=1) # B 2C T H W + + def correlation(self, img_feats, text_feats): + """Correlation of image features and text features.""" + img_feats = F.normalize(img_feats, dim=1) # B C H W + text_feats = F.normalize(text_feats, dim=-1) # B T P C + corr = torch.einsum('bchw, btpc -> bpthw', img_feats, text_feats) + return corr + + def corr_embed(self, x): + """Correlation embeddings encoding.""" + B = x.shape[0] + corr_embed = x.permute(0, 2, 1, 3, 4).flatten(0, 1) + corr_embed = self.conv1(corr_embed) + corr_embed = corr_embed.reshape(B, -1, self.embed_dims, x.shape[-2], + x.shape[-1]).transpose(1, 2) + return corr_embed + + def forward(self, inputs): + """ + Args: + inputs (dict): including the following keys, + 'appearance_feat': list[torch.Tensor], w.r.t. out_indices of + `self.feature_extractor`. + 'clip_text_feat': the text feature extracted by clip text + encoder. + 'clip_text_feat_test': the text feature extracted by clip text + encoder for testing. + 'clip_img_feat': the image feature extracted clip image + encoder. + """ + img_feats = inputs['clip_img_feat'] + B = img_feats.size(0) + appearance_guidance = inputs[ + 'appearance_feat'][::-1] # order (out_indices) 2, 1, 0 + text_feats = inputs['clip_text_feat'] if self.training else inputs[ + 'clip_text_feat_test'] + text_feats = text_feats.repeat(B, 1, 1, 1) + + corr = self.correlation(img_feats, text_feats) + # corr = self.feature_map(img_feats, text_feats) + corr_embed = self.corr_embed(corr) + + projected_guidance, projected_text_guidance = None, None + + if self.guidance_projection is not None: + projected_guidance = self.guidance_projection( + appearance_guidance[0]) + + if self.text_guidance_projection is not None: + text_feats = text_feats.mean(dim=-2) + text_feats = text_feats / text_feats.norm(dim=-1, keepdim=True) + projected_text_guidance = self.text_guidance_projection(text_feats) + + for layer in self.layers: + corr_embed = layer(corr_embed, projected_guidance, + projected_text_guidance) + + return dict( + corr_embed=corr_embed, appearance_feats=appearance_guidance[1:]) diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_head.py b/mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_head.py new file mode 100644 index 0000000..36bb1c5 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/models/cat_head.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.registry import MODELS + + +class UpBlock(nn.Module): + """Upsample Block with two consecutive convolution layers.""" + + def __init__(self, in_channels, out_channels, guidance_channels): + super().__init__() + self.up = nn.ConvTranspose2d( + in_channels, + in_channels - guidance_channels, + kernel_size=2, + stride=2) + self.conv1 = ConvModule( + in_channels, + out_channels, + 3, + padding=1, + bias=False, + norm_cfg=dict(type='GN', num_groups=out_channels // 16)) + self.conv2 = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + bias=False, + norm_cfg=dict(type='GN', num_groups=out_channels // 16)) + + def forward(self, x, guidance=None): + """Forward function with visual guidance.""" + x = self.up(x) + if guidance is not None: + T = x.size(0) // guidance.size(0) + # guidance = repeat(guidance, "B C H W -> (B T) C H W", T=T) + guidance = guidance.repeat(T, 1, 1, 1) + x = torch.cat([x, guidance], dim=1) + x = self.conv1(x) + + return self.conv2(x) + + +@MODELS.register_module() +class CATSegHead(BaseDecodeHead): + """CATSeg Head. + + This segmentation head is the mmseg implementation of + `CAT-Seg `_. + + Args: + embed_dims (int): The number of input dimensions. + decoder_dims (list): The number of decoder dimensions. + decoder_guidance_proj_dims (list): The number of appearance + guidance dimensions. + init_cfg + """ + + def __init__(self, + embed_dims=128, + decoder_dims=(64, 32), + decoder_guidance_dims=(256, 128), + decoder_guidance_proj_dims=(32, 16), + **kwargs): + super().__init__(**kwargs) + self.decoder_guidance_projection = nn.ModuleList([ + nn.Sequential( + nn.Conv2d( + dec_dims, + dec_dims_proj, + kernel_size=3, + stride=1, + padding=1), + nn.ReLU(), + ) for dec_dims, dec_dims_proj in zip(decoder_guidance_dims, + decoder_guidance_proj_dims) + ]) if decoder_guidance_dims[0] > 0 else None + + self.decoder1 = UpBlock(embed_dims, decoder_dims[0], + decoder_guidance_proj_dims[0]) + self.decoder2 = UpBlock(decoder_dims[0], decoder_dims[1], + decoder_guidance_proj_dims[1]) + self.conv_seg = nn.Conv2d( + decoder_dims[1], 1, kernel_size=3, stride=1, padding=1) + + def forward(self, inputs): + """Forward function. + + Args: + inputs (dict): Input features including the following features, + corr_embed: aggregated correlation embeddings. + appearance_feats: decoder appearance feature guidance. + """ + # decoder guidance projection + if self.decoder_guidance_projection is not None: + projected_decoder_guidance = [ + proj(g) for proj, g in zip(self.decoder_guidance_projection, + inputs['appearance_feats']) + ] + + # decoder layers + B = inputs['corr_embed'].size(0) + corr_embed = inputs['corr_embed'].transpose(1, 2).flatten(0, 1) + corr_embed = self.decoder1(corr_embed, projected_decoder_guidance[0]) + corr_embed = self.decoder2(corr_embed, projected_decoder_guidance[1]) + + output = self.cls_seg(corr_embed) + + # rearrange the output to (B, T, H, W) + H_ori, W_ori = output.shape[-2:] + output = output.reshape(B, -1, H_ori, W_ori) + return output diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/models/clip_ovseg.py b/mmsegmentation/projects/CAT-Seg/cat_seg/models/clip_ovseg.py new file mode 100644 index 0000000..cb67744 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/models/clip_ovseg.py @@ -0,0 +1,293 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import json +import os +from typing import List + +import torch +import torch.nn.functional as F +from huggingface_hub.utils._errors import LocalEntryNotFoundError +from mmengine.model import BaseModule + +from mmseg.registry import MODELS +from mmseg.utils import ConfigType +from ..utils import clip_wrapper +from ..utils.clip_templates import (IMAGENET_TEMPLATES, + IMAGENET_TEMPLATES_SELECT) + + +@MODELS.register_module() +class CLIPOVCATSeg(BaseModule): + """CLIP based Open Vocabulary CAT-Seg model backbone. + + This backbone is the modified implementation of `CAT-Seg Backbone + `_. It combines the CLIP model and + another feature extractor, a.k.a the appearance guidance extractor + in the original `CAT-Seg`. + + Args: + feature_extractor (ConfigType): Appearance guidance extractor + config dict. + train_class_json (str): The training class json file. + test_class_json (str): The path to test class json file. + clip_pretrained (str): The pre-trained clip type. + clip_finetune (str): The finetuning settings of clip model. + custom_clip_weights (str): The custmized clip weights directory. When + encountering huggingface model download errors, you can manually + download the pretrained weights. + backbone_multiplier (float): The learning rate multiplier. + Default: 0.01. + prompt_depth (int): The prompt depth. Default: 0. + prompt_length (int): The prompt length. Default: 0. + prompt_ensemble_type (str): The prompt ensemble type. + Default: "imagenet". + pixel_mean (List[float]): The pixel mean for feature extractor. + pxiel_std (List[float]): The pixel std for feature extractor. + clip_pixel_mean (List[float]): The pixel mean for clip model. + clip_pxiel_std (List[float]): The pixel std for clip model. + clip_img_feat_size: (List[int]: Clip image embedding size from + image encoder. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__( + self, + feature_extractor: ConfigType, + train_class_json: str, + test_class_json: str, + clip_pretrained: str, + clip_finetune: str, + custom_clip_weights: str = None, + backbone_multiplier=0.01, + prompt_depth: int = 0, + prompt_length: int = 0, + prompt_ensemble_type: str = 'imagenet', + pixel_mean: List[float] = [123.675, 116.280, 103.530], + pixel_std: List[float] = [58.395, 57.120, 57.375], + clip_pixel_mean: List[float] = [ + 122.7709383, 116.7460125, 104.09373615 + ], + clip_pixel_std: List[float] = [68.5005327, 66.6321579, 70.3231630], + clip_img_feat_size: List[int] = [24, 24], + init_cfg=None): + super().__init__(init_cfg=init_cfg) + # normalization parameters + self.register_buffer('pixel_mean', + torch.Tensor(pixel_mean).view(1, -1, 1, 1), False) + self.register_buffer('pixel_std', + torch.Tensor(pixel_std).view(1, -1, 1, 1), False) + self.register_buffer('clip_pixel_mean', + torch.Tensor(clip_pixel_mean).view(1, -1, 1, 1), + False) + self.register_buffer('clip_pixel_std', + torch.Tensor(clip_pixel_std).view(1, -1, 1, 1), + False) + self.clip_resolution = ( + 384, 384) if clip_pretrained == 'ViT-B/16' else (336, 336) + # modified clip image encoder with fixed size dense output + self.clip_img_feat_size = clip_img_feat_size + + # prepare clip templates + self.prompt_ensemble_type = prompt_ensemble_type + if self.prompt_ensemble_type == 'imagenet_select': + prompt_templates = IMAGENET_TEMPLATES_SELECT + elif self.prompt_ensemble_type == 'imagenet': + prompt_templates = IMAGENET_TEMPLATES + elif self.prompt_ensemble_type == 'single': + prompt_templates = [ + 'A photo of a {} in the scene', + ] + else: + raise NotImplementedError + self.prompt_templates = prompt_templates + + # build the feature extractor + self.feature_extractor = MODELS.build(feature_extractor) + + # build CLIP model + with open(train_class_json) as f_in: + self.class_texts = json.load(f_in) + with open(test_class_json) as f_in: + self.test_class_texts = json.load(f_in) + assert self.class_texts is not None + if self.test_class_texts is None: + self.test_class_texts = self.class_texts + device = 'cuda' if torch.cuda.is_available() else 'cpu' + self.tokenizer = None + if clip_pretrained == 'ViT-G' or clip_pretrained == 'ViT-H': + # for OpenCLIP models + import open_clip + name, pretrain = ( + 'ViT-H-14', + 'laion2b_s32b_b79k') if clip_pretrained == 'ViT-H' else ( + 'ViT-bigG-14', 'laion2b_s39b_b160k') + try: + open_clip_model = open_clip.create_model_and_transforms( + name, + pretrained=pretrain, + device=device, + force_image_size=336, + ) + clip_model, _, clip_preprocess = open_clip_model + except ConnectionError or LocalEntryNotFoundError as e: + print(f'Has {e} when loading weights from huggingface!') + print( + f'Will load {pretrain} weights from {custom_clip_weights}.' + ) + assert custom_clip_weights is not None, 'Please specify custom weights directory.' # noqa + assert os.path.exists( + os.path.join(custom_clip_weights, + 'open_clip_pytorch_model.bin') + ), 'Please provide a valid directory for manually downloaded model.' # noqa + open_clip_model = open_clip.create_model_and_transforms( + name, + pretrained=None, + device='cpu', + force_image_size=336, + ) + clip_model, _, clip_preprocess = open_clip_model + + open_clip.load_checkpoint( + clip_model, + os.path.expanduser( + os.path.join(custom_clip_weights, + 'open_clip_pytorch_model.bin'))) + clip_model.to(torch.device(device)) + + self.tokenizer = open_clip.get_tokenizer(name) + else: + # for OpenAI models + clip_model, clip_preprocess = clip_wrapper.load( + clip_pretrained, + device=device, + jit=False, + prompt_depth=prompt_depth, + prompt_length=prompt_length) + + # pre-encode classes text prompts + text_features = self.class_embeddings(self.class_texts, + prompt_templates, clip_model, + device).permute(1, 0, 2).float() + text_features_test = self.class_embeddings(self.test_class_texts, + prompt_templates, + clip_model, + device).permute(1, 0, + 2).float() + self.register_buffer('text_features', text_features, False) + self.register_buffer('text_features_test', text_features_test, False) + + # prepare CLIP model finetune + self.clip_finetune = clip_finetune + self.clip_model = clip_model.float() + self.clip_preprocess = clip_preprocess + + for name, params in self.clip_model.named_parameters(): + if 'visual' in name: + if clip_finetune == 'prompt': + params.requires_grad = True if 'prompt' in name else False + elif clip_finetune == 'attention': + if 'attn' in name or 'position' in name: + params.requires_grad = True + else: + params.requires_grad = False + elif clip_finetune == 'full': + params.requires_grad = True + else: + params.requires_grad = False + else: + params.requires_grad = False + + finetune_backbone = backbone_multiplier > 0. + for name, params in self.feature_extractor.named_parameters(): + if 'norm0' in name: + params.requires_grad = False + else: + params.requires_grad = finetune_backbone + + @torch.no_grad() + def class_embeddings(self, + classnames, + templates, + clip_model, + device='cpu'): + """Convert class names to text embeddings by clip model. + + Args: + classnames (list): loaded from json file. + templates (dict): text template. + clip_model (nn.Module): prepared clip model. + device (str | torch.device): loading device of text + encoder results. + """ + zeroshot_weights = [] + for classname in classnames: + if ', ' in classname: + classname_splits = classname.split(', ') + texts = [] + for template in templates: + for cls_split in classname_splits: + texts.append(template.format(cls_split)) + else: + texts = [template.format(classname) + for template in templates] # format with class + if self.tokenizer is not None: + texts = self.tokenizer(texts).to(device) + else: + texts = clip_wrapper.tokenize(texts).to(device) + class_embeddings = clip_model.encode_text(texts) + class_embeddings /= class_embeddings.norm(dim=-1, keepdim=True) + if len(templates) != class_embeddings.shape[0]: + class_embeddings = class_embeddings.reshape( + len(templates), -1, class_embeddings.shape[-1]).mean(dim=1) + class_embeddings /= class_embeddings.norm(dim=-1, keepdim=True) + class_embedding = class_embeddings + zeroshot_weights.append(class_embedding) + zeroshot_weights = torch.stack(zeroshot_weights, dim=1).to(device) + return zeroshot_weights + + def custom_normalize(self, inputs): + """Input normalization for clip model and feature extractor + respectively. + + Args: + inputs: batched input images. + """ + # clip images + batched_clip = (inputs - self.clip_pixel_mean) / self.clip_pixel_std + batched_clip = F.interpolate( + batched_clip, + size=self.clip_resolution, + mode='bilinear', + align_corners=False) + # feature extractor images + batched = (inputs - self.pixel_mean) / self.pixel_std + return batched, batched_clip + + def forward(self, inputs): + """ + Args: + inputs: minibatch image. (B, 3, H, W) + Returns: + outputs (dict): + 'appearance_feat': list[torch.Tensor], w.r.t. out_indices of + `self.feature_extractor`. + 'clip_text_feat': the text feature extracted by clip text encoder. + 'clip_text_feat_test': the text feature extracted by clip text + encoder for testing. + 'clip_img_feat': the image feature extracted clip image encoder. + """ + inputs, clip_inputs = self.custom_normalize(inputs) + outputs = dict() + # extract appearance guidance feature + outputs['appearance_feat'] = self.feature_extractor(inputs) + + # extract clip features + outputs['clip_text_feat'] = self.text_features + outputs['clip_text_feat_test'] = self.text_features_test + clip_features = self.clip_model.encode_image( + clip_inputs, dense=True) # B, 577(24x24+1), C + B = clip_features.size(0) + outputs['clip_img_feat'] = clip_features[:, 1:, :].permute( + 0, 2, 1).reshape(B, -1, *self.clip_img_feat_size) + + return outputs diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/__init__.py b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/__init__.py new file mode 100644 index 0000000..88746b2 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .clip_templates import (IMAGENET_TEMPLATES, IMAGENET_TEMPLATES_SELECT, + IMAGENET_TEMPLATES_SELECT_CLIP, ViLD_templates) +from .self_attention_block import FullAttention, LinearAttention + +__all__ = [ + 'FullAttention', 'LinearAttention', 'IMAGENET_TEMPLATES', + 'IMAGENET_TEMPLATES_SELECT', 'IMAGENET_TEMPLATES_SELECT_CLIP', + 'ViLD_templates' +] diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/bpe_vocab/bpe_simple_vocab_16e6.txt.gz b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/bpe_vocab/bpe_simple_vocab_16e6.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b5088a527f720063f044eb928eee315f63b2fc0 GIT binary patch literal 1356917 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%0D-8anuzg!0hrX~L}M*$l~SOpZ7=I+%ag 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

Rp5@H-63rPkl?5M!`%e$q5M^(XmdeOwiW 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%0D+{l&4Elf+RUJ>DPlT<0vI!uxp-LitG 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

nj;X-C@gua07)qPBmS6kxKbsrp_1VbHQ%kr&^ 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�J#6HekB- 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%0DQu49$GwTP{0?>4l_B{}_v8!N|W%zC&9> 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

brXZX@VYhc!=SFxwhp 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 z zoLQ?un&^7HtZH+|S)S^%u)U)Ut=f$xcPa-;w1Jm`(GTYN1oS`~Ij{wzB?XV=%Bm-1 zI+Y5N&m{hNhg>?bdKQmXmT3b*N*{rP&@zcaYkwIfC`1nIRmd4qWQ0foa0J-$WkeyI zeaUkVb%Y~<-1G#~t{;krl!$WC!ZN_J%fb&Hc&KStAvulM%LpOX{W&Dd@tHc*ZzY!* z=9UHp5bapx-njiuAMO^4ByHzfx{uRSTbE0Ql|f`5>~`y3ODF^LN(##`xdOqmz{*S# zUAmD+fG1w!D01XO|99faNpRtl}9f~DF~s&uWrqWc!Q-12 z1k)(RfDU0gE}3D8_WSogu4({@bPrpq2CPpI~FJ0q`jZvG(V2&}=n8qOFGiCd!%$iDvGH{Y|L5*0VITdB7} zYU3ad>8QpUvkeJd4OLFjK+lTY&xnuuL;PpR-!r2MV|!^TyLt-{&6H&s9NG!~=d_WR zBAE*7S=|5!d?wd&g$)W-mBQ6j9~Na=5~T@0*vO!@NFfy;oWa#3(@LoC6G#bfibHl~ zCMqazB4Zu%M=2C~x%eIipYYaNEfbcgh+UHYoeB_HJk}v#x%S7{hINpF^hTN9MjcmJ zkCHYwbd|X}&{ai+FtctE*o4s?2VU3;RYpqXeJe;SK<_|y%Bh6u0FY(2M1~k|p{pc9 z4lvLvuv6K?)u$?1Dpd)teMUVi<8G;+q-Nch*F)Z_Uk4afJz4Rpjk;7|fS5;>j-+Ty zRq4g8FE{)an}W!3c*)u=1)E1|GHRfuV^$$yMgire-f6KS_qDg21&l%4ni{QMqx*=$ z_b*fW8f_Y;L+_BlE!a)@RBUE6(5j*Y>PkKNY=&>)Hj|v8prsIR$m%I+i{%{BEY`r9 z!8?cxZ8HMb&~TTvt$Hhln^eK3-Sa4I(BSu9P3_4jc98N&=U_R&SBkV4MXGM(O{3** z2=%DCan^E0?(dy$%*9BdM!vr=h9)nSzK+fA_#|2QBSU32UvarBt&Hp<9FIlaM{Jup zV3BNiOw?l|Q_08FZw`r;B^f&C&8@zSx4ltaOkyq7Ecj%Bf_4r~q(IJNliZFtsOW`Yp63G~TM_LORA{ z6L)XChshp<@tCWi2&B?;j&aXL&nSyN(MTlp|jc&DO@+C#f=GF z+_c}e^<)q#3bP^w4+yQ3IL82;kvki1I;y(Bk7IPG-B7AcuG$v($Q&7=lwbO}a#ZaQ zrCtdn!-SP+%ZJD8UX6%r2iD7Zpda6&PFGg2K1kof=CwrakQ%MKGS z@>#CfJ59U}cBTwX7;;hXvrtjZWU4?#;NEpk$!cEw(UnRDJoc%b7~LS*v~_`jPYO(U z>hvBO;Pba3>N&Bpig$t`pq?;RtXe~BWaLG)0=@OOqdB(_<%yn|8baPFa#@0d?(%og zvCTEAYCfv{l=~%AXTkJ|_~Sx5pEf8Ah*~MK4NwG4hloOY^f%!@Quq9|nnt(X09+36ebVS+fo z`pTxV6rJ*}V4O*E4EPif9U#AjATOQvK_WAq?K;3ZDb3+wl23AvtzoBVrMRd4Z@Qwa zlVu~}NFuZZDBE~^Bp@|5XAmRysB|PNGKGh=k}9z@#(@q67==>2@t{;TQe;vrxv#Gq z#(Ik!$um>$S6k~d!saq@{Cbmzgx1fu2!uBi7##)pA4#l6H{QeSph(mq?WLZB}WH) zMpOdAX09kZx`(nAxvDsF$Zfi)G`hoo5faou-hx5i0*ht$c306g4KTz=5F>qP3K-^K zxpy1r!3gr|uOw-xa-P$=-yEj{wI@l8VI~^8JN@N80#rmWQkiAR4i0}wYEW&RruJ~2 zGOCu!Dr8TFLaFNO<-deaK1s~J&)&WaJm6>j=A^f2wdX&-{Rl$<`TV7P{;7QaBG`*& zhkE28Wq;(*J5T{q-2#t2;;=pj;9fT!02}UZrtH;0~WWC63>o4mEb9IvfQq`2$ z`>$X0h7>L$14zfH(XPd)+;LTydxG#M1>~kG@djF;Wt|K5)?wazuj3R&^5O-i{J9I0 zH*LIuxtM|+)InvPk5!(ND#kCJ)E^UQbs!0f9)v87$%0iik?=NxC6S!O>>T}JJA{$% zsgp2*$!g`}zUn00Lfk$&XmyZ8`pJ}b0OyC3QV4BZR#nnhLP|~8iS@4YsdlpRPid2&-@a&grvNgiSernjJ`6DdMICZI#^sp3j6 z&E2|XCGi^1+Zd_fXKH-utjDuvF%kMhbqRrXsc8py!|{f0C4Xeqd6uV6C7E;J|=1LJrYrm7vF05bn1RwubkU1X1UN+E+@ z+4|6>fYi{!^$~Xr!&OQooBJrXjDk_n_Jnu~YVau+muWgI5iq%sr`I400zGA0wtpM` zXZ!p=>gT^9h36yxoxgDA@x}SoAM<;E{O!;AyMFWjr}L=!%jEj}-|>U~GQ538PS77d za)$nY-+zHk#=iGo-oKyEjzm3`MR$3D)yHgG4mc|#y*i#T&l;fQ3`ExsF{nGF!AHAk z`-m{I!tSABgA_vXu(7o%b$IO9voHe2UR4_fgO&btl}G)Bwmxll($bcjGXV@SuqE1O zP9;)y4kyh#4D^2XLW{MlI<^xJ;HiyMGgP@Dk*zi&oL7h&~;*) zLAI-uK`qa4OCfauxL#EbBt5?e6?gG{$+BXAI3vaV;Bv%bV3ESvR?PQP!BRN}Y2r|tpIfOII;v{{v?`xiTu z-C0Eo4z0Fl-Q5ZW!owUNwv(mP+WZ{qZK8e95gK}aHbp4Z-!z{#R;t#MVtL4!Mjy8BFUQ$`fBQk;L4NfoZ-1rxQ26!>04shfaoZ+RpT7U${dYRD zdiyKRzK?&RpY-dmhoN3xlrkevvt)uL(7fiKhP;Jk{MS+EFjE$N=j51nb&P2%pp+83v<_MqsE- zxG44>q8EiIGC)W8;Yjl95*=Dxl*s5{TED7dhhdy27!}!f4HGm{XuZ^`j3ptJl4d<( zb6F%f-jE_WRbCC3gByBD8gI11*=kxpp%TdSOk)OLS@Sfz!0v>~1wYM}w*+W4Xrk=^ z^x7qT7GvqAG#z1J;r2@M9@nzNkew#e1JwEH1v5-k)f}W4eU)8BlJ1<14k~w- z`4;e*9ejQ#@ltg(A#jR0m48=sBd7Zgf~76 z0}S@MP1PrWE)y9h3mBn+oW3r5i5k2~!FHEB6ys1aC3o!5Y3jaouhSS#@3uw5fvw6G zI5mK@<&DwdDUwpsCLM8-Smo_b7d4SE`O3Wum6s4Y^xpAoVk*!V>GT})V5J9T_Q2>=mJ0QNE6j`4m%pr%G@55NHDkjr(w91Ak8cpk6mhm zlmoB=Y{8+T{cp8YO`0PeU!6m%%JwV*0-FImvefh=fizqlg?9A_f zZ+porto4X=g0W`p%j+rSO&VE{%W_73Jf<=hNlUHf29TB&ly^KFK2phKps#%maYk0( zpd5q3%0{`wJv}K443ziJecLH6-D|z=_(BQg;B% zs9FK2lIl%14dh@4Hwz`F8o)qJ(M8Lup zYBF%tFoZ-JZTG*L-$E@L-_&3FtTT4k-HKZXMy&NxOxpS&L71e|o2*#L$&F~&L0=lT zRqv|g)^^#!!rZA(48acPV7F?)yHF_r%Zm@&6#@Vgv*Z^(0oS-w7XY!3;1}f7ZWRDf z%5kZOGF)xPt~*K3`wRHiryK`){?nXoE7Z9Y@zoVTb(qw+(tvulP@ofIuPkFw;peo3v6m3tEWpN9?HgQ*WhvBcuOrb)?!j$6f{6L3mAvK|TGDw8kSVaJl5+I$_DiJS--qs=eEQ}e zH5q^V_w+HGPfl)FUlFzcsbuP43qtEfKNb{}2N$~OJU%?35G(h}5U6Ti;eq`T`yH?< z%-mcP9xj;3tyPqV;bR}KN;}Vq_T8!hDEw&+B}v>!C~K!iMl|n(IFyTnwraTI-IG3Z z5^cmp{Rde#_$krd=n?zmjk!`L+M4w%N1T$ZuZYq#EmFWmQ0grMHuQ}^;BM1(NH42X za_dc-DnQwjdR1$!eG{~QQuLGXDHr=}gN1=%oAI?h3ePqB&CM~1!>^|~D2CJ4bU%=3 zw6K&jh{QC(rE2aGNd+dh)MR72be z=2|Oxu>GzYeKlI{h^AqT+J4u9rWSC=6WHb9Gq&8fV{Kl!>+r zRbKCf96)SD$w^`A5zC!SHwaxZu^i>WR|P^Fgd%(BjgFn*Lq_+HZJ-kG*FO&LKSTul z6Li`26VS512yb7)4-l$Zxd{t3_27yrsE{r4aTFl8KY^vAYm&C=jb6lTs*L;K4kPNL zrCfZbw3ye)Lr55`+(8?4Z1S%pk|CGIC%K9YMq5V0egNE#T&1vCx+%$;W}8eN?+2K$ zXfWA7yXA?>3Xe&-s20#V>`xT=>yp$V^Mh4`SyramI=KO`#s-yXWYGw7+QqU63Er(s zHUk`ssh<4m=GxA~22<+iX;6X0Bp6EA~TW{HP(LGc?)AhPuTYhE^4%CMm@K_^b4&*h`HAe zHH&fyD^;vo2^1@Pm7e-h+J7vnb&-%1A66HmR1Tk*&pMP&37Bg z4jUD-g7Zdt37r7DT@7w5WtNePLgN(pxfCgP_-~IDG_Rl}p)SZ^0F^is9nTpggS zaW6*olHblf->uaanYWf91CsO92_yft1gV7mTx3t}ltq{u$KcC@7PAhpYG#gL$Kh9k zX+F!%+T!2|DdfE?ikQK?PMyZUr^YRS7Q3+ulVL@AU!Qzpv%OC^uR9qLeMOz;ugtaL z^f`amml(mNSHGWM{fVTW`Z>J)HNE;7jHK;5{^k7#U;p#l@A9zj6%}Npxaup$5|mA? zS9#a#QIkM*)lxxQ0!wuCE+#4zt{6$O1~Xm)?+NDS5m*DXM|H#VN}@-tzv&rPL!oaF zld^duDH9||^%d|uGYNsj>ngtc##hP#^6tRL^ z5o!XR*$th$8Oin?a&R7l3jq%6J~pzxq%NdrMvPZDet--}v3limTCtCveVHt;LH_%& zC<|_VoqHOp3RX@S*f8X-?LKSkQsn{HY#%RI?)iK&sKy0ED|$AMVCc(D!Pwb->4sI) z3s?nO;4L~u4ygM4!M^UYd3CRXwNXIk)O6AuzjZ(hEKA3E6slm$x;n6d&C#<1IurgH*vn}Rq`zWNcp60@*86TpCg@Q7t>M9l~gi3oDb~Qr8gvAR(V3j|J=i!L^(=pV*~#WI17^K{r)R z0D**6fGh#Npk)>vhgslW5|;*u0{W%Rta+`TX{S z@b>F7ssOeJJ)mfE*~%&pZ(Al2CxH%F+E;31!}3;x)+m37tBWZFZir1+x?G!N-In2O zwL&1dxxuJ@b&2g{%PNTyWC@`&?o!4Qpy<#A)6>+$YgpJSf>6Y9YZrK zbXma*YjEJSe`@=Xa!SGi%APXwgUWT;NnfaK0^RH%@e1?WQ$U36Q)1F2LgCC@VB4Y9deZ9Z898>iG)cs1?S0QDHw#^wCiY!+Tr(!dH=n4 z316ra4i+Bo0LmIeAgucZE(im(F)3!hwjT!I6Xbs0yi4*mMOz2a zOMH~H68$_Bb~fQrEU)~}Bm?E(%F&WsN~@sJ;fR*EUNwrrf{)?$3bY62JyNIo{gU+r z^+A@hHPq&7DXB3uf?wOnA{#g_i+tS!Jb_2{qvouv>TY+PQCWoC9Ci<^StvcR08{E= zT_{yo+&a>xdZcy$BHLG!x2r1Gr%7CC_ZB?=a4o4cYOiVbLR$`~9dS~m7Gm(BRekV! z?wGp6soMIQ;5wwEcE{s-b{oQ)zo77l)X0cVftQzzE)yZEWX;HuBCcQm6#im=PRH;X zd;ihpd8m4RhK%ZvUbX|)K~LOk8`MkImb(8ER_j{QBCn!173*<`Zh2Sug^$T!b*^r7 zOvw?{=8+R_wICQdp@Nd(-IWY`OlMZfx+fH-VEs#$M>ygFi}#gv$x^$kFc?oO<01qH zL)?3dNL>RHJIOH{=P*6adV&vtCfS)&&O6bd?v62(k$MI4`*+t3>uXHHKZ5s-b%P$q zNXuD?73*P1mb~e5)45e&m871bU$+j2e!g~|&<=G!(ZptOiA9xHM%|e$Yx^$OUpm`C zT=z(hoYx)X;zloT9v91r(>~UOUB0SeIJSzJ@#Cp@*%jZ3T5VQ zLS4^$s6atMV4EQi@NIibz~WDP$lBS7#02GTJfoZ1h?~J=i}oc6O{mzeL@5D6J3(bq z3fSF;3MgdV>=A%y#-1I;mR#|H=Z!jb)8}Vfk8rD{E?5YPCBURw>Zjb6Su&MK)aw?? z9ICbf9**As!=+oGoq@^{<0fim#Aj$u{og8{yd+B`m=>0#R_3T0t-aNu$|d+YGuwg) zW!aQt0=y4;0~old{|XL9)mmxmdmAYn9gzc;96^^c84uDB5+Es9on{R+dC;Tca#CoL zZCs@~)0t+7gNr++^J{eR#ZLJZ87wPFBhhx4ylgbzl+33>O19>DB`&+?B*4c9R}G8v z6tc7j#CMh~)YfkRH&`l)POK5~D`W`!3;&c@s9-X^4J7>Jbe3w{I4Jmzyp8v?X&Ryi*)uc?>|D#{dr<*{B!u` zd-}TEdSL1|b!x&5lpwDqbJHy}2kypkRVmaI-vLY|zABVgYBeF%v8QDZcM92V-2ku; z5_yX}s&)^meS%Rbp>@2-HVl_ui6oCzOTuX>p=*np-~i3+L7xWj_u;|R?l<3kple%Q zR!j$8PvUewJ8vmnyhbRP8JJ26WDF+Lwg5^`A6sH^=cx}PoU3%e4IV1T$mCI^8W7Fh zc4w5sT)W8+E-WA=IU+^E$X6={5-?uFOpK+_aB`;rHNsuTCs<#T5-|Zo!y5tiSV3&x zFkud~49;;y9@~r)=kUpLq%N}b+EC94j69H4svC-x?d4l%*I^Goe5%TD-D%o*WD&&l&Cuyr(v^TkW(X}wu*8x(qAJb z#$=^6#8B82z&2WsF4U{NV?dXbR*=H-b%)001@_d|V+g>@%v$9$=H}Nn3`Rs5&}X zl49^hEut2ZMQSv(sk{C`7Tz9VacKs0tVl-%#n1@-^gp=SW3IzQ@_~h^Yr`${Y;$!z(Gl%={SbhBJ{a1kp z=~YOWd>qVgz9fQkz5a5O)tl$d2f?t|Ch$9YAD>P`1AAoWap2FP@m56J(pQSuVF7 zS}yR(GYsPm_Cvw>LpPw`(h=4@k?|^<3FpFm1EEd2>}kX*m$4f_?rhjgM~b;of6V4D zc0=2kmszvR7m#Yg7dQ59pNksDLYb_5gZnHJC9}lEb*Ya4k0G*NU&3|i1fcKmduCi@yIGTxsS3V65n$+%@z5&jbgqU7*NCM8B1*S3EAn2T-bOo|iRYuhK^px=SwJNi)K@_VpaI$R%1230~^PA{D*PuPt#?^SAkI4LYlaksU(#QtJN;v<}PM zW*oIc<%l&EnbRLWA+FVyn?OysGwmKo8oFBDV9muEv<-9;As@$r9;Pj-lQLEemr91U z2wC10HbK|760V8)kB8Jy>yJeb*?o>1Q+4kO<0_^!p{3YQ7tq^60nnjQjpV<859zE1 z?2j`NMC;2Pw38cXGf1!{QocH27}QN;ALTIqT9wYroo#mukKKNIY|@7TdfPT{A2o2O4)&g zw{7u{ZiQ|EU33%lFzcp0P_*oJ@AeH%sU$vaFNE?!-a1ng^{z}|5@W?toQLsMrDsv``j7-$wdIYiN@du;ud(g<6sOtoJ5#e~OW~GHcZ_r3u0bc3 zxPq#bbuJKoH-=j@04oWw!=R*2@-va$UXRl`Na(VpU6*l|?F}i5okT~-&1wHhaZ<`g zG^6K8z80S6@-j}~Z5cC05~FmO8Ma$i{iZxG_{&A`&)ZHY0q zqrM+(AHWPvt`DWuQKg}Ul%8UuL#H@Y%y z0|v}g%AV$ez)f%xO}z%9L9V5gcX@sYn}w8kTqX3KhY7&6bSChCHgLy~XDo>dcdZWR z?x9qwFa{nt_No*jMD=&r`>w2jN)4MH4iyx%<={A}9kEYAre^FE!i+$==T=~=UV*#Y zvLu?boeaQl^$tW(?}b4r7UOhjHhg=IS@(KEbK3qB+Mdd8ThIOfYgBh58)FNR(b!! z`)|$!_}_-NFD%9qko8n8Tstg);<{S6RK=%-!LabY+=`O7V;Ho}b;C9yl|3TgP_Q!! zkPEEG?PMUqaMO*tp(GUUhIOpBaN951?ysqgv;sLU33m#6l54rkL=7i1LKIa#DIF@m zBiFViBys6yoxGYH&{F40aE-Fk$td4JiaV)7O_O#}79F3sp}}%erkK?$FMC$aSP?Gl zi>z>3r@2*wXA&F%=$wXR&8cC^UPe!m1E8bz zVn>Ltubk2>_t0Dvq7|fQ8Gvw6TLXtI1F5!7*IRsf&K}p+^ATA z=>trqGR!9EGKS8>;2<4AT-c;Po9Mfcq+nF|MFEl2LdG%;i{e5trqC|lK0*7nkgCUa ze(cMq#Q8e40K?M@{#x(KI3*YQD)s4|N!=FQFc@w6?6Xl1=y=`p{jYn-Z!8-DF%qtL z;lN;79dA{|aJxa0am%y|sB)iU0=+}na`!zTu-+CeS<^G&pJGDJ0ue~H*Sc1vW zhUMhK^6VTo@rbI7^I-bBKf((Uc;H%)Dh&V(#`YFY_Ai^xm~IJCwB zy}T@L$fFIx)QRU;R|8wM`)9}DhBU&hHN%U`(M3s%tQKt#Lgy4J>t)zdSD>?oW+@qZ zK3t&j6#&w=e-cJpck=;?MmkJo>xoY~FB7cijD%~!OKo#X9H>OR9Nd+AWmiudy8+fn z7NY8LLKA+PIklEYWtVkGue*5z`wWak3$K%kCL4lJ%7k%wB$7>D0Qc}TRTQbCCmofL8aW2y`{92EQk*T zdny!gBt$SlteMvj5jH3o7NhfFPHXq6dsrHEA1(MnbHqWqHz=1t2M-R0E681ZlDYxN z#EiL7NKLJdS>U(pYcTu-C4=8oE?pv)ZO|tX2q%tTuU5dIZU!QEcEBVFiB#~rF7w0=yx>Fb5faS$Lp3FrCy%mZEZW13JO`wMA?8K z!JG@h7eC2@s(c|emNw5I@7tb5jNv2?45=+!i7pi3D|Ab6g>ajI{MKsfq-aFc;(rbA zf4&@(4r0UIBL5+&oXt8wvAsNtGMH5ngv-dXk-WZ^`w;oaJz^H(+@8Vq8~K}OM;aE| zyR$&MfI0;UnZC~30(zd0&Oy)Jddi~!fYUxxCcteO5QG+b2aV?CuE!um>;q$XiA>6l zW&4|E_9_>6Dq_65ftGSoc9p;BBf$hY&jeSgr4@aHc>4%)Xs_6YhM&e~n? zC@&16gS~`lt*qOp#cfF;D%ttbPv{7oR%9V0CCd8gJZf{IBBwzLr37H5Ep0rLfBl40X!NUvfjqS_ z_Ev7d*Z=1?|EQDZ>KqjYRn{E+cM-43Pt{O*uC5oX!=~NKg#8TKBMjoch zF+Murb5F+4i1@R1pqVx$%-zRXxv@xcwp_dd|W}Qj|e0(cItrYf=nPXE(%Y$A%-r1fwqYw$)Yp zjMO3$d;}5+&BY_DBL>) zc=^+|dX=MYJll7`qH1&*ydLjeoyaV8hR-Mlj|wX@#9D;m9YWV3U`)0r|=(GA~xv7?z))XIsmsF?ch@&cw2{tDEy zHm}fAhU1mCZ3=~&j#D6KC{P=lBz1hr`V%Jm$45e$Dm;fLNkOUK7ah4wikegc|n)wg686OHMHJ=|z^fuDt_hnx&};@L%% z8w#PpJH#c@WYtoO8HNCLMJvUXkqIr?Y@R85^pb7(6t`#Z0&2+advsG^XB!_@ncmbv zow=Ep0o`c~-NEt}@=UT%wFfj!yYRHGNxP{pm?3DUL_$H9N||-nJp65t zU~`y)p`NmP(-}C0a={wKT#$z%(bL$;&~~+e*8%x-xuOW(dt)zS#;kNW!_lZ676T#l zV$+dIedKvVjSU`XBg2JPS~O^`Mtc)kxhYQi21T>83=%}~SY_9&sxBtTiVyOBD0`{c zLw$;>ENoU)aN0wUpNMlw3JN4UmXY~@pq!3C5+Jm>>|rtQY>Q{5)J_=;rTqGEc-K=Z zWplCEuee&&DVsJ-Xja+@g{I+B(%r!4-LNWGvSNV#(UcI0~ddx*e>*j+5f%O z*Q+cR+1nY*?uw9-oG%CTPJ8Dt6}WT~EkIzlPN60RaDG2PG+L=RP60aUai)f zMpN0s+#062ldtRx)n^!SUeI@@I8%ihISdoE)PY8`L9*`myHAP zVsOU~cyfB;q3C->;ci_jXZ&ASTrWq6%ba5ly4(HYx^ljk~Ui0~4O zvZJJB7F7?(jzil~3)`VKL$@s2m^cAy28dI;ZU&yR%`KY&Z6`LqPdcvAOP_Yj*tDqS zt_8}w3T(5~lX9qa?0OI2GgG;22|$Oo#0H6$?X*pt}du>@`CPIuRFVh5x{LRR0+;IM-p`co0lhl1nl8e zMf^tA@GUU|!Z6Xkt@k9qY~`wS5Mex#&SZ_32&`1!TagFbF*+)p4n8TJ0*%<@gy4P# zJ9k|eBE(CfLjfhWh6A2AT|KJRUd3DiJAPN#;}g{!g!9c+l}Xddd`?JV2gtD}77;u1 zF?1G3*|GUn=O*g~)fs*_Eat@sCZa1a}P)FBnH_-Z{2q4e<;=%3UMod zU6QEBD}}Jp>#SWfyKLoY?#kBFCA4q`d{&zpN~OYZt7h`GtZ+3hb$o5%`OzWW9OI!< z25Q_B5AcO4no{SE$SjFV=bf$ks<}}GO0irao74j9F?8cG(UJ+kH+Ax+xxoy!(;<7U z-6~x8lv7)#bPI0A^Msqyvea5O8r--db(!Ruv@ktAJqHHj zIZ>MFIaUTEUWAVwipS6aSqawI?|gPF85dUg=3L;eJH+4sxVV~vv4nryG?W*NL?xZ8 zuPZp*IZUI=^76v+Q4@Tt(4ag)&48znQ{@U6Yg`?7A?%}d-hesrLTWtR5X(_k_mvtQ zFGT9&^!%0I;D;#7ecb??`Y=eR8W#x#JVJ~So4sDy4fPAA} zV>Y6Z^c4nWa)p02vgMVrWcC1j>%BuCJ$i=`lBUok;ft<;t+*GL7lWU1e*2r+zB33G zkW)7{X-6Z#4a44S(0AB@-Qiu;JKlcThir4hQCjW}L160wA#N680HR%)$*8oF>p6kv zuJfKH`jS}U#1sxnK}XcUnzZ6sa)Dx`&njd(FDmZmmW5XXi%n2Nnwkxh;Mtv=QTAH0 zwtXLtI6|F&wM}=}_EFE3WpbGFIwD5?UT>2&S#{3$lu{Zw0vmH$!MH{W6qD6j)6PvV z@sbv(agV6R?ZJww_tB_mN#|_Sc#Ktm+df>k5MU;&upyR!un$lBaG<2KX4ZUgw{Gg; zLhb1%3_IA?hQ*YGQKfU`caHgp-Q@}G?+OenEIJdQM_Z{p+yYxQ6twdum0CS!Tfo)* zU=vjEtw#ada&+qb9*&?cob5-=Rz+@Htsa;|p?T=xr<5gPi~ww+;M?2Xs@gtIkzd@Q z1dETRBFnKVi#aZBr|z$I!_F)P3T*;*v_Xp-P+f*SSlx_M{yIv`jvKF}cN^l;Emm@G zUY%wbt0y(q(FZ>W|KWr7^f#mieEoLfo9n;}`k83a z0a9?69a4+MR#EYdEtp3Zfwh1krR*(9@dhU_DR4mARCxoJ9Uhd<=N#?2ssQ-NvayF-21J4}bY}}%VujBFZjh;84z){w z^?}t7u-afaseJ7qwv?9PN zU=9TKcmW^NZT^Pqs6zBEoz$YsOp`uYmyHR%G!yz0#|$8Ic}X9UtR5^D^uH;?X%b8F z4+NI#7R4(Z?b7O8tGG&)R3hc~n44u!RIxih26C;)M=>zp+#^XT4&k{;fXsJ*Q1-ho#IqrN24_^OW;VH3~ zEvY-;x`X4_!TIIXzR+3uwN1nv7R|Q8jMU@v0^z;W6eYRJ%`rcGRFQk$5`~sJ_&}@-J$$v@XZ~K8hFDpz29Rg z35aRhDV7(`3=fryywP9mF@^_CnIse5mE)>=um$WPdk$I52G*7_Rk6QRi`XbQgQ?+_ zJgXTPgFUO?lcFFO#zaI+uh+x3*Up)Gz)3<5)v7-4Pe88~x|u!e%1Mg66KVks_>;@L zymSkt;T#vm;j=w7Qh8@aNH+2AqJWN* z>C)mOt*KoDMaL!(@e$A^xenv%?i#^csS*UFQXRX!pIU_pR7`>fFr7fFa^8*PW9hjh zi)BdL4SD`=x{jzYcB>G?cALueNu^l_XEG>oV``P4uR5#tyzA9TFgIuWyWwrStx%xk zA%846w{8jK_qUv%>WEA(yE(gJwStkHqdLalY!pHQpES59jaTv~7||>2XmGVgS^z8f zW|Z_@>YkaUqMFaua9ctHL=w9Lo+rV$Xl1*fU2sa3k&Bpad49>D3YaP+sUvgzJY$wp3XDNo}ploDxfrrcqI?E@`tD=kCkyQVwNu4=mL%?4L z_?F^ECl{7W)s ze|9|kwdo|gSkvi=<5ge1eHDIqe)y~J0YD&M`t~WCjQ=dz^6RfHuA;Ebp9rG8Q7dPq zaE%QDa^9*hy zFgpu&K|^V@D$_xPg(hJfQdS(3D=|Vg!HzlUtmO*u7LrKH0&TrpwnHZnGM{$ypc&R| zLrok-OVb@ybK^LBgr-EMP}uGRjD@3NH5?eDAxw9RSinWN*l-KeGua?$=oz0{I37?E z3>a1{GIHy~TB7Ym{bbBAI_tZ(FLbj3ci@_&cr6NrX_0>0Z0_c!JuA8EX4_C3C?{wJ zDCLj68gRy2qUqaoT9UZO4<$q743!_&^peJHWlAKi=Sp?9l`!liwEJTFP()vJq>O&t&KeE51?7 zDRQ;iN`xSS(!sj#OU^%{}!()I~8{!D7(63)O-viz*RmIZ;C zg>NXZwOEftZyuorz;3b54?-zlF_p{>j0v(JR@JuvHTYuQf8O3iKP3%`=PJ{ zCInwS^9>VNKK$Ibxr*K&pK^tt(r*xOGI-X8<;$%wP?I+L$Y*v3xrR)1|iY}fV$%kNZ) z!NDv%5h>Cjcc790G6HBRFc{xbzNzy=`19s)sdP+?k{`icz0eVT87=a*!|kM~f*CuT zs?e7{%g(#IvmsMD3P>%GLg2K6BpTRjJmy_Ny`(0l`BKrW5l>_7TZ_zOMw z0f_=%<(T==+wWd~W0ET82m0L?>_Wt*p$Lb1Qz<@ZBd~+=NKtX2GaqIP zYS>!J-EmYf>L74z_bZsGCI*en@M#0^_QBdpmeAyo$z_zynck9;{VjJG3x(2G*^-hw zfO}2sfl?Bx3nuxGCekN}G&YokvK?0d!>lU2=DN+{ZsBa7k$RTRK*wT9$UC+}0lCjz zTXs6TV3QZ1oze;o5_u1@cJex&BsJa9RF35SvR<1&Bcl|^#IcX8Ifqyb7)kCb{^;>? zX~BJ}$Rq$UV%g@prL75`g2!EDj|hm)bXgC)06}1YTOvVJkdD>Vm<3rrihX2slB{k( zwMO0OI#HPmt1Z|UUdj%ju2f-ubzp?L7V0Z3xaFQhL}?CNF!W*Bc5OqdFW_>x-g~Q7 zyH$>qrQ&}nJ;3BavfB1TjeJ!Dp=zF*+wqo#IF!=0(Vgso>!VoILD8&%eB6M-k&9}d z7xu$xCQG4{r2C4wkwwYvo|J)-A6`Rc`cQy=tp}MRg>Ai5yTPfdQKbx69f9Av?idJ3 zDuQ9|Roft}q1B*G-nQ9X?z}ox^p6TfP$?&!QYG0UOL7oiE$GIVeM!%|62}>COVvbV za8w+~338|YQ5Y<3p@Nerq9cHSkGAtt4Bl*Pz!utGMjl!ccvF-}3Oo7fe&o%C)Kr3| zbt7Le9Nj=l%#XK&>8RB{fDSqi-n%ew1#4^xSa%Bj!K{d2&={gk@cxTocYhfEw;Uj~ z7=HcNa6;OA^u6(ta;i+P?*pM@Gn#+@2}F;rjQ+{n$8JLO(RY6vUVp|w{6%=PHtFBL z{`&pjhu42$@_KlG$OS`Db#ITX8^KE!{R*LWsl~%SUhe9VX>md#r28yxayz8jh40Z_ zvdaqQoE7E@J!Qz~xHnYjlt?iB?Q^DVA!EbHH85feD0cYZGp@ z8i(WudCsD2`dy48V;st(e!!rSg!|sZ;kO4#Fqm47D z3EqKFPsav1p4oEcqnE_Q4#=Vd zQ>a?x$!9Pcit;f~_IdAEJu+fDy5r z1l^$mv!;4JDKkkfhD~qR>DDqS)j&r|`MW5y9d0eP@=PLr>XGLU8_|k#(l(@yg{+U3 z)|24jQPMQV>wxj^s^A<*EaE_=7U#_aoP0=cIVMw=XkQ54>(r5Z;}qYdStv{~snA38 z(73dTyW9jT7eJfVcHKyYm?ZPHvb|H|YI0PY2W-*uapI^DK%i=T{y={!b`n5d$`{MD zba0O;1(rFBym6DIa6svy31q=@1YC)>YbVTBU*`T=?N*fs?NKs`TT3W6u)^EA@u9>? zd(l`m4sn;d2Pn>s*<(Fod{^6qS#mjJ?r&&a8JPX{y;B8GUwP^Vx_+&d-qQ`7xM-=l}<$_XxkPb!eJ1wL4_==J0f*@bSBDPobsS zCVZ=RV!Gues^xgic4jpuf(HFAbEzBp(zH{$L-jdDo#{DPMYD5<^GQ+(K=`Txi~;Fi z4tcmxRv=5jZci3rlI;OB>fK9dl|i^hg{pw}VqJ}?1_m+*o39MDg}6;UlvD;5y^z(d zv-4cr%V@L%?I^fi2Z~ReFij^7s+20lg`27sTAr-i6|A8D%MnrTfzd?3)C`Ix^_s`R zXk9K+Pc5Zty2)Kyw_cJ1>IkWWOMJ4lK`L=c(=PA7c>6Yh9sByFrF8Ja_> zA8M}mRzaDhhTIr zs^*l(FNAVSmiK{tsKOSZtl)LyvV~pqKx&h#F}ZSpFm7&P7q~BK28phTFJk!<_TE6r zz%*#tdzhr{d~!e!k>OVdn05%eUff>|TXG9@Z0ikfa`ei;F1%SsX&%SxLB*JxB)f*h z=Y?i)XjFL=F$k1T;SH@GUHcQ&h1pUEZGyJC zs6&^8Jya0}YZs z?&?jDC?^H*OzREC#;$b(p|n}P*}Cc!@BBt};Y@TCm)meavgM5K5PVg#Fexj2fMEvi zMJtivgd|Bat&fHZEAdK*Gwgm6I*mpqDreUzRyA!%gMm1Sovgf30ikp`+p;KK8W~8c zPPV-B#S?TjB`yKxSi6o2P&!iP6=Oy2 z|7IY_B3my*A*mbX_sV*g-OjD7u_e{Xd1bul1Sd=V#_pk6z0EQ9|hRIN55?StX!+iv>swnypq`!LWp! z9jRn;CbBugQN_rEv>ed66_u$06@b*EAp9nYQU}cSW~f@oZ`sDXXp8~w-vU;tf->Xa zHLa{gR|^F?qBQxvQRQZ>L{j_k)h4Fz;=YI0O4V7vF@xg@Dhe~vNtJ=}q0UsiRXU{# z(x;JSFH9~uLaAsN6CSubziFa&7Eo_^GgeEg-=}2X}`{+``h&K3De0#q$#lw?=!QW-9ky8TWfDg zfG7%|#lXj{X-mu2I}C!D0A@=9qkCx9ca!iAb}fk=fP6_#^3=ks&ybX|0ITiUH8$F1 zj)y{9Ho`;X;W?~GhiryfqLcnf+3`3!Bq|!$F7cOh>^%fQGxI- zFF=VI&|f+G{YqBL;=WeBfy!s@b%Lm_EeMqHqo$JABQ4x8?6J;d)~d|M<1?=K$?*)v zdN&;<-nCrUUHc_WU_qWe(C@8^ z!;L%j1Ue5!5t*+1J-K@M@BgL!7yj}u^)dWIK9p_w8qxRv<8tIeP`_g1G50Dz;a4^< zEl&T_+h_QH-~k-jbIFmua zCEGde&yhSnLhd%?rz9xY2UI&D-0lv+pVXb)CE;`mx&;3?vSs%~(b^NGyh*r5+HdTw z$G3o*#24KlgP@IvThcjxs#FHHYD;<~ElKMl=w7MVCz(C9g5a(fc>DJ1mOij41Qy^b zMGCmK8+EbdRrNKw58b7VQnv zFhHU)AGO1i+%LvhljPR5@Q1@oy~U`!rKc&tnltB?K;NG-n63q<_BrdDScJzl zQhgCc5b`;fM!8V|QyB zZwT#ordLuAN1YAZ!@xOPtz;}&P0xT~R>6I5>V(T~$C6}7Y9=;6iFD zQt@XynhSMYV~(!oBE);r^fbaaxZ27yLaNexm>4OHzIKoM5D>wfRTjM)rO3VaIAXTb z#lNM8=1<=~M;879X-3;O9y_*Ihq6k9RWmabg@}3jZ{-6vlJC#zP#Oz& zFOg5yBc-p5l!oFdb~#}U?kEIg>WlL-=NmZlF5MdET6=qJ=1PIv5_dH~aN;P)Fg7bB zYllR-B*W2>`qRY5E+ldI**eIZm1AFE4}dRjepZSkAQHbOlPh9sH1Lx`)2!U8a~JB? zb~h<0(0Zr2^8%2nK?Jj91!cwp#$47Tkr#u>94n_lozVuK)f4a6K;%bKZj)=} z7!Sx-z3Rl|%PD5!owZKn!cKf9>|FxH0F(40kqVB916w1V3*!QlrL8Fhe@UQy3WWh4 zcUh!1s$q60BM$iV<9Oug%|^8%WI~7NZ>7MVWd+LMmUcq=fRvu2VzYoly_8u-lVGf7 zbb|u;8H8OWve)fWUW?#VD80kABiVL7iz%eMpjUz1q8^_S$X&xF&)6XOVZj^y>DhyR z+yfCAMI83=aAaQ9jC+>goDEtB=a$1STdj5+c7fYhPAN0!kBE`CZ2Ob9pTkk~)3@K4 zNgrAvKKlRY?f0+WhBJ8Jqt`DEO#KU3ji#W8_T9c6{*U_xj!l!jk%tO=r<$WkWZHGu zXnJ27S?msY%s?w-{M5*}4tifZbzZRn(0W%-!$UL?gF#xZz^cs>$z^vmv?P3Lh{Eg| zH3BCentH=4R}y7yIV>v5?B9mJv#d)O6dD^$aV-y(><`%VE7ACHkS8nv1`^D2Z6M~t z)bb}gZk!XYTT9(qklnqVlHn-pJl?#&LiJ=d-)kvtgc@%6e@bXaPXFk)C#62)w%ny(lcJ){L&|KPubiYoVS)ixGUrCy z(3E;m;61}C;8jF5041zLjIKMB6OVa+5erD3(6C?+oLZqc>cT1fvgwS78y>r>*8<(_ z;MYQlkZU^mNEhQF=4h>se+eIQn?8E`xA6A$2SNAko3~HHpXER+G1uC=FR(sGfL%{s zI1j1v+BNa+c|e5`a)ys4v_*!z_VFP7KVZXCZ%kV5hosq-b-i0E?`-N=Pbjj)&Ox^> zX4=RGQBfRSj;Aq!git{cu04|H$pr)CWGVbAmkWzr>luw~urKi{g~u+it@obAZCCSj zN)$=qznUo)_(1LwuRPVyVw1xrh*KHhvUh~bfI(kYnM+=w2$ zv6%s9wI4+sbzvgxTHCW4o>FXE(x(C1Bp@ESV+IiU5Mt<)Vhx||NdWcgBWA)m>$bF% zLV*;awTuDkn|DM?`Td9t@My#?IEa+|4Kh}-aFou)zp@^>ZfoJUrSVgMa}$z-bk1gKW11ENP^?cQaV#T3^ZUV zCYO$n*Dm&eWO*KNO%*hIa=CQXE(0Z3FoB~Pfn+uNc&SD;5wuhpH_f4sdv8z7zAC{j z!h6%08K$FOrB;S%yk?H;eoS&u*@V-exRiIkTSRX*O!eJe9w_#)_MUd?Twy?Vt`;zE z`;}2K-2++u*+(`Xdxt)5$Vv?PAh#jA5sub0`j-y)XRsW-tT^V&<*^-<%RlDdy0*O!m6U{v}{?DCT!U70drlIdLJ*V@(yRu zV6ku;w9H8pz`mhRH{)cf$dT_dtq9~1@% zAlu=Y?F*Jlq+~Fn_=a$O((vAl^a?W6VfqY#^SV8?5S&p*vD~#oMC@a@FPpd4Y@XUvGzzL7az-(P_ zSLslzqOfGol~9wPhDNQSw9d{Cv1k+^Z$Q@X{?-ybfUzU^8T~%_A}&qNY}>o z@*K8==@r(CO+Iql)aF|8q=E2owJ)gg%k2hKy+t7?HObk`-BESTqmMJ5K+Vuc8dq(Y z>blJ{Zd|t$gdp}w{Rx!^VNsit9OVt6_a=EA;vz$u+%;@_&(NQ9fD~MefebZPElm87 z)E44s%a(GkZzT>QC!5`H9MdCLje9;0HI;H*pdK3)2Vh9ZR%!~zLp)10f)7`E z#nCgF1^Y-TH}+E5H7~c+1WGqSpCoYZzizVAeh9!(ApPMahT*7P4UD08=2x=7*|2Oj z7miWUjwL?KsUCC)atCY6x<+;q9Xo}h6YZhvQfr~h3`q;A#iy57SQERRuJrrJCxmAMs5y=2@13UKn+4&91IL2 z)f@z1E=8|`eQR>^xt}eyJE7cwWWDIcuyza#4W-|9|5cKV?|%GtGDZ4zpp@=U-hT4- z(~!Shl-=`lGe&y<53hd+^3NaT|A21#kNjOQA*0>3g!g!p8`-RiAMz11Bm$%ymX@Fs(7@le%dkqDTF`V;#RP)q5PY_)g;s$8;n(vb}-lQ^_Ga>yUUq+Z0%oH(7 z%E}#3D`X<2oOJI(p;S~`lb&)kpts3eMpsU%IIMyG?xG*~!;ACkFig1IjKR=>O3TNfesxMO62np=tHN$i#-)AcUMv=Fn12WuzlY+MClYjB_HDumXO6i z4kr(1H;ZB$ZVyf}f-W*_?s8Q384!di*njKohK0FA*#rcY>pUAKJ=#*LXLhrC%>pc~9zNYbyyddovP^q%`YjoEyd*%;iE zB<%M#=f{ka+P$bPOX_WU*P%CEcauu#CDWp4k-Qus3P9LMfTz6m86yQkkimJhR7Cs8 zt5%<_Lu_%4Y83T1sHNtZCD$EEM8WHSi|dXpRnE;*!t93Db?8albGs`CuIrV{p;0Yk zk2;?0*HFt1Pu5helXam``pOw_1~`1bB;2g&a+O>8a*cOc?20jVfuO5yKTChP$`+AB zPIrTr+MTp;471!Gxj`0PLEv~?ma|xC@?c%XPBYYAaxQBB93&4Ly4jT)- z&Frw#ejL4yq4f~=ov!9EjO!$5Z6D~KE$w;i1KvQC+OQg@6}oZ>1gwjqQSDDcJb(H2asK&V5an)~!v6xOBoYqPnCZY$zz1*j%YrJC zo-o;)8(-VJ^pI9}8ay^SM@EW^!_qsloF2Y*AO z!8W25EobuW79AiDu`yo;Egh}T1aO#bqR1T&LoMY9E8@v@sunbAdj{NFyoHU8h-Fk4 zN@EB~k}Q>cK1N2cxUMB6SBlofj$%>_v%4y6RaiH^0a=ljoCeEWa?Boq$5TF(jhIIV zPh<~SW)qTJ#%BlbOh`RJTi#lTcYtthyLguJNCy*W@ey(h|J>wC9ssl&4^rxalj1m( zCg3Q^o}Yx&lalN3kYsk?2BB*xAH_pJQ}WS-ki9{CV^s0l)i5Z1E)OuySU&I>h9SQ8w(EEjTQ9=_)aum)!-Dmey-n4Hv}FKOK&-!ojqF6C zdV`q*rx;;OqFYFJhNS@x`nivve-Y6S*syK?Kd2(86=f~;sL|-6$E`q5vEx2kjU{^UY>Y_ed83>Mx?>?8+>tyd z)PsDLD&>0~PTBP|A9lG4mY-)gQLd*XA>;99i}nzlE*h8+S;9~t;qh0&e9b}pIW0RN zWQC$UNtS|uyQAOC1v6(OL1zMDuVi>uPo@g-y0WipayTsiK?m=x%%3PE=n5v(tf@$`BMB!Jp*>My>TMlJ-E1YicCs;3u|~AKecX5u zw*%@AF9%+ngB3uAO!ae8iHv**2VDl}0M*&d@P$^u;g{N}FOIqMjy2_kMl_o&NN-AW znJ02U2i#6!G!##dZh(4elddl1$U#De%gqUm)2b_uQa)S5cJ#R4I7-n8+aoTJt#hW5 zY=5e7bIGF$@7{KRRVFpPupGGswoG&9T~34LsJC=i1U-u)n41AaaD%)%EgGLBh#FSp z$y7ZQG#}jfR<=Aqb=(aH>c?z$-rb$CL9Xc&Fx5IP+I)6_6+Y&|1OCJlANT|ei4BDJ zExS?7{G@bD3&ziuMqax>{06k+BgCdum8ogG8pROgbW_S~=CLp8T0hOFu54qa}q}J&DflczDmTF3v$`T4Msn4aX z23eJd3mRZrv@?ZGHWiEI+F#*!)gOo=iIr=lp2+ML^?+nWka^f(PU3g zs_<)36Cl@->?ia;4Cw=x(&Dl{a=~tc!NV~Ef?~05R=!9mv^qM|k-V`U*x>~3_3i#B>uosy~#(jLR{ zVW)*AcVL^M3tOM{L322j#0^7vwqrX=LmloxtHukLTbibDyBm#9-CJd|-wf{Z6dM?! zr^>jCs5#0io0j&_oFLZcenp&yEcVK!hwLF31=bmz#^A#>w?V-lAfo zy#&WS$mU@bPsz1g%!QvuZjtZ5c>63I;Kg5s!=LC=NjZOtyz}$R`~NGveVZYRlYN$b ztH(u=Lar9q*`|hRR3>XaSj#?ii?u`YZthWgf$E2`85I&OJKUl`Faj%x`_W?D#xcJf z6`rJSXPUi^y+JbfX%@UAm+NSbe%NXutUJUbAJyts6I0~xOV+6yYb2vkJoEY0^{RTy z62IxZv4Pk@zet!%@~9&fTg1>crbH-ZIVHNz-NN=@Xoexg66$(ct+T$ z5lPp32BR^4Ivt+kLx#1A8?V~!X;+857F{T8_ zB4P(cmpe80b}Zr@m4!2Lj7N5Zt&i<@w^>1(`8c-_6OlYOY~88mi1^kZx3lnxeePxF z+&zNic|qqw>KJcdwP-xG=rU&);~e}Te2i%kr9RPcYfqylD`7A)9a>j+Yg7R5(v)Et z)l0(#LFX3z4o3;KfICZFw^*yLk=Lt^wF!mQEFObnQ00w8x4Zxjv<6%B@gLm9ER7W>kABU8`y7B(uKOO2{&C!&8)bJB)`M^9{zN8#VNDH`*Tby0Uy4h7P3d5J#6*cLklS z(R#9pi0!QY@yTFk1PneqWr*T=^wJe0_!r9%+0a z^=wQ?e-?g_`l|KT}LwZsxJf?z=v_YP;B?n2QvFZXr@T2CDe!aF<~k0D&4f za(Th^Qo})TqEfMBS*h68jO>u>Q;#d-CKOci&;$y1(>h8(US)?-PCXJOYYV96KSy$l zd7M*0bjlqBf?>383ldyS5CH&<^5KlbqkkYDN_z<`7RWwqd~T11>O+2&DK2m87}~x^nS#G?wO~#9b!@0Rt>e5(EdV$Bm1Q^} zo{K8}=!3rs|LF+V-$;7=zn>p|{Qa-tKOEowGN6I`^S4i6B=W`E@7}&*V3+Uwk;fn7 zyYl5VD?9Ji>?5q_=kVMbzxg@1bvdSbvMg2b{;;#WqaS5?CN_bPtcbt2CAtOeay0KH z4fL7(mYFTq8pgbQv)>4x3<{w>nnDFv+BoM7*0dkrl$k z{>Qsbl7cy+C4sJmqTsR=6s1G~zFPO|>a~L1Bc33gKuHQ??F34cyPf_V04vz!+sVt8a|^=C*TMKIlOGcc8?K?YoEv>% zDe*zBupB$iih3r!qRO&$P}o0A4nY4wJX_2+3T^@FuTBL*y%Y0sI0fcnOE7gv^TF!b z^)0&fpf)V51q^5D2&`L2ysQG-;6CcMOksn<)XmPfL1bUQxV-;=!rNDumls)t2hi2c zzX^kJ-1ehU*1xq;L;uWhCFk>Ix8Bx6-^fB22)QbF0-lbS*s9w+4)S*FCO1E&);9d* z4hAIqE6cX;5Z#)i%Z5NdyTk#$Iu&LC$JFCdhnhYMm41NGk!MDTPub7NvKX(|Q0$eI zmBt~2v%3%1Gq_-f!bIt{r zbqKa;bHl=E)JeYLVxgbSlPuR@JT%BB{1KuJW;G|X@FS-~GE^Lt6LGERkTjO?4GF`e z5#{Ab%6X4_w3l!)N5v2ji@L&6?WR6;lBSJmec`RXS~mvhNA5GXg(6V5bk%-UzMr%1 z@?!V>5S~VG!$&mLYmV<>{+5qW_0?NPZ9nn7;nO%me*n6=wSYVD@%fs+TRid!0lCThdnqd6HKC!vnl0ETutCc4aQ}!XdmrKMxs`Sa ztMckmZvs(mA==9InBl>OPF^17xao>oT%vvC@dx9W>6jQ{7sz;%8QD5`Rk&Xe0#1Mx zSX#+DqfhLFO^GUTz@8XX9vU*mKB7oQoAD6bKof|rZ;-2>+%yp|g z;DsU^q8zOPZSSfTn&aG#(T~*LN5i96sjrnF{afZ7jgWDc4d?2DfZeD=n0(w$%O0$L zS5GoZ&u?H>+9CQ>H?=U&AyCz9IyN9wFJxe>tB7eq54AiXl&$WLbb-Tee;ut2+sGf4 z$oOp9%V4>hOpwD7fs2v=VqzFD|HNDfg&&ceO?=$27~Exe_WQmG_0^*0*+&qHS?lFG z$(1ADXyjSHqWMJ0#q_MGXC)U&>1^p$R;2*|O%1G?(bdk82!WG1ZtjVIF*C`scd&fL>nd1&K`R6?<{&1 z`&l3tLKusLtErvUKq2OS^>hKz9ss<^=|B!q-~BDWhVMUdyvh-&wCp%NaefsQi)b~Z zmTz=^(|_~xfA{(eV+x{LTpXIQANn{tLdEjOSVbS?V^v7gSEw6YkZjYGhX|5bmA_}z zV}mZ=#A8@#DJDshEYy-1rFtPbBO6o=Wc6P6i8$&$J4CnysAxRlua>ctO~d9wl7~yq z=XU2R;~=HLy6ecDkm-2}J!?m)+mRhe6h!}r{ls_M(UOvqa!8kV=x9t^hfNvvqQ%G# z93PX2z+Bhq0T3sr8Kz`GS03Ij!-)RfWq1lLv$2O{D0!JeC10wG9Dw$)?-rOg_56-i z3*okKD6}!n004h7n|Wq#HD`HBgQVAns{<(btO+i!T?0Y2g;NaK){SmZ3z?7xh%gkwx}dYkomi&AAp$gnR6Z>}*jK;?YVZt)dC5{XdNW*7@s-;xQ&Dlx@*L=Q%3c#1D{ zA&VN8WC58;q+}1sli532if}J17C>Cb>I+qyTqvJ5C-^bT=XLU83ePPi9|P;7cbjaf zt5<8dPH?JHZHim#$r`MC1~xM-@6(Myc}J^ciqkk@kU=J+>=QZT%*3E+rKm3gjZZKX z00IeKWBzQ*8NE1r#*J9wY`Pu}XDWit=>xF?R>Z^{~0YuroiG=5m`6 zSyNms`1f#rfVe}~Y8dLGrbxp@Y9bT6kxHDB6S7CgN$EYVIIb1EeN@@lZP2g{P|Q(0 zE1E`NRMTdF_M2D|F0?eRaTyMBkP!roq9xRG^>rZo?0%JqW zeXv0sc06+SfwQ9yV^L-st%I$q0=Wwn@*(ZukQ>cw)8OO_dD(WmsNzp`$T$p2VU7c6 zuwgfw9hj$0k=_Y#SSE0>Zcta)FT`}(8ZkfkLHP505Z?dT=CmfD`#F^%l**Wq-sj`+ z?|maHh<%j*4f%`yrWfq=MeGQ=Q3hC~{J3nMAc^8d{+j#IpV>5-bXTf%Bc=!qGD;e( zGX%!Egm7Eg$3$_bK+WsmNLyN^38)%KkNMUfahYxe|0=l2ug=@IPe$agmJ1#;gb$$UX5! ztRE^BQA4NDmJ*7!{$N_i7uniupH#!fO5zs&j|3{ zHq;zFcKadcw2n8RGh1UeWh&wXRZ9X=df9{?ZZWnrNI4KI_yEU&GeS^Wh&lm~XUQG0 zf<+$m1?~V}T2ol35J(}TORa#Ca`fh*_YDG)1+W8!oVg_p^}M8vJc7WSvIG`;_1Nga zpka~-6itXK70|U5t<7p-hVdJ3I`3G~N|V*#{j&XN)lX8-N_=X@lNi{r^*T(f!S%)< zFo%D2H(s=n|AP79Rq8{!kieB~k({i=Y)bo+7VU6L5N#%D#xA)hI?#(Mb_XynLUW$blN>3UU=qg;Lh!k)4lpdG6RY)NC+SP|GUW%6r<{vOo?@8NLtwqzXSswuglcTeDFDHji7@Pz2;%*D}kD2FXfCZ|i4 zaAXN!8p8|6GQb4oZ%gB(xVf?MjH$A*Ol6xxxj zXtb(U2p^#d*1_ia-2VcHTGFrAk56p8JrC}3gnEQ)`9WI(ypLrB>tn+0mi6~IUwcG2 z0u791%8Um-&SmuOsXnNdAU;nsm9r}aUy@0;QA`DLtpKvD&F1JtIa^mB$0!}70#a|5 ze0`$?m=;R`Hnqw+Sq#8u5m9LkHX+<0@kATQWk*}Bu-%=H@&j1#3}}EopzlL~vJ^M& zt)P-!!;AeYm|aUsJ&%M~KtK!E#epk}_Rr-8r}7~yB{T)+weh)STg$Du(a*M)x(5RW zon;@T^0I86tw9h&a#D9tlwT;Tf%61F5JpN~v~bQ_!qqfgQ@Af|JVWBAU0nzk)AzVQ zw;RiqX{>Bb{Uu`r%%TPze_5dueLn_pdzVPUxE005#$X7$Mx6|gzMAB3?DuEeu@nBRQLzg{Q_JlO zPy~DZnS8}iiAopc4!vs81u=B;0`eZjH(}M?0yvOVq|Ckz&7^^GvKTk-;}2;+#T0m{ zNWm=|0dkUJ2JDz+atXk%2{OhN_}+300Oczzs9g>@ZES!u>2y%JqMj5cmOjc%56Mvj zbTR6qR1U;~7CP=*vwjBP9)!k?t((_Kez@Lw)NE$=P4O3Fm~>v+%6({&6U3IoL8dS~ zZvF#N#V*10%&=^b#+Hb?_$Cvm2`1X_c|M2>!ta$d1 zQrQ0E+sFEv7g#RK72c6IB~>@GOhb*nES#ov!-YO)6%T-j7l@zbfC_lbuXKN~04r74 z%xUL6wkyS^V3sW*)R!V2kK3SbwmvVAeBzQ@de`;nN~i=31PWKxZnfuvo71Fc*u*t$ zC)I@QovUg#Q3|8*1RSvX-OE! zt3xhY!u`ZlQ%=gsgM0=mLpIsYTH|xNR}gTTnYO6-IV8DYA;*0Z1#!#3xrJ$?{DiFF zKE7DPRX$Ip*(M=96O6cr$grl+42KL9~?$snyaH|m@IA%9A$I~B_?7lqG?Z4 zaH+W4gY2NDgAqVw+>-e!f%d$Qqx0);O$2~&Fxe5{j+#KDPE07QvGxRMc4KLWcEt+56B!#R@d_az>V!I zSMB&&a~p{ES<7Ww1+rdZuFz1bw5>(v zsKb_vYLI*=@bjY|Ss1h_=g;}@lt8+b*1z{P{Lfy%uSbOa=IuA(hxs9#a6itzFF(uA z=-)P4i5ke^l8)QV$}yMcqh-#IY|vy8Aj7~!6q55*F-AnsvR}Ica?e;!KkOA8nn(rbVFhl z2HHmqWfPM6bqDsBRFmxGkdL#ESUy&&kA=*zEKbxzT4bJDAjq=v0Bn$!A+7~SAf426)&Sms&uE?g+RG+z3#3)6w*gr~-Bz~Q7~4W!6?{5El>SYp zrj?Z6Qm8Y@&Gofk!Y5RvpIzG7Wg*)^IrXw84(}9Qj=4pWp8$ctJ`mGF5AUy{#NijCdZ9$x)u#T*>$!veFlI=nY21->oi+V#H zWeqKpA#m@IZXOvr(q>+isQ`Wn+REcV#K;rtajoVdCcpv#LJlzaw7w(4I)(MYc5P|5 z(&qN^oqCR#y>I&^cMx)v8=(nrhj5dC0@}K1^c!h(f(+Y2ot#d!6kv*1A>)%rlIh1{ z*=FsgIu|0e)%WMQ8gGv0e*OB(@PFioE`kk#+n>MvmNbXYUw;YTsxRKYc>TTn`$zln zmo~U~;4?63l^wRdq01hU>RCDXQ0bLjbHn6v0JtH;p%Vu>q8G*UPF1L^mz{;l!l87D zobKK(o7@RhC6n*E?3k>p$#f1EG#{7NX1wYT2sP_;cWUo#H)cUGK08cK`-IH#(AOl+ zSQ0c`9jmaxUd&0z{3t_jK?NM}lU(h%B=xS$5H}X}3QT*Y0TqxXEhc~*1grQQ zDqn6IL%dFMhMAnra)p+o^y|S;ZnZRCd8hYdMC_x53e)2*rWx91=zyP4eJu#CM)73Opt%^QJ0ez!4P zVzSTqn8fY8pl(Q(IjO-Zf3aKo7H7<)!(uz_lX}uRzvT%EbdvZbpi#itwybXRK5LD2#mWNWEd zt&oPLao75+4D=NiWXk-NxWe9Ei7nO#v|#r-su1e6@3ur~m#h>C1q6Or?W!b+$aBe5 zaqPeqQklsPCV)T>W9(GzX3ct@H@kbJ6af2yb%AixvapX_z%8cHRwXjwr;&qbB+^+1 zY^m6mQTBLzZe5~bydI?Z_|Bl(5X&0_Sk5FlTMGHJN|;k+1xFw1m<0l;uDh_0a(&%BN&-)_Ep2q; zS`hv$m?Ec#Vu_B6fvPEqOwwmMH89VQ0m#)jixrSA*%QD5Yy*un*9b?$|F#w5%5Nv; z_{iTJPL){{5(N&a7~rH^ng;4T*|oyd0wPS-rG()O5?>60Z8kQ`l`g8WhnLEDKj^75 zWFk0~scXzg<##daW(fw=!sg>7r@GqQ`T&IN&648LD|@AlKj)ho%#X8n!pNjlk$5vv zxkF;|ImDM>(>6ujWD^6EzQtty(3n}9C}H#7f>2j2V47JZg|W@{@0~ zR7sFU8|a2Z%3?v|G~RutV>2p({3O{4&3q)7lI4zf_gfu6V#~8_iikn35pqTFnv$D$ zI8@2>Z?Ohn4oN;(xxC1~l_yCE0@+(#La%BLa`4@eBz{B9=b8?hG}v*XGnn#)r!c#+ z*if}7GJsN!r)NB!2Cx*mIBg&Rvl-z60SHg4`bZ8)kR>`nSHvDcTzcQ|8`ouP zpxm7-h`T32ekc`^rR4Q69v;#)w%wJp-a7Ulm{!-3F5!scyJb>W$&s)5$5SV1`KK7d zIgth9VdINJc(mW4{!2}PN}~1Spb?j|+MlZbMR7?=|SkFcZiSrw`{sN$S$c?e$ z---?PUleDQJOk{GmP7F6#0!bQ&&j2<1bCW2KgEZQlCr4`tMyHLS4sx_Xao*09xDH_ z0Cmr?uz#a1gul__{~Uh!!yg`7z&Ee|gI~ky6 zi@tdK-Rsxk{m|qt z)_GI;gt2P$I3FIOKVWY}=e0b|$Mk50e|zU7Vg&FU>-P%H{MgRO%JWl_yb`uKmTiKV zF#2Rn9v2mzPV*r(mJXRil7a#Mw#{V74Ukb4Bjs~8utb(LJ$M=cKV&l=EQ4xADk%T7 z$zYFm;uox4}+c8?az$K{wp6xtPP9Ar4+=0f#Mxq}2yu^ZQd0?}y z8K+tGtb*%;8z~AGt-LS7X}(U@OEir!Q*bAhUEI3)u zPS|NuRi`5|)^(u2#4tpPSz@3jSr`E263eiVa_p8Uvg@;Bm?p{G0bI=i7QI->b2F8% zMnr}JUM~raj`3-TTtS0|##>vV`;?^NkVasqAt!(hXB%aL70$JF2eC2@w{4dUf^L9| z67#`o={V`axbm*)l0PHqfMs;W1_x!SYybicY)%#_@ji!#HVJ@or*7_*4n1Ci@M91B z|1}FuggfrWz!DqO&n zwG}j9ny*M6&g0dz-EVn2c7wgI{~SAjb>tvD8T!tY&tWib}vRU+f`n`>P4i;K$u z)(Jxc7XyFc%P`5R$=r`%7f|1J2yD+{Mu!dXqD`7h9)8su`*(l-{-d{_Ny@Gax)WvA*?|!8wZk@q1J}b4mR=Kl=Rj_irD)|G8?~y#GQn$glGA>b7I{68|8%;Xg{I zDF?s3ya0A>#l)`ePBx4OWE{O!^-^s+PYVG^NW?(}ir#MXiPpaL6gPpCKf(PFIhv_K zyUyu$C?l^eM2OvVRz1h!B9RZa4P|?WVC*iX(gcE!VQLmkHb~b2sL%q|Rgy1GxRy_L6Us ziJW!SK~%moJ3^2@A!$3*HM0J@eW0IfR$!sey*&q0s7g!wF1W8aTB8xF;O5e40jYBt zDLp1&og&&#h+PtvZd%n_j0#JMh!ip?Q-V^LlsmG=oCs;UbqII0(@_sMkPaNDhTX?n z1!8+*VQTXOpB>0q0iD+IVc1<#yp~+$<{T8HbF$v9I<>abg)^f4Ye}V<7F{t%&cW&) zMv5yWOwIEVf}+*S`1WCNUr9MIc6TM19n$;I3xU7L;j*EAVA}J`$(=eu+KgSQwg}$Y zLQm+4mOd)pjKaL0w{SwW4_6SHy}?tCeOnelHTfqmn-NkEzLgU8BDYGzMw}`Ja8#=% zW7r0>J#Kz3PLRwXLO%AVOIBtk6{r8Iy9)dkJGW!#3*?cxjch&JQArARj7`Tf#BGJO zC7KXX#pEdpM#f@#4w8!WvUY0wRUGfXepqo^pZ44E{U?rB{qpVGvqIQsuU}E`fj&NO ze|q~Sy#6vDT(mU*7fi<7?hLw*KZ7LL@2r;JQO~qIjPjqwU}(+f9#{^)v z1;YnpKEgUB_&WSE%OR@8Y#Cmx^c*%7{E)A+Vzrvfusl?G-@$$ zlrvL1D4}kZPwXVWgS+EM?+FyFi}R-C2W^sb+YUC>ZQO_nx;24n-&KY>TcFJ2qU9D( zT*FOOB=T|Fqj&vsY0E4*X{by2FEshT`~>_KvE99>!z*Z9R4S^+F0*3mE?V=tjzu9` zY{iRs-A+uHYqueR0WH@e9vUfxWtK|fKUFkonW7^0NUwtz!tJ7%%C56KRpN={LU5^- zFo@|zIMf!TfQp^RK3ShY_?^sZ;H$x=LzR3WEIA)^3YXaI5(-sYEeS%`Z z$pO2AsCOBUH;0kaV;@j7w}CNGw-q^Ste4d$m5R>Lo0Z^0HB1D=O1&>Y6^Z~fk$)wz z4+D9&Vifd*eHFGfa4V$aasdar6L2>Bo*95?R)Pu$jIm$h65Cd&g5Zm;(RSS& ze1y?akD5H6wg)It9>J8gkRuq_C-#=_(Cv3aTXf6wA+$9sXQ<=!nrRt`o;iN08u*k( zTHPy;o+>$`lg%<535F>0EE!o@J3Lt$8e}2D9(LorO4sK#-cqNbuBzBZlzkafOq)(D zE^eQV#uAjeqL01MAo2Pak|Xot4;DuYbO1Qk97id2RRSm4X%(7?AT>I19Fk70>!GU= zGPhv~mG8DuGgNwsNp2+fr|hT;cU!QSD%bbgp)911kWlGor8%kf7b0e3#dNq?-%)nz z=VO!wYmSwHlxffqRlqRA7U5b`Dcnx-rm=L$a}VQNH&K8+7zTH}qQe#cuKI~mKa6w5 zxw~A2HWuneBcGc9XT($@YGFoO(-z?>m(Mstq3B@lWj*Z{oTrlNeTXd!mA$fPjr<*` z|K07$0z7emk<>9n&QhcXFT8yRuZ}a5n{lOa?vQMAyJI@LQITE}an-$NMrDk|CbNQ8 z8Vq06kL0TIjTj8kiyL#M*26H|vDK)N(;axWaHmMm=K18Vkbr%7lvb;5YPqYRx7s*B zvtl#nnX*-Ur^i?L$3Vt;fbqykNGQ@0x-+0Pd{}A9T179V-Whs3VA(nnv`S>cRZ>OS z*`xqqNqh2*FS=H(foWt1Bgs*{nd;h~34;v?AexLFzPY$F^-`z`rElmR~V<`@7fA1G)XXYN-*h4q(^-=@`rx4U$GGBpd-}vpfPZ@`!yBq0oDW3Tu*^Q`=u&A+LdIH;7*na3BWTQ52&O@kW3p)<2cGWf6hwsEDlm zlwTwAKIB@qG>~+T}fGQgh*NMrF?s{ITUOYDw5SERJ!{S zECHgjyizCnLNqh<;R&QbejcGJPftL3Z(%6`^g9};}hCH6gqbj<3XP?u*Bf`zT` zzI}Otea;8o3N20`Z{j}hqUn&rz;xRN8IpEZ(QKId`0O4t0V)wZjtrUdcdo4T2i22K z7|T~DF0uS#ejZh*)mfLq-wEG`S?*Yk8UAivMdja^*>?=@E-j#OsHErIS%i>CuI7jA zUWa@sM_&n{&o)NsC@yyNlCl`L(L!>_goQ6i`^%&mpkKy)0hc}BcF&@sIMhm9zcRJd}&vp!HtC9 zp!n)MI#Y=oiV7T=&&f5bQ0Jo9%~2!U_s*c|2Xi!n{@wDiNAFSjtMqcKCNt3{Xvk;ZCixgjLQ zpC~nh!88HJU`|dBVVA9crIL}_Z5^6Ai=0>qs~uXN$SUv3;A{_KD$=|#UN1`>xS>KD zv`1{tkHP_cUJm}lye(3PNN~POF`+$AD?Mh_Y01JFt50AkBRi+FqXy8^Ofls~?)MyA z$(@^;F%9i=(C!hDq`)p8QXi8xk?(9`O>(*O+tA4jsGZD9Mop{oZmizGdF3!N3W8AfK7J>HrS}*TBYj{6ui* z+Yb%zAJXRuO-Y7G)?%FJ9s_!Oo6Js zNR9a zLUxK2tCQ?(#%x$*gr2}5i{=<3bW}?ovX1~8rah}*T~y(+v%d@QsKRM&cR|}jvWQCo z5{FYXfIm`wu*4Nr6!KlptMz0|as%5v67!snTy^DnyNy?0fErQ-cyw{9UC_D&kSB|^ z7=7GG+LUt*f)dQh|Ln}g{4BhFeR=;G3Uh4;I#3=86cd4ka@Rq5lnlu(LGd8g`ToPa znuJM9K#iO3m`k}~rh~)|dUvqV@u~*bhZ|w0tcTK7V6|}UqsBzX085Jc#H>_32zsQa zx2SqSZ2>6&223;{N4jfC`a=DP1?omUQJ^V!>IxU|K`mgwxtOi^$$99SMn=BHakL8B z2tIJ1A-ePgs-%3%)i}0VSA#q!Y4eQD?Q{8JN^kE%+<*;b*A~c}_L^z6`3c#A+~{M< zB9>lRuPVaV$3wqQwV143*~%g#wniNS8v-_0$atOUl6?jg`GWq0CK?Tc6(Cj6 z=jefbV~{dLsVs9Dpuw)|ep=v00%k!UEs5{gyD8l`>(H*p z2!x<0bUhEJZP@^_2ta-)1t1Vp7PkQ6#hm9*YJl-_Q zGzkcfkcY$$W&VT3HL_8Yx~5x0b33}fRXeG#y(dkQKN$d~L_3T_G^B|Ywd-_*4MDp+ zhxq^%S7s}+GS1i?r!~WK2Dc!S5|nC@3cmygg*hXNt1}xNfO^;)7fN+9Fb;6<0F9|f z9}$>C2G4okI3Fm_SVNDk@G9wV{wDmNM|k`8?dO39$FtwCclnKJ*M4)>uKicaa{uD( z6MI(j#@|DiRu3@r{^<3i_kSPWJ~f;pV2+`s^J~Lk@*u_=eM}gfCU*VqkTR9pXbd=M5BVQcksOWwulJy(su{k8YWhJXN z?&d-y5+~u`=3O!a>!L!>*}=~@cL~>v2gGk zayUi`D(_)#CC(lLjzI#!`hj9hrehN~3H)@T!fw=JivXhFI^wefMI=@m(^HZ6*z)_V zLo#LU%T-H_lRkPM?gks$4pJvv32*`%x_xvbg^{~fc@hv+K&0y~o}-DT|deo}TTOYE_0D@7FU9wtZJrMS-L*a_XD z!(?Xx7R83#U>{9OFIez~!_bCddcNG& zKtmP~{DJhriNNYMwDp+ILj0=fCL56RA=O2mm_*r85P;iBh3)6oZLL=|0P+zvoFRIW z$5DOb>VkX2&k4X{jg+^~5TMR-ICaCGHu-uDtFt?5K$1ySyQ=AzdZn5QZx+>%6zlMk zfE+K-%@((w)z3X~Z^DMr(vBc&eVdLdnm!b`Li1nhjiks?qg`sSX1_aW1Id!?YTP8( zlNVp@zNuQ-=b$T4CG8Q~pk1|-j|3C78)=#;iwT?@ib}lgo?V`DJZw1B9)^s}q1HOB z<-@?;1ZAeh*~AM{N-f=QvlRRmcIDo#)tSrw3SjmHdcG1CAsQoJ(W>vW2#&=>M1mZ^ z7Sy@2(d?U%|CX@govE?)gX# z_!(f<5qoOck~XAs*x3sGtMsbL6KfqqV`*{JSf@=aU%#kN`@TOFgm#v z>$19P5r*JSjn}bjH(HM$-GzJyOj1WX3=?xNCBlFiYoBhCjV`aoQJVzvuQ?`Erv|_n z549o5WFk{$t!ggVDg32FDUtGn$;|)@18SHIM0RUbl`CChl07~Fdep??DeoXXdm-Hp z%j`j7Yma)!8Rrtcm`OuKf|2s3@`$0gW~CJ7P@pnM$PEi?Chw)yrpC>N;t3O;o~^AL z9HLE^NUp|V?D^D!tH{8V@!{}BW}CJ}9cR5o1r?;|DISt4+X#>&jHHw|sr4PA-jr=` zG*Q`uZt60A(cMTrRr4EEY0YRCPJ&w^j6;F>2DQZPU1Sq3J5>^-VWANA-e{0RrCgh& z5&;%XQ#NS9h$|RvqEc2sLFu=VxwRUhEsnu#H8V&vn_?9tRFu+561+NuDKDpYM=a#$ z?244#R(xQfj=8sLyDL4i#~c7t1+++v%A>+J8v&JbI7a93a7ZYnnuXjgHyht0Y^o)5)`mDsWJY$OYJAi(H_H*sL}7_^B$f1<-W> z`kB~8yn+j`>^AO^-`-ySCj13ON4_Py@mpr0e+X9Ee+zE>?_757BVe2UaK<)4e(oRN zJ_d;W%gc`Y_W^lN1F};gt#Fr=4&K3W9tY$ODjR)5)4Q(&gT9J-x@ z3ZXZNcqEKvB)(7b*H6YWD{zb;a@)jR;=K*GSG5v8fxFf*T(4|7L9K2%{B4pd{Y`*_ z@flVHhz4w{wqV1p4&+qp;qkIy%nb#i!$@$#fYB@Z3AQA$gAwKFHJJm$3ChxG-LW*> zL|i^>0SBW{*-!Z^)_KMIV}_nou!S26l|K^^aMawCa3?>*xr?;v=BCS%OPWc z&>dMsn6k*(Hwz}6KUv6Z;lByQD>EIa%3E__J3Q{{E$npHp`r;pwb~?Gxi5Gh>DnEF zfmdu))~{8gUJ{G2gR%9J8o*Zb;dO-`N{-E-5!u_w$flxQT+euX6eAqAWEXe)Ls{@9 z77J!O#244rnUZ6Vm8#mLe4Gk9A_HPC${WL%8uGs%(Jq>Ws-#*E*cE8tWUbY@IihQB> zMTs#NTn1}3pq?tguY=<~B5bt$?;&yNZUOq94*j}0voY`CQJq3HWb0iHw1-=v1zbpu zPb8TGSI#sC4Uc06k8TcbZkG#N(8GKIsg-I`Qp2;=aCI~FjTR0ewamR~grP?|843VfK%~EoLw++DvKL+cS;%>w&Bi1= zVufCYL&IMQ-KQ=pMqmR=${y|FDqXre#}OUoEDS$gI$nAMhL9v~FncH}A$c-VFpGe) z130+|nblJ)fqRhTMeb6Xg{?^HcByB^nqz*QZyt19v=Wv_X+aNWiR-1&Yglsjuimf+ zIlN^@0?H@=g-S+>PQ>+;tHK&~rFJjyp+!hk2DS5*`baod;Z^2p9s_OM(l=_67x#qVx`_A&V^#R9fO4 z_xq1y@{fU6L@|Wam(%z0)T}Sl4+$&JY^tuNQa+2s%t_4`g=w8;vcr&2P*jVB+yhwu8 zF|_sP{di~t7c`t1D;2;q{1EeJZYBtEw3+@nPPFq? zs6E{St&B!Nrz>o7 zTMfB~hIr%iQs7hk=n)9>Mx(3-PYn&Uv&Ue?FS|cvl+4qduF*a%+FIRWa$X;`+q_Gz z2i3Pz1nVfx7fZ^1@V|y19^qL2AGnd9{l)8_0Ze-TS$O-zsODec@sHu{8xv1{fZ=r7 zH|kWN6EnL^t(4pfcF(KP4a`~)A@d*OlLY*7Z1#Zay!dXl$#S8pq3Z3pZosbiXiB{@z^k5<(`YeGkC51S zF};t|yl|R{9?)EkXnHP*9*i?)8ZWj9LuvQ@(-cg8`y6|kpC}mKVUtoVU(!l>VMNZO zcaGv#u5~GfXuC8H?L&%j8&~hD;z>Fp(l-TtAcs3!qfl-J^PpE%WLICmwTDBy+@Xp% z0$M%NyPEE3#7rU|pj1FNqA65(W1~ww1ofqsvwchjZMZGz6Zw&d>$}FEV(gqX2`di# z8|{x>0~M4mVd1toXCKNL$YYnN6zL}jJc@yNua@9F2v_{8oAN8>{IXCFSb69+ibFXZyL1R{N zN(-gzffzVDH&j_XU25y*RNbjRU5)C&SThD8yMv#_*ux_o^Frc_pmT|#xLlOHc0lu9 z53PCC;B3?JtxIUL2GAH1ZknRAcsJM#F^`i!{)doIpaxE z(?y+>99g~+HX^ynx#Pq{tzLBNh04;J;~XAvcVPR-yMg0d7@6~A8jid2+`SoEgQ@H6J?h-f8c^3@aHjU`6p&?D^jt+DdtBfY}%?GuOB{aMOux`X? zA5y(JM$NT~I1i{x-ycDCxeMa;`BRE zy|?|;D+V6HY$+Y+P5rJuqH9sP_~i^D{!)3xI#{C*a%6@Uxeii=cj@qfyk=*gyxmIT zb2d3kMQqCTB9V8j)%Kuj6Zzjz(jg8;V`dVHastxv{tIAwNlJS z1x`uhL4THA;tF@LmDMUXM1m^J(NRN43Q)*GXH-VDHL_6na3diA+6-td&(853H@#)I&`D3{bI(=#RBzPmiH;ejpID{0|W-E8O4cza03TNxb$$d0Z z^-$5_yFAEm+Gt^u8bGDfo|Mxt#E2@cj^vv*v1Nv9vVM|OGS-ZHQXt9OUtFo^9SXr| z3)hV*Ww7g&fVFPHaKFXm=^J%`G)&SHmI&1i|>Wxr`_2U;X9 zMRJj)PrN}9F}Pb7Nn(t_Q5&V z&=~=<`$gidB@N|>QZ>+Xq6DsWn*PcwvDCU-haYYP32f7lYl&j>;b0*P(XK{Z z00Z(!xaX zvgO&2IE2pR!ykO_Z-V?^{+FX#cHznV#J6AZQGfQxtwgL};N!qQa@8|sA5^Eyw$$Ds zU~efWwcB+bO)4RldIN4y5O>ndF~=*k71s~a96%|Dt#+7E=yR33sNCm3E{*D{8$!I< zB&|i~AMkI8;d5I1qIOnnNlI`4k0o;m*I2idy_J=*#faE;gURkfsZY*OrL!>Sb>}Cs zvICb#rM1g-!$3gRO)8T~RU)56;{zLjTMgNMvTP7apv?W$5X2QM6{M{&I>iNl(ssem zwHe!Zh1~UN1OmL1#8J_tb(>Yw;7W9K-molPQ+8t~m7DC?vlg^63Cjo>B?Xwc88 z#toQ%1p4jsVUshsK=Ok_q#D{kw?iLWV%y{45+Rz^De2UiGP}j*x|J`q(d7}Ozd@NZ z@>Sju*}YVlz{+h~wXu>U{v2+W=}GxP`5((^R5v3$*$q}!<({e;sL)tMV!h|J4~H45 z9AH3j$I&Kgva)U~(byBgC|PmLQYwhiVkk8=J{#>e38_zlI>(&7XvYbjuPsylLYG1{ z(zeJ0A_YrTmAvNBgbj~PT>ys)J;Y53tBF#Dd*4ki8#l~`fTy9C9lQ+I$1G*3cl0A} zYY7xSr1ef~?9z2}7-@uWU>Q^q~KIH*N%l^?#t%mdK zHfJWF%#{Ud8{AcPR4;X!a`&n)c4M%T7;6?1O69Vk0+g!RC_r<9mfAR0$~wVnr{-Qs zj>f9gz+$ZRBfa9siZD9*a%lN<)p&z_eNFvIZL4pU%!RJWT!wXUZtCbxXPx3 z=qg#JEU6v((Dn-|Go);0yEawO4DS{%Dnl1F5W<##18@2DhUVVql3t}KecRq8x7WaN zz(yj`CBa}}-HCo`cfKcJ5FeN`%xoG1eyGLmNiCDW#@JZZf{g;(?MC9DWV9%W!6QyJ zOI`T+kexh~OxobKJ@9O}msUW$*(eE$F3;gBry01*M8}2&(?6Z`&flq$=_J`MR z-+%i0ad`bre&(aM-vwg}KB7w(s-A)5MJ89)$f>$V6+2pJnAl5&WF1Bf1qlxa!v&gV zyItzHh&j+{Tgp)9dkvemHBCN2+#p3l$=Ypbm2(cQT02g#9so_{&;&w{Y#v*uOs1NIUBfq8jWL04f9=iq^o85+W@qs`RQg(iV){ zGZLmC5@l9XCvpw}WVB7hZBnk)#)^|eDS)DeLaK?6QnYtu5K5fLUdghF^~u`}lk#fh z=~hL(6-^k+{g7WA3S7}0VfFpi_u80$g1adAuau>yrFG--Gyz3`o!fUCSvS{wcS296 zj}RBAClhB>>$IZxy*r1dF62t95gXe+ExidP)v7n1t#4C3>iT6R zxz1j4yp}h*SRZjh8Niz`Nfb6MpKW-C?N%yibJFh*88>?t@;JpvDM>)WMpdtqTeK?J%)uWWeF00cJff3z7%PEkNOrm>>iJvpS36@MG9Gu!9EjqxHJd_*ZDd51!@dE_O;!#Khe1VsC1#W(Z*Vn$RPvkH3g4^3+ z{Z_g(L^;mzb?ErQv3s{68L(&uM|%x$OGC&byFz!@GK@N|sT z6DmN;^aX>#r8pFO;D0-7ArA58d2^uLd77;z!r;C)0j#6Ul3Q2||R3reEl zo!MBZZnT|^|0Vp$Vw&oafkOzdt91J%3lQaWL!KM>(}xpp(`=7#0j z3}NPNIBnN35qSmDu-xZ|B_g+^GA zgdJPgoPEgV6~amkdrCA1-VlTgC&a1`ZRHdax%7^SCJ@joyDSSR3yj~3;jZ!y;5D(W zc8+W+jv_%J90xXtAvWX%f2}$VrpeQc6?6pW(cuYzLIbwo2L%GT>QS$I?>1RKkO%-o zJ#EluEylZLehU=(TAS3MOxze*gCl81d@zf#LsB@s{6;&qU|R;C<{-Wj8UV1B1^H3_ z3#M#@w4G$-VVC258yIZQ=hM)1?(wa2v4O)Ii<+PWj-1<|<2tgIS23ZPv_lmDT_Ho- z@u}J2{TO6h@1_U35N#@ZRjGyvj?A9b3hpUpCrd^FF}L}n_Caf%=ICtAisPYnnc)Y;x*+VK;KfFwq;TACK zt=rfrhEZd7j)zv>Oix7!ni~%hmuQ^fAXV#;!pP$Y-#W`{)UXm*tl1_8XAGKt zCl7K_T7ZU@6b+QC4ZggVdROz7WdiMeC4=9T#KZKfLIZ7JCR!yr&s1{D%ldACJ`~Fd zzOthe^Z+U(F9?1%j;I21wcwwg0P6FAL zP8emqqy#S__;^Mlsb)V`(9e1WXxBotqa=@V_thW(Hg+)s2e)R(o*U@`^~Xzp13>de z`SA(rChD2RCv2Lo0u?|bhO-4+Ajkppo?F!%m9jE163gr4!@Qg$I0AtZLGn~Nj?;k< zf;~A0-N4JBw~p)-H?i9ctYtW>u5V$>?V>3hb%8)Mv&anxa*x*#l03X*WSPA|Op$rv zl7_ZcR<`r>pe9&B_|~3)-=Cb%1rh;aa8Wf(>|Awo!EJ2-p{)R^%B6XrL0&%rz(F-5 zo(=x$Zi92(=nps6mh%isZ^(chPO@j*Oa%rul@h*sdJf82kta5`rFxZgmEggSAVhWI z^Yz=SE@kglxN?nNn2!STJXBACuS)8nqr%Sil-yI6VPsX2G+XuxS0L06)&y;z5PT9x zdR6-9;^V+-ba7M4tl28SboeZ(Ybf)(U!@wAid=pnIZ9gI4LwdSHab~zS52mp@`)tIuDz{Z*B9kqE&k%odKzC4;$fF|&g^=wudt!%Ptg@UXZt7#< zV{qhc3pLG0$p$qx2DK$G$!VUceL9Uw7hw*I?wM~dhS-}D204d*Ft{|BwmYE-9$=WS zakUy7d>d;CFj-dJGgk9BA81!5=+C(ItB+(cO@bCC@kOdYDR(4)+PS)`)=gB3955K&!DPysICvr zF9h0vt~+3&vb_LBnVAT1Ib%W1K)F8!CsK#ULoq)!yD}wo?Gqv@#CYSx)D*mKhnUNm zDXm*7SKJ-wHoGXHFMPIi92{-Ac+1j*W5+j+IzeQQa=9uf3a1=KbF{BYjc<)cy^`7Zwj`F{>;QIX_M+ROB1 z@X5f_uRjQFP^P4OHMlPoGtb=6L}oe3TEWyZg+o+asVu~&O7^m!G>tEb90TjHfLlZ| z?x5Tb_d}l)mmVhR%4z|l3cWPeam)FsDPW#py7MlqC4(1`2Hv91&I{c}F8b7Mxu&3h z5af=sAprz1bp+w2)e1^#2T3Qv3!)fWarm_k&=oih?E^(|5lP!}0Vwb3kk>`TA+J)E za-~#TjM-CG-WrFhG{KTH*s&~p=Y%4G%;~d)#lD5r7vjI=baKt*Wfa1=aI9b&*SSMt;8Fxt zw=i~6Y|}p>>4oe&>5498cvsjHQvdp?uhdq_(knHawoSOtAeogcYnhAzy#C-#L+2ORl`e=6#T+DZEp}1KOgNTtf?#&)q{&6KtYl0SE$(y|vmS zq@Q+#nV`lG7IZ+AFidv>`_2cFu`Cri99Rc^KYZ7%YK$lSZy#AG=MeNSj8W!b^U>SS z{_=O>Z~klE!|dhl_o$X-#bH5w2NA)>ETOjG)XplDS0Z1Ky`g%NyM~Mit1YQbEo;&H z#?RQQ$O<^VQ{yJ7wfGZ(I=#rjlRI`=vYO4|Lb#!fP%{M>f{_LdWnJ?KTxK}Jw)K|! zw69>o)YPKcoVTJPHM6UU$41J&Lxg6QeaT+Np|#2~tAzXFu1fbU6Sw^enZox!{>zV# zY0a&zb4KM9Xp_65rj2Ghc)T|3FRJL-6QWqPd8{xlqT0~r$TT}Td~n^B0X;1uh@dcN zE60$~tfjepzeC1qeO@wpbyld9aV&RSN5J>Bi7F-zF--M4L|&44ea_L_UH}2H`W14M z9u=p?t^o-#R#0E}4LRI6o}fzCkwJ{iPgW$^C{WA6{WVUok&z|vq?0Vue97TW`LwO6 zU<0qMEW9DDPy8{EM=-)pHgjrF;oIzYgd7i`>ZolOW?GPwd8qs&on^4xvPn=!Reef% zFe61u;>kZNk&WviWFOUp+)zZQR1B&;fQte_dP70Vecn-;SG61A)v`Ob2&TKS89BsJ zbpeZ%5W8RHN}L%S)eU0Y)-K*jJO*?G=gEFwLeer0$E3QHmFm3an^_WHn0C!ip0L5i z=uxdgjwpMy#sT9PEVPV;Xa*jgvGsF@+l z+O>tM7}x{NDFSUrsfb?^ll|m;{ngvg8PtBx$K$8J46k3D-v9jVSFgVg+0&4L?~mc_ zTh;sWO!(fY;wG=5nr5PN3VT6!g`Yio+bE7(2vK0u;H9(z(=(f9EducTg(pN=~2T> zjYL@1iy-)&M>*tVq`;ccClVm-yQ3BQx{EP<6dYq-Qy6D;v9@;9RsE1G$Sf=mt{8cl zCT*1Kya?)u;UlX|7*SKlvpkp;;D%w#~zd!lSNS!?>Ov&-o$pWhJ~=hii+C8Bd~mxjyuB&QB#Ln#6XO6(y>V4*@q;TH!O zwwN`nUV>L?TBR!GC>ARNKAOkfDku76XD{HfjA5cK%8+kjQ<1r$GUvtI2 zL*e>XAhi{)h^;!Rry>CAmhXQ^aBnuo1QBro7&PzUil5lY2k4;RhS{547(!?nI2%kN z0%MaW3V(S0^slA}uYabf%%4vWZNud-u!W*H-Q~k~C)J9C43F!%g4d6zXUP$0K(3FA z5x~Q?a4c9E+SFPx)PHId>U3Q@C0EjfmvYT8X*t>m|RBJ{g=pwYGVC%r%9P+PKBA}o^Y{rthZ5WVRa8@l2@XHIp?M7)rP;Rb41COz8Yy{GdH#)`0!Mt3#zo@oVWimyjq6${{$l;tH2l5ik2~3v5s7&?{cXx070E@^oZQn z)x$*Yt<{j#AZre`ffEI|)m0ouQZ8BGCij;6uR>Pl@bUuE&q2`F9V@*QllIwFO1cZ2d!T(hPLy_NL$aZURmYM|f zmQHnOSa5Kjkvy?UCGsrOJx_i^v&VR@nkNT_n+)73SF7B0Ye(j?9ij4zf1P0CR|Mn zHyU_BiCY~T=m!(7>?f|ea+*A=Iv?PHXesqxi}DbWP_v9Vsu)e6&$FzKo>2ohO7u73 z?os{L;m@NQj!NGv-9bhDu`E5;N%pdxV!5g1>l20No40TNnvC=IHHO8u!TSA=;llyR zZ(i*g*)Y+GqsF%t;xk!E-hPYGGAN{n4)l&zF#gMNe=~S247}v-w;(Ci`eDO*Z?x%8 zl{$5;g5$_WGlvDv?OK)6tqsx%xi`E?+)yR4ip=6wa#Wm{kQ|m1BOI0gpaJo!TBgC8HS^Pe~iT1;crD*frUo$Q~dDAm0H6-^Y2; zz-^2Um>&7*9m0xbt)79LAWQAgGLy%dX$cpX z*kd3?b+oQkpW1@+28_ia|_8U6n+=A0kLO*=Otf8)ui$}TyO{Gqjbql zL))&^OrZgxQBAR->4QEwRSpNWNk-=qq09pIJ$KiP>_XY6`tF!{j1Ellphk9j(72&* zW%|9f1aYLa_S>)?vYGHKr{Q6npi7LyNuot4e5!+7!CtG1mQijF`vmdbrj7o* zBSAVmB10(xhrLQ`#zRvsUL-f7q4a;X|AIa0lmF>IJ>zn|cs0S>FTi;G`0bPM`fZMH zBmCL6(~Aox?gKnICku0OJ{MUxUE;QB*X&|LM6Nu89FoC2>)IA5T@9IhYqh2+6-K|< zQzbeMxOwxwoX^W?yHgcPC$B^81HKJ8s1p`Bn7$o@d}OU!8y2Sm1Kq4PLy#Rtfs6Vr&4mJ_O*Q6GNd`npsd%3vE#zofDXI@qihn>sfnB(SH zQOX67^0|JdbKuX|nUr-F1)A#wfWH6CPzMqm2bY2reW1zXcnwWQ{`MgU0s%AhF$aZz zLUL`FZ8aKU@Pkfze5hQ{gu`GVQ{L9v)cruAm>yD-EMAcx0XWtJ>faL$2@So6hfG;3 zPKfiM!C#jrzStG4Njpwg<#)6y_AD8`6b4TYF=v&J%KOlEgqv{Qt9?M&Z2hG0x?_a1 zjt2gNaFzqN!yI>}Hdz#Zs29c6OpzUm&_49vrL)C3n+ZV41|_vC_Q0e=0wD-%I3L!( zskOtDl@@95C9lCBVASh+^v~>%pTk5s3v#t@NFm8Qpr&TD=K z2|HWj*+SR*x)m~L>q9)BjB<`>A;lwy?YAKlG!J4s7E_=)Uu>_R3XQyO^am&4G%DOi zZUj!m<@)PrP>AuR&vimg(34Jc)-g-a7M^-S6rL={*k7KhDe_KqFx04+PGH^Fb`Aa@ zy#Kq`EVA>x92UQK1j29Me#1x3etvWO^fx-)`G>cU-v9mUpUnE@V_3g@BO3-jgpmny z)1SENMZP!H-dWP;n+o4)64$aTBuN}ZP__9OmRO9g#vpoexAd?kyaojU zS(K}(mH>#iqQq@4J;{wD;Eb@yRz5FnSfJ`-!}M9Ts5>fCK(*?c+>B+yhm|YEL|*{x zS>gb^Vscj&*W^Z?Sek3KYEsBmIuTm{=|}b-kW(HUE7k5Eh*^wR@2$bS_1QK6h?%@m zMOXVqAY+FC0=DyLM%SRU9az*J7CaU{p+aW;p6t;Du0Lx38m@ZFsh1xcczdhva-0`9 z$LA-&(+)uQx86I3Q?kU+ZHH4&4x1{<@L;nzPy`I{LzNCm>j8h%!4xDBe7x4K3zz94 z+W4e}oTJ6w6n39hgMmQzt?eANA$IrC__D}?Yn$qvVy%O;8Jry0Id%+;Ui~C;Cgp`o zy45HQi4&J~S6K$jW(P`EP1Sj4qy=nCMOuRr0N4s<>X%+(ndagNGEu>m1I)78A&Cs6 zSX`Vp(?%7YL+;adZu{!?ni4PJhK}N+bHOsSrY#Oa&`$2|zHv2L$eZ?Vo*?A|?Oj#; z?o2Z>mB}zRM_e1Ax1LJTIB9&52l?54Qco_28p_?XwS#$v#1B=fW0^%6{g~U7>L(mm z{p8{)#s964EB` z=-G44$~dJitE8Dsk{z0m*j+nY!^I`8$E##$o1JKY11$_~>WGlG)w4zTrTCH~#o)w# zBvz{#OmRl7nezw`+`(D2olD?&wMPU%{9xwaw-pws{zEyM9_h+CIX5N_K0xS8Eth&# z(6_i27F&$EG}LS3H**&&P$!9dq(9vip40Xlm+h*iI42#DJ&7dX#2Ac8@`E*tEe+b7 zN4QZ_a}y)67$j@jl_*L{^~wg|X-xUfByXxBV}okidX@NM`QX(G5@Y4tr*Iir-ELv$ z4D0CSogoKOKkL(OGb5Gi0X=MNA6_ig>-(6m>Z88p!kJok72Kc*DpwFNUN?s|E|7^! zwWNV-7{Rbc_vs|7KFAJQ_nu^#k>wAFo`(gebk9XXrsc(Z+|@2Mx{w(F5exZeg(_F- z^hlP!?r?hl0At%kcW?>HSCH_3P6^Vuh4!>m$F(OB-I;r<3=(L)sjTEB9%sv%%0EXITL; zhpL5qdyGR_tKW$_k*K9C3EL@;zSj!+RxofJAT$#Ll$0(kN|5bA%p4a!NO%Y|Yuo`; zmy6Fm0;JZ4{i9awTVbVOp0_OYe6WW_vFIaGmR|JF#-aNQArz!7Ka?=*vD(*krYU9 zTOT_mV1%wN)&ubeEL|-zdaP>4Q_HPvWhK0zsGWEX#Q&!W_gH%gkIKfX$}V6bg;Y375S zUa6O&+ND&A2XNRa;myJN8JJI~wsH$Qs&eR$1!WDiV??@+cp>NQQhO7CStFwD9^H)V#awo%>( z@U56$vet2 z>%k8e4=3$9LAN?rSb+a#lnpuYD@GIZfZBEoM-{5_iQy8TLZ5_*LpKjH+}T!)1n?!Q z4rtyERh91=RHVIWNCF&@)+a~kF8D+m+&!r6upUJ%*E5(#1v%X+2vlX((n1@*f3QWCDf- ztO^zN#vu6Aa=3t%5h4cmBMnSL0-y-&g>9hQ{Z?yb@1IPL#tlBF$0#CL4N#^@bu_Gv z7jNOIQv$i#)B#!9E(`ILz>n8tO@>sP_ZyctWg405SEmIl`_Ww#I?!g3_{5=d@gQAxwZVlbD) zB_(9HU?*c8r)~tomlP0!i4;F0_tgsWodNilElljwk5hACF44k>Z7vEU>p!_Xsbo;0 ztwSNM$SLKVoIt5#&}8-1G+TFY8Yi6v<(*Orp&St)aHuAE1~oxKmA9tgQYho0mH|{W zDSgPEcqR7Z?de=lwg3XrHuTqIso&KWvyL!jvStBX;+^yg6jFIo>tSJ{I3oYSJ}O}RL9!%W2!QRci2S8eT#7R8kTn^nw`2a3)$cF#)C z>q-irBmjL_)-0_K2%+)Cmsc_F_Mbj___&~3EPL<1z0t3)+yf;!Iy1L)UzERm1 zv|Pe51STo_y0-&F0|xaVu?{|pUUO3EU?I2g_Q%aBH;^P>-h8j!3{GX_OR)dVzfFa1 zXvaCEC&?Z?vzw|!gJ5P9s0crT=!}<$o}|@u-wS^u|K)h_&#(Xb_GyrZZ{B`(djJ21 z*PrO~FWMIcP;ND9&0Sa2ZRgZbNn))msyFa{Wzn}>9*ei};J4MGU|8(7mXyCu>ehD_ zK}t31*-z^oC>ypN)_Y>Z7b%crN0QqVDf=i@RYMBvn&jZKJOjSxaNCBQ>G`ax(>I5^ zFR4^h1}8yEawJ(L^xw5vjmY!{rmeiZ~)KzSFV^dv| zk?Qo6P``uK&UTu%;i70Bi%*i-hTe(U)2OQ5P_jmiN2QIah$wfKi9Pcfl~^lB2%nl3 zO2{(d++d-sb3ljO*90c_649mPvw31q;%*Po`9ntv^NZLOHtNe3A%HKkyi<3c_DSj( zgjz}it|84V_$m-{ZM#hONMV6)11YHHc13OSO#AmH8ZbV?$Q~64aj^!|mU*MX61;DG z#Q@7a&XKT7z`Fo~%{slEX9~{%fNfpSR#FwXQc@(abU_v@Tlu)j)h8*X`V)|mb^*cA zV&a5;PYF3wbqSm-Jc4dS>C*^nP)U|BP_Y*J77Xr)q8bXI<6&kkdF9RGC8U=I22Y4M zIIIo==9ciDQ?EQ}#!$JjtW=zrgJe`GqQLngx4_2y0(Bzq)3<$YOd#T{lng+XCuwix zo|RR~{^LlcNa-lS+9=bVXJ-n z`o+H^T>T}dn_oUpH-Gv1dp-tkZ9WsjkM7fhE~-Kmhi1p&&xKH zjw93RusX!2Ah$&QfJJG*?pX|K5T=+QggOZ*BjD^8B=8)$U+%~r;XDE3C-J)9B%o>m zY5}}wheTG>ts>0YyP5OYU^p|h@_l5uf@#I(0`Ch%*zbikJZTeG*Bs24>XGD=qP zQgl(wku}xY#>+cl;c(#4TI*xD#w##uk`Q}bQ{^Q9j3#QL$je&x-y{2WSM|ps|D;5g z726iIA3CabOI*^7W@8WMQo@fflAa6^#iup6keyopX@izZ&yFPQOxwfM7oL}A+rlK8 z)9YpoFLaYb>4*usq=KQ~lPQ!PksZApP=+?dy=z;w_F>O(#xsNBEA);Sjd-n?lLaauXsjad*jKv=iXr)|*?1C$ z4KvjJ61Onn+z1C$7MAysN`hVFpP=)5{K3+VYI8L?at?xilZK<#o>eK=DrK?=ITMXO|+?#4+w zL58ocafaod_$fk$0bsP^y{-@857le3@NOttTrHPy_S?pY+6T7j!O8e(Jt4GnLB z-*6V}tlq-;Kq8Mmc~Z0&%}ujHb1QK^5$2|OE`mc{?jsCGU)*swywC)rZNF#(AtU z6TdRTOI8QZ>ec5RYW$?3oP7bEbd2YxBn7(G>tSyo!F)&GOp!KMxjGDK2juJM-d3%` zRV^Y{9z;idSuQt6$&DqdMwRWV$+Tdg2zGe=zo)HKqnBA7>4wszK9n z>RW{m?Mn=6ly`e1Og07?y8}~?-lZfK6UbWjgc9!@i=05jT}@RBsuyi(UZ8Rl=OBh_ zLe6T>o@T8Q?w;+chxkyrb3nM?Rbd7_84H&A4!4L1<4^d0s^w_~Gzx(0`G*k6SWfEF zXfdwBfC#+_#>jIxv)>upTJrPM0sY93gm6j!chm;E=C$pBbQp^rbt3ACgACvpLnrt4 zskk`P891sOntb?NNE+ct&O$!F-S83pC1t*yo%!ZtGpS98LXuVC;XP3G{e;?tlDcba zYRQ*7BWvhKk*lnh*`T({`}$ za$VNOv%tA9VHt>!S+i0Z5Q!rGeS)mNdlssx-pFpVN@S@R0WsZc43w^39o)Cv0aReB z30GU@lV}&u7Hb!X+qV=u9Y2t@T%@!&knqxn4rpR2CZ#9=bYF4lH_38c6Z!(Bh=*Ke zOTUS+m|~Ng)VO>S)38dIh#FZ?;v| zQZjT)^zjfR1SMEu%vx{28P|az#S56>wh774a|R&0#nI((EodS5ZT<7sFSng(B*x=` z0Phxv^u`_g8o5-HGCdF=C7#{9iBMh@@yfIkR=K3ao9HPi7fOQ(%#qIU^{w2z_Y5W` zwNB9uI%d0P9U@xx3#3Y0S@Myxr2B9}^AChJ%O9VKA+kt8u=hM~MnbAuSv)u!mP1ZG z3iaVZo^1smdL38A^GU`h%T|?{j7%nxEP6AkObYetsDxJRBYGTU0dMqxfbOY(vO<$n z`2tq!tNTfJs6|vvZ3|pTl#U2DwgVQ|jz9*!;UUfif+@@uVU`Sgbk`zO6I*)neSE}2 z72{Hv@l%WpZ~vP2K70G>Ret{I>wiC~_|8v)+a`be`fd1r4u<2Hg}9fJK)=B}D!iSm#VdR-pXcWUjwq1ksVfD3aBoDp~}jxDO_Aja!0Cm zvc5@yfbiF~n)XJy&XfY(L{t8_O0p2qQ?_`1O-a6ze6qHT3c2Qr!}^8t+RG9tU$h#a z0=YHpRh}5nu?%BbvR|z22Sxqb6EK!`tsPlES~#sPQ%emhJjJE1!N@2<=*V{4o@pmc z#J54#nBf778Ek-VX;6bv`^Fh0ZmkSVTP*-dK(@cF-X%Tixtd_rJLIS!x(4H{swKcM z9nBYbcbzKjM_CFjD<|X_^3FlPuF!`2))Mj1ucuN?T`L1amQwfC#9fr#G2B5I!ScYt z*Z`OpH5d1wW52`Ur5gFE3*=2yFWSHg@ka9_eSl&D?d7RqAlG5X_h5JtDla#lFZy{|9ySOO{!%$Kk$cN#` z;*qDTMlI^1D<^nYwDCd3xVBG7t1hKW_8a9ho;O@nCgmqo0)WdsBJc$TL73IiWmg=P zaq>3I-ISTdrfpd5CTTF>Bt(1wJi@j+#D1w6*`-yk3{@du#ABisI0NIT4{=a#3|w0+ z+@bpUz`*kyYRjHqSg>Sz(a7yHysaahlwRjJy_ zXJzl5A-+OoMEjVEtaS%ldJ`2_0`E>(5w-}H*%ggF3I~~#Y6&7Y{0;}@g>kV&prTr% zVlDB@*pj=FWL$8f-GR01b_iVBl@3h$Np0v_bRY}`CR?}iDX%UGQC~N}CW7lh{s&8z zzw@2%z_#TGiNvY{TW~!4+qd7ET+Z8{k7vIGWXoIz{#uUhc-^mFzam{Q|FK{3(O>iW z$=h%F7`Tyt`p>UFCsg#Yhg^{Eu>m04#59plk6V2%EDCpLb&4eM5V8$fmMhsf7?Ks) zNG|Wn@}2gRHWs8MCKNlh=u~hrk$Nczd)4~jgu#tYsmS^ikh@&B0W2zqd3z|X^xL*4So467`MWfDy>_^ zo=WK0r9h^lS>A$A z<@)l$MR^5NN{UVH6vcjmWYu1^~>h193QGTWQ(9Eh_Iwu!xKibyXwGMBe%oEl%HU2MFeul8bLIObl5`yz8rDX%V`rponBYLmOM}KXhOK3$WM7r-79A;tnpVzurTNO@%d15CoSS zVKIC!{3qC+0KpT=R;ryz&u(=#YF7;BAdCZquiUt&cPy``4a5=?J)AJZweIDl!es8? z1u>Q_A*`xMsG)f~br{>qE}b9_ZmJp(o`yj;iUFH}?O`CsR;o1#v;C=GSkU!t6E8>+ z9pdoP!j=qfT?nk4#i*Ll2%B#m6Q_j(ww_@BF2X~vCJpK4kj(1^%_Z;<&_jc-fa|CM z$kLXnM4mh&4#JEzs2N0oTovtvoZ0DRXE6}y7M*4{`vlmT0m)!HM>LwGkq1g2Xd4Ae z?ulbbb-a%i&AKo;VB*L*l17J6;_JRD5YEz%k-no=$6|p7; zrJ#gNFtvczzzzXqJ3R+hRZVt~2PLYp&!rt@^q7^~ZDFp1Z4hjdEJp@prj?)-*Q}GA z!<0m~OLFdpgGLUfuKy{Z zZJ+EnhZc<@#q#6C#jFm>et_JykU0QdLGnI(RxM!2#h2t+(erjxaCMj%ON64;hz|50 z!t1x$nfoI+bAJl|LU0&9!@uG6r>FNnCR=ldG_utUnY5`b6XvL@SfP_c)q98M8MseC zw5n(!kqnaGTTnzauUuWYy#dfNsOBG^8b1WY=WfNEfU9CS9K%!@Tb*w9!Sj3a zL1>4Gw|wZH2{V8rMtdCOd$zRk!a8g7X;r0MxM={INsu2491Nxi1h5u{Oaa&F~7A1>!=Ea0@l)I@%XfbQ#XGY{lS>P1VGe z5Gi@v;%YDGoHk>*(sD*slE}yEt_OwS-03L7GWavhr%yUTRBitpE^q4HXrsE#>kR-x za38sHq?Cd{fgR?b5?-%qmW*(kQU{aUPgLELO;#64Ys?fKkbqgsct$FEtc4Pbkbo11Rp^m%Oc!)Nq%3#@4I|cE9Xq#EEXHD# zm1HEqSF;dkbIk4wpl|H}fIaJb%>Zz5hG_J*K`Xa@cdk-cZ!vXDT+r$mj5omC7n(^m5G!jdhxn@6KsGL`ewi0FuPc_FLr24M*Aq!y1D4S+g6fGcd)zi;HGEzX7CIk*n@8lL! z-y1@GmUmLpb7;GC#A7cQwr^}5B(w$CJdksX5he!q$)AJIIy$(ZZ``C7H{NV?Tg(L# zF_d~+n?SYgcU${FVvY_x)+ju&@_0=fCiTqFr>sVfI7iU#s5XT&qVqVTo18GDnAu2_ zgzTOujyVL%JR&79BS&-bkTi<`jk~%yf@3l@QfVJ*NigXqrkCm?Ym$%KMMe*Q9>R@J zF5knGz<^}HH&947!V!S)b?08FHzVtyRmdD3%xwqxP<&d#u*Gxa#U~5^gOk!aP>hs; zcGyW>bv$Js2X;hO`y;cU6D=@XM#hcL`c>_44HTGei(m^|BkP(W&RVH}>rURlAh_UB zA`Qx5Gl#sZGHL6>ZXLDD!9TA$;I+6ud&j;Wd*!fD^LP;d(kCx^FTc05Rt zkFsf??xRZd;KEIczHly3D&*#{mT{i0o~k*kjpQdssN2#J&5S)6-8&FpHYU#{oC47= zR+C#proI2a-@fLmSdMonTG2rmO#sTihsP!{8m3aNNmI;QUr0_9=B=h%QJ3IwaDa)6 zlyktN*^YK~jyZAdT!uS7HFuGNdjhSRkXQCj)V!SxjPNAElt7b`b&$TbVD3|v8Ic?F zO;CO8uL37Ga8CW*@Hap3IQ;gz*H76c_}TI7*MIrjU@!Xo_1A$cvnLU`=j{*F<^GGl z^s!-y%pd46hR1k%0B&QLw>@-K&Z4~+ig0a3yPD~R`%#!=VNQ$8!$IYjj9!6BsZg$(J{FR|Y$P5xa;=-P9YiDgw9@8K z0xKY`E{O$QDEUhBNkV|35VnrcdbQnXhj1)pleX_}z%!t3x57--iK#9X`ua3EMgwXF z3IBpJd=69Mv|`wU3ei*DK!P&SbSg7ljuL9i13iMc+pzIatLOpI>ph@|EH3*|F|A7x z4YsS~;@ZQ5T4(HGL042#P6Eh*IA zr$s9dx#98~U1(p2BAH~IR>3C}J{ecY4=Rd*q&H{x1BE8H1mzIq+BqDj8dWw}ohl7M zO?TkV(pkZsoe)|9IAAcBm35|oU3$j;o=4=^J2*mXg49##33W)6MNk@nJ>5M^BtS55 z2A-L4AAID^$fK#nXpb+gLgi(0g_8fO0X*TeD9!gqkg>uV+1wZoHbb{*{a8?eMT(xQ z$|NLfHYvH*7?zlkf;Lge%lyEtyFn0BM+I(Hul1EQ=q4u#hX3bh?@v&Si(TZ~f z#=IwIXv~{b+B3Aq79y1ux#|QAoxEP1!UiO)0@RPqc3s zuSsS@@rLr1Z$y;(!sj0hzP@ zQ9Cor9x7efrYA6vi*rkrKBz%i+%2UdxKWr-N_VsIl%q(od2KzC5C;wUg4TFwaV>I# z6JMd~ig`N}W_t$+6}5M+Xf|>aeIjetOMV1-W(@z?=s+8uB1unm4NiDmio&#m0MxW8puw@{)s{nRX^+&60 z--U3ulh*qykQAV-Emwr!@azHvi-J&fKaZu5G{) znHx(IFz+Xr))RNub({gubieDOi*-b_)=|W8ei`G$rZsWRADRt6J@KJ%!{@JGgjYjS zd>URqI%zi~_nP0nKpwnD7!)CO8DwJ)?y0^X6VUs338i%>?~pWtTge?cibTF}$ed;+ zGn4{{o?t2zn3DX$xMRq5-a3EDP4Zw|s`1gf`RE{Fu>(($;6Jm%vqrSjDb$t}X4U{W zK@s1;69A^+5rl#+6?Ab1G5LN~0v((?n)a~q7>Jr!M^nz$PH9K=dt{44F`|1wS+(We zhVfF~#)sG_YY+J50ZwkzOVpi9!On6+bg&jrk1)!o1WA-S#x?63(G7Ox@35&FGLB!bkA&XilhNYv`v zE~olDwu+XqL>Vm;OH0oZ-c}eqaD-Qd-I^4Q>gIXNxd=B^k64+4Rbv@^wpFRYpQXKR zQYACpD4de4T?i=a8{Mu^z|O@&Gy<{rKfn=_?AvAx7zIjtJa)R8?oYv5ijj@Bbr`*o zA#8CFt{(Xbg{9FywuG8?dKMZRCvu2ajtvS4TxVj7)gjQH?@(O%@K(K?+oLrCpwj3) zY^;P5?*Rt0?(@SGhNG$@5H##fj6sTa1}IspuA|C6a~Hz9?L==`6%OD_t78b+={hxk zp!RCIuD^Zz#qq3U@ZYdc{WJEXf5ylBx?jBgD@1z!mdAgPoa zSFLr#RK72)sSJXMkMdS^NnW1JOk4(8;S}S%^%AC6EpjU^zmlln8m8pghU;$Wi2sJB z51Lgg!|>+9Kg+rmjqE<_yCPv>`KtzZHP*o3KaOf0Z|T2e#TT$#+FCx_i-mO+Ilr6s zD==^YWSm>40ud-a-hqZ#bZ*vF>C}4{N&Uh zPHz1z%o9WZqPVWSm*y-NxI7`B7u?4qd(pKzw4Q+arEqL;!4Kr*6QR)(cT2f{NiUQv z3--(I0xdB#n@!ms$aW75A6Nci)Z(7TmzdfQ@`wis`bKjMs7GueVFyRKhBilA%#vPDX0r$sHFt?X9S zHK^v-QcXf}jZEy3Y96&Rjfd#nmE_!kvn)0b*h0yN+MR`GmUwwP^tm#Fp~`wn=xPVv zNa@{%2{Qg)6MB{~drLD?`uvjLOBqf2LK??(5L ze8gT5)da>@w0I4MdX%lQF`!{=y&8%*d$ld)-(kPyiDmd?2KtRZD}nm=u0HYa*-!uC z?e}k=<@QW?|MR!6$y@x{>({Tp$p7N`e|h~pKd&OVe>yz^*UI}g114apH}q&FWn(;6 zQCw)E-J2bqznQEP_2WI=wCh8phaB8PCl876(#XR&NjS0yE-zR%sK9SeEEGk3WIl>H zq2wU`cu*KgvFz;=OGOegu!@P8lf*Bw*8_5FIxYK9HnU<;Jhm!b{K?S(L!yAwtb)V# zq(ri(&ZO*1v9d=8lVDM&_BZ&QmefzXb?SX{lmy~ai;Jhu|X0&Uozzv3fJ8Mr5<2YV zRL=53@Pw4mW_wL00a%$upU`f?&1FR8?kr?=>tcDxc}RL}%_FJCBn!7AiNjT5 z7KE;o^^COjkOPsGCm6`eZ97UTyZDfH0!_*6worLPs?KGmRTvt&3#>~}zPtOldV$-T zCaZ8;*DO2G_6d*>vx)__j}MnQ2Z%*hvL+n1ttcWTV6AYTalCS`ZYAnGQwGBBdwGA? z_}pGxBev`NaJE)&hn(8l(sGPQ$COH^vERG`G;E8_h?UJ@jhC?*B%V4-CQT|IY4wVn zuj{ED={JFdUhb7<(|K;=yux9TJlpd+B=PY~JasKe3Af$uxmI5(%78@HP&MS_*j@rf z@|IwiwM1M8>P?7w>QLHb8zj(@<@_1qvl3y>v+{R%otb^CSDyM_0bCw!sJ!Zn# zb@y5+V&{E2_&2H8ND|=!$up5H1v;tjiw^(yQP~N^YmeY&AI+({R+#pc z97)B#S#`0GKC+UvOYPOU3gW{UXe-VFe-yCp7g; zx%?J43}!a#@&Y}AsWP;B*ZaP6h&(xY^BW~umG!$yX9fh5$pFJn&o zZ@Ig0Na8^}$S+r^tMuwUw}&JiTQZX}ej}CVruM};(v!MqLwHT~M5?g6a~Q6pcpBwY z?;Jnpp1evTOI^VZJ$AxkBwD%buMlMJ;aHC9$fu$+yX;6GK@tb)qjtF`pb`^WP8L+v z8HFxjsXq$xzLYd-oUI`56_%mxLeM!aoTfvB5L0oW6dm^0MHb^%z}4)lT>%ev(d0I~ zmxwPce?{5qKNG%4+IfFPbm@yS;i@r zxuCIT3*1*^xdkPWC6#VNmNM_P^bIMLR72`1;$^BOb1ga1%0y3Ybh?w%0k1=Y0&aJ`CC=Z{aL(+cOC+f8eY5d##3fR#z z{~aU9&{U*LbsI*Bin~G7Cb09Nx8~CO)2uRq1|yqBv~MYb4E-)QYdzduk!4J6noH)K zSg^-UQc((sjvG6UquO6uD6JCse~XJzNx-+U?5MW0Ql+m4F<3t6gGg#nFY;!fuCeN1 zK&X!mkOkku+1@k9xsdLpTMqE_c?q91HcTpOEaG^{_r#eiBdsRXcALtMrd%7Z+#NU8aGViESP(HC$yh)YUZ!NnSH*}$_ zbsow=1vF?{S&qY5J4vM)??udQ^A8%y<6!I;=Y~(HWQ-bjLsPAbAOn1K0p|q0r3H z#-JeB{5j~uCu)`!-oF08Gvp5p;y;!De+eaz{F|?zTEvrt`))VJt`bxhzhOOeZ(;vf zJ6is3o<>CO-9u}axgxvanv2L{&$KFKWy%cOd{Z#m98X*61FSU*CCMWcINAdxi0s%i zTb+6i`)RG!>!dgi{cwc}zxsVz@>HL(yZ8XtM9BF#$Q}hsTupOlsGVq_- zkAyIXEc&vx+xtAVm?WbJZ1v9x4N=KAJpjwXWTMNXlBx~?&}LjFmC%`5TA)D-TD~`7 zgxXrlk#-%CoP0?Q=4TE%xGj?7;`%kr$%aX{*+(wHyxay1EDRH8F!8gk&a_rb5dQ5GCMfdyMed*n%gvugrC)}(f604)|N5u!{vX~xmj8bOmGBZT z#4yz4_{(yWKhB8X@D@<=4di~WYy5+30NLp;kDXwk=~iK$m|1JH;w8z~666t+lLHAx{F?BzZ6`G>>wUG?A)(HY$feQo zUY59AX_CBLgV{b}*hDx8MlA+Pr3rQGpJGW`sJrr=lrJmH`}*YLLa6i7kVQLL05CvE ziEMR%Uh`()$Y@^8W>EqYWohT}c#;h=Wc;0XLs}SIx$-}tCRfh(Fif#10Wnc2dgTwp zS3EJT2Dp1!Fh&79 zakT*z^p18hR#jSoAtHle}hLYmF4bX<>wJ<3JlJs?OcVSsw-c9aOY1(Wb!4zK87 zRU?#_R@Et(;pd%y6qSCPL#jrnCi?Ppjq7gL!)1(W0D$I}oRJrMQuoQGEZ=QO13XaJ zs1zUk0VoaRqFq99fyjuwK-GL>!;yRoafaKIQ3R6n#>o-QPHAe z@|wuSZ~I9q+nYq*Jn9STC6oi}tZ7IK6!}rJojF2EI()KJAi*-!{3t-lshPH>l1p&~ z88Qbj!p(+4)(e0q+v0eULjx3I)?2=8b3d}B2c0Q%}QjLZ16z>f!uhA+`Xn*Xg zt!=>?yw`$#6Zl&h(=K*r#b%}>H2(^YdbW|D{bztdevg>^O|ZCg-{jUi-N!7BG&7m) zz^Lm_cW@G{4=tIxdzR?*G6&T`)_J6na^U3Jq-7Pr%QmN7ANW%&7_tw=6MYUeR~4_- z0*gSvF*Jtig}2q!rlU%*Zs%^vd9GAy+P#KLQ~o)Ib@)Ww1rC{EmQ2DCX6UNi5;EOEKZwBzp-@RS5Z4+B{Zck{lIr?U1zE4h z)}>JIq(MbW-PLs7W>uD9$ei0OF3~}Z36Rv$6-6!^aTV$SoytS>4lPPaTuei08+-^p zqzz?7*FG%p4KVFtPhg1d@d=}obn4e3urZC6vTdrwm5=i(9g3R=G*VC>&jIpj2`NT! zBWwZDMqn@p;jvMCUc~$kI0bgF@N$|3;6t=$Ty4urTlOQs16LqA2v=U6rA)v#g7VONt3sw&JP@trv_&Lj3Z#cZ& zbw_4JZRhO?P`^o%TZ}*ev%7&TL9n*$T!|K_l7i@m)+P|;h(4oR!Ih&_y>5Ykj8@jj z9zEtq*zBe)wc_l21}nMMsA_GV$VwV-Q4?LXya{xf+Flqm;T~4t~*OBRDmwjDj;$;hsW&0Dml^JdzW?*N*xBM?BNqRO(Ytmah@ zZ^PmQHo>x-hE{IgyRGdW#VBk9YiqVnA$R#8@A?6Lmy?53nedQ+>sOReaUG(Sa-9nB z<;@5|2io`ol%+nTCE-(7iJOcohn?tUtBz*)WrPh&e)&Z%nt~$Ah(Z!_kV~hDRjMjY zlQjbWNcKQU0f7rsTpMq^*IQCekg?}J)S>gHIvv){s@j!uvDTq5_H7onaJ3?|4-P!U zxof8@gaswegmgZg%UUv~5A!C9b z)$J&^6zG4Yfr$|}E87MP(-tjI=F8^vqwj>_O>Tx^4kZkm1Bn|j;6T1MPJu>vea3Pd%}xhR-LVTt^}Jb5@d-uS zmsj;?bN@P7pzh%UDn}b!JQE%vsx1^tK*M5*H-pu=gpiaBS!=HaC&So%vU2`WB^&du zqB$Gk?T*J$M^s z%>3Z*hrjvm5ng|%7=Y}S_epq87=Q8h=K$;a(|%L0aw$dkgi#$(_SaqK`+!YA@%@%U z1~G6&K_$0!KHcw%Q89T)}jndMppQgNVaURT_MHI`WBW`3(91unL}}^ zBAnIvRxskVY8$Gt7AD6)C|64{xdkFR%qXFh<2}nB8jjSD@6=|QV;z-(45b?&flIw< z`nhh0W15bMUZ5Xjy9+$V-9&!QJ{i`egrW_uC_8Yf|2~h%JSAp$mmi9nmU{ZwY*Z-M zX&karNnT#ZK^tkZr0@tLqApiix6C-ti%?npi8Dk?v0XtAfEF$M)*o?FO|{F~;;gs5 zvEO3jn&5IuZ_vVw;Or4|in(rBt(X8W^lV$bgYB-vNbJ}3saJf3x##JkUZFWI;l7r` z+YYz*)RB^}C-Jrn>vp&-@45BD(Y#z5ImiM%knTI~xPjfQ<; zpbC9s{h~-w14U6P4HTsU4iDeU>sxz$E8?fR08>@}iOe(Q$%t6vH`H?f=7=Vdj2o80 z-8`@*Cizgo)RNMrX~i-)Za%|pBel)|D03t!R3;M?V@qRR zN=AiDfgMkn#e1OZA?mWA&*Zn)E5x5K1Fxa-94I;5b4+5v&%Lk^|7$6kbQuOl69Qw$ zL0tif6jp_W5)5y9IV%OE4F<6xFT$oMen~4B!Z30v?9#l_iIX}bl57-ZpH$G_j-iJg zO-C;R%1Gj6>;OIB^&4AxJDli-Rg@*zyg}^c&ym;3PoLYM!o8|YywY6MIi24P@40$> z?u+>2vmbG5^t=7p&%&EM`o-%X!`qk8#>^b#FTg?m1r#xt@SYyTI;zIDJ#PAQa6%El zY)`lxHUpb&Ns?_`h>cPWQEjo4qG_lRG(VcNGKRq=AYN30pe7N?04JqpQsn{Q`xUEk5S&6|Q*0EbF#Jg6X}rpx`5+1;o7dk6 zc9jw#*=TI|`o}Pf{fS|x#+^+vV48?Y9I3EQl2gO=dYX_zEOtxKl`P5mBA78GGDAtC>RFfebjXsh zeg-r|;+Dnv8a@hCEe3dfk=PDBO2fqh6l8yk6rF|J#$mt3=cR-2QD`|Rn@ZYKbpAR+ zF3WuyQHE>2?b|Q;F?{=pzXCbEuX8C+ zkx~3HX9Qmz7{%|%DE>rB**8`F`7yz;56L_ClfvrcE>@fF99KsS3TwAyMr(hDHl5rC z?+L(z=)br2dC0uvF_;yrm|(>Vtyt!*gKrwZI2JEgH3NVHW9ekw0X|!W6A@C_BzQu` zZvqik`U#skDkADVIdY%{e9;c#GIWz9P}sarQAki7{;(-9s!EA{KM+0kihx#tpZyrT zc$H}HS~~#Uahx%!jfx$@vvW@SQVE0m6+bGDxB)H1D}V`TyA^84*5SYCP>aetaI3dg z8Ta564l*Z$WJqkBe5VDng=8X=jvtn^i}q%P%bkx4BZj>Z>?6W=3#G@}93s$^%Ae#j z0O>Gy;uiKkb4g`NY;bX>z&I9aOpS)_8<#n9n&tK{H~xh!>;ns?bqP*LimZrt$os99 zn@*xD;=9f|JMScKpb)M+Bzr-D6J8s04c^S|UD+sEJRg=R?|Gz>@5tuG_UGW*37J<~ zaA3Lsej;^(C9EtpF{iPB<(8a%35OSpymAI@ZwkwxnI$4<3tgF28Fu-pGg$QLWjG^i zS?81FLXmsW9yD(833aDNRXBs{F}x?oP^AvG#LEov%=d6$fQfP+cY@+V2%?X24vphbfC1>Mr%0~#zYkykr`LbZ)$s=(gnxe+Dt!5BK6hWf z9=1=vdHvjd?)GQDc>RRc^Cuic{4N;b4BUi|l$-F)5A~TRN|cGF&)XWd^|Z|aqX}us zEN;F~aOTlK#f!oZk}~t#eaEyf$LI-zu%D7&&`I`{LdKAIay^!*T{1vsAe>Zpd@P{X zUe!tFF?|PTQkO^`2LCU|L^!wRm-1l%!)ooXF!-8=!2qBzkG+F^ zDn|{}wYXct^-j@%I0j#b1FdKE-_V1VD0$r)Y>Z0>dTP`lYH$}$h4xqu2YL3SJsmyU zwlH5^yuBML(1Bcg0vc%Y_iKsTx!O(t)LYyh)wr!K48jw-*X^!F$>u4M0_9_Gf5~kq zYx#8z2xDACsdNWm$b85<2IJ2Sg1}PFbf;^!tMLVHqxb#^y>=JYYhq80+H_JlV?LcV zBqLnKw3fGbskh`fnp#@dR-z_%RM^jba$f@%o1X$a+XpDG+3a6kbQPu^CkFR;S3frM9nf2K&l!R?q{%@)>fkL zvg9%}J%iovnJ9)LUhKBL~vc98g1ko6yc^+fNGT>`Uufom0-HX zm^l&=3dK`r1N5p6B!$`98ud%gqO?cx#`WoUz7zhp90)&o`z*i}>79hsFT)RV^c&V? zgVBF*QHZ2jSTeN*Wdx!}9*JZCBrbJ2bxRx|~*Rwr%<1Bm!AjHQoSz@dz^*nsI1?c4+9TwdpX?Fl#6rA+8}B zkZkg=UKS-wEDjfy7l9?l;&6a{fZ45cc@Py?cL8O?klr!PjVQPs^4WwUFTf56kjz}t zm6trtKS-BdH;yF`aoLZzYq;?Tw!@0K&6KKJPa!VMq4)=)kZKjMVu8OR?zjb#MP9?{ zwpKLqxYb(b>hTrUo9;gc(08Q&{AGtBA>s`SoK+SIl-BXtrlYA`D5DZ_=S01n3o1T~ zg{|B#JA*Dsy>Yg`Gf|kc!VJSgOof?@CD^K&)MCX#9K1A5NF5#K1AV1b;S7M~u#Uv) z%Q>xW2mqk>w$cDOLYc#&Q3Ivr1GfqOH9@z*7MPwO{HNY2%DTDVVH1U(!5nJjbs7X| z-eDXPs5*PLRo|N#oJ-esYyn7u6Kg}FLsUhAQ@ly~_Rx1bv|9191_SV-(M%`YLLdm( zFO*2V|1XESJW~Ay#UHJJ{Os+E@Ma^&442Sh;< zdU8FM4_5&5a`cmsN>nP2v%1o@1+ZSx;EjR{XwR?q03_B+*+9nbm$Q zDoW+u9KDsLn7Y)ebJfgyKtymfxD;x_A-DGDl}QUaEE1KSFxX+p#_+DeP(H&F4}9U@r>Fd2Rk_h*tV&84RKXTdW)5Ei#@m= z!y|VwSASERSwj6d(qvPvP;T{m0NMEmG#4+R>ePUU0-6U!&}+cd4z+NEa(D1@RIWrR zLDRsQ6ROZEa1wk8V~N(kLfP5nZIZ3Xu}ajGSFCFjpFpY%q7RusM@o|l`s_M+aM_eglOZ*c%C9Wo{O9V{E6dd7^*?Jv zknvKlASx(l>??bKZG&F*`H2F<@0GtrD!7X-M=2TroqtMwNNrC8&56TzI963Ovd5wd zy8{?`QoG+m$qr^w`HFnlCxXA0#&yFNY^Ws@_2hFeP$q9F z1dbK~%H)7W(9LH`X*pvmivrP}L&F>0ojHrwx)O?9@QSjsaF~MOk!Mgv+%bDDC-wF{ zs4SvvU0iZS;#Ubbcdp>|Oig5Ss<{SK1-RDg`+IYZn+g(HhLbzI1NUfIL+9dv5{~l` z2=cS3J764YWeJ!}a6iruu2OM5OuiQGUJIOq2hJ6H$;J;SakddvVrv78ECtxRifE=2 zl~X+L)PCF|Z0i@^Ax0X|QEx+0|1K?YtkIRygIFr}t$DCY>~#XT_9eeQ8`Da^0w?=y z5;HHWscf_$3BIUuEd~VkoMa|LOQDZieLHnt?N7R`E&$W7B^p)8#@g34z*E$XA;KW{ zBJtq_Wr7AeGEFzmj$55PC;;JGc{% z>-~HYrDK1a` zEhPr&`vWO0Y+(q#GrpEfDm52^$oqLmS1l6RYS+jrZz_r-AG;0WKd@9y~GX=GP$Yw_4%#&+w~w`$$XPZ+@6d+n;Hf z`ud|h7X6R;>;C~-x&IANe);R9sm;G}1BHiJ+-(=#ew-!5$e(cMXcWwTHEPM<_oz1S zpV3OK_B<@)moNbq>+F8@_G@ej1(G^dRv|oyTRAziUs?gFx9Wj5HOtgs06?f8hFaBX z>wC~j&uVb^K<&FoUf;4lC5in~}nYp?$&xeCE| zvwC=SDKFp`4jVUhhHIocZY~$;`Zbc0RUj#FfGP}li3jQ;@*&Aj%^i1bTw9KJSNR@e zN&zL{WG*laVtZ##*xiChTAWsvtH49g~|9FDo@@;IwW0VIVj>j zR+TBtT*EF4nsJT!PzkCDFa&^~sYoWZm2z#sS%@47t0&n>YCU6vuI+xMod@N4v1YW( zdFKVnE0>}cdVN40;BOhI+|_w;FV#B+ul*@qr2R3%K@}dGJOkLM)yQ{OUQv|Uk}lJ( zH&baNkPk1Y2$22kQwb*QmOrXgc}Rs|mvoFI(NxiEWr_2!;k0skom}}4lzTe@W|`RX!?qKSdiYN3zFyMKQ3EsCh_rKTgttD^!7V`4Bvj@ z^!3l*K6`ryD~i9oeVM=K-P>20z#t#^%%5QO`A&YpyZj(O4|3N36<)uBJ&|33+qR!m zo&LhY>&}PL9$!;3)`z(now7u(Maj+0T3%)tq@uF0J|R08G0Gd?M=E{Yc006o3y#D_ zO+P?YcIB&E28f5aF4sVdG_$fW$e0w2fpTuB@>j~0&T7?VAv*SOJSf)@$K0Zg@J)lQ z1H=4?R?rQc2PgM}k4p6wiQa($NFF5cRCeg~4AN2Stp6EJEg+Bi5qklKf4T6N6#@m3 ztB^@eh5GY>Za%>a)J2gX$kq=#^Xz>Ws7aynofNWg<5G>l0bw!pEpsO`DNgBklVAhZqy2Ir=NdYeKqF`zoU1aS6 zRD$-{06##$zkjppYu1<_OaD4<;U+gRnt?{nj-}dLvq8A(Nk8YBIG1Ll13Ma?N9+nt zRtChU_N2LUX2_Hy%vBmStaEwe+7)vol3m$V)QC(Cy9q_7QT_{(N6`A@}-vuJu1bG6gJgQa^Np6xW z_duG^ptpnB2PRCmU86_}DxmuSbUva;F!CC9bEOLjZ7>Jm9a*aOv(IJ*{R>FnfSL@* z?I8;+*^_}UKTCzlFD#iSkSMj8n4EX1!e);A06U=YVNtkPUm(4=g{NWw40A|CHA|8v zhz{Cj1kPdIT_;*;sMzT82%%2U=77Ym8Vr-1&mob# zjt0uO0VoC0B;yZ9B&ZTnHDQ=DkAuop7|Z2X^xg2k?5XNk6b$>-E7Q(C@c#evZ}^u! zp)+u31Ig*xYr>cCJgK`u>7|(@k@e_^tF6N-8OK`(&Yd7Ka93JCfOK-HudZOULaj8( zO_xK;y4z_$;WuqA>X{Aj0((3NE+8^y^r}4tRsh}Pvc4bER|N{7+2Td@ShWmpYtr67+J_W^d;QLO^aI zED#u{BClgZ_RBdSQZ5cx(Ty4;b|B53cTSc-mcrouN+5(xXTPU1wI3Nq=BAS5rSjYc zQfd}}yqAL?g~W4s-R{CGVD^O%^SmGV3u;4B$-_4q27m=_PJ5ey?Jg}>VTE1MT3c7_ z98y8o0>CsAv5XOwitT~t#dSELRbPj6^L;m*wI2g@d7u%waaPu<2FM9IY?1VBXqZ;X zwsRlIf8lSxx96nazWwRHqpkMax8H}u7kw7qK839OZ^P>s7;}9dUO&gW<98TI*vWY| zN}O11wf>9{(uI9Teh4cO00T*ldSoH5-Tq156^R1RSlqagZNi6SCaT%nC!i>TOmA6d zG2{=<8azqUvfJ;O*w3NI)m()71IFErbe;%%CZ&(SuNI-`il+uv)VQ+47(Rcs4=}?rQm{K4kVS z31;T*$}K@+bRaCIUQ^)y7?6KEA&RM?8@Ix*cvHiSV|VAApnBwe5v__)v${LsM8Ww< zan=eiBCA|3_ZycdZ5}rqCts@nOBs5k6v+`U=$8qsd8i)}fZU+ALM+GqDf$R%8`r+j zb@Y8g*PwhY+JW5e9&Sv?pY}L#xFdJVO&W(bUDRfE;`aBUo#GByxiuhg+x{XdLXjoX zRgrA@&{eRp1xDLE*I;Nj{lQA8LGe78ZZ7-qy5ZPS&g|on-xAa!%Y#>y^cd-YOGICm z4<%uoHvkXIn*-G^sOxJxPSC5vB)cM190XQCLR1#bcjagvl4_w%^ti)_3!I_U8#XS* zEHQtnU6NDhy+N6W!`!i113g+-&}FL@VAo-)I6|rimrE~I0Y+}P!M0{)LfLV4N+d)g zF~AMf`*p_ma65RJ!Sib-;sacr4fES_o4C4&lVYkI?i~SrAZIaO@%CuM!d%0ud!Sxv zPpLMlKrz@uK=1)FKVr-wT~B6YO$>89p9A3ag72%ayP{XXi9?s#Mv!Iss*b$Dgi2KlJ*sUoMG_6#GKPT1LF`O%` zn1|->!nuO{Gzg^)TOg$XrTE4XQ-{B9pm#0A-?8PD^USY6V+~kR+#GO+set^UDwgJ~ z3Z!B1uvx={=R%39dBF0CWj|_w8q#HFhuNrmweIZf)M_0+8?1gBRQld4?7`^_6W+*s zbCWQa&W`OtQ|}l<>_bu{$tGNq{mj^7_`EFC1ICbATBdO_!0b3oK)XT|2BaBSK3SbP z<_W3;$E9+irpBR4RqhQmElTcNq0o`x_ zf&tiK1xSan%f;6PFaoqgkmJj^SJ|Xf!0Zaz;t~jey6Ix=)W=}^w040)X|nB63&JM; z(f{SAP@LI20+}#sAHhy8^^-eYz+glo(*OyiqEV1}PkhcIeSloJcHQ1k{1KWSw%Hx( zFkJ^5_llNSO7@q)p^*ZTq^bj~d?tjeUiBUBL5*C@A{F%-1ubjk-w?|Pi@A%unNn3G z?u#o6xkDHhFwP;AI-F9ja4+dpsj?p3ljKeA5^e-9eWe+#DI8TLP`~OiKjdp=ceKEw}z7Z^q|jLz+RADvh`%8LI+3w1sJsEv3>SrL{`)4!DgS8&uSt8lv+f zj7XGcbshN5$f;^9(HIr|mt@uad4Ki*p!}7s7@Rig$KhZ41WNCpQQr8WXNmRhBjqgZ zGmb}mK5fkc25F!*<-NJUK3o1|YwQ80HjANqoL9LDxPHD%Vw7^rFiiK*8WJ57oznNo zDzcP?jl46%Z_YSH7#>}873fn!aL^a@)vtq;O$2>!^>bXy8Zb;^3 zy^m-{`Z+}~D)M1CGm`s6Szd?4fRRBRcTB}040NK@4AKI3$7m##tTY?e6R5Osfafcf z8Asq)M%CkVC2x4z$;Cuv5Y7x$1{74>X7p_5eM-apsN;BkA8yhMah!6Ka&{vQ{U#S@xkBST zKTK{Ra|5&sr8sm>_~q9%q=TjsiI>ZwmZ%YVj++{YZQkq%m3@~~bJIyjC5Q{UAxK;W z^bq1T5t1k;{cJ+om}%icA@y=-&%24xMOo@nmKCllbP45T+ILcDf_M>a&5Id~k0Rx2 zk)UE<2`WGdgE+Tv+RK$nUf85c!!;qgszUi3QdA3=4 zmo@4><&5M1e*2W7n{edF{v6Nb`0Z`pP4m!Qo6Cm!lS)q&a^Ya!N80vO@_?l1 zOi((y1dH2v3oA4Nwv4(jyY_^H#g`XMya367LMMoNsdpMAbS@x@mLDfqBAeAr8~vH8 z)n+s1{24IWNrZ%6m%4bYSl(HfJ>dS(+DXAB(e{B&|6%QFV+f_^EFrI~4iY2{b*2orLU8q~>4*?xEtrP+%tHZ+9iCTI);p{lkT=)dqj$X3Von=To7TOa@;(Pn1aP;H5?_Y z3(zYea5$xo(KdYjzkl=hrwD=kJC~nP1-ESB38)fAE>_q|T@VScR5BAM%aA$PI@ZOP zQ2RtAP{dT?l{zfqP4f3B7BkLrBmx-&H!Co|7rysF4zr(x*UwI0|JU$pv>xE)vAnl; z23)1&0XJU*z{{-qpFNxc<8Vl(&HmB^Y~#SA48t6)qv1pu`|yVf8|yu4q4^~kF9Vp$ zhtbmWOdkk#uz#YNmfTSi5HPPiKr2;;GiybJQDyK$&>cmc1<17>0ZsJDF@uP1D={6J z54#mSshvKD84|WbXDOeucB(F_ix0S)a{x6%p_-O?XonLdhxJg8!j<*4`rvUOJV8;f znrx~pk6Pn|!4dCj&JG@pc?V&!2q9pXr#BN4Jyta+6@$_q!wRwylW+6$kOWjZD}I4R zFe~Qn0GYYn311o`LgbGwoFIc4a%?Le~f<9A!HB`mJ<)c(x=vbK1#Xn27Bl*&F8DT?1ojP$BYjke?=O zvz0p??EB;ZOEB@}3O{3h;w~N7rb(upb}u0nhMEV9eBgOf)lUkzro?R9Op{VS!4DiV zb=+#U*mCv0)6CJ(3TarNnU++7v4$@tE>Jh_DXOi2nnDU}cknm^50sD8{WK>Hy>s*7 zD#>-D{)Cip8x^L)e3Q_TFxHS9Pw-_>R&=C0;uc#$-xDk_^2}pUcVtSgt`}_Yv{tMsFK{;2{U$V5`F_pU%)R%9+%FphA_t!5Z z;1VZ#S5KuRS5xjeu!*w@ex21n*P^ML8*2b{@R6EnK*O$ev$ho~N_LsdtG?%Z+yoR1 zn3J8pY?7c&!~(4&$#WV8XfVlnwFo!>aSnrv*vfT^YT6~ii z4v}}pKTIkm8m4`8H$`3J^-|o%sxj+g`wSj4mrrVW3DCF&$3AZbDps^EK7%0xt}OY8 zbbWEzJRkx67?{E?amGKYwKdu8VKGeV0QkX$hf(U|2A)*OMVbI^-}acUyDP%g6ZmGc zoL^d7_6b557cTG=faPPlK6K83zlDMG=$oqCTku>ftVJC)FHv#T36N_RAWov2_o#|e z`QBuf=pmLsWu#3f;F00H1d=E!X-qr%O!Ts7djnk3#};g`+or|9oYDJK#$eaJ0Duf{6!`La`$hfQqerTXdIO2!&K6 ze$Js^to8+pUyuG*jAq}xeyk7vP52*9Uw{1e$ME(Egzf)HF%l|p|4*l{|DW*sqtmmw z$f=dOc8Mq5NkKQa*}df-%2Tki`jLu&1s3PDt*ZI&TS|C-S(sQy-1W*A;8+4CAM=PM zTaKV>cv2Q*4ema%ObB8Yav@E;k6>r@|Bymqq-nWEVeSHPMlZnK>AEJz*d;?$EeZqp z;5Ov*m>_pU__oeZ?dz~~Pf#eWYK2N1exr2Vx7YyCu&?|;;>P>^R{IVv#^X!VFZV z-5=9hsfIf-;458u01b$fb3ZFc2cprF+rsIjqh!!Wyut5T%Igs~id?NaU(hjeJM~k%!7c5 zpvp2tq_@Ej=XkT7D;^d6A_<&hf)O3lKHNv7M0<%CM!3jyhEl9E-0D~WN)-cRURyAL zt8;IvHKW%pO=%MAc^FT%PDJd2tR*1!Rvy*qI-f2> z75pi<_Sq5IG3S1!K}k;%jqjjF8O9DGpVQ7WDu{GFw*%*JXSo#^?^6dQ#)BcG#>wWC zK;f7gED0e44aP5!+?BkOE2T`J698cl?hCE9&A}7RUF&FVcsX$XD?fpeRBdGD%QV!a z?8u+gEG~c7Qn07c3fF~~BscEJz9N(u;9e9SYr_CJ9UK!NRW+yoDg5gr2JQ7%{20Fd z1l>m7QF|`q(SSeG!R{aPv+v&i08WmUqJIb~P-m6v{}JB)e0od+;CYYP=2sex-xHjE zzz}x3Sud=FeYp*aV)uP~q~@s}8+J)aKyDCGgOxrQog8FA#uCQoJ@=uD$^|aFqpAeV z3dz>qMNDIx^QMk+PRW=NPpAS4(2RPXSkEu@l$q^-F0Iaw6vS`zCZsbHJPiiKTx{Bw zO((Nd7(t!x7secM31HN#mm7)nSW>$)ucA20<}eIs7!32Br8Or(!vlJKX+9(~0iq{& zwZ$S0lnjkh#8SJjeDT@?kBf1hkVbNddDj93tS` z?O+uX>_wOoam+a{s)PKRfAE828T$cy`p-PRzJ45D|8UBN+n3>ve%sLb4;M*Q>=`7K zXs_PFUivv=A9Ca!+oY&@5{82W+m=aor9X@uq9!WTkQR*m{9f zQ82S#e>T8-J~)eA=>Xkn-X@hmmt0@bV}4$x*50IcqW1`9zW8}N2wGfQ~$n_gkIHIlw{tLL39MLg#kvy(~^{ z35T8B2#Uzg>5y*(H#{`(XXeax@PWEQ*<#HHQm?{LPIdjIz-^(eZ-sn&DbxWV#WT#o zIIn>ua9SXovOwbB;5#>{chEr;iwkG21IT8^QSnA7h~^CScqLA4P+-c2vFtWX1gx#Z zA72J@6PT?kzYO8_U;#TQe8(2H=ln-a^GORpFF3FrSV4aWF32XUF27N!HQ8-w3wsD} zS$l02H2p22%T0tZ#=&Xgrl*wGTB&h0A4(ZdS3^81)1it7AAM320Gr~gY*gE>2=s3H zL=5__Um~|e=Ub?L`{%bm!5&HvPz3*3hY{~ElrWbQ z1p0UR-*9}OpM7!N!$&T2E<}@Y4i7uMI9>UmRo|m~V1Ki!(R+@!nT3(PjV#~?$C+j( z;NYqm5>H3?C~)B0CN&%9XX64*x6^X8p@%}lE~5$6scxm-b5Tbr6iCxRsiMXngbhQ? zjW{AuhdGOAuo*F+H(0-J4GG!>hQk~`qfM1=U8VRdmdjH5li3a-t%3Xi)okfiWgj7t zYS2J??Q$YTi`g#Tm4+V5d6y;64xLrh(vr;NoC@UV{*h&81S{rC?6pR9|#XeKg6;)LaQ^^Wex$BSC#Gcntf+gI^4H{UDmFk z(Ke{6EWV@f;^aW?Tz4?MVNJv-D$tB=l89~_m+OkY9L{Wqn0Nt@;q=UKA<y)fHsigvRr*x4!E!u{az;Mp>02%wJLGe-P3C1hefFbO<0|KHxoiDyp+tx1d`O0 zIZdNZpx{-NMpa%0l0gD-?W4I0=ku)o#N#1WL{J~0@$WHaF zhk!SXad%rQHLKE$tVUVflcBR|m>s2A0Y%Fp5sK=D*gxZglweL62i%hl zNU8j|i?7T;QY;65&<<7tN$+txaWRCqX(kE3=mC|}@V~1T0Hn-4TeiuIIP$LSN=piUBSYK;^ho?I}uBR20f|TC5A) zH*%HPL7esHGvm^Gu&7i%;7pPFwgKG3EgrgCZvX_ann=P)5Nvc>0dYC`l5*!6zB)YI) zfX`OgS_}WdrN2RUER~2s7pS_a0H~E#j0>`f1DU)vKGk8oOV!#R1V}Op7Y4UC!-oO( z&amv|;~DBnBfPr+m%U^ijwsRC?uK(1xpYbD(1HD#;mrV^vA3H`E-4OSk7bb=#t=J= zS)%h4-R2(E-rYrmN=UbN94wZq7oa!;I5Ai-oput&K+k4v1#Jgc!Kg#=PX@+H;!xDOz=&=2R317M zn55d|x4JhDfQ@hmulCWyZ*$1|L;~I0SNRwL@}K_t-|#Pe!nF4O;q}*F|F^f#3|nTY zciYY4F}9FGQ31)2L!;Ek18l*5A4fct1v#tH zY4R#s;(%$80=Hl*HEH(^^qWBfytdjasPMS*Uk1S zZQM2ZJ11&@1j?Eq)7l7*!vFZe2N^8;9ccah@a>C3zrPK% zM&Bar-wCgJp*_cA02?C!RAf&8k0-GW%4#a(BWXlGNEDZ=6C5u3f~-*Xv%rK|XX=&J zD{;m!p?DOX4LqRB$%i+Ngi!>_EnjaH0baN&nmma$=49`a}w6oW=HpEtI;8rGB&fV@YwqW6u%D-mK9-YX@Xqv(%Pb*&gV`B{cc0CTKsl~3K>smvO;W8_hq6u~Ua_a64#N#6SlUkui1m>A=7lTg5s>dnmv9r? zhYTJocRSWi>W#x~GVY^&Z0w{|uqnj=XG&))pS2F*974iqx01uB!gdm6qcwqj8dT}t z!IOPrN|mGAFrMTr(=9|<7NrBkJ7|Vh-0pW+rn}}{H!~Q|^81apoZz!aDOJ4r#`5Z- zE_#nLcyQ7_wJWH&I>6_?4+>|{rOgkKw-u`eMlvB_m>@+(rICQFh7KlAc9R=X{vY-M z7;P(zF^6N->{H__g-xr}X@*5fWniSX68NE{Z!XabH*l`=u~Hf$)f{1Zb*bTvZAw8> zR@ibAK2&SDhf-xR3@13YUWPMF1Dn|?%<|i)Ox>s^j|381I#cBR;d?*KgBhXDDcN8Y zB{g;)=V0TA1d??YxRa*BpjZ$Vx)gUy5D5;}>EMKs8fWlS4OoXO*&N6vw-HH|0}+Lk z(D?;BV{U}XLP1k>-gC!Zp==vmBJW|M!HNz}uD*= zO1KhP^$tj1v=X`4)&pL>Sl2*Xm;prl+fZExN?h~~kC&7)V>C@7o@DqZtSM2Hvzkz< zw1gtHHL%MDV3EE7*Tm)*P`Q&gpxfZF4c$pr>X#azJxnt&K|O(im(Qi~nSafX^xFP) z{><-RzobL#Pxi0>b$I*Jd$VeL4&tl7eEa9{_0L~FdHrer94L9e2R|>o{sfi(@7`2+ zRX#|j!>d6BUkn>ol2Rm~hCf3`0GBMN;x{uxNiDE^yY(3=x~2 zNPAeP);Q5w1P>Z`VdF?rj%f#DWy-3cbf5Uk<#mAHFK`NWdeAa7?<15K?M$=gCZ}tl zTmgfRI@F(_swk!^@Ws{H3vPg!Spbhy#RuR*LqQMMfF&rrZDDpz3`ieMD&T5-Fi1VP zND=DMVW5#XpuM#pR>~=qup|G^R0#)j=y5lOBbtHy8!QZ9eR+V6&1HQciOsMcd|2#P z9D}_;2~Y)5ACuGaq^aaM8(_VWaQUO5=<)a(78Q5) z6~eZrV3;7s_IPk^Jp@`hL-INxw|meJK!2*PshlXZ4>JmO{uW4$)8v~X1I4<9WuQD6 z_!Y*q!5ez;L@bixZL4@vjVe0VL~JedOXMp=Y_D9l9CBF()xqq==^j|EyKl`cRK}*Z z*=sou24#u3Ggc)MS`{UyA8e0riJ0sro{^OL3Vc(Dkq z;M08E@vVQPO2QrR<44Gk-0+JkyIPa5_Gd*-F3ufP=aZVp3NmGeTjbL8djpqoo`yde?-*gnVlIoGPjK!5 znW87BPa`UNVvYxNWA^omQ`qgj)Mv{=BUD?H+%S$tMq6MT|7`Rfu=0`P3c8R$(>SMX zR5x|{goS8PXLt!@62oakIy8H?hWWvE|66*C{m?qyw{PNw&I9NY=3(U?Q@;Idhj7-J zHpCM41aMP40_@e{kmbA7Ju`XmEyjJWI;VR{*ZsMvI-Zs9H3n#BE3&UiZpLZTMsjj) zN18BgM_t7<*PukLJLwRMNL|lMjS@GmRb#9ycMevsYzJ^FV}%#J7W4R*KTM9S z@wu$17MvaejOYO(dKpl$BR<<(4v|nG@_e#)QQu@1@bE2^^E)yM+d2h&`ofOXsI%qP zCIRD`Bl3zIdZAbm1mYA{Q75{E4dnv9KW9D7<~MAW)kfW@7Mk}12yxtZrgPv|;&N*# zWgS`6mUAF&MA}JePhlS9jD&J1OZDX9)JNX9hb|f086qPVB!M1WISGP*8EtN3Hx^h~ zzzf+!{8oWs__EKtpq$SqHRgi&=*Nt#y7m}2Hm`yL#Ir}AdGhrsHh6WOoqG2y=Vk$Oe_ z(iP^v_NOji|M2yzV9S(6YSzlvB?`pD8g6k_p-Fv%XZX{E83dCBcg?6?xNc3OgHb!Y z$T??Ov`C3*i2z{1vbk#wV=5S{Y9DgE4Q1gGs5%_t9%asu9`JH_H)qKLj$@p)+@zEl zoXfzewYpkOqvXR4o+H<$BccQrxW2-~SREz~J8_YtBWO9;Ay~+m3GKFyGo=10Q#4^- zF46kw6QgN>u^@QN7x>t~>5%xlagh4}v_9hdB&GUNHH!33 zX(BsCXG5;V)i&6ARVpy;rWiNHew&^sGHO1O3(Zc?b%I5WSxOFde^6?^#tlNYs9X#v z9y@72%$PE#oGF}7&A0XoSz8^>D-k&&P#9d zNsyrq78b#@i*u6;dpL}vg|LXL>7?YaXfZ+LGj4+!4n@3ofrF6}*&cxmWK!C$IlY7f zA0|npo5B?cM3TFK2I-m#E2G)7k@ODMEND@NJsZ_tD{wtxX?xssXAG?(u7*p!`uu;L zoPL0+E-U2OLxmMaHVi&U0SiEG==88hSSprNd;p}ApQ`hwo)17Cc$dF(vef&x-wWT<|Mu+j z8yY5j{`M0aAptdW7%Tna?T>H2k$-<0-ab1$LyFmPU8xuuzz*REpwz28t<`UPK*+|L zl=4U*Q8Az_GJCpXMPtHvKr1!-Av{C#BXCKe;yDn5)AEwPhua{R`pquV^(Cy+riqHv z@dX}0tmF`wJM*eo$_($YenXc7d7=Yl-jdH2VPNwU&C?y%y(>NKh?ylqDc>6DyxlD) zN(9U)xN9rcE`;YuGD=v~HoY%uA$D(v05elf+Pz+;QUd!f!aZU6MPXDZ>^s>~D#`)u z$qlb@I;pAk?rAcnd=?-B$9YX7HAiH^uuEvbbiL(7UJ5(}+=JM3s0axM^6m*Xx~bD; zCEWhh-2$~au((BfbFB9ix*gvr)#;)lr?Aaa7va#E{pE0>uw0&;b8e(c9TRohZw;nM z5G%!A)DVrU>jqy3&>hopH+)6=c6Lgn^s1$Vd6-6UU(%qRg~&*Lw3CGpFF|07<>q9e z{tP=eD&+MQe3_$);03E-9nsg|?^C}y+U9fvT8BWVTg;3e@FK=rbh@Y#{Icv^Wp#1i zxxw&%4wQz2AfSpD<={VQ8|WsR=iveEx$(l`Pzj%*#zImm2f%`%=XBxQB-h@EipSCB zQ2ZS!5S7k|*@oDF=rS4TnEp8YM$H+N(GttSHvl#1l5i(=ba`;%DN?TmUrxZ`PE=piOsCGn*J|x9&cFn^52!Is?+M6n6#WMg&j~ie% z?S}O-F; z#-n#{|NQz9RZQ_ke|Y_f&;HfF;jf>{zeUMO;e)@)k5unkE#TiWW9c~nl&gH$4gJ<> zOT(@w0f*{s%ctvw4EGl}vgHV`OP(F+t^%Mt?j6JdE0G>aSrP6~fMCTRd~cfrMCHEk z006v%?Km463E9?s0KwQuKLU+;2{oBg-^N|$P+T0F=E} zI)J_bC-l@S{Y2i~Isv|poHuc4i(>r&IM?D*dmu;JZ6MJc?h7t%-O2wcM0{>`Ve1ap z5-^YJsEW0id3EwOtgP~(%*0pQF5x^CmI3BvC&)@Z!2NG^xf+#lau1U%fL3}CLl=S= zv0}yujfR-$2`-#P-c%PZAIb%2m&$ceb(!lxOU-LA2c~9*Eds4G(XX|8NXJw&KPojt zoRsN8E)J~?^-Xq-xc%1Rb?1kIsrzo>ksz2j%tYWL7M zAGkj`D}zryOx$ptqekGqk|PP)7i@|pRw{Pe@j0o##DfP7c4DU#IJ-;XYAhqvS##u{ z4;U{P4A4Sj5~~0T3|)CN*fuNti{^nMMRicH z_5o7c?t)do1HlDA(BL~rSPe235K6HmlFGCsZ#x17kdLZW$MySpwN&vrKZb8Vk-y@1 zFwe|;;+r zDN===hBZ#l_;kSu2)iPx!Y#g+Lbq70mg{TyMh(Otv1jikVh_7+78Yk#PNE8K*Bnzi zY^w<^0*$pd0`goFxNn_$nZTo)F^e-N^2yYOb~KbT?l{+*mOn$V*N& zd25|-Hd?rYVj$<=MqJQ-03OSW_YS9mYX^Yr$!)@#SPS+#qD=9s2h>XWCbKwDf(w+e zp|L*PxLW{IY@#^dG(6xuV(-gE{ply&{KgsVrr2**SDcmhOtd{p|8peyAiY36WA>#y z9O9E3-NV*yUkG0&{dX7pN>Z}R6}noGPI8A65(Ir=P%n2G@k)jN^I?M39MM5##3n2r z1PFRLS9?uXWhE)p-V`&=r14)$EoF2yD`g3Mb5!QL<%qMF>lhrhd|WF9e11fB z7BygKa}99O)Z&_*NIfaxlPvwfMe@Lt8;^KIPuZVw5W^{er@kd1hDdxYQmf1=cM&Pn zE7jVP2z{KJa@UwQ;JC*&;z{_Jy5#7n=Wa6)X*M#_>wgaa?jX(KUd3gH` zyu>~URA_nk_LsNMj!lCkk^C9RxcoSm{(shhzY_nt1qO5Y?_vqjtH8>mZf1CucN^dJ zdvk#q)8Hyv)qpWg%V$=)VrBD5n%e-EjCGs@YpF(Rdeoze8k^B)EWN635B=m38^hL9 zHe(=K73u(({-*v$v?Y`_L$#X4CF&}0k?084A9xm0(t?l)D@DV>z(Lw!^uA}7A3!h3 z9#DpI52;eUxQ;6*{>lL2$R_1AbI~5Y9;Qc!W$|_ioiCW7%Y-C0&I1AJP$wuIPi0T3 zzgU=2uGlldOc>=FQw}usUy!71r-0nnB^#iO!1~YpfxtGXFVotRn5Py|U(Dokl5(?5@CQh>ns8bE7k&{e^%Y3{-+zIvWfq z_TJUByD5!w=0cQ@#fG)#;>IU17L%$=3j3Pur>2*FT`D#S`CFN~9U%opZi2+G14nz; zRD-TpOHu&dIL68M1QS$B%yv@FkEGGjI99caDq2=R#*K{qRq#>#xN#o^iJz!YlvA~x&n^Rt_5fj#!Vy&! z3W@!X3sTo&6CtJ8gwjbS@-;1Fze`m?bol|af@d-dCJbo{SD>Nxu38}@$(C|q$$3|m z83Ykds`aZ!f(6c_c=PF~MTismpMO@`CYROi{{w}3^+$G}zCEdGp2 z%zjQK9qX(Rp-F;!3BfyE9omKQZ^FN|vHZucpNF?Us++>w?-jZEDUQGSVaNsxIh_B( zb-eO-{o~umLH_w9$L!%Mf5FY-Hz=6At5tRjB4&0k=EqLzyMt8nh^G~FIrD~u@a^P^ zGi8dd>8wh5d*cY*j+R6Pa2>Q6Jz<5s7f&h-lggdVw8VP=g=r*+45OE7-|s+Mz~jse zoE}FuH`qhk3K@ceYQ&2q~)7IRsZECA@$R zjxo3nWNeS66dt~EMZR*6t0yriYhT- zU6S27hye|^!5^-J*M8XPU8wy9ykDOMESI{Tm=zaWn@?v0C+IPAS!Fn z85Y0gTxM<;v6r9St@w;_hWzL^)3}qoDwU z3jyn=z7xLxeZ#1}d;9A3&+pHTo`a&Y^RWU)jOvT&!#cxW7?Hu@c8`2j?Ews`9Z*u2 zi?(5>0Ii!I8fL&K-G^Z!(bvW)OV(eQlNy`LB2ijdrDE~w>d#q32&0m}h#SNb344HFED8fb}jitN~+B=)#2R}1yc z!HtsQ7mn5|7v%`+Dlp@VfK{T-dUQe@=2F-09PbRlyxpn!BCUv_2!`US5;_*nu@k`Z zgdzXoDq*G{h8>1VMb-%D&=qG()s0|lu=-kyh2fhdlG}h}*XxEr3t5ZUmHb(@2#6PTUdi`2K)wc3 zZQX8IZWgOTYsGAqr+RoSgIe$@cA}c%g~(GhQ_^U_0qRz-6WfG+h<+JHpgyqLsA;-+ z0Uw9>(n-zGxIR)jv4t3#^Kfu)Iyb8MWQBT%P-zhzyEco_FmKX%BKN_y^2kUfh-f*z zdaR^X1@)geA5cn@nmaVDRZXZ6rGz_UF`%2+Nuu(oJVO_rSshJ=Ly705VboNop;(`$ zGd9JuTo7FRl$aD;R@^+iWlFHicS)=g6GsiK2dDb;IZ>On#7UzKCt`4~2@N25wi04&f@LUkC7@?}z%mJ}BDMTG`{CJ%=S2}LG= zbFlr2=d)62Srg~6|Lb4)G4Npj?5D54`1bhUpE!N}^KbrM7tCOd9Z6&F-hRqez}Nrh z>+gg7^SPvgK*`r9Tp7|sGQuqHM}8k)I6%sa-h3XkHO&b3JEmx0U~#bv-GdcFqoHl^ zp;m=Uw&d&CT;CVzN1U*rXn>u+1)uVR3~-c4Y{^eTy~LE$5^nj#Ev^(RZHOw0wqldVAI^PNz5EF^&K!%$Rlp zmMb*?O|dse_!jr`!$zy2)}*2&(yUtRr5f$D{IZC=dzuam$PWWNh_e1!J>YU(c1?$y zRLYbLZg3VXsf;?(10^BuUdf|`DUccL0VZnmNjk5Z;*yKn6~o6hd%w-IQ4xTF%||V? zh~+g7SVLDPzEifiF>~T5%IXZZOLWmn&n45^qf>V!N=is{EAQzJw^ECIBTe9`L*OS; z6+%8c0RZZga<8o|_uF{kj#QP?3!WL?MEea=-Wlo$kOTG!*t zS!d5JSPO;guB5ba9+`)L&C~d^70*;sD%5!8Z zCXl7GZzXLtmcn8+ph*YW)SiH}k}J7YYf0ue7uNRi$3&t!Na>H^?H4@$!|Ts?^Jagb z?Z_n@6y$eM+=Ec;tS@x)8IS%gdu-$~m)AtC%o=0Cn>G(4{|X7{SZ&s;Pc26XF58P8 z4{l+@&X0fs1)nYa&rxa59HZd`Cno@dMrVh?j`ZNO5$93`uG0MApuCR=trpxtT{g&( zG^N-Uq!Hai*>YP9anki7G58*O4rL_!blwbLHe<2&MN-iXlr&T_yL3d;Nvcov<}5YM z^7xxeu9V|hP9Vh8B#b0iR%2^=O_kgsu?_`q1zi^m@&WqewlwI^K{^_YcoJqhTw!4- zRHYABs8HY%#(XEg;Cg5~xqb(V30-!lz8d#>B!>+E2WVr^7)a_>J4ZN5E>JJmNFFI% z;8$dT#xv}epD8=PEu4I5|IiN3H-Jsl=HV376!?Notme+x$-#QlLaTIl+wSst4sNv! z-Fl=$x}~K%b@{Q`?-%^o&J;!A7thFwPKPj|bRn#%>cTUN7_GY3K$G*5~XXcV(UQy1K~(e?rpexa5Z|U_*tMHK>VQg zM74!t%TA=_KrmYYha!e`Ike%Iv3l^^*@HUcc-ua%j*|k|CeAp zhbOFw4V&|fV?7w|d&2^a-b5G`cdW9MJx~Q?i+vUPkn72Cqz8u(i|6N38i-7u9jGI5 z>3t1@G(3RGRuBq}<1{hTEj2t^@?mU70B1m$zn`?sE3QO`|G+T3qyrN+(}?uFhWozc zSg1=c@P6!l3M5ra10m;YapWiBmlFb9vTBaAnvU9oj)$;DtR(ms z02Az@ZZ+h2=+~T=2eYqcMit;93vJNp%LspjUM=q&?SpiA8ZS04l^4}me?Sge#auNi zE{pkh?Uoj2Z$)V{Gt@u# zLmCToxc!G-n!8fbNSGZqV|JSN|hgYQZ-e`Is zn6>GyOF=ofsPxNy7wMF0jiSu(3h0^mTKrP{3oz|1Yoq3rF*r0r0ZY=Z+<;fK0$xtM z(aUd;)H3;0RPYiHYN^g=IeQlvWYRTyrumPO7occqu%m4aHzPsTT{zrj>QBT`Pz@(G z?vizS^uqK|e4iKKf>bx?;;XB2YC5Lu*c-2f?8mzh9P2lse9U>VBh8LWyfrWIQR9JoxL)P#(Cn!Sjw02a0qA0v za9dmZg5XNg@g8;~PNli4@r8kZR25ZK>_Lvsaroo6KZn;ZPFri3vKO$t_MjT(ei%5W zK}mJ&uUDymBKc9vzybj0RqbQ)BXqW{&)DUK+kjs8OZo5|mNofi3A2?2rLtl&)j+`Y zaHNKm(B#Uc4q?PR413MoylQKW8v(7Ab({`5z3HyfE3GHV!J1LC1mIpP5ojMI$ok(uPT zb&6cD`TP`~8yLQ*Wsbl{tTOD+9nq=kFF0dJ3^EqW@acA#dyhEpoUsll+}Dz3l7m_{ zjpK$nJj~>|Z$*x@z`MwGICOBVvmUJH+^d5_1xM$ux6(nyd<_h0%C+GHrBwCu>{&;d zHmMHLG+nqmkW6=WD`o7~EYd-0e;2B`<$1^^h3;DF6yf3=|3-RXG)s}IB>9_fapQ0S zgIYE{7pzl&ul9%qk`eYBmjlT*VWiC{h0DqX8CIYXM-Ix)%?p+%Kt`JXCT!rXhLr1J za-}oq=2(gZ5FUTasY0BR=kaU-brxoUOu-=9wk4>wa3bwl7M|mCDx|C_LTYxB8ssf!oKb*&U zdpU9s)KNJfjoHfA%FQ13%md)0_N`JNY-F)w&Q%gpo)LlyHDH{Mh0^=pN5X&g_U=fI z`jP}-}C+)s@n*gDXT{pZkUCKRS>>y`C6+>K0EZCJi-_IdiE9Zx6(J6$( zMRg_!m<9q;v8!xSxLQbcSW5Oi$}%#CXPjm)&4{!@xQ$i5#iH=4&Fv&d(n8KGi{@Hw zXHMFKDf7aj>mZf%Ji7U4#@^;*xwm#_5D7BfCKc<5MWESlV{FmD;|9b-@(w>-V>Ruo z8i~UekVF5%5Zc(4jaddXbbyzQ+&7OAUJ4D6O((?X#Gy38!{vmo?(m+dgJ`gjFi4J4 zRb|YS?HSd^ajMeL#xr0XlY9XY>`>sM>2iF!Eo3j}9ZD{6jk9WVgNo&JGEF87t@HEf zByC<%s!$8DZCBq^*uOQIDU-$Yf2z#E-Nt<;{zB7C?4d9DWEeQ)5e2-%!y;Dq zzy3N5U;pQC{@%*$C&}X599rl%hdUsV2G)F}aMK-RhrZK7ybeZ8Vj%7)_7UVf0#^DZ zYz)*;bhq=g>^hGsft`;AGodUOSDjRNWW(>m?0FwUE9f1>9((GHxr!YlJHmud1+`SN zz+Jv)sO_Jr@XWGaWnj==oZn9l(sps(SwgJZI%g@%N6xexCG;t@GFF}+4gl!+fYve_ zy?v?yC*@jcOb@5IN*QOOI#BEw?8QRfpxQN@u{+?5LpLP6@FivJIG}OJ)zv}?de!lr z4%&)i9cXL>xdUuu;9N#z11v*SRm>fuFr|+4&Uw&pL_Qzal}X^KeF`cw{%RJ zXDwY|%e1hd0{7i5KaU z$dI80m-e-&Qzl^< zn8i_8#o-CdJydhi(Uo>Vjb*{^=p+Roc+bmQ-o1?faG`5FLro}c0_B3%z^AXTOye%P zTMiHd!747^o4Ydl=ahw7E|`W{uv4$&ZXA4sJ4p-5;qDaXi!I+AMXqm&{2;A&2h-?9 z9kXPaFbq0vb^%7&Zb#=VVqMEw`0Bxcw7>@YouQR`K;ouxFtb6g6NDo4u&GHkuFpWi z-MID;1;D6hTp7v70e}Xs7S;7=;FzF<5?LHFk{eejW7KW|2M|U@*;|KE^y@Nd`Fk+X zSk-uqM9ej8#g1<61}rb2WahwZR2eQ`l5IMqOm}u%htkRlTTs1O+fJ?t?aD9i?uiz~ zkg=*Id2xRcWG{Kobcg9+iw||h=i9zmWg&QLU4bUJ5`Kfy_r_pt^|Am^H zT}U~V28B3uE!eSNSnSGII5#Jcs3Ro)DvpMr7`0*O=?{BPo#%tiV|s!5zWiIS@?kn) zInz0~hL*e?1X@p9E=eq!ZgS)BK{G3?Y43R@4*~G$I+F{A;1rJ0o};A18uo2&o(sr? z{H$hNe5%`aXJ2avsI3{qkb1NcJjJ zZ}ove?#}YYJcfZAqkodo;(T+>KzQ4;kVLN`G2o=$c&ChSMx=@z!~ieq7*Z;XZzAlX zU6dhjzXT20r8z~6`Sa)~KVPj*e*4aMTt$W-EdfZL_~i9R9E<#EfA*tq{@y)K^RvHr z`{~qV^yhoodD~o8Zh^4(N1E^)8ci5F6UsRKNwRI1$x!`wmlZNnrxu{Bv{9u;^ZnvHy z0_`YG^hS)`qO`U7q~wZHZh5v4wrh)kam$VOJl!M%u2M!?k9AXfYzoTVvRo?_V1T_k z-5|Zt07A!s*|iDJr(K>`e23F;dgv`mh~%;ZREc5n(7$TUbx`z`P@gYAaQvk?)!7F0 z)0E|p7`Pki0k=*K_-4W%b3Ns45a!sk)n{ky?3|XUkPYab6A!0Vvc1RWW_ilnhLyT~ zTDO8FU>CL)1APZXw^?=L61vu$+g%zyi*Xsq0;C#~1%MyUL1V6pK!04gNrqF8u7#wJ zps@#rbhB^nlwPTkez6?T4q9duE(wXHJr{X$iW%}p)L6rWavhYVUIoLX!Wn?TkZAHD zrzjJVadJ6_r!#y2Ot-jyrP!nNUh|H&AU5EMDY;zo8>=BApe5@%;fA}IKqkyo;q4fk}-C#ecE4PwL| zFuypiEwxhKEHF1<$!LY`(pn`VpgNP<69J1)egnL!q~*Oiikd1=U5macnNo6Gz}sRQ#HA^kI|4YmsB zNGW^xo9n=O-{Vd2&8Z#CU4c_F0h=wS7G(YgRm|cp6eFs0<{X zU4eeI$vA%2YWeRfEk^}Bh6LeE;)G$1yy}?%CBLw*?=R9H||J#8fIPAWmniUE|EP@K9!{bj6ki?Kv_FLOGBmj?KuFZ ztw~rf063oDxNG3O%Mf;5lnUL#G)O0a9!XJnn+r#RpXr*AuzXw!W`cg%sKr@gYer#S zbOse>b^Yw#ghMyN+7{|nmbD$c@BOgI^mIQuLo4y z0Bn!^s$wXL4R2Jw%CpvF>i6BMQP0T-QkfilFrfyiCzS(dpbyAU5VkiGuZ<0?L9b_3 zJ2Hk-oE=jL^uZ)~E~5a;j!)Vt!1*@xAFOZl_k2J6t3AVfNyUIKP2({S+2203_Ta1V z?I-eAL2}?XP$3A!0IG}Bk8*w)_A%xIU{XR(U~nzfgIYtmykiPJYEsEtC5AnQ2%Mk2dF z?zaqTWWf-RsFR37sd1&NcEgUYa~{9)pX~jI8j%ZJK(LqsY&Qs&8T=$pZBREcd)V|5 zf-o*^aYb<FR7bw5nlNN>Yhd%f4y_P0Ha6wO!W3{vi!!v8P=yuk* zEz?1VF7;prk=ueAU*hT5l(aIC@v6{H3D`=__1KX^GRvhNMDi2V?B5Q)#gNACNjqW9d`T$7HS_DK2b&(qh_dr0R|I} zbDP$?7(lI^xDB0a3-u+MgtmEF0MM}eM~STY=nvub*WY&c`dKO`WX0jf@b+wOTKPu%4EuV~7xuDa`HaYrAm zBe-OrT7>}VHp4SM0vVFnO~l<`dzqAzwMv=iKSk1rTsNmhZ3gVia07SRn6wF6c*FTA z^*eVJA#QuBK{vZnQlL|^!SH|peQc|*fB4N0u|w#Fdhq!Z2%JZW8*ifLfrPyIO2vR$ zZRPsBNR9NGo7Chvw!4IwMdQs&xe*>GTyd(ChkZ!`-e%!abMZy>7=urMg5MFkQ;-7M z1p+2#_A6)$0Ix)b&jKuo)I@>4!+k?F|6VS$;bi8*8sl^qx{Ew@@ZNqT3b;tXT9tI< z(2Y(l;n_#DYWIuGp~N(T!ck^d^d0L!eQJ0CcJTttFTKS;6~bh~2NSK@;PlCL)NsdR z6Jccmd?BbeADTOaB~jckk!(OyG|Vy!{IQ0%vy%a>HCreEQE5)WVxoin_k;v%2Y)}lt>`)Oj z9D`$SCvl3?xwDF5aj}XCP*ea-E2pLRNf6XF$V`#~b(Jb>j?DC>}yWt zr0Dzpa#D>Qh_K>PolRV$L>JUj#ZmR>QO=|KNOTyN%XgwzY_>Cjs7RB@%GVuj=q=U) z8fn@r(yCnX?*&d#ZT7KPP&sjz+rYk6UfW*LFAb)`bvzYCiQ7^6upSga!IB2gO+MzW z3vgR7#tm?EFieZPCrA$^LFHKKSzO*Yptl zITRc}J7Ja|UVodPd-wLU@b+7kcYl2s^us6FWa=N^K9-L^4PXDmH$Q~Ul=X^IuJ3Tt zM?>Vx1H}MHmZ_vE$8ZgI>2&Ye3V^C#2-D=kV}rb!%i1MKSqYQ~7dFyK4pp8Ld{K8h(ph!%PLupnVAl+5vK9c7 ztuGc^LH$wjtNX-oD|d)G@K6~Fc3{q&9pzUSUR)Q$1CpJL$dmM%a_$d|oM<6&9Du|K znI31)1a}k+q@Kx5ii)`8fJH4XjT||c_vD@PnlPGYp9)?S4g+_unSQ4mbl82uI5a+b z;zyt)UNc@wB^;^n-e=2K;PXa46=vH17*w{oI_*|NREkde33dQqwwZulHP z+d!hEPT&uo-Uu(45G4prL}cU;l~ZKpT#=YMIhefHX9q&k4OPMZ6@ZUec;H567k zS>26g#-eD&TU;3vcbmb-shQPtuLXK0JR4%nhd>j)&^-|>rT%W=!(kCKjN>I9799pu z{25I(a(q-No|9uygWFX_f1q*;>Jf&tB$lgLjkO(8fI;`hl?}91B47{`OLr)WYETUY z+#2)qB6f$n5ZFhh6rl@bD`_#awri(W?8vzj*P-RHbY9cj3Z5@%<1ik&j^(!a9uxB< zmCE5cZs&P-Pu5USzz`cbt4_f+%~B3@?ONIj(pMBU!!V;x6ikti5^IRsg;BtzLWi{~ zcwEY9un%3)e?esdEFhx!0j9B{R~5<2jBEd7=xp995jE>fotY3h7%8{is$H#9UFNns z{5I74h$@D_&9su1rM90?7OgL-&0PZ}&REZZQOj2gNfR5Gt4d-MtMPeK&r-aNwa;UB zJrvAGx%-qkn1gOBzb3ZIcFzyMU9}+APfd7}We_M-UR|j~v5YekE_Dw#V1|ln@e4J{i4op_7N;3LPX`f72WME{+hIEFdyJ z91||r4k6%3SC%iNgKNv9ZMn`PRG*joD$l8+Y)Y0zpIcW!lq+R?Y6W^#wUg>{g$P!D zR%u=KpcnD^8di_iIr#64jUW!It{(=Hr5m%3b6(7IpH$vmGzswZ z%}IbZRw={mt6I3MTcEELmm{s-Nh?FbK85uZ*oK!gH7>#qRC(lxr+CJY;ZFH93ld_E5p9u08Z1>nC5D5US+`dQi77&P%y9Eyu=6_sp+jqQ2>_NpB+}`y z!_LCXtX`$9m6!{X^epj$MjZnzbl6;@QG=jLA2yPhcDz|sK5+o*{~*=(Po&b88eB4t zp8UY{eWBR?>+nDSr+jt@u>biVE-wHb?T&n@jm=wdR3m(qTE|I0%kYGdNf$RaXdMxd*DH~UxgZo-yqx6)je~Pz=X_=5<5mH;Rh0aJ zGD0)C&!gazS3wJ_rJo)Ia&l}3vD2uPBk1(!xt(-w3%0bZktWCkbMP^#bsUlvK?qYi z<&3<x-~e%Eryt+2 zYQC^kF$46lY_H8la0`ewUe+!Jm=311f;5{@!!NJPRW|D%lb&(Ws zpx`svN$S|a{>L0$qP4oG`>Y*VrE^LWbUH_(xSQaf-M}?(b2O=S^c~B=Z>{APv7Cfq zrlb&f^fpI-b?p=xcqb6Etv84SkWg?1Y|VmN(q3hR!77v!EdDnJMF)=?!xDLa5aUhd zo;%XviZ!ytYEoMf^oRC5^_1=*)*Cd`aZ?ABxR|G7hyRx2ep)I(8z>Hw9|OwXULqI+ zq%G;_jf_;u=f<P=fM4`eC~}?MW^&RpO3U4cOr=D>+Gql&k>m#|dyOab&;X#v#2?;?#%&bL0{=DJ&}i zW~rn0dcUk?=3=yt7F@HltsT2a*)q4cRvD;KvbW)Lddj~n-NPkKba0ktrwrXg`9SYb z2l;(Eyz#Xtrjv;9!Kbn_E_4oV;I_&w-y9!umHQ5~#b%H!e9&PaDL@^R&aLg0U*5M0 zfkgRg@BX+42F+3WBjnIuScIP46a;bGv~WB9B$5ql)KeyZqmXE{sl6WV)N$_l=}G*S z7GXBci9s>ZIc)C`KdvtQCbepJ*r<+}NUnG91WzBL+VfpC8=@i;egm%Ya&rX?rpT)D)r>5xy&vRiLKlYlBp}2Z!E5E zBWz))+tQ+iRkVAy(2ExLB^dVVTMwDnWj!#KDrrtmQK)9>h}973ph6&$Z@~^Btg1I! zS30q_K#mlN@Z4j{Hy?_v=}l@zDe$F`;3E>zN1b_EpzhrqBvm!`(6+mQH8y^)Z@O{w z655P=>_EoPN&r-jLVhI03OjW=)|A`aWmd&NU*~c=S*Xg}(@$L{;oD=_*8^&%k^weC z0FJ$`iC)3wLN%j83TufG&(lx_`#qm9V$`jZ?f~LM5wl$I5oHVbD?`5-E(yjEefT0T zO3p5t_|W+bM>#{2wnfzv7Y17xd0S5f)O!s_w3mVMvJ9kRUE*Gp?7ca+xb9v%JBb05~Sh_6}X0@c%Ey#X@?IfL$p?q>^rda_G z?dT`*F0diH5gXI!t<3QfN-$LrkUPp=*esz#ZoGXM$)yKQ@Z=yc7d5tKRK|^05R-3| zv76)ZiG2b+FDRp9FC@1~w-d}Fo!i`w0qikHMP|HvAf9rhS1nfcfY3vTTG>{r`c3@+ zCDyh?ii}&)9Ri0aUf_&6Iy(kJv%KA*l@vG>1h%Ec*ro}IN+|rjKa!ARbHLV%&Jflk~G=1*I?(7YsF z$#e3mqP0@Zt`Uw^@)nFv(_oNmH#LAJfB-k?u+-I(9PrCaruHd9(PO#eaG-+S zt^9d6D9eUgf~qYmN`=L>6al9(eBp#@)q;B+q}{?7|9f3}3-;YkdGz@h;35m~@MAhc z`R_3uv6$|UzJK=dYc4kb`TbYn;|I_hUue@Sb+x6io$R<=MpI}5B{V)If~}tiHRmyc zKd}(|@Mxe!ZLw=x%W4s@@?3yH zUn#Ha3m_6e-0tIpC=$TM={B*GA}i5)T!Vx37Xb4lTn{7gvvkE;bgzU#iTzX?`cfnH zh$X4KV;kc$&;=5nC6%G|q~7d6!2newH>zs;dW{nOT8VI|zf+Pg*c+Nno;poh1Tlb> zg6d6bU_u)`9t+Tur^>W}PUT@5*hfIDEV5uM!(FL7UFhd!XKT~IGD`}Kre+H^K&&6y zvC@vDE9NM7EH1BHjY_Rj#avQ@na-9Ew3YJiG^Mdyv}zw`&gm=MfxHzIdE&Z)H)LkY z|H&s((%rEew{`)9HP)uK+C_jT!zb7QRix*1)G)n4nsT>ry}bn~F_Ov3`nzUQ+~>6b zc-Gp!F_(gSVc)WWwe2}kw8qXT`BFDHAs_Aw^sO5YDf$M|jy9MFj0)_vPqHX;r||S*{Dp z7nSNe>u%k}Mhaq~+$l~%RP)uv42ruAcHlBS*^r@V&E=2aq#@ds*0nMA^%clTFm9ofB>KvZKqYq8I&pP)1X?7XlK0 zz^~yi9{?uh%kciI%Qv6D|1rFOt#ncyO8?5ru$L4d0QMN=2|Z*q=~>myIwXAnx#Yk^ z8tcle*j1T}(kn2G!}bT)h(-u2wjtq~FFcG$bV70(|I3A8Ji`q^V{mn02xDO4^Gq&d zpnJ-!BJA1*XeC|M8f6kCT`;^N_8beJjTR@^kwJuBit`iA2*AYsTXaaJGMO^L9XsBc z%ha~-!+|!3z^tc=1mvv!lPV#;T$V$SIlllflafOO0l?zmb?UZWHCywUT(;6)JAP3A z?(D-5iOh(^0l(9JHVbR%d9g5BsZsBmKv=SNQtd7+cB)nJZIJOsPMTK0}P4Hq>DoH(KZ=fssU~qB5QTfbxrwOYKOeEzN>o)>7+B=A;2uP5H9f=NEv^1H!K0A1jR;G7sNS6y9`e| ze6q>e>}+LSD(+gfcfhGr2cZQn`GQ(;)R-PAF#wE;m)c#af-jAvEAt|R$Ed|!>8~DR zOP1*(t&zMtH#<+OqFt6d1z!O!wRntG>tX$*Q*T_RPlmgUb#b7aR@|-iLKyF8`Cw=5 zd}8z`iK}v>T~w?jKY~%<;8PW}Hp8Woy!6;@T^e)7$UguR1t^8@oSp0?nlGsdN~w_z zWhifUzCq)Uf@_cLSKq!R4Euh4(*PzWEWxDf0D;@bRS-+;MHK+AbvRR~53a zgJcH!DLxxDS(_#W(kP}b2U*mtRn1yz!@9yKJ~|}nxJB3C(fb;1eM+SY%Kst-in(B{ z3Nw960M~#XmAfL z+l&i&`IhaVgm1ZU6wg@Esa&O%7HfM{T_E_jWSIiUq3&cViT_xo$n{{Xu8hj*M|eoA ztn(`+eotJucGsYiNOmeUOLov@fB>N!Ey$u2J{n&4q4#C$9rx{nY?meUhpYRXsstdg zR{yKq0CxAz5z}9~Qp8r(E&#D-r9U73ty1dO1JIAC%Hy&XQVE)vjeK4}#w6<8N|>EM zH60)4A?Kjmq;^07uP9;M+{`CK>BuN4+|%K#*C*+2&B0o|@6w`QmmQ$RbXQXy`))^c zFm%GlJPUU}QD9&5F=^y|xZQZrLR*V*OS4hCs!O%KIcSEuKm&yiM15{r6Uoew!i5LR zc6h_zToVGQns(i6=i72Q22esNCB9tziUeh|(%vyMeC6Rwu9zFh5s|onqbVXeb{SjuMb7 zrsx8^%)&{|Tgd(?N8ae6fazR}0q&2tul(mn8>O1{|TpYF3RMj7$GggoZPC{qsmBzxen*zlOhjApgV< z!^f}l&;Q{4U&Fh}`F{E#spc~tfBx~~?0fxVl{ZsI>`x&=`RT`JA3st2O!)W|$eGRy zgjZk`*cW(v%57uHH4$jwnYZKH-nj?d6EMEUZL(D}ee4VN9~lAP0%4OMfiqKt5tI_1 z?2>p$8MCk*DWQYl^K?K#ZCLdPTkU-F2TkfX$qzQE(CwH_4Iq`nHV7KSK!kHBzmCqn zT~QP5*&P)i;UnQaVQvt8&7t}W30nnV@8FTP#_leEeX`uJbyIV2RTh9w3~rCPJ{1yB zj#7EO>3k+UZ$;tLYAG>kWew+!`9Q5s;CDG)X$=nMTuxF_(}*j(b@hV;0weU26B(*{ zqf+apnPc4_%7W7C9X88T!UwV;LTr&@-de~#9t#vX9#`^d;n1s332JFAIF?cu zP%U8vJ05VK%Y7?4au@DX?Fhcz6)~6TvXrLs_ z9R|`U_ZGMgkjYS{Y6ql@0Qh6-7rP{ih^{Jg1zJ}vUJ|qzAg>F37;YYVO#U1#60xSp zM|l{=8X;nutI$`cDp}RW@4QwA|I}%#Pdv<3!fkFqHnPuULBr&whJ;-XoLe8RmIdHg2gwC_U#Xi3Vr-}!v3W%{%J+m13QubXn51}C|48pLdd>Dv!*ZD z#z+J62iqrXC|QYnA8Ys&b6O->(k-qE9eB-DC_<98BlM?ROUX(Pg>!izcaTM` zNvLC>%`|GB1U`|Qen@<{L~rv5-1r0B9XZyTl-=uxI;P?rX$0ak z^S{)<8aFrS0hM)fX_+0J|*{?p)hnAj9nAv>n_>ZC6wvkyfv(`8-nM@6wta>6T&@2-Yg-&(2LRYWmCE}CmzwR5 zVZ}uGn@xfx!~P7{6NLgbL;-<2T2UIOQwud}W};A{JTf*rcD;l9mfy8SdjawsTkEuk0zz{vCb?;m|EK&19QU$dx;rO zhjdk4(iKc1-0K5E+RIJIv{5WDW=NFc{r7(x{`N>2zsK(QFGfedl0;&bPe1thnz`hg z&))xtC4_3<|CHE!$K3z+{U@eeY|tUNxxFk4zEU%|&^lJl)PjG*O8X5^(5IyyRRvps zk7T%#t0=gJnG;MOl7=LaSr~kz;m~<{;6^_pFwh5JXTi_MJ*cJWhZ-_GJoYfp-~(e; zNFMN*yTX%-zQo+exMSyhX92i^RWLZR2sf~edDM$kwI{*TaPcux9CI2dVoMQA`J3A^ zC+ZZV9GxOp1Xrw;S84*yFc7|88Oi1S*yfWnm@b)*1-q7XUoog-*od_LN$72?vvuEA zjhzq{NFJOZYXaWX;Mygq*$su?b;>l{B~YJLWyjD+jDoC;L@BDYtKmj0Y}o__GFLk9 zHw^NyAKN3f@S$*w=QWRHR}FG++8x=CIxn}Oj6_esqx!b0P;u9;aaoeN*q89EF2eQ6 z{XvDbK_1+5j}2OHX7z?;CQ++9@RE?Pl*9^ned3VjK0c9@Jr`hSXaRqA)k^6-fVD(j zau4-})dF0tT5vfQP<^F)DpcV<9hn8qC6S?FC4y&$naARc3`|RPa$#riYT39CfHAe? z_Df9}gc?E$Emy}06Gl^KL7A!4xE8@Uf%519+9>_$4el&Ux+EPrQLZUTox{St+e&OW zSF&}FwH_e)n3$7*+b$|V3-IfK#YcB}y-E+7yq=e^h#dmlwG0K6lEO5siGd_sSQO-` zjEj~*w|Xk}f^1pfoM)X#jmv~tmpu&70o5uauqKpJK%+}XwNgn71|W^9UZVa^IhrS3 zHY=hqc65Be;0>WB^^aRQ$K$ufB7R&Oc{;FHtwV|C*uo zNAmt&Ua)_4oq`wGjKyUi5obn=i~9&=5L$r0p%}C#AnSA-+ZjOE6vLY^f5I<#cK5I&p-0X3wM7c@3o!`7c1oL34utSAXM z3pbDsB!T%zaCu^_?oMT}Wa6$<-E@n{;LSQy7NGLWa$lsnxxlDiQIKiMx^a)27qXdt8)1q2Q8w zJf=f+tQ@p|#e^mwsc1Ln$4z-jsy(+^(N=A0d(Dv`5L}es#fXUygGXyYOzN0QUAB+dN#Cs$ZJf7Q#)krd&FH>Fh*hjVV$|G@uvJE7Yu99cuVhobqvz5hZE zz6f&gYZV&6?o#nQ29lp$?+Y56q@DuL7jC3qJyZJ%9A#%{&l9A%9Hte(YBq@vok!U; zJCx0)$azG31PD%RHfWPS66Q9NMi12*NmLJo&7-eGq0+G4TJl2F^#`V;8gwo+pk^T+ z8Bu8150-LC`%O}`bxl7u#1hrwy zC-a!;HQy4ifoC{bPE*ER+sHy;cfh(AG|N$iMzE3KuEU4an{}e+(YOPkFdC9ak&uj{ z3FbaP+*nE6L%v-Jh$qieDOoWkJX042bi7ia&ut8BMZjV0Q}5Ksp{<&cBQ4a`Plcfr zmwqh{@PEH5*kX5!C3zETm9#*6bsfzcw%6OmA)j}cwo0(CXZrjhtAa|_4vgrSz?3|Z z61w0Xwbhmw!&yi;N~H<}sOf=sNkx`m79w%Vh-~*~_(W$VYtw=-{UEan6SmH`iFdfm z&UVq?!_$;~-)t+R3NTg!j~QRvKoI?+TEC&&Y@1MTxOyzBNuwVIA1~BuFegvLg(ZN4 zaq}kRGY-D0R_TUd|EraYJ(|$>gF~TvuV>4?r_#Qi((FJhKbd+fHPM0cI=YM;#vzfb zYu)5pF|d~HS&QzDY=LIXaH`(Q*iVYf%xBUqsSmZvPaXG#V%(viQt15iK2xwUVaH;j z8z9D^C5>~vx zI^PJyT2{Wze(d6xt1{^8vyu^dMP;1;+% zLOAyf%{cv#VzST+jVX(U zAWP>%7#fvi)Kl^{rvlQH>_Oiz$phorg|U}T)i#SuP(pC0ZhH%i!N$Rm7Z^Is38o?3 zX+jqOuQ^KsNEAV!#7*Uzj#62{?axl3Qnnn+$=2r(kF@#H&&0+M6)q|sA!TNH_cups zH)?ry(oWoof=qCTBV7n{i~6Fncc}G}K_0g*z#PC9lgbRGW&oD+BVqDkHT?U-*4XVT zWp-hKcQh<_+h>FiR=gJs-}A5IZqQn-N%HK1rOIH4euLgra)ji_n5nb9s>P2oOSuAUvuwe-c zFd{SfgU4ThezZE3ONpI`YHy?%k^WkFNYHPoNj+0sdJiIlDwfu~aF@a;Gw{CSB`GoX z(E?)rNV;5b)c>s1;zJn>krOoY3#9EAm)LY;DjJNe(8sTwk#8gLP76MXWlbxKgOFLQJt>`^}@rLV>aM{!a|JSq{etT4#O?ewt^EQ8tzoSU;y52MR*@! zyTJkkUdk0TTig#%hhX_w>7vJ-++cFqoq*`Q5-^DZ*}6l^q8=5JQ>!ZLaD-;4gwVbq_U`f_0^wgZ{4;)@eYLY4vV8ZeoE^&i$4;oj0 zJLK1T?E%$mm++1iHsZs6iSn9_FZnm&Z~o?pum2X_zn{HSB6k@vp_1LEzEaTq|w z9lk{!MXd?HJc)VF2DS>85lRzKE@3Hll}oHTkH&%e=Nn9yS(js` ztmU~C<_m<3H_O~Q-*}9!EG9+K%TZ;BzfeAMa*cchG$MlMwGt2Xchl8CIxv^JybX#GnFJIv8*+G!Y5iihJ#5|)* z6-^xOAhbrHt&6tv-Qi6>Kl_asQ^#&|%95T}Bob}X)qzT6rz^C-5dsMNgTM7b$I6xR zwR1#A!REWsrn|pn^d})7QF^-*Q3&&FS`$6Po3DLp4Gf%uco7LF3YAhj1@mWnWug6$ z$b!8*P#p&Y>6$g%NE%%+C*ry#O$r@eS1+koN~3D2$!Ym~rkYhi&GuAG?`RfU)!M9B z{70-|yk1Erl^{XGd1Qkq-zinx(H`RZ0DA7pQ$Y`B07^i$zZ~kl$j9@%sECtXl)N2E z#kI>_DpyiZA)yk?N@V=@Xo6MdULo3jdWnyMK4&g&%>c`u&eTLVMB9^J%bC8N4vnVmwcc)A(;o$5ek1z%PBd_T?>Hn+EP=dl(Lo?9tJFdIu00QmQt!$ z1=JETK<`j+0X32eMPDK0Q3Vo!Mu&AMo^f{T*HyAU6lv0d^}r33D*?0*)Sg3sS~5Ew|$!l^u8o=g)QA6X2-DNn9qOWfld2H2c* zLIKi{DU_wjOl@lmU`b(z_i>dAy0Anu+t{4?6OvmnTZ36BQ%e_~vpdxGa=TFH$Q17Qy_19~3inYXbfOv-5AApJt=j}Qj(y7YJb&8Ae@hyL% z5o5SFXwA5ab0O~|0I&I^+mdR2QzE8Nr-9Mycwn+@M)F{AmM1xOSDTAW*vTNI+X^o~ zisoz{|H9$O;`{&yuDiVcSz`X04GW%wlMtbLMgOF+DRp6uCudWzxg8k`5zIg ze;+=+zHo>6GjMO9F|f_%Ixw4u!YAyFqlS~j~&p&&pBfC(Q|J}zPYd+bW({dLcCmGYHXxvg%@LW1w>zT&t%o7ag@mf2>`5P3yjSH;viTcn^Rk;emG?2 zzN?t-K-qmzcI-QIgu41{RF^xpXKv~-=$Yl*`ynKpX_;2l1JopUVJl^27FBAtd0}K# z2-XnG%wCjJ%u8kpvtg=^JEQTqsK)3P%Lf9GRB8YzI~RRJJts*5 zkpu5~1R!$&4jiH(SL|$PVs-7XSG?PCe5m8nP!r|-fX+e3A-w8PTvUbfcsP}J{LWQc zcm{az?o^$3)nWR|n%}LH6f6bspRRJTMs0f#dEn+c(=|n|=mHa4ih^z7ekm8Yf?2Q! zKmbq1WCb?&w07x&EX@vO_QSUv@M#!d5$aSztz7OA8WooT#1JQkXz6ZOh|-08!d%R% z^}Y}R4kY9?B}HulF`J|AMi*wKCv*>n=m0Req=j z7m8W=)5I7=`70X`wUv$8Z*Lo7gy?VE9) z)lb^aDmOiRs0}A|^Z+rfXg#MuG!6uC+hbq^F)+)KD(_f1?|uvuMnJQYj4cZQ(Ji5x zzD-!I$C)f5`G+E?mRl9PIzv;CC!9P@x-pET8ZS@`=nrTMIw$gimmWKuLo%j=LaU?* zU%+O=bBSo9fm{~l2h3QoqIKjv3fv9Wh>Nu5?C@1{*Ym{czEANAAluQ5%o(`MdC-Vo z;};whh;PvkYYg?V?>CC5TzO+hq#cJKsnnoef*p2-5zH97pZiI!@<&R;tsN+BB3H>LTcGe+ zuPzK!uI)1p(2fK9hrENuRH(`yuO*3L_Y9`mj7joDdbW$n4roeX$CQWs(9Kl|2YY{^ zQ?E#Lj_7Cq{r3zG)?;$i5k+!|=17|V0XQ*)@JF3#VXvEBmiZQkm_Nj+`H;NH;! zp^;po?IRqkbq*K_an1%m4V`|-yoYDgCtLIouWvjl&NUR_6Hr0!O6o4@HAW*Y-&&`! z1YCo;0;3$oN~Y}6B;nFvV|7$1|3J8j(L|jonyU1MJKfF`8t~5ikb!uS^z-7Jf0kT$ z2;f#}E_P+POJ;~tJ`+9JE4l4d7*$e4b3iYdU@*jI351ayf%oJyeI5C`sdA~-;QUrL z;~<*{#Qa3JLEyqACD?``4&&tO1~@U=Ohulv)MXuM`q;=aX-Izq;TJpc9YdiGYeh@R zN;N5qGj{>Hv0c2g&~;fFC%JkH%$A}f%8Qcr;)QlGNqw0{XjTH}j8;Sch&1h+wfGz^ z8q^MgQTIB1U>HZhN5x_YHmiNQM6XI>1$INQTV1O?7lk!q(I0{x{4PKGU&6;%!1IJx zV?)_J_6o?c5AjWFpvxPk4F=!Q&DXXbCzaPDNE<0x9!D;!d3d7ns*3yui5N*M-I1K! z&HWLcs~wPEv_9cFQC-$eN~s-NiNUW7X~Ol5;S4A%Ro>kS8w6K*>wpG2_GNNu%bgF= z=@aE~*{&>Pq5ML7;YB@q*r8}-KS64M(dU z?GC#&$q9q5H~H?|qDo5UV`Ok92}y?)s5k`6W}b#uf=ztJR_dj~&am?tM#|sd3R_wq z@>m`Kt3OEnmd`MaiVXRMJ9YpnL*VjnG7hrNhu++eXpjHF!)hVbNmgqf@Mo zwGUVjjK~#BQ1cJfsl>8_F?@tj2t7d3Q5_db*j(jn-2^w&!^EMIW)%@y>VCrJrMZb1 z=>tQN11cg`Viyu0PBV%?ss;DAMgWiUkI_Ym<8Ms(^JAFk8`dDVOGrq z46_q@L#=~Rjottg0mLi2&o^!4C}ax9xmH?iewr92p{O{{=Hy{|)m4sE`NfG91MLcV zDU8+NEDnA=%~okFdxff__ihe$9&>t0lx=`p;G=88#lU_dDad4*!`<{smZ=>~+2125 z5Y`q$Q<~KKSURZ7ax;BY)tpR9j$^OkdJ)-j?Zk3AEx2Ppsz#9Sq>BJ0O(4e%&xwSO z(Q5nRP^pI^zVuP_)Keu%%#+qr_?y6cL`y7GS6Vj>qkf=Mz5@m+ z2NqX(8;IrYcObuM%e`YXN&+k3RqfG*$P+jr>mlpyEgCu=!s|gK@2-|LW)Fc`ktU}H z6-n)wD>gOSy4*7>sNn|-kxH17U^~!t`_X?$D0|tf(7E^uDSPhIZ%I8VI&Nxi@FbPJ8pL!X8z-tTa5h} z2O@>s)4pKt1o#YItTd6%N~y5ds$k=L0XtBv2CyTs#|+>82}v`D7k7dAVG)QM8g2@fW#Yjt zEB}6Sg{t^qoP-ihFNs6BGzp_8WH5O<3eNrF5VI5ym1*3IucFf>%tV8Q7kL&HIj}aP z`ihHRocs~0URg5W567eb8a{rR&wc_Z=Pxhc{5W8x{OQMM@4v{xli%0H@y9QNFNlBp z@dtHm{V>JK|MKU5uonAO!Hw?D!4iy*tbTt}cx}!@Kr#R^H_o#a*hYqJVz)YU^bR?` zqG6_jHZ9dBPz4|JmHq43f(xTQbTS#M({nUaIZ?uan&p} zjHT=NhB#l6Wtw%z;1Ya4Qj=w%T|KI?b3T^C>jv30Pf{RDGaU_%3S9tkp@L1{M!?rC zv7oNUB*7=j*ayM~w)I6gR3$Bi%%i4APac3)ahHcsP&S)uNGc===%2w%$kUoL^-@69 zh8v4Y8x7v3l3pl`3=u|Y7NJDE*i1=TK1xA%VRYR_A};3(eNdP<_A46Y8KI$F>+u|N zg_XPhEjq)?Cne;uyjM`c*JV^LRd@k9HalptkEexckBck1d#t{_n=};c1R)WJeZ`Ya z#2Bo^@7g};AhYbKPX=&ZOiW^a>JsmUe;g;0Y zDoDZ9Y8+WwUqkd0z|qZCNQ{;jwZ7bUS*lQTZBK_ue384b%Deq zU_0TYGMR-7sP*WeM>UsPP7J6k`mn>@Sl83VXsdv0Z01(dd3ux-vkCSIrnh*~c}N@P z9rj7Xs)!3}SEx(v>@T+(;UdwR8)c>HEyqs2Y8PPt7avW5GE%lD_DdD<+4bYvK8^^X zd;tPkx7@5+O0l`Bejwsr{=E)8zJB z8nfEwJ4LHr%(mG89fGM@=`1dSs_o)gG4kOgU{8C9Fv~?tVtGETOl9YI%3R+*njd;SGy>%)Ih4LUoIOh?MeaMk2j`nNtQe zSzhR&?2Ubek*WyyP>_}jpI%t3QH1jerDH~7_mN>FpsnMxAg}>2S$*`|4@&cia!EzkAi6PN zhwWkwI;XmgsTd1B1YX}E#fDYtiVyVW>+$)xsid!IG8L_|<-yYSkTC_Rk%IZnrZP!( z0@+f-Ff~4OUF32aAqz$*>*iL_^QekbCW$asV>dNc?SKV-XIxMXvI=Tur1WA+Hs;=C zS&s3^G{TSzi;UI6j|!BTE?ibfC_93(r000Lu311L9u;Nodb+ z39i|Lh#$67hCu+?XcGCx(l>!abV8Jl1eM?Hgx)PQwpGWw8#*%RK|O;4_KGnby=6LsqJ)*jg?a9(!Yw)KZq)=TB6)l2c4qsrN`9E6 z%UB#vaEmG2*hMUEm(ljPcQ0)P?Vg3Eg$Hq0HG(n6OJvp3aTV8KzvCLJ z@{;z$<0V192D~w#2yeER;Q@bC2mz(u1fzqROE zW3}-@d;d`h4A4@Pprac;S4!yxaVP;bN zcg_ZqY&fmp088VVwITQ(_4`$dqJDEkb-#2mK>X-%I6=so0K~K~JU~rQUWUcpLJeV6 z?8^f2+PaSwHVCFaxq;6Y7d3FS%TjLt1Sb?J`fJsXzci_} z5|@fyBk^1s$8Gu09zr`9*#dFK01l&FcGN0p13wr!icm`-1QZqC;I~Wl7D`~1PKa3S zEY<_rU-f&S+&0*SS-4gz)3G8>=>cuDH!bb2EJezBpWHwK0Hr%XHFR` zG(lWQXB|OsHw_EBa})#+)UxiBlgQ+T!;S!Rs*}n-ve})I6lz~zd7IIUPe~lWVcPW> zrv_Zu$=01wssL{&bg86$!wK995fFKp{e4seY0DC)yC2xk3T=zUl>g2C3;Jiy8(9wM zcl;Xu@`2;0e)aJi^I)V%8zeD*9P$^(&3+|)1_Tz>x8x4Se9kDUygj2`uy*93!%RD@ z(#X*)1njL#fnn~pHb%9~52-!LeCX(HJw91UN+VQ$qyqptb8}>aC(c*Fe_#wrX@@E6k&Q|+J zz@P3?5cb?sU_wC*7wQSQ>MxL3ekd_OT9Vq=75Gt!i#k!a^%ta1$IFQ5ctO1=Z~o1w z1J`hZ`3`vN8cJWv764 zw=aQ?2dszrKp$@4BQzuDwtYLl;>0y*uLKJnA<@L-P=eT0`KxsaiLe~Z>+URhneS0v zfC|8;esQO+h^yVZsQT{X(}7MS@Gbnj?vfpxwW~6EKC8Jyj z$k|gw{yNBE3`m6!7q3$#|mo~J6#x^IU5mT;wRK_axVVC#tKZO7B zuk^9M3g7wbBRK!z<6pRZ_#=fiKjQ}cXYxq+_}9xfKT>$?=kGs-Xq$YI5dP=CfB)x< zp_M@X{^iFP-)66U{qbx2?qBnvKZN%$@b!1^e>6E{Xuo}txoqG2_!0tfNCx`zJ64zW z()UsB;&$Sq?D+^CAxpx%@U);E$$hc4x5V1pNDD=n zwNaf2&z^^vnY*PkJWyJxd)5BLcJQS}M2FHsFeJidl)LZJk^0LCcL0nmT0ToK*rrF9 zjl(2e>f^gaD&J)k9bvw6>WgsnGLkE$Nt;HlOC+@v(xns-#4A>GkS6tI#BBW~? zX-kM5P+D6eWa$Pu`XXk4R}3ZN;a}V^p-WMCY?=nF`=}!XR8Gq!SHHPZKtBTZ;{NGy z@gaP+Yt<;3Es}Jn4_%M01pGrEPO2>Xb}7Xx!L-sHO4FQ%@d`o*x7rmP_cnGmSQaa~ z?C5M1gJFlb-q&L%fs6#GH0X=@0bCHr@cRyFt<(7RK2U)2wn^3*B!$$_syY-1Z@N+g zY~@CD%q`R=u{?6NpLc&)^7wqag>Fqdc(#$~S!QJvdmwkUKG{cshGuP}c7GM_m$r<6 z0b^RXz%?W18#QuST!&Du=qggr**s^b6J3UZXm1-+iza6wzf6usP7YEM5;a)BhCy z&;OlgM6&ENT__usz%bI>op)IUuH^}FxCmH+<` z9eQnR0RU^4Nkmz3ML<=cD=?B+=u?)~Q z%McIR0A`0`$fmhRu~t@fdJ1EKD|La=YK#z&o>)MSrIPoAsvE_-^|O1)mglqT*< z6^D3CjwI2o$3;7D(CFAcvD{XYb~dL?r;<~v18Y8rNTYE5*)#2&DkDveJ-E{)nZB=tr#FjblwmAXEJJjSq^y|3yQ05RBW=9PCwy7LMH zO70JPm1`e#D7GdS9z83QLR+upH>Bvb;Q_EyU1+aR9L2OGdD{aNevw=f4@{7LUhnL?<1_n-FaKtr1%3Z!6NPd zA=UN72+Zs92h>DXwy0A5LxrSl>~2yS@gX^!sYfontox+WG!{T5I*<2ayx-~kK5i%A z1;$Dk^JhW5h#tePLEy*W2z0D8GHn~s+Li+U5);%iQ5wJ2p|w&@%b&$2ox{_Yq6<`k zF$A|;bZL9tFLiQZdc<4cFrN{&{(vfijPBWmgYHfQJo-fU)E*B2+7FpiJY`sg)9dAyBA>{jv5~#I#aA=lPx-Dd`QLi4O6?8Mc zR#!i<>QL{+-hOe#C}o7@oUn)T4*iW+G*ZBztyV_M+5?jG6@F!F$3yXLNYWn3&k|S# zWpiU|n1pM0D0A$(C2torJ*8QMNd^KE5{byheZ9Ph)e88&DyQWn0Nu;y(76y4EP;>I zbRxG(f*RBIIM%+se(c=u+|wezR1z4~3@qzgN~?wcdTjqZ_OmRgMyy7~bCrl+TF%RabU*`Uv#nv(ZC&i-vcW(UE5=ZJkGrAn8_i58KcSOjR3jKYh*-Zhe%H!l0pBE<} z+yTt7j({#wT((gugl>GgQc0?+-BeH3xI-2H2~`JMvBb9^@t&UstZ;Zos}znD7t>a_ z`;E$iD@69}7OC@_%aXkVsq#8@tqWvJlEmJSHpvUT*Avzca)B{rN>Kw(Udd=B)6c{7 zOlIu%B{sRSaMJ?lTVv)(G(dvt7L-o5lD$Y33Y%%o5>vw<7!7B&b%7#diVqKW9oHuRcb^o%mC&Y=3YSi5`Z_Yc1149^4c?6CM(Rm0y zv8=zz#zi;m_-7q~J6EOrT?H}Rx0Cl6$i}7QL%NoQ=bUtfBPBGsVVPW2+%aVVsziiN>u`X$IZ~9CK>Aatsv%L;>F}hyn$V#FF7x@z9lYV~oSNeiI z6_ie1j<#Mgc;T=Rf_ee?lfmW5v5b%9Wi6DM8Oc)IszurtSA-b+1LF>- zABdPw+l+x*0NFEVh0W5F^ds0HEiD%>z>&pryn`vXGO)vw6=2$WGb)~9K*IlwPxdg(x4JRRhw4E1Vs+0OXsXk-iKM`)r2vwuS@F3k5Brf+3BjM)q$UkY&=K zL;}a0wQqr~$^aa3T<&C?sNR*7tT(bpP|(cr8ol|Di`OIxF>u1NMN zamrv@W0Bl46G^q?*2C%wYC!%PVo6YM8;ESsy@eDVJC@WFn+OnwFvvOC1k@;)kNF4Q z<_L7K{WH!)x^AJW2_?%dLq3taKa>fBGR|DDu`3S;IOyCOL1e&)Lluk(nN7Wm7^OSb zE(##?t%#y}X(|lxjc@bku^Ci`+6#BE>p1Hgg8ie?4ybxkF*0tbgo(ro-UFa5QA*@S81o)}5Rb#fzB-DRq6kkF9f!ECEtoJZkf$wyTpK)I3~J#sXk{MW zKhNzVS}9#XbAA_O8qGSbLYd~`-wj>AL-6s8VjhjBy9pmJaq?F{t*GnCDCNj8HUqXJU!K^%}%^Ek; zQae87E!X1PM(hPGfN}LsFo`Dx4|APBA@F$xSl;bfr!F{Q`;oNzZdJb^(vxwD!NnSJ zocyqfWMHpP$PZsY2wp7cjaWLE%@O%q^TCTk^e1b zLJiLTNpue-g#y*SMm>M20$xkByiFDx_kh>(vNP!fdD3(wSp+oPrOuL1~IJ~C0%9G_yn?M{xVx4{9gd9Se)P>nZr{93~82q5n6rKD~< zoNxj%h)-r~?Av*(LcaCzIH+66ZzFct64^+gsU?lMa|GbR(wISh`v@e!L)t(IYzyXP zDfr|vc}VaqTk>0BC*&k0bS*V~hNOYq$0azp3ydzgS}?a~uLt8{{yTCP?-VqFqy08h z3te6e92v{|rGjAKsMZ%i_Nl~`4UFb2U<$_3hH-G7I9rsL2d7s41#JXI=L`-&*e{Sn zDaTIv4@?E+h^oBG7DQMv0VynXXtk00o^507r!_;LnvfE-;>;%WP6x}L&{2l``WJ*Ei_HuDtIg(#Jp&$$&f~!56Y9 zPGIknONT~@qc+}xeYQz5;zzkFk~{3aK}WKt9AYfXansp=p8ikrUy%QE+RMuy6-W0) z`|+KxK7Pip;V&QH*ZkA}^6~k{*FnDg-mEsh`TYH7fxe=?qz~_A$)O^=zKoZ!_HAP1 z?#6hK7U~nU(-WJwr}T~i}T8a2n!neVe2F50nt(y&o_u`hyjj|72gXFkUVTuCZavpuQ3=*kC- zBHg4`T*T;eD(xaV>3y6%zm&FhU4Xpc*lbk!D`@McV-vDS@U!lwfuj1u7xsxmjTwlZ z{h}bteK!c$rttY6afvdbPanC*lp>=%nLWp66E;@UmDWQ-lXt6O3 z-zC{xPTV5Nymn)T2l|&3e34Q$+w6;IUFi>!W;ZC+GFwPhje*1=PS!z%Us5c@Y3S+dbh6L0Byl?%pK8>*pT88__4 zeNnLGdPo2Rk4kyoRKbStG^GO01m!=f|61x?iXztvCN8-LLWWxw;*QV_9gZYd`6pgv zroT-}GewOg#jKnjXRNVO2SF`)`@Qc^pxWEwH&v2&RNjp_6uzIh?Jw01VY7_|GZxR- zn^a1aRRu;9eW{Y_zT1^+%Y11zwg_?0uI01U`5)*hE!i#7{uYS5j!G+)P_qxirI6Z_ zV6FDtjsQQThHjQYb{0-Wf>l~>Rl;+YknYIls9QaQ2E;bpT9Yn>^0##H7Z8$-PyR&R zo)5JYLg#Pdh*)V?Nm-6Dg%Lx({mrt&ZL3tBo;FuVp`$JRZ5a3wLjNw1;Br1DO7iH-}_N z5D0xJvW{x5laF;ew4c!ykj2uiS&t9%co6c-%#(|hD-g^*$yrI+`~+-MVSC2%ubQ4-0Rouo7t& z0ctoF#3XMLQi1!vmay~|Y&zFSDMbc*4etobbYOB0^B5M^VX@Xthl<1=H)$qOIdr>atq@si|cl>w8l66dd+n`B`NOqx2iK_PtT zDbd)Cf#L`iOy+e!H4+%o4My+o`D1C?V0!tu8A~NaS{d7@MjPhtC95Wg1w(LOLMk6n zk%_RAw}z{ND^~cQ5|)>_662r@2`Pl(&dTTnDUpE|C{X`1$yQ(}L%E}7ZJ9FVE)2~U zIfhB0uBA>@UT!(J?ok$D5B9u7n7d#G^V1KfA%Hs-UKaZ*SqPeOUMazn_W} z3PD<-jV{qP69LM|u4gSVRH=!HURC!u-^Oy|?Hrf5#o7w*A)X+q%QeTza(TbE)k&pc zL1|E-$VvyFNRs~69V8UpTJ{qDAUSN0KzP4rXbIe-0B@rmDv>q|h;wu47)c;rNPLqs zlpTkBzAk{YHum$ZsbFy@v}8)iV;H^A&3oEm=XUIBB_7=sZ@g~Crab^RECoB*&J&d| zDKhB-$v_BHjxWS|tpKM{-U`R%Nq2rM6#>jtVLuYd2i*up6%7K-6=IxnXP{Yb><1<^ z`=!@`s+9{FRJq>elYbI$j|KXC!p*5aq~kq-zex&{U;N7IPf}hJZ zzs0D!9-olb;kmke=+ZMs+Fr_i4j(a*HWYqBFI^i9=EOzwhVP1w)x;?vSme{`nG7wt zwMsZK$W2b}@-+n>Dl>@3+nY`wTuWjHSl_oXrMkEw)&gfuV+Co0oPw(!#_j6tpt3of zJ)qeF@nlS?;g&*~FI=o#ZUWS)10##I)LrL4Xub4F9?B3&!KYP zW(fRAvlF*fa{JrlepD*yN}*MiTDQ0>znT2A8yli5RV1Y#3c(e_aO}dQ5TurbVLyM& zmj9>6qhDcE@U6!Gi}3#2%Qv3}5XZhR-TxQ=|33+y!O8cXp7!yl_s>rAh8IxPBkk(n z+TbfqcqT5Fr(9aOCVL_P+$BXlp}EnKXsoPbKr!;EN}G{~`;a#=U&0%lY?Mc2q~rlH zk1ns-;YR5oLc<6_#BiZ)WPxNE*LUvgCDpf_$kMi&a-T!SCpswX{{`ycjh~BceZ^EFS9c z7%s~-!1r06FGcja2QZl2o)&O1pnqDff^8v6g9l4D-VV*^qH*`il`r?AA#$>!etzPg zAU?SFr(~AXEjOwCrF^Lq=KnQk28y`=M9jGyBZPKZ(l7^X$(U&L7|PnfOeLGn4P&bk zIvnDY`3kCL_(bKjp-^KKv5jVgnmuBPD%s{Qu-<46@o)Lu<$h{hKI5KDR{#hEpD=`k zaaRrSj)GyBOiDOM=VPb>ChiS7%x!EV3SDa(Ufhx9Z6x1Fp=R@!o7M`Ja4@C9z7z!k z1_6gAw>+tvqz2<@$t^TOsM)1nKoAbTaKT_o3ie~}+=Ncv|4$w)`0Gu5PV5A%{E7@^ zxL-)|%pGY9W&{D10RJiw2M%YgD_*D~vqgWUYME>{dI4DS{m5?IG)F+A@my^J{Xoy| z!0HNjwpp_sbHeI|d&fn$buf5%Hn?#RQiNgdN@({IPb1aS_~4KL{gFq1NxKy&D{_}f z&2K-iW|pPZa;wA&(I~$cAiMTQ9{K&p?=1xw_%gizTmG&Rk23?=NXNjFhS!S8KSqAAkK07%?KegG2Sw1x5apB*Fs;>1~mPo4vm2j+VV z^1LqaxI3DnRUMJ3oCL$;doRG+N2>IwF}71%q0 zyQ0gDF9l)gNTMYsuM$boOdsTa9mneRWn`+;5NaAIlra`e&;?F zZce2*@^s;mxRyIP0#+G)CmD4}lvc=&f+)hV268L}774YwwoZeB*#S3*v@E`ca=o0k zByu%MrkQUci|JTEMH%dL#!45VtMZ@t6KxFw0e10~jzo}liC2`Kq;kHyI{Bz;uf1q_ zAgWF&g6xU%T26s8SSi2)7saKDns$eBbsM}MK%9M12t%$wxfl*9Fr9lG%`r-I4rq1o zL4A>;*;JyB7MSp;*Qs)LYlWPl|08h=R~PWa3e&1A0Hlro49)zCVOmECR+MMOxg>2h zRjljO=^AokLk~Y3s)f=jj+zjE`PIl=fBwh6{F?vPPXeIo`S^?XufqEuR5KzV3jfpl zZ^DORVg4Ix|L=WJaa1Q0tO6YBt)^a89dVU0TqFlY;BJv@OGu}Pye zHRWovtxYW|)*W{u!|3FCoofM?VNh5u%Trq5jfA7x}fieT< z7oL|X|0E1CMV57FEHFK#m|4YWNy;Su96p%$-G6*Kzg8LhQRD>Q5>JBWBCDFby zuJ+DCh1Xdc>Vr^)ISqY?W8IvB*bI7&#M=iqVbc=eJc0(WgaU-S6-XgR{{eXuCaMrg z`h1y0^(`2}c51@Lt)0B4Wxqfs*@DCrhMW9RTF%z8J8#$X`IIzYEHvvKuhJ3N&pKv8 zQ5j`p<*VWg?HgtWtyPSRO26WugES_|Jf&7!AdB}EcHWeUC;&K2tCPyHI)X61lAtsr zt%{IbPM*l1qdzgt!2q={Bn?QE&jBCxi|tSD;LJ$$H$GE4+#y^?UM&n?c^Tg^URh3A zW5%S2()(aH_0szh#t5+*`wif?_LeFj`cQQA7H(DDY;l+`#_;pmFthvCln&SB*eG#n zHCT78o660KZuM*Umhd#B+obfn#}~p9Wr9$KHXKV`qpp*sDI4qIAkV2gvV>A_{4cK zT*`#*54gCiMC8SI7FDV@y;%5UzVCe=J%Z9$WU1G65B0P-T<+&=mS(_|9|;TB;p|#zJ1) zQ?|*7xJ#)oErm=YRXA7}@|)}#MDtc#E^1`iU-nH3y8Jixgxa0lowr`$M-Of@RXJD1 zNGv!{n6Jo7v%xx$(a9zZ&=MZWAOL8b<^bE_6$S$hvX?M}9p~ftq;k+MnTKo2&c@w2 z$vMwsjS<&TC#QMNZjC%w0gPPbqNa|`CSMOpUrh1ggG1Z-s8=C#fWigZ)`5_v^!FPK z0SEI_Lwu1MzVN~SaPZ`Ss9^U8s%!9nH-YQO(mMh5l@Fn_QM39+NjZ??1Yes5p$qYR zgU15o4~CQO%ABqnl>4QWZ>^?)hO~lFEJa{U;$+&P0(F&c^)o;;5AY9hjA|aHILd!n z7H?jpjK|wM5t1M|R0Y*nKt5E#^wa^sYh)qbQZ9H!CvXuEF%OsY@yyi<056+eq;7jZ zEgZ*4wPuTKIes490~i{RJC$c{6PE3;$B}zU-sNMB-NRLUR-vD1oTheIhd z_Eto6Sgxbo6N*2wDb3M&sa=8Uw%Mu8!F^IAmxSf&I|jz^gdoQ? z`2P8Zma>D~Ps3n=!$G|_ZS1X3N@_#FWk(_hsH_dx$Tk{oB_Q;(XzZK`1R1;QbM|(NK{RPuOM;$hy*xMDX9{R=3JoUPWd2aWXw13W-G zCJ9{iNK9ZIyugc(P^yKcO-$yKND8V`N)$>g0CpdCHv_thZ{BtKE?+L+{8womz6(04iRQRw4!`r4-@s3r z1=~Nqf67_jF2x7UYOq?+(!Yl;pyiWJ*~Ss#4p2&k66Ho0-AAN#lnLj^U(MIVM(;5~ zLZp5CR=tHJ(Zk4CkDyg$X#x6_Eb2FP`yIQIvr{SlD`=>AOm|U(CBuUdwIu^$ZUWfA zAQ$E~u-1pi@S>BHg8C1rz2sF(Lp)SE&TGvf8=J5>oL05cr`CguB!o|FW&$doTni2( z#(ijayu@jJccjsg`0T~Y)Vjwo6b)iG(pD04ZkTkq=o+H0DHuzYj?ur>@N#J;hTUo- zy!|QRP@XlVa^l*x1)%FI&vWGtY)+X@UH~w)H=gH^6%96yP_vIlo}kN>iOI-~U1G00 zTe-6`Y{b!HeW~UjR@#^0-oiSHQ}ovh^5%9jqc;a__^_wRY(>O&g}ca`o5Qrc78Q|Q zsV91M4gXI0YZlEVWV|RC3Lvf>R*PCnJ`Nn%J#_60LIst=xsMSMIQaGDh9bG(94X#O z3cg|bHdhe@Bnf&jX0)-;w-^MHq->E37`vjG9P*A5{^VZTWN`xv{VGsoGx#mQw&PM4 zVY*Eu6-~K3K`#KSVYxRzD)QK$Qnv(v*}Yhv0U3w;H&(FIrRuom0kdY0^T{oS^B#QO zXB9Na`q>%?%1RvDSET(^!5!^kDI@XSqquZ}Fq*UNta-db_)skcsLckYq=EDJc^s@! zI(E1-BE1yCORW9p9QRu)Pl`~!1dy&SXwfRl6>%vF@2!gnc~_2@G!&?As3ZnngGE-M z=D&xT6o=>#*Oqn%uEsM)>nFk{Hu|`bte_vH_=$Jci7-eU!D^M;+c^ekWo_>qyJGVJ zRz7jZrjypB(NK+d`b%tYp=$7XAaMI9?_Y!ugK5jr4>1q=DQEJQM!x(0M@bQ%%h%ro zIrtYCZnh_wAfDvpP}8?;4U&I9nvJL0WY`=3Ozk0GjxmwSUoa*=fOIn;rpiV4XO(;m zNy_^$KD*>=zg3!*$$$Z?v=H4W#V|K*E5ruq(Fn<6(q!^xb_$RA=uoP|fDs9XEf63^ zOL(F(2G`=gWXAbHr9|3xnS^^%eLM^gAyo#36@}K`LQ4pe+|D{bKDgLR4`#ckrf!5X zCmFEV)|@s?i$d@Y38DBLvhtM9EOlsgix4M`FkNI*xRem9)}KHj1Ry4nNsok25!^ne zI4EfHL&A*(+ey7hNc5ov?!N@ z6oY&$iC(_mM}XN96RfvHi&7sHb7IN152NiqfN)Pvv}@71cq z(k?Eum%Z_lgrCH^t6yA23}mm4nWIkL$mNAlMKpk&Qhc}CDQDA0G(5z(XVYtuyO)GVFiAGyrwhap0ov_w-PDo* zNf?}XV5+v+bFXTFT_8(9J*8&j&b?UxMruZRksQOh^LNwsz1&NeMxm2cG*t?4;~T$& z8el0Qb9~8n@ea>>W4B48gA~3lhvXn`;Ek%Mpq;LS|giB83n^a0p z6wXqpPZtB9Q#y@Tv5F6m6O!M%xGSt+@{wfN(elVO7+$MFIG&Hx2m1(6Xy)Xgl}ajp zxi@3CFKp*d+p`j%=57n0y@YpNbiGxi>#gI?9Tu<781-!>_>uB}t_v!S-l98}VV`BdHyy3Tbi zh`m+SX5CS_mv(OGG0Zd+zJ%c(a8`T6r8e-*+=`hCpsO=olvWjpuzU?J3c$(vY#T5E zgw&iAh9gkK3;pDDr6if)(4K`-c+?frlr@?w=G=Gy^%v;8rj6+sPV>$|kSzDQEUv?> z`yaP20v-WhTdqn~^%~luIc+JW6(Zkvrp0+t)e2LpKnZO}Di+Z8_V0kCw@Rly&UEZn z4?M{r7dR%uw=d@=bu6yo7N>LpcPNs3WtkkBJG*N&X2K(tBXT~{KG*)9ZdhDQr&s5j zoISv(VTIX2SaxmMzp0gy9S3f40l%^6qg@@E+WbRz9V4jDMBBGm)R<7Bv}{RL6e&N^ z0%7FTDiouz8ZSKw$h!vP4AnMDL|YAE-V@?_RpHO*Oo9dw*h5=eN*-&&8+mdBS1F+y z7+eeax}m((@}C4?>+vvRJU0KB=4Yq%{0LfGi}4+F8J!21799x|94|_`I^k_^#B_jo ziAvO>qg2y&uu(EtjsVV;Vh39qZmzZAlb8*pZhJNdhVvAi;!+q3>}o*o#D+#*9hWi@ za%77$j-+~#FboH5p6aItwiXO`Fn)EPQF&L*aAIn`)l+S*d~BeyVq1ZdFl<1c-5g-C z0{gE)rTOu*(4l0=lE!d$pGZ0BRL_@aqcmxRy){>xykqKSJtamG5vbsH;bLzb%!Zm9ex@h3AnCe*f_m z1z=5g=*REB`}qDhU%r0<9M+c~e|$F;yYIpv;=Au(fAihTH~%+<^IpU>>>Epj-Jk2; ztKW}GzbZedrdbPvFK)pbAL1I2K6G(;s|Izhk zyV6`&n%I3l#jdg&s&c#P0fcr{zlV)(?1_YB%m+`pZyY3>#b{V@#mdVs>op2Pi|*MX>RJR5=}|ukIq$E%yRE`h$QCAPs7;ofadB z%`R5dB~_ciDDGu{R?q{IYjtHv*F}Sk=vD_Nw*ydEYhyKcE3f#J$p$VS3Nmb@B3&7t zr&|pfRaT>!$+QVWm;f^HW4d-vdeWeHUWUz9?Y5iZh8DOG-; z<5D7WVmxj=dr$%?v~Aq`WYydsblzD)Mj3MliHnbOXR z6D~n=+a%CE@sETCDTLBV=W&ihr5si))jA?SpMQr9$orJ>bPWWP#6CXyvtZh8KY#n` z^#er2-@Sb#|9->j`J=aQ!t00fF}!|>^~(Eizf@bDxA*hsfAspR@K<{Hf|?os^>#rt;=3xEg(STv4oYn!$X>J8(-KXBRH~l9DLoNN*zFfx=FJ%0vQRM_{*TtKTN|r zoC(QC#0LN1!Q`@!Ln!z$hui>Vm; zWJYlg=XE2`xrP3y19E3TCtL(ELmfNF(Ze7zhiMe^j=a_J+~k9_4(>-&E#V#tk_U$# zAQmaf5SK-*PMj|Rfj+qipO_2~wy&D$JMHd5&*2ubUz4+~+8RzrCZm9DoqNWGu~T!= zwP9_Kc{yzX0S&IXg8?grq)QO)$^kYzRCiJ-IAZ*?sJD1}1!WOp(U>R>(0A>kv)Zny z9pwfo)}3#+48Dok$dZ6^*U(Ba574$%JW|=qRi+38mYJ8-qZpCO_!7ag$#=+kQin+Q z3|$mmq!t`Bl2*kSE^}1YG&tiWL1osiB9$qNh7(i=&YUuaOoFkK-AAJu6hV_W^S-5* z;=Qm#MX2OsY&$ECae!!;!Qs#6HuE@2*TX|JwV0zNQu5%KYy~@nA3WEWL#2BE&XPuZ z0*J1pv$Y8>Iz5m(r)`dY8g;e{(dlGj*-tL1lGcD;KW08@P=R8FU?lNdYXx3Xmc;aw zCAr@wLq#Yj`B?>0DH#^f=hE~gWeZpR(r;p;^N3E5hve=I0xuV&a%)bE8c{h}sP*xN zL+2DWb5#O9-uC~s(*>_xgbpgLBA|gEAV|Pg+MMQoaa1S$)!S$G(a3+lG7zv%fj)Tq z%3SHbriSTXC}3v+Y%5DQJlkA1zKqZp%gO8xXNqvnm&`*=1@>X1B7=APMhP*vPo<{G zE3^APV!lhvkvn6>QdT}pcK}sDo0FH%a-USlKwMazrm{%VUOJp0QBOi$3oW^+6b_~M zQ2Jn+iQco=H$iIsAz4ff9XzWhI9%GXyv@{1S>)$A40@Jo7#Kv3jsTl8p&J|ng9o}f z_;rd>R^8J>Yl7gIO0I+UPqfKlOtZHIbE0zzb~F&}PlO_brtv*Yy2Fkk(A01OwINRQ zX($SSIdal`Put4Dw%DWYa41WP4jkj8^RPRQ=>~;31>9h}N_JbD93D=jt~IcN+Wjqb z!jbsfLM7PYuR~bY9>C&GF6C2yZq<~6cF#Q~A3M4qzNWE5B2!Ht2@{t!Uc8v?0MfMl zl{ST-*v|nxvZ_aBq-i&;i>*Qi4qE&eHTm$f-5~feQ2%F4PiQ>EYM`-CAR$Cuvf0?k zv+jx8(&CM|Ytt8_KQ(tZ*l8f0&Yout&Dx%tIphsweo$Jd0{%Y`oJo~VO>)8;Rtl5c z(gTxZ?~)=)sR&$|q(OOMLBuq~+3atiiusi(xH&omGr~K>pc-Nt6zm(PdW(G{DX~D% zvwR3e0fUTQDNA_S;6QpY_{im$e9UVhd%RtC<-!YGZm|ro*Yk|AaBArv1g@q};Lbw} z9bBq>qq$J@M^1W}S1f9ykld76+UXV@j7NXqx}3Hx#p}iLdy@Ocv?Efys4y6XMF1?w zCXf zO`f3RBSnDa9m&VeRF(@J1yiTn3YuciSSwnt16i{?#j!?tJSTf)Aq)Iu9@E>AhzPtZ zN;C}Z9ZE*(nvg&Dzx`*L%>DfJH{tEi@MQS$+i$|RpM3XE(9X7tf0IHi-CY@WOR$5t zy#_b}geBRo*!h>@$&Fj3NwoQCRN>1Km>)#SIo4noYEgtC#~WhVu4jUdJAwf4+_ zq+}fs!eRoB#~1vRm4FN@NiFz0GRcq+EUHh5R8p#bWfqg?!a*gr?Kr?n#Uj2mid+Yv z(!JL<*&LO6I1*G$nc#6~0RBa_eDS^dnZ#XRt3SMP(S~Xd_by_z7{PzIYX2c0<`@sl z@W0T-z;tPM`#c}y+I2yVmgnM_v8e>ay?1>h_|w=?gg^gW1;u^J} zJ~VP)blV9^odK#O(gZ|0B!KShwCstB^dODYtcx3|(ZG_%fwH9^)a|P0HLyv;OsZeQ zu2k)_fci>&yf4;CPF=JDC zym=Ti;8ldVwET%@2E}r~Xdlo#G6N;0>2OP$4vl<(64A8)-H}|P3yu=|{@A$N)Bha) zj~op1RO?Uwrt8~J^Y|)%?hmg&^Up~^|MmrjTVK9?n*R;Qlhad;xXqqM0$h%d+H1*; zv?#*s;+i)=aV08l0HXiyniU(z;F(zc1NM2c7IMRUS}uVe(34KCQqPFK#CB`ty|wr# z$2u@O&dcUUema{JZ$3gDqky%>;_^>l&6hIv-wHava=R;c#;5v)9n1YZz46$tZ zd*qWkVhRrS5;qGHzleA$$sy_1X@cSkC^h!T;2NWye4V)kbZRTJxU_nw#?z7rUUs_( z43;oo<9H3Be+at+TF(T~Mu_%ACyqnvissJ4W#2Fd zmlo>Oz@=~Ff=th9H7}?qZYDS2I1pDXPvOoS)WSA{Xxj>|^H0N=Lp~LYEJ-|ep-P5qvo{VGE#MR>PmB*_zB_&? zA4z}`0*0uwu#r~dm39Ve|BzzM`H2mYNE0t_%*8-|a8as$Ru2oppAO^G60&0rG8fc= z*~z6yM1rc6L#jYq(sE)qnBOn&#?>E4KTI^tj zxHRtf9bxnWW1Z*-vv?llYDU&QMfA}5_xf(i zU;3zt^QpIQ-hT7;tB?;)-+mI_ehv$VkH7oTU;Z18C;9u|fBX9N!|-2t;%e9LT1@}{ zd;)ZrFM-j@_l2B&YW`RMCFoDic?osLT+Z*#wY{2&{@~yRPPLbIS?ozzlfaQlZ*+32u#4Ji3K{& zN4t5<%(uN z#YJpa99qeeNse<-l&nNGt8p0G1hu`+32dDdNgx;33X57g{Xme3IUCJa5BEZ)-& zsMH0ZFM!@#Az5kjFO?4Tn2{>ok@TjR4Z&n4KUFKWYzA(E>H^3y!hShqmmf~x%0VG` zuzF|*wQb)uPD-h*T;2m|3{#48nO-hFp31X~A62=F4PS2B3ANPZa| zmXWo!Fm-X10^Wa#O@;tjM`VqP!C`GS+XgLvnEVQPOrZ__!a|n+on^mGR-}C zrFDO{&QZn7tZ`eftl05_sc>W&}7qz#$eu z@45lir?I?t!D8SHOV#l_9j(}!DRn5zp=42${jVJ+B`BH*PY7VeR`TO(A} z0ME1G3KS&2svsYe3bqMg*#X%L^5&Hj)N|^ODIo084?xz0*x41aco;)-p%ie1x)Szi zweLzRl}@ok%novhfFKuL+H{6iuH2tvrFep#GQ&ift@#H|*uUiQ zr}X`NN?5B;&xjRDOcJprsTr`=fJ=|}2=&eiTOE2vH-Wp$6|V*JGJtIlho=1G*BJ_< z%`uLzJ=*MEQgmF$nCjy z(xj?qK&EB!u&A21+~zFWrr3lIv?SH)kvPt-0Emm)7i@F4%B{!RaE2~xZ(sv>)s<>{ zVG(;=pdm=F987z60SDAI=uoHCJZgP6CXLGZ>~^3Ur$;}g^A4)4*dFx?ffIk$58m=R zhTD}wm8Ce*NE-Y@s4zRb1yZ+wW9HX#c(h)OWF>Vha4eEuRK*(8Hu5&1vzYwYf?$R8 zFzqs1!+`_W4WI)mBfr`*3%~bR-j%HinBE=C8(+e0kXMt^it>IuRdQwTRJ&~V$ZA5~ zK-EGi73N#-`_3+^{gK4gj##gd8VRnT%a9(ZK6zw#D7b={V{Dwh3`A!&L;nP9>KbVt zT4P9?l;;6u5s4g49{Jjf*{D!1*@I}*Vyl}OW2fFA?^FgNqW~+;5BVcdOvNm^kPAeD z&<&m@uHjOgPq-%}X{X2ThdrOw4O=J1IjpPHuWn89c`X@0!yAFc8vuBA-1ihux`y*= zoTW=r@k`F!Flsf@9=dX?vCgX7*i*Cxmez7r`I1HuXl?iHz223e!3|@d;)AE{~m@dS3sLews_cUXJerrR02`XBOZuWGcrY;<#$`@VM6t;CPp%JiaCGD&OTH78XEO^GOr%*8;GE3TamgrTgV--`9f{_l^8VVV>W{Qa-B&`I8ZQ8P7 z=>w=Nv>|6=y;c0N7~0b?x{}l2hA4fi0f+A8098?0TKw#`>@_EUNB3gh6y17wuRAQi zA>$`GW+je6a?f}jvf*dV@f7mkN>MM6%JX3jPKNyzR0hsu^_w)6?m-=?olU+8fe~G5 z3lMZ12M(nfZXK}(T86!BQ`GZ8FGgN~!jcZWb)0(!*up5u5IAlKtzI^QcwvVs;eo!V z@&_9Z@G_|Fishpz3q@2u+d|$okk(XJs_t9bEqHD>;8Se$)LI*uAnKw6+*3kYwKinv zfPwC*UsMgsJ27!ZOD6NK=YpZC)E#mWK`m^z^aig$jm+~IC`S1RlB(9)faa34uCw!A z!;dGOwUVpQkjc;iC(H!|^=YVxS?{8e@)G|&Gz8&O7BA83%`WM>F!QD5w?`#pC zS35XIIE}1bpH%|9CIGhPy2^*j?M*Qsc6H+`nlEfnRfYE;RtnvC+LFfxGfmPHCnVL? zTP|t2&B{*I|NN?zR;0*R?LUUU{o$TfztX)>)|Ed#`pfSLA`|cM>Fcl6wgfrz!;tMs z^Jo6wV0rkd?_NHP3g!WbykRdkTB?J()?ohMbKwA!N1=W*?a(txJy5^RcGca7y#~M6 zm#~|8fYZ2jke*JQ7lN|jZ;wjgtfME+6>qw6bm}_*^H8!uO|_iNm~AH1teglHQaH7gY$~waaw64A{R`}%vN_D7vuA&UU%0xV|s>(osl%>F#(&%bO`1r3^^r^=Y7tT ziy>$jaM*Um=7gVsAbnXU@FQ z8$P^;sQ~rWvWa>EzcP#?@*&8#4G1(Ba4uZcacEOB*Q~Gmtjn5@Lrob-Qhaqfp&#Q zr%JdIupl9eB8jc`{J~-tR4rWruUYqQvcYTj?SFmy#8Mad4vB4Sqf0+&W_DB!q*{m- zz5y}=WlKq)L>X_+aYXZkSJ`F?t#vyiiSn`lF#ex zAUN|ZaEfwCppDy(M)ItJ*(LL>Y9u7lmpmS*d#v)T(u>Mw1Ck6s85<2NJ_yaVoyyBU zEF7InM1LB*FkPLbUajB`+3>W2puOw#!*-7+=QEm6GV{9uVWJL)TA`A(W2!D#T|&*J zf<0_uW+rPpzLR0|su8?-!WhEVs#2RL&{ky~C@)n4oKPVz!cu~Y&Lx!Z?W!(TADR?W zU$CLflzq%43wXU+NhGgmUxVdDwzIT?_68K~QST9%kbxJ;NN)Ct;8_46oTGnPeWDRz zc|aX>D2<1^b&GOA@5qNXYeE8aQB#r)^9SQDM>Suuas#5B7(pWO?b+*-!2a(iuV04m zeuQlGQFt?%mLI=^{WKtSxSb&G*u%u8iTUCsz!mSqmRn?a4*?z_J$YP8+$bB=RpTukMj z_do8QI1k4h0G-z9keH^30hW9_DqfuhVovd-*a}F{>$2?I8h7Iw&5wZSy9qJ`*eqkr z&c0VE|83+5cZ8P2aLOv*fDK>4@83;h|(rH&Py@|;6?YeUFpeiB;X!NP*b2C>)6T<@mq;!v`Pjq#tGAY+Eht#h%FW2v zO8dCzIj@0lA0Eg}-y+9?1YKmzF&+LTGY9h>Ao+>h@yusi}H~Sz_RXh2O9UQJ5yF zjACN1R=NiEp0xInimBptg9#&F!wRqzx_?*cEX6{H-YtRAU@!#WEURc9UCM=+py%AXEXDX7IDgYAploP;1Nc5s?O zxdrr39xx`D$gtD8>-^0U52gT;)+RfYm&}cpaFNU32)&MXqz(`nnT{}@pU4dLhESea zaD?1J)ensW_Fm!A?*!7FyoeLv8`90=2JYsLLI?o$-t0?5w7PlLO$YpxX4UC%oI=dF z-DE{Q{J&Hd*UfCQXY^_A!Zzzl?4iJE?!@}+zA&c}X3>WmWQG>XL9YxK25-a(t_M)Y zvGz(aaRf3**N!pzqzuw~jgK%q$Jh~4V#sy`DGb9Izg!NaNDW}mBRf7FUo4l`BDd{h zaKY=OBE_ScwO@BVkWuMiC$M1$#{GtN= z4>gUqpHPpX9Ia0R_437bQFWVzEbRnk63t}JE$&;H)w`k_@uKuf}4%09^V< zbT=2dQ(^nq722(EJJrG+`xu?__R8&Z3go(QU(NebF4O$5bl;?DmXV6Wam^Mv{Rsm6 zA=8C0#dr_?jn!0x&*t;;2!AZ8bp7J_yT1#6vq$ki%B#N1-Mk&Gd^vObH%4;5c>RVS z0}t|N55hVji|zcS*3PG|pNAdJ4IRpSjK+ximH+Max6mp38ZFXKS}DJ6ofYnqo*$2J zv(5)n2=a2ZOeZ$&dgz?o@`!F0b-sQ_422)Tpjt%U#BddZq!C*e7KjSVl9bVehT4*0 zv0{IL41uk(pef*YXzT=S2lcBUT!qM?Kq@Aj4G zg%G{%dXt~J&ZH_qn%IP>WWoVTEM((VMTv&ej`LVT6oDN^zDcpstz?W$0dT0hl*#h{1g)s$JLLrD#r(XItm zwn8NTH4gEV>cT~e2Qc`pL;{D2h%rySY)A%8q$*yE1Dkl0%rY*~tW z+NlQ6fFaPWg{Yy^_Mxi8l?kTsa3ga19yq2WwgoV7Kg*kb_Vg{$TFrJHKPO?(?3(9Y z`$aB=hKrOL^)NwgNv)AN1%q6OV{@itRqxrpGgg2U?cnWkg;)(>2i4kB0Bzmn%YgJU zsKf{~95wb~JBA9mXZ52__omQ1#$6UprEn^X>GCvl_!(5w~aOrkN4wU7w4^;+fsjarF5sFuUNXQj#Fb!# zZItYZv8q8DCP*pjo97%KpxjuI!Da<&J2pn!4C#XISOUn$VW1q%d1!YS(OGiFB`e;N zo^(cACe4GiG&ks0Qw=6{qv~IulA2z_=N|Z9_@>b|qk;#TUMZ()q!pb!Tfjgx1(d@q zcMydVq?L&Gla9gQMo<5q0GBf?SKLzvy5T-T0@@C&hMinn_9kz}TBdAkg?1iHhf4LM zn=tpf5;3Ht5Cv)5KuyXi`GenEVdrC+Gu&s0E8}XaEm9UbDNK+^8*n*c^jeo3A{ANq zpJ%9cDi^I;GWDcM(_oY@q(6n#lE?~!g)S|W_lF{+wO{~Rdk>5k&u#DVQ%M8DJRvV1 zhz11M)KzFwbKNn3B}_qQ<17A6_}}+D_{Z@23#Yd-#r=ZzJFh>rwD|U=Z+;X!Xq?q& znB{+8=;mny!NHqS^K*vGSOf{V14`?Qp6AbCca@KjY=FnRKm#j21}byhp%-jw`YrT_ zG0G?H6E$!?f^13Y84}pNb9VhqSm97@9Lt+t8X1VcxX;$2wyH073>La2JV-z?qvuG>@If&&JG0ZSoyui3RJEi=DMFsilG#Pea->}Rl|#nm za>{v8(thIJMXhcQ)0;85_&p9Q5>1tIQ#1Q52g*8jA13mun>FP#UadDAia?S$YjwC9qrF@iT0J@zHDAih?+#K_^m9j(u{)dQ>J)Ns*wZ6${IY;w0 z-20kAx7bOJyeOA%hp(%^bYT%TKO|57I1X1Qxx3jAOCu$hhFV6D`2&Sk&hK6Vc)2+t zu7oDFYoRD$`}5Tr`6xY#6=7A+-g>t{zRXfvo)p?Y5Q7fg*=QOa4M_HpO9$*d+Lifs zR){=zN9rT&VAtFFg1cn!xP42()vcfMrde)=%}^X1UJ*);1{Gftv2HU(6s(;}fEvP; zvp%WL2rO@mG#koVvSlB^s#QrTOQ%SWoDf}xMegQ^t!3(1KVS@q+uekQP&NW9%ml2k zs2vUw-aEL{%va?%*wucHQ|~vt$_;^xeq0-3Sa?y_MXa(crK5#Tk^t8hg0bA1RETT4 zUn}|>DvM6!2bRMQk&uD}QV%-ub2z@*J%l~`;U=$DJ80dgGm6%`F-u_p#s=uhu>C70 z_ooAP$G!)V6eB>1fDC|u^f_~;kY{ll?loFGy3nNQpu~oaAjg5oo7t)kfM@1A=Smg< zD@jsjGuw5%Zj#`n$+fv37^q$`#ZoeNfa$iMGHOOm(Z1-h6!-Q!cZrdn?t|BF!s|~k zi~AX~!WOZ6-q@r`?|pT>&N*QuN7R6X@|j6?f!hkS)g`8|3zNv81b;JgP^W2|8KHt` z01Tyy5J@G=bp?iN_U0`@XRS5%vGiw!^m!gymIxDrgOgh{KhaF;akA+_>U>5zG!Vj) z&Jiwzu_)Z^c|k?)+Cjiwo>enwauBJU@n->2#AH@gVK*ZHMwh8ZxAN6#0z8L;KXtg& z@(`qoySN;O81i<`p*}E30Yj=1GtK~0f!TrM5c7wpy0u(zLslPYj2*5_QotJ2bW|iE z^irP}rYiWbgO6+Z>JfZ!HYy~`Pzew*t=$oLz$SHeqI91Wh+&-?`z?8~rDf};8MCNI zKcBkGd=HEHh)KnUC0H+kehVDtbs5UZllNA*A}ka-=*fvxA?n(1l~%rr{LdLM_^Cq)l8p%|)JXpoD?fI?n(s2S-?fRWIYz$U5-B@1ysqNG!{ z?%=Lg(+L+f89`97+_1LUw$tU2yFSNc1CSHXbgI7$cU%-pk?u7C+=6<>%W!B}DvSyTHbNC|dGtO6rolPW`XA*v*A76NF4?D%=VNMB4@h3d z!Kub7<^VIxVdOXs+#wf{21m%95#;A1wGKv%k_f*W%d8GwmB!}*_8>P21#EA7;?`6e zL@K<=x_pTr2OiKmWM(vW0d6)n83y$`(&Gh@62Y#I&{mFO#6yEas<|(a_w6UaNDxF9tn!OXu zv4=TNwL~-M4(yf(=v)BURL#vc?ds4#Mf!ps9C=cLhJFLprE<+?H9kD)XgCMaM*?6- zJ|dCQMlMJ9F5Y(d8y_k?*t2U`r4~!jYhE_UFK?>gd><$vqR>a6jL| zd_yqbi3u5sR)hE* zx2%-UY%g$I6N}ZWZem?t7vi9|aDG@>F9FBZ>RhgdrvVmtx)Zr@BGz-G0WsX;BBGJ| z&0Lln7)NA!n*@F}D(AKx&fr!VZz_j}?QeUa)2JERut)?3G|v|zQOCa*)fZ<8te&R} zCt4R=wQ0wO!)Ez8fKzj?UBZ(Pe@OPl#j9&|aO^1QCl^|wU>HhxLiTtb&ewsd?_A$% z=+C)dkxII85;c%UpB)n{0=H6eYk+y^NGU&9N}iSyTVg}AGC22*N}-ix=REohQLMlb znA98$nu7WLt1dc6tkQjuOAq_a`g;K65&+}fOu9{n&{L^L2bcWlqogu z>?9t&8_$*ry73^b42vHEz^-ct;tCO8Nm)lLw=`0(K~O0`TVFxPyf_Om#aOW8PR+{I zjN>*`C{&p`A6~U_pA1i1s2c&Xx9Rd*#;NZ{3tpj>G%?=`<0toXpdO=7#+Hlm;0|I-n{;bANS9G{`L!g z4BvmighgLJqL9s>4rqe+sk&zV0^j{8$aj7QC+d&GxBuhqr>AGy;A#>JNh`hYs-D=0 zZF_o=vXE#!%(xsbZ8I`h!i_t^tWzg?x>9Euwp+lSZhwdaG#!iQSMsjNaqklEbeOqk zFwtpkN(Hgt;u(ozU!`s8!&zzz=M1f3*iOr$YJALS`o;r1ATc^yR0AcGRZt6EIjQ)h zG$-EB&JQUdsBDT~0jTtXr;gjv@n4HZBxyEa(>!xTI76pNr}&IV*}-zx<&b>Ug8o;# z91h|nlTy26B_J zXCT9_6J`P(nm!5}V8a}C-EBFK{etRqbRU8P!6${?_ns=&_Kjh8X>RMgGKEt`?Y0)Q z5$jceI`b{hnVXyezzj=z3N=rp^1v7SDj(&3QDm?_4D+FM&Q{7$O zQ3k2Y0VMh4{&bmMBZ1X=6iF~cMfEkgq+p>F9(LPYun)lcddmo=^WXv6q;AHrOXdVnCne(9)+k~ z-&o%4o5pkvgiL}S0ng6*l)~90iX=fifN6<4wz;q61DSW~+ol*bwk+@p06??^3*1m> z=xS4jhWn-_z|T+*dY92JQJWKUpjxwX4Qwz70KF7L2Y?M6oYw2gZMOZ$LivXR%0;Q2 zRe_JWMD5(%yb=XFZ`wjfqq}82b}_gMB%}dS;4~X8{MEvk$*S1NI!DnT)xg%+qjGC6 zlAQ*(z6@zS{oP-niNAjPAn<@6^Jm|G`$lp{#uNNceCX@fpM<~W$?sl&6Y_`r2y}Sf zva{v4|EK)i;k1GE8em^U{J}L->~oldKx>+gFlBAt%+|OD9Nm%v5L5l4-fdwmVRMYJ z^)cIcBCIy0Qt=EPUTubwsC4RX} zuE|zxq&-e`5$G~4{SSrP1_}G657wmGwVGD5 zQCmB15SFxfk4y!0)VDLb0MN8-!DnR>-Zv-zYm-s3UKqxZLzabr++ywHkX{N|U0L!A zfOsGUvmdbGsC}T89kF zKw!>lqC;v|USlj5&eA}(8P!C6}ZRH@7I801c|8pvl;^ifQMVKB9~ z6)psXwdwQJ9lFld#TH($cn84ERKl-WtA`qsE9$Og0)XZox+-}C!+2NL& z)u1r|g}#hsvo;UDN@;hC$J7HuJLxW*>wRv4U@1U<&F2Ujhk=J`!RiDY2snTXfS!@g zp3U7wMcjH$*U)zFq)v#yS`4mk;TE4y$woSjCln3{T1CXQc(d@mAtkCFjAkQTPNNhJ zJqJdJh-({Mu^NC@CazZb33nJyS@Q;dD#vjU>)&d6^0_X@WPsKMYyx=imJW?Ai|4f_=^e`04(2 zzkT~-u!G<4kACs?bx@q$pO0|ue|`I1c>M%ALm$3=f`8wBAN=Hl*AMbTmKG&{8d(%e zZlp<5e#cZowWE%+=7&_J7u!)jB6gdD;YrtCCGI9DQJAzrc+5y{atXHwY=MgZRFOKM z%D^JL4(Wnzk=>Kp8*%Cf!8^sRaHLnvb#;Ko$c?XRrG;CFqJF}C z4+TBVQZGYKDFnGro8DU%U>q5G~!(hXSsxq~3UchL`{XDX278m6cwG!ig7rS{uH zz@p8uFMzl@ZQGMnI_#6rDLgEm@>QB2oV#+Ao=jm`SH(Q ze}&=Y&tE@QlF?UhhQIst^>g?~d?t^7dQv^T_ror+N8H_N^JZwQ0&;OzQNlQ*ZNtlu z6A+|mylD$BmbLQc$xsEu%K(Ki7Sw2nrkd~Df`+9@7^B00VIG;{pq2plK4?y64}Dj-EgofkZMU~ zc?lflon0kR0v51W(f94DdN5Pp+PVBwtPL~q-l~DhMs+Lq3yKS>N9b7k&PoO1K(iVL zDd}8Z6vvxcVC00RfP4{a~-yRo?i`AW+w&nl^of$s9K#kfc~k zlR}~qLU=xD^8+%#mEItidQwn!nxN8SmhKmL1UR@LRu{zAJp;ItwWLCiVp8BQYA4z` z6FDgtmUDL1$;anT3Ur>_g|5X)%w~6GwzXFdP@1422cPIt0cw0g)qo+ZZH#V`fckz@ zvmYt2l3zQyPKSlZdQirxU6a+!fTZBT1ZJj)fwn6CGg6x_XuF}NBNv4Y0_CYmcl1Ev zL7ak`G8_he(+aD)8XF>eO{MP{InBGPr^|fBq)(?WiZ7EFK|e;Df)}gy>h3;L44al8 z_G1dw-;%dJKG3r*5x5NRb>L|}RFuGhZY$Jqr1(36^G1L2*OXU3D;Vp}w zZc@qYWAsf0#PjdiVl&(&X`4rN(1i+Sd`a)r9%>eLmB3;NQiyl5L#6VHdLgR_hHZho zZIJ><+CK?101O|rk+90~=njQ4mhCl3#Z4A0U`NQg7K6-ot z(a0r5l{uPEAht2XFAmiHP9ydLhYbu#;QxaS4hGeX@TK}i)OX&P?Zp(8l}O3@ykA4b zx22K06pBOyeSsOTg)J?cV~C>^@OXF9PR)j_w&amzwR^L^E4#@u4}fr2_$(Rx3sPE6 z`2Zls0(I6aw;9#|@ati0hKT<3A=WCnbC~1md?RUyHC^(F!dKSTh!^DKiGZieu;|>& z{`$*+V%|5L-o<<1Y{E+>+fTbtc$&MJh@K8sH6T7BHFmwHryOVJz#;ftYDCr_PArl?-=wCE4mFeO4J9j!_0ifL%Ml!mz9M&&5Qh; zr_I<^+h@(1+a-l-b=$YITMH@uAxD7mI2Q5T0-Xn9TQfvX3YBVgQYh?G33-<0uPXFo z1t)mxsxuV2*g66Y5gxXZjesN!uSm$PZB^*x7rPyZV`IQ1UUrP8ij7t6(T!xzJ|1^x?FjwT{}34 zyU*`6b?9Xms%B%YF|BqoO^^23PbbgulJD;Au z{U3nl{qx($Ihln=i9E){r6H1dIC)1cRV8#jDnlSod9c^#jy=O}{4` zR8c7aH2d%k$AD`|Eyh~2CB=C(4;bIBAV-X}(FQw+eRW+|-L$+j%yOEr zIvUbKTbdgC`({<|VY;b&jW?|YDW^1d<6@@9?M<(3@K`U@QvgCccOZnOtwpO~kkoCG zH)fQ8mP6(l^R0m}Y~1}cZ|i9=s;Ok&sE-POfL!w%mMRqc1gNcAnOUmPd76S^NjibI zN{qGqtcN242HLRQcx_8y0-qZSG9yeNAW6ft0`WYXl&wH1=0l9sW}2?mxJm1c3z)E$ zoa}+4868KYqcq*zG9}3E&`943kM5o529CF)GRWA}HN7cxDgWMp1L>MQ+ALE50%I)9 z;n@y%Ogk$}B2ORLHCfKO?wt&P?hOMIS_Y{hm22co1{P>=L4ni*X=H8ewEN#FR<|KM zx6>`06ZSB}9b>dGpRykj2l4W2vm64jmxhkPdny;=$T{5^&d|;Vkdo+fLAieb)&po> zpMe;EMoLku&{zI}^7Ta96|BxKkiwRKyLv&Yz~m<@_)y9XBAygJO!s;QJk(n{KoDRo z*hj?qcnIHXC<o5T}^F?q$VIF!Vggb>)c2#1yIF8F2JEQ29>7( zE}#nLM8FRUG#ywh%ZHJMovQL+-IZ!6ay%GSnNbzbIV$+8@PohCgSU@e69>`yHxvi> z4ebhkA?=5S=x=}i_R;I_!?!>G?ngwbef;*d>gQlpk`GYg!EMqrAP$U4 zic&3W(n*+PsN}Tr1=^#5&On&ynSi7{AhGdGkNVJ zGgtGqBR@2Htei(&O@s=-)U6=6cn12VA-day490=yfeQ(FR-?ta8L#dP2SxjVz{nF= z7h&Ept4+8yOR8)T>j|z)=>$gW@Dze`V6ol8 zn0*E;Eh$-*%Z)JP9Nloqkc<^6XIT_cz6G9CzY*UnsA{T)q#%VPe#!dMl zOSVt2<-X1gAtjn7^FnBADPnDSR%4p2S0h;T_7HaQ1PIp3Wgo2n$gHQTmVVlmMz6C0 zssR9259fC0J*f(_v_GwR5JeDAP8W$4_F7=Y7^~gsT#<5;e6HR?T(E~{WIaQy*bc!? zlIA1btcg=kY>ZqmDXbNEYz@u13gg8u#xrCZ22K)#SrMNRrKNf!#9LnDilin$D|`h9 z)`K&M!t$4$A=_7X@4NRkdgwuA|uR7(X{LMxzCaL)@~SVUjO zqP30VDHE>CcAYtNjVkgiHSfsmT2bB_=mzqJBV2gZBi1-d;9GHX1(a`3->?4|{%+5+ zUlBR}l@U~}hx!vBa^ILAYaSwo*WYBm(nsO&wXYv&-qqDpc>6tfP@lbi5#BzsQQ|&H z46l}z^@ksI?!JHu9;ALgXEUc=nPlYCxBpN0?w?=^E4MxE9cJlf^PTV_HS{p@l6xU6 z^^p_=M-^Rp*HxAfnD5ggJbFpCCFu_6+W;^#DpOFvmdz9Ak$cQl)9Z|H*~PO<7|-&w z#C$r%mc9+Z6R9G@=A=Y8_K7tEFI2vi>Oo?GY*3oGUhjFx0aI3X_<#-8&}21FS96 z=_QMaFZIIUJ`E)#e?qoJG9X?V#@!WSU(^97>HBps&;YhRh+W4O_bL&1OY(F)0y`Q3 zyE?(p86-=5q^Qw=OQVyNNL^5=foY!o-~vzS*4#4c^siIrSobYLS&r1`BBr>Uv}STq z2Nmv_b|>a8huwXmClUEQra$XwAtUWWxMrR9RUvFU*rC;$D4KAggF=$aV2f~AMSScA z$@}C8++v6Qam@J*5L=zPF~Qa8lJ!pS_Lo2+Pa0G!OzS4Z#|d-6#qwLZ8VvWkc9N*z zr`JNy(>Es9p#mwL75uf~u=JYn3c!5G+WgB}U!;m-TL#?#aPf5y>yLRZRQXmCn?iNV z^`SHnY9WJ@=Nj^t0aZ%=9_o({9%tmvFgemRE6ZQUI#PL%B4 zn^arE`oRvdu{U&EeXo@iFqM2@hA+Jex$ka#b(~e*&US1NRDh)}iWK{bGCT~;aJSh* z2{9z|51$k_Pq7`mL_BVltC^WjC|a_Ekh?TsIhU;GEyFnvqKb73+=EFTy4jKZ8S<0R zHa-U$eJhQ6!}xC6!eirYiHw%80F#T8?-ppZ;4&}vY67b`Txy!(K~8wi+c2!Y-3lgl zO5?I|-^?_)PtZ`uL8lO!dzR$XzaDeW2zQ2=2=Y>GFYw-5GWpQZabJJ`JbeFwJ;VJ* za+G~!@A(^MD|Io?yR^^qV?TcV5aIm^aT%8x-iGX|eZp2S(|(3^k+XMf2{!25S}#~D zgSYmY>4EA%elD!U)s<~xM~P{2g5}UMwCeA0r_tD2agd=#Sv>>TH4QkPkwT)fJT`3tu+C;paVrJU1NT#N?mr28}AyK zHn4!Oml>X}JzQtfOntY9lu6RqS$DK4d|V1!=b;Y1dFOcInz@)M~_ae-XZkAY#^y(TlWT;>!6M&)nD)`wt;<7 z&Jn;$r?cdWQT@YD_2J9ZI?j~RdUbvR){=j=6{83|?3z04MxPXFu6NsLoj6Ko;sA?r z+|>Dl&}oR+m69D;q+WrY-H5R3-$^Ur23+uNxcp;s=r3Bpma=j;K^nfmsTQEQ;u5k$UB=ssk zi_CJMj+AmQn|TA80M-B{S}}T^%G0v9pqSPaF4P)QB!$ygwIkwZ^iFEmGuP^{U6`fF zdBjOm-|k%&u`jG=bJJ-(^h=`*XE@wROe~$`$|5bQuspM=2?M?2q-w>a$drqsbe8oV zx)mvXXjndb{rvR{8Y#R3e%`Uq|3(Y)_3^>{RsZt(!RsG_e)xqx@&uWm_4spO;!-UJ zDcGfNb{k>9aDsIno*pFNb($WsGROwZ$jsX6am9P8z(=~%rK(cXcT5WnrTDV z1sDi^Ud9W$l0nzYtDpH!CN8?`L3bI3f6)84X`h0bC2 zS;2(JuPklret`aMrJE}y%wE)1(NZa-pq*@bg+sEmQSzVT%ylP6&9bY)w5=YxVlYHq za7??UL0~S7P>6sFIh@Di+=3Mk0ydX4n7T=dx2c}4aT$*e;piOcL7rZKj|W09%D?iH z7JxI`0E-aYF(i1kI07P@z$mN+YDi$mTW)+977(R8K?`UX-GE#&BxOmR9wBmtm#vA5gkjG8TBzOnTCk3IK{68DjkfZF+`6#n;%c!}5FpRH@B&KAdE9TbO6sj%Vo}(sl+6=rtbkW>FPwCg9iJ{l@P!NTz&&0Kwf80u=u(* z@{e!gtlBv_UawWH0>vgD3W0N}o($S1#b}*w^7*oHr33k7Xg8`2qVAa}6s?|5wmWKF z`A%Vz!{k;TKxk2ObU4cK3@!@|-5p8r4zN0-mhdrF-9xS`TGI|+gk8>AW%8C&f-p`( zxT_Vpmcy+SRPQitcu4}5y6*U~0^SFK_?z;Xi7@#D;*S(yhC!--)x`P_vlMJ&Q1U0& z)#j|c?qiu$PA#@z=M+1{B3ef7$S z``wR^kAB8DeAtcrHoSf5XRjZ>{W<)lj$8ixhp*p+w?F7a>Fv{Zb$NdB_H%W({%^1b z{co?o%Er|4E}ZMiBh%v=)bb>U-qo!W?;vy6C)9XOc7VL)WsMshe*#C2YlDRq*@7!- zl6BV)?WN>jox=mqH>lOSFpeTVr-pbnoju<{#Kb(cbo)1GZ(C?p5NO@|;$T77e?GXe zNsu^f`8n{yEJg}oyC`R@Qui%?doFRO%&TkWOUv+p1heae!os%Q*dEMOgNLjDLD@)M ztpeG=`N+W?7-VWIpa{z^#CuSRGyPA~_|GOD2@I6FL#=0UY}cVVhbP{#yTn;`sQvINB zmf{&G3*Wb^1MH3-({;No{Aw74t7M`@^9clb`%Nn8FU``#Nbf;8Yh3CM$uj5#Ja6nL zFp&<$ZkupM9Yq<_ceW4Oo|3MkJKzhk9jR4)v@?*!)^1CKQ3vb7`CuJ~IFGtx*Y}5-@bYKDkxVUN6O;I0f1{CzI_vPFlD@bB!XXr|HzZCUcY*GBxRU5fYd(1zv1<# zr*Ho+&o@7Q{lbQ#n>6gCK|H!XTuDxQq`KOhQdmV_Pme-+g!`Z_YKA>iqquyC7o7TQ z?e4ZCX~c)nYcD-yS$l!DY~Cs@_uv@+MS8EkLG4Tejt-vNk=X`vm#XbK+bycTNzSs* zo^kDdEZwimheEC!9gNM19#T6}t44=i*ktm&kgFG(Ha@VDICTV#&U$BB>Oi3v)VG|8 zs0#yYI+H#Mg^1+Pv)(|AU%oo6_T5?D>UG(&hQ=8*~K;%@LDXq z1Vis5O|ZdGM`=)`la)f-;AAbta*s6IQ2{HFYZ7SPE?l>#LA5q^jXJDR>Jk7o!lJQF z!A;#QS5R_D($eG)Z%I1?V{{?h%#hNnGK4sA>EUr&z>kbQiDVjJ%#?sy)1zj|J`1}B z=*8WoK+NJFqUmILhh>WfM1p-c_*sbH(p=;hoQ(ntWJU|{8MZ}|B<1}#V_B4$L1Vx4 zDB0gQKb|0+<@RvFw*E+4Xds}5lvC5KR(xd_uaT~xD$2CDRH#~X?i&@zi80vM>hdM8 z_3@pn>)=B}Ih<_2zDc8UNqsmk6NiJmAzi-{gF|bmD zvbH>>(G{!#k3X+>>qNPdI6r3B$@z%9CfzC zu-jQzt4;x0No6ZsjhuekhN;}SsUWT)r`fGn!cUri1Ui}7Ey+s=B#e-HY>$8wtjsfV z(ej?$F|$(xAq+Gd#kQ1R#~!Kf6|rMCd09w(2R_581c>Kz`(6hK6!H_TA3C%{Qixyc zW!A0-)50)!i>*@HA$1BqqD(ew?Nf0DP|>nu6==5w2^(GgsFsagPembrz0@Y_zF42V zXv8?{0c`@$t0Tia7^%Tm@xg&)V5oA!3)=babPwDOb#B_TWuMYs;1)V`zI z**lm3N`SB*9wh-62Wslq-g^BxeE$Jv~c>VneU2BTSsYf@*yNs(Dnt2 z`a`!N!s`x>yeRtA!cNN38Avq{*>awgJH%2cdX|FfgtJ^eHycpT#)F!(n6Bm5dr}R& z3hKD_&;;eVU57hj&<6(SjE*1K*_iIrJQmnp%^h*ElM1HE&3yK)5XPkN=MGxFQm7PN zl$rv;g>%yxxQ|8w?ST|6*-M%Th@e;hTuI9OLGrd63OoXOK#Ly}8b7JE-yI)f2jurm zRsG@YV#9SQ)yD60w;l* zet8)2cXp(7Zu75*z%sbVTj)*+c$a)CR~L+{q3zIho7~VVEK}>S5}430g(TJj5QU@Q zPEYz)1%%#ZsMrubOj=g%D!>D{e%Z>bq{i)xYSK{_5vMSgJ$Ubw_>;?(2H~MTxIjwP z5bkarbRA%-=*dCO^-s^9anYO4GG0uXf-NTSOQ|L4tyF!#m7tGeJwq+eUP7}3PflTi z3S2cIv#v{hUMeYaxyguUeOnq{6MN~cfvL4w@O4_9)h2QS)YQ%kh)O!2kyMN-xz=OkQ-!jnc_2bu{ z1Fz7+ceyKd+IsA> zS13BnF6jV;HU$z8M}TMtMN0N~>s;lXfDI>$8XX0rzT}NdyMb@Vs|`yu;1%{Sxk~jI z&YTNqa*{Rz&Z=k4Jc!7yw~%(@vl;rxMjn`@dv3M>mu~yYYjkXi{52pI`e>2UFl86n z(IY_K$%csFuTPRm&Pv~tR8n9KTW89(rJJDgnMaekB>flgo^r)W*9ZYp_I3({lX90x zHVER;4Se+%Te=8t(E&B66+SRxGJ+A8V-T``_p-N~FyEn|2xgG}QV!LcwUuokSwJ7L zWJ#}1>NY4u2I~=t)QR-s`+m9ewuT8o@%Il-54&K)d%zrd#p})p@^Wa^Kn0ff|IFP# zN-c}BVB?m^55PmeL;pk@ybLrt@+ED9(!Z~p;Z8b{)Z9{)N%X(7C2xW&CP)QpCqeTd-wc;-8Z##qCC{h;w!YUa;}<{_D_v z?P#A1=)#tCXfS)0KX+mcbsk=H5P6u3tMHPJ=a794WFeQ-I%DY0-TN7GEHyyVfY+k8 zYq{P^5JcUrS^&(@wLb?<@F%+LzIJj4$k#vXjoIuHOv+j^k_yQ|-heOxP;=}Z#O`W$ zo13!li+(gHo7NmWv>6;y$-}YFlQe!3zs_z}T~5SqhiNcBwnaGp!@M6bN!w)mc|z zg*x={a>k6(3Izof(r>%AS~6bUps3iu^`mLMB=l=N+jaU6|G*I=vcvDtCLNbjZ{LKs z4=`l>Z7?b-Da(BZk0b|42i!zBB*L8xuT|Vuk zp@u6%WpjRv1fdPEtH`OsOg6J?BF#yb4*U+J4Zb1>`}iVE5M5v`%kI=%JgLx<>L=vJ z27Sg58V3A?o$qDs^C6BxFK;=~X&}VXz8&)vY<}5ybSjRUBRg6Rc%i!bw3>y^UEMJB zR}kd1W5_An9VPc?wP7>H3;{~PR7+=nK%`Z0b?2+|-a3FvdlbwE0CaO;+8Of=SJ+uw zrN21=H9RS5-L3HYkwVQNHN#|KO3(TS7BfbF;5$kyS`idodqylVT zgAvNEB|XmSR*V7K?z1qW&|>Exx29SqIrLh>wwvX42_SEIWwbrnZAKwH1(>~!`@0hR zdjb|pm}*dlR+@Qmp`EC6kxH7Yeb6ddH{$lDx4cyAqqJpMV7YW*BQIx;NR2MvOcbF; z3)m~ntli{8;li3Xg$a`Nc#A-Jkd>nqwjW+7S#6Y()hCN(TiXE8=Z9FcXJlE=x>No< z__G;C0VoVDL@g0b%hO$Qfi~4my7NU>741g`P}ZP@bBrb)t^|i|vb@3RkPJdvq%Bc{ zY6_2b1gv7gL;X^TN~a3rjE*WA)dZ&@o5n)ysbeR?>mRkfqO2`~qq1u$P%bUJ1nb=v z3hoP_q?s{DO(qSNo`VkzuUcM68nE=Cs%m!F`fyY=sgr_Rd-oQ;~)8)35YZuCpDq7*YocB5u7>-WgR^(wd_9Zch96;olzwd%k-6ip#Fw5oF;so!{+Ww~JbTK-D@^ zxBdv?4<-}w;p+zhI(Mq-kcA+!6sj(EgKB$bV^w(*J4BpiV(^+=*cVB zyN22c)Ol(yw)#qinYTqU=vbVeMEAmo3@&wQ$BfA6;(T&BF3n^>A}3?a~cAbKS4vQPJPz}Eyo|U;p(q* zr%o?}^Fmdvz_uLuF>L&%?9$r%ehPLP%kbhT=~|5?T4pb~%c=SX2bkcde9%a+%c4V_ zU)zAIouqnOJPRFsf8e0TR%z7{5K>d>r9JA1%GCi#gciS=b1wrv?BkjSYGzEm(!R_t zE`$rL8anV5l&ybHlc)Gbw_KS-(8I|)oh7+#3BSm$v?fyND`PtpHpq_cHf%7&t>Fk^ zZ>eJSBKimWE{xoJ!ZhVf%DWR@%EGv=P-f$sB_E}jp-_VcRgmt9dBy6IG7i_>)%p}4qJBxc@$BlNayq!? ztgR)>PHoDW78i<|p-g*M0aki66&$9@wuXEF`jy?`!#Oaw_Y%K^EL;{|fM6_{NfIn< zM>Z4?Z}jP0PsPiuuwaK!&ZtqdSwjYL>r!jiWo1C2*r?hQEarihh9ChNxCX)c(~lst znvdsO1j*qkFSPoWSXRY;wSqpGZLF~R1)A5ss~9*I`(J*jBebs}CI_P-kVHS;)797e z-s+dfM?W~K(|!K>N3OAcy+8WvH#3y|;`L|yqo2I~I{c6c?+>pZLcZ>&ufI^$gtsph zarkPxFl4nSN z{or>`sq=QPPt2pR(2Omjm$iZGBmtV61y~;2q|iJfvK3OJNL%;(lQfOcUNf^UDa(ke z`Cxt!+aBMp&8RMMcdR}pg!ZCzmX|AOOc^94sD!=(rLrON~e`-$jzB`Cl~!j+;%#3lG<6WuWlqtrc-Qne#~Y>Ed;)5FVM zu!ispATU|`W1;jlm*Px#f-xQYgb_xlG;zV$k{S)8V%~dQX2_Lvft?b2E!K(>-e2gO zB`Ny`W2FI-c=-`ka46fgDEOR#LB{qAvELH$#+sp1JGHvS8VqDgZ@0R1i8}e`Dcb86 zRoG6tgdTcH_(@w+lBiR3lqX}!Y{x`Bt3ah?69CPCB7d<2-9M2Y6IHOAaTxcM+?_+! z{bkZ67Ny2yO(vc1AG(-;!Bm#iriaBY&@>Ko-1-45Og_}HW>jN3Cpw+$7U~v` zAFMk_{U3}jF6;0vuey`_>JUjpC_@WY%e z~KVA`>ybM++u`P!^a1kL> z)xk}RlCgETS-&_1YcV8SLoLHP&I@J%Ge`xvh^(s04Qu3}_V2&Bw_?h zJ41^|9lk*D90DRsg0<`(`R9iO!>d}5)=-8RX2bEXF!r@Qr?je)6+(Tm-5^9tN<+Yr z23F$I2XVzQt6cb(ClzWlX*Q;{S(@Rer9RZ_7@M*;nxINawGk;3O7`nhZg1XOeO5R= zyn)6}t)hnpbntxe3Ad@Ezq|5xiOAClfU;Oep1d>7410>ldB*= zdSKYS2PJboI3x|59Z9*~IA${JnDcHjO_pv@NSy0UxY#6mDm7+V;crC=zS@h6E5J>w_aTvSg{P#g;4VbY|u*WYsIpYNZ3Pc!R;B{$>tDLF;>fe$yu9=w6V?;F*gC z695_8t*K~rK1{9O@<1xq(j=RwC}Jjr-M)eh_HN?zdS8dmA2 zw9FeuXx-{^FiAs`wQdt&d6ur)E+}b1@=2@G{%MDYRr~x6UP)AmsFGR9Ke;lyfGlCa z4yd%BD)67nm1G^*K*+mJ%I#EfWe9@T9r%cyd8^vx?D-r$Np0d16X}+KNQa5;?O>(m zip)i>Z&FJ6r?TMbC3;_9s+g|r3Q8%jE&E_0*KtD$y$QMg*)T!_p4q21HhfVJps)vk z8<~yXm6?{F5x(G^Bqt>Jbvx-ba&^oH#w5&ML#H#_ewe&rFLZ{fCby2shTlp=#|XRC z#rGwu-%nzK>i-h}BDYp`QmPzhsB*VL^vHGXu^h4~U#z6znAo@|Ca1#0QR3uMB+1u} zwFkyq`z4dsSNYMOy?q|uK9i5(?YBrkpGoS;pZTxSJsP$Va$q(Ng?rm_ZE4&NXtJbt zn-kp!h?~}@JC^N>6V24}iLD!J4k<gbu1-2!->) z{5Z{98}d)JjoVt>pE<-QCl8Wi^Mv#-5JrNo(!nLGf z2Zc?Lan(khm%<9gZPN#cYGYz`%K6u&XP13vF5e+9VR0|)4AyjZ7{==<13yg;%CZ;b zYGCej&(7q`Ycr8?*bqEw`ennb#kBNRkbx|*DQQ<5@_{%rRj0^Gx9H9wVrt`AQ0gCc z1i9aV$PzpuTFy$YeDd(pJIA9-i_1zNQUoubJE?GY-}PH8F>jJ5W%!T*w{0$+4s$@L z&+Rf3kadYCMI~Y8Udh=3o)10t){m?pZyq4CB`W)cg2_;-tmn|mD{A6?SMZ4});CcX ze{wnTYHF~ro>cM=ihuIw`m+Kh-c>46Xe3WI3a(!Ky}n6c#bT;n=1x&ir48C^AaRS~ zVQWO^`l^JT{ACen;)_){*Y%Puq^`p}Vslr5Ua;6@Acyw4V_Yra?P-o5sU5?4ZBJL} z5o_gx)!Z@4u_fb(?iHz}p!J^w>9qEzONJ2S%nYc|lO^(5x84A)%uA+k<%iL=xl`f` zOfOS)O6Xt%d^l8a_5_`?Y?9!+OF%~ru~M$@t}($tXz5!8^Ea5e*r_x`<#knTb5$|c zm%t2Q?gZs^Bfo*pFg(b0gNnZ$N$SRg$uWo6vNVvWXr&7b9(y2qJ&XtE*aFOH7)W0T zM#;=xGiGGYY>x1P-LleTFt{5OXmp3x%_w!J!xV& zKuEo^F$r6c*Qya5}uYH&!9#gXm|e*{`Qd6I1>H!>(_?r z53k=4&Houu{F3B;`TB=Ic;mmke(L)1|NZp~RdP35k30c=0`GOH8<;#@?Iqft>{+0@ zghIkaA|KkjPf=F`RALGMO3RHwMT|6Ard$`(>sobW0uOCzk;P!BXbzGtG+$d8-C2gfn6{Cm5twNb<3G-W`fV|A?)~ z%c{)mysX@Lsp{+}O19tp0pc440we)~AV7c;1%gmSqw!y7j=AQTSsOflIS6uhX7#nI zGUs(%mTqgoGl#Xn6N`G}R4Qdeh;?!YhO-mq0>7|+w}f|BrCJl z9U40a9B~&#g0SA7q(FKJEj8BhT3*I|>mHkE@W=|9ek92q5~z1-RE*sVWX(On>6Q#h zVd}X*tZ1Jj$?V-8Gt&OWlG=(YHKXc@vuv6UH|Cwo&S8IsozA^rx*jB^PX^J>4!lHF z!f{)Yt>Y?3>HFhu>FpjQ?Amx?P-;-;WqGgdg=IN(F>I9-p6@%(9%_2bi!l6N9)y_8 z4X6h=@s6QoKrS+6+tdP{+28lHliDp6Wn^WX}bc00#5!1hj%Gz6pvSQ=Dq z*k;)=4#RxsxS)fk`e+#lawv=i?JUo8km~!9cZWZe%1x<8PJ>>ab)TKhD{tTWgLBPFuz@m1?SzJJ81&uRbGgk7a5{M&D z&_+aZ2OfDOcKh_3riuRb4cXHb(Gv&mv%OeIukev2vq`G zz_)|yudIk>m2sD=&*zqR7&2HAl`o<%Oo`X1^i7}?*t29ha6Xb<-MY-vU7i#H&&R+p zS&Y&QKCbWN_vNFX*na{4oZ08AH_JYMeAGVw9M*?65M;jjoity6pHoY);qU=Tq6jfZ zQ-g)Zle7)eYy~pl?ihQO-fU~jg^Bp1r0HGBoJ;Js%e`oWQ@(VVP(rvNKTv~ca#Mdp z=gq3El$j_>4|XenSh4L_r{x(^4%q)t)wS*mGz`ln;ekN2B1&1DUuSi;y>?(_&4X)o ztq8xm_}WYg4As_L%#N`S#hjoz-eWLkqeLuoBT`Y|@LvvVdRi6ITPtEo8?S+G?Fxz> znOw3RtDPZLyX)eq9qTK=d6N3fp`z%BUKBY`Dg9X$)+p1MS)%!{3bzX&SoY*5)!ns2 z7&H5xsfEL{g#Co8E!dD|gwUdU){c-yzjnSsgvuUC%N>eUh)EZ9Qj-dHBC5NIFda_J zFlHc*;EO>A4DGlX?>ds4mwbFf53O7O`u2nWCPFJJXOMjvc7zBB2t!^1xI;O=j=?G4K z7UzYS3P~Fy*GR$O?YLg&=G6Omh3_q_-sD7rCdt=zhaQ5MpSnEJ=egMOPGwzvVZ_+2>HL4bCkq&|VV$ zp+sxB>(N2!7}27?GkxG`A@>mRmeQCPTaoocR$3Iw!)0hH~gS5E{=-Z`97 zLw5j6P5wg_&WLY-gyqmllXMgsYuyHzn;F!Ix+QMCQ#zZb0lq`|x+*$FYXiSuA27t) zAK3g4)cJE&rJ5j*kA29M)Wf5nzx|2WkY8a0XcD)-c>5KgB>Ex$n-kWly8BYVv&jG< znC<7ph2bmj<^zx?IXTXhrSgEq!a2Np#VdBNIIZI0Wg%T(}D~N?0gGFnUhsp zcyok~^u>6N59Khlzuy}D2d?A+;4vKN#DGqhrhvznT7Ca=o@2)XES=bSM_3QVcxs~?x4BfEPoo?)%Q z)?>BcZ~=3lD-DQR(99j9$Y~3wXaa004XPy#6yyQ@{+{=6BnW;)*kw-fG9!f8)DAK!>F zfiKCi8+ZXGR_3#|<+L;$$YYhXBu}J$ik4W1h*NGWhS-D?_dUR}aMztxnECf>9;BRa ze`g2VV>4^f_UTEzW)1z+jbx=*vmo!DVv1+FLJyJsTkqs@U|P zf38;xhhTVOr;-oGW93Dia%}Om2j`c;H>86p` zHTSfWiOeNQ6Em7e^Lf`lZ=yjHs3P7;6vGabt5q$~l-X4H!m>j+L4`52oR6uPzFgQB z`I~G4wLf=RmyIEMk=*bIc7aUBuJbL(%vu=VImP@j;dvkBIQ#S0&%@iVvQ7Fwh1bs{ zthx+~#I2P)TFHFJMMvoA3WG`VWfy`@??6xKcHF`w9E^A?K!H^^na~5YF9>6P(RL{v zUhGJ_#hVKlY>B?VS>xMTvJ*qome-6{59I+9E3yP>i71 zyS(}Lc{R$nj-5YH02Fdi*@po#dKNH;;O>0|h)j_4eh}&Fk#}>{JCrwcfzDS(oMPbu zZZ6l4*u0Qhb(Pnu^_okf6NoO5hPu3y{>t1W7D$=t#?y_7)a9+FQc{?Qq>%GN4JC>( zvC%-iW0Q*?*2EE2cdm~8^rZzO`8l6wb*3dcQkFL@Q>5Wb5->4B+FCVZc7xge!7O9M*izm;Nm+AboF0O&M;0LV;5h@W zH;=P}Ljx++fYD`k{y?5!56Ll``0N}z^=e*|4;49Zc}gm(yF@kF${|>)NDGV|WE+h@ zgOy2rTK%Fe^{E{|0=KSK=^yf`Fd9;j+R8A7@r?~5+wO_CK?ZAkk5C!>vQZDN(I@3t zM{L~3T_X%vAyW+vGc9v-6n)-6lbP|1C{$j^e0Gv+TKlF*(UV=;i_eN?R43f9Ggyz0;+ISF*&Q_5_RzYptq z)mY_BW`a#EO6<3A-Z`YF zD8hID>-&GmLFhk+zxt~j)^ol63+~vzJs>o5TkI`!3=fiZcQsYDix24Q zn<@waw6!=mch{}h)Sr4m(7;*V^XJ_##+49?EHW1_NE_-wkLjpuz($pvcX(L5l?aKb$*Z)R@J_g#}#YWK;+F} z0Ifut+7C;eHASfIM0JmK4~eQBA7KQQ?QvG!UfQ9~y}9`BdAPu-LAv9mWe!+ksxxb-O+o;Wu+?HdW6u=E(2mmtV&bJ9e&>ctq8q^j( zhtEdo(j*kaL7^yH{@+`ZTi&Z^-mw%1%nhv;01H@m zWm;7M^}jAnAVa5ezMYTN=1y{;dRtKJ9Pm*KzUWyh|1O)gRRS7hS?bjl|$y>=YSh_e(?I{*;K()Zt9ll^!Le4$< zGC`gP-&~dVn-pse1bj|a67ZftR)X7?L9T%-Qw#bVcQs8+c9~zH9g-is!kkH3PXnl7 z#gzBDaSVsesG0-PHYgdW_y7V877SJX+PZ60=}>O^x(hFzqN54$RT9#9@4{fQicod{ z5SqDbfk;M${h!(oQ9WO(C^$)(I^O_9mdel3F$>~-Qg=b3%h1*UHh6ad$RG9Xq|yuQ zE#$_Kze0z}lB}&Mu5`0t?`bJvPOo>Kk(#ZsR%PUQ3Q2d%PgxHiuCmZC>*d0YoMk~T z)DoJMPuxYyeaw+@ag#O%kg*+%t<4xol1>Yi@t4c>g58xBC&v6(V-|`a;|U%mm@%33 zE$*7jkA9RnN)MExuiw7?!CvDLAuR_F2MsXz6w~ z2q^=>TyJ|Cuo(3j`*a;@$nPl)!ldiei4{Bd?!A4cbVYqzTt*ez(6q2_Wh}CuSGc;O zGX_!6Tsp~LW0H&G`Ai`4zj>AyyQA9gi0T$I>TcrnU@Wiz^68blyX5=mjjg+P++oZo zK=NHw*R#+CAOn@eDWE$P>1z*6!5s&C1a4E3I3?P8&?QQBsTdHo77{2W-@V&USqNoU z>V2mkt0s~jI>R<2bG&$}h>MmHB)O`XBv-=9h^^B_oBTumLR)EFf!lP4y#;HWG7Yt< z1P$oa+*2F{sx7R$1}p?z5679F@aCoMS%k!*-{vD~5iAc@^uLr69TjD(5SJBK*`uY-3p*U#Vn6$*2| zg^PuDJ?xQk=X8X9%h%~$8kfr*%!ub^x5-xrA%lIceZ;CF4Sp5fwd9?NOn$nh+C5D$ z9)*LI&dZvPD+aXb`K^Mi10W;oST)wHVvcBa`}Pb7WL#%@ngY8F#p{(5H0aj?8ke^Z z>&Xa3DBm6omz9;e1Tspc?npCLARv}NFT7iD$YBh91O<-pP)lwgrsCJrC>)UFg+rIM2puy@ zW9rXK1Yl~zE<)Q?e85EX)FYjqLhHxSqG`B+Rv=4a z8c=S$Z6Xe!HsWy^^1cMSdzGi-;C29E; zu&IM%H<(akiL`(z8ufn~q^?sQd<%(=+({MTLMC%sa){0cz5?GeM%_$UhP!4wmV79f zgSA1FgyS|hv1vkOVA6O+o8stQ`1zdrs`Y^ewv43C6tL_-DNMmr%=9pO&@J{&yN;eP zCP*QGWOXqbCJG^2Ypb?~vt<+nE+IU!MSwuYkr~M9@_fn6AtgTBq-=T=FOil7Lrdlv zaA-Jt(ve(u<*_^)oyHXv-bv2ntE>v-@?YD-mspKVCXb`zGVdqTHppLQ9! zQfU{Ga8&ullhhW-hAVM@5#<6}W}SFkt3JE^e5}{YM7thorslwu3k1*Tl6C{+;NIVB z|3#L0U}%2%_T{6Q>+9zxRtJ351UJ*6NfcYVV<0`9Ru}5|XVRlkVz&txK-$-?I&Voh zN?8ED<>_wD3K)_NLwBldk45hu07XE$zZZ+D>-k1{z;Kh46|7KTe&AnR979@0=mc%t zk8RS^*`nhGhU(rht}nbOv8QgGF}GqN;;^Mv-D491yH@QTX(FnY%`m67Nknhs`{nA? z0vnWUR^kZwb>{*E`WjNShg?LAtSc9`RZ+5?dOlOcaIbjjSiwO*QZ6f-JFRR)Ro1lN z=m|~yKCQ*JFDIczu^5!0Tdnxa=|Qq5BYkQCXJML^8ox4y((E~UaW{u4-cUL1gB##! zHJW31)NvB2To42p!S!gC%P>hoEIL}%LH_BYj1~3p9f|mW-j|UX!Kx`pY*ej0((x7V z%Hs(1C)gAhh;*Du-x`BAwq;%{0)*~p$a)Eb8&_PrTZwjEwRXbi*$f*v$20^MCPf9m)+dIlcLx6-RS zTs;C-NHt7M73Rwa*DS@lyZ#KqLU843$$QdG&@BQOw$o`7gCj0NAmYKu?juG3pc-D; zWveAmK9*N~*V_G%R{r6-W3iUv zzlI-YHPQbR{+oXMtMDHze*fnCpN7|uO@_@;NFTiYHslZak$=K0>1Q@a0x4#)jp}ol zHrw^K1_wm zUUw?XD9qhLHZDx9%5@s2^>L&|j5~zaAR)M_Gw)NelH3e6 zHQf>bDctTT-Xzf0fH5Ha>Q#z^Y`4I*wmf0#zs#_0yINRL?;fdIC@3%kh=iT>NrNvy zd^=Erw}7@9O)izl04(2$^D)Oj@RbvMPyKf+k-7T-hn zAYvJy7BB9)Z}#Usso?LFi*esaW3Y_-OL4BCD73{(=m;9xXXul(Q=6^~)Y%{b2L!CD zLQe~yXdL1QUt^^Q!VCnC@=3-B8&nmgX6L3AP?J#KoXFFr^NsNplZ%>!iE9!1ez%|= zVA|}432{>WWD^99;GXGWRPrAuXSFXnfHCU8zC#2%6(npfgm?M8F*X12X5=K~m@a<71jORZszuAbR2$!}BSDeYHpeQEuy%=X~ zucpK`L2$elg7_1_NC$pXlszv^?!pPjOu55g+H3$MSws14p%;k)0wefIXjcfWo6mWWo#6yfbxOckFfi4V$U zABFrZ0aPV^)xl?I4zNR$9C9V(6!tur0N4mgGDj^J#txYQOD=eQ3ey#bgcx}|)_&hZ zRa;uPslJxA37CfDU#lHMx%mbig?32|%Zz9}Nu(-LB(=$Mwh+ea!EOP7)F$-=;hK-Z zp$AVYfmYnHyRdHtn2EC`KykRc+X|_j;>DKz0ErF{O0+sklEku)JAn~v9%HiZ*A@i3 z^1?HTs{NgAS}Pw6k((1mdXez~)|MF*TP{?eA1W@dsMu(rHzcsK>~|7CyWB$IFa@dR zr4PmqL=Ds>8W~n~*+&O^z~W%zfNBCLGXnv10Az`?yIuoi3oMN`z`6P6egap~p|yx{ zD_Dz2EUCAs0^YK{U+<)L$1rfT;ebv7U@>Xsg?xTJaf{jpB^ON0(xxObN}*>^G~i`c zgBZ^3Aw6_)YMe^{M!{t1lPD$(t7d}Ha1A90DPSNWAzKX-<>Ms*RAx^#Wr-mZ83O4Z z4i%7SX9ERxm3+hGg}k&gq`3ePuoCb(CjIH7%|Y5jof?XOH(64N3p=MPbq>Au8@6)g@!vrV`tx|+;Yh!$b#<) zwQe`TeW<%(Ai{Z>g!nXE^s3qPlaZe&s!ID-3Z%Vf(xF_YhI*I9!d8-K*(49(7w$)C;`@%^j9AmRN@QLZg>g>Vw29Arng?dwdTUx1VNe{dPkAhfry zR0;I;S6K=4pOHfUXnVRNHRyY}X{ptzc+M;XdrbYc%`@W;QW(!&8%I_3O-U>)Nb?&u^9un@Y2=9c){=PqCXTm8%$y6K-Ca2X zSmGS$BhhfcvP7uodtTd2VGRzJ;OIWtWiBt&K#x0hpjeA@f(H`g;bpKqa0NnON$kFW zQIq@jGD9xN4UL9Ee^Aa`mF_vzM%LnYTF{{==AKNGqgV#eRg)A0`4M;#b<{?fc8EL6 z8+IdDKp|(gB{1Ellbnf}2^sohL6r5aGZA$XYos#T)b|T^Mr-!D;06?Kn96lbZkD5>1s;UQZYYO|#_2uM|B1vSF1No)91UWXbL*P{8 zNxptU5`U5xj2KU8BBal43&OR5tGqm^vXDALksAu`97cy!XX}+=UZhd)fb3B6?X4%msH&rOoE;`3Q5!0x!+^1-tN-T{B zYVspsu%9U<?RWZDYHnz4UdSMsEFrFZl8Nx{qIT`}#3Z z+b@o0w?0uKPVT{v=kL8^xW9yM%tgi8q zQ#`^cIl8@2LsHFVQ;xn3@6J&pp#)HS>ZqS0$){)E^R(x=v8p`BrQ+&XqH-%uOSjzMt;vxh?zEYQ$pQe}2;3Z{szyqi7^knGuUe9+ z)!J(z+8MJQ3E(3ZmL+6)F4fFpNMbhlvo6&M3j%AMI!GhZL!;_KB9{!U2xdU?3b_ch z>u$E0T(o&tRdk{E71WBw|CZANhSQZN1>Zzf@XJ+QGY{h?Yi8{ea*mfONDB))sR))e z8Jd#yF}|Vbv(D2?x;^-N1t*7+7z3%mCN99$4Ogxh@b3?&@u=`MrvhM)GzN^6hU5q? zG6pW}cEkM61;D|1H;R0DGbR$Fi1e)pTVKiFdH1ygIp*lZ;LjH?PC=D>7xq3b554MCKoZWPHHo}V?Aowq8xyAV95G;Mz?%jv z3w3mDK!<%~V=u~v-YGp(p@c4%i=t}j(YpHx0XlcpX z5NbKBlk4-~{0+lU;*CZGag83p#yuzt4%h)oM%y&R45?o+OJjDsF}EmZ-=>(VI(GW* zDKmr}j&YZJAaPaynNng47(gvWgJ8j@SPeLL*lVNsMT1uL5$iSpGSJ42T-KoVQC4qp z5&)le)I7>+dV;BE6%vPlU=Y$yvg?r=HaLY3j)Up0B(--n079HhfiOVW1*$sd@T~1a z-kj$n-27Ygy~@RBvyVz{u@egQHE=CODU#9Ki+!i5Nu!sv<)9QLmXJfef%XHg=~c}q zB@MdW_#BQ)e2~no535CB+5{i#M~90VK#{fBkq%2xeN^p&*1vM?Z%S?>`zK;V7*z|v z%>6Je8x@q#aifHLDha^q2?lF+8al{Z6D+KjE}lN?z}Vp5xKb@oHpL zfGj*{lY@O=xzyQf{=rGKlqlEPcp4T6QXAf)rYqO%lZ4gxOjrYC$Fan7mo;6&O>AUZ zwQ)nD!jz=IhG~hAga#9D4N80_XLUmJ7$ak%TJ#WLH-K-xr6yv~uL%xZci+drhbvI{ z_`J9OTgdWee-r-h%x}L7Z|IHQ{{8Lu;q4Ppcqn9j$Pd}4%QF^`#c;VFkhz?g&lFxd z>{guIJLtMGt*Ich_pB;vkY7Xf0I%aH2WjC96!9WT$~$@D`-&D=&F3wN;kwF)fL*wP zrrZj9uTwwl>?J2XEX<1fCP@r}mfJN;ODql0sy|Aj`T` zIfoYL$x$Y-8dpuFcsprTVM9T01SukW$u#fYIZ6T$yK$$EnRLyglS^Tnk#ol$Qm} zv{Y_p8@eDzm!Pd$8iKU6Q{m^%v1YS6c_1NJ{G0Jd1@4~HstCD!j5=IW6;>@d6CDr( znxw!nF=*qG(r9Mf2iU!nTR(0$6=AxJ%c>S80D2zWP+`u#N={19qL|E0p?i+#PZr4_ zg9}$+3bqafoLE*Du7PW6dl|DQ(@M~W{LCg@_eQj@2%-6y6(BdS;Ac9iS%_oP6kyL5)#>)I%@E z4OM1HIQU@Po-a&t}K}_B#0YD}73E@UJJabTm?G@TrfJKjZa(#fo#_gL!{IP&$GT}f6 zRB~BCyNI(a$pE*jbuXAY$a}e37J$Fo5q2W3k5Tb}J55p#%$CsvxwPH7mwA-xa>@`v zygOEW)mkDA1ZQ6#8A{-?1&UqD6Ig7%pb9rm|5Uxa({{DNEnvwYP3NR<0pc}G1YgU2 zQ+3Q;s*OGm>F`kwD7VV@e2Jh>O%6i97Iy83exAEr&F2&RC3yyD!F%GqDM<&=6f+tL z`Ac0}5vut4AZ9-tYbs(1D@)rtPe6!3^#7)0bxLS95QEGN{%%sJK)_hdLiNPv7KZ6} z)U`m-+Z_&)f3d2gHG_zai`Os!CssG{e==VH6c#YbHReC zDrZe{R+yxJ!Xmj^c4p62aCi#Ibh*#9qVd~7k6zDjogo4!*pMiBh1HS}QE%YH$`YV!kzWXe^{mWmf-@N_d z?HlHle?Mn$|B@g3-{Cdm4`G*PHOc`QQ@5zW-1iRat9vXT(uxke(y2XJ)1&bouEPbG zp5V-%=q8&tX|Z>gP1{X?ZhMBy1bK3s>TB?%&0Cs#8g9Nn8P!dN;4C?Z5Kj*2cWS?_ z`;s*;*>WiBQwoxLuUvEvMQt`{#Nq`jE_)p2*b#=@&&WEE(I8F$>SC6F`hDsj1q-?| z>%1r8=vt`pNR<&+ju=)Q=VPV@JzgsGqFGVIyq#$soKwq@d=LjM0acxaOeIi6mbjwo zis6Z38n&Mb5O@a9Fmtrt0p0@nNM~YUJs#n5^A12l0isfgw%exOb1Q{qL*oFbiyIfIyz^7sZ7r)a{0T5f>PZQAy{eb2406@Qc_CrWk40&VPkpvUL>?3#?B$v8# z@d#*k;S!sY<@BA-`f_YMmayx;ql;FK1#pfhhJArppS;%7(zyxgB3&HoPN@YCb{o6; zt?{f3zSvijigR4HK?N}`lA|I!OGK|#w>MjBZ*s2^Zgx1rn8=_wPb%z9LfDfuASHh* z#4=%=O8+(oc|pe@K=cEM_pJRO^`n)g(j|=src>+b2kSMtFu@F16bCO|S)PVjCTI&d zH64oAsz{Iu#x0j5_YNDTBTTz{w{?Sa?g0XgbYi$d1hFHWU0$FkiekzoSk$g^CV%+J z;Q?AI#2M;06+0RA6q-}#{$jo1 z98zQDR}IsuDuE-aYj77Y4pb<AEiNL4XD{lQXl3TvQRCuQf+YzWbow-wEH564#kTE13CbmIC zA%CgE1YB$s0}j-vr*%#?x^{PpcRK`h=3QQyo;gN(P-*G0t4 zP>E;PqM68-oxCr33Z0phbbyY^mv=fFfC(su5f{ueGpNh9+w#mM1ptfOPbPo>?_C>^ zHNZP-C6!OnH&=EaHtjwDQr!mSS*e9sDI~D6a`c-U~QV%PZuFgl-~Au#UhSu`E^VP`N-lccU&8DUWi{)tZ4n zr@l}HlOtvn?WrUgf$#eA;?!4_lbGERZ68-(SVJKvY-@XG^PAz_&~}>nfKnxiKVWXI zR9pX2!geO(Z6!hJT9-{$33N=Ok_9?*EW>Oa3Vh8jl270zg9PnLpWUefx@ZG66>crf z{GxJdQi2fgS&X1JbgU+U*j%Y9TEj%<^8bXt|NG02P5k*!1Y7_7^&`+*fByR6TNW&M z2}_P&hq{;NEOQ5#IF?=GORalHf^TNAmc)Nxb@CuKAqic|T1B=by8PaODfdN+e5WNL zu$e9p!RJJK13?N%>yvXdg%b%N7YXQNQdw;TPHtIn&OyrBwY9P027Q}(h(*;+;X5!x(BBT#A@zoa>9@^t}wnVSV`+2k;$U zB$t`tb0t5g2`*AOg3^#=Q@RJvf1zNeBt!%nx12XW5LBoG-;f3KBSvzO7F+Tg zJI3cqfsdVZV%S8`(WwGt)O32(B`QRhSl6KKg8E5q#~GYMS%GhJU%hmwRCCRv?%GlC za)$4aB0ag(m|UW4F%ij9Qnn&GN-%EkZa=BO@e(@kWV;3uhVpr#J{H`K6$+TQ4TVJh z)}rw;DZzijo*ep{lw>f@O&@5js*W1C$JkJ)g6HbGa)nA@<-=~tuEK|(V&bAA0QLq* z)dV#?7|~bUn>2Dy=Ft9V!t$34n}2!zNsn3|7m{o z7jKd}z5daeGAg8e$Y|a@4(pk7(vFIn^nVDI*>R?^}LBl9IRD5>1e3|Vk3pLB!~ zscW~(>$I*%j~PfAPK|Bw2hWXtyakfpr83cAyLFCEU(tB&nxqos8=zze7aCK>iRuMC zc=MrgPco7{P&T;usLUbH4tH7pUGI#nHQ$LXoKuJ2W~OE;CswFmfi&ULb8IQQIhmIW zczl%NG+!5xPxx}995i&!1dGZcOi3r&`Jqm?HuBZ>*G#9==Y%HB>0dyrCh%igmr@-o zdGVIHWkQm~{^XM_oe*R}wa%dg&}v`~N=Z{mDF%cg*gvC6S zG31JBw$Z!lZ=V2u=B_(>PinyT|+_yp|4E0CJH$qmxL zFKt!UnIbTf29ncJI&8gOd1r=0_|AEfIZ+<9z@E0HRcm4C*N8$CC*)`^8Z@-lPe;o9{9?-9PN$wtUsNhU! zj>-Lkq=#tiZbpGIMsC${CDr?Em(M^t0s`;|PspOh&Ri0sfkKcNUoO%-8&PqT7l`550_zgYtz{~nXn3fg zC+Tk_0JCf#cU6)mb`__sOBOFpr*c&50~-a!Q(#EOOW_l;@${6D8wR3??kyQZI@br+ z9hh(np^Lk>bV}Ik^;!0$qX5G{TeJTJbS%lePlZ%~b$C)4j@dZ9fsq}|<}ENzKvezuflj|zuZ?3VE_-`hA%H_3|Fx619!sE( zik0Xqc~Jox2S5@n7||2tBSbH^u&$>{c@JLj#}VqRR0*wz=}3*UY8_UG3>=QyeIYxyk%9#Yl6 z^z1n?aor`aP%89}YZCwDfY~j{<+X1eG@2wO-*g#B4avB<3fv77PK&ftbvjP&*nbq~ z%ng7c+vx1ICq}3^y6_lK2%O9u7MD8$ zZ60Os%th)9AT$Ou5BnFK)u+>8l@CL_?#tA<>$l|H9Ygp=t9c95cO|niYS&6I29d%| zCnY8izJVTxlF4v9mGq!456$2-swGzuw5WG$M1>&wk1G}}!cJ}=E{}(cWQd)Qa^zCf z(SV(e!PSWI4sjyb18(X@Tfr>`Ov zVA}+ukvp~#Yx5s8kb023hwAy9k9X?Spq7T*qd*9Fh9k+eDnp7_ zGoYm1mr`QQc@vaUB*g}$HtdYy$yFt^o^0w$sf}7z z(%VT4L}bj@K>-&)7x2LN9k(FxQFgna7{F*B7Gka_IV$yCp89imV0RWhu7V9IWi5OR zbGGB~vgGXGZ^BH`R>=Rp9E&7 z58gfvZ-2_kN&@sptdUuho$Q~_ufj%1q10c;1 zxfSjl#lx}M#%5Ro5tqdXh6dAAc-c|3c6LS_ zF#iF?L}aDB%eLctk`VVS{}Oiu6Z<)+N^8zxn{>I`s>=G%#~J!6cM$H`$R6meKw z+M{05^8tH4OM9WBDgBlHyKR;`u;Zu>57whBc;ctVP18!tb+rfxnqEBRlyS9q&*Gl& zU;x9etEdT610FFQ*h$AJUbzB8VE_OCAxs^#2w_-BEf-j}K)`D`m|Fp+d!jhlq*3-R&0upB@<$_RW@-_B@n?9LY-lx5AoOyh>gKfbSgjSLxIckenFWg?QfT zy$c6+!P&<0bmf}5Nj^H$qs&e_mIzhd3!zy8Pm_OUb_E86L$@-9&6O9dMv}Jxp~eQ% z2Nc`6u14m{igl}8Vr%1iB~_&!=mats5EY_P@YiqIbn8FKe*ypGEc5BxFVXUR`u5H1 zSNW0OeE*N(^+V*JFT?8x`LX|@ya%qBp-o_9^ndZOZlW4rC5Zd1ivmh|bX9Lus9D_)dW9;e-Bg zZwVEWrymP9(ZV(^kAcRTX3Lry1I17djV!hnS2`r2+@js z1qg=fTwHp{h_$ed!bYy59$G(E^8VMx?noFvNtS_$mPE-LIw{BjsNxFnspmfgh6EFap&Q1aR zxKJ@SLsrFbPobD~5sri*w|!Exgq&Wc%{WWDCnZ&?ST1@ws+zfpuRyC6#>YznTnyYk z+#Oxtli!zyQhJVUBx_I?iKnR?U{6zkYFE$PUt?W#T1VAIEpJjCk{KjaikG&MqDuEN z9pPHq*??zzzVZ|MFiRCv{)EeG>lbC$H68Xq`nU_o>h1 zrUV5$FYTnIQl}n|T&nBnx+oImF%FXe>{!qZTk=WeoH-1YUq4EhTE^i@xmPtrE+_>J zKSvC@hNQ-Mm+cYITZi77tb2Eb0=lXAIMm zvEi=3MPIvqAC;0%j)zoYtsioLi5p`jhPIG^vEExX#f6VE^dlpsA>>3Ii=jQv+1(gs zX=>6I9G{{RC!odN4}-u-|yMHWUHr_R(#ty)dGo46z>_dnU5 zMXSq#x9DMZboBPN}Tewf%L9MUgwqclE%2h50`Y|L^+lNB$$n3+aq?blLZ6!Va?!*kfIOor^S#6x0e^g9T zCr)&RsTEC8yXNsG&s43(EpbeEgXUszn}Hc)C;xh=R0l&v=CW1-^2qJ=4y6CYAq(jFZ3mBWa;tv;6=pD^(3S=N*hv znYdqy)^)9RQIoaWC%1oVclE^v%8jXGIy>l4_{8P;qgjg6F!j@tp{^-T;@VF61eX0`p%I zN@y>##WomVPPLK|$!KtMgoP_1cu%+RxLGpDh-nGBKzJQiP*Tcc#c+;D)KwXX1ZTBN zyswWw0BtvC^LSN}EC!;obcNJmALR)jg*5)OfoG4J7}EFsK=lh$Wz{pZWYxhk0{z^I zWeqbJM7SmFAl215OMyvh*sC2q8dpwGeuCcJWllYqSk&hl!mj_Ojg&-r`%cDvp*qQr z32vtQa-Qy?@8TE({uRtra_J15xJ#;o^1#yrb41rx#h3`MknCum1_HOk2$@!CQ@jJE z=k(M`GH^uiXEYC@44f$vs+|}CoG7u`zE;}gLY^$55ObS#a-i@o_1ffZAbZIGSw|Q ze`xN&65bMDxTQ-YJr#xHbFH*TZQMSK{LkD85bmvcw04r|R zQ`HW(El{P&UAyu}|92b9J>Y~hF@%e#Kb^ViOUqT#A%!14fOhGF*RMnVkiX~Wub-T~ z(WokujMpz61u~8!`0VmfZJh;EyjwJi?mbeB>9$Hy_H23MJ@C=~kfrwUU=1Qa?CL7K zkRj4g&AHx0aji{*r*Ej>vj%kH)f!7s!&Z!HyCEOzVYuHN)}XdG{aE>ML>`mYr+xp= zlm{~{t0}hC$B3DCh3)TUE1)|LFT!<)#^kf3gXPBFcD$wV_43#(kE7H+b+hH3$EEzh zgjo}jpCH@PEqd*t3b7zfEvLR0mT=8wd65hC<+5l{qL7O^H+1vt5HuLj$2!|>uE;IT zxd6zcNGMGf+`YVmKJ%PL8W(6!h1#1!$a1&qaK+}3e(&Or^EENFjn~Vx21|)k5AiObmQ&CxJ)|Hb`{)9YLL*!;~7-Bp8L@#(>VT+Dy zX-U%P8wwXXRMa-_oEzWnHNdI&j55v-rQ0d|3zdX*i^PPr`UVz?X{g;O^L}`9-9R+B zw()thAH-WUdBI^iQ}$4>Mz9H#fw;;mK^K?-e2MK&ExK#BNHA=ca~fBL3|!z$uCFgj zE+hg%$6%1!;&QKs!c9+mzKxfzXS8Je(xd*!B@st@?MddSXer+B>-4Wq@HQt3SfF~w=G z+pM^6=WthoeZqMPHZMOLxGVx{g$)yylE_EFH$o+7_w_|8@fKiWB5aGL&q%64I-m*l zm$%-y?!GnUmKA4yI;Tk7Tcx|U%z?#2B70l0XF_s)_ydAu}XSa zb$)>1D*g6qD<8e;3yb>qvJB(71gOMCK*yT@!<|;Wwg*u(L3eIHKk5V7&kJ07{7{v@On$l1M5ANrL01 z#DYS~5A(d&;M{^LCB-HahZ0NJ)5!f}2<9H!DP)EE^s<6JJHIk6O$U|tr6SW^s+60x z4QpsRz?Ns;Pp1E6IYGWoS`+mYI~`2H8pgFmeYFJ&t60%fRU0b-G=}ox*#Zj;db{A4 z0^|15j-~IFjtA3Bh!yL8gRq5#TIe%c2kY2p5Q}T2k~%#;qmOMo2jwpxd?d`?7w_d# za7@XxLtMw83&oZFkF+N(8zpRuZWpa5UtYL0f)_Oq&A@MSFNIP~(~q|k12f9dmGGdD z%u!q|2Q7^@bavL&4)X?m%vLstUqwMy36zlGVbxzD`<>Gcu0|5bF@~XfLkr}ikF)lG zJBv3Krd^UXHncA9$rd#VHC{8p!z!)De4#yIT!)=wt;{s{i!HCjZ7?;-<#vEe#TOmG zxO9oVRFN0CP;`Arin)}=E+e5{d^V8kR#jP1tkZC*8$8A1y|N4vCKLxiGP%VH#`JbB z@5s`5Dyl%pRkM<4%Re=uP%~e9wwN2G7ua%!L~(z)b?+wz3L3tuspiQDx-cghG4;-N zEagU(|7#StK^Hhq2PllK3N1-HQTg6iHG6G$k6DL_j!X_0LbO>r5783TPuR^*LPjjV z{mbR=Qcct@ zW`9$I?xg?Sj1i6oiuvszr)Q9^KEVfkhXCV)J3;GN;Ezd%_tQOt_Fc%hE+qEq5t$U0cl@@!R;o!oCAxv5R7jNy~| zq1uup;y~cASygVrW-CwUb{}jxDg&VO*`iuZky_bf%x0Sism+UCZmvOEA@^BqPJ0z> z^VO?#cPe;LK&{;l9dHz?n2(libnSFi+W{k=*mD%q@w9(JB0hs~%w!5`6-nQ7l}ptK z+*^mdZMt1HdXX318clPgM>XcqC~1I;8JszQ(WzYsq-&GhWU>a?&p^Q2jaH$jW4vlI zVdBz3XO;nZPwfQUZhT6D$Fzluy2g0eu5`@q$ z%+hmks4sW<>g)|*WFa)ezHz;W?o@n&caoRDzyTnv8^Z(&VOsO*sK$zDz+A0_ zHO8sFp+p!%*UF#&Ogf&jrS;#LBYP;!ZZ=cXxjdXRi`QKxnj09 zE6)dCU15l{adQp1GNz8M^Vt}LZB5Eni`nJUsVFo=|2PwB4|n!UAQccptTmAqdoa7t zmFj*X$)s$UwOEECQ?}EcyJwR8lWh0d>e?=j6lPR|SSpEw?{_&3<(!%R60}p=q zF@M#Eum2X_KKlOPJuVQqeo_1fR29?nFk@u z;a1dla2Zx*720ir9wNWbQo+j|iOF_Ewb)G5MBtd(<^ z(q)IBcYLOfQ`!fNmq+2h=u0ItuAda(aQ0)>d$N ziRH)6MZ&7LjC2a>8I`y%M#7#h@TM`7VM|b}Ng093URe2qKBlHXdw76nO4>5fC9GMe zqmfs?JEg5Cf%61Rcz4mot8tdPNf{m+n;F!F@>;r+d=tZYUK*E@>`;w{2~bv}VtwO{0aR zpDoBfDP^p8wi=I^AaN%F*oh#MSiU$RW+YgcN%`mFr zGy}n6!M6}~cfDd=VCS>G-|JQ~D@yLaR$IFdwlS2r-FDlm);xS599;dEsB}-bK#B0Q z?U-6al6N?C;Mbk^RH=hwkXEEtunxD>iJl);JwRQj%d`rcQ6PSEz7U4+O!wJRWL59l zS$f-J@CwhU#I{_}T?9oEv(y*S$HS~(e(U-&HwG0%J}<#_Tw8C4q@}FE`NgFkxxSkGR+ z#J}O~*9t|JpQa!3_rDaOX}Q-tMiU4;sxY0*jOU^R1V`#?+kIH1RH_V%=o_ZggIfQB zc(bBCuw;$kE^qmXK$g-c4d6DqdN2Y^*2Crla!a{ZFmi@NktgPHsU)?;wo@IHUKbM9 zm6R|%7}F!!qlJ%#R365x77Uv-`vOzr7KfA z1>1dX_t6mrs-+9@0IV<|2e_(va5qB7#R@M>-%_6Wo?mvEDm{Gh55 zfsiAgvsR0`*c#&DRJ}XumAS;3uU$tVGNkT zYKK>fI~__-wOxAZZ|7Ze?_TJ7cn8K2g7u-?2@YOB-9#X~bzBd<$R+Y(-*QuGvMxlZ zWrK#!AjEQqS5c`P(KVjE8<@I79OoC6S4rT%VA>33TvaH6@o-IPR?4>1_)>JzFZ zw-{;5a;8^pc4u5L!<0(42RLAYN&&u>P2ydOrB)rnIE`!r*Y*YFge9F?BwkT_NG4X{ z;baBMnt-axa>SAXPR%i>Wfj#zr{Zp$-4bT)nn~9YHoR1O88<;yTl=Gs{1rE;9$A)W z>9MH0Bb8>Rlb9Ow*dGHIJUh}@k#m&fMq3iOIT~(Pm{O@!F?60KcLB&}+ad{aOo|fG z8X|OO-Beb?eoiuz2{>t*0@Ny>?c4hhX+&;$pAxg!4$Iw3QqyQE31Y@YmtkzCFOV|E zh+#V9dl{6bl(Wa;Hm;K@XswjCpH3R*L6Io1NbB&ZdrXzT5rw+Fl%uYP3-`wX&t>*D z)U{Y}%;~_Db$noLq54O_@$+;-LDZOMgoK4B_5G))7EhaA`tg z?R|UDoeh%I14uG==g0&Lt$?TjV-9!5!{J{ldY%@esWoa7PZ-z=MM_Q`m)MYH1Rs@?!+e2$14gnoV}r;2O|#l!uLl;ux=xXIf)b@l#&pO~g=nBh<#JT0 zjiq*fuV2#@#uU$RSSC!L?6AZ_UNMxGxoGpuXgr;{+Le&bQ9zal+zM)`E{U_XTTG1NAnW91u`t9 zQJW0PvO~PsK@+H?HQm8&7@#T$<+AFOcLK(?c2Y{il6zlJ200l$>}5n#l~A|1<07|1Nidhw}~v~O=I1lyd; zIH^PxoqjQbeU@yaiyby&&w11v3liN%l`R`Ex-4#iuDSAZT$w%gV8ci##UZoltuC*t zbYUaVw+rW%!FOg0d44^{@B=*)`d+G5xqFM3TYRZ0U32rH+!N+&8X5AbwM>dlSgljXmuV_^LVL*pjnX%^ z=F|-vEU;93lioV8i~`?)Q77KK{l;R z%A_-pE8p=f#fiz@DOkL<7`V&p$;5ynjWt<`&0hl*8CTMOd65VYSNp6Hbb(ez;iJt$ z`I3X$_eh!UPU3*exDJgJd08bYzsmpdKZgIT2R3l~oxvugzk!9;4+t#bFS(TJ3;g{* z@MGY?`Pq+Ozo6*axB1ae-@bnRHH2=y{r(^GBOl7oW;*!r_3PKKgFR{ag&)2CLVoY} zKed6}QTX=q8369}Gyu%fG*=eZcX{cK+}2cC!aT?$OqW!-cf0|OM=><3<9G60vo86T}}ZJ%^RDMI5i}tq%|Us z5r&Z~cKHR$2iH>qG@fFGMc`BF9qQJE(+~{IUlJ+-cj^h>2z}0I@4~*6T#ZQ&M$`p{ z1x{$$e4T{lTJC>TGDpIC&%6YbLa#EPa)g5b4J!MbbQ$J34Dg#q{?TI0R5LkEnmVV* z8~~pkAnMYC>GvqbxKvlRFB{FAW|aCf2R_RHTN_U6MkzWZR=Qk0lxg63wr`Hb#wzSR z@zrEl7#iPw&k znv{;D(hRVRQ)Gvvuq2(ft-ImB@Ic*caMe9U#q)8|HQL+>w3_QcsnTXh=MB(k|23Vu zHV-tG>!3~m#dgu2gZN1FF%-bYafHY~tjYVA#!4RBA-blP^*MD-x^lEPCE`n*%^2%( zmqt=@?b#31s`X@=w6;8p3rtSnOlC8@iv2_l$(6)BNoq2=51mewU`jT`Ae}cu) zPbCGV5v-w}XIyJR@Lw|aKa+&BbSn~4V~b?0!0y0bOJM?+qpW6QeO#_fnpQ`4^J#r7 z_gzP>Cafb@q_NgkR@l8;idvyQ1I5pCU8g9Y88rgDH##p?3hLE$~W zbG^c{IGmdvlp*ddFpM^$lOj}-1$Fx2WtE8f!1lvJro={z)O#h-7@lAGEWnOU9$au? z&(>l|H_)_R1#K-(w=A6-?GJ*@Nbv19h%S~Dj+cW{hU-0s@k;Se^g8-Mo&V6GJg_)W z-Mr73+@eHEEN;2~pox(_#FCUtxIju;y$cQ|5$OdkrZeLm z#u8UmcEL6zKAOfNclaT&xN`AtoSGpo+Gq@xLUQ9*v3LOPtuxDrG{aNFd>Q47)Vp9O zOY%B0O~e3gh!eNBk2ZxJBkZf?!|qPg(hBSu2~iW$AzegY>=%^d<9jyk*g;39s1LAQ zo+P065wH~E>vYOFNi>H9L66ell-rk{#8RBbbo8ug*tm&VRw%cn1HHnLv?btocH`{w z@aQA$?~fVTE#I=K=)OZju%N zl4B=O!KmGD;iv*nAzRI@B_);QsW-$Ygeya_yfADyYxNPaAeyGk#*g_BN76LI(=C7g zNzHN%o6rSGi=?=q#W2=XU0kWvFSjdMED0N9wj1+7F9tbz7Mm1>+$ z9D{)cFcc+ujWF}*Jdk6N&V@}m>=0?fP$~46vV(4wJn3%I9glrY6HwMP#(OC%XkKkf zW@9LpHv8~}30wl10OjH6y7SO*-a3Fm(vn9+4Ffb%HwpDq(}#f!Ihf4O7dSg%9@$@t zHq6j_v3T~QABDd?gRnLRc5puW6-~9idVSdXe<>mR{awHI9)$Y+9%d>T3jUF!zcc7t z{{7Qm8hCvM4&?ify?*%m@el9@pGpVx)pws}H+!H83}^l`tb~5{_6bb7zL^{ndu-u) zy&S0rX2Yhy8Ykf9x+S(U5Rlo*l+y6{?>jIP=G(+(_x%-N`FPwWe$3NNo(5AyAaB)e)%YxT*~mA%duz zcZjy2T*!4~x1yU#V0IHku?S zX1b126t#K)@vW^Fpg*M!0C~UI@K)8iUO9I#Xd7+BRsmp}u&5su1c7!SOSwoh0CQeK zW2ZcBrsm@17GU?{=El5b_HD$q6nORiW~N2uNBv*@4vLXabB<6S;wdc?QkQ zinFawRKVYk;BR0zy4`0{wy_xQksX*uC?AWYpk!V7f;{j%^< zuov$v$hpVbHTTK5b#AyY61PJkdPCnm6kVMuA0vX(!?FqvwcD)?YLj%?@s!D_7t(WM zuZ}Ja1jWPJGa2Iwnjf(0E%!OtmjmZTHS_~ zT!kSq41ngDbSgr@>WXDaB@HMQwX!Dxn(yfCn?l97VNwYLB*cRSM%C%HZy69K_A{Px z^`P^tIvuo%EB66DPAYvS>CY`d%Hc+aU>VVr%il$PPI(sZ>@cIl2V^*SCCSTYD|blk zQ_`$k_8OX=OmV0mBD{B+T^)Ezl{lNAEenjc!NJuA(0!HdKS^)-$NU&OnSYcfO8-5R z*6&`wA|LnDw_gS>cs_=Gn{{+QfBob4|M(#K{QXZaFNK@Qz5pmu=!U=M7T{h;m>~M; zE>|*FIYTxx;$+|k->xMc>Wvd-*70i9bjYQwiZb+5OJkBWwzyt1-h(ThbWpUe=w4v= zBpG$yc8K%2OiWUJxq)>LlE))}NtcK6XXO(tkZ#ZjgWYd_Xbv51$5*JMN(Lif4N`}c zA6qSFtRv8o?#2X?R0Y8>!pS~sjD%XvU2dzA2$!Pn_&SN^e%e5b;ODa#%T*lB>W@n=6-aJJdX*K~F%IZDg&(BwmGDVa1 z9Nn62Njkvf-y5A`bF^)biJ=25t6sRbIRKQO4apXP_XHtV3W5Zt$l!F*%v>@+fbt>3 z=)Eg8N&}!<9pir`UHc&2*MW=Q27!(0VRP{#;S1W=C-_710XP0QwES_6sy=0?wX56@ z#GYSaR8tcb2OPXLTsOJ`Nz6lU8c)1coHf}|g(qq$#{R|RAl4{hxIV2G>V%EW?g(sX z=ip^q+;7g3PwXmLF)aIuN1Ac6z!ExD}LxvS6pO?Fl#&@8EiQwfTK4I(ARNnd)$ z0MQ$z66Fk->Utn?uh24kH9t5>cO(z(y@YGp6~HmI*&{YIKD#L@tbbMQ%aRgIC@(+x z$xp&h{==Dc9;Bb&7vKE)?du9<%2j`<-apETj=cAv${ed58=lqA9u3(KS zkx)+#RCoC=e|`?f@$B7}b2_tdT0*}hDSBrUbvqf9>gOhX{A?lemURW~cmgzQCB_pY z1yfa%YuW(Udw8Ze&!RsV&d%=ZW0186?A8YK>k}oPZ%PTJRa`&iVV0djE2dk4Ww^=P z00(olZ{AtmeR`i;F1a9Q<{HS;0O@2&Z!clEvw8kpb|x3iohOvvoDM?qut1uzr~FW| zBCc8aQ$Thg<`2G(Yq6^&XGgr?8sF^_qbRRdg;J8=jxptfJrMv86s1T2T=vCH`XzFR zRpSJ56}Td;I|2y6`zEOf)aS+eD`Y%L5tg>vLtf^&)ghuSJ%P`*1P(nkly&k^J1G-) zp5j?pPKw{AMf5$xD4^|YWf7Kf^cRBM8ihTxh~tRv*}(^JsoO5Yq0qE5%nb>?UhSjX z3&wvFV-bXLA&u6}fT8r3kq+13!8REeS2kZuYPu$GOVvvUvtBO{{ozUqMUGu6PZ>%# zNz##b38*DESp!NNgQ>1A&bc%=S+zX(CrdEsvMo96(64Mc>cgLNaypt?wF0fxkl&b~ ztocl3O}wx4gI4#L;Kkf^Va<4jYu{a2aW;z5tclLBkc7PvCQ`$r7BGrMUQUMly(~I) zOr(Tnwjhn5+yo9y>LMF4;9gly&MH7-J33wIg&;a?@HNcqAO!oc&9D7a6R+<40Pd8s z>s@rGisg=&V~tG!t2Po;EuR`46I()Q#gBaO*1@No(6nNgCJ5P}@!XLgL(rGQ{&6fJ zZA(&+3Ec<4yjo7>H7qj+4p{WmW-CyGu&$;ISN1mwea{<{{J>7A1nip(vaG0B$JSx_ z%PAoIAW@g;huTz!0i&b*Gs={u?%esjs3k;0J^-1Djv+Gj`&{PTsRk`7QFlUkHMD96J?QtVohpm@LE^>rrVt7HAI5;8c^kb+ zRjONGs;gC{?p9T+8_1LOzr4P+*S8p_Gy?1{^huH#nHj;$UbpWe@fDb5Y=C!QM*|%~ zw?2znsqqN|#kiOuh+Ej8U#0lx7JiCZuo;WBeVc%Q(^^q%aV_qF0Nhm`UG${LQG?h6&n5{M$h+)^Qy(RRZzB{y7&tnWg_MOqCb@WI^Au=4 z+NO$t8QEqFk4I0`ng*Q}vYLvYTwGLBZY2zt9@<36$AViXO~~Y}gEobJIZf(t%J!H< zoY|v8P)P|+l2C|p&NIa)jiD(b<1&a_1fLM0@UX_6~j;^C6W;EdCTL)Dxz?8D2=ymK| zQk2?u38O?CX2GIhxl=5%kr%CW3y`oaZ`6vGvvQ$ocxi{EGrhP__*Tl}gjPMJvtqw{ zu~YBX!Ki1Qy0lW~0C`l>fm|w`DvM_E%+@Mb*gcID>ZtmTGvI2RP$R}+B(@^V*%63V z5#3Rx@WL>MsP23pYS>i3pv)*)32s9>KRQiRifbtDg#u!2I)S=-h}n=N5zs9=60Lw; zE3Po_!cd-Mh!X0D)|KnPlZ`JYbul0gLZj8BF3A$23_D+jrBUaBkva*BWFDp{I-{^& zJ-3x#2IXKfRHamdOE2#=o2Vs8sZ>3PqkIXdAh70bfIk)>z1buGcN8Esw8Srf$k%~sg_5E2f;hg9T?$Hu16 z*1ZZT5Q3Qj5=Y}u7779))cgpJKlG%>SZ)aqI-i4k4Lj}lvWF-2&m}j#!8fq|Ng>qM zUyKn0nF5RIKr7WWgWaoMSv(Rf*Z~9>X_DH(wDL4VeG-)r?!~R&s5gxTf?(z|{AK+zrgr){SYZi-PRO!5pvfmIS6mxCfL73#gnj%{J648MJ# zq$^w>f+fIY^jVD5LG2c5j&!OB6Q?*^ErSkFb%K5uM}a*Cb#jAwU+%y(!}2pYU=LHy zZgzQstCE#Y*FHY!Cg8^{2yKhn70d%IYdSbPk8I?fuK@hMBRXP(CYA-JcEmh=I$D!D z2&w>x;SF_xT9X>W&9l#kmMQz&XsfZY4xc<9k8L1~TYd*iTfhLH)@7*xiLHeqgTqxi zF!zfIb01jUmxOeyue4dpb=2Sba- zmoq-F%MryFJeA!*?4nf1_Cm~G3Fp9w{@H&RG9)ws0M?^hCBkk4G-jW8pAvNI6XVu}=ooWz;Dj z6uRZDZunAIL^X^dsBjFC2!_syhenp9+E&UTF9Q=If7m|_|LcFq(dUcs_WkMoXHew+ zy}|mvMqK+f$g27UW2=7*KYU~n>V;y!FLIac#x_-#yL;O$AXWUxO&d{pVS}&g(2)gk zX~f;!P4OgmLu38AZTPX*O{mI+b1ESH7eYEf{GGcj$3r28;s(f#O}^x%S2WvJRku43 z5a91;#KR$-y@Z()DXF{+em4-|3_Iv)Vn~@u&n>tFKBk zU$xq{5fko7Ssh4n(10N;$D!L-^p*1PKhOY^3);-d4Sgj{+O#FZ-e6h_s|KJKwM27d z+XOUErLJrkfLpv#3K+W&X)TzCq%{~%9{PFP$aEa}azL+jbnoFjTIYR)_R3{DV+veN#>vQ zdhq?M3oFk`Wl;r8`scbsYNlj2qimkfY#3#zI)2>FL(}gJeof@*Z9wB9rQwW3Coie} z33e@MbvQy`f_4VP!;`9Wk?~n{GSETPRlVC_MPuP28?h!}*eSjTW2&*H!~)m*=c1wR zf(OA`C9iCAa1v;>sj@R9U;$8sfg5@i2X1e486$Wrma0&>(aoi*=nh(;c25WXRN_Jp zuhjV#T{;1}%%}2cAS6j`MFoW|TP~zSf?jPJR<|xI_b|#rP`E``AYZe}k9QS7p`X$93vlRBI|sQw6(keXEQ%;TboJmXvYZr% zB58Fz0DdKUfG(F>``&&Q-hcYTN3Wl~|MKm7b}#?_?eic0I^-{>U1}C~ zpn(_6X0Jzx0sbE)(Nk1>G9|usvz+NTB-7QrNmhXzgCn(@>TDX)Y$^}KZ4Y2z!axoM-USkT5Vlo= zZNTa5cnk79qYFk-vwUd7KuY3&4$cRcs9`Xw1+tX(l49oL45?#y8L{Mr&oSU~o(#$| zv@cSnoiS}RFhQfNAx3xPy~CyaO!gcKPRQ3S8P9s=J~Y6MKXsiomj{tVSF)t$IP zS^ajcerOx@f(GRagmEp~YLB6+w@aWS+?)q=rkWWFECC|y5C@l3pB1#^yNeXjm{?il z#j^V(8G+8STX1jlv&(?0n5BHB*~1*!+1IPa0Eh&`ZvXmd!Pgjy-pQ^V)S094hUAdZ zu|}1YMMDy|iERGrhAy1Klc*_+?mA;5;1E(!?WlpsgU2imP#wzIwwv4&esLuBR`Bsf z!A!LZZK}Y!03{elbaHEWSe+d?3i%5T8WKz7S2v2Ni3)hByB8ZPn>zv2aVI0ovxZIQnPYJ;r7c2$3b@A&S2XaLUe`1)-=`hNw3CO#sZh^@UCD)@O@3-R7{ z&qFUnC_KL24!(ygeU>m@83@<_y8l>pu%zXCWm6|`C_T(1*shAW^AVW}L*$(ZU&`dp zZW&)u+~`|}teJQC3iUFy#BEPyuxYfhs=9m4n9{@02%^Vnw0Htq_}$I2vmAzstaj(^ zs6OVjs6VdlsO20dWUVTw&asRYSc_ZZ+NT|?6N=ho%G#tU6I%Mf2{f=ly!YD*G@W>dj zY|#0tz0+X;B6=S++-M|3 z)e1+Kb##}F8ADWu(n;8q!o_-ydP_(tbJ1oYYD2T zxt3>!H@^~-*EuAyMVoDOse1s_7T!6nj-y!1xw;TEB287QE$$HnQf6gXj;Y$o12ybe zZVXQF{*>ozTva4Qpfx^Ly9Ap0$ci9>gw*cPDT4medQv#06p#Rc6rF^d zdmwqOlsEXKXa^d1xz!)wK*}A1vQXp+S?!HT9nzc%cvG(^;JQ@`t%W!&xyV_8i}u}^ zTrkEK;|{Y_nCwt~y#D|P(xcHP%PGUdZ&*G3hF_n8$Lr6-ALm`ps~|k|pYoxPrQrG0 zrdmI-C<0!TZYs+P*xl1zThr)TJLjrRC@V=Tzeg7o<6Me;6jJ0YN6Qd^ zt1E@=a2sqyVvL0(MK;F21bO%Yq3|-NC)P`D-rZq&EtIO~wt!rmhX;8lPqUO(p~&tW z1-l0+ijS8M6W@YP=X!<_oh8}$X#<{JGHl+ksC?X*uK{BUSgpGkJ2M;`2B6;~?chvy`aM)`yj%$AOZv2n46a=kJkb0;&N(T704`gOL{M@j)(E!5aP$l^8Mv@bpP;EBo!xTaff+k{}Z$N`wmrMtuiJ z^FdQDrFt5HBuoTnOcWHtT)dYcl(aC}oIs`AziM~$!Ud&Tjb+?|(h6fHN~!`+h}NKl z%dwz5D%TWssVbx-Dmak*$xp(MYMb0C{G%WJFW{dXjXsk|_WB9PzhAxmA-w=_E#35w%TED~rL>Wr4?L*MF!_oyS*R z9jxi9PQ$FPpofCF1zUZRZAImXlK>WbRX#ecxswM&DxEgBk>cSJrzFRfH*b+g9ycui zjxt!LBj7J%5e_020uIAc_YziuHM(Is?7orw_E{Qyrm28bYFM2uf})5yB2>0YvoKin zD=fJoE)E?C@{Hl6OBIZ;L@Nm9l))KjcPu(V)3Mxs0^E<))%0Y@IH8qgQLD#9Lp`0X z5tT(pfZyx)XLIkRKm!A3*v<*Ch&UJY(Kwn_3fBLErij~$*iwS2@`0LNnn(58SP8+? z`A(W`NS)*cfLV#;rX|&L6cw;i*+6m^DQ!XCq$)>+AvY~%5rG0pUSlS7~Wu6q^DrI}|c#!TTr9pA%-waW^TFK-(iaUOU^Een7Mi0BaoW@~1 zDvpd|%u!Tsh|yN{KB>5ug;(T0b5viCpmH3lJx?SG8tOJJ#vlV~4t;SBPWONkP2M;g zIUJ~wYFpW(xP)s@`B->?3{(H)5Z#S8;6G+yM377!|h&BDGpfnx4(SZTq3%7c<#w7g$d#6K92l%l*b48ZGq$k8|MBGB*}_Yxfpzw|p6<`VJ7d<38RChF+}5c+PLh zspsH40qU;m?lWb|3mAWz;*$#g(9==wnB+NGHhMxd1gkoGj^^4f%}VZ)d-CQ5TPPY9 zvkHEeKhoQs4obz^x$p(_ie`ckCHc`et?CXI5s~{9Xh0U{v#YWJIU@N~GpEf30Bdse_Nuu?nb86iHq3>`ySzSdXMPT|;rrP5R{ac$lFZ_7JKV z#T{QHR1_{4B<~zFZ>lnZlH>K;2q;yc2+N>$mL9VtktyWXx)dF^Wi#lVmtRm}#o%ON z&|js)qZ~B0kao&?^r?C>t?zXLn}bIOWh2yW!K6$sKx`Vz_%5X#M|7CaK?~d9jllL( z7*_339X}i+9Lla3r=gI2F*@wn2hD_I@ne6nhd<2@h=sZ8H=5lff#_?oEGG966WfdK{{_HzYA$0Xpo)qA&M3tzK@Z;XiK3dZw%S8NVjd1~A+_!3EY7!~c z&8}7@*?beTEd`Zk(=udQ=|a9rbUcU|U z<OAnSUVKfL3gzw>m%guEqA%6OeJGQsVnsO#O;T1E`3`vULRn7 z!+XHff@o`)Bg$=BS|q$e4fYmmTMHx#K*cyb-qDyH{Jkrz5pPl}Y80~GX3~;kg_NRBdo*xjSHfbfz*#xF<}HR5$4_2xhO6M&lbxhexA`*oQda8 zpz>H)yvVyd-II z;wm0fm(>jjnNA>pa-&s%a@9ap zIJMwNN-YQsc6#cq+GcaW5s?ha$42z>yRcC$J1UKhC@I@jU z(N?hHh(n2oU~Ofyg$26BFmAoQ%;e-W}+$saNJescu>@59^Il%4-A^&X$}jDPv|HIss`os#z% z!}@Q-YyMri0(CPVj6vn>QV8UJ=F^x9P0EMJI=&;PYvZn?RVySLy^2I<|pCy)sf?AO5TbowZV%!)@$KI#qNCxL6G&usyY3XB&(QdcX8L1rL*=84TwO#GhQX zk`h;?>iw-wtqa?1=eG}Ii+@;xj!;@3PS9#Aij~kwi7qDHpw;P~iE-12H1t`hVdAnmJc6rHf_5LDOO#RB~`rC?FuF@ z?FL#5oDHd7toJ)e0WNFT#_Fm}uzPp);U)4mz}>TZ@dpHQDUBCS9vZ-HM`bElhoZ@J zwHB6K+RujA=W=S)q9VTniFhIL^yX>_(B0w!tp%)0q7=2;XaM&i3;7AX82Lo@@>p*b zVa4pbmV^g^J><-V_;O76H5M)^g_Zg<>qZd7*?O&!Bg);rOAM$;QtQzihxn8Sp(i^{ zm@*n-NovInNVKbaYc0IrVW$Y>!A5WkhAwl05dLnLPs>ON(?#bkJ8)$nt7zN+=sU3a z38w_7sY%2$NTuFO?$I@dhy01wGu%Q#vpp?Epbvm9|Gx{bKV?;@?6lvhto@Jv^;i5` zFJK+{t3S)X+S;C=Wq+Yj~_Tte=b}zYUa_6VJEGiY^4qy_>uU<~K zzTond;gf0`D3_KBB{*e!cY?4uo$fa-@M{PB@3B2IWJ7}%^ECJ`B9|-(BVW~?uTpU- zrO9aQKsajI;Ft1iO2CYe=-fholvA{Io1g4PwGjz(B8w5)|&ck067w=YE2!GOewEE5%TXzP^xfBg6~3m_7kXgFLSQSqUM5qM!L%V7KO98dRcviqmq~04GOPD18F# zy-KAQzLx7mCUt~`tm}q;0PrEf4@#xzl(Mmci%rkG@v8hOb6Qn&?ri*bgEFo&5$v z@*x(|q_X3DALhUz=f<-NM{zxan0z3B@(hvUvLA{Chk}UU7ZPk$h zece;Ibapjrc`43WjV7HE&1WjUmmwM9Ps)J{EJoUR>*j_KjT^Bem84zglvYQtK?fup zf*NwSwT;pNvLJlz+;26D((LORch(VM+6-Y1F%c3L;m$j7ZY0Yy8+J8OHCS8+?X6*z z^^hqGtgb_w0@DE&l=`s8zXj(?GpwH^qi^Q~H$S;;2svMY3Ry`L8)=_7?4jPM>wqe9 z-5{kQ$tNYbRk0zsXul45ZAC*%cRWy%04P`q0Ys+c`hWgMmcjq&-#y|1uFQEp9^U+}cO+$YTOo%}5X)E@do}A&G~%Jtg9k+~^nVXHlFO4P*?3=Ifxwk{?67=~>D={h z3*RA0S5adRP%VSTD8WH$ZOHmlz6zC0a1NN<9a%z|(Mo4)oL}K8L!|UTH_9C-Nr4q3 z!=O~3$d(h3VTUm~_7<{&bM%r>+{av%EH9lk&2+v!Sj?(-*|}4~R~`3QptQN`f8EgA zn>NNU5bhUM=mpNQK3!qJEVlq8sNjcnEsAOK2HW*Wb}k$3buJQ%3Y=JoklWvr^byJY z+;RA?Wu2>ZWxzNee0)!e0QT#~_>xqniQlc^AFF*I5)C>?vKK1z!Je1|gL7bfP_RUf zlTfxrzutDY0SV%{tDe}`h*nk0GDo61ltQWl^}&iLlF5LPAMsJmrb?D{6IOcvM2$Bo za=g09kaosgbSKo>F)!8mFgWYm_1G?xTXy4|R0q=npNTGH(}YC?&`Vmh07{=@><+XQ zBXQbFa4U!gs+9+}KJAcghbf>`W1w$KJ+fGzC2O(-1!LHO8KpPsL2o>vCrE~29V-ke zMi&p3H5ouDSOgqBytLD*EDbtI>p%rqq{gaTl%?uPJFPnS@wi^5>iHHgj_Qm+>>R$u zl~S$s%b@D*RWWti_OYa<1nI}ye(CB-oa_w~dZ=Yr?KB&Z>+wuKKpg<92!2rnDOvj)(0iSVuclL{J78 zFwktmKKmb8jQs=ku0H&Z^}-w6FM#9`zwu9S7TFZXcM=q_)z*b&nM zg=(ezZG5eQ9;B>Y_=+X0yRuflA*En+M`>0g#u<$uoh4utXsLM^M{6D30)=AY`Z+%u zU1eFr*sWR<{E?(cn}RAnV^z=D=h~^|(IF;@9BtW7xj-Wv&qxLq-=)NmCqoBpJFzMj z>AUcvT9J@St??2l`{eH}Q7Le`B<;j+LQ4@UVN4Fj@niz5=o8x_tI%F|djU<^QUdrR zWQAaI6^bczEFAlcsOiR|c65id1yBW}aLZleNM%HCf4%nB3#ltPf4lAq+dPzbkt~er zgUEb*j%Rs}qtua`HenlV>4rpmZ)d31BSfPkd9&|a3w^>sWOC}@1d3rx4m`XNkNg6t zC(yZVu#kW_w1TvkEWti&YWv{gnec%zhMX)u@_)$!rq1O_B?Z8PUz8>FOE$J+v|Z(l z?qYnPIG!YpTe;#4D#l<9N=)E@isZ>u=NKOuNa_ps;G*knQ?^2@V*rcaB_WqrNTZP# zkGhjA$Ey;I4K`V*$0ope_!knpqlD=NT06V7%Pwk0X&|Z#d}`0iDdZ*S)@4x6+3e$S zIRu5`aRWt!VIF1kY}*K zHg|5_0~r*s+1<0O4nAMh*%IyvlO=HqTRqDnqljzUPYTetAJe>;kqu_|iRjcCgo9xt zeguLb7Q!GCOYLJ=m$*#H{QjfYpVFcM(5O*e(Jl6?QsdK95BzBdMXK+8fT}tgj_enP z8!=Sn0$Q~Nr7c`k0&-I+#WDdJG_zH>9!LaKu;_+DOM*u*-%zfbyo#d+jI9h>u9X+> zE0rzJjTb0Cs+*GoPoTSyH!(Pk=%W&|EhjvhhMp8W!wF^5%=WF^&yX|5C9$Q}Lds{1 zF+V?!{!@7UL*A2W6oo339X~yRG!S5B`FF4X!g15%L1()M-~p1ozT|nowV@eIT8UG{ zVyJ{iQw-ShIU00t(g6QS`cFx+FR#g_Ul5`uARY8g32_q53aVkj?}GCts3W-L@r+=9 zk$aCIj#hI9$sJffDuUyx;B)%CpyAr}ETGq7e7bX&he6MlT`uOljjRvvu|8k`a>WK` z<}cR-4kGo47sY+D;8e6Wi?T%}(+U?;kbN}LR5@#o6-!6?t?86ND$M)HJ*?>L)l5RZ7H5o!Wij>mp~8-U-aTxZ;K4Gz zsIJap5^bI6L6&QFY7xuxxEms5kQ{5QLHp#CJR(rn?Fq1kJq!>z zlx(1IG;uATWN;Vty7NXjA}P_9aV~e2X8?0g#c22qJY2H}$YmLF1&|NmmOX44wUH3! zjo);<;II{mWZtlypsw?2F5 zTnbY~F1yBak`fIKv?pCg6#k#eGPFI&(j_YHVU)K-s)xb;a+ospeD_dX#~KX4rR`=o z103Z!L~$Y3VIAIiS93JvJn0Ofh{Uj60Zd&-UfB>d;hF#qH5?`#hD4IDkcV#xkEzk29?(mHuUbshozx9lQ+`({JHZwxE? ztJm*yZOU%+6AI-kVo$!Jv*<^!-`MJT2i93t*ITK65&W_VMgAtjjJ1&N-r3J3C0YP9 zW>ZJTa7!#+ZpG5|@rDP>UQ&!|sTIcN@U|)5nQiN)o$YN@`MW?MyX*(xNM)5i%29=p zt`OAh)d)_-nDVz~pJ&62#fiC4{-Gj^!x^*s3hQX7ei7@6lq4>cWr61Bf)pbYk4gfQ zmsMd0i)y?gOPIixie_}c-j3{59HoO!aU}_2gaQ1#I?frI(PL&RV(fUZ~Bz-phJSe#%#bv`OsgM zMf?IFrwcMde$57ibMlK`q{#ys=v z3kkfFOVMc%20jKeM`ynpNnWKbWe0YFg?75~ch#P)*iXG`20HE?RX@>}QZXct)V(Qo zTw!KO;(W@2n0EbX< zbXM4ts^`$n2%ki5(w$NO6FYBJFd5=!>44)eumnhl6zkBd$vuGSb-o{k}QCKaU~ihN&rFAwF&jW6#xr+`n- z?5=i+XQC(}Q7Mo9gp?>B`}ZODiFN0Xw152e)sMrzROw&-NCxfOAO7n2{x{&3eAsyo zZ@ROoG?Wc}AELUylM`);?9T$BxvP+DhIbryZ4kMO`&T zh{qQT*`*S6w-F_ndb|#YP1mAxCKtZNZru^-v0#mn&v%Q;&&bCxkhPzM6$`^E=o|3l z!QIfIAB@Ek&Ox$`Y_vGdJBsIRRFj1UoQoG=n$UHnGX9(;oo5AB*derh--Ua20Dc!1 z3%%-Lghh4Yz7(Fc`o6ms@038xfFo|+1+wVSS(7W14%#koNci)UBsY?3*=jg}&+NE2 zSbpl;lLKeBJCY~gd|4}a1v0<`ru2;IAJYx~Wu)E%z=*ac8T+%O%@>z@lo<4A9n2&v zw28Gr^_Rd?sV2h))%S-xvg*vFqeJ1D% zTFwhA0ApJm*ffYJ<2s$160AwUoeq{3^gCtMj;Hgc%%@{|0gr_Z7_`Y0Y&{z$`k#VJ(|k~^eq+N-DLjww zeg(N`+c>@d+3VMDzj^=jw_o7sFXTsmpI`ZDc>Q|>reBl7_>cf%4;ReBFI13yk)ULQ z+JI+}r3<>os3N{QT6y;{wMOf=>`>KR<%!km z8#OmexE?Oix7er2?|7X}O6jCwMSgZ{Si7PF(-Bn*_^Qg(a?q&73+V7kyQ2r^Z%Ry- zvzpEV;zC~DHw{843mexqga6N5z_#|f5YoD=kR8yc(q7d`SvjGTuD{;mi3CuK8_}nx zleQaX)s;DTgaCZY&u(j!+EJE<+N~WFy##um$_?g26JWxISdw6mT5ddz8yzKB{*RYn z5vOx|`!T+(auS;(kCw;h$#bau5GXmKzZ>OCAdq0#(JIfI31mtZok5m5YaQk{Y9wwqZogHS2!rgu zdQqC^cC2b8@`2c9kp{&rM6VL}98lIvBv|!6;=EPvY*e;4^%+bKlaeB#;tA^^a+y^v zdJrH;mb-4F3Ncylx>t(FN!eaKrIN3$+^`Uim%E95SqNp5&M|<8P^HpEceB@#&C9x2 zA{8C&d4Ss^3)tll?UXbsG^vI-&9lz0EZ%$<4aQ#FDjXvWc?n*!L$Ag{XO1F>ruH|X zSaXz;HyRRc+HMu45|ucHRTI3X^FC@2un|EXvYQ0SjD3|#X((l?QnlsPob@E zff2)rg_

B0o?DtF!VT!YjrDC^S2?RV?P>**rUM?tSk)et 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 literal 0 HcmV?d00001 diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_model.py b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_model.py new file mode 100644 index 0000000..977444f --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_model.py @@ -0,0 +1,651 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections import OrderedDict +from typing import Tuple, Union + +import torch +import torch.nn.functional as F +from torch import nn + + +class Bottleneck(nn.Module): + """Custom implementation of Bottleneck in ResNet.""" + expansion = 4 + + def __init__(self, inplanes, planes, stride=1): + super().__init__() + # all conv layers have stride 1. + # an avgpool is performed after the second convolution when stride > 1 + self.conv1 = nn.Conv2d(inplanes, planes, 1, bias=False) + self.bn1 = nn.BatchNorm2d(planes) + + self.conv2 = nn.Conv2d(planes, planes, 3, padding=1, bias=False) + self.bn2 = nn.BatchNorm2d(planes) + + self.avgpool = nn.AvgPool2d(stride) if stride > 1 else nn.Identity() + + self.conv3 = nn.Conv2d(planes, planes * self.expansion, 1, bias=False) + self.bn3 = nn.BatchNorm2d(planes * self.expansion) + + self.relu = nn.ReLU(inplace=True) + self.downsample = None + self.stride = stride + + if stride > 1 or inplanes != planes * Bottleneck.expansion: + # downsampling layer is prepended with an avgpool, + # and the subsequent convolution has stride 1 + self.downsample = nn.Sequential( + OrderedDict([('-1', nn.AvgPool2d(stride)), + ('0', + nn.Conv2d( + inplanes, + planes * self.expansion, + 1, + stride=1, + bias=False)), + ('1', nn.BatchNorm2d(planes * self.expansion))])) + + def forward(self, x: torch.Tensor): + """ + Args: + x (torch.Tensor): the input feature. + """ + identity = x + + out = self.relu(self.bn1(self.conv1(x))) + out = self.relu(self.bn2(self.conv2(out))) + out = self.avgpool(out) + out = self.bn3(self.conv3(out)) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + return out + + +class AttentionPool2d(nn.Module): + """Attention Pool2d.""" + + def __init__(self, + spacial_dim: int, + embed_dim: int, + num_heads: int, + output_dim: int = None): + super().__init__() + self.positional_embedding = nn.Parameter( + torch.randn(spacial_dim**2 + 1, embed_dim) / embed_dim**0.5) + self.k_proj = nn.Linear(embed_dim, embed_dim) + self.q_proj = nn.Linear(embed_dim, embed_dim) + self.v_proj = nn.Linear(embed_dim, embed_dim) + self.c_proj = nn.Linear(embed_dim, output_dim or embed_dim) + self.num_heads = num_heads + + def forward(self, x): + """ + Args: + x (torch.Tensor): the input feature. + """ + x = x.flatten(start_dim=2).permute(2, 0, 1) # NCHW -> (HW)NC + x = torch.cat([x.mean(dim=0, keepdim=True), x], dim=0) # (HW+1)NC + x = x + self.positional_embedding[:, None, :].to(x.dtype) # (HW+1)NC + x, _ = F.multi_head_attention_forward( + query=x[:1], + key=x, + value=x, + embed_dim_to_check=x.shape[-1], + num_heads=self.num_heads, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + in_proj_weight=None, + in_proj_bias=torch.cat( + [self.q_proj.bias, self.k_proj.bias, self.v_proj.bias]), + bias_k=None, + bias_v=None, + add_zero_attn=False, + dropout_p=0, + out_proj_weight=self.c_proj.weight, + out_proj_bias=self.c_proj.bias, + use_separate_proj_weight=True, + training=self.training, + need_weights=False) + return x.squeeze(0) + + +class ModifiedResNet(nn.Module): + """A ResNet class that is similar to torchvision's but contains the + following changes: + + - There are now 3 "stem" convolutions as opposed to 1, with an average + pool instead of a max pool. + - Performs anti-aliasing strided convolutions, where an avgpool is + prepended to convolutions with stride > 1 + - The final pooling layer is a QKV attention instead of an average pool + """ + + def __init__(self, + layers, + output_dim, + heads, + input_resolution=224, + width=64): + super().__init__() + self.output_dim = output_dim + self.input_resolution = input_resolution + + # the 3-layer stem + self.conv1 = nn.Conv2d( + 3, width // 2, kernel_size=3, stride=2, padding=1, bias=False) + self.bn1 = nn.BatchNorm2d(width // 2) + self.relu1 = nn.ReLU(inplace=True) + self.conv2 = nn.Conv2d( + width // 2, width // 2, kernel_size=3, padding=1, bias=False) + self.bn2 = nn.BatchNorm2d(width // 2) + self.relu2 = nn.ReLU(inplace=True) + self.conv3 = nn.Conv2d( + width // 2, width, kernel_size=3, padding=1, bias=False) + self.bn3 = nn.BatchNorm2d(width) + self.relu3 = nn.ReLU(inplace=True) + self.avgpool = nn.AvgPool2d(2) + + # residual layers + # this is a *mutable* variable used during construction + self._inplanes = width + self.layer1 = self._make_layer(width, layers[0]) + self.layer2 = self._make_layer(width * 2, layers[1], stride=2) + self.layer3 = self._make_layer(width * 4, layers[2], stride=2) + self.layer4 = self._make_layer(width * 8, layers[3], stride=2) + + embed_dim = width * 32 # the ResNet feature dimension + self.attnpool = AttentionPool2d(input_resolution // 32, embed_dim, + heads, output_dim) + + def _make_layer(self, planes, blocks, stride=1): + """Build resnet layers.""" + layers = [Bottleneck(self._inplanes, planes, stride)] + + self._inplanes = planes * Bottleneck.expansion + for _ in range(1, blocks): + layers.append(Bottleneck(self._inplanes, planes)) + + return nn.Sequential(*layers) + + def forward(self, x): + """ + Args: + x (torch.Tensor): the input mini-batch images. + """ + + def stem(x): + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + x = self.avgpool(x) + return x + + x = x.type(self.conv1.weight.dtype) + x = stem(x) + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + x = self.attnpool(x) + + return x + + +class LayerNorm(nn.LayerNorm): + """Subclass torch's LayerNorm to handle fp16.""" + + def forward(self, x: torch.Tensor): + """ + Args: + x (torch.Tensor): the input feature. + """ + orig_type = x.dtype + ret = super().forward(x.type(torch.float32)) + return ret.type(orig_type) + + +class QuickGELU(nn.Module): + """Wrapper of GELU activation layer.""" + + def forward(self, x: torch.Tensor): + """ + Args: + x (torch.Tensor): the input feature. + """ + return x * torch.sigmoid(1.702 * x) + + +class ResidualAttentionBlock(nn.Module): + """Attention block with residual connection.""" + + def __init__(self, + d_model: int, + n_head: int, + attn_mask: torch.Tensor = None): + super().__init__() + + self.attn = nn.MultiheadAttention(d_model, n_head) + self.ln_1 = LayerNorm(d_model) + self.mlp = nn.Sequential( + OrderedDict([('c_fc', nn.Linear(d_model, d_model * 4)), + ('gelu', QuickGELU()), + ('c_proj', nn.Linear(d_model * 4, d_model))])) + self.ln_2 = LayerNorm(d_model) + self.attn_mask = attn_mask + self.mask_pre_mlp = True + + def attention(self, x: torch.Tensor): + """Calculate mask multi-head-attention.""" + self.attn_mask = self.attn_mask.to( + dtype=x.dtype, + device=x.device) if self.attn_mask is not None else None + return self.attn( + x, x, x, need_weights=False, attn_mask=self.attn_mask)[0] + + def forward(self, x: torch.Tensor): + """ + Args: + x (torch.Tensor): the input feature. + """ + x = x + self.attention(self.ln_1(x)) + x = x + self.mlp(self.ln_2(x)) + return x + + def forward_dense(self, x: torch.Tensor): + """Reinplementation of forward function for dense prediction of image + encoder in CLIP model. + + Args: + x (torch.Tensor): the input feature. + """ + y = self.ln_1(x) + y = F.linear(y, self.attn.in_proj_weight, self.attn.in_proj_bias) + L, N, D = y.shape # L N 3D + + y = y.reshape(L, N, 3, D // 3).permute(2, 1, 0, + 3).reshape(3 * N, L, D // 3) + y = F.linear(y, self.attn.out_proj.weight, self.attn.out_proj.bias) + + q, k, v = y.tensor_split(3, dim=0) + v = v.transpose(1, 0) + x # L N D + + v = v + self.mlp(self.ln_2(v)) + return v + + +class Transformer(nn.Module): + """General Transformer Architecture for both image and text encoder.""" + + def __init__(self, + width: int, + layers: int, + heads: int, + attn_mask: torch.Tensor = None, + prompt_length=0, + prompt_depth=0): + super().__init__() + self.width = width + self.layers = layers + self.resblocks = nn.Sequential(*[ + ResidualAttentionBlock(width, heads, attn_mask) + for _ in range(layers) + ]) + + self.prompt_length = prompt_length + self.prompt_depth = prompt_depth + self.prompt_tokens = nn.Parameter( + torch.zeros(prompt_depth, prompt_length, + width)) if prompt_length > 0 else None + if self.prompt_tokens is not None: + nn.init.xavier_uniform_(self.prompt_tokens) + + def forward(self, x: torch.Tensor, dense=False): + """ + Args: + x (torch.Tensor): input features. + dense (bool): whether use reimplemented dense forward + function in the last layer. + """ + for i, resblock in enumerate(self.resblocks): + if self.prompt_length > 0 and i < self.prompt_depth: + length = self.prompt_length + 1 if i > 0 else 1 + x = torch.cat((x[0:1, :, :], self.prompt_tokens[i].repeat( + x.shape[1], 1, 1).permute(1, 0, 2), x[length:, :, :])) + + if i == self.layers - 1 and dense: + x = resblock.forward_dense(x) + x = torch.cat((x[0:1, :, :], x[self.prompt_length + 1::, :]), + dim=0) + else: + x = resblock(x) + + return x + + +class VisualTransformer(nn.Module): + """Visual encoder for CLIP model.""" + + def __init__(self, input_resolution: int, patch_size: int, width: int, + layers: int, heads: int, output_dim: int, prompt_depth: int, + prompt_length: int): + super().__init__() + self.output_dim = output_dim + self.conv1 = nn.Conv2d( + in_channels=3, + out_channels=width, + kernel_size=patch_size, + stride=patch_size, + bias=False) + + scale = width**-0.5 + self.class_embedding = nn.Parameter(scale * torch.randn(width)) + self.positional_embedding = nn.Parameter(scale * torch.randn( + (input_resolution // patch_size)**2 + 1, width)) + self.ln_pre = LayerNorm(width) + + self.transformer = Transformer( + width, + layers, + heads, + prompt_depth=prompt_depth, + prompt_length=prompt_length) + + self.ln_post = LayerNorm(width) + self.proj = nn.Parameter(scale * torch.randn(width, output_dim)) + + self.patch_size = patch_size + self.input_resolution = input_resolution + + def forward(self, x: torch.Tensor, dense=False): + """ + Args: + x (torch.Tensor): input features. + dense (bool): whether use reimplemented dense forward + function in the last layer. + """ + x = self.conv1(x) # shape = [*, width, grid, grid] + x = x.reshape(x.shape[0], x.shape[1], + -1) # shape = [*, width, grid ** 2] + x = x.permute(0, 2, 1) # shape = [*, grid ** 2, width] + x = torch.cat([ + self.class_embedding.to(x.dtype) + torch.zeros( + x.shape[0], 1, x.shape[-1], dtype=x.dtype, device=x.device), x + ], + dim=1) # shape = [*, grid ** 2 + 1, width] + + if dense and (x.shape[1] != self.positional_embedding.shape[0]): + x = x + self.resized_pos_embed(self.input_resolution, + x.shape[1]).to(x.dtype) + else: + x = x + self.positional_embedding.to(x.dtype) + + x = self.ln_pre(x) + + x = x.permute(1, 0, 2) # NLD -> LND + x = self.transformer(x, dense) + x = x.permute(1, 0, 2) # LND -> NLD + + if dense: + x = self.ln_post(x[:, :, :]) + else: + x = self.ln_post(x[:, 0, :]) + + if self.proj is not None: + x = x @ self.proj + + return x + + def resized_pos_embed(self, in_res, tgt_res, mode='bicubic'): + """Resize the position embedding.""" + # assert L == (input_resolution // self.patch_size) ** 2 + 1 + L, D = self.positional_embedding.shape + + in_side = in_res // self.patch_size + # tgt_side = tgt_res // self.patch_size + tgt_side = int((tgt_res - 1)**0.5) + + cls_pos = self.positional_embedding[0].unsqueeze(0) # 1 D + pos_embed = self.positional_embedding[1:].reshape( + 1, in_side, in_side, D).permute(0, 3, 1, 2) # L-1 D -> 1 D S S + resized_pos_embed = F.interpolate( + pos_embed, + size=(tgt_side, tgt_side), + mode=mode, + align_corners=False, + ) # 1 D S S -> 1 D S' S' + resized_pos_embed = resized_pos_embed.squeeze(0).reshape( + D, -1).T # L'-1 D + + return torch.cat((cls_pos, resized_pos_embed), dim=0) + + +class CLIP(nn.Module): + """Custom implementation of CLIP model. + + Refer to: https://github.com/openai/CLIP + """ + + def __init__( + self, + embed_dim: int, + # vision + image_resolution: int, + vision_layers: Union[Tuple[int, int, int, int], int], + vision_width: int, + vision_patch_size: int, + # text + context_length: int, + vocab_size: int, + transformer_width: int, + transformer_heads: int, + transformer_layers: int, + # prompt + prompt_depth: int = 0, + prompt_length: int = 0, + ): + super().__init__() + + self.context_length = context_length + + self.image_resolution = image_resolution + + if isinstance(vision_layers, (tuple, list)): + assert prompt_length == 0 and prompt_depth == 0 + vision_heads = vision_width * 32 // 64 + self.visual = ModifiedResNet( + layers=vision_layers, + output_dim=embed_dim, + heads=vision_heads, + input_resolution=image_resolution, + width=vision_width) + else: + vision_heads = vision_width // 64 + self.visual = VisualTransformer( + input_resolution=image_resolution, + patch_size=vision_patch_size, + width=vision_width, + layers=vision_layers, + heads=vision_heads, + output_dim=embed_dim, + prompt_depth=prompt_depth, + prompt_length=prompt_length, + ) + + self.transformer = Transformer( + width=transformer_width, + layers=transformer_layers, + heads=transformer_heads, + attn_mask=self.build_attention_mask()) + + self.vocab_size = vocab_size + self.token_embedding = nn.Embedding(vocab_size, transformer_width) + self.positional_embedding = nn.Parameter( + torch.empty(self.context_length, transformer_width)) + self.ln_final = LayerNorm(transformer_width) + + self.text_projection = nn.Parameter( + torch.empty(transformer_width, embed_dim)) + self.logit_scale = nn.Parameter(torch.ones([])) + + def build_attention_mask(self): + """Create causal attention mask.""" + # lazily create causal attention mask, with full attention between + # the vision tokens pytorch uses additive attention mask; fill with + # -inf + mask = torch.empty(self.context_length, self.context_length) + mask.fill_(float('-inf')) + mask.triu_(1) # zero out the lower diagonal + return mask + + @property + def dtype(self): + """Return the dtype of the model.""" + return self.visual.conv1.weight.dtype + + def encode_image(self, image, masks=None, pool_mask=None, dense=False): + """Image encoding.""" + if pool_mask is not None: + return self.visual( + image.type(self.dtype), mask=pool_mask, dense=dense) + if masks is None: + return self.visual(image.type(self.dtype), dense=dense) + else: + return self.visual(image.type(self.dtype), masks.type(self.dtype)) + + def encode_text(self, text): + """Texts encoding.""" + x = self.token_embedding(text).type( + self.dtype) # [batch_size, n_ctx, d_model] + + x = x + self.positional_embedding.type(self.dtype) + x = x.permute(1, 0, 2) # NLD -> LND + x = self.transformer(x) + x = x.permute(1, 0, 2) # LND -> NLD + x = self.ln_final(x).type(self.dtype) + + # x.shape = [batch_size, n_ctx, transformer.width] + # take features from the eot embedding (eot_token is the highest number + # in each sequence) + x = x[torch.arange(x.shape[0]), + text.argmax(dim=-1)] @ self.text_projection + + return x + + def forward(self, image, text): + """ + Args: + image (torch.Tensor): input images. + text (torch.Tensor): input text. + """ + image_features = self.encode_image(image) + text_features = self.encode_text(text) + # import pdb; pdb.set_trace() + # normalized features + # image_features shape: [1, 1024] + image_features = image_features / image_features.norm( + dim=-1, keepdim=True) + text_features = text_features / text_features.norm( + dim=-1, keepdim=True) + + # cosine similarity as logits + logit_scale = self.logit_scale.exp() + logits_per_iamge = logit_scale * image_features @ text_features.t() + logits_per_text = logit_scale * text_features @ image_features.t() + + # shape = [global_batch_size, global_batch_size] + return logits_per_iamge, logits_per_text + + +def convert_weights(model: nn.Module): + """Convert applicable model parameters to fp16.""" + + def _convert_weights_to_fp16(layer): + if isinstance(layer, (nn.Conv1d, nn.Conv2d, nn.Linear)): + layer.weight.data = layer.weight.data.half() + if layer.bias is not None: + layer.bias.data = layer.bias.data.half() + + if isinstance(layer, nn.MultiheadAttention): + for attr in [ + *[f'{s}_proj_weight' for s in ['in', 'q', 'k', 'v']], + 'in_proj_bias', 'bias_k', 'bias_v' + ]: + tensor = getattr(layer, attr) + if tensor is not None: + tensor.data = tensor.data.half() + + for name in ['text_projection', 'proj']: + if hasattr(layer, name): + attr = getattr(layer, name) + if attr is not None: + attr.data = attr.data.half() + + model.apply(_convert_weights_to_fp16) + + +def build_model(state_dict: dict, prompt_depth=0, prompt_length=0): + """Build a CLIP model from given pretrained weights.""" + vit = 'visual.proj' in state_dict + + if vit: + vision_width = state_dict['visual.conv1.weight'].shape[0] + vision_layers = len([ + k for k in state_dict.keys() + if k.startswith('visual.') and k.endswith('.attn.in_proj_weight') + ]) + vision_patch_size = state_dict['visual.conv1.weight'].shape[-1] + grid_size = round( + (state_dict['visual.positional_embedding'].shape[0] - 1)**0.5) + image_resolution = vision_patch_size * grid_size + else: + counts: list = [ + len({ + k.split('.')[2] + for k in state_dict if k.startswith(f'visual.layer{b}') + }) for b in [1, 2, 3, 4] + ] + vision_layers = tuple(counts) + vision_width = state_dict['visual.layer1.0.conv1.weight'].shape[0] + output_width = round( + (state_dict['visual.attnpool.positional_embedding'].shape[0] - + 1)**0.5) + vision_patch_size = None + assert output_width**2 + 1 == state_dict[ + 'visual.attnpool.positional_embedding'].shape[0] + image_resolution = output_width * 32 + + embed_dim = state_dict['text_projection'].shape[1] + context_length = state_dict['positional_embedding'].shape[0] + vocab_size = state_dict['token_embedding.weight'].shape[0] + transformer_width = state_dict['ln_final.weight'].shape[0] + transformer_heads = transformer_width // 64 + transformer_layers = len({ + k.split('.')[2] + for k in state_dict if k.startswith('transformer.resblocks') + }) + + model = CLIP( + embed_dim, + image_resolution, + vision_layers, + vision_width, + vision_patch_size, + context_length, + vocab_size, + transformer_width, + transformer_heads, + transformer_layers, + prompt_depth=prompt_depth, + prompt_length=prompt_length, + ) + + for key in ['input_resolution', 'context_length', 'vocab_size']: + del state_dict[key] + + convert_weights(model) + model.load_state_dict(state_dict, strict=False) + return model.eval() diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_templates.py b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_templates.py new file mode 100644 index 0000000..bfc32df --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_templates.py @@ -0,0 +1,204 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +# Source: https://github.com/openai/CLIP. + +IMAGENET_TEMPLATES = [ + 'a bad photo of a {}.', + 'a photo of many {}.', + 'a sculpture of a {}.', + 'a photo of the hard to see {}.', + 'a low resolution photo of the {}.', + 'a rendering of a {}.', + 'graffiti of a {}.', + 'a bad photo of the {}.', + 'a cropped photo of the {}.', + 'a tattoo of a {}.', + 'the embroidered {}.', + 'a photo of a hard to see {}.', + 'a bright photo of a {}.', + 'a photo of a clean {}.', + 'a photo of a dirty {}.', + 'a dark photo of the {}.', + 'a drawing of a {}.', + 'a photo of my {}.', + 'the plastic {}.', + 'a photo of the cool {}.', + 'a close-up photo of a {}.', + 'a black and white photo of the {}.', + 'a painting of the {}.', + 'a painting of a {}.', + 'a pixelated photo of the {}.', + 'a sculpture of the {}.', + 'a bright photo of the {}.', + 'a cropped photo of a {}.', + 'a plastic {}.', + 'a photo of the dirty {}.', + 'a jpeg corrupted photo of a {}.', + 'a blurry photo of the {}.', + 'a photo of the {}.', + 'a good photo of the {}.', + 'a rendering of the {}.', + 'a {} in a video game.', + 'a photo of one {}.', + 'a doodle of a {}.', + 'a close-up photo of the {}.', + 'a photo of a {}.', + 'the origami {}.', + 'the {} in a video game.', + 'a sketch of a {}.', + 'a doodle of the {}.', + 'a origami {}.', + 'a low resolution photo of a {}.', + 'the toy {}.', + 'a rendition of the {}.', + 'a photo of the clean {}.', + 'a photo of a large {}.', + 'a rendition of a {}.', + 'a photo of a nice {}.', + 'a photo of a weird {}.', + 'a blurry photo of a {}.', + 'a cartoon {}.', + 'art of a {}.', + 'a sketch of the {}.', + 'a embroidered {}.', + 'a pixelated photo of a {}.', + 'itap of the {}.', + 'a jpeg corrupted photo of the {}.', + 'a good photo of a {}.', + 'a plushie {}.', + 'a photo of the nice {}.', + 'a photo of the small {}.', + 'a photo of the weird {}.', + 'the cartoon {}.', + 'art of the {}.', + 'a drawing of the {}.', + 'a photo of the large {}.', + 'a black and white photo of a {}.', + 'the plushie {}.', + 'a dark photo of a {}.', + 'itap of a {}.', + 'graffiti of the {}.', + 'a toy {}.', + 'itap of my {}.', + 'a photo of a cool {}.', + 'a photo of a small {}.', + 'a tattoo of the {}.', + # 'A photo of a {} in the scene.', +] + +# v1: 59.0875 +IMAGENET_TEMPLATES_SELECT = [ + 'itap of a {}.', + 'a bad photo of the {}.', + 'a origami {}.', + 'a photo of the large {}.', + 'a {} in a video game.', + 'art of the {}.', + 'a photo of the small {}.', + 'A photo of a {} in the scene', +] + +# v9 +IMAGENET_TEMPLATES_SELECT_CLIP = [ + 'a bad photo of the {}.', + 'a photo of the large {}.', + 'a photo of the small {}.', + 'a cropped photo of a {}.', + 'This is a photo of a {}', + 'This is a photo of a small {}', + 'This is a photo of a medium {}', + 'This is a photo of a large {}', + 'This is a masked photo of a {}', + 'This is a masked photo of a small {}', + 'This is a masked photo of a medium {}', + 'This is a masked photo of a large {}', + 'This is a cropped photo of a {}', + 'This is a cropped photo of a small {}', + 'This is a cropped photo of a medium {}', + 'This is a cropped photo of a large {}', + 'A photo of a {} in the scene', + 'a bad photo of the {} in the scene', + 'a photo of the large {} in the scene', + 'a photo of the small {} in the scene', + 'a cropped photo of a {} in the scene', + 'a photo of a masked {} in the scene', + 'There is a {} in the scene', + 'There is the {} in the scene', + 'This is a {} in the scene', + 'This is the {} in the scene', + 'This is one {} in the scene', + 'There is a masked {} in the scene', + 'There is the masked {} in the scene', + 'This is a masked {} in the scene', + 'This is the masked {} in the scene', + 'This is one masked {} in the scene', +] + +# v10, for comparison +# IMAGENET_TEMPLATES_SELECT_CLIP = [ +# 'a photo of a {}.', +# +# 'This is a photo of a {}', +# 'This is a photo of a small {}', +# 'This is a photo of a medium {}', +# 'This is a photo of a large {}', +# +# 'This is a photo of a {}', +# 'This is a photo of a small {}', +# 'This is a photo of a medium {}', +# 'This is a photo of a large {}', +# +# 'a photo of a {} in the scene', +# 'a photo of a {} in the scene', +# +# 'There is a {} in the scene', +# 'There is the {} in the scene', +# 'This is a {} in the scene', +# 'This is the {} in the scene', +# 'This is one {} in the scene', +# ] + +ViLD_templates = [ + 'There is {article} {category} in the scene.', + 'There is the {category} in the scene.', + 'a photo of {article} {category} in the scene.', + 'a photo of the {category} in the scene.', + 'a photo of one {category} in the scene.', 'itap of {article} {category}.', + 'itap of my {category}.', 'itap of the {category}.', + 'a photo of {article} {category}.', 'a photo of my {category}.', + 'a photo of the {category}.', 'a photo of one {category}.', + 'a photo of many {category}.', 'a good photo of {article} {category}.', + 'a good photo of the {category}.', 'a bad photo of {article} {category}.', + 'a bad photo of the {category}.', 'a photo of a nice {category}.', + 'a photo of the nice {category}.', 'a photo of a cool {category}.', + 'a photo of the cool {category}.', 'a photo of a weird {category}.', + 'a photo of the weird {category}.', 'a photo of a small {category}.', + 'a photo of the small {category}.', 'a photo of a large {category}.', + 'a photo of the large {category}.', 'a photo of a clean {category}.', + 'a photo of the clean {category}.', 'a photo of a dirty {category}.', + 'a photo of the dirty {category}.', + 'a bright photo of {article} {category}.', + 'a bright photo of the {category}.', + 'a dark photo of {article} {category}.', 'a dark photo of the {category}.', + 'a photo of a hard to see {category}.', + 'a photo of the hard to see {category}.', + 'a low resolution photo of {article} {category}.', + 'a low resolution photo of the {category}.', + 'a cropped photo of {article} {category}.', + 'a cropped photo of the {category}.', + 'a close-up photo of {article} {category}.', + 'a close-up photo of the {category}.', + 'a jpeg corrupted photo of {article} {category}.', + 'a jpeg corrupted photo of the {category}.', + 'a blurry photo of {article} {category}.', + 'a blurry photo of the {category}.', + 'a pixelated photo of {article} {category}.', + 'a pixelated photo of the {category}.', + 'a black and white photo of the {category}.', + 'a black and white photo of {article} {category}.', + 'a plastic {category}.', 'the plastic {category}.', 'a toy {category}.', + 'the toy {category}.', 'a plushie {category}.', 'the plushie {category}.', + 'a cartoon {category}.', 'the cartoon {category}.', + 'an embroidered {category}.', 'the embroidered {category}.', + 'a painting of the {category}.', 'a painting of a {category}.' +] diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_wrapper.py b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_wrapper.py new file mode 100644 index 0000000..f809d2b --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/clip_wrapper.py @@ -0,0 +1,275 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Referred to: https://github.com/KU-CVLAB/CAT-Seg/blob/main/cat_seg/third_party/clip.py # noqa +import hashlib +import os +import urllib +import warnings +from typing import List, Union + +import torch +from PIL import Image +from torchvision.transforms import (CenterCrop, Compose, Normalize, Resize, + ToTensor) +from tqdm import tqdm + +from .clip_model import build_model +from .tokenizer import SimpleTokenizer as _Tokenizer + +__all__ = ['available_models', 'load', 'tokenize'] +_tokenizer = _Tokenizer() + +_MODELS = { + 'RN50': + 'https://openaipublic.azureedge.net/clip/models/afeb0e10f9e5a86da6080e35cf09123aca3b358a0c3e3b6c78a7b63bc04b6762/RN50.pt', # noqa + 'RN101': + 'https://openaipublic.azureedge.net/clip/models/8fa8567bab74a42d41c5915025a8e4538c3bdbe8804a470a72f30b0d94fab599/RN101.pt', # noqa + 'RN50x4': + 'https://openaipublic.azureedge.net/clip/models/7e526bd135e493cef0776de27d5f42653e6b4c8bf9e0f653bb11773263205fdd/RN50x4.pt', # noqa + 'RN50x16': + 'https://openaipublic.azureedge.net/clip/models/52378b407f34354e150460fe41077663dd5b39c54cd0bfd2b27167a4a06ec9aa/RN50x16.pt', # noqa + 'RN50x64': + 'https://openaipublic.azureedge.net/clip/models/be1cfb55d75a9666199fb2206c106743da0f6468c9d327f3e0d0a543a9919d9c/RN50x64.pt', # noqa + 'ViT-B/32': + 'https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt', # noqa + 'ViT-B/16': + 'https://openaipublic.azureedge.net/clip/models/5806e77cd80f8b59890b7e101eabd078d9fb84e6937f9e85e4ecb61988df416f/ViT-B-16.pt', # noqa + 'ViT-L/14': + 'https://openaipublic.azureedge.net/clip/models/b8cca3fd41ae0c99ba7e8951adf17d267cdb84cd88be6f7c2e0eca1737a03836/ViT-L-14.pt', # noqa + 'ViT-L/14@336px': + 'https://openaipublic.azureedge.net/clip/models/3035c92b350959924f9f00213499208652fc7ea050643e8b385c2dac08641f02/ViT-L-14-336px.pt', # noqa +} + + +def _download(url: str, root: str = os.path.expanduser('~/.cache/clip')): + """Download clip pretrained weights.""" + os.makedirs(root, exist_ok=True) + filename = os.path.basename(url) + + expected_sha256 = url.split('/')[-2] + download_target = os.path.join(root, filename) + + if os.path.exists(download_target) and not os.path.isfile(download_target): + raise RuntimeError( + f'{download_target} exists and is not a regular file') + + if os.path.isfile(download_target): + if hashlib.sha256(open(download_target, + 'rb').read()).hexdigest() == expected_sha256: + return download_target + else: + warnings.warn( + f'{download_target} exists, but the SHA256 checksum does not\ + match; re-downloading the file') + + with urllib.request.urlopen(url) as source, open(download_target, + 'wb') as output: + with tqdm( + total=int(source.info().get('Content-Length')), + ncols=80) as loop: + while True: + buffer = source.read(8192) + if not buffer: + break + + output.write(buffer) + loop.update(len(buffer)) + + if hashlib.sha256(open(download_target, + 'rb').read()).hexdigest() != expected_sha256: + raise RuntimeError( + 'Model has been downloaded but the SHA256 checksum does not not\ + match') + + return download_target + + +def available_models(): + """Returns a list of available models.""" + return list(_MODELS.keys()) + + +def load(name: str, + device: Union[str, torch.device] = 'cuda' + if torch.cuda.is_available() else 'cpu', + jit=True, + prompt_depth=0, + prompt_length=0): + """Load target clip model.""" + if name not in _MODELS: + raise RuntimeError( + f'Model {name} not found; available models = {available_models()}') + + model_path = _download(_MODELS[name]) + model = torch.jit.load( + model_path, map_location=device if jit else 'cpu').eval() + n_px = model.input_resolution.item() + + transform = Compose([ + Resize(n_px, interpolation=Image.BICUBIC), + CenterCrop(n_px), + lambda image: image.convert('RGB'), + ToTensor(), + Normalize((0.48145466, 0.4578275, 0.40821073), + (0.26862954, 0.26130258, 0.27577711)), + ]) + + if not jit: + model = build_model(model.state_dict(), prompt_depth, + prompt_length).to(device) + return model, transform + + # patch the device names + device_holder = torch.jit.trace( + lambda: torch.ones([]).to(torch.device(device)), example_inputs=[]) + device_node = [ + n for n in device_holder.graph.findAllNodes('prim::Constant') + if 'Device' in repr(n) + ][-1] + + def patch_device(module): + graphs = [module.graph] if hasattr(module, 'graph') else [] + if hasattr(module, 'forward1'): + graphs.append(module.forward1.graph) + + for graph in graphs: + for node in graph.findAllNodes('prim::Constant'): + if 'value' in node.attributeNames() and str( + node['value']).startswith('cuda'): + node.copyAttributes(device_node) + + model.apply(patch_device) + patch_device(model.encode_image) + patch_device(model.encode_text) + + # patch dtype to float32 on CPU + if device == 'cpu': + float_holder = torch.jit.trace( + lambda: torch.ones([]).float(), example_inputs=[]) + float_input = list(float_holder.graph.findNode('aten::to').inputs())[1] + float_node = float_input.node() + + def patch_float(module): + graphs = [module.graph] if hasattr(module, 'graph') else [] + if hasattr(module, 'forward1'): + graphs.append(module.forward1.graph) + + for graph in graphs: + for node in graph.findAllNodes('aten::to'): + inputs = list(node.inputs()) + for i in [1, 2]: + # dtype can be the second or third argument to + # aten::to() + if inputs[i].node()['value'] == 5: + inputs[i].node().copyAttributes(float_node) + + model.apply(patch_float) + patch_float(model.encode_image) + patch_float(model.encode_text) + + model.float() + + return model, transform + + +def load_custom(name: str, + device: Union[str, torch.device] = 'cuda' + if torch.cuda.is_available() else 'cpu', + jit=True, + n_px=224): + """Load a customized clip model.""" + if name not in _MODELS: + raise RuntimeError( + f'Model {name} not found; available models = {available_models()}') + + model_path = _download(_MODELS[name]) + model = torch.jit.load( + model_path, map_location=device if jit else 'cpu').eval() + # n_px = model.input_resolution.item() + + transform = Compose([ + Resize(n_px, interpolation=Image.BICUBIC), + CenterCrop(n_px), + lambda image: image.convert('RGB'), + ToTensor(), + Normalize((0.48145466, 0.4578275, 0.40821073), + (0.26862954, 0.26130258, 0.27577711)), + ]) + + if not jit: + model = build_model(model.state_dict()).to(device) + return model, transform + + # patch the device names + device_holder = torch.jit.trace( + lambda: torch.ones([]).to(torch.device(device)), example_inputs=[]) + device_node = [ + n for n in device_holder.graph.findAllNodes('prim::Constant') + if 'Device' in repr(n) + ][-1] + + def patch_device(module): + graphs = [module.graph] if hasattr(module, 'graph') else [] + if hasattr(module, 'forward1'): + graphs.append(module.forward1.graph) + + for graph in graphs: + for node in graph.findAllNodes('prim::Constant'): + if 'value' in node.attributeNames() and str( + node['value']).startswith('cuda'): + node.copyAttributes(device_node) + + model.apply(patch_device) + patch_device(model.encode_image) + patch_device(model.encode_text) + + # patch dtype to float32 on CPU + if device == 'cpu': + float_holder = torch.jit.trace( + lambda: torch.ones([]).float(), example_inputs=[]) + float_input = list(float_holder.graph.findNode('aten::to').inputs())[1] + float_node = float_input.node() + + def patch_float(module): + graphs = [module.graph] if hasattr(module, 'graph') else [] + if hasattr(module, 'forward1'): + graphs.append(module.forward1.graph) + + for graph in graphs: + for node in graph.findAllNodes('aten::to'): + inputs = list(node.inputs()) + for i in [ + 1, 2 + ]: # dtype can be the second or third argument to + # aten::to() + if inputs[i].node()['value'] == 5: + inputs[i].node().copyAttributes(float_node) + + model.apply(patch_float) + patch_float(model.encode_image) + patch_float(model.encode_text) + + model.float() + + return model, transform + + +def tokenize(texts: Union[str, List[str]], context_length: int = 77): + """Convert texts to tokens.""" + if isinstance(texts, str): + texts = [texts] + + sot_token = _tokenizer.encoder['<|startoftext|>'] + eot_token = _tokenizer.encoder['<|endoftext|>'] + # encode each template text phrase + all_tokens = [[sot_token] + _tokenizer.encode(text) + [eot_token] + for text in texts] + result = torch.zeros(len(all_tokens), context_length, dtype=torch.long) + + for i, tokens in enumerate(all_tokens): + if len(tokens) > context_length: + raise RuntimeError( + f'Input {texts[i]} is too long for context length\ + {context_length}') + result[i, :len(tokens)] = torch.tensor(tokens) + + return result diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/self_attention_block.py b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/self_attention_block.py new file mode 100644 index 0000000..1c06cbd --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/self_attention_block.py @@ -0,0 +1,79 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from torch import nn as nn +from torch.nn import functional as F + + +class LinearAttention(nn.Module): + """Multi-Head linear attention proposed in "Transformers are RNNs". + + Source: https://github.com/KU-CVLAB/CAT-Seg/blob/main/cat_seg/modeling/transformer/model.py#L247 # noqa + """ + + def __init__(self, eps=1e-6): + super().__init__() + self.eps = eps + + def forward(self, queries, keys, values): + """ + Args: + queries: [N, L, H, D] + keys: [N, S, H, D] + values: [N, S, H, D] + q_mask: [N, L] + kv_mask: [N, S] + Returns: + queried_values: (N, L, H, D) + """ + Q = F.elu(queries) + 1 + K = F.elu(keys) + 1 + + v_length = values.size(1) + values = values / v_length # prevent fp16 overflow + KV = torch.einsum('nshd,nshv->nhdv', K, values) # (S,D)' @ S,V + Z = 1 / (torch.einsum('nlhd,nhd->nlh', Q, K.sum(dim=1)) + self.eps) + queried_values = torch.einsum('nlhd,nhdv,nlh->nlhv', Q, KV, + Z) * v_length + + return queried_values.contiguous() + + +class FullAttention(nn.Module): + """Multi-head scaled dot-product attention, a.k.a full attention. + + Source: https://github.com/KU-CVLAB/CAT-Seg/blob/main/cat_seg/modeling/transformer/model.py#L276 # noqa + """ + + def __init__(self, use_dropout=False, attention_dropout=0.1): + super().__init__() + self.use_dropout = use_dropout + self.dropout = nn.Dropout(attention_dropout) + + def forward(self, queries, keys, values, q_mask=None, kv_mask=None): + """ + Args: + queries: [N, L, H, D] + keys: [N, S, H, D] + values: [N, S, H, D] + q_mask: [N, L] + kv_mask: [N, S] + Returns: + queried_values: (N, L, H, D) + """ + + # Compute the unnormalized attention and apply the masks + QK = torch.einsum('nlhd,nshd->nlsh', queries, keys) + if kv_mask is not None: + QK.masked_fill_( + ~(q_mask[:, :, None, None] * kv_mask[:, None, :, None]), + float('-inf')) + + # Compute the attention and the weighted average + softmax_temp = 1. / queries.size(3)**.5 # sqrt(D) + A = torch.softmax(softmax_temp * QK, dim=2) + if self.use_dropout: + A = self.dropout(A) + + queried_values = torch.einsum('nlsh,nshd->nlhd', A, values) + + return queried_values.contiguous() diff --git a/mmsegmentation/projects/CAT-Seg/cat_seg/utils/tokenizer.py b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/tokenizer.py new file mode 100644 index 0000000..c84711b --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/cat_seg/utils/tokenizer.py @@ -0,0 +1,160 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import gzip +import html +import os +from functools import lru_cache + +import ftfy +import regex as re + + +@lru_cache() +def default_bpe(): + """Return default BPE vocabulary path.""" + return os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'bpe_vocab/bpe_simple_vocab_16e6.txt.gz') + + +@lru_cache() +def bytes_to_unicode(): + """Returns list of utf-8 byte and a corresponding list of unicode strings. + + The reversible bpe codes work on unicode strings. This means you need a + large # of unicode characters in your vocab if you want to avoid UNKs. When + you're at something like a 10B token dataset you end up needing around 5K + for decent coverage. This is a significant percentage of your normal, say, + 32K bpe vocab. To avoid that, we want lookup tables between utf-8 bytes and + unicode strings. And avoids mapping to whitespace/control characters the + bpe code barfs on. + """ + bs = list(range(ord('!'), + ord('~') + 1)) + list(range( + ord('ยก'), + ord('ยฌ') + 1)) + list(range(ord('ยฎ'), + ord('รฟ') + 1)) + cs = bs[:] + n = 0 + for b in range(2**8): + if b not in bs: + bs.append(b) + cs.append(2**8 + n) + n += 1 + cs = [chr(n) for n in cs] + return dict(zip(bs, cs)) + + +def get_pairs(word): + """Return set of symbol pairs in a word. + + Word is represented as tuple of symbols (symbols being variable-length + strings). + """ + pairs = set() + prev_char = word[0] + for char in word[1:]: + pairs.add((prev_char, char)) + prev_char = char + return pairs + + +def basic_clean(text): + """Clean string.""" + text = ftfy.fix_text(text) + text = html.unescape(html.unescape(text)) + return text.strip() + + +def whitespace_clean(text): + """Clean whitespace in string.""" + text = re.sub(r'\s+', ' ', text) + text = text.strip() + return text + + +class SimpleTokenizer: + """Customized Tokenizer implementation.""" + + def __init__(self, bpe_path: str = default_bpe()): + self.byte_encoder = bytes_to_unicode() + self.byte_decoder = {v: k for k, v in self.byte_encoder.items()} + merges = gzip.open(bpe_path).read().decode('utf-8').split('\n') + merges = merges[1:49152 - 256 - 2 + 1] + merges = [tuple(merge.split()) for merge in merges] + vocab = list(bytes_to_unicode().values()) + vocab = vocab + [v + '' for v in vocab] + for merge in merges: + vocab.append(''.join(merge)) + vocab.extend(['<|startoftext|>', '<|endoftext|>']) + self.encoder = dict(zip(vocab, range(len(vocab)))) + self.decoder = {v: k for k, v in self.encoder.items()} + self.bpe_ranks = dict(zip(merges, range(len(merges)))) + self.cache = { + '<|startoftext|>': '<|startoftext|>', + '<|endoftext|>': '<|endoftext|>' + } + self.pat = re.compile( + r"""<\|startoftext\|>|<\|endoftext\|>|'s|'t|'re|'ve|'m|\ + 'll|'d|[\p{L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", re.IGNORECASE) + + def bpe(self, token): + """Refer to bpe vocabulary dictionary.""" + if token in self.cache: + return self.cache[token] + word = tuple(token[:-1]) + (token[-1] + '', ) + pairs = get_pairs(word) + + if not pairs: + return token + '' + + while True: + bigram = min( + pairs, key=lambda pair: self.bpe_ranks.get(pair, float('inf'))) + if bigram not in self.bpe_ranks: + break + first, second = bigram + new_word = [] + i = 0 + while i < len(word): + try: + j = word.index(first, i) + new_word.extend(word[i:j]) + i = j + except ValueError: + new_word.extend(word[i:]) + break + + if word[i] == first and i < len(word) - 1 and word[ + i + 1] == second: + new_word.append(first + second) + i += 2 + else: + new_word.append(word[i]) + i += 1 + new_word = tuple(new_word) + word = new_word + if len(word) == 1: + break + else: + pairs = get_pairs(word) + word = ' '.join(word) + self.cache[token] = word + return word + + def encode(self, text): + """Encode text strings.""" + bpe_tokens = [] + text = whitespace_clean(basic_clean(text)).lower() + for token in re.findall(self.pat, text): + token = ''.join(self.byte_encoder[b] + for b in token.encode('utf-8')) + bpe_tokens.extend(self.encoder[bpe_token] + for bpe_token in self.bpe(token).split(' ')) + return bpe_tokens + + def decode(self, tokens): + """Decoder tokens to strings.""" + text = ''.join([self.decoder[token] for token in tokens]) + text = bytearray([self.byte_decoder[c] for c in text]).decode( + 'utf-8', errors='replace').replace('', ' ') + return text diff --git a/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/ade20k_384x384.py b/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/ade20k_384x384.py new file mode 100644 index 0000000..488ba3d --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/ade20k_384x384.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +crop_size = (384, 384) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/coco-stuff164k_384x384.py b/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/coco-stuff164k_384x384.py new file mode 100644 index 0000000..dd05176 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/coco-stuff164k_384x384.py @@ -0,0 +1,62 @@ +# dataset settings +dataset_type = 'COCOStuffDataset' +data_root = 'data/coco_stuff164k' +crop_size = (384, 384) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/train2017', seg_map_path='annotations/train2017'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/val2017', seg_map_path='annotations/val2017'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/pascal_context_59_384x384.py b/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/pascal_context_59_384x384.py new file mode 100644 index 0000000..250c599 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/_base_/datasets/pascal_context_59_384x384.py @@ -0,0 +1,72 @@ +# dataset settings +dataset_type = 'PascalContextDataset59' +data_root = 'data/VOCdevkit/VOC2010/' + +img_scale = (520, 520) +crop_size = (384, 384) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/train.txt', + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='JPEGImages', seg_map_path='SegmentationClassContext'), + ann_file='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/CAT-Seg/configs/_base_/default_runtime.py b/mmsegmentation/projects/CAT-Seg/configs/_base_/default_runtime.py new file mode 100644 index 0000000..272b4d2 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/_base_/default_runtime.py @@ -0,0 +1,15 @@ +default_scope = 'mmseg' +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +vis_backends = [dict(type='LocalVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +log_processor = dict(by_epoch=False) +log_level = 'INFO' +load_from = None +resume = False + +tta_model = dict(type='SegTTAModel') diff --git a/mmsegmentation/projects/CAT-Seg/configs/_base_/schedules/schedule_80k.py b/mmsegmentation/projects/CAT-Seg/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000..0dcd6c4 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,24 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=80000, + by_epoch=False) +] +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=8000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=8000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_ade20k-384x384.py b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_ade20k-384x384.py new file mode 100644 index 0000000..bab43a6 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_ade20k-384x384.py @@ -0,0 +1,103 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py', + '../_base_/datasets/ade20k_384x384.py' +] + +custom_imports = dict(imports=['cat_seg']) + +norm_cfg = dict(type='SyncBN', requires_grad=True) +crop_size = (384, 384) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + # due to the clip model, we do normalization in backbone forward() + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +# model_cfg +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='CLIPOVCATSeg', + feature_extractor=dict( + type='ResNet', + depth=101, + # only use the first three layers + num_stages=3, + out_indices=(0, 1, 2), + dilations=(1, 1, 1), + strides=(1, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True, + init_cfg=dict( + type='Pretrained', checkpoint='torchvision://resnet101'), + ), + train_class_json='data/ade150.json', + test_class_json='data/ade150.json', + clip_pretrained='ViT-B/16', + clip_finetune='attention', + ), + neck=dict( + type='CATSegAggregator', + appearance_guidance_dim=1024, + num_layers=2, + pooling_size=(1, 1), + ), + decode_head=dict( + type='CATSegHead', + in_channels=128, + channels=128, + num_classes=150, + embed_dims=128, + decoder_dims=(64, 32), + decoder_guidance_dims=(512, 256), + decoder_guidance_proj_dims=(32, 16), + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', stride=crop_size, crop_size=crop_size)) + +# dataset settings +train_dataloader = dict( + batch_size=2, + num_workers=4, +) + +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=4000) + +default_hooks = dict( + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), + visualization=dict(type='SegVisualizationHook', draw=True, interval=4000)) + +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0002, betas=(0.9, 0.999), weight_decay=0.0001), + paramwise_cfg=dict( + custom_keys={ + 'backbone.feature_extractor': dict(lr_mult=0.01), + 'backbone.clip_model.visual': dict(lr_mult=0.01) + })) + +# learning policy +param_scheduler = [ + # Use a linear warm-up at [0, 100) iterations + dict(type='LinearLR', start_factor=0.01, by_epoch=False, begin=0, end=500), + # Use a cosine learning rate at [100, 900) iterations + dict( + type='CosineAnnealingLR', + T_max=79500, + by_epoch=False, + begin=500, + end=80000), +] diff --git a/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_pascal-context-59-384x384.py b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_pascal-context-59-384x384.py new file mode 100644 index 0000000..8b412cb --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb1-warmcoslr2e-4-adamw-80k_pascal-context-59-384x384.py @@ -0,0 +1,103 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py', + '../_base_/datasets/pascal_context_59_384x384.py' +] + +custom_imports = dict(imports=['cat_seg']) + +norm_cfg = dict(type='SyncBN', requires_grad=True) +crop_size = (384, 384) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + # due to the clip model, we do normalization in backbone forward() + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +# model_cfg +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='CLIPOVCATSeg', + feature_extractor=dict( + type='ResNet', + depth=101, + # only use the first three layers + num_stages=3, + out_indices=(0, 1, 2), + dilations=(1, 1, 1), + strides=(1, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True, + init_cfg=dict( + type='Pretrained', checkpoint='torchvision://resnet101'), + ), + train_class_json='data/pc59.json', + test_class_json='data/pc59.json', + clip_pretrained='ViT-B/16', + clip_finetune='attention', + ), + neck=dict( + type='CATSegAggregator', + appearance_guidance_dim=1024, + num_layers=2, + pooling_size=(1, 1), + ), + decode_head=dict( + type='CATSegHead', + in_channels=128, + channels=128, + num_classes=59, + embed_dims=128, + decoder_dims=(64, 32), + decoder_guidance_dims=(512, 256), + decoder_guidance_proj_dims=(32, 16), + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', stride=crop_size, crop_size=crop_size)) + +# dataset settings +train_dataloader = dict( + batch_size=2, + num_workers=4, +) + +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=4000) + +default_hooks = dict( + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), + visualization=dict(type='SegVisualizationHook', draw=True, interval=4000)) + +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0002, betas=(0.9, 0.999), weight_decay=0.0001), + paramwise_cfg=dict( + custom_keys={ + 'backbone.feature_extractor': dict(lr_mult=0.01), + 'backbone.clip_model.visual': dict(lr_mult=0.01) + })) + +# learning policy +param_scheduler = [ + # Use a linear warm-up at [0, 100) iterations + dict(type='LinearLR', start_factor=0.01, by_epoch=False, begin=0, end=500), + # Use a cosine learning rate at [100, 900) iterations + dict( + type='CosineAnnealingLR', + T_max=79500, + by_epoch=False, + begin=500, + end=80000), +] diff --git a/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb2-warmcoslr2e-4-adamw-80k_coco-stuff164k-384x384.py b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb2-warmcoslr2e-4-adamw-80k_coco-stuff164k-384x384.py new file mode 100644 index 0000000..52bf712 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitb-r101_4xb2-warmcoslr2e-4-adamw-80k_coco-stuff164k-384x384.py @@ -0,0 +1,102 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py', + '../_base_/datasets/coco-stuff164k_384x384.py' +] + +custom_imports = dict(imports=['cat_seg']) + +norm_cfg = dict(type='SyncBN', requires_grad=True) +crop_size = (384, 384) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + # due to the clip model, we do normalization in backbone forward() + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +# model_cfg +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='CLIPOVCATSeg', + feature_extractor=dict( + type='ResNet', + depth=101, + # only use the first three layers + num_stages=3, + out_indices=(0, 1, 2), + dilations=(1, 1, 1), + strides=(1, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True, + init_cfg=dict( + type='Pretrained', checkpoint='torchvision://resnet101'), + ), + train_class_json='data/coco.json', + test_class_json='data/coco.json', + clip_pretrained='ViT-B/16', + clip_finetune='attention', + ), + neck=dict( + type='CATSegAggregator', + appearance_guidance_dim=1024, + num_layers=2, + ), + decode_head=dict( + type='CATSegHead', + in_channels=128, + channels=128, + num_classes=171, + embed_dims=128, + decoder_dims=(64, 32), + decoder_guidance_dims=(512, 256), + decoder_guidance_proj_dims=(32, 16), + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', stride=crop_size, crop_size=crop_size)) + +# dataset settings +train_dataloader = dict( + batch_size=2, + num_workers=4, +) + +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=4000) + +default_hooks = dict( + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=4000), + visualization=dict(type='SegVisualizationHook', draw=True, interval=4000)) + +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0002, betas=(0.9, 0.999), weight_decay=0.0001), + paramwise_cfg=dict( + custom_keys={ + 'backbone.feature_extractor': dict(lr_mult=0.01), + 'backbone.clip_model.visual': dict(lr_mult=0.01) + })) + +# learning policy +param_scheduler = [ + # Use a linear warm-up at [0, 100) iterations + dict(type='LinearLR', start_factor=0.01, by_epoch=False, begin=0, end=500), + # Use a cosine learning rate at [100, 900) iterations + dict( + type='CosineAnnealingLR', + T_max=79500, + by_epoch=False, + begin=500, + end=80000), +] diff --git a/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitg-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitg-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py new file mode 100644 index 0000000..345945d --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitg-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py @@ -0,0 +1,11 @@ +_base_ = './catseg_vitl-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py' # noqa + +model = dict( + backbone=dict( + type='CLIPOVCATSeg', + clip_pretrained='ViT-G', + custom_clip_weights='~/CLIP-ViT-bigG-14-laion2B-39B-b160k'), + neck=dict( + text_guidance_dim=1280, + appearance_guidance_dim=512, + )) diff --git a/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vith-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vith-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py new file mode 100644 index 0000000..2f09b8c --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vith-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py @@ -0,0 +1,11 @@ +_base_ = './catseg_vitl-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py' # noqa + +model = dict( + backbone=dict( + type='CLIPOVCATSeg', + clip_pretrained='ViT-H', + custom_clip_weights='~/CLIP-ViT-H-14-laion2B-s32B-b79K'), + neck=dict( + text_guidance_dim=1024, + appearance_guidance_dim=512, + )) diff --git a/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitl-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitl-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py new file mode 100644 index 0000000..bb4d57a --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/configs/cat_seg/catseg_vitl-swin-b_4xb1-warmcoslr2e-4_adamw-80k_coco-stuff164k_384x384.py @@ -0,0 +1,72 @@ +_base_ = './catseg_vitb-r101_4xb2-warmcoslr2e-4-adamw-80k_coco-stuff164k-384x384.py' # noqa + +pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_20220317-55b0104a.pth' # noqa +crop_size = (384, 384) +data_preprocessor = dict(size=crop_size) +model = dict( + backbone=dict( + type='CLIPOVCATSeg', + feature_extractor=dict( + _delete_=True, + type='SwinTransformer', + pretrain_img_size=384, + embed_dims=128, + depths=[2, 2, 18], + num_heads=[4, 8, 16], + window_size=12, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2), + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + clip_pretrained='ViT-L/14@336px', + ), + neck=dict( + text_guidance_dim=768, + appearance_guidance_dim=512, + ), + decode_head=dict( + embed_dims=128, + decoder_guidance_dims=(256, 128), + )) + +# dataset settings +train_dataloader = dict( + batch_size=1, + num_workers=2, +) + +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=4000) + +default_hooks = dict( + visualization=dict(type='SegVisualizationHook', draw=True, interval=4000)) + +# optimizer +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.0002, betas=(0.9, 0.999), weight_decay=0.0001), + paramwise_cfg=dict( + custom_keys={ + 'backbone.feature_extractor': dict(lr_mult=0.01), + 'backbone.clip_model.visual': dict(lr_mult=0.01) + })) + +# learning policy +param_scheduler = [ + # Use a linear warm-up at [0, 100) iterations + dict(type='LinearLR', start_factor=0.01, by_epoch=False, begin=0, end=500), + # Use a cosine learning rate at [100, 900) iterations + dict( + type='CosineAnnealingLR', + T_max=79500, + by_epoch=False, + begin=500, + end=80000), +] diff --git a/mmsegmentation/projects/CAT-Seg/utils/__init__.py b/mmsegmentation/projects/CAT-Seg/utils/__init__.py new file mode 100644 index 0000000..02d85f2 --- /dev/null +++ b/mmsegmentation/projects/CAT-Seg/utils/__init__.py @@ -0,0 +1,7 @@ +from .clip_templates import (IMAGENET_TEMPLATES, IMAGENET_TEMPLATES_SELECT, + IMAGENET_TEMPLATES_SELECT_CLIP, ViLD_templates) + +__all__ = [ + 'IMAGENET_TEMPLATES', 'IMAGENET_TEMPLATES_SELECT', + 'IMAGENET_TEMPLATES_SELECT_CLIP', 'ViLD_templates' +] diff --git a/mmsegmentation/projects/README.md b/mmsegmentation/projects/README.md new file mode 100644 index 0000000..5482c47 --- /dev/null +++ b/mmsegmentation/projects/README.md @@ -0,0 +1,19 @@ +# Projects + +The OpenMMLab ecosystem can only grow through the contributions of the community. +Everyone is welcome to post their implementation of any great ideas in this folder! If you wish to start your own project, please go through the [example project](example_project/) for the best practice. For common questions about projects, please read our [faq](faq.md). + +## External Projects + +There are also selected external projects released in the community that use MMSegmentation: + +- [SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation](https://github.com/visual-attention-network/segnext) +- [Vision Transformer Adapter for Dense Predictions](https://github.com/czczup/ViT-Adapter) +- [UniFormer: Unifying Convolution and Self-attention for Visual Recognition](https://github.com/Sense-X/UniFormer) +- [Multi-Scale High-Resolution Vision Transformer for Semantic Segmentation](https://github.com/facebookresearch/HRViT) +- [ViTAE: Vision Transformer Advanced by Exploring Intrinsic Inductive Bias](https://github.com/ViTAE-Transformer/ViTAE-Transformer) +- [DAFormer: Improving Network Architectures and Training Strategies for Domain-Adaptive Semantic Segmentation](https://github.com/lhoyer/DAFormer) +- [MPViT : Multi-Path Vision Transformer for Dense Prediction](https://github.com/youngwanLEE/MPViT) +- [TopFormer: Token Pyramid Transformer for Mobile Semantic Segmentation](https://github.com/hustvl/TopFormer) + +Note: These projects are supported and maintained by their own contributors. The core maintainers of MMSegmentation only ensure the results are reproducible and the code quality meets its claim at the time each project was submitted, but they may not be responsible for future maintenance. diff --git a/mmsegmentation/projects/XDecoder/README.md b/mmsegmentation/projects/XDecoder/README.md new file mode 100644 index 0000000..3d55575 --- /dev/null +++ b/mmsegmentation/projects/XDecoder/README.md @@ -0,0 +1,17 @@ +# X-Decoder + +> [X-Decoder: Generalized Decoding for Pixel, Image, and Language](https://arxiv.org/pdf/2212.11270.pdf) + + + +## Abstract + +We present X-Decoder, a generalized decoding model that can predict pixel-level segmentation and language tokens seamlessly. X-Decodert takes as input two types of queries: (i) generic non-semantic queries and (ii) semantic queries induced from text inputs, to decode different pixel-level and token-level outputs in the same semantic space. With such a novel design, X-Decoder is the first work that provides a unified way to support all types of image segmentation and a variety of vision-language (VL) tasks. Further, our design enables seamless interactions across tasks at different granularities and brings mutual benefits by learning a common and rich pixel-level visual-semantic understanding space, without any pseudo-labeling. After pretraining on a mixed set of a limited amount of segmentation data and millions of image-text pairs, X-Decoder exhibits strong transferability to a wide range of downstream tasks in both zero-shot and finetuning settings. Notably, it achieves (1) state-of-the-art results on open-vocabulary segmentation and referring segmentation on eight datasets; (2) better or competitive finetuned performance to other generalist and specialist models on segmentation and VL tasks; and (3) flexibility for efficient finetuning and novel task composition (e.g., referring captioning and image editing). + +

+ +
+ +## Usage + +We implement it based on [mmdetection](https://github.com/open-mmlab/mmdetection/), please refer to [mmdetection/projects/XDecoder](https://github.com/open-mmlab/mmdetection/tree/main/projects/XDecoder) for more details. diff --git a/mmsegmentation/projects/bdd100k_dataset/README.md b/mmsegmentation/projects/bdd100k_dataset/README.md new file mode 100644 index 0000000..c774525 --- /dev/null +++ b/mmsegmentation/projects/bdd100k_dataset/README.md @@ -0,0 +1,50 @@ +# BDD100K Dataset + +Support **`BDD100K Dataset`** + +## Description + +Author: CastleDream + +This project implements **`BDD100K Dataset`** + +### Dataset preparing + +Preparing `BDD100K Dataset` dataset following [BDD100K Dataset Preparing Guide](https://github.com/open-mmlab/mmsegmentation/tree/main/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md#bdd100k) + +```none +mmsegmentation/data +โ””โ”€โ”€ bdd100k + โ”œโ”€โ”€ images + โ”‚ โ””โ”€โ”€ 10k + โ”‚ โ”œโ”€โ”€ test [2000 entries exceeds filelimit, not opening dir] + โ”‚ โ”œโ”€โ”€ train [7000 entries exceeds filelimit, not opening dir] + โ”‚ โ””โ”€โ”€ val [1000 entries exceeds filelimit, not opening dir] + โ””โ”€โ”€ labels + โ””โ”€โ”€ sem_seg + โ”œโ”€โ”€ colormaps + โ”‚ โ”œโ”€โ”€ train [7000 entries exceeds filelimit, not opening dir] + โ”‚ โ””โ”€โ”€ val [1000 entries exceeds filelimit, not opening dir] + โ”œโ”€โ”€ masks + โ”‚ โ”œโ”€โ”€ train [7000 entries exceeds filelimit, not opening dir] + โ”‚ โ””โ”€โ”€ val [1000 entries exceeds filelimit, not opening dir] + โ”œโ”€โ”€ polygons + โ”‚ โ”œโ”€โ”€ sem_seg_train.json + โ”‚ โ””โ”€โ”€ sem_seg_val.json + โ””โ”€โ”€ rles + โ”œโ”€โ”€ sem_seg_train.json + โ””โ”€โ”€ sem_seg_val.json +``` + +### Training commands + +```bash +%cd mmsegmentation +!python tools/train.py projects/bdd100k_dataset/configs/pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py\ +--work-dir your_work_dir +``` + +## Thanks + +- [\[Datasets\] Add Mapillary Vistas Datasets to MMSeg Core Package. #2576](https://github.com/open-mmlab/mmsegmentation/pull/2576/files) +- [\[Feature\] Support CIHP dataset #1493](https://github.com/open-mmlab/mmsegmentation/pull/1493/files) diff --git a/mmsegmentation/projects/bdd100k_dataset/configs/_base_/datasets/bdd100k.py b/mmsegmentation/projects/bdd100k_dataset/configs/_base_/datasets/bdd100k.py new file mode 100644 index 0000000..24cec69 --- /dev/null +++ b/mmsegmentation/projects/bdd100k_dataset/configs/_base_/datasets/bdd100k.py @@ -0,0 +1,70 @@ +# dataset settings +dataset_type = 'BDD100KDataset' +data_root = 'data/bdd100k/' + +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=2, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/10k/train', + seg_map_path='labels/sem_seg/masks/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/10k/val', + seg_map_path='labels/sem_seg/masks/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/bdd100k_dataset/configs/pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py b/mmsegmentation/projects/bdd100k_dataset/configs/pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py new file mode 100644 index 0000000..456d4c7 --- /dev/null +++ b/mmsegmentation/projects/bdd100k_dataset/configs/pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py @@ -0,0 +1,11 @@ +_base_ = [ + '../../../configs/_base_/models/pspnet_r50-d8.py', + './_base_/datasets/bdd100k.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_80k.py' +] +custom_imports = dict( + imports=['projects.bdd100k_dataset.mmseg.datasets.bdd100k']) +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/mmsegmentation/projects/bdd100k_dataset/docs/en/user_guides/2_dataset_prepare.md b/mmsegmentation/projects/bdd100k_dataset/docs/en/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..f2383cf --- /dev/null +++ b/mmsegmentation/projects/bdd100k_dataset/docs/en/user_guides/2_dataset_prepare.md @@ -0,0 +1,40 @@ +## BDD100K + +- You could download BDD100k datasets from [here](https://bdd-data.berkeley.edu/) after registration. + +- You can download images and masks by clicking `10K Images` button and `Segmentation` button. + +- After download, unzip by the following instructions: + + ```bash + unzip ~/bdd100k_images_10k.zip -d ~/mmsegmentation/data/ + unzip ~/bdd100k_sem_seg_labels_trainval.zip -d ~/mmsegmentation/data/ + ``` + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ bdd100k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ 10k +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ val +โ”‚ โ”‚ โ””โ”€โ”€ labels +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ sem_seg +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ colormaps +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ polygons +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ rles +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +``` diff --git a/mmsegmentation/projects/bdd100k_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md b/mmsegmentation/projects/bdd100k_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..64fb763 --- /dev/null +++ b/mmsegmentation/projects/bdd100k_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md @@ -0,0 +1,42 @@ +## BDD100K + +- ๅฏไปฅไปŽ[ๅฎ˜ๆ–น็ฝ‘็ซ™](https://bdd-data.berkeley.edu/) ไธ‹่ฝฝ BDD100Kๆ•ฐๆฎ้›†๏ผˆ่ฏญไน‰ๅˆ†ๅ‰ฒไปปๅŠกไธป่ฆๆ˜ฏ10Kๆ•ฐๆฎ้›†๏ผ‰๏ผŒๆŒ‰็…งๅฎ˜็ฝ‘่ฆๆฑ‚ๆณจๅ†Œๅนถ็™ป้™†ๅŽ๏ผŒๆ•ฐๆฎๅฏไปฅๅœจ[่ฟ™้‡Œ](https://bdd-data.berkeley.edu/portal.html#download)ๆ‰พๅˆฐใ€‚ + +- ๅ›พๅƒๆ•ฐๆฎๅฏนๅบ”็š„ๅ็งฐๆ˜ฏๆ˜ฏ`10K Images`, ่ฏญไน‰ๅˆ†ๅ‰ฒๆ ‡ๆณจๅฏนๅบ”็š„ๅ็งฐๆ˜ฏ`Segmentation` + +- ไธ‹่ฝฝๅŽ๏ผŒๅฏไปฅไฝฟ็”จไปฅไธ‹ไปฃ็ ่ฟ›่กŒ่งฃๅŽ‹ + + ```bash + unzip ~/bdd100k_images_10k.zip -d ~/mmsegmentation/data/ + unzip ~/bdd100k_sem_seg_labels_trainval.zip -d ~/mmsegmentation/data/ + ``` + +ๅฐฑๅฏไปฅๅพ—ๅˆฐไปฅไธ‹ๆ–‡ไปถ็ป“ๆž„ไบ†๏ผš + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ bdd100k +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ 10k +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ val +โ”‚ โ”‚ โ””โ”€โ”€ labels +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ sem_seg +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ colormaps +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€train +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€val +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ polygons +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +| โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ rles +| โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€sem_seg_train.json +| โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€sem_seg_val.json +``` diff --git a/mmsegmentation/projects/bdd100k_dataset/mmseg/datasets/bdd100k.py b/mmsegmentation/projects/bdd100k_dataset/mmseg/datasets/bdd100k.py new file mode 100644 index 0000000..e536de7 --- /dev/null +++ b/mmsegmentation/projects/bdd100k_dataset/mmseg/datasets/bdd100k.py @@ -0,0 +1,31 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +from mmseg.datasets.basesegdataset import BaseSegDataset + +# from mmseg.registry import DATASETS +# @DATASETS.register_module() + + +class BDD100KDataset(BaseSegDataset): + METAINFO = dict( + classes=('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', + 'sky', 'person', 'rider', 'car', 'truck', 'bus', 'train', + 'motorcycle', 'bicycle'), + palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, + 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], + [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70], + [0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/example_project/README.md b/mmsegmentation/projects/example_project/README.md new file mode 100644 index 0000000..e4fd03c --- /dev/null +++ b/mmsegmentation/projects/example_project/README.md @@ -0,0 +1,134 @@ +# Dummy ResNet Wrapper + +> A README.md template for releasing a project. +> +> All the fields in this README are **mandatory** for others to understand what you have achieved in this implementation. +> Please read our [Projects FAQ](../faq.md) if you still feel unclear about the requirements, or raise an [issue](https://github.com/open-mmlab/mmsegmentation/issues) to us! + +## Description + +> Share any information you would like others to know. For example: +> +> Author: @xxx. +> +> This is an implementation of \[XXX\]. + +Author๏ผš @xxx. + +This project implements a dummy ResNet wrapper, which literally does nothing new but prints "hello world" during initialization. + +## Usage + +> For a typical model, this section should contain the commands for training and testing. +> You are also suggested to dump your environment specification to env.yml by `conda env export > env.yml`. + +### Prerequisites + +- Python 3.7 +- PyTorch 1.6 or higher +- [MIM](https://github.com/open-mmlab/mim) v0.33 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc2 or higher + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `example_project/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Training commands + +```shell +mim train mmsegmentation configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py --work-dir work_dirs/dummy_resnet +``` + +To train on multiple GPUs, e.g. 8 GPUs, run the following command: + +```shell +mim train mmsegmentation configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py --work-dir work_dirs/dummy_resnet --launcher pytorch --gpus 8 +``` + +### Testing commands + +```shell +mim test mmsegmentation configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py --work-dir work_dirs/dummy_resnet --checkpoint ${CHECKPOINT_PATH} +``` + +> List the results as usually done in other model's README. \[Example\](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/fcn#results-and-models +> You should claim whether this is based on the pre-trained weights, which are converted from the official release; or it's a reproduced result obtained from retraining the model in this project + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ----: | ------------: | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | R-50-D8 | 512x1024 | 40000 | 5.7 | 4.17 | 72.25 | 73.36 | [config](configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608.log.json) | + +## Citation + +> You may remove this section if not applicable. + +```bibtex +@misc{mmseg2020, + title={{MMSegmentation}: OpenMMLab Semantic Segmentation Toolbox and Benchmark}, + author={MMSegmentation Contributors}, + howpublished = {\url{https://github.com/open-mmlab/mmsegmentation}}, + year={2020} +} +``` + +## Checklist + +Here is a checklist illustrating a usual development workflow of a successful project, and also serves as an overview of this project's progress. + +> The PIC (person in charge) or contributors of this project should check all the items that they believe have been finished, which will further be verified by codebase maintainers via a PR. + +> OpenMMLab's maintainer will review the code to ensure the project's quality. Reaching the first milestone means that this project suffices the minimum requirement of being merged into 'projects/'. But this project is only eligible to become a part of the core package upon attaining the last milestone. + +> Note that keeping this section up-to-date is crucial not only for this project's developers but the entire community, since there might be some other contributors joining this project and deciding their starting point from this list. It also helps maintainers accurately estimate time and effort on further code polishing, if needed. + +> A project does not necessarily have to be finished in a single PR, but it's essential for the project to at least reach the first milestone in its very first PR. + +- [ ] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [ ] Finish the code + +> The code's design shall follow existing interfaces and convention. For example, each model component should be registered into `mmseg.registry.MODELS` and configurable via a config file. + +- [ ] Basic docstrings & proper citation + +> Each major object should contain a docstring, describing its functionality and arguments. If you have adapted the code from other open-source projects, don't forget to cite the source project in docstring and make sure your behavior is not against its license. Typically, we do not accept any code snippet under GPL license. [A Short Guide to Open Source Licenses](https://medium.com/nationwide-technology/a-short-guide-to-open-source-licenses-cf5b1c329edd) + +- [ ] Test-time correctness + +> If you are reproducing the result from a paper, make sure your model's inference-time performance matches that in the original paper. The weights usually could be obtained by simply renaming the keys in the official pre-trained weights. This test could be skipped though, if you are able to prove the training-time correctness and check the second milestone. + +- [ ] A full README + +> As this template does. + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +> If you are reproducing the result from a paper, checking this item means that you should have trained your model from scratch based on the original paper's specification and verified that the final result matches the report within a minor error range. + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + +> Ideally *all* the methods should have [type hints](https://www.pythontutorial.net/python-basics/python-type-hints/) and [docstrings](https://google.github.io/styleguide/pyguide.html#381-docstrings). [Example](https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/utils/io.py#L9) + +- [ ] Unit tests + +> Unit tests for each module are required. [Example](https://github.com/open-mmlab/mmsegmentation/blob/main/tests/test_utils/test_io.py#L14) + +- [ ] Code polishing + +> Refactor your code according to reviewer's comment. + +- [ ] Metafile.yml + +> It will be parsed by MIM and Inferencer. [Example](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/fcn.yml) + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +> In particular, you may have to refactor this README into a standard one. [Example](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/fcn/README.md) + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..4301536 --- /dev/null +++ b/mmsegmentation/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,8 @@ +_base_ = ['mmseg::fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py'] + +custom_imports = dict(imports=['dummy']) + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, backbone=dict(type='DummyResNet')) diff --git a/mmsegmentation/projects/example_project/dummy/__init__.py b/mmsegmentation/projects/example_project/dummy/__init__.py new file mode 100644 index 0000000..70df789 --- /dev/null +++ b/mmsegmentation/projects/example_project/dummy/__init__.py @@ -0,0 +1,3 @@ +from .dummy_resnet import DummyResNet + +__all__ = ['DummyResNet'] diff --git a/mmsegmentation/projects/example_project/dummy/dummy_resnet.py b/mmsegmentation/projects/example_project/dummy/dummy_resnet.py new file mode 100644 index 0000000..a510eaf --- /dev/null +++ b/mmsegmentation/projects/example_project/dummy/dummy_resnet.py @@ -0,0 +1,14 @@ +from mmseg.models.backbones import ResNetV1c +from mmseg.registry import MODELS + + +@MODELS.register_module() +class DummyResNet(ResNetV1c): + """Implements a dummy ResNet wrapper for demonstration purpose. + Args: + **kwargs: All the arguments are passed to the parent class. + """ + + def __init__(self, **kwargs) -> None: + print('Hello world!') + super().__init__(**kwargs) diff --git a/mmsegmentation/projects/faq.md b/mmsegmentation/projects/faq.md new file mode 100644 index 0000000..74b292b --- /dev/null +++ b/mmsegmentation/projects/faq.md @@ -0,0 +1,19 @@ +Q1: Why set up `projects/` folder? + +Implementing new models and features into OpenMMLab's algorithm libraries could be troublesome due to the rigorous requirements on code quality, which could hinder the fast iteration of SOTA models and might discourage our members from sharing their latest outcomes here. And that's why we have this `projects/` folder now, where some experimental features, frameworks and models are placed, only needed to satisfy the minimum requirement on the code quality, and can be used as standalone libraries. Users are welcome to use them if they [use MMSegmentation from source](https://mmsegmentation.readthedocs.io/en/latest/get_started.html#best-practices). + +Q2: Why should there be a checklist for a project? + +This checkelist is crucial not only for this project's developers but the entire community, since there might be some other contributors joining this project and deciding their starting point from this list. It also helps maintainers accurately estimate time and effort on further code polishing, if needed. + +Q3: What kind of PR will be merged? + +Reaching the first milestone means that this project suffices the minimum requirement of being merged into 'projects/'. That is, the very first PR of a project must have all the terms in the first milestone checked. We do not have any extra requirements on the project's following PRs, so they can be a minor bug fix or update, and do not have to achieve one milestone at once. But keep in mind that this project is only eligible to become a part of the core package upon attaining the last milestone. + +Q4: Compared to other models in the core packages, why do the model implementations in projects have different training/testing commands? + +Projects are organized independently from the core package, and therefore their modules cannot be directly imported by train.py and test.py. Each model implementation in projects should either use `mim` for training/testing as suggested in the example project or provide a custom train.py/test.py. + +Q5: How to debug a project with a debugger? + +Debugger makes our lives easier, but using it becomes a bit tricky if we have to train/test a model via `mim`. The way to circumvent that is that we can take advantage of relative path to import these modules. Assuming that we are developing a project X and the core modules are placed under `projects/X/modules`, then simply adding `custom_imports = dict(imports='projects.X.modules')` to the config allows us to debug from usual entrypoints (e.g. `tools/train.py`) from the root directory of the algorithm library. Just don't forget to remove 'projects.X' before project publishment. diff --git a/mmsegmentation/projects/gid_dataset/configs/_base_/datasets/gid.py b/mmsegmentation/projects/gid_dataset/configs/_base_/datasets/gid.py new file mode 100644 index 0000000..f721810 --- /dev/null +++ b/mmsegmentation/projects/gid_dataset/configs/_base_/datasets/gid.py @@ -0,0 +1,67 @@ +# dataset settings +dataset_type = 'GID_Dataset' # ๆณจๅ†Œ็š„็ฑปๅ +data_root = 'data/gid/' # ๆ•ฐๆฎ้›†ๆ น็›ฎๅฝ• +crop_size = (256, 256) # ๅ›พๅƒ่ฃๅ‰ชๅคงๅฐ +train_pipeline = [ + dict(type='LoadImageFromFile'), # ไปŽๆ–‡ไปถไธญๅŠ ่ฝฝๅ›พๅƒ + dict(type='LoadAnnotations'), # ไปŽๆ–‡ไปถไธญๅŠ ่ฝฝๆ ‡ๆณจ + dict( + type='RandomResize', # ้šๆœบ็ผฉๆ”พ + scale=(512, 512), # ็ผฉๆ”พๅฐบๅฏธ + ratio_range=(0.5, 2.0), # ็ผฉๆ”พๆฏ”ไพ‹่Œƒๅ›ด + keep_ratio=True), # ๆ˜ฏๅฆไฟๆŒ้•ฟๅฎฝๆฏ” + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), # ้šๆœบ่ฃๅ‰ช + dict(type='RandomFlip', prob=0.5), # ้šๆœบ็ฟป่ฝฌ + dict(type='PhotoMetricDistortion'), # ๅ›พๅƒๅขžๅผบ + dict(type='PackSegInputs') # ๆ‰“ๅŒ…ๆ•ฐๆฎ +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # ไปŽๆ–‡ไปถไธญๅŠ ่ฝฝๅ›พๅƒ + dict(type='Resize', scale=(256, 256), keep_ratio=True), # ็ผฉๆ”พ + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), # ไปŽๆ–‡ไปถไธญๅŠ ่ฝฝๆ ‡ๆณจ + dict(type='PackSegInputs') # ๆ‰“ๅŒ…ๆ•ฐๆฎ +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] # ๅคšๅฐบๅบฆ้ข„ๆต‹็ผฉๆ”พๆฏ”ไพ‹ +tta_pipeline = [ # ๅคšๅฐบๅบฆๆต‹่ฏ• + dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( # ่ฎญ็ปƒๆ•ฐๆฎๅŠ ่ฝฝๅ™จ + batch_size=2, # ่ฎญ็ปƒๆ—ถ็š„ๆ•ฐๆฎๆ‰น้‡ๅคงๅฐ + num_workers=4, # ๆ•ฐๆฎๅŠ ่ฝฝ็บฟ็จ‹ๆ•ฐ + persistent_workers=True, # ๆ˜ฏๅฆๆŒไน…ๅŒ–็บฟ็จ‹ + sampler=dict(type='InfiniteSampler', shuffle=True), # ๆ— ้™้‡‡ๆ ทๅ™จ + dataset=dict( + type=dataset_type, # ๆ•ฐๆฎ้›†็ฑปๅ + data_root=data_root, # ๆ•ฐๆฎ้›†ๆ น็›ฎๅฝ• + data_prefix=dict( + img_path='img_dir/train', + seg_map_path='ann_dir/train'), # ่ฎญ็ปƒ้›†ๅ›พๅƒๅ’Œๆ ‡ๆณจ่ทฏๅพ„ + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, # ้ชŒ่ฏๆ—ถ็š„ๆ•ฐๆฎๆ‰น้‡ๅคงๅฐ + num_workers=4, # ๆ•ฐๆฎๅŠ ่ฝฝ็บฟ็จ‹ๆ•ฐ + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py b/mmsegmentation/projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py new file mode 100644 index 0000000..70cb600 --- /dev/null +++ b/mmsegmentation/projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py @@ -0,0 +1,15 @@ +_base_ = [ + '../../../configs/_base_/models/deeplabv3plus_r50-d8.py', + './_base_/datasets/gid.py', '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_240k.py' +] +custom_imports = dict(imports=['projects.gid_dataset.mmseg.datasets.gid']) + +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101), + decode_head=dict(num_classes=6), + auxiliary_head=dict(num_classes=6)) diff --git a/mmsegmentation/projects/gid_dataset/mmseg/datasets/gid.py b/mmsegmentation/projects/gid_dataset/mmseg/datasets/gid.py new file mode 100644 index 0000000..a9e8c51 --- /dev/null +++ b/mmsegmentation/projects/gid_dataset/mmseg/datasets/gid.py @@ -0,0 +1,55 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.datasets.basesegdataset import BaseSegDataset +from mmseg.registry import DATASETS + + +# ๆณจๅ†Œๆ•ฐๆฎ้›†็ฑป +@DATASETS.register_module() +class GID_Dataset(BaseSegDataset): + """Gaofen Image Dataset (GID) + + Dataset paper link: + https://www.sciencedirect.com/science/article/pii/S0034425719303414 + https://x-ytong.github.io/project/GID.html + + GID 6 classes: others, built-up, farmland, forest, meadow, water + + In this example, select 15 images from GID dataset as training set, + and select 5 images as validation set. + The selected images are listed as follows: + + GF2_PMS1__L1A0000647767-MSS1 + GF2_PMS1__L1A0001064454-MSS1 + GF2_PMS1__L1A0001348919-MSS1 + GF2_PMS1__L1A0001680851-MSS1 + GF2_PMS1__L1A0001680853-MSS1 + GF2_PMS1__L1A0001680857-MSS1 + GF2_PMS1__L1A0001757429-MSS1 + GF2_PMS2__L1A0000607681-MSS2 + GF2_PMS2__L1A0000635115-MSS2 + GF2_PMS2__L1A0000658637-MSS2 + GF2_PMS2__L1A0001206072-MSS2 + GF2_PMS2__L1A0001471436-MSS2 + GF2_PMS2__L1A0001642620-MSS2 + GF2_PMS2__L1A0001787089-MSS2 + GF2_PMS2__L1A0001838560-MSS2 + + The ``img_suffix`` is fixed to '.tif' and ``seg_map_suffix`` is + fixed to '.tif' for GID. + """ + METAINFO = dict( + classes=('Others', 'Built-up', 'Farmland', 'Forest', 'Meadow', + 'Water'), + palette=[[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 255, 255], + [255, 255, 0], [0, 0, 255]]) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=None, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid.py b/mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid.py new file mode 100644 index 0000000..d95654a --- /dev/null +++ b/mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid.py @@ -0,0 +1,181 @@ +import argparse +import glob +import math +import os +import os.path as osp + +import mmcv +import numpy as np +from mmengine.utils import ProgressBar, mkdir_or_exist + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert GID dataset to mmsegmentation format') + parser.add_argument('dataset_img_path', help='GID images folder path') + parser.add_argument('dataset_label_path', help='GID labels folder path') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument( + '-o', '--out_dir', help='output path', default='data/gid') + parser.add_argument( + '--clip_size', + type=int, + help='clipped size of image after preparation', + default=256) + parser.add_argument( + '--stride_size', + type=int, + help='stride of clipping original images', + default=256) + args = parser.parse_args() + return args + + +GID_COLORMAP = dict( + Background=(0, 0, 0), # 0-่ƒŒๆ™ฏ-้ป‘่‰ฒ + Building=(255, 0, 0), # 1-ๅปบ็ญ‘-็บข่‰ฒ + Farmland=(0, 255, 0), # 2-ๅ†œ็”ฐ-็ปฟ่‰ฒ + Forest=(0, 0, 255), # 3-ๆฃฎๆž—-่“่‰ฒ + Meadow=(255, 255, 0), # 4-่‰ๅœฐ-้ป„่‰ฒ + Water=(0, 0, 255) # 5-ๆฐด-่“่‰ฒ +) +palette = list(GID_COLORMAP.values()) +classes = list(GID_COLORMAP.keys()) + + +# ็”จๅˆ—่กจๆฅๅญ˜ไธ€ไธช RGB ๅ’Œไธ€ไธช็ฑปๅˆซ็š„ๅฏนๅบ” +def colormap2label(palette): + colormap2label_list = np.zeros(256**3, dtype=np.longlong) + for i, colormap in enumerate(palette): + colormap2label_list[(colormap[0] * 256 + colormap[1]) * 256 + + colormap[2]] = i + return colormap2label_list + + +# ็ป™ๅฎš้‚ฃไธชๅˆ—่กจ๏ผŒๅ’Œvis_png็„ถๅŽ็”Ÿๆˆmasks_png +def label_indices(RGB_label, colormap2label_list): + RGB_label = RGB_label.astype('int32') + idx = (RGB_label[:, :, 0] * 256 + + RGB_label[:, :, 1]) * 256 + RGB_label[:, :, 2] + return colormap2label_list[idx] + + +def RGB2mask(RGB_label, colormap2label_list): + mask_label = label_indices(RGB_label, colormap2label_list) + return mask_label + + +colormap2label_list = colormap2label(palette) + + +def clip_big_image(image_path, clip_save_dir, args, to_label=False): + """Original image of GID dataset is very large, thus pre-processing of them + is adopted. + + Given fixed clip size and stride size to generate + clipped image, the intersectionใ€€of width and height is determined. + For example, given one 6800 x 7200 original image, the clip size is + 256 and stride size is 256, thus it would generate 29 x 27 = 783 images + whose size are all 256 x 256. + """ + + image = mmcv.imread(image_path, channel_order='rgb') + # image = mmcv.bgr2gray(image) + + h, w, c = image.shape + clip_size = args.clip_size + stride_size = args.stride_size + + num_rows = math.ceil((h - clip_size) / stride_size) if math.ceil( + (h - clip_size) / + stride_size) * stride_size + clip_size >= h else math.ceil( + (h - clip_size) / stride_size) + 1 + num_cols = math.ceil((w - clip_size) / stride_size) if math.ceil( + (w - clip_size) / + stride_size) * stride_size + clip_size >= w else math.ceil( + (w - clip_size) / stride_size) + 1 + + x, y = np.meshgrid(np.arange(num_cols + 1), np.arange(num_rows + 1)) + xmin = x * clip_size + ymin = y * clip_size + + xmin = xmin.ravel() + ymin = ymin.ravel() + xmin_offset = np.where(xmin + clip_size > w, w - xmin - clip_size, + np.zeros_like(xmin)) + ymin_offset = np.where(ymin + clip_size > h, h - ymin - clip_size, + np.zeros_like(ymin)) + boxes = np.stack([ + xmin + xmin_offset, ymin + ymin_offset, + np.minimum(xmin + clip_size, w), + np.minimum(ymin + clip_size, h) + ], + axis=1) + + if to_label: + image = RGB2mask(image, colormap2label_list) + + for count, box in enumerate(boxes): + start_x, start_y, end_x, end_y = box + clipped_image = image[start_y:end_y, + start_x:end_x] if to_label else image[ + start_y:end_y, start_x:end_x, :] + img_name = osp.basename(image_path).replace('.tif', '') + img_name = img_name.replace('_label', '') + if count % 3 == 0: + mmcv.imwrite( + clipped_image.astype(np.uint8), + osp.join( + clip_save_dir.replace('train', 'val'), + f'{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png')) + else: + mmcv.imwrite( + clipped_image.astype(np.uint8), + osp.join( + clip_save_dir, + f'{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png')) + count += 1 + + +def main(): + args = parse_args() + """ + According to this paper: https://ieeexplore.ieee.org/document/9343296/ + select 15 images contained in GID, , which cover the whole six + categories, to generate train set and validation set. + + """ + + if args.out_dir is None: + out_dir = osp.join('data', 'gid') + else: + out_dir = args.out_dir + + print('Making directories...') + mkdir_or_exist(osp.join(out_dir, 'img_dir', 'train')) + mkdir_or_exist(osp.join(out_dir, 'img_dir', 'val')) + mkdir_or_exist(osp.join(out_dir, 'ann_dir', 'train')) + mkdir_or_exist(osp.join(out_dir, 'ann_dir', 'val')) + + src_path_list = glob.glob(os.path.join(args.dataset_img_path, '*.tif')) + print(f'Find {len(src_path_list)} pictures') + + prog_bar = ProgressBar(len(src_path_list)) + + dst_img_dir = osp.join(out_dir, 'img_dir', 'train') + dst_label_dir = osp.join(out_dir, 'ann_dir', 'train') + + for i, img_path in enumerate(src_path_list): + label_path = osp.join( + args.dataset_label_path, + osp.basename(img_path.replace('.tif', '_label.tif'))) + + clip_big_image(img_path, dst_img_dir, args, to_label=False) + clip_big_image(label_path, dst_label_dir, args, to_label=True) + prog_bar.update() + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py b/mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py new file mode 100644 index 0000000..d3eeff2 --- /dev/null +++ b/mmsegmentation/projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py @@ -0,0 +1,75 @@ +import argparse +import os +import shutil + +# select 15 images from GID dataset + +img_list = [ + 'GF2_PMS1__L1A0000647767-MSS1.tif', 'GF2_PMS1__L1A0001064454-MSS1.tif', + 'GF2_PMS1__L1A0001348919-MSS1.tif', 'GF2_PMS1__L1A0001680851-MSS1.tif', + 'GF2_PMS1__L1A0001680853-MSS1.tif', 'GF2_PMS1__L1A0001680857-MSS1.tif', + 'GF2_PMS1__L1A0001757429-MSS1.tif', 'GF2_PMS2__L1A0000607681-MSS2.tif', + 'GF2_PMS2__L1A0000635115-MSS2.tif', 'GF2_PMS2__L1A0000658637-MSS2.tif', + 'GF2_PMS2__L1A0001206072-MSS2.tif', 'GF2_PMS2__L1A0001471436-MSS2.tif', + 'GF2_PMS2__L1A0001642620-MSS2.tif', 'GF2_PMS2__L1A0001787089-MSS2.tif', + 'GF2_PMS2__L1A0001838560-MSS2.tif' +] + +labels_list = [ + 'GF2_PMS1__L1A0000647767-MSS1_label.tif', + 'GF2_PMS1__L1A0001064454-MSS1_label.tif', + 'GF2_PMS1__L1A0001348919-MSS1_label.tif', + 'GF2_PMS1__L1A0001680851-MSS1_label.tif', + 'GF2_PMS1__L1A0001680853-MSS1_label.tif', + 'GF2_PMS1__L1A0001680857-MSS1_label.tif', + 'GF2_PMS1__L1A0001757429-MSS1_label.tif', + 'GF2_PMS2__L1A0000607681-MSS2_label.tif', + 'GF2_PMS2__L1A0000635115-MSS2_label.tif', + 'GF2_PMS2__L1A0000658637-MSS2_label.tif', + 'GF2_PMS2__L1A0001206072-MSS2_label.tif', + 'GF2_PMS2__L1A0001471436-MSS2_label.tif', + 'GF2_PMS2__L1A0001642620-MSS2_label.tif', + 'GF2_PMS2__L1A0001787089-MSS2_label.tif', + 'GF2_PMS2__L1A0001838560-MSS2_label.tif' +] + + +def parse_args(): + parser = argparse.ArgumentParser( + description='From 150 images of GID dataset to select 15 images') + parser.add_argument('dataset_img_dir', help='150 GID images folder path') + parser.add_argument('dataset_label_dir', help='150 GID labels folder path') + + parser.add_argument('dest_img_dir', help='15 GID images folder path') + parser.add_argument('dest_label_dir', help='15 GID labels folder path') + + args = parser.parse_args() + + return args + + +def main(): + """This script is used to select 15 images from GID dataset, According to + paper: https://ieeexplore.ieee.org/document/9343296/""" + args = parse_args() + + img_path = args.dataset_img_dir + label_path = args.dataset_label_dir + + dest_img_dir = args.dest_img_dir + dest_label_dir = args.dest_label_dir + + # copy images of 'img_list' to 'desr_dir' + print('Copy images of img_list to desr_dir ing...') + for img in img_list: + shutil.copy(os.path.join(img_path, img), dest_img_dir) + print('Done!') + + print('copy labels of labels_list to desr_dir ing...') + for label in labels_list: + shutil.copy(os.path.join(label_path, label), dest_label_dir) + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/projects/gid_dataset/user_guides/2_dataset_prepare.md b/mmsegmentation/projects/gid_dataset/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..63bd4d4 --- /dev/null +++ b/mmsegmentation/projects/gid_dataset/user_guides/2_dataset_prepare.md @@ -0,0 +1,53 @@ +## Gaofen Image Dataset (GID) + +- GID ๆ•ฐๆฎ้›†ๅฏๅœจ[ๆญคๅค„](https://x-ytong.github.io/project/GID.html)่ฟ›่กŒไธ‹่ฝฝใ€‚ +- GID ๆ•ฐๆฎ้›†ๅŒ…ๅซ 150 ๅผ  6800x7200 ็š„ๅคงๅฐบๅฏธๅ›พๅƒ๏ผŒๆ ‡็ญพไธบ RGB ๆ ‡็ญพใ€‚ +- ๆ นๆฎ[ๆ–‡็Œฎ](https://ieeexplore.ieee.org/document/9343296/)๏ผŒๆญคๅค„้€‰ๆ‹ฉ 15 ๅผ ๅ›พๅƒ็”Ÿๆˆ่ฎญ็ปƒ้›†ๅ’Œ้ชŒ่ฏ้›†๏ผŒ่ฏฅ 15 ๅผ ๅ›พๅƒๅŒ…ๅซไบ†ๆ‰€ๆœ‰ๅ…ญ็ฑปไฟกๆฏใ€‚ๆ‰€้€‰็š„ๅ›พๅƒๅ็งฐๅฆ‚ไธ‹๏ผš + +```None + GF2_PMS1__L1A0000647767-MSS1 + GF2_PMS1__L1A0001064454-MSS1 + GF2_PMS1__L1A0001348919-MSS1 + GF2_PMS1__L1A0001680851-MSS1 + GF2_PMS1__L1A0001680853-MSS1 + GF2_PMS1__L1A0001680857-MSS1 + GF2_PMS1__L1A0001757429-MSS1 + GF2_PMS2__L1A0000607681-MSS2 + GF2_PMS2__L1A0000635115-MSS2 + GF2_PMS2__L1A0000658637-MSS2 + GF2_PMS2__L1A0001206072-MSS2 + GF2_PMS2__L1A0001471436-MSS2 + GF2_PMS2__L1A0001642620-MSS2 + GF2_PMS2__L1A0001787089-MSS2 + GF2_PMS2__L1A0001838560-MSS2 +``` + +่ฟ™้‡ŒไนŸๆไพ›ไบ†ไธ€ไธช่„šๆœฌๆฅๆ–นไพฟ็š„็ญ›้€‰ๅ‡บ15ๅผ ๅ›พๅƒ๏ผŒ + +``` +python projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py {150 ๅผ ๅ›พๅƒ็š„่ทฏๅพ„} {150 ๅผ ๆ ‡็ญพ็š„่ทฏๅพ„} {15 ๅผ ๅ›พๅƒ็š„่ทฏๅพ„} {15 ๅผ ๆ ‡็ญพ็š„่ทฏๅพ„} +``` + +ๅœจ้€‰ๆ‹ฉๅ‡บ 15 ๅผ ๅ›พๅƒๅŽ๏ผŒๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปค่ฟ›่กŒ่ฃๅˆ‡ๅŠๆ ‡็ญพ็š„่ฝฌๆข๏ผŒ้œ€่ฆไฟฎๆ”นไธบๆ‚จๆ‰€ๅญ˜ๅ‚จ 15 ๅผ ๅ›พๅƒๅŠๆ ‡็ญพ็š„่ทฏๅพ„ใ€‚ + +``` +python projects/gid_dataset/tools/dataset_converters/gid.py {15 ๅผ ๅ›พๅƒ็š„่ทฏๅพ„} {15 ๅผ ๆ ‡็ญพ็š„่ทฏๅพ„} +``` + +ๅฎŒๆˆ่ฃๅˆ‡ๅŽ็š„ GID ๆ•ฐๆฎ็ป“ๆž„ๅฆ‚ไธ‹๏ผš + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ gid +โ”‚ โ”‚ โ”œโ”€โ”€ ann_dir +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val +โ”‚ โ”‚ โ”œโ”€โ”€ img_dir +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train +| โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + +``` diff --git a/mmsegmentation/projects/hsidrive20_dataset/README.md b/mmsegmentation/projects/hsidrive20_dataset/README.md new file mode 100644 index 0000000..7ee6e98 --- /dev/null +++ b/mmsegmentation/projects/hsidrive20_dataset/README.md @@ -0,0 +1,34 @@ +# HSI Drive 2.0 Dataset + +Support **`HSI Drive 2.0 Dataset`** + +## Description + +Author: Jon Gutierrez + +This project implements **`HSI Drive 2.0 Dataset`** + +### Dataset preparing + +Preparing `HSI Drive 2.0 Dataset` dataset following [HSI Drive 2.0 Dataset Preparing Guide](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#hsi-drive-2.0) + +```none +mmsegmentation/data +โ””โ”€โ”€ HSIDrive20 + โ”œโ”€โ”€ images + โ”‚ |โ”€โ”€ training [] + โ”‚ |โ”€โ”€ validation [] + โ”‚ |โ”€โ”€ test [] + โ””โ”€โ”€ labels + โ”‚ |โ”€โ”€ training [] + โ”‚ |โ”€โ”€ validation [] + โ”‚ |โ”€โ”€ test [] +``` + +### Training commands + +```bash +%cd mmsegmentation +!python tools/train.py projects/hsidrive20_dataset/configs/unet-s5-d16_fcn_4xb4-160k_hsidrive-208x400.py\ +--work-dir your_work_dir +``` diff --git a/mmsegmentation/projects/hsidrive20_dataset/configs/_base_/datasets/hsi_drive.py b/mmsegmentation/projects/hsidrive20_dataset/configs/_base_/datasets/hsi_drive.py new file mode 100644 index 0000000..3114262 --- /dev/null +++ b/mmsegmentation/projects/hsidrive20_dataset/configs/_base_/datasets/hsi_drive.py @@ -0,0 +1,50 @@ +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] + +train_dataloader = dict( + batch_size=1, + num_workers=1, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type='HSIDrive20', + data_root='data/HSIDrive20', + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) + +val_dataloader = dict( + batch_size=1, + num_workers=1, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='HSIDrive20', + data_root='data/HSIDrive20', + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) + +test_dataloader = dict( + batch_size=1, + num_workers=1, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='HSIDrive20', + data_root='data/HSIDrive20', + data_prefix=dict( + img_path='images/test', seg_map_path='annotations/test'), + pipeline=test_pipeline)) + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'], ignore_index=0) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/hsidrive20_dataset/configs/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py b/mmsegmentation/projects/hsidrive20_dataset/configs/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py new file mode 100644 index 0000000..d5eab91 --- /dev/null +++ b/mmsegmentation/projects/hsidrive20_dataset/configs/unet-s5-d16_fcn_4xb4-160k_hsidrive-192x384.py @@ -0,0 +1,58 @@ +_base_ = [ + '../../../configs/_base_/models/fcn_unet_s5-d16.py', + './_base_/datasets/hsi_drive.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_160k.py' +] + +custom_imports = dict( + imports=['projects.hsidrive20_dataset.mmseg.datasets.hsi_drive']) + +crop_size = (192, 384) +data_preprocessor = dict( + type='SegDataPreProcessor', + size=crop_size, + mean=None, + std=None, + bgr_to_rgb=None, + pad_val=0, + seg_pad_val=255) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(in_channels=25), + decode_head=dict( + ignore_index=0, + num_classes=11, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + auxiliary_head=dict( + ignore_index=0, + num_classes=11, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + avg_non_ignore=True)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='RandomCrop', crop_size=crop_size), + dict(type='PackSegInputs') +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomCrop', crop_size=crop_size), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] + +train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) +test_dataloader = dict(dataset=dict(pipeline=test_pipeline)) diff --git a/mmsegmentation/projects/hsidrive20_dataset/docs/en/user_guides/2_dataset_prepare.md b/mmsegmentation/projects/hsidrive20_dataset/docs/en/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..1d4ac8c --- /dev/null +++ b/mmsegmentation/projects/hsidrive20_dataset/docs/en/user_guides/2_dataset_prepare.md @@ -0,0 +1,42 @@ +## HSI Drive 2.0 + +- You could download HSI Drive 2.0 dataset from [here](https://ipaccess.ehu.eus/HSI-Drive/#download) after just sending an email to gded@ehu.eus with the subject "download HSI-Drive". You will receive a password to uncompress the files. + +- After download, unzip by the following instructions: + + ```bash + 7z x -p"password" ./HSI_Drive_v2_0_Phyton.zip + + mv ./HSIDrive20 path_to_mmsegmentation/data + mv ./HSI_Drive_v2_0_release_notes_Python_version.md path_to_mmsegmentation/data + mv ./image_numbering.pdf path_to_mmsegmentation/data + ``` + +- After unzip, you get + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ HSIDrive20 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ images_MF +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ RGB +โ”‚ โ”‚ โ”œโ”€โ”€ training_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ validation_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ test_filenames.txt +โ”‚ โ”œโ”€โ”€ HSI_Drive_v2_0_release_notes_Python_version.md +โ”‚ โ”œโ”€โ”€ image_numbering.pdf +``` diff --git a/mmsegmentation/projects/hsidrive20_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md b/mmsegmentation/projects/hsidrive20_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..dbf704a --- /dev/null +++ b/mmsegmentation/projects/hsidrive20_dataset/docs/zh_cn/user_guides/2_dataset_prepare.md @@ -0,0 +1,42 @@ +## HSI Drive 2.0 + +- ๆ‚จๅฏไปฅไปŽไปฅไธ‹ไฝ็ฝฎไธ‹่ฝฝ HSI Drive 2.0 ๆ•ฐๆฎ้›† [here](https://ipaccess.ehu.eus/HSI-Drive/#download) ๅˆšๅˆšๅ‘ gded@ehu.eus ๅ‘้€ไธป้ข˜ไธบโ€œไธ‹่ฝฝ HSI-Driveโ€็š„็”ตๅญ้‚ฎไปถๅŽ ๆ‚จๅฐ†ๆ”ถๅˆฐ่งฃๅŽ‹็ผฉๆ–‡ไปถ็š„ๅฏ†็ . + +- ไธ‹่ฝฝๅŽ๏ผŒๆŒ‰็…งไปฅไธ‹่ฏดๆ˜Ž่งฃๅŽ‹๏ผš + + ```bash + 7z x -p"password" ./HSI_Drive_v2_0_Phyton.zip + + mv ./HSIDrive20 path_to_mmsegmentation/data + mv ./HSI_Drive_v2_0_release_notes_Python_version.md path_to_mmsegmentation/data + mv ./image_numbering.pdf path_to_mmsegmentation/data + ``` + +- ่งฃๅŽ‹ๅŽๅพ—ๅˆฐ: + +```none +mmsegmentation +โ”œโ”€โ”€ mmseg +โ”œโ”€โ”€ tools +โ”œโ”€โ”€ configs +โ”œโ”€โ”€ data +โ”‚ โ”œโ”€โ”€ HSIDrive20 +โ”‚ โ”‚ โ”œโ”€โ”€ images +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ annotations +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ images_MF +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ training +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ validation +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test +โ”‚ โ”‚ โ”œโ”€โ”€ RGB +โ”‚ โ”‚ โ”œโ”€โ”€ training_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ validation_filenames.txt +โ”‚ โ”‚ โ”œโ”€โ”€ test_filenames.txt +โ”‚ โ”œโ”€โ”€ HSI_Drive_v2_0_release_notes_Python_version.md +โ”‚ โ”œโ”€โ”€ image_numbering.pdf +``` diff --git a/mmsegmentation/projects/hsidrive20_dataset/mmseg/datasets/hsi_drive.py b/mmsegmentation/projects/hsidrive20_dataset/mmseg/datasets/hsi_drive.py new file mode 100644 index 0000000..f8589b0 --- /dev/null +++ b/mmsegmentation/projects/hsidrive20_dataset/mmseg/datasets/hsi_drive.py @@ -0,0 +1,23 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.datasets import BaseSegDataset + +# from mmseg.registry import DATASETS + +classes_exp = ('unlabelled', 'road', 'road marks', 'vegetation', + 'painted metal', 'sky', 'concrete', 'pedestrian', 'water', + 'unpainted metal', 'glass') +palette_exp = [[0, 0, 0], [77, 77, 77], [255, 255, 255], [0, 255, 0], + [255, 0, 0], [0, 0, 255], [102, 51, 0], [255, 255, 0], + [0, 207, 250], [255, 166, 0], [0, 204, 204]] + + +# @DATASETS.register_module() +class HSIDrive20Dataset(BaseSegDataset): + METAINFO = dict(classes=classes_exp, palette=palette_exp) + + def __init__(self, + img_suffix='.npy', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/projects/hssn/README.md b/mmsegmentation/projects/hssn/README.md new file mode 100644 index 0000000..9dcbf37 --- /dev/null +++ b/mmsegmentation/projects/hssn/README.md @@ -0,0 +1,91 @@ +# HSSN + +## Description + +Author: AI-Tianlong + +This project implements `Deep Hierarchical Semantic Segmentation` inference on `cityscapes` dataset + +## Usage + +### Prerequisites + +- Python 3.8 +- PyTorch 1.6 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 +- mmcv v2.0.0rc4 +- mmengine >=0.4.0 + +### Dataset preparing + +Preparing `cityscapes` dataset following this [Dataset Preparing Guide](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/dataset_prepare.md#prepare-datasets) + +### Testing commands + +Please put [`hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth`](https://download.openmmlab.com/mmsegmentation/v0.5/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth) to `mmsegmentation/checkpoints` + +#### Multi-GPUs Test + +```bash +# --tta optional, multi-scale test, need mmengine >=0.4.0 +bash tools/dist_test.sh [configs] [model weights] [number of gpu] --tta +``` + +#### Example + +```shell +bash tools/dist_test.sh projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py checkpoints/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth 2 --tta +``` + +## Results + +### Cityscapes + +| Method | Backbone | Crop Size | mIoU | mIoU (ms+flip) | config | model | +| :--------: | :------: | :-------: | :---: | :------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------: | +| DeeplabV3+ | R-101-D8 | 512x1024 | 81.61 | 82.71 | [config](https://github.com/open-mmlab/mmsegmentation/tree/main/projects/HieraSeg/configs/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth) | + + + +## Citation + +This project is modified from [qhanghu/HSSN_pytorch](https://github.com/qhanghu/HSSN_pytorch) + +```bibtex +@article{li2022deep, + title={Deep Hierarchical Semantic Segmentation}, + author={Li, Liulei and Zhou, Tianfei and Wang, Wenguan and Li, Jianwu and Yang, Yi}, + journal={CVPR}, + year={2022} +} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/hssn/configs/_base_/datasets/cityscapes.py b/mmsegmentation/projects/hssn/configs/_base_/datasets/cityscapes.py new file mode 100644 index 0000000..1698e04 --- /dev/null +++ b/mmsegmentation/projects/hssn/configs/_base_/datasets/cityscapes.py @@ -0,0 +1,67 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=2, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/hssn/configs/_base_/default_runtime.py b/mmsegmentation/projects/hssn/configs/_base_/default_runtime.py new file mode 100644 index 0000000..272b4d2 --- /dev/null +++ b/mmsegmentation/projects/hssn/configs/_base_/default_runtime.py @@ -0,0 +1,15 @@ +default_scope = 'mmseg' +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +vis_backends = [dict(type='LocalVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +log_processor = dict(by_epoch=False) +log_level = 'INFO' +load_from = None +resume = False + +tta_model = dict(type='SegTTAModel') diff --git a/mmsegmentation/projects/hssn/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py b/mmsegmentation/projects/hssn/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py new file mode 100644 index 0000000..a6af45c --- /dev/null +++ b/mmsegmentation/projects/hssn/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py @@ -0,0 +1,55 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='ResNetV1d', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DepthwiseSeparableASPPContrastHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + c1_in_channels=256, + c1_channels=48, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + proj='convmlp', + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/projects/hssn/configs/_base_/schedules/schedule_80k.py b/mmsegmentation/projects/hssn/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000..0dcd6c4 --- /dev/null +++ b/mmsegmentation/projects/hssn/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,24 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=80000, + by_epoch=False) +] +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=8000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=8000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py b/mmsegmentation/projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py new file mode 100644 index 0000000..8f04a2d --- /dev/null +++ b/mmsegmentation/projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8_vd_contrast.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] + +custom_imports = dict(imports=[ + 'projects.hssn.decode_head.sep_aspp_contrast_head', + 'projects.hssn.losses.hiera_triplet_loss_cityscape' +]) + +model = dict( + pretrained=None, + backbone=dict(depth=101), + decode_head=dict( + num_classes=26, + loss_decode=dict( + type='HieraTripletLossCityscape', num_classes=19, + loss_weight=1.0)), + auxiliary_head=dict(num_classes=19), + test_cfg=dict(mode='whole', is_hiera=True, hiera_num_classes=7)) diff --git a/mmsegmentation/projects/hssn/decode_head/__init__.py b/mmsegmentation/projects/hssn/decode_head/__init__.py new file mode 100644 index 0000000..da454ea --- /dev/null +++ b/mmsegmentation/projects/hssn/decode_head/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .sep_aspp_contrast_head import DepthwiseSeparableASPPContrastHead + +__all__ = ['DepthwiseSeparableASPPContrastHead'] diff --git a/mmsegmentation/projects/hssn/decode_head/sep_aspp_contrast_head.py b/mmsegmentation/projects/hssn/decode_head/sep_aspp_contrast_head.py new file mode 100644 index 0000000..331af30 --- /dev/null +++ b/mmsegmentation/projects/hssn/decode_head/sep_aspp_contrast_head.py @@ -0,0 +1,193 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Tuple + +import torch +import torch.nn as nn +from mmcv.cnn import build_norm_layer +from torch import Tensor + +from mmseg.models.decode_heads.sep_aspp_head import DepthwiseSeparableASPPHead +from mmseg.models.losses import accuracy +from mmseg.models.utils import resize +from mmseg.registry import MODELS +from mmseg.utils import SampleList + + +class ProjectionHead(nn.Module): + """ProjectionHead, project feature map to specific channels. + + Args: + dim_in (int): Input channels. + norm_cfg (dict): config of norm layer. + proj_dim (int): Output channels. Default: 256. + proj (str): Projection type, 'linear' or 'convmlp'. Default: 'convmlp' + """ + + def __init__(self, + dim_in: int, + norm_cfg: dict, + proj_dim: int = 256, + proj: str = 'convmlp'): + super().__init__() + assert proj in ['convmlp', 'linear'] + if proj == 'linear': + self.proj = nn.Conv2d(dim_in, proj_dim, kernel_size=1) + elif proj == 'convmlp': + self.proj = nn.Sequential( + nn.Conv2d(dim_in, dim_in, kernel_size=1), + build_norm_layer(norm_cfg, dim_in)[1], nn.ReLU(inplace=True), + nn.Conv2d(dim_in, proj_dim, kernel_size=1)) + + def forward(self, x): + return torch.nn.functional.normalize(self.proj(x), p=2, dim=1) + + +@MODELS.register_module() +class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): + """Deep Hierarchical Semantic Segmentation. This head is the implementation + of ``_. + + Based on Encoder-Decoder with Atrous Separable Convolution for + Semantic Image Segmentation. + `DeepLabV3+ `_. + + Args: + proj (str): The type of ProjectionHead, 'linear' or 'convmlp', + default 'convmlp' + """ + + def __init__(self, proj: str = 'convmlp', **kwargs): + super().__init__(**kwargs) + self.proj_head = ProjectionHead( + dim_in=2048, norm_cfg=self.norm_cfg, proj=proj) + self.register_buffer('step', torch.zeros(1)) + + def forward(self, inputs) -> Tuple[Tensor]: + """Forward function.""" + output = super().forward(inputs) + + self.step += 1 + embedding = self.proj_head(inputs[-1]) + + return output, embedding + + def predict_by_feat(self, seg_logits: Tuple[Tensor], + batch_img_metas: List[dict]) -> Tensor: + """Transform a batch of output seg_logits to the input shape. + + Args: + seg_logits (Tensor): The output from decode head forward function. + batch_img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + + Returns: + Tensor: Outputs segmentation logits map. + """ + # HSSN decode_head output is: (out, embedding): tuple + # only need 'out' here. + if isinstance(seg_logits, tuple): + seg_logit = seg_logits[0] + + if seg_logit.size(1) == 26: # For cityscapes dataset๏ผŒ19 + 7 + hiera_num_classes = 7 + seg_logit[:, 0:2] += seg_logit[:, -7] + seg_logit[:, 2:5] += seg_logit[:, -6] + seg_logit[:, 5:8] += seg_logit[:, -5] + seg_logit[:, 8:10] += seg_logit[:, -4] + seg_logit[:, 10:11] += seg_logit[:, -3] + seg_logit[:, 11:13] += seg_logit[:, -2] + seg_logit[:, 13:19] += seg_logit[:, -1] + + elif seg_logit.size(1) == 12: # For Pascal_person dataset, 7 + 5 + hiera_num_classes = 5 + seg_logit[:, 0:1] = seg_logit[:, 0:1] + \ + seg_logit[:, 7] + seg_logit[:, 10] + seg_logit[:, 1:5] = seg_logit[:, 1:5] + \ + seg_logit[:, 8] + seg_logit[:, 11] + seg_logit[:, 5:7] = seg_logit[:, 5:7] + \ + seg_logit[:, 9] + seg_logit[:, 11] + + elif seg_logit.size(1) == 25: # For LIP dataset, 20 + 5 + hiera_num_classes = 5 + seg_logit[:, 0:1] = seg_logit[:, 0:1] + \ + seg_logit[:, 20] + seg_logit[:, 23] + seg_logit[:, 1:8] = seg_logit[:, 1:8] + \ + seg_logit[:, 21] + seg_logit[:, 24] + seg_logit[:, 10:12] = seg_logit[:, 10:12] + \ + seg_logit[:, 21] + seg_logit[:, 24] + seg_logit[:, 13:16] = seg_logit[:, 13:16] + \ + seg_logit[:, 21] + seg_logit[:, 24] + seg_logit[:, 8:10] = seg_logit[:, 8:10] + \ + seg_logit[:, 22] + seg_logit[:, 24] + seg_logit[:, 12:13] = seg_logit[:, 12:13] + \ + seg_logit[:, 22] + seg_logit[:, 24] + seg_logit[:, 16:20] = seg_logit[:, 16:20] + \ + seg_logit[:, 22] + seg_logit[:, 24] + + # elif seg_logit.size(1) == 144 # For Mapillary dataset, 124+16+4 + # unofficial repository not release mapillary until 2023/2/6 + + if isinstance(batch_img_metas[0]['img_shape'], torch.Size): + # slide inference + size = batch_img_metas[0]['img_shape'] + elif 'pad_shape' in batch_img_metas[0]: + size = batch_img_metas[0]['pad_shape'][:2] + else: + size = batch_img_metas[0]['img_shape'] + seg_logit = seg_logit[:, :-hiera_num_classes] + seg_logit = resize( + input=seg_logit, + size=size, + mode='bilinear', + align_corners=self.align_corners) + + return seg_logit + + def loss_by_feat( + self, + seg_logits: Tuple[Tensor], # (out, embedding) + batch_data_samples: SampleList) -> dict: + """Compute segmentation loss. Will fix in future. + + Args: + seg_logits (Tuple[Tensor]): The output from decode head + forward function. + For this decode_head output are (out, embedding): tuple + batch_data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logit_before = seg_logits[0] + embedding = seg_logits[1] + seg_label = self._stack_batch_gt(batch_data_samples) + + loss = dict() + seg_logit = resize( + input=seg_logit_before, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + if self.sampler is not None: + seg_weight = self.sampler.sample(seg_logit, seg_label) + else: + seg_weight = None + seg_label = seg_label.squeeze(1) + seg_logit_before = resize( + input=seg_logit_before, + scale_factor=0.5, + mode='bilinear', + align_corners=self.align_corners) + + loss['loss_seg'] = self.loss_decode( + self.step, + embedding, + seg_logit_before, + seg_logit, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index) + loss['acc_seg'] = accuracy(seg_logit, seg_label) + return loss diff --git a/mmsegmentation/projects/hssn/losses/__init__.py b/mmsegmentation/projects/hssn/losses/__init__.py new file mode 100644 index 0000000..47d2686 --- /dev/null +++ b/mmsegmentation/projects/hssn/losses/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .hiera_triplet_loss_cityscape import HieraTripletLossCityscape + +__all__ = ['HieraTripletLossCityscape'] diff --git a/mmsegmentation/projects/hssn/losses/hiera_triplet_loss_cityscape.py b/mmsegmentation/projects/hssn/losses/hiera_triplet_loss_cityscape.py new file mode 100644 index 0000000..a784f13 --- /dev/null +++ b/mmsegmentation/projects/hssn/losses/hiera_triplet_loss_cityscape.py @@ -0,0 +1,218 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmseg.models.builder import LOSSES +from mmseg.models.losses.cross_entropy_loss import CrossEntropyLoss +from .tree_triplet_loss import TreeTripletLoss + +hiera_map = [0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 6, 6, 6, 6, 6] +hiera_index = [[0, 2], [2, 5], [5, 8], [8, 10], [10, 11], [11, 13], [13, 19]] + +hiera = { + 'hiera_high': { + 'flat': [0, 2], + 'construction': [2, 5], + 'object': [5, 8], + 'nature': [8, 10], + 'sky': [10, 11], + 'human': [11, 13], + 'vehicle': [13, 19] + } +} + + +def prepare_targets(targets): + b, h, w = targets.shape + targets_high = torch.ones( + (b, h, w), dtype=targets.dtype, device=targets.device) * 255 + indices_high = [] + for index, high in enumerate(hiera['hiera_high'].keys()): + indices = hiera['hiera_high'][high] + for ii in range(indices[0], indices[1]): + targets_high[targets == ii] = index + indices_high.append(indices) + + return targets, targets_high, indices_high + + +def losses_hiera(predictions, + targets, + targets_top, + num_classes, + indices_high, + eps=1e-8): + """Implementation of hiera loss. + + Args: + predictions (torch.Tensor): seg logits produced by decode head. + targets (torch.Tensor): The learning label of the prediction. + targets_top (torch.Tensor): The hierarchy ground truth of the learning + label. + num_classes (int): Number of categories. + indices_high (List[List[int]]): Hierarchy indices of each hierarchy. + eps (float):Term added to the Logarithm to improve numerical stability. + """ + b, _, h, w = predictions.shape + predictions = torch.sigmoid(predictions.float()) + void_indices = (targets == 255) + targets[void_indices] = 0 + targets = F.one_hot(targets, num_classes=num_classes).permute(0, 3, 1, 2) + void_indices2 = (targets_top == 255) + targets_top[void_indices2] = 0 + targets_top = F.one_hot(targets_top, num_classes=7).permute(0, 3, 1, 2) + + MCMA = predictions[:, :num_classes, :, :] + MCMB = torch.zeros((b, 7, h, w)).to(predictions) + for ii in range(7): + MCMB[:, ii:ii + 1, :, :] = torch.max( + torch.cat([ + predictions[:, indices_high[ii][0]:indices_high[ii][1], :, :], + predictions[:, num_classes + ii:num_classes + ii + 1, :, :] + ], + dim=1), 1, True)[0] + + MCLB = predictions[:, num_classes:num_classes + 7, :, :] + MCLA = predictions[:, :num_classes, :, :].clone() + for ii in range(7): + for jj in range(indices_high[ii][0], indices_high[ii][1]): + MCLA[:, jj:jj + 1, :, :] = torch.min( + torch.cat([ + predictions[:, jj:jj + 1, :, :], MCLB[:, ii:ii + 1, :, :] + ], + dim=1), 1, True)[0] + + valid_indices = (~void_indices).unsqueeze(1) + num_valid = valid_indices.sum() + valid_indices2 = (~void_indices2).unsqueeze(1) + num_valid2 = valid_indices2.sum() + # channel_num*sum()/one_channel_valid already has a weight + loss = ( + (-targets[:, :num_classes, :, :] * torch.log(MCLA + eps) - + (1.0 - targets[:, :num_classes, :, :]) * torch.log(1.0 - MCMA + eps)) + * valid_indices).sum() / num_valid / num_classes + loss += ((-targets_top[:, :, :, :] * torch.log(MCLB + eps) - + (1.0 - targets_top[:, :, :, :]) * torch.log(1.0 - MCMB + eps)) * + valid_indices2).sum() / num_valid2 / 7 + + return 5 * loss + + +def losses_hiera_focal(predictions, + targets, + targets_top, + num_classes, + indices_high, + eps=1e-8, + gamma=2): + """Implementation of hiera loss. + + Args: + predictions (torch.Tensor): seg logits produced by decode head. + targets (torch.Tensor): The learning label of the prediction. + targets_top (torch.Tensor): The hierarchy ground truth of the learning + label. + num_classes (int): Number of categories. + indices_high (List[List[int]]): Hierarchy indices of each hierarchy. + eps (float):Term added to the Logarithm to improve numerical stability. + Defaults: 1e-8. + gamma (int): The exponent value. Defaults: 2. + """ + b, _, h, w = predictions.shape + predictions = torch.sigmoid(predictions.float()) + void_indices = (targets == 255) + targets[void_indices] = 0 + targets = F.one_hot(targets, num_classes=num_classes).permute(0, 3, 1, 2) + void_indices2 = (targets_top == 255) + targets_top[void_indices2] = 0 + targets_top = F.one_hot(targets_top, num_classes=7).permute(0, 3, 1, 2) + + MCMA = predictions[:, :num_classes, :, :] + MCMB = torch.zeros((b, 7, h, w), + dtype=predictions.dtype, + device=predictions.device) + for ii in range(7): + MCMB[:, ii:ii + 1, :, :] = torch.max( + torch.cat([ + predictions[:, indices_high[ii][0]:indices_high[ii][1], :, :], + predictions[:, num_classes + ii:num_classes + ii + 1, :, :] + ], + dim=1), 1, True)[0] + + MCLB = predictions[:, num_classes:num_classes + 7, :, :] + MCLA = predictions[:, :num_classes, :, :].clone() + for ii in range(7): + for jj in range(indices_high[ii][0], indices_high[ii][1]): + MCLA[:, jj:jj + 1, :, :] = torch.min( + torch.cat([ + predictions[:, jj:jj + 1, :, :], MCLB[:, ii:ii + 1, :, :] + ], + dim=1), 1, True)[0] + + valid_indices = (~void_indices).unsqueeze(1) + num_valid = valid_indices.sum() + valid_indices2 = (~void_indices2).unsqueeze(1) + num_valid2 = valid_indices2.sum() + # channel_num*sum()/one_channel_valid already has a weight + loss = ((-targets[:, :num_classes, :, :] * torch.pow( + (1.0 - MCLA), gamma) * torch.log(MCLA + eps) - + (1.0 - targets[:, :num_classes, :, :]) * torch.pow(MCMA, gamma) * + torch.log(1.0 - MCMA + eps)) * + valid_indices).sum() / num_valid / num_classes + loss += ( + (-targets_top[:, :, :, :] * torch.pow( + (1.0 - MCLB), gamma) * torch.log(MCLB + eps) - + (1.0 - targets_top[:, :, :, :]) * torch.pow(MCMB, gamma) * + torch.log(1.0 - MCMB + eps)) * valid_indices2).sum() / num_valid2 / 7 + + return 5 * loss + + +@LOSSES.register_module() +class HieraTripletLossCityscape(nn.Module): + """Modified from https://github.com/qhanghu/HSSN_pytorch/blob/main/mmseg/mo + dels/losses/hiera_triplet_loss_cityscape.py.""" + + def __init__(self, num_classes, use_sigmoid=False, loss_weight=1.0): + super().__init__() + self.num_classes = num_classes + self.loss_weight = loss_weight + self.treetripletloss = TreeTripletLoss(num_classes, hiera_map, + hiera_index) + self.ce = CrossEntropyLoss() + + def forward(self, + step, + embedding, + cls_score_before, + cls_score, + label, + weight=None, + **kwargs): + targets, targets_top, indices_top = prepare_targets(label) + + loss = losses_hiera(cls_score, targets, targets_top, self.num_classes, + indices_top) + ce_loss = self.ce(cls_score[:, :-7], label) + ce_loss2 = self.ce(cls_score[:, -7:], targets_top) + loss = loss + ce_loss + ce_loss2 + + loss_triplet, class_count = self.treetripletloss(embedding, label) + class_counts = [ + torch.ones_like(class_count) + for _ in range(torch.distributed.get_world_size()) + ] + torch.distributed.all_gather(class_counts, class_count, async_op=False) + class_counts = torch.cat(class_counts, dim=0) + + if torch.distributed.get_world_size() == torch.nonzero( + class_counts, as_tuple=False).size(0): + factor = 1 / 4 * (1 + torch.cos( + torch.tensor((step.item() - 80000) / 80000 * + math.pi))) if step.item() < 80000 else 0.5 + loss += factor * loss_triplet + + return loss * self.loss_weight diff --git a/mmsegmentation/projects/hssn/losses/tree_triplet_loss.py b/mmsegmentation/projects/hssn/losses/tree_triplet_loss.py new file mode 100644 index 0000000..ccc0937 --- /dev/null +++ b/mmsegmentation/projects/hssn/losses/tree_triplet_loss.py @@ -0,0 +1,86 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmseg.models.builder import LOSSES + + +@LOSSES.register_module() +class TreeTripletLoss(nn.Module): + """TreeTripletLoss. Modified from https://github.com/qhanghu/HSSN_pytorch/b + lob/main/mmseg/models/losses/tree_triplet_loss.py. + + Args: + num_classes (int): Number of categories. + hiera_map (List[int]): Hierarchy map of each category. + hiera_index (List[List[int]]): Hierarchy indices of each hierarchy. + ignore_index (int): Specifies a target value that is ignored and + does not contribute to the input gradients. Defaults: 255. + + Examples: + >>> num_classes = 19 + >>> hiera_map = [ + 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 6, 6, 6, 6, 6] + >>> hiera_index = [ + 0, 2], [2, 5], [5, 8], [8, 10], [10, 11], [11, 13], [13, 19]] + """ + + def __init__(self, num_classes, hiera_map, hiera_index, ignore_index=255): + super().__init__() + + self.ignore_label = ignore_index + self.num_classes = num_classes + self.hiera_map = hiera_map + self.hiera_index = hiera_index + + def forward(self, feats: torch.Tensor, labels=None, max_triplet=200): + labels = labels.unsqueeze(1).float().clone() + labels = torch.nn.functional.interpolate( + labels, (feats.shape[2], feats.shape[3]), mode='nearest') + labels = labels.squeeze(1).long() + assert labels.shape[-1] == feats.shape[-1], '{} {}'.format( + labels.shape, feats.shape) + + labels = labels.view(-1) + feats = feats.permute(0, 2, 3, 1) + feats = feats.contiguous().view(-1, feats.shape[-1]) + + triplet_loss = 0 + exist_classes = torch.unique(labels) + exist_classes = [x for x in exist_classes if x != 255] + class_count = 0 + + for ii in exist_classes: + index_range = self.hiera_index[self.hiera_map[ii]] + index_anchor = labels == ii + index_pos = (labels >= index_range[0]) & ( + labels < index_range[-1]) & (~index_anchor) + index_neg = (labels < index_range[0]) | (labels >= index_range[-1]) + + min_size = min( + torch.sum(index_anchor), torch.sum(index_pos), + torch.sum(index_neg), max_triplet) + + feats_anchor = feats[index_anchor][:min_size] + feats_pos = feats[index_pos][:min_size] + feats_neg = feats[index_neg][:min_size] + + distance = torch.zeros(min_size, 2).to(feats) + distance[:, 0:1] = 1 - (feats_anchor * feats_pos).sum(1, True) + distance[:, 1:2] = 1 - (feats_anchor * feats_neg).sum(1, True) + + # margin always 0.1 + (4-2)/4 since the hierarchy is three level + # TODO: should include label of pos is the same as anchor + margin = 0.6 * torch.ones(min_size).to(feats) + + tl = distance[:, 0] - distance[:, 1] + margin + tl = F.relu(tl) + + if tl.size(0) > 0: + triplet_loss += tl.mean() + class_count += 1 + if class_count == 0: + return None, torch.tensor([0]).to(feats) + triplet_loss /= class_count + return triplet_loss, torch.tensor([class_count]).to(feats) diff --git a/mmsegmentation/projects/isnet/README.md b/mmsegmentation/projects/isnet/README.md new file mode 100644 index 0000000..0a79ad6 --- /dev/null +++ b/mmsegmentation/projects/isnet/README.md @@ -0,0 +1,117 @@ +# ISNet + +[ISNet: Integrate Image-Level and Semantic-Level Context for Semantic Segmentation](https://arxiv.org/pdf/2108.12382.pdf) + +## Description + +This is an implementation of [ISNet](https://arxiv.org/pdf/2108.12382.pdf). +[Official Repo](https://github.com/SegmentationBLWX/sssegmentation) + +## Usage + +### Prerequisites + +- Python 3.7 +- PyTorch 1.6 or higher +- [MIM](https://github.com/open-mmlab/mim) v0.33 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc2 or higher + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `isnet/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Training commands + +```shell +mim train mmsegmentation configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py --work-dir work_dirs/isnet +``` + +To train on multiple GPUs, e.g. 8 GPUs, run the following command: + +```shell +mim train mmsegmentation configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py --work-dir work_dirs/isnet --launcher pytorch --gpus 8 +``` + +### Testing commands + +```shell +mim test mmsegmentation configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py --work-dir work_dirs/isnet --checkpoint ${CHECKPOINT_PATH} +``` + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | +| ------ | -------- | --------- | ------: | -------- | -------------- | ----: | ------------: | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| ISNet | R-50-D8 | 512x1024 | - | - | - | 79.32 | 80.88 | [config](configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/isnet/isnet_r50-d8_cityscapes-512x1024_20230104-a7a8ccf2.pth) | + +## Citation + +```bibtex +@article{Jin2021ISNetII, + title={ISNet: Integrate Image-Level and Semantic-Level Context for Semantic Segmentation}, + author={Zhenchao Jin and B. Liu and Qi Chu and Nenghai Yu}, + journal={2021 IEEE/CVF International Conference on Computer Vision (ICCV)}, + year={2021}, + pages={7169-7178} +} +``` + +## Checklist + +The progress of ISNet. + + + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + + + - [x] Basic docstrings & proper citation + + + + - [x] Test-time correctness + + + + - [x] A full README + + + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + + + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + + + - [ ] Unit tests + + + + - [ ] Code polishing + + + + - [ ] Metafile.yml + + + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + + + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/isnet/configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py b/mmsegmentation/projects/isnet/configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py new file mode 100644 index 0000000..a00d392 --- /dev/null +++ b/mmsegmentation/projects/isnet/configs/isnet_r50-d8_8xb2-160k_cityscapes-512x1024.py @@ -0,0 +1,80 @@ +_base_ = [ + '../../../configs/_base_/datasets/cityscapes.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_80k.py' +] + +data_root = '../../data/cityscapes/' +train_dataloader = dict(dataset=dict(data_root=data_root)) +val_dataloader = dict(dataset=dict(data_root=data_root)) +test_dataloader = dict(dataset=dict(data_root=data_root)) + +custom_imports = dict(imports=['projects.isnet.decode_heads']) + +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) + +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ISNetHead', + in_channels=(256, 512, 1024, 2048), + input_transform='multiple_select', + in_index=(0, 1, 2, 3), + channels=512, + dropout_ratio=0.1, + transform_channels=256, + concat_input=True, + with_shortcut=False, + shortcut_in_channels=256, + shortcut_feat_channels=48, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=[ + dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + loss_name='loss_o'), + dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=0.4, + loss_name='loss_d'), + ]), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=512, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + # test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)) + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/projects/isnet/decode_heads/__init__.py b/mmsegmentation/projects/isnet/decode_heads/__init__.py new file mode 100644 index 0000000..a451629 --- /dev/null +++ b/mmsegmentation/projects/isnet/decode_heads/__init__.py @@ -0,0 +1,3 @@ +from .isnet_head import ISNetHead + +__all__ = ['ISNetHead'] diff --git a/mmsegmentation/projects/isnet/decode_heads/isnet_head.py b/mmsegmentation/projects/isnet/decode_heads/isnet_head.py new file mode 100644 index 0000000..9c8df54 --- /dev/null +++ b/mmsegmentation/projects/isnet/decode_heads/isnet_head.py @@ -0,0 +1,337 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from torch import Tensor + +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.models.losses import accuracy +from mmseg.models.utils import SelfAttentionBlock, resize +from mmseg.registry import MODELS +from mmseg.utils import SampleList + + +class ImageLevelContext(nn.Module): + """ Image-Level Context Module + Args: + feats_channels (int): Input channels of query/key feature. + transform_channels (int): Output channels of key/query transform. + concat_input (bool): whether to concat input feature. + align_corners (bool): align_corners argument of F.interpolate. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, + feats_channels, + transform_channels, + concat_input=False, + align_corners=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None): + super().__init__() + self.align_corners = align_corners + self.global_avgpool = nn.AdaptiveAvgPool2d((1, 1)) + self.correlate_net = SelfAttentionBlock( + key_in_channels=feats_channels * 2, + query_in_channels=feats_channels, + channels=transform_channels, + out_channels=feats_channels, + share_key_query=False, + query_downsample=None, + key_downsample=None, + key_query_num_convs=2, + value_out_num_convs=1, + key_query_norm=True, + value_out_norm=True, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ) + if concat_input: + self.bottleneck = ConvModule( + feats_channels * 2, + feats_channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ) + + '''forward''' + + def forward(self, x): + x_global = self.global_avgpool(x) + x_global = resize( + x_global, + size=x.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + feats_il = self.correlate_net(x, torch.cat([x_global, x], dim=1)) + if hasattr(self, 'bottleneck'): + feats_il = self.bottleneck(torch.cat([x, feats_il], dim=1)) + return feats_il + + +class SemanticLevelContext(nn.Module): + """ Semantic-Level Context Module + Args: + feats_channels (int): Input channels of query/key feature. + transform_channels (int): Output channels of key/query transform. + concat_input (bool): whether to concat input feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, + feats_channels, + transform_channels, + concat_input=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None): + super().__init__() + self.correlate_net = SelfAttentionBlock( + key_in_channels=feats_channels, + query_in_channels=feats_channels, + channels=transform_channels, + out_channels=feats_channels, + share_key_query=False, + query_downsample=None, + key_downsample=None, + key_query_num_convs=2, + value_out_num_convs=1, + key_query_norm=True, + value_out_norm=True, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ) + if concat_input: + self.bottleneck = ConvModule( + feats_channels * 2, + feats_channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ) + + '''forward''' + + def forward(self, x, preds, feats_il): + inputs = x + batch_size, num_channels, h, w = x.size() + num_classes = preds.size(1) + feats_sl = torch.zeros(batch_size, h * w, num_channels).type_as(x) + for batch_idx in range(batch_size): + # (C, H, W), (num_classes, H, W) --> (H*W, C), (H*W, num_classes) + feats_iter, preds_iter = x[batch_idx], preds[batch_idx] + feats_iter, preds_iter = feats_iter.reshape( + num_channels, -1), preds_iter.reshape(num_classes, -1) + feats_iter, preds_iter = feats_iter.permute(1, + 0), preds_iter.permute( + 1, 0) + # (H*W, ) + argmax = preds_iter.argmax(1) + for clsid in range(num_classes): + mask = (argmax == clsid) + if mask.sum() == 0: + continue + feats_iter_cls = feats_iter[mask] + preds_iter_cls = preds_iter[:, clsid][mask] + weight = torch.softmax(preds_iter_cls, dim=0) + feats_iter_cls = feats_iter_cls * weight.unsqueeze(-1) + feats_iter_cls = feats_iter_cls.sum(0) + feats_sl[batch_idx][mask] = feats_iter_cls + feats_sl = feats_sl.reshape(batch_size, h, w, num_channels) + feats_sl = feats_sl.permute(0, 3, 1, 2).contiguous() + feats_sl = self.correlate_net(inputs, feats_sl) + if hasattr(self, 'bottleneck'): + feats_sl = self.bottleneck(torch.cat([feats_il, feats_sl], dim=1)) + return feats_sl + + +@MODELS.register_module() +class ISNetHead(BaseDecodeHead): + """ISNet: Integrate Image-Level and Semantic-Level + Context for Semantic Segmentation + + This head is the implementation of `ISNet` + `_. + + Args: + transform_channels (int): Output channels of key/query transform. + concat_input (bool): whether to concat input feature. + with_shortcut (bool): whether to use shortcut connection. + shortcut_in_channels (int): Input channels of shortcut. + shortcut_feat_channels (int): Output channels of shortcut. + dropout_ratio (float): Ratio of dropout. + """ + + def __init__(self, transform_channels, concat_input, with_shortcut, + shortcut_in_channels, shortcut_feat_channels, dropout_ratio, + **kwargs): + super().__init__(**kwargs) + + self.in_channels = self.in_channels[-1] + + self.bottleneck = ConvModule( + self.in_channels, + self.channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.ilc_net = ImageLevelContext( + feats_channels=self.channels, + transform_channels=transform_channels, + concat_input=concat_input, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.slc_net = SemanticLevelContext( + feats_channels=self.channels, + transform_channels=transform_channels, + concat_input=concat_input, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.decoder_stage1 = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Dropout2d(dropout_ratio), + nn.Conv2d( + self.channels, + self.num_classes, + kernel_size=1, + stride=1, + padding=0, + bias=True), + ) + + if with_shortcut: + self.shortcut = ConvModule( + shortcut_in_channels, + shortcut_feat_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.decoder_stage2 = nn.Sequential( + ConvModule( + self.channels + shortcut_feat_channels, + self.channels, + kernel_size=3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Dropout2d(dropout_ratio), + nn.Conv2d( + self.channels, + self.num_classes, + kernel_size=1, + stride=1, + padding=0, + bias=True), + ) + else: + self.decoder_stage2 = nn.Sequential( + nn.Dropout2d(dropout_ratio), + nn.Conv2d( + self.channels, + self.num_classes, + kernel_size=1, + stride=1, + padding=0, + bias=True), + ) + + self.conv_seg = None + self.dropout = None + + def forward(self, inputs): + x = self._transform_inputs(inputs) + feats = self.bottleneck(x[-1]) + + feats_il = self.ilc_net(feats) + + preds_stage1 = self.decoder_stage1(feats) + preds_stage1 = resize( + preds_stage1, + size=feats.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + + feats_sl = self.slc_net(feats, preds_stage1, feats_il) + + if hasattr(self, 'shortcut'): + shortcut_out = self.shortcut(x[0]) + feats_sl = resize( + feats_sl, + size=shortcut_out.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + feats_sl = torch.cat([feats_sl, shortcut_out], dim=1) + preds_stage2 = self.decoder_stage2(feats_sl) + + return preds_stage1, preds_stage2 + + def loss_by_feat(self, seg_logits: Tensor, + batch_data_samples: SampleList) -> dict: + seg_label = self._stack_batch_gt(batch_data_samples) + loss = dict() + + if self.sampler is not None: + seg_weight = self.sampler.sample(seg_logits[-1], seg_label) + else: + seg_weight = None + seg_label = seg_label.squeeze(1) + + for seg_logit, loss_decode in zip(seg_logits, self.loss_decode): + seg_logit = resize( + input=seg_logit, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + loss[loss_decode.name] = loss_decode( + seg_logit, + seg_label, + seg_weight, + ignore_index=self.ignore_index) + + loss['acc_seg'] = accuracy( + seg_logits[-1], seg_label, ignore_index=self.ignore_index) + return loss + + def predict_by_feat(self, seg_logits: Tensor, + batch_img_metas: List[dict]) -> Tensor: + _, seg_logits_stage2 = seg_logits + return super().predict_by_feat(seg_logits_stage2, batch_img_metas) diff --git a/mmsegmentation/projects/mapillary_dataset/README.md b/mmsegmentation/projects/mapillary_dataset/README.md new file mode 100644 index 0000000..44a1e33 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/README.md @@ -0,0 +1,86 @@ +# Mapillary Vistas Dataset + +Support **`Mapillary Vistas Dataset`** + +## Description + +Author: AI-Tianlong + +This project implements **`Mapillary Vistas Dataset`** + +### Dataset preparing + +Preparing `Mapillary Vistas Dataset` dataset following [Mapillary Vistas Dataset Preparing Guide](https://github.com/open-mmlab/mmsegmentation/tree/main/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md) + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ tools + โ”œโ”€โ”€ configs + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ mapillary + โ”‚ โ”‚ โ”œโ”€โ”€ training + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels_mask + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels_mask + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + โ”‚ โ”‚ โ”œโ”€โ”€ validation + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels_mask + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels_mask + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons +``` + +### Training commands + +```bash +# Dataset train commands +# at `mmsegmentation` folder +bash tools/dist_train.sh projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v1-512x1024.py 4 +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [ ] Test-time correctness + + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [x] Milestone 3: Good to be a part of our core package! + + - [x] Type hints and docstrings + + - [x] Unit tests + + - [x] Code polishing + + - [x] Metafile.yml + +- [x] Move your modules into the core package following the codebase's file hierarchy structure. + +- [x] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1.py b/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1.py new file mode 100644 index 0000000..611aa47 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'MapillaryDataset_v1' +data_root = 'data/mapillary/' +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='training/images', seg_map_path='training/v1.2/labels'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='validation/images', + seg_map_path='validation/v1.2/labels'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1_65.py b/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1_65.py new file mode 100644 index 0000000..f594f37 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v1_65.py @@ -0,0 +1,37 @@ +# dataset settings +_base_ = './mapillary_v1.py' +metainfo = dict( + classes=('Bird', 'Ground Animal', 'Curb', 'Fence', 'Guard Rail', 'Barrier', + 'Wall', 'Bike Lane', 'Crosswalk - Plain', 'Curb Cut', 'Parking', + 'Pedestrian Area', 'Rail Track', 'Road', 'Service Lane', + 'Sidewalk', 'Bridge', 'Building', 'Tunnel', 'Person', 'Bicyclist', + 'Motorcyclist', 'Other Rider', 'Lane Marking - Crosswalk', + 'Lane Marking - General', 'Mountain', 'Sand', 'Sky', 'Snow', + 'Terrain', 'Vegetation', 'Water', 'Banner', 'Bench', 'Bike Rack', + 'Billboard', 'Catch Basin', 'CCTV Camera', 'Fire Hydrant', + 'Junction Box', 'Mailbox', 'Manhole', 'Phone Booth', 'Pothole', + 'Street Light', 'Pole', 'Traffic Sign Frame', 'Utility Pole', + 'Traffic Light', 'Traffic Sign (Back)', 'Traffic Sign (Front)', + 'Trash Can', 'Bicycle', 'Boat', 'Bus', 'Car', 'Caravan', + 'Motorcycle', 'On Rails', 'Other Vehicle', 'Trailer', 'Truck', + 'Wheeled Slow', 'Car Mount', 'Ego Vehicle'), + palette=[[165, 42, 42], [0, 192, 0], [196, 196, 196], [190, 153, 153], + [180, 165, 180], [90, 120, 150], [102, 102, 156], [128, 64, 255], + [140, 140, 200], [170, 170, 170], [250, 170, 160], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], [244, 35, 232], + [150, 100, 100], [70, 70, 70], [150, 120, 90], [220, 20, 60], + [255, 0, 0], [255, 0, 100], [255, 0, 200], [200, 128, 128], + [255, 255, 255], [64, 170, 64], [230, 160, 50], [70, 130, 180], + [190, 255, 255], [152, 251, 152], [107, 142, 35], [0, 170, 30], + [255, 255, 128], [250, 0, 30], [100, 140, 180], [220, 220, 220], + [220, 128, 128], [222, 40, 40], [100, 170, 30], [40, 40, 40], + [33, 33, 33], [100, 128, 160], [142, 0, 0], [70, 100, 150], + [210, 170, 100], [153, 153, 153], [128, 128, 128], [0, 0, 80], + [250, 170, 30], [192, 192, 192], [220, 220, 0], [140, 140, 20], + [119, 11, 32], [150, 0, 255], [0, 60, 100], [0, 0, 142], + [0, 0, 90], [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 192], [32, 32, 32], [120, 10, 10]]) + +train_dataloader = dict(dataset=dict(metainfo=metainfo)) +val_dataloader = dict(dataset=dict(metainfo=metainfo)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v2.py b/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v2.py new file mode 100644 index 0000000..7cb7a95 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/_base_/datasets/mapillary_v2.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'MapillaryDataset_v2' +data_root = 'data/mapillary/' +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(2048, 1024), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=2, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='training/images', seg_map_path='training/v2.0/labels'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='validation/images', + seg_map_path='validation/v2.0/labels'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v1-512x1024.py b/mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v1-512x1024.py new file mode 100644 index 0000000..b559e0d --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v1-512x1024.py @@ -0,0 +1,17 @@ +_base_ = [ + '../../../configs/_base_/models/deeplabv3plus_r50-d8.py', + './_base_/datasets/mapillary_v1.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_240k.py' +] +custom_imports = dict( + imports=['projects.mapillary_dataset.mmseg.datasets.mapillary']) + +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101), + decode_head=dict(num_classes=66), + auxiliary_head=dict(num_classes=66)) diff --git a/mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v2-512x1024.py b/mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v2-512x1024.py new file mode 100644 index 0000000..cfe31a2 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_mapillay_v2-512x1024.py @@ -0,0 +1,16 @@ +_base_ = [ + '../../../configs/_base_/models/deeplabv3plus_r50-d8.py', + './_base_/datasets/mapillary_v2.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_240k.py' +] +custom_imports = dict( + imports=['projects.mapillary_dataset.mmseg.datasets.mapillary']) +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101), + decode_head=dict(num_classes=124), + auxiliary_head=dict(num_classes=124)) diff --git a/mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v1-512x1024.py b/mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v1-512x1024.py new file mode 100644 index 0000000..1ca2b57 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v1-512x1024.py @@ -0,0 +1,16 @@ +_base_ = [ + '../../../configs/_base_/models/pspnet_r50-d8.py', + './_base_/datasets/mapillary_v1.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_240k.py' +] +custom_imports = dict( + imports=['projects.mapillary_dataset.mmseg.datasets.mapillary']) +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101), + decode_head=dict(num_classes=66), + auxiliary_head=dict(num_classes=66)) diff --git a/mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v2-512x1024.py b/mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v2-512x1024.py new file mode 100644 index 0000000..c04746a --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/configs/pspnet_r101-d8_4xb2-240k_mapillay_v2-512x1024.py @@ -0,0 +1,16 @@ +_base_ = [ + '../../../configs/_base_/models/pspnet_r50-d8.py', + './_base_/datasets/mapillary_v2.py', + '../../../configs/_base_/default_runtime.py', + '../../../configs/_base_/schedules/schedule_240k.py' +] +custom_imports = dict( + imports=['projects.mapillary_dataset.mmseg.datasets.mapillary']) +crop_size = (512, 1024) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet101_v1c', + backbone=dict(depth=101), + decode_head=dict(num_classes=124), + auxiliary_head=dict(num_classes=124)) diff --git a/mmsegmentation/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md b/mmsegmentation/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md new file mode 100644 index 0000000..c5cbc0f --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md @@ -0,0 +1,255 @@ +## Mapillary Vistas Datasets + +- The dataset could be download [here](https://www.mapillary.com/dataset/vistas) after registration. + +- Mapillary Vistas Dataset use 8-bit with color-palette to store labels. No conversion operation is required. + +- Assumption you have put the dataset zip file in `mmsegmentation/data/mapillary` + +- Please run the following commands to unzip dataset. + + ```bash + cd data/mapillary + unzip An-ZjB1Zm61yAZG0ozTymz8I8NqI4x0MrYrh26dq7kPgfu8vf9ImrdaOAVOFYbJ2pNAgUnVGBmbue9lTgdBOb5BbKXIpFs0fpYWqACbrQDChAA2fdX0zS9PcHu7fY8c-FOvyBVxPNYNFQuM.zip + ``` + +- After unzip, you will get Mapillary Vistas Dataset like this structure. Semantic segmentation mask labels in `labels` folder. + + ```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ tools + โ”œโ”€โ”€ configs + โ”œโ”€โ”€ data + โ”‚ โ”œโ”€โ”€ mapillary + โ”‚ โ”‚ โ”œโ”€โ”€ training + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + โ”‚ โ”‚ โ”œโ”€โ”€ validation + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + | โ”‚ โ”‚ โ”œโ”€โ”€ v1.2 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ panoptic + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ v2.0 + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instances + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ labels + | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ panoptic + | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ polygons + ``` + +- You could set Datasets version with `MapillaryDataset_v1` and `MapillaryDataset_v2` in your configs. + View the Mapillary Vistas Datasets config file here [V1.2](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/datasets/mapillary_v1.py) and [V2.0](https://github.com/open-mmlab/mmsegmentation/blob/main/configs/_base_/datasets/mapillary_v2.py) + +- **View datasets labels index and palette** + +- **Mapillary Vistas Datasets labels information** + **v1.2 information** + + ```none + There are 66 labels classes in v1.2 + 0--Bird--[165, 42, 42], + 1--Ground Animal--[0, 192, 0], + 2--Curb--[196, 196, 196], + 3--Fence--[190, 153, 153], + 4--Guard Rail--[180, 165, 180], + 5--Barrier--[90, 120, 150], + 6--Wall--[102, 102, 156], + 7--Bike Lane--[128, 64, 255], + 8--Crosswalk - Plain--[140, 140, 200], + 9--Curb Cut--[170, 170, 170], + 10--Parking--[250, 170, 160], + 11--Pedestrian Area--[96, 96, 96], + 12--Rail Track--[230, 150, 140], + 13--Road--[128, 64, 128], + 14--Service Lane--[110, 110, 110], + 15--Sidewalk--[244, 35, 232], + 16--Bridge--[150, 100, 100], + 17--Building--[70, 70, 70], + 18--Tunnel--[150, 120, 90], + 19--Person--[220, 20, 60], + 20--Bicyclist--[255, 0, 0], + 21--Motorcyclist--[255, 0, 100], + 22--Other Rider--[255, 0, 200], + 23--Lane Marking - Crosswalk--[200, 128, 128], + 24--Lane Marking - General--[255, 255, 255], + 25--Mountain--[64, 170, 64], + 26--Sand--[230, 160, 50], + 27--Sky--[70, 130, 180], + 28--Snow--[190, 255, 255], + 29--Terrain--[152, 251, 152], + 30--Vegetation--[107, 142, 35], + 31--Water--[0, 170, 30], + 32--Banner--[255, 255, 128], + 33--Bench--[250, 0, 30], + 34--Bike Rack--[100, 140, 180], + 35--Billboard--[220, 220, 220], + 36--Catch Basin--[220, 128, 128], + 37--CCTV Camera--[222, 40, 40], + 38--Fire Hydrant--[100, 170, 30], + 39--Junction Box--[40, 40, 40], + 40--Mailbox--[33, 33, 33], + 41--Manhole--[100, 128, 160], + 42--Phone Booth--[142, 0, 0], + 43--Pothole--[70, 100, 150], + 44--Street Light--[210, 170, 100], + 45--Pole--[153, 153, 153], + 46--Traffic Sign Frame--[128, 128, 128], + 47--Utility Pole--[0, 0, 80], + 48--Traffic Light--[250, 170, 30], + 49--Traffic Sign (Back)--[192, 192, 192], + 50--Traffic Sign (Front)--[220, 220, 0], + 51--Trash Can--[140, 140, 20], + 52--Bicycle--[119, 11, 32], + 53--Boat--[150, 0, 255], + 54--Bus--[0, 60, 100], + 55--Car--[0, 0, 142], + 56--Caravan--[0, 0, 90], + 57--Motorcycle--[0, 0, 230], + 58--On Rails--[0, 80, 100], + 59--Other Vehicle--[128, 64, 64], + 60--Trailer--[0, 0, 110], + 61--Truck--[0, 0, 70], + 62--Wheeled Slow--[0, 0, 192], + 63--Car Mount--[32, 32, 32], + 64--Ego Vehicle--[120, 10, 10], + 65--Unlabeled--[0, 0, 0] + ``` + + **v2.0 information** + + ```none + There are 124 labels classes in v2.0 + 0--Bird--[165, 42, 42], + 1--Ground Animal--[0, 192, 0], + 2--Ambiguous Barrier--[250, 170, 31], + 3--Concrete Block--[250, 170, 32], + 4--Curb--[196, 196, 196], + 5--Fence--[190, 153, 153], + 6--Guard Rail--[180, 165, 180], + 7--Barrier--[90, 120, 150], + 8--Road Median--[250, 170, 33], + 9--Road Side--[250, 170, 34], + 10--Lane Separator--[128, 128, 128], + 11--Temporary Barrier--[250, 170, 35], + 12--Wall--[102, 102, 156], + 13--Bike Lane--[128, 64, 255], + 14--Crosswalk - Plain--[140, 140, 200], + 15--Curb Cut--[170, 170, 170], + 16--Driveway--[250, 170, 36], + 17--Parking--[250, 170, 160], + 18--Parking Aisle--[250, 170, 37], + 19--Pedestrian Area--[96, 96, 96], + 20--Rail Track--[230, 150, 140], + 21--Road--[128, 64, 128], + 22--Road Shoulder--[110, 110, 110], + 23--Service Lane--[110, 110, 110], + 24--Sidewalk--[244, 35, 232], + 25--Traffic Island--[128, 196, 128], + 26--Bridge--[150, 100, 100], + 27--Building--[70, 70, 70], + 28--Garage--[150, 150, 150], + 29--Tunnel--[150, 120, 90], + 30--Person--[220, 20, 60], + 31--Person Group--[220, 20, 60], + 32--Bicyclist--[255, 0, 0], + 33--Motorcyclist--[255, 0, 100], + 34--Other Rider--[255, 0, 200], + 35--Lane Marking - Dashed Line--[255, 255, 255], + 36--Lane Marking - Straight Line--[255, 255, 255], + 37--Lane Marking - Zigzag Line--[250, 170, 29], + 38--Lane Marking - Ambiguous--[250, 170, 28], + 39--Lane Marking - Arrow (Left)--[250, 170, 26], + 40--Lane Marking - Arrow (Other)--[250, 170, 25], + 41--Lane Marking - Arrow (Right)--[250, 170, 24], + 42--Lane Marking - Arrow (Split Left or Straight)--[250, 170, 22], + 43--Lane Marking - Arrow (Split Right or Straight)--[250, 170, 21], + 44--Lane Marking - Arrow (Straight)--[250, 170, 20], + 45--Lane Marking - Crosswalk--[255, 255, 255], + 46--Lane Marking - Give Way (Row)--[250, 170, 19], + 47--Lane Marking - Give Way (Single)--[250, 170, 18], + 48--Lane Marking - Hatched (Chevron)--[250, 170, 12], + 49--Lane Marking - Hatched (Diagonal)--[250, 170, 11], + 50--Lane Marking - Other--[255, 255, 255], + 51--Lane Marking - Stop Line--[255, 255, 255], + 52--Lane Marking - Symbol (Bicycle)--[250, 170, 16], + 53--Lane Marking - Symbol (Other)--[250, 170, 15], + 54--Lane Marking - Text--[250, 170, 15], + 55--Lane Marking (only) - Dashed Line--[255, 255, 255], + 56--Lane Marking (only) - Crosswalk--[255, 255, 255], + 57--Lane Marking (only) - Other--[255, 255, 255], + 58--Lane Marking (only) - Test--[255, 255, 255], + 59--Mountain--[64, 170, 64], + 60--Sand--[230, 160, 50], + 61--Sky--[70, 130, 180], + 62--Snow--[190, 255, 255], + 63--Terrain--[152, 251, 152], + 64--Vegetation--[107, 142, 35], + 65--Water--[0, 170, 30], + 66--Banner--[255, 255, 128], + 67--Bench--[250, 0, 30], + 68--Bike Rack--[100, 140, 180], + 69--Catch Basin--[220, 128, 128], + 70--CCTV Camera--[222, 40, 40], + 71--Fire Hydrant--[100, 170, 30], + 72--Junction Box--[40, 40, 40], + 73--Mailbox--[33, 33, 33], + 74--Manhole--[100, 128, 160], + 75--Parking Meter--[20, 20, 255], + 76--Phone Booth--[142, 0, 0], + 77--Pothole--[70, 100, 150], + 78--Signage - Advertisement--[250, 171, 30], + 79--Signage - Ambiguous--[250, 172, 30], + 80--Signage - Back--[250, 173, 30], + 81--Signage - Information--[250, 174, 30], + 82--Signage - Other--[250, 175, 30], + 83--Signage - Store--[250, 176, 30], + 84--Street Light--[210, 170, 100], + 85--Pole--[153, 153, 153], + 86--Pole Group--[153, 153, 153], + 87--Traffic Sign Frame--[128, 128, 128], + 88--Utility Pole--[0, 0, 80], + 89--Traffic Cone--[210, 60, 60], + 90--Traffic Light - General (Single)--[250, 170, 30], + 91--Traffic Light - Pedestrians--[250, 170, 30], + 92--Traffic Light - General (Upright)--[250, 170, 30], + 93--Traffic Light - General (Horizontal)--[250, 170, 30], + 94--Traffic Light - Cyclists--[250, 170, 30], + 95--Traffic Light - Other--[250, 170, 30], + 96--Traffic Sign - Ambiguous--[192, 192, 192], + 97--Traffic Sign (Back)--[192, 192, 192], + 98--Traffic Sign - Direction (Back)--[192, 192, 192], + 99--Traffic Sign - Direction (Front)--[220, 220, 0], + 100--Traffic Sign (Front)--[220, 220, 0], + 101--Traffic Sign - Parking--[0, 0, 196], + 102--Traffic Sign - Temporary (Back)--[192, 192, 192], + 103--Traffic Sign - Temporary (Front)--[220, 220, 0], + 104--Trash Can--[140, 140, 20], + 105--Bicycle--[119, 11, 32], + 106--Boat--[150, 0, 255], + 107--Bus--[0, 60, 100], + 108--Car--[0, 0, 142], + 109--Caravan--[0, 0, 90], + 110--Motorcycle--[0, 0, 230], + 111--On Rails--[0, 80, 100], + 112--Other Vehicle--[128, 64, 64], + 113--Trailer--[0, 0, 110], + 114--Truck--[0, 0, 70], + 115--Vehicle Group--[0, 0, 142], + 116--Wheeled Slow--[0, 0, 192], + 117--Water Valve--[170, 170, 170], + 118--Car Mount--[32, 32, 32], + 119--Dynamic--[111, 74, 0], + 120--Ego Vehicle--[120, 10, 10], + 121--Ground--[81, 0, 81], + 122--Static--[111, 111, 0], + 123--Unlabeled--[0, 0, 0] + ``` diff --git a/mmsegmentation/projects/mapillary_dataset/mmseg/datasets/mapillary.py b/mmsegmentation/projects/mapillary_dataset/mmseg/datasets/mapillary.py new file mode 100644 index 0000000..f49bd54 --- /dev/null +++ b/mmsegmentation/projects/mapillary_dataset/mmseg/datasets/mapillary.py @@ -0,0 +1,177 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.datasets.basesegdataset import BaseSegDataset + +# from mmseg.registry import DATASETS + + +# @DATASETS.register_module() +class MapillaryDataset_v1(BaseSegDataset): + """Mapillary Vistas Dataset. + + Dataset paper link: + http://ieeexplore.ieee.org/document/8237796/ + + v1.2 contain 66 object classes. + (37 instance-specific) + + v2.0 contain 124 object classes. + (70 instance-specific, 46 stuff, 8 void or crowd). + + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png' for Mapillary Vistas Dataset. + """ + METAINFO = dict( + classes=('Bird', 'Ground Animal', 'Curb', 'Fence', 'Guard Rail', + 'Barrier', 'Wall', 'Bike Lane', 'Crosswalk - Plain', + 'Curb Cut', 'Parking', 'Pedestrian Area', 'Rail Track', + 'Road', 'Service Lane', 'Sidewalk', 'Bridge', 'Building', + 'Tunnel', 'Person', 'Bicyclist', 'Motorcyclist', + 'Other Rider', 'Lane Marking - Crosswalk', + 'Lane Marking - General', 'Mountain', 'Sand', 'Sky', 'Snow', + 'Terrain', 'Vegetation', 'Water', 'Banner', 'Bench', + 'Bike Rack', 'Billboard', 'Catch Basin', 'CCTV Camera', + 'Fire Hydrant', 'Junction Box', 'Mailbox', 'Manhole', + 'Phone Booth', 'Pothole', 'Street Light', 'Pole', + 'Traffic Sign Frame', 'Utility Pole', 'Traffic Light', + 'Traffic Sign (Back)', 'Traffic Sign (Front)', 'Trash Can', + 'Bicycle', 'Boat', 'Bus', 'Car', 'Caravan', 'Motorcycle', + 'On Rails', 'Other Vehicle', 'Trailer', 'Truck', + 'Wheeled Slow', 'Car Mount', 'Ego Vehicle', 'Unlabeled'), + palette=[[165, 42, 42], [0, 192, 0], [196, 196, 196], [190, 153, 153], + [180, 165, 180], [90, 120, 150], [102, 102, 156], + [128, 64, 255], [140, 140, 200], [170, 170, 170], + [250, 170, 160], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], + [244, 35, 232], [150, 100, 100], [70, 70, 70], [150, 120, 90], + [220, 20, 60], [255, 0, 0], [255, 0, 100], [255, 0, 200], + [200, 128, 128], [255, 255, 255], [64, 170, + 64], [230, 160, 50], + [70, 130, 180], [190, 255, 255], [152, 251, 152], + [107, 142, 35], [0, 170, 30], [255, 255, 128], [250, 0, 30], + [100, 140, 180], [220, 220, 220], [220, 128, 128], + [222, 40, 40], [100, 170, 30], [40, 40, 40], [33, 33, 33], + [100, 128, 160], [142, 0, 0], [70, 100, 150], [210, 170, 100], + [153, 153, 153], [128, 128, 128], [0, 0, 80], [250, 170, 30], + [192, 192, 192], [220, 220, 0], [140, 140, 20], [119, 11, 32], + [150, 0, 255], [0, 60, 100], [0, 0, 142], [0, 0, 90], + [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 192], [32, 32, 32], [120, 10, + 10], [0, 0, 0]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) + + +# @DATASETS.register_module() +class MapillaryDataset_v2(BaseSegDataset): + """Mapillary Vistas Dataset. + + Dataset paper link: + http://ieeexplore.ieee.org/document/8237796/ + + v1.2 contain 66 object classes. + (37 instance-specific) + + v2.0 contain 124 object classes. + (70 instance-specific, 46 stuff, 8 void or crowd). + + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png' for Mapillary Vistas Dataset. + """ + METAINFO = dict( + classes=( + 'Bird', 'Ground Animal', 'Ambiguous Barrier', 'Concrete Block', + 'Curb', 'Fence', 'Guard Rail', 'Barrier', 'Road Median', + 'Road Side', 'Lane Separator', 'Temporary Barrier', 'Wall', + 'Bike Lane', 'Crosswalk - Plain', 'Curb Cut', 'Driveway', + 'Parking', 'Parking Aisle', 'Pedestrian Area', 'Rail Track', + 'Road', 'Road Shoulder', 'Service Lane', 'Sidewalk', + 'Traffic Island', 'Bridge', 'Building', 'Garage', 'Tunnel', + 'Person', 'Person Group', 'Bicyclist', 'Motorcyclist', + 'Other Rider', 'Lane Marking - Dashed Line', + 'Lane Marking - Straight Line', 'Lane Marking - Zigzag Line', + 'Lane Marking - Ambiguous', 'Lane Marking - Arrow (Left)', + 'Lane Marking - Arrow (Other)', 'Lane Marking - Arrow (Right)', + 'Lane Marking - Arrow (Split Left or Straight)', + 'Lane Marking - Arrow (Split Right or Straight)', + 'Lane Marking - Arrow (Straight)', 'Lane Marking - Crosswalk', + 'Lane Marking - Give Way (Row)', + 'Lane Marking - Give Way (Single)', + 'Lane Marking - Hatched (Chevron)', + 'Lane Marking - Hatched (Diagonal)', 'Lane Marking - Other', + 'Lane Marking - Stop Line', 'Lane Marking - Symbol (Bicycle)', + 'Lane Marking - Symbol (Other)', 'Lane Marking - Text', + 'Lane Marking (only) - Dashed Line', + 'Lane Marking (only) - Crosswalk', 'Lane Marking (only) - Other', + 'Lane Marking (only) - Test', 'Mountain', 'Sand', 'Sky', 'Snow', + 'Terrain', 'Vegetation', 'Water', 'Banner', 'Bench', 'Bike Rack', + 'Catch Basin', 'CCTV Camera', 'Fire Hydrant', 'Junction Box', + 'Mailbox', 'Manhole', 'Parking Meter', 'Phone Booth', 'Pothole', + 'Signage - Advertisement', 'Signage - Ambiguous', 'Signage - Back', + 'Signage - Information', 'Signage - Other', 'Signage - Store', + 'Street Light', 'Pole', 'Pole Group', 'Traffic Sign Frame', + 'Utility Pole', 'Traffic Cone', 'Traffic Light - General (Single)', + 'Traffic Light - Pedestrians', 'Traffic Light - General (Upright)', + 'Traffic Light - General (Horizontal)', 'Traffic Light - Cyclists', + 'Traffic Light - Other', 'Traffic Sign - Ambiguous', + 'Traffic Sign (Back)', 'Traffic Sign - Direction (Back)', + 'Traffic Sign - Direction (Front)', 'Traffic Sign (Front)', + 'Traffic Sign - Parking', 'Traffic Sign - Temporary (Back)', + 'Traffic Sign - Temporary (Front)', 'Trash Can', 'Bicycle', 'Boat', + 'Bus', 'Car', 'Caravan', 'Motorcycle', 'On Rails', 'Other Vehicle', + 'Trailer', 'Truck', 'Vehicle Group', 'Wheeled Slow', 'Water Valve', + 'Car Mount', 'Dynamic', 'Ego Vehicle', 'Ground', 'Static', + 'Unlabeled'), + palette=[[165, 42, 42], [0, 192, 0], [250, 170, 31], [250, 170, 32], + [196, 196, 196], [190, 153, 153], [180, 165, 180], + [90, 120, 150], [250, 170, 33], [250, 170, 34], + [128, 128, 128], [250, 170, 35], [102, 102, 156], + [128, 64, 255], [140, 140, 200], [170, 170, 170], + [250, 170, 36], [250, 170, 160], [250, 170, 37], [96, 96, 96], + [230, 150, 140], [128, 64, 128], [110, 110, 110], + [110, 110, 110], [244, 35, 232], [128, 196, + 128], [150, 100, 100], + [70, 70, 70], [150, 150, 150], [150, 120, 90], [220, 20, 60], + [220, 20, 60], [255, 0, 0], [255, 0, 100], [255, 0, 200], + [255, 255, 255], [255, 255, 255], [250, 170, 29], + [250, 170, 28], [250, 170, 26], [250, 170, + 25], [250, 170, 24], + [250, 170, 22], [250, 170, 21], [250, 170, + 20], [255, 255, 255], + [250, 170, 19], [250, 170, 18], [250, 170, + 12], [250, 170, 11], + [255, 255, 255], [255, 255, 255], [250, 170, 16], + [250, 170, 15], [250, 170, 15], [255, 255, 255], + [255, 255, 255], [255, 255, 255], [255, 255, 255], + [64, 170, 64], [230, 160, 50], + [70, 130, 180], [190, 255, 255], [152, 251, 152], + [107, 142, 35], [0, 170, 30], [255, 255, 128], [250, 0, 30], + [100, 140, 180], [220, 128, 128], [222, 40, + 40], [100, 170, 30], + [40, 40, 40], [33, 33, 33], [100, 128, 160], [20, 20, 255], + [142, 0, 0], [70, 100, 150], [250, 171, 30], [250, 172, 30], + [250, 173, 30], [250, 174, 30], [250, 175, + 30], [250, 176, 30], + [210, 170, 100], [153, 153, 153], [153, 153, 153], + [128, 128, 128], [0, 0, 80], [210, 60, 60], [250, 170, 30], + [250, 170, 30], [250, 170, 30], [250, 170, + 30], [250, 170, 30], + [250, 170, 30], [192, 192, 192], [192, 192, 192], + [192, 192, 192], [220, 220, 0], [220, 220, 0], [0, 0, 196], + [192, 192, 192], [220, 220, 0], [140, 140, 20], [119, 11, 32], + [150, 0, 255], [0, 60, 100], [0, 0, 142], [0, 0, 90], + [0, 0, 230], [0, 80, 100], [128, 64, 64], [0, 0, 110], + [0, 0, 70], [0, 0, 142], [0, 0, 192], [170, 170, 170], + [32, 32, 32], [111, 74, 0], [120, 10, 10], [81, 0, 81], + [111, 111, 0], [0, 0, 0]]) + + def __init__(self, + img_suffix='.jpg', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/README.md b/mmsegmentation/projects/medical/2d_image/ct/cranium/README.md new file mode 100644 index 0000000..d3fa64e --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/README.md @@ -0,0 +1,142 @@ +# Brain CT Images with Intracranial Hemorrhage Masks (Cranium) + +## Description + +This project supports **`Brain CT Images with Intracranial Hemorrhage Masks (Cranium)`**, which can be downloaded from [here](https://www.kaggle.com/datasets/vbookshelf/computed-tomography-ct-images). + +### Dataset Overview + +This dataset consists of head CT (Computed Thomography) images in jpg format. There are 2500 brain window images and 2500 bone window images, for 82 patients. There are approximately 30 image slices per patient. 318 images have associated intracranial image masks. Also included are csv files containing hemorrhage diagnosis data and patient data. +This is version 1.0.0 of this dataset. A full description of this dataset as well as updated versions can be found here: +https://physionet.org/content/ct-ich/1.0.0/ + +### Statistic Information + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ----------------------------------------------------------------------------------- | ----------------- | ------------ | -------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------- | +| [Cranium](https://www.kaggle.com/datasets/vbookshelf/computed-tomography-ct-images) | head_and_neck | segmentation | ct | 2 | 2501/-/- | yes/-/- | 2020 | [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 2501 | 99.93 | - | - | - | - | +| hemorrhage | 318 | 0.07 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![cranium](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/ct/cranium/cranium_dataset.png?raw=true) + +## Dataset Citation + +``` +@article{hssayeni2020computed, + title={Computed tomography images for intracranial hemorrhage detection and segmentation}, + author={Hssayeni, Murtadha and Croock, MS and Salman, AD and Al-khafaji, HF and Yahya, ZA and Ghoraani, B}, + journal={Intracranial Hemorrhage Segmentation Using A Deep Convolutional Model. Data}, + volume={5}, + number={1}, + pages={179}, + year={2020} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 9.3.0 +- scikit-learn(sklearn) v1.2.0 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `cranium/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://www.kaggle.com/datasets/vbookshelf/computed-tomography-ct-images) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ct + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ cranium + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 2000 | 99.93 | 501 | 99.92 | - | - | +| hemorrhage | 260 | 0.07 | 260 | 0.08 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/cranium_512x512.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/cranium_512x512.py new file mode 100644 index 0000000..d9b4436 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/cranium_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'CraniumDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_cranium-512x512.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_cranium-512x512.py new file mode 100644 index 0000000..ac013a2 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_cranium-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './cranium_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.cranium_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_cranium-512x512.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_cranium-512x512.py new file mode 100644 index 0000000..c71110a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_cranium-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './cranium_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.cranium_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_cranium-512x512.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_cranium-512x512.py new file mode 100644 index 0000000..abbdac2 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_cranium-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './cranium_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.cranium_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_cranium-512x512.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_cranium-512x512.py new file mode 100644 index 0000000..4185952 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_cranium-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './cranium_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.cranium_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/datasets/cranium_dataset.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/datasets/cranium_dataset.py new file mode 100644 index 0000000..d65f1cb --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/datasets/cranium_dataset.py @@ -0,0 +1,31 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class CraniumDataset(BaseSegDataset): + """CraniumDataset dataset. + + In segmentation map annotation for CraniumDataset, + 0 stands for background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'hemorrhage')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/ct/cranium/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/ct/cranium/tools/prepare_dataset.py new file mode 100644 index 0000000..1aa4e43 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/ct/cranium/tools/prepare_dataset.py @@ -0,0 +1,66 @@ +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.png' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' +tgt_img_dir = os.path.join(root_path, 'images/train/') +tgt_mask_dir = os.path.join(root_path, 'masks/train/') +os.system('mkdir -p ' + tgt_img_dir) +os.system('mkdir -p ' + tgt_mask_dir) + + +def read_single_array_from_pil(path): + return np.asarray(Image.open(path)) + + +def save_png_from_array(arr, save_path, mode=None): + Image.fromarray(arr, mode=mode).save(save_path) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +patients_dir = os.path.join( + root_path, 'Cranium/computed-tomography-images-for-' + + 'intracranial-hemorrhage-detection-and-segmentation-1.0.0' + + '/Patients_CT') + +patients = sorted(os.listdir(patients_dir)) +for p in patients: + data_dir = os.path.join(patients_dir, p, 'brain') + file_names = os.listdir(data_dir) + img_w_mask_names = [ + _.replace('_HGE_Seg', '') for _ in file_names if 'Seg' in _ + ] + img_wo_mask_names = [ + _ for _ in file_names if _ not in img_w_mask_names and 'Seg' not in _ + ] + + for file_name in file_names: + path = os.path.join(data_dir, file_name) + img = read_single_array_from_pil(path) + tgt_name = file_name.replace('.jpg', img_suffix) + tgt_name = p + '_' + tgt_name + if 'Seg' in file_name: # is a mask + tgt_name = tgt_name.replace('_HGE_Seg', '') + mask_path = os.path.join(tgt_mask_dir, tgt_name) + mask = convert_label(img, convert_dict={0: 0, 255: 1}) + save_png_from_array(mask, mask_path) + else: + img_path = os.path.join(tgt_img_dir, tgt_name) + pil = Image.fromarray(img).convert('RGB') + pil.save(img_path) + + if file_name in img_wo_mask_names: + mask = np.zeros_like(img, dtype=np.uint8) + mask_path = os.path.join(tgt_mask_dir, tgt_name) + save_png_from_array(mask, mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/README.md b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/README.md new file mode 100644 index 0000000..6e44e41 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/README.md @@ -0,0 +1,149 @@ +# ISIC-2016 Task1 + +## Description + +This project support **`ISIC-2016 Task1 `**, and the dataset used in this project can be downloaded from [here](https://challenge.isic-archive.com/data/#2016). + +### Dataset Overview + +The overarching goal of the challenge is to develop image analysis tools to enable the automated diagnosis of melanoma from dermoscopic images. + +This challenge provides training data (~900 images) for participants to engage in all 3 components of lesion image analysis. A separate test dataset (~350 images) will be provided for participants to generate and submit automated results. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ---------------------------------------------------------------- | ----------------- | ------------ | ---------- | ------------ | --------------------- | ---------------------- | ------------ | ---------------------------------------------------------------------- | +| [ISIC-2016 Task1](https://challenge.isic-archive.com/data/#2016) | full body | segmentation | dermoscopy | 2 | 900/-/379- | yes/-/yes | 2016 | [CC-0](https://creativecommons.org/share-your-work/public-domain/cc0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :---------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 900 | 82.08 | - | - | 379 | 81.98 | +| skin lesion | 900 | 17.92 | - | - | 379 | 18.02 | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/dermoscopy/isic2016_task1/isic2016_task1.png) + +### Prerequisites + +- Python 3.8 +- PyTorch 1.10.0 +- pillow(PIL) 9.3.0 +- scikit-learn(sklearn) 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of PYTHONPATH, which should point to the project's directory so that Python can locate the module files. In isic2016_task1/ root directory, run the following line to add the current directory to PYTHONPATH: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://challenge.isic-archive.com/data/#2016) and decompression data to path 'data/'. +- run script `"python tools/prepare_dataset.py"` to split dataset and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dermoscopy + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ isic2016_task1 + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ yyy.png +``` + +### Training commands + +```shell +mim train mmseg ./configs/${CONFIG_PATH} +``` + +To train on multiple GPUs, e.g. 8 GPUs, run the following command: + +```shell +mim train mmseg ./configs/${CONFIG_PATH} --launcher pytorch --gpus 8 +``` + +### Testing commands + +```shell +mim test mmseg ./configs/${CONFIG_PATH} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Results + +### ISIC-2016 Task1 + +| Method | Backbone | Crop Size | lr | mIoU | mDice | config | +| :-------------: | :------: | :-------: | :----: | :--: | :---: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| fcn_unet_s5-d16 | unet | 512x512 | 0.01 | - | - | [config](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2016-task1-512x512.py) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.001 | - | - | [config](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2016-task1-512x512.py) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.0001 | - | - | [config](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2016-task1-512x512.py) | + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2016-task1-512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2016-task1-512x512.py new file mode 100644 index 0000000..5638de4 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2016-task1-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './isic2016-task1_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.isic2016-task1_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2016-task1-512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2016-task1-512x512.py new file mode 100644 index 0000000..bf17faa --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2016-task1-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './isic2016-task1_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.isic2016-task1_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2016-task1-512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2016-task1-512x512.py new file mode 100644 index 0000000..f7bfcf6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2016-task1-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './isic2016-task1_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.isic2016-task1_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/isic2016-task1_512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/isic2016-task1_512x512.py new file mode 100644 index 0000000..029f5d4 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/isic2016-task1_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'ISIC2017Task1' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='test.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/datasets/isic2016-task1_dataset.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/datasets/isic2016-task1_dataset.py new file mode 100644 index 0000000..8f11bdd --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/datasets/isic2016-task1_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class ISIC2017Task1(BaseSegDataset): + """ISIC2017Task1 dataset. + + In segmentation map annotation for ISIC2017Task1, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('normal', 'skin lesion')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py new file mode 100755 index 0000000..ef4dad5 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py @@ -0,0 +1,120 @@ +import glob +import os +import shutil + +import numpy as np +from PIL import Image + + +def check_maskid(train_imgs): + for i in train_masks: + img = Image.open(i) + print(np.unique(np.array(img))) + + +def reformulate_file(image_list, mask_list): + file_list = [] + for idx, (imgp, + maskp) in enumerate(zip(sorted(image_list), sorted(mask_list))): + item = {'image': imgp, 'label': maskp} + file_list.append(item) + return file_list + + +def check_file_exist(pair_list): + rel_path = os.getcwd() + for idx, sample in enumerate(pair_list): + image_path = sample['image'] + assert os.path.exists(os.path.join(rel_path, image_path)) + if 'label' in sample: + mask_path = sample['label'] + assert os.path.exists(os.path.join(rel_path, mask_path)) + print('all file path ok!') + + +def convert_maskid(mask): + # add mask id conversion + arr_mask = np.array(mask).astype(np.uint8) + arr_mask[arr_mask == 255] = 1 + return Image.fromarray(arr_mask) + + +def process_dataset(file_lists, part_dir_dict): + for ith, part in enumerate(file_lists): + part_dir = part_dir_dict[ith] + for sample in part: + # read image and mask + image_path = sample['image'] + if 'label' in sample: + mask_path = sample['label'] + + basename = os.path.basename(image_path) + targetname = basename.split('.')[0] # from image name + + # check image file + img_save_path = os.path.join(root_path, 'images', part_dir, + targetname + save_img_suffix) + if not os.path.exists(img_save_path): + if not image_path.endswith('.png'): + src = Image.open(image_path) + src.save(img_save_path) + else: + shutil.copy(image_path, img_save_path) + + if mask_path is not None: + mask_save_path = os.path.join(root_path, 'masks', part_dir, + targetname + save_seg_map_suffix) + if not os.path.exists(mask_save_path): + # check mask file + mask = Image.open(mask_path).convert('L') + # convert mask id + mask = convert_maskid(mask) + if not mask_path.endswith('.png'): + mask.save(mask_save_path) + else: + mask.save(mask_save_path) + + # print image num + part_dir_folder = os.path.join(root_path, 'images', part_dir) + print( + f'{part_dir} has {len(os.listdir(part_dir_folder))} images completed!' # noqa + ) + + +if __name__ == '__main__': + + root_path = 'data/' # original file + img_suffix = '.jpg' + seg_map_suffix = '.png' + save_img_suffix = '.png' + save_seg_map_suffix = '.png' + + train_imgs = glob.glob('data/ISBI2016_ISIC_Part1_Training_Data/*' # noqa + + img_suffix) + train_masks = glob.glob( + 'data/ISBI2016_ISIC_Part1_Training_GroundTruth/*' # noqa + + seg_map_suffix) + + test_imgs = glob.glob('data/ISBI2016_ISIC_Part1_Test_Data/*' + img_suffix) + test_masks = glob.glob( + 'data/ISBI2016_ISIC_Part1_Test_GroundTruth/*' # noqa + + seg_map_suffix) + + assert len(train_imgs) == len(train_masks) + assert len(test_imgs) == len(test_masks) + + print(f'training images: {len(train_imgs)}, test images: {len(test_imgs)}') + + os.system('mkdir -p ' + root_path + 'images/train/') + os.system('mkdir -p ' + root_path + 'images/test/') + os.system('mkdir -p ' + root_path + 'masks/train/') + os.system('mkdir -p ' + root_path + 'masks/test/') + + train_pair_list = reformulate_file(train_imgs, train_masks) + test_pair_list = reformulate_file(test_imgs, test_masks) + + check_file_exist(train_pair_list) + check_file_exist(test_pair_list) + + part_dir_dict = {0: 'train/', 1: 'test/'} + process_dataset([train_pair_list, test_pair_list], part_dir_dict) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/README.md b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/README.md new file mode 100644 index 0000000..c7cc270 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/README.md @@ -0,0 +1,158 @@ +# ISIC-2017 Task1 + +## Description + +This project support **`ISIC-2017 Task1 `**, and the dataset used in this project can be downloaded from [here](https://challenge.isic-archive.com/data/#2017). + +### Dataset Overview + +The goal of the challenge is to help participants develop image analysis tools to enable the automated diagnosis of melanoma from dermoscopic images. + +This challenge provides training data (~2000 images) for participants to engage in all 3 components of lesion image analysis. A separate public validation dataset (~150 images) and blind held-out test dataset (~600 images) will be provided for participants to generate and submit automated results. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ---------------------------------------------------------------- | ----------------- | ------------ | ---------- | ------------ | --------------------- | ---------------------- | ------------ | ---------------------------------------------------------------------- | +| [ISIC-2017 Task1](https://challenge.isic-archive.com/data/#2017) | full body | segmentation | dermoscopy | 2 | 2000/150/600 | yes/yes/yes | 2017 | [CC-0](https://creativecommons.org/share-your-work/public-domain/cc0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :---------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| normal | 2000 | 82.86 | 150 | 73.88 | 600 | 70.62 | +| skin lesion | 2000 | 17.14 | 150 | 26.12 | 600 | 29.38 | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/dermoscopy/isic2017_task1/isic2017_task1.png) + +### Prerequisites + +- Python 3.8 +- PyTorch 1.10.0 +- pillow(PIL) 9.3.0 +- scikit-learn(sklearn) 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of PYTHONPATH, which should point to the project's directory so that Python can locate the module files. In isic2017_task1/ root directory, run the following line to add the current directory to PYTHONPATH: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://challenge.isic-archive.com/data/#2017) and decompression data to path 'data/'. +- run script `"python tools/prepare_dataset.py"` to split dataset and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dermoscopy + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ isic2017_task1 + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ย ย  โ”‚ย ย  โ”‚ โ””โ”€โ”€ yyy.png +``` + +### Training commands + +```shell +mim train mmseg ./configs/${CONFIG_PATH} +``` + +To train on multiple GPUs, e.g. 8 GPUs, run the following command: + +```shell +mim train mmseg ./configs/${CONFIG_PATH} --launcher pytorch --gpus 8 +``` + +### Testing commands + +```shell +mim test mmseg ./configs/${CONFIG_PATH} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Results + +### ISIC-2017 Task1 + +| Method | Backbone | Crop Size | lr | mIoU | mDice | config | +| :-------------: | :------: | :-------: | :----: | :--: | :---: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| fcn_unet_s5-d16 | unet | 512x512 | 0.01 | - | - | [config](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2017-task1-512x512.py) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.001 | - | - | [config](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2017-task1-512x512.py) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.0001 | - | - | [config](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2017-task1-512x512.py) | + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [ ] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2017-task1-512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2017-task1-512x512.py new file mode 100644 index 0000000..58d0a12 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2017-task1-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './isic2017-task1_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.isic2017-task1_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2017-task1-512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2017-task1-512x512.py new file mode 100644 index 0000000..3becacf --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2017-task1-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './isic2017-task1_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.isic2017-task1_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2017-task1-512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2017-task1-512x512.py new file mode 100644 index 0000000..654ef4d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2017-task1-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './isic2017-task1_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.isic2017-task1_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/isic2017-task1_512x512.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/isic2017-task1_512x512.py new file mode 100644 index 0000000..95997a1 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/isic2017-task1_512x512.py @@ -0,0 +1,41 @@ +dataset_type = 'ISIC2017Task1' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/train/', seg_map_path='masks/train/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='images/val/', seg_map_path='masks/val/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/datasets/isic2017-task1_dataset.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/datasets/isic2017-task1_dataset.py new file mode 100644 index 0000000..8f11bdd --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/datasets/isic2017-task1_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class ISIC2017Task1(BaseSegDataset): + """ISIC2017Task1 dataset. + + In segmentation map annotation for ISIC2017Task1, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('normal', 'skin lesion')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py new file mode 100755 index 0000000..b3643c9 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py @@ -0,0 +1,127 @@ +import glob +import os +import shutil + +import numpy as np +from PIL import Image + + +def check_maskid(train_imgs): + for i in train_masks: + img = Image.open(i) + print(np.unique(np.array(img))) + + +def reformulate_file(image_list, mask_list): + file_list = [] + for idx, (imgp, + maskp) in enumerate(zip(sorted(image_list), sorted(mask_list))): + item = {'image': imgp, 'label': maskp} + file_list.append(item) + return file_list + + +def convert_maskid(mask): + # add mask id conversion + arr_mask = np.array(mask).astype(np.uint8) + arr_mask[arr_mask == 255] = 1 + return Image.fromarray(arr_mask) + + +def check_file_exist(pair_list): + rel_path = os.getcwd() + for idx, sample in enumerate(pair_list): + image_path = sample['image'] + assert os.path.exists(os.path.join(rel_path, image_path)) + if 'label' in sample: + mask_path = sample['label'] + assert os.path.exists(os.path.join(rel_path, mask_path)) + print('all file path ok!') + + +def process_dataset(file_lists, part_dir_dict): + for ith, part in enumerate(file_lists): + part_dir = part_dir_dict[ith] + for sample in part: + # read image and mask + image_path = sample['image'] + if 'label' in sample: + mask_path = sample['label'] + + basename = os.path.basename(image_path) + targetname = basename.split('.')[0] # from image name + + # check image file + img_save_path = os.path.join(root_path, 'images', part_dir, + targetname + save_img_suffix) + if not os.path.exists(img_save_path): + if not image_path.endswith('.png'): + src = Image.open(image_path) + src.save(img_save_path) + else: + shutil.copy(image_path, img_save_path) + + if mask_path is not None: + mask_save_path = os.path.join(root_path, 'masks', part_dir, + targetname + save_seg_map_suffix) + if not os.path.exists(mask_save_path): + # check mask file + mask = Image.open(mask_path).convert('L') + # convert mask id + mask = convert_maskid(mask) + if not mask_path.endswith('.png'): + mask.save(mask_save_path) + else: + mask.save(mask_save_path) + + # print image num + part_dir_folder = os.path.join(root_path, 'images', part_dir) + print( + f'{part_dir} has {len(os.listdir(part_dir_folder))} images completed!' # noqa + ) + + +if __name__ == '__main__': + + root_path = 'data/' # original file + img_suffix = '.jpg' + seg_map_suffix = '.png' + save_img_suffix = '.png' + save_seg_map_suffix = '.png' + + train_imgs = glob.glob('data/ISIC-2017_Training_Data/*' + img_suffix) + train_masks = glob.glob('data/ISIC-2017_Training_Part1_GroundTruth/*' + + seg_map_suffix) + + val_imgs = glob.glob('data/ISIC-2017_Validation_Data/*' + img_suffix) + val_masks = glob.glob('data/ISIC-2017_Validation_Part1_GroundTruth/*' + + seg_map_suffix) + + test_imgs = glob.glob('data/ISIC-2017_Test_v2_Data/*' + img_suffix) + test_masks = glob.glob('data/ISIC-2017_Test_v2_Part1_GroundTruth/*' + + seg_map_suffix) + + assert len(train_imgs) == len(train_masks) + assert len(val_imgs) == len(val_masks) + assert len(test_imgs) == len(test_masks) + + os.system('mkdir -p ' + root_path + 'images/train/') + os.system('mkdir -p ' + root_path + 'images/val/') + os.system('mkdir -p ' + root_path + 'images/test/') + os.system('mkdir -p ' + root_path + 'masks/train/') + os.system('mkdir -p ' + root_path + 'masks/val/') + os.system('mkdir -p ' + root_path + 'masks/test/') + + part_dir_dict = {0: 'train/', 1: 'val/', 2: 'test/'} + + train_pair_list = reformulate_file(train_imgs, train_masks) + val_pair_list = reformulate_file(val_imgs, val_masks) + test_pair_list = reformulate_file(test_imgs, test_masks) + + check_file_exist(train_pair_list) + check_file_exist(val_pair_list) + check_file_exist(test_pair_list) + + part_dir_dict = {0: 'train/', 1: 'val/', 2: 'test/'} + process_dataset([train_pair_list, val_pair_list, test_pair_list], + part_dir_dict) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/README.md b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/README.md new file mode 100644 index 0000000..ea597bc --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/README.md @@ -0,0 +1,145 @@ +# Kvasir-Sessile Dataset (Kvasir SEG) + +## Description + +This project supports **`Kvasir-Sessile Dataset (Kvasir SEG) `**, which can be downloaded from [here](https://opendatalab.com/Kvasir-Sessile_dataset). + +## Dataset Overview + +The Kvasir-SEG dataset contains polyp images and their corresponding ground truth from the Kvasir Dataset v2. The resolution of the images contained in Kvasir-SEG varies from 332x487 to 1920x1072 pixels. + + + +### Information Statistics + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------------------------- | ----------------- | ------------ | --------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------- | +| [Kvarsir-SEG](https://opendatalab.com/Kvasir-Sessile_dataset) | abdomen | segmentation | endoscopy | 2 | 196/-/- | yes/-/- | 2020 | [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 196 | 92.31 | - | - | - | - | +| polyp | 196 | 7.69 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![kvasir-seg](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/endoscopy_images/kvasir_seg/kvasir_seg_dataset.png?raw=true) + +### Dataset Citation + +``` +@inproceedings{jha2020kvasir, + title={Kvasir-seg: A segmented polyp dataset}, + author={Jha, Debesh and Smedsrud, Pia H and Riegler, Michael A and Halvorsen, P{\aa}l and Lange, Thomas de and Johansen, Dag and Johansen, H{\aa}vard D}, + booktitle={International Conference on Multimedia Modeling}, + pages={451--462}, + year={2020}, + organization={Springer} + } +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `kvasir_seg/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://opendatalab.com/Kvasir-Sessile_dataset) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ endoscopy + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ kvasir_seg + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 156 | 92.28 | 40 | 92.41 | - | - | +| polyp | 156 | 7.72 | 40 | 7.59 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg .configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_kvasir-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_kvasir-seg-512x512.py new file mode 100644 index 0000000..145d5a7 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_kvasir-seg-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './kvasir-seg_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-512x512.py new file mode 100644 index 0000000..3ea05c5 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './kvasir-seg_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-512x512.py new file mode 100644 index 0000000..7e064a7 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './kvasir-seg_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-512x512.py new file mode 100644 index 0000000..0fc1d6e --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './kvasir-seg_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/kvasir-seg_512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/kvasir-seg_512x512.py new file mode 100644 index 0000000..e8b2467 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/configs/kvasir-seg_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'KvasirSEGDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/datasets/kvasir-seg_dataset.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/datasets/kvasir-seg_dataset.py new file mode 100644 index 0000000..9d60132 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/datasets/kvasir-seg_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class KvasirSEGDataset(BaseSegDataset): + """KvasirSEGDataset dataset. + + In segmentation map annotation for KvasirSEGDataset, 0 stands for + background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` is + fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False.. + """ + METAINFO = dict(classes=('background', 'polyp')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/tools/prepare_dataset.py new file mode 100644 index 0000000..74c43e9 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg/tools/prepare_dataset.py @@ -0,0 +1,87 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.jpg' +seg_map_suffix = '.jpg' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' +tgt_img_dir = os.path.join(root_path, 'images/train/') +tgt_mask_dir = os.path.join(root_path, 'masks/train/') +os.system('mkdir -p ' + tgt_img_dir) +os.system('mkdir -p ' + tgt_mask_dir) + + +def filter_suffix_recursive(src_dir, suffix): + # filter out file names and paths in source directory + suffix = '.' + suffix if '.' not in suffix else suffix + file_paths = glob.glob( + os.path.join(src_dir, '**', '*' + suffix), recursive=True) + file_names = [_.split('/')[-1] for _ in file_paths] + return sorted(file_paths), sorted(file_names) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +def convert_pics_into_pngs(src_dir, tgt_dir, suffix, convert='RGB'): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_img_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + num = len(src_paths) + img = np.array(Image.open(src_path)) + if len(img.shape) == 2: + pil = Image.fromarray(img).convert(convert) + elif len(img.shape) == 3: + pil = Image.fromarray(img) + else: + raise ValueError('Input image not 2D/3D: ', img.shape) + + pil.save(tgt_path) + print(f'processed {i+1}/{num}.') + + +def convert_label_pics_into_pngs(src_dir, + tgt_dir, + suffix, + convert_dict={ + 0: 0, + 255: 1 + }): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + num = len(src_paths) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_seg_map_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + + img = np.array(Image.open(src_path)) + img = convert_label(img, convert_dict) + Image.fromarray(img).save(tgt_path) + print(f'processed {i+1}/{num}.') + + +if __name__ == '__main__': + + convert_pics_into_pngs( + os.path.join(root_path, 'sessile-main-Kvasir-SEG/images'), + tgt_img_dir, + suffix=img_suffix) + + convert_label_pics_into_pngs( + os.path.join(root_path, 'sessile-main-Kvasir-SEG/masks'), + tgt_mask_dir, + suffix=seg_map_suffix) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/README.md b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/README.md new file mode 100644 index 0000000..80eb00f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/README.md @@ -0,0 +1,145 @@ +# Kvasir-SEG Segmented Polyp Dataset from Aliyun (Kvasir SEG Aliyun) + +## Description + +This project supports **`Kvasir-SEG Segmented Polyp Dataset from Aliyun (Kvasir SEG Aliyun) `**, which can be downloaded from [here](https://tianchi.aliyun.com/dataset/84385). + +### Dataset Overview + +Colorectal cancer is the second most common cancer type among women and third most common among men. Polyps are precursors to colorectal cancer and therefore important to detect and remove at an early stage. Polyps are found in nearly half of the individuals at age 50 that undergo a colonoscopy screening, and their frequency increase with age.Polyps are abnormal tissue growth from the mucous membrane, which is lining the inside of the GI tract, and can sometimes be cancerous. Colonoscopy is the gold standard for detection and assessment of these polyps with subsequent biopsy and removal of the polyps. Early disease detection has a huge impact on survival from colorectal cancer. Increasing the detection of polyps has been shown to decrease risk of colorectal cancer. Thus, automatic detection of more polyps at an early stage can play a crucial role in prevention and survival from colorectal cancer. + +The Kvasir-SEG dataset is based on the previous Kvasir dataset, which is the first multi-class dataset for gastrointestinal (GI) tract disease detection and classification. It contains annotated polyp images and their corresponding masks. The pixels depicting polyp tissue, the ROI, are represented by the foreground (white mask), while the background (in black) does not contain positive pixels. These images were collected and verified by experienced gastroenterologists from Vestre Viken Health Trust in Norway. The classes include anatomical landmarks, pathological findings and endoscopic procedures. + +### Information Statistics + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------------------ | ----------------- | ------------ | --------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------- | +| [kvasir-seg](https://tianchi.aliyun.com/dataset/84385) | abdomen | segmentation | endoscopy | 2 | 1000/-/- | yes/-/- | 2020 | [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 1000 | 84.72 | - | - | - | - | +| polyp | 1000 | 15.28 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![kvasir_seg_aliyun](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/endoscopy_images/kvasir_seg_aliyun/kvasir_seg_aliyun_dataset.png?raw=true) + +### Dataset Citation + +``` +@inproceedings{jha2020kvasir, + title={Kvasir-seg: A segmented polyp dataset}, + author={Jha, Debesh and Smedsrud, Pia H and Riegler, Michael A and Halvorsen, P{\aa}l and Lange, Thomas de and Johansen, Dag and Johansen, H{\aa}vard D}, + booktitle={International Conference on Multimedia Modeling}, + pages={451--462}, + year={2020}, + organization={Springer} + } +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `kvasir_seg_aliyun/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://tianchi.aliyun.com/dataset/84385) and decompression data to path 'data/.'. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ endoscopy + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ kvasir_seg_aliyun + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 800 | 84.66 | 200 | 84.94 | - | - | +| polyp | 800 | 15.34 | 200 | 15.06 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-aliyun-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-aliyun-512x512.py new file mode 100644 index 0000000..b59db95 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-aliyun-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './kvasir-seg-aliyun_512x512.py', 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg-aliyun_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-aliyun-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-aliyun-512x512.py new file mode 100644 index 0000000..6c52668 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-aliyun-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './kvasir-seg-aliyun_512x512.py', 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg-aliyun_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-aliyun-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-aliyun-512x512.py new file mode 100644 index 0000000..a192a5b --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-aliyun-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './kvasir-seg-aliyun_512x512.py', 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg-aliyun_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_kvasir-seg-aliyun-512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_kvasir-seg-aliyun-512x512.py new file mode 100644 index 0000000..5325e1f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_kvasir-seg-aliyun-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './kvasir-seg-aliyun_512x512.py', 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.kvasir-seg-aliyun_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/kvasir-seg-aliyun_512x512.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/kvasir-seg-aliyun_512x512.py new file mode 100644 index 0000000..5f86880 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/kvasir-seg-aliyun_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'KvasirSEGAliyunDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/datasets/kvasir-seg-aliyun_dataset.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/datasets/kvasir-seg-aliyun_dataset.py new file mode 100644 index 0000000..198caf0 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/datasets/kvasir-seg-aliyun_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class KvasirSEGAliyunDataset(BaseSegDataset): + """KvasirSEGAliyunDataset dataset. + + In segmentation map annotation for KvasirSEGAliyunDataset, + 0 stands for background,which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False.. + """ + METAINFO = dict(classes=('background', 'polyp')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/tools/prepare_dataset.py new file mode 100644 index 0000000..b230e7f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/tools/prepare_dataset.py @@ -0,0 +1,86 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.jpg' +seg_map_suffix = '.jpg' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' +tgt_img_dir = os.path.join(root_path, 'images/train/') +tgt_mask_dir = os.path.join(root_path, 'masks/train/') +os.system('mkdir -p ' + tgt_img_dir) +os.system('mkdir -p ' + tgt_mask_dir) + + +def filter_suffix_recursive(src_dir, suffix): + # filter out file names and paths in source directory + suffix = '.' + suffix if '.' not in suffix else suffix + file_paths = glob.glob( + os.path.join(src_dir, '**', '*' + suffix), recursive=True) + file_names = [_.split('/')[-1] for _ in file_paths] + return sorted(file_paths), sorted(file_names) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +def convert_pics_into_pngs(src_dir, tgt_dir, suffix, convert='RGB'): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_img_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + num = len(src_paths) + img = np.array(Image.open(src_path)) + if len(img.shape) == 2: + pil = Image.fromarray(img).convert(convert) + elif len(img.shape) == 3: + pil = Image.fromarray(img) + else: + raise ValueError('Input image not 2D/3D: ', img.shape) + + pil.save(tgt_path) + print(f'processed {i+1}/{num}.') + + +def convert_label_pics_into_pngs(src_dir, + tgt_dir, + suffix, + convert_dict={ + 0: 0, + 255: 1 + }): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + num = len(src_paths) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_seg_map_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + + img = np.array(Image.open(src_path).convert('L')) + img = convert_label(img, convert_dict) + Image.fromarray(img).save(tgt_path) + print(f'processed {i+1}/{num}.') + + +if __name__ == '__main__': + convert_pics_into_pngs( + os.path.join(root_path, 'Kvasir-SEG/images'), + tgt_img_dir, + suffix=img_suffix) + + convert_label_pics_into_pngs( + os.path.join(root_path, 'Kvasir-SEG/masks'), + tgt_mask_dir, + suffix=seg_map_suffix) diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/README.md b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/README.md new file mode 100644 index 0000000..c2c61c4 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/README.md @@ -0,0 +1,158 @@ +# Vessel Assessment and Measurement Platform for Images of the REtina + +## Description + +This project support **`Vessel Assessment and Measurement Platform for Images of the REtina`**, and the dataset used in this project can be downloaded from [here](https://vampire.computing.dundee.ac.uk/vesselseg.html). + +### Dataset Overview + +In order to promote evaluation of vessel segmentation on ultra-wide field-of-view (UWFV) fluorescein angriogram (FA) frames, we make public 8 frames from two different sequences, the manually annotated images and the result of our automatic vessel segmentation algorithm. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ---------------------------------------------------------------- | ----------------- | ------------ | ---------------------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [Vampire](https://vampire.computing.dundee.ac.uk/vesselseg.html) | vessel | segmentation | fluorescein angriogram | 2 | 8/-/- | yes/-/- | 2017 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 8 | 96.75 | - | - | - | - | +| vessel | 8 | 3.25 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/fluorescein_angriogram/vampire/vampire_dataset.png) + +## Dataset Citation + +```bibtex + +@inproceedings{perez2011improving, + title={Improving vessel segmentation in ultra-wide field-of-view retinal fluorescein angiograms}, + author={Perez-Rovira, Adria and Zutis, K and Hubschman, Jean Pierre and Trucco, Emanuele}, + booktitle={2011 Annual International Conference of the IEEE Engineering in Medicine and Biology Society}, + pages={2614--2617}, + year={2011}, + organization={IEEE} +} + +@article{perez2011rerbee, + title={RERBEE: robust efficient registration via bifurcations and elongated elements applied to retinal fluorescein angiogram sequences}, + author={Perez-Rovira, Adria and Cabido, Raul and Trucco, Emanuele and McKenna, Stephen J and Hubschman, Jean Pierre}, + journal={IEEE Transactions on Medical Imaging}, + volume={31}, + number={1}, + pages={140--150}, + year={2011}, + publisher={IEEE} +} + +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `vampire/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://vampire.computing.dundee.ac.uk/vesselseg.html) and decompression data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to split dataset and change folder structure as below. +- run script `python ../../tools/split_seg_dataset.py` to split dataset. For the Bacteria_detection dataset, as there is no test or validation dataset, we sample 20% samples from the whole dataset as the validation dataset and 80% samples for training data and make two filename lists `train.txt` and `val.txt`. As we set the random seed as the hard code, we eliminated the randomness, the dataset split actually can be reproducible. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fluorescein_angriogram + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ vampire + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 6 | 97.48 | 2 | 94.54 | - | - | +| vessel | 6 | 2.52 | 2 | 5.46 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default๏ผ‰ + +```shell +mim train mmseg ./configs/${CONFIG_PATH} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_PATH} --checkpoint ${CHECKPOINT_PATH} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [ ] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py new file mode 100755 index 0000000..7f5273a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './vampire_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.vampire_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py new file mode 100755 index 0000000..4382229 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './vampire_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.vampire_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + type='EncoderDecoder', + data_preprocessor=dict(size=img_scale), + pretrained=None, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py new file mode 100755 index 0000000..8d93e17 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py @@ -0,0 +1,22 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './vampire_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.vampire_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + decode_head=dict( + num_classes=2, + loss_decode=dict(type='CrossEntropyLoss', use_sigmoid=True), + out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py new file mode 100755 index 0000000..4eda92f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'VampireDataset' +data_root = 'data' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py new file mode 100755 index 0000000..93f9cbf --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py @@ -0,0 +1,3 @@ +from .vampire_dataset import VampireDataset + +__all__ = ['VampireDataset'] diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py new file mode 100755 index 0000000..4d38040 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py @@ -0,0 +1,28 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class VampireDataset(BaseSegDataset): + """VampireDataset dataset. + + In segmentation map annotation for VampireDataset, 0 stands for background, + which is included in 2 categories. ``reduce_zero_label`` is fixed to + False. The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is + fixed to '.png'. + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict(classes=('background', 'vessel')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/tools/prepare_dataset.py new file mode 100644 index 0000000..2755b5d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fluorescein_angriogram/vampire/tools/prepare_dataset.py @@ -0,0 +1,44 @@ +import os +import shutil + +from PIL import Image + +path = 'data' + +if not os.path.exists(os.path.join(path, 'images', 'train')): + os.system(f'mkdir -p {os.path.join(path, "images", "train")}') + +if not os.path.exists(os.path.join(path, 'masks', 'train')): + os.system(f'mkdir -p {os.path.join(path, "masks", "train")}') + +origin_data_path = os.path.join(path, 'vesselSegmentation') + +imgs_amd14 = os.listdir(os.path.join(origin_data_path, 'AMD14')) +imgs_ger7 = os.listdir(os.path.join(origin_data_path, 'GER7')) + +for img in imgs_amd14: + shutil.copy( + os.path.join(origin_data_path, 'AMD14', img), + os.path.join(path, 'images', 'train', img)) + # copy GT + img_gt = img.replace('.png', '-GT.png') + shutil.copy( + os.path.join(origin_data_path, 'AMD14-GT', f'{img_gt}'), + os.path.join(path, 'masks', 'train', img)) + +for img in imgs_ger7: + shutil.copy( + os.path.join(origin_data_path, 'GER7', img), + os.path.join(path, 'images', 'train', img)) + # copy GT + img_gt = img.replace('.bmp', '-GT.png') + img = img.replace('bmp', 'png') + shutil.copy( + os.path.join(origin_data_path, 'GER7-GT', img_gt), + os.path.join(path, 'masks', 'train', img)) + +imgs = os.listdir(os.path.join(path, 'images', 'train')) +for img in imgs: + if not img.endswith('.png'): + im = Image.open(os.path.join(path, 'images', 'train', img)) + im.save(os.path.join(path, 'images', 'train', img[:-4] + '.png')) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/README.md b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/README.md new file mode 100644 index 0000000..85d8a3e --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/README.md @@ -0,0 +1,155 @@ +# DR HAGIS: Diabetic Retinopathy, Hypertension, Age-related macular degeneration and Glacuoma ImageS + +## Description + +This project supports **`DR HAGIS: Diabetic Retinopathy, Hypertension, Age-related macular degeneration and Glacuoma ImageS`**, which can be downloaded from [here](https://paperswithcode.com/dataset/dr-hagis). + +### Dataset Overview + +The DR HAGIS database has been created to aid the development of vessel extraction algorithms suitable for retinal screening programmes. Researchers are encouraged to test their segmentation algorithms using this database. All thirty-nine fundus images were obtained from a diabetic retinopathy screening programme in the UK. Hence, all images were taken from diabetic patients. + +Besides the fundus images, the manual segmentation of the retinal surface vessels is provided by an expert grader. These manually segmented images can be used as the ground truth to compare and assess the automatic vessel extraction algorithms. Masks of the FOV are provided as well to quantify the accuracy of vessel extraction within the FOV only. The images were acquired in different screening centers, therefore reflecting the range of image resolutions, digital cameras and fundus cameras used in the clinic. The fundus images were captured using a Topcon TRC-NW6s, Topcon TRC-NW8 or a Canon CR DGi fundus camera with a horizontal 45 degree field-of-view (FOV). The images are 4752x3168 pixels, 3456x2304 pixels, 3126x2136 pixels, 2896x1944 pixels or 2816x1880 pixels in size. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------------------- | ----------------- | ------------ | ------------------ | ------------ | --------------------- | ---------------------- | ------------ | ------- | +| [DR HAGIS](https://paperswithcode.com/dataset/dr-hagis) | head and neck | segmentation | fundus photography | 2 | 40/-/- | yes/-/- | 2017 | - | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 40 | 96.38 | - | - | - | - | +| vessel | 40 | 3.62 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/fundus_photography/dr_hagis/dr_hagis_dataset.png) + +## Usage + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `dr_hagis/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://paperswithcode.com/dataset/dr-hagis) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fundus_photography + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dr_hagis + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 32 | 96.21 | 8 | 97.12 | - | - | +| vessel | 32 | 3.79 | 8 | 2.88 | - | - | + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Dataset Citation + +If this work is helpful for your research, please consider citing the below paper. + +``` +@article{holm2017dr, + title={DR HAGISโ€”a fundus image database for the automatic extraction of retinal surface vessels from diabetic patients}, + author={Holm, Sven and Russell, Greg and Nourrit, Vincent and McLoughlin, Niall}, + journal={Journal of Medical Imaging}, + volume={4}, + number={1}, + pages={014503--014503}, + year={2017}, + publisher={Society of Photo-Optical Instrumentation Engineers} +} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [ ] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/dr-hagis_512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/dr-hagis_512x512.py new file mode 100644 index 0000000..93b9638 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/dr-hagis_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'DRHAGISDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_dr-hagis-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_dr-hagis-512x512.py new file mode 100644 index 0000000..9d14427 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_dr-hagis-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './dr-hagis_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.dr-hagis_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_dr-hagis-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_dr-hagis-512x512.py new file mode 100644 index 0000000..507ec74 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_dr-hagis-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './dr-hagis_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.dr-hagis_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_dr-hagis-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_dr-hagis-512x512.py new file mode 100644 index 0000000..092ae00 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_dr-hagis-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './dr-hagis_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.dr-hagis_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/datasets/dr-hagis_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/datasets/dr-hagis_dataset.py new file mode 100644 index 0000000..9659f0b --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/datasets/dr-hagis_dataset.py @@ -0,0 +1,27 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class DRHAGISDataset(BaseSegDataset): + """DRHAGISDataset dataset. + + In segmentation map annotation for DRHAGISDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict(classes=('background', 'vessel')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py new file mode 100755 index 0000000..51f4df7 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py @@ -0,0 +1,41 @@ +import glob +import os +import shutil + +import mmengine +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.jpg' +seg_map_suffix = '_manual_orig.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +x_train = glob.glob(os.path.join('data/DRHAGIS/**/*' + img_suffix)) + +mmengine.mkdir_or_exist(root_path + 'images/train/') +mmengine.mkdir_or_exist(root_path + 'masks/train/') + +D3_palette = {0: (0, 0, 0), 1: (1, 1, 1)} +D3_invert_palette = {v: k for k, v in D3_palette.items()} +D2_255_convert_dict = {0: 0, 255: 1} + +part_dir_dict = {0: 'train/', 1: 'val/'} +for ith, part in enumerate([x_train]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + shutil.copy( + img, root_path + 'images/' + part_dir + basename.split('.')[0] + + save_img_suffix) + mask_path = root_path + 'DRHAGIS/Manual_Segmentations/' + basename.split( # noqa + '.')[0] + seg_map_suffix + label = np.array(Image.open(mask_path)) + + save_mask_path = root_path + 'masks/' + part_dir + basename.split( + '.')[0] + save_seg_map_suffix # noqa + mask = np.array(Image.open(mask_path)).astype(np.uint8) + mask[mask == 255] = 1 + mask = Image.fromarray(mask) + mask.save(save_mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/README.md b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/README.md new file mode 100644 index 0000000..e834508 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/README.md @@ -0,0 +1,167 @@ +# Glaucoma grAding from Multi-Modality imAges Task3 + +## Description + +This project support **`Glaucoma grAding from Multi-Modality imAges Task3`**, and the dataset used in this project can be downloaded from [here](https://aistudio.baidu.com/aistudio/competition/detail/121/0/datasets). + +### Dataset Overview + +This regular-challenge dataset was provided by Sun Yat-sen Ophthalmic Center, Sun Yat-sen University, Guangzhou, China. The dataset contains 200 fundus color images: 100 pairs in the training set and 100 pairs in the test set. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ----------------------------------------------------------------------------------- | ----------------- | ------------ | --------------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [GammaTask3](https://aistudio.baidu.com/aistudio/competition/detail/121/0/datasets) | eye | segmentation | fundus photophy | 3 | 100/-/100 | yes/-/- | 2021 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 100 | 99.02 | - | - | - | - | +| optic disc | 100 | 0.67 | - | - | - | - | +| optic cup | 100 | 0.31 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/fundus_photography/gamma3/gamma3_dataset.png) + +## Dataset Citation + +```bibtex +@article{fu2018joint, + title={Joint optic disc and cup segmentation based on multi-label deep network and polar transformation}, + author={Fu, Huazhu and Cheng, Jun and Xu, Yanwu and Wong, Damon Wing Kee and Liu, Jiang and Cao, Xiaochun}, + journal={IEEE transactions on medical imaging}, + volume={37}, + number={7}, + pages={1597--1605}, + year={2018}, + publisher={IEEE} +} + +@article{sevastopolsky2017optic, + title={Optic disc and cup segmentation methods for glaucoma detection with modification of U-Net convolutional neural network}, + author={Sevastopolsky, Artem}, + journal={Pattern Recognition and Image Analysis}, + volume={27}, + pages={618--624}, + year={2017}, + publisher={Springer} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `gammm3/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://aistudio.baidu.com/aistudio/competition/detail/121/0/datasets) and decompression data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to split dataset and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fundus_photography + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ gamma3 + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 80 | 99.01 | 20 | 99.07 | - | - | +| optic disc | 80 | 0.68 | 20 | 0.63 | - | - | +| optic cup | 80 | 0.32 | 20 | 0.31 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default๏ผ‰ + +```shell +mim train mmseg ./configs/${CONFIG_PATH} +``` + +### Testing commands + +To test models on a single server with one GPU. (default๏ผ‰ + +```shell +mim test mmseg ./configs/${CONFIG_PATH} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [ ] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_gamma3-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_gamma3-512x512.py new file mode 100644 index 0000000..0daac51 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_gamma3-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './gamma3_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.gamma3_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_gamma3-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_gamma3-512x512.py new file mode 100644 index 0000000..8a25cd0 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_gamma3-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './gamma3_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.gamma3_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_gamma3-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_gamma3-512x512.py new file mode 100644 index 0000000..ea64843 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_gamma3-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './gamma3_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.gamma3_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/gamma3_512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/gamma3_512x512.py new file mode 100644 index 0000000..d23ab55 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/configs/gamma3_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'Gamma3Dataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/datasets/gamma3_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/datasets/gamma3_dataset.py new file mode 100644 index 0000000..56cbdd6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/datasets/gamma3_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class Gamma3Dataset(BaseSegDataset): + """Gamma3Dataset dataset. + + In segmentation map annotation for Gamma3Dataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'disc', 'cup')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/tools/prepare_dataset.py new file mode 100644 index 0000000..eb820b6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/gamma3/tools/prepare_dataset.py @@ -0,0 +1,107 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.jpg' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +tgt_img_test_dir = os.path.join(root_path, 'images/test/') +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) +os.system('mkdir -p ' + tgt_img_test_dir) + + +def filter_suffix_recursive(src_dir, suffix): + # filter out file names and paths in source directory + suffix = '.' + suffix if '.' not in suffix else suffix + file_paths = glob.glob( + os.path.join(src_dir, '**/*' + suffix), recursive=True) + file_names = [_.split('/')[-1] for _ in file_paths] + return sorted(file_paths), sorted(file_names) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +def convert_pics_into_pngs(src_dir, tgt_dir, suffix, convert='RGB'): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_img_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + num = len(src_paths) + img = np.array(Image.open(src_path)) + if len(img.shape) == 2: + pil = Image.fromarray(img).convert(convert) + elif len(img.shape) == 3: + pil = Image.fromarray(img) + else: + raise ValueError('Input image not 2D/3D: ', img.shape) + + pil.save(tgt_path) + print(f'processed {i+1}/{num}.') + + +def convert_label_pics_into_pngs(src_dir, + tgt_dir, + suffix, + convert_dict={ + 0: 2, + 128: 1, + 255: 0 + }): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + num = len(src_paths) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_seg_map_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + + img = np.array(Image.open(src_path)) + img = convert_label(img, convert_dict) + Image.fromarray(img).save(tgt_path) + print(f'processed {i+1}/{num}.') + + +if __name__ == '__main__': + + convert_pics_into_pngs( + os.path.join( + root_path, + 'task3_disc_cup_segmentation/training/fundus color images/'), + tgt_img_train_dir, + suffix=img_suffix) + + convert_pics_into_pngs( + os.path.join( + root_path, + 'task3_disc_cup_segmentation/testing/fundus color images/'), + tgt_img_test_dir, + suffix=img_suffix) + + convert_label_pics_into_pngs( + os.path.join(root_path, + 'task3_disc_cup_segmentation/training/Disc_Cup_Mask/'), + tgt_mask_train_dir, + suffix=seg_map_suffix, + convert_dict={ + 0: 2, + 128: 1, + 255: 0 + }) + # original: [0, 128, 255] for ['optic cup', 'optic disc', 'background'] + # converted: [0, 1, 2] for ['background', 'optic disc', 'optic cup'] diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/README.md b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/README.md new file mode 100644 index 0000000..6f09203 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/README.md @@ -0,0 +1,140 @@ +# ORVS (Online Retinal image for Vessel Segmentation (ORVS)) + +## Description + +This project supports **`ORVS (Online Retinal image for Vessel Segmentation (ORVS))`**, which can be downloaded from [here](https://opendatalab.org.cn/ORVS). + +### Dataset Overview + +The ORVS dataset is a newly established collaboration between the Department of Computer Science and the Department of Vision Science at the University of Calgary. The dataset contains 49 images collected from a clinic in Calgary, Canada, consisting of 42 training images and 7 testing images. All images were obtained using a Zeiss Visucam 200 with a 30-degree field of view (FOV). The image size is 1444ร—1444 pixels with 24 bits per pixel. The images are stored in JPEG format with low compression, which is common in ophthalmic practice. All images were manually traced by an expert who has been working in the field of retinal image analysis and has been trained to mark all pixels belonging to retinal vessels. The Windows Paint 3D tool was used for manual image annotation. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------------------ | ----------------- | ------------ | ------------------ | ------------ | --------------------- | ---------------------- | ------------ | ------- | +| [Bactteria detection](https://opendatalab.org.cn/ORVS) | bacteria | segmentation | fundus photography | 2 | 130/-/72 | yes/-/yes | 2020 | - | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 130 | 94.83 | - | - | 72 | 94.25 | +| vessel | 130 | 5.17 | - | - | 72 | 5.75 | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/fundus_photography/orvs/ORVS_dataset.png) + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `orvs/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- Clone this [repository](https://github.com/AbdullahSarhan/ICPRVessels), then move `Vessels-Datasets` to `data/`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fundus_photography + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ orvs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Dataset Citation + +If this work is helpful for your research, please consider citing the below paper. + +``` +@inproceedings{sarhan2021transfer, + title={Transfer learning through weighted loss function and group normalization for vessel segmentation from retinal images}, + author={Sarhan, Abdullah and Rokne, Jon and Alhajj, Reda and Crichton, Andrew}, + booktitle={2020 25th International Conference on Pattern Recognition (ICPR)}, + pages={9211--9218}, + year={2021}, + organization={IEEE} +} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [ ] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_orvs-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_orvs-512x512.py new file mode 100644 index 0000000..662f837 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_orvs-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './orvs_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.orvs_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_orvs-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_orvs-512x512.py new file mode 100644 index 0000000..c47cdb6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_orvs-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './orvs_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.orvs_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_orvs-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_orvs-512x512.py new file mode 100644 index 0000000..1097aad --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_orvs-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './orvs_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.orvs_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/orvs_512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/orvs_512x512.py new file mode 100644 index 0000000..a5594de --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/configs/orvs_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'ORVSDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='test.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/datasets/orvs_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/datasets/orvs_dataset.py new file mode 100644 index 0000000..e915ae4 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/datasets/orvs_dataset.py @@ -0,0 +1,27 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class ORVSDataset(BaseSegDataset): + """ORVSDataset dataset. + + In segmentation map annotation for ORVSDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict(classes=('background', 'vessel')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py new file mode 100755 index 0000000..f902d87 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py @@ -0,0 +1,55 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.jpg' +seg_map_suffix_list = ['.jpg', '.png', '.tif'] +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +x_train = glob.glob( + os.path.join('data/Vessels-Datasets/*/Train/Original/Images/*' + + img_suffix)) +x_test = glob.glob( + os.path.join('data/Vessels-Datasets/*/Test/Original/Images/*' + + img_suffix)) + +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'images/test/') +os.system('mkdir -p ' + root_path + 'masks/train/') +os.system('mkdir -p ' + root_path + 'masks/test/') + +part_dir_dict = {0: 'train/', 1: 'test/'} +for ith, part in enumerate([x_train, x_test]): + part_dir = part_dir_dict[ith] + for img in part: + type_name = img.split('/')[-5] + basename = type_name + '_' + os.path.basename(img) + save_img_path = root_path + 'images/' + part_dir + basename.split( + '.')[0] + save_img_suffix + Image.open(img).save(save_img_path) + + for seg_map_suffix in seg_map_suffix_list: + if os.path.exists('/'.join(img.split('/')[:-1]).replace( + 'Images', 'Labels')): + mask_path = img.replace('Images', 'Labels').replace( + img_suffix, seg_map_suffix) + else: + mask_path = img.replace('Images', 'labels').replace( + img_suffix, seg_map_suffix) + if os.path.exists(mask_path): + break + save_mask_path = root_path + 'masks/' + part_dir + basename.split( + '.')[0] + save_seg_map_suffix + masks = np.array(Image.open(mask_path).convert('L')).astype(np.uint8) + if len(np.unique(masks)) == 2 and 1 in np.unique(masks): + print(np.unique(masks)) + pass + else: + masks[masks < 128] = 0 + masks[masks >= 128] = 1 + masks = Image.fromarray(masks) + masks.save(save_mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/README.md b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/README.md new file mode 100644 index 0000000..0aea9b0 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/README.md @@ -0,0 +1,135 @@ +# Retinal Images vessel Tree Extraction (RITE) + +## Description + +This project supports **`Retinal Images vessel Tree Extraction (RITE) `**, which can be downloaded from [here](https://opendatalab.com/RITE). + +### Dataset Overview + +The RITE (Retinal Images vessel Tree Extraction) is a database that enables comparative studies on segmentation or classification of arteries and veins on retinal fundus images, which is established based on the public available DRIVE database (Digital Retinal Images for Vessel Extraction). RITE contains 40 sets of images, equally separated into a training subset and a test subset, the same as DRIVE. The two subsets are built from the corresponding two subsets in DRIVE. For each set, there is a fundus photograph, a vessel reference standard. The fundus photograph is inherited from DRIVE. For the training set, the vessel reference standard is a modified version of 1st_manual from DRIVE. For the test set, the vessel reference standard is 2nd_manual from DRIVE. + +### Statistic Information + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------ | ----------------- | ------------ | ------------------ | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [Rite](https://opendatalab.com/RITE) | head_and_neck | segmentation | fundus_photography | 2 | 20/-/20 | yes/-/yes | 2013 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 20 | 91.61 | - | - | 20 | 91.58 | +| vessel | 20 | 8.39 | - | - | 20 | 8.42 | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![rite](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/fundus_photography/rite/rite_dataset.png?raw=true) + +### Dataset Citation + +``` +@InProceedings{10.1007/978-3-642-40763-5_54, + author={Hu, Qiao and Abr{\`a}moff, Michael D. and Garvin, Mona K.}, + title={Automated Separation of Binary Overlapping Trees in Low-Contrast Color Retinal Images}, + booktitle={Medical Image Computing and Computer-Assisted Intervention -- MICCAI 2013}, + year={2013}, + pages={436--443}, +} + + +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 9.3.0 +- scikit-learn(sklearn) v1.2.0 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `rite/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://opendatalab.com/RITE) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fundus_photography + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ rite + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_rite-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_rite-512x512.py new file mode 100644 index 0000000..27dd436 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_rite-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './rite_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.rite_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_rite-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_rite-512x512.py new file mode 100644 index 0000000..48f6f97 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_rite-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './rite_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.rite_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_rite-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_rite-512x512.py new file mode 100644 index 0000000..5f5b24b --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_rite-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './rite_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.rite_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_rite-512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_rite-512x512.py new file mode 100644 index 0000000..bf66b6f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_rite-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './rite_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.rite_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/rite_512x512.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/rite_512x512.py new file mode 100644 index 0000000..02f620c --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/configs/rite_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'RITEDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='test.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/datasets/rite_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/datasets/rite_dataset.py new file mode 100644 index 0000000..99f688d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/datasets/rite_dataset.py @@ -0,0 +1,31 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class RITEDataset(BaseSegDataset): + """RITEDataset dataset. + + In segmentation map annotation for RITEDataset, + 0 stands for background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'vessel')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/tools/prepare_dataset.py new file mode 100644 index 0000000..ca7e996 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/fundus_photography/rite/tools/prepare_dataset.py @@ -0,0 +1,98 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.tif' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' +src_img_train_dir = os.path.join(root_path, 'AV_groundTruth/training/images/') +src_img_test_dir = os.path.join(root_path, 'AV_groundTruth/test/images/') +src_mask_train_dir = os.path.join(root_path, 'AV_groundTruth/training/vessel/') +src_mask_test_dir = os.path.join(root_path, 'AV_groundTruth/test/vessel/') + +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +tgt_img_test_dir = os.path.join(root_path, 'images/test/') +tgt_mask_test_dir = os.path.join(root_path, 'masks/test/') +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) +os.system('mkdir -p ' + tgt_img_test_dir) +os.system('mkdir -p ' + tgt_mask_test_dir) + + +def filter_suffix_recursive(src_dir, suffix): + # filter out file names and paths in source directory + suffix = '.' + suffix if '.' not in suffix else suffix + file_paths = glob.glob( + os.path.join(src_dir, '**', '*' + suffix), recursive=True) + file_names = [_.split('/')[-1] for _ in file_paths] + return sorted(file_paths), sorted(file_names) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +def convert_pics_into_pngs(src_dir, tgt_dir, suffix, convert='RGB'): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_img_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + num = len(src_paths) + img = np.array(Image.open(src_path)) + if len(img.shape) == 2: + pil = Image.fromarray(img).convert(convert) + elif len(img.shape) == 3: + pil = Image.fromarray(img) + else: + raise ValueError('Input image not 2D/3D: ', img.shape) + + pil.save(tgt_path) + print(f'processed {i+1}/{num}.') + + +def convert_label_pics_into_pngs(src_dir, + tgt_dir, + suffix, + convert_dict={ + 0: 0, + 255: 1 + }): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + num = len(src_paths) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_seg_map_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + + img = np.array(Image.open(src_path)) + img = convert_label(img, convert_dict) + Image.fromarray(img).save(tgt_path) + print(f'processed {i+1}/{num}.') + + +if __name__ == '__main__': + + convert_pics_into_pngs( + src_img_train_dir, tgt_img_train_dir, suffix=img_suffix) + + convert_pics_into_pngs( + src_img_test_dir, tgt_img_test_dir, suffix=img_suffix) + + convert_label_pics_into_pngs( + src_mask_train_dir, tgt_mask_train_dir, suffix=seg_map_suffix) + + convert_label_pics_into_pngs( + src_mask_test_dir, tgt_mask_test_dir, suffix=seg_map_suffix) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/README.md new file mode 100644 index 0000000..97c4a0f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/README.md @@ -0,0 +1,123 @@ +# breastCancerCellSegmentation + +## Description + +This project supports **`breastCancerCellSegmentation`**, which can be downloaded from [here](https://www.heywhale.com/mw/dataset/5e9e9b35ebb37f002c625423). + +### Dataset Overview + +This dataset, with 58 H&E-stained histopathology images was used for breast cancer cell detection and associated real-world data. +Conventional histology uses a combination of hematoxylin and eosin stains, commonly referred to as H&E. These images are stained because most cells are inherently transparent with little or no intrinsic pigment. +Certain special stains selectively bind to specific components and can be used to identify biological structures such as cells. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| -------------------------------------------------------------------------------------------- | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [breastCancerCellSegmentation](https://www.heywhale.com/mw/dataset/5e9e9b35ebb37f002c625423) | cell | segmentation | histopathology | 2 | 58/-/- | yes/-/- | 2020 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 58 | 98.37 | - | - | - | - | +| breastCancerCell | 58 | 1.63 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/breastCancerCellSegmentation/breastCancerCellSegmentation_dataset.png) + +## Usage + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow (PIL) v9.3.0 +- scikit-learn (sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `breastCancerCellSegmentation/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- Download dataset from [here](https://www.heywhale.com/mw/dataset/5e9e9b35ebb37f002c625423) and save it to the `data/` directory . +- Decompress data to path `data/`. This will create a new folder named `data/breastCancerCellSegmentation/`, which contains the original image data. +- run script `python tools/prepare_dataset.py` to format data and change folder structure as below. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ breastCancerCellSegmentation + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ breastCancerCellSegmentation + | โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + | โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + | โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + | โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ | โ”œโ”€โ”€ xxx.tif + | โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + | โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ | โ”œโ”€โ”€ xxx.TIF + +``` + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/breastCancerCellSegmentation_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/breastCancerCellSegmentation_512x512.py new file mode 100644 index 0000000..1cf0fcc --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/breastCancerCellSegmentation_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'breastCancerCellSegmentationDataset' +data_root = 'data/breastCancerCellSegmentation' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile', imdecode_backend='tifffile'), + dict(type='LoadAnnotations', imdecode_backend='tifffile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile', imdecode_backend='tifffile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations', imdecode_backend='tifffile'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images', seg_map_path='masks'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images', seg_map_path='masks'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breastCancerCellSegmentation-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breastCancerCellSegmentation-512x512.py new file mode 100644 index 0000000..55d1708 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breastCancerCellSegmentation-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './breastCancerCellSegmentation_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.breastCancerCellSegmentation_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breastCancerCellSegmentation-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breastCancerCellSegmentation-512x512.py new file mode 100644 index 0000000..cf28aad --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breastCancerCellSegmentation-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './breastCancerCellSegmentation_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.breastCancerCellSegmentation_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breastCancerCellSegmentation-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breastCancerCellSegmentation-512x512.py new file mode 100644 index 0000000..29aaff3 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breastCancerCellSegmentation-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './breastCancerCellSegmentation_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.breastCancerCellSegmentation_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/datasets/breastCancerCellSegmentation_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/datasets/breastCancerCellSegmentation_dataset.py new file mode 100644 index 0000000..eeceb63 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/datasets/breastCancerCellSegmentation_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class breastCancerCellSegmentationDataset(BaseSegDataset): + """breastCancerCellSegmentationDataset dataset. + + In segmentation map annotation for breastCancerCellSegmentationDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'breastCancerCell')) + + def __init__(self, + img_suffix='_ccd.tif', + seg_map_suffix='.TIF', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/tools/prepare_dataset.py new file mode 100644 index 0000000..09cc689 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/tools/prepare_dataset.py @@ -0,0 +1,36 @@ +import argparse +import glob +import os + +from sklearn.model_selection import train_test_split + + +def save_anno(img_list, file_path, suffix): + # ๅชไฟ็•™ๆ–‡ไปถๅ๏ผŒไธไฟ็•™ๅŽ็ผ€ + img_list = [x.split('/')[-1][:-len(suffix)] for x in img_list] + + with open(file_path, 'w') as file_: + for x in list(img_list): + file_.write(x + '\n') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_root', default='data/breastCancerCellSegmentation/') + args = parser.parse_args() + data_root = args.data_root + + # 1. ๅˆ’ๅˆ†่ฎญ็ปƒ้›†ใ€้ชŒ่ฏ้›† + # 1.1 ่Žทๅ–ๆ‰€ๆœ‰ๅ›พ็‰‡่ทฏๅพ„ + img_list = glob.glob(os.path.join(data_root, 'images', '*.tif')) + img_list.sort() + mask_list = glob.glob(os.path.join(data_root, 'masks', '*.TIF')) + mask_list.sort() + assert len(img_list) == len(mask_list) + # 1.2 ๅˆ’ๅˆ†่ฎญ็ปƒ้›†ใ€้ชŒ่ฏ้›†ใ€ๆต‹่ฏ•้›† + train_img_list, val_img_list, train_mask_list, val_mask_list = train_test_split( # noqa + img_list, mask_list, test_size=0.2, random_state=42) + # 1.3 ไฟๅญ˜ๅˆ’ๅˆ†็ป“ๆžœ + save_anno(train_img_list, os.path.join(data_root, 'train.txt'), '_ccd.tif') + save_anno(val_img_list, os.path.join(data_root, 'val.txt'), '_ccd.tif') diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/README.md new file mode 100644 index 0000000..b6f1ca6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/README.md @@ -0,0 +1,147 @@ +# Breast Cancer Cell Segmentation + +## Description + +This project support **`Breast Cancer Cell Segmentation`**, and the dataset used in this project can be downloaded from [here](https://tianchi.aliyun.com/dataset/dataDetail?dataId=90152). + +### Dataset Overview + +In this dataset, there are 58 H&E stained histopathology images used in breast cancer cell detection with associated ground truth data available. Routine histology uses the stain combination of hematoxylin and eosin, commonly referred to as H&E. These images are stained since most cells are essentially transparent, with little or no intrinsic pigment. Certain special stains, which bind selectively to particular components, are be used to identify biological structures such as cells. In those images, the challenging problem is cell segmentation for subsequent classification in benign and malignant cells. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| --------------------------------------------------------------------------------------------- | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------------------------------------------------ | +| [Breast Cancer Cell Segmentation](https://tianchi.aliyun.com/dataset/dataDetail?dataId=90152) | thorax | segmentation | histopathology | 2 | 58/-/- | yes/-/- | 2021 | [CC-BY-SA-NC 4.0](http://creativecommons.org/licenses/by-sa/4.0/?spm=5176.12282016.0.0.3f5b5291ypBxb2) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :----------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| normal | 58 | 98.37 | - | - | - | - | +| breast cancer cell | 58 | 1.63 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/breast_cancer_cell_seg/breast_cancer_cell_seg_dataset.png) + +## Dataset Citation + +``` +@inproceedings{gelasca2008evaluation, + title={Evaluation and benchmark for biological image segmentation}, + author={Gelasca, Elisa Drelie and Byun, Jiyun and Obara, Boguslaw and Manjunath, BS}, + booktitle={2008 15th IEEE international conference on image processing}, + pages={1816--1819}, + year={2008}, + organization={IEEE} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `breast_cancer_cell_seg/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://tianchi.aliyun.com/dataset/dataDetail?dataId=90152) and decompression data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ breast_cancer_cell_seg + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :----------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 46 | 98.36 | 12 | 98.41 | - | - | +| erythrocytes | 46 | 1.64 | 12 | 1.59 | - | - | + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/breast-cancer-cell-seg_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/breast-cancer-cell-seg_512x512.py new file mode 100644 index 0000000..ead40e4 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/breast-cancer-cell-seg_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'BreastCancerCellSegDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breast-cancer-cell-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breast-cancer-cell-seg-512x512.py new file mode 100644 index 0000000..691a0ff --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breast-cancer-cell-seg-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './breast-cancer-cell-seg_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.breast-cancer-cell-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breast-cancer-cell-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breast-cancer-cell-seg-512x512.py new file mode 100644 index 0000000..719b767 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breast-cancer-cell-seg-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './breast-cancer-cell-seg_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.breast-cancer-cell-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breast-cancer-cell-seg-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breast-cancer-cell-seg-512x512.py new file mode 100644 index 0000000..9dfe70f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breast-cancer-cell-seg-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './breast-cancer-cell-seg_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.breast-cancer-cell-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/datasets/breast-cancer-cell-seg_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/datasets/breast-cancer-cell-seg_dataset.py new file mode 100644 index 0000000..6f27029 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/datasets/breast-cancer-cell-seg_dataset.py @@ -0,0 +1,29 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class BreastCancerCellSegDataset(BaseSegDataset): + """BreastCancerCellSegDataset dataset. + + In segmentation map annotation for BreastCancerCellSegDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('normal', 'breast cancer cell')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py new file mode 100755 index 0000000..775f2ee --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py @@ -0,0 +1,47 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.tif' +seg_map_suffix = '.TIF' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +x_train = glob.glob( + os.path.join('data/Breast Cancer Cell Segmentation_datasets/Images/*' + + img_suffix)) + +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'masks/train/') + +D2_255_convert_dict = {0: 0, 255: 1} + + +def convert_2d(img, convert_dict=D2_255_convert_dict): + arr_2d = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8) + for c, i in convert_dict.items(): + arr_2d[img == c] = i + return arr_2d + + +part_dir_dict = {0: 'train/'} +for ith, part in enumerate([x_train]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + img_save_path = root_path + 'images/' + part_dir + basename.split( + '.')[0] + save_img_suffix + Image.open(img).save(img_save_path) + mask_path = root_path + 'Breast Cancer Cell Segmentation_datasets/Masks/' + '_'.join( # noqa + basename.split('_')[:-1]) + seg_map_suffix + label = np.array(Image.open(mask_path)) + + save_mask_path = root_path + 'masks/' + part_dir + basename.split( + '.')[0] + save_seg_map_suffix + assert len(label.shape) == 2 and 255 in label and 1 not in label + mask = convert_2d(label) + mask = Image.fromarray(mask.astype(np.uint8)) + mask.save(save_mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/README.md new file mode 100644 index 0000000..1f55b44 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/README.md @@ -0,0 +1,207 @@ +# CoNIC: Colon Nuclei Identification and Counting Challenge + +## Description + +This project supports **`CoNIC: Colon Nuclei Identification and Counting Challenge`**, which can be downloaded from [here](https://drive.google.com/drive/folders/1il9jG7uA4-ebQ_lNmXbbF2eOK9uNwheb). + +### Dataset Overview + +Nuclear segmentation, classification and quantification within Haematoxylin & Eosin stained histology images enables the extraction of interpretable cell-based features that can be used in downstream explainable models in computational pathology (CPath). To help drive forward research and innovation for automatic nuclei recognition in CPath, we organise the Colon Nuclei Identification and Counting (CoNIC) Challenge. The challenge requires researchers to develop algorithms that perform segmentation, classification and counting of 6 different types of nuclei within the current largest known publicly available nuclei-level dataset in CPath, containing around half a million labelled nuclei. + +### Task Information + +The CONIC challenge has 2 tasks: + +- Task 1: Nuclear segmentation and classification. + +The first task requires participants to segment nuclei within the tissue, while also classifying each nucleus into one of the following categories: epithelial, lymphocyte, plasma, eosinophil, neutrophil or connective tissue. + +- Task 2: Prediction of cellular composition. + +For the second task, we ask participants to predict how many nuclei of each class are present in each input image. + +The output of Task 1 can be directly used to perform Task 2, but these can be treated as independent tasks. Therefore, if it is preferred, prediction of cellular composition can be treated as a stand alone regression task. + +***NOTE๏ผšWe only consider `Task 1` in the following sections.*** + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| -------------------------------------------------------- | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------------------------------------------------------ | +| [CoNIC202](https://conic-challenge.grand-challenge.org/) | abdomen | segmentation | histopathology | 7 | 4981/-/- | yes/-/- | 2022 | [Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 4981 | 83.97 | - | - | - | - | +| neutrophil | 1218 | 0.13 | - | - | - | - | +| epithelial | 4256 | 10.31 | - | - | - | - | +| lymphocyte | 4473 | 1.85 | - | - | - | - | +| plasma | 3316 | 0.55 | - | - | - | - | +| eosinophil | 1456 | 0.1 | - | - | - | - | +| connective | 4613 | 3.08 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/conic2022_seg/conic2022_seg_dataset.png) + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `conic2022_seg/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://drive.google.com/drive/folders/1il9jG7uA4-ebQ_lNmXbbF2eOK9uNwheb/) and move data to path `'data/CoNIC_Challenge'`. The directory should be like: + ```shell + data/CoNIC_Challenge + โ”œโ”€โ”€ README.txt + โ”œโ”€โ”€ by-nc-sa.md + โ”œโ”€โ”€ counts.csv + โ”œโ”€โ”€ images.npy + โ”œโ”€โ”€ labels.npy + โ””โ”€โ”€ patch_info.csv + ``` +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ conic2022_seg + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 3984 | 84.06 | 997 | 83.65 | - | - | +| neutrophil | 956 | 0.12 | 262 | 0.13 | - | - | +| epithelial | 3400 | 10.26 | 856 | 10.52 | - | - | +| lymphocyte | 3567 | 1.83 | 906 | 1.96 | - | - | +| plasma | 2645 | 0.55 | 671 | 0.56 | - | - | +| eosinophil | 1154 | 0.1 | 302 | 0.1 | - | - | +| connective | 3680 | 3.08 | 933 | 3.08 | - | - | + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Organizers + +- Simon Graham (TIA, PathLAKE) +- Mostafa Jahanifar (TIA, PathLAKE) +- Dang Vu (TIA) +- Giorgos Hadjigeorghiou (TIA, PathLAKE) +- Thomas Leech (TIA, PathLAKE) +- David Snead (UHCW, PathLAKE) +- Shan Raza (TIA, PathLAKE) +- Fayyaz Minhas (TIA, PathLAKE) +- Nasir Rajpoot (TIA, PathLAKE) + +TIA: Tissue Image Analytics Centre, Department of Computer Science, University of Warwick, United Kingdom + +UHCW: Department of Pathology, University Hospitals Coventry and Warwickshire, United Kingdom + +PathLAKE: Pathology Image Data Lake for Analytics Knowledge & Education, , University Hospitals Coventry and Warwickshire, United Kingdom + +## Dataset Citation + +If this work is helpful for your research, please consider citing the below paper. + +``` +@inproceedings{graham2021lizard, + title={Lizard: A large-scale dataset for colonic nuclear instance segmentation and classification}, + author={Graham, Simon and Jahanifar, Mostafa and Azam, Ayesha and Nimir, Mohammed and Tsang, Yee-Wah and Dodd, Katherine and Hero, Emily and Sahota, Harvir and Tank, Atisha and Benes, Ksenija and others}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={684--693}, + year={2021} +} +@article{graham2021conic, + title={Conic: Colon nuclei identification and counting challenge 2022}, + author={Graham, Simon and Jahanifar, Mostafa and Vu, Quoc Dang and Hadjigeorghiou, Giorgos and Leech, Thomas and Snead, David and Raza, Shan E Ahmed and Minhas, Fayyaz and Rajpoot, Nasir}, + journal={arXiv preprint arXiv:2111.14485}, + year={2021} +} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/conic2022-seg_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/conic2022-seg_512x512.py new file mode 100644 index 0000000..51b4e57 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/conic2022-seg_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'Conic2022SegDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_conic2022-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_conic2022-512x512.py new file mode 100644 index 0000000..3e0248c --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_conic2022-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './conic2022-seg_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.conic2022-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=7), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_conic2022-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_conic2022-512x512.py new file mode 100644 index 0000000..fd0e9d8 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_conic2022-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './conic2022-seg_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.conic2022-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=7), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_conic2022-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_conic2022-512x512.py new file mode 100644 index 0000000..bb667f1 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_conic2022-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './conic2022-seg_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.conic2022-seg_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=7), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/datasets/conic2022-seg_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/datasets/conic2022-seg_dataset.py new file mode 100644 index 0000000..9af0958 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/datasets/conic2022-seg_dataset.py @@ -0,0 +1,29 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class Conic2022SegDataset(BaseSegDataset): + """Conic2022SegDataset dataset. + + In segmentation map annotation for Conic2022SegDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict( + classes=('background', 'neutrophil', 'epithelial', 'lymphocyte', + 'plasma', 'eosinophil', 'connective')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py new file mode 100755 index 0000000..89cfb4a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py @@ -0,0 +1,65 @@ +import glob +import os +import shutil + +import numpy as np +from PIL import Image + +img_save_root = 'data/' +root_path = 'data/' +img_suffix = '.png' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +label_set = set() + + +def save_masks_from_npz(data, save_root, part='masks/'): + global label_set + num = data.shape[0] + for i in range(num): + # np_img = data[i, :, :, :] + np_mask = data[i, :, :, 1] + label_set = set.union(label_set, set(np.unique(np_mask))) + img = Image.fromarray(np_mask) + save_path = os.path.join(save_root, part, str(i) + save_seg_map_suffix) + img.save(save_path) + + +def save_images_from_npz(data, save_root, part='images/'): + num = data.shape[0] + for i in range(num): + np_img = data[i, :, :, :] + img = Image.fromarray(np_img) + save_path = os.path.join(save_root, part, str(i) + save_img_suffix) + img.save(save_path) + + +images_npy = np.load('data/CoNIC_Challenge/images.npy') +labels_npy = np.load('data/CoNIC_Challenge/labels.npy') + +os.system('mkdir -p ' + img_save_root + 'images_ori') +os.system('mkdir -p ' + img_save_root + 'labels') +save_images_from_npz(images_npy, img_save_root, 'images_ori') +save_masks_from_npz(labels_npy, img_save_root, 'labels') +print(label_set) + +x_train = glob.glob(os.path.join('data/images_ori/*' + img_suffix)) + +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'masks/train/') + +part_dir_dict = {0: 'train/', 1: 'val/'} +for ith, part in enumerate([x_train]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + shutil.copy( + img, root_path + 'images/' + part_dir + basename.split('.')[0] + + save_img_suffix) + mask_path = root_path + 'labels/' + basename.split( + '.')[0] + seg_map_suffix + save_mask_path = root_path + 'masks/' + part_dir + basename.split( + '.')[0] + save_seg_map_suffix + shutil.copy(mask_path, save_mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/consep/README.md new file mode 100644 index 0000000..ca3d7aa --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/README.md @@ -0,0 +1,147 @@ +# Colorectal Nuclear Segmentation and Phenotypes (CoNSeP) Dataset + +## Description + +This project supports **`Colorectal Nuclear Segmentation and Phenotypes (CoNSeP) Dataset`**, which can be downloaded from [here](https://warwick.ac.uk/fac/cross_fac/tia/data/hovernet/). + +### Dataset Overview + +The CoNSeP (Colon Segmentation and Phenotyping) dataset consists of 41 H&E stained image tiles, each with a size of 1,000ร—1,000 pixels and a magnification of 40x. These images were extracted from 16 colorectal adenocarcinoma (CRA) whole slide images (WSI), each of which belonged to a separate patient and was scanned using an Omnyx VL120 scanner at the Pathology Department of the University Hospitals Coventry and Warwickshire NHS Trust, UK. This dataset was first used in paper named, "HoVer-Net: Simultaneous Segmentation and Classification of Nuclei in Multi-Tissue Histology Images". + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| -------------------------------------------------------- | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | ------- | +| [CoNIC202](https://conic-challenge.grand-challenge.org/) | abdomen | segmentation | histopathology | 7 | 4981/-/- | yes/-/- | 2022 | - | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :-----------------------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 27 | 83.61 | 14 | 80.4 | - | - | +| other | 17 | 0.17 | 9 | 0.52 | - | - | +| inflammatory | 25 | 2.66 | 14 | 2.14 | - | - | +| healthy epithelial | 3 | 1.47 | 2 | 1.58 | - | - | +| dysplastic/malignant epithelial | 10 | 7.17 | 8 | 9.16 | - | - | +| fibroblast | 23 | 3.84 | 14 | 4.63 | - | - | +| muscle | 8 | 1.05 | 3 | 1.42 | - | - | +| endothelial | 7 | 0.02 | 4 | 0.15 | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/consep/consep_dataset.png) + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `conic2022_seg/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://opendatalab.com/CoNSeP) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ consep + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Dataset Citation + +If this work is helpful for your research, please consider citing the below paper. + +``` +@article{graham2019hover, + title={Hover-net: Simultaneous segmentation and classification of nuclei in multi-tissue histology images}, + author={Graham, Simon and Vu, Quoc Dang and Raza, Shan E Ahmed and Azam, Ayesha and Tsang, Yee Wah and Kwak, Jin Tae and Rajpoot, Nasir}, + journal={Medical Image Analysis}, + volume={58}, + pages={101563}, + year={2019}, + publisher={Elsevier} +} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/consep_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/consep_512x512.py new file mode 100644 index 0000000..0d9b894 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/consep_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'ConsepDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_consep-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_consep-512x512.py new file mode 100644 index 0000000..cbcf5db --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_consep-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './consep_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.consep_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=8), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_consep-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_consep-512x512.py new file mode 100644 index 0000000..b374566 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_consep-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './consep_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.consep_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=8), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_consep-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_consep-512x512.py new file mode 100644 index 0000000..35bdaa3 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_consep-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + './consep_512x512.py', 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.consep_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=8), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/datasets/consep_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/consep/datasets/consep_dataset.py new file mode 100644 index 0000000..ceb2b3a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/datasets/consep_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class ConsepDataset(BaseSegDataset): + """ConsepDataset dataset. + + In segmentation map annotation for ConsepDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict( + classes=('background', 'other', 'inflammatory', 'healthy epithelial', + 'dysplastic/malignant epithelial', 'fibroblast', 'muscle', + 'endothelial')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py new file mode 100755 index 0000000..83a2e18 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py @@ -0,0 +1,54 @@ +import glob +import os +import shutil + +import numpy as np +from PIL import Image +from scipy.io import loadmat + +root_path = 'data/' +img_suffix = '.png' +seg_map_suffix = '.mat' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +x_train = glob.glob(os.path.join('data/CoNSeP/Train/Images/*' + img_suffix)) +x_test = glob.glob(os.path.join('data/CoNSeP/Test/Images/*' + img_suffix)) + +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'images/val/') +os.system('mkdir -p ' + root_path + 'masks/train/') +os.system('mkdir -p ' + root_path + 'masks/val/') +D2_255_convert_dict = {0: 0, 255: 1} + + +def convert_2d(img, convert_dict=D2_255_convert_dict): + arr_2d = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8) + for c, i in convert_dict.items(): + arr_2d[img == c] = i + return arr_2d + + +part_dir_dict = {0: 'CoNSeP/Train/', 1: 'CoNSeP/Test/'} +save_dir_dict = {0: 'train/', 1: 'val/'} +for ith, part in enumerate([x_train, x_test]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + shutil.copy( + img, root_path + 'images/' + save_dir_dict[ith] + + basename.split('.')[0] + save_img_suffix) + + mask_path = root_path + part_dir + 'Labels/' + basename.split( + '.')[0] + seg_map_suffix + label_ = loadmat(mask_path) + label = label_['inst_map'] + label_type = label_['inst_type'] + label_dict = {i + 1: int(val) for i, val in enumerate(label_type)} + + save_mask_path = root_path + 'masks/' + save_dir_dict[ + ith] + basename.split('.')[0] + save_seg_map_suffix + + res = convert_2d(label, convert_dict=label_dict) + res = Image.fromarray(res.astype(np.uint8)) + res.save(save_mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/README.md new file mode 100644 index 0000000..8130d59 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/README.md @@ -0,0 +1,136 @@ +# Foot Ulcer Segmentation Challenge 2021 (FUSC 2021) + +## Description + +This project supports **`Foot Ulcer Segmentation Challenge 2021 (FUSC 2021) `**, which can be downloaded from [here](https://fusc.grand-challenge.org/). + +### Dataset Overview + +This chronic wound dataset was collected over 2 years from October 2019 to April 2021 at the center and contains 1,210 foot ulcer images taken from 889 patients during multiple clinical visits. The raw images were taken by Canon SX 620 HS digital camera and iPad Pro under uncontrolled illumination conditions, +with various backgrounds. The images (shown in Figure 1) are randomly split into 3 subsets: a training set with 810 images, a validation set with 200 images, and a testing set with 200 images. Of course, the annotations of the testing set are kept private. The data collected were de-identified and in accordance with relevant guidelines and regulations and the patientโ€™s informed consent is waived by the institutional review board of the University of Wisconsin-Milwaukee. + +### Information Statistics + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| --------------------------------------------- | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------- | +| [fusc2021](https://fusc.grand-challenge.org/) | lower limb | segmentation | histopathology | 2 | 810/200/200 | yes/yes/no | 2021 | [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 810 | 98.71 | 200 | 98.78 | - | - | +| wound | 791 | 1.29 | 195 | 1.22 | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![fusc2021](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/fusc2021/fusc2021_dataset.png?raw=true) + +### Dataset Citation + +``` +@article{s41598-020-78799-w, + title={Fully automatic wound segmentation with deep convolutional neural networks}, + author={Chuanbo Wang and D. M. Anisuzzaman and Victor Williamson and Mrinal Kanti Dhar and Behrouz Rostami and Jeffrey Niezgoda and Sandeep Gopalakrishnan and Zeyun Yu}, + journal={Scientific Reports}, + volume={10}, + number={1}, + pages={21897}, + year={2020} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `fusc2021/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://fusc.grand-challenge.org/) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fusc2021 + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_fusc2021-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_fusc2021-512x512.py new file mode 100644 index 0000000..c3f4275 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_fusc2021-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './fusc2021_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.fusc2021_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_fusc2021-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_fusc2021-512x512.py new file mode 100644 index 0000000..ed87030 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_fusc2021-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './fusc2021_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.fusc2021_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_fusc2021-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_fusc2021-512x512.py new file mode 100644 index 0000000..cbc09ae --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_fusc2021-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './fusc2021_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.fusc2021_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_fusc2021-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_fusc2021-512x512.py new file mode 100644 index 0000000..f1477ee --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_fusc2021-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './fusc2021_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.fusc2021_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fusc2021_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fusc2021_512x512.py new file mode 100644 index 0000000..e650474 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/configs/fusc2021_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'FUSC2021Dataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/datasets/fusc2021_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/datasets/fusc2021_dataset.py new file mode 100644 index 0000000..d331ac8 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/datasets/fusc2021_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class FUSC2021Dataset(BaseSegDataset): + """FUSC2021Dataset dataset. + + In segmentation map annotation for FUSC2021Dataset, 0 stands for background + , which is included in 2 categories. ``reduce_zero_label`` + is fixed to False. The ``img_suffix`` is fixed to '.png' and + ``seg_map_suffix`` is fixed to '.png'. + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False.. + """ + METAINFO = dict(classes=('background', 'wound')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/tools/prepare_dataset.py new file mode 100644 index 0000000..8f2de3d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/fusc2021/tools/prepare_dataset.py @@ -0,0 +1,114 @@ +import glob +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +img_suffix = '.png' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' +src_img_train_dir = os.path.join( + root_path, 'wound-segmentation/data/' + + 'Foot Ulcer Segmentation Challenge/train/images') +src_img_val_dir = os.path.join( + root_path, 'wound-segmentation/data/' + + 'Foot Ulcer Segmentation Challenge/validation/images') +src_img_test_dir = os.path.join( + root_path, 'wound-segmentation/data/' + + 'Foot Ulcer Segmentation Challenge/test/images') +src_mask_train_dir = os.path.join( + root_path, 'wound-segmentation/data/' + + 'Foot Ulcer Segmentation Challenge/train/labels') +src_mask_val_dir = os.path.join( + root_path, 'wound-segmentation/data/' + + 'Foot Ulcer Segmentation Challenge/validation/labels') + +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +tgt_img_val_dir = os.path.join(root_path, 'images/val/') +tgt_mask_val_dir = os.path.join(root_path, 'masks/val/') +tgt_img_test_dir = os.path.join(root_path, 'images/test/') +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_img_val_dir) +os.system('mkdir -p ' + tgt_img_test_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) +os.system('mkdir -p ' + tgt_mask_val_dir) + + +def filter_suffix_recursive(src_dir, suffix): + # filter out file names and paths in source directory + suffix = '.' + suffix if '.' not in suffix else suffix + file_paths = glob.glob( + os.path.join(src_dir, '**', '*' + suffix), recursive=True) + file_names = [_.split('/')[-1] for _ in file_paths] + return sorted(file_paths), sorted(file_names) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +def convert_pics_into_pngs(src_dir, tgt_dir, suffix, convert='RGB'): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_img_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + num = len(src_paths) + img = np.array(Image.open(src_path)) + if len(img.shape) == 2: + pil = Image.fromarray(img).convert(convert) + elif len(img.shape) == 3: + pil = Image.fromarray(img) + else: + raise ValueError('Input image not 2D/3D: ', img.shape) + + pil.save(tgt_path) + print(f'processed {i+1}/{num}.') + + +def convert_label_pics_into_pngs(src_dir, + tgt_dir, + suffix, + convert_dict={ + 0: 0, + 255: 1 + }): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + num = len(src_paths) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, save_seg_map_suffix) + tgt_path = os.path.join(tgt_dir, tgt_name) + + img = np.array(Image.open(src_path).convert('L')) + img = convert_label(img, convert_dict) + Image.fromarray(img).save(tgt_path) + print(f'processed {i+1}/{num}.') + + +if __name__ == '__main__': + + convert_pics_into_pngs( + src_img_train_dir, tgt_img_train_dir, suffix=img_suffix) + + convert_pics_into_pngs(src_img_val_dir, tgt_img_val_dir, suffix=img_suffix) + + convert_pics_into_pngs( + src_img_test_dir, tgt_img_test_dir, suffix=img_suffix) + + convert_label_pics_into_pngs( + src_mask_train_dir, tgt_mask_train_dir, suffix=seg_map_suffix) + + convert_label_pics_into_pngs( + src_mask_val_dir, tgt_mask_val_dir, suffix=seg_map_suffix) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/README.md new file mode 100644 index 0000000..e0cade7 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/README.md @@ -0,0 +1,146 @@ +# Pan-Cancer Histology Dataset for Nuclei Instance Segmentation and Classification (PanNuke) + +## Description + +This project supports **`Pan-Cancer Histology Dataset for Nuclei Instance Segmentation and Classification (PanNuke)`**, which can be downloaded from [here](https://academictorrents.com/details/99f2c7b57b95500711e33f2ee4d14c9fd7c7366c). + +### Dataset Overview + +Semi automatically generated nuclei instance segmentation and classification dataset with exhaustive nuclei labels across 19 different tissue types. The dataset consists of 481 visual fields, of which 312 are randomly sampled from more than 20K whole slide images at different magnifications, from multiple data sources. In total the dataset contains 205,343 labeled nuclei, each with an instance segmentation mask. Models trained on pannuke can aid in whole slide image tissue type segmentation, and generalise to new tissues. PanNuke demonstrates one of the first successfully semi-automatically generated datasets. + +### Statistic Information + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ---------------------------------------------------------------------------------------- | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [Pannuke](https://academictorrents.com/details/99f2c7b57b95500711e33f2ee4d14c9fd7c7366c) | full_body | segmentation | histopathology | 6 | 7901/-/- | yes/-/- | 2019 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :-----------------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 7901 | 83.32 | - | - | - | - | +| neoplastic | 4190 | 8.64 | - | - | - | - | +| non-neoplastic epithelial | 4126 | 1.77 | - | - | - | - | +| inflammatory | 6137 | 3.73 | - | - | - | - | +| connective | 232 | 0.07 | - | - | - | - | +| dead | 1528 | 2.47 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![pannuke](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/pannuke/pannuke_dataset.png?raw=true) + +### Dataset Citation + +``` +@inproceedings{gamper2019pannuke, + title={PanNuke: an open pan-cancer histology dataset for nuclei instance segmentation and classification}, + author={Gamper, Jevgenij and Koohbanani, Navid Alemi and Benet, Ksenija and Khuram, Ali and Rajpoot, Nasir}, + booktitle={European Congress on Digital Pathology}, + pages={11--19}, + year={2019}, +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 9.3.0 +- scikit-learn(sklearn) v1.2.0 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `pannuke/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://academictorrents.com/details/99f2c7b57b95500711e33f2ee4d14c9fd7c7366c) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ pannuke + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :-----------------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 6320 | 83.38 | 1581 | 83.1 | - | - | +| neoplastic | 3339 | 8.55 | 851 | 9.0 | - | - | +| non-neoplastic epithelial | 3293 | 1.77 | 833 | 1.76 | - | - | +| inflammatory | 4914 | 3.72 | 1223 | 3.76 | - | - | +| connective | 170 | 0.06 | 62 | 0.09 | - | - | +| dead | 1235 | 2.51 | 293 | 2.29 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_bactteria-detection-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_bactteria-detection-512x512.py new file mode 100644 index 0000000..92584e9 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_bactteria-detection-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './bactteria-detection_512x512.py', 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.bactteria-detection_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pannuke-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pannuke-512x512.py new file mode 100644 index 0000000..042a08c --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pannuke-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pannuke_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pannuke_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pannuke-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pannuke-512x512.py new file mode 100644 index 0000000..e92514c --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pannuke-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pannuke_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pannuke_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pannuke-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pannuke-512x512.py new file mode 100644 index 0000000..a9403c8 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pannuke-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pannuke_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pannuke_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=6), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/pannuke_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/pannuke_512x512.py new file mode 100644 index 0000000..316ac1a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/configs/pannuke_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'PanNukeDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/datasets/pannuke_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/datasets/pannuke_dataset.py new file mode 100644 index 0000000..4d3c687 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/datasets/pannuke_dataset.py @@ -0,0 +1,33 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class PanNukeDataset(BaseSegDataset): + """PanNukeDataset dataset. + + In segmentation map annotation for PanNukeDataset, + 0 stands for background, which is included in 6 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict( + classes=('background', 'neoplastic', 'non-neoplastic epithelial', + 'inflammatory', 'connective', 'dead')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/tools/prepare_dataset.py new file mode 100644 index 0000000..7213b18 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pannuke/tools/prepare_dataset.py @@ -0,0 +1,49 @@ +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' + +tgt_img_dir = os.path.join(root_path, 'images/train') +tgt_mask_dir = os.path.join(root_path, 'masks/train') +os.system('mkdir -p ' + tgt_img_dir) +os.system('mkdir -p ' + tgt_mask_dir) + +fold_img_paths = sorted([ + os.path.join(root_path, 'pannuke/Fold 1/images/fold1/images.npy'), + os.path.join(root_path, 'pannuke/Fold 2/images/fold2/images.npy'), + os.path.join(root_path, 'pannuke/Fold 3/images/fold3/images.npy') +]) + +fold_mask_paths = sorted([ + os.path.join(root_path, 'pannuke/Fold 1/masks/fold1/masks.npy'), + os.path.join(root_path, 'pannuke/Fold 2/masks/fold2/masks.npy'), + os.path.join(root_path, 'pannuke/Fold 3/masks/fold3/masks.npy') +]) + +for n, (img_path, + mask_path) in enumerate(zip(fold_img_paths, fold_mask_paths)): + fold_name = str(n + 1) + imgs = np.load(img_path) + masks = np.load(mask_path) + + for i in range(imgs.shape[0]): + img = np.uint8(imgs[i]) + mask_multichannel = np.minimum(np.uint8(masks[i]), 1) + mask = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8) + for j in range(mask_multichannel.shape[-1]): + factor = (j + 1) % mask_multichannel.shape[-1] + # convert [0,1,2,3,4,5] to [1,2,3,4,5,0], + # with the last label being background + mask[mask_multichannel[..., j] == 1] = factor + + file_name = 'fold' + fold_name + '_' + str(i).rjust(4, '0') + '.png' + print('Processing: ', file_name) + tgt_img_path = os.path.join(tgt_img_dir, file_name) + tgt_mask_path = os.path.join(tgt_mask_dir, file_name) + Image.fromarray(img).save(tgt_img_path) + Image.fromarray(mask).save(tgt_mask_path) + + del imgs + del masks diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/README.md b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/README.md new file mode 100644 index 0000000..5a80949 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/README.md @@ -0,0 +1,153 @@ +# PCam (PatchCamelyon) + +## Description + +This project supports **`Patch Camelyon (PCam) `**, which can be downloaded from [here](https://opendatalab.com/PCam). + +### Dataset Overview + +PatchCamelyon is an image classification dataset. It consists of 327680 color images (96 x 96px) extracted from histopathologic scans of lymph node sections. Each image is annotated with a binary label indicating presence of metastatic tissue. PCam provides a new benchmark for machine learning models: bigger than CIFAR10, smaller than ImageNet, trainable on a single GPU. + +### Statistic Information + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------ | ----------------- | ------------ | -------------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------- | +| [Pcam](https://opendatalab.com/PCam) | throax | segmentation | histopathology | 2 | 327680/-/- | yes/-/- | 2018 | [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :---------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 214849 | 63.77 | - | - | - | - | +| metastatic tissue | 131832 | 36.22 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![pcam](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/pcam/pcam_dataset.png?raw=true) + +### Dataset Citation + +``` +@inproceedings{veeling2018rotation, + title={Rotation equivariant CNNs for digital pathology}, + author={Veeling, Bastiaan S and Linmans, Jasper and Winkens, Jim and Cohen, Taco and Welling, Max}, + booktitle={International Conference on Medical image computing and computer-assisted intervention}, + pages={210--218}, + year={2018}, +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 9.3.0 +- scikit-learn(sklearn) v1.2.0 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `pcam/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://opendatalab.com/PCam) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```shell +mkdir data & cd data +pip install opendatalab +odl get PCam +mv ./PCam/raw/pcamv1 ./ +rm -rf PCam +cd .. +python tools/prepare_dataset.py +python ../../tools/split_seg_dataset.py +``` + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ histopathology + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ pcam + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :---------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 171948 | 63.82 | 42901 | 63.6 | - | - | +| metastatic tissue | 105371 | 36.18 | 26461 | 36.4 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pcam-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pcam-512x512.py new file mode 100644 index 0000000..20601f1 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pcam-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pcam_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pcam_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pcam-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pcam-512x512.py new file mode 100644 index 0000000..c057535 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pcam-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pcam_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pcam_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py new file mode 100644 index 0000000..4c1d5fe --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pcam_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pcam_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_pcam-512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_pcam-512x512.py new file mode 100644 index 0000000..25e3734 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_pcam-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './pcam_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.pcam_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/pcam_512x512.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/pcam_512x512.py new file mode 100644 index 0000000..04efc23 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/configs/pcam_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'PCamDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/datasets/pcam_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/datasets/pcam_dataset.py new file mode 100644 index 0000000..1c27de5 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/datasets/pcam_dataset.py @@ -0,0 +1,31 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class PCamDataset(BaseSegDataset): + """PCamDataset dataset. + + In segmentation map annotation for PCamDataset, + 0 stands for background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'metastatic tissue')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/histopathology/pcam/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/tools/prepare_dataset.py new file mode 100644 index 0000000..75038e6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/histopathology/pcam/tools/prepare_dataset.py @@ -0,0 +1,49 @@ +import os + +import h5py +import numpy as np +from PIL import Image + +root_path = 'data/' + +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +tgt_img_val_dir = os.path.join(root_path, 'images/val/') +tgt_img_test_dir = os.path.join(root_path, 'images/test/') + +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) +os.system('mkdir -p ' + tgt_img_val_dir) +os.system('mkdir -p ' + tgt_img_test_dir) + + +def extract_pics_from_h5(h5_path, h5_key, save_dir): + f = h5py.File(h5_path, 'r') + for i, img in enumerate(f[h5_key]): + img = img.astype(np.uint8).squeeze() + img = Image.fromarray(img) + save_image_path = os.path.join(save_dir, str(i).zfill(8) + '.png') + img.save(save_image_path) + + +if __name__ == '__main__': + + extract_pics_from_h5( + 'data/pcamv1/camelyonpatch_level_2_split_train_x.h5', + h5_key='x', + save_dir=tgt_img_train_dir) + + extract_pics_from_h5( + 'data/pcamv1/camelyonpatch_level_2_split_valid_x.h5', + h5_key='x', + save_dir=tgt_img_val_dir) + + extract_pics_from_h5( + 'data/pcamv1/camelyonpatch_level_2_split_test_x.h5', + h5_key='x', + save_dir=tgt_img_test_dir) + + extract_pics_from_h5( + 'data/pcamv1/camelyonpatch_level_2_split_train_mask.h5', + h5_key='mask', + save_dir=tgt_mask_train_dir) diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/README.md b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/README.md new file mode 100644 index 0000000..ca95921 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/README.md @@ -0,0 +1,167 @@ +# RAVIR: A Dataset and Methodology for the Semantic Segmentation and Quantitative Analysis of Retinal Arteries and Veins in Infrared Reflectance Imaging + +## Description + +This project support **`RAVIR: A Dataset and Methodology for the Semantic Segmentation and Quantitative Analysis of Retinal Arteries and Veins in Infrared Reflectance Imaging`**, and the dataset used in this project can be downloaded from [here](https://ravir.grand-challenge.org/). + +### Dataset Overview + +The retinal vasculature provides important clues in the diagnosis and monitoring of systemic diseases including hypertension and diabetes. The microvascular system is of primary involvement in such conditions, and the retina is the only anatomical site where the microvasculature can be directly observed. The objective assessment of retinal vessels has long been considered a surrogate biomarker for systemic vascular diseases, and with recent advancements in retinal imaging and computer vision technologies, this topic has become the subject of renewed attention. In this paper, we present a novel dataset, dubbed RAVIR, for the semantic segmentation of Retinal Arteries and Veins in Infrared Reflectance (IR) imaging. It enables the creation of deep learning-based models that distinguish extracted vessel type without extensive post-processing. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------- | ----------------- | ------------ | ---------------------------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [Ravir](https://ravir.grand-challenge.org/) | eye | segmentation | infrared reflectance imaging | 3 | 23/-/19 | yes/-/- | 2022 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 23 | 87.22 | - | - | - | - | +| artery | 23 | 5.45 | - | - | - | - | +| vein | 23 | 7.33 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/infrared_reflectance_imaging/ravir/ravir_dataset.png) + +## Dataset Citation + +```bibtex +@article{hatamizadeh2022ravir, + title={RAVIR: A dataset and methodology for the semantic segmentation and quantitative analysis of retinal arteries and veins in infrared reflectance imaging}, + author={Hatamizadeh, Ali and Hosseini, Hamid and Patel, Niraj and Choi, Jinseo and Pole, Cameron C and Hoeferlin, Cory M and Schwartz, Steven D and Terzopoulos, Demetri}, + journal={IEEE Journal of Biomedical and Health Informatics}, + volume={26}, + number={7}, + pages={3272--3283}, + year={2022}, + publisher={IEEE} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `ravir/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://ravir.grand-challenge.org/) and decompression data to path `'data/ravir/'`. +- run script `"python tools/prepare_dataset.py"` to split dataset and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py --data_root data/ravir"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ infrared_reflectance_imaging + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ravir + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ yyy.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 18 | 87.41 | 5 | 86.53 | - | - | +| artery | 18 | 5.44 | 5 | 5.50 | - | - | +| vein | 18 | 7.15 | 5 | 7.97 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default๏ผ‰ + +```shell +mim train mmseg ./configs/${CONFIG_PATH} +``` + +### Testing commands + +To train models on a single server with one GPU. (default๏ผ‰ + +```shell +mim test mmseg ./configs/${CONFIG_PATH} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Results + +### Ravir + +| Method | Backbone | Crop Size | lr | config | +| :-------------: | :------: | :-------: | :----: | :------------------------------------------------------------------------: | +| fcn_unet_s5-d16 | unet | 512x512 | 0.01 | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.001 | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.0001 | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py) | + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py new file mode 100755 index 0000000..375ad5a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './ravir_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.ravir_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py new file mode 100755 index 0000000..a7ecf6d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './ravir_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.ravir_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + type='EncoderDecoder', + data_preprocessor=dict(size=img_scale), + pretrained=None, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py new file mode 100755 index 0000000..28556df --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './ravir_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.ravir_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py new file mode 100755 index 0000000..cb4c292 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'RAVIRDataset' +data_root = 'data/ravir' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py new file mode 100755 index 0000000..6f1d051 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py @@ -0,0 +1,3 @@ +from .ravir_dataset import RAVIRDataset + +__all__ = ['RAVIRDataset'] diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py new file mode 100755 index 0000000..c9e0a8e --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py @@ -0,0 +1,28 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class RAVIRDataset(BaseSegDataset): + """RAVIRDataset dataset. + + In segmentation map annotation for RAVIRDataset, 0 stands for background, + which is included in 3 categories. ``reduce_zero_label`` is fixed to + False. The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is + fixed to '.png'. + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict(classes=('background', 'artery', 'vein')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/tools/prepare_dataset.py new file mode 100644 index 0000000..068dcad --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/infrared_reflectance_imaging/ravir/tools/prepare_dataset.py @@ -0,0 +1,33 @@ +import glob +import os + +import numpy as np +from PIL import Image +from tqdm import tqdm + +# map = {255:2, 128:1, 0:0} + +os.makedirs('data/ravir/images/train', exist_ok=True) +os.makedirs('data/ravir/images/test', exist_ok=True) +os.makedirs('data/ravir/masks/train', exist_ok=True) + +os.system( + r'cp data/ravir/RAVIR\ Dataset/train/training_images/* data/ravir/images/train' # noqa +) +os.system( + r'cp data/ravir/RAVIR\ Dataset/train/training_masks/* data/ravir/masks/train' # noqa +) +os.system(r'cp data/ravir/RAVIR\ Dataset/test/* data/ravir/images/test') + +os.system(r'rm -rf data/ravir/RAVIR\ Dataset') + +imgs = glob.glob(os.path.join('data/ravir/masks/train', '*.png')) + +for im_path in tqdm(imgs): + im = Image.open(im_path) + imn = np.array(im) + imn[imn == 255] = 2 + imn[imn == 128] = 1 + imn[imn == 0] = 0 + new_im = Image.fromarray(imn) + new_im.save(im_path) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/README.md b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/README.md new file mode 100644 index 0000000..1feb433 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/README.md @@ -0,0 +1,153 @@ +# 2-PM Vessel Dataset + +## Description + +This project supports **`2-PM Vessel Dataset`**, which can be downloaded from [here](https://opendatalab.org.cn/2-PM_Vessel_Dataset). + +### Dataset Overview + +An open-source volumetric brain vasculature dataset obtained with two-photon microscopy at Focused Ultrasound Lab, at Sunnybrook Research Institute (affiliated with University of Toronto by Dr. Alison Burgess, Charissa Poon and Marc Santos). + +The dataset contains a total of 12 volumetric stacks consisting images of mouse brain vasculature and tumor vasculature. + +### Information Statistics + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------------------------ | ----------------- | ------------ | ----------------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------- | +| [2pm_vessel](https://opendatalab.org.cn/2-PM_Vessel_Dataset) | vessel | segmentation | microscopy_images | 2 | 216/-/- | yes/-/- | 2021 | [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 216 | 85.78 | - | - | - | - | +| vessel | 180 | 14.22 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![2pmv](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/histopathology/2pm_vessel/2pm_vessel_dataset.png?raw=true) + +### Dataset Citation + +``` +@article{teikari2016deep, + title={Deep learning convolutional networks for multiphoton microscopy vasculature segmentation}, + author={Teikari, Petteri and Santos, Marc and Poon, Charissa and Hynynen, Kullervo}, + journal={arXiv preprint arXiv:1606.02382}, + year={2016} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `2pm_vessel/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://opendatalab.org.cn/2-PM_Vessel_Dataset) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```shell +mkdir data & cd data +pip install opendatalab +odl get 2-PM_Vessel_Dataset +cd .. +python tools/prepare_dataset.py +python ../../tools/split_seg_dataset.py +``` + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ microscopy_images + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ 2pm_vessel + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 172 | 85.88 | 44 | 85.4 | - | - | +| vessel | 142 | 14.12 | 38 | 14.6 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/2pm-vessel_512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/2pm-vessel_512x512.py new file mode 100644 index 0000000..124403f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/2pm-vessel_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'TwoPMVesselDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_2pm-vessel-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_2pm-vessel-512x512.py new file mode 100644 index 0000000..2a429e9 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_2pm-vessel-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './2pm-vessel_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.2pm-vessel_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_2pm-vessel-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_2pm-vessel-512x512.py new file mode 100644 index 0000000..10d9bb8 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_2pm-vessel-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './2pm-vessel_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.2pm-vessel_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_2pm-vessel-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_2pm-vessel-512x512.py new file mode 100644 index 0000000..65c1579 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_2pm-vessel-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './2pm-vessel_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.2pm-vessel_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_bactteria-detection-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_bactteria-detection-512x512.py new file mode 100644 index 0000000..91ed6ad --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_bactteria-detection-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './2pm-vessel_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.2pm-vessel_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/datasets/2pm-vessel_dataset.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/datasets/2pm-vessel_dataset.py new file mode 100644 index 0000000..984b5a1 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/datasets/2pm-vessel_dataset.py @@ -0,0 +1,31 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class TwoPMVesselDataset(BaseSegDataset): + """TwoPMVesselDataset dataset. + + In segmentation map annotation for TwoPMVesselDataset, + 0 stands for background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'vessel')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/tools/prepare_dataset.py new file mode 100644 index 0000000..1b46af2 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/2pm_vessel/tools/prepare_dataset.py @@ -0,0 +1,46 @@ +import os + +import tifffile as tiff +from PIL import Image + +root_path = 'data/' + +image_dir = os.path.join(root_path, + '2-PM_Vessel_Dataset/raw/vesselNN_dataset/denoised') +label_dir = os.path.join(root_path, + '2-PM_Vessel_Dataset/raw/vesselNN_dataset/labels') +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) + + +def filter_suffix(src_dir, suffix): + suffix = '.' + suffix if '.' not in suffix else suffix + file_names = [_ for _ in os.listdir(src_dir) if _.endswith(suffix)] + file_paths = [os.path.join(src_dir, _) for _ in file_names] + return sorted(file_paths), sorted(file_names) + + +if __name__ == '__main__': + + image_path_list, _ = filter_suffix(image_dir, suffix='tif') + label_path_list, _ = filter_suffix(label_dir, suffix='.tif') + + for img_path, label_path in zip(image_path_list, label_path_list): + labels = tiff.imread(label_path) + images = tiff.imread(img_path) + assert labels.ndim == 3 + assert images.shape == labels.shape + name = img_path.split('/')[-1].replace('.tif', '') + # a single .tif file contains multiple slices + # as long as it is read by tifffile package. + for i in range(labels.shape[0]): + slice_name = name + '_' + str(i).rjust(3, '0') + '.png' + image = images[i] + label = labels[i] // 255 + + save_path_label = os.path.join(tgt_mask_train_dir, slice_name) + Image.fromarray(label).save(save_path_label) + save_path_image = os.path.join(tgt_img_train_dir, slice_name) + Image.fromarray(image).convert('RGB').save(save_path_image) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/README.md b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/README.md new file mode 100644 index 0000000..1cedda7 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/README.md @@ -0,0 +1,160 @@ +# Bactteria detection with darkfield microscopy + +## Description + +This project supports **`Bactteria detection with darkfield microscopy`**, which can be downloaded from [here](https://tianchi.aliyun.com/dataset/94411). + +### Dataset Overview + +Spirochaeta is a genus of bacteria classified within the phylum Spirochaetes. Included in this dataset are 366 darkfield microscopy images and manually annotated masks which can be used for classification and segmentation purposes. Detecting bacteria in blood could have a huge significance for research in both the medical and computer science field. + +It was gathered and annotated by students (hand-on experience) +It has more than just one targeted class (blood cell and bacteria were annotated) +It is highly imbalanced, so naive loss functions would work less properly + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| --------------------------------------------------------------- | ----------------- | ------------ | ---------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [Bactteria detection](https://tianchi.aliyun.com/dataset/94411) | bacteria | segmentation | microscopy | 3 | 366/-/- | yes/-/- | 2017 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :----------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 366 | 85.9 | - | - | - | - | +| erythrocytes | 345 | 13.03 | - | - | - | - | +| spirochaete | 288 | 1.07 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/microscopy_images/bactteria_detection/bactteria_detection_dataset.png) + +## Usage + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow (PIL) v9.3.0 +- scikit-learn (sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `bactteria_detection/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- Download dataset from [here](https://tianchi.aliyun.com/dataset/94411) and save it to the `data/` directory . +- Decompress data to path `data/`. This will create a new folder named `data/Bacteria_detection_with_darkfield_microscopy_datasets/`, which contains the original image data. +- run script `python tools/prepare_dataset.py` to format data and change folder structure as below. +- run script `python ../../tools/split_seg_dataset.py` to split dataset. For the Bacteria_detection dataset, as there is no test or validation dataset, we sample 20% samples from the whole dataset as the validation dataset and 80% samples for training data and make two filename lists `train.txt` and `val.txt`. As we set the random seed as the hard code, we eliminated the randomness, the dataset split actually can be reproducible. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ microscopy_images + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ bactteria_detection + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Bacteria_detection_with_darkfield_microscopy_datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :----------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 292 | 85.66 | 74 | 86.7 | - | - | +| erythrocytes | 274 | 13.25 | 71 | 12.29 | - | - | +| spirochaete | 231 | 1.09 | 57 | 1.01 | - | - | + +### Training commands + +Train models on a single server with one GPU. + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Results + +### Bactteria detection with darkfield microscopy + +***Note: The following experimental results are based on the data randomly partitioned according to the above method described in the dataset preparing section.*** + +| Method | Backbone | Crop Size | lr | mIoU | mDice | config | download | +| :-------------: | :------: | :-------: | :----: | :---: | :---: | :--------------------------------------------------------------------------------------: | :----------------------: | +| fcn_unet_s5-d16 | unet | 512x512 | 0.01 | 76.48 | 84.68 | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_bactteria-detection-512x512.py) | [model](<>) \| [log](<>) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.001 | 61.06 | 63.69 | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_bactteria-detection-512x512.py) | [model](<>) \| [log](<>) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.0001 | 58.87 | 62.42 | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_bactteria-detection-512x512.py) | [model](<>) \| [log](<>) | + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/bactteria-detection_512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/bactteria-detection_512x512.py new file mode 100644 index 0000000..e3eab4e --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/bactteria-detection_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'BactteriaDetectionDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_bactteria-detection-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_bactteria-detection-512x512.py new file mode 100644 index 0000000..ede58d7 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_bactteria-detection-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './bactteria-detection_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.bactteria-detection_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_bactteria-detection-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_bactteria-detection-512x512.py new file mode 100644 index 0000000..bde3fa1 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_bactteria-detection-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './bactteria-detection_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.bactteria-detection_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_bactteria-detection-512x512.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_bactteria-detection-512x512.py new file mode 100644 index 0000000..08e204f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_bactteria-detection-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './bactteria-detection_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.bactteria-detection_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=3), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/datasets/bactteria-detection_dataset.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/datasets/bactteria-detection_dataset.py new file mode 100644 index 0000000..c95097b --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/datasets/bactteria-detection_dataset.py @@ -0,0 +1,27 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class BactteriaDetectionDataset(BaseSegDataset): + """BactteriaDetectionDataset dataset. + + In segmentation map annotation for BactteriaDetectionDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict(classes=('background', 'erythrocytes', 'spirochaete')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py new file mode 100755 index 0000000..8dcc719 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py @@ -0,0 +1,33 @@ +import glob +import os +import shutil + +from PIL import Image + +root_path = 'data/' +img_suffix = '.png' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +x_train = glob.glob( + 'data/Bacteria_detection_with_darkfield_microscopy_datasets/images/*' + + img_suffix) # noqa + +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'masks/train/') + +part_dir_dict = {0: 'train/'} +for ith, part in enumerate([x_train]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + img_save_path = os.path.join(root_path, 'images', part_dir, + basename.split('.')[0] + save_img_suffix) + shutil.copy(img, img_save_path) + mask_path = 'data/Bacteria_detection_with_darkfield_microscopy_datasets/masks/' + basename # noqa + mask = Image.open(mask_path).convert('L') + mask_save_path = os.path.join( + root_path, 'masks', part_dir, + basename.split('.')[0] + save_seg_map_suffix) + mask.save(mask_save_path) diff --git a/mmsegmentation/projects/medical/2d_image/tools/split_seg_dataset.py b/mmsegmentation/projects/medical/2d_image/tools/split_seg_dataset.py new file mode 100644 index 0000000..9ab2e92 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/tools/split_seg_dataset.py @@ -0,0 +1,42 @@ +import argparse +import glob +import os + +from sklearn.model_selection import train_test_split + + +def save_anno(img_list, file_path, remove_suffix=True): + if remove_suffix: + img_list = [ + '/'.join(img_path.split('/')[-2:]) for img_path in img_list + ] + img_list = [ + '.'.join(img_path.split('.')[:-1]) for img_path in img_list + ] + with open(file_path, 'w') as file_: + for x in list(img_list): + file_.write(x + '\n') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--data_root', default='data/') + args = parser.parse_args() + data_root = args.data_root + if os.path.exists(os.path.join(data_root, 'masks/val')): + x_val = sorted(glob.glob(data_root + '/images/val/*.png')) + save_anno(x_val, data_root + '/val.txt') + if os.path.exists(os.path.join(data_root, 'masks/test')): + x_test = sorted(glob.glob(data_root + '/images/test/*.png')) + save_anno(x_test, data_root + '/test.txt') + if not os.path.exists(os.path.join( + data_root, 'masks/val')) and not os.path.exists( + os.path.join(data_root, 'masks/test')): + all_imgs = sorted(glob.glob(data_root + '/images/train/*.png')) + x_train, x_val = train_test_split( + all_imgs, test_size=0.2, random_state=0) + save_anno(x_train, data_root + '/train.txt') + save_anno(x_val, data_root + '/val.txt') + else: + x_train = sorted(glob.glob(data_root + '/images/train/*.png')) + save_anno(x_train, data_root + '/train.txt') diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/README.md b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/README.md new file mode 100644 index 0000000..a1cd27b --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/README.md @@ -0,0 +1,147 @@ +# Chest Image Dataset for Pneumothorax Segmentation + +## Description + +This project supports **`Chest Image Dataset for Pneumothorax Segmentation`**, which can be downloaded from [here](https://tianchi.aliyun.com/dataset/83075). + +### Dataset Overview + +Pneumothorax can be caused by a blunt chest injury, damage from underlying lung disease, or most horrifyingโ€”it may occur for no obvious reason at all. On some occasions, a collapsed lung can be a life-threatening event. +Pneumothorax is usually diagnosed by a radiologist on a chest x-ray, and can sometimes be very difficult to confirm. An accurate AI algorithm to detect pneumothorax would be useful in a lot of clinical scenarios. AI could be used to triage chest radiographs for priority interpretation, or to provide a more confident diagnosis for non-radiologists. + +The dataset is provided by the Society for Imaging Informatics in Medicine(SIIM), American College of Radiology (ACR),Society of Thoracic Radiology (STR) and MD.ai. You can develop a model to classify (and if present, segment) pneumothorax from a set of chest radiographic images. If successful, you could aid in the early recognition of pneumothoraces and save lives. + +### Original Statistic Information + +| Dataset name | Anatomical region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| --------------------------------------------------------------------- | ----------------- | ------------ | -------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------------ | +| [pneumothorax segmentation](https://tianchi.aliyun.com/dataset/83075) | thorax | segmentation | x_ray | 2 | 12089/-/3205 | yes/-/no | - | [CC-BY-SA-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :---------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| normal | 12089 | 99.75 | - | - | - | - | +| pneumothorax area | 2669 | 0.25 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![bac](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/x_ray/chest_image_pneum/chest_image_pneum_dataset.png) + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `chest_image_pneum/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://tianchi.aliyun.com/dataset/83075) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set can't be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ x_ray + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ chest_image_pneum + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :---------------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| normal | 9637 | 99.75 | 2410 | 99.74 | - | - | +| pneumothorax area | 2137 | 0.25 | 532 | 0.26 | - | - | + +### Training commands + +Train models on a single server with one GPU. + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +Test models on a single server with one GPU. + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Results + +### Bactteria detection with darkfield microscopy + +| Method | Backbone | Crop Size | lr | mIoU | mDice | config | download | +| :-------------: | :------: | :-------: | :----: | :--: | :---: | :------------------------------------------------------------------------------------: | :----------------------: | +| fcn_unet_s5-d16 | unet | 512x512 | 0.01 | - | - | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-image-pneum-512x512.py) | [model](<>) \| [log](<>) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.001 | - | - | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-image-pneum-512x512.py) | [model](<>) \| [log](<>) | +| fcn_unet_s5-d16 | unet | 512x512 | 0.0001 | - | - | [config](./configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-image-pneum-512x512.py) | [model](<>) \| [log](<>) | + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + + - [x] Basic docstrings & proper citation + + - [x] Test-time correctness + + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + + - [ ] Unit tests + + - [ ] Code polishing + + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/chest-image-pneum_512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/chest-image-pneum_512x512.py new file mode 100644 index 0000000..411229b --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/chest-image-pneum_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'ChestImagePneumDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-image-pneum-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-image-pneum-512x512.py new file mode 100644 index 0000000..0f26459 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-image-pneum-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './chest-image-pneum_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.chest-image-pneum_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-image-pneum-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-image-pneum-512x512.py new file mode 100644 index 0000000..37b9188 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-image-pneum-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './chest-image-pneum_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.chest-image-pneum_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-image-pneum-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-image-pneum-512x512.py new file mode 100644 index 0000000..379e818 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-image-pneum-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + './chest-image-pneum_512x512.py', + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.chest-image-pneum_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/datasets/chest-image-pneum_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/datasets/chest-image-pneum_dataset.py new file mode 100644 index 0000000..aeee60a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/datasets/chest-image-pneum_dataset.py @@ -0,0 +1,27 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class ChestImagePneumDataset(BaseSegDataset): + """ChestImagePneumDataset dataset. + + In segmentation map annotation for ChestImagePneumDataset, + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + """ + METAINFO = dict(classes=('normal', 'pneumothorax area')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=False, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py new file mode 100755 index 0000000..47eddc9 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py @@ -0,0 +1,73 @@ +import os + +import numpy as np +import pandas as pd +import pydicom +from PIL import Image + +root_path = 'data/' +img_suffix = '.dcm' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +x_train = [] +for fpath, dirname, fnames in os.walk('data/chestimage_train_datasets'): + for fname in fnames: + if fname.endswith('.dcm'): + x_train.append(os.path.join(fpath, fname)) +x_test = [] +for fpath, dirname, fnames in os.walk('data/chestimage_test_datasets/'): + for fname in fnames: + if fname.endswith('.dcm'): + x_test.append(os.path.join(fpath, fname)) + +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'images/test/') +os.system('mkdir -p ' + root_path + 'masks/train/') + + +def rle_decode(rle, width, height): + mask = np.zeros(width * height, dtype=np.uint8) + array = np.asarray([int(x) for x in rle.split()]) + starts = array[0::2] + lengths = array[1::2] + + current_position = 0 + for index, start in enumerate(starts): + current_position += start + mask[current_position:current_position + lengths[index]] = 1 + current_position += lengths[index] + + return mask.reshape(width, height, order='F') + + +part_dir_dict = {0: 'train/', 1: 'test/'} +dict_from_csv = pd.read_csv( + root_path + 'chestimage_train-rle_datasets.csv', sep=',', + index_col=0).to_dict()[' EncodedPixels'] + +for ith, part in enumerate([x_train, x_test]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + img_id = '.'.join(basename.split('.')[:-1]) + if ith == 0 and (img_id not in dict_from_csv.keys()): + continue + image = pydicom.read_file(img).pixel_array + save_img_path = root_path + 'images/' + part_dir + '.'.join( + basename.split('.')[:-1]) + save_img_suffix + print(save_img_path) + img_h, img_w = image.shape[:2] + image = Image.fromarray(image) + image.save(save_img_path) + if ith == 1: + continue + if dict_from_csv[img_id] == '-1': + mask = np.zeros((img_h, img_w), dtype=np.uint8) + else: + mask = rle_decode(dict_from_csv[img_id], img_h, img_w) + save_mask_path = root_path + 'masks/' + part_dir + '.'.join( + basename.split('.')[:-1]) + save_seg_map_suffix + mask = Image.fromarray(mask) + mask.save(save_mask_path) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/README.md b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/README.md new file mode 100644 index 0000000..7cb099c --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/README.md @@ -0,0 +1,119 @@ +# Chest X-ray Images with Pneumothorax Masks + +## Description + +This project support **`Chest X-ray Images with Pneumothorax Masks `**, and the dataset used in this project can be downloaded from [here](https://www.kaggle.com/datasets/vbookshelf/pneumothorax-chest-xray-images-and-masks). + +### Dataset Overview + +A pneumothorax (noo-moe-THOR-aks) is a collapsed lung. A pneumothorax occurs when air leaks into the space between your lung and chest wall. This air pushes on the outside of your lung and makes it collapse. Pneumothorax can be a complete lung collapse or a collapse of only a portion of the lung. + +A pneumothorax can be caused by a blunt or penetrating chest injury, certain medical procedures, or damage from underlying lung disease. Or it may occur for no obvious reason. Symptoms usually include sudden chest pain and shortness of breath. On some occasions, a collapsed lung can be a life-threatening event. + +Treatment for a pneumothorax usually involves inserting a needle or chest tube between the ribs to remove the excess air. However, a small pneumothorax may heal on its own. + +### Statistic Information + +| Dataset Name | Anatomical Region | Task type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release date | License | +| --------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | -------- | ------------ | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------- | +| [Chest-x-ray-images-with-pneumothorax-masks](https://www.kaggle.com/datasets/vbookshelf/pneumothorax-chest-xray-images-and-masks) | throax | segmentation | x_ray | 2 | 10675/-/1372 | yes/-/yes | 2020 | [CC-BY-NC 4.0](https://creativecommons.org/licenses/by-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :----------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 10675 | 99.7 | - | - | 1372 | 99.71 | +| pneumothroax | 2379 | 0.3 | - | - | 290 | 0.29 | + +### Visualization + +![chest_x_ray_images_with_pneumothorax_masks](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/x_ray/chest_x_ray_images_with_pneumothorax_masks/chest_x_ray_images_with_pneumothorax_masks_dataset.png?raw=true) + +### Prerequisites + +- Python 3.8 +- PyTorch 1.10.0 +- pillow(PIL) 9.3.0 +- scikit-learn(sklearn) 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of PYTHONPATH, which should point to the project's directory so that Python can locate the module files. In chest_x_ray_images_with_pneumothorax_masks/ root directory, run the following line to add the current directory to PYTHONPATH: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset preparing + +- download dataset from [here](https://www.kaggle.com/datasets/vbookshelf/pneumothorax-chest-xray-images-and-masks) and decompression data to path 'data/'. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ x_ray + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ chest_x_ray_images_with_pneumothorax_masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Training commands + +```shell +mim train mmseg ./configs/${CONFIG_PATH} +``` + +To train on multiple GPUs, e.g. 8 GPUs, run the following command: + +```shell +mim train mmseg ./configs/${CONFIG_PATH} --launcher pytorch --gpus 8 +``` + +### Testing commands + +```shell +mim test mmseg ./configs/${CONFIG_PATH} --checkpoint ${CHECKPOINT_PATH} +``` + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [x] Test-time correctness + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/chest-x-ray-images-with-pneumothorax-masks_512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/chest-x-ray-images-with-pneumothorax-masks_512x512.py new file mode 100644 index 0000000..96676de --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/chest-x-ray-images-with-pneumothorax-masks_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'ChestPenumoMaskDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py new file mode 100644 index 0000000..76c214d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py @@ -0,0 +1,20 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './chest-x-ray-images-with-pneumothorax-masks_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict( + imports='datasets.chest-x-ray-images-with-pneumothorax-masks_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py new file mode 100644 index 0000000..066996d --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './chest-x-ray-images-with-pneumothorax-masks_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict( + imports='datasets.chest-x-ray-images-with-pneumothorax-masks_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py new file mode 100644 index 0000000..a7065b8 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './chest-x-ray-images-with-pneumothorax-masks_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict( + imports='datasets.chest-x-ray-images-with-pneumothorax-masks_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py new file mode 100644 index 0000000..e5682ee --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_chest-x-ray-images-with-pneumothorax-masks-512x512.py @@ -0,0 +1,19 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', + './chest-x-ray-images-with-pneumothorax-masks_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict( + imports='datasets.chest-x-ray-images-with-pneumothorax-masks_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/datasets/chest-x-ray-images-with-pneumothorax-masks_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/datasets/chest-x-ray-images-with-pneumothorax-masks_dataset.py new file mode 100644 index 0000000..d32f597 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/datasets/chest-x-ray-images-with-pneumothorax-masks_dataset.py @@ -0,0 +1,31 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class ChestPenumoMaskDataset(BaseSegDataset): + """ChestPenumoMaskDataset dataset. + + In segmentation map annotation for ChestPenumoMaskDataset, + 0 stands for background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'penumothroax')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/tools/prepare_dataset.py new file mode 100644 index 0000000..c7de1f1 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/tools/prepare_dataset.py @@ -0,0 +1,36 @@ +import glob +import os +import shutil + +from PIL import Image +from sklearn.model_selection import train_test_split + +root_path = 'data/' +img_suffix = '.png' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +all_imgs = glob.glob('data/siim-acr-pneumothorax/png_images/*' + img_suffix) +x_train, x_test = train_test_split(all_imgs, test_size=0.2, random_state=0) + +print(len(x_train), len(x_test)) +os.system('mkdir -p ' + root_path + 'images/train/') +os.system('mkdir -p ' + root_path + 'images/val/') +os.system('mkdir -p ' + root_path + 'masks/train/') +os.system('mkdir -p ' + root_path + 'masks/val/') + +part_dir_dict = {0: 'train/', 1: 'val/'} +for ith, part in enumerate([x_train, x_test]): + part_dir = part_dir_dict[ith] + for img in part: + basename = os.path.basename(img) + img_save_path = os.path.join(root_path, 'images', part_dir, + basename.split('.')[0] + save_img_suffix) + shutil.copy(img, img_save_path) + mask_path = 'data/siim-acr-pneumothorax/png_masks/' + basename + mask = Image.open(mask_path).convert('L') + mask_save_path = os.path.join( + root_path, 'masks', part_dir, + basename.split('.')[0] + save_seg_map_suffix) + mask.save(mask_save_path) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/README.md b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/README.md new file mode 100644 index 0000000..8469219 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/README.md @@ -0,0 +1,158 @@ +# Covid-19 CT Chest X-ray Dataset + +## Description + +This project supports **`Covid-19 CT Chest X-ray Dataset`**, which can be downloaded from [here](https://github.com/ieee8023/covid-chestxray-dataset). + +### Dataset Overview + +In the context of a COVID-19 pandemic, we want to improve prognostic predictions to triage and manage patient care. Data is the first step to developing any diagnostic/prognostic tool. While there exist large public datasets of more typical chest X-rays from the NIH \[Wang 2017\], Spain \[Bustos 2019\], Stanford \[Irvin 2019\], MIT \[Johnson 2019\] and Indiana University \[Demner-Fushman 2016\], there is no collection of COVID-19 chest X-rays or CT scans designed to be used for computational analysis. + +The 2019 novel coronavirus (COVID-19) presents several unique features [Fang, 2020](https://pubs.rsna.org/doi/10.1148/radiol.2020200432) and [Ai 2020](https://pubs.rsna.org/doi/10.1148/radiol.2020200642). While the diagnosis is confirmed using polymerase chain reaction (PCR), infected patients with pneumonia may present on chest X-ray and computed tomography (CT) images with a pattern that is only moderately characteristic for the human eye [Ng, 2020](https://pubs.rsna.org/doi/10.1148/ryct.2020200034). In late January, a Chinese team published a paper detailing the clinical and paraclinical features of COVID-19. They reported that patients present abnormalities in chest CT images with most having bilateral involvement [Huang 2020](). Bilateral multiple lobular and subsegmental areas of consolidation constitute the typical findings in chest CT images of intensive care unit (ICU) patients on admission [Huang 2020](). In comparison, non-ICU patients show bilateral ground-glass opacity and subsegmental areas of consolidation in their chest CT images [Huang 2020](). In these patients, later chest CT images display bilateral ground-glass opacity with resolved consolidation [Huang 2020](). + +### Statistic Information + +| Dataset Name | Anatomical Region | Task Type | Modality | Nnum. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release date | License | +| ---------------------------------------------------------------------- | ----------------- | ------------ | -------- | ------------- | --------------------- | ---------------------- | ------------ | --------------------------------------------------------------------- | +| [Covid-19-ct-cxr](https://github.com/ieee8023/covid-chestxray-dataset) | thorax | segmentation | x_ray | 2 | 205/-/714 | yes/-/no | 2021 | [CC-BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 205 | 72.84 | - | - | - | - | +| lung | 205 | 27.16 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![cov19ctcxr](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/x_ray/covid_19_ct_cxr/covid_19_ct_cxr_dataset.png?raw=true) + +### Dataset Citation + +``` +@article{cohen2020covidProspective, + title={{COVID-19} Image Data Collection: Prospective Predictions Are the Future}, + author={Joseph Paul Cohen and Paul Morrison and Lan Dao and Karsten Roth and Tim Q Duong and Marzyeh Ghassemi}, + journal={arXiv 2006.11988}, + year={2020} +} + +@article{cohen2020covid, + title={COVID-19 image data collection}, + author={Joseph Paul Cohen and Paul Morrison and Lan Dao}, + journal={arXiv 2003.11597}, + year={2020} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 9.3.0 +- scikit-learn(sklearn) v1.2.0 1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `covid_19_ct_cxr/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://github.com/ieee8023/covid-chestxray-dataset) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```shell +mkdir data && cd data +git clone git@github.com:ieee8023/covid-chestxray-dataset.git +cd .. +python tools/prepare_dataset.py +python ../../tools/split_seg_dataset.py +``` + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ x_ray + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ covid_19_ct_cxr + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 164 | 72.88 | 41 | 72.69 | - | - | +| lung | 164 | 27.12 | 41 | 27.31 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [x] Test-time correctness + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/covid-19-ct-cxr_512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/covid-19-ct-cxr_512x512.py new file mode 100644 index 0000000..5242d06 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/covid-19-ct-cxr_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'Covid19CXRDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='val.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py new file mode 100644 index 0000000..59a7bed --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './covid-19-ct-cxr_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.covid-19-ct-cxr_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_covid-19-ct-cxr-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_covid-19-ct-cxr-512x512.py new file mode 100644 index 0000000..83b8527 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_covid-19-ct-cxr-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './covid-19-ct-cxr_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.covid-19-ct-cxr_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_covid-19-ct-cxr-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_covid-19-ct-cxr-512x512.py new file mode 100644 index 0000000..10cfcbd --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_covid-19-ct-cxr-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './covid-19-ct-cxr_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.covid-19-ct-cxr_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py new file mode 100644 index 0000000..aaccc8f --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_covid-19-ct-cxr-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './covid-19-ct-cxr_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.covid-19-ct-cxr_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/datasets/covid-19-ct-cxr_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/datasets/covid-19-ct-cxr_dataset.py new file mode 100644 index 0000000..68a1bb3 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/datasets/covid-19-ct-cxr_dataset.py @@ -0,0 +1,31 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class Covid19CXRDataset(BaseSegDataset): + """Covid19CXRDataset dataset. + + In segmentation map annotation for Covid19CXRDataset, + 0 stands for background, which is included in 2 categories. + ``reduce_zero_label`` is fixed to False. The ``img_suffix`` + is fixed to '.png' and ``seg_map_suffix`` is fixed to '.png'. + + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False. + """ + METAINFO = dict(classes=('background', 'lung')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/tools/prepare_dataset.py new file mode 100644 index 0000000..72f6435 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/covid_19_ct_cxr/tools/prepare_dataset.py @@ -0,0 +1,52 @@ +import os + +import numpy as np +from PIL import Image + +root_path = 'data/' +src_img_dir = os.path.join(root_path, 'covid-chestxray-dataset', 'images') +src_mask_dir = os.path.join(root_path, 'covid-chestxray-dataset', + 'annotations/lungVAE-masks') +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +tgt_img_test_dir = os.path.join(root_path, 'images/test/') +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) +os.system('mkdir -p ' + tgt_img_test_dir) + + +def convert_label(img, convert_dict): + arr = np.zeros_like(img, dtype=np.uint8) + for c, i in convert_dict.items(): + arr[img == c] = i + return arr + + +if __name__ == '__main__': + + all_img_names = os.listdir(src_img_dir) + all_mask_names = os.listdir(src_mask_dir) + + for img_name in all_img_names: + base_name = img_name.replace('.png', '') + base_name = base_name.replace('.jpg', '') + base_name = base_name.replace('.jpeg', '') + mask_name_orig = base_name + '_mask.png' + if mask_name_orig in all_mask_names: + mask_name = base_name + '.png' + src_img_path = os.path.join(src_img_dir, img_name) + src_mask_path = os.path.join(src_mask_dir, mask_name_orig) + tgt_img_path = os.path.join(tgt_img_train_dir, img_name) + tgt_mask_path = os.path.join(tgt_mask_train_dir, mask_name) + + img = Image.open(src_img_path).convert('RGB') + img.save(tgt_img_path) + mask = np.array(Image.open(src_mask_path)) + mask = convert_label(mask, {0: 0, 255: 1}) + mask = Image.fromarray(mask) + mask.save(tgt_mask_path) + else: + src_img_path = os.path.join(src_img_dir, img_name) + tgt_img_path = os.path.join(tgt_img_test_dir, img_name) + img = Image.open(src_img_path).convert('RGB') + img.save(tgt_img_path) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/README.md b/mmsegmentation/projects/medical/2d_image/x_ray/crass/README.md new file mode 100644 index 0000000..0621205 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/README.md @@ -0,0 +1,144 @@ +# Chest Radiograph Anatomical Structure Segmentation (CRASS) + +## Description + +This project supports **`Chest Radiograph Anatomical Structure Segmentation (CRASS) `**, which can be downloaded from [here](https://crass.grand-challenge.org/). + +### Dataset Overview + +A set of consecutively obtained posterior-anterior chest radiograph were selected from a database containing images acquired at two sites in sub Saharan Africa with a high tuberculosis incidence. All subjects were 15 years or older. Images from digital chest radiography units were used (Delft Imaging Systems, The Netherlands) of varying resolutions, with a typical resolution of 1800--2000 pixels, the pixel size was 250 lm isotropic. From the total set of images, 225 were considered to be normal by an expert radiologist, while 333 of the images contained abnormalities. Of the abnormal images, 220 contained abnormalities in the upper area of the lung where the clavicle is located. The data was divided into a training and a test set. The training set consisted of 299 images, the test set of 249 images. +The current data is still incomplete and to be added later. + +### Information Statistics + +| Dataset Name | Anatomical Region | Task Type | Modality | Num. Classes | Train/Val/Test Images | Train/Val/Test Labeled | Release Date | License | +| ------------------------------------------- | ----------------- | ------------ | -------- | ------------ | --------------------- | ---------------------- | ------------ | ------------------------------------------------------------- | +| [crass](https://crass.grand-challenge.org/) | pulmonary | segmentation | x_ray | 2 | 299/-/234 | yes/-/no | 2021 | [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/) | + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 299 | 98.38 | - | - | - | - | +| clavicles | 299 | 1.62 | - | - | - | - | + +Note: + +- `Pct` means percentage of pixels in this category in all pixels. + +### Visualization + +![crass](https://raw.githubusercontent.com/uni-medical/medical-datasets-visualization/main/2d/semantic_seg/x_ray/crass/crass_dataset.png?raw=true) + +### Dataset Citation + +``` +@article{HOGEWEG20121490, + title={Clavicle segmentation in chest radiographs}, + journal={Medical Image Analysis}, + volume={16}, + number={8}, + pages={1490-1502}, + year={2012} +} +``` + +### Prerequisites + +- Python v3.8 +- PyTorch v1.10.0 +- pillow(PIL) v9.3.0 +- scikit-learn(sklearn) v1.2.0 +- [MIM](https://github.com/open-mmlab/mim) v0.3.4 +- [MMCV](https://github.com/open-mmlab/mmcv) v2.0.0rc4 +- [MMEngine](https://github.com/open-mmlab/mmengine) v0.2.0 or higher +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 + +All the commands below rely on the correct configuration of `PYTHONPATH`, which should point to the project's directory so that Python can locate the module files. In `crass/` root directory, run the following line to add the current directory to `PYTHONPATH`: + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Dataset Preparing + +- download dataset from [here](https://crass.grand-challenge.org/) and decompress data to path `'data/'`. +- run script `"python tools/prepare_dataset.py"` to format data and change folder structure as below. +- run script `"python ../../tools/split_seg_dataset.py"` to split dataset and generate `train.txt`, `val.txt` and `test.txt`. If the label of official validation set and test set cannot be obtained, we generate `train.txt` and `val.txt` from the training set randomly. + +```none + mmsegmentation + โ”œโ”€โ”€ mmseg + โ”œโ”€โ”€ projects + โ”‚ โ”œโ”€โ”€ medical + โ”‚ โ”‚ โ”œโ”€โ”€ 2d_image + โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ x_ray + โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ crass + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ configs + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ datasets + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ data + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ val.txt + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ images + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ masks + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ train + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ xxx.png + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ... + โ”‚ โ”‚ โ”‚ โ”‚ | โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ xxx.png +``` + +### Divided Dataset Information + +***Note: The table information below is divided by ourselves.*** + +| Class Name | Num. Train | Pct. Train | Num. Val | Pct. Val | Num. Test | Pct. Test | +| :--------: | :--------: | :--------: | :------: | :------: | :-------: | :-------: | +| background | 227 | 98.38 | 57 | 98.39 | - | - | +| clavicles | 227 | 1.62 | 57 | 1.61 | - | - | + +### Training commands + +To train models on a single server with one GPU. (default) + +```shell +mim train mmseg ./configs/${CONFIG_FILE} +``` + +### Testing commands + +To test models on a single server with one GPU. (default) + +```shell +mim test mmseg ./configs/${CONFIG_FILE} --checkpoint ${CHECKPOINT_PATH} +``` + + + +## Checklist + +- [x] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [x] Finish the code + - [x] Basic docstrings & proper citation + - [ ] Test-time correctness + - [x] A full README + +- [x] Milestone 2: Indicates a successful model implementation. + + - [x] Training-time correctness + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Type hints and docstrings + - [ ] Unit tests + - [ ] Code polishing + - [ ] Metafile.yml + +- [ ] Move your modules into the core package following the codebase's file hierarchy structure. + +- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/crass_512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/crass_512x512.py new file mode 100644 index 0000000..1425f50 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/crass_512x512.py @@ -0,0 +1,42 @@ +dataset_type = 'CRASSDataset' +data_root = 'data/' +img_scale = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=img_scale, keep_ratio=False), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +train_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='train.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='tval.txt', + data_prefix=dict(img_path='images/', seg_map_path='masks/'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) +test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mDice']) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_crass-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_crass-512x512.py new file mode 100644 index 0000000..b52bc78 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_crass-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './crass_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.crass_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.0001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_crass-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_crass-512x512.py new file mode 100644 index 0000000..45242c6 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_crass-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './crass_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.crass_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.001) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_crass-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_crass-512x512.py new file mode 100644 index 0000000..bcf9d0a --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_crass-512x512.py @@ -0,0 +1,17 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './crass_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.crass_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=2), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-lr0.01-sigmoid-20k_crass-512x512.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-lr0.01-sigmoid-20k_crass-512x512.py new file mode 100644 index 0000000..0dde736 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-lr0.01-sigmoid-20k_crass-512x512.py @@ -0,0 +1,18 @@ +_base_ = [ + 'mmseg::_base_/models/fcn_unet_s5-d16.py', './crass_512x512.py', + 'mmseg::_base_/default_runtime.py', + 'mmseg::_base_/schedules/schedule_20k.py' +] +custom_imports = dict(imports='datasets.crass_dataset') +img_scale = (512, 512) +data_preprocessor = dict(size=img_scale) +optimizer = dict(lr=0.01) +optim_wrapper = dict(optimizer=optimizer) +model = dict( + data_preprocessor=data_preprocessor, + decode_head=dict( + num_classes=2, loss_decode=dict(use_sigmoid=True), out_channels=1), + auxiliary_head=None, + test_cfg=dict(mode='whole', _delete_=True)) +vis_backends = None +visualizer = dict(vis_backends=vis_backends) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/datasets/crass_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/datasets/crass_dataset.py new file mode 100644 index 0000000..f6b5c52 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/datasets/crass_dataset.py @@ -0,0 +1,30 @@ +from mmseg.datasets import BaseSegDataset +from mmseg.registry import DATASETS + + +@DATASETS.register_module() +class CRASSDataset(BaseSegDataset): + """CRASSDataset dataset. + + In segmentation map annotation for CRASSDataset, 0 stands for background, + which is included in 2 categories. ``reduce_zero_label`` is fixed to + False. The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is + fixed to '.png'. + Args: + img_suffix (str): Suffix of images. Default: '.png' + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default to False.. + """ + METAINFO = dict(classes=('background', 'clavicles')) + + def __init__(self, + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, + seg_map_suffix=seg_map_suffix, + reduce_zero_label=reduce_zero_label, + **kwargs) diff --git a/mmsegmentation/projects/medical/2d_image/x_ray/crass/tools/prepare_dataset.py b/mmsegmentation/projects/medical/2d_image/x_ray/crass/tools/prepare_dataset.py new file mode 100644 index 0000000..bbd5d88 --- /dev/null +++ b/mmsegmentation/projects/medical/2d_image/x_ray/crass/tools/prepare_dataset.py @@ -0,0 +1,84 @@ +import glob +import os + +import cv2 +import SimpleITK as sitk +from PIL import Image + +root_path = 'data/' +img_suffix = '.tif' +seg_map_suffix = '.png' +save_img_suffix = '.png' +save_seg_map_suffix = '.png' + +src_img_train_dir = os.path.join(root_path, 'CRASS/data_train') +src_mask_train_dir = os.path.join(root_path, 'CRASS/mask_mhd') +src_img_test_dir = os.path.join(root_path, 'CRASS/data_test') + +tgt_img_train_dir = os.path.join(root_path, 'images/train/') +tgt_mask_train_dir = os.path.join(root_path, 'masks/train/') +tgt_img_test_dir = os.path.join(root_path, 'images/test/') +os.system('mkdir -p ' + tgt_img_train_dir) +os.system('mkdir -p ' + tgt_mask_train_dir) +os.system('mkdir -p ' + tgt_img_test_dir) + + +def filter_suffix_recursive(src_dir, suffix): + suffix = '.' + suffix if '.' not in suffix else suffix + file_paths = glob( + os.path.join(src_dir, '**', '*' + suffix), recursive=True) + file_names = [_.split('/')[-1] for _ in file_paths] + return sorted(file_paths), sorted(file_names) + + +def read_single_array_from_med(path): + return sitk.GetArrayFromImage(sitk.ReadImage(path)).squeeze() + + +def convert_meds_into_pngs(src_dir, + tgt_dir, + suffix='.dcm', + norm_min=0, + norm_max=255, + convert='RGB'): + if not os.path.exists(tgt_dir): + os.makedirs(tgt_dir) + + src_paths, src_names = filter_suffix_recursive(src_dir, suffix=suffix) + num = len(src_paths) + for i, (src_name, src_path) in enumerate(zip(src_names, src_paths)): + tgt_name = src_name.replace(suffix, '.png') + tgt_path = os.path.join(tgt_dir, tgt_name) + + img = read_single_array_from_med(src_path) + if norm_min is not None and norm_max is not None: + img = cv2.normalize(img, None, norm_min, norm_max, cv2.NORM_MINMAX, + cv2.CV_8U) + pil = Image.fromarray(img).convert(convert) + pil.save(tgt_path) + print(f'processed {i+1}/{num}.') + + +convert_meds_into_pngs( + src_img_train_dir, + tgt_img_train_dir, + suffix='.mhd', + norm_min=0, + norm_max=255, + convert='RGB') + +convert_meds_into_pngs( + src_img_test_dir, + tgt_img_test_dir, + suffix='.mhd', + norm_min=0, + norm_max=255, + convert='RGB') + +convert_meds_into_pngs( + src_mask_train_dir, + tgt_mask_train_dir, + suffix='.mhd', + norm_min=0, + norm_max=1, + convert='L') diff --git a/mmsegmentation/projects/nvidia_jetson/README.md b/mmsegmentation/projects/nvidia_jetson/README.md new file mode 100644 index 0000000..6cebd9c --- /dev/null +++ b/mmsegmentation/projects/nvidia_jetson/README.md @@ -0,0 +1,372 @@ +# ๅฐ† MMSeg ๆจกๅž‹่ฐƒไผ˜ๅŠ้ƒจ็ฝฒๅˆฐ NVIDIA Jetson ๅนณๅฐๆ•™็จ‹ + +- ่ฏทๅ…ˆๆŸฅ้˜…[MMSegmentation ๆจกๅž‹้ƒจ็ฝฒ](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/5_deployment.md)ๆ–‡ๆกฃใ€‚ +- **ๆœฌๆ•™็จ‹ๆ‰€็”จ mmsegmentation ็‰ˆๆœฌ๏ผš v1.1.2** +- **ๆœฌๆ•™็จ‹ๆ‰€็”จ NVIDIA Jetson ่ฎพๅค‡๏ผš NVIDIA Jetson AGX Orin 64G** + +
+ Smiley face +
+ +## 1 ้…็ฝฎ [mmsegmentation](https://github.com/open-mmlab/mmsegmentation) + +- ๆ นๆฎ[ๅฎ‰่ฃ…ๅ’Œ้ชŒ่ฏ](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/get_started.md)ๆ–‡ๆกฃ๏ผŒๅฎŒๆˆๅผ€ๅ‘ [mmsegmentation](https://github.com/open-mmlab/mmsegmentation) ๆ‰€้œ€็š„ [`pytorch`](https://pytorch.org/get-started/locally/)ใ€[`mmcv`](https://github.com/open-mmlab/mmcv)ใ€[`mmengine`](https://github.com/open-mmlab/mmengine) ็ญ‰็Žฏๅขƒไพ่ต–ๅฎ‰่ฃ…ใ€‚ +- ไปŽ GitHub ไฝฟ็”จ git clone ๅ‘ฝไปคๅฎŒๆˆ [mmsegmentation](https://github.com/open-mmlab/mmsegmentation) ไธ‹่ฝฝใ€‚็ฝ‘็ปœไธๅฅฝ็š„ๅŒๅญฆ๏ผŒๅฏ้€š่ฟ‡ [MMSeg GitHub](https://github.com/open-mmlab/mmsegmentation) ้กต้ข่ฟ›่กŒ zip ็š„ไธ‹่ฝฝใ€‚ + ```bash + git clone https://github.com/open-mmlab/mmsegmentation.git + ``` +- ไฝฟ็”จ `pip install -v -e.` ๅ‘ฝไปคๅŠจๆ€ๅฎ‰่ฃ… mmsegmentation ใ€‚ + ```bash + cd mmsegmentation + pip install -v -e . + ``` + ๆ็คบๆˆๅŠŸๅฎ‰่ฃ…ๅŽ๏ผŒๅฏ้€š่ฟ‡ `pip list` ๅ‘ฝไปคๆŸฅ็œ‹ๅˆฐ mmsegmentation ๅทฒ้€š่ฟ‡ๆœฌๅœฐๅฎ‰่ฃ…ๆ–นๅผๅฎ‰่ฃ…ๅˆฐไบ†ๆ‚จ็š„็Žฏๅขƒไธญใ€‚ + ![mmseg-install](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/a9c7bcc9-cdcc-40a4-bd7b-8153195549c8) + +## 2 ๅ‡†ๅค‡ๆ‚จ็š„ๆ•ฐๆฎ้›† + +- ๆœฌๆ•™็จ‹ไฝฟ็”จ้ฅๆ„Ÿๅ›พๅƒ่ฏญไน‰ๅˆ†ๅ‰ฒๆ•ฐๆฎ้›† [potsdam](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/2_dataset_prepare.md#isprs-potsdam) ไฝœไธบ็คบไพ‹ใ€‚ +- ๆ นๆฎ [potsdam ๆ•ฐๆฎๅ‡†ๅค‡](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/2_dataset_prepare.md#isprs-potsdam)ๆ–‡ๆกฃ๏ผŒ่ฟ›่กŒๆ•ฐๆฎ้›†ไธ‹่ฝฝๅŠ MMSeg ๆ ผๅผ็š„ๅ‡†ๅค‡ใ€‚ +- ๆ•ฐๆฎ้›†ไป‹็ป๏ผš potsdam ๆ•ฐๆฎ้›†ๆ˜ฏไปฅๅพทๅ›ฝไธ€ไธชๅ…ธๅž‹็š„ๅŽ†ๅฒๅŸŽๅธ‚ Potsdam ๅ‘ฝๅ็š„๏ผŒ่ฏฅๅŸŽๅธ‚ๆœ‰็€ๅคงๅปบ็ญ‘็พคใ€็‹ญ็ช„็š„่ก—้“ๅ’Œๅฏ†้›†็š„ๅปบ็ญ‘็ป“ๆž„ใ€‚ potsdam ๆ•ฐๆฎ้›†ๅŒ…ๅซ 38 ๅน… 6000x6000 ๅƒ็ด ็š„ๅ›พๅƒ๏ผŒ็ฉบ้—ดๅˆ†่พจ็Ž‡ไธบ 5cm๏ผŒๆ•ฐๆฎ้›†็š„็คบไพ‹ๅฆ‚ไธ‹ๅ›พ๏ผš + ![potsdam-img](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/3bc0a75b-1693-4ae6-aeea-ad502e955068) + +## 3 ไปŽ config ้กต้ขไธ‹่ฝฝๆจกๅž‹็š„ pth ๆƒ้‡ๆ–‡ไปถ + +่ฟ™้‡Œไปฅ [`deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py`](../../configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py) ้…็ฝฎๆ–‡ไปถไธพไพ‹๏ผŒๅœจ [configs](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3plus#potsdam) ้กต้ขไธ‹่ฝฝๆƒ้‡ๆ–‡ไปถ๏ผŒ +![pth](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/8f747362-caf4-406c-808d-4ca72babb209) + +## 4 ้€š่ฟ‡ [OpenMMLab deployee](https://platform.openmmlab.com/deploee) ไปฅไบคไบ’ๅผๆ–นๅผ่ฟ›่กŒๆจกๅž‹่ฝฌๆขๅŠๆต‹้€Ÿ + +### 4.1 ๆจกๅž‹่ฝฌๆข + +ๅœจ่ฏฅ้ƒจๅˆ†ไธญ๏ผŒ[OpenMMLab ๅฎ˜็ฝ‘](https://platform.openmmlab.com/deploee)ๆไพ›ไบ†ๆจกๅž‹่ฝฌๆขๅŠๆจกๅž‹ๆต‹้€Ÿ็š„ไบคไบ’็•Œ้ข๏ผŒๆ— ้œ€ไปปไฝ•ไปฃ็ ๏ผŒๅณๅฏ้€š่ฟ‡้€‰ๆ‹ฉๅฏนๅบ”้€‰้กนๅฎŒๆˆๆจกๅž‹ ONNX ๆ ผๅผ`xxxx.onnx` ๅ’Œ TensorRT `.engine`ๆ ผๅผ็š„่ฝฌๆขใ€‚ +ๅฆ‚ๆ‚จ็š„่‡ชๅฎšไน‰ config ๆ–‡ไปถไธญๆœ‰็›ธๅฏนๅผ•็”จๅ…ณ็ณป๏ผŒๅฆ‚๏ผš + +```python +# xxxx.py +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/potsdam.py', + '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +``` + +ๆ‚จๅฏไปฅไฝฟ็”จไปฅไธ‹ไปฃ็ ๆถˆ้™ค็›ธๅฏนๅผ•็”จๅ…ณ็ณป๏ผŒไปฅ็”ŸๆˆๅฎŒๆ•ด็š„ config ๆ–‡ไปถใ€‚ + +```python +import mmengine + +mmengine.Config.fromfile("configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py").dump("My_config.py") +``` + +ไฝฟ็”จไธŠ่ฟฐไปฃ็ ๅŽ๏ผŒๆ‚จ่ƒฝๅคŸ็œ‹ๅˆฐ๏ผŒๅœจ`My_config.py`ๅŒ…ๅซ็€ๅฎŒๆ•ด็š„้…็ฝฎๆ–‡ไปถ๏ผŒๆ— ็›ธๅฏนๅผ•็”จใ€‚่ฟ™ๆ—ถ๏ผŒไธŠไผ ๆจกๅž‹ config ่‡ณ็ฝ‘้กตๅ†…ๅฏนๅบ”ๅค„ใ€‚ + +#### ๅˆ›ๅปบ่ฝฌๆขไปปๅŠก + +ๆŒ‰็…งไธ‹ๅ›พๆ็คบๅŠ่‡ชๅทฑ็š„้œ€ๆฑ‚๏ผŒๅˆ›ๅปบ่ฝฌๆขไปปๅŠกๅนถๆไบคใ€‚ + +
+ NVIDIA-Jetson +
+ +### 4.2 ๆจกๅž‹ๆต‹้€Ÿ + +ๅœจๅฎŒๆˆๆจกๅž‹่ฝฌๆขๅŽๅฏ้€š่ฟ‡**ๆจกๅž‹ๆต‹้€Ÿ**็•Œ้ข๏ผŒๅฎŒๆˆๅœจ็œŸๅฎž่ฎพๅค‡ไธŠ็š„ๆจกๅž‹ๆต‹้€Ÿใ€‚ + +#### ๅˆ›ๅปบๆต‹้€ŸไปปๅŠก + +
+ NVIDIA-Jetson +
+ +
+ NVIDIA-Jetson +
+ +ๆต‹้€ŸๅฎŒๆˆๅŽ๏ผŒๅฏๅœจ้กต้ข็”ŸๆˆๅฎŒๆ•ด็š„ๆต‹้€ŸๆŠฅๅ‘Šใ€‚[ๆŸฅ็œ‹ๆต‹้€ŸๆŠฅๅ‘Š็คบไพ‹](https://openmmlab-deploee.oss-cn-shanghai.aliyuncs.com/tmp/profile_speed/4352f5.txt) + +## 5 ้€š่ฟ‡ OpenMMLab mmdeploy ไปฅๅ‘ฝไปค่กŒๅฐ†ๆจกๅž‹่ฝฌๆขไธบONNXๆ ผๅผ + +่ฏฅ้ƒจๅˆ†ๅฏไปฅ้€š่ฟ‡ mmdeploy ๅบ“ๅฏน mmseg ่ฎญ็ปƒๅฅฝ็š„ๆจกๅž‹่ฟ›่กŒๆŽจ็†ๆ ผๅผ็š„่ฝฌๆขใ€‚่ฟ™้‡Œ็ป™ๅ‡บไธ€ไธช็คบไพ‹๏ผŒๅ…ทไฝ“ๆ–‡ๆกฃๅฏ่ง[ mmdeploy ๆจกๅž‹่ฝฌๆขๆ–‡ๆกฃ](../../docs/zh_cn/user_guides/5_deployment.md)ใ€‚ + +### 5.1 ้€š่ฟ‡ๆบ็ ๆž„ๅปบ mmdeploy ๅบ“ + +ๅœจๆ‚จๅฎ‰่ฃ… mmsegmentation ๅบ“็š„่™šๆ‹Ÿ็Žฏๅขƒไธ‹๏ผŒ้€š่ฟ‡ `git clone`ๅ‘ฝไปคไปŽ GitHub ๅ…‹้š† [mmdeploy](https://github.com/open-mmlab/mmdeploy) + +### 5.2 ๆจกๅž‹่ฝฌๆข + +ๅฆ‚ๆ‚จ็š„ config ไธญๅซๆœ‰็›ธๅฏนๅผ•็”จ๏ผŒไป้œ€่ฟ›่กŒๆถˆ้™ค๏ผŒๅฆ‚[4.1 ๆจกๅž‹่ฝฌๆข](#4.1-ๆจกๅž‹่ฝฌๆข)ๆ‰€่ฟฐ, +่ฟ›ๅ…ฅ mmdeploy ๆ–‡ไปถๅคน๏ผŒๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปค๏ผŒๅณๅฏๅฎŒๆˆๆจกๅž‹่ฝฌๆขใ€‚ + +```bash +python tools/deploy.py \ + configs/mmseg/segmentation_onnxruntime_static-512x512.py \ + ../atl_config.py \ + ../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \ + ../2_13_1024_5488_1536_6000.png \ + --work-dir ../atl_models \ + --device cpu \ + --show \ + --dump-info +``` + +```bash +# ไฝฟ็”จๆ–นๆณ• +python ./tools/deploy.py \ + ${้ƒจ็ฝฒ้…็ฝฎๆ–‡ไปถ่ทฏๅพ„} \ + ${ๆจกๅž‹้…็ฝฎๆ–‡ไปถ่ทฏๅพ„} \ + ${ๆจกๅž‹ๆƒ้‡่ทฏๅพ„} \ + ${่พ“ๅ…ฅๅ›พๅƒ่ทฏๅพ„} \ + --work-dir ${็”จๆฅไฟๅญ˜ๆ—ฅๅฟ—ๅ’Œๆจกๅž‹ๆ–‡ไปถ่ทฏๅพ„} \ + --device ${cpu/cuda:0} \ + --show \ # ๆ˜ฏๅฆๆ˜พ็คบๆฃ€ๆต‹็š„็ป“ๆžœ + --dump-info # ๆ˜ฏๅฆ่พ“ๅ‡บ SDK ไฟกๆฏ + +``` + +ๆ‰ง่กŒๆˆๅŠŸๅŽ๏ผŒๆ‚จๅฐ†่ƒฝๅคŸ็œ‹ๅˆฐไปฅไธ‹ๆ็คบ๏ผŒๅณไธบ่ฝฌๆขๆˆๅŠŸใ€‚ + +```bash +10/08 17:40:44 - mmengine - INFO - visualize pytorch model success. +10/08 17:40:44 - mmengine - INFO - All process success. +``` + +
+ NVIDIA-Jetson +
+ +# 6 ๅœจ Jetson ๅนณๅฐ่ฟ›่กŒ่ฝฌๆขๅŠ้ƒจ็ฝฒ + +## 6.1 ็Žฏๅขƒๅ‡†ๅค‡ + +ๅ‚่€ƒ[ๅฆ‚ไฝ•ๅœจ Jetson ๆจก็ป„ไธŠๅฎ‰่ฃ… MMDeploy](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/jetsons.md)ๆ–‡ๆกฃ๏ผŒๅฎŒๆˆๅœจ Jetson ไธŠ็š„็Žฏๅขƒๅ‡†ๅค‡ๅทฅไฝœใ€‚ +**ๆณจ**๏ผšๅฎ‰่ฃ… Pytorch๏ผŒๅฏๆŸฅ้˜… [NVIDIA Jetson Pytorch ๅฎ‰่ฃ…ๆ–‡ๆกฃ](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/jetsons.md)ๅฎ‰่ฃ…ๆœ€ๆ–ฐ็š„ Pytorchใ€‚ + +### 6.1.1 ๅˆ›ๅปบ่™šๆ‹Ÿ็Žฏๅขƒ + +```bash +conda create -n {ๆ‚จ่™šๆ‹Ÿ็Žฏๅขƒ็š„ๅๅญ—} python={python็‰ˆๆœฌ} +``` + +### 6.1.2 ่™šๆ‹Ÿ็Žฏๅขƒๅ†…ๅฎ‰่ฃ…Pytorch + +ๆณจๆ„๏ผš่ฟ™้‡Œไธ่ฆๅฎ‰่ฃ…ๆœ€ๆ–ฐ็š„ pytorch 2.0๏ผŒๅ› ไธบ pyTorch 1.11 ๆ˜ฏๆœ€ๅŽไธ€ไธชไฝฟ็”จ USE_DISTRIBUTED ๆž„ๅปบ็š„wheel๏ผŒๅฆๅˆ™ไผšๅœจ็”จmmdeploy่ฟ›่กŒๆจกๅž‹่ฝฌๆข็š„ๆ—ถๅ€™ๆ็คบ`AttributeError: module 'torch.distributed' has no attribute 'ReduceOp'`็š„้”™่ฏฏใ€‚ๅ‚่€ƒไปฅไธ‹้“พๆŽฅ๏ผšhttps://forums.developer.nvidia.com/t/module-torch-distributed-has-no-attribute-reduceop/256581/6 +ไธ‹่ฝฝ`torch-1.11.0-cp38-cp38-linux_aarch64.whl`ๅนถๅฎ‰่ฃ… + +```bash +pip install torch-1.11.0-cp38-cp38-linux_aarch64.whl +``` + +ๆ‰ง่กŒไปฅไธŠๅ‘ฝไปคๅŽ๏ผŒๆ‚จๅฐ†่ƒฝ็œ‹ๅˆฐไปฅไธ‹ๆ็คบ๏ผŒๅณไธบๅฎ‰่ฃ…ๆˆๅŠŸใ€‚ + +```bash +Processing ./torch-1.11.0-cp38-cp38-linux_aarch64.whl +Requirement already satisfied: typing-extensions in /home/sirs/miniconda3/envs/openmmlab/lib/python3.8/site-packages (from torch==1.11.0) (4.7.1) +Installing collected packages: torch +Successfully installed torch-1.11.0 +``` + +### 6.1.3 ๅฐ† Jetson Pack ่‡ชๅธฆ็š„ tensorrt ๆ‹ท่ด่‡ณ่™šๆ‹Ÿ็Žฏๅขƒไธ‹ + +่ฏทๅ‚่€ƒ[้…็ฝฎ TensorRT](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/jetsons.md#%E9%85%8D%E7%BD%AE-tensorrt)ใ€‚ +JetPack SDK ่‡ชๅธฆ TensorRTใ€‚ ไฝ†ๆ˜ฏไธบไบ†่ƒฝๅคŸๅœจ Conda ็ŽฏๅขƒไธญๆˆๅŠŸๅฏผๅ…ฅ๏ผŒๆˆ‘ไปฌ้œ€่ฆๅฐ† TensorRT ๆ‹ท่ด่ฟ›ๅ…ˆๅ‰ๅˆ›ๅปบ็š„ Conda ็Žฏๅขƒไธญใ€‚ + +```bash +export PYTHON_VERSION=`python3 --version | cut -d' ' -f 2 | cut -d'.' -f1,2` +cp -r /usr/lib/python${PYTHON_VERSION}/dist-packages/tensorrt* ~/miniconda/envs/{ๆ‚จ็š„่™šๆ‹Ÿ็Žฏๅขƒๅๅญ—}/lib/python${PYTHON_VERSION}/site-packages/ +``` + +### 6.1.4 ๅฎ‰่ฃ… MMCV + +้€š่ฟ‡`mim install mmcv`ๆˆ–ไปŽๆบ็ ๅฏนๅ…ถ่ฟ›่กŒ็ผ–่ฏ‘ใ€‚ + +```bash +pip install openmim +mim install mmcv +``` + +ๆˆ–่€…ไปŽๆบ็ ๅฏนๅ…ถ่ฟ›่กŒ็ผ–่ฏ‘ใ€‚ + +```bash +sudo apt-get install -y libssl-dev +git clone https://github.com/open-mmlab/mmcv.git +cd mmcv +pip install -e . +``` + +ๆณจ๏ผšpytorch็‰ˆๆœฌๅ‘็”Ÿๅ˜ๅŠจๅŽ๏ผŒ้œ€่ฆ้‡ๆ–ฐ็ผ–่ฏ‘mmcvใ€‚ + +### 6.1.5 ๅฎ‰่ฃ… ONNX + +ๆณจ๏ผšไปฅไธ‹ๆ–นๅผไบŒ้€‰ไธ€ + +- conda + ```bash + conda install -c conda-forge onnx + ``` +- pip + ```bash + python3 -m pip install onnx + ``` + +### 6.1.6 ๅฎ‰่ฃ… ONNX Runtime + +ๆ นๆฎ็ฝ‘้กต [ONNX Runtime](https://elinux.org/Jetson_Zoo#ONNX_Runtime) ้€‰ๆ‹ฉๅˆ้€‚็š„ONNX Runtime็‰ˆๆœฌ่ฟ›่กŒไธ‹่ฝฝๅฎ‰่ฃ…ใ€‚ +็คบไพ‹๏ผš + +```bash +# Install pip wheel +$ pip3 install onnxruntime_gpu-1.10.0-cp38-cp38-linux_aarch64.whl + +``` + +## 6.2 ๅœจ Jetson AGX Orin ่ฟ›่กŒๆจกๅž‹่ฝฌๆขๅŠๆŽจ็† + +### 6.2.1 ONNX ๆจกๅž‹่ฝฌๆข + +ๅŒ[4.1 ๆจกๅž‹่ฝฌๆข](#4.1-ๆจกๅž‹่ฝฌๆข)็›ธๅŒ๏ผŒๅœจ Jetson ๅนณๅฐไธ‹่ฟ›ๅ…ฅๅฎ‰่ฃ…ๅฅฝ็š„่™šๆ‹Ÿ็Žฏๅขƒ๏ผŒไปฅๅŠmmdeploy ็›ฎๅฝ•๏ผŒ่ฟ›่กŒๆจกๅž‹ONNX่ฝฌๆขใ€‚ + +```bash +python tools/deploy.py \ + configs/mmseg/segmentation_onnxruntime_static-512x512.py \ + ../atl_config.py \ + ../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \ + ../2_13_3584_2560_4096_3072.png \ + --work-dir ../atl_models \ + --device cpu \ + --show \ + --dump-info + +``` + +ๆณจ๏ผš ๅฆ‚ๆžœๆŠฅ้”™ๆ็คบๅ†…ๅฎน๏ผš + +```none +AttributeError: module 'torch.distributed' has no attribute 'ReduceOp' +``` + +ๅฏๅ‚่€ƒไปฅไธ‹้“พๆŽฅ่ฟ›่กŒ่งฃๅ†ณ๏ผšhttps://forums.developer.nvidia.com/t/module-torch-distributed-has-no-attribute-reduceop/256581/6๏ผŒๅณๅฎ‰่ฃ… pytorch 1.11.0 ็‰ˆๆœฌใ€‚ + +่ฝฌๆขๆˆๅŠŸๅŽ๏ผŒๆ‚จๅฐ†ไผš็œ‹ๅˆฐๅฆ‚ไธ‹ไฟกๆฏไปฅๅŠๅŒ…ๅซ ONNX ๆจกๅž‹็š„ๆ–‡ไปถๅคน๏ผš + +```bash +10/09 19:58:22 - mmengine - INFO - visualize pytorch model success. +10/09 19:58:22 - mmengine - INFO - All process success. +``` + +
+ NVIDIA-Jetson + NVIDIA-Jetson +
+ +### 6.2.2 TensorRT ๆจกๅž‹่ฝฌๆข + +ๆ›ดๆข้ƒจ็ฝฒtrt้…็ฝฎๆ–‡ไปถ๏ผŒ่ฟ›่กŒ TensorRT ๆจกๅž‹่ฝฌๆขใ€‚ + +```bash +python tools/deploy.py \ + configs/mmseg/segmentation_tensorrt_static-512x512.py \ + ../atl_config.py \ + ../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \ + ../2_13_3584_2560_4096_3072.png \ + --work-dir ../atl_trt_models \ + --device cuda:0 \ + --show \ + --dump-info + +``` + +่ฝฌๆขๆˆๅŠŸๅŽๆ‚จๅฐ†็œ‹ๅˆฐไปฅไธ‹ไฟกๆฏๅŠ TensorRT ๆจกๅž‹ๆ–‡ไปถๅคน๏ผš + +```bash +10/09 20:15:50 - mmengine - INFO - visualize pytorch model success. +10/09 20:15:50 - mmengine - INFO - All process success. +``` + +
+ NVIDIA-Jetson + NVIDIA-Jetson +
+ +## 6.3 ๆจกๅž‹ๆต‹้€Ÿ + +ๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปคๅฎŒๆˆๆจกๅž‹ๆต‹้€Ÿ๏ผŒ่ฏฆ็ป†ๅ†…ๅฎน่ฏทๆŸฅ็œ‹[ profiler ](https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/02-how-to-run/useful_tools.md#profiler) + +```bash +python tools/profiler.py \ + ${DEPLOY_CFG} \ + ${MODEL_CFG} \ + ${IMAGE_DIR} \ + --model ${MODEL} \ + --device ${DEVICE} \ + --shape ${SHAPE} \ + --num-iter ${NUM_ITER} \ + --warmup ${WARMUP} \ + --cfg-options ${CFG_OPTIONS} \ + --batch-size ${BATCH_SIZE} \ + --img-ext ${IMG_EXT} +``` + +็คบไพ‹๏ผš + +```bash +python tools/profiler.py \ + configs/mmseg/segmentation_tensorrt_static-512x512.py \ + ../atl_config.py \ + ../atl_demo_img \ + --model /home/sirs/AI-Tianlong/OpenMMLab/atl_trt_models/end2end.engine \ + --device cuda:0 \ + --shape 512x512 \ + --num-iter 100 +``` + +ๆต‹้€Ÿ็ป“ๆžœ + +![image](https://github.com/AI-Tianlong/Useful-Tools/assets/50650583/874e9742-ee10-490c-9e69-17da0096c49b) + +## 6.4 ๆจกๅž‹ๆŽจ็† + +ๆ นๆฎ[6.2.2](#6.2.2-TensorRT-ๆจกๅž‹่ฝฌๆข)ไธญ็”Ÿๆˆ็š„TensorRTๆจกๅž‹ๆ–‡ไปถๅคน๏ผŒ่ฟ›่กŒๆจกๅž‹ๆŽจ็†ใ€‚ + +```python +from mmdeploy.apis.utils import build_task_processor +from mmdeploy.utils import get_input_shape, load_config +import torch + +deploy_cfg='./mmdeploy/configs/mmseg/segmentation_tensorrt_static-512x512.py' +model_cfg='./atl_config.py' +device='cuda:0' +backend_model = ['./atl_trt_models/end2end.engine'] +image = './atl_demo_img/2_13_2048_1024_2560_1536.png' + +# read deploy_cfg and model_cfg +deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) + +# build task and backend model +task_processor = build_task_processor(model_cfg, deploy_cfg, device) +model = task_processor.build_backend_model(backend_model) + +# process input image +input_shape = get_input_shape(deploy_cfg) +model_inputs, _ = task_processor.create_input(image, input_shape) + +# do model inference +with torch.no_grad(): + result = model.test_step(model_inputs) + +# visualize results +task_processor.visualize( + image=image, + model=model, + result=result[0], + window_name='visualize', + output_file='./output_segmentation.png') +``` + +ๅณๅฏๅพ—ๅˆฐๆŽจ็†็ป“ๆžœ๏ผš + +
+ NVIDIA-Jetson + NVIDIA-Jetson +
diff --git a/mmsegmentation/projects/pp_mobileseg/README.md b/mmsegmentation/projects/pp_mobileseg/README.md new file mode 100644 index 0000000..c9f9c12 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/README.md @@ -0,0 +1,123 @@ +# PP-MobileSeg: Exploring Transformer Blocks for Efficient Mobile Segmentation. + +## Reference + +> [PP-MobileSeg: Explore the Fast and Accurate Semantic Segmentation Model on Mobile Devices. ](https://arxiv.org/abs/2304.05152) + +## Introduction + +
Official Repo + +Code Snippet + +## Abstract + +With the success of transformers in computer vision, several attempts have been made to adapt transformers to mobile devices. However, their performance is not satisfied for some real world applications. Therefore, we propose PP-MobileSeg, a SOTA semantic segmentation model for mobile devices. + +It is composed of three newly proposed parts, the strideformer backbone, the Aggregated Attention Module(AAM), and the Valid Interpolate Module(VIM): + +- With the four-stage MobileNetV3 block as the feature extractor, we manage to extract rich local features of different receptive fields with little parameter overhead. Also, we further efficiently empower features from the last two stages with the global view using strided sea attention. +- To effectively fuse the features, we use AAM to filter the detail features with ensemble voting and add the semantic feature to it to enhance the semantic information to the most content. +- At last, we use VIM to upsample the downsampled feature to the original resolution and significantly decrease latency in model inference stage. It only interpolates classes present in the final prediction which only takes around 10% in the ADE20K dataset. This is a common scenario for datasets with large classes. Therefore it significantly decreases the latency of the final upsample process which takes the greatest part of the model's overall latency. + +Extensive experiments show that PP-MobileSeg achieves a superior params-accuracy-latency tradeoff compared to other SOTA methods. + +
+ +
+ +## Performance + +### ADE20K + +| Model | Backbone | Training Iters | Batchsize | Train Resolution | mIoU(%) | latency(ms)\* | params(M) | config | Links | +| ----------------- | ----------------- | -------------- | --------- | ---------------- | ------- | ------------- | --------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| PP-MobileSeg-Base | StrideFormer-Base | 80000 | 32 | 512x512 | 41.57% | 265.5 | 5.62 | [config](https://github.com/Yang-Changhui/mmsegmentation/tree/add_ppmobileseg/projects/pp_mobileseg/configs/pp_mobileseg) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pp_mobileseg/pp_mobileseg_mobilenetv3_2xb16_3rdparty-base_512x512-ade20k-f12b44f3.pth)\|[log](https://bj.bcebos.com/paddleseg/dygraph/ade20k/pp_mobileseg_base/train.log) | +| PP-MobileSeg-Tiny | StrideFormer-Tiny | 80000 | 32 | 512x512 | 36.39% | 215.3 | 1.61 | [config](https://github.com/Yang-Changhui/mmsegmentation/tree/add_ppmobileseg/projects/pp_mobileseg/configs/pp_mobileseg) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pp_mobileseg/pp_mobileseg_mobilenetv3_2xb16_3rdparty-tiny_512x512-ade20k-a351ebf5.pth)\|[log](https://bj.bcebos.com/paddleseg/dygraph/ade20k/pp_mobileseg_tiny/train.log) | + +## Usage + +Same as other models in MMsegmentation, you can run the following command to test the model at ${MMSEG_ROOT}: + +```shell +./tools/dist_test.sh projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_base.py checkpoints/pp_mobileseg_mobilenetv3_2xb16_3rdparty-base_512x512-ade20k-f12b44f3.pth 8 +``` + +## Inference with ONNXRuntime + +### Prerequisites + +**1. Install onnxruntime inference engine.** + +Choose one of the following ways to install onnxruntime. + +- CPU version + +```shell +pip install onnxruntime==1.15.1 +wget https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-linux-x64-1.15.1.tgz +tar -zxvf onnxruntime-linux-x64-1.15.1.tgz +export ONNXRUNTIME_DIR=$(pwd)/onnxruntime-linux-x64-1.15.1 +export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH +``` + +**2. Convert model to onnx file** + +- Install `mim` and `mmdeploy`. + +```shell +pip install openmim +mim install mmdeploy +git clone https://github.com/open-mmlab/mmdeploy.git +``` + +- Download pp_mobileseg model. + +```shell +wget https://download.openmmlab.com/mmsegmentation/v0.5/pp_mobileseg/pp_mobileseg_mobilenetv3_2xb16_3rdparty-tiny_512x512-ade20k-a351ebf5.pth +``` + +- Convert model to onnx files. + +```shell +python mmdeploy/tools/deploy.py mmdeploy/configs/mmseg/segmentation_onnxruntime_dynamic.py \ + configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_tiny.py \ + pp_mobileseg_mobilenetv3_2xb16_3rdparty-tiny_512x512-ade20k-a351ebf5.pth \ + ../../demo/demo.png \ + --work-dir mmdeploy_model/mmseg/ort \ + --show +``` + +**3. Run demo** + +```shell +python inference_onnx.py ${ONNX_FILE_PATH} ${IMAGE_PATH} [${MODEL_INPUT_SIZE} ${DEVICE} ${OUTPUT_IMAGE_PATH}] +``` + +Example: + +```shell +python inference_onnx.py mmdeploy_model/mmseg/ort/end2end.onnx ../../demo/demo.png +``` + +## Citation + +If you find our project useful in your research, please consider citing: + +``` +@misc{liu2021paddleseg, + title={PaddleSeg: A High-Efficient Development Toolkit for Image Segmentation}, + author={Yi Liu and Lutao Chu and Guowei Chen and Zewu Wu and Zeyu Chen and Baohua Lai and Yuying Hao}, + year={2021}, + eprint={2101.06175}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} + +@misc{paddleseg2019, + title={PaddleSeg, End-to-end image segmentation kit based on PaddlePaddle}, + author={PaddlePaddle Contributors}, + howpublished = {\url{https://github.com/PaddlePaddle/PaddleSeg}}, + year={2019} +} +``` diff --git a/mmsegmentation/projects/pp_mobileseg/backbones/__init__.py b/mmsegmentation/projects/pp_mobileseg/backbones/__init__.py new file mode 100644 index 0000000..244b33d --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/backbones/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .strideformer import StrideFormer + +__all__ = ['StrideFormer'] diff --git a/mmsegmentation/projects/pp_mobileseg/backbones/strideformer.py b/mmsegmentation/projects/pp_mobileseg/backbones/strideformer.py new file mode 100644 index 0000000..3f09be5 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/backbones/strideformer.py @@ -0,0 +1,958 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_activation_layer +from mmcv.cnn.bricks.transformer import build_dropout +from mmengine.logging import print_log +from mmengine.model import BaseModule +from mmengine.runner.checkpoint import CheckpointLoader, load_state_dict + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class StrideFormer(BaseModule): + """The StrideFormer implementation based on torch. + + The original article refers to:https://arxiv.org/abs/2304.05152 + Args: + mobileV3_cfg(list): Each sublist describe the config for a + MobileNetV3 block. + channels(list): The input channels for each MobileNetV3 block. + embed_dims(list): The channels of the features input to the sea + attention block. + key_dims(list, optional): The embeding dims for each head in + attention. + depths(list, optional): describes the depth of the attention block. + i,e: M,N. + num_heads(int, optional): The number of heads of the attention + blocks. + attn_ratios(int, optional): The expand ratio of V. + mlp_ratios(list, optional): The ratio of mlp blocks. + drop_path_rate(float, optional): The drop path rate in attention + block. + act_cfg(dict, optional): The activation layer of AAM: + Aggregate Attention Module. + inj_type(string, optional): The type of injection/AAM. + out_channels(int, optional): The output channels of the AAM. + dims(list, optional): The dimension of the fusion block. + out_feat_chs(list, optional): The input channels of the AAM. + stride_attention(bool, optional): whether to stride attention in + each attention layer. + pretrained(str, optional): the path of pretrained model. + """ + + def __init__( + self, + mobileV3_cfg, + channels, + embed_dims, + key_dims=[16, 24], + depths=[2, 2], + num_heads=8, + attn_ratios=2, + mlp_ratios=[2, 4], + drop_path_rate=0.1, + act_cfg=dict(type='ReLU'), + inj_type='AAM', + out_channels=256, + dims=(128, 160), + out_feat_chs=None, + stride_attention=True, + pretrained=None, + init_cfg=None, + ): + super().__init__(init_cfg=init_cfg) + assert not (init_cfg and pretrained + ), 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + + self.depths = depths + self.cfgs = mobileV3_cfg + self.dims = dims + for i in range(len(self.cfgs)): + smb = StackedMV3Block( + cfgs=self.cfgs[i], + stem=True if i == 0 else False, + in_channels=channels[i], + ) + setattr(self, f'smb{i + 1}', smb) + for i in range(len(depths)): + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, depths[i]) + ] + trans = BasicLayer( + block_num=depths[i], + embedding_dim=embed_dims[i], + key_dim=key_dims[i], + num_heads=num_heads, + mlp_ratio=mlp_ratios[i], + attn_ratio=attn_ratios, + drop=0, + attn_drop=0.0, + drop_path=dpr, + act_cfg=act_cfg, + stride_attention=stride_attention, + ) + setattr(self, f'trans{i + 1}', trans) + + self.inj_type = inj_type + if self.inj_type == 'AAM': + self.inj_module = InjectionMultiSumallmultiallsum( + in_channels=out_feat_chs, out_channels=out_channels) + self.feat_channels = [ + out_channels, + ] + elif self.inj_type == 'AAMSx8': + self.inj_module = InjectionMultiSumallmultiallsumSimpx8( + in_channels=out_feat_chs, out_channels=out_channels) + self.feat_channels = [ + out_channels, + ] + elif self.inj_type == 'origin': + for i in range(len(dims)): + fuse = FusionBlock( + out_feat_chs[0] if i == 0 else dims[i - 1], + out_feat_chs[i + 1], + embed_dim=dims[i], + act_cfg=None, + ) + setattr(self, f'fuse{i + 1}', fuse) + self.feat_channels = [ + dims[i], + ] + else: + raise NotImplementedError(self.inj_module + ' is not implemented') + + self.pretrained = pretrained + # self.init_weights() + + def init_weights(self): + if (isinstance(self.init_cfg, dict) + and self.init_cfg.get('type') == 'Pretrained'): + checkpoint = CheckpointLoader.load_checkpoint( + self.init_cfg['checkpoint'], logger=None, map_location='cpu') + + if 'state_dict' in checkpoint: + state_dict = checkpoint['state_dict'] + else: + state_dict = checkpoint + + if 'pos_embed' in state_dict.keys(): + if self.pos_embed.shape != state_dict['pos_embed'].shape: + print_log(msg=f'Resize the pos_embed shape from ' + f'{state_dict["pos_embed"].shape} to ' + f'{self.pos_embed.shape}') + h, w = self.img_size + pos_size = int( + math.sqrt(state_dict['pos_embed'].shape[1] - 1)) + state_dict['pos_embed'] = self.resize_pos_embed( + state_dict['pos_embed'], + (h // self.patch_size, w // self.patch_size), + (pos_size, pos_size), + self.interpolate_mode, + ) + + load_state_dict(self, state_dict, strict=False, logger=None) + + def forward(self, x): + x_hw = x.shape[2:] + outputs = [] + num_smb_stage = len(self.cfgs) + num_trans_stage = len(self.depths) + + for i in range(num_smb_stage): + smb = getattr(self, f'smb{i + 1}') + x = smb(x) + + # 1/8 shared feat + if i == 1: + outputs.append(x) + if num_trans_stage + i >= num_smb_stage: + trans = getattr( + self, f'trans{i + num_trans_stage - num_smb_stage + 1}') + x = trans(x) + outputs.append(x) + if self.inj_type == 'origin': + x_detail = outputs[0] + for i in range(len(self.dims)): + fuse = getattr(self, f'fuse{i + 1}') + + x_detail = fuse(x_detail, outputs[i + 1]) + output = x_detail + else: + output = self.inj_module(outputs) + + return [output, x_hw] + + +class StackedMV3Block(nn.Module): + """The MobileNetV3 block. + + Args: + cfgs (list): The MobileNetV3 config list of a stage. + stem (bool): Whether is the first stage or not. + in_channels (int, optional): The channels of input image. Default: 3. + scale: float=1.0. + The coefficient that controls the size of network parameters. + + Returns: + model: nn.Module. + A stage of specific MobileNetV3 model depends on args. + """ + + def __init__(self, + cfgs, + stem, + in_channels, + scale=1.0, + norm_cfg=dict(type='BN')): + super().__init__() + + self.scale = scale + self.stem = stem + + if self.stem: + self.conv = ConvModule( + in_channels=3, + out_channels=_make_divisible(in_channels * self.scale), + kernel_size=3, + stride=2, + padding=1, + groups=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=dict(type='HSwish'), + ) + + self.blocks = nn.ModuleList() + for i, (k, exp, c, se, act, s) in enumerate(cfgs): + self.blocks.append( + ResidualUnit( + in_channel=_make_divisible(in_channels * self.scale), + mid_channel=_make_divisible(self.scale * exp), + out_channel=_make_divisible(self.scale * c), + kernel_size=k, + stride=s, + use_se=se, + act=act, + dilation=1, + )) + in_channels = _make_divisible(self.scale * c) + + def forward(self, x): + if self.stem: + x = self.conv(x) + for i, block in enumerate(self.blocks): + x = block(x) + + return x + + +class ResidualUnit(nn.Module): + """The Residual module. + + Args: + in_channel (int, optional): The channels of input feature. + mid_channel (int, optional): The channels of middle process. + out_channel (int, optional): The channels of output feature. + kernel_size (int, optional): The size of the convolving kernel. + stride (int, optional): The stride size. + use_se (bool, optional): if to use the SEModule. + act (string, optional): activation layer. + dilation (int, optional): The dilation size. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + """ + + def __init__( + self, + in_channel, + mid_channel, + out_channel, + kernel_size, + stride, + use_se, + act=None, + dilation=1, + norm_cfg=dict(type='BN'), + ): + super().__init__() + self.if_shortcut = stride == 1 and in_channel == out_channel + self.if_se = use_se + self.expand_conv = ConvModule( + in_channels=in_channel, + out_channels=mid_channel, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=dict(type=act) if act is not None else None, + ) + self.bottleneck_conv = ConvModule( + in_channels=mid_channel, + out_channels=mid_channel, + kernel_size=kernel_size, + stride=stride, + padding=int((kernel_size - 1) // 2) * dilation, + bias=False, + groups=mid_channel, + dilation=dilation, + norm_cfg=norm_cfg, + act_cfg=dict(type=act) if act is not None else None, + ) + if self.if_se: + self.mid_se = SEModule(mid_channel) + self.linear_conv = ConvModule( + in_channels=mid_channel, + out_channels=out_channel, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None, + ) + + def forward(self, x): + identity = x + x = self.expand_conv(x) + x = self.bottleneck_conv(x) + if self.if_se: + x = self.mid_se(x) + x = self.linear_conv(x) + if self.if_shortcut: + x = torch.add(identity, x) + return x + + +class SEModule(nn.Module): + """SE Module. + + Args: + channel (int, optional): The channels of input feature. + reduction (int, optional): The channel reduction rate. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + """ + + def __init__(self, channel, reduction=4, act_cfg=dict(type='ReLU')): + super().__init__() + self.avg_pool = nn.AdaptiveAvgPool2d(1) + self.conv_act1 = ConvModule( + in_channels=channel, + out_channels=channel // reduction, + kernel_size=1, + norm_cfg=None, + act_cfg=act_cfg, + ) + + self.conv_act2 = ConvModule( + in_channels=channel // reduction, + out_channels=channel, + kernel_size=1, + norm_cfg=None, + act_cfg=dict(type='Hardsigmoid', slope=0.2, offset=0.5), + ) + + def forward(self, x): + identity = x + x = self.avg_pool(x) + x = self.conv_act1(x) + x = self.conv_act2(x) + return torch.mul(identity, x) + + +class BasicLayer(nn.Module): + """The transformer basic layer. + + Args: + block_num (int): the block nums of the transformer basic layer. + embedding_dim (int): The feature dimension. + key_dim (int): the key dim. + num_heads (int): Parallel attention heads. + mlp_ratio (float): the mlp ratio. + attn_ratio (float): the attention ratio. + drop (float): Probability of an element to be zeroed + after the feed forward layer.Default: 0.0. + attn_drop (float): The drop out rate for attention layer. + Default: 0.0. + drop_path (float): stochastic depth rate. Default 0.0. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + stride_attention (bool, optional): whether to stride attention in + each attention layer. + """ + + def __init__( + self, + block_num, + embedding_dim, + key_dim, + num_heads, + mlp_ratio=4.0, + attn_ratio=2.0, + drop=0.0, + attn_drop=0.0, + drop_path=None, + act_cfg=None, + stride_attention=None, + ): + super().__init__() + self.block_num = block_num + + self.transformer_blocks = nn.ModuleList() + for i in range(self.block_num): + self.transformer_blocks.append( + Block( + embedding_dim, + key_dim=key_dim, + num_heads=num_heads, + mlp_ratio=mlp_ratio, + attn_ratio=attn_ratio, + drop=drop, + drop_path=drop_path[i] + if isinstance(drop_path, list) else drop_path, + act_cfg=act_cfg, + stride_attention=stride_attention, + )) + + def forward(self, x): + for i in range(self.block_num): + x = self.transformer_blocks[i](x) + return x + + +class Block(nn.Module): + """the block of the transformer basic layer. + + Args: + dim (int): The feature dimension. + key_dim (int): The key dimension. + num_heads (int): Parallel attention heads. + mlp_ratio (float): the mlp ratio. + attn_ratio (float): the attention ratio. + drop (float): Probability of an element to be zeroed + after the feed forward layer.Default: 0.0. + drop_path (float): stochastic depth rate. Default 0.0. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + stride_attention (bool, optional): whether to stride attention in + each attention layer. + """ + + def __init__( + self, + dim, + key_dim, + num_heads, + mlp_ratio=4.0, + attn_ratio=2.0, + drop=0.0, + drop_path=0.0, + act_cfg=None, + stride_attention=None, + ): + super().__init__() + self.dim = dim + self.num_heads = num_heads + self.mlp_ratio = mlp_ratio + self.attn = SeaAttention( + dim, + key_dim=key_dim, + num_heads=num_heads, + attn_ratio=attn_ratio, + act_cfg=act_cfg, + stride_attention=stride_attention, + ) + self.drop_path = ( + build_dropout(dict(type='DropPath', drop_prob=drop_path)) + if drop_path > 0.0 else nn.Identity()) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = MLP( + in_features=dim, + hidden_features=mlp_hidden_dim, + act_cfg=act_cfg, + drop=drop, + ) + + def forward(self, x1): + x1 = x1 + self.drop_path(self.attn(x1)) + x1 = x1 + self.drop_path(self.mlp(x1)) + + return x1 + + +class SqueezeAxialPositionalEmbedding(nn.Module): + """the Squeeze Axial Positional Embedding. + + Args: + dim (int): The feature dimension. + shape (int): The patch size. + """ + + def __init__(self, dim, shape): + super().__init__() + self.pos_embed = nn.init.normal_( + nn.Parameter(torch.zeros(1, dim, shape))) + + def forward(self, x): + B, C, N = x.shape + x = x + F.interpolate( + self.pos_embed, size=(N, ), mode='linear', align_corners=False) + return x + + +class SeaAttention(nn.Module): + """The sea attention. + + Args: + dim (int): The feature dimension. + key_dim (int): The key dimension. + num_heads (int): number of attention heads. + attn_ratio (float): the attention ratio. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN') + stride_attention (bool, optional): whether to stride attention in + each attention layer. + """ + + def __init__( + self, + dim, + key_dim, + num_heads, + attn_ratio=4.0, + act_cfg=None, + norm_cfg=dict(type='BN'), + stride_attention=False, + ): + + super().__init__() + self.num_heads = num_heads + self.scale = key_dim**-0.5 + self.nh_kd = nh_kd = key_dim * num_heads + self.d = int(attn_ratio * key_dim) + self.dh = int(attn_ratio * key_dim) * num_heads + self.attn_ratio = attn_ratio + + self.to_q = ConvModule( + dim, nh_kd, 1, bias=False, norm_cfg=norm_cfg, act_cfg=None) + self.to_k = ConvModule( + dim, nh_kd, 1, bias=False, norm_cfg=norm_cfg, act_cfg=None) + + self.to_v = ConvModule( + dim, self.dh, 1, bias=False, norm_cfg=norm_cfg, act_cfg=None) + self.stride_attention = stride_attention + if self.stride_attention: + self.stride_conv = ConvModule( + dim, + dim, + kernel_size=3, + stride=2, + padding=1, + bias=True, + groups=dim, + norm_cfg=norm_cfg, + act_cfg=None, + ) + + self.proj = ConvModule( + self.dh, + dim, + 1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + order=('act', 'conv', 'norm'), + ) + self.proj_encode_row = ConvModule( + self.dh, + self.dh, + 1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + order=('act', 'conv', 'norm'), + ) + self.pos_emb_rowq = SqueezeAxialPositionalEmbedding(nh_kd, 16) + self.pos_emb_rowk = SqueezeAxialPositionalEmbedding(nh_kd, 16) + self.proj_encode_column = ConvModule( + self.dh, + self.dh, + 1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + order=('act', 'conv', 'norm'), + ) + self.pos_emb_columnq = SqueezeAxialPositionalEmbedding(nh_kd, 16) + self.pos_emb_columnk = SqueezeAxialPositionalEmbedding(nh_kd, 16) + self.dwconv = ConvModule( + 2 * self.dh, + 2 * self.dh, + 3, + padding=1, + groups=2 * self.dh, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + ) + self.pwconv = ConvModule( + 2 * self.dh, dim, 1, bias=False, norm_cfg=norm_cfg, act_cfg=None) + self.sigmoid = build_activation_layer(dict(type='HSigmoid')) + + def forward(self, x): + B, C, H_ori, W_ori = x.shape + if self.stride_attention: + x = self.stride_conv(x) + B, C, H, W = x.shape + + q = self.to_q(x) # [B, nhead*dim, H, W] + k = self.to_k(x) + v = self.to_v(x) + + qkv = torch.cat([q, k, v], dim=1) + qkv = self.dwconv(qkv) + qkv = self.pwconv(qkv) + + qrow = (self.pos_emb_rowq(q.mean(-1)).reshape( + [B, self.num_heads, -1, H]).permute( + (0, 1, 3, 2))) # [B, nhead, H, dim] + krow = self.pos_emb_rowk(k.mean(-1)).reshape( + [B, self.num_heads, -1, H]) # [B, nhead, dim, H] + vrow = (v.mean(-1).reshape([B, self.num_heads, -1, + H]).permute([0, 1, 3, 2]) + ) # [B, nhead, H, dim*attn_ratio] + + attn_row = torch.matmul(qrow, krow) * self.scale # [B, nhead, H, H] + attn_row = nn.functional.softmax(attn_row, dim=-1) + + xx_row = torch.matmul(attn_row, vrow) # [B, nhead, H, dim*attn_ratio] + xx_row = self.proj_encode_row( + xx_row.permute([0, 1, 3, 2]).reshape([B, self.dh, H, 1])) + + # squeeze column + qcolumn = ( + self.pos_emb_columnq(q.mean(-2)).reshape( + [B, self.num_heads, -1, W]).permute([0, 1, 3, 2])) + kcolumn = self.pos_emb_columnk(k.mean(-2)).reshape( + [B, self.num_heads, -1, W]) + vcolumn = ( + torch.mean(v, -2).reshape([B, self.num_heads, -1, + W]).permute([0, 1, 3, 2])) + + attn_column = torch.matmul(qcolumn, kcolumn) * self.scale + attn_column = nn.functional.softmax(attn_column, dim=-1) + + xx_column = torch.matmul(attn_column, vcolumn) # B nH W C + xx_column = self.proj_encode_column( + xx_column.permute([0, 1, 3, 2]).reshape([B, self.dh, 1, W])) + + xx = torch.add(xx_row, xx_column) # [B, self.dh, H, W] + xx = torch.add(v, xx) + + xx = self.proj(xx) + xx = self.sigmoid(xx) * qkv + if self.stride_attention: + xx = F.interpolate(xx, size=(H_ori, W_ori), mode='bilinear') + + return xx + + +class MLP(nn.Module): + """the Multilayer Perceptron. + + Args: + in_features (int): the input feature. + hidden_features (int): the hidden feature. + out_features (int): the output feature. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN') + drop (float): Probability of an element to be zeroed. + Default 0.0 + """ + + def __init__( + self, + in_features, + hidden_features=None, + out_features=None, + act_cfg=None, + norm_cfg=dict(type='BN'), + drop=0.0, + ): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = ConvModule( + in_features, + hidden_features, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None, + ) + self.dwconv = ConvModule( + hidden_features, + hidden_features, + kernel_size=3, + padding=1, + groups=hidden_features, + norm_cfg=None, + act_cfg=act_cfg, + ) + + self.fc2 = ConvModule( + hidden_features, + out_features, + 1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None, + ) + self.drop = build_dropout(dict(type='Dropout', drop_prob=drop)) + + def forward(self, x): + x = self.fc1(x) + x = self.dwconv(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class FusionBlock(nn.Module): + """The feature fusion block. + + Args: + in_channel (int): the input channel. + out_channel (int): the output channel. + embed_dim (int): embedding dimension. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN') + """ + + def __init__( + self, + in_channel, + out_channel, + embed_dim, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + ) -> None: + super().__init__() + self.local_embedding = ConvModule( + in_channels=in_channel, + out_channels=embed_dim, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None, + ) + + self.global_act = ConvModule( + in_channels=out_channel, + out_channels=embed_dim, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg if act_cfg is not None else None, + ) + + def forward(self, x_l, x_g): + """ + x_g: global features + x_l: local features + """ + B, C, H, W = x_l.shape + + local_feat = self.local_embedding(x_l) + global_act = self.global_act(x_g) + sig_act = F.interpolate( + global_act, size=(H, W), mode='bilinear', align_corners=False) + + out = local_feat * sig_act + + return out + + +class InjectionMultiSumallmultiallsum(nn.Module): + """the Aggregate Attention Module. + + Args: + in_channels (tuple): the input channel. + out_channels (int): the output channel. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN') + """ + + def __init__( + self, + in_channels=(64, 128, 256, 384), + out_channels=256, + act_cfg=dict(type='Sigmoid'), + norm_cfg=dict(type='BN'), + ): + super().__init__() + self.embedding_list = nn.ModuleList() + self.act_embedding_list = nn.ModuleList() + self.act_list = nn.ModuleList() + for i in range(len(in_channels)): + self.embedding_list.append( + ConvModule( + in_channels=in_channels[i], + out_channels=out_channels, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None, + )) + self.act_embedding_list.append( + ConvModule( + in_channels=in_channels[i], + out_channels=out_channels, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + )) + + def forward(self, inputs): # x_x8, x_x16, x_x32, x_x64 + low_feat1 = F.interpolate(inputs[0], scale_factor=0.5, mode='bilinear') + low_feat1_act = self.act_embedding_list[0](low_feat1) + low_feat1 = self.embedding_list[0](low_feat1) + + low_feat2 = F.interpolate( + inputs[1], size=low_feat1.shape[-2:], mode='bilinear') + low_feat2_act = self.act_embedding_list[1](low_feat2) # x16 + low_feat2 = self.embedding_list[1](low_feat2) + + high_feat_act = F.interpolate( + self.act_embedding_list[2](inputs[2]), + size=low_feat2.shape[2:], + mode='bilinear', + ) + high_feat = F.interpolate( + self.embedding_list[2](inputs[2]), + size=low_feat2.shape[2:], + mode='bilinear') + + res = ( + low_feat1_act * low_feat2_act * high_feat_act * + (low_feat1 + low_feat2) + high_feat) + + return res + + +class InjectionMultiSumallmultiallsumSimpx8(nn.Module): + """the Aggregate Attention Module. + + Args: + in_channels (tuple): the input channel. + out_channels (int): the output channel. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN') + """ + + def __init__( + self, + in_channels=(64, 128, 256, 384), + out_channels=256, + act_cfg=dict(type='Sigmoid'), + norm_cfg=dict(type='BN'), + ): + super().__init__() + self.embedding_list = nn.ModuleList() + self.act_embedding_list = nn.ModuleList() + self.act_list = nn.ModuleList() + for i in range(len(in_channels)): + if i != 1: + self.embedding_list.append( + ConvModule( + in_channels=in_channels[i], + out_channels=out_channels, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=None, + )) + if i != 0: + self.act_embedding_list.append( + ConvModule( + in_channels=in_channels[i], + out_channels=out_channels, + kernel_size=1, + bias=False, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + )) + + def forward(self, inputs): + # x_x8, x_x16, x_x32 + low_feat1 = self.embedding_list[0](inputs[0]) + + low_feat2 = F.interpolate( + inputs[1], size=low_feat1.shape[-2:], mode='bilinear') + low_feat2_act = self.act_embedding_list[0](low_feat2) + + high_feat_act = F.interpolate( + self.act_embedding_list[1](inputs[2]), + size=low_feat2.shape[2:], + mode='bilinear', + ) + high_feat = F.interpolate( + self.embedding_list[1](inputs[2]), + size=low_feat2.shape[2:], + mode='bilinear') + + res = low_feat2_act * high_feat_act * low_feat1 + high_feat + + return res + + +def _make_divisible(v, divisor=8, min_value=None): + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +@MODELS.register_module() +class Hardsigmoid(nn.Module): + """the hardsigmoid activation. + + Args: + slope (float, optional): The slope of hardsigmoid function. + Default is 0.1666667. + offset (float, optional): The offset of hardsigmoid function. + Default is 0.5. + inplace (bool): can optionally do the operation in-place. + Default: ``False`` + """ + + def __init__(self, slope=0.1666667, offset=0.5, inplace=False): + super().__init__() + self.slope = slope + self.offset = offset + + def forward(self, x): + return (x * self.slope + self.offset).clamp(0, 1) diff --git a/mmsegmentation/projects/pp_mobileseg/configs/_base_/datasets/ade20k.py b/mmsegmentation/projects/pp_mobileseg/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000..48340d1 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/configs/_base_/datasets/ade20k.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict( + type='RandomResize', + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmsegmentation/projects/pp_mobileseg/configs/_base_/default_runtime.py b/mmsegmentation/projects/pp_mobileseg/configs/_base_/default_runtime.py new file mode 100644 index 0000000..272b4d2 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/configs/_base_/default_runtime.py @@ -0,0 +1,15 @@ +default_scope = 'mmseg' +env_cfg = dict( + cudnn_benchmark=True, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) +vis_backends = [dict(type='LocalVisBackend')] +visualizer = dict( + type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') +log_processor = dict(by_epoch=False) +log_level = 'INFO' +load_from = None +resume = False + +tta_model = dict(type='SegTTAModel') diff --git a/mmsegmentation/projects/pp_mobileseg/configs/_base_/models/pp_mobile.py b/mmsegmentation/projects/pp_mobileseg/configs/_base_/models/pp_mobile.py new file mode 100644 index 0000000..0c76956 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/configs/_base_/models/pp_mobile.py @@ -0,0 +1,47 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) + +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + # pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='StrideFormer', + mobileV3_cfg=[ + # k t c, s + [[3, 16, 16, True, 'ReLU', 1], [3, 64, 32, False, 'ReLU', 2], + [3, 96, 32, False, 'ReLU', 1]], # cfg1 + [[5, 128, 64, True, 'HSwish', 2], [5, 240, 64, True, 'HSwish', + 1]], # cfg2 + [[5, 384, 128, True, 'HSwish', 2], + [5, 384, 128, True, 'HSwish', 1]], # cfg3 + [[5, 768, 192, True, 'HSwish', 2], + [5, 768, 192, True, 'HSwish', 1]], # cfg4 + ], + channels=[16, 32, 64, 128, 192], + depths=[3, 3], + embed_dims=[128, 192], + num_heads=8, + inj_type='AAMSx8', + out_feat_chs=[64, 128, 192], + act_cfg=dict(type='ReLU6'), + ), + decode_head=dict( + type='PPMobileSegHead', + num_classes=150, + in_channels=256, + dropout_ratio=0.1, + use_dw=True, + act_cfg=dict(type='ReLU'), + align_corners=False), + + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/projects/pp_mobileseg/configs/_base_/schedules/schedule_80k.py b/mmsegmentation/projects/pp_mobileseg/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000..0dcd6c4 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,24 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + eta_min=1e-4, + power=0.9, + begin=0, + end=80000, + by_epoch=False) +] +# training schedule for 80k +train_cfg = dict(type='IterBasedTrainLoop', max_iters=80000, val_interval=8000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=8000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_base.py b/mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_base.py new file mode 100644 index 0000000..4b68a92 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_base.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/pp_mobile.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +# the custom import path is determined by your workspace path (i.e., where you run the command from) # noqa +custom_imports = dict( + imports=[ + 'projects.pp_mobileseg.backbones', 'projects.pp_mobileseg.decode_head' + ], + allow_failed_imports=False) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pp_mobileseg/pp_mobileseg_mobilenetv3_3rdparty-base-ed0be681.pth' # noqa +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size, test_cfg=dict(size_divisor=32)) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), + decode_head=dict(num_classes=150, upsample='intepolate')) diff --git a/mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_tiny.py b/mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_tiny.py new file mode 100644 index 0000000..b78869e --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/configs/pp_mobileseg/pp_mobileseg_mobilenetv3_2x16_80k_ade20k_512x512_tiny.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/pp_mobile.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +# the custom import path is determined by your workspace path (i.e., where you run the command from) # noqa +custom_imports = dict( + imports=[ + 'projects.pp_mobileseg.backbones', 'projects.pp_mobileseg.decode_head' + ], + allow_failed_imports=False) +checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pp_mobileseg/pp_mobileseg_mobilenetv3_3rdparty-tiny-e4b35e96.pth' # noqa +crop_size = (512, 512) +data_preprocessor = dict(size=crop_size, test_cfg=dict(size_divisor=32)) +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + data_preprocessor=data_preprocessor, + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint=checkpoint), + type='StrideFormer', + mobileV3_cfg=[ + # k t c, s + [[3, 16, 16, True, 'ReLU', 1], [3, 64, 32, False, 'ReLU', 2], + [3, 48, 24, False, 'ReLU', 1]], # cfg1 + [[5, 96, 32, True, 'HSwish', 2], [5, 96, 32, True, 'HSwish', + 1]], # cfg2 + [[5, 160, 64, True, 'HSwish', 2], [5, 160, 64, True, 'HSwish', + 1]], # cfg3 + [[3, 384, 128, True, 'HSwish', 2], + [3, 384, 128, True, 'HSwish', 1]], # cfg4 + ], + channels=[16, 24, 32, 64, 128], + depths=[2, 2], + embed_dims=[64, 128], + num_heads=4, + inj_type='AAM', + out_feat_chs=[32, 64, 128], + act_cfg=dict(type='ReLU6'), + ), + decode_head=dict( + num_classes=150, + in_channels=256, + use_dw=True, + act_cfg=dict(type='ReLU'), + upsample='intepolate'), +) diff --git a/mmsegmentation/projects/pp_mobileseg/decode_head/__init__.py b/mmsegmentation/projects/pp_mobileseg/decode_head/__init__.py new file mode 100644 index 0000000..6f71b78 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/decode_head/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .pp_mobileseg_head import PPMobileSegHead + +__all__ = [ + 'PPMobileSegHead', +] diff --git a/mmsegmentation/projects/pp_mobileseg/decode_head/pp_mobileseg_head.py b/mmsegmentation/projects/pp_mobileseg/decode_head/pp_mobileseg_head.py new file mode 100644 index 0000000..243f026 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/decode_head/pp_mobileseg_head.py @@ -0,0 +1,94 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import List + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_conv_layer +from torch import Tensor + +from mmseg.registry import MODELS + + +@MODELS.register_module() +class PPMobileSegHead(nn.Module): + """the segmentation head. + + Args: + num_classes (int): the classes num. + in_channels (int): the input channels. + use_dw (bool): if to use deepwith convolution. + dropout_ratio (float): Probability of an element to be zeroed. + Default 0.0ใ€‚ + align_corners (bool, optional): Geometrically, we consider the pixels + of the input and output as squares rather than points. + upsample (str): the upsample method. + out_channels (int): the output channel. + conv_cfg (dict): Config dict for convolution layer. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + """ + + def __init__(self, + num_classes, + in_channels, + use_dw=True, + dropout_ratio=0.1, + align_corners=False, + upsample='intepolate', + out_channels=None, + conv_cfg=dict(type='Conv'), + act_cfg=dict(type='ReLU'), + norm_cfg=dict(type='BN')): + + super().__init__() + self.align_corners = align_corners + self.last_channels = in_channels + self.upsample = upsample + self.num_classes = num_classes + self.out_channels = out_channels + self.linear_fuse = ConvModule( + in_channels=self.last_channels, + out_channels=self.last_channels, + kernel_size=1, + bias=False, + groups=self.last_channels if use_dw else 1, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.dropout = nn.Dropout2d(dropout_ratio) + self.conv_seg = build_conv_layer( + conv_cfg, self.last_channels, self.num_classes, kernel_size=1) + + def forward(self, x): + x, x_hw = x[0], x[1] + x = self.linear_fuse(x) + x = self.dropout(x) + x = self.conv_seg(x) + if self.upsample == 'intepolate' or self.training or \ + self.num_classes < 30: + x = F.interpolate( + x, x_hw, mode='bilinear', align_corners=self.align_corners) + elif self.upsample == 'vim': + labelset = torch.unique(torch.argmax(x, 1)) + x = torch.gather(x, 1, labelset) + x = F.interpolate( + x, x_hw, mode='bilinear', align_corners=self.align_corners) + + pred = torch.argmax(x, 1) + pred_retrieve = torch.zeros(pred.shape, dtype=torch.int32) + for i, val in enumerate(labelset): + pred_retrieve[pred == i] = labelset[i].cast('int32') + + x = pred_retrieve + else: + raise NotImplementedError(self.upsample, ' is not implemented') + + return [x] + + def predict(self, inputs, batch_img_metas: List[dict], test_cfg, + **kwargs) -> List[Tensor]: + """Forward function for testing, only ``pam_cam`` is used.""" + seg_logits = self.forward(inputs)[0] + return seg_logits diff --git a/mmsegmentation/projects/pp_mobileseg/inference_onnx.py b/mmsegmentation/projects/pp_mobileseg/inference_onnx.py new file mode 100644 index 0000000..139d1b1 --- /dev/null +++ b/mmsegmentation/projects/pp_mobileseg/inference_onnx.py @@ -0,0 +1,203 @@ +import argparse +import time +from typing import List, Tuple + +import cv2 +import loguru +import numpy as np +import onnxruntime as ort + +logger = loguru.logger + + +def parse_args(): + parser = argparse.ArgumentParser( + description='PP_Mobileseg ONNX inference demo.') + parser.add_argument('onnx_file', help='ONNX file path') + parser.add_argument('image_file', help='Input image file path') + parser.add_argument( + '--input-size', + type=int, + nargs='+', + default=[512, 512], + help='input image size') + parser.add_argument( + '--device', help='device type for inference', default='cpu') + parser.add_argument( + '--save-path', + help='path to save the output image', + default='output.jpg') + args = parser.parse_args() + return args + + +def preprocess( + img: np.ndarray, input_size: Tuple[int, int] = (512, 512) +) -> Tuple[np.ndarray, np.ndarray]: + """Preprocess image for inference.""" + img_shape = img.shape[:2] + # Resize + resized_img = cv2.resize(img, input_size) + + # Normalize + mean = np.array([123.575, 116.28, 103.53], dtype=np.float32) + std = np.array([58.395, 57.12, 57.375], dtype=np.float32) + resized_img = (resized_img - mean) / std + + return resized_img, img_shape + + +def build_session(onnx_file: str, device: str = 'cpu') -> ort.InferenceSession: + """Build onnxruntime session. + + Args: + onnx_file (str): ONNX file path. + device (str): Device type for inference. + + Returns: + sess (ort.InferenceSession): ONNXRuntime session. + """ + providers = ['CPUExecutionProvider' + ] if device == 'cpu' else ['CUDAExecutionProvider'] + sess = ort.InferenceSession(path_or_bytes=onnx_file, providers=providers) + + return sess + + +def inference(sess: ort.InferenceSession, img: np.ndarray) -> np.ndarray: + """Inference RTMPose model. + + Args: + sess (ort.InferenceSession): ONNXRuntime session. + img (np.ndarray): Input image in shape. + + Returns: + outputs (np.ndarray): Output of RTMPose model. + """ + # build input + input_img = [img.transpose(2, 0, 1).astype(np.float32)] + + # build output + sess_input = {sess.get_inputs()[0].name: input_img} + sess_output = [] + for out in sess.get_outputs(): + sess_output.append(out.name) + + # inference + outputs = sess.run(output_names=sess_output, input_feed=sess_input) + + return outputs + + +def postprocess(outputs: List[np.ndarray], + origin_shape: Tuple[int, int]) -> np.ndarray: + """Postprocess outputs of PP_Mobileseg model. + + Args: + outputs (List[np.ndarray]): Outputs of PP_Mobileseg model. + origin_shape (Tuple[int, int]): Input size of PP_Mobileseg model. + + Returns: + seg_map (np.ndarray): Segmentation map. + """ + seg_map = outputs[0][0][0] + seg_map = cv2.resize(seg_map.astype(np.float32), origin_shape) + return seg_map + + +def visualize(img: np.ndarray, + seg_map: np.ndarray, + filename: str = 'output.jpg', + opacity: float = 0.8) -> np.ndarray: + assert 0.0 <= opacity <= 1.0, 'opacity should be in range [0, 1]' + palette = np.array(PALETTE) + color_seg = np.zeros((seg_map.shape[0], seg_map.shape[1], 3), + dtype=np.uint8) + for label, color in enumerate(palette): + color_seg[seg_map == label, :] = color + # convert to BGR + color_seg = color_seg[..., ::-1] + + img = img * (1 - opacity) + color_seg * opacity + cv2.imwrite(filename, img) + + return img + + +def main(): + args = parse_args() + logger.info('Start running model inference...') + + # read image from file + logger.info(f'1. Read image from file {args.image_file}...') + img = cv2.imread(args.image_file) + + # build onnx model + logger.info(f'2. Build onnx model from {args.onnx_file}...') + sess = build_session(args.onnx_file, args.device) + + # preprocess + logger.info('3. Preprocess image...') + model_input_size = tuple(args.input_size) + assert len(model_input_size) == 2 + resized_img, origin_shape = preprocess(img, model_input_size) + + # inference + logger.info('4. Inference...') + start = time.time() + outputs = inference(sess, resized_img) + logger.info(f'Inference time: {time.time() - start:.4f}s') + + # postprocess + logger.info('5. Postprocess...') + h, w = origin_shape + seg_map = postprocess(outputs, (w, h)) + + # visualize + logger.info('6. Visualize...') + visualize(img, seg_map, args.save_path) + + logger.info('Done...') + + +PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]] + +if __name__ == '__main__': + main() diff --git a/mmsegmentation/projects/sam_inference_demo/README.md b/mmsegmentation/projects/sam_inference_demo/README.md new file mode 100644 index 0000000..f8077b8 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/README.md @@ -0,0 +1,40 @@ +# Introducing the Segment Anything Model (SAM) Inference Demo! + +Welcome to the Segment Anything (SA) Inference Demo, a user-friendly implementation based on the original Segment Anything project. Our demo allows you to experience the power and versatility of the Segment Anything Model (SAM) through an easy-to-use API. + +With this inference demo, you can explore the capabilities of the Segment Anything Model and witness its effectiveness in various tasks and image distributions. For more information on the original project, dataset, and model, please visit the official website at https://segment-anything.com. + +### Prerequisites + +- Python 3.10 +- PyTorch 1.13 +- MMEngine >= v0.7.2 +- MMCV >= v2.0.0 + +### Installation + +We assume that you have already installed PyTorch. If not, please follow the instructions on the [PyTorch website](https://pytorch.org/). + +**1. Install MMEngine & MMCV** + +```shell +pip install openmim +mim install mmengine +mim install 'mmcv>=2.0.0' +``` + +**2. Install MMPretrain** + +```shell +pip install git+https://github.com/open-mmlab/mmpretrain.git@dev +``` + +**3. Install MMSegmentation** + +```shell +pip install mmsegmentation +``` + +### Usage + +Open the `sam_image_demo.ipynb` notebook and follow the instructions to run the demo. diff --git a/mmsegmentation/projects/sam_inference_demo/sam/__init__.py b/mmsegmentation/projects/sam_inference_demo/sam/__init__.py new file mode 100644 index 0000000..82b6b78 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/__init__.py @@ -0,0 +1,2 @@ +from .modeling import * # noqa +from .utils import * # noqa diff --git a/mmsegmentation/projects/sam_inference_demo/sam/modeling/__init__.py b/mmsegmentation/projects/sam_inference_demo/sam/modeling/__init__.py new file mode 100644 index 0000000..9892a6b --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/modeling/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from .mask_decoder import MaskDecoder +from .prompt_encoder import PromptEncoder +from .sam import SAM +from .transformer import TwoWayTransformer + +__all__ = ['SAM', 'MaskDecoder', 'PromptEncoder', 'TwoWayTransformer'] diff --git a/mmsegmentation/projects/sam_inference_demo/sam/modeling/common.py b/mmsegmentation/projects/sam_inference_demo/sam/modeling/common.py new file mode 100644 index 0000000..d289276 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/modeling/common.py @@ -0,0 +1,45 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Type + +import torch +import torch.nn as nn + + +class MLPBlock(nn.Module): + + def __init__( + self, + embedding_dim: int, + mlp_dim: int, + act: Type[nn.Module] = nn.GELU, + ) -> None: + super().__init__() + self.lin1 = nn.Linear(embedding_dim, mlp_dim) + self.lin2 = nn.Linear(mlp_dim, embedding_dim) + self.act = act() + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return self.lin2(self.act(self.lin1(x))) + + +# From https://github.com/facebookresearch/detectron2/blob/main/detectron2/layers/batch_norm.py # noqa +# Itself from https://github.com/facebookresearch/ConvNeXt/blob/d1fa8f6fef0a165b27399986cc2bdacc92777e40/models/convnext.py#L119 # noqa +class LayerNorm2d(nn.Module): + + def __init__(self, num_channels: int, eps: float = 1e-6) -> None: + super().__init__() + self.weight = nn.Parameter(torch.ones(num_channels)) + self.bias = nn.Parameter(torch.zeros(num_channels)) + self.eps = eps + + def forward(self, x: torch.Tensor) -> torch.Tensor: + u = x.mean(1, keepdim=True) + s = (x - u).pow(2).mean(1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.eps) + x = self.weight[:, None, None] * x + self.bias[:, None, None] + return x diff --git a/mmsegmentation/projects/sam_inference_demo/sam/modeling/mask_decoder.py b/mmsegmentation/projects/sam_inference_demo/sam/modeling/mask_decoder.py new file mode 100644 index 0000000..9ad616b --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/modeling/mask_decoder.py @@ -0,0 +1,196 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# Borrowed from https://github.com/facebookresearch/segment-anything + +from typing import List, Tuple + +import torch +from torch import Tensor, nn +from torch.nn import functional as F + +from mmseg.registry import MODELS +from .common import LayerNorm2d + + +@MODELS.register_module() +class MaskDecoder(nn.Module): + + def __init__( + self, + *, + transformer_dim: int, + transformer: dict, + num_multimask_outputs: int = 3, + act_cfg: dict = dict(type='GELU'), + iou_head_depth: int = 3, + iou_head_hidden_dim: int = 256, + ) -> None: + """Predicts masks given an image and prompt embeddings, using a + tranformer architecture. + + Borrowed from https://github.com/facebookresearch/segment-anything + + Arguments: + transformer_dim (int): the channel dimension of the transformer + transformer (nn.Module): the transformer used to predict masks + num_multimask_outputs (int): the number of masks to predict + when disambiguating masks + activation (nn.Module): the type of activation to use when + upscaling masks + iou_head_depth (int): the depth of the MLP used to predict + mask quality + iou_head_hidden_dim (int): the hidden dimension of the MLP + used to predict mask quality + """ + super().__init__() + self.transformer_dim = transformer_dim + self.transformer = MODELS.build(transformer) + + self.num_multimask_outputs = num_multimask_outputs + + self.iou_token = nn.Embedding(1, transformer_dim) + self.num_mask_tokens = num_multimask_outputs + 1 + self.mask_tokens = nn.Embedding(self.num_mask_tokens, transformer_dim) + + activation = MODELS.build(act_cfg) + self.output_upscaling = nn.Sequential( + nn.ConvTranspose2d( + transformer_dim, transformer_dim // 4, kernel_size=2, + stride=2), + LayerNorm2d(transformer_dim // 4), + activation, + nn.ConvTranspose2d( + transformer_dim // 4, + transformer_dim // 8, + kernel_size=2, + stride=2), + activation, + ) + self.output_hypernetworks_mlps = nn.ModuleList([ + MLP(transformer_dim, transformer_dim, transformer_dim // 8, 3) + for i in range(self.num_mask_tokens) + ]) + + self.iou_prediction_head = MLP(transformer_dim, iou_head_hidden_dim, + self.num_mask_tokens, iou_head_depth) + + def forward( + self, + image_embeddings: Tensor, + image_pe: Tensor, + sparse_prompt_embeddings: Tensor, + dense_prompt_embeddings: Tensor, + multimask_output: bool, + ) -> Tuple[Tensor, Tensor]: + """Predict masks given image and prompt embeddings. + + Borrowed from https://github.com/facebookresearch/segment-anything + + Arguments: + image_embeddings (Tensor): the embeddings from the image encoder + image_pe (Tensor): positional encoding with the shape of + image_embeddings + sparse_prompt_embeddings (Tensor): the embeddings of + the points and boxes + dense_prompt_embeddings (Tensor): the embeddings of the mask inputs + multimask_output (bool): Whether to return multiple masks or a single + mask. + + Returns: + Tensor: batched predicted masks + Tensor: batched predictions of mask quality + """ + masks, iou_pred = self.predict_masks( + image_embeddings=image_embeddings, + image_pe=image_pe, + sparse_prompt_embeddings=sparse_prompt_embeddings, + dense_prompt_embeddings=dense_prompt_embeddings, + ) + + # Select the correct mask or masks for output + if multimask_output: + mask_slice = slice(1, None) + else: + mask_slice = slice(0, 1) + masks = masks[:, mask_slice, :, :] + iou_pred = iou_pred[:, mask_slice] + + # Prepare output + return masks, iou_pred + + def predict_masks( + self, + image_embeddings: Tensor, + image_pe: Tensor, + sparse_prompt_embeddings: Tensor, + dense_prompt_embeddings: Tensor, + ) -> Tuple[Tensor, Tensor]: + """Predicts masks. + + See 'forward' for more details. + """ + # Concatenate output tokens + output_tokens = torch.cat( + [self.iou_token.weight, self.mask_tokens.weight], dim=0) + output_tokens = output_tokens.unsqueeze(0).expand( + sparse_prompt_embeddings.size(0), -1, -1) + tokens = torch.cat((output_tokens, sparse_prompt_embeddings), dim=1) + + # Expand per-image data in batch direction to be per-mask + src = torch.repeat_interleave(image_embeddings, tokens.shape[0], dim=0) + src = src + dense_prompt_embeddings + pos_src = torch.repeat_interleave(image_pe, tokens.shape[0], dim=0) + b, c, h, w = src.shape + + # Run the transformer + hs, src = self.transformer(src, pos_src, tokens) + iou_token_out = hs[:, 0, :] + mask_tokens_out = hs[:, 1:(1 + self.num_mask_tokens), :] + + # Upscale mask embeddings and predict masks using the mask tokens + src = src.transpose(1, 2).view(b, c, h, w) + upscaled_embedding = self.output_upscaling(src) + hyper_in_list: List[Tensor] = [] + for i in range(self.num_mask_tokens): + hyper_in_list.append(self.output_hypernetworks_mlps[i]( + mask_tokens_out[:, i, :])) + hyper_in = torch.stack(hyper_in_list, dim=1) + b, c, h, w = upscaled_embedding.shape + masks = (hyper_in @ upscaled_embedding.view(b, c, h * w)).view( + b, -1, h, w) + + # Generate mask quality predictions + iou_pred = self.iou_prediction_head(iou_token_out) + + return masks, iou_pred + + +# Lightly adapted from +# https://github.com/facebookresearch/MaskFormer/blob/main/mask_former/modeling/transformer/transformer_predictor.py # noqa +class MLP(nn.Module): + + def __init__( + self, + input_dim: int, + hidden_dim: int, + output_dim: int, + num_layers: int, + sigmoid_output: bool = False, + ) -> None: + super().__init__() + self.num_layers = num_layers + h = [hidden_dim] * (num_layers - 1) + self.layers = nn.ModuleList( + nn.Linear(n, k) for n, k in zip([input_dim] + h, h + [output_dim])) + self.sigmoid_output = sigmoid_output + + def forward(self, x): + for i, layer in enumerate(self.layers): + x = F.relu(layer(x)) if i < self.num_layers - 1 else layer(x) + if self.sigmoid_output: + x = F.sigmoid(x) + return x diff --git a/mmsegmentation/projects/sam_inference_demo/sam/modeling/prompt_encoder.py b/mmsegmentation/projects/sam_inference_demo/sam/modeling/prompt_encoder.py new file mode 100644 index 0000000..6b7c083 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/modeling/prompt_encoder.py @@ -0,0 +1,227 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# Borrowed from https://github.com/facebookresearch/segment-anything + +from typing import Any, Optional, Tuple, Type + +import numpy as np +import torch +from torch import nn + +from mmseg.registry import MODELS +from .common import LayerNorm2d + + +@MODELS.register_module() +class PromptEncoder(nn.Module): + + def __init__( + self, + embed_dim: int, + image_embedding_size: Tuple[int, int], + input_image_size: Tuple[int, int], + mask_in_chans: int, + activation: Type[nn.Module] = nn.GELU, + ) -> None: + """Encodes prompts for input to SAM's mask decoder. + + Arguments: + embed_dim (int): The prompts' embedding dimension + image_embedding_size (tuple(int, int)): The spatial size of the + image embedding, as (H, W). + input_image_size (int): The padded size of the image as input + to the image encoder, as (H, W). + mask_in_chans (int): The number of hidden channels used for + encoding input masks. + activation (nn.Module): The activation to use when encoding + input masks. + """ + super().__init__() + self.embed_dim = embed_dim + self.input_image_size = input_image_size + self.image_embedding_size = image_embedding_size + self.pe_layer = PositionEmbeddingRandom(embed_dim // 2) + + self.num_point_embeddings: int = 4 # pos/neg point + 2 box corners + point_embeddings = [ + nn.Embedding(1, embed_dim) + for i in range(self.num_point_embeddings) + ] + self.point_embeddings = nn.ModuleList(point_embeddings) + self.not_a_point_embed = nn.Embedding(1, embed_dim) + + self.mask_input_size = (4 * image_embedding_size[0], + 4 * image_embedding_size[1]) + self.mask_downscaling = nn.Sequential( + nn.Conv2d(1, mask_in_chans // 4, kernel_size=2, stride=2), + LayerNorm2d(mask_in_chans // 4), + activation(), + nn.Conv2d( + mask_in_chans // 4, mask_in_chans, kernel_size=2, stride=2), + LayerNorm2d(mask_in_chans), + activation(), + nn.Conv2d(mask_in_chans, embed_dim, kernel_size=1), + ) + self.no_mask_embed = nn.Embedding(1, embed_dim) + + def get_dense_pe(self) -> torch.Tensor: + """Returns the positional encoding used to encode point prompts, + applied to a dense set of points the shape of the image encoding. + + Returns: + torch.Tensor: Positional encoding with shape + 1x(embed_dim)x(embedding_h)x(embedding_w) + """ + return self.pe_layer(self.image_embedding_size).unsqueeze(0) + + def _embed_points( + self, + points: torch.Tensor, + labels: torch.Tensor, + pad: bool, + ) -> torch.Tensor: + """Embeds point prompts.""" + points = points + 0.5 # Shift to center of pixel + if pad: + padding_point = torch.zeros((points.shape[0], 1, 2), + device=points.device) + padding_label = -torch.ones( + (labels.shape[0], 1), device=labels.device) + points = torch.cat([points, padding_point], dim=1) + labels = torch.cat([labels, padding_label], dim=1) + point_embedding = self.pe_layer.forward_with_coords( + points, self.input_image_size) + point_embedding[labels == -1] = 0.0 + point_embedding[labels == -1] += self.not_a_point_embed.weight + point_embedding[labels == 0] += self.point_embeddings[0].weight + point_embedding[labels == 1] += self.point_embeddings[1].weight + return point_embedding + + def _embed_boxes(self, boxes: torch.Tensor) -> torch.Tensor: + """Embeds box prompts.""" + boxes = boxes + 0.5 # Shift to center of pixel + coords = boxes.reshape(-1, 2, 2) + corner_embedding = self.pe_layer.forward_with_coords( + coords, self.input_image_size) + corner_embedding[:, 0, :] += self.point_embeddings[2].weight + corner_embedding[:, 1, :] += self.point_embeddings[3].weight + return corner_embedding + + def _embed_masks(self, masks: torch.Tensor) -> torch.Tensor: + """Embeds mask inputs.""" + mask_embedding = self.mask_downscaling(masks) + return mask_embedding + + def _get_batch_size( + self, + points: Optional[Tuple[torch.Tensor, torch.Tensor]], + boxes: Optional[torch.Tensor], + masks: Optional[torch.Tensor], + ) -> int: + """Gets the batch size of the output given the batch size of the input + prompts.""" + if points is not None: + return points[0].shape[0] + elif boxes is not None: + return boxes.shape[0] + elif masks is not None: + return masks.shape[0] + else: + return 1 + + def _get_device(self) -> torch.device: + return self.point_embeddings[0].weight.device + + def forward( + self, + points: Optional[Tuple[torch.Tensor, torch.Tensor]], + boxes: Optional[torch.Tensor], + masks: Optional[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Embeds different types of prompts, returning both sparse and dense + embeddings. + + Arguments: + points (tuple(torch.Tensor, torch.Tensor) or none): point coordinates + and labels to embed. + boxes (torch.Tensor or none): boxes to embed + masks (torch.Tensor or none): masks to embed + + Returns: + torch.Tensor: sparse embeddings for the points and boxes, with shape + BxNx(embed_dim), where N is determined by the number of input points + and boxes. + torch.Tensor: dense embeddings for the masks, in the shape + Bx(embed_dim)x(embed_H)x(embed_W) + """ # noqa + bs = self._get_batch_size(points, boxes, masks) + sparse_embeddings = torch.empty((bs, 0, self.embed_dim), + device=self._get_device()) + if points is not None: + coords, labels = points + point_embeddings = self._embed_points( + coords, labels, pad=(boxes is None)) + sparse_embeddings = torch.cat( + [sparse_embeddings, point_embeddings], dim=1) + if boxes is not None: + box_embeddings = self._embed_boxes(boxes) + sparse_embeddings = torch.cat([sparse_embeddings, box_embeddings], + dim=1) + + if masks is not None: + dense_embeddings = self._embed_masks(masks) + else: + dense_embeddings = self.no_mask_embed.weight.reshape( + 1, -1, 1, 1).expand(bs, -1, self.image_embedding_size[0], + self.image_embedding_size[1]) + + return sparse_embeddings, dense_embeddings + + +class PositionEmbeddingRandom(nn.Module): + """Positional encoding using random spatial frequencies.""" + + def __init__(self, + num_pos_feats: int = 64, + scale: Optional[float] = None) -> None: + super().__init__() + if scale is None or scale <= 0.0: + scale = 1.0 + self.register_buffer( + 'positional_encoding_gaussian_matrix', + scale * torch.randn((2, num_pos_feats)), + ) + + def _pe_encoding(self, coords: torch.Tensor) -> torch.Tensor: + """Positionally encode points that are normalized to [0,1].""" + # assuming coords are in [0, 1]^2 square and have d_1 x ... x d_n x 2 shape # noqa + coords = 2 * coords - 1 + coords = coords @ self.positional_encoding_gaussian_matrix + coords = 2 * np.pi * coords + # outputs d_1 x ... x d_n x C shape + return torch.cat([torch.sin(coords), torch.cos(coords)], dim=-1) + + def forward(self, size: Tuple[int, int]) -> torch.Tensor: + """Generate positional encoding for a grid of the specified size.""" + h, w = size + device: Any = self.positional_encoding_gaussian_matrix.device + grid = torch.ones((h, w), device=device, dtype=torch.float32) + y_embed = grid.cumsum(dim=0) - 0.5 + x_embed = grid.cumsum(dim=1) - 0.5 + y_embed = y_embed / h + x_embed = x_embed / w + + pe = self._pe_encoding(torch.stack([x_embed, y_embed], dim=-1)) + return pe.permute(2, 0, 1) # C x H x W + + def forward_with_coords(self, coords_input: torch.Tensor, + image_size: Tuple[int, int]) -> torch.Tensor: + """Positionally encode points that are not normalized to [0,1].""" + coords = coords_input.clone() + coords[:, :, 0] = coords[:, :, 0] / image_size[1] + coords[:, :, 1] = coords[:, :, 1] / image_size[0] + return self._pe_encoding(coords.to(torch.float)) # B x N x C diff --git a/mmsegmentation/projects/sam_inference_demo/sam/modeling/sam.py b/mmsegmentation/projects/sam_inference_demo/sam/modeling/sam.py new file mode 100644 index 0000000..c61c1ec --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/modeling/sam.py @@ -0,0 +1,188 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# Borrowed from https://github.com/facebookresearch/segment-anything + +from typing import Any, Dict, List, Tuple + +import torch +from torch import nn +from torch.nn import functional as F + +from mmseg.registry import MODELS +from .mask_decoder import MaskDecoder +from .prompt_encoder import PromptEncoder + + +@MODELS.register_module() +class SAM(nn.Module): + mask_threshold: float = 0.0 + image_format: str = 'RGB' + + def __init__( + self, + image_encoder_cfg: dict, + prompt_encoder_cfg: dict, + mask_decoder_cfg: dict, + pixel_mean: List[float] = [123.675, 116.28, 103.53], + pixel_std: List[float] = [58.395, 57.12, 57.375], + ) -> None: + """SAM predicts object masks from an image and input prompts. Borrowed + from https://github.com/facebookresearch/segment-anything. + + Arguments: + image_encoder (ViTSAM): The backbone used to encode the + image into image embeddings that allow for efficient mask + prediction. + prompt_encoder (PromptEncoder): Encodes various types of input + prompts. + mask_decoder (MaskDecoder): Predicts masks from the image embeddings + and encoded prompts. + pixel_mean (list(float)): Mean values for normalizing pixels in the + input image. + pixel_std (list(float)): Std values for normalizing pixels in the + input image. + """ + super().__init__() + self.image_encoder = MODELS.build(image_encoder_cfg) + self.prompt_encoder: PromptEncoder = MODELS.build(prompt_encoder_cfg) + self.mask_decoder: MaskDecoder = MODELS.build(mask_decoder_cfg) + self.register_buffer('pixel_mean', + torch.Tensor(pixel_mean).view(-1, 1, 1), False) + self.register_buffer('pixel_std', + torch.Tensor(pixel_std).view(-1, 1, 1), False) + + @property + def device(self) -> Any: + return self.pixel_mean.device + + @torch.no_grad() + def forward( + self, + batched_input: List[Dict[str, Any]], + multimask_output: bool, + ) -> List[Dict[str, torch.Tensor]]: + """Predicts masks end-to-end from provided images and prompts. If + prompts are not known in advance, using SamPredictor is recommended + over calling the model directly. + + Borrowed from https://github.com/facebookresearch/segment-anything + + Arguments: + batched_input (list(dict)): A list over input images, each a + dictionary with the following keys. A prompt key can be + excluded if it is not present. + 'image': The image as a torch tensor in 3xHxW format, + already transformed for input to the model. + 'original_size': (tuple(int, int)) The original size of + the image before transformation, as (H, W). + 'point_coords': (torch.Tensor) Batched point prompts for + this image, with shape BxNx2. Already transformed to the + input frame of the model. + 'point_labels': (torch.Tensor) Batched labels for point prompts, + with shape BxN. + 'boxes': (torch.Tensor) Batched box inputs, with shape Bx4. + Already transformed to the input frame of the model. + 'mask_inputs': (torch.Tensor) Batched mask inputs to the model, + in the form Bx1xHxW. + multimask_output (bool): Whether the model should predict multiple + disambiguating masks, or return a single mask. + + Returns: + (list(dict)): A list over input images, where each element is + as dictionary with the following keys. + 'masks': (torch.Tensor) Batched binary mask predictions, + with shape BxCxHxW, where B is the number of input prompts, + C is determiend by multimask_output, and (H, W) is the + original size of the image. + 'iou_predictions': (torch.Tensor) The model's predictions + of mask quality, in shape BxC. + 'low_res_logits': (torch.Tensor) Low resolution logits with + shape BxCxHxW, where H=W=256. Can be passed as mask input + to subsequent iterations of prediction. + """ + input_images = torch.stack( + [self.preprocess(x['image']) for x in batched_input], dim=0) + image_embeddings = self.image_encoder(input_images) + + outputs = [] + for image_record, curr_embedding in zip(batched_input, + image_embeddings): + if 'point_coords' in image_record: + points = (image_record['point_coords'], + image_record['point_labels']) + else: + points = None + sparse_embeddings, dense_embeddings = self.prompt_encoder( + points=points, + boxes=image_record.get('boxes', None), + masks=image_record.get('mask_inputs', None), + ) + low_res_masks, iou_predictions = self.mask_decoder( + image_embeddings=curr_embedding.unsqueeze(0), + image_pe=self.prompt_encoder.get_dense_pe(), + sparse_prompt_embeddings=sparse_embeddings, + dense_prompt_embeddings=dense_embeddings, + multimask_output=multimask_output, + ) + masks = self.postprocess_masks( + low_res_masks, + input_size=image_record['image'].shape[-2:], + original_size=image_record['original_size'], + ) + masks = masks > self.mask_threshold + outputs.append({ + 'masks': masks, + 'iou_predictions': iou_predictions, + 'low_res_logits': low_res_masks, + }) + return outputs + + def postprocess_masks( + self, + masks: torch.Tensor, + input_size: Tuple[int, ...], + original_size: Tuple[int, ...], + ) -> torch.Tensor: + """Remove padding and upscale masks to the original image size. + + Borrowed from https://github.com/facebookresearch/segment-anything + + Arguments: + masks (torch.Tensor): Batched masks from the mask_decoder, + in BxCxHxW format. + input_size (tuple(int, int)): The size of the image input to the + model, in (H, W) format. Used to remove padding. + original_size (tuple(int, int)): The original size of the image + before resizing for input to the model, in (H, W) format. + + Returns: + (torch.Tensor): Batched masks in BxCxHxW format, where (H, W) + is given by original_size. + """ + masks = F.interpolate( + masks, + self.image_encoder.img_size, + mode='bilinear', + align_corners=False, + ) + masks = masks[..., :input_size[0], :input_size[1]] + masks = F.interpolate( + masks, original_size, mode='bilinear', align_corners=False) + return masks + + def preprocess(self, x: torch.Tensor) -> torch.Tensor: + """Normalize pixel values and pad to a square input.""" + # Normalize colors + x = (x - self.pixel_mean) / self.pixel_std + + # Pad + h, w = x.shape[-2:] + img_size = max(self.image_encoder.img_size) + padh = img_size - h + padw = img_size - w + x = F.pad(x, (0, padw, 0, padh)) + return x diff --git a/mmsegmentation/projects/sam_inference_demo/sam/modeling/transformer.py b/mmsegmentation/projects/sam_inference_demo/sam/modeling/transformer.py new file mode 100644 index 0000000..c56f602 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/modeling/transformer.py @@ -0,0 +1,241 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Tuple, Type + +import torch +from torch import Tensor, nn + +from mmseg.registry import MODELS +from .common import MLPBlock + + +@MODELS.register_module() +class TwoWayTransformer(nn.Module): + + def __init__( + self, + depth: int, + embedding_dim: int, + num_heads: int, + mlp_dim: int, + activation: Type[nn.Module] = nn.ReLU, + attention_downsample_rate: int = 2, + ) -> None: + """A transformer decoder that attends to an input image using queries + whose positional embedding is supplied. + + Args: + depth (int): number of layers in the transformer + embedding_dim (int): the channel dimension for the input embeddings + num_heads (int): the number of heads for multihead attention. Must + divide embedding_dim + mlp_dim (int): the channel dimension internal to the MLP block + activation (nn.Module): the activation to use in the MLP block + """ + super().__init__() + self.depth = depth + self.embedding_dim = embedding_dim + self.num_heads = num_heads + self.mlp_dim = mlp_dim + self.layers = nn.ModuleList() + + for i in range(depth): + self.layers.append( + TwoWayAttentionBlock( + embedding_dim=embedding_dim, + num_heads=num_heads, + mlp_dim=mlp_dim, + activation=activation, + attention_downsample_rate=attention_downsample_rate, + skip_first_layer_pe=(i == 0), + )) + + self.final_attn_token_to_image = Attention( + embedding_dim, + num_heads, + downsample_rate=attention_downsample_rate) + self.norm_final_attn = nn.LayerNorm(embedding_dim) + + def forward( + self, + image_embedding: Tensor, + image_pe: Tensor, + point_embedding: Tensor, + ) -> Tuple[Tensor, Tensor]: + """ + Args: + image_embedding (torch.Tensor): image to attend to. Should be shape + B x embedding_dim x h x w for any h and w. + image_pe (torch.Tensor): the positional encoding to add to the image. Must + have the same shape as image_embedding. + point_embedding (torch.Tensor): the embedding to add to the query points. + Must have shape B x N_points x embedding_dim for any N_points. + + Returns: + torch.Tensor: the processed point_embedding + torch.Tensor: the processed image_embedding + """ # noqa E501 + # BxCxHxW -> BxHWxC == B x N_image_tokens x C + bs, c, h, w = image_embedding.shape + image_embedding = image_embedding.flatten(2).permute(0, 2, 1) + image_pe = image_pe.flatten(2).permute(0, 2, 1) + + # Prepare queries + queries = point_embedding + keys = image_embedding + + # Apply transformer blocks and final layernorm + for layer in self.layers: + queries, keys = layer( + queries=queries, + keys=keys, + query_pe=point_embedding, + key_pe=image_pe, + ) + + # Apply the final attenion layer from the points to the image + q = queries + point_embedding + k = keys + image_pe + attn_out = self.final_attn_token_to_image(q=q, k=k, v=keys) + queries = queries + attn_out + queries = self.norm_final_attn(queries) + + return queries, keys + + +class TwoWayAttentionBlock(nn.Module): + + def __init__( + self, + embedding_dim: int, + num_heads: int, + mlp_dim: int = 2048, + activation: Type[nn.Module] = nn.ReLU, + attention_downsample_rate: int = 2, + skip_first_layer_pe: bool = False, + ) -> None: + """A transformer block with four layers: (1) self-attention of sparse + inputs, (2) cross attention of sparse inputs to dense inputs, (3) mlp + block on sparse inputs, and (4) cross attention of dense inputs to + sparse inputs. + + Arguments: + embedding_dim (int): the channel dimension of the embeddings + num_heads (int): the number of heads in the attention layers + mlp_dim (int): the hidden dimension of the mlp block + activation (nn.Module): the activation of the mlp block + skip_first_layer_pe (bool): skip the PE on the first layer + """ + super().__init__() + self.self_attn = Attention(embedding_dim, num_heads) + self.norm1 = nn.LayerNorm(embedding_dim) + + self.cross_attn_token_to_image = Attention( + embedding_dim, + num_heads, + downsample_rate=attention_downsample_rate) + self.norm2 = nn.LayerNorm(embedding_dim) + + self.mlp = MLPBlock(embedding_dim, mlp_dim, activation) + self.norm3 = nn.LayerNorm(embedding_dim) + + self.norm4 = nn.LayerNorm(embedding_dim) + self.cross_attn_image_to_token = Attention( + embedding_dim, + num_heads, + downsample_rate=attention_downsample_rate) + + self.skip_first_layer_pe = skip_first_layer_pe + + def forward(self, queries: Tensor, keys: Tensor, query_pe: Tensor, + key_pe: Tensor) -> Tuple[Tensor, Tensor]: + # Self attention block + if self.skip_first_layer_pe: + queries = self.self_attn(q=queries, k=queries, v=queries) + else: + q = queries + query_pe + attn_out = self.self_attn(q=q, k=q, v=queries) + queries = queries + attn_out + queries = self.norm1(queries) + + # Cross attention block, tokens attending to image embedding + q = queries + query_pe + k = keys + key_pe + attn_out = self.cross_attn_token_to_image(q=q, k=k, v=keys) + queries = queries + attn_out + queries = self.norm2(queries) + + # MLP block + mlp_out = self.mlp(queries) + queries = queries + mlp_out + queries = self.norm3(queries) + + # Cross attention block, image embedding attending to tokens + q = queries + query_pe + k = keys + key_pe + attn_out = self.cross_attn_image_to_token(q=k, k=q, v=queries) + keys = keys + attn_out + keys = self.norm4(keys) + + return queries, keys + + +class Attention(nn.Module): + """An attention layer that allows for downscaling the size of the embedding + after projection to queries, keys, and values.""" + + def __init__( + self, + embedding_dim: int, + num_heads: int, + downsample_rate: int = 1, + ) -> None: + super().__init__() + self.embedding_dim = embedding_dim + self.internal_dim = embedding_dim // downsample_rate + self.num_heads = num_heads + assert self.internal_dim % num_heads == 0, 'num_heads must divide embedding_dim.' # noqa E501 + + self.q_proj = nn.Linear(embedding_dim, self.internal_dim) + self.k_proj = nn.Linear(embedding_dim, self.internal_dim) + self.v_proj = nn.Linear(embedding_dim, self.internal_dim) + self.out_proj = nn.Linear(self.internal_dim, embedding_dim) + + def _separate_heads(self, x: Tensor, num_heads: int) -> Tensor: + b, n, c = x.shape + x = x.reshape(b, n, num_heads, c // num_heads) + return x.transpose(1, 2) # B x N_heads x N_tokens x C_per_head + + def _recombine_heads(self, x: Tensor) -> Tensor: + b, n_heads, n_tokens, c_per_head = x.shape + x = x.transpose(1, 2) + return x.reshape(b, n_tokens, n_heads * c_per_head) # B x N_tokens x C + + def forward(self, q: Tensor, k: Tensor, v: Tensor) -> Tensor: + # Input projections + q = self.q_proj(q) + k = self.k_proj(k) + v = self.v_proj(v) + + # Separate into heads + q = self._separate_heads(q, self.num_heads) + k = self._separate_heads(k, self.num_heads) + v = self._separate_heads(v, self.num_heads) + + # Attention + _, _, _, c_per_head = q.shape + attn = q @ k.permute(0, 1, 3, 2) # B x N_heads x N_tokens x N_tokens + attn = attn / math.sqrt(c_per_head) + attn = torch.softmax(attn, dim=-1) + + # Get output + out = attn @ v + out = self._recombine_heads(out) + out = self.out_proj(out) + + return out diff --git a/mmsegmentation/projects/sam_inference_demo/sam/sam_inferencer.py b/mmsegmentation/projects/sam_inference_demo/sam/sam_inferencer.py new file mode 100644 index 0000000..2da2e95 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/sam_inferencer.py @@ -0,0 +1,688 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Any, Dict, List, Optional, Tuple + +import numpy as np +import torch +from mmengine.runner.checkpoint import load_checkpoint +# yapf: disable +from sam.utils import (MaskData, area_from_rle, batch_iterator, + batched_mask_to_box, box_xyxy_to_xywh, + build_all_layer_point_grids, calculate_stability_score, + coco_encode_rle, generate_crop_boxes, + is_box_near_crop_edge, mask_to_rle_pytorch, + remove_small_regions, rle_to_mask, uncrop_boxes_xyxy, + uncrop_masks, uncrop_points) +from torchvision.ops.boxes import batched_nms, box_area + +from mmseg.registry import MODELS, TRANSFORMS + +# yapf: enable + +model_zoo = { + 'base': + 'https://download.openmmlab.com/mmsegmentation/v0.5/sam/sam_vit-base-p16_3rdparty_sa1b-1024x1024_20230413-78a25eed.pth', # noqa + 'large': + 'https://download.openmmlab.com/mmsegmentation/v0.5/sam/sam_vit-large-p16_3rdparty_sa1b-1024x1024_20230413-940520da.pth', # noqa + 'huge': + 'https://download.openmmlab.com/mmsegmentation/v0.5/sam/sam_vit-huge-p16_3rdparty_sa1b-1024x1024_20230413-faaf96f6.pth', # noqa +} + + +class SAMInferencer: + + def __init__(self, arch: str = 'base') -> None: + assert arch in ['base', 'large', 'huge'] + self.model = self.init_model(arch) + self.transform = TRANSFORMS.build( + dict( + type='ResizeLongestSide', + target_length=max(self.model.image_encoder.img_size))) + + def set_image( + self, + image: np.ndarray, + image_format: str = 'RGB', + ) -> None: + """Calculates the image embeddings for the provided image, allowing + masks to be predicted with the 'predict' method. + + Arguments: + image (np.ndarray): The image for calculating masks. Expects an + image in HWC uint8 format, with pixel values in [0, 255]. + image_format (str): The color format of the image, in ['RGB', 'BGR']. + """ + assert image_format in [ + 'RGB', + 'BGR', + ], f"image_format must be in ['RGB', 'BGR'], is {image_format}." + if image_format != self.model.image_format: + image = image[..., ::-1] + + # Transform the image to the form expected by the model + input_image = self.transform.apply_image(image) + input_image_torch = torch.as_tensor(input_image, device=self.device) + input_image_torch = input_image_torch.permute( + 2, 0, 1).contiguous()[None, :, :, :] + + self.set_torch_image(input_image_torch, image.shape[:2]) + + @torch.no_grad() + def set_torch_image( + self, + transformed_image: torch.Tensor, + original_image_size: Tuple[int, ...], + ) -> None: + """Calculates the image embeddings for the provided image, allowing + masks to be predicted with the 'predict' method. Expects the input + image to be already transformed to the format expected by the model. + + Arguments: + transformed_image (torch.Tensor): The input image, with shape + 1x3xHxW, which has been transformed with ResizeLongestSide. + original_image_size (tuple(int, int)): The size of the image + before transformation, in (H, W) format. + """ + assert (len(transformed_image.shape) == 4 + and transformed_image.shape[1] == 3 + and max(*transformed_image.shape[2:]) == max( + self.model.image_encoder.img_size) + ), 'set_torch_image input must be BCHW with long side' + f' {self.model.image_encoder.img_size}.' + self.reset_image() + + self.original_size = original_image_size + self.input_size = tuple(transformed_image.shape[-2:]) + input_image = self.model.preprocess(transformed_image) + self.features = self.model.image_encoder(input_image)[0] + self.is_image_set = True + + def predict( + self, + point_coords: Optional[np.ndarray] = None, + point_labels: Optional[np.ndarray] = None, + box: Optional[np.ndarray] = None, + mask_input: Optional[np.ndarray] = None, + multimask_output: bool = True, + return_logits: bool = False, + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Predict masks for the given input prompts, using the currently set + image. + + Arguments: + point_coords (np.ndarray or None): A Nx2 array of point prompts to the + model. Each point is in (X,Y) in pixels. + point_labels (np.ndarray or None): A length N array of labels for the + point prompts. 1 indicates a foreground point and 0 indicates a + background point. + box (np.ndarray or None): A length 4 array given a box prompt to the + model, in XYXY format. + mask_input (np.ndarray): A low resolution mask input to the model, typically + coming from a previous prediction iteration. Has form 1xHxW, where + for SAM, H=W=256. + multimask_output (bool): If true, the model will return three masks. + For ambiguous input prompts (such as a single click), this will often + produce better masks than a single prediction. If only a single + mask is needed, the model's predicted quality score can be used + to select the best mask. For non-ambiguous prompts, such as multiple + input prompts, multimask_output=False can give better results. + return_logits (bool): If true, returns un-thresholded masks logits + instead of a binary mask. + + Returns: + (np.ndarray): The output masks in CxHxW format, where C is the + number of masks, and (H, W) is the original image size. + (np.ndarray): An array of length C containing the model's + predictions for the quality of each mask. + (np.ndarray): An array of shape CxHxW, where C is the number + of masks and H=W=256. These low resolution logits can be passed to + a subsequent iteration as mask input. + """ # noqa + if not self.is_image_set: + raise RuntimeError( + 'An image must be set with .set_image(...) before mask' + 'prediction.') + + # Transform input prompts + coords_torch = None + labels_torch = None + box_torch = None + mask_input_torch = None + + if point_coords is not None: + assert ( + point_labels is not None + ), 'point_labels must be supplied if point_coords is supplied.' + point_coords = self.transform.apply_coords(point_coords, + self.original_size) + coords_torch = torch.as_tensor( + point_coords, dtype=torch.float, device=self.device) + labels_torch = torch.as_tensor( + point_labels, dtype=torch.int, device=self.device) + coords_torch, labels_torch = coords_torch[ + None, :, :], labels_torch[None, :] + if box is not None: + box = self.transform.apply_boxes(box, self.original_size) + box_torch = torch.as_tensor( + box, dtype=torch.float, device=self.device) + box_torch = box_torch[None, :] + if mask_input is not None: + mask_input_torch = torch.as_tensor( + mask_input, dtype=torch.float, device=self.device) + mask_input_torch = mask_input_torch[None, :, :, :] + + masks, iou_predictions, low_res_masks = self.predict_torch( + coords_torch, + labels_torch, + box_torch, + mask_input_torch, + multimask_output, + return_logits=return_logits, + ) + + masks = masks[0].detach().cpu().numpy() + iou_predictions = iou_predictions[0].detach().cpu().numpy() + low_res_masks = low_res_masks[0].detach().cpu().numpy() + return masks, iou_predictions, low_res_masks + + @torch.no_grad() + def predict_torch( + self, + point_coords: Optional[torch.Tensor], + point_labels: Optional[torch.Tensor], + boxes: Optional[torch.Tensor] = None, + mask_input: Optional[torch.Tensor] = None, + multimask_output: bool = True, + return_logits: bool = False, + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Predict masks for the given input prompts, using the currently set + image. Input prompts are batched torch tensors and are expected to + already be transformed to the input frame using ResizeLongestSide. + + Arguments: + point_coords (torch.Tensor or None): A BxNx2 array of point prompts to the + model. Each point is in (X,Y) in pixels. + point_labels (torch.Tensor or None): A BxN array of labels for the + point prompts. 1 indicates a foreground point and 0 indicates a + background point. + box (np.ndarray or None): A Bx4 array given a box prompt to the + model, in XYXY format. + mask_input (np.ndarray): A low resolution mask input to the model, typically + coming from a previous prediction iteration. Has form Bx1xHxW, where + for SAM, H=W=256. Masks returned by a previous iteration of the + predict method do not need further transformation. + multimask_output (bool): If true, the model will return three masks. + For ambiguous input prompts (such as a single click), this will often + produce better masks than a single prediction. If only a single + mask is needed, the model's predicted quality score can be used + to select the best mask. For non-ambiguous prompts, such as multiple + input prompts, multimask_output=False can give better results. + return_logits (bool): If true, returns un-thresholded masks logits + instead of a binary mask. + + Returns: + (torch.Tensor): The output masks in BxCxHxW format, where C is the + number of masks, and (H, W) is the original image size. + (torch.Tensor): An array of shape BxC containing the model's + predictions for the quality of each mask. + (torch.Tensor): An array of shape BxCxHxW, where C is the number + of masks and H=W=256. These low res logits can be passed to + a subsequent iteration as mask input. + """ # noqa + if not self.is_image_set: + raise RuntimeError( + 'An image must be set with .set_image(...) before mask ' + 'prediction.') + + if point_coords is not None: + points = (point_coords, point_labels) + else: + points = None + + # Embed prompts + sparse_embeddings, dense_embeddings = self.model.prompt_encoder( + points=points, + boxes=boxes, + masks=mask_input, + ) + + # Predict masks + low_res_masks, iou_predictions = self.model.mask_decoder( + image_embeddings=self.features, + image_pe=self.model.prompt_encoder.get_dense_pe(), + sparse_prompt_embeddings=sparse_embeddings, + dense_prompt_embeddings=dense_embeddings, + multimask_output=multimask_output, + ) + + # Upscale the masks to the original image resolution + masks = self.model.postprocess_masks(low_res_masks, self.input_size, + self.original_size) + + if not return_logits: + masks = masks > self.model.mask_threshold + + return masks, iou_predictions, low_res_masks + + def get_image_embedding(self) -> torch.Tensor: + """Returns the image embeddings for the currently set image, with shape + 1xCxHxW, where C is the embedding dimension and (H,W) are the embedding + spatial dimension of SAM (typically C=256, H=W=64).""" + if not self.is_image_set: + raise RuntimeError( + 'An image must be set with .set_image(...) to generate an ' + 'embedding.') + assert self.features is not None, 'Features must exist if an image has' + ' been set.' + return self.features + + @property + def device(self) -> torch.device: + return self.model.device + + def reset_image(self) -> None: + """Resets the currently set image.""" + self.is_image_set = False + self.features = None + self.orig_h = None + self.orig_w = None + self.input_h = None + self.input_w = None + + def init_model(self, arch: str): + model = MODELS.build( + dict( + type='SAM', + image_encoder_cfg=dict( + type='mmpretrain.ViTSAM', + arch=arch, + img_size=1024, + patch_size=16, + out_channels=256, + use_abs_pos=True, + use_rel_pos=True, + window_size=14, + ), + prompt_encoder_cfg=dict( + type='PromptEncoder', + embed_dim=256, + image_embedding_size=(64, 64), + input_image_size=(1024, 1024), + mask_in_chans=16, + ), + mask_decoder_cfg=dict( + type='MaskDecoder', + num_multimask_outputs=3, + transformer=dict( + type='TwoWayTransformer', + depth=2, + embedding_dim=256, + mlp_dim=2048, + num_heads=8, + ), + transformer_dim=256, + iou_head_depth=3, + iou_head_hidden_dim=256, + ))) + load_checkpoint(model, model_zoo.get(arch), strict=True) + if torch.cuda.is_available(): + model = model.cuda() + return model + + +class SamAutomaticMaskGenerator: + + def __init__( + self, + arch: str = 'base', + points_per_side: Optional[int] = 32, + points_per_batch: int = 64, + pred_iou_thresh: float = 0.88, + stability_score_thresh: float = 0.95, + stability_score_offset: float = 1.0, + box_nms_thresh: float = 0.7, + crop_n_layers: int = 0, + crop_nms_thresh: float = 0.7, + crop_overlap_ratio: float = 512 / 1500, + crop_n_points_downscale_factor: int = 1, + point_grids: Optional[List[np.ndarray]] = None, + min_mask_region_area: int = 0, + output_mode: str = 'binary_mask', + ) -> None: + """Using a SAM model, generates masks for the entire image. Generates a + grid of point prompts over the image, then filters low quality and + duplicate masks. The default settings are chosen for SAM with a ViT-H + backbone. + + Arguments: + arch (str): The SAM model to use for mask prediction. + points_per_side (int or None): The number of points to be sampled + along one side of the image. The total number of points is + points_per_side**2. If None, 'point_grids' must provide explicit + point sampling. + points_per_batch (int): Sets the number of points run simultaneously + by the model. Higher numbers may be faster but use more GPU memory. + pred_iou_thresh (float): A filtering threshold in [0,1], using the + model's predicted mask quality. + stability_score_thresh (float): A filtering threshold in [0,1], using + the stability of the mask under changes to the cutoff used to binarize + the model's mask predictions. + stability_score_offset (float): The amount to shift the cutoff when + calculated the stability score. + box_nms_thresh (float): The box IoU cutoff used by non-maximal + suppression to filter duplicate masks. + crops_n_layers (int): If >0, mask prediction will be run again on + crops of the image. Sets the number of layers to run, where each + layer has 2**i_layer number of image crops. + crops_nms_thresh (float): The box IoU cutoff used by non-maximal + suppression to filter duplicate masks between different crops. + crop_overlap_ratio (float): Sets the degree to which crops overlap. + In the first crop layer, crops will overlap by this fraction of + the image length. Later layers with more crops scale down this overlap. + crop_n_points_downscale_factor (int): The number of points-per-side + sampled in layer n is scaled down by crop_n_points_downscale_factor**n. + point_grids (list(np.ndarray) or None): A list over explicit grids + of points used for sampling, normalized to [0,1]. The nth grid in the + list is used in the nth crop layer. Exclusive with points_per_side. + min_mask_region_area (int): If >0, postprocessing will be applied + to remove disconnected regions and holes in masks with area smaller + than min_mask_region_area. Requires opencv. + output_mode (str): The form masks are returned in. Can be 'binary_mask', + 'uncompressed_rle', or 'coco_rle'. 'coco_rle' requires pycocotools. + For large resolutions, 'binary_mask' may consume large amounts of + memory. + """ # noqa + + assert (points_per_side is None) != ( + point_grids is None + ), 'Exactly one of points_per_side or point_grid must be provided.' + if points_per_side is not None: + self.point_grids = build_all_layer_point_grids( + points_per_side, + crop_n_layers, + crop_n_points_downscale_factor, + ) + elif point_grids is not None: + self.point_grids = point_grids + else: + raise ValueError( + "Can't have both points_per_side and point_grid be None.") + + assert output_mode in [ + 'binary_mask', + 'uncompressed_rle', + 'coco_rle', + ], f'Unknown output_mode {output_mode}.' + if output_mode == 'coco_rle': + from pycocotools import \ + mask as mask_utils # type: ignore # noqa: F401 + + if min_mask_region_area > 0: + import cv2 # type: ignore # noqa: F401 + + self.predictor = SAMInferencer(arch) + self.points_per_batch = points_per_batch + self.pred_iou_thresh = pred_iou_thresh + self.stability_score_thresh = stability_score_thresh + self.stability_score_offset = stability_score_offset + self.box_nms_thresh = box_nms_thresh + self.crop_n_layers = crop_n_layers + self.crop_nms_thresh = crop_nms_thresh + self.crop_overlap_ratio = crop_overlap_ratio + self.crop_n_points_downscale_factor = crop_n_points_downscale_factor + self.min_mask_region_area = min_mask_region_area + self.output_mode = output_mode + + @torch.no_grad() + def generate(self, image: np.ndarray) -> List[Dict[str, Any]]: + """Generates masks for the given image. + + Arguments: + image (np.ndarray): The image to generate masks for, in HWC uint8 format. + + Returns: + list(dict(str, any)): A list over records for masks. Each record is + a dict containing the following keys: + segmentation (dict(str, any) or np.ndarray): The mask. If + output_mode='binary_mask', is an array of shape HW. Otherwise, + is a dictionary containing the RLE. + bbox (list(float)): The box around the mask, in XYWH format. + area (int): The area in pixels of the mask. + predicted_iou (float): The model's own prediction of the mask's + quality. This is filtered by the pred_iou_thresh parameter. + point_coords (list(list(float))): The point coordinates input + to the model to generate this mask. + stability_score (float): A measure of the mask's quality. This + is filtered on using the stability_score_thresh parameter. + crop_box (list(float)): The crop of the image used to generate + the mask, given in XYWH format. + """ # noqa + + # Generate masks + mask_data = self._generate_masks(image) + + # Filter small disconnected regions and holes in masks + if self.min_mask_region_area > 0: + mask_data = self.postprocess_small_regions( + mask_data, + self.min_mask_region_area, + max(self.box_nms_thresh, self.crop_nms_thresh), + ) + + # Encode masks + if self.output_mode == 'coco_rle': + mask_data['segmentations'] = [ + coco_encode_rle(rle) for rle in mask_data['rles'] + ] + elif self.output_mode == 'binary_mask': + mask_data['segmentations'] = [ + rle_to_mask(rle) for rle in mask_data['rles'] + ] + else: + mask_data['segmentations'] = mask_data['rles'] + + # Write mask records + curr_anns = [] + for idx in range(len(mask_data['segmentations'])): + ann = { + 'segmentation': + mask_data['segmentations'][idx], + 'area': + area_from_rle(mask_data['rles'][idx]), + 'bbox': + box_xyxy_to_xywh(mask_data['boxes'][idx]).tolist(), + 'predicted_iou': + mask_data['iou_preds'][idx].item(), + 'point_coords': [mask_data['points'][idx].tolist()], + 'stability_score': + mask_data['stability_score'][idx].item(), + 'crop_box': + box_xyxy_to_xywh(mask_data['crop_boxes'][idx]).tolist(), + } + curr_anns.append(ann) + + return curr_anns + + def _generate_masks(self, image: np.ndarray) -> MaskData: + orig_size = image.shape[:2] + crop_boxes, layer_idxs = generate_crop_boxes(orig_size, + self.crop_n_layers, + self.crop_overlap_ratio) + + # Iterate over image crops + data = MaskData() + for crop_box, layer_idx in zip(crop_boxes, layer_idxs): + crop_data = self._process_crop(image, crop_box, layer_idx, + orig_size) + data.cat(crop_data) + + # Remove duplicate masks between crops + if len(crop_boxes) > 1: + # Prefer masks from smaller crops + scores = 1 / box_area(data['crop_boxes']) + scores = scores.to(data['boxes'].device) + keep_by_nms = batched_nms( + data['boxes'].float(), + scores, + torch.zeros(len(data['boxes'])), # categories + iou_threshold=self.crop_nms_thresh, + ) + data.filter(keep_by_nms) + + data.to_numpy() + return data + + def _process_crop( + self, + image: np.ndarray, + crop_box: List[int], + crop_layer_idx: int, + orig_size: Tuple[int, ...], + ) -> MaskData: + # Crop the image and calculate embeddings + x0, y0, x1, y1 = crop_box + cropped_im = image[y0:y1, x0:x1, :] + cropped_im_size = cropped_im.shape[:2] + self.predictor.set_image(cropped_im) + + # Get points for this crop + points_scale = np.array(cropped_im_size)[None, ::-1] + points_for_image = self.point_grids[crop_layer_idx] * points_scale + + # Generate masks for this crop in batches + data = MaskData() + for (points, ) in batch_iterator(self.points_per_batch, + points_for_image): + batch_data = self._process_batch(points, cropped_im_size, crop_box, + orig_size) + data.cat(batch_data) + del batch_data + self.predictor.reset_image() + + # Remove duplicates within this crop. + keep_by_nms = batched_nms( + data['boxes'].float(), + data['iou_preds'], + torch.zeros(len(data['boxes'])), # categories + iou_threshold=self.box_nms_thresh, + ) + data.filter(keep_by_nms) + + # Return to the original image frame + data['boxes'] = uncrop_boxes_xyxy(data['boxes'], crop_box) + data['points'] = uncrop_points(data['points'], crop_box) + data['crop_boxes'] = torch.tensor( + [crop_box for _ in range(len(data['rles']))]) + + return data + + def _process_batch( + self, + points: np.ndarray, + im_size: Tuple[int, ...], + crop_box: List[int], + orig_size: Tuple[int, ...], + ) -> MaskData: + orig_h, orig_w = orig_size + + # Run model on this batch + transformed_points = self.predictor.transform.apply_coords( + points, im_size) + in_points = torch.as_tensor( + transformed_points, device=self.predictor.device) + in_labels = torch.ones( + in_points.shape[0], dtype=torch.int, device=in_points.device) + masks, iou_preds, _ = self.predictor.predict_torch( + in_points[:, None, :], + in_labels[:, None], + multimask_output=True, + return_logits=True, + ) + + # Serialize predictions and store in MaskData + data = MaskData( + masks=masks.flatten(0, 1), + iou_preds=iou_preds.flatten(0, 1), + points=torch.as_tensor(points.repeat(masks.shape[1], axis=0)), + ) + del masks + + # Filter by predicted IoU + if self.pred_iou_thresh > 0.0: + keep_mask = data['iou_preds'] > self.pred_iou_thresh + data.filter(keep_mask) + + # Calculate stability score + data['stability_score'] = calculate_stability_score( + data['masks'], self.predictor.model.mask_threshold, + self.stability_score_offset) + if self.stability_score_thresh > 0.0: + keep_mask = data['stability_score'] >= self.stability_score_thresh + data.filter(keep_mask) + + # Threshold masks and calculate boxes + data['masks'] = data['masks'] > self.predictor.model.mask_threshold + data['boxes'] = batched_mask_to_box(data['masks']) + + # Filter boxes that touch crop boundaries + keep_mask = ~is_box_near_crop_edge(data['boxes'], crop_box, + [0, 0, orig_w, orig_h]) + if not torch.all(keep_mask): + data.filter(keep_mask) + + # Compress to RLE + data['masks'] = uncrop_masks(data['masks'], crop_box, orig_h, orig_w) + data['rles'] = mask_to_rle_pytorch(data['masks']) + del data['masks'] + + return data + + @staticmethod + def postprocess_small_regions(mask_data: MaskData, min_area: int, + nms_thresh: float) -> MaskData: + """Removes small disconnected regions and holes in masks, then reruns + box NMS to remove any new duplicates. + + Edits mask_data in place. + + Requires open-cv as a dependency. + """ + if len(mask_data['rles']) == 0: + return mask_data + + # Filter small disconnected regions and holes + new_masks = [] + scores = [] + for rle in mask_data['rles']: + mask = rle_to_mask(rle) + + mask, changed = remove_small_regions(mask, min_area, mode='holes') + unchanged = not changed + mask, changed = remove_small_regions( + mask, min_area, mode='islands') + unchanged = unchanged and not changed + + new_masks.append(torch.as_tensor(mask).unsqueeze(0)) + # Give score=0 to changed masks and score=1 to unchanged masks + # so NMS will prefer ones that didn't need postprocessing + scores.append(float(unchanged)) + + # Recalculate boxes and remove any new duplicates + masks = torch.cat(new_masks, dim=0) + boxes = batched_mask_to_box(masks) + keep_by_nms = batched_nms( + boxes.float(), + torch.as_tensor(scores), + torch.zeros(len(boxes)), # categories + iou_threshold=nms_thresh, + ) + + # Only recalculate RLEs for masks that have changed + for i_mask in keep_by_nms: + if scores[i_mask] == 0.0: + mask_torch = masks[i_mask].unsqueeze(0) + mask_data['rles'][i_mask] = mask_to_rle_pytorch(mask_torch)[0] + mask_data['boxes'][i_mask] = boxes[ + i_mask] # update res directly + mask_data.filter(keep_by_nms) + + return mask_data diff --git a/mmsegmentation/projects/sam_inference_demo/sam/utils/__init__.py b/mmsegmentation/projects/sam_inference_demo/sam/utils/__init__.py new file mode 100644 index 0000000..5d33e33 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/utils/__init__.py @@ -0,0 +1,2 @@ +from .amg import * # noqa: F403 F401 +from .transforms import ResizeLongestSide # noqa: F403 F401 diff --git a/mmsegmentation/projects/sam_inference_demo/sam/utils/amg.py b/mmsegmentation/projects/sam_inference_demo/sam/utils/amg.py new file mode 100644 index 0000000..3ba3599 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/utils/amg.py @@ -0,0 +1,355 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# https://github.com/facebookresearch/segment-anything + +import math +from copy import deepcopy +from itertools import product +from typing import Any, Dict, Generator, ItemsView, List, Tuple + +import numpy as np +import torch + + +class MaskData: + """A structure for storing masks and their related data in batched format. + + Implements basic filtering and concatenation. + """ + + def __init__(self, **kwargs) -> None: + for v in kwargs.values(): + assert isinstance( + v, (list, np.ndarray, torch.Tensor) + ), 'MaskData only supports list, numpy arrays, and torch tensors.' + self._stats = dict(**kwargs) + + def __setitem__(self, key: str, item: Any) -> None: + assert isinstance( + item, (list, np.ndarray, torch.Tensor) + ), 'MaskData only supports list, numpy arrays, and torch tensors.' + self._stats[key] = item + + def __delitem__(self, key: str) -> None: + del self._stats[key] + + def __getitem__(self, key: str) -> Any: + return self._stats[key] + + def items(self) -> ItemsView[str, Any]: + return self._stats.items() + + def filter(self, keep: torch.Tensor) -> None: + for k, v in self._stats.items(): + if v is None: + self._stats[k] = None + elif isinstance(v, torch.Tensor): + self._stats[k] = v[torch.as_tensor(keep, device=v.device)] + elif isinstance(v, np.ndarray): + self._stats[k] = v[keep.detach().cpu().numpy()] + elif isinstance(v, list) and keep.dtype == torch.bool: + self._stats[k] = [a for i, a in enumerate(v) if keep[i]] + elif isinstance(v, list): + self._stats[k] = [v[i] for i in keep] + else: + raise TypeError( + f'MaskData key {k} has an unsupported type {type(v)}.') + + def cat(self, new_stats: 'MaskData') -> None: + for k, v in new_stats.items(): + if k not in self._stats or self._stats[k] is None: + self._stats[k] = deepcopy(v) + elif isinstance(v, torch.Tensor): + self._stats[k] = torch.cat([self._stats[k], v], dim=0) + elif isinstance(v, np.ndarray): + self._stats[k] = np.concatenate([self._stats[k], v], axis=0) + elif isinstance(v, list): + self._stats[k] = self._stats[k] + deepcopy(v) + else: + raise TypeError( + f'MaskData key {k} has an unsupported type {type(v)}.') + + def to_numpy(self) -> None: + for k, v in self._stats.items(): + if isinstance(v, torch.Tensor): + self._stats[k] = v.detach().cpu().numpy() + + +def is_box_near_crop_edge(boxes: torch.Tensor, + crop_box: List[int], + orig_box: List[int], + atol: float = 20.0) -> torch.Tensor: + """Filter masks at the edge of a crop, but not at the edge of the original + image.""" + crop_box_torch = torch.as_tensor( + crop_box, dtype=torch.float, device=boxes.device) + orig_box_torch = torch.as_tensor( + orig_box, dtype=torch.float, device=boxes.device) + boxes = uncrop_boxes_xyxy(boxes, crop_box).float() + near_crop_edge = torch.isclose( + boxes, crop_box_torch[None, :], atol=atol, rtol=0) + near_image_edge = torch.isclose( + boxes, orig_box_torch[None, :], atol=atol, rtol=0) + near_crop_edge = torch.logical_and(near_crop_edge, ~near_image_edge) + return torch.any(near_crop_edge, dim=1) + + +def box_xyxy_to_xywh(box_xyxy: torch.Tensor) -> torch.Tensor: + box_xywh = deepcopy(box_xyxy) + box_xywh[2] = box_xywh[2] - box_xywh[0] + box_xywh[3] = box_xywh[3] - box_xywh[1] + return box_xywh + + +def batch_iterator(batch_size: int, *args) -> Generator[List[Any], None, None]: + assert len(args) > 0 and all( + len(a) == len(args[0]) for a in + args), 'Batched iteration must have inputs of all the same size.' + n_batches = len(args[0]) // batch_size + int( + len(args[0]) % batch_size != 0) + for b in range(n_batches): + yield [arg[b * batch_size:(b + 1) * batch_size] for arg in args] + + +def mask_to_rle_pytorch(tensor: torch.Tensor) -> List[Dict[str, Any]]: + """Encodes masks to an uncompressed RLE, in the format expected by pycoco + tools.""" + # Put in fortran order and flatten h,w + b, h, w = tensor.shape + tensor = tensor.permute(0, 2, 1).flatten(1) + + # Compute change indices + diff = tensor[:, 1:] ^ tensor[:, :-1] + change_indices = diff.nonzero() + + # Encode run length + out = [] + for i in range(b): + cur_idxs = change_indices[change_indices[:, 0] == i, 1] + cur_idxs = torch.cat([ + torch.tensor([0], dtype=cur_idxs.dtype, device=cur_idxs.device), + cur_idxs + 1, + torch.tensor([h * w], dtype=cur_idxs.dtype, + device=cur_idxs.device), + ]) + btw_idxs = cur_idxs[1:] - cur_idxs[:-1] + counts = [] if tensor[i, 0] == 0 else [0] + counts.extend(btw_idxs.detach().cpu().tolist()) + out.append({'size': [h, w], 'counts': counts}) + return out + + +def rle_to_mask(rle: Dict[str, Any]) -> np.ndarray: + """Compute a binary mask from an uncompressed RLE.""" + h, w = rle['size'] + mask = np.empty(h * w, dtype=bool) + idx = 0 + parity = False + for count in rle['counts']: + mask[idx:idx + count] = parity + idx += count + parity ^= True + mask = mask.reshape(w, h) + return mask.transpose() # Put in C order + + +def area_from_rle(rle: Dict[str, Any]) -> int: + return sum(rle['counts'][1::2]) + + +def calculate_stability_score(masks: torch.Tensor, mask_threshold: float, + threshold_offset: float) -> torch.Tensor: + """Computes the stability score for a batch of masks. + + The stability score is the IoU between the binary masks obtained by + thresholding the predicted mask logits at high and low values. + """ + # One mask is always contained inside the other. + # Save memory by preventing unnecessary cast to torch.int64 + intersections = ((masks > (mask_threshold + threshold_offset)).sum( + -1, dtype=torch.int16).sum(-1, dtype=torch.int32)) + unions = ((masks > (mask_threshold - threshold_offset)).sum( + -1, dtype=torch.int16).sum(-1, dtype=torch.int32)) + return intersections / unions + + +def build_point_grid(n_per_side: int) -> np.ndarray: + """Generates a 2D grid of points evenly spaced in [0,1]x[0,1].""" + offset = 1 / (2 * n_per_side) + points_one_side = np.linspace(offset, 1 - offset, n_per_side) + points_x = np.tile(points_one_side[None, :], (n_per_side, 1)) + points_y = np.tile(points_one_side[:, None], (1, n_per_side)) + points = np.stack([points_x, points_y], axis=-1).reshape(-1, 2) + return points + + +def build_all_layer_point_grids(n_per_side: int, n_layers: int, + scale_per_layer: int) -> List[np.ndarray]: + """Generates point grids for all crop layers.""" + points_by_layer = [] + for i in range(n_layers + 1): + n_points = int(n_per_side / (scale_per_layer**i)) + points_by_layer.append(build_point_grid(n_points)) + return points_by_layer + + +def generate_crop_boxes( + im_size: Tuple[int, ...], n_layers: int, + overlap_ratio: float) -> Tuple[List[List[int]], List[int]]: + """Generates a list of crop boxes of different sizes. + + Each layer has (2**i)**2 boxes for the ith layer. + """ + crop_boxes, layer_idxs = [], [] + im_h, im_w = im_size + short_side = min(im_h, im_w) + + # Original image + crop_boxes.append([0, 0, im_w, im_h]) + layer_idxs.append(0) + + def crop_len(orig_len, n_crops, overlap): + return int(math.ceil((overlap * (n_crops - 1) + orig_len) / n_crops)) + + for i_layer in range(n_layers): + n_crops_per_side = 2**(i_layer + 1) + overlap = int(overlap_ratio * short_side * (2 / n_crops_per_side)) + + crop_w = crop_len(im_w, n_crops_per_side, overlap) + crop_h = crop_len(im_h, n_crops_per_side, overlap) + + crop_box_x0 = [ + int((crop_w - overlap) * i) for i in range(n_crops_per_side) + ] + crop_box_y0 = [ + int((crop_h - overlap) * i) for i in range(n_crops_per_side) + ] + + # Crops in XYWH format + for x0, y0 in product(crop_box_x0, crop_box_y0): + box = [x0, y0, min(x0 + crop_w, im_w), min(y0 + crop_h, im_h)] + crop_boxes.append(box) + layer_idxs.append(i_layer + 1) + + return crop_boxes, layer_idxs + + +def uncrop_boxes_xyxy(boxes: torch.Tensor, + crop_box: List[int]) -> torch.Tensor: + x0, y0, _, _ = crop_box + offset = torch.tensor([[x0, y0, x0, y0]], device=boxes.device) + # Check if boxes has a channel dimension + if len(boxes.shape) == 3: + offset = offset.unsqueeze(1) + return boxes + offset + + +def uncrop_points(points: torch.Tensor, crop_box: List[int]) -> torch.Tensor: + x0, y0, _, _ = crop_box + offset = torch.tensor([[x0, y0]], device=points.device) + # Check if points has a channel dimension + if len(points.shape) == 3: + offset = offset.unsqueeze(1) + return points + offset + + +def uncrop_masks(masks: torch.Tensor, crop_box: List[int], orig_h: int, + orig_w: int) -> torch.Tensor: + x0, y0, x1, y1 = crop_box + if x0 == 0 and y0 == 0 and x1 == orig_w and y1 == orig_h: + return masks + # Coordinate transform masks + pad_x, pad_y = orig_w - (x1 - x0), orig_h - (y1 - y0) + pad = (x0, pad_x - x0, y0, pad_y - y0) + return torch.nn.functional.pad(masks, pad, value=0) + + +def remove_small_regions(mask: np.ndarray, area_thresh: float, + mode: str) -> Tuple[np.ndarray, bool]: + """Removes small disconnected regions and holes in a mask. + + Returns the mask and an indicator of if the mask has been modified. + """ + import cv2 # type: ignore + + assert mode in ['holes', 'islands'] + correct_holes = mode == 'holes' + working_mask = (correct_holes ^ mask).astype(np.uint8) + n_labels, regions, stats, _ = cv2.connectedComponentsWithStats( + working_mask, 8) + sizes = stats[:, -1][1:] # Row 0 is background label + small_regions = [i + 1 for i, s in enumerate(sizes) if s < area_thresh] + if len(small_regions) == 0: + return mask, False + fill_labels = [0] + small_regions + if not correct_holes: + fill_labels = [i for i in range(n_labels) if i not in fill_labels] + # If every region is below threshold, keep largest + if len(fill_labels) == 0: + fill_labels = [int(np.argmax(sizes)) + 1] + mask = np.isin(regions, fill_labels) + return mask, True + + +def coco_encode_rle(uncompressed_rle: Dict[str, Any]) -> Dict[str, Any]: + from pycocotools import mask as mask_utils # type: ignore + + h, w = uncompressed_rle['size'] + rle = mask_utils.frPyObjects(uncompressed_rle, h, w) + rle['counts'] = rle['counts'].decode( + 'utf-8') # Necessary to serialize with json + return rle + + +def batched_mask_to_box(masks: torch.Tensor) -> torch.Tensor: + """Calculates boxes in XYXY format around masks. + + Return [0,0,0,0] for an empty mask. For input shape C1xC2x...xHxW, the + output shape is C1xC2x...x4. + """ + # torch.max below raises an error on empty inputs, just skip in this case + if torch.numel(masks) == 0: + return torch.zeros(*masks.shape[:-2], 4, device=masks.device) + + # Normalize shape to CxHxW + shape = masks.shape + h, w = shape[-2:] + if len(shape) > 2: + masks = masks.flatten(0, -3) + else: + masks = masks.unsqueeze(0) + + # Get top and bottom edges + in_height, _ = torch.max(masks, dim=-1) + in_height_coords = in_height * torch.arange( + h, device=in_height.device)[None, :] + bottom_edges, _ = torch.max(in_height_coords, dim=-1) + in_height_coords = in_height_coords + h * (~in_height) + top_edges, _ = torch.min(in_height_coords, dim=-1) + + # Get left and right edges + in_width, _ = torch.max(masks, dim=-2) + in_width_coords = in_width * torch.arange( + w, device=in_width.device)[None, :] + right_edges, _ = torch.max(in_width_coords, dim=-1) + in_width_coords = in_width_coords + w * (~in_width) + left_edges, _ = torch.min(in_width_coords, dim=-1) + + # If the mask is empty the right edge will be to the left of the left edge. + # Replace these boxes with [0, 0, 0, 0] + empty_filter = (right_edges < left_edges) | (bottom_edges < top_edges) + out = torch.stack([left_edges, top_edges, right_edges, bottom_edges], + dim=-1) + out = out * (~empty_filter).unsqueeze(-1) + + # Return to original shape + if len(shape) > 2: + out = out.reshape(*shape[:-2], 4) + else: + out = out[0] + + return out diff --git a/mmsegmentation/projects/sam_inference_demo/sam/utils/transforms.py b/mmsegmentation/projects/sam_inference_demo/sam/utils/transforms.py new file mode 100644 index 0000000..484fd66 --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam/utils/transforms.py @@ -0,0 +1,110 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from copy import deepcopy +from typing import Tuple + +import numpy as np +import torch +from torch.nn import functional as F +from torchvision.transforms.functional import resize # type: ignore +from torchvision.transforms.functional import to_pil_image + +from mmseg.registry import TRANSFORMS + + +@TRANSFORMS.register_module() +class ResizeLongestSide: + """Resizes images to longest side 'target_length', as well as provides + methods for resizing coordinates and boxes. + + Provides methods for transforming both numpy array and batched torch + tensors. + """ + + def __init__(self, target_length: int) -> None: + self.target_length = target_length + + def apply_image(self, image: np.ndarray) -> np.ndarray: + """Expects a numpy array with shape HxWxC in uint8 format.""" + target_size = self.get_preprocess_shape(image.shape[0], image.shape[1], + self.target_length) + return np.array(resize(to_pil_image(image), target_size)) + + def apply_coords(self, coords: np.ndarray, + original_size: Tuple[int, ...]) -> np.ndarray: + """Expects a numpy array of length 2 in the final dimension. + + Requires the original image size in (H, W) format. + """ + old_h, old_w = original_size + new_h, new_w = self.get_preprocess_shape(original_size[0], + original_size[1], + self.target_length) + coords = deepcopy(coords).astype(float) + coords[..., 0] = coords[..., 0] * (new_w / old_w) + coords[..., 1] = coords[..., 1] * (new_h / old_h) + return coords + + def apply_boxes(self, boxes: np.ndarray, + original_size: Tuple[int, ...]) -> np.ndarray: + """Expects a numpy array shape Bx4. + + Requires the original image size in (H, W) format. + """ + boxes = self.apply_coords(boxes.reshape(-1, 2, 2), original_size) + return boxes.reshape(-1, 4) + + def apply_image_torch(self, image: torch.Tensor) -> torch.Tensor: + """Expects batched images with shape BxCxHxW and float format. + + This transformation may not exactly match apply_image. apply_image is + the transformation expected by the model. + """ + # Expects an image in BCHW format. May not exactly match apply_image. + target_size = self.get_preprocess_shape(image.shape[0], image.shape[1], + self.target_length) + return F.interpolate( + image, + target_size, + mode='bilinear', + align_corners=False, + antialias=True) + + def apply_coords_torch(self, coords: torch.Tensor, + original_size: Tuple[int, ...]) -> torch.Tensor: + """Expects a torch tensor with length 2 in the last dimension. + + Requires the original image size in (H, W) format. + """ + old_h, old_w = original_size + new_h, new_w = self.get_preprocess_shape(original_size[0], + original_size[1], + self.target_length) + coords = deepcopy(coords).to(torch.float) + coords[..., 0] = coords[..., 0] * (new_w / old_w) + coords[..., 1] = coords[..., 1] * (new_h / old_h) + return coords + + def apply_boxes_torch(self, boxes: torch.Tensor, + original_size: Tuple[int, ...]) -> torch.Tensor: + """Expects a torch tensor with shape Bx4. + + Requires the original image size in (H, W) format. + """ + boxes = self.apply_coords_torch(boxes.reshape(-1, 2, 2), original_size) + return boxes.reshape(-1, 4) + + @staticmethod + def get_preprocess_shape(oldh: int, oldw: int, + long_side_length: int) -> Tuple[int, int]: + """Compute the output size given input size and target long side + length.""" + scale = long_side_length * 1.0 / max(oldh, oldw) + newh, neww = oldh * scale, oldw * scale + neww = int(neww + 0.5) + newh = int(newh + 0.5) + return (newh, neww) diff --git a/mmsegmentation/projects/sam_inference_demo/sam_image_demo.ipynb b/mmsegmentation/projects/sam_inference_demo/sam_image_demo.ipynb new file mode 100644 index 0000000..1cb433f --- /dev/null +++ b/mmsegmentation/projects/sam_inference_demo/sam_image_demo.ipynb @@ -0,0 +1,122 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import cv2\n", + "\n", + "import sam # noqa: F401\n", + "from sam.sam_inferencer import SAMInferencer\n", + "\n", + "\n", + "def show_mask(mask, ax, random_color=False):\n", + " if random_color:\n", + " color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)\n", + " else:\n", + " color = np.array([30/255, 144/255, 255/255, 0.6])\n", + " h, w = mask.shape[-2:]\n", + " mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)\n", + " ax.imshow(mask_image)\n", + " \n", + "def show_points(coords, labels, ax, marker_size=375):\n", + " pos_points = coords[labels==1]\n", + " neg_points = coords[labels==0]\n", + " ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)\n", + " ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white', linewidth=1.25) \n", + " \n", + "def show_box(box, ax):\n", + " x0, y0 = box[0], box[1]\n", + " w, h = box[2] - box[0], box[3] - box[1]\n", + " ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0,0,0,0), lw=2))\n", + "\n", + "image = cv2.imread('../../demo/demo.png')\n", + "image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(image)\n", + "plt.axis('on')\n", + "plt.show()\n", + "print(image.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "inferencer = SAMInferencer(arch='huge')\n", + "inferencer.set_image(image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_point = np.array([[280, 230], [500, 300]])\n", + "input_label = np.array([1, 1])\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(image)\n", + "show_points(input_point, input_label, plt.gca())\n", + "plt.axis('on')\n", + "plt.show() " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "masks, scores, logits = inferencer.predict(\n", + " point_coords=input_point,\n", + " point_labels=input_label,\n", + " multimask_output=True,\n", + ")\n", + "for i, (mask, score) in enumerate(zip(masks, scores)):\n", + " plt.figure(figsize=(10,10))\n", + " plt.imshow(image)\n", + " show_mask(mask, plt.gca(), random_color=True)\n", + " show_points(input_point, input_label, plt.gca())\n", + " plt.title(f\"Mask {i+1}, Score: {score:.3f}\", fontsize=18)\n", + " plt.axis('off')\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pt1.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/mmsegmentation/projects/van/README.md b/mmsegmentation/projects/van/README.md new file mode 100644 index 0000000..be0ba36 --- /dev/null +++ b/mmsegmentation/projects/van/README.md @@ -0,0 +1,101 @@ +# Visual Attention Network (VAN) for Segmentation + +This repo is a PyTorch implementation of applying **VAN** (**Visual Attention Network**) to semantic segmentation. + +The code is an integration from [VAN-Segmentation](https://github.com/Visual-Attention-Network/VAN-Segmentation/blob/main/README.md?plain=1) + +More details can be found in [**Visual Attention Network**](https://arxiv.org/abs/2202.09741). + +## Citation + +```bib +@article{guo2022visual, + title={Visual Attention Network}, + author={Guo, Meng-Hao and Lu, Cheng-Ze and Liu, Zheng-Ning and Cheng, Ming-Ming and Hu, Shi-Min}, + journal={arXiv preprint arXiv:2202.09741}, + year={2022} +} +``` + +## Results + +**Notes**: Pre-trained models can be found in [TsingHua Cloud](https://cloud.tsinghua.edu.cn/d/0100f0cea37d41ba8d08/). + +Results can be found in [VAN-Segmentation](https://github.com/Visual-Attention-Network/VAN-Segmentation/blob/main/README.md?plain=1) + +We provide evaluation results of the converted weights. + +| Method | Backbone | mIoU | Download | +| :-----: | :----------: | :---: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| UPerNet | VAN-B2 | 49.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b2-in1kpre_upernet_3rdparty_512x512-ade20k_20230522-19c58aee.pth) | +| UPerNet | VAN-B3 | 49.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b3-in1kpre_upernet_3rdparty_512x512-ade20k_20230522-653bd6b7.pth) | +| UPerNet | VAN-B4 | 51.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b4-in1kpre_upernet_3rdparty_512x512-ade20k_20230522-653bd6b7.pth) | +| UPerNet | VAN-B4-in22k | 52.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b4-in22kpre_upernet_3rdparty_512x512-ade20k_20230522-4a4d744a.pth) | +| UPerNet | VAN-B5-in22k | 53.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b5-in22kpre_upernet_3rdparty_512x512-ade20k_20230522-5bb6f2b4.pth) | +| UPerNet | VAN-B6-in22k | 54.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b6-in22kpre_upernet_3rdparty_512x512-ade20k_20230522-e226b363.pth) | +| FPN | VAN-B0 | 38.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b0-in1kpre_fpn_3rdparty_512x512-ade20k_20230522-75a76298.pth) | +| FPN | VAN-B1 | 43.22 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b1-in1kpre_fpn_3rdparty_512x512-ade20k_20230522-104499ff.pth) | +| FPN | VAN-B2 | 46.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b2-in1kpre_fpn_3rdparty_512x512-ade20k_20230522-7074e6f8.pth) | +| FPN | VAN-B3 | 48.32 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b3-in1kpre_fpn_3rdparty_512x512-ade20k_20230522-2c3b7f5e.pth) | + +## Preparation + +Install MMSegmentation and download ADE20K according to the guidelines in MMSegmentation. + +## Requirement + +**Step 0.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +pip install -U openmim +mim install mmengine +mim install "mmcv>=2.0.0" +``` + +**Step 1.** Install MMSegmentation. + +Case a: If you develop and run mmseg directly, install it from source: + +```shell +git clone -b main https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -v -e . +``` + +Case b: If you use mmsegmentation as a dependency or third-party package, install it with pip: + +```shell +pip install "mmsegmentation>=1.0.0" +``` + +## Training + +If you use 4 GPUs for training by default. Run: + +```bash +bash tools/dist_train.sh projects/van/configs/van/van-b2_pre1k_upernet_4xb2-160k_ade20k-512x512.py 4 +``` + +## Evaluation + +To evaluate the model, an example is: + +```bash +bash tools/dist_train.sh projects/van/configs/van/van-b2_pre1k_upernet_4xb2-160k_ade20k-512x512.py work_dirs/van-b2_pre1k_upernet_4xb2-160k_ade20k-512x512/iter_160000.pth 4 --eval mIoU +``` + +## FLOPs + +To calculate FLOPs for a model, run: + +```bash +bash tools/analysis_tools/get_flops.py projects/van/configs/van/van-b2_pre1k_upernet_4xb2-160k_ade20k-512x512.py --shape 512 512 +``` + +## Acknowledgment + +Our implementation is mainly based on [mmsegmentation](https://github.com/open-mmlab/mmsegmentation/tree/v0.12.0), [Swin-Transformer](https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation), [PoolFormer](https://github.com/sail-sg/poolformer), [Enjoy-Hamburger](https://github.com/Gsunshine/Enjoy-Hamburger) and [VAN-Segmentation](https://github.com/Visual-Attention-Network/VAN-Segmentation/blob/main/README.md?plain=1). Thanks for their authors. + +## LICENSE + +This repo is under the Apache-2.0 license. For commercial use, please contact the authors. diff --git a/mmsegmentation/projects/van/backbones/__init__.py b/mmsegmentation/projects/van/backbones/__init__.py new file mode 100644 index 0000000..071995d --- /dev/null +++ b/mmsegmentation/projects/van/backbones/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .van import VAN + +__all__ = ['VAN'] diff --git a/mmsegmentation/projects/van/backbones/van.py b/mmsegmentation/projects/van/backbones/van.py new file mode 100644 index 0000000..301834a --- /dev/null +++ b/mmsegmentation/projects/van/backbones/van.py @@ -0,0 +1,124 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmengine.model import BaseModule + +from mmseg.models.backbones.mscan import (MSCAN, MSCABlock, + MSCASpatialAttention, + OverlapPatchEmbed) +from mmseg.registry import MODELS + + +class VANAttentionModule(BaseModule): + + def __init__(self, in_channels): + super().__init__() + self.conv0 = nn.Conv2d( + in_channels, in_channels, 5, padding=2, groups=in_channels) + self.conv_spatial = nn.Conv2d( + in_channels, + in_channels, + 7, + stride=1, + padding=9, + groups=in_channels, + dilation=3) + self.conv1 = nn.Conv2d(in_channels, in_channels, 1) + + def forward(self, x): + u = x.clone() + attn = self.conv0(x) + attn = self.conv_spatial(attn) + attn = self.conv1(attn) + return u * attn + + +class VANSpatialAttention(MSCASpatialAttention): + + def __init__(self, in_channels, act_cfg=dict(type='GELU')): + super().__init__(in_channels, act_cfg=act_cfg) + self.spatial_gating_unit = VANAttentionModule(in_channels) + + +class VANBlock(MSCABlock): + + def __init__(self, + channels, + mlp_ratio=4., + drop=0., + drop_path=0., + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='SyncBN', requires_grad=True)): + super().__init__( + channels, + mlp_ratio=mlp_ratio, + drop=drop, + drop_path=drop_path, + act_cfg=act_cfg, + norm_cfg=norm_cfg) + self.attn = VANSpatialAttention(channels) + + +@MODELS.register_module() +class VAN(MSCAN): + + def __init__(self, + in_channels=3, + embed_dims=[64, 128, 256, 512], + mlp_ratios=[8, 8, 4, 4], + drop_rate=0., + drop_path_rate=0., + depths=[3, 4, 6, 3], + num_stages=4, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='SyncBN', requires_grad=True), + pretrained=None, + init_cfg=None): + super(MSCAN, self).__init__(init_cfg=init_cfg) + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be set at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is not None: + raise TypeError('pretrained must be a str or None') + + self.depths = depths + self.num_stages = num_stages + + # stochastic depth decay rule + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) + ] + cur = 0 + + for i in range(num_stages): + patch_embed = OverlapPatchEmbed( + patch_size=7 if i == 0 else 3, + stride=4 if i == 0 else 2, + in_channels=in_channels if i == 0 else embed_dims[i - 1], + embed_dim=embed_dims[i], + norm_cfg=norm_cfg) + + block = nn.ModuleList([ + VANBlock( + channels=embed_dims[i], + mlp_ratio=mlp_ratios[i], + drop=drop_rate, + drop_path=dpr[cur + j], + act_cfg=act_cfg, + norm_cfg=norm_cfg) for j in range(depths[i]) + ]) + norm = nn.LayerNorm(embed_dims[i]) + cur += depths[i] + + setattr(self, f'patch_embed{i + 1}', patch_embed) + setattr(self, f'block{i + 1}', block) + setattr(self, f'norm{i + 1}', norm) + + def init_weights(self): + return super().init_weights() diff --git a/mmsegmentation/projects/van/configs/_base_/datasets/ade20k.py b/mmsegmentation/projects/van/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000..69b3c2a --- /dev/null +++ b/mmsegmentation/projects/van/configs/_base_/datasets/ade20k.py @@ -0,0 +1,14 @@ +# dataset settings +_base_ = '../../../../../configs/_base_/datasets/ade20k.py' + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(2048, 512), keep_ratio=True), + dict(type='ResizeToMultiple', size_divisor=32), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='PackSegInputs') +] +val_dataloader = dict(dataset=dict(pipeline=test_pipeline)) +test_dataloader = val_dataloader diff --git a/mmsegmentation/projects/van/configs/_base_/models/van_fpn.py b/mmsegmentation/projects/van/configs/_base_/models/van_fpn.py new file mode 100644 index 0000000..c7fd739 --- /dev/null +++ b/mmsegmentation/projects/van/configs/_base_/models/van_fpn.py @@ -0,0 +1,43 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) + +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=(512, 512)) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='VAN', + embed_dims=[32, 64, 160, 256], + drop_rate=0.0, + drop_path_rate=0.1, + depths=[3, 3, 5, 2], + act_cfg=dict(type='GELU'), + norm_cfg=norm_cfg, + init_cfg=dict()), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 256], + out_channels=256, + num_outs=4), + decode_head=dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/projects/van/configs/_base_/models/van_upernet.py b/mmsegmentation/projects/van/configs/_base_/models/van_upernet.py new file mode 100644 index 0000000..8f94c0d --- /dev/null +++ b/mmsegmentation/projects/van/configs/_base_/models/van_upernet.py @@ -0,0 +1,51 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) + +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255, + size=(512, 512)) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + backbone=dict( + type='VAN', + embed_dims=[32, 64, 160, 256], + drop_rate=0.0, + drop_path_rate=0.1, + depths=[3, 3, 5, 2], + act_cfg=dict(type='GELU'), + norm_cfg=norm_cfg, + init_cfg=dict()), + decode_head=dict( + type='UPerHead', + in_channels=[32, 64, 160, 256], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=160, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/mmsegmentation/projects/van/configs/van/van-b0_fpn_8xb4-40k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b0_fpn_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..2faf378 --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b0_fpn_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = './van-b2_fpn_8xb4-40k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b0_3rdparty_20230522-956f5e0d.pth' # noqa +model = dict( + backbone=dict( + embed_dims=[32, 64, 160, 256], + depths=[3, 3, 5, 2], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path)), + neck=dict(in_channels=[32, 64, 160, 256])) diff --git a/mmsegmentation/projects/van/configs/van/van-b1_fpn_8xb4-40k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b1_fpn_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..cf64a71 --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b1_fpn_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,6 @@ +_base_ = './van-b2_fpn_8xb4-40k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b1_3rdparty_20230522-3adb117f.pth' # noqa +model = dict( + backbone=dict( + depths=[2, 2, 4, 2], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path))) diff --git a/mmsegmentation/projects/van/configs/van/van-b2_fpn_8xb4-40k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b2_fpn_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..965fa1c --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b2_fpn_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,53 @@ +_base_ = [ + '../_base_/models/van_fpn.py', + '../_base_/datasets/ade20k.py', + '../../../../configs/_base_/default_runtime.py', +] +custom_imports = dict(imports=['projects.van.backbones']) +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b2_3rdparty_20230522-636fac93.pth' # noqa +model = dict( + type='EncoderDecoder', + backbone=dict( + embed_dims=[64, 128, 320, 512], + depths=[3, 3, 12, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.2), + neck=dict(in_channels=[64, 128, 320, 512]), + decode_head=dict(num_classes=150)) + +train_dataloader = dict(batch_size=4) + +# we use 8 gpu instead of 4 in mmsegmentation, so lr*2 and max_iters/2 +gpu_multiples = 2 +max_iters = 80000 // gpu_multiples +interval = 8000 // gpu_multiples +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict( + type='AdamW', + lr=0.0001 * gpu_multiples, + # betas=(0.9, 0.999), + weight_decay=0.0001), + clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type='PolyLR', + power=0.9, + eta_min=0.0, + begin=0, + end=max_iters, + by_epoch=False, + ) +] +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=max_iters, val_interval=interval) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +default_hooks = dict( + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=interval), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmsegmentation/projects/van/configs/van/van-b2_upernet_4xb2-160k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b2_upernet_4xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..c529606 --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b2_upernet_4xb2-160k_ade20k-512x512.py @@ -0,0 +1,46 @@ +_base_ = [ + '../_base_/models/van_upernet.py', '../_base_/datasets/ade20k.py', + '../../../../configs/_base_/default_runtime.py', + '../../../../configs/_base_/schedules/schedule_160k.py' +] +custom_imports = dict(imports=['projects.van.backbones']) +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b2_3rdparty_20230522-636fac93.pth' # noqa +model = dict( + type='EncoderDecoder', + backbone=dict( + embed_dims=[64, 128, 320, 512], + depths=[3, 3, 12, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path)), + decode_head=dict(in_channels=[64, 128, 320, 512], num_classes=150), + auxiliary_head=dict(in_channels=320, num_classes=150)) + +# AdamW optimizer +# no weight decay for position embedding & layer norm in backbone +optim_wrapper = dict( + _delete_=True, + type='OptimWrapper', + optimizer=dict( + type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01), + clip_grad=None, + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500), + dict( + type='PolyLR', + power=1.0, + begin=1500, + end=_base_.train_cfg.max_iters, + eta_min=0.0, + by_epoch=False, + ) +] + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=2) diff --git a/mmsegmentation/projects/van/configs/van/van-b3_fpn_8xb4-40k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b3_fpn_8xb4-40k_ade20k-512x512.py new file mode 100644 index 0000000..b0493fe --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b3_fpn_8xb4-40k_ade20k-512x512.py @@ -0,0 +1,11 @@ +_base_ = './van-b2_fpn_8xb4-40k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b3_3rdparty_20230522-a184e051.pth' # noqa +model = dict( + type='EncoderDecoder', + backbone=dict( + embed_dims=[64, 128, 320, 512], + depths=[3, 5, 27, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.3), + neck=dict(in_channels=[64, 128, 320, 512])) +train_dataloader = dict(batch_size=4) diff --git a/mmsegmentation/projects/van/configs/van/van-b3_upernet_4xb2-160k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b3_upernet_4xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..8201801 --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b3_upernet_4xb2-160k_ade20k-512x512.py @@ -0,0 +1,8 @@ +_base_ = './van-b2_upernet_4xb2-160k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b3_3rdparty_20230522-a184e051.pth' # noqa +model = dict( + type='EncoderDecoder', + backbone=dict( + depths=[3, 5, 27, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.3)) diff --git a/mmsegmentation/projects/van/configs/van/van-b4-in22kpre_upernet_4xb4-160k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b4-in22kpre_upernet_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..15c8f7c --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b4-in22kpre_upernet_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './van-b2_upernet_4xb2-160k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b4-in22k_3rdparty_20230522-5e31cafb.pth' # noqa +model = dict( + backbone=dict( + depths=[3, 6, 40, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.4)) + +# By default, models are trained on 8 GPUs with 2 images per GPU +train_dataloader = dict(batch_size=4) diff --git a/mmsegmentation/projects/van/configs/van/van-b4_upernet_4xb4-160k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b4_upernet_4xb4-160k_ade20k-512x512.py new file mode 100644 index 0000000..33ae049 --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b4_upernet_4xb4-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './van-b2_upernet_4xb2-160k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b4_3rdparty_20230522-1d71c077.pth' # noqa +model = dict( + backbone=dict( + depths=[3, 6, 40, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.4)) + +# By default, models are trained on 4 GPUs with 4 images per GPU +train_dataloader = dict(batch_size=4) diff --git a/mmsegmentation/projects/van/configs/van/van-b5-in22kpre_upernet_4xb2-160k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b5-in22kpre_upernet_4xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..f36c624 --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b5-in22kpre_upernet_4xb2-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './van-b2_upernet_4xb2-160k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b5-in22k_3rdparty_20230522-b26134d7.pth' # noqa +model = dict( + backbone=dict( + embed_dims=[96, 192, 480, 768], + depths=[3, 3, 24, 3], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.4), + decode_head=dict(in_channels=[96, 192, 480, 768], num_classes=150), + auxiliary_head=dict(in_channels=480, num_classes=150)) diff --git a/mmsegmentation/projects/van/configs/van/van-b6-in22kpre_upernet_4xb2-160k_ade20k-512x512.py b/mmsegmentation/projects/van/configs/van/van-b6-in22kpre_upernet_4xb2-160k_ade20k-512x512.py new file mode 100644 index 0000000..aa529ef --- /dev/null +++ b/mmsegmentation/projects/van/configs/van/van-b6-in22kpre_upernet_4xb2-160k_ade20k-512x512.py @@ -0,0 +1,10 @@ +_base_ = './van-b2_upernet_4xb2-160k_ade20k-512x512.py' +ckpt_path = 'https://download.openmmlab.com/mmsegmentation/v0.5/van_3rdparty/van-b6-in22k_3rdparty_20230522-5e5172a3.pth' # noqa +model = dict( + backbone=dict( + embed_dims=[96, 192, 384, 768], + depths=[6, 6, 90, 6], + init_cfg=dict(type='Pretrained', checkpoint=ckpt_path), + drop_path_rate=0.5), + decode_head=dict(in_channels=[96, 192, 384, 768], num_classes=150), + auxiliary_head=dict(in_channels=384, num_classes=150)) diff --git a/mmsegmentation/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/mmsegmentation/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py new file mode 100644 index 0000000..689ac07 --- /dev/null +++ b/mmsegmentation/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -0,0 +1,292 @@ +crop_size = ( + 512, + 1024, +) +data_preprocessor = dict( + bgr_to_rgb=True, + mean=[ + 123.675, + 116.28, + 103.53, + ], + pad_val=0, + seg_pad_val=255, + size=( + 512, + 1024, + ), + std=[ + 58.395, + 57.12, + 57.375, + ], + type='SegDataPreProcessor') +data_root = 'data/cityscapes/' +dataset_type = 'CityscapesDataset' +default_hooks = dict( + checkpoint=dict(by_epoch=False, interval=4000, type='CheckpointHook'), + logger=dict(interval=50, log_metric_by_epoch=False, type='LoggerHook'), + param_scheduler=dict(type='ParamSchedulerHook'), + sampler_seed=dict(type='DistSamplerSeedHook'), + timer=dict(type='IterTimerHook'), + visualization=dict(type='SegVisualizationHook')) +default_scope = 'mmseg' +env_cfg = dict( + cudnn_benchmark=True, + dist_cfg=dict(backend='nccl'), + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0)) +img_ratios = [ + 0.5, + 0.75, + 1.0, + 1.25, + 1.5, + 1.75, +] +load_from = None +log_level = 'INFO' +log_processor = dict(by_epoch=False) +model = dict( + auxiliary_head=dict( + align_corners=False, + channels=256, + concat_input=False, + dropout_ratio=0.1, + in_channels=1024, + in_index=2, + loss_decode=dict( + loss_weight=0.4, type='CrossEntropyLoss', use_sigmoid=False), + norm_cfg=dict(requires_grad=True, type='SyncBN'), + num_classes=19, + num_convs=1, + type='FCNHead'), + backbone=dict( + contract_dilation=True, + depth=50, + dilations=( + 1, + 1, + 2, + 4, + ), + norm_cfg=dict(requires_grad=True, type='SyncBN'), + norm_eval=False, + num_stages=4, + out_indices=( + 0, + 1, + 2, + 3, + ), + strides=( + 1, + 2, + 1, + 1, + ), + style='pytorch', + type='ResNetV1c'), + data_preprocessor=dict( + bgr_to_rgb=True, + mean=[ + 123.675, + 116.28, + 103.53, + ], + pad_val=0, + seg_pad_val=255, + size=( + 512, + 1024, + ), + std=[ + 58.395, + 57.12, + 57.375, + ], + type='SegDataPreProcessor'), + decode_head=dict( + align_corners=False, + channels=512, + dropout_ratio=0.1, + in_channels=2048, + in_index=3, + loss_decode=dict( + loss_weight=1.0, type='CrossEntropyLoss', use_sigmoid=False), + norm_cfg=dict(requires_grad=True, type='SyncBN'), + num_classes=19, + pool_scales=( + 1, + 2, + 3, + 6, + ), + type='PSPHead'), + pretrained='open-mmlab://resnet50_v1c', + test_cfg=dict(mode='whole'), + train_cfg=dict(), + type='EncoderDecoder') +norm_cfg = dict(requires_grad=True, type='SyncBN') +optim_wrapper = dict( + clip_grad=None, + optimizer=dict(lr=0.01, momentum=0.9, type='SGD', weight_decay=0.0005), + type='OptimWrapper') +optimizer = dict(lr=0.01, momentum=0.9, type='SGD', weight_decay=0.0005) +param_scheduler = [ + dict( + begin=0, + by_epoch=False, + end=40000, + eta_min=0.0001, + power=0.9, + type='PolyLR'), +] +resume = False +test_cfg = dict(type='TestLoop') +test_dataloader = dict( + batch_size=1, + dataset=dict( + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + data_root='data/cityscapes/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 1024, + ), type='Resize'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs'), + ], + type='CityscapesDataset'), + num_workers=4, + persistent_workers=True, + sampler=dict(shuffle=False, type='DefaultSampler')) +test_evaluator = dict( + iou_metrics=[ + 'mIoU', + ], type='IoUMetric') +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 1024, + ), type='Resize'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs'), +] +train_cfg = dict(max_iters=40000, type='IterBasedTrainLoop', val_interval=4000) +train_dataloader = dict( + batch_size=2, + dataset=dict( + data_prefix=dict( + img_path='leftImg8bit/train', seg_map_path='gtFine/train'), + data_root='data/cityscapes/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + keep_ratio=True, + ratio_range=( + 0.5, + 2.0, + ), + scale=( + 2048, + 1024, + ), + type='RandomResize'), + dict( + cat_max_ratio=0.75, crop_size=( + 512, + 1024, + ), type='RandomCrop'), + dict(prob=0.5, type='RandomFlip'), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs'), + ], + type='CityscapesDataset'), + num_workers=2, + persistent_workers=True, + sampler=dict(shuffle=True, type='InfiniteSampler')) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + keep_ratio=True, + ratio_range=( + 0.5, + 2.0, + ), + scale=( + 2048, + 1024, + ), + type='RandomResize'), + dict(cat_max_ratio=0.75, crop_size=( + 512, + 1024, + ), type='RandomCrop'), + dict(prob=0.5, type='RandomFlip'), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs'), +] +tta_model = dict(type='SegTTAModel') +tta_pipeline = [ + dict(backend_args=None, type='LoadImageFromFile'), + dict( + transforms=[ + [ + dict(keep_ratio=True, scale_factor=0.5, type='Resize'), + dict(keep_ratio=True, scale_factor=0.75, type='Resize'), + dict(keep_ratio=True, scale_factor=1.0, type='Resize'), + dict(keep_ratio=True, scale_factor=1.25, type='Resize'), + dict(keep_ratio=True, scale_factor=1.5, type='Resize'), + dict(keep_ratio=True, scale_factor=1.75, type='Resize'), + ], + [ + dict(direction='horizontal', prob=0.0, type='RandomFlip'), + dict(direction='horizontal', prob=1.0, type='RandomFlip'), + ], + [ + dict(type='LoadAnnotations'), + ], + [ + dict(type='PackSegInputs'), + ], + ], + type='TestTimeAug'), +] +val_cfg = dict(type='ValLoop') +val_dataloader = dict( + batch_size=1, + dataset=dict( + data_prefix=dict( + img_path='leftImg8bit/val', seg_map_path='gtFine/val'), + data_root='data/cityscapes/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(keep_ratio=True, scale=( + 2048, + 1024, + ), type='Resize'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs'), + ], + type='CityscapesDataset'), + num_workers=4, + persistent_workers=True, + sampler=dict(shuffle=False, type='DefaultSampler')) +val_evaluator = dict( + iou_metrics=[ + 'mIoU', + ], type='IoUMetric') +vis_backends = [ + dict(type='LocalVisBackend'), +] +visualizer = dict( + name='visualizer', + type='SegLocalVisualizer', + vis_backends=[ + dict(type='LocalVisBackend'), + ]) diff --git a/mmsegmentation/requirements.txt b/mmsegmentation/requirements.txt new file mode 100644 index 0000000..501bddc --- /dev/null +++ b/mmsegmentation/requirements.txt @@ -0,0 +1,4 @@ +-r requirements/optional.txt +-r requirements/runtime.txt +-r requirements/tests.txt +-r requirements/multimodal.txt diff --git a/mmsegmentation/requirements/albu.txt b/mmsegmentation/requirements/albu.txt new file mode 100644 index 0000000..f421fbb --- /dev/null +++ b/mmsegmentation/requirements/albu.txt @@ -0,0 +1 @@ +albumentations>=0.3.2 --no-binary qudida,albumentations diff --git a/mmsegmentation/requirements/docs.txt b/mmsegmentation/requirements/docs.txt new file mode 100644 index 0000000..19632d3 --- /dev/null +++ b/mmsegmentation/requirements/docs.txt @@ -0,0 +1,7 @@ +docutils==0.16.0 +myst-parser +-e git+https://github.com/open-mmlab/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme +sphinx==4.0.2 +sphinx_copybutton +sphinx_markdown_tables +urllib3<2.0.0 diff --git a/mmsegmentation/requirements/mminstall.txt b/mmsegmentation/requirements/mminstall.txt new file mode 100644 index 0000000..5732d34 --- /dev/null +++ b/mmsegmentation/requirements/mminstall.txt @@ -0,0 +1,2 @@ +mmcv>=2.0.0rc4,<2.2.0 +mmengine>=0.5.0,<1.0.0 diff --git a/mmsegmentation/requirements/multimodal.txt b/mmsegmentation/requirements/multimodal.txt new file mode 100644 index 0000000..2195d0d --- /dev/null +++ b/mmsegmentation/requirements/multimodal.txt @@ -0,0 +1,2 @@ +ftfy +regex diff --git a/mmsegmentation/requirements/optional.txt b/mmsegmentation/requirements/optional.txt new file mode 100644 index 0000000..b0310f5 --- /dev/null +++ b/mmsegmentation/requirements/optional.txt @@ -0,0 +1,22 @@ +cityscapesscripts +-e git+https://github.com/openai/CLIP.git@main#egg=clip + +# for vpd model +diffusers +einops==0.3.0 +imageio==2.9.0 +imageio-ffmpeg==0.4.2 +invisible-watermark +kornia==0.6 +-e git+https://github.com/CompVis/stable-diffusion@21f890f#egg=latent-diffusion +nibabel +omegaconf==2.1.1 +pudb==2019.2 +pytorch-lightning==1.4.2 +streamlit>=0.73.1 +-e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers +test-tube>=0.7.5 +timm +torch-fidelity==0.3.0 +torchmetrics==0.6.0 +transformers==4.19.2 diff --git a/mmsegmentation/requirements/readthedocs.txt b/mmsegmentation/requirements/readthedocs.txt new file mode 100644 index 0000000..9627504 --- /dev/null +++ b/mmsegmentation/requirements/readthedocs.txt @@ -0,0 +1,6 @@ +mmcv>=2.0.0rc1,<2.1.0 +mmengine>=0.4.0,<1.0.0 +prettytable +scipy +torch +torchvision diff --git a/mmsegmentation/requirements/runtime.txt b/mmsegmentation/requirements/runtime.txt new file mode 100644 index 0000000..3e24258 --- /dev/null +++ b/mmsegmentation/requirements/runtime.txt @@ -0,0 +1,5 @@ +matplotlib +numpy +packaging +prettytable +scipy diff --git a/mmsegmentation/requirements/tests.txt b/mmsegmentation/requirements/tests.txt new file mode 100644 index 0000000..3fff252 --- /dev/null +++ b/mmsegmentation/requirements/tests.txt @@ -0,0 +1,8 @@ +codecov +flake8 +ftfy +interrogate +pytest +regex +xdoctest>=0.10.0 +yapf diff --git a/mmsegmentation/resources/seg_demo.gif b/mmsegmentation/resources/seg_demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f0760fe7a86912c07f9873eec3909ad41fe2acb GIT binary patch literal 951973 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Ž?HrLyN0bTYv{xLq0acAHI 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%0AM5-r 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 @F^1ZSo_F5hh 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

AbL({MeK0?z+G#QW4axPJg}VkQ!ZLX?0p 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

HM!;_W~;5^aKo`3arwtuk;)_vJo0w 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�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ó=Zgqs61FSe%Vk$oM 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%0A|F7fvQOLDQFPf3 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%0A|F7fvQOLDQFPf3 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