Imago OCRの䟋を䜿甚した構造情報の光孊認識システムの構築

このメモでは、画像凊理で䜿甚されるアルゎリズムずOpenCVラむブラリのフレヌムワヌクでの実装に基づいお、構造情報の光孊認識システムを構築する方法に぀いお説明したす。 システムの説明の背埌には、 化孊構造の認識に盎接圹立぀可胜性のある積極的に開発されおいるオヌプン゜ヌスプロゞェクトImago OCRがありたすが、この蚘事では化孊に぀いおは觊れたせんが、より䞀般的な問題に觊れ、その解決策はさたざたな皮類の構造化された情報、䟋えばテヌブルの認識に圹立ちたすたたはグラフィックス。



認識゚ンゞンの構造



光孊認識システムの゚ンゞンの構造を衚瀺するための最も䞀般的なオプションの1぀は次のずおりです。



埓来、凊理方法は3぀のレベルに分類できたす。

  • ラスタヌレベル䞀連の画像ピクセルを䜿甚;
  • プリミティブのレベルシンボル、線、円など、特定のプリミティブでピクセルのグルヌプを識別したす;
  • 構造レベルプリミティブのグルヌプを論理ナニットに集めたす-「テヌブル」、「テヌブルセル」、「ラベル」など


黒い矢印でデヌタ転送の䞻な方向を瀺したした。画像をロヌドし、凊理に䟿利な圢匏に倉換し、プリミティブを取埗し、プリミティブを構造に敎理し、結果を曞き蟌みたす。



青い矢印は「フィヌドバック」を衚したす -堎合によっおは、特定のレベルでオブゞェクトを認識できなくなりたす少なくずも論理的に蚱容される構造をプリミティブからアセンブルするか、ポむントのセットから少なくずもいく぀かのプリミティブを分離したす。 これは、前のステップの「悪い」元の画像たたぱラヌのいずれかを瀺したす。このような゚ラヌを回避するために、以前の構造レベルで、おそらく他のパラメヌタヌを䜿甚しおオブゞェクトを再床凊理したす。



この段階では、詳现は説明したせんが、これが構造情報の光孊認識システムが「䞀般認識」ず倧きく異なる理由です。必芁な出力構造を理解するこずにより、゚ラヌを修正する機䌚がありたす。 この状況は、特定の認識方法の構築ぞのアプロヌチをわずかに倉曎し、凊理䞭に倉曎され、構造凊理の段階で蚈算できる品質メトリックを持぀いく぀かの蚱容倀に䟝存する適応アルゎリズムを䜜成するこずを可胜にしたす。



ラスタヌレベル画像のダりンロヌド



すばらしいOpenCVラむブラリを䜿甚したため、この手順は可胜な限り簡単です。 OpenCVは、PNG、JPG、BMP、DIB、TIFF、PBM、RAS、EXRなど、倚くの䞀般的なラスタヌ圢匏をロヌドできたす。実際、1行で

cv::Mat mat = cv::imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
      
      





遞択したパラメヌタCV_LOAD_IMAGE_GRAYSCALEを䜿甚するず、ピクセル匷床のマトリックス圢匏で画像をアップロヌドできたすグレヌスケヌルぞの倉換は自動的に行われたす。 䞀郚のタスクでは色情報を䜿甚する必芁がありたすが、私たちのタスクでは必芁ありたせん。これにより、メモリ割り圓おを倧幅に節玄できたす。 「透明な」PNGの読み蟌みを陀くトリックのうち、透明な背景は黒ず解釈されたす。これは、CV_LOAD_IMAGE_UNCHANGEDパラメヌタヌを䜿甚しおダりンロヌドし、BGRA色情報を手動で凊理するこずで簡単に実行できたすはい、OpenCVはこの順序で色デヌタを保存したす。



この段階で、次のようになりたす。

私は故意に「悪い」ずいう画像を遞んで、光孊認識がさらに解決する倚くの困難に関連しおいるこずを瀺したしたが、それは「実生掻」からのものです。



ラスタヌレベル事前フィルタリング



事前フィルタリングの䞻なタスクは、画像の「品質」を改善するこずです。詳现を倱うこずなくノむズを陀去し、コントラストを埩元したす。



グラフィック゚ディタヌで歊装するず、画質を向䞊させる方法に぀いお倚くのトリッキヌなスキヌムを理解できたすが、ここでは、1぀の画像にのみ適甚できる自動フィクションずフィクションずの境界を理解するこずが重芁です。 以䞋に、倚かれ少なかれ自動化されたアプロヌチの䟋を瀺したす。 スパヌスマスク 、 䞭倮倀フィルタヌ 、 グヌグルが奜きな人向け 。



方法を比范し、特定の方法を遞択した理由を瀺したいず思いたすが、実際にはそれは困難です。 さたざたな画像では、特定の方法には長所ず短所があり、平均しおこれ以䞊の解決策はありたせん。したがっお、Imago OCRでは、特定のケヌスで䜿甚できるフィルタヌのスタックを蚭蚈したしたが、結果の遞択は品質メトリックに䟝存したす。



しかし、1぀の興味深い解決策に぀いおお話したいず思いたす Retinex Poisson Equation



この方法の利点は次のずおりです。

  • かなり高速。
  • 結果のパラメヌタヌ化可胜な品質。
  • 䜜業䞭の浞食の欠劂、およびその結果、詳现に察する「感床」。
  • そしお、䞻な興味深い機胜は、照明のロヌカルレベルの正芏化です。


最埌の特性は蚘事の画像で完党に瀺されおおり、撮圱時に物䜓の照明が䞍均䞀になる可胜性があるため、認識にずっお重芁です玙片が光源に向いお光が䞍均䞀に萜ちる





アルゎリズムの衚面蚘述

  • しきい倀Tによるロヌカルしきい倀画像フィルタリング ラプラシアンしきい倀 ;
  • 受信した画像の離散コサむン倉換 。
  • 高呚波特性をフィルタリングし、䜎および䞭呚波数甚の特別な方皋匏Retinex方皋匏を解きたす。
  • 逆離散コサむン倉換。


アルゎリズム自䜓はパラメヌタヌTにかなり敏感ですが、その適応を䜿甚したした。



OpenCVがどのように圹立぀か離散コサむン倉換を蚈算するための既補の関数がありたす。

 void dct(const Mat& src, Mat& dst, int flags=0); // flags = DCT_INVERSE for inverse DCT
      
      





たた、䞀般的なケヌスCore i5、Core Duoでテスト枈みでこれを蚀うこずは想定しおいたせんが、libfftwの同様のものよりも速床は悪くありたせん。



元の画像の堎合、䞊蚘の方法ではかなり良い結果が埗られたす。





これで、事前フィルタリングが䜕をすべきかをおおたかに理解し、フィヌドバックメカニズムで倉曎できるパラメヌタヌが1぀ありたす。それは、䜿甚するフィルタヌのむンデックスです 。



以䞋 実際、もちろん、他にも倚くのパラメヌタヌがありたすたずえば、同じもの、「マゞック」T = 1,2,4,8が、「頭を揺さぶる」こずのないように、ここでは説明したせん。 それらの倚くがあり、それらぞの参照は機械孊習のセクションに衚瀺されたすが、パラメヌタヌの数でプレれンテヌションをオヌバヌロヌドしないように、詳现を省略したす。



ラスタヌレベル二倀化



次のステップでは、黒ず癜の画像を取埗したす。黒は「ペむント」の存圚に察応し、癜はその䞍圚に察応したす。 これは、たずえばオブゞェクトの茪郭を取埗するなど、倚くのアルゎリズムがハヌフトヌンで建蚭的に機胜しないために行われたす。 最も単玔な2倀化方法の1぀はしきい倀フィルタリングですしきい倀ずしおtを遞択し、tより倧きい匷床を持぀すべおのピクセルが背景であり、少ないものは「ペむント」ですが、適応性が䜎いため、 otsuしきい倀たたは適応ガりスしきい倀がより頻繁に䜿甚されたす。



より高床な方法の適応性にもかかわらず、出力情報の「量」を決定するしきい倀が含たれおいたす。 より厳しいしきい倀の堎合-いく぀かの芁玠が倱われる可胜性がありたす;「゜フト」しきい倀の堎合、「ノむズ」が出る可胜性がありたす。

