AIO
收藏魔搭社区2025-10-10 更新2025-10-11 收录
下载链接:
https://modelscope.cn/datasets/lsylalala/AIO
下载链接
链接失效反馈官方服务:
资源简介:
数据集文件元信息以及数据文件,请浏览“数据集文件”页面获取。
当前数据集卡片使用的是默认模版,数据集的贡献者未提供更加详细的数据集介绍,但是您可以通过如下GIT Clone命令,或者ModelScope SDK来下载数据集
## Dataset Introduction
数据集的索引文件为 `train.csv`,其格式如下:
| `input_path` | `gt_path` | `label` | `text` |
| ----------------------------- | ----------------------- | ------- | ----------------------- |
| `train/noise/input/img_01.png` | `train/noise/gt/img_01.png` | 0 | `AutoDIR代码中使用的text` |
| `train/blur/input/img_02.png` | `train/blur/gt/img_02.png` | 1 | |
* **`input_path`**: 低质量(LQ)图片的相对路径。
* **`gt_path`**: 高质量(GT)图片的相对路径。
* **`label`**: 整数标签,代表该图片对所属的退化类别。
```
该数据集中的 label 列为一个整数,它代表了 class names 列表中的一个零基索引(zero-indexed)。
具体来说,一个样本的类别名称可以通过 class_names[label] 的方式进行查找和映射,class_names=
[
'noise', 'blur', 'rain', 'underexposure', 'haze', 'reflection','raindrop', 'snow', 'overexposure', 'moire','no'
]
```
## Dataset Statistics
数据集的类别分布如下,总计包含 **32,311** 个图像对。
| Label (ID) | Degradation Type | Number of Samples |
| :--------: | :--------------: | :---------------: |
| 0 | `noise` | 3450 |
| 1 | `blur` | 3500 |
| 2 | `rain` | 3500 |
| 3 | `underexposure` | 3500 |
| 4 | `haze` | 3500 |
| 5 | `reflection` | 3500 |
| 6 | `raindrop` | 861 |
| 7 | `snow` | 3500 |
| 8 | `overexposure` | 3500 |
| 9 | `moire` | 3500 |
**注意**: 该数据集在类别 `6 (raindrop)` 上存在明显的样本不均衡问题
## how to use
首先 用下面的命令将数据分块合并为tar.gz(此过程需要一些时间)
```
cat part* >train.tar.gz
```
而后解压缩,读取csv文件构造数据集,可参考下面的代码(下面的代码没有考虑csv中的text这一列)
```
@dataclass
class PairedRecord:
lq_path: str
hq_path: str
label: int
class PairedImageDataset(Dataset[Tuple[torch.Tensor, torch.Tensor, torch.Tensor]]):
"""
CSV format (no header required):
lq_path,hq_path,label
- lq_path, hq_path: absolute or path relative to CSV directory
- label: either an integer class index or a class name present in class_names
"""
def __init__(
self,
csv_path: str,
class_names: List[str],
image_size: int = 224,
transform: Optional[Callable[[Image.Image], torch.Tensor]] = None,
augment: bool = False,
) -> None:
super().__init__()
self.csv_path = csv_path
self.root_dir = os.path.dirname(os.path.abspath(csv_path))
self.class_names = class_names
self.class_to_idx = {name: idx for idx, name in enumerate(class_names)}
base_transform = _default_image_transform(image_size) if transform is None else transform
if augment:
self.transform = T.Compose([
T.RandomResizedCrop(image_size, scale=(0.9, 1.0), ratio=(0.9, 1.1)),
T.RandomHorizontalFlip(p=0.5),
T.ToTensor(),
T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
else:
self.transform = base_transform
self.records: List[PairedRecord] = self._read_csv()
def _read_csv(self) -> List[PairedRecord]:
records: List[PairedRecord] = []
with open(self.csv_path, newline='', encoding='utf-8') as f:
reader = csv.reader(f)
next(reader)
for row in reader:
if not row or row[0].strip().startswith('#'):
continue
if len(row) < 3:
raise ValueError("Each CSV row must have 3 columns: lq_path,hq_path,label")
lq_rel, hq_rel, label_raw = row[0].strip(), row[1].strip(), row[2].strip()
lq_path = lq_rel if os.path.isabs(lq_rel) else os.path.normpath(os.path.join(self.root_dir, lq_rel))
hq_path = hq_rel if os.path.isabs(hq_rel) else os.path.normpath(os.path.join(self.root_dir, hq_rel))
#print(label_raw)
if label_raw.isdigit() or (label_raw.startswith('-') and label_raw[1:].isdigit()):
label_idx = int(label_raw)
else:
if label_raw not in self.class_to_idx:
raise ValueError(f"Unknown label '{label_raw}'. Expected one of: {self.class_names}")
label_idx = self.class_to_idx[label_raw]
records.append(PairedRecord(lq_path=lq_path, hq_path=hq_path, label=label_idx))
if not records:
raise ValueError("No records loaded from CSV. Check the file paths and format.")
return records
def __len__(self) -> int:
return len(self.records)
def _load_image(self, path: str) -> Image.Image:
with Image.open(path) as img:
img = img.convert('RGB')
return img.copy()
def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
rec = self.records[index]
lq_img = self._load_image(rec.lq_path)
hq_img = self._load_image(rec.hq_path)
lq_tensor = self.transform(lq_img)
hq_tensor = self.transform(hq_img)
label_tensor = torch.tensor(rec.label, dtype=torch.long)
return hq_tensor, lq_tensor, label_tensor
```
可通过「数据集文件」页面获取本数据集的文件元信息与数据文件。当前数据集卡片采用默认模板,数据集贡献者未提供更详细的介绍,但您可通过下述Git Clone命令或ModelScope SDK下载该数据集。
## 数据集介绍
本数据集的索引文件为 `train.csv`,其格式如下:
| `input_path` | `gt_path` | `label` | `text` |
| --- | --- | --- | --- |
| `train/noise/input/img_01.png` | `train/noise/gt/img_01.png` | 0 | `AutoDIR代码中使用的text` |
| `train/blur/input/img_02.png` | `train/blur/gt/img_02.png` | 1 | |
* **`input_path`**:低质量(LQ, Low Quality)图像的相对路径。
* **`gt_path`**:高质量(GT, Ground Truth)图像的相对路径。
* **`label`**:整数标签,用于标识该图像对所属的退化类别。
本数据集中的`label`列为一个整数,其对应类别名称列表`class_names`的零基索引(zero-indexed)。具体而言,可通过`class_names[label]`的方式查询并映射样本的类别名称,其中`class_names`为:
[
'noise', 'blur', 'rain', 'underexposure', 'haze', 'reflection','raindrop', 'snow', 'overexposure', 'moire','no'
]
## 数据集统计
本数据集的类别分布如下,总计包含 **32311** 组图像对。
| 标签ID | 退化类型 | 样本数量 |
| :---: | :---: | :---: |
| 0 | 噪声(noise) | 3450 |
| 1 | 模糊(blur) | 3500 |
| 2 | 降雨(rain) | 3500 |
| 3 | 曝光不足(underexposure) | 3500 |
| 4 | 雾霾(haze) | 3500 |
| 5 | 反射(reflection) | 3500 |
| 6 | 雨滴(raindrop) | 861 |
| 7 | 降雪(snow) | 3500 |
| 8 | 过曝光(overexposure) | 3500 |
| 9 | 摩尔纹(moire) | 3500 |
**注意**:本数据集在类别`6(raindrop,雨滴)`上存在显著的样本不均衡问题。
## 使用方法
首先执行下述命令将分块文件合并为`train.tar.gz`(此过程需耗费一定时间):
cat part* >train.tar.gz
随后解压缩该文件,读取CSV文件以构建数据集,可参考下述代码(下述代码未考虑CSV中的`text`列):
python
@dataclass
class PairedRecord:
lq_path: str
hq_path: str
label: int
class PairedImageDataset(Dataset[Tuple[torch.Tensor, torch.Tensor, torch.Tensor]]):
"""
CSV格式(无需表头):
lq_path,hq_path,label
- lq_path、hq_path:可相对于CSV文件目录的绝对路径或相对路径
- label:可为整数类别索引,或`class_names`中存在的类别名称
"""
def __init__(
self,
csv_path: str,
class_names: List[str],
image_size: int = 224,
transform: Optional[Callable[[Image.Image], torch.Tensor]] = None,
augment: bool = False,
) -> None:
super().__init__()
self.csv_path = csv_path
self.root_dir = os.path.dirname(os.path.abspath(csv_path))
self.class_names = class_names
self.class_to_idx = {name: idx for idx, name in enumerate(class_names)}
base_transform = _default_image_transform(image_size) if transform is None else transform
if augment:
self.transform = T.Compose([
T.RandomResizedCrop(image_size, scale=(0.9, 1.0), ratio=(0.9, 1.1)),
T.RandomHorizontalFlip(p=0.5),
T.ToTensor(),
T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
else:
self.transform = base_transform
self.records: List[PairedRecord] = self._read_csv()
def _read_csv(self) -> List[PairedRecord]:
records: List[PairedRecord] = []
with open(self.csv_path, newline='', encoding='utf-8') as f:
reader = csv.reader(f)
next(reader)
for row in reader:
if not row or row[0].strip().startswith('#'):
continue
if len(row) < 3:
raise ValueError("CSV每行必须包含3列:lq_path、hq_path、label")
lq_rel, hq_rel, label_raw = row[0].strip(), row[1].strip(), row[2].strip()
lq_path = lq_rel if os.path.isabs(lq_rel) else os.path.normpath(os.path.join(self.root_dir, lq_rel))
hq_path = hq_rel if os.path.isabs(hq_rel) else os.path.normpath(os.path.join(self.root_dir, hq_rel))
# 打印(label_raw)
if label_raw.isdigit() or (label_raw.startswith('-') and label_raw[1:].isdigit()):
label_idx = int(label_raw)
else:
if label_raw not in self.class_to_idx:
raise ValueError(f"未知标签 '{label_raw}'。请使用以下类别之一:{self.class_names}")
label_idx = self.class_to_idx[label_raw]
records.append(PairedRecord(lq_path=lq_path, hq_path=hq_path, label=label_idx))
if not records:
raise ValueError("未从CSV文件加载任何记录。请检查文件路径与格式。")
return records
def __len__(self) -> int:
return len(self.records)
def _load_image(self, path: str) -> Image.Image:
with Image.open(path) as img:
img = img.convert('RGB')
return img.copy()
def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
rec = self.records[index]
lq_img = self._load_image(rec.lq_path)
hq_img = self._load_image(rec.hq_path)
lq_tensor = self.transform(lq_img)
hq_tensor = self.transform(hq_img)
label_tensor = torch.tensor(rec.label, dtype=torch.long)
return hq_tensor, lq_tensor, label_tensor
提供机构:
maas
创建时间:
2025-10-09



