AI Detection of Fish Diseases from Video and Photos
An ichthyopathologist can inspect 200–500 fish per day. Our CV-based fish disease detection system processes 10,000+ individuals per hour and logs every detected sign tied to a fish ID. We build such turnkey systems for fish farms in aquaculture. Our stack: YOLOv8, EfficientNet, PyTorch. Over 5 years, we have deployed solutions for 12 fish species, including Atlantic salmon, trout, and tilapia. Average customer savings amount to 2.5 million RUB per year due to reduced mortality.
Why a CV System Outperforms an Ichthyopathologist
Humans get tired and miss up to 30% of sick fish under heavy workload. A CV model works 24/7 without loss of concentration. Moreover, the system records exact coordinates of each defect, allowing health dynamics tracking. We confirm this in practice: after deploying our system, clients reduce mortality by 15–20% through early outbreak detection.
Diseases and Their Visual Signs
Each disease has specific visual markers:
| Disease | Visual Signs | Detectability |
|---|---|---|
| Saprolegnia | White/gray cotton-like growths | High |
| Furunculosis | Ulcers, swellings under scales | Medium |
| Chloropix | White spots on fins and body | High |
| VHS (Viral Hemorrhagic Septicemia) | Petechiae, exophthalmia, pale gills | Medium |
| Gill Rot | Whitening of gill filaments | Requires close-up |
| SRS (Piscirickettsia) | Dark spots, lethargy | Low (only behavior) |
Detector Architecture
Two-stage pipeline:
Stage 1: Fish detection — YOLOv8-seg isolates each individual in the frame. This is necessary to separate overlapping fish and normalize crops before classification.
Stage 2: Pathology classification — a multi-label classifier runs on each fish crop. Multi-label is important: a single fish may have both ulcers and exophthalmia.
from ultralytics import YOLO
import torch
from torchvision import models, transforms
# Fish detector
fish_detector = YOLO('fish_detector_yolov8m.pt')
# Pathology classifier (multi-label)
disease_classifier = models.efficientnet_b3(pretrained=False)
disease_classifier.classifier[1] = torch.nn.Linear(
disease_classifier.classifier[1].in_features,
num_diseases # e.g., 12 disease classes
)
def analyze_fish(frame):
# Fish detection
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])]
# Pathology classification
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
How to Calibrate the Model for a Specific Fish Species?
Each species has its own normal pigmentation and anatomy. Atlantic salmon, trout, tilapia — different baselines. We use fine-tuning or separate classifier heads for each species. Fish size also matters: fry (5–10 g) and market-size fish (2–5 kg) require different perspectives and detail resolutions. We add size normalization via estimated body length.
Gills: A Separate Challenge
Gill pathologies are not visible externally without special inspection. For primary processing lines: automated capture of the gill cover image in open position + a specialized classifier. Gill condition classification by color and texture: healthy (dark red, firm) / pale (anemia, possibly oxygen deprivation) / whitened (bacterial gill disease) / brown (methemoglobinemia from nitrites). CNN on gill crops: accuracy 0.88 across four classes.
Comparison of Manual Inspection and CV System
| Characteristic | Ichthyopathologist | CV System |
|---|---|---|
| Throughput | 200–500 pcs/day | 10,000+ pcs/hour |
| 24/7 operation | No | Yes |
| Documentation | Manual records | Automatic log with ID |
| Fatigue | High | None |
| Accuracy under high load | Drops to 70% | Stable >95% |
Implementation Process
- Production analysis: study the conveyor, lighting, fish species (1–2 weeks).
- Data collection: record video from customer cameras, annotate with ichthyopathologist (2–4 weeks).
- Model development: train detector and classifier on your data (3–6 weeks).
- Integration: install software on server, connect to SCADA (1–2 weeks).
- Testing: validation run on 10,000+ individuals, threshold tuning (1–2 weeks).
- Staff training: 2–3 days on site, documentation.
Additional Information
Experience: over 50 deployments in fish farms across Russia and CIS, 5+ years in AI for aquaculture.What’s Included
- Ready-to-use detection and classification model (Docker image).
- API for integration (REST/gRPC).
- Web interface for viewing results and exporting reports.
- Operation and calibration documentation.
- Model warranty — 6 months of free updates when the species mix changes.
We assess your project in 2 days. Contact us for a preliminary analysis — send us video from your conveyor, and we will return a prototype detection result.
Timelines
Basic detection system (video stream, 5–8 diseases): 8–12 weeks. Extended module with gill analysis and multiple fish species: 14–20 weeks. Cost is calculated individually.
Investment in the system pays off in 6–12 months.







