Ultralytics YOLO27:

SKU-110Kデータセット#

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



視聴: 小売店の棚にあるすべての商品を検出するために Ultralytics YOLO26 をトレーニングする方法 | SKU-110K 🛒

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

主な機能#

  • 単一クラス検出: すべての商品には、単一クラスobject(names: {0: object})の下で1つのバウンディングボックスが付与されています。アノテーションにはSKUごとのカテゴリラベルは含まれていません。
  • 極めて高い物体密度: 世界各地の店舗の棚を写した画像には、平均して約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モデルを画像サイズ640、100エポックでトレーニングするには、次のコードスニペットを使用できます。利用可能な引数の一覧については、モデルのトレーニングページをご覧ください。

トレーニング例
from ultralytics import YOLO

# モデルを読み込む
model = YOLO("yolo26n.pt")  # 事前トレーニング済みモデルを読み込みます(トレーニングにはこちらを推奨します)

# モデルをトレーニングする
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リポジトリをご覧ください。

よくある質問#

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

  • いいえ。SKU-110Kは単一クラスのデータセットです。すべての商品には、クラスobject(names: {0: object})の下で1つのバウンディングボックスが付与されています。名称の「110K」は、画像全体に写る固有の在庫管理単位(SKUs)の数を指しており、検出クラスの数ではありません。

  • SKU-110Kデータセットには画像が11,743枚含まれており、トレーニング用が8,219枚、検証用が588枚、テスト用が2,936枚です。検出クラスはobjectの1つです。詳細については、データセット構成のセクションとSKU-110K.yaml設定をご覧ください。

  • SKU-110Kのサイズは約13.6 GBで、data="SKU-110K.yaml"を使用した初回のトレーニング時に自動的にダウンロードされるため、手動でダウンロードする必要はありません。より小規模なデータセットについては、検出データセットの概要をご覧ください。

  • SKU-110KデータセットでYOLO26モデルをトレーニングするのは簡単です。画像サイズ640でYOLO26nモデルを100エポックトレーニングする例を示します。

    トレーニング例
    from ultralytics import YOLO
    
    # モデルを読み込む
    model = YOLO("yolo26n.pt")  # 事前トレーニング済みモデルを読み込みます(トレーニングにはこちらを推奨します)
    
    # モデルをトレーニングする
    results = model.train(data="SKU-110K.yaml", epochs=100, imgsz=640)

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

コメント