gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

tesseract OCRの精度

2024-10-24 21:14:30 | Python
Pythonで使えるOCRソフトtesseractを使ってみて、その精度はどれぐらいなのか気になったので、調べてみました。
OCRソフトなので文章で本来評価すべきでしょうが、それで評価するのはかなり大変です。それで自動車のナンバープレートの数字で評価しました。

数字も一連番号で評価しようとすると一桁の数字などではかなり誤検知すしました。ですので0から9までの単独の数字で評価します。
すっかりMNISTの評価と同じみたいになってしまいますが、ナンバープレートの数字はちょっと特殊ですのでやってみました。

tesseractを使用する上でのパラメータは、言語、builder、layoutがあります。
今回は、
言語: eng
builder builders.TextBuilder
layout: 1から13までありますが6から13までを評価しました。なお、11と12はほぼ精度は0でした。

builderにはText以外にもWordBox、LineBox、DigitLineBoxもありますが、それぞれクセがあって、まったく同じ結果にはなりませんでした、ほとんど同じということで使うならばTextで十分かと思われます。
layoutは今回の評価では13が最も精度が良かったですが、13で誤検知しても他のlayoutでは正しく検知しているケースもありました。
普段13を使用して、誤検知している文字があったならば、6などのlayoutの結果で編集し直すのがいいかもしれません。

精度が悪かった数字の1ですがこれは|と誤検知したケースが多かったです。これも1に編集し直すなどすれば使えるようになるのではないでしょうか。

以下に各数字ごとのaccuracyを残します。使用したデータの総数は、624個の画像です。

number: 0 layout: 13 matchs: 69 / 77 accuracy: 0.896
number: 1 layout: 13 matchs: 14 / 45 accuracy: 0.311  (|と誤検知する)
number: 2 layout: 13 matchs: 72 / 95 accuracy: 0.758
number: 3 layout: 13 matchs: 65 / 66 accuracy: 0.985
number: 4 layout: 13 matchs: 65 / 78 accuracy: 0.833
number: 5 layout: 13 matchs: 74 / 82 accuracy: 0.902
number: 6 layout: 13 matchs: 37 / 42 accuracy: 0.881
number: 7 layout: 13 matchs: 32 / 44 accuracy: 0.727
number: 8 layout: 13 matchs: 56 / 56 accuracy: 1.000
number: 9 layout: 13 matchs: 10 / 39 accuracy: 0.256  (g、b、bs、9g、gg等と誤検知し、精度がかなり低くなっている)

layout13の次に精度が良かったのは、8であり、6、7と続きます。


'tuple' object has no attribute 'pop'

2024-10-23 18:40:55 | Python
openCVを使った機械学習や画像処理をしていると 'tuple' object has no attribute 'pop' というエラーが度々生じる。
タプルは辞書型で、変数ではないことから編集や修正はできませんよというエラーです。
openCVを使って輪郭線(コンター)の処理を使用しようとすると cv2.findContours の出力値がこのタプルで返される。それを編集しようとしてエラーが生じるわけです。
でも、 max_area = contours.pop(k) のような処理をしたい場合があります。このような場合には、タプルからリストへと変換して処理を続行するということで回避できます。

例えば、

conts = list(contours)
と一時的にリスト変換して、このリストに対して、
max_area = conts.pop(max_area_idx)

とすれば良いわけです。

'numpy.ndarray' object is not callable

2024-10-16 20:44:48 | Python
python でプログラムを作っていて、よく使うルーチンを関数化したところ、'numpy.ndarray' object is not callableが発生してしまう。この作った関数は一回目は正常に動く。でも2回目以降を実行するとこのエラーが発生してしまう。
なぜかこのエラーは画像を扱うプログラムを作っていると良く発生するようです。

原因は単に作った関数名と同じ変数を使ってしまったから。
例えば、
def rgbgray(img)
・・・
return img
のような関数を定義した後に、この関数を以下のように使ってしまうとエラーになってしまう。

rgbgray = rgbgray(img)

画像処理を何度か繰り返していると、うっかりこのようなミスをしてしまいます。
簡単に修正するには関数名を、rgbGrayのように一部を大文字にして小文字の変数と区別することです。
一部大文字にしている関数名が多いのはなぜかと昔思っていたのですが素人はハマってしまいますよね。

Mac(M3)のmatplotlibで日本語フォントを使用する

2024-08-28 18:46:09 | Python
Macのmatplotlibで日本語フォントを使用したい場合、フォントをインストールしなさいという記事が多いのですが、既に日本語フォントはいくつか入っているのではないかと、私のMacを調べて見たら以下のフォントが入っていました
一部中国フォントらしきものが見えますが

matplotlibで使える日本語フォント(Mac M3 Sonoma14.6.1 matplotlib 3.8.4)
Aqua kana
Hiragino Sans
AppleGothic
Aerial Unicode MS
Apple SD Gothic Neo
AppleMyungjo
Haiti TC
Hiragino Mincho ProN
PingFang HK
Hiragino Sans GB
Hiragino Maru Gothic Pro

このうち好きなフォントを
plt.rcParams['font.family'] = "Hiragino Sans"
のように設定すればよい

なお、フォントの確認は以下で実施しました

import matplotlib
import matplotlib.pyplot as plt
from matplotlib import font_manager
fonts=set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
plt.figure(figsize=(10,len(fonts)/4))
for i, font in enumerate(fonts):
plt.text(0,i, f"{str(i)} 日本語:{font}",fontname=font)
plt.ylim(0,len(fonts))
plt.axis("off")
plt.show()

Mac(M3) anacondaで seleniumのバージョン4をインストールする

2024-08-28 18:39:49 | Python
Mac(M3)のAnaconda navigatorでGUIベースで seleniumをインストールしようとするとversion3がインストールされてしまう
最新のversion4をインストールするのには以下のようにターミナル上でconda-forgeチャネルからcondaでインストールすると最新のバージョン4がインストールされるようです

conda install selenium -c conda-forge