Как использовать собственные изображения в TensorFlow?

Я знаю, что этот вопрос задавался раньше, но я не смог найти ответ, с которым я мог бы работать. Я новичок в Python и Tensorflow, но мне удалось повысить точность до +-99,3% с помощью набора изображений MNIST. Теперь я хотел бы попробовать использовать свои собственные изображения, но это оказалось для меня сложнее, чем я ожидал.

Я сотни раз читал учебную страницу на сайте Tensorflow, но для меня это просто не имеет смысла, и что бы я ни пытался, я просто получаю предупреждения. Теперь я хочу разобраться в этом сам, но кто-нибудь знает, как проще всего работать с моими собственными изображениями? Или какие-то примеры? Я искал их в Интернете, но мне кажется, что я нахожу их тысячи, но ни один из них не объясняется так, как я могу понять.

Заранее благодарны за Вашу помощь.


person Wilrick B    schedule 20.11.2017    source источник
comment
Чтобы помочь ответить на этот вопрос, какие у вас изображения? Как много? Они маркированы? Какой размер? Какие классы / сколько классов? Вы хотите сделать классификацию или что-то более сложное?   -  person dga    schedule 20.11.2017
comment
У меня есть 42 жетона с разными символами. Символы действительно стилизованы, поэтому размер изображения может быть очень низким. Моя цель — распознать токен, изображение которого я нарисовал. Это означает 42 токена с разными метками.   -  person Wilrick B    schedule 20.11.2017
comment
Физические токены, которые вы фотографируете заранее, чтобы создать помеченный набор данных? Сколько снимков каждого из них вы готовы сделать в разных условиях (фон, освещение, ориентация и т. д.)? :)   -  person dga    schedule 21.11.2017
comment
Я планировал сделать примерно по 10 изображений в каждом, в основном для разных ракурсов, а затем использовать код, чтобы сделать как минимум еще 10/20 изображений с изменением контраста и тому подобными вещами. Я догадался, что это сэкономит мне много времени. Я планировал создать помеченный набор данных, такой как изображения MNIST, но я не знаком с этим форматом, поэтому мне нужно найти другой способ сделать это.   -  person Wilrick B    schedule 21.11.2017
comment
Да, и я знаю, что это не так много изображений, но моя главная проблема заключается в использовании моих собственных изображений в TensorFlow, генерация большего количества изображений/снятие большего количества фотографий — это еще одна часть проекта, о которой я не слишком беспокоюсь. С различными настройками и вырезанием частей изображений, центрированием символов на жетонах и тому подобным, я, вероятно, мог бы сделать около 100/200 изображений для каждого токена, если это окажется необходимым для лучших результатов.   -  person Wilrick B    schedule 21.11.2017


Ответы (1)


Итак, собрав это вместе, у вас будет 42 класса, и ожидается, что у каждого будет примерно по 10 изображений.

Это ставит вас прямо перед потребностью в двух вещах:

Вы уже упомянули о вероятной необходимости увеличения данных в комментариях, и вы попали в точку: чтобы максимально использовать ваши 10 изображений в классе, вам нужно применить к ним целую кучу преобразований. Вероятно, намного больше, чем 10/20 изображений:

  • Обрезка
  • Масштабирование
  • Шум
  • Регулировка контраста/цвета/яркости
  • Вращение

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

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

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

Затем у вас возникает вопрос, с какой архитектуры начать трансферное обучение. Начальная часть, вероятно, слишком сложна для того, что вы делаете, но стандартная модель MNIST, вероятно, проще, чем вы хотите. Вам нужно будет немного поэкспериментировать — модифицированный классификатор в стиле LeNet, такой как общие примеры MNIST, может работать довольно хорошо (добавьте еще один сверточный слой, добавьте пакетную норму и, возможно, немного отсева). Кроме того, вы можете начать с предварительно обученного Mobilenet Сеть и передача учатся у нее. У меня возникло бы искушение начать с последнего, если только у вас нет строгих вычислительных ограничений на скорость вывода.

Для ваших изображений я бы начал с создания каталога изображений JPEG. Самым «официальным» способом их обработки будет процесс в этот ответ.

person dga    schedule 22.11.2017
comment
Этот ответ потрясающий, большое спасибо! Я уже думал, что базовая модель MNIST не будет работать так же хорошо, поэтому мой план состоял в том, чтобы убедиться, что я могу импортировать свои изображения в свой код, а затем провести много тестов с документацией, чтобы почувствовать все различные варианты. Не самый эффективный способ сделать это, но я пытаюсь учиться, так что это заставит меня попробовать много вещей и найти свой путь методом проб и ошибок. Я уже изучил сеть Mobilenet, которая уже заинтересовала меня, я рассмотрю возможность использования трансферного обучения, чтобы использовать его для токенов. - person Wilrick B; 22.11.2017