Pull to refresh

Comments 18

Спасибо за статью. Было интересно! Сам недавно столкнулся с этим, простая загрузка аватарки в браузере — давала странные результаты в виде развернутых изображений и так простая загрузка аватарки — превратилась в не очень простую — с разбором EXIF.

Меня больше лет 7-8 назад ошарашило когда в одной программке делаешь при просмотре «поворот» фотографии (с обычного фотоаппарата, который был на штативе, те там EXIF «правильный») а фото остаётся «без изменений» потом если открыть в PhotoShop и развёрнутой если открыть в той же программе просмотра…
Дальше было веселее — третья программа после того, как повернули фото в PhotoShop показывало фото развёрнутым неправильно…

К величайшему сожалению сейчас не могу вспомнить названий программ и, самое главное, их версий, возможно одной из программ была ACDSee 2.41 или 5+, а одной встроенный просмотрщик WindowsXP, а возможно что-то из известных на тот момент мелких бесплатных, но за давностью лет просто не могу вспомнить.
Через примерно год я узнал что такое EXIF, но воспроизводить проблему что бы узнать кто точный «виновник» было сначала некогда, а потом забылось.
А если EXIF данных нет (как, например у этой модели)? Или ещё хуже, они неверные?

Нужна сетка для распознавания ориентации фотографии. Есть такие? У меня целый склад фоток без EXIF.
Да просто нужно навернуть аугментации D4-группы (повороты на 90 градусов).

Повороты — это C4. D4 — это ещё и отражения. Что тоже иногда может быть полезно, впрочем.

>>>У меня также есть опенсорсная библиотека распознавания лиц на Python

А питонообертка над dlib точно «своя библиотека»?
Да, потому что создание удобного API это тоже работа. Также библиотеки для отправки почты тоже могут быть обёртками над sendmail, а какой нибудь pixijs — обёртка над WebGL.
Есть у меня старый фотик, у которого нет датчика поворота. При разборе фотографий это бесит до такой степени, что хочется забацать нейросеточку, которая будет по изображению искать где у него верх, где низ. Может, кстати, что готовое уже есть?

Это несложно сделать даже с околонулевым знанием ML (проверял), примерно так:


  1. Взять свои уже отсортированные фото, сложить в одну директорию, написать простенький скрипт, который сгенерирует из них пережатые (скорее всего 224х224) и повернутые на соответствующий угол фото, раскиданные по директориям "0", "90", "180" и "270".
  2. Взять NVIDIA DIGITS или аналог, одной кнопкой загрузить в него этот датасет, другой кнопкой выбрать модель и поставить на обучение. Подождать N часов.
  3. Получить готовую модель, написать второй скрипт, который вызывает её для каждого изображения из директории на входе и создает её копию с перевернутыми изображениями (например, записав поворот в тот же EXIF). Можно повесить вызов на контекстное меню проводника.

А вот тут статья с более продвинутым вариантом.

Вот они, ньюфаги… ;)

Не надо в проде использовать PIL, matplotlib и прочий бажный набор библиотек. Давным давно есть OpenCV, с которым всё интегрировано и который решает 90% проблем. И EXIF, и стриминг видео, и сохранение, и поддержку десятков форматов, и.т.д., и.т.п.
По сути это стандарт последние 10 лет. В отличие от того же matplotlib он быстрый, стартанёт на любом устройстве и не тащит кучу зависимостей.

Это был сарказм, да?
То есть для простейших манипуляций с изображениями, вы предлагаете тащить комбаин OpenCV, который как бы несколько для другого предназначен?

Это работающий комбайн. Который можно тащить. В отличии от PIL | matplotlib | dlib и прочего. Который скорее всего и так понадобиться для захвата потока с камеры/для загрузки/сохранений/для инференса нейронок если это какие-то неспециализированные устройства.
Конечно, если вы на калькуляторе обрабатываете — то лучше всё самому написать. А если уже на RPi — то памяти вам хватит, а по процессору OpenCV — это весьма неплохой вариант. Сколько в нём ковырялся — ни разу не видел именно «убогих» реализаций, в отличие от тех же dlib | PIL | PCL | AForge, которые я тоже мало-мало ковырял.
Я думаю, что это, прежде всего, проблема самой технологии нейросети (или процесса ее обучения), что она может внезапно не распознать объект при минимальных изменениях, иногда даже не связанных с самим объектом, а следовательно — ненадежка и потенциально уязвима.
Есть такое. Но как показали практические испытания в течении нескольких миллионов (миллиардов?) лет — лучше такая, чем никакой.

Для проверки: берёте любую фотку Луны или Марса и переворачиваете на 180 градусов. Если на фотке были кратеры — они превратятся в такие «бляшкообразные» горы. И наоборот…

И да — мы же с этим как-то живём…

Не думаю, что это проблема технологии. Просто не предусмотрено использование алгоритмов с входными данными в разной ориентации. Уверен, что допилить это при желании не составит труда.

А ничего не бывает бесплатно: можно легко для обучения добавлять в датасет те же картинки, повернутые на стандартные углы или даже на произвольные. Но каждый угол это дополнительное время обучения. Хотите стандартные углы? Обучайте в 4 раза дольше. Хотите произвольные углы? Обучайте в х раз дольше, где х — количество поворотов. Готовы к десятикратному увеличению продолжительности обучения для поддержки углов, в то время как ваши конкуренты прекрасно идут в прод без этого?


Ну, и плюс ориентация — это важный фактор в детекции объектов. Сверху красное, снизу зелёное? Добавляем вероятность к объекту "цветок". Сверху зелёное, снизу красное? Нож с зелёной рукояткой, воткнутый в человека. Убираете ориентацию — теряете точность распознавания, приходится увеличивать датасет или придумывать хитрости для обхода.

Я думаю можно добавить перед основной нейросетью ещё одну, которая будет исправлять угол поворота
Ещё из свежих причин:
1) Не меняются красный и синий каналы, там где это надо (swapRB=True и т.д.). Сетка работает почти также, но если начать сравнивать две программы — достоверности чутка отличаются. Машина с синими фарам внезапно опознаётся хуже, чем с красными и т.п.
2) Из изображения вырезается вся значащая инфа. Вот на той неделе выловил, что COCO_train2014_000000105396.jpg обрезался до квадрата, который получался 100% белый и обучение иногда ломало нейросеть, создавая NaN-ы вместо некоторых весов.
Sign up to leave a comment.

Articles