Ultralytics YOLO27:

SKU-110Kデータセット#

SKU-110Kデータセットは、11,743枚の高密度に商品が並んだ小売棚画像で構成される単一クラスの物体検出データセットです。内訳は、トレーニング画像8,219枚、検証画像588枚、テスト画像2,936枚です。すべての商品には単一クラス object の下で1つのバウンディングボックスがアノテーションされています。この名前は、110,000個を超える固有の在庫管理単位(SKUs)が各シーン全体に写っていることを指しており、110,000個の検出クラスがあるという意味ではありません。Eran Goldman氏らがCVPR 2019の論文高密度に詰め込まれたシーンにおける高精度検出のために作成したこのデータセットには、170万個を超えるアノテーション付き商品が含まれています。画像1枚あたり平均約147個の商品があるため、混雑した小売環境におけるコンピュータビジョンモデル向けの難度の高いベンチマークとなっています。



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

SKU-110Kデータセットの高密度な小売棚検出

主な特徴#

  • 単一クラス検出: すべての商品には、単一クラス objectnames: {0: object})の下で1つのバウンディングボックスがラベル付けされています。アノテーションにはSKUごとのカテゴリラベルはありません。
  • 極めて高い物体密度: 世界各地の店舗棚画像には、1枚あたり平均約147個の密集した商品が写っており、近接して配置された、外観がよく似ている、または同一に見える物体も少なくありません。
  • 大規模: 11,743枚の画像全体に、110,000個を超える固有のSKUと170万個を超えるアノテーション付きバウンディングボックスが含まれており、最先端の物体検出器に課題を突き付けます。

データセットの構成#

SKU-110Kデータセットは3つのサブセットに分割されており、すべてで単一の object クラスを共有します。

分割画像説明
トレーニング8,219モデルのトレーニング用の画像とアノテーション
検証588トレーニング中の評価用に保持された画像
テスト2,936トレーニング済みモデルの最終評価用の画像

アプリケーション#

SKU-110Kデータセットは、物体検出タスク、特に小売棚の陳列など高密度に物体が配置されたシーンにおけるディープラーニングモデルのトレーニングと評価に広く使用されています。用途には以下が含まれます。

  • 小売在庫管理と自動化
  • Eコマースプラットフォームにおける商品認識
  • プラノグラム準拠の検証
  • 店舗のセルフチェックアウトシステム
  • 倉庫におけるロボットによるピッキングと仕分け

独自の棚画像にアノテーションを付け、ブラウザ上でトレーニングを行い、小売向け検出データセットを管理するには、Ultralytics Platformでワークフロー全体を実行してください。

データセット YAML#

SKU-110K.yaml ファイルは、データセットの設定(データセットのパス、クラス名、その他のメタデータ)を定義します。このファイルは、https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/SKU-110K.yamlのUltralyticsリポジトリで管理されています。

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データセットでYOLO26nモデルを100エポック、画像サイズ640でトレーニングするには、以下のコードスニペットを使用できます。利用可能な引数の一覧については、モデルのトレーニングページを参照してください。

トレーニング例
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}
}

コンピュータビジョン研究コミュニティにとって価値あるリソースであるSKU-110Kデータセットを作成・維持したEran Goldman氏らに謝意を表します。SKU-110Kデータセットとその作成者の詳細については、SKU-110KデータセットのGitHubリポジトリをご覧ください。

FAQ#

  • SKU-110Kデータセットは、Eran Goldman氏らがCVPR 2019の論文のために作成した、11,743枚の高密度な小売棚画像で構成される単一クラスの物体検出データセットです。すべての商品には object のバウンディングボックスが1つラベル付けされており、画像には110,000個を超える固有の在庫管理単位(SKUs)が含まれています。そのため、混雑したシーンでの物体検出や、小売向けコンピュータビジョンシステムの構築に適した強力なベンチマークとなっています。

  • いいえ。SKU-110Kは単一クラスであり、すべての商品がクラス objectnames: {0: object})の下で1つのバウンディングボックスとしてアノテーションされています。名前に含まれる「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モデルをトレーニングするのは簡単です。以下は、YOLO26nモデルを100エポック、画像サイズ640でトレーニングする例です。

    トレーニング例
    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)

    利用可能な引数の一覧については、モデルのトレーニングページとモデルのトレーニングに関するヒントを参照してください。

コメント