Не могу разобраться с teach_php

Печать RSS
247

В
Автор
Пришелец
0
Задача:
Есть 4 папки (0, 1, 2, 3), в которых фото разных людей. В 0 - фото плохого человека, в 1 - хороший1, 2 - хороший2, 3 - хороший3. Не получается обучить сеть, чтоб выдавала 000 на плохого, 100 на хор.1, 010 на хор.2 и 001 на хор.3. Не совсем понимаю принцип работы и логику нейросети.

Вот мой скрипт:


<?php
$j = 0;
$my_example = array();
for ( $i = 1; $i < 4; $i++ )
{
$l = $i;
$l--;
$index = array(0, 0, 0);
$index[$l] = 1;
$d = dir("teach/$i");
while($entry = $d->read())
{
if ( preg_match("/jpg/", $entry) )
{
$im = imagecreatefromjpeg("teach/$i/$entry");

$cur_array = array();
$cnt = 0;
for($y=0; $y<200; $y++)
{
for($x=0; $x < 200; $x++)
{
$rgb = imagecolorat($im, $x, $y) / 16777215;
$cur_array[$cnt] = $rgb;
$cnt++;
}
}

imagedestroy($im);
$my_example[$j] = array($cur_array, array($index));
$j++;
}

}
}

$ann = fann_create(array(40000, 200, 3), 1.0, 0.7);
if ( fann_train($ann, $my_example, 1000, 0.001, 100) == FALSE)
exit('Could not train $ann.');

fann_save($ann, "my3.ann");
?>
А

Оранжевые штаны
0
<?php
$j = 0;
$my_example = array();
for ( $i = 1; $i < 4; $i++ )
{
$l = $i;
$l--;
$index = array(0, 0, 0);
$index[$l] = 1;
$d = dir("teach/$i");
while($entry = $d->read())
{
if ( preg_match("/jpg/", $entry) )
{
$im = imagecreatefromjpeg("teach/$i/$entry");

$cur_array = array();
$cnt = 0;
for($y=0; $y<200; $y++)
{
for($x=0; $x < 200; $x++)
{
$rgb = imagecolorat($im, $x, $y) / 16777215;
$cur_array[$cnt] = $rgb;
$cnt++;
}
}

imagedestroy($im);
$my_example[$j] = array($cur_array, array($index));
$j++;
}

}
}

$ann = fann_create(array(40000, 200, 3), 1.0, 0.7);
if ( fann_train($ann, $my_example, 1000, 0.001, 100) == FALSE)
exit('Could not train $ann.');

fann_save($ann, "my3.ann");
?>

Добавлено через 03:43 сек.
мб мало примеров? хочешь хороший результат - готовь много примеров, нет смысла учить много раз одним и тем же, эти скорее переучишь и будут проблемы с распознаванием.
p.s существует сборка под php 5.2.1 версии fann 2, на форуме fann'a можно отыскать.

Добавлено через 08:00 сек.
$rgb = imagecolorat($im, $x, $y) / 16777215; - это ты чб делаешь? попробуй сохранить их и посмотреть после такой обработки их вообще реально ли распознать. Вообще напиши подробнее, что выдаёт, примеры картинок которыми учишь.

Пацак
0
а можно в двух словах для чего это нужно?
В
Автор
Пришелец
0
Есть такая статья. Я решил попробовать у себя дома, но при этом расширить функционал. По этому мануалу вроде как заработало, а вот мой обучающий скрипт мне кажется неправильно работает - не просто ошибки потом, а полностью одинаковый ответ при любых фотках на входе.
Картинки с обычной вебкамеры пока делаю, кропаю до 200*200. Качество вроде ничего.
Какое количество фото достаточно для обучения (понятно, что чем больше тем лучшеsmile )?
Интересует очень как же работает функция train_php и какая логика, т.е. обязательны ли только 2 папки, или можно к примеру 4, как у меня. И как она работает с массивом который создает, как он создается...
А

Оранжевые штаны
0
4, лучше поискать другую статью.
как минимум сводить изображение к чб это бред, можно будет даже не быть похожем на этого человека, а просто подобрать освещение что бы нейросеть пустила, лучше было бы использовать фильтр gd оставляющий только контур предметов в чб. Автор зачем то загнал код в цикл вместо того чтобы просто увеличить скорость обучения. Автор не знает что $a[]=1; запишет элемент в конец массива. И вопрос чему он может научить. Способ не годится для распознавания не известных для сети фоток. в комментариях тоже кстати написано "2012-01-04 19:23:27 | pk
при использовании такого примитивного алгоритма сеть надлежащим образом работать не будет."

Добавлено через 01:20 сек.
При таком алгоритме сеть может пустить и утюг вместо человека=)

Добавлено через 09:47 сек.
одинаковый ответ при любых фотках на входе
потому что все фотки преобразуются скорее всего в просто чёрные или только белые.
Изменил: Александр (17.04.2012 / 17:06)
А

