真面目系クズのじんせい

真面目系クズ(自称)です。趣味とか、勉強とかを書いていきます。

 前回に続いて、tesseract-ocrを使ってみました。正直、こういうのの導入ってくっっっっっっっっそめんどいイメージだったのですが、インストールは爆速で終わりました。(OpenCV導入するだけで、死にかけた系のかわいそうな人)

 

 それでは本題。特に環境変数とか変わってる感じがなかったのでコマンドライン上でカレントディレクトリを変更します。

(内心:あれ、インストール設定間違えた!?ほかのHPではインストール後、コマンドライン上で「tesseract」と入力するだけでいいってあったのに!)

 

 本HPは敢えて無駄な記述や表現を多数することを目的としているので、最初から行きます。

 

tesseract-ocrの実行方法
 1, 「Windows」key → 検索ウインドウ「cmd」と入力して「Enter」key(コマンドプロンプト)

 2, tesseract-ocrのインストールフォルダにカレントディレクトリを変更。
 「dir(フォルダ内表示)」とか「cd(階層移動)」とかしまくると到達できます。

 3, 「tesseract.exe」と入力し「Enter」key

tesseract-7

  ※ 上記みたいに、ヘルプやらなんやらが表示されればOKみたいです。

 

 4, ペイントで適当な画像を作って、tesseract-ocrのインストールフォルダにぶち込む
 (pngでもtiffでも結果は変わりませんでした)

tesseract-yomitori-1-2
tesseract-yomitori-2

 5, 「tesseract.exe XXX.png(tiff) YYY -l jpn」(XXX, YYYは任意)で実行する。

 6, YYY.txtとして、tesseract-ocrインストールフォルダに結果が出てくる。

tesseract-10
tesseract-result-2



 

 上記の識字率が驚異的だったため、「理想的環境じゃなくてもいける!!」と、スキャン文章にOCRをかけてみたけど、もう見れたもんじゃなかった。その後、スキャン文章から学習データを作成してOCRしてみたけど、BOXファイルの編集が概念すぎてやってられなかった上に、識字率も悪かった。

 

 BOXファイルの生成をなんとかできればうまく学習できると思うので、 次回は学習データの作成というタイトルで記事を作ってみようかな。

 

 BOXファイルの生成で使う予定のソフトウェアはこれです。文字位置を確認しながらの手編集は、つらいのでやめたほうがよいです。

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

 時代の波には乗れていないのかもしれないが、いまさらtesseract-ocrを使ってみました。本当はいろいろなものを試してみたい感はあるのですが、google先生以上のものはないと信じて、tesseract-ocrでいってみます。

 

 とりあえず、tesseract-ocrをダウンロード。

github.com

 

 Makeとかそういうのは、ちょっとぼくにははやすぎるんで、以下の方法でWindows環境の実行ファイルを取得しました。

tessera-ocrのダウンロード
  1. 上記リンク先から、Installing Tesseract項 「Install Tesseract via pre-built binary package」 をクリック
  2. Windows項 「Tesseract at UB Mannheim」 をクリック
  3. Tesseract at UB Mannheim項 「tesseract-ocr-setup-4.00.00dev.exe」をクリック
 
 その他ホームページを参考にしたら、日本語学習データを取得しよう!と記述されていたのですが、インストーラなら学習データも一緒に取得できるみたいです。一応、日本語の学習データは下記にありました。
 
日本語学習データのダウンロード
  1. (上記手順2から)Windows項 「download the appropriate training data」をクリック
  2. Data Files for Version 4.00項 「jpn.traineddata」をダウンロード

 日本語版ならjpn, 英語版ならeng,はっきりわかんだね。engはオプション設定しなくてもプリインストールされていました。

 

 折角、ブログというものに書いているので、ブログの練習がてら、手順を画像で添付してみます!

 

Ver.4.00のインストール方法

1, NEXT!

f:id:atwgwu:20170509201225p:plain

 

2, 「I accept the terms of the License Agreement」をチェックして、やはりNEXT!

f:id:atwgwu:20170509201314p:plain

 

3, NEXT!!!

f:id:atwgwu:20170509201412p:plain

 

4, 「Additional language data」チェックボックスで「japanese」を選びNEXT!

f:id:atwgwu:20170509201503p:plain

 

5, インストールしたい場所を選ぶとよいよ。NEXT!

f:id:atwgwu:20170509201627p:plain

 

6, Install!

