tesseract/ccmain/callnet.cpp
2007-03-07 20:03:40 +00:00

94 lines
2.6 KiB
C++

/**********************************************************************
* File: callnet.cpp (Formerly callnet.c)
* Description: Interface to Neural Net matcher
* Author: Phil Cheatle
* Created: Wed Nov 18 10:35:00 GMT 1992
*
* (C) Copyright 1992, Hewlett-Packard Ltd.
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
** http://www.apache.org/licenses/LICENSE-2.0
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*
**********************************************************************/
#include "mfcpch.h"
#include "errcode.h"
//#include "nmatch.h"
#include "globals.h"
#define OUTPUT_NODES 94
const ERRCODE NETINIT = "NN init error";
//extern "C"
//{
//extern char* demodir; /* where program lives */
void init_net() { /* Initialise net */
#ifdef ASPIRIN_INCLUDED
char wts_filename[256];
if (nmatch_init_network () != 0) {
NETINIT.error ("Init_net", EXIT, "Errcode %s", nmatch_error_string ());
}
strcpy(wts_filename, demodir);
strcat (wts_filename, "tessdata/netwts");
if (nmatch_load_network (wts_filename) != 0) {
NETINIT.error ("Init_net", EXIT, "Weights failed, Errcode %s",
nmatch_error_string ());
}
#endif
}
void callnet( /* Apply image to net */
float *input_vector,
char *top,
float *top_score,
char *next,
float *next_score) {
#ifdef ASPIRIN_INCLUDED
float *output_vector;
int i;
int max_out_i = 0;
int next_max_out_i = 0;
float max_out = -9;
float next_max_out = -9;
nmatch_set_input(input_vector);
nmatch_propagate_forward();
output_vector = nmatch_get_output ();
/* Now find top two choices */
for (i = 0; i < OUTPUT_NODES; i++) {
if (output_vector[i] > max_out) {
next_max_out = max_out;
max_out = output_vector[i];
next_max_out_i = max_out_i;
max_out_i = i;
}
else {
if (output_vector[i] > next_max_out) {
next_max_out = output_vector[i];
next_max_out_i = i;
}
}
}
*top = max_out_i + '!';
*next = next_max_out_i + '!';
*top_score = max_out;
*next_score = next_max_out;
#endif
}
//};