home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
BarlaA
/
sw
/
OLD
/
Simo
/
SVM_mono
/
riconosci.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-06-25
|
7KB
|
239 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "patt_rec.h"
#include "nrutil.h"
int dim;
int degree;
double normalization, sigma;
int delta_g, delta_r, delta_c;
int dim_r, dim_c;
void ReadParameters(char *filename) {
FILE *fp;
fp = fopen(filename,"r");
fscanf(fp,"%d %d ",&dim_r, &dim_c);
fscanf(fp,"%d %d %d ",&delta_g, &delta_r, &delta_c);
}
main(int argc, char *argv[])
{
int knl, i, j, k, nsv, isv, np, ntest, *class, *test_val;
char *knl_t, sv_file[256], test_file[256], f_param[256], radius_file[256], kernel_file[256];
double *x_vec, *sv, bee, *alpha, c_const, kernel(), aux,ftmp,*center, radius,Delta2,ker,ker2;
double *alias_x, *alias_sv, *alias2_sv;
int *index, n_tr;
double curr_r, tmp;
double **mat_kernel;
int n_err,Delta = 0;
int falsi_pos = 0;
FILE *fp1, *fp2, *fpk, *fpp, *fradius;
strcpy(f_param, "NO_PARAMETERS");
for (k = 1; k < argc; k++)
if (*argv[k] == '-')
switch (*(argv[k] + 1)) {
case 'i':
if (sscanf(argv[++k], "%s", sv_file) == NULL)
exit(-1);
break;
case 't':
if (sscanf(argv[++k], "%s", test_file) == NULL)
exit(-1);
break;
case 'K':
if (sscanf(argv[++k], "%s", kernel_file) == NULL)
exit(-1);
break;
case 'r':
if (sscanf(argv[++k], "%s", radius_file) == NULL)
exit(-1);
break;
case 'p':
if (sscanf(argv[++k], "%s", f_param) == NULL)
exit(-1);
break;
default:
exit(-1);
}
fp1 = fopen(sv_file, "r"); /* SV file */
fp2 = fopen(test_file, "r"); /* Test file (with reference values) */
fradius = fopen( radius_file, "w");
if (!strcmp(f_param, "NO_PARAMETERS"))
{
fprintf(stderr, "missing parameter file\n");
help_message();
exit(-1);
}
fprintf(stderr,"prima di readparam\n");
ReadParameters(f_param);
fprintf(stderr,"image size %d %d\n",dim_r,dim_c);
fprintf(stderr,"thickening %d %d %d\n",delta_g, delta_r, delta_c);
fprintf(stderr,"dopo di readparam\n");
fprintf(stderr,"file sv %s\n",sv_file);
fprintf(stderr,"file test %s\n",test_file);
fprintf(stderr,"file matrice %s\n",kernel_file);
fprintf(stderr,"file raggi %s\n", radius_file);
fprintf(stderr,"pinco pallino\n");
/* reading support vector file */
fscanf (fp1, "%d %d %d %d", &nsv, &dim, &dim_r, &dim_c);
alpha = (double *)malloc (nsv*sizeof(double));
class = (int *)malloc (nsv*sizeof(double));
sv = (double*)malloc (nsv*dim* sizeof(double));
index = (int *)malloc(nsv*sizeof(int));
for (isv = 0; isv < nsv; isv++) {
fscanf(fp1,"%d ",&index[isv]);
for (i = 0; i < dim; i++) {
fscanf(fp1, "%lf", &sv[isv*dim+i]);
}
fscanf(fp1, "%d %lf", &class[isv], &alpha[isv]);
}
fscanf(fp1, "%lf", &radius);
fscanf(fp1, "%lf", &c_const);
fscanf(fp1, "%d", &knl);
fprintf(stderr,"knl %lf radius %lf const %lf \n",(double)knl,radius,c_const);
switch (knl) {
case LINEAR_KERNEL:
fscanf(fp1, "%lf", &normalization);
break;
case POLY_KERNEL:
fscanf(fp1, "%lf %d", &normalization, °ree);
break;
case RBF_KERNEL:
fscanf(fp1, "%lf", &sigma);
break;
case HAUS_KERNEL:
fscanf(fp1, "%lf", &normalization);
break;
case HAUS_KERNEL_SIMM:
fscanf(fp1, "%lf", &normalization);
break;
case NEGATIVE_KERNEL:
fscanf(fp1, "%lf", &normalization);
break;
default:
exit(UNKNOWN_KERNEL);
}
fclose(fp1);
fprintf(stderr,"pinco pallino\n");
fprintf(stderr,"radius %lf c_const %lf knl %d norm %lf\n",radius,c_const,knl,normalization);
/* reading test file */
fscanf(fp2, "%d %d", &ntest, &dim) ;
/*inizio il file dei raggi con il numero di elementi del test*/
fprintf(fradius,"%d \n",ntest);
// x_vec = (double*)malloc(ntest*dim*sizeof(double));
x_vec = (double*)malloc(dim*sizeof(double));
test_val = (int*)malloc(ntest*sizeof(double));
/* reading mat_kernel file */
fpk = fopen(kernel_file,"r");
fscanf(fpk,"%d",&n_tr);
fprintf(stderr,"%d",n_tr);
mat_kernel = dmatrix(0,n_tr-1,0,n_tr-1);
for(k=0;k < n_tr;k++) {
for(j=0; j < n_tr;j++) {
fscanf(fpk,"%lf ",&tmp);
mat_kernel[k][j]=tmp;
}
}
fclose(fpk);
fprintf(stderr,"\nperche qui non ci arriva1\n");
for (i = 0; i < ntest; i++) { /***qui inizia il for grosso***/
for (j = 0; j < dim; j++)
// fscanf(fp2, "%lf", &x_vec[i * dim + j]);
fscanf(fp2, "%lf", &x_vec[j]);
n_err = 0;
Delta2 = (double)Delta/10.; /*Attenzione!!!!! solo per lo script!!!!!!!!!*/
/* pattern classification */
//for(i = 0; i < ntest; i++) {
// alias_x = x_vec+i*dim;
alias_x = x_vec;
aux=0.;
/*ci serve il training*/
//aux = kernel(knl,&x_vec[i*dim],&x_vec[i*dim]);
aux = kernel(knl,x_vec,x_vec);
/*aux = kernel(knl,alias_x,alias_x);*/
/*printf("%lf\n",aux);*/
for (j=nsv-1;j>=0;j--) {
alias_sv = sv+j*dim;
//aux -= 2.*alpha[j]*kernel(knl,&x_vec[i*dim],&sv[j*dim]);
aux -= 2.*alpha[j]*kernel(knl,x_vec,&sv[j*dim]);
/*aux -= 2.*alpha[j]*kernel(knl,alias_x,alias_sv);*/
for (k=nsv-1;k>=0;k--) {
alias2_sv = sv+k*dim;
aux += alpha[j]*alpha[k]*mat_kernel[index[j]][index[k]];
/*aux += alpha[j]*alpha[k]*kernel(knl, &sv[j*dim], &sv[k*dim]);*/
/*printf("test %lf %lf\n", kernel(knl, alias_sv, alias2_sv),mat_kernel[index[j]][index[k]]);*/
}
}
curr_r = sqrt(aux);
fprintf(fradius, "%lf\n",curr_r);
fprintf(stderr,"i: %d radius: %lf altro: %lf ",i,radius,curr_r);
if( curr_r > radius )
fprintf(stderr, "-1\n");
else{
n_err++;
fprintf(stderr, "1\n");
}
}
fprintf(stdout,"%lf %lf\n",radius,curr_r);
//}
fclose(fp2);
fprintf(stderr,"perche qui non ci arriva3\n");
/*
if(falsi_pos==1) {
fprintf(stdout, "%lf\n",((double)ntest-(double)n_err)/(double)ntest);
fprintf(stderr, "falsi positivi %lf\n",((double)ntest-(double)n_err)/(double)ntest);
}
else {
fprintf(stdout, "%lf\n",1.-(double)n_err/(double)ntest);
fprintf(stderr, "falsi neg %lf\n",1.-(double)n_err/(double)ntest);
}
fclose(fradius);
*/
}
help_message()
{
fprintf(stderr, "usage: riconosci -i sv file (support vector file, required) \n -t test file\n -r file_raggi\n -K mat_kernel\n");
exit(-1);
}