Вы когда-нибудь пробовали обучить нейросеть распознавать объекты на видео с веб-камеры? Или, может быть, хотели автоматически удалять фон с фотографий для интернет-магазина? Компьютерное зрение (CV) — одна из самых захватывающих областей AI, но порог входа часто кажется высоким: нужно разбираться в математике,框架ах и пайплайнах данных. Однако с ростом популярности больших языковых моделей (LLM) появился новый способ взаимодействия с кодом — через промты. Теперь вы можете "разговаривать" с кодом на естественном языке, объясняя задачу, а модель генерирует рабочий код на Python с использованием OpenCV, YOLO и других библиотек.
В этой статье я собрал 12 промтов, которые покрывают наиболее частые задачи в CV: от базовой обработки изображений до детекции объектов в реальном времени. Каждый промт — это не просто строка текста, а проверенный рецепт, который вы можете скопировать и адаптировать под свои нужды. Я использую их в своих проектах и уверен, что они сэкономят вам часы гугления и отладки.
Подготовка к работе
Прежде чем мы начнем, убедитесь, что у вас установлены необходимые библиотеки. Я рекомендую использовать Python 3.10+ и виртуальное окружение. Для установки всех зависимостей выполните:
pip install opencv-python opencv-python-headless numpy torch torchvision ultralytics
Для задач, связанных с YOLO, мы будем использовать официальный пакет ultralytics, который предоставляет простой API для загрузки предобученных моделей и запуска инференса. Если вы планируете работать с GPU, установите соответствующую версию PyTorch с сайта pytorch.org.
Базовые промты для обработки изображений
1. Загрузка и отображение изображения
Задача: Загрузить изображение с диска, отобразить его в окне и сохранить копию в другом формате.
Промт:
Напиши код на Python с использованием OpenCV, который загружает изображение из файла 'input.jpg', выводит его размеры и количество каналов, затем отображает изображение в окне с заголовком 'Original' и ждет нажатия любой клавиши, после чего сохраняет изображение в формате PNG под именем 'output.png'.
Пример результата:
import cv2
# Загрузка изображения
image = cv2.imread('input.jpg')
if image is None:
print('Ошибка: не удалось загрузить изображение')
else:
# Вывод размеров и каналов
h, w = image.shape[:2]
print(f'Размер: {w}x{h}, каналов: {image.shape[2] if len(image.shape) > 2 else 1}')
# Отображение
cv2.imshow('Original', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Сохранение в PNG
cv2.imwrite('output.png', image)
Пояснение: Этот простой пример демонстрирует базовые операции: чтение, проверку успешности, вывод атрибутов, отображение и запись. Промт позволяет получить готовый код без необходимости помнить точный синтаксис.
2. Изменение размера и обрезка
Задача: Изменить размер изображения до указанных размеров, сохраняя пропорции, и обрезать центральную область.
Промт:
Создай функцию на Python с OpenCV, которая принимает путь к изображению, целевую ширину и высоту. Функция должна изменять размер изображения с сохранением пропорций (используя cv2.resize с интерполяцией INTER_AREA), а затем обрезать изображение по центру до точного размера (width, height). Верни обрезанное изображение. Покажи пример использования для изображения 'photo.jpg' размером 800x600.
Пример результата:
import cv2
def resize_and_crop(image_path, target_width, target_height):
image = cv2.imread(image_path)
if image is None:
raise ValueError(f"Не удалось загрузить {image_path}")
h, w = image.shape[:2]
scale = max(target_width / w, target_height / h)
new_w = int(w * scale)
new_h = int(h * scale)
resized = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_AREA)
# Центральная обрезка
start_x = (new_w - target_width) // 2
start_y = (new_h - target_height) // 2
cropped = resized[start_y:start_y + target_height, start_x:start_x + target_width]
return cropped
# Пример использования
result = resize_and_crop('photo.jpg', 800, 600)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Пояснение: Этот код сначала масштабирует изображение так, чтобы оно полностью покрывало целевую область, а затем вырезает центральную часть. Это стандартный подход для подготовки изображений для нейросетей.
3. Применение фильтров и обнаружение краев
Задача: Применить к изображению гауссово размытие и детектор краев Canny, отобразить результаты рядом.
Промт:
Напиши код на Python с OpenCV, который загружает изображение 'scene.jpg', применяет гауссово размытие с ядром 5x5, затем преобразует изображение в оттенки серого и применяет детектор краев Canny с порогами 50 и 150. Отобрази исходное изображение, размытое и результат Canny в трех отдельных окнах, расположив их горизонтально с помощью np.hstack.
Пример результата:
import cv2
import numpy as np
image = cv2.imread('scene.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# Объединение в одну строку
combined = np.hstack((gray, blurred, edges))
cv2.imshow('Gray
| Blurred | Canny', combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
Пояснение: Детектор Canny — классический алгоритм для выделения границ. Промт включает размытие для уменьшения шума, что улучшает качество детекции.
Продвинутые промты для детекции и распознавания
4. Детекция лиц с помощью каскадов Хаара
Задача: Обнаружить лица на изображении и нарисовать вокруг них прямоугольники.
Промт:
Используя OpenCV и предобученный каскад Хаара для лиц (haarcascade_frontalface_default.xml), напиши код, который загружает изображение 'people.jpg', обнаруживает лица с параметрами scaleFactor=1.1, minNeighbors=5, minSize=(30,30), рисует зеленые прямоугольники вокруг каждого лица и выводит количество найденных лиц. Убедись, что путь к каскаду указан корректно, например, cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'.
Пример результата:
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
image = cv2.imread('people.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30))
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
print(f'Найдено лиц: {len(faces)}')
cv2.imshow('Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Пояснение: Каскады Хаара — классический метод, работающий в реальном времени, но менее точный, чем современные CNN. Тем не менее, он полезен для простых задач.
5. Использование YOLOv8 для детекции объектов
Задача: Загрузить предобученную модель YOLOv8 и детектировать объекты на изображении, выводя bounding boxes и классы.
Промт:
Напиши код с использованием библиотеки ultralytics, который загружает предобученную модель YOLOv8n (nano), выполняет детекцию на изображении 'street.jpg' с порогом уверенности 0.5, выводит список обнаруженных объектов с их классами и координатами, рисует bounding boxes и сохраняет результат как 'yolo_output.jpg'. Также выведи FPS, если обрабатывается видео.
Пример результата:
from ultralytics import YOLO
import cv2
model = YOLO('yolov8n.pt') # предобученная nano-модель
results = model('street.jpg', conf=0.5)
# Результаты
for result in results:
boxes = result.boxes
for box in boxes:
cls = int(box.cls[0])
conf = float(box.conf[0])
xyxy = box.xyxy[0].tolist()
print(f'Класс: {model.names[cls]}, уверенность: {conf:.2f}, координаты: {xyxy}')
# Сохранение результата с боксами
annotated_frame = results[0].plot()
cv2.imwrite('yolo_output.jpg', annotated_frame)
Пояснение: YOLOv8 — одна из самых популярных моделей для детекции. Пакет ultralytics автоматически скачает веса при первом запуске. Nano-версия (n) — самая быстрая и легкая, идеальна для экспериментов.
6. Сегментация изображений с YOLOv8
Задача: Выполнить семантическую сегментацию изображения с использованием модели YOLOv8-seg.
Промт:
Используя YOLOv8 с сегментацией (модель 'yolov8n-seg.pt'), напиши код для сегментации изображения 'road.jpg'. Визуализируй маски объектов (залей их полупрозрачным цветом), выведи список классов и сохрани результат. Используй параметр conf=0.5.
Пример результата:
from ultralytics import YOLO
import cv2
model = YOLO('yolov8n-seg.pt')
results = model('road.jpg', conf=0.5)
# Визуализация масок
annotated = results[0].plot() # уже включает маски
cv2.imwrite('segmented_road.jpg', annotated)
# Вывод классов
for result in results:
for cls in result.boxes.cls:
print(model.names[int(cls)])
Пояснение: Сегментация позволяет выделить пиксельные маски объектов. Это полезно для задач, где нужна точная граница объекта (например, для беспилотных автомобилей).
7. Отслеживание объектов на видео
Задача: Реализовать отслеживание объектов в видеопотоке с помощью YOLOv8 и трекера ByteTrack.
Промт:
Напиши код для обработки видео 'traffic.mp4' с использованием YOLOv8n и встроенного трекера (track=True). Для каждого кадра выводи количество отслеживаемых объектов, рисуй bounding boxes с ID объектов и сохраняй обработанное видео как 'tracked_output.mp4'. Используй видеокодек mp4v.
Пример результата:
from ultralytics import YOLO
import cv2
model = YOLO('yolov8n.pt')
cap = cv2.VideoCapture('traffic.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter('tracked_output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
while True:
ret, frame = cap.read()
if not ret:
break
results = model.track(frame, persist=True, conf=0.5)
annotated = results[0].plot()
out.write(annotated)
cap.release()
out.release()
Пояснение: Трекинг позволяет присваивать уникальные ID каждому объекту на протяжении видео, что важно для анализа трафика или подсчета людей.
Экспертные промты для сложных задач
8. Оптическое распознавание символов (OCR) с Tesseract
Задача: Извлечь текст с изображения с помощью Tesseract OCR.
Промт:
Напиши код на Python, который использует библиотеку pytesseract для распознавания текста с изображения 'document.jpg'. Предварительно примени улучшение: преобразуй в оттенки серого, примени адаптивный порог и удаление шума (fastNlMeansDenoising). Выведи распознанный текст в консоль.
Пример результата:
import cv2
import pytesseract
image = cv2.imread('document.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
denoised = cv2.fastNlMeansDenoising(thresh)
text = pytesseract.image_to_string(denoised, lang='rus+eng')
print(text)
Пояснение: Tesseract — один из лучших OCR-движков с открытым исходным кодом. Для русского языка нужно установить языковой пакет: sudo apt install tesseract-ocr-rus или скачать с GitHub.
9. Оценка глубины с помощью MiDaS
Задача: Оценить карту глубины для изображения с использованием модели MiDaS из PyTorch Hub.
Промт:
Напиши код, который загружает предобученную модель MiDaS (midas_v21_small) из PyTorch Hub, преобразует входное изображение в тензор, выполняет инференс и визуализирует карту глубины в оттенках серого. Используй библиотеки torch, torchvision, opencv, numpy, matplotlib.
Пример результата:
import cv2
import torch
import numpy as np
import matplotlib.pyplot as plt
# Загрузка модели Midаs
model = torch.hub.load('intel-isl/MiDaS', 'MiDaS_small')
model.eval()
# Трансформации
transforms = torch.hub.load('intel-isl/MiDaS', 'transforms')
transform = transforms.small_transform
# Загрузка и обработка изображения
img = cv2.imread('room.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
input_batch = transform(img_rgb).unsqueeze(0)
with torch.no_grad():
prediction = model(input_batch)
prediction = torch.nn.functional.interpolate(
prediction.unsqueeze(1),
size=img_rgb.shape[:2],
mode='bicubic',
align_corners=False
).squeeze()
depth_map = prediction.cpu().numpy()
# Нормализация для отображения
depth_normalized = cv2.normalize(depth_map, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
plt.imshow(depth_normalized, cmap='gray')
plt.axis('off')
plt.savefig('depth_map.jpg', bbox_inches='tight')
Пояснение: MiDaS — модель для монокулярной оценки глубины, то есть глубины по одному изображению. Это сложная задача, и MiDaS дает впечатляющие результаты.
10. Генерация аугментаций для тренировки моделей
Задача: Создать пайплайн аугментации изображений с помощью библиотеки Albumentations.
Промт:
Напиши код с использованием библиотеки albumentations, который применяет следующие аугментации к изображению 'cat.jpg': горизонтальное отражение (p=0.5), случайное изменение яркости и контраста (BrightnessContrast, p=0.2), случайное вращение на 30 градусов (p=0.3). Сгенерируй 5 вариантов изображения и сохрани их в папку 'augmented'. Используй seed=42 для воспроизводимости.
Пример результата:
import albumentations as A
import cv2
import os
image = cv2.imread('cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Определяем пайплайн аугментаций
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.BrightnessContrast(p=0.2),
A.Rotate(limit=30, p=0.3),
])
os.makedirs('augmented', exist_ok=True)
for i in range(5):
augmented = transform(image=image)['image']
cv2.imwrite(f'augmented/cat_{i}.jpg', cv2.cvtColor(augmented, cv2.COLOR_RGB2BGR))
Пояснение: Аугментация — ключевой метод для улучшения обобщающей способности моделей. Albumentations — быстрая и гибкая библиотека.
11. Встраивание изображений для поиска похожих
Задача: Получить векторное представление изображения с помощью модели CLIP и найти похожие изображения в наборе.
Промт:
Напиши код на Python, который использует модель CLIP (ViT-B/32) из библиотеки transformers для получения эмбеддингов изображений. Загрузи список изображений из папки 'images/', вычисли эмбеддинги для каждого, нормализуй их и сохрани в файл 'embeddings.npy'. Затем для заданного запроса 'query.jpg' найди топ-3 наиболее похожих изображения по косинусной близости и выведи их имена.
Пример результата:
import os
import numpy as np
import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained('openai/clip-vit-base-patch32')
processor = CLIPProcessor.from_pretrained('openai/clip-vit-base-patch32')
def get_embedding(image_path):
image = Image.open(image_path)
inputs = processor(images=image, return_tensors='pt')
with torch.no_grad():
features = model.get_image_features(**inputs)
return features.numpy().flatten()
# Обработка всех изображений в папке
image_paths = [os.path.join('images', f) for f in os.listdir('images') if f.endswith(('.jpg', '.png'))]
embeddings = np.array([get_embedding(p) for p in image_paths])
np.save('embeddings.npy', embeddings)
# Запрос
query_embedding = get_embedding('query.jpg')
# Нормализация для косинусной близости
query_norm = query_embedding / np.linalg.norm(query_embedding)
emb_norm = embeddings / np.linalg.norm(embeddings, axis=1, keepdims=True)
similarities = emb_norm @ query_norm
top_indices = np.argsort(similarities)[-3:][::-1]
print('Топ-3 похожих изображения:')
for idx in top_indices:
print(f'{image_paths[idx]}: {similarities[idx]:.4f}')
Пояснение: CLIP — мощная модель, которая выравнивает изображения и текст в одном пространстве эмбеддингов. Это позволяет использовать текстовые запросы для поиска изображений.
12. Создание пайплайна детекции с веб-камеры
Задача: Реализовать детекцию объектов в реальном времени с веб-камеры.
Промт:
Напиши код для детекции объектов в реальном времени с веб-камеры (камера 0) с использованием YOLOv8n. Отображай видео с нарисованными боксами и FPS на изображении. Выход из программы по нажатию клавиши 'q'.
Пример результата:
from ultralytics import YOLO
import cv2
model = YOLO('yolov8n.pt')
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame, conf=0.5)
annotated = results[0].plot()
# Отображение FPS
fps = cap.get(cv2.CAP_PROP_FPS)
cv2.putText(annotated, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('YOLO Webcam', annotated)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Пояснение: Этот код — основа для множества приложений: от умных камер до систем безопасности. Вы можете легко модифицировать его для обработки видеофайлов или потоков.
Заключение
Эти 12 промтов — лишь малая часть того, что можно сделать с помощью промт-инжиниринга в области компьютерного зрения. Главное преимущество такого подхода — скорость: вместо поиска по документации и Stack Overflow вы описываете задачу словами, и получаете рабочий код. Но помните: промты не заменяют понимания основ. Чтобы эффективно использовать эти примеры, важно разбираться в базовых концепциях CV и Python.
Попробуйте адаптировать эти промты под свои задачи: измените параметры, добавьте новые шаги, объедините несколько техник. Экспериментируйте! Если у вас возникнут вопросы или вы найдете более элегантные решения, поделитесь в комментариях. Удачного кодинга!
Комментарии