Как подготовить / дополнить изображения для нейронной сети?

41

Я хотел бы использовать нейронную сеть для классификации изображений. Я начну с предварительно обученного CaffeNet и обучу его для моего приложения.

Как подготовить входные изображения?

В этом случае все изображения имеют один и тот же объект, но с вариациями (подумайте: контроль качества). Они находятся в несколько разных масштабах / разрешениях / расстояниях / условиях освещения (и во многих случаях я не знаю масштаб). Кроме того, на каждом изображении есть область (известная) вокруг интересующего объекта, которая должна игнорироваться сетью.

Я мог бы (например) обрезать центр каждого изображения, которое гарантированно содержит часть интересующего объекта и ни одну из игнорируемой области; но кажется, что это отбросило бы информацию, а также результаты не были бы действительно такого же масштаба (возможно, 1,5-кратное отклонение).

Увеличение набора данных

Я слышал о создании большего количества обучающих данных по случайным кадрам / зеркалам / и т.д., есть ли стандартный метод для этого? Есть ли какие-либо результаты в отношении того, насколько улучшается точность классификатора?

Алекс я
источник

Ответы:

35

Идея с нейронными сетями заключается в том, что им не требуется предварительная обработка, так как тяжелая работа выполняется с помощью алгоритма, который отвечает за изучение функций.

Победители Data Science Bowl 2015 получили отличную оценку своего подхода, поэтому большая часть содержания этого ответа была взята из: Классификация планктона с глубокими нейронными сетями . Я предлагаю вам прочитать его, особенно часть о предварительной обработке и дополнении данных .

- Изменить размер изображения

Что касается разных размеров, разрешений или расстояний, вы можете сделать следующее. Вы можете просто изменить масштаб самой большой стороны каждого изображения до фиксированной длины.

Другой вариант - использовать openCV или scipy. и это изменит размер изображения, чтобы иметь 100 столбцов (ширина) и 50 строк (высота):

resized_image = cv2.resize(image, (100, 50)) 

Еще один вариант - использовать модуль scipy, используя:

small = scipy.misc.imresize(image, 0.5)

- Увеличение данных

Увеличение данных всегда улучшает производительность, хотя объем зависит от набора данных. Если вы хотите дополнить данные, чтобы искусственно увеличить размер набора данных, вы можете сделать следующее, если это применимо (не применимо, если, например, были изображения домов или людей, где, если вы поверните их на 180 градусов, они потеряют всю информацию но не если вы перевернете их как зеркало)

  • вращение: случайное с углом от 0 ° до 360 ° (равномерное)
  • перевод: случайный со сдвигом от -10 до 10 пикселей (равномерно)
  • масштабирование: случайное с масштабным коэффициентом от 1 / 1,6 до 1,6 (логарифмическая единица)
  • листать: да или нет (Бернулли)
  • сдвиг: случайный с углом от -20 ° до 20 ° (равномерно)
  • растяжение: случайное с коэффициентом растяжения от 1 / 1,3 до 1,3 (логарифмическая форма)

Вы можете увидеть результаты на изображениях шара Data Science.

Предварительно обработанные изображения

Предварительно обработанные изображения

дополненные версии тех же изображений

введите описание изображения здесь

-Другие методы

Они будут иметь дело с другими свойствами изображения, такими как освещение, и уже связаны с основным алгоритмом, более похожим на простой этап предварительной обработки. Проверьте полный список на: Учебник UFLDL

wacax
источник
1
Цвет также стоит обратить внимание на увеличение данных.
Дэвид С. Бишоп
Можете ли вы также поделиться кодом для вращения и резки и т. Д. ?? @wacax
Арсенал Фанатик
Вы, ребята, можете использовать такой пакет, как keras, для увеличения данных.
Рикардо Круз
2
Для тех, у кого проблемы с импортом модуля scipy.misc. Тебе нужно import scipy.misc. stackoverflow.com/questions/13581593/…
eleijonmarck
Что касается изменения размера изображения, какой метод обычно используется в современных методах, например, используемых в ImageNet?
Здравствуйте, до свидания,
2

Хотя ответ wacax является полным и действительно объяснительным, я хотел бы добавить пару вещей на случай, если кто-нибудь наткнется на этот ответ.

Во- первых, большинство scipy.miscизображений связанных с ними функций ( imread, imsave, imresizeERC) стали устаревшими в пользу той или иной ImageIO или skimage .

Во-вторых, я настоятельно рекомендую библиотеку python imgaug для любых задач по расширению. Он действительно прост в использовании и имеет практически все методы дополнения, которые вы, возможно, захотите использовать.

Джон Доу
источник