OCRをマルチプロセスで処理

参考にしたサイト

multiprocessing — プロセスベースの並列処理 を参考に試す

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

時間がかかっているOCR処理のコードを抜きだして関数化。一文字の画像を入力(peace)として、文字認識を行い、結果の数字を返す。高速化のために、事前に数字が入っていないと思われる画像については、OCRせずに、ゼロを返す。また、OCRの結果、数字以外として認識した場合も、ゼロを返す。

def ocr(peace):
    global p_max
# 画像イメージの総和が事前に計算したp_maxより小さい場合にOCRを呼び出す
    if np.array(peace).sum()<p_max: 
        conf='-l eng --psm 6  outputbase digits'
        txt=pytesseract.image_to_string(peace, config=conf)
        txt=remove_control_characters(txt)
        if txt.isdigit():
            ret=int(txt)
        else:
            ret=0
    else:
        ret=0
    return ret

multiprocess導入前のコード

画像81個(=9×9)をfor ループで一枚づつOCRを実行していた。peacesは画像81個のデータ。peaceは画像1個のデータ

my_bar = st.progress(0) # 時間の経過がわかるようにプログレスバーを設定
for peace in peaces:
        t = p_size[n]
        if t<p_max:
            txt=pytesseract.image_to_string(peace, config=conf)
            txt=remove_control_characters(txt)
            try:
                 ans=int(txt)
            except:
                 ans=0
               st.write('Error at:',n,'(',txt,')')
            else:
                 ans=0
            row.append(ans)
            my_bar.progress(int(100*n/80))
            n=n+1

row2=np.array(row).reshape(-1,9).tolist() # 結果を 9x9の形に
st.success(row2)

multiprocess導入後のコード

with Pool(int(CORE)) as p: # COREはセレクターで選んだ数 1,2,4,8,10,12,16,32
     ans=(p.map(ocr, peaces))

row.append(ans)
row2=np.array(row).reshape(-1,9).tolist()
st.success(row2)

結果 Pi4 Ubuntu20.04

$ uname -a
Linux ubuntu 5.4.0-1047-raspi #52-Ubuntu SMP PREEMPT Wed Nov 24 08:16:38 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
------------------------------
Pool 経過時間
1	  17.721517086029053
2	  12.919192552566528
4	  12.035958051681519
8	  10.886781454086304
12	 10.22145414352417
16	 10.279670715332031
32	 11.4353609085083

rock pi(6 core)

$ uname -a
Linux rock 4.4.154-110-rockchip-gcef30e88a9f5 #1 SMP Mon Jun 22 07:37:10 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
------------------------------
Pool 経過時間
1	  10.592926979064941
2	  7.96256422996521
4	  5.769669532775879
8	  5.157710552215576
12	 5.265762567520142
16	 5.468385457992554
32	 6.696927785873413

i7-10700K/Windows11/WSL2(8 core 16 thread)

$ uname -a
Linux DESKTOP-P8UNEDG 5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
------------------------------
Pool 経過時間
1	  1.669569969177246
2	  0.8932185173034668
4	  0.5116889476776123
8	  0.4094092845916748
12	 0.35788488388061523
16	 0.4156327247619629
32	 0.38041210174560547

----VirtualBOX
1: 2.208763360977173
2: 3.9075162410736084
4: 3.83050274848938

---WSL2 windows11 再インストール後
1: 1.7535254955291748
2: 0.9307124614715576
4: 0.5294575691223145

i7-8750H Windows10/WSL2( (6 core 12 thread)

Linux DESKTOP-NI63ODB 5.10.60.1-microsoWindows11/WSL2(ft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
-----------------------------------
1: 4.477121353149414
2: 2.522892475128174
4: 1.4394028186798096
8: 1.1422605514526367

Core(TM) i7-3770/WSL2(4 core 8 thread)

Linux mars-PC 4.4.0-19041-Microsoft #1237-Microsoft Sat Sep 11 14:32:00 PST 2021 x86_64 x86_64 x86_64 GNU/Linux
----------------------------------
1: 10.84971809387207
2: 6.165481805801392
4: 4.313432216644287
8: 4.449507713317871

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です