ichou1のブログ

主に音声認識、時々、データ分析のことを書く

OpenCVメモ(文字の検出と認識その3)

前回の続き。

「recognition」モジュールの1つ、「HMM(Hidden Markov Models)」を使ったDecodeを試してみる。

Decoder生成

アルファベット小文字、アルファベット大文字、数字の「62」個を認識ターゲットとする。
モデル、遷移確率は学習済みのものを使う。

// Trained models
auto classifier = cv::text::loadOCRHMMClassifierNM("OCRHMM_knn_model_data.xml.gz");

// Vocabulary
std::string voc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

// Trained transition probabilities
Mat transitions_prob;
FileStorage fs("assets/OCRHMM_transitions_table.xml", FileStorage::READ);
fs["transition_probabilities"] >> transitions_prob;
fs.release();

// Emission probabilities. Identity matrix.
cv::Mat emission_prob = cv::Mat::eye(62, 62, CV_64FC1);

auto ocr = OCRHMMDecoder::create(classifier,
                                 voc,
                                 transitions_prob,
                                 emission_prob,
                                 OCR_DECODER_VITERBI);

学習済みKNNモデル(XML)は、「cv::text::loadOCRHMMClassifierNM( )」で読み込む。

モデル(OCRHMM_knn_model_data.xml.gz)のパラメータ要素数は以下のとおり。

hus   : 7192row x 200col
label : 7192row x 1col
  • 認識ターゲットとなる「62」個の各文字に対して、116個ずつの特徴ベクトル(feature vector
  • 特徴ベクトルは「200次元」で表現
  • ラベルは「0」から「61」まで(先頭と末尾に「-1」が1つずつ)

サンプルとして提供されている画像を使って認識させてみる。
opencv_contrib/modules/text/samples at master · opencv/opencv_contrib · GitHub

(Case A) scenetext_segmented_word03_mask.png(サイズ640x480)

https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/scenetext_segmented_word03_mask.png?raw=true

# topleft(0, 0)
private (confidence : 5.1946e-09)

# topleft(372, 0)
Hire (confidence : 4.29457e-07)
(Case B) scenetext_segmented_word04_mask.png(サイズ640x480)

https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/scenetext_segmented_word04_mask.png?raw=true

FOSTERS (confidences : 5.12486e-13)
(Case C) scenetext_segmented_word02_mask.png(サイズ640x480)

https://github.com/opencv/opencv_contrib/blob/master/modules/text/samples/scenetext_segmented_word02_mask.png?raw=true

# topleft(0, 0)
ununisununinunununnuntilununalununununununtuninninnunonunununununinununununenunununununnurunmunnynunununununnununinununn
 (confidence : 0)

# topleft(447, 0)
BUnununinnoumununuxinuniminununininn (confidence : 0)