问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深度学习项目必备:数据集制作全流程详解

创作时间:
2025-01-21 20:21:45
作者:
@小白创作中心

深度学习项目必备:数据集制作全流程详解

在深度学习领域,数据集的制作是至关重要的基础工作。一个高质量的数据集能够显著提升模型的训练效果和泛化能力。本文将详细介绍数据集制作的完整流程,从数据收集、数据预处理、数据标注、数据集划分到数据加载方式,为读者提供一份实用的数据集制作指南。

01

数据收集

数据收集是数据集制作的第一步,需要明确数据集的目的和主题,选择合适的数据来源,并进行数据的收集和筛选。

确定数据集的目的和主题

在开始数据收集之前,首先要明确数据集的目的和主题。例如,你是要构建一个自然语言处理数据集,还是计算机视觉数据集?数据集将用于分类、检测还是分割任务?明确目的和主题有助于后续的数据收集和处理工作。

选择合适的数据来源

数据来源的选择直接影响数据集的质量。常见的数据来源包括公开数据集、网络爬虫、传感器数据等。选择数据来源时,需要考虑数据的可用性、质量和版权问题。

收集和筛选数据

收集到的数据往往包含大量噪声和冗余信息,需要进行筛选和过滤。这一步骤包括去除重复数据、过滤无关数据、处理异常值等。确保数据的质量和准确性是数据收集阶段的关键任务。

02

数据预处理

数据预处理是数据集制作中最为耗时但又至关重要的环节。通过数据清洗、数据转换、特征选择与降维、标准化与归一化等步骤,可以将原始数据转换为适合模型训练的格式。

数据清洗

数据清洗的主要任务是去除无效或冗余的数据,识别并处理异常值。这一步骤包括:

  • 删除或填充缺失值
  • 去除重复数据
  • 处理异常值(如离群点)

数据转换

数据转换的目的是将数据转换为适合模型训练的格式。常见的数据转换操作包括:

  • 文本清洗:去除无关字符、统一格式
  • 图像裁剪:调整图像大小和比例
  • 数据类型转换:将数据转换为模型所需的格式

特征选择与降维

特征选择与降维的目的是减少特征数量,保留主要信息,提高模型训练效率。常用的方法包括:

  • 主成分分析(PCA)
  • 线性判别分析(LDA)
  • 特征重要性评估

标准化与归一化

标准化与归一化的目的是将数据转换为均值为0、标准差为1的分布,或将数据缩放到特定范围。这一步骤有助于提高模型的收敛速度和训练效果。常用的标准化方法包括:

  • Z-score标准化
  • 最小-最大标准化
  • 小数定标标准化
03

数据标注

数据标注是数据集制作中最为耗时且需要细致操作的环节。通过数据标注,可以为机器学习模型提供丰富的训练样本,使其能够学习到图像中的特征、模式和关系。

数据标注的概念与意义

数据标注是指对图像或视频数据进行手动或自动的标记和注释,以提供机器学习模型训练所需的信息。这些标记可以包括识别图像中的物体、定位物体的位置、描述物体的属性等。数据标注在计算机视觉中扮演着至关重要的角色,它是模型学习和推理的基础,对于提升模型的准确性和性能至关重要。

常见的数据标注类型

在计算机视觉中,数据标注的类型多种多样,每种类型都有其适用的具体场景和任务。以下是一些常见的数据标注类型及其适用场景:

  • 边界框标注:用于目标检测任务,如车辆检测、人脸检测等。通过在图像中绘制矩形框来标记目标物体的位置和范围,帮助模型学习物体的空间位置和大小。

  • 多边形标注:适用于更精细的物体分割任务,如语义分割、实例分割等。通过绘制多边形来精确勾勒物体的轮廓,提供物体形状的详细信息,有助于模型实现更精准的分割效果。

  • 关键点标注:常用于姿态估计、人脸识别等任务。通过在图像中标记关键点的位置,如人体的关节点、人脸的特征点等,帮助模型学习物体的结构和姿态信息。

  • 图像分类标注:为整个图像分配标签,用于图像分类任务。通过对大量图像进行标注,模型可以学习到不同类别图像的特征和差异,实现准确的分类。

常用的数据标注工具

数据标注工具的选择直接影响标注效率和质量。以下是一些常用的数据标注工具:

  • Labelme:一个基于Python的开源图像标注工具,支持多边形、矩形、圆形等多种标注类型,适用于各种计算机视觉任务。

  • Labelimg:一个基于Qt的图形图像标注工具,主要用于矩形框标注,适用于目标检测任务。

  • X-AnyLabeling:一个轻量级、高性能的开源图像标注工具,支持多种标注类型,具有友好的用户界面和高效的标注速度。

  • makesense.ai:一个在线的图像标注平台,支持多种标注类型,适用于团队协作和大规模标注任务。

标注文件的格式

标注文件的格式取决于标注工具的不同,常见的格式包括:

  • JSON格式:结构清晰,易于理解和处理,常用于存储标注的详细信息。

  • XML格式:可读性和可扩展性良好,但处理起来可能稍显复杂。

  • Pascal VOC格式:通常以XML格式存储,包含了图像中物体的类别、位置等信息。

  • YOLO格式:采用简单的文本格式,每一行代表一个目标物体,包含物体的类别、位置等信息。

  • COCO格式:通常以JSON格式存储,包含了丰富的标注信息,如目标物体的类别、位置、分割掩码以及关键点的位置等。

04

数据集划分

数据集划分是将数据集分为训练集、验证集和测试集的过程。合理的数据集划分有助于评估模型的性能和泛化能力。

训练集、验证集和测试集的作用

  • 训练集:用于模型的训练,使模型学习数据的特征和模式。
  • 验证集:用于调整模型的超参数,防止过拟合。
  • 测试集:用于最终评估模型的性能,检验模型的泛化能力。

数据集划分的方法

数据集划分的方法有多种,常见的包括随机划分、分层抽样等。其中,分层抽样能够确保训练集和测试集中带有标签的样本数量比例一致,适用于多标签数据集。

具体代码示例

以下是一个使用Python和skmultilearn库进行分层抽样的示例代码:

import pandas as pd
from skmultilearn.model_selection import IterativeStratification

# 加载数据
df = pd.read_excel("/path/to/filtered_dataset2.xlsx")

# 定义关键字到标签的映射
keywords_to_labels = {
    "病变": ["病变", "病检", "恶性", "癌", "结节"],
    "影": ["影"],
    "钙化": ["钙化"],
    "纤维": ["纤维"],
    "皮肤": ["皮肤"],
    "BI-RADS0-2": ["BI-RADS0","BI-RADS1","BI-RADS2"],
    "BI-RADS3-5": ["BI-RADS3","BI-RADS4A","BI-RADS4B","BI-RADS4C","BI-RADS5"],
}

# 新增标签列
df["BI-RADS>1"] = 0
df["BI-RADS>2"] = 0

# 标注数据
for index, row in df.iterrows():
    report = f"{row['description']}\n{row['diagnosis']}"
    # 计算BI-RADS关键字出现的次数
    bi_rads_count = sum(report.count(kw) for kw in ["BI-RADS"])
    # 根据出现次数更新新标签
    if bi_rads_count > 1:
        df.at[index, "BI-RADS>1"] = 1
    if bi_rads_count > 2:
        df.at[index, "BI-RADS>2"] = 1

    for label, keywords in keywords_to_labels.items():
        # 检查是否包含任一关键字
        if any(keyword in report for keyword in keywords):
            df.at[index, label] = 1

# 准备分层抽样
X = df.index.values.reshape(-1, 1)  # 特征只是索引
y = df[list(keywords_to_labels.keys()) + ["BI-RADS>1", "BI-RADS>2"]].values

# 进行分层抽样
stratifier = IterativeStratification(n_splits=2, order=1, sample_distribution_per_fold=[0.8, 0.2])
train_indexes, test_indexes = next(stratifier.split(X, y))

# 分割数据集
train_df = df.iloc[train_indexes]
test_df = df.iloc[test_indexes]

# 保存数据集到Excel文件
train_df.to_excel("./train_dataset.xlsx", index=False)
test_df.to_excel("./test_dataset.xlsx", index=False)

# 打印每个标签在训练集和验证集中的数量,包括新的BI-RADS标签
for label in keywords_to_labels.keys():
    print(f"{label} - Train: {train_df[label].sum()}, Val: {test_df[label].sum()}")
print(f"BI-RADS>1 - Train: {train_df['BI-RADS>1'].sum()}, Val: {test_df['BI-RADS>1'].sum()}")
print(f"BI-RADS>2 - Train: {train_df['BI-RADS>2'].sum()}, Val: {test_df['BI-RADS>2'].sum()}")
05

数据加载方式

数据加载方式的选择直接影响模型的训练效率和性能。在深度学习中,Dataloader是一个非常重要的组件,它帮助我们高效地加载和处理数据。

Dataloader的功能

Dataloader是PyTorch提供的一个数据加载器,具有以下功能:

  • 批量加载:将数据分成小批次进行加载,提高计算效率。
  • 数据洗牌:对数据进行随机洗牌,避免过拟合。
  • 并发预取:在模型处理当前批次数据的同时,预先加载下一批次数据,减少数据加载时间。

如何使用Dataloader

使用Dataloader非常简单,以下是一个基本的使用示例:

from torch.utils.data import DataLoader

class MyDataset(torch.utils.data.Dataset):
    def __init__(self, data, target):
        self.data = data
        self.target = target

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.target[idx]

dataset = MyDataset(data, target)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

for batch_idx, (data, target) in enumerate(dataloader):
    # 在这里进行模型的训练操作
    pass

通过以上步骤,我们可以轻松地使用Dataloader来加载和处理数据。在实际应用中,还可以根据需要对Dataloader进行更多的定制和优化。

06

总结

数据集制作是一个系统性工程,涉及数据收集、数据预处理、数据标注、数据集划分等多个步骤。每个步骤都需要细致的操作和严格的把控,才能最终制作出高质量的数据集。希望本文能够帮助读者掌握数据集制作的关键步骤和技巧,为深度学习项目的成功奠定坚实的基础。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号