Светлые головы! Подскажите кто сможет и имел дело с подобными задачами.
Задача (и идея) следующая. Есть две картинки (для простоты - битовые, т.е. только черный и белый цвет, 320Х240). Подаем их на вход нейросети (обе). Нейросеть должна решить задачу классификации: есть на этих картинках существенная разница или нет. Под существенной разницей понимаю появление новых предметов (аномалий) достаточно больших размеров (скажем, 20Х40). Желательно, чтобы на небольшие смещения картинок сеть не реагировала как на аномалию, хотя и необязательно. Время обучения значения не имеет, имеет значение время обсчета сети при подаче входного вектора (т.е. кол-во нейронов и синапсов). Вопрос в следующем: 1) можно такую задачу решить таким образом или нет и 2) какие примерно затраты на вычисления (кол-во нейронов, синапсов). 3) если провести обучение на достаточно большой выборке, то какая реакция будет на совершенно другие картинки? Надеюсь на опыт профессионалов в ответах на эти вопросы. Спасибо.
Не вижу смысла в нейросетях, раз требуется просто сравнение двух любых картинок и нет четко фиксированного набора эталонов. Возьмите хороший сдвигово-вращательный инвариант картинок и смотрите, превысит или не превысит расстояние между инвариантами некоторый порог, который подберете так, чтобы сдвиг картинки в какую-либо сторону на несколько пикселов не приводил к сигналу о расхождении с несдвинутым случаем. Это самое простое решение, если нужно решать именно задачу классификации, т.е. не выделять еще и местоположение аномалий на картинке, и обеспечить устойчивость к малым смещениям.
Уважаемый Виктор! Предложение дельное, спасибо. Может подскажите решение еще одной проблемы ? Необходимо выделить теперь как раз из картинки предмет, образец которого имеется. Картинка теперь не смещается. Возможно ли это, если реальный размер предмета и его положение (на картинке) будет отличаться от образцов, на которых обучалась нейросеть ? Как получить информацию (т.е. в каком виде) о положении распознанного на картинке предмета, если это возможно. Я предполагал определять местоположение (наверное, нерационально) так: когда распознан предмет, передвигаем его образец по картинке и считаем корелляционную функцию, находя таким образом область, где корелляционная функция максимальна. Может как-то сразу с выхода нейросети можно взять информацию о положении, но вот как - не представляю. Подскажите кто сможет. Спасибо.
Ну, способ пробегания по картинке скользящим окном должен вроде бы сработать. Сканировать, естественно, можно со сдвигом не на пиксел, а побольше (хотя бы при первом, пристрелочном поиске местоположения, а потом уточнять в его окрестности). И здесь тоже надо-бы применять инвариантные преобразования картинок и образцов - даже с достаточно большими изменениями геометрических размеров эталона можно справиться использованием, например, преобразования Хафа (Hough transform).
Сразу вычислять координаты эталона вряд ли будет можно - надо бегать по картинке. Но тут я могу и ошибаться, поскольку современных научных результатов не знаю. Может, кто-то где-то когда-то и совершил революционный прорыв ;)
Конечно, есть готовые рецепты и более-менее окончательные суждения о применимости и сравнительной эффективности тех или иных идей и приемов при конкретных свойствах задачи и картинок, но надо глубоко копать научные работы в области image detection and recognition.
А все-таки (не уловил ответа на вопрос), можно ли обучить сеть на эталоне, а затем узнать, есть ли что-то похожое на эталон на картинке, если это что-то будет расположено в другом месте и будет другого размера ? Например есть 5 образов. Обучаем этим 5 образам сеть. Затем подаем картинку (реальную). Наша сеть должна определить есть ли (и какие именно из 5-ти) образы на картинке, пусть без местоположения. Но эти образы могут быть чуть меньше эталона или чуть больше эталона, и (что самое главное) расположены они точно не так как были расположены при обучении, т.е. местоположение образов произвольное, а затем уже без нейросети определить положение. Это гораздо быстрее чем ездить окном по картинке и много раз подавать кусок картинки на нейросеть, обученную требуемым образам ? (зато тогда как раз узнаем и положение). Спасибо за терпение и отзывчивость.
Да можно, но я не ожидаю от этого хорошего результата. Сети типа Хопфила, которые сводят картинку к эталону, не применить - они не могут давать ответ о наличии сразу нескольких эталонов на картинке, да и размер эталона меньше размера картинки на порядок, поэтому эталон придется раздувать до размеров картинки (т.е. время рассчета вырастет всё равно, хоть и другим способом).
Многослойный персептрон (сетка обратного распространения) может давать несколько ответов сразу, в нее можно встроить хорошую устойчивость к сдвигу положения эталона на картинке и его искажениям, но в последнем случае получится что-нибудь типа сверточной (convolutional) сети, которая на форуме тут недавно вспоминалась - а это те же самые скольжения окошком, причем даже не одним при необходимости. Думаю, что и при модификации сетей адаптивного резонанса получится подобное же.
Хотя, повторю предыдущее письмо, я не знаю современного состояния нейросетевых дел в этой области - может, и есть хорошие решения, но надо копать литературу.
Т.е. обучить-то сетку можно, но потеряете возможность определения местоположения эталона на картинке одновременно с сигналом о его присутствии. А я не верю, что у Вас есть хорошая процедура определения местоположения _искаженного_ эталона на картинке, которая будет в связке опять же с _устойчивой_к_искажениям_и_местоположениям_эталонов_ сеткой-классификатором работать суммарно быстрее, чем описанная мной в первом письме одна и та же техника сначала в ходе грубого сканирования, а затем и более пристального рассмотрения мест, где индикатор похожести превысит порог. Но это для чисто софтовой реализации, без спецжелеза.
Спасибо Виктор! Есть пища для размышлений. Буду копать.