@@ -68,10 +68,24 @@ LSTMRecognizer::~LSTMRecognizer() {
68
68
delete search_;
69
69
}
70
70
71
+ // Loads a model from mgr, including the dictionary only if lang is not null.
72
+ bool LSTMRecognizer::Load (const char * lang, TessdataManager* mgr) {
73
+ TFile fp;
74
+ if (!mgr->GetComponent (TESSDATA_LSTM, &fp)) return false ;
75
+ if (!DeSerialize (mgr, &fp)) return false ;
76
+ if (lang == nullptr ) return true ;
77
+ // Allow it to run without a dictionary.
78
+ LoadDictionary (lang, mgr);
79
+ return true ;
80
+ }
81
+
71
82
// Writes to the given file. Returns false in case of error.
72
- bool LSTMRecognizer::Serialize (TFile* fp) const {
83
+ bool LSTMRecognizer::Serialize (const TessdataManager* mgr, TFile* fp) const {
84
+ bool include_charsets = mgr == nullptr ||
85
+ !mgr->IsComponentAvailable (TESSDATA_LSTM_RECODER) ||
86
+ !mgr->IsComponentAvailable (TESSDATA_LSTM_UNICHARSET);
73
87
if (!network_->Serialize (fp)) return false ;
74
- if (!GetUnicharset ().save_to_file (fp)) return false ;
88
+ if (include_charsets && !GetUnicharset ().save_to_file (fp)) return false ;
75
89
if (!network_str_.Serialize (fp)) return false ;
76
90
if (fp->FWrite (&training_flags_, sizeof (training_flags_), 1 ) != 1 )
77
91
return false ;
@@ -83,16 +97,20 @@ bool LSTMRecognizer::Serialize(TFile* fp) const {
83
97
if (fp->FWrite (&weight_range_, sizeof (weight_range_), 1 ) != 1 ) return false ;
84
98
if (fp->FWrite (&learning_rate_, sizeof (learning_rate_), 1 ) != 1 ) return false ;
85
99
if (fp->FWrite (&momentum_, sizeof (momentum_), 1 ) != 1 ) return false ;
86
- if (IsRecoding () && !recoder_.Serialize (fp)) return false ;
100
+ if (include_charsets && IsRecoding () && !recoder_.Serialize (fp)) return false ;
87
101
return true ;
88
102
}
89
103
90
104
// Reads from the given file. Returns false in case of error.
91
- bool LSTMRecognizer::DeSerialize (TFile* fp) {
105
+ bool LSTMRecognizer::DeSerialize (const TessdataManager* mgr, TFile* fp) {
92
106
delete network_;
93
107
network_ = Network::CreateFromFile (fp);
94
108
if (network_ == NULL ) return false ;
95
- if (!ccutil_.unicharset .load_from_file (fp, false )) return false ;
109
+ bool include_charsets = mgr == nullptr ||
110
+ !mgr->IsComponentAvailable (TESSDATA_LSTM_RECODER) ||
111
+ !mgr->IsComponentAvailable (TESSDATA_LSTM_UNICHARSET);
112
+ if (include_charsets && !ccutil_.unicharset .load_from_file (fp, false ))
113
+ return false ;
96
114
if (!network_str_.DeSerialize (fp)) return false ;
97
115
if (fp->FReadEndian (&training_flags_, sizeof (training_flags_), 1 ) != 1 )
98
116
return false ;
@@ -107,6 +125,25 @@ bool LSTMRecognizer::DeSerialize(TFile* fp) {
107
125
if (fp->FReadEndian (&learning_rate_, sizeof (learning_rate_), 1 ) != 1 )
108
126
return false ;
109
127
if (fp->FReadEndian (&momentum_, sizeof (momentum_), 1 ) != 1 ) return false ;
128
+ if (include_charsets && !LoadRecoder (fp)) return false ;
129
+ if (!include_charsets && !LoadCharsets (mgr)) return false ;
130
+ network_->SetRandomizer (&randomizer_);
131
+ network_->CacheXScaleFactor (network_->XScaleFactor ());
132
+ return true ;
133
+ }
134
+
135
+ // Loads the charsets from mgr.
136
+ bool LSTMRecognizer::LoadCharsets (const TessdataManager* mgr) {
137
+ TFile fp;
138
+ if (!mgr->GetComponent (TESSDATA_LSTM_UNICHARSET, &fp)) return false ;
139
+ if (!ccutil_.unicharset .load_from_file (&fp, false )) return false ;
140
+ if (!mgr->GetComponent (TESSDATA_LSTM_RECODER, &fp)) return false ;
141
+ if (!LoadRecoder (&fp)) return false ;
142
+ return true ;
143
+ }
144
+
145
+ // Loads the Recoder.
146
+ bool LSTMRecognizer::LoadRecoder (TFile* fp) {
110
147
if (IsRecoding ()) {
111
148
if (!recoder_.DeSerialize (fp)) return false ;
112
149
RecodedCharID code;
@@ -119,8 +156,6 @@ bool LSTMRecognizer::DeSerialize(TFile* fp) {
119
156
recoder_.SetupPassThrough (GetUnicharset ());
120
157
training_flags_ |= TF_COMPRESS_UNICHARSET;
121
158
}
122
- network_->SetRandomizer (&randomizer_);
123
- network_->CacheXScaleFactor (network_->XScaleFactor ());
124
159
return true ;
125
160
}
126
161
0 commit comments