Інтеграція Label Studio для розмітки даних

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Інтеграція Label Studio для розмітки даних
Простий
~2-3 дні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Інтеграція Label Studio для розмітки даних

Label Studio — платформа розмітки з відкритим кодом з підтримкою тексту, зображень, аудіо та часових рядів. Розгортається за 15 хвилин, масштабується через Kubernetes, інтегрується з ML-бекендами для автоматичної передрозмітки.

Швидкий старт

# Docker Compose з PostgreSQL та Redis
cat > docker-compose.yml << 'EOFCOMPOSE'
version: '3.8'
services:
  label-studio:
    image: heartexlabs/label-studio:latest
    ports:
      - "8080:8080"
    environment:
      DJANGO_DB: default
      POSTGRE_NAME: labelstudio
      POSTGRE_USER: labelstudio
      POSTGRE_PASSWORD: secret
      POSTGRE_HOST: postgres
      REDIS_LOCATION: redis://redis:6379/1
      LABEL_STUDIO_HOST: http://localhost:8080
    volumes:
      - ./label-studio-data:/label-studio/data
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:14
    environment:
      POSTGRES_DB: labelstudio
      POSTGRES_USER: labelstudio
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7

volumes:
  postgres_data:
EOFCOMPOSE

docker compose up -d

Створення проектів через API

import label_studio_sdk
from label_studio_sdk import Client

ls = Client(url='http://localhost:8080', api_key='your-api-key')

# NER проект
ner_project = ls.start_project(
    title='Named Entity Recognition',
    label_config='''
    <View>
      <Labels name="label" toName="text">
        <Label value="Person" background="#FF6B6B"/>
        <Label value="Organization" background="#4ECDC4"/>
        <Label value="Location" background="#45B7D1"/>
        <Label value="Date" background="#FFA07A"/>
      </Labels>
      <Text name="text" value="$text"/>
    </View>
    '''
)

# Класифікація з кількома мітками
classification_project = ls.start_project(
    title='Sentiment Classification',
    label_config='''
    <View>
      <Text name="text" value="$text" granularity="sentence"/>
      <Choices name="sentiment" toName="text" choice="single">
        <Choice value="Positive"/>
        <Choice value="Negative"/>
        <Choice value="Neutral"/>
      </Choices>
      <Rating name="confidence" toName="text" maxRating="5" defaultValue="3"/>
    </View>
    '''
)

Завантаження завдань та експорт анотацій

import json

def upload_tasks(project, texts: list[str], batch_size: int = 500):
    """Пакетне завантаження завдань"""
    tasks = [{"data": {"text": t}} for t in texts]

    for i in range(0, len(tasks), batch_size):
        batch = tasks[i:i + batch_size]
        project.import_tasks(batch)
        print(f"Uploaded {min(i + batch_size, len(tasks))}/{len(tasks)}")

def export_annotations(project, export_type: str = 'JSON') -> list[dict]:
    """Експорт готових анотацій"""
    # Лише завершені завдання
    tasks = project.get_tasks(filters={
        'completion_count__gt': 0
    })

    annotations = []
    for task in tasks:
        if task['total_annotations'] > 0:
            annotations.append({
                'id': task['id'],
                'data': task['data'],
                'annotations': task['annotations']
            })

    return annotations

def convert_to_huggingface_format(annotations: list[dict],
                                   task_type: str = 'ner') -> dict:
    """Конвертація у HuggingFace datasets формат"""
    if task_type == 'classification':
        return {
            'text': [a['data']['text'] for a in annotations],
            'label': [
                a['annotations'][0]['result'][0]['value']['choices'][0]
                for a in annotations
                if a['annotations'] and a['annotations'][0]['result']
            ]
        }
    return {}

ML-бекенд для передрозмітки

from label_studio_ml import LabelStudioMLBase
from transformers import pipeline

class SentimentMLBackend(LabelStudioMLBase):
    """Передрозмітка через HuggingFace модель"""

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.classifier = pipeline(
            "zero-shot-classification",
            model="facebook/bart-large-mnli"
        )
        self.labels = ['Positive', 'Negative', 'Neutral']

    def predict(self, tasks: list[dict], **kwargs) -> list[dict]:
        predictions = []

        for task in tasks:
            text = task['data'].get('text', '')
            result = self.classifier(text, candidate_labels=self.labels)

            predictions.append({
                'result': [{
                    'from_name': 'sentiment',
                    'to_name': 'text',
                    'type': 'choices',
                    'value': {'choices': [result['labels'][0]]}
                }],
                'score': result['scores'][0]
            })

        return predictions

# Запуск ML-бекенду
# label-studio-ml start sentiment_backend --port 9090

Label Studio з ML-бекендом скорочує час ручної розмітки на 60-70%. 10K текстів з передрозміткою: 2-3 дні проти 7-10 без неї. Вартість розміченого датасету знижується з $0.03-0.05 до $0.01-0.015 за приклад при використанні передрозмітки.