{/ Эта страница автоматически создается на основе файла SKILL.md навыка с помощью сайта site/scripts/generate-skill-docs.py. Редактируйте исходный код SKILL.md, а не эту страницу. /}

Клип

Модель OpenAI, объединяющая зрение и язык. Обеспечить выполнение классификации изображений без обучающих примеров (нулевой снимок), рассмотрение изображений и текста, а также кросс-модальный поиск. Обучена на 400 млн пар «изображение-текст». Используется для поиска изображений, модерации контента и решения задач по стыке вопросов и языка без дополнительного обучения. Лучше всего подходит для общего понимания изображений.

Метаданные навыки

Источник Опционально — установка: hermeskills installofficial/mlops/clip
Путь optional-skills/mlops/clip
Версия 1.0.0
Автор Исследование оркестра
Лицензия Массачусетский технологический институт
Зависимости трансформеры, факел, подушка
Платформы Linux, MacOS, Windows
Теги «Мультимодальный», «CLIP», «Vision-Language», «Zero-Shot», «Классификация изображений», «OpenAI», «Поиск изображений», «Кросс-модальный поиск», «Модерация контента»

Справочник: полный SKILL.md:::информация

Ниже приведено полное описание навыков, которые Hermes загружает при его активации. Агент увидит эту инструкцию, когда навыки активны.

CLIP — Предварительная тренировка контрастного языка и изображения

Модель OpenAI, понимающая образ на основе естественного языка.

Когда использовать CLIP

Используйте, если: - Нужна классификация изображений без обучающих примеров (нулевой снимок) — не требуются обучающие данные. - Необходимо парламентие изображений и текста для детей. - Требуется семантический поиск изображений - Нужна модерация контента (обнаружение NSFW, армия) - Нужен ответ на вопросы по изображению (визуальный ответ на вопрос) - Требуется кросс-модальный поиск (изображение→текст, текст→изображение)

Показатели: - Более 25300 звезд на GitHub - Обучена на 400 млн пар «изображение-текст» - На уровне ResNet-50 на ImageNet (нулевой выстрел) - Лицензия MIT

Вместо этого викор альтернативы: - BLIP-2: лучше для подписки к изображениям - LLaVA: диалог на основе взглядов и языка - Сегментировать что угодно: сегментация изображений.

Быстрый старт

Установка

pip install git+https://github.com/openai/CLIP.git
pip install torch torchvision ftfy regex tqdm

Классификация без обучающих примеров (нулевой выстрел)

import torch
import clip
from PIL import Image

# Load model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

# Load image
image = preprocess(Image.open("photo.jpg")).unsqueeze(0).to(device)

# Define possible labels
text = clip.tokenize(["a dog", "a cat", "a bird", "a car"]).to(device)

# Compute similarity
with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)

    # Cosine similarity
    logits_per_image, logits_per_text = model(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

# Print results
labels = ["a dog", "a cat", "a bird", "a car"]
for label, prob in zip(labels, probs[0]):
    print(f"{label}: {prob:.2%}")

Доступные модели

# Models (sorted by size)
models = [
    "RN50",           # ResNet-50
    "RN101",          # ResNet-101
    "ViT-B/32",       # Vision Transformer (рекомендуется)
    "ViT-B/16",       # Лучше качество, медленнее
    "ViT-L/14",       # Наилучшее качество, самый медленный
]

model, preprocess = clip.load("ViT-B/32")
Модель Параметры Скорость Качество
РН50 102М Быстро Хорошо
ВИТ-Б/32 151М Среднее Лучше
ВиТ-Л/14 428М Медленно Наилучшее

Сопоставление изображений и текста

# Compute embeddings
image_features = model.encode_image(image)
text_features = model.encode_text(text)

# Normalize
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)

# Cosine similarity
similarity = (image_features @ text_features.T).item()
print(f"Similarity: {similarity:.4f}")

Семантический поиск изображений

