PCOT関連の掲示板

PCOTの感想、質問、バグ報告受付 / 24

710 コメント
views
1 フォロー
24

ご検討いただきありがとうございます。
設定(.cfg)ファイルの非互換については了解いたしました。

OCR訂正辞書(wordlist.dat)については、現状通りシステムにひとつで構わないと思います。名刺リストについては、ゲーム毎に設定できると良いと感じました(何処に情報が保存されているか確認できなかったのですでに対応済みであればごめんなさい)。

あと、画像の拡大倍率をゲーム毎に設定できるようにするのも良いかもしれません。例えば、設定ファイルにデフォルト値を入れておいてUIへの実装は先送りする方法でも良いかとおもいます。なお、以前実装の確認をしていた時は、領域ごとに拡大倍率を設定できるようにしていました。これについいては、現状での必要性が明確ではないため、参考程度に考えてください。

今のところ気がついたのは以上となります。
よろしくおねがいします。

通報 ...
  • 25
    ぬるっぽ 2020/05/13 (水) 23:05:36 >> 24

    早速のフィードバックありがとうございます。

    名詞リストについては、ゲーム毎に設定できると良いと感じました(何処に情報が保存されているか確認できなかったのですでに対応済みであればごめんなさい)。

    現行で名詞リストはゲームごとの保存となっております。名詞リスト登録後に作成される[プロセス名].cfg内で「NounTable」とある場所のデータがそれです。

    画像の拡大倍率をゲーム毎に設定できるようにするのも良いかもしれません。

    こちらについても、現行で(私の方では読取倍率と呼んでいますが)ゲームごとではなくタイトルラベル単位で設定されています。前述の[プロセス名].cfg内の「TitleTable」とある場所の「ReadMultiples」という項目がそれです。
    デフォルト値は2(2倍)となっています。この値はタイトル設定画面で直接値を設定するほか、新規作成時もしくは編集時の翻訳範囲の再選択時にキャプチャー画面上でマウスホイールで値を増減(最小x1~最大x10)できます。
    何故ゲームごとではなく、タイトルラベルごとにしたかというと、同じゲーム内でも場所によってフォントサイズが変わっている箇所があったので、それに対応した結果となります。

    なお、以前実装の確認をしていた時は、領域ごとに拡大倍率を設定できるようにしていました。

    つまり、同じことを考えていたということですね。先生に近づけた気がしてなんだか嬉しいです。
    今だから言いますが、開発中ブログに訪れるたび、synctam様のことを勝手に「先生」と呼んでいましたw

    あとこれは余談ですが、私も当初synctam様に倣って画像を二値化してOCRにかける方法を実装してみたのですが、二値化する際の閾値を取得するのに大津の二値化手法を使って最適な閾値で二値化を実現できたと思いきや、人の目から見るとちゃんと文字として認識できるにも関わらず、どうもTesseractOCRとの相性が悪いらしくて読取精度が異常に下がりました・・・。
    PCOTでは結局画像の二値化は没になりましたが・・・こちらについて、何か解決策はご存じですか?
    自分の中では今の所、どんな画像も強制的にグレースケールにした状態が一番読み取り精度が高い気がします。

  • 26

    気が付きませんでした、指摘した部分は既に実装済みとのことですね、安心しました。

    私も、二値化については閾値などの設定がわからず、大津の二値化も含めてうまくいきませんでした。また、ガンマ値変更もやってみましたが効果はあまりなかったです。仰るとおりグレースケールのみで良いような気がします。

    Tesseractの精度向上策としては、切り取った画像の周りに余白を追加するとOCRの精度が向上することがあります。この例では上下左右に8ドットの余白を追加しています。
    変更前画像:https://i.imgur.com/kZ3aIye.jpg
    変更後画像:https://i.imgur.com/zkNyAMl.jpg
    切り取り領域の設定でどうしても文字ギリギリで指定しないといけないゲームもありますので、余白の追加は有効だと思います。
    もう一つは、Tesseractのオプションで whitelist の指定をすることでした。自分の場合はアルファベットの英数字+記号(縦棒|は除く)のみを指定していました。これは、数字のイチ(1)、大文字のアイ(I)、小文字のエル(l) を縦棒(|)に誤認識することが多かったためです。

    参考になれば幸いです。

  • 27
    ぬるっぽ 2020/05/14 (木) 02:14:43 修正 >> 24

    参考意見ありがとうございます。

    余白を設けるのは盲点でした、検討してみます。
    whitelistについてですが、まだ画像の拡大をやってなかった頃か設定の方法が悪かったのか定かではありませんが、以前やった時は読取精度が著しく下がってしまったので元に戻した経緯があります。
    もし宜しければ、synctam様の方で設定した具体的なwhitelistの文字リストをご提示頂けないでしょうか?
    あと、重ねて質問で恐縮ですがwhitelistに読取対象の文字を全て列挙するのと、blacklistに除外文字だけを列挙するのとでは、読取精度に差が出るのでしょうか?
    どちらもやってみた感じ、読取精度が逆に下がってしまったので設定方法か何かがまずかったような気がしてなりません・・・。(変化があったということは、設定自体は出来てたと思うのですが・・・)

    画像の余白についてはC#のGraphicsクラスの操作に慣れていないため、少し時間がかかりそうなので、今回の更新からは外しますが、whitelistなどはすぐに反映できると思うので次回リリース時に反映しようと思います。

    あと最後に確認しておきたかったのですが、「対象通り改行」や「原文を小文字化」チェックの保存単位はゲーム(プロセス)単位でよろしかったでしょうか?それともタイトル(領域)単位の方がよろしいでしょうか?

  • 28

    ・動作環境について
    自分は、tesseract-ocr v3.5.2.0 を使用していました。PCOTでは、tesseract-ocr 4.1.0 をお使いのようなので状況が異なるのかもしれません(v4系はOCRエンジンが大幅に拡張されたので私も移行したいのですが、まだ使い方がわかっていません)。

    ・ブラック/ホワイトリストについて
    ブラックリストについてですが、自分は使ったことがありません。理由は、Tesseract-ocr で言語に英語を指定した場合の認識対象の文字種を調べる方法がわからなかったためです。認識対象の文字種がわかればブラックリストでも良いと思います。

    ・ホワイトリストの使用例について
    Tesseract-ocr ホワイトリストのサンプルプログラムを Gist にアップしました。
    https://gist.github.com/synctam/5b351411ca6062eff2b89173a87cb152
    CatInnerTesseract.cs 31行目のコンストラクタでホワイトリストの設定を行っています。ホワイトリストの文字種は CatOcrDriverBase.cs 58行目の GetWhiteList() 関数で設定しています。どちらも、MITライセンスで公開しますので、ご自由にお使いください。

    ・「対象通り改行」について
    領域ごとに保存できた方が良いと思います。この部分については、PCOTがどの様な処理を行っているのかわかりませんので、以前検討していた時のことを書きます。自分の場合は、改行が一つの場合は無条件に文を繋げてしまい、改行が二つ以上の場合は段落が別と捉えていました。しかし、この方式ですと、例えばアイテムの説明画面のようにアイテム名と説明文が繋がってしまい問題が発生しました。このように領域ごとに状況が異なるため領域ごとに指定できるのが良いと思います。

    ・「原文を小文字化」について
    ゲーム(プロセス)単位で保存できた方が良いと思います。「原文を小文字化」は一律で行っても良いように感じます。

    ・「ダブルコーテーションを除去する」について
    この前の投稿で言い忘れましたが、「ダブルコーテーションを除去」すると、一部の文章では翻訳精度が上がることがありました。以前検討していた時は、領域ごとに保存していました。

    長くなりましたが、よろしくおねがいします。

  • 29
    ぬるっぽ 2020/05/14 (木) 16:12:13 >> 24

    参考ソースまで貼って頂いてありがとうございます!

    ・ブラック/ホワイトリストについて

    ただ・・・まことに残念なことにtesseract-ocr 4.1.0では、ホワイトリストが使えないようです・・・。
    How to whitelist characters in tess4j version 4.1.*

    使い始めた時にはそんなことはつゆ知らず・・・。せっかく参考ソースを貼って頂いたのにすみません。

    ・「対象通り改行」について
    アイテム名と説明文

    確かにそういう使い方が出来ますね。ならば領域ごとの保存が望ましいということですね。

    ・「原文を小文字化」について

    >>「原文を小文字化」は一律で行っても良いように感じます。
    とありますが、チェック機能そのものがなくていいという意味合いでしょうか?
    元々「原文を小文字化」については、GoogleTranslateFreeAPIが大文字だけの単語や大文字だけの文章の翻訳精度が異常に悪かったので、読み取り箇所が全て大文字の場合は強制的に小文字にしています。
    ただ、文章を一律小文字化すると頭大文字の段落や固有名詞などでは翻訳結果が変わるため、その場でユーザーが確認できるようにチェックして利用して頂くことを目的としていました。
    文章全てが大文字だと強制的に小文字になる現在の仕様と、文章単位で強調表示としての大文字の単語が混在することを考えると、プロセス単位、領域単位で保存するメリットがあまりないように思いますがこれといった要件はありますか?

    ・「ダブルコーテーションを除去する」について

    ダブルコーテーションについてですが、文章単位で翻訳精度が上下するので、PCOTでは領域単位やプロセス単位で持つのではなく、翻訳(読取)全体に関わる事だと思うので、辞書登録で処理タイプを「無視」とする仕様になっています。尚、辞書に登録した文言は「辞書一覧画面」にて、有効/無効を切り替えることが可能です。

  • 30

    ・ブラック/ホワイトリストについて
    2019/6にリリースされた v4.1.0 でサポートされたはずなのですが・・・
    「Release 4.1.0 Release · tesseract-ocr/tesseract」
    https://github.com/tesseract-ocr/tesseract/releases/tag/4.1.0
    しかし、まだ上手く機能しているのか判断できませんね。しばらく様子を見た方が良さそうですね。

    ・「原文を小文字化」について
    そうですね、その仕様であれば今のままで良いと思います。

    ・「ダブルコーテーションを除去する」について
    その仕様で良いと感じました。

  • 31
    ぬるっぽ 2020/05/14 (木) 23:41:20 >> 24

    ・ブラック/ホワイトリストについて
    確かに自分で貼ったリンク先の最後に「It has been fixed !」と書いてありますね、見落としてました。
    とりあえず、仕様がまとまったことなので一旦要望は締め切ります。