Share
マークシート方式のテストを採用する学校や教育機関はありますが、マークシートの自動採点機を導入している現場はほとんどありません。一般的にはマークシート方式テストの採点は教員やスタッフによる目視による手作業で行われています。これはたいへん非効率で時間がかかるだけでなく、間違いや不正のリスクもあります。
しかしこの課題はテクノロジーで簡単に解決できます。私たちRabilooでは、OpenCVやPythonなどの技術を使って、写真を撮るだけで採点ができるマークシート採点ソフトウェアの構築に成功しました。
これにより、採点作業を大幅に効率化、省人化できます。
この記事では、OpenCVとPythonを使用したマークシート方式の採点ソフトの開発プロセスを紹介します。弊社は完成したコアテクノロジーを提供しており、このマークシート自動採点システムを機械やアプリなどさまざまな形態で製品を自由にカスタマイズできます。
まず、コアテクノロジーであるOpenCVについて軽く触れておきたいと思います。
OpenCV(Open Source Computer Vision Library)は、オープンソースのコンピュータビジョンおよび機械学習ソフトウェアライブラリです。1999年にインテルによって開発され、その後、ウィロー・ガレージ、イッティビティ、さらにはオープンソースコミュニティによって大幅に拡張されました。
OpenCVの主な特徴は以下の通りです:
多様な機能: OpenCVには、画像処理、顔認識、物体検出、動き追跡など、1000以上のアルゴリズムと関数が含まれています。
多言語サポート: 主にC++で書かれていますが、Python、Java、Ruby、Matlabなどの他の言語でのバインディングも提供されています。
クロスプラットフォーム: Windows、Linux、Mac OS、さらにはAndroidやiOSなどのモバイルプラットフォームにも対応しています。
リアルタイム処理: 高速な実行が可能で、リアルタイムアプリケーションにも適用できます。
コミュニティとサポート: 大規模なオープンソースコミュニティによるサポートと、豊富な教育資料、ドキュメントが提供されています。
これらの特徴により、OpenCVは学術研究や商業プロジェクトの両方で広く使用されています。特にコンピュータビジョンの分野における標準的なツールキットとして知られています。
この記事では、弊社が実際にOpenCVとPythonを使用してマークシートの採点機械を開発した方法を紹介します。このシステムは、AI-OCRの技術が使われます。
まずスキャンされたマークシートの画像を解析し、透視変換アルゴリズムを用いて画像を正規化した後、解答を識別して採点します。
OpenCVは高度な画像処理機能を提供し、Pythonは柔軟かつ広範なライブラリを備えているため、これらの技術を利用することで、効率的かつ正確な採点システムの構築が可能になります。
OpenCVとPythonを使用したマークシートの採点ソフトの開発プロセスには、主に以下のステップが含まれます:
画像の前処理:スキャンされたマークシートの画像を読み込み、ノイズ除去や二値化などの前処理を行います。
マークの検出:OpenCVを用いてマークされたエリアを検出します。これには輪郭検出や形状マッチングなどの技術が使われます。
マークの解析:検出したマークの位置やパターンを解析して、どの選択肢がマークされたかを判断します。
結果の集計と出力:解析したデータを集計し、テスト結果を出力します。
このプロセスは、OpenCVの強力な画像処理機能とPythonの柔軟性を組み合わせることで、効率的かつ正確な採点システムを実現します。
テストデータを収集するには、画像は6つの段階を経る必要があります。
解答欄を写真から特定する
OpenCVの透視変換アルゴリズムを使用して、解答欄を上から下へまっすぐに正規化する
チェックボックスと解答を抽出する
セルを一列に並べ、各セルを容易に操作できるようにする
列の中でマークされたセルを特定する
マークされたセルを正解と照合する
上記の6ステップに従い、マークシートの採点システムを実際に構築する流れを詳しく説明します。
図1:マークシート採点
一般的なテスト用紙の構造を見ると、解答欄は用紙の中の大きな四角で囲まれているのが普通です(図1参照)。
最初に行うべき作業は、解答欄の抽出です。このとき、解答欄の周囲に枠がない画像では、判定が非常に難しく、別のアプローチが必要になります。
この最初のタスクの詳細な各ステップは次のとおりです。
まず、OpenCVで画像をグレースケールで読み込みます。異なるサイズの画像は、一定のサイズに揃える必要があります。
次に、ガウシアンぼかしで画像をぼかしてノイズを減らし、Cannyでエッジを探します。ここでガウスぼかしを使うと、Cannyがノイズをエッジとして識別できるようになり、うまくいきます。(図2参照)
図2: 画像処理の最初のステップ
次に、 Enclosingと呼ばれる手法を使用して、不要なエッジを減らし、画像のエッジをより鮮明にします。
基本的な処理を施した画像を取得したら、次は画像内で最も面積の大きいセルを探します。
findContoursを使用して、その答えに関連するすべてのパスを探します。この場合、最も面積の大きい部分と、そのセルを構成する4点を取り出します。(図3参照)
図 3: テストの重要な部分を特定する
解答欄の4点を見つけた後、getPerspectiveTransformとwarpAffineを使って、元の画像からプロットを抽出できるようにします。
ボックス内の答えを処理するために、画像を2値化します。(図4参照)
図4: テストのバイナリ画像
このようなマークシート方式の場合、解答の値を上から下、左から右の順にどのように読み取るかが問題になります。
3つの別々の列に分けられた解答セクションを読めるようにするために、同じ列の解答が他の列の解答よりも間隔が近いことを確認しました。そこで、Dilateを使い、同じ列の答えが1つになり、他の列と分離するところまでズームインしました。そして、マークシートの3列に対応する3つの部分を抽出します。(図5参照)
図5: 同じ列の回答が1つの大きな枠に統合される
上記の部分は、操作しやすいように異なる画像として保存されます。(図6参照)
図6: テスト欄の列が分離された状態
分離されたセクションから、再び findContours を使用して、答えの周りのすべてのパスを見つけます。ただしここでは、円形で面積がかなり小さい線のみを抽出します。
ところが、新たな問題が発生します。それは、すべての数字を消去したときに、何がどの答えになるのかがわからないということです。
解答を一連に整理するために、sort_contours 関数を使って、左から右、上から下の順に並べることにします。そうすると、各解答はリストに保存されます。
リストに保存された各解答について、黒いマスク上の白いピクセルの数を数える必要があります。通常、他のセルよりも白いピクセルが多く、白いピクセルの割合が高いセルが解答と見なされます。しかし、これは各質問に対する解答が1つのみの場合に限った最も基本的なアルゴリズムです。
マークされたセルを事前に提供された答えと照合するプロセスは比較的簡単です。選ばれた白いピクセルの値を持つ問題の答えを画像に表示します。また、事前に抽出した4つの点を用いて、getPerspectiveTransformとwarpAffineを再び使用し、セルを元の画像に戻します。
本記事では、OpenCVとPythonの基本的な考えを使って、高精度で便利なマークシート方式の採点ソフトウェアの開発に成功しました。
このテクノロジーは、Rabilooによってパッケージ化されたコアソリューションで、マークシート採点機の製造や、マークシート採点アプリの開発プロジェクトに利用いただけます。
教育業界のワークフロー改善、DX推進に関心をお持ちの企業様、Rabilooのコアテクノロジーソリューションをぜひご検討ください。
関連記事:
Share