Как ввести изображение в нейронную сеть?

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

У меня есть очень большое изображение A письма. Может быть, я должен попытаться получить некоторую информацию / спецификации из изображения, а затем использовать вектор значений этой спецификации? И они будут входом в нейросеть?

Кто уже такое делал, подскажите, как это сделать?


person Dzen    schedule 18.01.2010    source источник
comment
У вас уже была нейросеть? Если нет - это странный вопрос. Если да - хотя бы опубликуйте интерфейс.   -  person Vladislav Rastrusny    schedule 18.01.2010
comment
Это не странный вопрос. Собственно, если у меня есть интерфейс, то это означает, что я сначала принимаю решение, как мне вводить изображение в нейросеть. Вопрос в том, могу ли я ввести данные изображения, такие как буква А, в нейросеть, даже если они очень большие или маленькие, или я должен разбить их на некоторые параметры, которые однозначно определяют букву А!   -  person Dzen    schedule 18.01.2010
comment
Если я должен разбить его на параметры, какие параметры мне следует использовать?   -  person Dzen    schedule 18.01.2010


Ответы (5)


Самым простым решением было бы нормализовать все ваши изображения, как для обучения, так и для тестирования, чтобы они имели одинаковое разрешение. Также символы на каждом изображении должны быть примерно одинакового размера. Также неплохо использовать изображения в оттенках серого, чтобы каждый пиксель давал вам только одно число. Затем вы можете использовать каждое значение пикселя как один вход в вашу сеть. Например, если у вас есть изображения размером 16x16 пикселей, ваша сеть будет иметь 16 * 16 = 256 входных нейронов. Первый нейрон будет видеть значение пикселя в точке (0,0), второй - в точке (0,1) и так далее. Обычно вы помещаете значения изображения в один вектор и передаете этот вектор в сеть. Это уже должно работать.

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

person ahans    schedule 18.01.2010
comment
Насколько хороши мои шаги по решению этого вопроса? 1. преобразовать изображение в двоичную форму. 2. сегментация. найти связанные части изображения. можно использовать контуры. 3. для каждого сегмента действовать отдельно от других сегментов. 3.1 извлекать некоторую информацию из сегмента изображения. 3.2 сравнить с каким-либо шаблоном или ввести его в нейросеть. так что у меня есть несколько вопросов. 1. Если я сегментирую изображение и у меня там есть буква i, точка над ним будет отделена от сегмента. Итак, как справиться с этой ситуацией? Можно добавить какой-нибудь особый случай. 2. Следует ли мне изменять размер сегмента, если он очень большой или слишком маленький? - person Dzen; 19.01.2010
comment
Могу ли я вводить в нейросеть изображения разного размера? Не думаю, что смогу, но не уверен. Итак, изображение может содержать буквы разного размера, как с этим справиться? - person Dzen; 19.01.2010
comment
Ваши шаги предварительной обработки звучат так, как будто это может сработать, однако я бы посоветовал начать с того, что я предложил в первом абзаце. Мне кажется, у вас не так много опыта работы с нейронными сетями или распознаванием символов. Итак, чтобы понять, что работает и как работает, вам следует начать с простого случая. Добавление слишком большого количества шагов одновременно увеличит вероятность ошибки, и без реального представления о том, чего ожидать от каждого отдельного шага, вам будет сложно отлаживать код. - person ahans; 19.01.2010
comment
Вы не должны использовать разные размеры, по крайней мере, в качестве первого шага. Теоретически нейронная сеть сможет распознавать все, что она видела во время обучения, при условии, что она обучена с достаточным количеством данных и сеть достаточно велика. Однако на практике вы почти всегда захотите сначала нормализовать входные изображения. Существуют подходы, которые пытаются изучить инвариант масштаба, например сверточные сети Яна ЛеКуна (см., Например, yann.lecun .com / exdb / lenet для распознавания символов). Однако я действительно предлагаю вам начать с самого простого подхода, возможно, сначала не с букв, а только с цифр. - person ahans; 19.01.2010
comment
Не используйте изображения, содержащие разные символы. Используйте изображения, которые содержат только один символ, имеют одинаковый размер, и символ в изображении также должен иметь одинаковый размер. Чтобы избавить вас от всей предварительной обработки, получите данные почтового индекса из www-stat .stanford.edu / ~ tibs / ElemStatLearn / data.html (внизу страницы) и обучите свою сеть этому. Здесь не нужно заниматься нормализацией и упорядочиванием пиксельных значений в векторе, все это уже сделано. Если ваша сеть может сделать что-то полезное с этими данными, вы можете начать добавлять дополнительные шаги самостоятельно. - person ahans; 19.01.2010
comment
Вы имеете в виду, что единственное, что мне нужно сделать, это создать нейронную сеть, обучить ее и все? - person Dzen; 21.01.2010
comment
Да, в качестве первого шага получите эти данные, обучите им свою сеть, протестируйте их. И если это сработает, вы можете начать добавлять дополнительные шаги, например, использовать свои собственные изображения. - person ahans; 21.01.2010

Название проблемы, которую вы пытаетесь решить, - «извлечение функций». Это определенно нетривиально и предмет активных исследований.

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

Помимо этого, вы можете сделать множество вещей ... фильтры Габора, функции, подобные Хаару, PCA и ICA, разреженные функции, и это лишь несколько популярных примеров. Я бы посоветовал взять учебник по нейронным сетям и распознаванию образов или, в частности, оптическому распознаванию символов.

person Martin B    schedule 18.01.2010
comment
Не совсем моя специальность, но быстрый поиск обнаруживает подходы к извлечению признаков для оптического распознавания символов Романа Ямпольского, которые, похоже, могут содержать то, что вам нужно. - person Martin B; 21.01.2010

Все эти соображения относительно применения NN к изображениям рассматриваются в нашем обзорном документе 2002 г. (Feature на основе, на основе пикселей, масштабной инвариантности и т. д.)

Ваша самая большая проблема - это так называемое «проклятие размерности».

Я бы сравнил производительность NN с производительностью машины опорных векторов (какие ядра использовать сложно).

person user1391128    schedule 23.05.2012

Вы можете использовать в качестве ввода фактические пиксели. Поэтому иногда предпочтительнее использовать меньшее разрешение входных изображений.

Что хорошо в ИНС, так это то, что они каким-то образом способны выбирать функции (игнорируя неважные пиксели, присваивая почти нулевые веса этим входным узлам).

person Amro    schedule 18.01.2010

Вот несколько шагов: убедитесь, что ваше цветное / полутоновое изображение является двоичным изображением. Для этого выполните некоторую операцию определения порога. после этого какое-то извлечение функций. Для OCR / NN этот пример может помочь, хотя в ruby: https://github.com/gbuesing/neural-net-ruby/blob/master/examples/mnist.rb

person Egon    schedule 19.01.2010