HumanSignal/label-studio

⭐ 23,751 🍴 2,940 JavaScript📄 Apache License 2.0 GitHubで見る →

主な特徴

  • **マルチデータタイプ対応**: 画像、テキスト、音声、動画、時系列、HTML等
  • **マルチユーザーサポート**: ユーザーアカウント管理とプロジェクト管理
  • **柔軟なラベル設定**: カスタム可能なアノテーションインターフェース
  • **MLモデル統合**: 事前ラベリング、オンライン学習、アクティブラーニング
  • **クラウドストレージ連携**: AWS S3、GCS、Azure Blob Storage対応
  • **豊富なテンプレート**: 様々なラベリングタスク用テンプレート
  • **REST API**: データパイプラインへの組み込みが簡単
  • **様々なエクスポート形式**: JSON, CSV, TSV, COCO, YOLO, Pascal VOC等

リポジトリ解析: HumanSignal/label-studio

基本情報

  • リポジトリ名: HumanSignal/label-studio
  • 主要言語: JavaScript
  • スター数: 23,751
  • フォーク数: 2,940
  • 最終更新: 2025年1月(活発に開発中)
  • ライセンス: Apache License 2.0
  • トピックス: Data Labeling, Annotation, Machine Learning, AI, NLP, Computer Vision, Audio, Time Series

概要

一言で言うと

マルチタイプのデータラベリングをサポートするオープンソースデータアノテーションツールで、MLモデルの訓練データ作成と品質向上を支援する。

詳細説明

Label Studioは、HumanSignal社が開発するオープンソースのデータアノテーションツールです。機械学習モデルの訓練に必要な高品質なラベル付きデータを作成するための包括的なプラットフォームを提供します。

画像、テキスト、音声、動画、時系列データなど、幅広いデータタイプに対応し、直感的なUIで効率的なアノテーションが可能です。また、様々なMLフレームワーク形式へのエクスポート機能も備えており、データ準備からモデル訓練までのワークフローをシームレスに接続できます。

エンタープライズ版も提供されており、Cloudflare、NVIDIA、Meta、IBMなどの大手企業でも採用されています。

主な特徴

  • マルチデータタイプ対応: 画像、テキスト、音声、動画、時系列、HTML等
  • マルチユーザーサポート: ユーザーアカウント管理とプロジェクト管理
  • 柔軟なラベル設定: カスタム可能なアノテーションインターフェース
  • MLモデル統合: 事前ラベリング、オンライン学習、アクティブラーニング
  • クラウドストレージ連携: AWS S3、GCS、Azure Blob Storage対応
  • 豊富なテンプレート: 様々なラベリングタスク用テンプレート
  • REST API: データパイプラインへの組み込みが簡単
  • 様々なエクスポート形式: JSON, CSV, TSV, COCO, YOLO, Pascal VOC等

使用方法

インストール

前提条件

  • Python 3.10以上
  • PostgreSQL (プロダクション推奨) またはSQLite3
  • Redis (ジョブキュー用)
  • Node.js 18以上(フロントエンド開発時)
  • Docker (オプション)

インストール手順

# 方法1: pip経由でインストール
pip install label-studio
label-studio  # http://localhost:8080で起動

# 方法2: Dockerで実行
docker pull heartexlabs/label-studio:latest
docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest

# 方法3: Docker Composeで本番環境構築(Nginx + PostgreSQL)
docker-compose up

# 方法4: クラウドデプロイ
# Heroku, Azure, Google Cloud Runにワンクリックデプロイ可能

基本的な使い方

Hello World相当の例

<!-- シンプルなテキスト分類タスクの設定 -->
<View>
  <Text name="text" value="$text"/>
  <Choices name="sentiment" toName="text">
    <Choice value="Positive"/>
    <Choice value="Negative"/>
    <Choice value="Neutral"/>
  </Choices>
</View>

<!-- Pythonでの使用例 -->
# label-studio-sdkを使用
from label_studio_sdk import Client

ls = Client(url='http://localhost:8080', api_key='your-api-key')
project = ls.start_project(
    title='Sentiment Analysis',
    label_config=config_xml
)

実践的な使用例