匷力なしきい倀凊理 匱いしきい倀凊理


各画像のしきい倀を正確に掚枬するこずができたすが、別の方法で行った-受信した画像ず異なる適応二倀化しきい倀ずの盞関を䜿甚したした。

  • 䞎えられたしきい倀t1およびt2で匷いおよび匱い2倀化を考慮したす。
  • 画像をピクセルごずの連結された領域のセットに分割したす セグメントのマヌキング 。
  • 察応する匷力なセグメントず盞関関係があり、指定されたcratioよりも小さいすべおの「匱い」セグメントを削陀したす。
  • 䜎密床の「匱い」セグメントをすべお削陀したす黒/癜ピクセルの比率は指定された比率よりも小さい。
  • 残りの「匱い」セグメントは、2倀化の結果です。


その結果、 ほずんどの堎合 、ノむズがなく、詳现な損倱のない画像が埗られたす。



説明した゜リュヌションは、1぀のパラメヌタヌを「取り陀き」、他のパラメヌタヌ党䜓を導入したいずいう事実に照らしお奇劙に芋えるかもしれたせんが、䞻なアむデアは、「実際の」2倀化しきい倀が間隔に収たる堎合、正しい2倀化が保蚌されるこずです私たちが遞択したt1ずt2の間で結論付けられたすこの間隔を「無限に」増やすこずはできたせんが、t1ずt2の差にも制限がありたす。



このアむデアは、さたざたなしきい倀フィルタリング方法ずOpenCVを適甚するず非垞に有効です。OpenCVは、組み蟌みの適応フィルタリング機胜の存圚によっお「支揎」されたす。

 cv::adaptiveThreshold(image, strongBinarized, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, strongBinarizeKernelSize, strongBinarizeTreshold); cv::threshold(image, otsuBinarized, otsuThresholdValue, 255, cv::THRESH_OTSU);
      
      





最終むメヌゞにセグメントがたったく含たれおいない堎合、フィルタリング゚ラヌが発生しおいる可胜性があり、別の予備フィルタヌを怜蚎する䟡倀がありたす「フィヌドバック」;゚ンゞン構造のむメヌゞの「同じ」青い矢印。



プリミティブレベルベクトル化



認識プロセスの次のステップは、ピクセルのセットセグメントをプリミティブに倉換するこずです。 プリミティブは、円、セグメントのセット、長方圢特定のプリミティブのセットは解決する問題によっお異なりたす、たたはシンボルです。



各オブゞェクトがどのクラスに属しおいるかはわかりたせんが、さたざたな方法でベクトル化しようずしおいたす。 同じピクセルのセットを、セグメントのセットずしお、およびシンボルたずえば、「N」、「I」の䞡方ずしお正垞にベクトル化できたす。 たたは、円ず蚘号は「O」です。 この段階では、オブゞェクトがどのクラスを持っおいるかを確実に知る必芁はありたせんが、特定のクラスでのベクトル化ずオブゞェクトの類䌌性の特定のメトリックが必芁です。 これは通垞、䞀連の認識機胜によっお解決されたす。



たずえば、ピクセルのセットの堎合 次のオブゞェクトのセットを取埗したすメトリックの特定の数に぀いおは考えないでください。これらは認識プロセスに必芁なものを衚すために䞎えられたすが、それ自䜓はただ意味をなしたせん。

  • 0.1のメトリック距離倀を持぀「H」蚘号の圢匏のベクトル化これは正確にHである可胜性がありたす 。
  • 4.93のメトリック倀を持぀シンボル「R」の圢匏でのベクトル化可胜性は䜎いですが、これもRである可胜性がありたす 。
  • 3぀のセグメント 「|」、「-」、「|」 の圢匏でのベクトル化 メトリック倀が0.12の堎合これらが3぀のセグメントである可胜性がありたす 。
  • 45.4のメトリック倀を持぀蟺x、yの寞法を持぀長方圢ずしおのベクトル化たったく長方圢ではない 。
  • メトリック倀+ infの円ずしおのベクトル化保蚌は円ではありたせん ;
  • ...


ベクトル化のリストを取埗するには、特定のクラスごずに認識プリミティブを実装する必芁がありたす。



セグメントセットの認識


通垞、ラスタ領域は次のように䞀連のセグメントにベクトル化されたす。

  • 間匕きフィルタヌの実行 -> ;
  • セグメンテヌションデコルナ ;
  • 各セグメントのポむントの近䌌 ;
  • 結果は、近䌌のセットず、元の近䌌からの偏差です 。


OpenCVには既補の間匕きフィルタヌはありたせんが、実装するこずはたったく難しくありたせん 。 セグメンテヌションdecornerもありたすが、これは完党に些现なこずです。3぀以䞊の近傍がある領域からすべおのポむントを砎棄したす。 しかし、OpenCVの䞀連のセグメントずしおのポむントの近䌌が存圚するため、それを䜿甚したした。

 cv::approxPolyDP(curve, approxCurve, approxEps, closed); // approximation of curve -> approxCurve
      
      





重芁なパラメヌタヌは近䌌蚱容誀差近䌌Eps であり、増加するず結果ずしおより倚くのセグメントが埗られ、枛少するず-粗い近䌌ずなり、結果ずしおメトリック倀が倧きくなりたす。 正しい遞択方法は 



たず、平均線の倪さに匷く䟝存したす盎感的に-線の倪さが倧きいほど、现郚は少なくなりたす。シャヌプペンシルで描かれた図面は、マヌカヌで描かれた図面よりもはるかに詳现になりたす。

 approxEps = averageLineThickness * magicLineVectorizationFactor;
      
      





第二に、オブゞェクトの分類に察する䞊蚘のアプロヌチを考慮しお、異なるapproiceEpsを持぀セグメントを特定のステップでベクトル化し、論理構造を分析する段階で「より適切な」を遞択するこずができたす。



サヌクル認識


ずおも簡単です

  • 円の䞭心を探しおいたすポむントの座暙の平均-x、y;
  • 半埄䞭心からのポむントの平均距離-rを探しおいたす。
  • ゚ラヌを考慮したす䞭心x、yず半埄rおよび厚さaverageLineThicknessを持぀円ぞのポむントによる平均距離。
  • サヌクルブレヌクに远加のペナルティを怜蚎したすmagicCirclePenalty *ブレヌクの。


magicCirclePenaltyを遞択した埌、このコヌド、およびそれに類䌌した長方圢の認識にたったく問題はありたせんでした。



文字認識


はるかに興味深い郚分ずしお、 これは挑戊的な問題です-「最適な」認識指暙であるず䞻匵する単䞀のアルゎリズムはありたせん。 ヒュヌリスティックに基づく非垞に単玔な方法がありたす。たずえば、 ニュヌラルネットワヌクを䜿甚するなど、より耇雑な方法もありたすが、「良い」認識品質を保蚌するものはありたせん。



したがっお、文字認識のいく぀かのサブシステムを䜿甚する決定ず集蚈結果の遞択は非垞に自然に芋えたしたp1 =アルゎリズム1によっお領域Aがシンボルsずしお認識され、p2 =アルゎリズム2が領域Aをシンボルsずしお認識するメトリック倀の堎合、最終倀p = fp1、p2。 䟿利で匹敵する倀、高速、十分な安定性を備えた2぀のアルゎリズムを遞択したした。

  • フヌリ゚蚘述子に基づく認識;
  • ポむントの二次偏差のマスク。


フヌリ゚蚘述子に基づく文字認識


準備

  • オブゞェクトの倖郚茪郭の取埗。
  • 茪郭点x; yの座暙の耇玠数x + iyぞの倉換。
  • これらの数倀のセットの離散フヌリ゚倉換。
  • スペクトルの高呚波郚分の陀去。


逆フヌリ゚倉換を実行するず、䞎えられた近䌌床Nは残っおいる係数の数で元の図を蚘述する点のセットを取埗したす。





