⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bptraindlg.cpp

📁 针对车牌识别的字符bp神经网络训练
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if(Col != dwWidth || Row != dwHeight)
		{
			AfxMessageBox("图像大小不符合要求!");
			free(image);
			return;
		}
		
		if(0 != DIBNumColors((LPSTR)lpDIB))
		{
			AfxMessageBox("图像色彩不符合要求!");
			free(image);
			return ;
		}
		
		//彩色图像指针赋值
		BYTE *lpTemp = (BYTE *)FindDIBBits((LPSTR)lpDIB);
		
		memcpy(image, lpTemp, Row * Col * 3);

////////////BP训练 image 为32×16的字元图像
		BPTraining(image,m_Type);
////////////
	}  // end while

	free(image);
	
	m_bTrained=TRUE;
	AfxMessageBox("当前字符训练完成,请进行下一个字符的训练");
	//CDialog::OnOK();
}

void CBPTrainDlg::BPTraining(unsigned char *image, CString strType)
{
	#define Image(i,j)    image[(long)(i)*width+(j)]  

	/* 对应的字符number, character的洞的个数
	   在神经网络有两个输出值相近时做为判断的依据
	                     0 1 2 3 4 5 6 7 8 9      */
	int number_zero[] = {1,0,0,0,1,0,1,0,2,1};
	/*    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z */
	int character_zero[] = 
		 {1,2,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0};
	
	int all_zero[]={1,0,0,0,1,0,1,0,2,1,
	               0,0,0,0,0,0,0,0,0,0,
				   0,0,0,0,0,0,0,0,0,0,
				   0,0,0,0,0,0,0,0,0,0,
				   0,0,0,0,0,0,0,0,0,0,
				   0,0,0,0,0,0,0,0,0,0,
				   0,0,0,0,0,1,2,0,1,0,
				   0,0,0,0,0,0,0,0,0,1,
				   1,1,1,0,0,0,0,0,0,0,
				   0,0,0,0,0,0,0,0,0,0				
	};

	int   i,j;
	float sum;

	BOOL   bIsChar = FALSE;

	unsigned char image1[Row][Col];
	int width=Col;
	int depth = Row;

	for(i=0;i<Row;i++)
	    for(j=0;j<Col;j++)
		{
		    image1[i][j]=image[(long)i*width+j];
		}

	for(i=0;i<100;i++)
	{
		Out[i].Invalue=0.;
		Out[i].Outvalue=0.;
	} 
	
	//vector(image1,3);    /* vector of the char 需要自己根据需要编写*/
	
	Input[INPUTSIZE]=(float)1.0; 
	//tag=1;
	bIsChar=FALSE;
	
	/////forward propagation          ysirss
	for(i=0;i<HID1SIZE;i++)   // input to hidden 1
	{ 
		sum=(float)0.;  
		for(j=0;j<INPUTSIZE+1;j++)
		{
			sum=sum+(float)Input[j]*InH1Weight[i][j].Weight;
		}  
		Hid1[i].Invalue=sum;
		Hid1[i].Outvalue=(float)1.0/((float)1.0+(float)exp(-(double)Hid1[i].Invalue));
        //printf("1==%f\n",Hid1[i].Outvalue);                                   
	}   
    //printf("%ld\n",t);
	Hid1[HID1SIZE].Invalue=(float)1.;Hid1[HID1SIZE].Outvalue=(float)1.;   
                      
	for(i=0;i<HID1SIZE;i++)  // hidden 1 to hidden 2
	{
		sum=(float)0.; 
		for(j=0;j<HID1SIZE+1;j++)
		{
			sum=sum+Hid1[j].Outvalue*H1H2Weight[i][j].Weight;
		}                     
		Hid2[i].Invalue=sum;
		Hid2[i].Outvalue=(float)1.0/((float)1.0+(float)exp(-(double)Hid2[i].Invalue)); 
        //printf("2==%f\n",Hid2[i].Outvalue); 
	}             
                                     
    Hid2[HID1SIZE].Invalue=(float)1.;Hid2[HID1SIZE].Outvalue=(float)1.;    
                
    for(i=0;i<OUTSIZE;i++)  // hidden 2 to output
	{ 
		sum=(float)0.;
		for(j=0;j<HID1SIZE+1;j++)
		{    
			sum=sum+Hid2[j].Outvalue*H2OutWeight[i][j].Weight;
		}                                                                 
		Out[i].Invalue=sum;
		Out[i].Outvalue = (float)1.0/((float)1.0+(float)exp(-(double)Out[i].Invalue));
        //printf("3==%f\n",Out[i].Outvalue); 
	} 

	float NetError,NetGain, NetAlpha, NetEta, Err;

	//output error         	
	NetError = 0;
	NetGain = 1.;
	NetAlpha = 0.9;
	NetEta = 0.25;
  
	for (i=1; i<=OUTSIZE; i++) 
	{
		OutError[i] = NetGain * Out[i].Outvalue * (1-Out[i].Outvalue) * (Target[i-1]-Out[i].Outvalue);
		NetError += 0.5 * sqr(Target[i-1]-Out[i].Outvalue);
	}

	//hidden 2 error
	for (i=1; i<=HID2SIZE; i++) 
	{
		Err = 0;
		for (j=1; j<=OUTSIZE; j++) {
			Err += H2OutWeight[j][i].Weight * OutError[j];
		}
		H2Error[i] = NetGain * Hid2[i].Outvalue * (1-Hid2[i].Outvalue) * Err;
	}
	
	//hidden 1 error
	for (i=1; i<=HID1SIZE; i++) 
	{
		Err = 0;
		for (j=1; j<=HID2SIZE; j++) {
			Err += H1H2Weight[j][i].Weight * H2Error[j];
		}
		H1Error[i] = NetGain * Hid1[i].Outvalue * (1-Hid1[i].Outvalue) * Err;
	}
	
	//adjust weight
	float dWeight, Out1;	
	for (i=1; i<=HID1SIZE; i++) 
	{
		for (j=0; j<=INPUTSIZE; j++) 
		{
			Out1 = Hid1[j].Outvalue;
			Err = H1Error[i];
			dWeight = InH1Weight[i][j].dWeight;
			InH1Weight[i][j].Weight += NetEta * Err * Out1 + NetAlpha * dWeight;
			InH1Weight[i][j].dWeight = NetEta * Err * Out1;
		}
	}

	for (i=1; i<=HID2SIZE; i++) 
	{
		for (j=0; j<=HID1SIZE; j++) 
		{
			Out1 = Hid2[j].Outvalue;
			Err = H2Error[i];
			dWeight = H1H2Weight[i][j].dWeight;
			H1H2Weight[i][j].Weight += NetEta * Err * Out1 + NetAlpha * dWeight;
			H1H2Weight[i][j].dWeight = NetEta * Err * Out1;
		}
	}

	for (i=1; i<=OUTSIZE; i++) 
	{
		for (j=0; j<=HID2SIZE; j++) 
		{
			Out1 = Out[j].Outvalue;
			Err = OutError[i];
			dWeight = H2OutWeight[i][j].dWeight;
			H2OutWeight[i][j].Weight += NetEta * Err * Out1 + NetAlpha * dWeight;
			H2OutWeight[i][j].dWeight = NetEta * Err * Out1;
		}
	}

	//save weight
	for (i=1; i<=HID1SIZE; i++) 
	{
		for (j=0; j<=INPUTSIZE; j++) 
		{
			InH1Weight[i][j].WeightSave = InH1Weight[i][j].Weight;
		}
    }
	for (i=1; i<=HID2SIZE; i++) 
	{
		for (j=0; j<=HID1SIZE; j++) 
		{
			H1H2Weight[i][j].WeightSave = H1H2Weight[i][j].Weight;
		}
    }
	for (i=1; i<=OUTSIZE; i++) 
	{
		for (j=0; j<=HID2SIZE; j++) 
		{
			H2OutWeight[i][j].WeightSave = H2OutWeight[i][j].Weight;
		}
    }
	
	return;       
}

void CBPTrainDlg::OnCancel() 
{
	// TODO: Add extra cleanup here

	if(!m_bTrained || AfxMessageBox("结束当前类型的训练吗?",MB_YESNO)==IDNO)
		return;
	/////start保存权重到文件
	CString strTmp;

	if (strcmp(m_Type,"数字")==0)
		sprintf(g_acDatFile,"%sdata\\Num.dat",g_acExeDir);
	else if (strcmp(m_Type,"字母")==0)
		sprintf(g_acDatFile,"%sdata\\Let.dat",g_acExeDir);
	else if (strcmp(m_Type,"汉字")==0)
		sprintf(g_acDatFile,"%sdata\\Hz.dat",g_acExeDir);

	FILE *R1_file;
	char buf[30];

	if(NULL == (R1_file=fopen(g_acDatFile,"wb+")))
		return ;				
				  
	fseek(R1_file, 0, SEEK_SET);

	/*       t = 0;
            for(k=0; k<30; k++)  
                buf1[k] = 0;
            while('\0' != (ch=fgetc(R3_file)))
                buf1[t++] = ch;
            NumBuf11(i,j) = (float)strtod(buf1, &buf3);  */
    int i, j, t, k;
    
    for(i=0; i<HID1SIZE; i++)
		for(j=0; j<INPUTSIZE; j++)     
		{
			fwrite(&InH1Weight[i][j].WeightSave,sizeof(float),1,R1_file);
			fwrite("",sizeof(""),1,R1_file);
			/*for(k=0; k<30; k++)  
                buf[k] = 0;
			sprintf(buf,"%f\0",InH1Weight[i][j].WeightSave);
			t=0;
			while (buf[t]!='\0')
				fputc(buf[t++],R1_file);*/
		}
	for(i=0; i<HID2SIZE; i++)
		for(j=0; j<HID1SIZE; j++)     
		{
			fwrite(&H1H2Weight[i][j].WeightSave,sizeof(float),1,R1_file);			fwrite("",sizeof(""),1,R1_file);
			fwrite("",sizeof(""),1,R1_file);

			/*for(k=0; k<30; k++)  
				buf[k] = 0;
			sprintf(buf,"%f\0",H1H2Weight[i][j].WeightSave);
			t=0;
			while (buf[t]!='\0')
				fputc(buf[t++],R1_file);*/
		}
	for(i=0; i<OUTSIZE; i++)
		for(j=0; j<HID2SIZE; j++)     
		{
			fwrite(&H2OutWeight[i][j].WeightSave,sizeof(float),1,R1_file);
			fwrite("",sizeof(""),1,R1_file);

			/*for(k=0; k<30; k++)  
				buf[k] = 0;
			sprintf(buf,"%f\0",H2OutWeight[i][j].WeightSave);
			t=0;
			while (buf[t]!='\0')
				fputc(buf[t++],R1_file);*/
		}
            
/*
	for(i=0; i<HID1SIZE; i++)
		for(j=0; j<INPUTSIZE; j++)     
			fprintf(R1_file,"%f\0",InH1Weight[i][j].WeightSave);
			
    for(i=0; i<HID2SIZE; i++)
		for(j=0; j<HID1SIZE; j++)     
            fprintf(R1_file,"%f\0",H1H2Weight[i][j].WeightSave);
   
	for(i=0; i<OUTSIZE; i++)
		for(j=0; j<HID2SIZE; j++)     
            fprintf(R1_file,"%f\0",H2OutWeight[i][j].WeightSave);
*/
    fclose(R1_file); 

	/////end保存权重到文件

	m_bTrained=FALSE;

	//CDialog::OnCancel();
}

void CBPTrainDlg::OnCancel2() 
{
	// TODO: Add your control notification handler code here
	if (m_bTrained)
		CBPTrainDlg::OnCancel();
	CDialog::OnCancel();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -