FileStream.ReadBuffer(WeightRecord, WeightRecordLength);
//修改WeightRecord结构的权值
for i := 0 to N - 1 do
begin
WeightRecord.PWb := Wb[i, BestNeuron]; //权值
WeightRecord.PWt := Wt[BestNeuron, i];
end;
//写入文件
FileStream.Seek(BestNeuron * WeightRecordLength + sizeof(M),
soFromBeginning);
FileStream.WriteBuffer(WeightRecord, WeightRecordLength);
end;
FileStream.Free;
end;
end;
procedure TArtNet.LoadWeights(CharImg : TGrayImg);
var
FileStream : TFileStream;
WeightRecord : TWeightRecord;
i, j, k : Integer;
WeightRecordLength : LongInt;
begin
WeightRecordLength := sizeof(TWeightRecord);
InitWeights;
//权库文件不存在
if not FileExists(FileName) then
begin
//创建权文件
FileStream := TFileStream.Create(FileName, fmCreate);
//先写入识别层单元数
FileStream.WriteBuffer(M, sizeof(M));
//填充WeightRecord结构
for j := 0 to M - 1 do
begin
WeightRecord.RecordIndex := j; //索引
for i := 0 to N - 1 do
begin
WeightRecord.PWb := Wb[i, j]; //权值
WeightRecord.PWt := Wt[j, i];
end;
WeightRecord.CharResult := '?'; //结果
WeightRecord.CharImgWidth := CharImg.Width;
WeightRecord.CharImgHeight := CharImg.Height;
for i := 0 to CharImg.Height - 1 do
for k := 0 to CharImg.Width - 1 do
WeightRecord.CharImg[i * CharImg.Width + k] :=
CharImg.Img[i, k];
FileStream.WriteBuffer(WeightRecord, WeightRecordLength);
end;
FileStream.Free;
end
else begin
FileStream := TFileStream.Create(FileName, fmOpenRead);
//跳过识别层单元数
FileStream.Seek(sizeof(M), soFromBeginning);
for j := 0 to M - 1 do
begin
FileStream.ReadBuffer(WeightRecord, WeightRecordLength);
//从文件中读入权值
for i := 0 to N - 1 do
begin
Wb[i, j] := WeightRecord.PWb;
Wt[j, i] := WeightRecord.PWt;
end;
//读入对应识别字符的ASCII
RecoCharASCII[j] := WeightRecord.CharResult;
end;
FileStream.Free;
end;
end;
function TArtNet.Gain1;
var
i, G : Integer;
begin
G := Gain2;
for i := 0 to N - 1 do
begin
if RVect = 1 then
begin
Result := 0;
Exit;
end;
end;
Result := G;
end;
function TArtNet.Gain2;
var
i : Integer;
begin
for i := 0 to N - 1 do
begin
if XVect = 1 then
begin
Result := 1;
Exit;
end;
end;
Result := 0;
end;
function TArtNet.Vigilence : Double;
var
i : Integer;
S, K , D : Double;
begin
K := 0.0;
D := 0.0;
for i := 0 to N - 1 do
begin
K := K + CVect;
D := D + XVect;
end;
S := K / D;
Result := S;
end;
procedure TArtNet.InitARTNET(VT : Double);
var
i : Integer;
PPath : PChar;
FileStream : TFileStream;
begin
L := 2.0;
N := MaxCNN;
PPath := AllocMem(MAX_PATH);
GetModuleFileName(0, PPath, MAX_PATH);
FileName := ExtractFilePath(string(PPath)) + 'Lpr.art';
if not FileExists(FileName) then
M := 1
else begin
FileStream := TFileStream.Create(FileName,fmOpenRead);
FileStream.ReadBuffer(M,sizeof(M));
FileStream.Free;
end;
Reset := True;
VigilThresh := VT;
ClearDisabled;
//初始化识别字符
for i := 0 to MaxRNN - 1 do
RecoCharASCII := '?';
end;
function TARTNET.GetRecoChar : string;
var
Temp : string[2];
TempChr : Char;
begin
Temp := RecoCharASCII[BestNeuron];
TempChr := Temp[1];
if Ord(TempChr) < 128 then
begin
Result := Temp;
end
else begin
Result := '粤';
end;
end;
function GetCharByCharImg(SrcCharImg : TGrayImg;
CharType : Integer; var No : string) :
Boolean;
var
ARTNET : TARTNET;
TempImg : TGrayImg;
CharASCII : Byte;
begin
if SrcCharImg.Width / SrcCharImg.Height < 0.2 then
begin
No := '1';
Result := True;
Exit;
end;
if not Zoom(SrcCharImg, 15, 30,TempImg) then
begin
Result := False;
Exit;
end;
ARTNET := TARTNET.Create;
ARTNET.InitARTNET(0.8);
if not ARTNET.Run(TempImg, No) then
begin
Result := False;
Exit;
end;
Result := True;
end;
end.