如何在不损失精度的情况下减少数据集的数据量

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Arty Ariuntuya

编译:ronghuaiyang

导读

以YOLOv8为例,给出了详细的操作步骤。

f35d43049046c94ca84ccf99d46645b0.jpeg

我们常常听说数据是推动强大且稳健模型发展的支柱。这的确是事实——数据是我们输入算法的原始材料,帮助它们学习、适应并做出预测。然而,并非任何数据都能满足要求。

在训练计算机视觉模型时,高质量、干净的数据才是真正起决定性作用的因素。“垃圾进,垃圾出”是与数据处理一样古老的经验之谈,提醒我们输入数据的质量至关重要,甚至更为关键。

在这个实验中,我们试图探索在不显著牺牲准确性的情况下缩减数据集规模是否可行。通过仔细剔除超过10,000张作为异常、模糊或重复的图像,我们成功地将数据集大小减少了近26%,同时使用Ultralytics的YOLOv8模型保持了76.5%的mAP得分,相比之下,原始数据集的mAP得分为79%。

那么,这3%的mAP下降值得吗?让我们考虑几个因素:

  1. 效率:如此大幅度地减少数据集大小可能导致训练更加高效,降低计算成本。在资源有限的场景下,这一点尤为宝贵。

  2. 质量控制:通过去除模棱两可或质量较差的图像,数据集可能变得更加一致,从而导致模型在特定实际场景中的表现更加稳健。

  3. 实际影响:3%的mAP下降在某些应用中可能是可以接受的。如果模型被用于那些最高性能不是至关重要的环境中,这种权衡可能非常有利。

  4. 潜在过拟合:减少噪声或不相关数据的存在甚至可能有助于防止过拟合,使模型更好地泛化到未见数据。

然而,必须考虑手头任务的具体要求:

  • 如果应用要求最高的可能精度,每一个百分点都很关键,那么这种减少可能就不合适了。

  • 如果存在其他因素,如需要更快的原型制作、降低成本或注重更高品质的数据,那么这3%的交换确实可以被视为一种成功。

这种方法的价值取决于效率、应用需求以及数据本身质量等多个因素的复杂相互作用。在我们的案例中,mAP的轻微下降似乎是换取更精炼和高效数据集的一个合理折衷。然而,正如机器学习的许多方面一样,“正确”的方法取决于项目的具体环境和目标。

介绍

在这篇博文中,我们将深入探讨一种既复杂又实用的数据管理策略,以实现模型训练的高效性。我们将展示如何通过有效清理数据集来达到减少数据量同时保持模型准确性的目的。我们将采用一个综合示例,利用包含超过39,000张图像的个人防护装备数据集及YOLOv8目标检测模型,演示如何运用诸如roboflow、ultralytics和fastdup等库。

25bfc34b5e0f0b79623fd83291c168cd.png

a718a3dc1455ffe1bad65b799fb63cec.png
img

训练结果比较:左侧为使用原始数据集达成的平均精确度(mAP)0.79;右侧为经清理后的数据集,虽mAP略降至0.76,但仍展现了在不大幅牺牲准确性的前提下有效缩减数据规模。本文末,我们将去除超过10,500张模糊、重复及异常图像,大幅减小数据集规模。借助更小且干净的数据集,您能够在保持模型准确度的同时,降低标注成本和计算成本。

fcd351e296f68143b3d94b86f62619ed.png

7c9f1b2dc8aeb8e41095ca3a8403065f.png

识别并解决次优数据问题

为了优化数据集,我们需要识别并处理其中的次优数据,这包括:

  • 重复或高度相似的图像:这些可能导致过拟合和偏见。移除它们能确保数据集的多样性。

  • 异常图像:这些图像与数据集中大部分图像有显著差异,可能在颜色分布、物体朝向或含有不寻常元素方面有所不同。异常图像可能会在训练阶段分散模型注意力,降低其性能。

  • 模糊图像:低质量图像因无法提供清晰特征而降低准确性。

  • 过暗或过亮的图像:极端的光照条件会妨碍特征识别和学习。

基于以上理解,我们现在可以概述本指南将遵循的步骤:

  1. 安装库

  2. 下载数据集

  3. 使用原始数据进行训练

  4. 使用Fastdup分析数据集

  5. 识别无效、重复和异常图像

  6. 移除重复项、异常项及模糊图像

  7. 重新训练并部署

步骤1:安装库

我们将使用roboflow来管理和下载数据集,使用fastdup进行数据分析与清洗,并采用YOLOv8进行模型训练。

!pip -q install roboflow fastdup ultralytics

步骤2:下载数据集

Roboflow是一个用于管理计算机视觉工作流程的综合性工具。它提供了一系列功能,涵盖数据标注、版本控制,以及一个被称为“Roboflow Universe”的公共数据集库。此工具简化了项目中的数据获取和管理工作。

要下载数据集,请使用如下代码:

roboflow.login()
rf = Roboflow()
project = rf.workspace("roboflow-ngkro").project("protective-equipment-s3hzi")
dataset = project.version(1).download("yolov8")

您可以进一步利用Roboflow的特性,如“按标签过滤”预处理工具,来细化您的数据集。

9a83cca4a579fb5ae578ede26b2b7067.png

步骤3: 训练原始数据集

在开始清理数据集之前,可选择性地先使用原始数据集对模型进行训练,以便建立性能基准。我们采用YOLOv8模型进行训练,并使用预训练权重进行了100个周期的训练,达到了mAP50为0.79的性能。你可以试用部署的预训练模型,以获得更直观的感受。

model = YOLO('yolov8n.pt')
model.train(data=dataset.location + '/data.yaml', epochs=100, imgsz=640)

步骤4:使用Fastdup分析数据集

为确保我们的模型不会因为重复或非常相似的图像而产生过拟合,我们使用Fastdup库来分析数据集。我们分别对训练集、测试集和验证集进行分析。

fd_train = fastdup.create(work_dir="./train/", input_dir=dataset.location + '/train/images')
fd_train.run()
fd_test = fastdup.create(work_dir="./test/", input_dir=dataset.location + '/test/images')
fd_test.run()
fd_valid = fastdup.create(work_dir="./valid/", input_dir=dataset.location + '/valid/images')
fd_valid.run()

这将输出一个详细的分析摘要,如下所示,提供有关数据集中相似性的信息。你将了解到图像的总数、被视为有效图像的数量、相似度百分比、离群点的数量及百分比等更多信息。

a76fc551fa2b44f6c02385786813b063.png

步骤5: 识别无效、重复和异常图像

重复图像

FastDup工具使我们能够直观地检查数据集中重复或近乎重复的图像。通过识别并移除这些图像,我们可以在不影响数据多样性的情况下减小数据集的大小。

我们使用以下命令为每个数据集创建报告:

fd_train.vis.duplicates_gallery()
fd_test.vis.duplicates_gallery()
fd_valid.vis.duplicates_gallery()

a4791355722a40d8c984651b8352868e.png

利用这些报告,我们可以可视化重复的图像。我们首先在图像数据集中找到连通的部分。connected_components()函数返回一个包含数据集中连通部分信息的数据框,然后我们对这些连通部分进行分组。这些部分代表了数据集中相似图像的簇。接着,我们为每个集合处理这些簇。

cluster_images_to_keep_train, list_of_duplicates_train = process_clusters(clusters_df_train)
cluster_images_to_keep_test, list_of_duplicates_test = process_clusters(clusters_df_test)
cluster_images_to_keep_valid, list_of_duplicates_valid = process_clusters(clusters_df_valid)

4750f176e162ab95e6860bd060ca03a1.png

异常图像

然后,我们可以识别异常图像。异常图像指的是与数据集中大多数图像不相似的图像。然而,这并不一定意味着这些图像有问题或不相关;它们可能只是在某些方面(如颜色分布、纹理、物体存在等)有所不同,从而导致了它们被归类为异常。通过使用特定的阈值,我们可以识别这些异常图像,并在验证后从数据集中移除它们,以确保我们的模型不会被这些实例所干扰。

outlier_df_train = fd_train.outliers()
list_of_outliers_train = outlier_df_train[outlier_df_train.distance < 0.68].filename_outlier.tolist()
outlier_df_test = fd_test.outliers()
list_of_outliers_test = outlier_df_test[outlier_df_test.distance < 0.68].filename_outlier.tolist()
outlier_df_valid = fd_valid.outliers()
list_of_outliers_valid = outlier_df_valid[outlier_df_valid.distance < 0.68].filename_outlier.tolist()

过暗,过亮和模糊图像

7eb80a987e86aad5921ef8e49d1e5900.png

步骤6: 去除重复,异常和模糊图像

在可视化报告并验证图像之后,我们可以将重复、模糊、偏暗、偏亮或异常的图像保存到一个列表中,以便准备删除。我们将使用delete_images函数来移除我们发现的图像列表。在此例中,我仅移除异常、模糊和重复的图像。

def delete_images(list, dir_path):
    num_deleted = 0

    for file_path in list:
        try:
            os.remove(file_path)
            num_deleted += 1
        except Exception as e:
            print(f"Error occurred when deleting file {file_path}: {e}")

    print(f"Deleted {num_deleted} images")

    # Count the number of images left
    remaining_images = len(os.listdir(dir_path))
    print(f"There are {remaining_images} images left in the directory {dir_path}.")

通过这种方法,我们从39,542幅图像减少到28,999幅,数据集减少了约26%,同时保持模型性能(mAP50)稳定在0.79至XX之间。此技术是在保留数据多样性的前提下,节约计算资源和时间的实用方法,且不会显著影响模型性能。

在进行标注之前清理数据集,可以在标注过程中显著减少成本和时间。

步骤 7: 训练和重新部署

一旦彻底清理并优化了你的数据集,你可以将其重新上传回Roboflow,以确保你改进过的数据能顺利集成。成功上传后,你可以无缝开始训练过程,以获得最佳的模型性能。

你可以直接使用代码片段来使用已清理的数据集,并采用YOLOv8进行训练。

project = rf.workspace("roboflow-ngkro").project("cleaneddataset")
dataset = project.version(1).download("yolov8")
model = YOLO('yolov8n.pt')
model.train(data=dataset.location + '/data.yaml', epochs=100, imgsz=640)

在清理数据集之后,我们重新训练了模型,并观察到了以下情况:

原始数据集 mAP: 0.79

7f8513046f7856c07bfd3608bd095208.png

清理之后数据集 mAP: 0.765

7aee3c6feef03c657781f3eb90583910.png

结果显示,经过清理的数据在减少了约26%数据量的同时,仍保持了类似的性能,为我们节省了大量训练时间和计算成本。这凸显了高质量数据管理的重要性。

部署模型

在对清理过的数据集获得高性能模型之后,部署阶段是至关重要的一步。在这个阶段,训练好的模型将从理论构想转变为实际解决方案,准备接受测试。

接下来,你可以精确地将模型部署到多种云和边缘环境中。

path_to_trained_weight = "./runs/detect/train"
project.version(1).deploy("yolov8", path_to_trained_weight)

总结

在本教程中,我们展示了如何通过清理数据集,移除重复、高度相似或异常图像来优化计算机视觉模型。通过应用这些方法,我们能够在减少数据集大小的同时保持数据的多样性,最终在不显著牺牲模型性能的前提下,节约计算资源和时间。

144ff06e5ddb6e3f03cef16b7127e44b.png

—END—

英文原文:https://blog.roboflow.com/how-to-reduce-dataset-size-computer-vision/

c75f1004cf1658be683cdcc802cf5683.jpeg

请长按或扫描二维码关注本公众号

喜欢的话,请给我个在看吧

鸢尾花数据集是一个非常经典的机器学习数据集,包含了150个样本,每个样本有四个特征和一个标签,标签分别为三种不同的鸢尾花类型。我们可以使用Python中的Pandas和Scikit-learn库来进行数据预处理和建模。 首先,我们需要加载数据集。Scikit-learn库中已经内置了鸢尾花数据集,可以使用以下代码加载: ```python from sklearn.datasets import load_iris iris = load_iris() ``` 接下来,我们需要将数据集转换成Pandas的DataFrame类型,以便进行数据处理和分析。可以使用以下代码将数据集转换: ```python import pandas as pd iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names) iris_df['target'] = iris.target ``` 现在,我们可以对数据进行处理,例如将标签从数字形式转换为文字形式: ```python iris_df['target'] = iris_df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'}) ``` 这里使用了Python中的map函数,将数字标签映射为对应的鸢尾花类型名称。 完成数据处理后,我们可以使用Scikit-learn库中的机器学习算法对数据进行建模和预测。例如,可以使用以下代码来训练一个决策树分类器: ```python from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(iris_df[iris.feature_names], iris_df['target'], test_size=0.2, random_state=42) tree = DecisionTreeClassifier() tree.fit(X_train, y_train) y_pred = tree.predict(X_test) ``` 这里使用了Scikit-learn库中的train_test_split函数将数据集分为训练集和测试集,然后使用决策树分类器进行训练和预测。最后,可以使用Scikit-learn库中的metrics模块来评估模型的性能: ```python from sklearn import metrics print("Accuracy:",metrics.accuracy_score(y_test, y_pred)) ``` 这里使用了准确率作为评估指标。完整的代码如下: ```python from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn import metrics import pandas as pd iris = load_iris() iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names) iris_df['target'] = iris.target iris_df['target'] = iris_df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'}) X_train, X_test, y_train, y_test = train_test_split(iris_df[iris.feature_names], iris_df['target'], test_size=0.2, random_state=42) tree = DecisionTreeClassifier() tree.fit(X_train, y_train) y_pred = tree.predict(X_test) print("Accuracy:",metrics.accuracy_score(y_test, y_pred)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值