Оранжевые штаны
0
2 папки, или можно к примеру 4
можно.
В
Автор
Пришелец
0
Как бы так сказать... я в программировании в общем и в нейронных сетях в частности ***ок sad . Но наткнулся на вышеуказанную статью в которой был описан достаточно нехитрый алгоритм распознавания. Вот я и решился сделать по статье. Заработало. Захотел чуть улучшить (с пхп кстати и нейронными сетями столкнулся впервые на практике), но дело не пошло. Тем не менее есть такое ощущение, что смогу заставить это работать smile - мне главное понять принцип обучения и работу этой технологии.
Вот автор статьи на которую я ссылался делал по схеме: обрезать и перегнать в ч/б цвет и далее в цикле каждый пиксель определять насколько он максимально черный/белый со значением от 0 до 1. Все работает при достаточном к-ве материала и простой схеме свой/чужой.
По вашему совету попробую использовать вместо qrayscale - EDGEDETECT. Может быть вы знаете лучший метод для распознавания лиц, чем описанный? Я бы с удовольствием с ним ознакомился smile . Работаю с тем, что нашел - более подходящего ничего пока не встретил.

Автор зачем то загнал код в цикл вместо того чтобы просто увеличить скорость обучения.

Не совсем понял, о каком именно цикле идет речь - мне по крайней мере все кажутся понятными: 1 цикл - проверка наличия фото в каждой папке, 2-й цикл - в нем вычисляется значение каждого пикселя (от 0 до 1 как уже говорилось), и заносится в соотв. элемент массива... Как увеличить скорость обучения за 20 мин не нашел.. буду искать, но скорость в обучении пока не главное.
Автор не знает что $a[]=1; запишет элемент в конец массива.
Это я недопонял про какой моментsad

потому что все фотки преобразуются скорее всего в просто чёрные или только белые.
Как так может быть?? Как я понимаю, они преобразуются в ч/б, вырезается лицо и потом каждый пиксель из 40000 проверяется, насколько черный и получает свое значение от 0 до 1.
А

Оранжевые штаны
0
с циклом ошибся, всё верно.
каждый пиксель из 40000 проверяется, насколько черный и получает свое значение от 0 до 1.
после преобразования в чб теряется очень много информации, лучше напиши перед imagedestroy($im); такой код imagejpeg($im, rand(10000,999999).'.jpg'); будет ясно что происходит после преобразования. http://rusnauka.narod.ru/lib/author/briluk_d_b/1/ вот и ответ как лучше сделать, сделай для каждого изображения разную яркость, потом каждое в чб, и сразу все в 1 массив и обучай. Ещё можно скачать 2 версию fann, там можно выбирать тип сети одной строчкой, мб некоторые сети дадут лучший результат, но алгоритм всё равно меняй.
В
Автор
Пришелец
0
Так, если я правильно понимаю, то после $im = imagecreatefromjpeg("teach/$i/$entry"); я вставляю imagejpeg($im, rand(10000,999999).'.jpg'); (не совсем понял, что тут происходит, вероятно произвольная яркость для картинки, которую мы запихнули в $im). цикл с разложением на пиксели вообще убрать? Теперь делаю ее ч/б и просто запихиваю в массив?
Я объясню, что мне не понятно: в примере, по которому я делал принцип как я уже говорил простой - разбить на пиксели, из каждого сделать число от 0 до 1 и запихнуть в свою ячейку массива. А если это исключить, то каким образом обработать картинку??
Статью по типам сетей почитал. Можно было бы попробовать сверточную сеть, или хопфилда+многослойную... Но вот как реализовать эти сети я пока затрудняюсь понять.. Кстати я даже не в курсе какая сеть используется в моем примере sad (предполагаю, что сверточная).
А

Оранжевые штаны
0
imagejpeg($im, rand(10000,999999).'.jpg'); сохраняет картинку в папку со случайным именем, что бы можно было посмотреть пригодна ли она после фильтров для обучения.
цикл с разложением на пиксели вообще убрать?
нет, просто с начало в цикле сделай один раз как в статье(просто в чб), потом увеличь яркость например на 20% и опять в чб, увеличь ещё на 20% и опять как в статье, соедини все результаты, при меньшей яркости будет больше 1 (серый стал 1(потеря полезной инфы)), потом например увеличил яркость получилось(тот серый цвет стал 0), теперь инфы потерялось меньше, вот зачем это надо. кстати а почему бы не отставит грации серого и переводить каждый цвет в двоичную систему, тогда проблемы как запихнуть картинку внутрь отпадают. (256 > 11111111 и в сеть) 256*200*200=10 240 000, многовато, лучше ещё уменьшить количество цветов (хотя тоже должно работать довольно быстро). Если так сделаешь то можно не менять тип сети, но куда лучше будет использовать предназначенную для этого нейросеть(лучше пожалуй сверточную).
Кстати я даже не в курсе какая сеть
У тебя скорее всего обычная однослойная нейросеть. Ещё пожалуй стоит поменять тип обучения http://leenissen.dk/fann/fann_1_2_0/r1996.html
Изменил: Александр (19.04.2012 / 19:40)
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск