Где ошибка при обучении нейросети для различия изображений?

Здравствуйте, мне нужно чтобы сеть различала есть на изображении предмет или нету

Точнее необходимо определить есть ли на фото слизистой язва или нету
Было собрана база 50 фото -есть, 50 фото - нету
resize/0 - нет; resize/1-есть
Все изображения сделаны черно белыми и размером 300x500

Пример изображений с язвой
8e937df28e8042cba1fdc442a49fd366.jpg
и без нее
6a480ddee62f40bea372243208743a77.jpg

Вот код на обучение:
$j = 0;
$my_example = array();
for ( $i = 0; $i < 2; $i++ )
{
    $d = dir("resize/$i");
    while($entry = $d->read())
    {
        if ( preg_match("/jpg/", $entry) )
        {
            $im = imagecreatefromjpeg("black/$i/$entry");//Подгружаем картинку

            $cur_array = array(); //Создаем массив в котором в одну строку будут собраны номера цветов каждого пикселя
            $cnt = 0;
            for($y=0; $y<300; $y++)
            {
                for($x=0; $x < 500; $x++)
                {
                    $rgb = imagecolorat($im, $x, $y) / 16777215;//Приводим к виду "меньше ноля"
                    $cur_array[$cnt] = $rgb;
                    $cnt++;
                }
            }

            imagedestroy($im);
            $my_example[$j] = array($cur_array, array($i));//Собираем массив, с которого будем обучать
            $j++;
        }

    }
}

$num_input = 150000;//нейронов на вход 500x300
$num_output = 1;//нейронов на выход
$num_layers = 3;
$num_neurons_hidden = 100;
$desired_error = 0.000001;
$max_epochs = 5000000;
$epochs_between_reports = 10;

//И вот собственно само обучение
$ocr_ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ocr_ann) {
    echo 'Training OCR... ';
    fann_set_activation_function_hidden($ocr_ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ocr_ann, FANN_SIGMOID_SYMMETRIC);

    for ($i = 1; $i <= 150000; $i++)
    {
        $input[] = $i;
    }

    $desired_output = array( 1 );

    var_dump( fann_train( $ocr_ann, $input, $desired_output ) );
    fann_save($ocr_ann, dirname(__FILE__) . "/ocr_float3.net");

}

а вот на проверку:
echo "Hello!";
$j = 0;
$my_example = array();

$im = imagecreatefromjpeg("black/0/1.jpg");

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

imagedestroy($im);
echo "Hello!";
$train_file = (dirname(__FILE__) . '/ocr_float3.net');
$ocr_ann = fann_create_from_file($train_file);

$calc_out = fann_run($ocr_ann, $cur_array);

echo "Hello!";
var_dump($calc_out);

По моей логике, если есть предмет то результат стремится к единице, а если нету то к нулю

Но результат совсем не такой как ожидал.
Подскажите пожалуйста что не так в коде?
  • Вопрос задан
  • 1176 просмотров
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
ab-log.ru/smart-house/video_camera_security/face-d...

1. Сначала нужно научиться определять зону (crop-zone), где возможна язва и приводить все изображения к единому унифицированному виду (нужно для снижения возможных ошибок НС на след. пункте).
2. На основе значений весов НС, посчитанных на основе отображаемых пикселей для каждой фотографии, нужно КЛАССИФИЦИРОВАТЬ множества на 2 класса (как я понял, что Вам так необходимо): "с язвой" и "без язвы".

Представленный Вами код - это частный случай для подготовленных изображений (т.е., начиная с п.2). Также, необходимо увеличить кол-во скрытых слоёв для достижения более детальной и точной кластеризации.

PS: Да, и ещё... Если Вы хотите, чтобы Вам написали здесь готовый рабочий код - Вы ошиблись: это на фриланс.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Arseny_Info
@Arseny_Info
R&D engineer
Во-первых, многослойный перцептрон - неподходящая архитектура, посмотрите в сторону сверточных сетей.
Во-вторых, 100 фоток может оказаться недостаточно для обучения с нуля, особенно без аугментации.
В-третьих, сигмоида - плохой выбор функции активации.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы