Comments 18
Спасибо за статью. Было интересно! Сам недавно столкнулся с этим, простая загрузка аватарки в браузере — давала странные результаты в виде развернутых изображений и так простая загрузка аватарки — превратилась в не очень простую — с разбором EXIF.
Дальше было веселее — третья программа после того, как повернули фото в PhotoShop показывало фото развёрнутым неправильно…
К величайшему сожалению сейчас не могу вспомнить названий программ и, самое главное, их версий, возможно одной из программ была ACDSee 2.41 или 5+, а одной встроенный просмотрщик WindowsXP, а возможно что-то из известных на тот момент мелких бесплатных, но за давностью лет просто не могу вспомнить.
Через примерно год я узнал что такое EXIF, но воспроизводить проблему что бы узнать кто точный «виновник» было сначала некогда, а потом забылось.
А питонообертка над dlib точно «своя библиотека»?
Это несложно сделать даже с околонулевым знанием ML (проверял), примерно так:
- Взять свои уже отсортированные фото, сложить в одну директорию, написать простенький скрипт, который сгенерирует из них пережатые (скорее всего 224х224) и повернутые на соответствующий угол фото, раскиданные по директориям "0", "90", "180" и "270".
- Взять NVIDIA DIGITS или аналог, одной кнопкой загрузить в него этот датасет, другой кнопкой выбрать модель и поставить на обучение. Подождать N часов.
- Получить готовую модель, написать второй скрипт, который вызывает её для каждого изображения из директории на входе и создает её копию с перевернутыми изображениями (например, записав поворот в тот же EXIF). Можно повесить вызов на контекстное меню проводника.
А вот тут статья с более продвинутым вариантом.
Не надо в проде использовать PIL, matplotlib и прочий бажный набор библиотек. Давным давно есть OpenCV, с которым всё интегрировано и который решает 90% проблем. И EXIF, и стриминг видео, и сохранение, и поддержку десятков форматов, и.т.д., и.т.п.
По сути это стандарт последние 10 лет. В отличие от того же matplotlib он быстрый, стартанёт на любом устройстве и не тащит кучу зависимостей.
Это был сарказм, да?
То есть для простейших манипуляций с изображениями, вы предлагаете тащить комбаин OpenCV, который как бы несколько для другого предназначен?
Конечно, если вы на калькуляторе обрабатываете — то лучше всё самому написать. А если уже на RPi — то памяти вам хватит, а по процессору OpenCV — это весьма неплохой вариант. Сколько в нём ковырялся — ни разу не видел именно «убогих» реализаций, в отличие от тех же dlib | PIL | PCL | AForge, которые я тоже мало-мало ковырял.
Для проверки: берёте любую фотку Луны или Марса и переворачиваете на 180 градусов. Если на фотке были кратеры — они превратятся в такие «бляшкообразные» горы. И наоборот…
И да — мы же с этим как-то живём…
Не думаю, что это проблема технологии. Просто не предусмотрено использование алгоритмов с входными данными в разной ориентации. Уверен, что допилить это при желании не составит труда.
А ничего не бывает бесплатно: можно легко для обучения добавлять в датасет те же картинки, повернутые на стандартные углы или даже на произвольные. Но каждый угол это дополнительное время обучения. Хотите стандартные углы? Обучайте в 4 раза дольше. Хотите произвольные углы? Обучайте в х раз дольше, где х — количество поворотов. Готовы к десятикратному увеличению продолжительности обучения для поддержки углов, в то время как ваши конкуренты прекрасно идут в прод без этого?
Ну, и плюс ориентация — это важный фактор в детекции объектов. Сверху красное, снизу зелёное? Добавляем вероятность к объекту "цветок". Сверху зелёное, снизу красное? Нож с зелёной рукояткой, воткнутый в человека. Убираете ориентацию — теряете точность распознавания, приходится увеличивать датасет или придумывать хитрости для обхода.
1) Не меняются красный и синий каналы, там где это надо (swapRB=True и т.д.). Сетка работает почти также, но если начать сравнивать две программы — достоверности чутка отличаются. Машина с синими фарам внезапно опознаётся хуже, чем с красными и т.п.
2) Из изображения вырезается вся значащая инфа. Вот на той неделе выловил, что COCO_train2014_000000105396.jpg обрезался до квадрата, который получался 100% белый и обучение иногда ломало нейросеть, создавая NaN-ы вместо некоторых весов.
Глупая причина, по которой не работает ваше хитрое приложение машинного зрения: ориентация в EXIF