Ultralytics YOLO27:

SKU-110K 数据集#

SKU-110K 数据集是一个单类别目标检测数据集,包含 11,743 张密集排列的零售货架图像,分为 8,219 张训练图像、588 张验证图像和 2,936 张测试图像。每件商品都在单个类别 object 下使用一个边界框进行标注——该名称指的是所有场景中展示的超过 110,000 个不同商品库存单位(SKUs),而不是 110,000 个检测类别。该数据集由 Eran Goldman 等人为 CVPR 2019 论文 Precise Detection in Densely Packed Scenes 创建,包含超过 170 万个已标注商品——平均每张图像约 147 个——因此成为拥挤零售环境中计算机视觉模型的一项高难度基准。



Watch: How to Train Ultralytics YOLO26 to Detect Every Product on a Retail Shelf | SKU-110K 🛒

SKU-110K 密集排列零售货架检测数据集

主要特性#

  • 单类别检测:每件商品都在单个类别 objectnames: {0: object})下使用一个边界框进行标注——这些标注不包含每个 SKU 的类别标签。
  • 极高的目标密度:来自世界各地商店货架的图像中,每张平均约有 147 件紧密排列的商品,且目标通常外观相似甚至完全相同,并彼此靠近。
  • 大规模:11,743 张图像中包含超过 110,000 个不同 SKU 和超过 170 万个已标注边界框,对当前最先进的目标检测器构成了挑战。

数据集结构#

SKU-110K 数据集分为三个子集,且都共享单个 object 类别:

划分图像描述
训练8,219用于模型训练的图像和标注
验证588训练期间留出的用于评估的图像
测试2,936用于最终评估已训练模型的图像

应用#

SKU-110K 数据集广泛用于训练和评估目标检测任务中的深度学习模型,尤其适用于零售货架展示等密集排列的场景。其应用包括:

  • 零售库存管理和自动化
  • 电子商务平台中的商品识别
  • 货架陈列合规性验证
  • 商店中的自助结账系统
  • 仓库中的机器人拣选和分拣

要在浏览器中标注自己的货架图像、进行训练并管理零售检测数据集,请通过 Ultralytics Platform运行完整工作流。

数据集 YAML#

SKU-110K.yaml 文件定义了数据集配置——包括数据集路径、类别名称和其他元数据。该文件维护在 Ultralytics 代码仓库中,地址为 https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/SKU-110K.yaml

ultralytics/cfg/datasets/SKU-110K.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# SKU-110K retail items dataset https://github.com/eg4000/SKU110K_CVPR19 by Trax Retail
# Documentation: https://docs.ultralytics.com/datasets/detect/sku-110k
# Example usage: yolo train data=SKU-110K.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── SKU-110K ← downloads here (13.6 GB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: SKU-110K # dataset root dir
train: train.txt # train images (relative to 'path') 8219 images
val: val.txt # val images (relative to 'path') 588 images
test: test.txt # test images (optional) 2936 images

# Classes
names:
  0: object

# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
  import shutil
  from pathlib import Path

  import numpy as np
  import polars as pl

  from ultralytics.utils import TQDM
  from ultralytics.utils.downloads import download
  from ultralytics.utils.ops import xyxy2xywh

  # Download
  dir = Path(yaml["path"])  # dataset root dir
  parent = Path(dir.parent)  # download dir
  urls = ["http://trax-geometry.s3.amazonaws.com/cvpr_challenge/SKU110K_fixed.tar.gz"]
  download(urls, dir=parent)

  # Rename directories
  if dir.exists():
      shutil.rmtree(dir)
  (parent / "SKU110K_fixed").rename(dir)  # rename dir
  (dir / "labels").mkdir(parents=True, exist_ok=True)  # create labels dir

  # Convert labels
  names = "image", "x1", "y1", "x2", "y2", "class", "image_width", "image_height"  # column names
  for d in "annotations_train.csv", "annotations_val.csv", "annotations_test.csv":
      x = pl.read_csv(dir / "annotations" / d, has_header=False, new_columns=names, infer_schema_length=None).to_numpy()  # annotations
      images, unique_images = x[:, 0], np.unique(x[:, 0])
      with open((dir / d).with_suffix(".txt").__str__().replace("annotations_", ""), "w", encoding="utf-8") as f:
          f.writelines(f"./images/{s}\n" for s in unique_images)
      for im in TQDM(unique_images, desc=f"Converting {dir / d}"):
          cls = 0  # single-class dataset
          with open((dir / "labels" / im).with_suffix(".txt"), "a", encoding="utf-8") as f:
              for r in x[images == im]:
                  w, h = r[6], r[7]  # image width, height
                  xywh = xyxy2xywh(np.array([[r[1] / w, r[2] / h, r[3] / w, r[4] / h]]))[0]  # instance
                  f.write(f"{cls} {xywh[0]:.5f} {xywh[1]:.5f} {xywh[2]:.5f} {xywh[3]:.5f}\n")  # write label

