// Constructor is private. Only anticipated use of ErrorCounter is via // the static ComputeErrorRate. ErrorCounter::ErrorCounter(const UNICHARSET& unicharset, int fontsize) : scaled_error_(0.0), rating_epsilon_(kRatingEpsilon), unichar_counts_(unicharset.size(), unicharset.size(), 0), ok_score_hist_(0, 101), bad_score_hist_(0, 101), unicharset_(unicharset) { Counts empty_counts; font_counts_.init_to_size(fontsize, empty_counts); multi_unichar_counts_.init_to_size(unicharset.size(), 0); }
// Helper to set the properties for an input unicharset file, writes to the // output file. If an appropriate script unicharset can be found in the // script_dir directory, then the tops and bottoms are expanded using the // script unicharset. // If non-empty, xheight data for the fonts are written to the xheights_file. void SetPropertiesForInputFile(const std::string& script_dir, const std::string& input_unicharset_file, const std::string& output_unicharset_file, const std::string& output_xheights_file) { UNICHARSET unicharset; // Load the input unicharset unicharset.load_from_file(input_unicharset_file.c_str()); tprintf("Loaded unicharset of size %d from file %s\n", unicharset.size(), input_unicharset_file.c_str()); // Set unichar properties tprintf("Setting unichar properties\n"); SetupBasicProperties(true, false, &unicharset); tprintf("Setting script properties\n"); SetScriptProperties(script_dir, &unicharset); if (!output_xheights_file.empty()) { std::string xheights_str = GetXheightString(script_dir, unicharset); File::WriteStringToFileOrDie(xheights_str, output_xheights_file); } // Write the output unicharset tprintf("Writing unicharset to file %s\n", output_unicharset_file.c_str()); unicharset.save_to_file(output_unicharset_file.c_str()); }
// Helper to set the properties for an input unicharset file, writes to the // output file. If an appropriate script unicharset can be found in the // script_dir directory, then the tops and bottoms are expanded using the // script unicharset. // If non-empty, xheight data for the fonts are written to the xheights_file. void SetPropertiesForInputFile(const string& script_dir, const string& input_unicharset_file, const string& output_unicharset_file, const string& output_xheights_file) { UNICHARSET unicharset; // Load the input unicharset unicharset.load_from_file(input_unicharset_file.c_str()); tprintf("Loaded unicharset of size %d from file %s\n", unicharset.size(), input_unicharset_file.c_str()); // Set unichar properties tprintf("Setting unichar properties\n"); SetupBasicProperties(true, false, &unicharset); string xheights_str; for (int s = 0; s < unicharset.get_script_table_size(); ++s) { // Load the unicharset for the script if available. string filename = script_dir + "/" + unicharset.get_script_from_script_id(s) + ".unicharset"; UNICHARSET script_set; if (script_set.load_from_file(filename.c_str())) { unicharset.SetPropertiesFromOther(script_set); } // Load the xheights for the script if available. filename = script_dir + "/" + unicharset.get_script_from_script_id(s) + ".xheights"; string script_heights; if (File::ReadFileToString(filename, &script_heights)) xheights_str += script_heights; } if (!output_xheights_file.empty()) File::WriteStringToFileOrDie(xheights_str, output_xheights_file); for (int c = SPECIAL_UNICHAR_CODES_COUNT; c < unicharset.size(); ++c) { if (unicharset.PropertiesIncomplete(c)) { tprintf("Warning: properties incomplete for index %d = %s\n", c, unicharset.id_to_unichar(c)); } } // Write the output unicharset tprintf("Writing unicharset to file %s\n", output_unicharset_file.c_str()); unicharset.save_to_file(output_unicharset_file.c_str()); }
int main(int argc, char** argv) { // Sets properties on the input unicharset file, and writes: // rootdir/lang/lang.charset_size=ddd.txt // rootdir/lang/lang.traineddata // rootdir/lang/lang.unicharset // If the 3 word lists are provided, the dawgs are also added // to the traineddata file. // The output unicharset and charset_size files are just for // human readability. tesseract::CheckSharedLibraryVersion(); tesseract::ParseCommandLineFlags(argv[0], &argc, &argv, true); GenericVector<STRING> words, puncs, numbers; // If these reads fail, we get a warning message and an empty list of words. tesseract::ReadFile(FLAGS_words.c_str(), nullptr).split('\n', &words); tesseract::ReadFile(FLAGS_puncs.c_str(), nullptr).split('\n', &puncs); tesseract::ReadFile(FLAGS_numbers.c_str(), nullptr).split('\n', &numbers); // Load the input unicharset UNICHARSET unicharset; if (!unicharset.load_from_file(FLAGS_input_unicharset.c_str(), false)) { tprintf("Failed to load unicharset from %s\n", FLAGS_input_unicharset.c_str()); return 1; } tprintf("Loaded unicharset of size %d from file %s\n", unicharset.size(), FLAGS_input_unicharset.c_str()); // Set unichar properties tprintf("Setting unichar properties\n"); tesseract::SetupBasicProperties(/*report_errors*/ true, /*decompose (NFD)*/ false, &unicharset); tprintf("Setting script properties\n"); tesseract::SetScriptProperties(FLAGS_script_dir.c_str(), &unicharset); // Combine everything into a traineddata file. return tesseract::CombineLangModel( unicharset, FLAGS_script_dir.c_str(), FLAGS_version_str.c_str(), FLAGS_output_dir.c_str(), FLAGS_lang.c_str(), FLAGS_pass_through_recoder, words, puncs, numbers, FLAGS_lang_is_rtl, /*reader*/ nullptr, /*writer*/ nullptr); }