/* reco_batch_dir_all.c */ /* 各数字の輪郭方向分布特徴を用いた認識のバッジ処理 */ /* learn.pat および test.pat 全体で評価する */ #include #include #include #include "mypgm.h" #define BLACK 0 #define WHITE 255 #define RADIUS 25.0 #define HEI 120 #define WID 80 #define SIDE 20 #define BLOCKS 24 #define DIRECTION 4 /* prototype declaration */ void reco_fv_dir(int *, double *); /* global variables */ double dic[10][BLOCKS][DIRECTION]; double fv[BLOCKS][DIRECTION]; main( ) { FILE *fp; char filename[MAX_FILENAME]; static int l_pat[10] = {2535, 1691, 1658, 1736, 1188, 1996, 1977, 1410, 2366, 1428}; static int t_pat[10] = {1485, 2392, 1939, 2043, 2403, 1641, 1831, 2056, 986, 1140}; int digit, serial; double dist[10]; int label[10]; double acm_rate[2][10][10]; double acm_rate_total[2][10]; int i, j, k, rank; int sample = 0; /* read of dic_dir into dic[10][24][4] */ fp = fopen("dic_dir_all", "rb"); fread(dic, sizeof(dic), 1, fp); fclose(fp); /* batch job of digit recognition */ for (digit = 0; digit < 10; digit++) { for (k = 0; k < 10; k++) { acm_rate[0][digit][k] = 0.0; /* learning data */ acm_rate[1][digit][k] = 0.0; /* testing data */ } } /* recognition of learning data */ for (digit = 0; digit < 10; digit++) { for (serial = 1; serial <= l_pat[digit]; serial++) { sprintf(filename, "./fv_dir/lfv%d_%04d", digit, serial); printf("sample = %d\n", ++sample); /* input of feature vector */ fp = fopen(filename, "rb"); fread(fv, sizeof(fv), 1, fp); fclose(fp); /* perform recognition */ reco_fv_dir(label, dist); for (j = 0; j < 10; j++) { if (label[j] == digit) { rank = j; break; } } acm_rate[0][digit][rank]++; /* learning data */ } for (k = 0; k < 10; k++) { acm_rate[0][digit][k] *= 100.0/l_pat[digit]; } for (k = 1; k < 10; k++) { acm_rate[0][digit][k] += acm_rate[0][digit][k-1]; } } /* recognition of testing data */ for (digit = 0; digit < 10; digit++) { for (serial = 1; serial <= t_pat[digit]; serial++) { sprintf(filename, "./fv_dir/tfv%d_%04d", digit, serial); printf("sample = %d\n", ++sample); /* input of feature vector */ fp = fopen(filename, "rb"); fread(fv, sizeof(fv), 1, fp); fclose(fp); /* perform recognition */ reco_fv_dir(label, dist); for (j = 0; j < 10; j++) { if (label[j] == digit) { rank = j; break; } } acm_rate[1][digit][rank]++; /* testing data */ } for (k = 0; k < 10; k++) { acm_rate[1][digit][k] *= 100.0/t_pat[digit]; } for (k = 1; k < 10; k++) { acm_rate[1][digit][k] += acm_rate[1][digit][k-1]; } } /* display of recognition result */ for (rank = 0; rank < 10; rank++) { acm_rate_total[0][rank] = 0.0; acm_rate_total[1][rank] = 0.0; for (digit = 0; digit < 10; digit++) { acm_rate_total[0][rank] += acm_rate[0][digit][rank]/10.0; acm_rate_total[1][rank] += acm_rate[1][digit][rank]/10.0; } } printf("\n\t\tRecognition Result : \n"); for (digit = 0; digit < 10; digit++) { printf("\n%d\n", digit); for (i = 0; i < 10; i++) { printf("%6.1f", acm_rate[0][digit][i]); } printf("\n"); for (i = 0; i < 10; i++) { printf("%6.1f", acm_rate[1][digit][i]); } printf("\n"); } printf("\nTotal\n"); for (i = 0; i < 10; i++) { printf("%6.1f", acm_rate_total[0][i]); } printf("\n"); for (i = 0; i < 10; i++) { printf("%6.1f", acm_rate_total[1][i]); } printf("\n\n"); } void reco_fv_dir(int *label, double *dist) { int i, j, k; double val; /* inter-pattern distance calculation */ for (i = 0; i < 10; i++) { dist[i] = 0.0; label[i] = i; for (j = 0; j < BLOCKS; j++) { for (k = 0; k < DIRECTION; k++) { dist[i] += pow(dic[i][j][k] - fv[j][k], 2); } } } /* sorting of inter-pattern distances */ for (i = 0; i < 10-1; i++) { for (j = i + 1; j < 10; j++) { if (dist[i] > dist[j]) { val = dist[i]; dist[i] = dist[j]; dist[j] = val; k = label[i]; label[i] = label[j]; label[j] = k; } } } }