Co robi ten kod?

Odpowiedz Nowy wątek
2011-07-06 23:35
0

Rozpracowuję program OCR działający na sieci neuronowej. Jego działanie ogranicza się do zrobienia wzorców ze znakami jakiejś czcionki, utworzeniu sieci neuronowej, nauczeniu jej rozpoznawania znaków według tych wzorców i zgadywaniu znaków jakie wpisze z klawiatury użytkownik (które są przekształcane z Charu na image z dodaniem szumu od 0 do 100%). Oto kod:

public double[] CharToDoubleArray(char aChar, Font aFont, int aArrayDim, int aAddNoisePercent)
        {
            double[] result = new double[aArrayDim*aArrayDim];
            Graphics gr = label5.CreateGraphics();
            Size size =Size.Round(gr.MeasureString(aChar.ToString(),aFont));
            Bitmap aSrc = new Bitmap(size.Width,size.Height);
            Graphics bmp = Graphics.FromImage(aSrc);
            bmp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
            bmp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            bmp.Clear(Color.White);
            bmp.DrawString(aChar.ToString(),aFont,new SolidBrush(Color.Black),new Point(0,0),new StringFormat());
            ShowNoise(size,bmp,aAddNoisePercent);
            pictureBox1.Image = aSrc;
            Application.DoEvents();
            double xStep = (double)aSrc.Width/(double)aArrayDim;
            double yStep = (double)aSrc.Height/(double)aArrayDim;
            for (int i=0; i<aSrc.Width; i++)
                for (int j=0;j<aSrc.Height;j++)
                {
                    int x = (int)((i/xStep));
                    int y = (int)(j/yStep);
                    Color c = aSrc.GetPixel(i,j);
                    result[y*x+y]+=Math.Sqrt(c.R*c.R+c.B*c.B+c.G*c.G); //Convert to BW, I guess I can use B component of Alpha color space too...
                }
            return  Scale(result);
 
        }
        private double MaxOf(double[] src)
        {
            double res=double.NegativeInfinity;
            foreach (double d in src)
                if (d>res) res = d;
            return res;
        }
 
        private double[] Scale(double[] src)
        {
            double max = MaxOf(src);
            if (max!=0)
            {
                for(int i=0; i<src.Length; i++)
                    src[i] = src[i]/max;
            }
            return src;                 
        }
 

Nie rozumiem fragmentu, który przekształca znak na obraz. Niestety nie tworzy on typowego obrazu, tylko jakąś tablicę. Najbardziej obcy zdaje się być

 result[y*x+y]+=Math.Sqrt(c.R*c.R+c.B*c.B+c.G*c.G);

fragment Czemu y*x+y?? Prosiłbym o w miarę dokładne wytłumaczenie :)

Pozostało 580 znaków

2011-07-06 23:50
0

Bierzesz się za sieci neuronowe, a nie rozumiesz poruszania się w pętli po tablicy?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-07-06 23:55
0

Jak dla mnie to ten kod jest wadliwy. yx+y = y (x + 1) - dziwny wzór na liczenie pozycji. Wzór na konwersję kolor => skala szarości też jest z d**y wzięty. Jesteś pewien, że to chociaż w miarę dobrze działa?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-07-07 00:04
0

No po paru przejściach nauczania dokładność rozpoznawania jest niezła. Ale jest to rozpoznawanie czcionki komputerowej - nie wiem jak radzi sobie z czcionką ludzką - właśnie dlatego grzebię w tym programie, to mój cel. Czyli żeby zamiast tej dziwnej tablicy dały mu się przekazać po prostu zwykły Image. Wtedy byłby on rysowany przez użytkownika.

Pozostało 580 znaków

2011-07-07 11:54
0

Coś mi się wydaje, że ten kod rysuje tekst na czarno-biało (tzn nie skali szarości) dlatego konwersja color => bw nie ma tutaj znaczenia.

Ponadto korzystanie z dziwacznego wzoru na emulowanie dwuindeksowej tablicy czyli: y (x + 1), podczas gdy powinno być coś w rodzaju: y szerokość (tutaj aArrayDim) + x jest wg mnie błędem, ale niekoniecznie musi spowodować bezużyteczność algorytmu, bo i tak wynik jest powtarzalny.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0