Когда на линию по переработке орехов пришла партия с новым, незнакомым дефектом — потемнением внутренней полости, которое не проявлялось на поверхности — штатный фотосепаратор пропустил 12% брака. Стандартные алгоритмы, обученные на типовых трещинах и пятнах, оказались бессильны. Перепрограммирование оборудования силами вендора стоило бы двухнедельного простоя и нескольких сотен тысяч рублей. Решение нашлось в transfer learning — дообучении нейросети сепаратора на собственных фотографиях дефектов, что заняло всего два дня и обошлось в стоимость аренды GPU-сервера. В этой статье я подробно разберу, как обучить фотосепаратор на собственных дефектах, используя transfer learning, и какие подводные камни ждут технолога на этом пути.
Почему стандартные библиотеки дефектов не работают в вашем производстве
Любой современный фотосепаратор поставляется с предустановленной нейросетью, обученной на миллионах изображений. Производитель собирал датасет на своих стендах: идеально освещенные зёрна пшеницы, риса, кукурузы, орехов с типовыми дефектами — битыми, гнилыми, заплесневелыми. Но ваше сырьё уникально. Сорт, регион произрастания, условия сушки, тип уборки — всё это создаёт дефекты, которых нет в обучающей выборке вендора.
Например, на одной из линий по переработке гречихи мы столкнулись с дефектом «зелёный бок» — недозревшее зерно, которое по цвету и текстуре было почти идентично нормальному, но давало горький привкус в крупе. Стандартная нейросеть сепаратора видела его как合格 (годное), потому что в её обучающей выборке такого дефекта не было. Transfer learning позволил добавить этот класс за несколько часов, собрав всего 300 изображений.
Что такое transfer learning для фотосепаратора и как это работает
Transfer learning (обучение с переносом) — это метод, при котором мы берём уже обученную нейросеть (например, ResNet-50 или EfficientNet, на которой работает ваш сепаратор) и «доучиваем» её на небольшом наборе ваших собственных данных. В контексте фотосепаратора это означает:
- Замораживание ранних слоёв — те, что отвечают за базовые признаки (границы, текстуры, цветовые переходы), остаются неизменными. Они универсальны для любых изображений.
- Замена и дообучение последних слоёв — классификатор, который решает «годное / дефектное», переобучается на ваших конкретных дефектах.
- Тонкая настройка (fine-tuning) — разморозка нескольких верхних слоёв и обучение на вашем датасете с очень маленькой скоростью (learning rate 1e-5), чтобы не «забыть» базовые признаки.
Это принципиально отличается от обучения с нуля. Для обучения с нуля на задачу классификации 10 типов дефектов потребовалось бы 50 000–100 000 размеченных изображений. Transfer learning позволяет получить промышленно приемлемое качество (точность > 98%) на 500–1000 изображениях вашего продукта.
Пошаговый процесс: от сбора данных до загрузки в сепаратор
Шаг 1. Сбор репрезентативного датасета дефектов
Это самый критичный этап. Нельзя просто сфотографировать 50 дефектных зёрен на телефон. Нужно обеспечить условия, максимально приближенные к работе сепаратора на линии:
- Освещение — используйте ту же светодиодную подсветку, что стоит в сепараторе (обычно 4–6 спектральных каналов: видимый, NIR, UV). Если нет доступа к промышленной камере — подойдёт безбликовый бокс с лампами дневного света 6500K.
- Фон — чёрный матовый, как в транспортном лотке сепаратора.
- Ракурс — строго сверху, под углом 90 градусов, как и стоит камера в сепараторе.
- Количество классов — минимум 3: «норма», «дефект тип А», «дефект тип Б». Не пытайтесь объединить все дефекты в один класс — нейросеть не сможет обобщить.
Для каждого класса соберите не менее 200 изображений. Если дефект редкий (например, поражение фузариозом встречается в 0.5% партии), используйте аугментацию: повороты на 90°, 180°, 270°, небольшое изменение яркости (±10%), лёгкое размытие (Gaussian blur с ядром 3×3). Это искусственно увеличит датасет до 800–1000 изображений на класс.
Шаг 2. Разметка и подготовка данных
Каждое изображение должно быть размечено. Формат зависит от API вашего сепаратора, но чаще всего используется:
- COCO JSON — для bounding box (если сепаратор не только классифицирует, но и локализует дефект).
- CSV с метками — для простой классификации (файл: имя_файла, класс).
Для разметки используйте бесплатные инструменты: LabelImg, CVAT или Supervisely (есть community edition). Важно: размечайте не всё зерно, а именно область дефекта. Если дефект занимает 10% площади зерна, bounding box должен быть именно вокруг этой области, а не вокруг всего зерна. Иначе нейросеть будет учиться на фоне здоровой части.
Шаг 3. Выбор фреймворка и обучение модели
Большинство современных фотосепараторов работают на базе PyTorch или TensorFlow. Если у вас нет доступа к SDK сепаратора, используйте стандартные библиотеки:
| Фреймворк | Предобученная модель | Когда использовать |
|---|---|---|
| PyTorch + torchvision | ResNet-50, EfficientNet-B3 | Если сепаратор на Linux, есть GPU (NVIDIA T4 или выше) |
| TensorFlow + Keras | MobileNetV2, InceptionV3 | Если сепаратор на Windows, ограниченные ресурсы |
| ONNX Runtime | Любая модель, экспортированная в ONNX | Для интеграции в промышленные контроллеры (PLC) |
Код обучения на PyTorch для transfer learning выглядит так (упрощённо):
model = torchvision.models.resnet50(pretrained=True)
# Замораживаем все слои
for param in model.parameters():
param.requires_grad = False
# Заменяем последний слой на наш классификатор (3 класса)
model.fc = nn.Linear(2048, 3)
# Обучаем только последний слой
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)
# После 10 эпох — разморозка и fine-tuning
for param in model.layer4.parameters():
param.requires_grad = True
optimizer = optim.Adam(model.parameters(), lr=0.00001)
Обучайте до тех пор, пока loss на валидационной выборке не перестанет уменьшаться. Обычно достаточно 20–30 эпох для transfer learning. Если точность на валидации ниже 95% — проблема в датасете (мало данных, плохое освещение, неправильная разметка).
Шаг 4. Конвертация и загрузка в сепаратор
Формат модели, который понимает сепаратор, зависит от производителя. Чаще всего это:
- TensorRT engine — для сепараторов на базе NVIDIA Jetson (Satake, Bühler, Tomra). Конвертация через trtexec.
- ONNX — универсальный формат, поддерживается большинством современных сепараторов.
- OpenVINO IR — для сепараторов на Intel-процессорах (Sesotec, Key Technology).
Конвертация обычно делается скриптом от производителя. Например, для TensorRT:
trtexec --onnx=model.onnx --saveEngine=model.engine --fp16
После загрузки модели в сепаратор обязательно проведите A/B-тест: прогоните одну и ту же партию с дефектами через старую и новую модель. Сравните процент пропуска брака и ложных срабатываний (когда годное зерно отбраковывается). Transfer learning не должен увеличивать ложные срабатывания более чем на 0.5%.
Типичные ошибки при transfer learning фотосепаратора
За годы внедрения я собрал список самых частых проблем, которые сводят на нет все усилия:
- Дисбаланс классов — если в датасете 1000 изображений «нормы» и 50 «дефекта», нейросеть научится всегда говорить «норма». Решение: взвешивание классов в функции потерь или oversampling редкого класса.
- Переобучение (overfitting) — модель отлично работает на ваших 200 фото, но на новой партии сырья даёт 30% ошибок. Решение: увеличить аугментацию, добавить dropout (0.3–0.5) в последние слои, уменьшить число эпох.
- Игнорирование спектральных каналов — если сепаратор использует NIR-камеру (ближний инфракрасный диапазон), а вы обучаете модель только на RGB-изображениях, модель не увидит дефекты, видимые только в NIR (например, внутренняя гниль). Решение: используйте мультиспектральные изображения для обучения.
- Забыли про калибровку камеры — камера в сепараторе имеет свои характеристики (баланс белого, гамма-коррекция). Если ваши фото сделаны на другую камеру, модель может не работать. Решение: снимите датасет прямо на сепараторе, используя его штатную камеру.
Как оценить, что transfer learning прошёл успешно
Недостаточно просто посмотреть на accuracy на тестовой выборке. Промышленные критерии:
- Точность (precision) на дефектном классе — не ниже 98%. Если модель говорит «дефект», это должен быть дефект в 98 случаях из 100.
- Полнота (recall) на дефектном классе — не ниже 95%. Модель должна пропускать не более 5% реальных дефектов.
- Стабильность на разных партиях — прогоните 5 разных партий сырья (разные поля, разные даты уборки). Разброс точности не должен превышать 2%.
- Скорость инференса — время обработки одного зерна не должно увеличиться более чем на 10% по сравнению со штатной моделью. Если сепаратор обрабатывает 10 тонн в час, задержка в 1 мс на зерно приведёт к потере производительности.
Заключение: transfer learning как стандарт, а не исключение
К 2026 году transfer learning перестал быть экспериментальной техникой. Это стандартный инструмент для любого технолога, работающего с оптической сортировкой. Сепаратор, который нельзя дообучить под ваш конкретный дефект, — это устаревшее оборудование. Современные модели позволяют за 2–3 дня адаптировать нейросеть под новый вид брака, экономя недели простоя и миллионы на возвратах. Главное — не пытаться объять необъятное: начните с одного дефекта, соберите качественный датасет, используйте предобученную модель и проверьте результат на реальной линии. Transfer learning — это не магия, а инженерная процедура, которая при правильном подходе даёт стабильный и предсказуемый результат.