ИИ-детекция болезней рыб по видео и фото
Ихтиопатолог, осматривающий партию рыбы, может за день проверить 200–500 особей. CV-система, обрабатывающая видеопоток с конвейера, проверяет 10 000+ штук в час и фиксирует каждый выявленный признак с привязкой к ID особи.
Болезни и их визуальные признаки
Каждое заболевание имеет специфические визуальные маркеры:
| Болезнь | Визуальные признаки | Детектируемость |
|---|---|---|
| Лох (Saprolegnia) | Белые/серые ватообразные наросты | Высокая |
| Фурункулёз | Язвы, опухоли под чешуёй | Средняя |
| Хлоропикс | Белые точки на плавниках и теле | Высокая |
| VHS (геморрагическая септицемия) | Петехии, пучеглазие, бледные жабры | Средняя |
| Жаберная гниль | Побеление жаберных лепестков | Требует крупного плана |
| SRS (Piscirickettsia) | Тёмные пятна, апатия | Низкая (только поведение) |
Architecture детектора
Двухэтапная схема:
Этап 1: Детекция отдельной рыбы — YOLOv8-seg выделяет каждую особь в кадре. Это необходимо для разделения перекрывающихся рыб и нормализации кропов перед классификацией.
Этап 2: Классификация патологий — на кропе отдельной рыбы работает multi-label классификатор. Multi-label важен: у одной особи могут быть одновременно язвы и экзофтальм.
from ultralytics import YOLO
import torch
from torchvision import models, transforms
# Детектор рыб
fish_detector = YOLO('fish_detector_yolov8m.pt')
# Классификатор патологий (multi-label)
disease_classifier = models.efficientnet_b3(pretrained=False)
disease_classifier.classifier[1] = torch.nn.Linear(
disease_classifier.classifier[1].in_features,
num_diseases # например 12 классов болезней
)
def analyze_fish(frame):
# Детекция рыб
detections = fish_detector(frame, conf=0.5)[0]
results = []
for box in detections.boxes:
crop = frame[int(box.xyxy[0,1]):int(box.xyxy[0,3]),
int(box.xyxy[0,0]):int(box.xyxy[0,2])]
# Классификация патологий
tensor = preprocess(crop).unsqueeze(0).cuda()
with torch.no_grad():
logits = disease_classifier(tensor)
diseases = torch.sigmoid(logits) > 0.5 # multi-label
results.append({'box': box.xyxy[0], 'diseases': diseases})
return results
Жабры: отдельная задача
Жаберные патологии не видны снаружи без специального осмотра. Для конвейерных линий первичной обработки: автоматизированный захват изображения жаберной крышки в открытом положении + специализированный классификатор.
Классификация состояния жабр по цвету и текстуре: здоровые (тёмно-красные, упругие) / бледные (анемия, возможно кислородное голодание) / побелевшие (бактериальная жаберная болезнь) / коричневые (метгемоглобинемия от нитритов). CNN на кропах жабр: accuracy 0.88 на 4 классах.
Калибровка под вид и размер рыбы
Каждый вид имеет свою нормальную пигментацию и анатомию. Лосось-атлантик, форель, тилапия — разные baseline. Fine-tuning или отдельные головы классификатора для каждого вида.
Размер рыбы тоже важен: малек 5–10г и товарная рыба 2–5кг — разные ракурсы и разрешение деталей на снимке. Добавляем нормализацию по размеру через estimated body length.
Сроки
Базовая система детекции (видеопоток, 5–8 болезней): 8–12 недель. Расширенный модуль с жаберным анализом и несколькими видами рыб: 14–20 недель. Стоимость рассчитывается индивидуально.







