HumanSignal/label-studio
主な特徴
- **マルチデータタイプ対応**: 画像、テキスト、音声、動画、時系列、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)
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要とインストール方法
- 公式ドキュメント: https://labelstud.io/guide/ - 詳細なガイドとAPIリファレンス
- テンプレートライブラリ: https://labelstud.io/templates - 様々なラベリングタスクのテンプレート
- MLバックエンドガイド: https://github.com/HumanSignal/label-studio-ml-backend
サンプル・デモ
- ライブデモ: https://app.heartex.com/demo - 様々なアノテーションタスクの体験
- テンプレートギャラリー: 画像分類、物体検出、NER、音声認識等のテンプレート
- ビデオチュートリアル: YouTubeでの使用方法解説
チュートリアル・ガイド
- 公式ドキュメントのクイックスタート
- Slackコミュニティ (17,000+メンバー)
- ブログ記事やチュートリアル動画
- MLバックエンド統合のサンプルコード
技術的詳細
アーキテクチャ
全体構造
Label StudioはモノリシックなNX管理プロジェクトで、以下の3つの主要コンポーネントで構成されています:
- バックエンド: Djangoフレームワークを使用したPythonアプリケーション
- フロントエンド: Reactとmobx-state-treeを使用したアノテーションUI
- 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バックエンドの拡張性
- マルチテナント設計: 組織単位でのデータ分離
データフロー・処理フロー
- データインポート: ファイル/クラウドストレージからデータ取得
- タスク作成: データをラベリングタスクとして登録
- 事前ラベリング (オプション): MLモデルによる予測
- アノテーション: ユーザーによるラベル付け
- 品質管理: レビュー、承認、スキップ
- エクスポート: 様々な形式でラベルデータを出力
- 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データラベリング分野の中核的なツールとして発展していくことが期待されます。
一方で、リアルタイムコラボレーションやモバイル対応など、まだ改善の余地もありますが、現時点でも十分に実用的で信頼できるデータラベリングプラットフォームであると評価できます。