Перейти к содержанию

Note

Click here to download the full example code

Руководство по детекции комаров

Это руководство показывает, как использовать MosquitoDetector из библиотеки CulicidaeLab для выполнения детекции объектов на изображениях. Мы рассмотрим:

  • Загрузку модели детектора
  • Подготовку изображения из набора данных
  • Запуск модели для получения ограничивающих рамок
  • Визуализацию результатов
  • Оценку точности предсказаний
  • Выполнение предсказаний на пакете изображений

Установите библиотеку culicidaelab, если она еще не установлена

!pip install -q culicidaelab[full]
или, если есть доступ к GPU
!pip install -q culicidaelab[full-gpu]

1. Инициализация

Сначала мы получим глобальный экземпляр settings и используем его для инициализации нашего MosquitoDetector. Установив load_model=True, мы указываем детектору сразу же загрузить веса модели в память. Если файл модели не существует локально, он будет загружен автоматически.

from PIL import Image, ImageDraw, ImageFont
import numpy as np
import matplotlib.pyplot as plt

from culicidaelab import get_settings
from culicidaelab import MosquitoDetector, DatasetsManager

# Получаем экземпляр настроек
settings = get_settings()

# Инициализируем менеджер наборов данных
manager = DatasetsManager(settings)

# Загружаем набор данных для детекции
detect_data = manager.load_dataset("detection", split="train[:20]")

# Создаем экземпляр детектора и загружаем модель
print("Инициализация MosquitoDetector и загрузка модели...")
detector = MosquitoDetector(settings=settings, load_model=True)
print("Модель успешно загружена.")

Out:

Cache hit for split config: train[:20] C:\Users\lenova\AppData\Local\culicidaelab\culicidaelab\datasets\mosquito_detection\9e9940e1c673b6f0
Инициализация MosquitoDetector и загрузка модели...
Модель успешно загружена.

2. Детекция комаров на изображении из набора данных

Теперь давайте используем изображение из набора данных для детекции и запустим на нем детектор.

Изучаем образец для детекции

detect_sample = detect_data[5]
detect_image = detect_sample["image"]

# Получаем истинные объекты (ground truth)
objects = detect_sample["objects"]
print(f"На этом изображении найдено {len(objects['bboxes'])} объект(ов).")

# Метод `predict` возвращает список обнаружений.
# Каждое обнаружение — это кортеж: (x1, y1, x2, y2, оценка_уверенности)
result = detector.predict(detect_image)

# Метод `visualize` рисует ограничивающие рамки на изображении для удобной проверки.
annotated_image = detector.visualize(detect_image, result)

# Отображаем результат
plt.figure(figsize=(12, 8))
plt.imshow(annotated_image)
plt.axis("off")
plt.title("Обнаруженные комары")
plt.show()

# Выводим численные результаты детекции
print("\nРезультаты детекции:")
if result:
    for i, det in enumerate(result.detections):
        print(
            f"  - Комар {i+1}: \
            Уверенность = {det.confidence:.2f}, \
            Рамка = (x1={det.box.x1:.1f}, y1={det.box.y1:.1f}, x2={det.box.x2:.1f}, y2={det.box.y2:.1f})",
        )
else:
    print("  Комары не обнаружены.")

Обнаруженные комары

Out:

На этом изображении найдено 1 объект(ов).
C:/Users/lenova/CascadeProjects/culicidaelab/docs/ru/examples/tutorial_part_2_mosquito_detection.py:98: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  plt.show()

Результаты детекции:

3. Оценка предсказания с использованием истинных данных (Ground Truth)

Метод evaluate позволяет сравнить предсказание с истинными данными. Это необходимо для оценки точности модели. Метод возвращает несколько метрик, которые является стандартом для задач детекции объектов. Теперь давайте сравним результаты модели с фактическими истинными данными из набора данных.

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

ground_truth_boxes = []
for bbox in objects["bboxes"]:
    x_min, y_min, x_max, y_max = bbox
    ground_truth_boxes.append((x_min, y_min, x_max, y_max))

# Оцениваем, используя истинные данные из набора данных
print("--- Оценка с использованием истинных данных из набора данных ---")
evaluation = detector.evaluate(ground_truth=ground_truth_boxes, prediction=result)
print(evaluation)

Out:

--- Оценка с использованием истинных данных из набора данных ---
{'precision': 0.0, 'recall': 0.0, 'f1': 0.0, 'ap': 0.0, 'mean_iou': 0.0}

Можно такжк получить необходимые метрики, передав необработанное изображение. Детектор будет вызван внутри метода evaluate.

print("\n--- Оценка напрямую из изображения ---")
evaluation_from_raw = detector.evaluate(ground_truth=ground_truth_boxes, input_data=detect_image)
print(evaluation_from_raw)

Out:

--- Оценка напрямую из изображения ---
{'precision': 0.0, 'recall': 0.0, 'f1': 0.0, 'ap': 0.0, 'mean_iou': 0.0}

4. Выполнение пакетных предсказаний на изображениях из набора данных

Для эффективности вы можете обрабатывать несколько изображений одновременно, используя predict_batch.

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

image_batch = [sample["image"] for sample in detect_data]

# Запускаем пакетное предсказание
detections_batch = detector.predict_batch(image_batch)
print("Пакетное предсказание завершено.")

for i, dets in enumerate(detections_batch):
    print(f"  - Изображение {i+1}: Найдено {len(dets.detections)} обнаружений.")

Out:

Пакетное предсказание завершено.
  - Изображение 1: Найдено 1 обнаружений.
  - Изображение 2: Найдено 1 обнаружений.
  - Изображение 3: Найдено 1 обнаружений.
  - Изображение 4: Найдено 1 обнаружений.
  - Изображение 5: Найдено 1 обнаружений.
  - Изображение 6: Найдено 1 обнаружений.
  - Изображение 7: Найдено 1 обнаружений.
  - Изображение 8: Найдено 1 обнаружений.
  - Изображение 9: Найдено 1 обнаружений.
  - Изображение 10: Найдено 1 обнаружений.
  - Изображение 11: Найдено 1 обнаружений.
  - Изображение 12: Найдено 1 обнаружений.
  - Изображение 13: Найдено 1 обнаружений.
  - Изображение 14: Найдено 1 обнаружений.
  - Изображение 15: Найдено 1 обнаружений.
  - Изображение 16: Найдено 1 обнаружений.
  - Изображение 17: Найдено 1 обнаружений.
  - Изображение 18: Найдено 1 обнаружений.
  - Изображение 19: Найдено 1 обнаружений.
  - Изображение 20: Найдено 1 обнаружений.

5. Оценка пакета предсказаний с использованием истинных данных из набора данных

Аналогично, evaluate_batch можно использовать для получения агрегированных метрик по всему набору данных.

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

ground_truth_batch = []
for sample in detect_data:
    boxes = []
    for bbox in sample["objects"]["bboxes"]:
        x_min, y_min, x_max, y_max = bbox
        boxes.append((x_min, y_min, x_max, y_max))
    ground_truth_batch.append(boxes)

# Вызываем evaluate_batch с истинными данными из набора данных
print("\n--- Оценка всего пакета с использованием истинных данных из набора данных ---")
batch_evaluation = detector.evaluate_batch(
    ground_truth_batch=ground_truth_batch,
    predictions_batch=detections_batch,
    num_workers=2,  # Используйте несколько потоков для ускорения обработки
)

print("Агрегированные метрики оценки пакета:")
print(batch_evaluation)

Out:

--- Оценка всего пакета с использованием истинных данных из набора данных ---
Агрегированные метрики оценки пакета:
{'precision_mean': 0.9999999989999999, 'precision_std': 0.0, 'f1_mean': 0.9999999989999999, 'f1_std': 0.0, 'mean_iou_mean': 0.7802580509636634, 'mean_iou_std': 0.11935857019771838, 'recall_mean': 1.0, 'recall_std': 0.0, 'ap_mean': 0.9999999989999999, 'ap_std': 0.0, 'count': 20}

6. Визуализация истинных данных в сравнении с предсказаниями

Давайте создадим сравнительную визуализацию, показывающую как истинные данные, так и предсказания.

Создадим функцию для визуализации как истинных данных, так и предсказаний

def visualize_comparison(image_rgb, ground_truth_boxes, detections):
    if isinstance(image_rgb, np.ndarray):
        if image_rgb.dtype == np.float32 or image_rgb.dtype == np.float64:
            image_rgb = (image_rgb * 255).astype(np.uint8)
        image = Image.fromarray(image_rgb)
    else:
        image = image_rgb.copy()

    draw = ImageDraw.Draw(image)

    try:
        font = ImageFont.truetype("arial.ttf", 16)
    except OSError:
        try:
            font = ImageFont.load_default()
        except Exception:
            font = None

    # Рисуем истинные рамки зеленым цветом
    for bbox in ground_truth_boxes:
        x_min, y_min, x_max, y_max = (int(v) for v in bbox)

        draw.rectangle(
            [(x_min, y_min), (x_max, y_max)],
            outline="green",
            width=2,
        )

        text = "GT"
        text_bbox = draw.textbbox((0, 0), text, font=font)
        text_width = text_bbox[2] - text_bbox[0]
        text_height = text_bbox[3] - text_bbox[1]

        text_x = x_min
        text_y = max(0, y_min - text_height - 2)

        draw.rectangle(
            [(text_x, text_y), (text_x + text_width, text_y + text_height)],
            fill="green",
        )

        draw.text((text_x, text_y), text, fill="white", font=font)

    # Рисуем предсказанные рамки синим цветом с указанием показателя уверенности
    for det in detections.detections:
        x_min, y_min, x_max, y_max = int(det.box.x1), int(det.box.y1), int(det.box.x2), int(det.box.y2)

        draw.rectangle(
            [(x_min, y_min), (x_max, y_max)],
            outline="red",
            width=2,
        )

        text = f"{det.confidence:.2f}"
        text_bbox = draw.textbbox((0, 0), text, font=font)
        text_width = text_bbox[2] - text_bbox[0]
        text_height = text_bbox[3] - text_bbox[1]

        text_x = x_min
        text_y = max(0, y_min - text_height - 2)

        draw.rectangle(
            [(text_x, text_y), (text_x + text_width, text_y + text_height)],
            fill="red",
        )

        # Draw text
        draw.text((text_x, text_y), text, fill="white", font=font)

    return image


# Создаем сравнительную визуализацию
comparison_image = visualize_comparison(np.array(detect_image), ground_truth_boxes, result)

# Отображаем сравнение
plt.figure(figsize=(12, 8))
plt.imshow(comparison_image)
plt.axis("off")
plt.title("Истинные данные vs Предсказанные\nЗеленый: Истинные данные\nКрасный: Результат модели")
plt.show()

Истинные данные vs Предсказанные Зеленый: Истинные данные Красный: Результат модели

Out:

C:/Users/lenova/CascadeProjects/culicidaelab/docs/ru/examples/tutorial_part_2_mosquito_detection.py:269: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  plt.show()

Total running time of the script: ( 0 minutes 21.560 seconds)

Download Python source code: tutorial_part_2_mosquito_detection.py

Download Jupyter notebook: tutorial_part_2_mosquito_detection.ipynb

Gallery generated by mkdocs-gallery