diff --git a/docs/zh_cn/advanced_guides/contribute_dataset.md b/docs/zh_cn/advanced_guides/contribute_dataset.md
new file mode 100644
index 0000000000..4222de32a6
--- /dev/null
+++ b/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 库。
+安装完成后,您将能看到如下图所示的文件树。
+
+
+### 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 的图像以便进行训练。
+
+
+### 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/docs/zh_cn/advanced_guides/models.md b/docs/zh_cn/advanced_guides/models.md
index 408a57863c..6eb22517a4 100644
--- a/docs/zh_cn/advanced_guides/models.md
+++ b/docs/zh_cn/advanced_guides/models.md
@@ -30,17 +30,17 @@
## 基本接口
-MMSegmentation 封装 `BaseModel` 并实现了 [BaseSegmenter](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/models/segmentors/base.py#L15) 类,主要提供 `forward`、`train_step`、`val_step` 和 `test_step` 接口。接下来将详细介绍这些接口。
+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
-
+
编码器解码器数据流
-
+
级联编码器解码器数据流
@@ -115,7 +115,7 @@ MMSegmentation 封装 `BaseModel` 并实现了 [BaseSegmenter](https://github.co
-Dict\[str, `torch.Tensor`\]:用于记录日志的张量的`字典`。
-
+
train_step 数据流
@@ -132,7 +132,7 @@ MMSegmentation 封装 `BaseModel` 并实现了 [BaseSegmenter](https://github.co
- `list` - 给定数据的预测结果。
-
+
test_step/val_step 数据流
diff --git a/docs/zh_cn/get_started.md b/docs/zh_cn/get_started.md
index fc26389a4b..b92ab33490 100644
--- a/docs/zh_cn/get_started.md
+++ b/docs/zh_cn/get_started.md
@@ -4,7 +4,7 @@
本教程中,我们将会演示如何使用 PyTorch 准备环境。
-MMSegmentation 可以在 Linux, Windows 和 macOS 系统上运行,并且需要安装 Python 3.6+, CUDA 9.2+ 和 PyTorch 1.5+
+MMSegmentation 可以在 Linux, Windows 和 macOS 系统上运行,并且需要安装 Python 3.7+, CUDA 10.2+ 和 PyTorch 1.8+
**注意:**
如果您已经安装了 PyTorch, 可以跳过该部分,直接到[下一小节](##安装)。否则,您可以按照以下步骤操作。
@@ -194,6 +194,16 @@ docker build -t mmsegmentation docker/
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/docs/zh_cn/notes/faq.md b/docs/zh_cn/notes/faq.md
index e081acc16f..83bcb22e42 100644
--- a/docs/zh_cn/notes/faq.md
+++ b/docs/zh_cn/notes/faq.md
@@ -8,8 +8,9 @@
| MMSegmentation version | MMCV version | MMEngine version | MMClassification (optional) version | MMDetection (optional) version |
| :--------------------: | :----------------------------: | :---------------: | :---------------------------------: | :----------------------------: |
-| dev-1.x branch | mmcv >= 2.0.0rc4 | MMEngine >= 0.7.1 | mmcls==1.0.0rc6 | mmdet >= 3.0.0 |
-| main branch | mmcv >= 2.0.0rc4 | MMEngine >= 0.7.1 | mmcls==1.0.0rc6 | mmdet >= 3.0.0 |
+| 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.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 |
diff --git a/docs/zh_cn/user_guides/2_dataset_prepare.md b/docs/zh_cn/user_guides/2_dataset_prepare.md
index e5e6c76c47..630b72762e 100644
--- a/docs/zh_cn/user_guides/2_dataset_prepare.md
+++ b/docs/zh_cn/user_guides/2_dataset_prepare.md
@@ -2,6 +2,7 @@
我们建议将数据集根目录符号链接到 `$MMSEGMENTATION/data`。
如果您的目录结构不同,您可能需要更改配置文件中相应的路径。
+对于中国境内的用户,我们也推荐通过开源数据平台 [OpenDataLab](https://opendatalab.com/) 来下载dsdl标准数据,以获得更好的下载和使用体验,这里有一个下载dsdl数据集并进行训练的案例[DSDLReadme](../../../configs/dsdl/README.md),欢迎尝试。
```none
mmsegmentation
@@ -345,9 +346,10 @@ python tools/dataset_converters/loveda.py /path/to/loveDA
## ISPRS Potsdam
-[Potsdam](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-potsdam/) 城市语义分割数据集用于 2D 语义分割竞赛 —— Potsdam。
+[Potsdam](https://www.isprs.org/education/benchmarks/UrbanSemLab/2d-sem-label-potsdam.aspx) 城市语义分割数据集用于 2D 语义分割竞赛 —— Potsdam。
-数据集可以在竞赛[主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/)上请求获得。
+数据集可以在竞赛[主页](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 数据集,请运行以下命令调整数据集目录。
@@ -360,9 +362,10 @@ python tools/dataset_converters/potsdam.py /path/to/potsdam
## ISPRS Vaihingen
-[Vaihingen](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-vaihingen/) 城市语义分割数据集用于 2D 语义分割竞赛 —— Vaihingen。
+[Vaihingen](https://www.isprs.org/education/benchmarks/UrbanSemLab/2d-sem-label-vaihingen.aspx) 城市语义分割数据集用于 2D 语义分割竞赛 —— Vaihingen。
-数据集可以在竞赛[主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/)上请求获得。
+数据集可以在竞赛[主页](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 数据集,请运行以下命令调整数据集目录。
@@ -616,3 +619,33 @@ python tools/convert_datasets/refuge.py --raw_data_root=/path/to/refuge/REFUGE2/
- 您可以在配置中使用 `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,与原论文保持一致。
diff --git a/docs/zh_cn/user_guides/5_deployment.md b/docs/zh_cn/user_guides/5_deployment.md
new file mode 100644
index 0000000000..6a2fc69aec
--- /dev/null
+++ b/docs/zh_cn/user_guides/5_deployment.md
@@ -0,0 +1,242 @@
+# 教程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/docs/zh_cn/user_guides/deployment.md b/docs/zh_cn/user_guides/deployment.md
deleted file mode 100644
index f98110c8b5..0000000000
--- a/docs/zh_cn/user_guides/deployment.md
+++ /dev/null
@@ -1 +0,0 @@
-# 模型部署
diff --git a/mmseg/apis/inference.py b/mmseg/apis/inference.py
index 4aadffc798..81cd17d798 100644
--- a/mmseg/apis/inference.py
+++ b/mmseg/apis/inference.py
@@ -187,7 +187,7 @@ def show_result_pyplot(model: BaseSegmentor,
if hasattr(model, 'module'):
model = model.module
if isinstance(img, str):
- image = mmcv.imread(img)
+ image = mmcv.imread(img, channel_order='rgb')
else:
image = img
if save_dir is not None:
diff --git a/mmseg/datasets/__init__.py b/mmseg/datasets/__init__.py
index a90d53c88e..587385bf26 100644
--- a/mmseg/datasets/__init__.py
+++ b/mmseg/datasets/__init__.py
@@ -1,7 +1,7 @@
# Copyright (c) OpenMMLab. All rights reserved.
# yapf: disable
from .ade import ADE20KDataset
-from .basesegdataset import BaseSegDataset
+from .basesegdataset import BaseCDDataset, BaseSegDataset
from .chase_db1 import ChaseDB1Dataset
from .cityscapes import CityscapesDataset
from .coco_stuff import COCOStuffDataset
@@ -9,9 +9,11 @@
from .dataset_wrappers import MultiImageMixDataset
from .decathlon import DecathlonDataset
from .drive import DRIVEDataset
+from .dsdl import DSDLSegDataset
from .hrf import HRFDataset
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
@@ -22,16 +24,18 @@
from .stare import STAREDataset
from .synapse import SynapseDataset
# yapf: disable
-from .transforms import (CLAHE, AdjustGamma, BioMedical3DPad,
+from .transforms import (CLAHE, AdjustGamma, Albu, BioMedical3DPad,
BioMedical3DRandomCrop, BioMedical3DRandomFlip,
BioMedicalGaussianBlur, BioMedicalGaussianNoise,
- BioMedicalRandomGamma, GenerateEdge, LoadAnnotations,
- LoadBiomedicalAnnotation, LoadBiomedicalData,
- LoadBiomedicalImageFromFile, LoadImageFromNDArray,
- PackSegInputs, PhotoMetricDistortion, RandomCrop,
- RandomCutOut, RandomMosaic, RandomRotate,
- RandomRotFlip, Rerange, ResizeShortestEdge,
- ResizeToMultiple, RGB2Gray, SegRescale)
+ 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
@@ -51,5 +55,7 @@
'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur',
'BioMedicalRandomGamma', 'BioMedical3DPad', 'RandomRotFlip',
'SynapseDataset', 'REFUGEDataset', 'MapillaryDataset_v1',
- 'MapillaryDataset_v2'
+ 'MapillaryDataset_v2', 'Albu', 'LEVIRCDDataset',
+ 'LoadMultipleRSImageFromFile', 'LoadSingleRSImageFromFile',
+ 'ConcatCDInput', 'BaseCDDataset', 'DSDLSegDataset'
]
diff --git a/mmseg/datasets/basesegdataset.py b/mmseg/datasets/basesegdataset.py
index ddf476bae9..9c4668c1f5 100644
--- a/mmseg/datasets/basesegdataset.py
+++ b/mmseg/datasets/basesegdataset.py
@@ -235,7 +235,9 @@ def load_data_list(self) -> List[dict]:
data_list = []
img_dir = self.data_prefix.get('img_path', None)
ann_dir = self.data_prefix.get('seg_map_path', None)
- if osp.isfile(self.ann_file):
+ 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:
@@ -250,6 +252,7 @@ def load_data_list(self) -> List[dict]:
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,
@@ -258,7 +261,288 @@ def load_data_list(self) -> List[dict]:
backend_args=self.backend_args):
data_info = dict(img_path=osp.join(img_dir, img))
if ann_dir is not None:
- seg_map = img.replace(self.img_suffix, self.seg_map_suffix)
+ 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
diff --git a/mmseg/datasets/chase_db1.py b/mmseg/datasets/chase_db1.py
index 5cc1fc5677..626ddf75e9 100644
--- a/mmseg/datasets/chase_db1.py
+++ b/mmseg/datasets/chase_db1.py
@@ -1,4 +1,5 @@
# Copyright (c) OpenMMLab. All rights reserved.
+import mmengine.fileio as fileio
from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset
@@ -27,4 +28,5 @@ def __init__(self,
seg_map_suffix=seg_map_suffix,
reduce_zero_label=reduce_zero_label,
**kwargs)
- assert self.file_client.exists(self.data_prefix['img_path'])
+ assert fileio.exists(
+ self.data_prefix['img_path'], backend_args=self.backend_args)
diff --git a/mmseg/datasets/drive.py b/mmseg/datasets/drive.py
index c42e18e711..76c0160a6b 100644
--- a/mmseg/datasets/drive.py
+++ b/mmseg/datasets/drive.py
@@ -1,4 +1,5 @@
# Copyright (c) OpenMMLab. All rights reserved.
+import mmengine.fileio as fileio
from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset
@@ -27,4 +28,5 @@ def __init__(self,
seg_map_suffix=seg_map_suffix,
reduce_zero_label=reduce_zero_label,
**kwargs)
- assert self.file_client.exists(self.data_prefix['img_path'])
+ assert fileio.exists(
+ self.data_prefix['img_path'], backend_args=self.backend_args)
diff --git a/mmseg/datasets/dsdl.py b/mmseg/datasets/dsdl.py
new file mode 100644
index 0000000000..bf7e4e61b5
--- /dev/null
+++ b/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/mmseg/datasets/hrf.py b/mmseg/datasets/hrf.py
index 0df6ccc49c..fd669cce26 100644
--- a/mmseg/datasets/hrf.py
+++ b/mmseg/datasets/hrf.py
@@ -1,4 +1,5 @@
# Copyright (c) OpenMMLab. All rights reserved.
+import mmengine.fileio as fileio
from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset
@@ -27,4 +28,5 @@ def __init__(self,
seg_map_suffix=seg_map_suffix,
reduce_zero_label=reduce_zero_label,
**kwargs)
- assert self.file_client.exists(self.data_prefix['img_path'])
+ assert fileio.exists(
+ self.data_prefix['img_path'], backend_args=self.backend_args)
diff --git a/mmseg/datasets/levir.py b/mmseg/datasets/levir.py
new file mode 100644
index 0000000000..f467481bad
--- /dev/null
+++ b/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/mmseg/datasets/stare.py b/mmseg/datasets/stare.py
index 2bfce23449..1b997bb785 100644
--- a/mmseg/datasets/stare.py
+++ b/mmseg/datasets/stare.py
@@ -1,4 +1,6 @@
# Copyright (c) OpenMMLab. All rights reserved.
+import mmengine.fileio as fileio
+
from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset
@@ -26,4 +28,5 @@ def __init__(self,
seg_map_suffix=seg_map_suffix,
reduce_zero_label=reduce_zero_label,
**kwargs)
- assert self.file_client.exists(self.data_prefix['img_path'])
+ assert fileio.exists(
+ self.data_prefix['img_path'], backend_args=self.backend_args)
diff --git a/mmseg/datasets/transforms/__init__.py b/mmseg/datasets/transforms/__init__.py
index 25f4ee4a98..fe60285471 100644
--- a/mmseg/datasets/transforms/__init__.py
+++ b/mmseg/datasets/transforms/__init__.py
@@ -2,12 +2,13 @@
from .formatting import PackSegInputs
from .loading import (LoadAnnotations, LoadBiomedicalAnnotation,
LoadBiomedicalData, LoadBiomedicalImageFromFile,
- LoadImageFromNDArray)
+ LoadImageFromNDArray, LoadMultipleRSImageFromFile,
+ LoadSingleRSImageFromFile)
# yapf: disable
-from .transforms import (CLAHE, AdjustGamma, BioMedical3DPad,
+from .transforms import (CLAHE, AdjustGamma, Albu, BioMedical3DPad,
BioMedical3DRandomCrop, BioMedical3DRandomFlip,
BioMedicalGaussianBlur, BioMedicalGaussianNoise,
- BioMedicalRandomGamma, GenerateEdge,
+ BioMedicalRandomGamma, ConcatCDInput, GenerateEdge,
PhotoMetricDistortion, RandomCrop, RandomCutOut,
RandomMosaic, RandomRotate, RandomRotFlip, Rerange,
ResizeShortestEdge, ResizeToMultiple, RGB2Gray,
@@ -22,5 +23,6 @@
'LoadBiomedicalAnnotation', 'LoadBiomedicalData', 'GenerateEdge',
'ResizeShortestEdge', 'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur',
'BioMedical3DRandomFlip', 'BioMedicalRandomGamma', 'BioMedical3DPad',
- 'RandomRotFlip'
+ 'RandomRotFlip', 'Albu', 'LoadSingleRSImageFromFile', 'ConcatCDInput',
+ 'LoadMultipleRSImageFromFile'
]
diff --git a/mmseg/datasets/transforms/loading.py b/mmseg/datasets/transforms/loading.py
index d2e93b1abb..001810e817 100644
--- a/mmseg/datasets/transforms/loading.py
+++ b/mmseg/datasets/transforms/loading.py
@@ -12,6 +12,11 @@
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):
@@ -493,3 +498,130 @@ def transform(self, single_input: Union[str, np.ndarray, dict]) -> dict:
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
diff --git a/mmseg/datasets/transforms/transforms.py b/mmseg/datasets/transforms/transforms.py
index fb7e2a0e66..da3bd5f936 100644
--- a/mmseg/datasets/transforms/transforms.py
+++ b/mmseg/datasets/transforms/transforms.py
@@ -1,10 +1,12 @@
# 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.base import BaseTransform
from mmcv.transforms.utils import cache_randomness
@@ -15,6 +17,15 @@
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):
@@ -186,7 +197,7 @@ def transform(self, results: dict) -> dict:
def __repr__(self):
repr_str = self.__class__.__name__
- repr_str += f'(clip_limit={self.clip_limit}, '\
+ repr_str += f'(clip_limit={self.clip_limit}, ' \
f'tile_grid_size={self.tile_grid_size})'
return repr_str
@@ -1151,8 +1162,8 @@ def _mosaic_transform_seg(self, results: dict) -> dict:
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]
+ 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
@@ -1760,9 +1771,9 @@ def __repr__(self):
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='\
+ repr_str += 'different_sigma_per_channel=' \
f'{self.different_sigma_per_channel}, '
- repr_str += 'different_sigma_per_axis='\
+ repr_str += 'different_sigma_per_axis=' \
f'{self.different_sigma_per_axis})'
return repr_str
@@ -2135,3 +2146,178 @@ def __repr__(self):
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'}
+ update_pad_shape (bool): Whether to update padding shape according to \
+ the output shape of the last transform
+ """
+
+ def __init__(self,
+ transforms: List[dict],
+ keymap: Optional[dict] = None,
+ update_pad_shape: bool = False):
+ 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.update_pad_shape = update_pad_shape
+
+ self.aug = Compose([self.albu_builder(t) for t in self.transforms])
+
+ if not keymap:
+ self.keymap_to_albu = {
+ 'img': 'image',
+ 'gt_masks': 'masks',
+ }
+ 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
+ results['image'] = cv2.cvtColor(results['image'], cv2.COLOR_BGR2RGB)
+
+ results = self.aug(**results)
+
+ # Convert back to BGR
+ results['image'] = cv2.cvtColor(results['image'], 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
diff --git a/mmseg/models/backbones/__init__.py b/mmseg/models/backbones/__init__.py
index e3107306ea..d9228a500b 100644
--- a/mmseg/models/backbones/__init__.py
+++ b/mmseg/models/backbones/__init__.py
@@ -3,6 +3,7 @@
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
@@ -28,5 +29,6 @@
'ResNeSt', 'MobileNetV2', 'UNet', 'CGNet', 'MobileNetV3',
'VisionTransformer', 'SwinTransformer', 'MixVisionTransformer',
'BiSeNetV1', 'BiSeNetV2', 'ICNet', 'TIMMBackbone', 'ERFNet', 'PCPVT',
- 'SVT', 'STDCNet', 'STDCContextPathNet', 'BEiT', 'MAE', 'PIDNet', 'MSCAN'
+ 'SVT', 'STDCNet', 'STDCContextPathNet', 'BEiT', 'MAE', 'PIDNet', 'MSCAN',
+ 'DDRNet'
]
diff --git a/mmseg/models/backbones/ddrnet.py b/mmseg/models/backbones/ddrnet.py
new file mode 100644
index 0000000000..4508aade82
--- /dev/null
+++ b/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/mmseg/models/backbones/swin.py b/mmseg/models/backbones/swin.py
index c0ace3c139..67b28a96e1 100644
--- a/mmseg/models/backbones/swin.py
+++ b/mmseg/models/backbones/swin.py
@@ -716,20 +716,22 @@ def init_weights(self):
]
for table_key in relative_position_bias_table_keys:
table_pretrained = state_dict[table_key]
- 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()
+ 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)
diff --git a/mmseg/models/decode_heads/__init__.py b/mmseg/models/decode_heads/__init__.py
index 18235456bc..36c37ec2dd 100644
--- a/mmseg/models/decode_heads/__init__.py
+++ b/mmseg/models/decode_heads/__init__.py
@@ -4,6 +4,7 @@
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
@@ -41,5 +42,5 @@
'SETRMLAHead', 'DPTHead', 'SETRMLAHead', 'SegmenterMaskTransformerHead',
'SegformerHead', 'ISAHead', 'STDCHead', 'IterativeDecodeHead',
'KernelUpdateHead', 'KernelUpdator', 'MaskFormerHead', 'Mask2FormerHead',
- 'LightHamHead', 'PIDHead'
+ 'LightHamHead', 'PIDHead', 'DDRHead'
]
diff --git a/mmseg/models/decode_heads/ddr_head.py b/mmseg/models/decode_heads/ddr_head.py
new file mode 100644
index 0000000000..ba26d6503c
--- /dev/null
+++ b/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/mmseg/models/decode_heads/decode_head.py b/mmseg/models/decode_heads/decode_head.py
index 8bdbb24a1c..4faf54559d 100644
--- a/mmseg/models/decode_heads/decode_head.py
+++ b/mmseg/models/decode_heads/decode_head.py
@@ -45,7 +45,7 @@ class BaseDecodeHead(BaseModule, metaclass=ABCMeta):
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.
+ 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.
diff --git a/mmseg/models/losses/__init__.py b/mmseg/models/losses/__init__.py
index 2f7e39cb28..9af5e40f23 100644
--- a/mmseg/models/losses/__init__.py
+++ b/mmseg/models/losses/__init__.py
@@ -5,6 +5,7 @@
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 .tversky_loss import TverskyLoss
@@ -14,5 +15,6 @@
'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy',
'mask_cross_entropy', 'CrossEntropyLoss', 'reduce_loss',
'weight_reduce_loss', 'weighted_loss', 'LovaszLoss', 'DiceLoss',
- 'FocalLoss', 'TverskyLoss', 'OhemCrossEntropy', 'BoundaryLoss'
+ 'FocalLoss', 'TverskyLoss', 'OhemCrossEntropy', 'BoundaryLoss',
+ 'HuasdorffDisstanceLoss'
]
diff --git a/mmseg/models/losses/cross_entropy_loss.py b/mmseg/models/losses/cross_entropy_loss.py
index 770b997486..caad344109 100644
--- a/mmseg/models/losses/cross_entropy_loss.py
+++ b/mmseg/models/losses/cross_entropy_loss.py
@@ -124,7 +124,7 @@ def binary_cross_entropy(pred,
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()
+ 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), \
diff --git a/mmseg/models/losses/dice_loss.py b/mmseg/models/losses/dice_loss.py
index 2ee89a81f4..2b7c9d4cf1 100644
--- a/mmseg/models/losses/dice_loss.py
+++ b/mmseg/models/losses/dice_loss.py
@@ -1,125 +1,160 @@
# Copyright (c) OpenMMLab. All rights reserved.
-"""Modified from https://github.com/LikeLy-Journey/SegmenTron/blob/master/
-segmentron/solver/loss.py (Apache-2.0 License)"""
import torch
import torch.nn as nn
-import torch.nn.functional as F
from mmseg.registry import MODELS
-from .utils import get_class_weight, weighted_loss
-
-
-@weighted_loss
-def dice_loss(pred,
- target,
- valid_mask,
- smooth=1,
- exponent=2,
- 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:
- dice_loss = binary_dice_loss(
- pred[:, i],
- target[..., i],
- valid_mask=valid_mask,
- smooth=smooth,
- exponent=exponent)
- if class_weight is not None:
- dice_loss *= class_weight[i]
- total_loss += dice_loss
- return total_loss / num_classes
-
-
-@weighted_loss
-def binary_dice_loss(pred, target, valid_mask, smooth=1, exponent=2, **kwards):
- 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)
-
- num = torch.sum(torch.mul(pred, target) * valid_mask, dim=1) * 2 + smooth
- den = torch.sum(pred.pow(exponent) + target.pow(exponent), dim=1) + smooth
-
- return 1 - num / den
+from .utils import weight_reduce_loss
+
+
+def dice_loss(
+ pred,
+ target,
+ weight,
+ eps=1e-3,
+ reduction='mean',
+ naive_dice=False,
+ avg_factor=None,
+):
+ """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.
+ """
-@MODELS.register_module()
-class DiceLoss(nn.Module):
- """DiceLoss.
+ input = pred.flatten(1)
+ target = target.flatten(1).float()
- This loss is proposed in `V-Net: Fully Convolutional Neural Networks for
- Volumetric Medical Image Segmentation `_.
+ 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)
- Args:
- smooth (float): A float number to smooth loss, and avoid NaN error.
- Default: 1
- exponent (float): An float number to calculate denominator
- value: \\sum{x^exponent} + \\sum{y^exponent}. Default: 2.
- 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. Default to 1.0.
- ignore_index (int | None): The label index to be ignored. Default: 255.
- 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'.
- """
+ 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,
- smooth=1,
- exponent=2,
+ use_sigmoid=True,
+ activate=True,
reduction='mean',
- class_weight=None,
+ naive_dice=False,
loss_weight=1.0,
ignore_index=255,
- loss_name='loss_dice',
- **kwards):
+ 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 | None): 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.smooth = smooth
- self.exponent = exponent
+ self.use_sigmoid = use_sigmoid
self.reduction = reduction
- self.class_weight = get_class_weight(class_weight)
+ 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,
- **kwards):
+ reduction_override=None):
+ """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
+ """
+
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 = 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()
+
+ if self.activate:
+ if self.use_sigmoid:
+ pred = pred.sigmoid()
+ else:
+ raise NotImplementedError
loss = self.loss_weight * dice_loss(
pred,
- one_hot_target,
- valid_mask=valid_mask,
+ target,
+ weight,
+ eps=self.eps,
reduction=reduction,
+ naive_dice=self.naive_dice,
avg_factor=avg_factor,
- smooth=self.smooth,
- exponent=self.exponent,
- class_weight=class_weight,
- ignore_index=self.ignore_index)
+ )
+
return loss
@property
diff --git a/mmseg/models/losses/focal_loss.py b/mmseg/models/losses/focal_loss.py
index 104d6602c8..6507ed7a91 100644
--- a/mmseg/models/losses/focal_loss.py
+++ b/mmseg/models/losses/focal_loss.py
@@ -271,7 +271,13 @@ def forward(self,
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)
+ 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)
@@ -280,7 +286,11 @@ def forward(self,
else:
one_hot_target = None
if target.dim() == 1:
- target = F.one_hot(target, num_classes=num_classes)
+ 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)
diff --git a/mmseg/models/losses/huasdorff_distance_loss.py b/mmseg/models/losses/huasdorff_distance_loss.py
new file mode 100644
index 0000000000..d950ba728f
--- /dev/null
+++ b/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/mmseg/models/losses/utils.py b/mmseg/models/losses/utils.py
index f74efcf35c..0478034733 100644
--- a/mmseg/models/losses/utils.py
+++ b/mmseg/models/losses/utils.py
@@ -25,7 +25,7 @@ def get_class_weight(class_weight):
return class_weight
-def reduce_loss(loss, reduction):
+def reduce_loss(loss, reduction) -> torch.Tensor:
"""Reduce loss as specified.
Args:
@@ -45,7 +45,10 @@ def reduce_loss(loss, reduction):
return loss.sum()
-def weight_reduce_loss(loss, weight=None, reduction='mean', avg_factor=None):
+def weight_reduce_loss(loss,
+ weight=None,
+ reduction='mean',
+ avg_factor=None) -> torch.Tensor:
"""Apply element-wise weight and reduce loss.
Args:
diff --git a/mmseg/models/segmentors/encoder_decoder.py b/mmseg/models/segmentors/encoder_decoder.py
index 370d0305fd..b68dab1e9c 100644
--- a/mmseg/models/segmentors/encoder_decoder.py
+++ b/mmseg/models/segmentors/encoder_decoder.py
@@ -33,7 +33,7 @@ class EncoderDecoder(BaseSegmentor):
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``.
+ ``SegDataSample`` including ``pred_sem_seg`` and ``seg_logits``.
.. code:: text
@@ -326,8 +326,9 @@ def inference(self, inputs: Tensor, batch_img_metas: List[dict]) -> Tensor:
Tensor: The segmentation results, seg_logits from model of each
input image.
"""
-
- assert self.test_cfg.mode in ['slide', 'whole']
+ 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']
assert all(_['ori_shape'] == ori_shape for _ in batch_img_metas)
if self.test_cfg.mode == 'slide':
diff --git a/mmseg/models/segmentors/seg_tta.py b/mmseg/models/segmentors/seg_tta.py
index eacb6c00a9..5b8eb1d7b0 100644
--- a/mmseg/models/segmentors/seg_tta.py
+++ b/mmseg/models/segmentors/seg_tta.py
@@ -44,5 +44,6 @@ def merge_preds(self, data_samples_list: List[SampleList]) -> SampleList:
'pred_sem_seg': PixelData(data=seg_pred),
'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/mmseg/version.py b/mmseg/version.py
index 748e4cb495..3a632a31e8 100644
--- a/mmseg/version.py
+++ b/mmseg/version.py
@@ -1,6 +1,6 @@
# Copyright (c) Open-MMLab. All rights reserved.
-__version__ = '1.0.0'
+__version__ = '1.1.0'
def parse_version_info(version_str):
diff --git a/mmseg/visualization/local_visualizer.py b/mmseg/visualization/local_visualizer.py
index 504004dfcb..0d693e5820 100644
--- a/mmseg/visualization/local_visualizer.py
+++ b/mmseg/visualization/local_visualizer.py
@@ -108,14 +108,14 @@ def _draw_sem_seg(self, image: np.ndarray, sem_seg: PixelData,
colors = [palette[label] for label in labels]
- self.set_image(image)
-
- # draw semantic masks
+ mask = np.zeros_like(image, dtype=np.uint8)
for label, color in zip(labels, colors):
- self.draw_binary_masks(
- sem_seg == label, colors=[color], alphas=self.alpha)
+ mask[sem_seg[0] == label, :] = color
- return self.get_image()
+ color_seg = (image * (1 - self.alpha) + mask * self.alpha).astype(
+ np.uint8)
+ self.set_image(color_seg)
+ return color_seg
def set_dataset_meta(self,
classes: Optional[List] = None,
@@ -226,6 +226,6 @@ def add_datasample(
self.show(drawn_img, win_name=name, wait_time=wait_time)
if out_file is not None:
- mmcv.imwrite(mmcv.bgr2rgb(drawn_img), out_file)
+ mmcv.imwrite(mmcv.rgb2bgr(drawn_img), out_file)
else:
self.add_image(name, drawn_img, step)
diff --git a/model-index.yml b/model-index.yml
index 5e87c386dd..3fe6a2e03d 100644
--- a/model-index.yml
+++ b/model-index.yml
@@ -8,11 +8,13 @@ Import:
- 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/dsdl/metafile.yaml
- configs/emanet/metafile.yaml
- configs/encnet/metafile.yaml
- configs/erfnet/metafile.yaml
diff --git a/projects/XDecoder/README.md b/projects/XDecoder/README.md
new file mode 100644
index 0000000000..3d55575c6b
--- /dev/null
+++ b/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/projects/gid_dataset/configs/_base_/datasets/gid.py b/projects/gid_dataset/configs/_base_/datasets/gid.py
new file mode 100644
index 0000000000..f7218105f2
--- /dev/null
+++ b/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/projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py b/projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py
new file mode 100644
index 0000000000..70cb6005f8
--- /dev/null
+++ b/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/projects/gid_dataset/mmseg/datasets/gid.py b/projects/gid_dataset/mmseg/datasets/gid.py
new file mode 100644
index 0000000000..a9e8c510b4
--- /dev/null
+++ b/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/projects/gid_dataset/tools/dataset_converters/gid.py b/projects/gid_dataset/tools/dataset_converters/gid.py
new file mode 100644
index 0000000000..d95654aa14
--- /dev/null
+++ b/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/projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py b/projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py
new file mode 100644
index 0000000000..d3eeff2690
--- /dev/null
+++ b/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/projects/gid_dataset/user_guides/2_dataset_prepare.md b/projects/gid_dataset/user_guides/2_dataset_prepare.md
new file mode 100644
index 0000000000..63bd4d46fc
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/README.md b/projects/medical/2d_image/ct/cranium/README.md
new file mode 100644
index 0000000000..d3fa64ea40
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/configs/cranium_512x512.py b/projects/medical/2d_image/ct/cranium/configs/cranium_512x512.py
new file mode 100644
index 0000000000..d9b44362a5
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_cranium-512x512.py b/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 0000000000..ac013a215a
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_cranium-512x512.py b/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_cranium-512x512.py
new file mode 100644
index 0000000000..c71110a21f
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_cranium-512x512.py b/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_cranium-512x512.py
new file mode 100644
index 0000000000..abbdac285b
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_cranium-512x512.py b/projects/medical/2d_image/ct/cranium/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_cranium-512x512.py
new file mode 100644
index 0000000000..418595268f
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/datasets/cranium_dataset.py b/projects/medical/2d_image/ct/cranium/datasets/cranium_dataset.py
new file mode 100644
index 0000000000..d65f1cbfc6
--- /dev/null
+++ b/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/projects/medical/2d_image/ct/cranium/tools/prepare_dataset.py b/projects/medical/2d_image/ct/cranium/tools/prepare_dataset.py
new file mode 100644
index 0000000000..1aa4e43561
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/README.md b/projects/medical/2d_image/dermoscopy/isic2016_task1/README.md
new file mode 100644
index 0000000000..6e44e415ed
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2016-task1-512x512.py b/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 0000000000..5638de4d56
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2016-task1-512x512.py b/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 0000000000..bf17faa538
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2016-task1-512x512.py b/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 0000000000..f7bfcf6158
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/isic2016-task1_512x512.py b/projects/medical/2d_image/dermoscopy/isic2016_task1/configs/isic2016-task1_512x512.py
new file mode 100644
index 0000000000..029f5d4d7e
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/datasets/isic2016-task1_dataset.py b/projects/medical/2d_image/dermoscopy/isic2016_task1/datasets/isic2016-task1_dataset.py
new file mode 100644
index 0000000000..8f11bdd0ba
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py b/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py
new file mode 100755
index 0000000000..ef4dad5408
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/README.md b/projects/medical/2d_image/dermoscopy/isic2017_task1/README.md
new file mode 100644
index 0000000000..c7cc27096b
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_isic2017-task1-512x512.py b/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 0000000000..58d0a125d3
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_isic2017-task1-512x512.py b/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 0000000000..3becacf64f
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_isic2017-task1-512x512.py b/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 0000000000..654ef4dc3d
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/isic2017-task1_512x512.py b/projects/medical/2d_image/dermoscopy/isic2017_task1/configs/isic2017-task1_512x512.py
new file mode 100644
index 0000000000..95997a1099
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/datasets/isic2017-task1_dataset.py b/projects/medical/2d_image/dermoscopy/isic2017_task1/datasets/isic2017-task1_dataset.py
new file mode 100644
index 0000000000..8f11bdd0ba
--- /dev/null
+++ b/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/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py b/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py
new file mode 100755
index 0000000000..b3643c9359
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/README.md b/projects/medical/2d_image/endoscopy/kvasir_seg/README.md
new file mode 100644
index 0000000000..ea597bc440
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_kvasir-seg-512x512.py b/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 0000000000..145d5a7a17
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-512x512.py b/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 0000000000..3ea05c5109
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-512x512.py b/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 0000000000..7e064a716a
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-512x512.py b/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 0000000000..0fc1d6e99d
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/configs/kvasir-seg_512x512.py b/projects/medical/2d_image/endoscopy/kvasir_seg/configs/kvasir-seg_512x512.py
new file mode 100644
index 0000000000..e8b2467f8c
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/datasets/kvasir-seg_dataset.py b/projects/medical/2d_image/endoscopy/kvasir_seg/datasets/kvasir-seg_dataset.py
new file mode 100644
index 0000000000..9d601328eb
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg/tools/prepare_dataset.py b/projects/medical/2d_image/endoscopy/kvasir_seg/tools/prepare_dataset.py
new file mode 100644
index 0000000000..74c43e9635
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/README.md b/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/README.md
new file mode 100644
index 0000000000..80eb00f51b
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_kvasir-seg-aliyun-512x512.py b/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 0000000000..b59db95232
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_kvasir-seg-aliyun-512x512.py b/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 0000000000..6c526680cd
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_kvasir-seg-aliyun-512x512.py b/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 0000000000..a192a5bd24
--- /dev/null
+++ b/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/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/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 0000000000..5325e1f080
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/kvasir-seg-aliyun_512x512.py b/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/configs/kvasir-seg-aliyun_512x512.py
new file mode 100644
index 0000000000..5f86880467
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/datasets/kvasir-seg-aliyun_dataset.py b/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/datasets/kvasir-seg-aliyun_dataset.py
new file mode 100644
index 0000000000..198caf07bc
--- /dev/null
+++ b/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/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/tools/prepare_dataset.py b/projects/medical/2d_image/endoscopy/kvasir_seg_aliyun/tools/prepare_dataset.py
new file mode 100644
index 0000000000..b230e7fef5
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/README.md b/projects/medical/2d_image/fluorescein_angriogram/vampire/README.md
new file mode 100644
index 0000000000..c2c61c46a0
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py b/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 0000000000..7f5273aaff
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py b/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 0000000000..4382229989
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py b/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 0000000000..8d93e17627
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py
new file mode 100755
index 0000000000..4eda92f9f2
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py
new file mode 100755
index 0000000000..93f9cbf050
--- /dev/null
+++ b/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py
@@ -0,0 +1,3 @@
+from .vampire_dataset import VampireDataset
+
+__all__ = ['VampireDataset']
diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py
new file mode 100755
index 0000000000..4d38040f7f
--- /dev/null
+++ b/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/projects/medical/2d_image/fluorescein_angriogram/vampire/tools/prepare_dataset.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/tools/prepare_dataset.py
new file mode 100644
index 0000000000..2755b5d28b
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/README.md b/projects/medical/2d_image/fundus_photography/dr_hagis/README.md
new file mode 100644
index 0000000000..85d8a3e271
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/configs/dr-hagis_512x512.py b/projects/medical/2d_image/fundus_photography/dr_hagis/configs/dr-hagis_512x512.py
new file mode 100644
index 0000000000..93b9638410
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_dr-hagis-512x512.py b/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 0000000000..9d14427c45
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_dr-hagis-512x512.py b/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 0000000000..507ec748bf
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_dr-hagis-512x512.py b/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 0000000000..092ae00a7d
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/datasets/dr-hagis_dataset.py b/projects/medical/2d_image/fundus_photography/dr_hagis/datasets/dr-hagis_dataset.py
new file mode 100644
index 0000000000..9659f0b8d7
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py b/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py
new file mode 100755
index 0000000000..51f4df7dac
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/README.md b/projects/medical/2d_image/fundus_photography/gamma3/README.md
new file mode 100644
index 0000000000..e834508fcb
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_gamma3-512x512.py b/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 0000000000..0daac51e10
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_gamma3-512x512.py b/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 0000000000..8a25cd0d26
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_gamma3-512x512.py b/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 0000000000..ea64843867
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/configs/gamma3_512x512.py b/projects/medical/2d_image/fundus_photography/gamma3/configs/gamma3_512x512.py
new file mode 100644
index 0000000000..d23ab55ca7
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/datasets/gamma3_dataset.py b/projects/medical/2d_image/fundus_photography/gamma3/datasets/gamma3_dataset.py
new file mode 100644
index 0000000000..56cbdd63e6
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/gamma3/tools/prepare_dataset.py b/projects/medical/2d_image/fundus_photography/gamma3/tools/prepare_dataset.py
new file mode 100644
index 0000000000..eb820b6b74
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/README.md b/projects/medical/2d_image/fundus_photography/orvs/README.md
new file mode 100644
index 0000000000..6f09203ac4
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_orvs-512x512.py b/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 0000000000..662f837158
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_orvs-512x512.py b/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 0000000000..c47cdb6b24
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_orvs-512x512.py b/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 0000000000..1097aade28
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/configs/orvs_512x512.py b/projects/medical/2d_image/fundus_photography/orvs/configs/orvs_512x512.py
new file mode 100644
index 0000000000..a5594dec38
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/datasets/orvs_dataset.py b/projects/medical/2d_image/fundus_photography/orvs/datasets/orvs_dataset.py
new file mode 100644
index 0000000000..e915ae4cd2
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py b/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py
new file mode 100755
index 0000000000..f902d87101
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/README.md b/projects/medical/2d_image/fundus_photography/rite/README.md
new file mode 100644
index 0000000000..0aea9b00d1
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_rite-512x512.py b/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 0000000000..27dd4363b1
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_rite-512x512.py b/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 0000000000..48f6f973a1
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_rite-512x512.py b/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 0000000000..5f5b24ba6a
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_rite-512x512.py b/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 0000000000..bf66b6f320
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/configs/rite_512x512.py b/projects/medical/2d_image/fundus_photography/rite/configs/rite_512x512.py
new file mode 100644
index 0000000000..02f620c665
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/datasets/rite_dataset.py b/projects/medical/2d_image/fundus_photography/rite/datasets/rite_dataset.py
new file mode 100644
index 0000000000..99f688de94
--- /dev/null
+++ b/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/projects/medical/2d_image/fundus_photography/rite/tools/prepare_dataset.py b/projects/medical/2d_image/fundus_photography/rite/tools/prepare_dataset.py
new file mode 100644
index 0000000000..ca7e996961
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/README.md b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/README.md
new file mode 100644
index 0000000000..97c4a0f0e5
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/breastCancerCellSegmentation_512x512.py b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/breastCancerCellSegmentation_512x512.py
new file mode 100644
index 0000000000..1cf0fccf5b
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breastCancerCellSegmentation-512x512.py b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_breastCancerCellSegmentation-512x512.py
new file mode 100644
index 0000000000..55d1708968
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breastCancerCellSegmentation-512x512.py b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_breastCancerCellSegmentation-512x512.py
new file mode 100644
index 0000000000..cf28aad739
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breastCancerCellSegmentation-512x512.py b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_breastCancerCellSegmentation-512x512.py
new file mode 100644
index 0000000000..29aaff3894
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/datasets/breastCancerCellSegmentation_dataset.py b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/datasets/breastCancerCellSegmentation_dataset.py
new file mode 100644
index 0000000000..eeceb6318c
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/breastCancerCellSegmentation/tools/prepare_dataset.py
new file mode 100644
index 0000000000..09cc689c86
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/README.md b/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/README.md
new file mode 100644
index 0000000000..b6f1ca6341
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/breast-cancer-cell-seg_512x512.py b/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/configs/breast-cancer-cell-seg_512x512.py
new file mode 100644
index 0000000000..ead40e4345
--- /dev/null
+++ b/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/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/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 0000000000..691a0ff613
--- /dev/null
+++ b/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/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/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 0000000000..719b767ab1
--- /dev/null
+++ b/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/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/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 0000000000..9dfe70f761
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/datasets/breast-cancer-cell-seg_dataset.py b/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/datasets/breast-cancer-cell-seg_dataset.py
new file mode 100644
index 0000000000..6f27029d39
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py
new file mode 100755
index 0000000000..775f2eed18
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/README.md b/projects/medical/2d_image/histopathology/conic2022_seg/README.md
new file mode 100644
index 0000000000..1f55b44ed6
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/configs/conic2022-seg_512x512.py b/projects/medical/2d_image/histopathology/conic2022_seg/configs/conic2022-seg_512x512.py
new file mode 100644
index 0000000000..51b4e5782a
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_conic2022-512x512.py b/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 0000000000..3e0248c78c
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_conic2022-512x512.py b/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 0000000000..fd0e9d8d28
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_conic2022-512x512.py b/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 0000000000..bb667f14fd
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/conic2022_seg_dataset.png b/projects/medical/2d_image/histopathology/conic2022_seg/conic2022_seg_dataset.png
new file mode 100644
index 0000000000..65bb0bbe0a
Binary files /dev/null and b/projects/medical/2d_image/histopathology/conic2022_seg/conic2022_seg_dataset.png differ
diff --git a/projects/medical/2d_image/histopathology/conic2022_seg/datasets/conic2022-seg_dataset.py b/projects/medical/2d_image/histopathology/conic2022_seg/datasets/conic2022-seg_dataset.py
new file mode 100644
index 0000000000..9af0958ab3
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py
new file mode 100755
index 0000000000..89cfb4aae2
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/README.md b/projects/medical/2d_image/histopathology/consep/README.md
new file mode 100644
index 0000000000..ca3d7aa108
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/configs/consep_512x512.py b/projects/medical/2d_image/histopathology/consep/configs/consep_512x512.py
new file mode 100644
index 0000000000..0d9b8948b0
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_consep-512x512.py b/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_consep-512x512.py
new file mode 100644
index 0000000000..cbcf5db775
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_consep-512x512.py b/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_consep-512x512.py
new file mode 100644
index 0000000000..b374566e6e
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_consep-512x512.py b/projects/medical/2d_image/histopathology/consep/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_consep-512x512.py
new file mode 100644
index 0000000000..35bdaa34c8
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/datasets/consep_dataset.py b/projects/medical/2d_image/histopathology/consep/datasets/consep_dataset.py
new file mode 100644
index 0000000000..ceb2b3ab25
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py
new file mode 100755
index 0000000000..83a2e18ce1
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/README.md b/projects/medical/2d_image/histopathology/fusc2021/README.md
new file mode 100644
index 0000000000..8130d59350
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_fusc2021-512x512.py b/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_fusc2021-512x512.py
new file mode 100644
index 0000000000..c3f4275112
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_fusc2021-512x512.py b/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_fusc2021-512x512.py
new file mode 100644
index 0000000000..ed870303ff
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_fusc2021-512x512.py b/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_fusc2021-512x512.py
new file mode 100644
index 0000000000..cbc09ae6cd
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_fusc2021-512x512.py b/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 0000000000..f1477ee725
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/configs/fusc2021_512x512.py b/projects/medical/2d_image/histopathology/fusc2021/configs/fusc2021_512x512.py
new file mode 100644
index 0000000000..e650474cea
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/datasets/fusc2021_dataset.py b/projects/medical/2d_image/histopathology/fusc2021/datasets/fusc2021_dataset.py
new file mode 100644
index 0000000000..d331ac8c3a
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/fusc2021/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/fusc2021/tools/prepare_dataset.py
new file mode 100644
index 0000000000..8f2de3daa9
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/README.md b/projects/medical/2d_image/histopathology/pannuke/README.md
new file mode 100644
index 0000000000..e0cade7536
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet-{use-sigmoid}_1xb16-0.01-20k_bactteria-detection-512x512.py b/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 0000000000..92584e9a68
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pannuke-512x512.py b/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pannuke-512x512.py
new file mode 100644
index 0000000000..042a08ce00
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pannuke-512x512.py b/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pannuke-512x512.py
new file mode 100644
index 0000000000..e92514c913
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pannuke-512x512.py b/projects/medical/2d_image/histopathology/pannuke/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pannuke-512x512.py
new file mode 100644
index 0000000000..a9403c849f
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/configs/pannuke_512x512.py b/projects/medical/2d_image/histopathology/pannuke/configs/pannuke_512x512.py
new file mode 100644
index 0000000000..316ac1ac44
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/datasets/pannuke_dataset.py b/projects/medical/2d_image/histopathology/pannuke/datasets/pannuke_dataset.py
new file mode 100644
index 0000000000..4d3c687ff3
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pannuke/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/pannuke/tools/prepare_dataset.py
new file mode 100644
index 0000000000..7213b181f4
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/README.md b/projects/medical/2d_image/histopathology/pcam/README.md
new file mode 100644
index 0000000000..5a8094950c
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pcam-512x512.py b/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_pcam-512x512.py
new file mode 100644
index 0000000000..20601f1ea5
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pcam-512x512.py b/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_pcam-512x512.py
new file mode 100644
index 0000000000..c057535409
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py b/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_pcam-512x512.py
new file mode 100644
index 0000000000..4c1d5fe421
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_pcam-512x512.py b/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 0000000000..25e3734795
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/configs/pcam_512x512.py b/projects/medical/2d_image/histopathology/pcam/configs/pcam_512x512.py
new file mode 100644
index 0000000000..04efc23eb5
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/datasets/pcam_dataset.py b/projects/medical/2d_image/histopathology/pcam/datasets/pcam_dataset.py
new file mode 100644
index 0000000000..1c27de543a
--- /dev/null
+++ b/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/projects/medical/2d_image/histopathology/pcam/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/pcam/tools/prepare_dataset.py
new file mode 100644
index 0000000000..75038e6fb4
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/README.md b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/README.md
new file mode 100644
index 0000000000..ca95921ba3
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py b/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 0000000000..375ad5abf2
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py b/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 0000000000..a7ecf6dd45
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py b/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 0000000000..28556df53d
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py
new file mode 100755
index 0000000000..cb4c292d1f
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py
new file mode 100755
index 0000000000..6f1d051bcf
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py
new file mode 100755
index 0000000000..c9e0a8ed21
--- /dev/null
+++ b/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/projects/medical/2d_image/infrared_reflectance_imaging/ravir/tools/prepare_dataset.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/tools/prepare_dataset.py
new file mode 100644
index 0000000000..068dcad814
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/README.md b/projects/medical/2d_image/microscopy_images/2pm_vessel/README.md
new file mode 100644
index 0000000000..1feb433a31
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/2pm-vessel_512x512.py b/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/2pm-vessel_512x512.py
new file mode 100644
index 0000000000..124403fa97
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_2pm-vessel-512x512.py b/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 0000000000..2a429e9068
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_2pm-vessel-512x512.py b/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 0000000000..10d9bb82f2
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_2pm-vessel-512x512.py b/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 0000000000..65c1579ec7
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/configs/fcn-unet-s5-d16_unet_1xb16-0.01lr-sigmoid-20k_bactteria-detection-512x512.py b/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 0000000000..91ed6ada3f
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/datasets/2pm-vessel_dataset.py b/projects/medical/2d_image/microscopy_images/2pm_vessel/datasets/2pm-vessel_dataset.py
new file mode 100644
index 0000000000..984b5a1361
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/2pm_vessel/tools/prepare_dataset.py b/projects/medical/2d_image/microscopy_images/2pm_vessel/tools/prepare_dataset.py
new file mode 100644
index 0000000000..1b46af2cad
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/README.md b/projects/medical/2d_image/microscopy_images/bactteria_detection/README.md
new file mode 100644
index 0000000000..1cedda715a
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/bactteria-detection_512x512.py b/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/bactteria-detection_512x512.py
new file mode 100644
index 0000000000..e3eab4e386
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_bactteria-detection-512x512.py b/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 0000000000..ede58d785c
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_bactteria-detection-512x512.py b/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 0000000000..bde3fa14ac
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_bactteria-detection-512x512.py b/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 0000000000..08e204f380
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/datasets/bactteria-detection_dataset.py b/projects/medical/2d_image/microscopy_images/bactteria_detection/datasets/bactteria-detection_dataset.py
new file mode 100644
index 0000000000..c95097b1ac
--- /dev/null
+++ b/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/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py b/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py
new file mode 100755
index 0000000000..8dcc719e26
--- /dev/null
+++ b/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/projects/medical/2d_image/tools/split_seg_dataset.py b/projects/medical/2d_image/tools/split_seg_dataset.py
new file mode 100644
index 0000000000..9ab2e9282f
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_image_pneum/README.md b/projects/medical/2d_image/x_ray/chest_image_pneum/README.md
new file mode 100644
index 0000000000..a1cd27ba45
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_image_pneum/configs/chest-image-pneum_512x512.py b/projects/medical/2d_image/x_ray/chest_image_pneum/configs/chest-image-pneum_512x512.py
new file mode 100644
index 0000000000..411229bd41
--- /dev/null
+++ b/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/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/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 0000000000..0f26459467
--- /dev/null
+++ b/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/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/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 0000000000..37b91889d8
--- /dev/null
+++ b/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/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/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 0000000000..379e8181f3
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_image_pneum/datasets/chest-image-pneum_dataset.py b/projects/medical/2d_image/x_ray/chest_image_pneum/datasets/chest-image-pneum_dataset.py
new file mode 100644
index 0000000000..aeee60ae92
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py b/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py
new file mode 100755
index 0000000000..47eddc96dc
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/README.md b/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/README.md
new file mode 100644
index 0000000000..7cb099c8a4
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/configs/chest-x-ray-images-with-pneumothorax-masks_512x512.py b/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 0000000000..96676de861
--- /dev/null
+++ b/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/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/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 0000000000..76c214d04c
--- /dev/null
+++ b/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/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/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 0000000000..066996dda9
--- /dev/null
+++ b/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/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/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 0000000000..a7065b8231
--- /dev/null
+++ b/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/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/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 0000000000..e5682ee76b
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/datasets/chest-x-ray-images-with-pneumothorax-masks_dataset.py b/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 0000000000..d32f597a5a
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/tools/prepare_dataset.py b/projects/medical/2d_image/x_ray/chest_x_ray_images_with_pneumothorax_masks/tools/prepare_dataset.py
new file mode 100644
index 0000000000..c7de1f1904
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/covid_19_ct_cxr/README.md b/projects/medical/2d_image/x_ray/covid_19_ct_cxr/README.md
new file mode 100644
index 0000000000..8469219eff
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/covid-19-ct-cxr_512x512.py b/projects/medical/2d_image/x_ray/covid_19_ct_cxr/configs/covid-19-ct-cxr_512x512.py
new file mode 100644
index 0000000000..5242d06c37
--- /dev/null
+++ b/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/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/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 0000000000..59a7bedaa0
--- /dev/null
+++ b/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/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/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 0000000000..83b8527d46
--- /dev/null
+++ b/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/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/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 0000000000..10cfcbda6e
--- /dev/null
+++ b/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/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/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 0000000000..aaccc8fd8d
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/covid_19_ct_cxr/datasets/covid-19-ct-cxr_dataset.py b/projects/medical/2d_image/x_ray/covid_19_ct_cxr/datasets/covid-19-ct-cxr_dataset.py
new file mode 100644
index 0000000000..68a1bb331f
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/covid_19_ct_cxr/tools/prepare_dataset.py b/projects/medical/2d_image/x_ray/covid_19_ct_cxr/tools/prepare_dataset.py
new file mode 100644
index 0000000000..72f6435389
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/README.md b/projects/medical/2d_image/x_ray/crass/README.md
new file mode 100644
index 0000000000..0621205be8
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/configs/crass_512x512.py b/projects/medical/2d_image/x_ray/crass/configs/crass_512x512.py
new file mode 100644
index 0000000000..1425f50cc4
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_crass-512x512.py b/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 0000000000..b52bc78f79
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_crass-512x512.py b/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 0000000000..45242c65b4
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_crass-512x512.py b/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 0000000000..bcf9d0a5ca
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/configs/fcn-unet-s5-d16_unet_1xb16-lr0.01-sigmoid-20k_crass-512x512.py b/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 0000000000..0dde736bf7
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/datasets/crass_dataset.py b/projects/medical/2d_image/x_ray/crass/datasets/crass_dataset.py
new file mode 100644
index 0000000000..f6b5c5228b
--- /dev/null
+++ b/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/projects/medical/2d_image/x_ray/crass/tools/prepare_dataset.py b/projects/medical/2d_image/x_ray/crass/tools/prepare_dataset.py
new file mode 100644
index 0000000000..bbd5d8891d
--- /dev/null
+++ b/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/projects/sam_inference_demo/sam_image_demo.ipynb b/projects/sam_inference_demo/sam_image_demo.ipynb
index dacbfed11c..1cb433fae9 100644
--- a/projects/sam_inference_demo/sam_image_demo.ipynb
+++ b/projects/sam_inference_demo/sam_image_demo.ipynb
@@ -2,35 +2,9 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/opt/anaconda3/envs/pt1.13/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"
- ]
- },
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- "