# Index images
image_paths = ["img1.jpg", "img2.jpg", "img3.jpg"]
image_embeddings = []

for img_path in image_paths:
    image = preprocess(Image.open(img_path)).unsqueeze(0).to(device)
    with torch.no_grad():
        embedding = model.encode_image(image)
        embedding /= embedding.norm(dim=-1, keepdim=True)
    image_embeddings.append(embedding)

image_embeddings = torch.cat(image_embeddings)

# Search with text query
query = "a sunset over the ocean"
text_input = clip.tokenize([query]).to(device)
with torch.no_grad():
    text_embedding = model.encode_text(text_input)
    text_embedding /= text_embedding.norm(dim=-1, keepdim=True)

# Find most similar images
similarities = (text_embedding @ image_embeddings.T).squeeze(0)
top_k = similarities.topk(3)

for idx, score in zip(top_k.indices, top_k.values):
    print(f"{image_paths[idx]}: {score:.3f}")

Модерация контента

# Define categories
categories = [
    "safe for work",
    "not safe for work",
    "violent content",
    "graphic content"
]

text = clip.tokenize(categories).to(device)

# Check image
with torch.no_grad():
    logits_per_image, _ = model(image, text)
    probs = logits_per_image.softmax(dim=-1)

# Get classification
max_idx = probs.argmax().item()
max_prob = probs[0, max_idx].item()

print(f"Category: {categories[max_idx]} ({max_prob:.2%})")

Пакетная обработка

# Process multiple images
images = [preprocess(Image.open(f"img{i}.jpg")) for i in range(10)]
images = torch.stack(images).to(device)

with torch.no_grad():
    image_features = model.encode_image(images)
    image_features /= image_features.norm(dim=-1, keepdim=True)

# Batch text
texts = ["a dog", "a cat", "a bird"]
text_tokens = clip.tokenize(texts).to(device)

with torch.no_grad():
    text_features = model.encode_text(text_tokens)
    text_features /= text_features.norm(dim=-1, keepdim=True)

# Similarity matrix (10 images × 3 texts)
similarities = image_features @ text_features.T
print(similarities.shape)  # (10, 3)

Интеграция с векторными базами данных

# Store CLIP embeddings in Chroma/FAISS
import chromadb

client = chromadb.Client()
collection = client.create_collection("image_embeddings")

# Add image embeddings
for img_path, embedding in zip(image_paths, image_embeddings):
    collection.add(
        embeddings=[embedding.cpu().numpy().tolist()],
        metadatas=[{"path": img_path}],
        ids=[img_path]
    )

# Query with text
query = "a sunset"
text_embedding = model.encode_text(clip.tokenize([query]))
results = collection.query(
    query_embeddings=[text_embedding.cpu().numpy().tolist()],
    n_results=5
)

Лучшая практика

  1. Используйте ВиТ-Б/32 в большинстве случаев — хороший баланс
  2. Нормализуйте эмбеддинги — обязательно для косинусной здоровести.
  3. Пакетная обработка — более эффективна.
  4. Кэшируйте эмбеддинги — их вычисление дорого.
  5. Используйте описательные метки — лучшая производительность с нуля.
  6. Рекомендуется графический процессор — в 10–50 раз быстрее.
  7. Предварительная обработка изображения — воспользуйтесь встроенной функцией предобработки.

Производительность

Операция процессор Графический процессор (V100)
Кодирование изображения ~200 мс ~20 мс
Кодирование текста ~50 мс ~5 мс
Вычисление домашних животных <1 мс <1 мс

Ограничения

  1. Не подходит для мелкозернистых задач — лучше всего подходит для категорий
  2. Требуется описательного текста — размытые метки работают плохо.
  3. Имеет размещение из-за веб-данных — возможное смещение в наборе данных
  4. Нет ограничивающих рамок — только всё изображение проекта
  5. Ограниченное пространственное понимание — слабо с точки зрения положений/количеств.

Ресурсы