<!-- 画像の物体検出タスク -->
<View>
  <Image name="image" value="$image"/>
  <RectangleLabels name="label" toName="image">
    <Label value="Person" background="green"/>
    <Label value="Car" background="blue"/>
    <Label value="Bicycle" background="red"/>
  </RectangleLabels>
</View>
# MLモデルとの統合
import label_studio_ml.api
from label_studio_ml.model import LabelStudioMLBase

class MyModel(LabelStudioMLBase):
    def setup(self):
        """MLモデルの初期化"""
        self.model = load_your_model()
    
    def predict(self, tasks, **kwargs):
        """事前ラベリングの予測"""
        predictions = []
        for task in tasks:
            prediction = self.model.predict(task['data']['image'])
            predictions.append({
                'result': convert_to_ls_format(prediction),
                'score': prediction.confidence
            })
        return predictions

高度な使い方

# WebhookとAPIを使用したデータパイプライン統合
from label_studio_sdk import Client
import requests

# Label Studioクライアント初期化
ls = Client(url='http://localhost:8080', api_key='your-api-key')

# プロジェクト作成とWebhook設定
project = ls.start_project(
    title='Production Pipeline',
    label_config=config_xml
)

# Webhook設定
project.set_webhook(
    url='https://your-api.com/webhook',
    events=['ANNOTATION_CREATED', 'ANNOTATION_UPDATED']
)

# クラウドストレージからデータインポート
storage = project.connect_cloud_storage(
    type='s3',
    bucket='my-data-bucket',
    prefix='images/',
    regex_filter='.*\.jpg$',
    aws_access_key_id='key',
    aws_secret_access_key='secret'
)

# アクティブラーニングの実装
def active_learning_loop():
    while True:
        # MLモデルから不確実なサンプルを取得
        uncertain_samples = ml_backend.get_uncertain_samples()
        
        # Label Studioにタスクとして追加
        project.import_tasks(uncertain_samples)
        
        # アノテーション完了を待つ
        annotations = wait_for_annotations(project)
        
        # モデルを再訓練
        ml_backend.retrain(annotations)

ドキュメント・リソース

公式ドキュメント

サンプル・デモ

  • ライブデモ: https://app.heartex.com/demo - 様々なアノテーションタスクの体験
  • テンプレートギャラリー: 画像分類、物体検出、NER、音声認識等のテンプレート
  • ビデオチュートリアル: YouTubeでの使用方法解説

チュートリアル・ガイド

  • 公式ドキュメントのクイックスタート
  • Slackコミュニティ (17,000+メンバー)
  • ブログ記事やチュートリアル動画
  • MLバックエンド統合のサンプルコード

技術的詳細

アーキテクチャ

全体構造

Label StudioはモノリシックなNX管理プロジェクトで、以下の3つの主要コンポーネントで構成されています:

  1. バックエンド: Djangoフレームワークを使用したPythonアプリケーション
  2. フロントエンド: Reactとmobx-state-treeを使用したアノテーションUI
  3. Data Manager: データ探索と管理のためのツール

各コンポーネントは独立して開発・デプロイ可能で、REST APIを通じて通信します。

ディレクトリ構成

label-studio/
├── label_studio/            # Djangoバックエンドアプリケーション
│   ├── core/               # コア機能(設定、認証、モデル)
│   ├── projects/           # プロジェクト管理
│   ├── tasks/              # タスクとアノテーション管理
│   ├── data_export/        # エクスポート機能
│   ├── data_import/        # インポート機能
│   ├── io_storages/        # クラウドストレージ連携
│   ├── ml/                 # MLモデル統合
│   └── organizations/      # マルチテナント機能
├── web/                     # フロントエンド(NXモノレポ)
│   ├── apps/               # アプリケーション
│   │   └── labelstudio/   # メインアプリ
│   └── libs/               # ライブラリ
│       ├── editor/        # アノテーションエディタ
│       └── datamanager/   # データ管理ツール
├── docs/                    # ドキュメント
├── deploy/                  # デプロイ設定
└── scripts/                 # ユーティリティスクリプト

