Про устаревание в ComputerVision

Мне часто пишут с вопросами. Больше всего вопросов приходит с Хабра. И, наверное, четверть вопросов – по моим статьям.

Половина – про старые статьи. Каждый месяц кто-то спрашивает как обучить каскад Хаара. Например как сделать не на версии OpenCV 7-летней давности, а на текущей.
И… Мне страшно. Страшно не то, что я не помню как 7 лет назад это делал. И не потому что эти алгоритмы могли давным давно выпилить из OpenCV.

Страшно потому что это порочный ход мысли, который почти невозможно остановить!
Хочется прокричать: вообще не читайте статьи где возраст больше 2-3 лет! И набор причин банален до нельзя:
1) Скорее всего есть алгоритмы лучше. Зачем каскад Хаара, когда за ту же производительность можно запустить простую нейронку?!
2) Зачем использовать OpenSource 10 или 15 летней давности?! В OS новом скорее всего меньше багов
Только вот эта аргументация плохо работает – и много людей продолжают делать детекцию если не на Хааре, то хотя бы на Dlib’е…

За пару лет меняются не только алгоритмы. Создаются новые концепты использования технологий. Года три назад казалось что Яндекс.Толока – новая штука. А теперь понятно что правильная система это когда есть инфрастурктурная поддержка обученных моделей как в каком-нибудь https://supervise.ly/ . При этом когда мы года 3 назад ходили с теми же идеями по рынку – нам все объясняли что это не надо (вот какая-то статья тех времён когда мы сами уже всё запилили).
Пару лет назад были единицы людей у которых находили отклик мои идеи описанные тут. А теперь это скорее стандарт области (хотя, конечно, в медицине 2/3 людей думают не так всё ещё).

Как понять, устарела ли статья? Ведь есть и обратные примеры. Не смотря на то что уже появилось yoloV4-tiny – я до сих пор могу придумать ситуации когда проще/удобнее использовать SSD-Mobilnet. А это старая штука.

Мне кажется что нужно руководствоваться несколькими принципами. Для нейронных сетей:

  1. Если вы не разбираетесь в теме которую распознаёте: выберете самые последние исходники, которые отличаются следующими свойствами:
    1. Протестированы на каком-нибудь современном датасете, желательно в сравнении с другими статьями. Это просто смотреть например на http://paperswithcode.com/ . Не сильно отступают от лидера (не было большого скачка после их выпуска).
    2. Имеют приложенный код обучения, запуск которого выдаёт результат соответствующий бэнчмарку.
    3. Имеют порты на те системы где вы хотите их использовать. Например если это процессор – то должно портироваться на OpenCV|OpenVino|TensorRT или какой-нибудь TensorFlow lite.
  2. Если вы разбираетесь в теме которую распознаёте. Каждый новый проект стоит делать некоторый SanityCheck:
    1. Спросить себя “А что появилось нового с прошлого раза как я использовал такую-то нейронку”. Без этого вопроса вы рискуете остаться на том же “каскаде Хаара” с мыслями “да вроде как-то похоже работает”.
    2. Спросить себя “А насколько мне будет дольше применить новую нейронку, и насколько это замедлит проект”. И если затраты минимальны – то применить. К сожалению практически сравнить нейронки возможно только в реальной эсплуатации. Слишком часто я видел ситуации что метрики нерепрезентативны. Единственное мерило – опыт использования. И чем его больше – тем ценнее ваши решения.

Для общей логики и идеологии систем ситуация сложнее. Я бы просто рекомендовал регулярно читать статьи о том как делаются новые системы. И стараться понимаю что и почему изменили.
Это даёт неплохой кругозор. Не факт что надо пользоваться всеми новыми веяниями. Но если кто-то применил подход X – то это повод задуматься о том, нужно ли в следующем проекте применить накатанный подход Y, или идти попробовать X.

Например когда-то в далёких 2010 всё делалось нативно. Потом мы долго использовали (года до 2017) самописные RestApi сервера. Потом перешли на Flask. Сейчас периодически используем TensorRT inference server. И такое обилие технологий позволяет в любой момент выбрать более оптимальную для каждого проекта. Будь то нативная библиотека, Flask или что-то ещё.

Наверное правило общее будет: “За модой не гнаться, но быть в курсе всех новых подходов”. Это позволит вовремя отказываться от старых статей.

З.Ю.

В последнее время свои статьи я публикую на очень разных платформах.
И, так получилось, что единое место куда я их свожу тут – https://vk.com/cvml_team (дублирую в https://t.me/CVML_team )
Тот проект в рамках которого всё это сбадяжил – буду на Хабре публиковать скорее всего. Так что ссылка тоже только там будет.

Так что советую подписаться!