Нейрон желісі бойынша суреттегі әріпті тану

Нейрон желісі жайында көп еститінмін. Кеше бір студентке көмектесемін деп, ақыры соны оқуға тура келді. Шамалы шет жағасын түсінгендей болдым да кішігірім программа жазып тастадым.

Қысқаша айтқанда, нейрон желісі — тәжірибе жинақтау, жиналған тәжірибе нәтижесінде шешім қабылдауға негізделеді. Жалпы, адамның да өмірі солай ғой. Бәрін біліп туылмайсың, көбіне, жылдар бойы жинаған тәжірибе негізінде шешім қабылдап жатамыз. Бірақ, адамның ойлау жүйесі өте күрделі. Ғалымдар оның программалық үлгісін ойлап табатын болса, 21 ғасырдың ең мықты жетістігі болар еді.

Нейрон желісі — зерттеуге тұрарлық тақырып. Оны қолданып көптеген пайдалы программалар жасауға болады. Өз басым кішігірім робот жасағым келіп кетті. Әзірге оның қызметі қандай болатын білмеймін. Орысша айтқанда, «Пока сама идея заводит)». Ардуиномен айналысып белігілі бір жетістікке жеткен жігіттер болса, жекеге сөйлесуге қуаныштымын. вк

Программаға келсек, жалпы негізгі функцияларды көрсетіп өтемін. (C# тілінде)
Идея мынадай:
  1. 100*100 Панельге әріпті саламыз(ақ фон, қара түс)
  2. Суретті 30*30 кішірейтіп, ондағы әрбір пиксельдің түсіне байланысты 30*30 массивін 0 не 1 сандарымен толтырамыз. 0 — ақ, 1 — қара.
  3. Программа дұрыс таппаса, сүретті сақтап аламыз.
  4. Тану процесі салынған суреттің массивін жадыда бар суреттің массивтерімен салыстырып, ішіндегі сәйкестік дәрежесі(салмағы) ең көбін таңдау түрінде жүзеге асады

Нейронның моделі
    public class Neuron
    {
        public string Name { get; set; }
        public int Weight { get; set; }
        public int[,] Memory = new int[30,30];
    }


Суретті массивке айналдыру методы:
public static int[,] BitmapToArray(Bitmap bmp)
        {
            if (bmp.Height > 30) bmp = ImageManager.Resize(bmp);
            int[,] arr = new int[30, 30];
            for (int i = 0; i < 30; i++)
            {
                for (int j = 0; j < 30; j++)
                {
                    var pxl = bmp.GetPixel(i, j);
                    arr[i, j] = pxl.A == 255 ? 1 : 0;
                }
            }
            return arr;
        }


Суреттегі әріпті тану методы
public static Neuron Recognize(Bitmap bmp)
        {
            var input = BitmapToArray(bmp);
            var neurons = GetNeurons();
            if (neurons == null) return null;
            int maxWeight = 0;
            Neuron output = neurons[0];
            foreach (var neuron in neurons)
            {
                neuron.Weight = Compare(input, neuron.Memory);
                if (neuron.Weight > maxWeight)
                {
                    maxWeight = neuron.Weight;
                    output = neuron;
                }
            }
            return output;
        }

Екі массивті салыстырып салмағын анықтау методы
 private static int Compare(int[,] input, int[,] memory)
        {
            int weight = 0;
            for (int i = 0; i < 30; i++)
            {
                for (int j = 0; j < 30; j++)
                {
                    if (input[i, j] == memory[i, j]) weight++;
                }
            }
            return weight;
        }

Мынау программаның түрі:


Қажетті класстарды мына жерден жүктеп ала аласыз.

  • +6
4 пікір
amantai
1) Түсінгенім бойынша бізде эталонды суреттер бар, сол суретті жазылған жазумен салыстырамыз, қаншалық салмағы жазылғанға сәйкес келсе сол әріп деп санамыз. Солай ма?

2) Бағдарламадағы «Дұрыс жауапты енгізіңіз» деген бөліктері істейді ме? Кодтан оған арналған бөліктерді көріп тұрған жоқпын.
itblogkz
Ия, салыстыру арқылы, бірақ, эталонды суреттер болмайды. Ол жаттығу арқылы жиналады. Әріпті таппаса, қате тапса, дұрыс жауабын көрсетіп «Сохранить» басасыз. Сонда ол өзіне сақтап алып, келер жолы танитын болады.
itblogkz
«Дұрыс жауапты енгізіңіз» бөлігі жасайды, әрине. Мақалада тек маңызды методтарды ғана көрсеттім ғой, анда сілтеме бойынша өтсеңіз, қажетті нәрсенің бәрі тұр.
samlabs821
Neuroph фреймворкинде осыган уксас мысалдар бар.
Тек тіркелген қолданушылар ғана пікір қалдыра алады.