🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2257閲覧

OCRによる画像処理速度を向上させたい

nnu12

総合スコア1

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/06/15 06:49

前提・実現したいこと

現在の処理速度が遅いので速くしたいです。

画像から数字を読み取り、エクセルに出力しています。63枚の画像が入っているファイル18個をfor文でループさせ読み込みエクセルに出力しています。1枚の画像から3箇所の数字を抜き取るため、ピクセル指定しています。

そこまで画像が膨大にあるわけではないと思うのですが、エクセルに出力まで数十分以上?かかっていしまいます。(時間がかかりすぎて中断させていますが、途中までのデータが出力できているのでコードは正しいと思います。)

そこで、処理速度が速くなるように、現在のコードの改良などについてアドバイスをいただきたいです。

該当のソースコード

Python

1with pd.ExcelWriter("template.xlsx",mode='a',engine='openpyxl')as writer: 2 for j in range(1,4): 3 cluster=[] 4 for i in range(1,64): 5 img_i = "pic/type("+str(j)+")/data (" +str(i)+").png" 6 img = Image.open(img_i) 7 # 切り抜き 8 img_1 = img.crop((266, 519, 462, 563)) 9 img_2 = img.crop((286, 563, 462, 608)) 10 img_3 = img.crop((266, 608, 462, 652)) 11 # OCR実行 12 builder = pyocr.builders.TextBuilder(tesseract_layout=6) 13 result1 = tool.image_to_string(img_1,builder=builder) 14 result2 = tool.image_to_string(img_2,builder=builder) 15 result3 = tool.image_to_string(img_3,builder=builder) 16 list=[result1,result2,result3] 17 cluster.append(list) 18 df=pd.DataFrame(cluster) 19 df.to_excel(writer,sheet_name="type("+str(j)+")a")

試したこと

コード作成当初より大きく文量を減らし、for文でまとめることができましたが、処理速度が遅いです。

補足情報

anacondaのJupiter Labを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

検証していませんが、改善できそうな点としてはbuilderとdfの作成くらいでしょうか。
どちらもループ外側で、最初と最後の1回だけでよいかと思います。

投稿2022/06/15 07:41

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnu12

2022/06/15 08:46

ご回答いただきありがとうございます。ご指摘の通りにコードを改良したところ、30分程度で処理できました。15分以上処理速度が速くなったのは間違いないです。ありがとうございました。
guest

0

ベストアンサー

いくつか気になるところがあります。

python

1 for j in range(1,4): 2 cluster=[] 3 for i in range(1,64): 4 ## 省略 5 builder = pyocr.builders.TextBuilder(tesseract_layout=6) # ★1 6 ##省略 7 cluster.append(list) 8 df=pd.DataFrame(cluster) # ★2 9 df.to_excel(writer,sheet_name="type("+str(j)+")a")

その1
★1 のところで、ループ毎に毎回builderを生成していますが、生成時にループ固有の値を渡していませんので、ループの外に出しても問題ないのではないこと思います。

その2
★2のところで、iのループごとdfを更新していますが、使われずに次の更新が行なわれています。
一段外に出して、to_csvの直前に1回やるだけでいいように思います。

ただ、これだけで、数十分も短縮はしないでしょうから、そもそも時間のかかるしょりなのかもしれません。
CPUに負荷のかかる処理なのであれば、並列化で時間短縮できる可能性が高いですね。

投稿2022/06/15 07:41

TakaiY

総合スコア13733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnu12

2022/06/15 08:46

ご回答いただきありがとうございます。ご指摘の通りにコードを改良したところ、30分程度で処理できました。15分以上処理速度が速くなったのは間違いないです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問