本ソフトは、主に1980年代のパソコン雑誌に掲載されたプログラムリストの読み取りに特化したOCRです。
紙面をスキャナで取り込み、OCRでテキストファイルにしたものをエミュレーター用のテープイメージ等に変換するという使い方を想定しています。
本ソフトは、以下のオープンソースソフトウェアの組み合わせです。
-
Tesseract(OCRエンジン)
-
gImageReader(GUIフロントエンド)
上記に加えて、独自にOCRに学習させて作成した以下の言語ファイルを含んでいます。
-
BASIC(PC-6001シリーズ用N6X-Basic)
-
16進ダンプリスト
BASIC言語に関しては、フォントや単語、かなやグラフィック文字の仕様などPC-6001に合わせて言語ファイルを作ってありますので、他機種のプログラムをそのまま読み込むのは難しいと思われますが、MS系のBASICで英数字のみに割り切ればもしかしたら読めるかもしれません。
ダンプリストの方はBASICよりは汎用的に使えると思います。こちらは読み取り精度向上のため、16進数+α(0-9,A-F,Sum)以外の文字は使われていないという前提で読み込むようになっています。
読み込む対象のプログラムが掲載された紙面をスキャンします。
スキャン後はテキストの傾き、ゆがみがなるべく無い様に補正してください。
画像の補正方法について、私のやり方をブログで公開していますので、よろしければ参考にしてください。
http://eighttails.seesaa.net/article/283953696.html
推奨する形式は
-
600DPI
-
グレースケール
-
TIFFまたは高画質設定のJPEG
です。
文字が薄い場合、 GIMP を使って補正すると読み取り精度が上がります。
GIMPのメニューから「フィルター」→「汎用」→「明るさの最大値」を実行するとかすれた文字を補正することができます。
その後、GIMPのメニューから「色」→「しきい値」を用いて画像を2値化しておくことをお勧めします。
画像を読み込むには、画面左ペインのフォルダボタンをクリックします。
ファイル選択ダイアログが開くので、読み込む対象の画像ファイルを選択します。
複数枚の画像を同時に選択することも可能です。
Warning
|
このステップの操作は#1ページずつ#行ってください。 |
プログラムリストとして読み取る範囲をドラッグして指定します。
多段組になっていて読み取り範囲が複数ある場合はCTRL+ドラッグで選択範囲を追加できます。
選択が終わったら、ツールバー上の「Recocnize Selection」ボタンをクリックして読み取りを実行します。
「Recocnize Selection」ボタンはプルダウンになっており、BASICプログラムを読み取る際は「tessdata/n6x」、マシン後を読み取る際は「tessdata/hex」を選択した状態で実行してください。
読み取りにはかなりの時間がかかります。気長に待ってください。
読み取りが完了すると、右のペインに認識結果が現れます。
このテキストをお好みのテキストエディタにコピー、ペーストしてください。
この状態のテキストは行のつながりを認識できていません。印刷の都合で2行に折り返されてしまった行は分割して出力されているので、目視で連結してやる必要があります。
整形が終わったテキストファイルは、エミュレータ用のテープイメージ変換ツールなどに渡してご利用ください。
PC-6001用BASICの場合は、拙作の N6XBasicChecker を使えばシンタックスエラーレベルの認識ミスはイメージ変換、実行前に発見することができます。
今回のOCRは、Googleより配布されている英語用の言語データをベースに以下のフォントを使ってファインチューニングを行っています。
ビットマップフォント、ドットマトリクス印字によるフォントに対応するためプログラムリストによく使われるフォントを追加していますが、Googleの学習済みモデルをベースにしているので、たいていの書体は読めると思います。
フォント自体の再配布を行うことはできないので、学習用スクリプト内でダウンロードして使用するようになっています。
鈴木大輔様作
http://vlgothic.dicey.org/
itouhiro様作
http://itouhiro.hatenablog.com/entry/20130602/font
Gigamix様作
http://www.gigamix.jp/download/gigamix/msxfont.php
Mr.PCばんざーい!!様作
電波新聞社刊「PC-6001・6601プログラム大全集」掲載プログラム内のフォントをeighttailsがTrueType化
配布しているバイナリのライセンスは以下の通りとなります。
- Tesseract
-
-
Apache License 2.0
-
- gImageReader
-
-
GNU General Public License v3.0
-
本リポジトリに含まれるスクリプトはTesseractに含まれているものを改変したものですので、Apache License 2.0とします。
MSYS2環境上でビルドします。
-
こちらからMSYS2をダウンロードしてインストールしてください。
VC++はサポートしていません。
MSYS2はパッケージのバージョンアップが早く、またバージョンアップによるデグレードが非常に多いため、パッケージのアップデート(pacman -Sy
)を行わず、バージョンを固定して使うことをおすすめします。作者がビルド、動作を確認しているのは以下のインストーラーで構築した環境です。(64ビット用)
https://sourceforge.net/projects/msys2/files/Base/x86_64/msys2-x86_64-20190524.exe -
MSYSをインストールしたフォルダのmingw32.exe(32ビット版をビルドする場合)またはmingw64.exe(64ビット版をビルドする場合)を実行。
-
ダウンロードしたProgramListOCRのソースをMSYS上のホームフォルダに解凍。
-
cd ProgramListOCR
を実行し、ソースフォルダにカレントを移動。 -
setup/build.sh
を実行し、学習用フォントのダウンロードおよびTesseract,gImageReaderのビルドを行う。
ビルドには非常に時間がかかります。気長に気長にお待ちください。
Tesseract本体に含まれている学習用スクリプトを改変することで、P6ユーザー以外の人が独自に言語ファイルを作成したり、学習データにフォントを追加して認識精度を向上したりすることができます。
ただし、元のスクリプトがbash向けに作られているので、bashの知識があることが前提になります。
本ソフトで提供している学習用スクリプトは以下の通りです。
training/makeN6XTessdata.sh
-
N6X-Basic用学習スクリプト
training/makeHexTessdata.sh
-
16進ダンプリスト用学習スクリプト
上記のスクリプトをbash上で実行すると、 training/tessdata
フォルダに言語ファイルが生成されます。
学習に要する時間ですが、ダンプリストの方は1日程度で収束しますが、BASICの方はError rateが0.1を切るぐらいまで(私の環境で1週間程度)は回し続ける必要があります。
学習を終了するには適当なところでctrl+Cを押して強制的に止めてください。途中経過は保存されてますので、再度同じスクリプトを実行するとその時点から学習を再開します。
ここでは、独自に言語ファイルを作成し、PC-6001以外の機種、またはBASIC以外のプログラムに対応させる方法を簡単に記述します。
今回採用しているTesseract4.0はドキュメントも十分にありません。本当に使いこなすためには本家Githubのwikiやソースコード、issuesなどを読み込んでキャッチアップするのが不可欠です。
https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00
学習に用いるスクリプトは training
フォルダ、言語に関するデータは training/langdata
に配置されています。
P6用BASIC言語ファイル(n6x
)をベースに新たに言語ファイル(ここでは xxx
)を作るには、
-
langdata/n6x
以下のファイルをlangdata/xxx
にコピーし、すべてのファイル名中のn6x
をxxx
にリネーム -
makeN6XTessData.sh
をmakeXXXTessData.sh
にコピー
Warning
|
ここで作成する言語設定ファイルは文字コードUTF-8,改行コードLF(UNIX)で保存する必要があります。 |
`training`以下のファイルについて、以下のように修正します。
-
training/makeXXXTessdata.sh
-
スクリプト中の
n6x
をxxx
に置換
-
-
training/language-specific.sh
-
スクリプト中の
N6X_FONTS
のリストに学習させたいフォント名を追加
フォントは`fonts`フォルダ内にコピーすること。Windowsのシステムにインストールする必要はない。 -
スクリプト中の
N6X
をXXX
に置換 -
スクリプト中の
n6x
をxxx
に置換
-
langdata/xxx
以下のファイルについて、以下のように修正します。
-
desired_characters
-
その言語で使用可能な文字をすべて列挙する。
-
-
xxx.training_text
-
学習に使用するテキストをコピー、ペーストする。
-
このテキストと
language-specific.sh
に定義されたフォントを用いて学習用の画像が生成される。 -
実際のプログラムリストを使用することが望ましい。
-
実際のプログラムでは出現確率が低い文字は学習されない可能性があるため、冒頭にすべての文字を含んだ文字見本を入れておく。
-
-
xxx.wordlist
-
その言語で使用される予約語を列挙する。
-
上記以外の設定ファイルは制御が難しいため、いじらない方がよいでしょう。
-
Tesseract4.1.0の正式版に更新
-
学習するフォントを追加
-
学習するフォントを追加
-
Tesseract4.0.0,gImageReader3.3.0の正式版に更新
-
学習データ生成方法の見直し
-
文字間隔が多少開いていても読めるように学習。
-
-
Tesseract,gImageReaderを更新
-
学習データ生成方法の見直し
-
にじんだ文字よりかすれた文字を優先して学習するよう画像を生成。
-
実際のプログラムリストの印刷状態に近づくよう、行間を密着させた画像を生成。
-
DotMatrixフォントを学習から除外(文字が薄くなりすぎて学習エラーになるため)
-
-
初版