
Вступление
В этой статье мы рассмотрим некоторые методы ухудшения наших данных, чтобы они были репрезентативными для изображений во время производства. Вы можете найти блокнот для этой статьи здесь и репозиторий GitHub здесь.
Без лишних слов, приступим к кодированию!
Деградация
Найти данные для конкретной задачи непросто: мы должны не только получить много входных данных, но и разработать тщательно продуманные метки для обучения модели. Например, сегментация изображения требует утомительного изучения каждого пикселя изображения и определения того, какому объекту они принадлежат. Самостоятельное обучение, безусловно, может повысить производительность, но не полностью устраняет необходимость в маркированных данных.
К счастью, у нас есть доступ к сотням тысяч ярлыков (т. Е. Высококачественных изображений) , и нам нужно каким-то образом придумать соответствующий ввод ( т.е. картинка некачественная) для каждого. Другими словами, нужно активно бороться за размытые, зашумленные картинки, которые являются преступлением против глаз.
Изменение размера
Возможно, самое важное преобразование, которое мы увидим, - изменение размера изображения - отличный (или ужасный?) Способ снизить его качество, особенно с помощью определенных методов понижающей дискретизации.
Начнем с изображения 256 X 256 от COCO (это будет этикетка нашей модели):

Как видите, это отнюдь не фотография превосходного качества, и небольшое увеличение делает трех кошек размытыми, не говоря уже о небольших артефактах JPEG. Меня это возмутило, потому что в конце концов, по определению, модель приближается к данным, которые ей даются, поэтому она может быть ровно настолько хорошей, насколько они хороши, то есть здесь не так уж много. Я подумал о других наборах данных, таких как DIV2K, коллекция фотографий с высоким разрешением, сделанных для сверхвысокого разрешения, на первый взгляд очевидное соответствие, но, к сожалению, в нашем случае разнообразие обязательно, потому что мы хотим, чтобы наше приложение улучшало все виды изображений. и не только узкое подмножество, такое как селфи, и 300 000 изображений в COCO затмевают 1000 в DIV2K, когда дело доходит до разнообразия (несколько быстрых экспериментов еще раз подтвердили это). Количество берет это.
Изменение размера с различными настройками дает (вывод слишком велик, посмотрите записную книжку Colab):
Несмотря на небольшой размер, изображение 112 X 112, уменьшенное на Image.NEAREST, выглядит ужасно. Кошки пиксельные, и все кажется слишком резким. Image.BILINEAR, похоже, имел эффект размытия, в результате чего изображение стало менее детализированным (например, полосы кошек). Image.BICUBIC и Image.LANCZOS оба находятся на более выгодной стороне, и только увеличив масштаб, можно заметить их недостатки. То же самое можно сказать и о 144 X 144 и 176 X 176, но все, что больше, будет очень близко к 256 X 256, то есть практически не будет видимых следов изменения размера.
Круто, правда? Не совсем. Проблема, возникающая при использовании этого метода, заключается в том, что наша модель не может изменить форму данных, которые она дает (входные и выходные данные имеют одинаковые размеры), поэтому мы должны масштабировать изображения обратно до 256 X 256, что на самом деле полезно. потому что это еще больше ухудшает их (позже мы увидим, почему мы используем Image.LANCZOS для масштабирования):
Изображения, уменьшенные на Image.BILINEAR, Image.BICUBIC и Image.LANCZOS, похожи, но мы собираемся придерживаться Image.BILINEAR только потому, что он быстрее и создает немного худшие фотографии. Изображения, размер которых изменен с помощью Image.NEAREST, представляют собой другой тип плохого, обеспечивая больше разнообразия для модели.
У нас есть первый метод деградации: уменьшить изображение с помощью Image.NEAREST или Image.BILINEAR и вернуть его к исходным размерам с помощью Image.LANCZOS. Результат был бы очень плохим.
Размытие
Вышеупомянутый метод также действует как слабый эффект размытия, но есть фильтры, предназначенные для размытия:
Радиус в один не кажется таким уж плохим, но имейте в виду, что будут работать и другие методы деградации, поэтому, если каждый из них сделает фотографию немного хуже, вместе они сделают ее намного хуже. Два довольно размыты, но их использование время от времени может улучшить производительность модели и сделать ее более разнообразной.
ImageFilter.GaussianBlur хуже, но по тем же причинам мы будем использовать оба метода.
К следующему…
Цвет, контраст и яркость
До сих пор мы не рассматривали возможность прямой настройки цвета изображения. Например, мы могли бы сделать все черно-белым, менее ярким и красочным и т. Д., И PIL, к счастью, предлагает методы для этого:
Любой коэффициент ниже 0,7 - это слишком много, а коэффициент, равный единице, вообще ничего не делает, поэтому оптимальным вариантом будет значение от 0,7 до 0,9 (редко, если вообще когда-либо, изображение слишком красочным, поэтому нет причин для выйти за пределы одного).
Но. Фото-библиотеки на сотовых телефонах обладают именно этими функциями (разумеется, кодирование не требуется), поэтому нет смысла создавать модель машинного обучения, которая делает это за нас. Пройдите по этому.
Артефакты JPEG
Обычный тип шума, который присутствует в бесчисленном количестве цифровых изображений, - это артефакты из-за сжатия. Учитывая, что он вообще не используется, в PIL нет метода для добавления артефактов JPEG, поэтому нам нужно сделать это по старинке, сохранив изображение с сильным сжатием:
Качество 10 выводит чрезвычайно зашумленные и нечеткие изображения с небольшими или отсутствующими мелкозернистыми деталями, 30 - нормально, но шум все еще присутствует, 70 - может быть немного размытым, а 95 - довольно хорошо. Еще один метод деградации.
Degrader
Теперь мы можем исправить эти преобразования вместе, чтобы получить один большой деградатор (вероятности, методы и т. Д. Были найдены путем обширных экспериментов):
Ничего особенного не происходит: __init__ просматривает все экземпляры класса и сохраняет те, которые заканчиваются на _degrader, которые применяются с вероятностью p при вызове.
Где размытие? Что ж, я протестировал множество комбинаций различных эффектов размытия, методов изменения размера и так далее, и каждый раз, когда применялось размытие (даже с вероятностью всего 10% и радиусом единицы), происходило что-то озадачивающее: модель значительно улучшит супер дрянную картинку, но ухудшит средние (подумайте, изображение сохранено с качеством 10 и 50 соответственно). И наоборот, без размытия модель ничего не могла сделать с ужасными изображениями, но могла улучшить умеренно некачественные изображения до такой степени, что их нельзя было бы отличить от фотографий с высоким разрешением.
Мы попали в затруднительное положение: ищем ли мы модель, которая может улучшить действительно плохие фотографии, но непригодна для чего-то лучшего, или наоборот? Чтобы ответить на этот вопрос, мы должны сделать шаг назад и подумать о конечном продукте: будут ли модели получать «мега» -фотографии, требующие лишь небольшой ретуши, или фотографии, снятые на дешевом iPhone 4, подделанном на фотокамеру. шестилетний?
Нет правильных или неправильных ответов, но мое объяснение таково: мы живем в 2021 году, и даже самые худшие из телефонов лучше, чем те, что были недавно созданы по последнему слову техники. Следовательно, будет сложно получить действительно некачественные фотографии, и у приложения, которое может улучшить неплохие, но не очень хорошие фотографии, будет больше вариантов использования.
Чтобы убедиться, что все правильно, давайте посмотрим на это и посмотрим на разные результаты:
Ужасный! Некоторые из них действительно, очень плохие, а другие все еще очень плохие! Однако будьте осторожны, потому что, если исходные данные будут слишком нечеткими, проблема будет слишком сложной для модели, и она откажется и вообще не научится.
Наши данные готовы, и теперь мы можем перейти к построению модели.
Заключение
В этой статье мы рассмотрели некоторые методы (изменение размера, размытие, регулировка цвета и артефакты), чтобы ухудшить качество изображений из COCO для создания изображений низкого качества, которые максимально похожи на реальные зашумленные изображения, на которые люди могут загружать. наш сайт.
В следующей статье мы обсудим нашу функцию потерь, как правильно выбрать ее гиперпараметры и почему она подходит для нашей задачи.
Пожалуйста, если у вас есть какие-либо вопросы или отзывы, не стесняйтесь размещать их в комментариях ниже и, как всегда, благодарим вас за чтение!
Похожие статьи:
Социальные сети:
Больше контента на plainenglish.io