「認識」操䜜は、認識された領域のフヌリ゚蚘述子を蚈算し、それらをサポヌトされる文字に察応する事前定矩されたセットず比范するこずで構成されたす。 2組の蚘述子からメトリック倀を取埗するには、畳み蟌みず呌ばれる操䜜を実行する必芁がありたす。d= sumd1 [i] -d2 [i]* w [i]、i = 1、N、d1およびd2は蚘述子のセットですフヌリ゚。wは各係数の重みベクトルです機械孊習で取埗したした。 コンボリュヌション倀は、比范されるシンボルのスケヌルに関しお䞍倉です。 さらに、この関数は高呚波ノむズ図の「ゞオメトリ」を倉曎しないランダムピクセルに耐性がありたす。



OpenCVは、このメ゜ッドの実装に非垞に圹立ちたす。 オブゞェクトの倖郚茪郭を取埗するための既補の関数がありたす。

 cv::findContours(image, storage, CV_RETR_EXTERNAL);
      
      





そしお、離散フヌリ゚倉換を蚈算する関数がありたす

 cv::dft(src, dst);
      
      





畳み蟌みおよび䞭間型倉換を実装するためだけに残り、蚘述子のセットを保存したす。



この方法は手曞き文字には適しおいたすがおそらく他の䞀郚は高品質な結果が埗られないため、画像党䜓に察しお高呚波ノむズ、぀たり「䜙分な」ピクセルが倧きくなるため、䜎解像床の文字にはあたり適しおいたせん。砎棄しない芁玠に圱響を䞎え始めたす。 比范する係数の数を枛らすこずはできたすが、同じような小さな文字を遞択するこずは難しくなりたす。 そしお、別の認識方法が導入されたした。



二次偏差マスクに基づく文字認識


これは非垞に盎感的な゜リュヌションであり、刀明したように、あらゆる解像床の印刷文字に最適です。 同じ解像床の2぀の癜黒画像がある堎合、それらをピクセルごずに比范するこずを孊ぶこずができたす。



画像1の各ポむントに぀いお、ペナルティが考慮されたす。同じ色の画像2のポむントたでの最小距離です。 したがっお、メトリックは単玔に眰金ず正芏化係数の合蚈です。 この方法は、ノむズのある小さな解像床の画像ではるかに安定したす。蟺の長さがnの画像の堎合、最倧ピクセルのkパヌセントたでの個々のピクセルは、最悪の堎合k * nを超えたせん。ほずんどの堎合、画像の「正しい」ピクセルに隣接しおいるためです。



私が説明したように、この方法の欠点は䜎速です。 各ピクセルOn 2 に぀いお、別の画像On 2 の同じ色のピクセルたでの最小距離を考慮したす。これにより、On 4 が埗られたす。



しかし、これは事前蚈算によっお非垞に簡単に凊理できたす。ペナルティ_ホワむトx、yずペナルティ_ブラックx、yの2぀のマスクを䜜成したす。蚈算された眰金は、それぞれ癜たたは黒のピクセルx、yに察しお保存されたす。 次に、「認識」のプロセス぀たり、メトリックの蚈算はOn 2 に適合したす。

 for (int y = 0; y < img.cols; y++) { for (int x = 0; x < img.rows; x++) { penalty += (image(y,x) == BLACK) ? penalty_black(y,x) : penalty_white(y,x); } }
      
      





各文字のスペルごずにマスクpenalty_white、penalty_blackを保存し、認識プロセスでそれらを゜ヌトするだけです。 OpenCVはこのアルゎリズムの実装にほずんど圹立ちたせんが、簡単です。 しかし、私が蚀ったように、比范される画像は同じ解像床でなければならないので、䞀方をもう䞀方に持っおくるには、関数が必芁かもしれたせん

 cv::resize(temp, temp, cv::Size(size_x, size_y), 0.0, 0.0);
      
      





文字認識の䞀般的なプロセスに戻るず、䞡方のメ゜ッドを実行した結果、メトリック倀のテヌブルが取埗されたす。



認識倀は1぀の芁玠ではなく、最も高い確率でシンボル「C」であるこずがわかっおいるテヌブル党䜓ですが、「0」たたは「6」たたは「O」たたは「c」である可胜性がありたす。画面に収たりたせんでした。 そしお、これがブラケットの堎合、閉じるより開く可胜性が高くなりたす。 しかし、今のずころ、これがシンボルであるかどうかさえわかりたせん...



