#include #include #include #include #include #include "mlayer.h" #define ROWS 10 #define COLS 8 #define CHARS 95 WINDOW *scrn; neuro_t** N; char netfile[CHARS][10] = {"sp.net","ex.net","qt.net","pnd.net","dlr.net","pct.net","amp.net","apo.net","opn.net","cpn.net","asr.net","pls.net","com.net","min.net","prd.net","fsl.net","0.net","1.net","2.net","3.net","4.net","5.net","6.net","7.net","8.net","9.net","cln.net","smc.net","oab.net","eq.net","cab.net","qes.net","at.net","A.net","B.net","C.net","D.net","E.net","F.net","G.net","H.net","I.net","J.net","K.net","L.net","M.net","N.net","O.net","P.net","Q.net","R.net","S.net","T.net","U.net","V.net","W.net","X.net","Y.net","Z.net","obk.net","bsl.net","cbk.net","car.net","usc.net","tck.net","a.net","b.net","c.net","d.net","e.net","f.net","g.net","h.net","i.net","j.net","k.net","l.net","m.net","n.net","o.net","p.net","q.net","r.net","s.net","t.net","u.net","v.net","w.net","x.net","y.net","z.net","ocb.net","pip.net","ccb.net","tld.net"}; void cteol(){while(getch()!='\n');} void load(neuro_t* w, char* ftrn, float ls, float m){ FILE* f; setLearningSpeed(w,ls); if(m!=0){ momentumOn(w); setMomentum(w,m); } f=fopen(ftrn,"rb"); bldnet(f,w); fclose(f); } void init_neuro(){ int i; N=(neuro_t**)malloc(sizeof(neuro_t*)*CHARS); for(i=0;ip){ p=t; c=i; //move(11,0); //printw("%f\t%c",p,c+65); //refresh(); } } return (char)(c+32); } void transcribe(int v){ int i,l=0,s=500; float one=1,zero=0; float bit[81]; char t; char c[82]; char infile[20]; char outfile[20]; char* text = (char*)malloc(sizeof(char)*1000); FILE* tf; neuro_t* n_temp; move(0,0); printw("Text Image to Recognize: "); refresh(); scanw("%s",infile); tf = fopen(infile,"r"); printw("Output File: "); refresh(); scanw("%s",outfile); noecho(); cbreak(); while(1){ if(fscanf(tf,"%s\n",c)==EOF) break; for(i=0;i<81;i++)bit[i]=(c[i]=='1'?1.0:0.0); clear(); move(0,0); printw("Counter: %d\n",++l); for(i=1;i<81;){ //move(i/COLS+1,i%COLS); //addch(c[i]=='1'?'*':' '); printw("%c",bit[i+1]==1.0?'*':' '); if(!(++i%8)) printw("\n"); } if(l>=s) text = (char*)realloc(text,sizeof(char)*(s+=500)); text[l-1]=recChar(bit); text[l]='\0'; mvaddstr(12,0,text); if(v){ mvaddstr(0,12,"Please verify character:"); refresh(); while((t=getch())<32 || t>126); if(t==text[l-1]){ n_temp = N[t-32]; loadTarget(n_temp,&one); backprop(n_temp); } else{ n_temp = N[text[l-1]-32]; loadTarget(n_temp,&zero); backprop(n_temp); text[l-1] = t; n_temp = N[t-32]; loadTarget(n_temp,&one); backprop(n_temp); } }else{ refresh(); } //printf("\n"); } close(tf); tf = fopen(outfile,"wb"); fwrite(text,sizeof(char),l,tf); close(tf); free(text); save_neuro(); } void comp(){ int i,l=0,p=0,s=500,cyc=0; float one=1,zero=0,acc=0,oldacc=0,avrg=0,n=0; float bit[81]; char comp_c, rec_c; char c[82]; char infile[20]; char compfile[20]; char* text = (char*)malloc(sizeof(char)*500); FILE* tf; FILE* cf; neuro_t* n_temp; move(0,0); printw("Text Image to Recognize: "); refresh(); scanw("%s",infile); tf = fopen(infile,"r"); printw("Comparison File: "); refresh(); scanw("%s",compfile); cf = fopen(compfile,"r"); //printw("Noise Level: "); //refresh(); //scanw("%f",&n); //if(n!=0) srand(time(NULL)); while(1){ while(1){ if(fscanf(tf,"%s\n",c)==EOF) break; for(i=0;i<81;i++) bit[i]=(c[i]=='1'?1.0:0.0); //if(n!=0) for(i=0;i<81;i++) if(rand()/RAND_MAX=s) text = (char*)realloc(text,sizeof(char)*(s+=500)); text[l-1]=rec_c; text[l]='\0'; while((comp_c=fgetc(cf))<32 || comp_c>126); if(comp_c==rec_c){ p++; n_temp = N[comp_c-32]; loadTarget(n_temp,&one); backprop(n_temp); } else{ n_temp = N[rec_c-32]; loadTarget(n_temp,&zero); backprop(n_temp); n_temp = N[comp_c-32]; loadTarget(n_temp,&one); backprop(n_temp); } } clear(); mvaddstr(12,0,text); acc=(float)p/l*100.0; if(acc>85){ move(1,0); printw("Accuracy: %f\%\n(%f Improvement)\nRerun [y/n]?",acc,acc-oldacc); while((rec_c=getch())!='y' && rec_c!='n'); if(rec_c=='n') break; } else{ avrg=(avrg*cyc+acc-oldacc)/(cyc+1); move(10,0); printw("Accuracy: %f\%\n(%f Improvement)\t Trend: %f",acc,acc-oldacc,avrg); } oldacc=acc; rewind(cf); rewind(tf); l=0; p=0; cyc++; } close(tf); close(cf); save_neuro(); } int main(int argc, char *argv[]){ char t; init_neuro(); scrn = initscr(); noecho(); // don’t echo keystrokes cbreak(); // keyboard input valid immediately, not after hit Enter //keypad(scrn, TRUE); clear(); move(0,0); printw("Select Mode: [A]uto Transcription, [S]upervised Transcription, Auto [L]earning\n"); while((t=getch())!='a' && t!='s' && t!='l'); echo(); //nocbreak(); clear(); switch(t){ case 'a': transcribe(0); break; case 's': transcribe(1); break; case 'l': comp(); } endwin(); return 0; }