使用方法#

下载大小为 13.6 GB

SKU-110K 会在你首次训练时自动下载,并且其 11,743 张图像需要约 13.6 GB 的可用磁盘空间。下载脚本还会获取原始标注并将其转换为 YOLO 格式,这可能需要几分钟。

要在 SKU-110K 数据集上使用图像大小 640 训练 YOLO26n 模型 100 个训练轮次,你可以使用以下代码片段。有关可用参数的完整列表,请参阅模型的训练页面。

训练示例
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="SKU-110K.yaml", epochs=100, imgsz=640)

示例数据和标注#

SKU-110K 图像捕捉了真实商店货架上密集排列的商品,其中几十件几乎相同的商品并排摆放。下面是一个带有标注的示例图像:

SKU-110K 商店货架上的零售商品检测

  • 密集排列的零售货架图像:此图展示了零售货架场景中密集排列目标的示例。目标在单个 object 类别下使用边界框进行标注。

商品的密集排列使 SKU-110K 对开发面向零售的稳健计算机视觉解决方案尤其有价值,因为每张图像中的高目标数量让检测器面临远超典型基准的挑战。

引用和致谢#

如果你在研究或开发工作中使用 SKU-110K 数据集,请引用以下论文:

引用
@inproceedings{goldman2019dense,
  author    = {Eran Goldman and Roei Herzig and Aviv Eisenschtat and Jacob Goldberger and Tal Hassner},
  title     = {Precise Detection in Densely Packed Scenes},
  booktitle = {Proc. Conf. Comput. Vision Pattern Recognition (CVPR)},
  year      = {2019}
}

我们感谢 Eran Goldman 等人创建并维护 SKU-110K 数据集,为计算机视觉研究社区提供了宝贵资源。有关 SKU-110K 数据集及其创建者的更多信息,请访问 SKU-110K 数据集 GitHub 代码仓库

常见问题#

  • SKU-110K 数据集是一个单类别目标检测数据集,包含 11,743 张密集排列的零售货架图像,由 Eran Goldman 等人为其 CVPR 2019 论文创建。每件商品都使用一个 object 边界框进行标注,图像中展示了超过 110,000 个不同商品库存单位(SKUs),因此它是拥挤场景目标检测和构建零售计算机视觉系统的有力基准。

  • 没有。SKU-110K 是单类别数据集:每件商品都在 objectnames: {0: object})类别下使用一个边界框进行标注。名称中的“110K”指的是图像中展示的不同商品库存单位(SKUs)数量,而不是检测类别数量。

  • SKU-110K 数据集包含 11,743 张图像——其中 8,219 张用于训练、588 张用于验证、2,936 张用于测试——以及一个检测类别 object。详情请参阅数据集结构部分和 SKU-110K.yaml配置。

  • SKU-110K 大小约为 13.6 GB,并会在你首次使用 data="SKU-110K.yaml" 进行训练时自动下载——无需手动下载。要浏览更小的数据集选项,请参阅检测数据集概览

  • 在 SKU-110K 数据集上训练 YOLO26 模型非常简单。下面是使用图像大小 640 训练 YOLO26n 模型 100 个训练轮次的示例:

    训练示例
    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo26n.pt")  # load a pretrained model (recommended for training)
    
    # Train the model
    results = model.train(data="SKU-110K.yaml", epochs=100, imgsz=640)

    有关可用参数的完整列表,请参阅模型的训练页面和模型训练技巧

评论