f:id:atwgwu:20170509201755p:plain

 

 長くなりすぎるのもあれなんで、次の記事で簡単に認識してみます。

 初めまして。へいです。思うところがあり、はてなブログから移転してきました。よろしくお願いいたします。

 玄人プログラマーからしたら当たり前のことなのかもしれないが、私のような駆け出しプログラマーのために残すという意味合いと、自分自身のメモのために残します。

 

 今回取り掛かった問題はXMLとXSLについてです。問題としても単純明快で、「XSLを使ってXMLを表示させる」というものです。

 例えば、以下の単純なXML文章があったとする。
 
XML
<全体>
 <題名>テスト01</題名>
 <情報>
  <品名>うどん</品名>
  <単価>100</単価>
  <備考>おいしいうどん</備考>
 </情報>
 <情報>
  <品名>にくうどん</品名>
  <単価>150</単価>
  <備考>肉の分だけ高い</備考>
 </情報>
</全体>
 
 ただ、「うどん」という商品と「にくうどん」という商品の単価と備考が記述されているだけの単純明快なものである。これをXSLを使って表示させようとしたとき、ほかのWEBサイトを参考にしながらコーディングを行うと、私のような駆け出しは下記のように記述する(と思う)。
 
XSL:for-eachを使用 <?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.01" encoding="Shift_JIS" standalone="yes" indent="yes" />
<xsl:template match="/">
<html lang="ja">
<head><title><xsl:value-of select="全体/題名" /></title></head> <!--タイトル表示-->
<body>
 <div>
  <h1><xsl:value-of select="全体/題名" /></h1>  <!--意味も無くタイトルを再度表示する-->    
  <xsl:apply-templates select="全体" />  <!--"全体"テンプレートを適用する-->
 </div>
</body>
</html>
</xsl:template>
<xsl:template match="全体">   <!--"全体"テンプレート-->
 <table border="1">    <!--"表を作成-->
  <tr>
   <th>品名</th>
   <th>単価</th>
   <th>備考</th>
  </tr>
  <xsl:for-each select="情報">   <!--for-eachを使用したループ-->
  <tr>
   <th><xsl:value-of select="品名" /></th> <!--表示したい項目-->
   <td><xsl:value-of select="単価" /></td>
   <td><xsl:value-of select="備考" /></td>
  </tr>
  </xsl:for-each>
 </table>
</xsl:template>
</xsl:stylesheet>
 
 意味も無くタイトルを再度表示しようとするところが、駆け出しっぽいところである。コーディング中のイメージとしては、「一つの<情報>タグを一行として、ループさせて、表示する」というものである。上記のようなXMLとXSLを作成すると、下記のような結果が得られる。(IE実行)
 

f:id:atwgwu:20170508213719p:plain

 
 私のようなあんぽんたんには理解し難いことなのだが、上記のような書き方はXSLを正しく使えていないのかもしれないのだ。上述のXSL文章を以下の等価な文章に置き換えることができる。
 
XSL:for-eachを使わない
<!--省略-->
<body>
<div>
 <h1><xsl:value-of select="全体/題名" /></h1>
 <table border="1">
  <tr>
   <th>品名</th>
   <th>単価</th>
   <th>備考</th>
  </tr>
  <xsl:apply-templates select="全体/情報" />
 </table>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="情報">
  <tr>
   <td><xsl:value-of select="品名" /></td>
   <td><xsl:value-of select="単価" /></td>
   <td><xsl:value-of select="備考" /></td>
  </tr>
</xsl:template>
</xsl:stylesheet>
 
 最初、上述のXSLを見たとき、「は?」と思った。「だって、ループ文ないじゃん!いみぷ~」というのが率直な感想である。私のような元C言語プログラマーからすると、理解し難いのではないだろうか。
 
 <xsl:apply-templates select="全体/情報" />の部分で、<body>タグ内は役目を終えたと思ってよい(いやだめかも)。そして、<xsl:templete match="情報">という文章はなんとなく、「XML文章の<情報>というタグをすべて抜き出せ」と見えなくもない。なんたって、"テンプレートマッチ"って書いてあるんだから。(画像処理プログラマーだった私はなんとなくそう思えた)つまり、<xsl:templete match="情報">という一行は、「<情報>というキーワードを用いてXML文章内でマッチングを行い、マッチングしたものはすべて抽出しろ」という意味なのではないか。
 
まだよくわからないけど、やばいなXML

↑このページのトップヘ