ichou1のブログ

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

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

前回の続き。

「recognition」モジュールを見てみる。
いくつか種類がある。

  • OCR using Beam Search algorithm.
  • OCR using HMM(Hidden Markov Models)
  • tesseract-ocr API

今回は「BeamSearch」を使ったDecodeを試してみる。

Decoder生成

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

// Trained models
auto classifier = cv::text::loadOCRBeamSearchClassifierCNN("OCRBeamSearch_CNN_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);

// Size of the beam in Beam Search algorithm.
int beam_size = 50;

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

第1引数のclassifierはCNNを使っている模様。

The character classifier consists in a Single Layer Convolutional Neural Network and a linear classifier.
It is applied to the input image in a sliding window fashion, providing a set of recognitions at each window location.

各パラメータ要素数は以下のとおり。

kernel      :  118row x   64col
M           :    1row x   64col
P           :   64row x   64col
weight      : 1062row x   62col
feature_min :    1row x 1062col
feature_max :    1row x 1062col

サンプルとして提供されている画像(サイズ242x102)のテキストを認識させてみる。
https://raw.githubusercontent.com/opencv/opencv_contrib/master/modules/text/samples/scenetext_word02.jpg

Mat cropImage = imread("scenetext_word02.jpg");

ocr->run(cropImage,         // Input binary image
         text,              // output_text
         &boxes,            // component_rects
         &words,            // component_texts 
         &confidences,      // component_confidences
         OCR_LEVEL_WORD);   // component_level

認識結果。

HERE (confidence : 0.0287784)

自分で用意した画像を認識させてみる

元画像(サイズ16 x 42)

f:id:ichou1:20190503124211p:plain

uly (confidence : 0.0118966)
横方向に拡大した画像(サイズ16 x 75)

f:id:ichou1:20190503124400p:plain

LLICH (confidence : 0.0231771)
さらに、横方向に拡大した画像(サイズ16 x 100)

f:id:ichou1:20190503124524p:plain

LLICHI (confidence : 0.0241128)