主要コンポーネント

  • Label Studio Frontend (LSF): Reactベースのアノテーションエディタ

    • 場所: web/libs/editor/
    • 依存: React, mobx-state-tree, Konva.js
    • インターフェース: カスタマイズ可能なラベリングUIコンポーネント
  • Data Manager: データ探索・管理ツール

    • 場所: web/libs/datamanager/
    • 依存: React, AG Grid
    • インターフェース: フィルタリング、ソート、一括操作
  • Projects App: プロジェクト管理モジュール

    • 場所: label_studio/projects/
    • 依存: Django ORM, DRF
    • インターフェース: プロジェクトCRUD, 権限管理
  • ML Backend: 機械学習モデル統合

    • 場所: label_studio/ml/
    • 依存: requests, Redis
    • インターフェース: predict(), fit(), webhookハンドラ

技術スタック

コア技術

  • 言語:
    • Python 3.10+ (バックエンド)
    • JavaScript/TypeScript (フロントエンド)
  • フレームワーク:
    • Django 5.1.8 (Webフレームワーク)
    • Django REST Framework 3.15.2 (API)
    • React 18+ (UIフレームワーク)
  • 主要ライブラリ:
    • mobx-state-tree: 状態管理
    • Konva.js: Canvasベースの描画
    • pandas/numpy: データ処理
    • Redis: ジョブキューとキャッシュ
    • PostgreSQL/SQLite: データベース

開発・運用ツール

  • ビルドツール:
    • Poetry (バックエンド依存管理)
    • NX (フロントエンドモノレポ管理)
    • Yarn (パッケージ管理)
  • テスト:
    • pytest (Pythonテスト)
    • Jest (JavaScriptテスト)
    • E2Eテスト
  • CI/CD: GitHub Actionsでの自動テストとビルド
  • デプロイ:
    • Docker/Docker Compose
    • Heroku, Azure, GCPワンクリックデプロイ
    • Kubernetes対応

設計パターン・手法

  • MVTパターン: DjangoのMVTアーキテクチャ
  • RESTful API: リソースベースのAPI設計
  • コンポーネントベースUI: Reactコンポーネントの再利用
  • プラグインアーキテクチャ: MLバックエンドの拡張性
  • マルチテナント設計: 組織単位でのデータ分離

データフロー・処理フロー

  1. データインポート: ファイル/クラウドストレージからデータ取得
  2. タスク作成: データをラベリングタスクとして登録
  3. 事前ラベリング (オプション): MLモデルによる予測
  4. アノテーション: ユーザーによるラベル付け
  5. 品質管理: レビュー、承認、スキップ
  6. エクスポート: 様々な形式でラベルデータを出力
  7. MLモデル更新 (オプション): 新しいアノテーションでモデル再訓練

API・インターフェース

公開API

POST /api/projects

  • 目的: 新しいプロジェクトの作成
  • 使用例:
import requests

response = requests.post(
    'http://localhost:8080/api/projects',
    headers={'Authorization': f'Token {api_key}'},
    json={
        'title': 'Image Classification',
        'label_config': '<View>...</View>'
    }
)

POST /api/projects/{id}/import

  • 目的: データのインポート
  • 使用例:
tasks = [
    {'data': {'image': 'http://example.com/image1.jpg'}},
    {'data': {'image': 'http://example.com/image2.jpg'}}
]
response = requests.post(
    f'http://localhost:8080/api/projects/{project_id}/import',
    headers={'Authorization': f'Token {api_key}'},
    json=tasks
)

GET /api/projects/{id}/export

  • 目的: アノテーションデータのエクスポート
  • 使用例:
# JSON形式でエクスポート
response = requests.get(
    f'http://localhost:8080/api/projects/{project_id}/export?export_type=JSON',
    headers={'Authorization': f'Token {api_key}'}
)

設定・カスタマイズ

設定ファイル

# settings/base.py の主要設定
LABEL_STUDIO_HOSTNAME = 'http://localhost:8080'
DATABASE_URL = 'postgresql://user:pass@localhost/labelstudio'
RQ_QUEUES = {
    'default': {
        'HOST': 'localhost',
        'PORT': 6379,
        'DB': 0
    }
}

