OpenCVメモ(文字の検出と認識その3)
前回の続き。
「recognition」モジュールの1つ、「HMM(Hidden Markov Models)」を使ったDecodeを試してみる。
Class Reference
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)
# topleft(0, 0) private (confidence : 5.1946e-09) # topleft(372, 0) Hire (confidence : 4.29457e-07)
(Case C) scenetext_segmented_word02_mask.png(サイズ640x480)
# topleft(0, 0) ununisununinunununnuntilununalununununununtuninninnunonunununununinununununenunununununnurunmunnynunununununnununinununn (confidence : 0) # topleft(447, 0) BUnununinnoumununuxinuniminununininn (confidence : 0)