Pythonでスキャンされたシートからマーキングされた領域を検出・抽出
オープンソースの無料PythonベースOMRエンジンで、OMR処理をサポートします。OMRシートの処理、テンプレートベースの検出、マルチページフォームの取り扱いなどに対応しています。
PyOMRライブラリとは何ですか?
光学マーク認識(OMR)は、アンケート、テスト、投票用紙などの文書から人が記入したデータを取得する強力な技術です。商用の OMR ソリューションは存在しますが、無料でオープンソースの代替手段を求める開発者は、OMR 処理用に設計された Python ライブラリである PyOMR を活用できます。pattyjogal によって開発された PyOMR は、シンプルな Python コードと標準的な画像処理技術を使用して、スキャンされたフォーム上のマークされたバブルを検出できるようにします。スキャンシートからマークされた領域の検出・抽出、選択式フォーム、アンケート、評価の処理、さらにはさまざまなユースケース向けに OMR テンプレートをカスタマイズすることをサポートします。
PyOMR は、MCQ テストシートやアンケート回答など、事前に定義されたフォーム上の記入済みマークを検出するよう設計された Python ベースの OMR エンジンです。OpenCV などのライブラリを活用して画像処理を行い、シート上の期待されるマーク領域を定義するテンプレートベースのシステムを提供します。採点システムを構築するソフトウェア開発者、テスト評価を自動化する教師、アンケートデータを収集する組織のいずれであっても、PyOMR を使用すれば OMR 機能を直接アプリに組み込むことができます。テンプレートベースのアプローチ、OpenCV による検出、完全なスクリプト化により、サードパーティサービスに依存せずに自動フォーム処理ツールを構築したい開発者にとって理想的な選択肢です。
PyOMRの始め方
PyOMR ライブラリの推奨インストール方法は GitHub を使用することです。スムーズなインストールのために以下のコマンドをご利用ください
GitHub 経由で PyOMR ライブラリをインストール
git clone https://github.com/pattyjogal/pyomr.git
cd pyomr
GitHub 経由でサポートされているライブラリをインストール
pip install opencv-python numpy ライブラリは GitHub から直接ダウンロードできます
Pythonによる自動画像前処理
• オープンソースの PyOMR ライブラリは、Python アプリケーション内での自動画像処理を完全にサポートしています。ライブラリには、傾いたスキャンを補正するデスキュー、マーク検出を向上させるための白黒変換のしきい値処理、低品質スキャンの精度向上のためのノイズ除去といった組み込み関数が含まれています。さらに、照明の不均一、コントラストの低さ、軽微なずれなど、スキャンされた用紙の一般的な問題にも対応できます。以下のコード例は、Python アプリケーション内で画像を処理する方法を示しています。
Python アプリ内で画像を処理する方法は?
from omr import omr_engine
# File paths
template_path = "config.json"
image_path = "answer_sheet.jpg"
# Run the OMR process
results = omr_engine.process_image(image_path, template_path)
# Output the results
for i, response in enumerate(results, 1):
print(f"Q{i}: {response if response else 'No mark detected'}")
Pythonによるテンプレートベース検出
PyOMR は JSON テンプレートを使用して解答用紙のレイアウトを定義します。これには、質問数、各質問の選択肢数、最初のバブルの開始位置、行と列の間隔、バブルのサイズが含まれます。このため、システムはさまざまなレイアウトに対して非常に柔軟で再利用可能です。以下は、Python ライブラリを使用してバブル位置を指定する JSON テンプレートを作成する簡単な例です。
バブル位置を指定する JSON テンプレートを作成し、Python でロードする方法は?
{
"bubbles": [
{"question": "Q1", "options": ["A", "B", "C", "D"], "coords": [100, 150, 30, 30]},
{"question": "Q2", "options": ["A", "B", "C", "D"], "coords": [100, 200, 30, 30]}
],
"reference_marks": [[50, 50], [500, 50], [50, 700]]
}
#Load template
omr.load_template("template.json")
Pythonによるマルチページフォームの処理
PyOMR ライブラリは、Python アプリケーション内でマルチページフォームの処理をサポートしています。単一ページの解答用紙やマルチページのアンケートの処理にかかわらず、PyOMR は異なるレイアウトに対応できるように設定可能です。マルチページフォームの場合は、各ページを個別に処理することが推奨されます。以下のコード例は、ソフトウェア開発者が Python アプリケーション内でマルチページフォームを処理する方法を示しています。
Python ライブラリでマルチページフォームを処理する方法は?
# for multi-page forms, process each page separately:
for page in omr.multi_page_scan("multi_page_form.pdf"):
page.preprocess()
answers = page.read_answers()
print(answers)
ノイズ処理と前処理
オープンソースの PyOMR ライブラリは、Python アプリケーション内で画像前処理とノイズ処理を完全にサポートしています。このライブラリには、グレースケール変換、しきい値処理、輪郭検出などの画像前処理が含まれており、ノイズの多いスキャンや印刷の不完全さがある場合でも、マークを確実に識別できます。