В 2021 году один металлургический завод купил коробочную видеоаналитику за два миллиона, чтобы считать брак на ленте. Через месяц коробку выдернули из розетки: блики от утреннего солнца через окно цеха генерировали 40% ложных срабатываний, а попытка интеграции с ERP-системой валила базу мёртвыми блокировками. Запомните: компьютерное зрение без привязки к оптике, освещению и железу клиента — это академическая игрушка.
Когда бизнес планирует заказать разработку компьютерного зрения под ключ: что входит в проект, сроки и из чего складывается цена от 500 000 ₽ — это точный список метрик, за которые ИТ-директор ответит перед производством. Вы либо внедряете инструмент, который снижает процент брака и окупает себя, либо покупаете черный ящик, который зависает при смене освещения.
Что на самом деле скрывается за термином «под ключ»
Рынок привык считать, что разработка CV — это обучение нейросети. Вам показывают красивые графики loss-функции, отдают файл с расширением .pt или .onnx и желают удачи. Это не проект «под ключ». Это полуфабрикат. Настоящий production-ready пайплайн состоит из инженерии на 80% и машинного обучения на 20%.
Во-первых, всё начинается с оптики и данных. Мы не качаем датасеты из интернета. Камера ставится на вашу линию, и мы собираем сырой поток минимум неделю. Ночная смена, дневная смена, искусственный свет, пыль на объективе, дрожание станка. Только на таких данных можно обучить модель, которая не ослепнет в первый же месяц.
Во-вторых, инференс (вывод модели). Вы не будете гонять 4K-поток в облако — это убьёт любой канал, а пинг сделает систему непригодной для реалтайм-отбраковки. Модель должна работать локально, на edge-устройствах (промышленные ПК, Nvidia Jetson) прямо у конвейера. Наш подход в Morana Labs прямолинеен: рынок продаёт веса моделей, а мы продаём управляющий сигнал. Нейросеть должна не просто обвести дефект в рамочку, а послать Modbus-сигнал на ПЛК (программируемый логический контроллер), чтобы механическая лапа сбросила бракованную деталь с ленты.
Почему инференс ложится на бою? Классическая ошибка — синхронное чтение RTSP-потока. Если инференс кадра занимает 40 мс, а камера шлёт кадры каждые 33 мс, стандартный cv2.VideoCapture начнет копить буфер. Через минуту задержка составит секунды, и вы отбракуете деталь, которая уже уехала в цех упаковки.
Для edge-вычислений мы пишем асинхронные ридеры, которые всегда отдают только самый свежий кадр, безжалостно дропая старые:
import cv2
import threading
import time
class EdgeStreamReader:
def __init__(self, rtsp_url):
self.cap = cv2.VideoCapture(rtsp_url)
# Жестко ограничиваем буфер на уровне GStreamer/FFmpeg
self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
self.ret = False
self.frame = None
self.running = True
# Фоновый поток вычитывает кадры со скоростью камеры
self.thread = threading.Thread(target=self._update, args=())
self.thread.daemon = True
self.thread.start()
def _update(self):
while self.running:
if self.cap.isOpened():
self.ret, self.frame = self.cap.read()
else:
time.sleep(0.01) # Ждем переподключения
def read_freshest(self):
# Инференс получает кадр без задержки очереди
return self.ret, self.frameСроки: почему пилот за месяц — это нормально, а прод — нет
Реалистичный таймлайн внедрения делится на две фазы, которые нельзя смешивать.
Пилот длится от 4 до 8 недель. За это время выбирается одна критическая точка контроля (например, проверка наличия маркировки или поиск трещин на сварном шве). Ставится одна камера, собирается первичный датасет, обучается базовая модель. Цель пилота — доказать бизнесу, что дефект физически виден на камеру и детектируется с точностью выше случайного угадывания. Это дешёвая проверка гипотезы.
Полноценный production занимает от 3 до 6 месяцев. Здесь начинается суровая реальность: масштабирование на 20 камер, борьба с краевыми эффектами, настройка балансировщика нагрузки. Появляются задачи интеграции: как связать логику детекции с вашим СКУД или написать плагин для VMS (Milestone, Trassir), чтобы охрана получала алерты в привычном интерфейсе. Каждая интеграция с легаси-системами завода — это время.
Из чего складывается чек и почему кастом бьёт коробку
Бюджет от 500 000 ₽ закрывает крепкий пилот или запуск простой производственной линии: бинарная классификация (норма/брак), понятные условия освещения, базовая интеграция. Зачем платить эти деньги, если есть коробочные решения в два раза дешевле?
Коробка не знает особенностей вашего продукта. Универсальная модель детекции касок не понимает, что на вашем заводе каска может быть скрыта под специфическим защитным щитком. Универсальный контролёр качества пропускает микроцарапины на алюминии, потому что обучался на стали. Кастом стоит дороже на входе, но коробка будет генерировать вам 25% ложных пропусков каждый день. Посчитайте стоимость возврата партии от заказчика, и вопросы к смете отпадут.
Что гонит цену вверх? Во-первых, количество классов. Различать 15 видов пороков древесины — это огромная работа дата-инженеров по разметке. Во-вторых, железо. Парк из промышленных Nvidia Jetson AGX Orin или один мощный сервер с карточками A5000 в серверной — это отдельная строка капитальных затрат. В-третьих, если вам нужна субмиллиметровая точность на скорости 30 деталей в секунду, придётся писать логику на C++ с использованием TensorRT, что сильно дороже разработки на Python.
Структура честного КП и чек-лист приёмки
В Morana Labs мы принципиально отказываемся от абстрактных метрик в договоре вроде «точность модели 95%». Это математический мусор. Модель, которая всегда говорит «брака нет», на конвейере с 1% брака будет иметь общую точность 99%, но её ценность равна нулю. КП должно быть привязано к бизнес-логике.
Как правильно принимать проект:
- Recall (полнота) > 98%. Модель должна находить максимум дефектов. Лучше ложно остановить ленту и перепроверить, чем отправить бракованный узел клиенту.
- Precision (точность) > 90%. Доля ложных срабатываний не должна вызывать у оператора желание заклеить экран изолентой.
- p99 latency < 50ms. Инференс не должен тормозить механику линии. Время реакции фиксируется на целевом железе при 100% нагрузке, а не на мощном ноутбуке разработчика.
- Сценарий деградации. Что делает система, если камера отключилась? Она должна отправить hardware-interrupt, а не тихо молчать.
Если подрядчик обещает вам распознавание дефектов «из коробки» без обследования цеха и отказывается фиксировать метрики полноты в договоре — прощайтесь. Вам пытаются продать код, а не работающий инструмент для производства.