Распознавание лиц с помощью нейронной сети Backpropagation? - PullRequest
1 голос
/ 29 декабря 2011

Я очень новичок в обработке изображений, и мое первое назначение - создать рабочую программу, которая распознает лица и их имена.До сих пор я успешно создавал проект для обнаружения, обрезки обнаруженного изображения, превращения его в sobel и преобразования его в массив float.Но я очень запутался, как реализовать Backpropagation MLP для изучения изображения, чтобы оно могло распознать правильное имя для обнаруженного лица.

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

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

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

Если вы ищете теоретическое описание обратного распространения, взгляните на лекции Стэнфорда класса ml (раздел ANN).Если вам нужна готовая реализация, прочитайте этот вопрос .

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

0 голосов
/ 31 декабря 2011

Вы пытались записать свои векторы объектов в файл arff и передать их в weka , просто чтобы посмотреть, может ли ваш подход работать вообще ? Weka имеет много интегрированных классификаторов, включая MLP. Насколько я понял, я подозреваю, что выбранные вами функции и классификатор не работают.

К вашему первоначальному вопросу: делали ли вы какие-либо попытки самостоятельно внедрить нейронную сеть? Если так, то где вы застряли? Обратите внимание, что это не то место, где можно запросить полную рабочую реализацию у аудитории.

Чтобы дать общий ответ на общий вопрос: Обычно у вас есть узлы в MLP. В частности, входные узлы, выходные узлы и скрытые узлы. Эти узлы строго организованы в слоях. Входной слой внизу, выходной слой сверху, скрытые слои между ними. Узлы подключены простым способом прямой связи (выходные соединения разрешены только для следующего более высокого уровня). Затем вы подключаете каждый из ваших float к одному входному узлу и направляете векторы функций в вашу сеть. Для обратного распространения необходимо предоставить сигнал ошибки, который вы указываете для выходных узлов. Таким образом, если у вас есть n имена для различения, вы можете использовать n выходные узлы (т.е. по одному на каждое имя). Заставьте их, например, вернуть 1 в случае совпадения и 0 в противном случае. Вы могли бы очень хорошо использовать один выходной узел и позволить ему возвращать n различных значений для имен. Вероятно, было бы даже лучше использовать n совершенно разные персептроны, то есть по одному на каждое имя, чтобы избежать некоторых побочных эффектов (катастрофических помех).

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

Удачи, в любом случае!

...