# 環境変数での設定
DJANGO_DB=default
LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true
LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/data
<!-- ラベル設定の例 -->
<View>
  <Text name="text" value="$text"/>
  <Choices name="sentiment" toName="text">
    <Choice value="positive"/>
    <Choice value="negative"/>
  </Choices>
</View>

拡張・プラグイン開発

新しいアノテーションタイプの追加:

// カスタムタグの作成
import React from 'react';
import { observer } from 'mobx-react';
import { types } from 'mobx-state-tree';
import Registry from '../../core/Registry';

const CustomLabelModel = types
  .model({
    id: types.identifier,
    value: types.string,
  })
  .actions(self => ({
    setValue(value) {
      self.value = value;
    },
  }));

const CustomLabelView = observer(({ item }) => {
  return <div>{/* カスタムUI実装 */}</div>;
});

Registry.addTag('customlabel', CustomLabelModel, CustomLabelView);

MLバックエンドの作成:

from label_studio_ml.model import LabelStudioMLBase

class CustomMLBackend(LabelStudioMLBase):
    def setup(self):
        self.model = load_model()
    
    def predict(self, tasks, **kwargs):
        # 予測ロジック
        pass

パフォーマンス・スケーラビリティ

パフォーマンス特性

  • ベンチマーク結果:
    • 10,000タスクまで快適に動作
    • 100,000+タスクでパフォーマンスチューニング推奨
    • ページネーションとフィルタリングで対応
  • 最適化手法:
    • Redisキャッシュ
    • データベースインデックス
    • 非同期タスク処理 (RQ)
    • CDNでの静的ファイル配信

スケーラビリティ

  • 水平スケーリング: Docker/Kubernetesでの複数インスタンス
  • データベース: PostgreSQL推奨(SQLiteは開発用)
  • ファイルストレージ: クラウドストレージ統合推奨
  • キャッシュ: Redisクラスタ
  • ロードバランサー: Nginxでの負荷分散

制限事項

  • リアルタイムコラボレーションは限定的
  • 動画アノテーションはフレーム単位
  • 大規模データセットではパフォーマンス調整が必要
  • 一部の高度な機能はエンタープライズ版のみ

評価・所感

技術的評価

強み

  • 柔軟なラベリング設定: XMLベースの直感的な設定
  • 幅広いデータタイプ対応: 画像、テキスト、音声、動画等
  • 完全オープンソース: Apache 2.0ライセンス
  • 活発なコミュニティ: 17,000+のSlackメンバー
  • 企業採用実績: 大手テック企業での利用

改善の余地

  • リアルタイムコラボレーション機能の強化
  • モバイルアプリの提供
  • 3Dデータのアノテーションサポート
  • パフォーマンスの更なる最適化
  • UI/UXのモダナイゼーション

向いている用途

  • 機械学習モデルの訓練データ作成
  • コンピュータービジョンタスク(物体検出、セグメンテーション)
  • NLPタスク(固有表現抽出、感情分析)
  • 音声・音楽データのアノテーション
  • データ品質管理と検証
  • AIモデルの評価と改善

向いていない用途

  • 大規模なリアルタイム共同編集
  • モバイル主体のワークフロー
  • 複雑な3Dデータのアノテーション
  • 完全自動化されたラベリングパイプライン
  • 非ML関連の汎用データ管理

総評

Label Studioは、機械学習プロジェクトにおけるデータラベリングのデファクトスタンダードとも言える成熟したツールです。特に、柔軟なラベリング設定、幅広いデータタイプへの対応、MLモデルとの統合性は他のツールと一線を画しています。

オープンソースでありながら、企業向けのサポートも提供されており、個人から大企業まで幅広いユーザー層に対応しています。Cloudflare、NVIDIA、Metaなどの大手企業での採用実績は、その信頼性と実用性を証明しています。

活発なコミュニティと継続的な開発により、新機能の追加や改善が継続されており、今後もMLデータラベリング分野の中核的なツールとして発展していくことが期待されます。

一方で、リアルタイムコラボレーションやモバイル対応など、まだ改善の余地もありますが、現時点でも十分に実用的で信頼できるデータラベリングプラットフォームであると評価できます。