ホーム ブログ その他

OpenCVとPythonでマ...

OpenCVとPythonでマークシートの採点機械を構築する

Rabiloo

多肢選択問題式テストの採点機械は、多くの国の教育機関にとって、まだ新しい概念です。

これまで、マークシートテストの採点は手動で行われていました。

コードと解答は同じなのに、採点者はテストと答えの照合に毎回いつも多くの時間を費やします。

この事は、繰り返しによる退屈感、また採点ミス、さらには試験の不正行為に繋がる可能性があります。

上記の問題は、テクノロジーによって簡単に解決されます。

弊社Rabiloo(ラビロー)はOpenCV、Pythonといくつかの画像処理方法と組み合わせることで、マークシート式テストの採点機械の構築に成功することができました。

その結果、採点作業は、写真を撮ることと、機械から表示結果を受け取ることの2つの基本的なステップで済みます。

この記事では、多肢選択式の採点ソフトの開発プロセスを中心に説明いたします。

このコアソリューションから、機械やアプリの形式で最終製品を自由に制作することができます。 

マークシート採点機械における画像処理アルゴリズムの6つのステップ 

テストデータを収集するには、画像は6つのステップを経る必要があります。

  1. 画像中のテスト区間を特定する。

  2. OpenCVの透視変換アルゴリズムを適用して、テスト部分を上から下へまっすぐ正規化する。

  3. チェックボックスと回答を抽出する。

  4. 各セルに対する操作がしやすいように、セルを直列に並べる。

  5.  シリーズ内で陰影が付けられているセルを指定する。

  6. チェックボックスと答えを比較する。

おすすめの記事: OCRとは?RabilooのOCR(文字認識)開発事例

アルゴリズムのステップに従って、マークシートの採点ソフトを構築

以下は、画像処理の6つのステップの詳細な説明です。

写真に写っているテスト箇所を特定する

図1: 写真に表示されるマークシートの採点機械

一般的なテスト用紙の構造を見ると、テストの部分は用紙の中の大きな四角で囲まれているのが普通です(図1参照)。

最初に行うべき作業は、テスト部分を抽出することです。このとき、答えの周囲に枠がない画像では、答えの判定が非常に難しく、新たなアプローチが必要になります。

この最初のタスクの詳細な各ステップは次のとおりです。

まず、OpenCVで画像をグレースケールで読み込みます。異なるサイズの画像は、一定のサイズに揃える必要があります。

次に、ガウシアンぼかしで画像をぼかしてノイズを減らし、Cannyでエッジを探します。ここでガウスぼかしを使うと、Cannyがノイズをエッジとして識別できるようになり、うまくいきます。(図2参照)

図2: 画像処理の最初のステップ

次に、 Enclosingと呼ばれる手法を使用して、不要なエッジを減らし、画像のエッジをより鮮明にします。

基本的な処理を施した画像を取得したら、次は画像内で最も面積の大きいセルを探します。findContours を使用して、その答えに関連するすべてのパスを探します。

この場合、最も面積の大きい部分と、そのセルを構成する4点を取り出します。(図3参照)

図 3: テストの重要な部分を特定する

OpenCVの透視変換アルゴリズムを適用して、テスト部分を上から下へまっすぐ正規化する

解答欄の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 によってパッケージ化されたコア ソリューションであり、多肢選択式試験機の製造や、顧客の多肢選択式試験の採点アプリケーションのプロジェクトに役立ちます。

もし貴社が教育分野で、ワークフローの最適化をお考えなら、Rabilooのテクノロジー・ソリューションをご検討ください。

Rabilooのテクノロジーソリューション