プリミティブレベル分離



超生産的な量子コンピュヌタヌの理想的な䞖界に䜏んでいたなら、おそらくこのステップは必芁ないでしょういく぀かのオブゞェクトのセットがあり、それぞれに正確にそれが䜕であるかを決定する「確率」の衚がありたす。 各オブゞェクトのテヌブル内のすべおの芁玠を䞊べ替え、論理構造を構築し、有効なオブゞェクトから最も可胜性の高いもの個々のオブゞェクトのメトリックの合蚈によるを遞択したす。 おそらくアルゎリズムの指数関数的な耇雑さを陀いお、ビゞネス。



ただし、実際には、通垞、デフォルトでオブゞェクトのタむプを刀別する必芁がありたす。 ぀たり、画像内のオブゞェクトの既補の解釈を遞択するために、わずかに倉曎するこずが可胜です。 前のステップベクトル化でオブゞェクトのタむプを遞択できなかったのはなぜですか すべおのオブゞェクトに関する十分な統蚈情報がありたせんでした。画像党䜓から特定のピクセルセットを分離しお解釈するず、その意味を確実に刀断するこずが問題になりたす。



これは、構造情報を認識する䞊で最も重芁な問題の1぀です。 圌は単にピクセルを個別に芋る方法を知らないので、これを持っおいる人にずっおは車よりもはるかに優れおいたす。 そしお、OCRシステムを構築する際の倱望の初期段階の1぀は、䞀芋人間的なアプロヌチを「段階的に」アルゎリズム化し、䞍満足な結果を埗る詊みです。 珟時点では、プリミティブの認識アルゎリズムを少し改善しお「誀解」しないようにする䟡倀があり、より良い結果が埗られるようですが、垞に論理を「砎る」写真がいく぀かありたす。



そしお、私たちはそれが䜕であるかを人に尋ねたす-

もちろん、これは単なる曲線です。 しかし、シンボルたたは盎線セグメントのセットずしおランク付けする必芁がある堎合、それは䜕ですか 次に、これはほずんどの堎合、文字「l」たたは斜めの2本の盎線のいずれかです角だけが䞞く描かれたす。 しかし、正しい解釈を遞択する方法は 前のステップのマシンは、おおよその問題を解決し、1/2の確率で正しく解決するこずもできたす。 しかし、1/2は構造情報の認識システムの完党な厩壊であり、構造を台無しにしおしたいたす。怜蚌に合栌したせん。「゚ラヌ」を修正する必芁がありたす。 .



, :



, - (, ). , , , « » — .



:



, , «» , , . , , , — . , «Cl» () , , - «l».



. .



:

  • «» ( ), C, .


, .



:



, — , , — " ".



, : ( __-1 __+2, 3*__ 0.5* ), . , .



. — . , , - ( ). «» ( — , «l» , «l». , ).



:

  • ;
  • , ;
  • : , .


« » — .



, , .







. , .



, Imago OCR , , ( ), . , . , . , .





, . , — , «» «», :



, «» , :



— . , , , , .



:



— (, ). , , , — ( , — ).



, . , «» ( ), «». , , — «» .





, «» . , — .

« » :

( baseline_y), , — . baseline_y :

  • ( );
  • y , .


, ( )? ; , , , « ». baseline_y , — .



, . :

  • % , ;
  • .


: 30% — . 29? duck test. - , — . , - .



? , . . ( , ?). . , :

  • k% , f(k) ;
  • n% , , a..z g(n) .


, — , . «» .





— . — : — , , — . .



: {c1, c2}

c1 — «Y» 0.1 «X» 0.4;

c2 — «c» 0.3 «e» 0.8

, — Yc . Yc . . — .

4 , " Xe ", 1.2.



, . , «Yc» , . , (1.2) (0.4), (0.8). , , . ?





, , ? , , ?



— , . , , .



, — , . , . .



, , , , , , ; ( ) . , , — .



結論の代わりに



« » OCR , . , , , , . .



, , open-source Imago OCR , google .



All Articles